├── .github └── workflows │ └── rust.yml ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── LICENSE ├── readme.md └── src ├── git.rs ├── lib.rs ├── llm.rs ├── main.rs └── prompt.txt /.github/workflows/rust.yml: -------------------------------------------------------------------------------- 1 | name: git-commit-helper 2 | 3 | on: 4 | push: 5 | tags: 6 | - "v*" 7 | 8 | env: 9 | CARGO_TERM_COLOR: always 10 | 11 | jobs: 12 | build: 13 | name: Build git-commit-helper 14 | runs-on: ${{ matrix.os }} 15 | strategy: 16 | matrix: 17 | include: 18 | - build: linux_x86_64 19 | target: x86_64-unknown-linux-gnu 20 | os: ubuntu-latest 21 | command: sudo apt update && sudo apt-get install libssl-dev pkg-config -y 22 | file: git-commit-helper 23 | - build: macos_x86_64 24 | target: x86_64-apple-darwin 25 | os: macos-13 26 | command: brew install openssl 27 | file: git-commit-helper 28 | - build: macos_arm64 29 | target: aarch64-apple-darwin 30 | os: macos-latest 31 | command: brew install openssl 32 | file: git-commit-helper 33 | - build: windows_x86_64 34 | target: x86_64-pc-windows-msvc 35 | os: windows-latest 36 | command: choco install openssl 37 | file: git-commit-helper.exe 38 | 39 | steps: 40 | - uses: actions/checkout@v4 41 | 42 | - name: Install Requirements 43 | run: ${{ matrix.command }} 44 | 45 | - name: Add Nasm 46 | if: startsWith(matrix.os, 'windows') 47 | uses: ilammy/setup-nasm@v1 48 | 49 | - name: Add Target 50 | run: rustup target add ${{ matrix.target }} 51 | 52 | - name: Build 53 | run: cargo build --release --target ${{ matrix.target }} --verbose 54 | 55 | - name: Create Release 56 | id: create_release 57 | uses: softprops/action-gh-release@v2 58 | if: startsWith(github.ref, 'refs/tags/') 59 | with: 60 | files: target/${{ matrix.target }}/release/${{ matrix.file }} 61 | body: "Release of git-commit-helper" 62 | token: ${{ secrets.ACCESS_TOKEN }} 63 | 64 | - name: Upload Release Asset 65 | uses: actions/upload-release-asset@v1 66 | env: 67 | GITHUB_TOKEN: ${{ secrets.ACCESS_TOKEN }} 68 | with: 69 | upload_url: ${{ steps.create_release.outputs.upload_url }} 70 | asset_path: target/${{ matrix.target }}/release/${{ matrix.file }} 71 | asset_name: git-commit-helper-${{ matrix.target }} 72 | asset_content_type: application/octet-stream 73 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | -------------------------------------------------------------------------------- /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 = "addr2line" 7 | version = "0.24.2" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" 10 | dependencies = [ 11 | "gimli", 12 | ] 13 | 14 | [[package]] 15 | name = "adler2" 16 | version = "2.0.0" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" 19 | 20 | [[package]] 21 | name = "anstream" 22 | version = "0.6.18" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" 25 | dependencies = [ 26 | "anstyle", 27 | "anstyle-parse", 28 | "anstyle-query", 29 | "anstyle-wincon", 30 | "colorchoice", 31 | "is_terminal_polyfill", 32 | "utf8parse", 33 | ] 34 | 35 | [[package]] 36 | name = "anstyle" 37 | version = "1.0.10" 38 | source = "registry+https://github.com/rust-lang/crates.io-index" 39 | checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" 40 | 41 | [[package]] 42 | name = "anstyle-parse" 43 | version = "0.2.6" 44 | source = "registry+https://github.com/rust-lang/crates.io-index" 45 | checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" 46 | dependencies = [ 47 | "utf8parse", 48 | ] 49 | 50 | [[package]] 51 | name = "anstyle-query" 52 | version = "1.1.2" 53 | source = "registry+https://github.com/rust-lang/crates.io-index" 54 | checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" 55 | dependencies = [ 56 | "windows-sys 0.59.0", 57 | ] 58 | 59 | [[package]] 60 | name = "anstyle-wincon" 61 | version = "3.0.7" 62 | source = "registry+https://github.com/rust-lang/crates.io-index" 63 | checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" 64 | dependencies = [ 65 | "anstyle", 66 | "once_cell", 67 | "windows-sys 0.59.0", 68 | ] 69 | 70 | [[package]] 71 | name = "async-openai" 72 | version = "0.28.1" 73 | source = "registry+https://github.com/rust-lang/crates.io-index" 74 | checksum = "14d76e2f5af19477d6254415acc95ba97c6cc6f3b1e3cb4676b7f0fab8194298" 75 | dependencies = [ 76 | "async-openai-macros", 77 | "backoff", 78 | "base64", 79 | "bytes", 80 | "derive_builder", 81 | "eventsource-stream", 82 | "futures", 83 | "rand 0.8.5", 84 | "reqwest", 85 | "reqwest-eventsource", 86 | "secrecy", 87 | "serde", 88 | "serde_json", 89 | "thiserror 2.0.12", 90 | "tokio", 91 | "tokio-stream", 92 | "tokio-util", 93 | "tracing", 94 | ] 95 | 96 | [[package]] 97 | name = "async-openai-macros" 98 | version = "0.1.0" 99 | source = "registry+https://github.com/rust-lang/crates.io-index" 100 | checksum = "0289cba6d5143bfe8251d57b4a8cac036adf158525a76533a7082ba65ec76398" 101 | dependencies = [ 102 | "proc-macro2", 103 | "quote", 104 | "syn", 105 | ] 106 | 107 | [[package]] 108 | name = "async-stream" 109 | version = "0.3.6" 110 | source = "registry+https://github.com/rust-lang/crates.io-index" 111 | checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" 112 | dependencies = [ 113 | "async-stream-impl", 114 | "futures-core", 115 | "pin-project-lite", 116 | ] 117 | 118 | [[package]] 119 | name = "async-stream-impl" 120 | version = "0.3.6" 121 | source = "registry+https://github.com/rust-lang/crates.io-index" 122 | checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" 123 | dependencies = [ 124 | "proc-macro2", 125 | "quote", 126 | "syn", 127 | ] 128 | 129 | [[package]] 130 | name = "autocfg" 131 | version = "1.4.0" 132 | source = "registry+https://github.com/rust-lang/crates.io-index" 133 | checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" 134 | 135 | [[package]] 136 | name = "backoff" 137 | version = "0.4.0" 138 | source = "registry+https://github.com/rust-lang/crates.io-index" 139 | checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" 140 | dependencies = [ 141 | "futures-core", 142 | "getrandom 0.2.16", 143 | "instant", 144 | "pin-project-lite", 145 | "rand 0.8.5", 146 | "tokio", 147 | ] 148 | 149 | [[package]] 150 | name = "backtrace" 151 | version = "0.3.74" 152 | source = "registry+https://github.com/rust-lang/crates.io-index" 153 | checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" 154 | dependencies = [ 155 | "addr2line", 156 | "cfg-if", 157 | "libc", 158 | "miniz_oxide", 159 | "object", 160 | "rustc-demangle", 161 | "windows-targets 0.52.6", 162 | ] 163 | 164 | [[package]] 165 | name = "base64" 166 | version = "0.22.1" 167 | source = "registry+https://github.com/rust-lang/crates.io-index" 168 | checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 169 | 170 | [[package]] 171 | name = "bitflags" 172 | version = "2.9.0" 173 | source = "registry+https://github.com/rust-lang/crates.io-index" 174 | checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" 175 | 176 | [[package]] 177 | name = "bumpalo" 178 | version = "3.17.0" 179 | source = "registry+https://github.com/rust-lang/crates.io-index" 180 | checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" 181 | 182 | [[package]] 183 | name = "bytes" 184 | version = "1.10.1" 185 | source = "registry+https://github.com/rust-lang/crates.io-index" 186 | checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" 187 | 188 | [[package]] 189 | name = "cc" 190 | version = "1.2.21" 191 | source = "registry+https://github.com/rust-lang/crates.io-index" 192 | checksum = "8691782945451c1c383942c4874dbe63814f61cb57ef773cda2972682b7bb3c0" 193 | dependencies = [ 194 | "jobserver", 195 | "libc", 196 | "shlex", 197 | ] 198 | 199 | [[package]] 200 | name = "cfg-if" 201 | version = "1.0.0" 202 | source = "registry+https://github.com/rust-lang/crates.io-index" 203 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 204 | 205 | [[package]] 206 | name = "cfg_aliases" 207 | version = "0.2.1" 208 | source = "registry+https://github.com/rust-lang/crates.io-index" 209 | checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" 210 | 211 | [[package]] 212 | name = "clap" 213 | version = "4.5.37" 214 | source = "registry+https://github.com/rust-lang/crates.io-index" 215 | checksum = "eccb054f56cbd38340b380d4a8e69ef1f02f1af43db2f0cc817a4774d80ae071" 216 | dependencies = [ 217 | "clap_builder", 218 | "clap_derive", 219 | ] 220 | 221 | [[package]] 222 | name = "clap_builder" 223 | version = "4.5.37" 224 | source = "registry+https://github.com/rust-lang/crates.io-index" 225 | checksum = "efd9466fac8543255d3b1fcad4762c5e116ffe808c8a3043d4263cd4fd4862a2" 226 | dependencies = [ 227 | "anstream", 228 | "anstyle", 229 | "clap_lex", 230 | "strsim", 231 | ] 232 | 233 | [[package]] 234 | name = "clap_derive" 235 | version = "4.5.32" 236 | source = "registry+https://github.com/rust-lang/crates.io-index" 237 | checksum = "09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7" 238 | dependencies = [ 239 | "heck", 240 | "proc-macro2", 241 | "quote", 242 | "syn", 243 | ] 244 | 245 | [[package]] 246 | name = "clap_lex" 247 | version = "0.7.4" 248 | source = "registry+https://github.com/rust-lang/crates.io-index" 249 | checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" 250 | 251 | [[package]] 252 | name = "colorchoice" 253 | version = "1.0.3" 254 | source = "registry+https://github.com/rust-lang/crates.io-index" 255 | checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" 256 | 257 | [[package]] 258 | name = "core-foundation" 259 | version = "0.9.4" 260 | source = "registry+https://github.com/rust-lang/crates.io-index" 261 | checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 262 | dependencies = [ 263 | "core-foundation-sys", 264 | "libc", 265 | ] 266 | 267 | [[package]] 268 | name = "core-foundation" 269 | version = "0.10.0" 270 | source = "registry+https://github.com/rust-lang/crates.io-index" 271 | checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" 272 | dependencies = [ 273 | "core-foundation-sys", 274 | "libc", 275 | ] 276 | 277 | [[package]] 278 | name = "core-foundation-sys" 279 | version = "0.8.7" 280 | source = "registry+https://github.com/rust-lang/crates.io-index" 281 | checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 282 | 283 | [[package]] 284 | name = "darling" 285 | version = "0.20.11" 286 | source = "registry+https://github.com/rust-lang/crates.io-index" 287 | checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" 288 | dependencies = [ 289 | "darling_core", 290 | "darling_macro", 291 | ] 292 | 293 | [[package]] 294 | name = "darling_core" 295 | version = "0.20.11" 296 | source = "registry+https://github.com/rust-lang/crates.io-index" 297 | checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" 298 | dependencies = [ 299 | "fnv", 300 | "ident_case", 301 | "proc-macro2", 302 | "quote", 303 | "strsim", 304 | "syn", 305 | ] 306 | 307 | [[package]] 308 | name = "darling_macro" 309 | version = "0.20.11" 310 | source = "registry+https://github.com/rust-lang/crates.io-index" 311 | checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" 312 | dependencies = [ 313 | "darling_core", 314 | "quote", 315 | "syn", 316 | ] 317 | 318 | [[package]] 319 | name = "derive_builder" 320 | version = "0.20.2" 321 | source = "registry+https://github.com/rust-lang/crates.io-index" 322 | checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" 323 | dependencies = [ 324 | "derive_builder_macro", 325 | ] 326 | 327 | [[package]] 328 | name = "derive_builder_core" 329 | version = "0.20.2" 330 | source = "registry+https://github.com/rust-lang/crates.io-index" 331 | checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" 332 | dependencies = [ 333 | "darling", 334 | "proc-macro2", 335 | "quote", 336 | "syn", 337 | ] 338 | 339 | [[package]] 340 | name = "derive_builder_macro" 341 | version = "0.20.2" 342 | source = "registry+https://github.com/rust-lang/crates.io-index" 343 | checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" 344 | dependencies = [ 345 | "derive_builder_core", 346 | "syn", 347 | ] 348 | 349 | [[package]] 350 | name = "displaydoc" 351 | version = "0.2.5" 352 | source = "registry+https://github.com/rust-lang/crates.io-index" 353 | checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 354 | dependencies = [ 355 | "proc-macro2", 356 | "quote", 357 | "syn", 358 | ] 359 | 360 | [[package]] 361 | name = "dyn-clone" 362 | version = "1.0.19" 363 | source = "registry+https://github.com/rust-lang/crates.io-index" 364 | checksum = "1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005" 365 | 366 | [[package]] 367 | name = "errno" 368 | version = "0.3.12" 369 | source = "registry+https://github.com/rust-lang/crates.io-index" 370 | checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18" 371 | dependencies = [ 372 | "libc", 373 | "windows-sys 0.59.0", 374 | ] 375 | 376 | [[package]] 377 | name = "eventsource-stream" 378 | version = "0.2.3" 379 | source = "registry+https://github.com/rust-lang/crates.io-index" 380 | checksum = "74fef4569247a5f429d9156b9d0a2599914385dd189c539334c625d8099d90ab" 381 | dependencies = [ 382 | "futures-core", 383 | "nom", 384 | "pin-project-lite", 385 | ] 386 | 387 | [[package]] 388 | name = "fastrand" 389 | version = "2.3.0" 390 | source = "registry+https://github.com/rust-lang/crates.io-index" 391 | checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 392 | 393 | [[package]] 394 | name = "fnv" 395 | version = "1.0.7" 396 | source = "registry+https://github.com/rust-lang/crates.io-index" 397 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 398 | 399 | [[package]] 400 | name = "foreign-types" 401 | version = "0.3.2" 402 | source = "registry+https://github.com/rust-lang/crates.io-index" 403 | checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 404 | dependencies = [ 405 | "foreign-types-shared", 406 | ] 407 | 408 | [[package]] 409 | name = "foreign-types-shared" 410 | version = "0.1.1" 411 | source = "registry+https://github.com/rust-lang/crates.io-index" 412 | checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 413 | 414 | [[package]] 415 | name = "form_urlencoded" 416 | version = "1.2.1" 417 | source = "registry+https://github.com/rust-lang/crates.io-index" 418 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 419 | dependencies = [ 420 | "percent-encoding", 421 | ] 422 | 423 | [[package]] 424 | name = "futures" 425 | version = "0.3.31" 426 | source = "registry+https://github.com/rust-lang/crates.io-index" 427 | checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" 428 | dependencies = [ 429 | "futures-channel", 430 | "futures-core", 431 | "futures-executor", 432 | "futures-io", 433 | "futures-sink", 434 | "futures-task", 435 | "futures-util", 436 | ] 437 | 438 | [[package]] 439 | name = "futures-channel" 440 | version = "0.3.31" 441 | source = "registry+https://github.com/rust-lang/crates.io-index" 442 | checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 443 | dependencies = [ 444 | "futures-core", 445 | "futures-sink", 446 | ] 447 | 448 | [[package]] 449 | name = "futures-core" 450 | version = "0.3.31" 451 | source = "registry+https://github.com/rust-lang/crates.io-index" 452 | checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 453 | 454 | [[package]] 455 | name = "futures-executor" 456 | version = "0.3.31" 457 | source = "registry+https://github.com/rust-lang/crates.io-index" 458 | checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" 459 | dependencies = [ 460 | "futures-core", 461 | "futures-task", 462 | "futures-util", 463 | ] 464 | 465 | [[package]] 466 | name = "futures-io" 467 | version = "0.3.31" 468 | source = "registry+https://github.com/rust-lang/crates.io-index" 469 | checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" 470 | 471 | [[package]] 472 | name = "futures-macro" 473 | version = "0.3.31" 474 | source = "registry+https://github.com/rust-lang/crates.io-index" 475 | checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" 476 | dependencies = [ 477 | "proc-macro2", 478 | "quote", 479 | "syn", 480 | ] 481 | 482 | [[package]] 483 | name = "futures-sink" 484 | version = "0.3.31" 485 | source = "registry+https://github.com/rust-lang/crates.io-index" 486 | checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 487 | 488 | [[package]] 489 | name = "futures-task" 490 | version = "0.3.31" 491 | source = "registry+https://github.com/rust-lang/crates.io-index" 492 | checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 493 | 494 | [[package]] 495 | name = "futures-timer" 496 | version = "3.0.3" 497 | source = "registry+https://github.com/rust-lang/crates.io-index" 498 | checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" 499 | 500 | [[package]] 501 | name = "futures-util" 502 | version = "0.3.31" 503 | source = "registry+https://github.com/rust-lang/crates.io-index" 504 | checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 505 | dependencies = [ 506 | "futures-channel", 507 | "futures-core", 508 | "futures-io", 509 | "futures-macro", 510 | "futures-sink", 511 | "futures-task", 512 | "memchr", 513 | "pin-project-lite", 514 | "pin-utils", 515 | "slab", 516 | ] 517 | 518 | [[package]] 519 | name = "getrandom" 520 | version = "0.2.16" 521 | source = "registry+https://github.com/rust-lang/crates.io-index" 522 | checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" 523 | dependencies = [ 524 | "cfg-if", 525 | "js-sys", 526 | "libc", 527 | "wasi 0.11.0+wasi-snapshot-preview1", 528 | "wasm-bindgen", 529 | ] 530 | 531 | [[package]] 532 | name = "getrandom" 533 | version = "0.3.2" 534 | source = "registry+https://github.com/rust-lang/crates.io-index" 535 | checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" 536 | dependencies = [ 537 | "cfg-if", 538 | "js-sys", 539 | "libc", 540 | "r-efi", 541 | "wasi 0.14.2+wasi-0.2.4", 542 | "wasm-bindgen", 543 | ] 544 | 545 | [[package]] 546 | name = "gimli" 547 | version = "0.31.1" 548 | source = "registry+https://github.com/rust-lang/crates.io-index" 549 | checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" 550 | 551 | [[package]] 552 | name = "git-commit-helper" 553 | version = "0.1.5" 554 | dependencies = [ 555 | "async-openai", 556 | "clap", 557 | "git2", 558 | "ollama-rs", 559 | "tokio", 560 | ] 561 | 562 | [[package]] 563 | name = "git2" 564 | version = "0.20.2" 565 | source = "registry+https://github.com/rust-lang/crates.io-index" 566 | checksum = "2deb07a133b1520dc1a5690e9bd08950108873d7ed5de38dcc74d3b5ebffa110" 567 | dependencies = [ 568 | "bitflags", 569 | "libc", 570 | "libgit2-sys", 571 | "log", 572 | "openssl-probe", 573 | "openssl-sys", 574 | "url", 575 | ] 576 | 577 | [[package]] 578 | name = "hashbrown" 579 | version = "0.12.3" 580 | source = "registry+https://github.com/rust-lang/crates.io-index" 581 | checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" 582 | 583 | [[package]] 584 | name = "heck" 585 | version = "0.5.0" 586 | source = "registry+https://github.com/rust-lang/crates.io-index" 587 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 588 | 589 | [[package]] 590 | name = "http" 591 | version = "1.3.1" 592 | source = "registry+https://github.com/rust-lang/crates.io-index" 593 | checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" 594 | dependencies = [ 595 | "bytes", 596 | "fnv", 597 | "itoa", 598 | ] 599 | 600 | [[package]] 601 | name = "http-body" 602 | version = "1.0.1" 603 | source = "registry+https://github.com/rust-lang/crates.io-index" 604 | checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" 605 | dependencies = [ 606 | "bytes", 607 | "http", 608 | ] 609 | 610 | [[package]] 611 | name = "http-body-util" 612 | version = "0.1.3" 613 | source = "registry+https://github.com/rust-lang/crates.io-index" 614 | checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" 615 | dependencies = [ 616 | "bytes", 617 | "futures-core", 618 | "http", 619 | "http-body", 620 | "pin-project-lite", 621 | ] 622 | 623 | [[package]] 624 | name = "httparse" 625 | version = "1.10.1" 626 | source = "registry+https://github.com/rust-lang/crates.io-index" 627 | checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" 628 | 629 | [[package]] 630 | name = "hyper" 631 | version = "1.6.0" 632 | source = "registry+https://github.com/rust-lang/crates.io-index" 633 | checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" 634 | dependencies = [ 635 | "bytes", 636 | "futures-channel", 637 | "futures-util", 638 | "http", 639 | "http-body", 640 | "httparse", 641 | "itoa", 642 | "pin-project-lite", 643 | "smallvec", 644 | "tokio", 645 | "want", 646 | ] 647 | 648 | [[package]] 649 | name = "hyper-rustls" 650 | version = "0.27.5" 651 | source = "registry+https://github.com/rust-lang/crates.io-index" 652 | checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" 653 | dependencies = [ 654 | "futures-util", 655 | "http", 656 | "hyper", 657 | "hyper-util", 658 | "rustls", 659 | "rustls-native-certs", 660 | "rustls-pki-types", 661 | "tokio", 662 | "tokio-rustls", 663 | "tower-service", 664 | ] 665 | 666 | [[package]] 667 | name = "hyper-tls" 668 | version = "0.6.0" 669 | source = "registry+https://github.com/rust-lang/crates.io-index" 670 | checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" 671 | dependencies = [ 672 | "bytes", 673 | "http-body-util", 674 | "hyper", 675 | "hyper-util", 676 | "native-tls", 677 | "tokio", 678 | "tokio-native-tls", 679 | "tower-service", 680 | ] 681 | 682 | [[package]] 683 | name = "hyper-util" 684 | version = "0.1.11" 685 | source = "registry+https://github.com/rust-lang/crates.io-index" 686 | checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" 687 | dependencies = [ 688 | "bytes", 689 | "futures-channel", 690 | "futures-util", 691 | "http", 692 | "http-body", 693 | "hyper", 694 | "libc", 695 | "pin-project-lite", 696 | "socket2", 697 | "tokio", 698 | "tower-service", 699 | "tracing", 700 | ] 701 | 702 | [[package]] 703 | name = "icu_collections" 704 | version = "1.5.0" 705 | source = "registry+https://github.com/rust-lang/crates.io-index" 706 | checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" 707 | dependencies = [ 708 | "displaydoc", 709 | "yoke", 710 | "zerofrom", 711 | "zerovec", 712 | ] 713 | 714 | [[package]] 715 | name = "icu_locid" 716 | version = "1.5.0" 717 | source = "registry+https://github.com/rust-lang/crates.io-index" 718 | checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" 719 | dependencies = [ 720 | "displaydoc", 721 | "litemap", 722 | "tinystr", 723 | "writeable", 724 | "zerovec", 725 | ] 726 | 727 | [[package]] 728 | name = "icu_locid_transform" 729 | version = "1.5.0" 730 | source = "registry+https://github.com/rust-lang/crates.io-index" 731 | checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" 732 | dependencies = [ 733 | "displaydoc", 734 | "icu_locid", 735 | "icu_locid_transform_data", 736 | "icu_provider", 737 | "tinystr", 738 | "zerovec", 739 | ] 740 | 741 | [[package]] 742 | name = "icu_locid_transform_data" 743 | version = "1.5.1" 744 | source = "registry+https://github.com/rust-lang/crates.io-index" 745 | checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" 746 | 747 | [[package]] 748 | name = "icu_normalizer" 749 | version = "1.5.0" 750 | source = "registry+https://github.com/rust-lang/crates.io-index" 751 | checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" 752 | dependencies = [ 753 | "displaydoc", 754 | "icu_collections", 755 | "icu_normalizer_data", 756 | "icu_properties", 757 | "icu_provider", 758 | "smallvec", 759 | "utf16_iter", 760 | "utf8_iter", 761 | "write16", 762 | "zerovec", 763 | ] 764 | 765 | [[package]] 766 | name = "icu_normalizer_data" 767 | version = "1.5.1" 768 | source = "registry+https://github.com/rust-lang/crates.io-index" 769 | checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" 770 | 771 | [[package]] 772 | name = "icu_properties" 773 | version = "1.5.1" 774 | source = "registry+https://github.com/rust-lang/crates.io-index" 775 | checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" 776 | dependencies = [ 777 | "displaydoc", 778 | "icu_collections", 779 | "icu_locid_transform", 780 | "icu_properties_data", 781 | "icu_provider", 782 | "tinystr", 783 | "zerovec", 784 | ] 785 | 786 | [[package]] 787 | name = "icu_properties_data" 788 | version = "1.5.1" 789 | source = "registry+https://github.com/rust-lang/crates.io-index" 790 | checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" 791 | 792 | [[package]] 793 | name = "icu_provider" 794 | version = "1.5.0" 795 | source = "registry+https://github.com/rust-lang/crates.io-index" 796 | checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" 797 | dependencies = [ 798 | "displaydoc", 799 | "icu_locid", 800 | "icu_provider_macros", 801 | "stable_deref_trait", 802 | "tinystr", 803 | "writeable", 804 | "yoke", 805 | "zerofrom", 806 | "zerovec", 807 | ] 808 | 809 | [[package]] 810 | name = "icu_provider_macros" 811 | version = "1.5.0" 812 | source = "registry+https://github.com/rust-lang/crates.io-index" 813 | checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" 814 | dependencies = [ 815 | "proc-macro2", 816 | "quote", 817 | "syn", 818 | ] 819 | 820 | [[package]] 821 | name = "ident_case" 822 | version = "1.0.1" 823 | source = "registry+https://github.com/rust-lang/crates.io-index" 824 | checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" 825 | 826 | [[package]] 827 | name = "idna" 828 | version = "1.0.3" 829 | source = "registry+https://github.com/rust-lang/crates.io-index" 830 | checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" 831 | dependencies = [ 832 | "idna_adapter", 833 | "smallvec", 834 | "utf8_iter", 835 | ] 836 | 837 | [[package]] 838 | name = "idna_adapter" 839 | version = "1.2.0" 840 | source = "registry+https://github.com/rust-lang/crates.io-index" 841 | checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" 842 | dependencies = [ 843 | "icu_normalizer", 844 | "icu_properties", 845 | ] 846 | 847 | [[package]] 848 | name = "indexmap" 849 | version = "1.9.3" 850 | source = "registry+https://github.com/rust-lang/crates.io-index" 851 | checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" 852 | dependencies = [ 853 | "autocfg", 854 | "hashbrown", 855 | "serde", 856 | ] 857 | 858 | [[package]] 859 | name = "instant" 860 | version = "0.1.13" 861 | source = "registry+https://github.com/rust-lang/crates.io-index" 862 | checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" 863 | dependencies = [ 864 | "cfg-if", 865 | ] 866 | 867 | [[package]] 868 | name = "ipnet" 869 | version = "2.11.0" 870 | source = "registry+https://github.com/rust-lang/crates.io-index" 871 | checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" 872 | 873 | [[package]] 874 | name = "is_terminal_polyfill" 875 | version = "1.70.1" 876 | source = "registry+https://github.com/rust-lang/crates.io-index" 877 | checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" 878 | 879 | [[package]] 880 | name = "itoa" 881 | version = "1.0.15" 882 | source = "registry+https://github.com/rust-lang/crates.io-index" 883 | checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" 884 | 885 | [[package]] 886 | name = "jobserver" 887 | version = "0.1.33" 888 | source = "registry+https://github.com/rust-lang/crates.io-index" 889 | checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" 890 | dependencies = [ 891 | "getrandom 0.3.2", 892 | "libc", 893 | ] 894 | 895 | [[package]] 896 | name = "js-sys" 897 | version = "0.3.77" 898 | source = "registry+https://github.com/rust-lang/crates.io-index" 899 | checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" 900 | dependencies = [ 901 | "once_cell", 902 | "wasm-bindgen", 903 | ] 904 | 905 | [[package]] 906 | name = "libc" 907 | version = "0.2.172" 908 | source = "registry+https://github.com/rust-lang/crates.io-index" 909 | checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" 910 | 911 | [[package]] 912 | name = "libgit2-sys" 913 | version = "0.18.1+1.9.0" 914 | source = "registry+https://github.com/rust-lang/crates.io-index" 915 | checksum = "e1dcb20f84ffcdd825c7a311ae347cce604a6f084a767dec4a4929829645290e" 916 | dependencies = [ 917 | "cc", 918 | "libc", 919 | "libssh2-sys", 920 | "libz-sys", 921 | "openssl-sys", 922 | "pkg-config", 923 | ] 924 | 925 | [[package]] 926 | name = "libssh2-sys" 927 | version = "0.3.1" 928 | source = "registry+https://github.com/rust-lang/crates.io-index" 929 | checksum = "220e4f05ad4a218192533b300327f5150e809b54c4ec83b5a1d91833601811b9" 930 | dependencies = [ 931 | "cc", 932 | "libc", 933 | "libz-sys", 934 | "openssl-sys", 935 | "pkg-config", 936 | "vcpkg", 937 | ] 938 | 939 | [[package]] 940 | name = "libz-sys" 941 | version = "1.1.22" 942 | source = "registry+https://github.com/rust-lang/crates.io-index" 943 | checksum = "8b70e7a7df205e92a1a4cd9aaae7898dac0aa555503cc0a649494d0d60e7651d" 944 | dependencies = [ 945 | "cc", 946 | "libc", 947 | "pkg-config", 948 | "vcpkg", 949 | ] 950 | 951 | [[package]] 952 | name = "linux-raw-sys" 953 | version = "0.9.4" 954 | source = "registry+https://github.com/rust-lang/crates.io-index" 955 | checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" 956 | 957 | [[package]] 958 | name = "litemap" 959 | version = "0.7.5" 960 | source = "registry+https://github.com/rust-lang/crates.io-index" 961 | checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" 962 | 963 | [[package]] 964 | name = "lock_api" 965 | version = "0.4.12" 966 | source = "registry+https://github.com/rust-lang/crates.io-index" 967 | checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" 968 | dependencies = [ 969 | "autocfg", 970 | "scopeguard", 971 | ] 972 | 973 | [[package]] 974 | name = "log" 975 | version = "0.4.27" 976 | source = "registry+https://github.com/rust-lang/crates.io-index" 977 | checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" 978 | 979 | [[package]] 980 | name = "memchr" 981 | version = "2.7.4" 982 | source = "registry+https://github.com/rust-lang/crates.io-index" 983 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 984 | 985 | [[package]] 986 | name = "mime" 987 | version = "0.3.17" 988 | source = "registry+https://github.com/rust-lang/crates.io-index" 989 | checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 990 | 991 | [[package]] 992 | name = "mime_guess" 993 | version = "2.0.5" 994 | source = "registry+https://github.com/rust-lang/crates.io-index" 995 | checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" 996 | dependencies = [ 997 | "mime", 998 | "unicase", 999 | ] 1000 | 1001 | [[package]] 1002 | name = "minimal-lexical" 1003 | version = "0.2.1" 1004 | source = "registry+https://github.com/rust-lang/crates.io-index" 1005 | checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 1006 | 1007 | [[package]] 1008 | name = "miniz_oxide" 1009 | version = "0.8.8" 1010 | source = "registry+https://github.com/rust-lang/crates.io-index" 1011 | checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" 1012 | dependencies = [ 1013 | "adler2", 1014 | ] 1015 | 1016 | [[package]] 1017 | name = "mio" 1018 | version = "1.0.3" 1019 | source = "registry+https://github.com/rust-lang/crates.io-index" 1020 | checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" 1021 | dependencies = [ 1022 | "libc", 1023 | "wasi 0.11.0+wasi-snapshot-preview1", 1024 | "windows-sys 0.52.0", 1025 | ] 1026 | 1027 | [[package]] 1028 | name = "native-tls" 1029 | version = "0.2.14" 1030 | source = "registry+https://github.com/rust-lang/crates.io-index" 1031 | checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" 1032 | dependencies = [ 1033 | "libc", 1034 | "log", 1035 | "openssl", 1036 | "openssl-probe", 1037 | "openssl-sys", 1038 | "schannel", 1039 | "security-framework 2.11.1", 1040 | "security-framework-sys", 1041 | "tempfile", 1042 | ] 1043 | 1044 | [[package]] 1045 | name = "nom" 1046 | version = "7.1.3" 1047 | source = "registry+https://github.com/rust-lang/crates.io-index" 1048 | checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" 1049 | dependencies = [ 1050 | "memchr", 1051 | "minimal-lexical", 1052 | ] 1053 | 1054 | [[package]] 1055 | name = "object" 1056 | version = "0.36.7" 1057 | source = "registry+https://github.com/rust-lang/crates.io-index" 1058 | checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" 1059 | dependencies = [ 1060 | "memchr", 1061 | ] 1062 | 1063 | [[package]] 1064 | name = "ollama-rs" 1065 | version = "0.3.1" 1066 | source = "registry+https://github.com/rust-lang/crates.io-index" 1067 | checksum = "a0bd0e2c30868e72ffca8143873c6c1e288b2efda9d3950e9ae0d0b4039c49c3" 1068 | dependencies = [ 1069 | "async-stream", 1070 | "log", 1071 | "reqwest", 1072 | "schemars", 1073 | "serde", 1074 | "serde_json", 1075 | "static_assertions", 1076 | "thiserror 2.0.12", 1077 | "url", 1078 | ] 1079 | 1080 | [[package]] 1081 | name = "once_cell" 1082 | version = "1.21.3" 1083 | source = "registry+https://github.com/rust-lang/crates.io-index" 1084 | checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" 1085 | 1086 | [[package]] 1087 | name = "openssl" 1088 | version = "0.10.73" 1089 | source = "registry+https://github.com/rust-lang/crates.io-index" 1090 | checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" 1091 | dependencies = [ 1092 | "bitflags", 1093 | "cfg-if", 1094 | "foreign-types", 1095 | "libc", 1096 | "once_cell", 1097 | "openssl-macros", 1098 | "openssl-sys", 1099 | ] 1100 | 1101 | [[package]] 1102 | name = "openssl-macros" 1103 | version = "0.1.1" 1104 | source = "registry+https://github.com/rust-lang/crates.io-index" 1105 | checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" 1106 | dependencies = [ 1107 | "proc-macro2", 1108 | "quote", 1109 | "syn", 1110 | ] 1111 | 1112 | [[package]] 1113 | name = "openssl-probe" 1114 | version = "0.1.6" 1115 | source = "registry+https://github.com/rust-lang/crates.io-index" 1116 | checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" 1117 | 1118 | [[package]] 1119 | name = "openssl-sys" 1120 | version = "0.9.109" 1121 | source = "registry+https://github.com/rust-lang/crates.io-index" 1122 | checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" 1123 | dependencies = [ 1124 | "cc", 1125 | "libc", 1126 | "pkg-config", 1127 | "vcpkg", 1128 | ] 1129 | 1130 | [[package]] 1131 | name = "parking_lot" 1132 | version = "0.12.3" 1133 | source = "registry+https://github.com/rust-lang/crates.io-index" 1134 | checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" 1135 | dependencies = [ 1136 | "lock_api", 1137 | "parking_lot_core", 1138 | ] 1139 | 1140 | [[package]] 1141 | name = "parking_lot_core" 1142 | version = "0.9.10" 1143 | source = "registry+https://github.com/rust-lang/crates.io-index" 1144 | checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" 1145 | dependencies = [ 1146 | "cfg-if", 1147 | "libc", 1148 | "redox_syscall", 1149 | "smallvec", 1150 | "windows-targets 0.52.6", 1151 | ] 1152 | 1153 | [[package]] 1154 | name = "percent-encoding" 1155 | version = "2.3.1" 1156 | source = "registry+https://github.com/rust-lang/crates.io-index" 1157 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 1158 | 1159 | [[package]] 1160 | name = "pin-project-lite" 1161 | version = "0.2.16" 1162 | source = "registry+https://github.com/rust-lang/crates.io-index" 1163 | checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 1164 | 1165 | [[package]] 1166 | name = "pin-utils" 1167 | version = "0.1.0" 1168 | source = "registry+https://github.com/rust-lang/crates.io-index" 1169 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1170 | 1171 | [[package]] 1172 | name = "pkg-config" 1173 | version = "0.3.32" 1174 | source = "registry+https://github.com/rust-lang/crates.io-index" 1175 | checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" 1176 | 1177 | [[package]] 1178 | name = "ppv-lite86" 1179 | version = "0.2.21" 1180 | source = "registry+https://github.com/rust-lang/crates.io-index" 1181 | checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" 1182 | dependencies = [ 1183 | "zerocopy", 1184 | ] 1185 | 1186 | [[package]] 1187 | name = "proc-macro2" 1188 | version = "1.0.95" 1189 | source = "registry+https://github.com/rust-lang/crates.io-index" 1190 | checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" 1191 | dependencies = [ 1192 | "unicode-ident", 1193 | ] 1194 | 1195 | [[package]] 1196 | name = "quinn" 1197 | version = "0.11.7" 1198 | source = "registry+https://github.com/rust-lang/crates.io-index" 1199 | checksum = "c3bd15a6f2967aef83887dcb9fec0014580467e33720d073560cf015a5683012" 1200 | dependencies = [ 1201 | "bytes", 1202 | "cfg_aliases", 1203 | "pin-project-lite", 1204 | "quinn-proto", 1205 | "quinn-udp", 1206 | "rustc-hash", 1207 | "rustls", 1208 | "socket2", 1209 | "thiserror 2.0.12", 1210 | "tokio", 1211 | "tracing", 1212 | "web-time", 1213 | ] 1214 | 1215 | [[package]] 1216 | name = "quinn-proto" 1217 | version = "0.11.11" 1218 | source = "registry+https://github.com/rust-lang/crates.io-index" 1219 | checksum = "bcbafbbdbb0f638fe3f35f3c56739f77a8a1d070cb25603226c83339b391472b" 1220 | dependencies = [ 1221 | "bytes", 1222 | "getrandom 0.3.2", 1223 | "rand 0.9.1", 1224 | "ring", 1225 | "rustc-hash", 1226 | "rustls", 1227 | "rustls-pki-types", 1228 | "slab", 1229 | "thiserror 2.0.12", 1230 | "tinyvec", 1231 | "tracing", 1232 | "web-time", 1233 | ] 1234 | 1235 | [[package]] 1236 | name = "quinn-udp" 1237 | version = "0.5.12" 1238 | source = "registry+https://github.com/rust-lang/crates.io-index" 1239 | checksum = "ee4e529991f949c5e25755532370b8af5d114acae52326361d68d47af64aa842" 1240 | dependencies = [ 1241 | "cfg_aliases", 1242 | "libc", 1243 | "once_cell", 1244 | "socket2", 1245 | "tracing", 1246 | "windows-sys 0.59.0", 1247 | ] 1248 | 1249 | [[package]] 1250 | name = "quote" 1251 | version = "1.0.40" 1252 | source = "registry+https://github.com/rust-lang/crates.io-index" 1253 | checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" 1254 | dependencies = [ 1255 | "proc-macro2", 1256 | ] 1257 | 1258 | [[package]] 1259 | name = "r-efi" 1260 | version = "5.2.0" 1261 | source = "registry+https://github.com/rust-lang/crates.io-index" 1262 | checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" 1263 | 1264 | [[package]] 1265 | name = "rand" 1266 | version = "0.8.5" 1267 | source = "registry+https://github.com/rust-lang/crates.io-index" 1268 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 1269 | dependencies = [ 1270 | "libc", 1271 | "rand_chacha 0.3.1", 1272 | "rand_core 0.6.4", 1273 | ] 1274 | 1275 | [[package]] 1276 | name = "rand" 1277 | version = "0.9.1" 1278 | source = "registry+https://github.com/rust-lang/crates.io-index" 1279 | checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" 1280 | dependencies = [ 1281 | "rand_chacha 0.9.0", 1282 | "rand_core 0.9.3", 1283 | ] 1284 | 1285 | [[package]] 1286 | name = "rand_chacha" 1287 | version = "0.3.1" 1288 | source = "registry+https://github.com/rust-lang/crates.io-index" 1289 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 1290 | dependencies = [ 1291 | "ppv-lite86", 1292 | "rand_core 0.6.4", 1293 | ] 1294 | 1295 | [[package]] 1296 | name = "rand_chacha" 1297 | version = "0.9.0" 1298 | source = "registry+https://github.com/rust-lang/crates.io-index" 1299 | checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" 1300 | dependencies = [ 1301 | "ppv-lite86", 1302 | "rand_core 0.9.3", 1303 | ] 1304 | 1305 | [[package]] 1306 | name = "rand_core" 1307 | version = "0.6.4" 1308 | source = "registry+https://github.com/rust-lang/crates.io-index" 1309 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1310 | dependencies = [ 1311 | "getrandom 0.2.16", 1312 | ] 1313 | 1314 | [[package]] 1315 | name = "rand_core" 1316 | version = "0.9.3" 1317 | source = "registry+https://github.com/rust-lang/crates.io-index" 1318 | checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" 1319 | dependencies = [ 1320 | "getrandom 0.3.2", 1321 | ] 1322 | 1323 | [[package]] 1324 | name = "redox_syscall" 1325 | version = "0.5.12" 1326 | source = "registry+https://github.com/rust-lang/crates.io-index" 1327 | checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" 1328 | dependencies = [ 1329 | "bitflags", 1330 | ] 1331 | 1332 | [[package]] 1333 | name = "reqwest" 1334 | version = "0.12.15" 1335 | source = "registry+https://github.com/rust-lang/crates.io-index" 1336 | checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" 1337 | dependencies = [ 1338 | "base64", 1339 | "bytes", 1340 | "futures-core", 1341 | "futures-util", 1342 | "http", 1343 | "http-body", 1344 | "http-body-util", 1345 | "hyper", 1346 | "hyper-rustls", 1347 | "hyper-tls", 1348 | "hyper-util", 1349 | "ipnet", 1350 | "js-sys", 1351 | "log", 1352 | "mime", 1353 | "mime_guess", 1354 | "native-tls", 1355 | "once_cell", 1356 | "percent-encoding", 1357 | "pin-project-lite", 1358 | "quinn", 1359 | "rustls", 1360 | "rustls-native-certs", 1361 | "rustls-pemfile", 1362 | "rustls-pki-types", 1363 | "serde", 1364 | "serde_json", 1365 | "serde_urlencoded", 1366 | "sync_wrapper", 1367 | "tokio", 1368 | "tokio-native-tls", 1369 | "tokio-rustls", 1370 | "tokio-util", 1371 | "tower", 1372 | "tower-service", 1373 | "url", 1374 | "wasm-bindgen", 1375 | "wasm-bindgen-futures", 1376 | "wasm-streams", 1377 | "web-sys", 1378 | "windows-registry", 1379 | ] 1380 | 1381 | [[package]] 1382 | name = "reqwest-eventsource" 1383 | version = "0.6.0" 1384 | source = "registry+https://github.com/rust-lang/crates.io-index" 1385 | checksum = "632c55746dbb44275691640e7b40c907c16a2dc1a5842aa98aaec90da6ec6bde" 1386 | dependencies = [ 1387 | "eventsource-stream", 1388 | "futures-core", 1389 | "futures-timer", 1390 | "mime", 1391 | "nom", 1392 | "pin-project-lite", 1393 | "reqwest", 1394 | "thiserror 1.0.69", 1395 | ] 1396 | 1397 | [[package]] 1398 | name = "ring" 1399 | version = "0.17.14" 1400 | source = "registry+https://github.com/rust-lang/crates.io-index" 1401 | checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" 1402 | dependencies = [ 1403 | "cc", 1404 | "cfg-if", 1405 | "getrandom 0.2.16", 1406 | "libc", 1407 | "untrusted", 1408 | "windows-sys 0.52.0", 1409 | ] 1410 | 1411 | [[package]] 1412 | name = "rustc-demangle" 1413 | version = "0.1.24" 1414 | source = "registry+https://github.com/rust-lang/crates.io-index" 1415 | checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" 1416 | 1417 | [[package]] 1418 | name = "rustc-hash" 1419 | version = "2.1.1" 1420 | source = "registry+https://github.com/rust-lang/crates.io-index" 1421 | checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" 1422 | 1423 | [[package]] 1424 | name = "rustix" 1425 | version = "1.0.7" 1426 | source = "registry+https://github.com/rust-lang/crates.io-index" 1427 | checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" 1428 | dependencies = [ 1429 | "bitflags", 1430 | "errno", 1431 | "libc", 1432 | "linux-raw-sys", 1433 | "windows-sys 0.59.0", 1434 | ] 1435 | 1436 | [[package]] 1437 | name = "rustls" 1438 | version = "0.23.27" 1439 | source = "registry+https://github.com/rust-lang/crates.io-index" 1440 | checksum = "730944ca083c1c233a75c09f199e973ca499344a2b7ba9e755c457e86fb4a321" 1441 | dependencies = [ 1442 | "once_cell", 1443 | "ring", 1444 | "rustls-pki-types", 1445 | "rustls-webpki", 1446 | "subtle", 1447 | "zeroize", 1448 | ] 1449 | 1450 | [[package]] 1451 | name = "rustls-native-certs" 1452 | version = "0.8.1" 1453 | source = "registry+https://github.com/rust-lang/crates.io-index" 1454 | checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" 1455 | dependencies = [ 1456 | "openssl-probe", 1457 | "rustls-pki-types", 1458 | "schannel", 1459 | "security-framework 3.2.0", 1460 | ] 1461 | 1462 | [[package]] 1463 | name = "rustls-pemfile" 1464 | version = "2.2.0" 1465 | source = "registry+https://github.com/rust-lang/crates.io-index" 1466 | checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" 1467 | dependencies = [ 1468 | "rustls-pki-types", 1469 | ] 1470 | 1471 | [[package]] 1472 | name = "rustls-pki-types" 1473 | version = "1.11.0" 1474 | source = "registry+https://github.com/rust-lang/crates.io-index" 1475 | checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" 1476 | dependencies = [ 1477 | "web-time", 1478 | ] 1479 | 1480 | [[package]] 1481 | name = "rustls-webpki" 1482 | version = "0.103.2" 1483 | source = "registry+https://github.com/rust-lang/crates.io-index" 1484 | checksum = "7149975849f1abb3832b246010ef62ccc80d3a76169517ada7188252b9cfb437" 1485 | dependencies = [ 1486 | "ring", 1487 | "rustls-pki-types", 1488 | "untrusted", 1489 | ] 1490 | 1491 | [[package]] 1492 | name = "rustversion" 1493 | version = "1.0.20" 1494 | source = "registry+https://github.com/rust-lang/crates.io-index" 1495 | checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" 1496 | 1497 | [[package]] 1498 | name = "ryu" 1499 | version = "1.0.20" 1500 | source = "registry+https://github.com/rust-lang/crates.io-index" 1501 | checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" 1502 | 1503 | [[package]] 1504 | name = "schannel" 1505 | version = "0.1.27" 1506 | source = "registry+https://github.com/rust-lang/crates.io-index" 1507 | checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" 1508 | dependencies = [ 1509 | "windows-sys 0.59.0", 1510 | ] 1511 | 1512 | [[package]] 1513 | name = "schemars" 1514 | version = "0.8.22" 1515 | source = "registry+https://github.com/rust-lang/crates.io-index" 1516 | checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" 1517 | dependencies = [ 1518 | "dyn-clone", 1519 | "indexmap", 1520 | "schemars_derive", 1521 | "serde", 1522 | "serde_json", 1523 | ] 1524 | 1525 | [[package]] 1526 | name = "schemars_derive" 1527 | version = "0.8.22" 1528 | source = "registry+https://github.com/rust-lang/crates.io-index" 1529 | checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" 1530 | dependencies = [ 1531 | "proc-macro2", 1532 | "quote", 1533 | "serde_derive_internals", 1534 | "syn", 1535 | ] 1536 | 1537 | [[package]] 1538 | name = "scopeguard" 1539 | version = "1.2.0" 1540 | source = "registry+https://github.com/rust-lang/crates.io-index" 1541 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 1542 | 1543 | [[package]] 1544 | name = "secrecy" 1545 | version = "0.10.3" 1546 | source = "registry+https://github.com/rust-lang/crates.io-index" 1547 | checksum = "e891af845473308773346dc847b2c23ee78fe442e0472ac50e22a18a93d3ae5a" 1548 | dependencies = [ 1549 | "serde", 1550 | "zeroize", 1551 | ] 1552 | 1553 | [[package]] 1554 | name = "security-framework" 1555 | version = "2.11.1" 1556 | source = "registry+https://github.com/rust-lang/crates.io-index" 1557 | checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" 1558 | dependencies = [ 1559 | "bitflags", 1560 | "core-foundation 0.9.4", 1561 | "core-foundation-sys", 1562 | "libc", 1563 | "security-framework-sys", 1564 | ] 1565 | 1566 | [[package]] 1567 | name = "security-framework" 1568 | version = "3.2.0" 1569 | source = "registry+https://github.com/rust-lang/crates.io-index" 1570 | checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" 1571 | dependencies = [ 1572 | "bitflags", 1573 | "core-foundation 0.10.0", 1574 | "core-foundation-sys", 1575 | "libc", 1576 | "security-framework-sys", 1577 | ] 1578 | 1579 | [[package]] 1580 | name = "security-framework-sys" 1581 | version = "2.14.0" 1582 | source = "registry+https://github.com/rust-lang/crates.io-index" 1583 | checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" 1584 | dependencies = [ 1585 | "core-foundation-sys", 1586 | "libc", 1587 | ] 1588 | 1589 | [[package]] 1590 | name = "serde" 1591 | version = "1.0.219" 1592 | source = "registry+https://github.com/rust-lang/crates.io-index" 1593 | checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" 1594 | dependencies = [ 1595 | "serde_derive", 1596 | ] 1597 | 1598 | [[package]] 1599 | name = "serde_derive" 1600 | version = "1.0.219" 1601 | source = "registry+https://github.com/rust-lang/crates.io-index" 1602 | checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" 1603 | dependencies = [ 1604 | "proc-macro2", 1605 | "quote", 1606 | "syn", 1607 | ] 1608 | 1609 | [[package]] 1610 | name = "serde_derive_internals" 1611 | version = "0.29.1" 1612 | source = "registry+https://github.com/rust-lang/crates.io-index" 1613 | checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" 1614 | dependencies = [ 1615 | "proc-macro2", 1616 | "quote", 1617 | "syn", 1618 | ] 1619 | 1620 | [[package]] 1621 | name = "serde_json" 1622 | version = "1.0.140" 1623 | source = "registry+https://github.com/rust-lang/crates.io-index" 1624 | checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" 1625 | dependencies = [ 1626 | "itoa", 1627 | "memchr", 1628 | "ryu", 1629 | "serde", 1630 | ] 1631 | 1632 | [[package]] 1633 | name = "serde_urlencoded" 1634 | version = "0.7.1" 1635 | source = "registry+https://github.com/rust-lang/crates.io-index" 1636 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 1637 | dependencies = [ 1638 | "form_urlencoded", 1639 | "itoa", 1640 | "ryu", 1641 | "serde", 1642 | ] 1643 | 1644 | [[package]] 1645 | name = "shlex" 1646 | version = "1.3.0" 1647 | source = "registry+https://github.com/rust-lang/crates.io-index" 1648 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 1649 | 1650 | [[package]] 1651 | name = "signal-hook-registry" 1652 | version = "1.4.5" 1653 | source = "registry+https://github.com/rust-lang/crates.io-index" 1654 | checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" 1655 | dependencies = [ 1656 | "libc", 1657 | ] 1658 | 1659 | [[package]] 1660 | name = "slab" 1661 | version = "0.4.9" 1662 | source = "registry+https://github.com/rust-lang/crates.io-index" 1663 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 1664 | dependencies = [ 1665 | "autocfg", 1666 | ] 1667 | 1668 | [[package]] 1669 | name = "smallvec" 1670 | version = "1.15.0" 1671 | source = "registry+https://github.com/rust-lang/crates.io-index" 1672 | checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" 1673 | 1674 | [[package]] 1675 | name = "socket2" 1676 | version = "0.5.9" 1677 | source = "registry+https://github.com/rust-lang/crates.io-index" 1678 | checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" 1679 | dependencies = [ 1680 | "libc", 1681 | "windows-sys 0.52.0", 1682 | ] 1683 | 1684 | [[package]] 1685 | name = "stable_deref_trait" 1686 | version = "1.2.0" 1687 | source = "registry+https://github.com/rust-lang/crates.io-index" 1688 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 1689 | 1690 | [[package]] 1691 | name = "static_assertions" 1692 | version = "1.1.0" 1693 | source = "registry+https://github.com/rust-lang/crates.io-index" 1694 | checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" 1695 | 1696 | [[package]] 1697 | name = "strsim" 1698 | version = "0.11.1" 1699 | source = "registry+https://github.com/rust-lang/crates.io-index" 1700 | checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 1701 | 1702 | [[package]] 1703 | name = "subtle" 1704 | version = "2.6.1" 1705 | source = "registry+https://github.com/rust-lang/crates.io-index" 1706 | checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 1707 | 1708 | [[package]] 1709 | name = "syn" 1710 | version = "2.0.101" 1711 | source = "registry+https://github.com/rust-lang/crates.io-index" 1712 | checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" 1713 | dependencies = [ 1714 | "proc-macro2", 1715 | "quote", 1716 | "unicode-ident", 1717 | ] 1718 | 1719 | [[package]] 1720 | name = "sync_wrapper" 1721 | version = "1.0.2" 1722 | source = "registry+https://github.com/rust-lang/crates.io-index" 1723 | checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" 1724 | dependencies = [ 1725 | "futures-core", 1726 | ] 1727 | 1728 | [[package]] 1729 | name = "synstructure" 1730 | version = "0.13.2" 1731 | source = "registry+https://github.com/rust-lang/crates.io-index" 1732 | checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" 1733 | dependencies = [ 1734 | "proc-macro2", 1735 | "quote", 1736 | "syn", 1737 | ] 1738 | 1739 | [[package]] 1740 | name = "tempfile" 1741 | version = "3.20.0" 1742 | source = "registry+https://github.com/rust-lang/crates.io-index" 1743 | checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" 1744 | dependencies = [ 1745 | "fastrand", 1746 | "getrandom 0.3.2", 1747 | "once_cell", 1748 | "rustix", 1749 | "windows-sys 0.59.0", 1750 | ] 1751 | 1752 | [[package]] 1753 | name = "thiserror" 1754 | version = "1.0.69" 1755 | source = "registry+https://github.com/rust-lang/crates.io-index" 1756 | checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" 1757 | dependencies = [ 1758 | "thiserror-impl 1.0.69", 1759 | ] 1760 | 1761 | [[package]] 1762 | name = "thiserror" 1763 | version = "2.0.12" 1764 | source = "registry+https://github.com/rust-lang/crates.io-index" 1765 | checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" 1766 | dependencies = [ 1767 | "thiserror-impl 2.0.12", 1768 | ] 1769 | 1770 | [[package]] 1771 | name = "thiserror-impl" 1772 | version = "1.0.69" 1773 | source = "registry+https://github.com/rust-lang/crates.io-index" 1774 | checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" 1775 | dependencies = [ 1776 | "proc-macro2", 1777 | "quote", 1778 | "syn", 1779 | ] 1780 | 1781 | [[package]] 1782 | name = "thiserror-impl" 1783 | version = "2.0.12" 1784 | source = "registry+https://github.com/rust-lang/crates.io-index" 1785 | checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" 1786 | dependencies = [ 1787 | "proc-macro2", 1788 | "quote", 1789 | "syn", 1790 | ] 1791 | 1792 | [[package]] 1793 | name = "tinystr" 1794 | version = "0.7.6" 1795 | source = "registry+https://github.com/rust-lang/crates.io-index" 1796 | checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" 1797 | dependencies = [ 1798 | "displaydoc", 1799 | "zerovec", 1800 | ] 1801 | 1802 | [[package]] 1803 | name = "tinyvec" 1804 | version = "1.9.0" 1805 | source = "registry+https://github.com/rust-lang/crates.io-index" 1806 | checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" 1807 | dependencies = [ 1808 | "tinyvec_macros", 1809 | ] 1810 | 1811 | [[package]] 1812 | name = "tinyvec_macros" 1813 | version = "0.1.1" 1814 | source = "registry+https://github.com/rust-lang/crates.io-index" 1815 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 1816 | 1817 | [[package]] 1818 | name = "tokio" 1819 | version = "1.45.0" 1820 | source = "registry+https://github.com/rust-lang/crates.io-index" 1821 | checksum = "2513ca694ef9ede0fb23fe71a4ee4107cb102b9dc1930f6d0fd77aae068ae165" 1822 | dependencies = [ 1823 | "backtrace", 1824 | "bytes", 1825 | "libc", 1826 | "mio", 1827 | "parking_lot", 1828 | "pin-project-lite", 1829 | "signal-hook-registry", 1830 | "socket2", 1831 | "tokio-macros", 1832 | "windows-sys 0.52.0", 1833 | ] 1834 | 1835 | [[package]] 1836 | name = "tokio-macros" 1837 | version = "2.5.0" 1838 | source = "registry+https://github.com/rust-lang/crates.io-index" 1839 | checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" 1840 | dependencies = [ 1841 | "proc-macro2", 1842 | "quote", 1843 | "syn", 1844 | ] 1845 | 1846 | [[package]] 1847 | name = "tokio-native-tls" 1848 | version = "0.3.1" 1849 | source = "registry+https://github.com/rust-lang/crates.io-index" 1850 | checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" 1851 | dependencies = [ 1852 | "native-tls", 1853 | "tokio", 1854 | ] 1855 | 1856 | [[package]] 1857 | name = "tokio-rustls" 1858 | version = "0.26.2" 1859 | source = "registry+https://github.com/rust-lang/crates.io-index" 1860 | checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" 1861 | dependencies = [ 1862 | "rustls", 1863 | "tokio", 1864 | ] 1865 | 1866 | [[package]] 1867 | name = "tokio-stream" 1868 | version = "0.1.17" 1869 | source = "registry+https://github.com/rust-lang/crates.io-index" 1870 | checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" 1871 | dependencies = [ 1872 | "futures-core", 1873 | "pin-project-lite", 1874 | "tokio", 1875 | ] 1876 | 1877 | [[package]] 1878 | name = "tokio-util" 1879 | version = "0.7.15" 1880 | source = "registry+https://github.com/rust-lang/crates.io-index" 1881 | checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" 1882 | dependencies = [ 1883 | "bytes", 1884 | "futures-core", 1885 | "futures-sink", 1886 | "pin-project-lite", 1887 | "tokio", 1888 | ] 1889 | 1890 | [[package]] 1891 | name = "tower" 1892 | version = "0.5.2" 1893 | source = "registry+https://github.com/rust-lang/crates.io-index" 1894 | checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" 1895 | dependencies = [ 1896 | "futures-core", 1897 | "futures-util", 1898 | "pin-project-lite", 1899 | "sync_wrapper", 1900 | "tokio", 1901 | "tower-layer", 1902 | "tower-service", 1903 | ] 1904 | 1905 | [[package]] 1906 | name = "tower-layer" 1907 | version = "0.3.3" 1908 | source = "registry+https://github.com/rust-lang/crates.io-index" 1909 | checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" 1910 | 1911 | [[package]] 1912 | name = "tower-service" 1913 | version = "0.3.3" 1914 | source = "registry+https://github.com/rust-lang/crates.io-index" 1915 | checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" 1916 | 1917 | [[package]] 1918 | name = "tracing" 1919 | version = "0.1.41" 1920 | source = "registry+https://github.com/rust-lang/crates.io-index" 1921 | checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" 1922 | dependencies = [ 1923 | "pin-project-lite", 1924 | "tracing-attributes", 1925 | "tracing-core", 1926 | ] 1927 | 1928 | [[package]] 1929 | name = "tracing-attributes" 1930 | version = "0.1.28" 1931 | source = "registry+https://github.com/rust-lang/crates.io-index" 1932 | checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" 1933 | dependencies = [ 1934 | "proc-macro2", 1935 | "quote", 1936 | "syn", 1937 | ] 1938 | 1939 | [[package]] 1940 | name = "tracing-core" 1941 | version = "0.1.33" 1942 | source = "registry+https://github.com/rust-lang/crates.io-index" 1943 | checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" 1944 | dependencies = [ 1945 | "once_cell", 1946 | ] 1947 | 1948 | [[package]] 1949 | name = "try-lock" 1950 | version = "0.2.5" 1951 | source = "registry+https://github.com/rust-lang/crates.io-index" 1952 | checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" 1953 | 1954 | [[package]] 1955 | name = "unicase" 1956 | version = "2.8.1" 1957 | source = "registry+https://github.com/rust-lang/crates.io-index" 1958 | checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" 1959 | 1960 | [[package]] 1961 | name = "unicode-ident" 1962 | version = "1.0.18" 1963 | source = "registry+https://github.com/rust-lang/crates.io-index" 1964 | checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" 1965 | 1966 | [[package]] 1967 | name = "untrusted" 1968 | version = "0.9.0" 1969 | source = "registry+https://github.com/rust-lang/crates.io-index" 1970 | checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" 1971 | 1972 | [[package]] 1973 | name = "url" 1974 | version = "2.5.4" 1975 | source = "registry+https://github.com/rust-lang/crates.io-index" 1976 | checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" 1977 | dependencies = [ 1978 | "form_urlencoded", 1979 | "idna", 1980 | "percent-encoding", 1981 | ] 1982 | 1983 | [[package]] 1984 | name = "utf16_iter" 1985 | version = "1.0.5" 1986 | source = "registry+https://github.com/rust-lang/crates.io-index" 1987 | checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" 1988 | 1989 | [[package]] 1990 | name = "utf8_iter" 1991 | version = "1.0.4" 1992 | source = "registry+https://github.com/rust-lang/crates.io-index" 1993 | checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 1994 | 1995 | [[package]] 1996 | name = "utf8parse" 1997 | version = "0.2.2" 1998 | source = "registry+https://github.com/rust-lang/crates.io-index" 1999 | checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" 2000 | 2001 | [[package]] 2002 | name = "vcpkg" 2003 | version = "0.2.15" 2004 | source = "registry+https://github.com/rust-lang/crates.io-index" 2005 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 2006 | 2007 | [[package]] 2008 | name = "want" 2009 | version = "0.3.1" 2010 | source = "registry+https://github.com/rust-lang/crates.io-index" 2011 | checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" 2012 | dependencies = [ 2013 | "try-lock", 2014 | ] 2015 | 2016 | [[package]] 2017 | name = "wasi" 2018 | version = "0.11.0+wasi-snapshot-preview1" 2019 | source = "registry+https://github.com/rust-lang/crates.io-index" 2020 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 2021 | 2022 | [[package]] 2023 | name = "wasi" 2024 | version = "0.14.2+wasi-0.2.4" 2025 | source = "registry+https://github.com/rust-lang/crates.io-index" 2026 | checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" 2027 | dependencies = [ 2028 | "wit-bindgen-rt", 2029 | ] 2030 | 2031 | [[package]] 2032 | name = "wasm-bindgen" 2033 | version = "0.2.100" 2034 | source = "registry+https://github.com/rust-lang/crates.io-index" 2035 | checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" 2036 | dependencies = [ 2037 | "cfg-if", 2038 | "once_cell", 2039 | "rustversion", 2040 | "wasm-bindgen-macro", 2041 | ] 2042 | 2043 | [[package]] 2044 | name = "wasm-bindgen-backend" 2045 | version = "0.2.100" 2046 | source = "registry+https://github.com/rust-lang/crates.io-index" 2047 | checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" 2048 | dependencies = [ 2049 | "bumpalo", 2050 | "log", 2051 | "proc-macro2", 2052 | "quote", 2053 | "syn", 2054 | "wasm-bindgen-shared", 2055 | ] 2056 | 2057 | [[package]] 2058 | name = "wasm-bindgen-futures" 2059 | version = "0.4.50" 2060 | source = "registry+https://github.com/rust-lang/crates.io-index" 2061 | checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" 2062 | dependencies = [ 2063 | "cfg-if", 2064 | "js-sys", 2065 | "once_cell", 2066 | "wasm-bindgen", 2067 | "web-sys", 2068 | ] 2069 | 2070 | [[package]] 2071 | name = "wasm-bindgen-macro" 2072 | version = "0.2.100" 2073 | source = "registry+https://github.com/rust-lang/crates.io-index" 2074 | checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" 2075 | dependencies = [ 2076 | "quote", 2077 | "wasm-bindgen-macro-support", 2078 | ] 2079 | 2080 | [[package]] 2081 | name = "wasm-bindgen-macro-support" 2082 | version = "0.2.100" 2083 | source = "registry+https://github.com/rust-lang/crates.io-index" 2084 | checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" 2085 | dependencies = [ 2086 | "proc-macro2", 2087 | "quote", 2088 | "syn", 2089 | "wasm-bindgen-backend", 2090 | "wasm-bindgen-shared", 2091 | ] 2092 | 2093 | [[package]] 2094 | name = "wasm-bindgen-shared" 2095 | version = "0.2.100" 2096 | source = "registry+https://github.com/rust-lang/crates.io-index" 2097 | checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 2098 | dependencies = [ 2099 | "unicode-ident", 2100 | ] 2101 | 2102 | [[package]] 2103 | name = "wasm-streams" 2104 | version = "0.4.2" 2105 | source = "registry+https://github.com/rust-lang/crates.io-index" 2106 | checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" 2107 | dependencies = [ 2108 | "futures-util", 2109 | "js-sys", 2110 | "wasm-bindgen", 2111 | "wasm-bindgen-futures", 2112 | "web-sys", 2113 | ] 2114 | 2115 | [[package]] 2116 | name = "web-sys" 2117 | version = "0.3.77" 2118 | source = "registry+https://github.com/rust-lang/crates.io-index" 2119 | checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" 2120 | dependencies = [ 2121 | "js-sys", 2122 | "wasm-bindgen", 2123 | ] 2124 | 2125 | [[package]] 2126 | name = "web-time" 2127 | version = "1.1.0" 2128 | source = "registry+https://github.com/rust-lang/crates.io-index" 2129 | checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" 2130 | dependencies = [ 2131 | "js-sys", 2132 | "wasm-bindgen", 2133 | ] 2134 | 2135 | [[package]] 2136 | name = "windows-link" 2137 | version = "0.1.1" 2138 | source = "registry+https://github.com/rust-lang/crates.io-index" 2139 | checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" 2140 | 2141 | [[package]] 2142 | name = "windows-registry" 2143 | version = "0.4.0" 2144 | source = "registry+https://github.com/rust-lang/crates.io-index" 2145 | checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" 2146 | dependencies = [ 2147 | "windows-result", 2148 | "windows-strings", 2149 | "windows-targets 0.53.0", 2150 | ] 2151 | 2152 | [[package]] 2153 | name = "windows-result" 2154 | version = "0.3.2" 2155 | source = "registry+https://github.com/rust-lang/crates.io-index" 2156 | checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" 2157 | dependencies = [ 2158 | "windows-link", 2159 | ] 2160 | 2161 | [[package]] 2162 | name = "windows-strings" 2163 | version = "0.3.1" 2164 | source = "registry+https://github.com/rust-lang/crates.io-index" 2165 | checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" 2166 | dependencies = [ 2167 | "windows-link", 2168 | ] 2169 | 2170 | [[package]] 2171 | name = "windows-sys" 2172 | version = "0.52.0" 2173 | source = "registry+https://github.com/rust-lang/crates.io-index" 2174 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 2175 | dependencies = [ 2176 | "windows-targets 0.52.6", 2177 | ] 2178 | 2179 | [[package]] 2180 | name = "windows-sys" 2181 | version = "0.59.0" 2182 | source = "registry+https://github.com/rust-lang/crates.io-index" 2183 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 2184 | dependencies = [ 2185 | "windows-targets 0.52.6", 2186 | ] 2187 | 2188 | [[package]] 2189 | name = "windows-targets" 2190 | version = "0.52.6" 2191 | source = "registry+https://github.com/rust-lang/crates.io-index" 2192 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 2193 | dependencies = [ 2194 | "windows_aarch64_gnullvm 0.52.6", 2195 | "windows_aarch64_msvc 0.52.6", 2196 | "windows_i686_gnu 0.52.6", 2197 | "windows_i686_gnullvm 0.52.6", 2198 | "windows_i686_msvc 0.52.6", 2199 | "windows_x86_64_gnu 0.52.6", 2200 | "windows_x86_64_gnullvm 0.52.6", 2201 | "windows_x86_64_msvc 0.52.6", 2202 | ] 2203 | 2204 | [[package]] 2205 | name = "windows-targets" 2206 | version = "0.53.0" 2207 | source = "registry+https://github.com/rust-lang/crates.io-index" 2208 | checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" 2209 | dependencies = [ 2210 | "windows_aarch64_gnullvm 0.53.0", 2211 | "windows_aarch64_msvc 0.53.0", 2212 | "windows_i686_gnu 0.53.0", 2213 | "windows_i686_gnullvm 0.53.0", 2214 | "windows_i686_msvc 0.53.0", 2215 | "windows_x86_64_gnu 0.53.0", 2216 | "windows_x86_64_gnullvm 0.53.0", 2217 | "windows_x86_64_msvc 0.53.0", 2218 | ] 2219 | 2220 | [[package]] 2221 | name = "windows_aarch64_gnullvm" 2222 | version = "0.52.6" 2223 | source = "registry+https://github.com/rust-lang/crates.io-index" 2224 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 2225 | 2226 | [[package]] 2227 | name = "windows_aarch64_gnullvm" 2228 | version = "0.53.0" 2229 | source = "registry+https://github.com/rust-lang/crates.io-index" 2230 | checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" 2231 | 2232 | [[package]] 2233 | name = "windows_aarch64_msvc" 2234 | version = "0.52.6" 2235 | source = "registry+https://github.com/rust-lang/crates.io-index" 2236 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 2237 | 2238 | [[package]] 2239 | name = "windows_aarch64_msvc" 2240 | version = "0.53.0" 2241 | source = "registry+https://github.com/rust-lang/crates.io-index" 2242 | checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" 2243 | 2244 | [[package]] 2245 | name = "windows_i686_gnu" 2246 | version = "0.52.6" 2247 | source = "registry+https://github.com/rust-lang/crates.io-index" 2248 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 2249 | 2250 | [[package]] 2251 | name = "windows_i686_gnu" 2252 | version = "0.53.0" 2253 | source = "registry+https://github.com/rust-lang/crates.io-index" 2254 | checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" 2255 | 2256 | [[package]] 2257 | name = "windows_i686_gnullvm" 2258 | version = "0.52.6" 2259 | source = "registry+https://github.com/rust-lang/crates.io-index" 2260 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 2261 | 2262 | [[package]] 2263 | name = "windows_i686_gnullvm" 2264 | version = "0.53.0" 2265 | source = "registry+https://github.com/rust-lang/crates.io-index" 2266 | checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" 2267 | 2268 | [[package]] 2269 | name = "windows_i686_msvc" 2270 | version = "0.52.6" 2271 | source = "registry+https://github.com/rust-lang/crates.io-index" 2272 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 2273 | 2274 | [[package]] 2275 | name = "windows_i686_msvc" 2276 | version = "0.53.0" 2277 | source = "registry+https://github.com/rust-lang/crates.io-index" 2278 | checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" 2279 | 2280 | [[package]] 2281 | name = "windows_x86_64_gnu" 2282 | version = "0.52.6" 2283 | source = "registry+https://github.com/rust-lang/crates.io-index" 2284 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 2285 | 2286 | [[package]] 2287 | name = "windows_x86_64_gnu" 2288 | version = "0.53.0" 2289 | source = "registry+https://github.com/rust-lang/crates.io-index" 2290 | checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" 2291 | 2292 | [[package]] 2293 | name = "windows_x86_64_gnullvm" 2294 | version = "0.52.6" 2295 | source = "registry+https://github.com/rust-lang/crates.io-index" 2296 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 2297 | 2298 | [[package]] 2299 | name = "windows_x86_64_gnullvm" 2300 | version = "0.53.0" 2301 | source = "registry+https://github.com/rust-lang/crates.io-index" 2302 | checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" 2303 | 2304 | [[package]] 2305 | name = "windows_x86_64_msvc" 2306 | version = "0.52.6" 2307 | source = "registry+https://github.com/rust-lang/crates.io-index" 2308 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 2309 | 2310 | [[package]] 2311 | name = "windows_x86_64_msvc" 2312 | version = "0.53.0" 2313 | source = "registry+https://github.com/rust-lang/crates.io-index" 2314 | checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" 2315 | 2316 | [[package]] 2317 | name = "wit-bindgen-rt" 2318 | version = "0.39.0" 2319 | source = "registry+https://github.com/rust-lang/crates.io-index" 2320 | checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" 2321 | dependencies = [ 2322 | "bitflags", 2323 | ] 2324 | 2325 | [[package]] 2326 | name = "write16" 2327 | version = "1.0.0" 2328 | source = "registry+https://github.com/rust-lang/crates.io-index" 2329 | checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" 2330 | 2331 | [[package]] 2332 | name = "writeable" 2333 | version = "0.5.5" 2334 | source = "registry+https://github.com/rust-lang/crates.io-index" 2335 | checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" 2336 | 2337 | [[package]] 2338 | name = "yoke" 2339 | version = "0.7.5" 2340 | source = "registry+https://github.com/rust-lang/crates.io-index" 2341 | checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" 2342 | dependencies = [ 2343 | "serde", 2344 | "stable_deref_trait", 2345 | "yoke-derive", 2346 | "zerofrom", 2347 | ] 2348 | 2349 | [[package]] 2350 | name = "yoke-derive" 2351 | version = "0.7.5" 2352 | source = "registry+https://github.com/rust-lang/crates.io-index" 2353 | checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" 2354 | dependencies = [ 2355 | "proc-macro2", 2356 | "quote", 2357 | "syn", 2358 | "synstructure", 2359 | ] 2360 | 2361 | [[package]] 2362 | name = "zerocopy" 2363 | version = "0.8.25" 2364 | source = "registry+https://github.com/rust-lang/crates.io-index" 2365 | checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" 2366 | dependencies = [ 2367 | "zerocopy-derive", 2368 | ] 2369 | 2370 | [[package]] 2371 | name = "zerocopy-derive" 2372 | version = "0.8.25" 2373 | source = "registry+https://github.com/rust-lang/crates.io-index" 2374 | checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" 2375 | dependencies = [ 2376 | "proc-macro2", 2377 | "quote", 2378 | "syn", 2379 | ] 2380 | 2381 | [[package]] 2382 | name = "zerofrom" 2383 | version = "0.1.6" 2384 | source = "registry+https://github.com/rust-lang/crates.io-index" 2385 | checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" 2386 | dependencies = [ 2387 | "zerofrom-derive", 2388 | ] 2389 | 2390 | [[package]] 2391 | name = "zerofrom-derive" 2392 | version = "0.1.6" 2393 | source = "registry+https://github.com/rust-lang/crates.io-index" 2394 | checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" 2395 | dependencies = [ 2396 | "proc-macro2", 2397 | "quote", 2398 | "syn", 2399 | "synstructure", 2400 | ] 2401 | 2402 | [[package]] 2403 | name = "zeroize" 2404 | version = "1.8.1" 2405 | source = "registry+https://github.com/rust-lang/crates.io-index" 2406 | checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" 2407 | 2408 | [[package]] 2409 | name = "zerovec" 2410 | version = "0.10.4" 2411 | source = "registry+https://github.com/rust-lang/crates.io-index" 2412 | checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" 2413 | dependencies = [ 2414 | "yoke", 2415 | "zerofrom", 2416 | "zerovec-derive", 2417 | ] 2418 | 2419 | [[package]] 2420 | name = "zerovec-derive" 2421 | version = "0.10.3" 2422 | source = "registry+https://github.com/rust-lang/crates.io-index" 2423 | checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" 2424 | dependencies = [ 2425 | "proc-macro2", 2426 | "quote", 2427 | "syn", 2428 | ] 2429 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "git-commit-helper" 3 | version = "0.1.5" 4 | authors = ["coding@dfine.tech"] 5 | edition = "2024" 6 | repository = "https://github.com/newdee/git-commit-helper.git" 7 | description = "Git Commit Helper is a practical tool that leverages large language models (LLMs) to analyze changes in a Git repository. It helps users generate meaningful commit messages, addressing the difficulties users may encounter when writing commit messages. At the same time, it provides a user-friendly command-line interaction experience." 8 | license = "MIT" 9 | keywords = ["git", "commit","ai", "llm"] 10 | categories = ["command-line-utilities" ] 11 | publish = ["crates-io"] 12 | 13 | 14 | 15 | [dependencies] 16 | async-openai = "0.28.1" 17 | clap = { version = "4.5.37", features = ["derive"] } 18 | git2 = "0.20.2" 19 | ollama-rs = "0.3.1" 20 | tokio = { version = "1.45.0", features = ["full"] } 21 | 22 | [lib] 23 | name = "git_commit_helper" 24 | path = "src/lib.rs" 25 | 26 | [[bin]] 27 | name = "git-commit-helper" 28 | path = "src/main.rs" 29 | 30 | [profile.release] 31 | opt-level=3 32 | lto = "fat" 33 | codegen-units = 1 34 | panic= "abort" 35 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | Copyright © 2025 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 5 | 6 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 7 | 8 | THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 9 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Git Commit Helper [![GitHub stars](https://img.shields.io/github/stars/newdee/git-commit-helper.svg?style=social)](https://github.com/newdee/git-commit-helper) 2 | 3 | ## Overview 4 | Git Commit Helper is a practical tool that leverages large language models (LLMs) to analyze changes in a Git repository. It helps users generate meaningful commit messages, addressing the difficulties users may encounter when writing commit messages. At the same time, it provides a user - friendly command - line interaction experience. 5 | 6 | ## Preview 7 | You can use the `git-commit-helper` command directly to generate meaningful commit messages. Additionally, you can also use it within `lazygit` to quickly submit commits. Here is a preview video of using `git-commit-helper` in `lazygit`. 8 | 9 | [![asciicast](https://asciinema.org/a/718306.svg)](https://asciinema.org/a/718306) 10 | 11 | ## Install 12 | You can either download the corresponding package released in the `release` section or use the following command to install: 13 | 14 | ``` 15 | cargo install git-commit-helper 16 | ``` 17 | 18 | ## Usage 19 | 20 | This tool supports **either OpenAI or Ollama** as the language model provider. 21 | **Configure only one provider at a time.** 22 | 23 | ### Environment Variables 24 | 25 | - **For OpenAI**: 26 | - `OPENAI_API_KEY` (**Required**) 27 | - `OPENAI_BASE_URL` (*Optional*, defaults to OpenAI's official endpoint) 28 | 29 | - **For Ollama**: 30 | - `OLLAMA_BASE_URL` (*Optional*, defaults to `http://localhost:11434`) 31 | 32 | ### Example Command 33 | 34 | Use this tool after running `git add`: 35 | 36 | ``` 37 | Usage: git-commit-helper [OPTIONS] 38 | 39 | Options: 40 | -p, --provider [default: openai] 41 | -m, --model [default: gpt-4o] 42 | --gpgsign 43 | --gpgsignkey [default: ] 44 | --max-token [default: 2048] 45 | -h, --help Print help 46 | -V, --version Print version 47 | ``` 48 | 49 | ## License 50 | This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details. 51 | 52 | ## 🙏 Support 53 | If you find this project helpful, please consider giving it a ⭐️! 54 | -------------------------------------------------------------------------------- /src/git.rs: -------------------------------------------------------------------------------- 1 | // ************************************************************************** // 2 | // // 3 | // ::: :::::::: // 4 | // git.rs :+: :+: :+: // 5 | // +:+ +:+ +:+ // 6 | // By: dfine +#+ +:+ +#+ // 7 | // +#+#+#+#+#+ +#+ // 8 | // Created: 2025/05/10 19:12:46 by dfine #+# #+# // 9 | // Updated: 2025/06/02 02:00:48 by dfine ### ########.fr // 10 | // // 11 | // ************************************************************************** // 12 | 13 | use git2::{DiffOptions, Repository}; 14 | use std::{ 15 | error::Error, 16 | io::Write, 17 | process::{Command, Stdio}, 18 | }; 19 | 20 | /// Returns the staged diff of the current Git repository (i.e., changes staged for commit). 21 | /// 22 | /// This compares the staged index against the current `HEAD`. 23 | /// 24 | /// # Arguments 25 | /// 26 | /// * `repo` - A reference to an open `git2::Repository` instance. 27 | /// 28 | /// # Returns 29 | /// 30 | /// A `String` containing the unified diff. If the diff cannot be generated, it returns `"None"`. 31 | /// 32 | /// # Example 33 | /// 34 | /// ``` 35 | /// use git_commit_helper::get_staged_diff; 36 | /// use git2::Repository; 37 | /// 38 | /// let repo = Repository::discover(".").expect("Not a git repository"); 39 | /// let diff = get_staged_diff(&repo); 40 | /// println!("{:?}", diff); 41 | /// ``` 42 | pub fn get_staged_diff(repo: &Repository) -> Option { 43 | let index = repo.index().ok()?; 44 | let tree = repo.head().ok().and_then(|head| head.peel_to_tree().ok()); 45 | let mut diff_opts = DiffOptions::new(); 46 | let diff = repo 47 | .diff_tree_to_index(tree.as_ref(), Some(&index), Some(&mut diff_opts)) 48 | .ok()?; 49 | let mut buf = Vec::new(); 50 | if let Err(e) = diff.print(git2::DiffFormat::Patch, |_d, _h, _l| { 51 | buf.extend_from_slice(_l.content()); 52 | true 53 | }) { 54 | eprintln!("failed to print diff: {}", e); 55 | return None; 56 | } 57 | let result = String::from_utf8_lossy(&buf).to_string(); 58 | if result.trim().is_empty() { 59 | return None; 60 | } 61 | Some(result) 62 | } 63 | 64 | /// Returns the messages of the most recent commits (up to 3). 65 | /// 66 | /// Useful for providing context to an LLM or for generating summaries. 67 | /// 68 | /// # Arguments 69 | /// 70 | /// * `repo` - A reference to an open `git2::Repository` instance. 71 | /// 72 | /// # Returns 73 | /// 74 | /// A newline-separated string of the latest commit messages. If no commits exist, returns `"None"`. 75 | /// 76 | /// # Example 77 | /// 78 | /// ``` 79 | /// use git_commit_helper::get_recent_commit_message; 80 | /// use git2::Repository; 81 | /// 82 | /// let repo = Repository::discover(".").expect("Not a git repository"); 83 | /// let messages = get_recent_commit_message(&repo); 84 | /// println!("{:?}", messages); 85 | /// ``` 86 | pub fn get_recent_commit_message(repo: &Repository) -> Option { 87 | let mut revwalk = repo.revwalk().ok()?; 88 | revwalk.push_head().ok()?; 89 | let commits: Vec = revwalk 90 | .take(3) 91 | .filter_map(|oid| oid.ok()) 92 | .filter_map(|oid| repo.find_commit(oid).ok()) 93 | .map(|commit| commit.message().unwrap_or("").trim().replace('"', "\\\"")) 94 | .collect(); 95 | if commits.is_empty() { 96 | return None; 97 | } 98 | Some(commits.join("\n\n")) 99 | } 100 | 101 | pub fn gpg_sign(data: &[u8], key: Option<&str>) -> Result> { 102 | let mut cmd = Command::new("gpg"); 103 | cmd.args(["--armor", "--detach-sign"]); 104 | 105 | if let Some(k) = key { 106 | cmd.args(["--local-user", k]); 107 | } 108 | 109 | let mut child = cmd.stdin(Stdio::piped()).stdout(Stdio::piped()).spawn()?; 110 | child.stdin.as_mut().unwrap().write_all(data)?; 111 | let output = child.wait_with_output()?; 112 | 113 | if !output.status.success() { 114 | return Err(format!( 115 | "GPG signing failed: {}", 116 | String::from_utf8_lossy(&output.stderr) 117 | ) 118 | .into()); 119 | } 120 | 121 | Ok(String::from_utf8(output.stdout)?) 122 | } 123 | 124 | /// Commits the currently staged changes with the provided commit message. 125 | /// 126 | /// This function handles both initial and regular commits, constructing the commit tree 127 | /// and linking to the correct parent if available. 128 | /// 129 | /// # Arguments 130 | /// 131 | /// * `repo` - A reference to an open `git2::Repository` instance. 132 | /// * `message` - The commit message to use. 133 | /// 134 | /// # Errors 135 | /// 136 | /// Returns a boxed `Error` if Git operations (e.g., getting the index, writing tree, or committing) fail. 137 | /// 138 | /// # Example 139 | /// 140 | /// ``` 141 | /// use git_commit_helper::commit_with_git; 142 | /// use git2::Repository; 143 | /// 144 | /// let repo = Repository::discover(".").expect("Not a git repository"); 145 | /// let message = "Add README and initial setup"; 146 | /// if let Err(err) = commit_with_git(&repo, message) { 147 | /// eprintln!("Commit failed: {}", err); 148 | /// } 149 | /// ``` 150 | pub fn commit_with_git( 151 | repo: &Repository, 152 | message: &str, 153 | gpgsign: bool, 154 | signkey: Option<&str>, 155 | ) -> Result<(), Box> { 156 | let sig = repo.signature()?; 157 | 158 | let tree_oid = { 159 | let mut index = repo.index()?; 160 | let oid = index.write_tree()?; 161 | repo.find_tree(oid)? 162 | }; 163 | 164 | let head = repo.head().ok(); 165 | let parent_commit = head 166 | .as_ref() 167 | .and_then(|h| h.target()) 168 | .and_then(|oid| repo.find_commit(oid).ok()); 169 | let parents = parent_commit.iter().collect::>(); 170 | 171 | let tree = repo.find_tree(tree_oid.id())?; 172 | let buf = repo.commit_create_buffer(&sig, &sig, message, &tree, &parents)?; 173 | 174 | if !gpgsign { 175 | let commit_oid = repo.commit(Some("HEAD"), &sig, &sig, message, &tree, &parents)?; 176 | println!("✅ Commit created: {}", commit_oid); 177 | return Ok(()); 178 | } 179 | let signature = gpg_sign(&buf, signkey); 180 | let commit_oid = 181 | repo.commit_signed(buf.as_str().unwrap(), signature.unwrap().as_str(), None)?; 182 | // let commit = repo.find_commit(commit_oid)?; 183 | // repo.branch(head.unwrap().shorthand().unwrap(), &commit, false)?; 184 | repo.reference( 185 | head.unwrap().name().unwrap(), 186 | commit_oid, 187 | true, 188 | "update ref", 189 | )?; 190 | 191 | println!("✅ Commit created: {}", commit_oid); 192 | Ok(()) 193 | } 194 | -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | // ************************************************************************** // 2 | // // 3 | // ::: :::::::: // 4 | // lib.rs :+: :+: :+: // 5 | // +:+ +:+ +:+ // 6 | // By: dfine +#+ +:+ +#+ // 7 | // +#+#+#+#+#+ +#+ // 8 | // Created: 2025/05/10 19:12:41 by dfine #+# #+# // 9 | // Updated: 2025/05/10 19:12:43 by dfine ### ########.fr // 10 | // // 11 | // ************************************************************************** // 12 | 13 | //! # git-commit-helper 14 | //! 15 | /// `git-commit-helper` is a library designed to simplify the process of generating high-quality 16 | /// Git commit messages using large language models like OpenAI's GPT. 17 | /// 18 | /// It provides tools to: 19 | /// - Extract staged diffs and recent commit messages from a Git repository 20 | /// - Generate commit messages via OpenAI chat completion APIs 21 | /// - Automatically create commits with the generated messages 22 | /// 23 | /// ## Example use cases 24 | /// - Enhance developer workflows with AI-generated commit messages 25 | /// - Integrate LLM commit generation into custom Git UIs or bots 26 | pub mod git; 27 | pub mod llm; 28 | 29 | /// Re-exports for convenient use in consumers of the library 30 | pub use git::{commit_with_git, get_recent_commit_message, get_staged_diff}; 31 | pub use llm::call_openai; 32 | -------------------------------------------------------------------------------- /src/llm.rs: -------------------------------------------------------------------------------- 1 | // ************************************************************************** // 2 | // // 3 | // ::: :::::::: // 4 | // llm.rs :+: :+: :+: // 5 | // +:+ +:+ +:+ // 6 | // By: dfine +#+ +:+ +#+ // 7 | // +#+#+#+#+#+ +#+ // 8 | // Created: 2025/05/10 19:12:36 by dfine #+# #+# // 9 | // Updated: 2025/05/10 19:12:37 by dfine ### ########.fr // 10 | // // 11 | // ************************************************************************** // 12 | 13 | use async_openai::{ 14 | Client as OpenAIClient, 15 | config::OpenAIConfig, 16 | types::{ChatCompletionRequestUserMessageArgs, CreateChatCompletionRequestArgs}, 17 | }; 18 | use ollama_rs::{IntoUrlSealed, Ollama, generation::completion::request::GenerationRequest}; 19 | use std::error::Error; 20 | 21 | /// Sends a prompt to the OpenAI chat API and returns the generated response as a string. 22 | /// 23 | /// This function uses the `async-openai` crate to interact with a chat completion endpoint 24 | /// (e.g., GPT-4, GPT-4o, GPT-3.5-turbo). The base URL can be overridden via the 25 | /// `OPENAI_BASE_URL` environment variable. 26 | /// 27 | /// # Arguments 28 | /// 29 | /// * `prompt` - The text prompt to send to the model. 30 | /// * `model` - The model ID to use (e.g., `"gpt-4o"`, `"gpt-3.5-turbo"`). 31 | /// * `max_token` - Maximum number of tokens allowed in the response. 32 | /// 33 | /// # Returns 34 | /// 35 | /// A `Result` containing the generated string response on success, or an error on failure. 36 | /// 37 | /// # Errors 38 | /// 39 | /// This function will return an error if the request fails, the environment variable 40 | /// is misconfigured, or if the response cannot be parsed correctly. 41 | /// 42 | /// # Example 43 | /// 44 | /// ```no_run 45 | /// use git_commit_helper::call_openai; 46 | /// 47 | /// #[tokio::main] 48 | /// async fn main() { 49 | /// let prompt = "Summarize the following diff..."; 50 | /// let model = "gpt-4o"; 51 | /// let max_token = 2048; 52 | /// 53 | /// match call_openai(prompt, model, max_token).await { 54 | /// Ok(response) => println!("LLM response: {}", response), 55 | /// Err(e) => eprintln!("Error calling OpenAI: {}", e), 56 | /// } 57 | /// } 58 | /// ``` 59 | pub async fn call_openai( 60 | prompt: &str, 61 | model: &str, 62 | max_token: u32, 63 | ) -> Result> { 64 | let base_url = std::env::var("OPENAI_BASE_URL") 65 | .unwrap_or_else(|_| "https://api.openai.com/v1".to_string()); 66 | let config = OpenAIConfig::default().with_api_base(base_url); 67 | let client = OpenAIClient::with_config(config); 68 | let request = CreateChatCompletionRequestArgs::default() 69 | .max_tokens(max_token) 70 | .model(model) 71 | .messages([ChatCompletionRequestUserMessageArgs::default() 72 | .content(prompt) 73 | .build()? 74 | .into()]) 75 | .build()?; 76 | let response = client.chat().create(request).await?; 77 | Ok(response 78 | .choices 79 | .first() 80 | .and_then(|c| c.message.content.clone()) 81 | .unwrap_or_default()) 82 | } 83 | 84 | /// Sends a prompt to the Ollama API and returns the generated response as a string. 85 | /// 86 | /// This function uses the `ollama_rs` crate to interact with Ollama's generation endpoint. 87 | /// The base URL can be overridden via the `OLLAMA_BASE_URL` environment variable. 88 | /// 89 | /// # Arguments 90 | /// 91 | /// * `prompt` - The text prompt to send to the model. 92 | /// * `model` - The model ID to use for the request. 93 | /// * `_max_token` - Currently unused parameter (to maintain function signature consistency). 94 | /// 95 | /// # Returns 96 | /// 97 | /// A `Result` containing the generated string response on success, or an error on failure. 98 | /// 99 | /// # Errors 100 | /// 101 | /// This function will return an error if the request fails, the environment variable 102 | /// is misconfigured, or if the response cannot be handled correctly. 103 | pub async fn call_ollama( 104 | prompt: &str, 105 | model: &str, 106 | _max_token: u32, 107 | ) -> Result> { 108 | let base_url = 109 | std::env::var("OLLAMA_BASE_URL").unwrap_or_else(|_| "http://localhost:11434".to_string()); 110 | let url = base_url.into_url()?; 111 | let client = Ollama::from_url(url); 112 | let request = client 113 | .generate(GenerationRequest::new(model.to_string(), prompt)) 114 | .await?; 115 | Ok(request.response) 116 | } 117 | 118 | pub async fn call_llm( 119 | provider: &str, 120 | prompt: &str, 121 | model: &str, 122 | max_token: u32, 123 | ) -> Result> { 124 | match provider { 125 | "ollama" => call_ollama(prompt, model, max_token).await, 126 | _ => call_openai(prompt, model, max_token).await, 127 | } 128 | } 129 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | // ************************************************************************** // 2 | // // 3 | // ::: :::::::: // 4 | // main.rs :+: :+: :+: // 5 | // +:+ +:+ +:+ // 6 | // By: dfine +#+ +:+ +#+ // 7 | // +#+#+#+#+#+ +#+ // 8 | // Created: 2025/05/06 19:11:51 by dfine #+# #+# // 9 | // Updated: 2025/05/11 00:38:41 by dfine ### ########.fr // 10 | // // 11 | // ************************************************************************** // 12 | 13 | use git_commit_helper::{ 14 | commit_with_git, get_recent_commit_message, get_staged_diff, llm::call_llm, 15 | }; 16 | use git2::Repository; 17 | use std::error::Error; 18 | 19 | use clap::{Parser, arg}; 20 | 21 | static PROMPT_TEMPLATE: &str = include_str!("prompt.txt"); 22 | 23 | enum UserChoice { 24 | Commit, 25 | Regenerate, 26 | Abort, 27 | } 28 | fn prompt_user_action() -> Result> { 29 | use std::io::{Write, stdin, stdout}; 30 | println!("\x1b[1;36m💬 Accept this commit message?\x1b[0m"); // bold cyan 31 | println!(" \x1b[1;32m[Enter]\x1b[0m to commit"); 32 | println!(" \x1b[1;33m[r] \x1b[0m to regenerate"); 33 | println!(" \x1b[1;31m[q] \x1b[0m to abort"); 34 | print!("\x1b[1m👉 Your choice: \x1b[0m "); 35 | stdout().flush()?; 36 | 37 | let mut input = String::new(); 38 | stdin().read_line(&mut input)?; 39 | let trimmed = input.trim().to_lowercase(); 40 | match trimmed.as_str() { 41 | "" => Ok(UserChoice::Commit), 42 | "r" => Ok(UserChoice::Regenerate), 43 | "q" => Ok(UserChoice::Abort), 44 | _ => { 45 | println!("⚠️ Invalid input."); 46 | prompt_user_action() 47 | } 48 | } 49 | } 50 | 51 | #[derive(Parser, Debug)] 52 | #[command(version, about, long_about=None)] 53 | struct Args { 54 | #[arg(short, long, default_value_t = String::from("openai"))] 55 | provider: String, 56 | 57 | #[arg(short, long, default_value_t = String::from("gpt-4o"))] 58 | model: String, 59 | 60 | #[arg(long, default_value_t = false)] 61 | gpgsign: bool, 62 | 63 | #[arg(long, default_value_t = String::new())] 64 | gpgsignkey: String, 65 | //#[arg(short, long, default_value_t = 3)] 66 | //count: u8, 67 | #[arg(long, default_value_t = 2048_u32)] 68 | max_token: u32, 69 | } 70 | 71 | fn print_commit_msg(commit_msg: &str) { 72 | // blue 73 | println!("\x1b[34m================ COMMIT MESSAGE ================\x1b[0m"); 74 | // green 75 | println!("\x1b[32m{}\x1b[0m", commit_msg); 76 | // blue 77 | println!("\x1b[34m================================================\x1b[0m"); 78 | } 79 | 80 | #[tokio::main] 81 | async fn main() { 82 | let args = Args::parse(); 83 | let repo = Repository::discover(".").expect("Not a git repository"); 84 | let diff = get_staged_diff(&repo).unwrap_or_else(|| { 85 | eprintln!("⚠️ No staged changes found – nothing to commit."); 86 | std::process::exit(0); 87 | }); 88 | let signkey = (!args.gpgsignkey.is_empty()).then_some(args.gpgsignkey.as_str()); 89 | let commits = get_recent_commit_message(&repo).unwrap_or("None".to_string()); 90 | let prompt = PROMPT_TEMPLATE 91 | .replace("{recent_commits}", &commits) 92 | .replace("{diff_context}", &diff); 93 | loop { 94 | match call_llm(&args.provider, &prompt, &args.model, args.max_token).await { 95 | Ok(commit_msg) => { 96 | print_commit_msg(&commit_msg); 97 | match prompt_user_action() { 98 | Ok(UserChoice::Abort) => { 99 | println!("❎ Commit aborted."); 100 | break; 101 | } 102 | Ok(UserChoice::Commit) => { 103 | if let Err(e) = commit_with_git(&repo, &commit_msg, args.gpgsign, signkey) { 104 | eprintln!("❌ Commit failed: {}", e); 105 | } 106 | break; 107 | } 108 | Ok(UserChoice::Regenerate) => { 109 | println!("🔁 Regenerating...\n"); 110 | continue; 111 | } 112 | Err(e) => { 113 | eprintln!("❌ Input error: {}", e); 114 | break; 115 | } 116 | } 117 | } 118 | Err(e) => eprintln!("generate failed: {}", e), 119 | } 120 | } 121 | } 122 | -------------------------------------------------------------------------------- /src/prompt.txt: -------------------------------------------------------------------------------- 1 | You are a Git commit assistant. Based on the provided `diff_context` and style reference `recent_commits`, generate a commit message with the following rules: 2 | 3 | 1. First line: Conventional Commit format — `type: concise description` 4 | - Valid types: feat, fix, docs, style, refactor, perf, test, chore, etc. 5 | - Description should be short, specific, and lowercase (except proper nouns). 6 | 7 | 2. Optional bullet points (only if they add useful context): 8 | - Second line must be blank if bullet points are used 9 | - Bullet points should start with a dash (`-`) 10 | - Be short and focused — what changed, not why 11 | - No fluff, no unnecessary explanation 12 | 13 | **Strict Output Rules:** 14 | - DO NOT include any explanation, commentary, or reasoning 15 | - DO NOT output anything like ``, ``, or markdown formatting 16 | - DO NOT wrap the result in quotes or code blocks 17 | - Output ONLY the commit message 18 | 19 | **Examples (do NOT reuse or repeat):** 20 | feat: add user auth system 21 | fix: resolve memory leak in worker pool 22 | fix: typo in README.md 23 | 24 | --- 25 | 26 | Recent commits for style guidance: 27 | {recent_commits} 28 | 29 | --- 30 | 31 | Diff context to base your message on: 32 | {diff_context} 33 | --------------------------------------------------------------------------------