From 70c9890a0a199d245aac262c78d3c44fd5074dbf Mon Sep 17 00:00:00 2001 From: Jack Amadeo Date: Wed, 16 Jul 2025 16:17:06 -0400 Subject: [PATCH 1/7] cargo update --- Cargo.lock | 3133 ++++++++++++++++--------- crates/goose-bench/Cargo.toml | 2 +- crates/goose-cli/Cargo.toml | 2 +- crates/goose-cli/src/session/mod.rs | 6 +- crates/goose-mcp/Cargo.toml | 2 +- crates/goose-mcp/src/developer/mod.rs | 10 +- crates/goose-server/Cargo.toml | 2 +- crates/goose/Cargo.toml | 2 +- crates/mcp-client/Cargo.toml | 2 +- 9 files changed, 2035 insertions(+), 1126 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e84e17b8f8a6..576b1937bb75 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13,9 +13,9 @@ dependencies = [ [[package]] name = "adler2" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "aes" @@ -30,13 +30,13 @@ dependencies = [ [[package]] name = "ahash" -version = "0.8.11" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", "const-random", - "getrandom 0.2.15", + "getrandom 0.3.3", "once_cell", "serde", "version_check", @@ -52,12 +52,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "aligned-vec" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1" - [[package]] name = "alloc-no-stdlib" version = "2.0.4" @@ -100,6 +94,16 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" +[[package]] +name = "annotate-snippets" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccaf7e9dfbb6ab22c82e473cd1a8a7bd313c19a5b7e40970f3d89ef5a5c9e81e" +dependencies = [ + "unicode-width 0.1.14", + "yansi-term", +] + [[package]] name = "ansi_colours" version = "1.2.3" @@ -111,9 +115,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.18" +version = "0.6.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933" dependencies = [ "anstyle", "anstyle-parse", @@ -126,44 +130,44 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" +checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" [[package]] name = "anstyle-parse" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9" dependencies = [ "windows-sys 0.59.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.7" +version = "3.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" +checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882" dependencies = [ "anstyle", - "once_cell", + "once_cell_polyfill", "windows-sys 0.59.0", ] [[package]] name = "anyhow" -version = "1.0.97" +version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f" +checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" [[package]] name = "arbitrary" @@ -180,17 +184,6 @@ version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" -[[package]] -name = "arg_enum_proc_macro" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.99", -] - [[package]] name = "arraydeque" version = "0.5.1" @@ -354,7 +347,7 @@ dependencies = [ "arrow-schema", "chrono", "half", - "indexmap 2.7.1", + "indexmap 2.10.0", "lexical-core", "num", "serde", @@ -396,7 +389,7 @@ version = "52.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e972cd1ff4a4ccd22f86d3e53e835c2ed92e0eea6a3e8eadb72b4f1ac802cf8" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", ] [[package]] @@ -457,7 +450,7 @@ dependencies = [ "rustc-hash 2.1.1", "serde", "serde_derive", - "syn 2.0.99", + "syn 2.0.104", ] [[package]] @@ -482,6 +475,30 @@ dependencies = [ "serde_json", ] +[[package]] +name = "async-broadcast" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" +dependencies = [ + "event-listener 5.4.0", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-channel" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + [[package]] name = "async-compat" version = "0.2.4" @@ -497,9 +514,9 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.20" +version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "310c9bcae737a48ef5cdee3174184e6d548b292739ede61a1f955ef76a738861" +checksum = "ddb939d66e4ae03cee6091612804ba446b12878410cfa17f785f4dd67d4014e8" dependencies = [ "brotli", "flate2", @@ -511,26 +528,59 @@ dependencies = [ "zstd-safe", ] +[[package]] +name = "async-executor" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb812ffb58524bdd10860d7d974e2f01cc0950c2438a74ee5ec2e2280c6c4ffa" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand 2.3.0", + "futures-lite 2.6.0", + "pin-project-lite", + "slab", +] + [[package]] name = "async-io" version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" dependencies = [ - "async-lock", + "async-lock 2.8.0", "autocfg", "cfg-if", "concurrent-queue", - "futures-lite", + "futures-lite 1.13.0", "log", "parking", - "polling", + "polling 2.8.0", "rustix 0.37.28", "slab", "socket2 0.4.10", "waker-fn", ] +[[package]] +name = "async-io" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1237c0ae75a0f3765f58910ff9cdd0a12eeb39ab2f4c7de23262f337f0aacbb3" +dependencies = [ + "async-lock 3.4.0", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite 2.6.0", + "parking", + "polling 3.8.0", + "rustix 1.0.8", + "slab", + "tracing", + "windows-sys 0.59.0", +] + [[package]] name = "async-lock" version = "2.8.0" @@ -540,6 +590,17 @@ dependencies = [ "event-listener 2.5.3", ] +[[package]] +name = "async-lock" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +dependencies = [ + "event-listener 5.4.0", + "event-listener-strategy", + "pin-project-lite", +] + [[package]] name = "async-priority-channel" version = "0.2.0" @@ -549,6 +610,25 @@ dependencies = [ "event-listener 4.0.3", ] +[[package]] +name = "async-process" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cde3f4e40e6021d7acffc90095cbd6dc54cb593903d1de5832f435eb274b85dc" +dependencies = [ + "async-channel", + "async-io 2.4.1", + "async-lock 3.4.0", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener 5.4.0", + "futures-lite 2.6.0", + "rustix 1.0.8", + "tracing", +] + [[package]] name = "async-recursion" version = "1.1.1" @@ -557,7 +637,25 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.104", +] + +[[package]] +name = "async-signal" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7605a4e50d4b06df3898d5a70bf5fde51ed9059b0434b73105193bc27acce0d" +dependencies = [ + "async-io 2.4.1", + "async-lock 3.4.0", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix 1.0.8", + "signal-hook-registry", + "slab", + "windows-sys 0.59.0", ] [[package]] @@ -579,25 +677,34 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.104", ] +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + [[package]] name = "async-trait" -version = "0.1.87" +version = "0.1.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d556ec1359574147ec0c4fc5eb525f3f23263a592b1a9c07e0a75b427de55c97" +checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.104", ] [[package]] name = "async_cell" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "834eee9ce518130a3b4d5af09ecc43e9d6b57ee76613f227a1ddd6b77c7a62bc" +checksum = "447ab28afbb345f5408b120702a44e5529ebf90b1796ec76e9528df8e288e6c2" +dependencies = [ + "loom", +] [[package]] name = "atoi" @@ -627,38 +734,15 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" - -[[package]] -name = "av1-grain" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6678909d8c5d46a42abcf571271e15fdbc0a225e3646cf23762cd415046c78bf" -dependencies = [ - "anyhow", - "arrayvec", - "log", - "nom", - "num-rational", - "v_frame", -] - -[[package]] -name = "avif-serialize" -version = "0.8.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98922d6a4cfbcb08820c69d8eeccc05bb1f29bfa06b4f5b1dbfe9a868bd7608e" -dependencies = [ - "arrayvec", -] +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "aws-config" -version = "1.5.18" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90aff65e86db5fe300752551c1b015ef72b708ac54bded8ef43d0d53cb7cb0b1" +checksum = "ebd9b83179adf8998576317ce47785948bcff399ec5b15f4dfbdedd44ddf5b92" dependencies = [ "aws-credential-types", "aws-runtime", @@ -666,7 +750,7 @@ dependencies = [ "aws-sdk-ssooidc", "aws-sdk-sts", "aws-smithy-async", - "aws-smithy-http 0.61.1", + "aws-smithy-http", "aws-smithy-json", "aws-smithy-runtime", "aws-smithy-runtime-api", @@ -675,7 +759,7 @@ dependencies = [ "bytes", "fastrand 2.3.0", "hex", - "http 0.2.12", + "http 1.3.1", "ring", "time", "tokio", @@ -686,9 +770,9 @@ dependencies = [ [[package]] name = "aws-credential-types" -version = "1.2.1" +version = "1.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60e8f6b615cb5fc60a98132268508ad104310f0cfb25a1c22eee76efdf9154da" +checksum = "b68c2194a190e1efc999612792e25b1ab3abfefe4306494efaaabc25933c0cbe" dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", @@ -696,17 +780,40 @@ dependencies = [ "zeroize", ] +[[package]] +name = "aws-lc-rs" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08b5d4e069cbc868041a64bd68dc8cb39a0d79585cd6c5a24caa8c2d622121be" +dependencies = [ + "aws-lc-sys", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbfd150b5dbdb988bcc8fb1fe787eb6b7ee6180ca24da683b61ea5405f3d43ff" +dependencies = [ + "bindgen", + "cc", + "cmake", + "dunce", + "fs_extra", +] + [[package]] name = "aws-runtime" -version = "1.5.5" +version = "1.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76dd04d39cc12844c0994f2c9c5a6f5184c22e9188ec1ff723de41910a21dcad" +checksum = "b2090e664216c78e766b6bac10fe74d2f451c02441d43484cd76ac9a295075f7" dependencies = [ "aws-credential-types", "aws-sigv4", "aws-smithy-async", "aws-smithy-eventstream", - "aws-smithy-http 0.60.12", + "aws-smithy-http", "aws-smithy-runtime", "aws-smithy-runtime-api", "aws-smithy-types", @@ -715,7 +822,6 @@ dependencies = [ "fastrand 2.3.0", "http 0.2.12", "http-body 0.4.6", - "once_cell", "percent-encoding", "pin-project-lite", "tracing", @@ -724,15 +830,16 @@ dependencies = [ [[package]] name = "aws-sdk-bedrockruntime" -version = "1.76.0" +version = "1.97.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b538f72f5ab8d23de44aacd109788c37e268fe9f4d060168714a12514d73b434" +checksum = "a2cabf0de26d45a7529721f8900657d005b9989b1b26121b0200450126b2a685" dependencies = [ "aws-credential-types", "aws-runtime", + "aws-sigv4", "aws-smithy-async", "aws-smithy-eventstream", - "aws-smithy-http 0.61.1", + "aws-smithy-http", "aws-smithy-json", "aws-smithy-runtime", "aws-smithy-runtime-api", @@ -741,21 +848,21 @@ dependencies = [ "bytes", "fastrand 2.3.0", "http 0.2.12", - "once_cell", + "hyper 0.14.32", "regex-lite", "tracing", ] [[package]] name = "aws-sdk-dynamodb" -version = "1.67.0" +version = "1.84.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "250a727b598ad84f28a41165e6d7a1fcbfb13b5da88723f42d04e9122948f4a5" +checksum = "741f09fde8129e2f71492b36612215a81dcafdaec1d288a4df8f7418473bd268" dependencies = [ "aws-credential-types", "aws-runtime", "aws-smithy-async", - "aws-smithy-http 0.61.1", + "aws-smithy-http", "aws-smithy-json", "aws-smithy-runtime", "aws-smithy-runtime-api", @@ -764,88 +871,87 @@ dependencies = [ "bytes", "fastrand 2.3.0", "http 0.2.12", - "once_cell", "regex-lite", "tracing", ] [[package]] name = "aws-sdk-sagemakerruntime" -version = "1.63.0" +version = "1.78.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3188bb9f962a9e1781c917dbe7f016ab9430e4bd81ba7daf422e58d86a3595" +checksum = "a96d0c058d2ff4c94277efac1c35e5ecbcd7cc957d7e9d0b4b2f2e127ef7fa9f" dependencies = [ "aws-credential-types", "aws-runtime", "aws-smithy-async", "aws-smithy-eventstream", - "aws-smithy-http 0.61.1", + "aws-smithy-http", "aws-smithy-json", "aws-smithy-runtime", "aws-smithy-runtime-api", "aws-smithy-types", "aws-types", "bytes", + "fastrand 2.3.0", "http 0.2.12", - "once_cell", "regex-lite", "tracing", ] [[package]] name = "aws-sdk-sso" -version = "1.61.0" +version = "1.76.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e65ff295979977039a25f5a0bf067a64bc5e6aa38f3cef4037cf42516265553c" +checksum = "64bf26698dd6d238ef1486bdda46f22a589dc813368ba868dc3d94c8d27b56ba" dependencies = [ "aws-credential-types", "aws-runtime", "aws-smithy-async", - "aws-smithy-http 0.61.1", + "aws-smithy-http", "aws-smithy-json", "aws-smithy-runtime", "aws-smithy-runtime-api", "aws-smithy-types", "aws-types", "bytes", + "fastrand 2.3.0", "http 0.2.12", - "once_cell", "regex-lite", "tracing", ] [[package]] name = "aws-sdk-ssooidc" -version = "1.62.0" +version = "1.77.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91430a60f754f235688387b75ee798ef00cfd09709a582be2b7525ebb5306d4f" +checksum = "09cd07ed1edd939fae854a22054299ae3576500f4e0fadc560ca44f9c6ea1664" dependencies = [ "aws-credential-types", "aws-runtime", "aws-smithy-async", - "aws-smithy-http 0.61.1", + "aws-smithy-http", "aws-smithy-json", "aws-smithy-runtime", "aws-smithy-runtime-api", "aws-smithy-types", "aws-types", "bytes", + "fastrand 2.3.0", "http 0.2.12", - "once_cell", "regex-lite", "tracing", ] [[package]] name = "aws-sdk-sts" -version = "1.62.0" +version = "1.78.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9276e139d39fff5a0b0c984fc2d30f970f9a202da67234f948fda02e5bea1dbe" +checksum = "37f7766d2344f56d10d12f3c32993da36d78217f32594fe4fb8e57a538c1cdea" dependencies = [ "aws-credential-types", "aws-runtime", "aws-smithy-async", - "aws-smithy-http 0.61.1", + "aws-smithy-http", "aws-smithy-json", "aws-smithy-query", "aws-smithy-runtime", @@ -853,21 +959,21 @@ dependencies = [ "aws-smithy-types", "aws-smithy-xml", "aws-types", + "fastrand 2.3.0", "http 0.2.12", - "once_cell", "regex-lite", "tracing", ] [[package]] name = "aws-sigv4" -version = "1.2.9" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bfe75fad52793ce6dec0dc3d4b1f388f038b5eb866c8d4d7f3a8e21b5ea5051" +checksum = "ddfb9021f581b71870a17eac25b52335b82211cdc092e02b6876b2bcefa61666" dependencies = [ "aws-credential-types", "aws-smithy-eventstream", - "aws-smithy-http 0.60.12", + "aws-smithy-http", "aws-smithy-runtime-api", "aws-smithy-types", "bytes", @@ -875,8 +981,7 @@ dependencies = [ "hex", "hmac", "http 0.2.12", - "http 1.2.0", - "once_cell", + "http 1.3.1", "percent-encoding", "sha2", "time", @@ -885,9 +990,9 @@ dependencies = [ [[package]] name = "aws-smithy-async" -version = "1.2.4" +version = "1.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa59d1327d8b5053c54bf2eaae63bf629ba9e904434d0835a28ed3c0ed0a614e" +checksum = "1e190749ea56f8c42bf15dd76c65e14f8f765233e6df9b0506d9d934ebef867c" dependencies = [ "futures-util", "pin-project-lite", @@ -896,9 +1001,9 @@ dependencies = [ [[package]] name = "aws-smithy-eventstream" -version = "0.60.7" +version = "0.60.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "461e5e02f9864cba17cff30f007c2e37ade94d01e87cdb5204e44a84e6d38c17" +checksum = "338a3642c399c0a5d157648426110e199ca7fd1c689cc395676b81aa563700c4" dependencies = [ "aws-smithy-types", "bytes", @@ -907,18 +1012,19 @@ dependencies = [ [[package]] name = "aws-smithy-http" -version = "0.60.12" +version = "0.62.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7809c27ad8da6a6a68c454e651d4962479e81472aa19ae99e59f9aba1f9713cc" +checksum = "99335bec6cdc50a346fda1437f9fefe33abf8c99060739a546a16457f2862ca9" dependencies = [ + "aws-smithy-eventstream", "aws-smithy-runtime-api", "aws-smithy-types", "bytes", "bytes-utils", "futures-core", "http 0.2.12", + "http 1.3.1", "http-body 0.4.6", - "once_cell", "percent-encoding", "pin-project-lite", "pin-utils", @@ -926,35 +1032,52 @@ dependencies = [ ] [[package]] -name = "aws-smithy-http" -version = "0.61.1" +name = "aws-smithy-http-client" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6f276f21c7921fe902826618d1423ae5bf74cf8c1b8472aee8434f3dfd31824" +checksum = "f108f1ca850f3feef3009bdcc977be201bca9a91058864d9de0684e64514bee0" dependencies = [ - "aws-smithy-eventstream", + "aws-smithy-async", "aws-smithy-runtime-api", "aws-smithy-types", - "bytes", - "bytes-utils", - "futures-core", + "h2 0.3.27", + "h2 0.4.11", "http 0.2.12", + "http 1.3.1", "http-body 0.4.6", - "once_cell", - "percent-encoding", + "hyper 0.14.32", + "hyper 1.6.0", + "hyper-rustls 0.24.2", + "hyper-rustls 0.27.7", + "hyper-util", "pin-project-lite", - "pin-utils", + "rustls 0.21.12", + "rustls 0.23.29", + "rustls-native-certs 0.8.1", + "rustls-pki-types", + "tokio", + "tower 0.5.2", "tracing", ] [[package]] name = "aws-smithy-json" -version = "0.61.2" +version = "0.61.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "623a51127f24c30776c8b374295f2df78d92517386f77ba30773f15a30ce1422" +checksum = "a16e040799d29c17412943bdbf488fd75db04112d0c0d4b9290bacf5ae0014b9" dependencies = [ "aws-smithy-types", ] +[[package]] +name = "aws-smithy-observability" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9364d5989ac4dd918e5cc4c4bdcc61c9be17dcd2586ea7f69e348fc7c6cab393" +dependencies = [ + "aws-smithy-runtime-api", +] + [[package]] name = "aws-smithy-query" version = "0.60.7" @@ -967,42 +1090,39 @@ dependencies = [ [[package]] name = "aws-smithy-runtime" -version = "1.7.8" +version = "1.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d526a12d9ed61fadefda24abe2e682892ba288c2018bcb38b1b4c111d13f6d92" +checksum = "c3aaec682eb189e43c8a19c3dab2fe54590ad5f2cc2d26ab27608a20f2acf81c" dependencies = [ "aws-smithy-async", - "aws-smithy-http 0.60.12", + "aws-smithy-http", + "aws-smithy-http-client", + "aws-smithy-observability", "aws-smithy-runtime-api", "aws-smithy-types", "bytes", "fastrand 2.3.0", - "h2 0.3.26", "http 0.2.12", + "http 1.3.1", "http-body 0.4.6", "http-body 1.0.1", - "httparse", - "hyper 0.14.32", - "hyper-rustls 0.24.2", - "once_cell", "pin-project-lite", "pin-utils", - "rustls 0.21.12", "tokio", "tracing", ] [[package]] name = "aws-smithy-runtime-api" -version = "1.7.3" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92165296a47a812b267b4f41032ff8069ab7ff783696d217f0994a0d7ab585cd" +checksum = "9852b9226cb60b78ce9369022c0df678af1cac231c882d5da97a0c4e03be6e67" dependencies = [ "aws-smithy-async", "aws-smithy-types", "bytes", "http 0.2.12", - "http 1.2.0", + "http 1.3.1", "pin-project-lite", "tokio", "tracing", @@ -1011,16 +1131,16 @@ dependencies = [ [[package]] name = "aws-smithy-types" -version = "1.2.13" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7b8a53819e42f10d0821f56da995e1470b199686a1809168db6ca485665f042" +checksum = "d498595448e43de7f4296b7b7a18a8a02c61ec9349128c80a368f7c3b4ab11a8" dependencies = [ "base64-simd", "bytes", "bytes-utils", "futures-core", "http 0.2.12", - "http 1.2.0", + "http 1.3.1", "http-body 0.4.6", "http-body 1.0.1", "http-body-util", @@ -1037,18 +1157,18 @@ dependencies = [ [[package]] name = "aws-smithy-xml" -version = "0.60.9" +version = "0.60.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab0b0166827aa700d3dc519f72f8b3a91c35d0b8d042dc5d643a91e6f80648fc" +checksum = "3db87b96cb1b16c024980f133968d52882ca0daaee3a086c6decc500f6c99728" dependencies = [ "xmlparser", ] [[package]] name = "aws-types" -version = "1.3.5" +version = "1.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbd0a668309ec1f66c0f6bda4840dd6d4796ae26d699ebc266d7cc95c6d040f" +checksum = "8a322fec39e4df22777ed3ad8ea868ac2f94cd15e1a55f6ee8d8d6305057689a" dependencies = [ "aws-credential-types", "aws-smithy-async", @@ -1060,9 +1180,9 @@ dependencies = [ [[package]] name = "axum" -version = "0.8.1" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d6fd624c75e18b3b4c6b9caf42b1afe24437daaee904069137d8bab077be8b8" +checksum = "021e862c184ae977658b36c4500f7feac3221ca5da43e3f25bd04ab6c79a29b5" dependencies = [ "axum-core", "axum-macros", @@ -1070,7 +1190,7 @@ dependencies = [ "bytes", "form_urlencoded", "futures-util", - "http 1.2.0", + "http 1.3.1", "http-body 1.0.1", "http-body-util", "hyper 1.6.0", @@ -1098,13 +1218,13 @@ dependencies = [ [[package]] name = "axum-core" -version = "0.5.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df1362f362fd16024ae199c1970ce98f9661bf5ef94b9808fee734bc3698b733" +checksum = "68464cd0412f486726fb3373129ef5d2993f90c34bc2bc1c1e9943b2f4fc7ca6" dependencies = [ "bytes", - "futures-util", - "http 1.2.0", + "futures-core", + "http 1.3.1", "http-body 1.0.1", "http-body-util", "mime", @@ -1118,19 +1238,20 @@ dependencies = [ [[package]] name = "axum-extra" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "460fc6f625a1f7705c6cf62d0d070794e94668988b1c38111baeec177c715f7b" +checksum = "45bf463831f5131b7d3c756525b305d40f1185b688565648a92e1392ca35713d" dependencies = [ "axum", "axum-core", "bytes", "futures-util", - "http 1.2.0", + "http 1.3.1", "http-body 1.0.1", "http-body-util", "mime", "pin-project-lite", + "rustversion", "serde", "tower 0.5.2", "tower-layer", @@ -1145,14 +1266,14 @@ checksum = "604fde5e028fea851ce1d8570bbdc034bec850d157f7569d10f347d06808c05c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.104", ] [[package]] name = "backtrace" -version = "0.3.74" +version = "0.3.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" dependencies = [ "addr2line", "cfg-if", @@ -1210,7 +1331,7 @@ dependencies = [ "bincode", "bugreport", "bytesize", - "clap 4.5.31", + "clap 4.5.41", "clircle", "console", "content_inspector", @@ -1252,10 +1373,11 @@ version = "0.69.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" dependencies = [ - "bitflags 2.9.0", + "annotate-snippets", + "bitflags 2.9.1", "cexpr", "clang-sys", - "itertools 0.12.1", + "itertools 0.10.5", "lazy_static", "lazycell", "log", @@ -1265,7 +1387,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.99", + "syn 2.0.104", "which 4.4.2", ] @@ -1313,9 +1435,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.9.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" dependencies = [ "serde", ] @@ -1329,12 +1451,6 @@ dependencies = [ "crunchy", ] -[[package]] -name = "bitstream-io" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6099cdc01846bc367c4e7dd630dc5966dccf36b652fae7a74e17b640411a91b2" - [[package]] name = "bitvec" version = "1.0.1" @@ -1349,9 +1465,9 @@ dependencies = [ [[package]] name = "blake3" -version = "1.6.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "675f87afced0413c9bb02843499dbbd3882a237645883f71a2b59644a6d2f753" +checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" dependencies = [ "arrayref", "arrayvec", @@ -1378,6 +1494,28 @@ dependencies = [ "generic-array", ] +[[package]] +name = "block2" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "340d2f0bdb2a43c1d3cd40513185b2bd7def0aa1052f956455114bc98f82dcf2" +dependencies = [ + "objc2", +] + +[[package]] +name = "blocking" +version = "1.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" +dependencies = [ + "async-channel", + "async-task", + "futures-io", + "futures-lite 2.6.0", + "piper", +] + [[package]] name = "borrow-or-share" version = "0.2.2" @@ -1386,9 +1524,9 @@ checksum = "3eeab4423108c5d7c744f4d234de88d18d636100093ae04caf4825134b9c3a32" [[package]] name = "brotli" -version = "7.0.0" +version = "8.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc97b8f16f944bba54f0433f07e30be199b6dc2bd25937444bbad560bcea29bd" +checksum = "9991eea70ea4f293524138648e41ee89b0b2b12ddef3b255effa43c8056e0e0d" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -1397,9 +1535,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "4.0.2" +version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74fa05ad7d803d413eb8380983b092cbbaf9a85f151b871360e7b00cd7060b37" +checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -1407,9 +1545,9 @@ dependencies = [ [[package]] name = "bstr" -version = "1.11.3" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "531a9155a481e2ee699d4f98f43c0ca4ff8ee1bfd55c31e9e98fb29d2b176fe0" +checksum = "234113d19d0d7d613b40e86fb654acf958910802bcceab913a4f9e7cda03b1a4" dependencies = [ "memchr", "regex-automata 0.4.9", @@ -1427,29 +1565,37 @@ dependencies = [ "sysinfo 0.33.1", ] -[[package]] -name = "built" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ed6191a7e78c36abdb16ab65341eefd73d64d303fffccdbb00d51e4205967b" - [[package]] name = "bumpalo" -version = "3.17.0" +version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "bytecount" -version = "0.6.8" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ce" +checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e" [[package]] name = "bytemuck" version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94bbb0ad554ad961ddc5da507a12a29b14e4ae5bda06b19f575a3e6079d2e2ae" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ecc273b49b3205b83d648f0690daa588925572cc5063745bfe547fe7ec8e1a1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] [[package]] name = "byteorder" @@ -1481,15 +1627,15 @@ dependencies = [ [[package]] name = "bytesize" -version = "1.3.2" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d2c12f985c78475a6b8d629afd0c360260ef34cfef52efccdcfd31972f81c2e" +checksum = "2e93abca9e28e0a1b9877922aacb20576e05d4679ffa78c3d6dc22a26a216659" [[package]] name = "camino" -version = "1.1.9" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" +checksum = "0da45bc31171d8d6960122e222a67740df867c1dd53b4d51caa297084c185cab" dependencies = [ "serde", ] @@ -1566,9 +1712,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.16" +version = "1.2.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be714c154be609ec7f5dad223a33bf1482fff90472de28f7362806e6d4832b8c" +checksum = "5c1599538de2394445747c8cf7935946e3cc27e9625f889d979bfb2aaf569362" dependencies = [ "jobserver", "libc", @@ -1619,9 +1765,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" [[package]] name = "cfg_aliases" @@ -1631,9 +1777,9 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chrono" -version = "0.4.39" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ "android-tzdata", "iana-time-zone", @@ -1731,9 +1877,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.31" +version = "4.5.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "027bb0d98429ae334a8698531da7077bdf906419543a35a55c2cb1b66437d767" +checksum = "be92d32e80243a54711e5d7ce823c35c41c9d929dc4ab58e1276f625841aadf9" dependencies = [ "clap_builder", "clap_derive", @@ -1741,27 +1887,27 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.31" +version = "4.5.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5589e0cba072e0f3d23791efac0fd8627b49c829c196a492e88168e6a669d863" +checksum = "707eab41e9622f9139419d573eca0900137718000c517d47da73045f54331c3d" dependencies = [ "anstream", "anstyle", - "clap_lex 0.7.4", + "clap_lex 0.7.5", "strsim 0.11.1", "terminal_size", ] [[package]] name = "clap_derive" -version = "4.5.28" +version = "4.5.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf4ced95c6f4a675af3da73304b9ac4ed991640c36374e4b46795c49e17cf1ed" +checksum = "ef4f52386a59ca4c860f7393bcf8abd8dfd91ecccc0f774635ff68e92eeef491" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.104", ] [[package]] @@ -1775,15 +1921,15 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" +checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" [[package]] name = "cliclack" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a80570d35684e725e9d2d4aaaf32bc0cbfcfb8539898f9afea3da0d2e5189e4" +checksum = "57c420bdc04c123a2df04d9c5a07289195f00007af6e45ab18f55e56dc7e04b8" dependencies = [ "console", "indicatif", @@ -1814,6 +1960,15 @@ dependencies = [ "winapi", ] +[[package]] +name = "cmake" +version = "0.1.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0" +dependencies = [ + "cc", +] + [[package]] name = "color_quant" version = "1.1.0" @@ -1822,9 +1977,9 @@ checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" [[package]] name = "colorchoice" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" [[package]] name = "combine" @@ -1843,7 +1998,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a65ebfec4fb190b6f90e944a817d60499ee0744e582530e2c9900a22e591d9a" dependencies = [ "unicode-segmentation", - "unicode-width 0.2.0", + "unicode-width 0.2.1", ] [[package]] @@ -1870,7 +2025,7 @@ dependencies = [ "rust-ini", "serde", "serde_json", - "toml 0.8.20", + "toml 0.8.23", "yaml-rust2", ] @@ -1883,7 +2038,7 @@ dependencies = [ "encode_unicode", "libc", "once_cell", - "unicode-width 0.2.0", + "unicode-width 0.2.1", "windows-sys 0.59.0", ] @@ -1902,7 +2057,7 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", "once_cell", "tiny-keccak", ] @@ -1943,8 +2098,17 @@ dependencies = [ ] [[package]] -name = "cookie_store" -version = "0.21.1" +name = "cookie-factory" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9885fa71e26b8ab7855e2ec7cae6e9b380edff76cd052e07c683a0319d51b3a2" +dependencies = [ + "futures", +] + +[[package]] +name = "cookie_store" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2eac901828f88a5241ee0600950ab981148a18f2f756900ffba1b125ca6a3ef9" dependencies = [ @@ -1972,9 +2136,9 @@ dependencies = [ [[package]] name = "core-foundation" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" dependencies = [ "core-foundation-sys", "libc", @@ -1986,30 +2150,6 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" -[[package]] -name = "core-graphics" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" -dependencies = [ - "bitflags 2.9.0", - "core-foundation 0.10.0", - "core-graphics-types", - "foreign-types 0.5.0", - "libc", -] - -[[package]] -name = "core-graphics-types" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" -dependencies = [ - "bitflags 2.9.0", - "core-foundation 0.10.0", - "libc", -] - [[package]] name = "cpufeatures" version = "0.2.17" @@ -2021,9 +2161,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.4.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" dependencies = [ "cfg-if", ] @@ -2037,7 +2177,7 @@ dependencies = [ "anes", "cast", "ciborium", - "clap 4.5.31", + "clap 4.5.41", "criterion-plot", "is-terminal", "itertools 0.10.5", @@ -2066,9 +2206,9 @@ dependencies = [ [[package]] name = "croner" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38fd53511eaf0b00a185613875fee58b208dfce016577d0ad4bb548e1c4fb3ee" +checksum = "c344b0690c1ad1c7176fe18eb173e0c927008fdaaa256e40dfd43ddd149c0843" dependencies = [ "chrono", ] @@ -2159,14 +2299,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" dependencies = [ "quote", - "syn 2.0.99", + "syn 2.0.104", ] [[package]] name = "darling" -version = "0.20.10" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" dependencies = [ "darling_core", "darling_macro", @@ -2174,27 +2314,27 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.10" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.99", + "syn 2.0.104", ] [[package]] name = "darling_macro" -version = "0.20.10" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core", "quote", - "syn 2.0.99", + "syn 2.0.104", ] [[package]] @@ -2226,9 +2366,9 @@ dependencies = [ [[package]] name = "data-encoding" -version = "2.8.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "575f75dfd25738df5b91b8e43e14d44bda14637a58fae779fd2b064f8bf3e010" +checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" [[package]] name = "datafusion" @@ -2263,7 +2403,7 @@ dependencies = [ "glob", "half", "hashbrown 0.14.5", - "indexmap 2.7.1", + "indexmap 2.10.0", "itertools 0.12.1", "log", "num_cpus", @@ -2439,7 +2579,7 @@ dependencies = [ "datafusion-expr", "datafusion-physical-expr", "hashbrown 0.14.5", - "indexmap 2.7.1", + "indexmap 2.10.0", "itertools 0.12.1", "log", "paste", @@ -2468,7 +2608,7 @@ dependencies = [ "half", "hashbrown 0.14.5", "hex", - "indexmap 2.7.1", + "indexmap 2.10.0", "itertools 0.12.1", "log", "paste", @@ -2526,7 +2666,7 @@ dependencies = [ "futures", "half", "hashbrown 0.14.5", - "indexmap 2.7.1", + "indexmap 2.10.0", "itertools 0.12.1", "log", "once_cell", @@ -2618,9 +2758,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.3.11" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" dependencies = [ "powerfmt", "serde", @@ -2634,7 +2774,7 @@ checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.104", ] [[package]] @@ -2687,7 +2827,19 @@ dependencies = [ "libc", "option-ext", "redox_users 0.5.0", - "windows-sys 0.59.0", + "windows-sys 0.60.2", +] + +[[package]] +name = "dispatch2" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" +dependencies = [ + "bitflags 2.9.1", + "block2", + "libc", + "objc2", ] [[package]] @@ -2698,7 +2850,16 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.104", +] + +[[package]] +name = "dlib" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" +dependencies = [ + "libloading", ] [[package]] @@ -2764,6 +2925,52 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" +[[package]] +name = "drm" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80bc8c5c6c2941f70a55c15f8d9f00f9710ebda3ffda98075f996a0e6c92756f" +dependencies = [ + "bitflags 2.9.1", + "bytemuck", + "drm-ffi", + "drm-fourcc", + "libc", + "rustix 0.38.44", +] + +[[package]] +name = "drm-ffi" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8e41459d99a9b529845f6d2c909eb9adf3b6d2f82635ae40be8de0601726e8b" +dependencies = [ + "drm-sys", + "rustix 0.38.44", +] + +[[package]] +name = "drm-fourcc" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0aafbcdb8afc29c1a7ee5fbe53b5d62f4565b35a042a662ca9fecd0b54dae6f4" + +[[package]] +name = "drm-sys" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bafb66c8dbc944d69e15cfcc661df7e703beffbaec8bd63151368b06c5f9858c" +dependencies = [ + "libc", + "linux-raw-sys 0.6.5", +] + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + [[package]] name = "dyn-clone" version = "1.0.19" @@ -2800,12 +3007,39 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "endi" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" + [[package]] name = "endian-type" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d" +[[package]] +name = "enumflags2" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + [[package]] name = "equivalent" version = "1.0.2" @@ -2814,12 +3048,12 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.10" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -2833,9 +3067,9 @@ dependencies = [ [[package]] name = "error-code" -version = "3.3.1" +version = "3.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5d9305ccc6942a704f4335694ecd3de2ea531b114ac2d51f5f843750787a92f" +checksum = "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59" [[package]] name = "etcetera" @@ -2865,6 +3099,27 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "event-listener" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener 5.4.0", + "pin-project-lite", +] + [[package]] name = "eventsource-client" version = "0.12.2" @@ -2941,12 +3196,12 @@ checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "fd-lock" -version = "4.0.2" +version = "4.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e5768da2206272c81ef0b5e951a41862938a6070da63bcea197899942d3b947" +checksum = "0ce92ff622d6dadf7349484f42c93271a0d49b7cc4d466a936405bacbe10aa78" dependencies = [ "cfg-if", - "rustix 0.38.44", + "rustix 1.0.8", "windows-sys 0.52.0", ] @@ -2989,9 +3244,9 @@ dependencies = [ [[package]] name = "flate2" -version = "1.1.0" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11faaf5a5236997af9848be0bef4db95824b1d534ebc64d0f0c6cf3e67bd38dc" +checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" dependencies = [ "crc32fast", "miniz_oxide", @@ -3026,28 +3281,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" dependencies = [ - "foreign-types-shared 0.1.1", -] - -[[package]] -name = "foreign-types" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" -dependencies = [ - "foreign-types-macros", - "foreign-types-shared 0.3.1", -] - -[[package]] -name = "foreign-types-macros" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.99", + "foreign-types-shared", ] [[package]] @@ -3056,12 +3290,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" -[[package]] -name = "foreign-types-shared" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" - [[package]] name = "form_urlencoded" version = "1.2.1" @@ -3083,9 +3311,9 @@ dependencies = [ [[package]] name = "fragile" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" +checksum = "28dd6caf6059519a65843af8fe2a3ae298b14b80179855aeb4adc2c1934ee619" [[package]] name = "fs-err" @@ -3116,6 +3344,12 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + [[package]] name = "fsst" version = "0.19.2" @@ -3194,6 +3428,19 @@ dependencies = [ "waker-fn", ] +[[package]] +name = "futures-lite" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" +dependencies = [ + "fastrand 2.3.0", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + [[package]] name = "futures-macro" version = "0.3.31" @@ -3202,7 +3449,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.104", ] [[package]] @@ -3235,6 +3482,44 @@ dependencies = [ "slab", ] +[[package]] +name = "gbm" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce852e998d3ca5e4a97014fb31c940dc5ef344ec7d364984525fd11e8a547e6a" +dependencies = [ + "bitflags 2.9.1", + "drm", + "drm-fourcc", + "gbm-sys", + "libc", + "wayland-backend", + "wayland-server", +] + +[[package]] +name = "gbm-sys" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c13a5f2acc785d8fb6bf6b7ab6bfb0ef5dad4f4d97e8e70bb8e470722312f76f" +dependencies = [ + "libc", +] + +[[package]] +name = "generator" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d18470a76cb7f8ff746cf1f7470914f900252ec36bbc40b569d74b1258446827" +dependencies = [ + "cc", + "cfg-if", + "libc", + "log", + "rustversion", + "windows 0.61.3", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -3247,34 +3532,36 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "js-sys", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi 0.11.1+wasi-snapshot-preview1", "wasm-bindgen", ] [[package]] name = "getrandom" -version = "0.3.1" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" dependencies = [ "cfg-if", + "js-sys", "libc", - "wasi 0.13.3+wasi-0.2.2", - "windows-targets 0.52.6", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", + "wasm-bindgen", ] [[package]] name = "gif" -version = "0.13.1" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2" +checksum = "4ae047235e33e2829703574b54fdec96bfbad892062d97fed2f76022287de61b" dependencies = [ "color_quant", "weezl", @@ -3303,7 +3590,7 @@ checksum = "53010ccb100b96a67bc32c0175f0ed1426b31b655d562898e57325f81c023ac0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.104", ] [[package]] @@ -3312,13 +3599,33 @@ version = "0.18.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "232e6a7bfe35766bf715e55a88b39a700596c0ccfd88cd3680b4cdb40d66ef70" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "libc", "libgit2-sys", "log", "url", ] +[[package]] +name = "gl" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a94edab108827d67608095e269cf862e60d920f144a5026d3dbcfd8b877fb404" +dependencies = [ + "gl_generator", +] + +[[package]] +name = "gl_generator" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" +dependencies = [ + "khronos_api", + "log", + "xml-rs", +] + [[package]] name = "glob" version = "0.3.2" @@ -3357,7 +3664,7 @@ checksum = "7530ee92a7e9247c3294ae1b84ea98474dbc27563c49a14d3938e816499bf38f" dependencies = [ "base64 0.22.1", "chrono", - "http 1.2.0", + "http 1.3.1", "http-body-util", "hyper 1.6.0", "hyper-util", @@ -3381,7 +3688,7 @@ dependencies = [ "chrono", "google-apis-common", "hyper 1.6.0", - "hyper-rustls 0.27.5", + "hyper-rustls 0.27.7", "hyper-util", "mime", "serde", @@ -3401,7 +3708,7 @@ dependencies = [ "chrono", "google-apis-common", "hyper 1.6.0", - "hyper-rustls 0.27.5", + "hyper-rustls 0.27.7", "hyper-util", "mime", "serde", @@ -3421,7 +3728,7 @@ dependencies = [ "chrono", "google-apis-common", "hyper 1.6.0", - "hyper-rustls 0.27.5", + "hyper-rustls 0.27.7", "hyper-util", "mime", "serde", @@ -3472,7 +3779,7 @@ dependencies = [ "once_cell", "rand 0.8.5", "regex", - "reqwest 0.12.12", + "reqwest 0.12.22", "serde", "serde_json", "serde_urlencoded", @@ -3515,7 +3822,7 @@ dependencies = [ "serde", "serde_json", "tokio", - "toml 0.8.20", + "toml 0.8.23", "tracing", "tracing-subscriber", "winapi", @@ -3532,7 +3839,7 @@ dependencies = [ "bat", "bytes", "chrono", - "clap 4.5.31", + "clap 4.5.41", "cliclack", "console", "dirs 5.0.1", @@ -3541,7 +3848,7 @@ dependencies = [ "goose", "goose-bench", "goose-mcp", - "http 1.2.0", + "http 1.3.1", "indicatif", "jsonschema", "mcp-client", @@ -3552,7 +3859,7 @@ dependencies = [ "once_cell", "rand 0.8.5", "regex", - "reqwest 0.12.12", + "reqwest 0.12.22", "rustyline", "serde", "serde_json", @@ -3564,12 +3871,12 @@ dependencies = [ "test-case", "tokio", "tokio-stream", - "tower-http", + "tower-http 0.5.2", "tracing", "tracing-appender", "tracing-subscriber", "urlencoding", - "webbrowser 1.0.4", + "webbrowser 1.0.5", "winapi", ] @@ -3605,7 +3912,7 @@ dependencies = [ "minijinja", "once_cell", "regex", - "reqwest 0.12.12", + "reqwest 0.12.22", "serde", "serde_json", "smallvec", @@ -3680,18 +3987,18 @@ dependencies = [ "base64 0.21.7", "bytes", "chrono", - "clap 4.5.31", + "clap 4.5.41", "config", "dirs 6.0.0", "etcetera", "futures", "goose", "goose-mcp", - "http 1.2.0", + "http 1.3.1", "mcp-core", "mcp-server", "once_cell", - "reqwest 0.12.12", + "reqwest 0.12.22", "serde", "serde_json", "serde_yaml", @@ -3700,7 +4007,7 @@ dependencies = [ "tokio-cron-scheduler", "tokio-stream", "tower 0.5.2", - "tower-http", + "tower-http 0.5.2", "tracing", "tracing-appender", "tracing-subscriber", @@ -3723,9 +4030,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.26" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" dependencies = [ "bytes", "fnv", @@ -3733,7 +4040,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.7.1", + "indexmap 2.10.0", "slab", "tokio", "tokio-util", @@ -3742,17 +4049,17 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.8" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5017294ff4bb30944501348f6f8e42e6ad28f42c8bbef7a74029aff064a4e3c2" +checksum = "17da50a276f1e01e0ba6c029e47b7100754904ee8a278f886546e98575380785" dependencies = [ "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "http 1.2.0", - "indexmap 2.7.1", + "http 1.3.1", + "indexmap 2.10.0", "slab", "tokio", "tokio-util", @@ -3788,9 +4095,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.2" +version = "0.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" dependencies = [ "allocator-api2", "equivalent", @@ -3835,9 +4142,9 @@ checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] name = "hermit-abi" -version = "0.4.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" [[package]] name = "hex" @@ -3897,9 +4204,9 @@ dependencies = [ [[package]] name = "http" -version = "1.2.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" dependencies = [ "bytes", "fnv", @@ -3924,18 +4231,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 1.2.0", + "http 1.3.1", ] [[package]] name = "http-body-util" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ "bytes", - "futures-util", - "http 1.2.0", + "futures-core", + "http 1.3.1", "http-body 1.0.1", "pin-project-lite", ] @@ -3974,14 +4281,14 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2 0.3.26", + "h2 0.3.27", "http 0.2.12", "http-body 0.4.6", "httparse", "httpdate", "itoa", "pin-project-lite", - "socket2 0.5.8", + "socket2 0.5.10", "tokio", "tower-service", "tracing", @@ -3997,8 +4304,8 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "h2 0.4.8", - "http 1.2.0", + "h2 0.4.11", + "http 1.3.1", "http-body 1.0.1", "httparse", "httpdate", @@ -4027,15 +4334,14 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.5" +version = "0.27.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" dependencies = [ - "futures-util", - "http 1.2.0", + "http 1.3.1", "hyper 1.6.0", "hyper-util", - "rustls 0.23.23", + "rustls 0.23.29", "rustls-native-certs 0.8.1", "rustls-pki-types", "tokio", @@ -4058,18 +4364,23 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.10" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +checksum = "7f66d5bd4c6f02bf0542fad85d626775bab9258cf795a4256dcaf3161114d1df" dependencies = [ + "base64 0.22.1", "bytes", "futures-channel", + "futures-core", "futures-util", - "http 1.2.0", + "http 1.3.1", "http-body 1.0.1", "hyper 1.6.0", + "ipnet", + "libc", + "percent-encoding", "pin-project-lite", - "socket2 0.5.8", + "socket2 0.5.10", "tokio", "tower-service", "tracing", @@ -4086,16 +4397,17 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.61" +version = "0.1.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", + "log", "wasm-bindgen", - "windows-core 0.52.0", + "windows-core 0.57.0", ] [[package]] @@ -4109,21 +4421,22 @@ dependencies = [ [[package]] name = "icu_collections" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" dependencies = [ "displaydoc", + "potential_utf", "yoke", "zerofrom", "zerovec", ] [[package]] -name = "icu_locid" -version = "1.5.0" +name = "icu_locale_core" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" dependencies = [ "displaydoc", "litemap", @@ -4132,31 +4445,11 @@ dependencies = [ "zerovec", ] -[[package]] -name = "icu_locid_transform" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_locid_transform_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" - [[package]] name = "icu_normalizer" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" dependencies = [ "displaydoc", "icu_collections", @@ -4164,70 +4457,57 @@ dependencies = [ "icu_properties", "icu_provider", "smallvec", - "utf16_iter", - "utf8_iter", - "write16", "zerovec", ] [[package]] name = "icu_normalizer_data" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" [[package]] name = "icu_properties" -version = "1.5.1" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" dependencies = [ "displaydoc", "icu_collections", - "icu_locid_transform", + "icu_locale_core", "icu_properties_data", "icu_provider", - "tinystr", + "potential_utf", + "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" -version = "1.5.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" [[package]] name = "icu_provider" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" dependencies = [ "displaydoc", - "icu_locid", - "icu_provider_macros", + "icu_locale_core", "stable_deref_trait", "tinystr", "writeable", "yoke", "zerofrom", + "zerotrie", "zerovec", ] [[package]] -name = "icu_provider_macros" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.99", -] - -[[package]] -name = "ident_case" -version = "1.0.1" +name = "ident_case" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" @@ -4244,9 +4524,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" dependencies = [ "icu_normalizer", "icu_properties", @@ -4288,42 +4568,21 @@ dependencies = [ [[package]] name = "image" -version = "0.25.5" +version = "0.25.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd6f44aed642f18953a158afeb30206f4d50da59fbc66ecb53c66488de73563b" +checksum = "db35664ce6b9810857a38a906215e75a9c879f0696556a39f59c62829710251a" dependencies = [ "bytemuck", "byteorder-lite", - "color_quant", - "exr", - "gif", - "image-webp", "num-traits", "png", - "qoi", - "ravif", - "rayon", - "rgb", - "tiff", - "zune-core", - "zune-jpeg", -] - -[[package]] -name = "image-webp" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b77d01e822461baa8409e156015a1d91735549f0f2c17691bd2d996bef238f7f" -dependencies = [ - "byteorder-lite", - "quick-error", ] [[package]] -name = "imgref" -version = "1.11.0" +name = "imagesize" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0263a3d970d5c054ed9312c0057b4f3bde9c0b33836d3637361d4a9e6e7a408" +checksum = "09e54e57b4c48b40f7aec75635392b12b3421fa26fe8b4332e63138ed278459c" [[package]] name = "include_dir" @@ -4357,12 +4616,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.7.1" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" +checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" dependencies = [ "equivalent", - "hashbrown 0.15.2", + "hashbrown 0.15.4", "serde", ] @@ -4375,7 +4634,7 @@ dependencies = [ "console", "number_prefix", "portable-atomic", - "unicode-width 0.2.0", + "unicode-width 0.2.1", "web-time", ] @@ -4413,17 +4672,6 @@ dependencies = [ "web-sys", ] -[[package]] -name = "interpolate_name" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.99", -] - [[package]] name = "io-lifetimes" version = "1.0.11" @@ -4435,21 +4683,42 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "io-uring" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b86e202f00093dcba4275d4636b93ef9dd75d025ae560d2521b45ea28ab49013" +dependencies = [ + "bitflags 2.9.1", + "cfg-if", + "libc", +] + [[package]] name = "ipnet" version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" +[[package]] +name = "iri-string" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +dependencies = [ + "memchr", + "serde", +] + [[package]] name = "is-terminal" -version = "0.4.15" +version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e19b23d53f35ce9f56aebc7d1bb4e6ac1e9c0db7ac85c8d1760c04379edced37" +checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" dependencies = [ - "hermit-abi 0.4.0", + "hermit-abi 0.5.2", "libc", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -4515,18 +4784,19 @@ checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" [[package]] name = "jobserver" -version = "0.1.32" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" dependencies = [ + "getrandom 0.3.3", "libc", ] [[package]] name = "jpeg-decoder" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" +checksum = "00810f1d8b74be64b13dbf3db89ac67740615d6c891f0e7b6179326533011a07" dependencies = [ "rayon", ] @@ -4573,7 +4843,7 @@ dependencies = [ "referencing", "regex", "regex-syntax 0.8.5", - "reqwest 0.12.12", + "reqwest 0.12.22", "serde", "serde_json", "uuid-simd", @@ -4609,6 +4879,22 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "khronos-egl" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "khronos_api" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" + [[package]] name = "kill_tree" version = "0.2.4" @@ -4693,7 +4979,7 @@ dependencies = [ "arrow-data", "arrow-schema", "arrow-select", - "getrandom 0.2.15", + "getrandom 0.2.16", "half", "num-traits", "rand 0.8.5", @@ -5145,9 +5431,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.172" +version = "0.2.174" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" +checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" [[package]] name = "libdbus-sys" @@ -5159,16 +5445,6 @@ dependencies = [ "pkg-config", ] -[[package]] -name = "libfuzzer-sys" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf78f52d400cf2d84a3a973a78a592b4adc535739e0a5597a0da6f0c357adc75" -dependencies = [ - "arbitrary", - "cc", -] - [[package]] name = "libgit2-sys" version = "0.16.2+1.7.2" @@ -5183,12 +5459,12 @@ dependencies = [ [[package]] name = "libloading" -version = "0.8.6" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" +checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" dependencies = [ "cfg-if", - "windows-targets 0.52.6", + "windows-targets 0.48.5", ] [[package]] @@ -5199,20 +5475,69 @@ checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] name = "libredox" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +checksum = "1580801010e535496706ba011c15f8532df6b42297d2e471fec38ceadd8c0638" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "libc", "redox_syscall", ] +[[package]] +name = "libspa" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65f3a4b81b2a2d8c7f300643676202debd1b7c929dbf5c9bb89402ea11d19810" +dependencies = [ + "bitflags 2.9.1", + "cc", + "convert_case", + "cookie-factory", + "libc", + "libspa-sys", + "nix 0.27.1", + "nom", + "system-deps", +] + +[[package]] +name = "libspa-sys" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf0d9716420364790e85cbb9d3ac2c950bde16a7dd36f3209b7dfdfc4a24d01f" +dependencies = [ + "bindgen", + "cc", + "system-deps", +] + +[[package]] +name = "libwayshot-xcap" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "558a3a7ca16a17a14adf8f051b3adcd7766d397532f5f6d6a48034db11e54c22" +dependencies = [ + "drm", + "gbm", + "gl", + "image 0.25.6", + "khronos-egl", + "memmap2", + "rustix 1.0.8", + "thiserror 2.0.12", + "tracing", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-protocols-wlr", +] + [[package]] name = "libz-sys" -version = "1.1.21" +version = "1.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df9b68e50e6e0b26f672573834882eb57759f6db9b3be2ea3c35c91188bb4eaa" +checksum = "8b70e7a7df205e92a1a4cd9aaae7898dac0aa555503cc0a649494d0d60e7651d" dependencies = [ "cc", "libc", @@ -5238,6 +5563,12 @@ version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" +[[package]] +name = "linux-raw-sys" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a385b1be4e5c3e362ad2ffa73c392e53f031eaa5b7d648e64cd87f27f6063d7" + [[package]] name = "linux-raw-sys" version = "0.9.4" @@ -5246,9 +5577,9 @@ checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" [[package]] name = "litemap" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" [[package]] name = "litrs" @@ -5258,33 +5589,31 @@ checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" [[package]] name = "lock_api" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" dependencies = [ "autocfg", "scopeguard", ] -[[package]] -name = "lockfree-object-pool" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9374ef4228402d4b7e403e5838cb880d9ee663314b0a900d5a6aabf0c213552e" - [[package]] name = "log" -version = "0.4.26" +version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" [[package]] -name = "loop9" -version = "0.1.5" +name = "loom" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" +checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca" dependencies = [ - "imgref", + "cfg-if", + "generator", + "scoped-tls", + "tracing", + "tracing-subscriber", ] [[package]] @@ -5298,7 +5627,7 @@ dependencies = [ "chrono", "encoding_rs", "flate2", - "indexmap 2.7.1", + "indexmap 2.10.0", "itoa", "log", "md-5", @@ -5317,23 +5646,29 @@ version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ - "hashbrown 0.15.2", + "hashbrown 0.15.4", ] +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + [[package]] name = "lz4_flex" -version = "0.11.3" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75761162ae2b0e580d7e7c390558127e5f01b4194debd6221fd8c207fc80e3f5" +checksum = "08ab2867e3eeeca90e844d1940eab391c9dc5228783db2ed999acbc0a9ed375a" dependencies = [ "twox-hash", ] [[package]] name = "mach2" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" +checksum = "d640282b302c0bb0a2a8e0233ead9035e3bed871f0b7e81fe4a1ec829765db44" dependencies = [ "libc", ] @@ -5362,16 +5697,6 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" -[[package]] -name = "maybe-rayon" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" -dependencies = [ - "cfg-if", - "rayon", -] - [[package]] name = "mcp-client" version = "0.1.0" @@ -5400,7 +5725,7 @@ dependencies = [ "tracing", "tracing-subscriber", "url", - "webbrowser 1.0.4", + "webbrowser 1.0.5", ] [[package]] @@ -5411,7 +5736,7 @@ dependencies = [ "async-trait", "base64 0.21.7", "chrono", - "schemars", + "schemars 0.8.22", "serde", "serde_json", "tempfile", @@ -5429,10 +5754,10 @@ dependencies = [ "mcp-core", "proc-macro2", "quote", - "schemars", + "schemars 0.8.22", "serde", "serde_json", - "syn 2.0.99", + "syn 2.0.104", "tokio", ] @@ -5446,7 +5771,7 @@ dependencies = [ "mcp-core", "mcp-macros", "pin-project", - "schemars", + "schemars 0.8.22", "serde", "serde_json", "thiserror 1.0.69", @@ -5480,15 +5805,15 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.4" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" [[package]] name = "memmap2" -version = "0.9.5" +version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" +checksum = "483758ad303d734cec05e5c12b41d7e93e6a6390c5e9dae6bdeb7c1259012d28" dependencies = [ "libc", ] @@ -5499,6 +5824,15 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38d1115007560874e373613744c6fba374c17688327a71c1476d1a5954cc857b" +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + [[package]] name = "mime" version = "0.3.17" @@ -5517,9 +5851,9 @@ dependencies = [ [[package]] name = "minijinja" -version = "2.10.2" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd72e8b4e42274540edabec853f607c015c73436159b06c39c7af85a20433155" +checksum = "4e60ac08614cc09062820e51d5d94c2fce16b94ea4e5003bb81b99a95f84e876" dependencies = [ "memo-map", "self_cell", @@ -5534,9 +5868,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.8.5" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", "simd-adler32", @@ -5544,13 +5878,13 @@ dependencies = [ [[package]] name = "mio" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" dependencies = [ "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.52.0", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.59.0", ] [[package]] @@ -5585,7 +5919,7 @@ dependencies = [ "cfg-if", "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.104", ] [[package]] @@ -5594,8 +5928,8 @@ version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa6e72583bf6830c956235bff0d5afec8cf2952f579ebad18ae7821a917d950f" dependencies = [ - "async-io", - "async-lock", + "async-io 1.13.0", + "async-lock 2.8.0", "crossbeam-channel", "crossbeam-epoch", "crossbeam-utils", @@ -5640,12 +5974,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" -[[package]] -name = "new_debug_unreachable" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" - [[package]] name = "nibble_vec" version = "0.1.0" @@ -5661,7 +5989,7 @@ version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "cfg-if", "libc", ] @@ -5672,7 +6000,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "cfg-if", "cfg_aliases", "libc", @@ -5684,10 +6012,11 @@ version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "cfg-if", "cfg_aliases", "libc", + "memoffset", ] [[package]] @@ -5711,12 +6040,6 @@ dependencies = [ "nom", ] -[[package]] -name = "noop_proc_macro" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" - [[package]] name = "ntapi" version = "0.4.1" @@ -5798,7 +6121,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.104", ] [[package]] @@ -5844,11 +6167,11 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" dependencies = [ - "hermit-abi 0.3.9", + "hermit-abi 0.5.2", "libc", ] @@ -5875,10 +6198,10 @@ checksum = "51e219e79014df21a225b1860a479e2dcd7cbd9130f4defd4bd0e191ea31d67d" dependencies = [ "base64 0.22.1", "chrono", - "getrandom 0.2.15", - "http 1.2.0", + "getrandom 0.2.16", + "http 1.3.1", "rand 0.8.5", - "reqwest 0.12.12", + "reqwest 0.12.22", "serde", "serde_json", "serde_path_to_error", @@ -5906,125 +6229,329 @@ dependencies = [ ] [[package]] -name = "objc2-encode" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" - -[[package]] -name = "objc2-foundation" +name = "objc2-app-kit" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "900831247d2fe1a09a683278e5384cfb8c80c79fe6b166f9d14bfdde0ea1b03c" +checksum = "e6f29f568bec459b0ddff777cec4fe3fd8666d82d5a40ebd0ff7e66134f89bcc" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", + "block2", + "libc", "objc2", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-core-image", + "objc2-foundation", + "objc2-quartz-core", ] [[package]] -name = "object" -version = "0.36.7" +name = "objc2-av-foundation" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +checksum = "2e085a2e16c61dadbad7a808fc9d5b5f8472b1b825b53d529c9f64ccac78e722" dependencies = [ - "memchr", + "bitflags 2.9.1", + "block2", + "dispatch2", + "objc2", + "objc2-avf-audio", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-core-image", + "objc2-core-video", + "objc2-foundation", + "objc2-quartz-core", ] [[package]] -name = "object_store" -version = "0.10.2" +name = "objc2-avf-audio" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6da452820c715ce78221e8202ccc599b4a52f3e1eb3eedb487b680c81a8e3f3" +checksum = "bfc1d11521c211a7ebe17739fc806719da41f56c6b3f949d9861b459188ce910" dependencies = [ - "async-trait", - "base64 0.22.1", - "bytes", - "chrono", - "futures", - "humantime", - "hyper 1.6.0", - "itertools 0.13.0", - "md-5", - "parking_lot", - "percent-encoding", - "quick-xml 0.36.2", - "rand 0.8.5", - "reqwest 0.12.12", - "ring", - "rustls-pemfile 2.2.0", - "serde", - "serde_json", - "snafu", - "tokio", - "tracing", - "url", - "walkdir", + "objc2", + "objc2-foundation", ] [[package]] -name = "once_cell" -version = "1.20.3" +name = "objc2-cloud-kit" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" +checksum = "17614fdcd9b411e6ff1117dfb1d0150f908ba83a7df81b1f118005fe0a8ea15d" +dependencies = [ + "bitflags 2.9.1", + "objc2", + "objc2-foundation", +] [[package]] -name = "oneshot" -version = "0.1.11" +name = "objc2-core-audio" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ce411919553d3f9fa53a0880544cda985a112117a0444d5ff1e870a893d6ea" +checksum = "ca44961e888e19313b808f23497073e3f6b3c22bb485056674c8b49f3b025c82" +dependencies = [ + "dispatch2", + "objc2", + "objc2-core-audio-types", + "objc2-core-foundation", +] [[package]] -name = "onig" -version = "6.5.1" +name = "objc2-core-audio-types" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "336b9c63443aceef14bea841b899035ae3abe89b7c486aaf4c5bd8aafedac3f0" +checksum = "c0f1cc99bb07ad2ddb6527ddf83db6a15271bb036b3eb94b801cd44fdc666ee1" dependencies = [ - "bitflags 2.9.0", - "libc", - "once_cell", - "onig_sys", + "bitflags 2.9.1", + "objc2", ] [[package]] -name = "onig_sys" -version = "69.9.1" +name = "objc2-core-data" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7f86c6eef3d6df15f23bcfb6af487cbd2fed4e5581d58d5bf1f5f8b7f6727dc" +checksum = "291fbbf7d29287518e8686417cf7239c74700fd4b607623140a7d4a3c834329d" dependencies = [ - "cc", - "pkg-config", + "bitflags 2.9.1", + "objc2", + "objc2-foundation", ] [[package]] -name = "oorandom" -version = "11.1.4" +name = "objc2-core-foundation" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b410bbe7e14ab526a0e86877eb47c6996a2bd7746f027ba551028c925390e4e9" +checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166" +dependencies = [ + "bitflags 2.9.1", + "block2", + "dispatch2", + "libc", + "objc2", +] [[package]] -name = "openssl" -version = "0.10.71" +name = "objc2-core-graphics" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e14130c6a98cd258fdcb0fb6d744152343ff729cbfcb28c656a9d12b999fbcd" +checksum = "989c6c68c13021b5c2d6b71456ebb0f9dc78d752e86a98da7c716f4f9470f5a4" dependencies = [ - "bitflags 2.9.0", - "cfg-if", - "foreign-types 0.3.2", + "bitflags 2.9.1", + "block2", + "dispatch2", "libc", - "once_cell", - "openssl-macros", - "openssl-sys", + "objc2", + "objc2-core-foundation", + "objc2-io-surface", + "objc2-metal", ] [[package]] -name = "openssl-macros" -version = "0.1.1" +name = "objc2-core-image" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +checksum = "79b3dc0cc4386b6ccf21c157591b34a7f44c8e75b064f85502901ab2188c007e" dependencies = [ - "proc-macro2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-media" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0b7afa6822e2fa20dfc88d10186b2432bf8560b5ed73ec9d31efd78277bc878" +dependencies = [ + "bitflags 2.9.1", + "block2", + "dispatch2", + "objc2", + "objc2-core-audio", + "objc2-core-audio-types", + "objc2-core-foundation", + "objc2-core-video", +] + +[[package]] +name = "objc2-core-video" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1989c3e76c7e978cab0ba9e6f4961cd00ed14ca21121444cc26877403bfb6303" +dependencies = [ + "bitflags 2.9.1", + "block2", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-io-surface", + "objc2-metal", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-foundation" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900831247d2fe1a09a683278e5384cfb8c80c79fe6b166f9d14bfdde0ea1b03c" +dependencies = [ + "bitflags 2.9.1", + "block2", + "libc", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-io-surface" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7282e9ac92529fa3457ce90ebb15f4ecbc383e8338060960760fa2cf75420c3c" +dependencies = [ + "bitflags 2.9.1", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-metal" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f246c183239540aab1782457b35ab2040d4259175bd1d0c58e46ada7b47a874" +dependencies = [ + "bitflags 2.9.1", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90ffb6a0cd5f182dc964334388560b12a57f7b74b3e2dec5e2722aa2dfb2ccd5" +dependencies = [ + "bitflags 2.9.1", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + +[[package]] +name = "object_store" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6da452820c715ce78221e8202ccc599b4a52f3e1eb3eedb487b680c81a8e3f3" +dependencies = [ + "async-trait", + "base64 0.22.1", + "bytes", + "chrono", + "futures", + "humantime", + "hyper 1.6.0", + "itertools 0.13.0", + "md-5", + "parking_lot", + "percent-encoding", + "quick-xml 0.36.2", + "rand 0.8.5", + "reqwest 0.12.22", + "ring", + "rustls-pemfile 2.2.0", + "serde", + "serde_json", + "snafu", + "tokio", + "tracing", + "url", + "walkdir", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" + +[[package]] +name = "oneshot" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ce411919553d3f9fa53a0880544cda985a112117a0444d5ff1e870a893d6ea" + +[[package]] +name = "onig" +version = "6.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "336b9c63443aceef14bea841b899035ae3abe89b7c486aaf4c5bd8aafedac3f0" +dependencies = [ + "bitflags 2.9.1", + "libc", + "once_cell", + "onig_sys", +] + +[[package]] +name = "onig_sys" +version = "69.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7f86c6eef3d6df15f23bcfb6af487cbd2fed4e5581d58d5bf1f5f8b7f6727dc" +dependencies = [ + "cc", + "pkg-config", +] + +[[package]] +name = "oorandom" +version = "11.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" + +[[package]] +name = "openssl" +version = "0.10.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" +dependencies = [ + "bitflags 2.9.1", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.104", ] [[package]] @@ -6035,18 +6562,18 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-src" -version = "300.4.2+3.4.1" +version = "300.5.1+3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168ce4e058f975fe43e89d9ccf78ca668601887ae736090aacc23ae353c298e2" +checksum = "735230c832b28c000e3bc117119e6466a663ec73506bc0a9907ea4187508e42a" dependencies = [ "cc", ] [[package]] name = "openssl-sys" -version = "0.9.106" +version = "0.9.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bb61ea9811cc39e3c2069f40b8b8e2e70d8569b361f879786cc7ed48b777cdd" +checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" dependencies = [ "cc", "libc", @@ -6071,6 +6598,16 @@ dependencies = [ "hashbrown 0.14.5", ] +[[package]] +name = "ordered-stream" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" +dependencies = [ + "futures-core", + "pin-project-lite", +] + [[package]] name = "os_str_bytes" version = "6.6.1" @@ -6106,9 +6643,9 @@ checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" dependencies = [ "lock_api", "parking_lot_core", @@ -6116,9 +6653,9 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.10" +version = "0.9.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" dependencies = [ "cfg-if", "libc", @@ -6184,9 +6721,9 @@ checksum = "df202b0b0f5b8e389955afd5f27b007b00fb948162953f1db9c70d2c7e3157d7" [[package]] name = "pest" -version = "2.7.15" +version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b7cafe60d6cf8e62e1b9b2ea516a089c008945bb5a275416789e7db0bc199dc" +checksum = "1db05f56d34358a8b1066f67cbb203ee3e7ed2ba674a6263a1d5ec6db2204323" dependencies = [ "memchr", "thiserror 2.0.12", @@ -6195,9 +6732,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.7.15" +version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "816518421cfc6887a0d62bf441b6ffb4536fcc926395a69e1a85852d4363f57e" +checksum = "bb056d9e8ea77922845ec74a1c4e8fb17e7c218cc4fc11a15c5d25e189aa40bc" dependencies = [ "pest", "pest_generator", @@ -6205,24 +6742,23 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.7.15" +version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d1396fd3a870fc7838768d171b4616d5c91f6cc25e377b673d714567d99377b" +checksum = "87e404e638f781eb3202dc82db6760c8ae8a1eeef7fb3fa8264b2ef280504966" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.104", ] [[package]] name = "pest_meta" -version = "2.7.15" +version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1e58089ea25d717bfd31fb534e4f3afcc2cc569c70de3e239778991ea3b7dea" +checksum = "edd1101f170f5903fde0914f899bb503d9ff5271d7ba76bbb70bea63690cc0d5" dependencies = [ - "once_cell", "pest", "sha2", ] @@ -6234,7 +6770,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.7.1", + "indexmap 2.10.0", ] [[package]] @@ -6292,7 +6828,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.104", ] [[package]] @@ -6307,6 +6843,45 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "piper" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" +dependencies = [ + "atomic-waker", + "fastrand 2.3.0", + "futures-io", +] + +[[package]] +name = "pipewire" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08e645ba5c45109106d56610b3ee60eb13a6f2beb8b74f8dc8186cf261788dda" +dependencies = [ + "anyhow", + "bitflags 2.9.1", + "libc", + "libspa", + "libspa-sys", + "nix 0.27.1", + "once_cell", + "pipewire-sys", + "thiserror 1.0.69", +] + +[[package]] +name = "pipewire-sys" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "849e188f90b1dda88fe2bfe1ad31fe5f158af2c98f80fb5d13726c44f3f01112" +dependencies = [ + "bindgen", + "libspa-sys", + "system-deps", +] + [[package]] name = "pkg-config" version = "0.3.32" @@ -6321,13 +6896,13 @@ checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" [[package]] name = "plist" -version = "1.7.0" +version = "1.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42cf17e9a1800f5f396bc67d193dc9411b59012a5876445ef450d449881e1016" +checksum = "3af6b589e163c5a788fab00ce0c0366f6efbb9959c2f9874b224936af7fce7e1" dependencies = [ "base64 0.22.1", - "indexmap 2.7.1", - "quick-xml 0.32.0", + "indexmap 2.10.0", + "quick-xml 0.38.0", "serde", "time", ] @@ -6389,11 +6964,35 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "polling" +version = "3.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b53a684391ad002dd6a596ceb6c74fd004fdce75f4be2e3f615068abbea5fd50" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi 0.5.2", + "pin-project-lite", + "rustix 1.0.8", + "tracing", + "windows-sys 0.59.0", +] + [[package]] name = "portable-atomic" -version = "1.11.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" +checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" + +[[package]] +name = "potential_utf" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +dependencies = [ + "zerovec", +] [[package]] name = "powerfmt" @@ -6403,9 +7002,9 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.20" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ "zerocopy", ] @@ -6438,12 +7037,21 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.30" +version = "0.2.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1ccf34da56fc294e7d4ccf69a85992b7dfb826b7cf57bac6a70bba3494cc08a" +checksum = "061c1221631e079b26479d25bbf2275bfe5917ae8419cd7e34f13bfc2aa7539a" dependencies = [ "proc-macro2", - "syn 2.0.99", + "syn 2.0.104", +] + +[[package]] +name = "proc-macro-crate" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" +dependencies = [ + "toml_edit", ] [[package]] @@ -6472,32 +7080,13 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.94" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" dependencies = [ "unicode-ident", ] -[[package]] -name = "profiling" -version = "1.0.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afbdc74edc00b6f6a218ca6a5364d6226a259d4b8ea1af4a0ea063f27e179f4d" -dependencies = [ - "profiling-procmacros", -] - -[[package]] -name = "profiling-procmacros" -version = "1.0.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a65f2e60fbf1063868558d69c6beacf412dc755f9fc020f514b7955fc914fe30" -dependencies = [ - "quote", - "syn 2.0.99", -] - [[package]] name = "prost" version = "0.12.6" @@ -6515,8 +7104,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22505a5c94da8e3b7c2996394d1c933236c4d743e81a410bcca4e6989fc066a4" dependencies = [ "bytes", - "heck 0.5.0", - "itertools 0.12.1", + "heck 0.4.1", + "itertools 0.10.5", "log", "multimap", "once_cell", @@ -6525,7 +7114,7 @@ dependencies = [ "prost", "prost-types", "regex", - "syn 2.0.99", + "syn 2.0.104", "tempfile", ] @@ -6536,10 +7125,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" dependencies = [ "anyhow", - "itertools 0.12.1", + "itertools 0.10.5", "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.104", ] [[package]] @@ -6573,7 +7162,7 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57206b407293d2bcd3af849ce869d52068623f19e1b5ff8e8778e3309439682b" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "memchr", "unicase", ] @@ -6598,17 +7187,11 @@ dependencies = [ "mach2", "once_cell", "raw-cpuid", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi 0.11.1+wasi-snapshot-preview1", "web-sys", "winapi", ] -[[package]] -name = "quick-error" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" - [[package]] name = "quick-xml" version = "0.30.0" @@ -6620,18 +7203,19 @@ dependencies = [ [[package]] name = "quick-xml" -version = "0.32.0" +version = "0.36.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d3a6e5838b60e0e8fa7a43f22ade549a37d61f8bdbe636d0d7816191de969c2" +checksum = "f7649a7b4df05aed9ea7ec6f628c67c9953a43869b8bc50929569b2999d443fe" dependencies = [ "memchr", + "serde", ] [[package]] name = "quick-xml" -version = "0.36.2" +version = "0.37.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7649a7b4df05aed9ea7ec6f628c67c9953a43869b8bc50929569b2999d443fe" +checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb" dependencies = [ "memchr", "serde", @@ -6639,44 +7223,46 @@ dependencies = [ [[package]] name = "quick-xml" -version = "0.37.2" +version = "0.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "165859e9e55f79d67b96c5d96f4e88b6f2695a1972849c15a6a3f5c59fc2c003" +checksum = "8927b0664f5c5a98265138b7e3f90aa19a6b21353182469ace36d4ac527b7b1b" dependencies = [ "memchr", - "serde", ] [[package]] name = "quinn" -version = "0.11.6" +version = "0.11.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef" +checksum = "626214629cda6781b6dc1d316ba307189c85ba657213ce642d9c77670f8202c8" dependencies = [ "bytes", + "cfg_aliases", "pin-project-lite", "quinn-proto", "quinn-udp", "rustc-hash 2.1.1", - "rustls 0.23.23", - "socket2 0.5.8", + "rustls 0.23.29", + "socket2 0.5.10", "thiserror 2.0.12", "tokio", "tracing", + "web-time", ] [[package]] name = "quinn-proto" -version = "0.11.9" +version = "0.11.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d" +checksum = "49df843a9161c85bb8aae55f101bc0bac8bcafd637a620d9122fd7e0b2f7422e" dependencies = [ "bytes", - "getrandom 0.2.15", - "rand 0.8.5", + "getrandom 0.3.3", + "lru-slab", + "rand 0.9.1", "ring", "rustc-hash 2.1.1", - "rustls 0.23.23", + "rustls 0.23.29", "rustls-pki-types", "slab", "thiserror 2.0.12", @@ -6687,27 +7273,33 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.10" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e46f3055866785f6b92bc6164b76be02ca8f2eb4b002c0354b28cf4c119e5944" +checksum = "fcebb1209ee276352ef14ff8732e24cc2b02bbac986cd74a4c81bcb2f9881970" dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.5.8", + "socket2 0.5.10", "tracing", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] name = "quote" -version = "1.0.39" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1f1914ce909e1658d9907913b4b91947430c7d9be598b15a1912935b8c04801" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + [[package]] name = "radium" version = "0.7.0" @@ -6771,7 +7363,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", ] [[package]] @@ -6780,7 +7372,7 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "getrandom 0.3.1", + "getrandom 0.3.3", ] [[package]] @@ -6799,56 +7391,6 @@ version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f60fcc7d6849342eff22c4350c8b9a989ee8ceabc4b481253e8946b9fe83d684" -[[package]] -name = "rav1e" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" -dependencies = [ - "arbitrary", - "arg_enum_proc_macro", - "arrayvec", - "av1-grain", - "bitstream-io", - "built", - "cfg-if", - "interpolate_name", - "itertools 0.12.1", - "libc", - "libfuzzer-sys", - "log", - "maybe-rayon", - "new_debug_unreachable", - "noop_proc_macro", - "num-derive", - "num-traits", - "once_cell", - "paste", - "profiling", - "rand 0.8.5", - "rand_chacha 0.3.1", - "simd_helpers", - "system-deps", - "thiserror 1.0.69", - "v_frame", - "wasm-bindgen", -] - -[[package]] -name = "ravif" -version = "0.11.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2413fd96bd0ea5cdeeb37eaf446a22e6ed7b981d792828721e74ded1980a45c6" -dependencies = [ - "avif-serialize", - "imgref", - "loop9", - "quick-error", - "rav1e", - "rayon", - "rgb", -] - [[package]] name = "raw-cpuid" version = "10.7.0" @@ -6886,11 +7428,11 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.10" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1" +checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", ] [[package]] @@ -6899,7 +7441,7 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", "libredox", "thiserror 1.0.69", ] @@ -6910,7 +7452,7 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", "libredox", "thiserror 2.0.12", ] @@ -6932,7 +7474,7 @@ checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.104", ] [[package]] @@ -7010,7 +7552,7 @@ dependencies = [ "encoding_rs", "futures-core", "futures-util", - "h2 0.3.26", + "h2 0.3.27", "http 0.2.12", "http-body 0.4.6", "hyper 0.14.32", @@ -7044,9 +7586,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.12" +version = "0.12.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da" +checksum = "cbc931937e6ca3a06e3b6c0aa7841849b160a90351d6ab467a8b9b9959767531" dependencies = [ "async-compression", "base64 0.22.1", @@ -7057,25 +7599,22 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2 0.4.8", - "http 1.2.0", + "h2 0.4.11", + "http 1.3.1", "http-body 1.0.1", "http-body-util", "hyper 1.6.0", - "hyper-rustls 0.27.5", + "hyper-rustls 0.27.7", "hyper-util", - "ipnet", "js-sys", "log", "mime", "mime_guess", - "once_cell", "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.23", + "rustls 0.23.29", "rustls-native-certs 0.8.1", - "rustls-pemfile 2.2.0", "rustls-pki-types", "serde", "serde_json", @@ -7085,6 +7624,7 @@ dependencies = [ "tokio-rustls 0.26.2", "tokio-util", "tower 0.5.2", + "tower-http 0.6.6", "tower-service", "url", "wasm-bindgen", @@ -7092,14 +7632,13 @@ dependencies = [ "wasm-streams", "web-sys", "webpki-roots", - "windows-registry", ] [[package]] name = "rgb" -version = "0.8.50" +version = "0.8.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" +checksum = "0c6a884d2998352bb4daf0183589aec883f16a6da1f4dde84d8e2e9a5409a1ce" dependencies = [ "bytemuck", ] @@ -7112,7 +7651,7 @@ checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.15", + "getrandom 0.2.16", "libc", "untrusted", "windows-sys 0.52.0", @@ -7135,7 +7674,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94" dependencies = [ "base64 0.21.7", - "bitflags 2.9.0", + "bitflags 2.9.1", "serde", "serde_derive", ] @@ -7162,9 +7701,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.24" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f" [[package]] name = "rustc-hash" @@ -7207,24 +7746,24 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "errno", "libc", "linux-raw-sys 0.4.15", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] name = "rustix" -version = "1.0.7" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" +checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "errno", "libc", "linux-raw-sys 0.9.4", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -7241,14 +7780,15 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.23" +version = "0.23.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47796c98c480fce5406ef69d1c76378375492c3b0a0de587be0c1d9feb12f395" +checksum = "2491382039b29b9b11ff08b76ff6c97cf287671dbb74f0be44bda389fffe9bd1" dependencies = [ + "aws-lc-rs", "once_cell", "ring", "rustls-pki-types", - "rustls-webpki 0.102.8", + "rustls-webpki 0.103.4", "subtle", "zeroize", ] @@ -7297,11 +7837,12 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" dependencies = [ "web-time", + "zeroize", ] [[package]] @@ -7316,10 +7857,11 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.102.8" +version = "0.103.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc" dependencies = [ + "aws-lc-rs", "ring", "rustls-pki-types", "untrusted", @@ -7327,9 +7869,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.20" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" +checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" [[package]] name = "rustyline" @@ -7337,7 +7879,7 @@ version = "15.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2ee1e066dc922e513bda599c6ccb5f3bb2b0ea5870a579448f2622993f0a9a2f" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "cfg-if", "clipboard-win", "fd-lock", @@ -7348,7 +7890,7 @@ dependencies = [ "nix 0.29.0", "radix_trie", "unicode-segmentation", - "unicode-width 0.2.0", + "unicode-width 0.2.1", "utf8parse", "windows-sys 0.59.0", ] @@ -7370,9 +7912,9 @@ dependencies = [ [[package]] name = "scc" -version = "2.3.3" +version = "2.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea091f6cac2595aa38993f04f4ee692ed43757035c36e67c180b6828356385b1" +checksum = "22b2d775fb28f245817589471dd49c5edf64237f4a19d10ce9a92ff4651a27f4" dependencies = [ "sdd", ] @@ -7407,6 +7949,30 @@ dependencies = [ "serde_json", ] +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + [[package]] name = "schemars_derive" version = "0.8.22" @@ -7416,9 +7982,15 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.99", + "syn 2.0.104", ] +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + [[package]] name = "scopeguard" version = "1.2.0" @@ -7442,7 +8014,7 @@ checksum = "1783eabc414609e28a5ba76aee5ddd52199f7107a0b24c2e9746a1ecc34a683d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.104", ] [[package]] @@ -7457,9 +8029,9 @@ dependencies = [ [[package]] name = "sdd" -version = "3.0.7" +version = "3.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b07779b9b918cc05650cb30f404d4d7835d26df37c235eded8a6832e2fb82cca" +checksum = "62f5557d2bbddd5afd236ba7856b0e494f5acc7ce805bb0774cc5674b20a06b4" [[package]] name = "seahash" @@ -7473,7 +8045,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "core-foundation 0.9.4", "core-foundation-sys", "libc", @@ -7486,8 +8058,8 @@ version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" dependencies = [ - "bitflags 2.9.0", - "core-foundation 0.10.0", + "bitflags 2.9.1", + "core-foundation 0.10.1", "core-foundation-sys", "libc", "security-framework-sys", @@ -7526,22 +8098,22 @@ checksum = "1bc711410fbe7399f390ca1c3b60ad0f53f80e95c5eb935e52268a0e2cd49acc" [[package]] name = "serde" -version = "1.0.218" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8dfc9d19bdbf6d17e22319da49161d5d0108e4188e8b680aef6299eed22df60" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.218" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.104", ] [[package]] @@ -7552,7 +8124,7 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.104", ] [[package]] @@ -7577,11 +8149,22 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_repr" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + [[package]] name = "serde_spanned" -version = "0.6.8" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" dependencies = [ "serde", ] @@ -7600,15 +8183,17 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.12.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa" +checksum = "f2c45cd61fefa9db6f254525d46e392b852e0e61d9a1fd36e5bd183450a556d5" dependencies = [ "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.7.1", + "indexmap 2.10.0", + "schemars 0.9.0", + "schemars 1.0.4", "serde", "serde_derive", "serde_json", @@ -7618,14 +8203,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.12.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e" +checksum = "de90945e6565ce0d9a25098082ed4ee4002e047cb59892c318d66821e14bb30f" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.104", ] [[package]] @@ -7634,7 +8219,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.7.1", + "indexmap 2.10.0", "itoa", "ryu", "serde", @@ -7663,7 +8248,7 @@ checksum = "5d69265a08751de7844521fd15003ae0a888e035773ba05695c5c759a6f89eef" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.104", ] [[package]] @@ -7679,9 +8264,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.8" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures", @@ -7711,11 +8296,11 @@ checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" [[package]] name = "shellexpand" -version = "3.1.0" +version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da03fa3b94cc19e3ebfc88c4229c49d8f08cdbd1228870a45f0ffdf84988e14b" +checksum = "8b1fdf65dd6331831494dd616b30351c38e96e45921a27745cf98490458b90bb" dependencies = [ - "dirs 5.0.1", + "dirs 6.0.0", ] [[package]] @@ -7726,9 +8311,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" -version = "1.4.2" +version = "1.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" dependencies = [ "libc", ] @@ -7739,15 +8324,6 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" -[[package]] -name = "simd_helpers" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" -dependencies = [ - "quote", -] - [[package]] name = "simple_asn1" version = "0.6.3" @@ -7798,18 +8374,15 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] +checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" [[package]] name = "smallvec" -version = "1.14.0" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" dependencies = [ "serde", ] @@ -7854,9 +8427,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.8" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" dependencies = [ "libc", "windows-sys 0.52.0", @@ -7880,7 +8453,7 @@ checksum = "01b2e185515564f15375f593fb966b5718bc624ba77fe49fa4616ad619690554" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.104", ] [[package]] @@ -7938,7 +8511,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.99", + "syn 2.0.104", ] [[package]] @@ -7960,9 +8533,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.99" +version = "2.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e02e925281e18ffd9d640e234264753c43edc62d64b2d4cf898f1bc5e75f3fc2" +checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" dependencies = [ "proc-macro2", "quote", @@ -7986,13 +8559,13 @@ dependencies = [ [[package]] name = "synstructure" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.104", ] [[package]] @@ -8075,7 +8648,7 @@ dependencies = [ "cfg-expr", "heck 0.5.0", "pkg-config", - "toml 0.8.20", + "toml 0.8.23", "version-compare", ] @@ -8261,16 +8834,15 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.17.1" +version = "3.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e5a0acb1f3f55f65cc4a866c361b2fb2a0ff6366785ae6fbb5f85df07ba230" +checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" dependencies = [ - "cfg-if", "fastrand 2.3.0", - "getrandom 0.3.1", + "getrandom 0.3.3", "once_cell", - "rustix 0.38.44", - "windows-sys 0.59.0", + "rustix 1.0.8", + "windows-sys 0.52.0", ] [[package]] @@ -8284,11 +8856,11 @@ dependencies = [ [[package]] name = "terminal_size" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5352447f921fda68cf61b4101566c0bdb5104eff6804d0678e5227580ab6a4e9" +checksum = "45c6481c4829e4cc63825e62c49186a34538b7b2750b73b266581ffb612fb5ed" dependencies = [ - "rustix 0.38.44", + "rustix 1.0.8", "windows-sys 0.59.0", ] @@ -8316,7 +8888,7 @@ dependencies = [ "cfg-if", "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.104", ] [[package]] @@ -8327,7 +8899,7 @@ checksum = "5c89e72a01ed4c579669add59014b9a524d609c0c88c6a585ce37485879f6ffb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.104", "test-case-core", ] @@ -8339,14 +8911,14 @@ checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057" dependencies = [ "smawk", "unicode-linebreak", - "unicode-width 0.2.0", + "unicode-width 0.2.1", ] [[package]] name = "thin-vec" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a38c90d48152c236a3ab59271da4f4ae63d678c5d7ad6b7714d7cb9760be5e4b" +checksum = "144f754d318415ac792f9d69fc87abbbfc043ce2ef041c60f16ad828f638717d" [[package]] name = "thiserror" @@ -8374,7 +8946,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.104", ] [[package]] @@ -8385,7 +8957,7 @@ checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.104", ] [[package]] @@ -8396,12 +8968,11 @@ checksum = "3bf63baf9f5039dadc247375c29eb13706706cfde997d0330d05aa63a77d8820" [[package]] name = "thread_local" -version = "1.1.8" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" dependencies = [ "cfg-if", - "once_cell", ] [[package]] @@ -8433,9 +9004,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.38" +version = "0.3.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb041120f25f8fbe8fd2dbe4671c7c2ed74d83be2e7a77529bf7e0790ae3f472" +checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" dependencies = [ "deranged", "itoa", @@ -8450,15 +9021,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "765c97a5b985b7c11d7bc27fa927dc4fe6af3a6dfb021d28deb60d3bf51e76ef" +checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" [[package]] name = "time-macros" -version = "0.2.20" +version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8093bc3e81c3bc5f7879de09619d06c9a5a5e45ca44dfeeb7225bae38005c5c" +checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" dependencies = [ "num-conv", "time-core", @@ -8475,9 +9046,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.7.6" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" dependencies = [ "displaydoc", "zerovec", @@ -8510,18 +9081,20 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.43.1" +version = "1.46.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "492a604e2fd7f814268a378409e6c92b5525d747d10db9a229723f55a417958c" +checksum = "0cc3a2344dafbe23a245241fe8b09735b521110d30fcefbbd5feb1797ca35d17" dependencies = [ "backtrace", "bytes", + "io-uring", "libc", "mio", "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.8", + "slab", + "socket2 0.5.10", "tokio-macros", "windows-sys 0.52.0", ] @@ -8559,7 +9132,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.104", ] [[package]] @@ -8578,7 +9151,7 @@ version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" dependencies = [ - "rustls 0.23.23", + "rustls 0.23.29", "tokio", ] @@ -8629,9 +9202,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.20" +version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" dependencies = [ "serde", "serde_spanned", @@ -8641,26 +9214,33 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.8" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.22.24" +version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ - "indexmap 2.7.1", + "indexmap 2.10.0", "serde", "serde_spanned", "toml_datetime", + "toml_write", "winnow", ] +[[package]] +name = "toml_write" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" + [[package]] name = "tower" version = "0.4.13" @@ -8699,10 +9279,10 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "bytes", "futures-util", - "http 1.2.0", + "http 1.3.1", "http-body 1.0.1", "http-body-util", "http-range-header", @@ -8718,6 +9298,24 @@ dependencies = [ "tracing", ] +[[package]] +name = "tower-http" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" +dependencies = [ + "bitflags 2.9.1", + "bytes", + "futures-util", + "http 1.3.1", + "http-body 1.0.1", + "iri-string", + "pin-project-lite", + "tower 0.5.2", + "tower-layer", + "tower-service", +] + [[package]] name = "tower-layer" version = "0.3.3" @@ -8756,20 +9354,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.28" +version = "0.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.104", ] [[package]] name = "tracing-core" -version = "0.1.33" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" dependencies = [ "once_cell", "valuable", @@ -8838,7 +9436,7 @@ checksum = "4793cb5e56680ecbb1d843515b23b6de9a75eb04b66643e256a396d43be33c13" dependencies = [ "bytes", "data-encoding", - "http 1.2.0", + "http 1.3.1", "httparse", "log", "rand 0.9.1", @@ -8849,13 +9447,9 @@ dependencies = [ [[package]] name = "twox-hash" -version = "1.6.3" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" -dependencies = [ - "cfg-if", - "static_assertions", -] +checksum = "8b907da542cbced5261bd3256de1b3a1bf340a3d37f93425a07362a1d687de56" [[package]] name = "typenum" @@ -8869,11 +9463,22 @@ version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" +[[package]] +name = "uds_windows" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" +dependencies = [ + "memoffset", + "tempfile", + "winapi", +] + [[package]] name = "umya-spreadsheet" -version = "2.2.3" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17ec15f1f191ba42ba0ed0f788999eec910c201cbbd4ae5de7cf0eb0a94b3d1a" +checksum = "b03d6e80f3c8e69eac385b1b199e358a44a496a52188644b1c32e729c108758c" dependencies = [ "aes", "ahash", @@ -8884,18 +9489,18 @@ dependencies = [ "chrono", "encoding_rs", "fancy-regex 0.14.0", - "getrandom 0.2.15", + "getrandom 0.2.16", "hmac", "html_parser", - "image 0.25.5", + "imagesize", "lazy_static", "md-5", - "quick-xml 0.37.2", + "quick-xml 0.37.5", "regex", "sha2", "thin-vec", "thousands", - "zip 2.5.0", + "zip 2.4.2", ] [[package]] @@ -8930,20 +9535,20 @@ checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" [[package]] name = "unicode-width" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" +checksum = "4a1a07cc7db3810833284e8d372ccdc6da29741639ecc70c9ec107df0fa6154c" [[package]] name = "uniffi" -version = "0.29.2" +version = "0.29.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dcd1d240101ba3b9d7532ae86d9cb64d9a7ff63e13a2b7b9e94a32a601d8233" +checksum = "b334fd69b3cf198b63616c096aabf9820ab21ed9b2aa1367ddd4b411068bf520" dependencies = [ "anyhow", "camino", "cargo_metadata 0.19.2", - "clap 4.5.31", + "clap 4.5.41", "uniffi_bindgen", "uniffi_core", "uniffi_macros", @@ -8952,9 +9557,9 @@ dependencies = [ [[package]] name = "uniffi_bindgen" -version = "0.29.2" +version = "0.29.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d0525f06d749ea80d8049dc0bb038bb87941e3d909eefa76b6f0a5589b59ac5" +checksum = "2ff0132b533483cf19abb30bba5c72c24d9f3e4d9a2ff71cb3e22e73899fd46e" dependencies = [ "anyhow", "askama", @@ -8964,7 +9569,7 @@ dependencies = [ "glob", "goblin", "heck 0.5.0", - "indexmap 2.7.1", + "indexmap 2.10.0", "once_cell", "serde", "tempfile", @@ -8978,9 +9583,9 @@ dependencies = [ [[package]] name = "uniffi_core" -version = "0.29.2" +version = "0.29.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3fa8eb4d825b4ed095cb13483cba6927c3002b9eb603cef9b7688758cc3772e" +checksum = "53e3b997192dc15ef1778c842001811ec7f241a093a693ac864e1fc938e64fa9" dependencies = [ "anyhow", "async-compat", @@ -8991,22 +9596,22 @@ dependencies = [ [[package]] name = "uniffi_internal_macros" -version = "0.29.2" +version = "0.29.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83b547d69d699e52f2129fde4b57ae0d00b5216e59ed5b56097c95c86ba06095" +checksum = "f64bec2f3a33f2f08df8150e67fa45ba59a2ca740bf20c1beb010d4d791f9a1b" dependencies = [ "anyhow", - "indexmap 2.7.1", + "indexmap 2.10.0", "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.104", ] [[package]] name = "uniffi_macros" -version = "0.29.2" +version = "0.29.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00f1de72edc8cb9201c7d650e3678840d143e4499004571aac49e6cb1b17da43" +checksum = "5d8708716d2582e4f3d7e9f320290b5966eb951ca421d7630571183615453efc" dependencies = [ "camino", "fs-err", @@ -9014,16 +9619,16 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn 2.0.99", + "syn 2.0.104", "toml 0.5.11", "uniffi_meta", ] [[package]] name = "uniffi_meta" -version = "0.29.2" +version = "0.29.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acc9204632f6a555b2cba7c8852c5523bc1aa5f3eff605c64af5054ea28b72e" +checksum = "3d226fc167754ce548c5ece9828c8a06f03bf1eea525d2659ba6bd648bd8e2f3" dependencies = [ "anyhow", "siphasher 0.3.11", @@ -9033,22 +9638,22 @@ dependencies = [ [[package]] name = "uniffi_pipeline" -version = "0.29.2" +version = "0.29.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54b5336a9a925b358183837d31541d12590b7fcec373256d3770de02dff24c69" +checksum = "b925b6421df15cf4bedee27714022cd9626fb4d7eee0923522a608b274ba4371" dependencies = [ "anyhow", "heck 0.5.0", - "indexmap 2.7.1", + "indexmap 2.10.0", "tempfile", "uniffi_internal_macros", ] [[package]] name = "uniffi_udl" -version = "0.29.2" +version = "0.29.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f95e73373d85f04736bc51997d3e6855721144ec4384cae9ca8513c80615e129" +checksum = "9c42649b721df759d9d4692a376b82b62ce3028ec9fc466f4780fb8cdf728996" dependencies = [ "anyhow", "textwrap", @@ -9092,12 +9697,6 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" -[[package]] -name = "utf16_iter" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" - [[package]] name = "utf8-ranges" version = "1.0.5" @@ -9122,7 +9721,7 @@ version = "4.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5afb1a60e207dca502682537fefcfd9921e71d0b83e9576060f09abc6efab23" dependencies = [ - "indexmap 2.7.1", + "indexmap 2.10.0", "serde", "serde_json", "utoipa-gen", @@ -9138,17 +9737,19 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.99", + "syn 2.0.104", ] [[package]] name = "uuid" -version = "1.15.1" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0f540e3240398cce6128b64ba83fdbdd86129c16a3aa1a3a252efd66eb3d587" +checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" dependencies = [ - "getrandom 0.3.1", + "getrandom 0.3.3", + "js-sys", "serde", + "wasm-bindgen", ] [[package]] @@ -9162,17 +9763,6 @@ dependencies = [ "vsimd", ] -[[package]] -name = "v_frame" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6f32aaa24bacd11e488aa9ba66369c7cd514885742c9fe08cfe85884db3e92b" -dependencies = [ - "aligned-vec", - "num-traits", - "wasm-bindgen", -] - [[package]] name = "valuable" version = "0.1.1" @@ -9230,15 +9820,15 @@ dependencies = [ [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasi" -version = "0.13.3+wasi-0.2.2" +version = "0.14.2+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" dependencies = [ "wit-bindgen-rt", ] @@ -9265,7 +9855,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.104", "wasm-bindgen-shared", ] @@ -9300,7 +9890,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.104", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -9327,6 +9917,94 @@ dependencies = [ "web-sys", ] +[[package]] +name = "wayland-backend" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe770181423e5fc79d3e2a7f4410b7799d5aab1de4372853de3c6aa13ca24121" +dependencies = [ + "cc", + "downcast-rs", + "rustix 0.38.44", + "scoped-tls", + "smallvec", + "wayland-sys", +] + +[[package]] +name = "wayland-client" +version = "0.31.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978fa7c67b0847dbd6a9f350ca2569174974cd4082737054dbb7fbb79d7d9a61" +dependencies = [ + "bitflags 2.9.1", + "rustix 0.38.44", + "wayland-backend", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols" +version = "0.32.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "779075454e1e9a521794fed15886323ea0feda3f8b0fc1390f5398141310422a" +dependencies = [ + "bitflags 2.9.1", + "wayland-backend", + "wayland-client", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-wlr" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cb6cdc73399c0e06504c437fe3cf886f25568dd5454473d565085b36d6a8bbf" +dependencies = [ + "bitflags 2.9.1", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-scanner" +version = "0.31.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "896fdafd5d28145fce7958917d69f2fd44469b1d4e861cb5961bcbeebc6d1484" +dependencies = [ + "proc-macro2", + "quick-xml 0.37.5", + "quote", +] + +[[package]] +name = "wayland-server" +version = "0.31.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "485dfb8ccf0daa0d34625d34e6ac15f99e550a7999b6fd88a0835ccd37655785" +dependencies = [ + "bitflags 2.9.1", + "downcast-rs", + "rustix 0.38.44", + "wayland-backend", + "wayland-scanner", +] + +[[package]] +name = "wayland-sys" +version = "0.31.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbcebb399c77d5aa9fa5db874806ee7b4eba4e73650948e8f93963f128896615" +dependencies = [ + "dlib", + "libc", + "log", + "memoffset", + "pkg-config", +] + [[package]] name = "web-sys" version = "0.3.77" @@ -9366,12 +10044,11 @@ dependencies = [ [[package]] name = "webbrowser" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5df295f8451142f1856b1bd86a606dfe9587d439bc036e319c827700dbd555e" +checksum = "aaf4f3c0ba838e82b4e5ccc4157003fb8c324ee24c058470ffb82820becbde98" dependencies = [ - "core-foundation 0.10.0", - "home", + "core-foundation 0.10.1", "jni", "log", "ndk-context", @@ -9383,9 +10060,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.26.8" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2210b291f7ea53617fbafcc4939f10914214ec15aace5ba62293a668f322c5c9" +checksum = "8782dd5a41a24eed3a4f40b606249b3e236ca61adf1f25ea4d45c73de122b502" dependencies = [ "rustls-pki-types", ] @@ -9401,9 +10078,9 @@ dependencies = [ [[package]] name = "weezl" -version = "0.1.8" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" +checksum = "a751b3277700db47d3e574514de2eced5e54dc8a5436a3bf7a0b248b2cee16f3" [[package]] name = "which" @@ -9429,6 +10106,12 @@ dependencies = [ "winsafe", ] +[[package]] +name = "widestring" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd7cf3379ca1aac9eea11fba24fd7e315d621f8dfe35c8d7d2be8b793726e07d" + [[package]] name = "wild" version = "2.2.1" @@ -9460,7 +10143,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.48.0", ] [[package]] @@ -9491,12 +10174,24 @@ dependencies = [ [[package]] name = "windows" -version = "0.58.0" +version = "0.61.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" dependencies = [ - "windows-core 0.58.0", - "windows-targets 0.52.6", + "windows-collections", + "windows-core 0.61.2", + "windows-future", + "windows-link", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +dependencies = [ + "windows-core 0.61.2", ] [[package]] @@ -9522,15 +10217,26 @@ dependencies = [ [[package]] name = "windows-core" -version = "0.58.0" +version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" dependencies = [ - "windows-implement 0.58.0", - "windows-interface 0.58.0", - "windows-result 0.2.0", + "windows-implement 0.60.0", + "windows-interface 0.59.1", + "windows-link", + "windows-result 0.3.4", "windows-strings", - "windows-targets 0.52.6", +] + +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core 0.61.2", + "windows-link", + "windows-threading", ] [[package]] @@ -9541,18 +10247,18 @@ checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.104", ] [[package]] name = "windows-implement" -version = "0.58.0" +version = "0.60.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.104", ] [[package]] @@ -9563,29 +10269,34 @@ checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.104", ] [[package]] name = "windows-interface" -version = "0.58.0" +version = "0.59.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.104", ] [[package]] -name = "windows-registry" +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-numerics" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" dependencies = [ - "windows-result 0.2.0", - "windows-strings", - "windows-targets 0.52.6", + "windows-core 0.61.2", + "windows-link", ] [[package]] @@ -9599,21 +10310,20 @@ dependencies = [ [[package]] name = "windows-result" -version = "0.2.0" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" dependencies = [ - "windows-targets 0.52.6", + "windows-link", ] [[package]] name = "windows-strings" -version = "0.1.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" dependencies = [ - "windows-result 0.2.0", - "windows-targets 0.52.6", + "windows-link", ] [[package]] @@ -9652,6 +10362,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.2", +] + [[package]] name = "windows-targets" version = "0.42.2" @@ -9691,13 +10410,38 @@ dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm", + "windows_i686_gnullvm 0.52.6", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", "windows_x86_64_msvc 0.52.6", ] +[[package]] +name = "windows-targets" +version = "0.53.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c66f69fcc9ce11da9966ddb31a40968cad001c5bedeb5c2b82ede4253ab48aef" +dependencies = [ + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", +] + +[[package]] +name = "windows-threading" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +dependencies = [ + "windows-link", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.42.2" @@ -9716,6 +10460,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" + [[package]] name = "windows_aarch64_msvc" version = "0.42.2" @@ -9734,6 +10484,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" + [[package]] name = "windows_i686_gnu" version = "0.42.2" @@ -9752,12 +10508,24 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" + [[package]] name = "windows_i686_msvc" version = "0.42.2" @@ -9776,6 +10544,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_i686_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" + [[package]] name = "windows_x86_64_gnu" version = "0.42.2" @@ -9794,6 +10568,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.2" @@ -9812,6 +10592,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" + [[package]] name = "windows_x86_64_msvc" version = "0.42.2" @@ -9830,11 +10616,17 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + [[package]] name = "winnow" -version = "0.7.3" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7f4ea97f6f78012141bcdb6a216b2609f0979ada50b20ca5b52dde2eac2bb1" +checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" dependencies = [ "memchr", ] @@ -9857,16 +10649,16 @@ checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904" [[package]] name = "wiremock" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "101681b74cd87b5899e87bcf5a64e83334dd313fcd3053ea72e6dba18928e301" +checksum = "a2b8b99d4cdbf36b239a9532e31fe4fb8acc38d1897c1761e161550a7dc78e6a" dependencies = [ "assert-json-diff", "async-trait", "base64 0.22.1", "deadpool", "futures", - "http 1.2.0", + "http 1.3.1", "http-body-util", "hyper 1.6.0", "hyper-util", @@ -9881,24 +10673,18 @@ dependencies = [ [[package]] name = "wit-bindgen-rt" -version = "0.33.0" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", ] -[[package]] -name = "write16" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" - [[package]] name = "writeable" -version = "0.5.5" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" [[package]] name = "wyz" @@ -9911,30 +10697,44 @@ dependencies = [ [[package]] name = "xattr" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d65cbf2f12c15564212d48f4e3dfb87923d25d611f2aed18f4cb23f0413d89e" +checksum = "af3a19837351dc82ba89f8a125e22a3c475f05aba604acc023d62b2739ae2909" dependencies = [ "libc", - "rustix 1.0.7", + "rustix 1.0.8", ] [[package]] name = "xcap" -version = "0.0.14" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1107223d8283abdd9f22bad27cf36562ef7d3941d82360c75c303656b7dfcb66" +checksum = "7921260094351cd497514d5fccba8066316cacbdb15b3b3bda6e7345447c67a7" dependencies = [ - "core-foundation 0.10.0", - "core-graphics", - "dbus", - "image 0.25.5", + "dispatch2", + "image 0.25.6", + "lazy_static", + "libwayshot-xcap", "log", + "objc2", + "objc2-app-kit", + "objc2-av-foundation", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-core-media", + "objc2-core-video", + "objc2-foundation", "percent-encoding", - "sysinfo 0.32.1", - "thiserror 1.0.69", - "windows 0.58.0", + "pipewire", + "rand 0.9.1", + "scopeguard", + "serde", + "thiserror 2.0.12", + "url", + "widestring", + "windows 0.61.3", "xcb", + "zbus", ] [[package]] @@ -9950,9 +10750,9 @@ dependencies = [ [[package]] name = "xml-rs" -version = "0.8.25" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5b940ebc25896e71dd073bad2dbaa2abfe97b0a391415e22ad1326d9c54e3c4" +checksum = "6fd8403733700263c6eb89f192880191f1b83e332f7a20371ddcf421c4a337c7" [[package]] name = "xmlparser" @@ -9980,11 +10780,20 @@ dependencies = [ "hashlink", ] +[[package]] +name = "yansi-term" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe5c30ade05e61656247b2e334a031dfd0cc466fadef865bdcdea8d537951bf1" +dependencies = [ + "winapi", +] + [[package]] name = "yoke" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" dependencies = [ "serde", "stable_deref_trait", @@ -9994,13 +10803,13 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.104", "synstructure", ] @@ -10014,14 +10823,14 @@ dependencies = [ "async-trait", "base64 0.22.1", "futures", - "http 1.2.0", + "http 1.3.1", "http-body-util", "hyper 1.6.0", - "hyper-rustls 0.27.5", + "hyper-rustls 0.27.7", "hyper-util", "log", "percent-encoding", - "rustls 0.23.23", + "rustls 0.23.29", "rustls-pemfile 2.2.0", "seahash", "serde", @@ -10031,25 +10840,84 @@ dependencies = [ "url", ] +[[package]] +name = "zbus" +version = "5.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bb4f9a464286d42851d18a605f7193b8febaf5b0919d71c6399b7b26e5b0aad" +dependencies = [ + "async-broadcast", + "async-executor", + "async-io 2.4.1", + "async-lock 3.4.0", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "enumflags2", + "event-listener 5.4.0", + "futures-core", + "futures-lite 2.6.0", + "hex", + "nix 0.30.1", + "ordered-stream", + "serde", + "serde_repr", + "tracing", + "uds_windows", + "windows-sys 0.59.0", + "winnow", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "5.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef9859f68ee0c4ee2e8cde84737c78e3f4c54f946f2a38645d0d4c7a95327659" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.104", + "zbus_names", + "zvariant", + "zvariant_utils", +] + +[[package]] +name = "zbus_names" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7be68e64bf6ce8db94f63e72f0c7eb9a60d733f7e0499e628dfab0f84d6bcb97" +dependencies = [ + "serde", + "static_assertions", + "winnow", + "zvariant", +] + [[package]] name = "zerocopy" -version = "0.7.35" +version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" dependencies = [ - "byteorder", "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.35" +version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.104", ] [[package]] @@ -10069,7 +10937,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.104", "synstructure", ] @@ -10090,14 +10958,25 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.104", +] + +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", ] [[package]] name = "zerovec" -version = "0.10.4" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" dependencies = [ "yoke", "zerofrom", @@ -10106,13 +10985,13 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.10.3" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.104", ] [[package]] @@ -10129,30 +11008,30 @@ dependencies = [ [[package]] name = "zip" -version = "2.5.0" +version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27c03817464f64e23f6f37574b4fdc8cf65925b5bfd2b0f2aedf959791941f88" +checksum = "fabe6324e908f85a1c52063ce7aa26b68dcb7eb6dbc83a2d148403c9bc3eba50" dependencies = [ "arbitrary", "crc32fast", "crossbeam-utils", + "displaydoc", "flate2", - "indexmap 2.7.1", + "indexmap 2.10.0", "memchr", + "thiserror 2.0.12", "zopfli", ] [[package]] name = "zopfli" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5019f391bac5cf252e93bbcc53d039ffd62c7bfb7c150414d61369afe57e946" +checksum = "edfc5ee405f504cd4984ecc6f14d02d55cfda60fa4b689434ef4102aae150cd7" dependencies = [ "bumpalo", "crc32fast", - "lockfree-object-pool", "log", - "once_cell", "simd-adler32", ] @@ -10167,29 +11046,23 @@ dependencies = [ [[package]] name = "zstd-safe" -version = "7.2.3" +version = "7.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3051792fbdc2e1e143244dc28c60f73d8470e93f3f9cbd0ead44da5ed802722" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" dependencies = [ "zstd-sys", ] [[package]] name = "zstd-sys" -version = "2.0.14+zstd.1.5.7" +version = "2.0.15+zstd.1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fb060d4926e4ac3a3ad15d864e99ceb5f343c6b34f5bd6d81ae6ed417311be5" +checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237" dependencies = [ "cc", "pkg-config", ] -[[package]] -name = "zune-core" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" - [[package]] name = "zune-inflate" version = "0.2.54" @@ -10200,10 +11073,42 @@ dependencies = [ ] [[package]] -name = "zune-jpeg" -version = "0.4.14" +name = "zvariant" +version = "5.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91b3680bb339216abd84714172b5138a4edac677e641ef17e1d8cb1b3ca6e6f" +dependencies = [ + "endi", + "enumflags2", + "serde", + "winnow", + "zvariant_derive", + "zvariant_utils", +] + +[[package]] +name = "zvariant_derive" +version = "5.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a8c68501be459a8dbfffbe5d792acdd23b4959940fc87785fb013b32edbc208" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.104", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99a5bab8d7dedf81405c4bb1f2b83ea057643d9cb28778cea9eecddeedd2e028" +checksum = "e16edfee43e5d7b553b77872d99bc36afdda75c223ca7ad5e3fbecd82ca5fc34" dependencies = [ - "zune-core", + "proc-macro2", + "quote", + "serde", + "static_assertions", + "syn 2.0.104", + "winnow", ] diff --git a/crates/goose-bench/Cargo.toml b/crates/goose-bench/Cargo.toml index ba436de56e60..3efb64e26a4f 100644 --- a/crates/goose-bench/Cargo.toml +++ b/crates/goose-bench/Cargo.toml @@ -18,7 +18,7 @@ ctor = "0.2.7" goose = { path = "../goose" } mcp-core = { path = "../mcp-core" } async-trait = "0.1.86" -chrono = { version = "0.4", features = ["serde"] } +chrono = { version = "0.4.38", features = ["serde"] } serde_json = "1.0" serde = { version = "1.0", features = ["derive"] } tracing = "0.1" diff --git a/crates/goose-cli/Cargo.toml b/crates/goose-cli/Cargo.toml index 0bcfc5506b0c..c65e1e9c0afe 100644 --- a/crates/goose-cli/Cargo.toml +++ b/crates/goose-cli/Cargo.toml @@ -49,7 +49,7 @@ reqwest = { version = "0.12.9", features = [ rand = "0.8.5" rustyline = "15.0.0" tracing = "0.1" -chrono = "0.4" +chrono = "0.4.38" tracing-subscriber = { version = "0.3", features = ["env-filter", "fmt", "json", "time"] } tracing-appender = "0.2" once_cell = "1.20.2" diff --git a/crates/goose-cli/src/session/mod.rs b/crates/goose-cli/src/session/mod.rs index eaffbdffaa85..c6ccb09fe3b4 100644 --- a/crates/goose-cli/src/session/mod.rs +++ b/crates/goose-cli/src/session/mod.rs @@ -627,9 +627,9 @@ impl Session { &Message::assistant().with_text("Chat context cleared."), self.debug, ); - if self.session_file.exists() { - std::fs::remove_file(&self.session_file)?; - std::fs::File::create(&self.session_file)?; + if let Some(file) = self.session_file.as_ref().filter(|f| f.exists()) { + std::fs::remove_file(file)?; + std::fs::File::create(file)?; } continue; } diff --git a/crates/goose-mcp/Cargo.toml b/crates/goose-mcp/Cargo.toml index 64db2513debb..b26add454677 100644 --- a/crates/goose-mcp/Cargo.toml +++ b/crates/goose-mcp/Cargo.toml @@ -28,7 +28,7 @@ lazy_static = "1.5" kill_tree = "0.2.4" shellexpand = "3.1.0" indoc = "2.0.5" -xcap = "0.0.14" +xcap = "0.6.2" reqwest = { version = "0.11", features = [ "json", "rustls-tls-native-roots", diff --git a/crates/goose-mcp/src/developer/mod.rs b/crates/goose-mcp/src/developer/mod.rs index ddc81831cda6..6b20156df631 100644 --- a/crates/goose-mcp/src/developer/mod.rs +++ b/crates/goose-mcp/src/developer/mod.rs @@ -1349,8 +1349,12 @@ impl DeveloperRouter { let windows = Window::all() .map_err(|_| ToolError::ExecutionError("Failed to list windows".into()))?; - let window_titles: Vec = - windows.into_iter().map(|w| w.title().to_string()).collect(); + let window_titles: Vec = windows + .into_iter() + .map(|w| w.title().ok()) + .filter(|t| t.is_some()) + .map(|t| t.unwrap().to_string()) + .collect(); Ok(vec![ Content::text(format!("Available windows:\n{}", window_titles.join("\n"))) @@ -1490,7 +1494,7 @@ impl DeveloperRouter { let window = windows .into_iter() - .find(|w| w.title() == window_title) + .find(|w| w.title().is_ok_and(|t| t == window_title)) .ok_or_else(|| { ToolError::ExecutionError(format!( "No window found with title '{}'", diff --git a/crates/goose-server/Cargo.toml b/crates/goose-server/Cargo.toml index eaf6c30b9384..4b9b356dc171 100644 --- a/crates/goose-server/Cargo.toml +++ b/crates/goose-server/Cargo.toml @@ -17,7 +17,7 @@ goose-mcp = { path = "../goose-mcp" } mcp-server = { path = "../mcp-server" } axum = { version = "0.8.1", features = ["ws", "macros"] } tokio = { version = "1.43", features = ["full"] } -chrono = "0.4" +chrono = "0.4.38" tokio-cron-scheduler = "0.14.0" tower-http = { version = "0.5", features = ["cors"] } serde = { version = "1.0", features = ["derive"] } diff --git a/crates/goose/Cargo.toml b/crates/goose/Cargo.toml index 8761857096a1..d7b38e4d5e12 100644 --- a/crates/goose/Cargo.toml +++ b/crates/goose/Cargo.toml @@ -46,7 +46,7 @@ async-stream = "0.3" minijinja = "2.8.0" include_dir = "0.7.4" tiktoken-rs = "0.6.0" -chrono = { version = "0.4.38", features = ["serde"] } +chrono = { version = "=0.4.38", features = ["serde"] } indoc = "2.0.5" nanoid = "0.4" sha2 = "0.10" diff --git a/crates/mcp-client/Cargo.toml b/crates/mcp-client/Cargo.toml index a678e8f20643..de103f7e5b13 100644 --- a/crates/mcp-client/Cargo.toml +++ b/crates/mcp-client/Cargo.toml @@ -29,7 +29,7 @@ nix = { version = "0.30.1", features = ["process", "signal"] } axum = { version = "0.8", features = ["query"] } base64 = "0.22" sha2 = "0.10" -chrono = { version = "0.4", features = ["serde"] } +chrono = { version = "0.4.38", features = ["serde"] } nanoid = "0.4" webbrowser = "1.0" serde_urlencoded = "0.7" From 9ad1d9662fdfa41438104c66d9db3cc7d6643862 Mon Sep 17 00:00:00 2001 From: Jack Amadeo Date: Wed, 16 Jul 2025 16:17:17 -0400 Subject: [PATCH 2/7] cargo fix --edition --- crates/goose-bench/src/runners/eval_runner.rs | 6 +- crates/goose-cli/src/commands/configure.rs | 6 +- crates/goose-cli/src/logging.rs | 45 +++++--- crates/goose-cli/src/session/output.rs | 9 +- crates/goose-ffi/src/lib.rs | 30 +++--- .../goose-llm/src/message/message_content.rs | 4 +- crates/goose-llm/tests/providers_complete.rs | 12 ++- .../src/computercontroller/pdf_tool.rs | 4 +- crates/goose-mcp/src/google_drive/mod.rs | 12 +-- crates/goose-server/src/logging.rs | 6 +- crates/goose-server/src/routes/extension.rs | 24 +++-- crates/goose/examples/databricks_oauth.rs | 3 +- crates/goose/src/agents/tool_vectordb.rs | 15 ++- crates/goose/src/config/base.rs | 9 +- crates/goose/src/context_mgmt/truncate.rs | 4 +- crates/goose/src/message.rs | 10 +- crates/goose/src/project/storage.rs | 2 +- crates/goose/src/providers/bedrock.rs | 3 +- crates/goose/src/providers/databricks.rs | 6 +- crates/goose/src/providers/factory.rs | 102 ++++++++++++------ .../goose/src/providers/formats/anthropic.rs | 9 +- crates/goose/src/providers/pricing.rs | 6 +- crates/goose/src/providers/sagemaker_tgi.rs | 3 +- crates/goose/src/scheduler.rs | 18 ++-- crates/goose/src/session/storage.rs | 4 +- crates/goose/src/tracing/langfuse_layer.rs | 54 ++++++---- crates/goose/tests/agent.rs | 2 +- crates/goose/tests/providers.rs | 12 ++- crates/mcp-client/src/transport/sse.rs | 3 +- .../src/transport/streamable_http.rs | 3 +- 30 files changed, 266 insertions(+), 160 deletions(-) diff --git a/crates/goose-bench/src/runners/eval_runner.rs b/crates/goose-bench/src/runners/eval_runner.rs index ec1764a3e7f0..57e818750715 100644 --- a/crates/goose-bench/src/runners/eval_runner.rs +++ b/crates/goose-bench/src/runners/eval_runner.rs @@ -81,7 +81,7 @@ impl EvalRunner { work_dir.set_eval(&bench_eval.selector, run_id); tracing::info!("Set evaluation directory for {}", bench_eval.selector); - if let Some(eval) = EvaluationSuite::from(&bench_eval.selector) { + match EvaluationSuite::from(&bench_eval.selector) { Some(eval) => { let now_stamp = SystemTime::now() .duration_since(UNIX_EPOCH) .context("Failed to get current timestamp")? @@ -166,10 +166,10 @@ impl EvalRunner { .context("Failed to copy session file to evaluation directory")?; tracing::info!("Evaluation completed successfully"); - } else { + } _ => { tracing::error!("No evaluation found for selector: {}", bench_eval.selector); bail!("No evaluation found for selector: {}", bench_eval.selector); - } + }} Ok(()) } diff --git a/crates/goose-cli/src/commands/configure.rs b/crates/goose-cli/src/commands/configure.rs index 0fa5cc475e26..bb005ddbbb96 100644 --- a/crates/goose-cli/src/commands/configure.rs +++ b/crates/goose-cli/src/commands/configure.rs @@ -1236,7 +1236,7 @@ pub async fn configure_tool_permissions_dialog() -> Result<(), Box> { let agent = Agent::new(); let new_provider = create(&provider_name, model_config)?; agent.update_provider(new_provider).await?; - if let Ok(Some(config)) = ExtensionConfigManager::get_config_by_name(&selected_extension_name) { + match ExtensionConfigManager::get_config_by_name(&selected_extension_name) { Ok(Some(config)) => { agent .add_extension(config.clone()) .await @@ -1247,14 +1247,14 @@ pub async fn configure_tool_permissions_dialog() -> Result<(), Box> { config.name() ); }); - } else { + } _ => { println!( "{} Configuration not found for extension: {}", style("Warning").yellow().italic(), selected_extension_name ); return Ok(()); - } + }} let mut permission_manager = PermissionManager::default(); let selected_tools = agent diff --git a/crates/goose-cli/src/logging.rs b/crates/goose-cli/src/logging.rs index 630919d5413e..82024399e6fc 100644 --- a/crates/goose-cli/src/logging.rs +++ b/crates/goose-cli/src/logging.rs @@ -187,9 +187,11 @@ mod tests { fn setup_temp_home() -> TempDir { let temp_dir = TempDir::new().unwrap(); if cfg!(windows) { - env::set_var("USERPROFILE", temp_dir.path()); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::set_var("USERPROFILE", temp_dir.path()) }; } else { - env::set_var("HOME", temp_dir.path()); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::set_var("HOME", temp_dir.path()) }; } temp_dir } @@ -239,11 +241,14 @@ mod tests { // Set up environment if cfg!(windows) { - env::set_var("USERPROFILE", test_dir); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::set_var("USERPROFILE", test_dir) }; } else { - env::set_var("HOME", test_dir); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::set_var("HOME", test_dir) }; // Also set TMPDIR to prevent temp directory sharing between tests - env::set_var("TMPDIR", test_dir); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::set_var("TMPDIR", test_dir) }; } // Create error capture if needed - but don't use it in tests to avoid tokio runtime issues @@ -459,33 +464,43 @@ mod tests { // Clear all Langfuse environment variables for (var, _) in &original_vars { - env::remove_var(var); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::remove_var(var) }; } // Test without any environment variables assert!(langfuse_layer::create_langfuse_observer().is_none()); // Test with standard Langfuse variables - env::set_var("LANGFUSE_PUBLIC_KEY", "test_public_key"); - env::set_var("LANGFUSE_SECRET_KEY", "test_secret_key"); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::set_var("LANGFUSE_PUBLIC_KEY", "test_public_key") }; + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::set_var("LANGFUSE_SECRET_KEY", "test_secret_key") }; assert!(langfuse_layer::create_langfuse_observer().is_some()); // Clear and test with init project variables - env::remove_var("LANGFUSE_PUBLIC_KEY"); - env::remove_var("LANGFUSE_SECRET_KEY"); - env::set_var("LANGFUSE_INIT_PROJECT_PUBLIC_KEY", "test_public_key"); - env::set_var("LANGFUSE_INIT_PROJECT_SECRET_KEY", "test_secret_key"); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::remove_var("LANGFUSE_PUBLIC_KEY") }; + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::remove_var("LANGFUSE_SECRET_KEY") }; + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::set_var("LANGFUSE_INIT_PROJECT_PUBLIC_KEY", "test_public_key") }; + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::set_var("LANGFUSE_INIT_PROJECT_SECRET_KEY", "test_secret_key") }; assert!(langfuse_layer::create_langfuse_observer().is_some()); // Test fallback behavior - env::remove_var("LANGFUSE_INIT_PROJECT_PUBLIC_KEY"); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::remove_var("LANGFUSE_INIT_PROJECT_PUBLIC_KEY") }; assert!(langfuse_layer::create_langfuse_observer().is_none()); // Restore original environment variables for (var, value) in original_vars { match value { - Some(val) => env::set_var(var, val), - None => env::remove_var(var), + // TODO: Audit that the environment access only happens in single-threaded code. + Some(val) => unsafe { env::set_var(var, val) }, + // TODO: Audit that the environment access only happens in single-threaded code. + None => unsafe { env::remove_var(var) }, } } } diff --git a/crates/goose-cli/src/session/output.rs b/crates/goose-cli/src/session/output.rs index 06435bd32be3..5544cddf6005 100644 --- a/crates/goose-cli/src/session/output.rs +++ b/crates/goose-cli/src/session/output.rs @@ -823,7 +823,8 @@ mod tests { let original_home = env::var("HOME").ok(); // Set a test home directory - env::set_var("HOME", "/Users/testuser"); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::set_var("HOME", "/Users/testuser") }; assert_eq!( shorten_path("/Users/testuser/documents/file.txt", false), @@ -838,9 +839,11 @@ mod tests { // Restore the original home dir if let Some(home) = original_home { - env::set_var("HOME", home); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::set_var("HOME", home) }; } else { - env::remove_var("HOME"); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::remove_var("HOME") }; } } diff --git a/crates/goose-ffi/src/lib.rs b/crates/goose-ffi/src/lib.rs index bf4197c2d29f..2a60c3912bb6 100644 --- a/crates/goose-ffi/src/lib.rs +++ b/crates/goose-ffi/src/lib.rs @@ -94,8 +94,8 @@ pub struct AsyncResult { /// /// The result pointer must be a valid pointer returned by a goose FFI function, /// or NULL. -#[no_mangle] -pub unsafe extern "C" fn goose_free_async_result(result: *mut AsyncResult) { +#[unsafe(no_mangle)] +pub unsafe extern "C" fn goose_free_async_result(result: *mut AsyncResult) { unsafe { if !result.is_null() { let result = &mut *result; if !result.error_message.is_null() { @@ -103,7 +103,7 @@ pub unsafe extern "C" fn goose_free_async_result(result: *mut AsyncResult) { } let _ = Box::from_raw(result); } -} +}} /// Create a new agent with the given provider configuration /// @@ -119,8 +119,8 @@ pub unsafe extern "C" fn goose_free_async_result(result: *mut AsyncResult) { /// /// The config pointer must be valid or NULL. The resulting agent must be freed /// with goose_agent_free when no longer needed. -#[no_mangle] -pub unsafe extern "C" fn goose_agent_new(config: *const ProviderConfigFFI) -> AgentPtr { +#[unsafe(no_mangle)] +pub unsafe extern "C" fn goose_agent_new(config: *const ProviderConfigFFI) -> AgentPtr { unsafe { // Check for null pointer if config.is_null() { eprintln!("Error: config pointer is null"); @@ -189,7 +189,7 @@ pub unsafe extern "C" fn goose_agent_new(config: *const ProviderConfigFFI) -> Ag ptr::null_mut() } } -} +}} /// Free an agent /// @@ -204,12 +204,12 @@ pub unsafe extern "C" fn goose_agent_new(config: *const ProviderConfigFFI) -> Ag /// The agent_ptr must be a valid pointer returned by goose_agent_new, /// or have a null internal pointer. The agent_ptr must not be used after /// calling this function. -#[no_mangle] -pub unsafe extern "C" fn goose_agent_free(agent_ptr: AgentPtr) { +#[unsafe(no_mangle)] +pub unsafe extern "C" fn goose_agent_free(agent_ptr: AgentPtr) { unsafe { if !agent_ptr.is_null() { let _ = Box::from_raw(agent_ptr); } -} +}} /// Send a message to the agent and get the response /// @@ -231,11 +231,11 @@ pub unsafe extern "C" fn goose_agent_free(agent_ptr: AgentPtr) { /// /// The agent_ptr must be a valid pointer returned by goose_agent_new. /// The message must be a valid C string. -#[no_mangle] +#[unsafe(no_mangle)] pub unsafe extern "C" fn goose_agent_send_message( agent_ptr: AgentPtr, message: *const c_char, -) -> *mut c_char { +) -> *mut c_char { unsafe { if agent_ptr.is_null() || message.is_null() { return ptr::null_mut(); } @@ -279,7 +279,7 @@ pub unsafe extern "C" fn goose_agent_send_message( }); string_to_c_char(&response) -} +}} // Tool schema creation will be implemented in a future commit @@ -295,12 +295,12 @@ pub unsafe extern "C" fn goose_agent_send_message( /// /// The string must have been allocated by a goose FFI function, or be NULL. /// The string must not be used after calling this function. -#[no_mangle] -pub unsafe extern "C" fn goose_free_string(s: *mut c_char) { +#[unsafe(no_mangle)] +pub unsafe extern "C" fn goose_free_string(s: *mut c_char) { unsafe { if !s.is_null() { let _ = CString::from_raw(s); } -} +}} // Helper function to convert a Rust string to a C char pointer fn string_to_c_char(s: &str) -> *mut c_char { diff --git a/crates/goose-llm/src/message/message_content.rs b/crates/goose-llm/src/message/message_content.rs index 75daa3a825e7..c2397b6c1791 100644 --- a/crates/goose-llm/src/message/message_content.rs +++ b/crates/goose-llm/src/message/message_content.rs @@ -167,7 +167,7 @@ impl MessageContent { } pub fn as_tool_request(&self) -> Option<&ToolRequest> { - if let MessageContent::ToolReq(ref tool_request) = self { + if let MessageContent::ToolReq(tool_request) = self { Some(tool_request) } else { None @@ -175,7 +175,7 @@ impl MessageContent { } pub fn as_tool_response(&self) -> Option<&ToolResponse> { - if let MessageContent::ToolResp(ref tool_response) = self { + if let MessageContent::ToolResp(tool_response) = self { Some(tool_response) } else { None diff --git a/crates/goose-llm/tests/providers_complete.rs b/crates/goose-llm/tests/providers_complete.rs index 25706558b4cc..10df364ee811 100644 --- a/crates/goose-llm/tests/providers_complete.rs +++ b/crates/goose-llm/tests/providers_complete.rs @@ -309,8 +309,10 @@ where if let Some(mods) = &env_modifications { for (&var, value) in mods.iter() { match value { - Some(val) => std::env::set_var(var, val), - None => std::env::remove_var(var), + // TODO: Audit that the environment access only happens in single-threaded code. + Some(val) => unsafe { std::env::set_var(var, val) }, + // TODO: Audit that the environment access only happens in single-threaded code. + None => unsafe { std::env::remove_var(var) }, } } } @@ -327,12 +329,14 @@ where // Restore original environment for (&var, value) in original_env.iter() { - std::env::set_var(var, value); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { std::env::set_var(var, value) }; } if let Some(mods) = env_modifications { for &var in mods.keys() { if !original_env.contains_key(var) { - std::env::remove_var(var); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { std::env::remove_var(var) }; } } } diff --git a/crates/goose-mcp/src/computercontroller/pdf_tool.rs b/crates/goose-mcp/src/computercontroller/pdf_tool.rs index f25dde64e3d0..69728ea87f11 100644 --- a/crates/goose-mcp/src/computercontroller/pdf_tool.rs +++ b/crates/goose-mcp/src/computercontroller/pdf_tool.rs @@ -50,14 +50,14 @@ pub async fn pdf_tool( } // "TJ" operator: show text with positioning "TJ" => { - if let Some(Object::Array(ref arr)) = + if let Some(Object::Array(arr)) = operation.operands.first() { let mut last_was_text = false; for element in arr { match element { Object::String( - ref bytes, + bytes, _, ) => { if let Ok(s) = diff --git a/crates/goose-mcp/src/google_drive/mod.rs b/crates/goose-mcp/src/google_drive/mod.rs index 1f1aeae70ca2..627af7f685b9 100644 --- a/crates/goose-mcp/src/google_drive/mod.rs +++ b/crates/goose-mcp/src/google_drive/mod.rs @@ -1286,7 +1286,7 @@ impl GoogleDriveRouter { uri, e ))), Ok(r) => { - if let Ok(body) = r.into_body().collect().await { + match r.into_body().collect().await { Ok(body) => { if let Ok(response) = String::from_utf8(body.to_bytes().to_vec()) { if !include_images { let content = self.strip_image_body(&response); @@ -1310,12 +1310,12 @@ impl GoogleDriveRouter { uri, ))) } - } else { + } _ => { Err(ToolError::ExecutionError(format!( "Failed to export google drive document, {}.", uri, ))) - } + }} } } } @@ -1344,7 +1344,7 @@ impl GoogleDriveRouter { ))), Ok(r) => { if mime_type.starts_with("text/") || mime_type == "application/json" { - if let Ok(body) = r.0.into_body().collect().await { + match r.0.into_body().collect().await { Ok(body) => { if let Ok(response) = String::from_utf8(body.to_bytes().to_vec()) { if !include_images { let content = self.strip_image_body(&response); @@ -1368,12 +1368,12 @@ impl GoogleDriveRouter { uri, ))) } - } else { + } _ => { Err(ToolError::ExecutionError(format!( "Failed to get google drive document, {}.", uri, ))) - } + }} } else { //TODO: handle base64 image case, see typscript mcp-gdrive Err(ToolError::ExecutionError(format!( diff --git a/crates/goose-server/src/logging.rs b/crates/goose-server/src/logging.rs index 90db8f8a2369..ed69d52d818b 100644 --- a/crates/goose-server/src/logging.rs +++ b/crates/goose-server/src/logging.rs @@ -97,16 +97,16 @@ pub fn setup_logging(name: Option<&str>) -> Result<()> { .with(console_layer.with_filter(LevelFilter::INFO)); // Initialize with Langfuse if available - if let Some(langfuse) = langfuse_layer::create_langfuse_observer() { + match langfuse_layer::create_langfuse_observer() { Some(langfuse) => { subscriber .with(langfuse.with_filter(LevelFilter::DEBUG)) .try_init() .context("Failed to set global subscriber")?; - } else { + } _ => { subscriber .try_init() .context("Failed to set global subscriber")?; - } + }} Ok(()) } diff --git a/crates/goose-server/src/routes/extension.rs b/crates/goose-server/src/routes/extension.rs index 64a941c167c2..39d8f61bbdaf 100644 --- a/crates/goose-server/src/routes/extension.rs +++ b/crates/goose-server/src/routes/extension.rs @@ -1052,7 +1052,8 @@ mod tests { }); // Set the environment variable to point to our mock server - env::set_var("GOOSE_ALLOWLIST", format!("{}{}", server_url, server_path)); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::set_var("GOOSE_ALLOWLIST", format!("{}{}", server_url, server_path)) }; // Give the server a moment to start std::thread::sleep(std::time::Duration::from_millis(100)); @@ -1070,7 +1071,8 @@ mod tests { assert_eq!(extensions.extensions[1].command, "uvx mcp_github"); // Clean up - env::remove_var("GOOSE_ALLOWLIST"); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::remove_var("GOOSE_ALLOWLIST") }; // Wait for the server thread to complete handle.join().unwrap(); @@ -1091,7 +1093,8 @@ mod tests { assert!(!is_command_allowed_with_allowlist(cmd, &allowlist)); // Set the bypass environment variable - env::set_var("GOOSE_ALLOWLIST_BYPASS", "true"); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::set_var("GOOSE_ALLOWLIST_BYPASS", "true") }; // With bypass enabled, any command should be allowed regardless of allowlist assert!(is_command_allowed( @@ -1100,21 +1103,25 @@ mod tests { )); // Test case insensitivity - env::set_var("GOOSE_ALLOWLIST_BYPASS", "TRUE"); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::set_var("GOOSE_ALLOWLIST_BYPASS", "TRUE") }; assert!(is_command_allowed( "uvx", &vec!["unauthorized_command".to_string()] )); // Clean up - env::remove_var("GOOSE_ALLOWLIST_BYPASS"); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::remove_var("GOOSE_ALLOWLIST_BYPASS") }; // Create a mock function to test with allowlist and bypass let test_with_allowlist_and_bypass = |bypass_value: &str, expected: bool| { if bypass_value.is_empty() { - env::remove_var("GOOSE_ALLOWLIST_BYPASS"); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::remove_var("GOOSE_ALLOWLIST_BYPASS") }; } else { - env::set_var("GOOSE_ALLOWLIST_BYPASS", bypass_value); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::set_var("GOOSE_ALLOWLIST_BYPASS", bypass_value) }; } // This is what we're testing - a direct call that simulates what happens in is_command_allowed @@ -1150,6 +1157,7 @@ mod tests { test_with_allowlist_and_bypass("", false); // Final cleanup - env::remove_var("GOOSE_ALLOWLIST_BYPASS"); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::remove_var("GOOSE_ALLOWLIST_BYPASS") }; } } diff --git a/crates/goose/examples/databricks_oauth.rs b/crates/goose/examples/databricks_oauth.rs index bf36d0a6a8e2..5bee6e05f68d 100644 --- a/crates/goose/examples/databricks_oauth.rs +++ b/crates/goose/examples/databricks_oauth.rs @@ -15,7 +15,8 @@ async fn main() -> Result<()> { dotenv().ok(); // Clear any token to force OAuth - std::env::remove_var("DATABRICKS_TOKEN"); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { std::env::remove_var("DATABRICKS_TOKEN") }; // Create the provider let provider = DatabricksProvider::default(); diff --git a/crates/goose/src/agents/tool_vectordb.rs b/crates/goose/src/agents/tool_vectordb.rs index 73e2f703aba5..0635a17ccc85 100644 --- a/crates/goose/src/agents/tool_vectordb.rs +++ b/crates/goose/src/agents/tool_vectordb.rs @@ -526,14 +526,16 @@ mod tests { let custom_path = temp_dir.path().join("custom_vector_db"); // Set the environment variable - env::set_var("GOOSE_VECTOR_DB_PATH", custom_path.to_str().unwrap()); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::set_var("GOOSE_VECTOR_DB_PATH", custom_path.to_str().unwrap()) }; // Test that get_db_path returns the custom path let db_path = ToolVectorDB::get_db_path()?; assert_eq!(db_path, custom_path); // Clean up - env::remove_var("GOOSE_VECTOR_DB_PATH"); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::remove_var("GOOSE_VECTOR_DB_PATH") }; Ok(()) } @@ -544,7 +546,8 @@ mod tests { use std::env; // Test that relative paths are rejected - env::set_var("GOOSE_VECTOR_DB_PATH", "relative/path"); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::set_var("GOOSE_VECTOR_DB_PATH", "relative/path") }; let result = ToolVectorDB::get_db_path(); assert!( @@ -558,7 +561,8 @@ mod tests { .contains("must be an absolute path")); // Clean up - env::remove_var("GOOSE_VECTOR_DB_PATH"); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::remove_var("GOOSE_VECTOR_DB_PATH") }; } #[test] @@ -567,7 +571,8 @@ mod tests { use std::env; // Ensure no custom path is set - env::remove_var("GOOSE_VECTOR_DB_PATH"); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::remove_var("GOOSE_VECTOR_DB_PATH") }; // Test that it falls back to default XDG path let db_path = ToolVectorDB::get_db_path()?; diff --git a/crates/goose/src/config/base.rs b/crates/goose/src/config/base.rs index eabdaf4de6c8..a17ff15ab395 100644 --- a/crates/goose/src/config/base.rs +++ b/crates/goose/src/config/base.rs @@ -779,7 +779,8 @@ mod tests { assert_eq!(value, "test_value"); // Test with environment variable override - std::env::set_var("TEST_KEY", "env_value"); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { std::env::set_var("TEST_KEY", "env_value") }; let value: String = config.get_param("test_key")?; assert_eq!(value, "env_value"); @@ -888,10 +889,12 @@ mod tests { assert_eq!(value, "secret123"); // Test environment variable override - std::env::set_var("API_KEY", "env_secret"); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { std::env::set_var("API_KEY", "env_secret") }; let value: String = config.get_secret("api_key")?; assert_eq!(value, "env_secret"); - std::env::remove_var("API_KEY"); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { std::env::remove_var("API_KEY") }; // Test deleting a secret config.delete_secret("api_key")?; diff --git a/crates/goose/src/context_mgmt/truncate.rs b/crates/goose/src/context_mgmt/truncate.rs index 2bc49f924386..e69548b99522 100644 --- a/crates/goose/src/context_mgmt/truncate.rs +++ b/crates/goose/src/context_mgmt/truncate.rs @@ -89,7 +89,7 @@ fn truncate_message_content(message: &Message, max_content_size: usize) -> Resul MessageContent::ToolResponse(tool_response) => { if let Ok(ref mut result) = tool_response.tool_result { for content_item in result { - if let Content::Text(ref mut text_content) = content_item { + if let Content::Text(text_content) = content_item { if text_content.text.chars().count() > max_content_size { let truncated = format!( "{}\n\n[... tool response truncated from {} to {} characters ...]", @@ -101,7 +101,7 @@ fn truncate_message_content(message: &Message, max_content_size: usize) -> Resul } } // Handle Resource content which might contain large text - else if let Content::Resource(ref mut resource_content) = content_item { + else if let Content::Resource(resource_content) = content_item { if let ResourceContents::TextResourceContents { text, .. } = &mut resource_content.resource { diff --git a/crates/goose/src/message.rs b/crates/goose/src/message.rs index ef207eb1d01c..37b925be0953 100644 --- a/crates/goose/src/message.rs +++ b/crates/goose/src/message.rs @@ -184,7 +184,7 @@ impl MessageContent { // Add this new method to check for summarization requested content pub fn as_summarization_requested(&self) -> Option<&SummarizationRequested> { - if let MessageContent::SummarizationRequested(ref summarization_requested) = self { + if let MessageContent::SummarizationRequested(summarization_requested) = self { Some(summarization_requested) } else { None @@ -192,7 +192,7 @@ impl MessageContent { } pub fn as_tool_request(&self) -> Option<&ToolRequest> { - if let MessageContent::ToolRequest(ref tool_request) = self { + if let MessageContent::ToolRequest(tool_request) = self { Some(tool_request) } else { None @@ -200,7 +200,7 @@ impl MessageContent { } pub fn as_tool_response(&self) -> Option<&ToolResponse> { - if let MessageContent::ToolResponse(ref tool_response) = self { + if let MessageContent::ToolResponse(tool_response) = self { Some(tool_response) } else { None @@ -208,7 +208,7 @@ impl MessageContent { } pub fn as_tool_confirmation_request(&self) -> Option<&ToolConfirmationRequest> { - if let MessageContent::ToolConfirmationRequest(ref tool_confirmation_request) = self { + if let MessageContent::ToolConfirmationRequest(tool_confirmation_request) = self { Some(tool_confirmation_request) } else { None @@ -315,7 +315,7 @@ pub fn push_message(messages: &mut Vec, message: Message) { .filter(|m| m.id.is_some() && m.id == message.id) { match (last.content.last_mut(), message.content.last()) { - (Some(MessageContent::Text(ref mut last)), Some(MessageContent::Text(new))) + (Some(MessageContent::Text(last)), Some(MessageContent::Text(new))) if message.content.len() == 1 => { last.text.push_str(&new.text); diff --git a/crates/goose/src/project/storage.rs b/crates/goose/src/project/storage.rs index ef8e70dc2465..d3d5e6640e2d 100644 --- a/crates/goose/src/project/storage.rs +++ b/crates/goose/src/project/storage.rs @@ -34,7 +34,7 @@ pub fn ensure_project_dir() -> Result { fn generate_project_id() -> String { use rand::Rng; let timestamp = Utc::now().timestamp(); - let random: u32 = rand::thread_rng().gen(); + let random: u32 = rand::thread_rng().r#gen(); format!("proj_{}_{}", timestamp, random) } diff --git a/crates/goose/src/providers/bedrock.rs b/crates/goose/src/providers/bedrock.rs index 31e6cf8b4363..1657385d8eba 100644 --- a/crates/goose/src/providers/bedrock.rs +++ b/crates/goose/src/providers/bedrock.rs @@ -48,7 +48,8 @@ impl BedrockProvider { map.into_iter() .filter(|(key, _)| key.starts_with("AWS_")) .filter_map(|(key, value)| value.as_str().map(|s| (key, s.to_string()))) - .for_each(|(key, s)| std::env::set_var(key, s)); + // TODO: Audit that the environment access only happens in single-threaded code. + .for_each(|(key, s)| unsafe { std::env::set_var(key, s) }); } }; diff --git a/crates/goose/src/providers/databricks.rs b/crates/goose/src/providers/databricks.rs index 99768c1972ae..9ad41042c220 100644 --- a/crates/goose/src/providers/databricks.rs +++ b/crates/goose/src/providers/databricks.rs @@ -554,15 +554,15 @@ impl Provider for DatabricksProvider { if !response.status().is_success() { let status = response.status(); - if let Ok(error_text) = response.text().await { + match response.text().await { Ok(error_text) => { tracing::warn!( "Failed to fetch Databricks models: {} - {}", status, error_text ); - } else { + } _ => { tracing::warn!("Failed to fetch Databricks models: {}", status); - } + }} return Ok(None); // Return None to fall back to manual input } diff --git a/crates/goose/src/providers/factory.rs b/crates/goose/src/providers/factory.rs index e627505b657e..f23b803c04ec 100644 --- a/crates/goose/src/providers/factory.rs +++ b/crates/goose/src/providers/factory.rs @@ -236,7 +236,8 @@ mod tests { let saved_turns = env::var("GOOSE_LEAD_TURNS").ok(); // Test with basic lead model configuration - env::set_var("GOOSE_LEAD_MODEL", "gpt-4o"); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::set_var("GOOSE_LEAD_MODEL", "gpt-4o") }; // This will try to create a lead/worker provider let result = create("openai", ModelConfig::new("gpt-4o-mini".to_string())); @@ -255,24 +256,32 @@ mod tests { } // Test with different lead provider - env::set_var("GOOSE_LEAD_PROVIDER", "anthropic"); - env::set_var("GOOSE_LEAD_TURNS", "5"); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::set_var("GOOSE_LEAD_PROVIDER", "anthropic") }; + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::set_var("GOOSE_LEAD_TURNS", "5") }; let _result = create("openai", ModelConfig::new("gpt-4o-mini".to_string())); // Similar validation as above - will fail due to missing API keys but confirms the logic // Restore env vars match saved_lead { - Some(val) => env::set_var("GOOSE_LEAD_MODEL", val), - None => env::remove_var("GOOSE_LEAD_MODEL"), + // TODO: Audit that the environment access only happens in single-threaded code. + Some(val) => unsafe { env::set_var("GOOSE_LEAD_MODEL", val) }, + // TODO: Audit that the environment access only happens in single-threaded code. + None => unsafe { env::remove_var("GOOSE_LEAD_MODEL") }, } match saved_provider { - Some(val) => env::set_var("GOOSE_LEAD_PROVIDER", val), - None => env::remove_var("GOOSE_LEAD_PROVIDER"), + // TODO: Audit that the environment access only happens in single-threaded code. + Some(val) => unsafe { env::set_var("GOOSE_LEAD_PROVIDER", val) }, + // TODO: Audit that the environment access only happens in single-threaded code. + None => unsafe { env::remove_var("GOOSE_LEAD_PROVIDER") }, } match saved_turns { - Some(val) => env::set_var("GOOSE_LEAD_TURNS", val), - None => env::remove_var("GOOSE_LEAD_TURNS"), + // TODO: Audit that the environment access only happens in single-threaded code. + Some(val) => unsafe { env::set_var("GOOSE_LEAD_TURNS", val) }, + // TODO: Audit that the environment access only happens in single-threaded code. + None => unsafe { env::remove_var("GOOSE_LEAD_TURNS") }, } } @@ -295,11 +304,13 @@ mod tests { // Clear all lead env vars for (key, _) in &saved_vars { - env::remove_var(key); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::remove_var(key) }; } // Set only the required lead model - env::set_var("GOOSE_LEAD_MODEL", "grok-3"); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::set_var("GOOSE_LEAD_MODEL", "grok-3") }; // This should use defaults for all other values let result = create("openai", ModelConfig::new("gpt-4o-mini".to_string())); @@ -317,9 +328,12 @@ mod tests { } // Test with custom values - env::set_var("GOOSE_LEAD_TURNS", "7"); - env::set_var("GOOSE_LEAD_FAILURE_THRESHOLD", "4"); - env::set_var("GOOSE_LEAD_FALLBACK_TURNS", "3"); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::set_var("GOOSE_LEAD_TURNS", "7") }; + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::set_var("GOOSE_LEAD_FAILURE_THRESHOLD", "4") }; + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::set_var("GOOSE_LEAD_FALLBACK_TURNS", "3") }; let _result = create("openai", ModelConfig::new("gpt-4o-mini".to_string())); // Should still attempt to create lead/worker provider with custom settings @@ -327,8 +341,10 @@ mod tests { // Restore all env vars for (key, value) in saved_vars { match value { - Some(val) => env::set_var(key, val), - None => env::remove_var(key), + // TODO: Audit that the environment access only happens in single-threaded code. + Some(val) => unsafe { env::set_var(key, val) }, + // TODO: Audit that the environment access only happens in single-threaded code. + None => unsafe { env::remove_var(key) }, } } } @@ -343,11 +359,16 @@ mod tests { let saved_fallback = env::var("GOOSE_LEAD_FALLBACK_TURNS").ok(); // Ensure all GOOSE_LEAD_* variables are not set - env::remove_var("GOOSE_LEAD_MODEL"); - env::remove_var("GOOSE_LEAD_PROVIDER"); - env::remove_var("GOOSE_LEAD_TURNS"); - env::remove_var("GOOSE_LEAD_FAILURE_THRESHOLD"); - env::remove_var("GOOSE_LEAD_FALLBACK_TURNS"); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::remove_var("GOOSE_LEAD_MODEL") }; + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::remove_var("GOOSE_LEAD_PROVIDER") }; + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::remove_var("GOOSE_LEAD_TURNS") }; + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::remove_var("GOOSE_LEAD_FAILURE_THRESHOLD") }; + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::remove_var("GOOSE_LEAD_FALLBACK_TURNS") }; // This should try to create a regular provider let result = create("openai", ModelConfig::new("gpt-4o-mini".to_string())); @@ -367,19 +388,24 @@ mod tests { // Restore env vars if let Some(val) = saved_lead { - env::set_var("GOOSE_LEAD_MODEL", val); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::set_var("GOOSE_LEAD_MODEL", val) }; } if let Some(val) = saved_provider { - env::set_var("GOOSE_LEAD_PROVIDER", val); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::set_var("GOOSE_LEAD_PROVIDER", val) }; } if let Some(val) = saved_turns { - env::set_var("GOOSE_LEAD_TURNS", val); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::set_var("GOOSE_LEAD_TURNS", val) }; } if let Some(val) = saved_threshold { - env::set_var("GOOSE_LEAD_FAILURE_THRESHOLD", val); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::set_var("GOOSE_LEAD_FAILURE_THRESHOLD", val) }; } if let Some(val) = saved_fallback { - env::set_var("GOOSE_LEAD_FALLBACK_TURNS", val); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::set_var("GOOSE_LEAD_FALLBACK_TURNS", val) }; } } @@ -399,11 +425,13 @@ mod tests { // Clear env vars to ensure clean test for (key, _) in &saved_vars { - env::remove_var(key); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::remove_var(key) }; } // Set up lead model to trigger lead/worker mode - env::set_var("GOOSE_LEAD_MODEL", "gpt-4o"); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::set_var("GOOSE_LEAD_MODEL", "gpt-4o") }; // Create a default model with explicit context_limit let default_model = @@ -413,20 +441,26 @@ mod tests { let result = create_lead_worker_from_env("openai", &default_model, "gpt-4o"); // Test case 2: With GOOSE_WORKER_CONTEXT_LIMIT - should override original - env::set_var("GOOSE_WORKER_CONTEXT_LIMIT", "32000"); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::set_var("GOOSE_WORKER_CONTEXT_LIMIT", "32000") }; let _result = create_lead_worker_from_env("openai", &default_model, "gpt-4o"); - env::remove_var("GOOSE_WORKER_CONTEXT_LIMIT"); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::remove_var("GOOSE_WORKER_CONTEXT_LIMIT") }; // Test case 3: With GOOSE_CONTEXT_LIMIT - should override original - env::set_var("GOOSE_CONTEXT_LIMIT", "64000"); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::set_var("GOOSE_CONTEXT_LIMIT", "64000") }; let _result = create_lead_worker_from_env("openai", &default_model, "gpt-4o"); - env::remove_var("GOOSE_CONTEXT_LIMIT"); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::remove_var("GOOSE_CONTEXT_LIMIT") }; // Restore env vars for (key, value) in saved_vars { match value { - Some(val) => env::set_var(key, val), - None => env::remove_var(key), + // TODO: Audit that the environment access only happens in single-threaded code. + Some(val) => unsafe { env::set_var(key, val) }, + // TODO: Audit that the environment access only happens in single-threaded code. + None => unsafe { env::remove_var(key) }, } } diff --git a/crates/goose/src/providers/formats/anthropic.rs b/crates/goose/src/providers/formats/anthropic.rs index 661d2bce5156..a59e251a76ef 100644 --- a/crates/goose/src/providers/formats/anthropic.rs +++ b/crates/goose/src/providers/formats/anthropic.rs @@ -657,7 +657,8 @@ mod tests { let original_value = std::env::var("CLAUDE_THINKING_ENABLED").ok(); // Set the env var for this test - std::env::set_var("CLAUDE_THINKING_ENABLED", "true"); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { std::env::set_var("CLAUDE_THINKING_ENABLED", "true") }; // Execute the test let result = (|| { @@ -686,8 +687,10 @@ mod tests { // Restore the original env var state match original_value { - Some(val) => std::env::set_var("CLAUDE_THINKING_ENABLED", val), - None => std::env::remove_var("CLAUDE_THINKING_ENABLED"), + // TODO: Audit that the environment access only happens in single-threaded code. + Some(val) => unsafe { std::env::set_var("CLAUDE_THINKING_ENABLED", val) }, + // TODO: Audit that the environment access only happens in single-threaded code. + None => unsafe { std::env::remove_var("CLAUDE_THINKING_ENABLED") }, } // Return the test result diff --git a/crates/goose/src/providers/pricing.rs b/crates/goose/src/providers/pricing.rs index b817907a0e6f..4b25d4cfefb6 100644 --- a/crates/goose/src/providers/pricing.rs +++ b/crates/goose/src/providers/pricing.rs @@ -315,15 +315,15 @@ pub async fn get_all_pricing() -> HashMap> cached.pricing.clone() } else { // Try loading from disk - if let Ok(Some(disk_cache)) = PRICING_CACHE.load_from_disk().await { + match PRICING_CACHE.load_from_disk().await { Ok(Some(disk_cache)) => { // Update memory cache drop(cache); let mut write_cache = PRICING_CACHE.memory_cache.write().await; *write_cache = Some(disk_cache.clone()); disk_cache.pricing - } else { + } _ => { HashMap::new() - } + }} } } diff --git a/crates/goose/src/providers/sagemaker_tgi.rs b/crates/goose/src/providers/sagemaker_tgi.rs index c2ced2a57fde..80d5c5e14be6 100644 --- a/crates/goose/src/providers/sagemaker_tgi.rs +++ b/crates/goose/src/providers/sagemaker_tgi.rs @@ -47,7 +47,8 @@ impl SageMakerTgiProvider { map.into_iter() .filter(|(key, _)| key.starts_with("AWS_")) .filter_map(|(key, value)| value.as_str().map(|s| (key, s.to_string()))) - .for_each(|(key, s)| std::env::set_var(key, s)); + // TODO: Audit that the environment access only happens in single-threaded code. + .for_each(|(key, s)| unsafe { std::env::set_var(key, s) }); } }; diff --git a/crates/goose/src/scheduler.rs b/crates/goose/src/scheduler.rs index bd1aee1295f7..576187bc1357 100644 --- a/crates/goose/src/scheduler.rs +++ b/crates/goose/src/scheduler.rs @@ -1008,15 +1008,15 @@ impl Scheduler { // Abort the running task if it exists { let mut running_tasks_guard = self.running_tasks.lock().await; - if let Some(abort_handle) = running_tasks_guard.remove(sched_id) { + match running_tasks_guard.remove(sched_id) { Some(abort_handle) => { abort_handle.abort(); tracing::info!("Aborted running task for job '{}'", sched_id); - } else { + } _ => { tracing::warn!( "No abort handle found for job '{}' in running tasks map", sched_id ); - } + }} } // Mark the job as no longer running @@ -1395,8 +1395,10 @@ mod tests { #[tokio::test] async fn test_scheduled_session_has_schedule_id() -> Result<(), Box> { // Set environment variables for the test - env::set_var("GOOSE_PROVIDER", "test_provider"); - env::set_var("GOOSE_MODEL", "test_model"); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::set_var("GOOSE_PROVIDER", "test_provider") }; + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::set_var("GOOSE_MODEL", "test_model") }; let temp_dir = tempdir()?; let recipe_dir = temp_dir.path().join("recipes_for_test_scheduler"); @@ -1489,8 +1491,10 @@ mod tests { ); // Clean up environment variables - env::remove_var("GOOSE_PROVIDER"); - env::remove_var("GOOSE_MODEL"); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::remove_var("GOOSE_PROVIDER") }; + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::remove_var("GOOSE_MODEL") }; Ok(()) } diff --git a/crates/goose/src/session/storage.rs b/crates/goose/src/session/storage.rs index ad9d0096947a..d21e53336a88 100644 --- a/crates/goose/src/session/storage.rs +++ b/crates/goose/src/session/storage.rs @@ -698,7 +698,7 @@ fn truncate_message_content_in_place(message: &mut Message, max_content_size: us if let Ok(ref mut result) = tool_response.tool_result { for content_item in result { match content_item { - Content::Text(ref mut text_content) => { + Content::Text(text_content) => { if text_content.text.chars().count() > max_content_size { let truncated = format!( "{}\n\n[... tool response truncated during session loading from {} to {} characters ...]", @@ -709,7 +709,7 @@ fn truncate_message_content_in_place(message: &mut Message, max_content_size: us text_content.text = truncated; } } - Content::Resource(ref mut resource_content) => { + Content::Resource(resource_content) => { if let ResourceContents::TextResourceContents { text, .. } = &mut resource_content.resource { diff --git a/crates/goose/src/tracing/langfuse_layer.rs b/crates/goose/src/tracing/langfuse_layer.rs index 2ac418cf1ab0..e302ee7f12a1 100644 --- a/crates/goose/src/tracing/langfuse_layer.rs +++ b/crates/goose/src/tracing/langfuse_layer.rs @@ -257,9 +257,11 @@ mod tests { "LANGFUSE_URL", ] { if let Some(value) = self.original_env_vars.get(var) { - env::set_var(var, value); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::set_var(var, value) }; } else { - env::remove_var(var); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::remove_var(var) }; } } } @@ -400,7 +402,8 @@ mod tests { "LANGFUSE_INIT_PROJECT_SECRET_KEY", "LANGFUSE_URL", ] { - env::remove_var(var); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::remove_var(var) }; } let observer = create_langfuse_observer(); @@ -410,45 +413,56 @@ mod tests { ); // Test 2: Only public key set (regular) - env::set_var("LANGFUSE_PUBLIC_KEY", "test-public-key"); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::set_var("LANGFUSE_PUBLIC_KEY", "test-public-key") }; let observer = create_langfuse_observer(); assert!( observer.is_none(), "Observer should be None with only public key" ); - env::remove_var("LANGFUSE_PUBLIC_KEY"); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::remove_var("LANGFUSE_PUBLIC_KEY") }; // Test 3: Only secret key set (regular) - env::set_var("LANGFUSE_SECRET_KEY", "test-secret-key"); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::set_var("LANGFUSE_SECRET_KEY", "test-secret-key") }; let observer = create_langfuse_observer(); assert!( observer.is_none(), "Observer should be None with only secret key" ); - env::remove_var("LANGFUSE_SECRET_KEY"); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::remove_var("LANGFUSE_SECRET_KEY") }; // Test 4: Only public key set (init project) - env::set_var("LANGFUSE_INIT_PROJECT_PUBLIC_KEY", "test-public-key"); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::set_var("LANGFUSE_INIT_PROJECT_PUBLIC_KEY", "test-public-key") }; let observer = create_langfuse_observer(); assert!( observer.is_none(), "Observer should be None with only init project public key" ); - env::remove_var("LANGFUSE_INIT_PROJECT_PUBLIC_KEY"); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::remove_var("LANGFUSE_INIT_PROJECT_PUBLIC_KEY") }; // Test 5: Only secret key set (init project) - env::set_var("LANGFUSE_INIT_PROJECT_SECRET_KEY", "test-secret-key"); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::set_var("LANGFUSE_INIT_PROJECT_SECRET_KEY", "test-secret-key") }; let observer = create_langfuse_observer(); assert!( observer.is_none(), "Observer should be None with only init project secret key" ); - env::remove_var("LANGFUSE_INIT_PROJECT_SECRET_KEY"); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::remove_var("LANGFUSE_INIT_PROJECT_SECRET_KEY") }; // Test 6: Both regular keys set (should succeed) - env::set_var("LANGFUSE_PUBLIC_KEY", "test-public-key"); - env::set_var("LANGFUSE_SECRET_KEY", "test-secret-key"); - env::set_var("LANGFUSE_URL", fixture.mock_server_uri()); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::set_var("LANGFUSE_PUBLIC_KEY", "test-public-key") }; + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::set_var("LANGFUSE_SECRET_KEY", "test-secret-key") }; + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::set_var("LANGFUSE_URL", fixture.mock_server_uri()) }; let observer = create_langfuse_observer(); assert!( observer.is_some(), @@ -456,12 +470,16 @@ mod tests { ); // Clean up regular keys - env::remove_var("LANGFUSE_PUBLIC_KEY"); - env::remove_var("LANGFUSE_SECRET_KEY"); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::remove_var("LANGFUSE_PUBLIC_KEY") }; + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::remove_var("LANGFUSE_SECRET_KEY") }; // Test 7: Both init project keys set (should succeed) - env::set_var("LANGFUSE_INIT_PROJECT_PUBLIC_KEY", "test-public-key"); - env::set_var("LANGFUSE_INIT_PROJECT_SECRET_KEY", "test-secret-key"); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::set_var("LANGFUSE_INIT_PROJECT_PUBLIC_KEY", "test-public-key") }; + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { env::set_var("LANGFUSE_INIT_PROJECT_SECRET_KEY", "test-secret-key") }; let observer = create_langfuse_observer(); assert!( observer.is_some(), diff --git a/crates/goose/tests/agent.rs b/crates/goose/tests/agent.rs index 837a433c0f99..b7f19e53aded 100644 --- a/crates/goose/tests/agent.rs +++ b/crates/goose/tests/agent.rs @@ -841,7 +841,7 @@ mod max_turns_tests { while let Some(response_result) = reply_stream.next().await { match response_result { Ok(AgentEvent::Message(response)) => { - if let Some(MessageContent::ToolConfirmationRequest(ref req)) = + if let Some(MessageContent::ToolConfirmationRequest(req)) = response.content.first() { agent.handle_confirmation( diff --git a/crates/goose/tests/providers.rs b/crates/goose/tests/providers.rs index c4884b7c437b..b5b8a434312c 100644 --- a/crates/goose/tests/providers.rs +++ b/crates/goose/tests/providers.rs @@ -398,8 +398,10 @@ where if let Some(mods) = &env_modifications { for (&var, value) in mods.iter() { match value { - Some(val) => std::env::set_var(var, val), - None => std::env::remove_var(var), + // TODO: Audit that the environment access only happens in single-threaded code. + Some(val) => unsafe { std::env::set_var(var, val) }, + // TODO: Audit that the environment access only happens in single-threaded code. + None => unsafe { std::env::remove_var(var) }, } } } @@ -416,12 +418,14 @@ where // Restore original environment for (&var, value) in original_env.iter() { - std::env::set_var(var, value); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { std::env::set_var(var, value) }; } if let Some(mods) = env_modifications { for &var in mods.keys() { if !original_env.contains_key(var) { - std::env::remove_var(var); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { std::env::remove_var(var) }; } } } diff --git a/crates/mcp-client/src/transport/sse.rs b/crates/mcp-client/src/transport/sse.rs index 7a38aca9100c..81ad1484a03b 100644 --- a/crates/mcp-client/src/transport/sse.rs +++ b/crates/mcp-client/src/transport/sse.rs @@ -241,7 +241,8 @@ impl Transport for SseTransport { async fn start(&self) -> Result { // Set environment variables for (key, value) in &self.env { - std::env::set_var(key, value); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { std::env::set_var(key, value) }; } // Create a channel for outgoing TransportMessages diff --git a/crates/mcp-client/src/transport/streamable_http.rs b/crates/mcp-client/src/transport/streamable_http.rs index 7b39218b25a1..e7da69eccfc9 100644 --- a/crates/mcp-client/src/transport/streamable_http.rs +++ b/crates/mcp-client/src/transport/streamable_http.rs @@ -65,7 +65,8 @@ impl StreamableHttpActor { pub async fn run(mut self) { // Set environment variables for (key, value) in &self.env { - std::env::set_var(key, value); + // TODO: Audit that the environment access only happens in single-threaded code. + unsafe { std::env::set_var(key, value) }; } // Handle outgoing messages From e8752b05049b72682cea4e5bc69572ec26d00c1d Mon Sep 17 00:00:00 2001 From: Jack Amadeo Date: Wed, 16 Jul 2025 16:18:16 -0400 Subject: [PATCH 3/7] Update edition --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index a386d2647d34..ab19e6ec118f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,7 @@ members = ["crates/*"] resolver = "2" [workspace.package] -edition = "2021" +edition = "2024" version = "1.0.36" authors = ["Block "] license = "Apache-2.0" From 25c48e2965327b607aa29e5c7981db5e3607b914 Mon Sep 17 00:00:00 2001 From: Jack Amadeo Date: Wed, 16 Jul 2025 16:31:05 -0400 Subject: [PATCH 4/7] REVERT ME: don't break the build when we fail bindings gen --- crates/goose-ffi/build.rs | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/crates/goose-ffi/build.rs b/crates/goose-ffi/build.rs index a26c3409cdf4..46a8a8a5e29f 100644 --- a/crates/goose-ffi/build.rs +++ b/crates/goose-ffi/build.rs @@ -33,15 +33,21 @@ fn main() { ..Default::default() }; - let bindings = cbindgen::Builder::new() + let out_path = PathBuf::from(&crate_dir).join("include"); + std::fs::create_dir_all(&out_path).expect("Failed to create include directory"); + cbindgen::Builder::new() .with_crate(&crate_dir) .with_config(config) .generate() - .expect("Unable to generate bindings"); - - let out_path = PathBuf::from(&crate_dir).join("include"); - std::fs::create_dir_all(&out_path).expect("Failed to create include directory"); - bindings.write_to_file(out_path.join("goose_ffi.h")); + .map_or_else( + |error| match error { + cbindgen::Error::ParseSyntaxError { .. } => {} + e => panic!("{:?}", e), + }, + |bindings| { + bindings.write_to_file(out_path.join("goose_ffi.h")); + }, + ); println!("cargo:rerun-if-changed=src/lib.rs"); println!("cargo:rerun-if-changed=build.rs"); From ee9c7b17c3adeb995c4c0302fe26785cc1fa82c8 Mon Sep 17 00:00:00 2001 From: Jack Amadeo Date: Wed, 16 Jul 2025 16:37:02 -0400 Subject: [PATCH 5/7] Cargo fmt --- crates/goose-bench/src/bench_work_dir.rs | 10 +- crates/goose-bench/src/error_capture.rs | 2 +- .../core/computercontroller/script.rs | 4 +- .../core/computercontroller/web_scrape.rs | 4 +- .../eval_suites/core/developer/create_file.rs | 4 +- .../eval_suites/core/developer/list_files.rs | 4 +- .../core/developer/simple_repo_clone_test.rs | 4 +- .../eval_suites/core/developer_image/image.rs | 4 +- .../search_replace.rs | 6 +- .../src/eval_suites/core/memory/save_fact.rs | 4 +- crates/goose-bench/src/eval_suites/mod.rs | 2 +- .../src/eval_suites/vibes/blog_summary.rs | 4 +- .../src/eval_suites/vibes/flappy_bird.rs | 4 +- .../src/eval_suites/vibes/goose_wiki.rs | 4 +- .../eval_suites/vibes/restaurant_research.rs | 4 +- .../src/eval_suites/vibes/squirrel_census.rs | 4 +- .../goose-bench/src/runners/bench_runner.rs | 8 +- crates/goose-bench/src/runners/eval_runner.rs | 155 ++++----- .../src/runners/metric_aggregator.rs | 2 +- crates/goose-cli/src/cli.rs | 6 +- crates/goose-cli/src/commands/bench.rs | 4 +- crates/goose-cli/src/commands/configure.rs | 69 ++-- crates/goose-cli/src/commands/info.rs | 2 +- crates/goose-cli/src/commands/mcp.rs | 6 +- crates/goose-cli/src/commands/recipe.rs | 16 +- crates/goose-cli/src/commands/schedule.rs | 12 +- crates/goose-cli/src/commands/session.rs | 2 +- crates/goose-cli/src/commands/web.rs | 4 +- crates/goose-cli/src/logging.rs | 6 +- crates/goose-cli/src/project_tracker.rs | 2 +- .../goose-cli/src/recipes/extract_from_cli.rs | 2 +- crates/goose-cli/src/recipes/github_recipe.rs | 6 +- crates/goose-cli/src/recipes/recipe.rs | 7 +- crates/goose-cli/src/recipes/recipe/tests.rs | 18 +- crates/goose-cli/src/recipes/search_recipe.rs | 6 +- crates/goose-cli/src/session/builder.rs | 7 +- crates/goose-cli/src/session/mod.rs | 17 +- crates/goose-cli/src/session/output.rs | 2 +- crates/goose-ffi/src/lib.rs | 236 ++++++------- crates/goose-llm/examples/image.rs | 5 +- crates/goose-llm/examples/prompt_override.rs | 3 +- crates/goose-llm/examples/simple.rs | 3 +- .../goose-llm/src/extractors/session_name.rs | 2 +- crates/goose-llm/src/extractors/tooltip.rs | 2 +- .../goose-llm/src/message/message_content.rs | 2 +- crates/goose-llm/src/message/mod.rs | 2 +- .../src/message/tool_result_serde.rs | 2 +- crates/goose-llm/src/prompt_template.rs | 2 +- crates/goose-llm/src/providers/databricks.rs | 6 +- .../src/providers/formats/databricks.rs | 34 +- .../goose-llm/src/providers/formats/openai.rs | 34 +- crates/goose-llm/src/providers/openai.rs | 6 +- crates/goose-llm/src/providers/utils.rs | 2 +- crates/goose-llm/src/structured_outputs.rs | 4 +- crates/goose-llm/tests/providers_extract.rs | 10 +- .../goose-mcp/src/computercontroller/mod.rs | 76 ++--- .../src/computercontroller/pdf_tool.rs | 9 +- .../editor_models/morphllm_editor.rs | 2 +- .../editor_models/openai_compatible_editor.rs | 2 +- .../developer/editor_models/relace_editor.rs | 2 +- crates/goose-mcp/src/developer/mod.rs | 52 +-- crates/goose-mcp/src/google_drive/mod.rs | 314 ++++++++++-------- .../goose-mcp/src/google_drive/oauth_pkce.rs | 4 +- crates/goose-mcp/src/google_drive/storage.rs | 2 +- crates/goose-mcp/src/jetbrains/mod.rs | 6 +- crates/goose-mcp/src/jetbrains/proxy.rs | 2 +- crates/goose-mcp/src/memory/mod.rs | 10 +- crates/goose-mcp/src/tutorial/mod.rs | 8 +- crates/goose-server/src/commands/agent.rs | 2 +- crates/goose-server/src/configuration.rs | 2 +- crates/goose-server/src/logging.rs | 29 +- crates/goose-server/src/openapi.rs | 6 +- crates/goose-server/src/routes/agent.rs | 2 +- crates/goose-server/src/routes/audio.rs | 4 +- .../src/routes/config_management.rs | 8 +- crates/goose-server/src/routes/context.rs | 2 +- crates/goose-server/src/routes/extension.rs | 4 +- crates/goose-server/src/routes/health.rs | 2 +- crates/goose-server/src/routes/project.rs | 2 +- crates/goose-server/src/routes/recipe.rs | 2 +- crates/goose-server/src/routes/reply.rs | 10 +- crates/goose-server/src/routes/schedule.rs | 2 +- crates/goose-server/src/routes/session.rs | 4 +- crates/goose-server/tests/pricing_api_test.rs | 2 +- .../goose/benches/tokenization_benchmark.rs | 2 +- crates/goose/examples/agent.rs | 6 +- .../examples/async_token_counter_demo.rs | 2 +- crates/goose/examples/image_tool.rs | 2 +- crates/goose/src/agents/agent.rs | 26 +- crates/goose/src/agents/context.rs | 18 +- crates/goose/src/agents/extension_manager.rs | 41 ++- crates/goose/src/agents/final_output_tool.rs | 5 +- .../src/agents/large_response_handler.rs | 19 +- .../agents/recipe_tools/sub_recipe_tools.rs | 2 +- crates/goose/src/agents/reply_parts.rs | 6 +- crates/goose/src/agents/schedule_tool.rs | 9 +- .../sub_recipe_execution_tool/executor.rs | 4 +- .../sub_recipe_execute_task_tool.rs | 2 +- .../sub_recipe_execution_tool/workers.rs | 4 +- crates/goose/src/agents/sub_recipe_manager.rs | 2 +- crates/goose/src/agents/subagent.rs | 4 +- crates/goose/src/agents/subagent_handler.rs | 2 +- crates/goose/src/agents/subagent_manager.rs | 4 +- crates/goose/src/agents/tool_execution.rs | 4 +- .../src/agents/tool_router_index_manager.rs | 2 +- crates/goose/src/agents/tool_vectordb.rs | 10 +- crates/goose/src/agents/types.rs | 2 +- crates/goose/src/config/base.rs | 9 +- crates/goose/src/config/mod.rs | 2 +- crates/goose/src/config/permission.rs | 10 +- crates/goose/src/context_mgmt/summarize.rs | 2 +- crates/goose/src/context_mgmt/truncate.rs | 7 +- crates/goose/src/message.rs | 2 +- .../goose/src/permission/permission_judge.rs | 16 +- .../goose/src/permission/permission_store.rs | 2 +- crates/goose/src/project/storage.rs | 4 +- crates/goose/src/prompt_template.rs | 2 +- crates/goose/src/providers/anthropic.rs | 52 ++- crates/goose/src/providers/azure.rs | 2 +- crates/goose/src/providers/bedrock.rs | 2 +- crates/goose/src/providers/claude_code.rs | 4 +- crates/goose/src/providers/databricks.rs | 23 +- crates/goose/src/providers/factory.rs | 2 +- .../goose/src/providers/formats/anthropic.rs | 12 +- crates/goose/src/providers/formats/bedrock.rs | 4 +- .../goose/src/providers/formats/databricks.rs | 46 +-- crates/goose/src/providers/formats/google.rs | 4 +- crates/goose/src/providers/formats/openai.rs | 46 +-- .../goose/src/providers/formats/snowflake.rs | 4 +- crates/goose/src/providers/gcpauth.rs | 2 +- crates/goose/src/providers/gcpvertexai.rs | 4 +- crates/goose/src/providers/gemini_cli.rs | 2 +- crates/goose/src/providers/githubcopilot.rs | 6 +- crates/goose/src/providers/groq.rs | 29 +- crates/goose/src/providers/lead_worker.rs | 17 +- crates/goose/src/providers/oauth.rs | 8 +- crates/goose/src/providers/openai.rs | 4 +- crates/goose/src/providers/openrouter.rs | 16 +- crates/goose/src/providers/pricing.rs | 19 +- crates/goose/src/providers/sagemaker_tgi.rs | 2 +- crates/goose/src/providers/snowflake.rs | 6 +- crates/goose/src/providers/toolshim.rs | 7 +- crates/goose/src/providers/utils.rs | 113 +++++-- crates/goose/src/providers/venice.rs | 18 +- crates/goose/src/providers/xai.rs | 29 +- crates/goose/src/scheduler.rs | 41 ++- crates/goose/src/scheduler_trait.rs | 2 +- crates/goose/src/session/mod.rs | 10 +- crates/goose/src/session/storage.rs | 2 +- crates/goose/src/temporal_scheduler.rs | 2 +- crates/goose/src/tracing/langfuse_layer.rs | 2 +- crates/goose/src/tracing/mod.rs | 4 +- crates/goose/src/tracing/observation_layer.rs | 6 +- crates/goose/tests/agent.rs | 33 +- crates/goose/tests/private_tests.rs | 74 +++-- crates/goose/tests/providers.rs | 2 +- 156 files changed, 1270 insertions(+), 979 deletions(-) diff --git a/crates/goose-bench/src/bench_work_dir.rs b/crates/goose-bench/src/bench_work_dir.rs index 9729af49812d..782e579210db 100644 --- a/crates/goose-bench/src/bench_work_dir.rs +++ b/crates/goose-bench/src/bench_work_dir.rs @@ -1,6 +1,6 @@ use anyhow::Context; use chrono::Local; -use include_dir::{include_dir, Dir}; +use include_dir::{Dir, include_dir}; use serde::{Deserialize, Serialize}; use std::fs; use std::io; @@ -141,7 +141,9 @@ impl BenchmarkWorkDir { use std::path::Component; match first { - Component::ParentDir => Err(anyhow::anyhow!("RelativePathBaseError: Only paths relative to the current working directory are supported.")), + Component::ParentDir => Err(anyhow::anyhow!( + "RelativePathBaseError: Only paths relative to the current working directory are supported." + )), // If first component is "." Component::CurDir => Ok(components.collect()), // Otherwise, keep the full path @@ -168,7 +170,9 @@ impl BenchmarkWorkDir { } if p.is_absolute() { - return Err(anyhow::anyhow!("AbsolutePathError: Only paths relative to the current working directory are supported.")); + return Err(anyhow::anyhow!( + "AbsolutePathError: Only paths relative to the current working directory are supported." + )); } let asset_rel_path = Self::chop_relative_base(p.clone()) diff --git a/crates/goose-bench/src/error_capture.rs b/crates/goose-bench/src/error_capture.rs index ace9daf0c512..6c5d86454f00 100644 --- a/crates/goose-bench/src/error_capture.rs +++ b/crates/goose-bench/src/error_capture.rs @@ -5,8 +5,8 @@ use std::sync::Arc; use std::sync::RwLock; use tokio::sync::Mutex; use tracing::{Event, Subscriber}; -use tracing_subscriber::layer::Context; use tracing_subscriber::Layer; +use tracing_subscriber::layer::Context; // Type alias to reduce complexity type ErrorRegistry = RwLock>>>>; diff --git a/crates/goose-bench/src/eval_suites/core/computercontroller/script.rs b/crates/goose-bench/src/eval_suites/core/computercontroller/script.rs index 4b92805fbde4..b299086390ad 100644 --- a/crates/goose-bench/src/eval_suites/core/computercontroller/script.rs +++ b/crates/goose-bench/src/eval_suites/core/computercontroller/script.rs @@ -3,8 +3,8 @@ use crate::bench_session::BenchAgent; use crate::bench_work_dir::BenchmarkWorkDir; use crate::eval_suites::{ - collect_baseline_metrics, metrics_hashmap_to_vec, EvalMetricValue, Evaluation, - ExtensionRequirements, + EvalMetricValue, Evaluation, ExtensionRequirements, collect_baseline_metrics, + metrics_hashmap_to_vec, }; use crate::register_evaluation; use async_trait::async_trait; diff --git a/crates/goose-bench/src/eval_suites/core/computercontroller/web_scrape.rs b/crates/goose-bench/src/eval_suites/core/computercontroller/web_scrape.rs index 60b3c205200e..0ba9db3bca5b 100644 --- a/crates/goose-bench/src/eval_suites/core/computercontroller/web_scrape.rs +++ b/crates/goose-bench/src/eval_suites/core/computercontroller/web_scrape.rs @@ -3,8 +3,8 @@ use crate::bench_session::BenchAgent; use crate::bench_work_dir::BenchmarkWorkDir; use crate::eval_suites::{ - collect_baseline_metrics, metrics_hashmap_to_vec, EvalMetricValue, Evaluation, - ExtensionRequirements, + EvalMetricValue, Evaluation, ExtensionRequirements, collect_baseline_metrics, + metrics_hashmap_to_vec, }; use crate::register_evaluation; use async_trait::async_trait; diff --git a/crates/goose-bench/src/eval_suites/core/developer/create_file.rs b/crates/goose-bench/src/eval_suites/core/developer/create_file.rs index 5cfe895d0d66..63ff40cc049f 100644 --- a/crates/goose-bench/src/eval_suites/core/developer/create_file.rs +++ b/crates/goose-bench/src/eval_suites/core/developer/create_file.rs @@ -3,8 +3,8 @@ use crate::bench_session::BenchAgent; use crate::bench_work_dir::BenchmarkWorkDir; use crate::eval_suites::{ - collect_baseline_metrics, metrics_hashmap_to_vec, EvalMetricValue, Evaluation, - ExtensionRequirements, + EvalMetricValue, Evaluation, ExtensionRequirements, collect_baseline_metrics, + metrics_hashmap_to_vec, }; use crate::register_evaluation; use async_trait::async_trait; diff --git a/crates/goose-bench/src/eval_suites/core/developer/list_files.rs b/crates/goose-bench/src/eval_suites/core/developer/list_files.rs index 8881b690d4b3..93bd792bc893 100644 --- a/crates/goose-bench/src/eval_suites/core/developer/list_files.rs +++ b/crates/goose-bench/src/eval_suites/core/developer/list_files.rs @@ -1,8 +1,8 @@ use crate::bench_session::BenchAgent; use crate::bench_work_dir::BenchmarkWorkDir; use crate::eval_suites::{ - collect_baseline_metrics, metrics_hashmap_to_vec, EvalMetricValue, Evaluation, - ExtensionRequirements, + EvalMetricValue, Evaluation, ExtensionRequirements, collect_baseline_metrics, + metrics_hashmap_to_vec, }; use crate::register_evaluation; use async_trait::async_trait; diff --git a/crates/goose-bench/src/eval_suites/core/developer/simple_repo_clone_test.rs b/crates/goose-bench/src/eval_suites/core/developer/simple_repo_clone_test.rs index dd280fbf380d..72ae889b4655 100644 --- a/crates/goose-bench/src/eval_suites/core/developer/simple_repo_clone_test.rs +++ b/crates/goose-bench/src/eval_suites/core/developer/simple_repo_clone_test.rs @@ -1,8 +1,8 @@ use crate::bench_session::BenchAgent; use crate::bench_work_dir::BenchmarkWorkDir; use crate::eval_suites::{ - collect_baseline_metrics, metrics_hashmap_to_vec, EvalMetricValue, Evaluation, - ExtensionRequirements, + EvalMetricValue, Evaluation, ExtensionRequirements, collect_baseline_metrics, + metrics_hashmap_to_vec, }; use crate::register_evaluation; use async_trait::async_trait; diff --git a/crates/goose-bench/src/eval_suites/core/developer_image/image.rs b/crates/goose-bench/src/eval_suites/core/developer_image/image.rs index 34e43496cd51..8abfdf0232ff 100644 --- a/crates/goose-bench/src/eval_suites/core/developer_image/image.rs +++ b/crates/goose-bench/src/eval_suites/core/developer_image/image.rs @@ -1,8 +1,8 @@ use crate::bench_session::BenchAgent; use crate::bench_work_dir::BenchmarkWorkDir; use crate::eval_suites::{ - collect_baseline_metrics, metrics_hashmap_to_vec, EvalMetricValue, Evaluation, - ExtensionRequirements, + EvalMetricValue, Evaluation, ExtensionRequirements, collect_baseline_metrics, + metrics_hashmap_to_vec, }; use crate::register_evaluation; use async_trait::async_trait; diff --git a/crates/goose-bench/src/eval_suites/core/developer_search_replace/search_replace.rs b/crates/goose-bench/src/eval_suites/core/developer_search_replace/search_replace.rs index 8a3deb3ea678..d4daf3e7d6fb 100644 --- a/crates/goose-bench/src/eval_suites/core/developer_search_replace/search_replace.rs +++ b/crates/goose-bench/src/eval_suites/core/developer_search_replace/search_replace.rs @@ -1,8 +1,8 @@ use crate::bench_session::BenchAgent; use crate::bench_work_dir::BenchmarkWorkDir; use crate::eval_suites::{ - collect_baseline_metrics, metrics_hashmap_to_vec, EvalMetricValue, Evaluation, - ExtensionRequirements, + EvalMetricValue, Evaluation, ExtensionRequirements, collect_baseline_metrics, + metrics_hashmap_to_vec, }; use crate::register_evaluation; use async_trait::async_trait; @@ -29,7 +29,7 @@ impl Evaluation for DeveloperSearchReplace { Err(_) => { return Err(anyhow::anyhow!( "Could not find kubernetes_swagger.json file" - )) + )); } }; let mut source_file = run_loc.base_path.clone(); diff --git a/crates/goose-bench/src/eval_suites/core/memory/save_fact.rs b/crates/goose-bench/src/eval_suites/core/memory/save_fact.rs index 91bebeea228c..e3631f2d90dc 100644 --- a/crates/goose-bench/src/eval_suites/core/memory/save_fact.rs +++ b/crates/goose-bench/src/eval_suites/core/memory/save_fact.rs @@ -3,8 +3,8 @@ use crate::bench_session::BenchAgent; use crate::bench_work_dir::BenchmarkWorkDir; use crate::eval_suites::{ - collect_baseline_metrics, metrics_hashmap_to_vec, EvalMetricValue, Evaluation, - ExtensionRequirements, + EvalMetricValue, Evaluation, ExtensionRequirements, collect_baseline_metrics, + metrics_hashmap_to_vec, }; use crate::register_evaluation; use async_trait::async_trait; diff --git a/crates/goose-bench/src/eval_suites/mod.rs b/crates/goose-bench/src/eval_suites/mod.rs index 148d04eef691..8afdba1c21c7 100644 --- a/crates/goose-bench/src/eval_suites/mod.rs +++ b/crates/goose-bench/src/eval_suites/mod.rs @@ -6,6 +6,6 @@ mod utils; mod vibes; pub use evaluation::*; -pub use factory::{register_eval, EvaluationSuite}; +pub use factory::{EvaluationSuite, register_eval}; pub use metrics::*; pub use utils::*; diff --git a/crates/goose-bench/src/eval_suites/vibes/blog_summary.rs b/crates/goose-bench/src/eval_suites/vibes/blog_summary.rs index de2f22ef0b34..88f258eb2f04 100644 --- a/crates/goose-bench/src/eval_suites/vibes/blog_summary.rs +++ b/crates/goose-bench/src/eval_suites/vibes/blog_summary.rs @@ -1,8 +1,8 @@ use crate::bench_session::BenchAgent; use crate::bench_work_dir::BenchmarkWorkDir; use crate::eval_suites::{ - collect_baseline_metrics, metrics_hashmap_to_vec, write_response_to_file, EvalMetricValue, - Evaluation, ExtensionRequirements, + EvalMetricValue, Evaluation, ExtensionRequirements, collect_baseline_metrics, + metrics_hashmap_to_vec, write_response_to_file, }; use crate::register_evaluation; use async_trait::async_trait; diff --git a/crates/goose-bench/src/eval_suites/vibes/flappy_bird.rs b/crates/goose-bench/src/eval_suites/vibes/flappy_bird.rs index 9cbca88a022f..b54f8f24d153 100644 --- a/crates/goose-bench/src/eval_suites/vibes/flappy_bird.rs +++ b/crates/goose-bench/src/eval_suites/vibes/flappy_bird.rs @@ -1,8 +1,8 @@ use crate::bench_session::BenchAgent; use crate::bench_work_dir::BenchmarkWorkDir; use crate::eval_suites::{ - collect_baseline_metrics, metrics_hashmap_to_vec, EvalMetricValue, Evaluation, - ExtensionRequirements, + EvalMetricValue, Evaluation, ExtensionRequirements, collect_baseline_metrics, + metrics_hashmap_to_vec, }; use crate::register_evaluation; use async_trait::async_trait; diff --git a/crates/goose-bench/src/eval_suites/vibes/goose_wiki.rs b/crates/goose-bench/src/eval_suites/vibes/goose_wiki.rs index 480989e9d0ba..f6dd35c8a897 100644 --- a/crates/goose-bench/src/eval_suites/vibes/goose_wiki.rs +++ b/crates/goose-bench/src/eval_suites/vibes/goose_wiki.rs @@ -1,8 +1,8 @@ use crate::bench_session::BenchAgent; use crate::bench_work_dir::BenchmarkWorkDir; use crate::eval_suites::{ - collect_baseline_metrics, metrics_hashmap_to_vec, EvalMetricValue, Evaluation, - ExtensionRequirements, + EvalMetricValue, Evaluation, ExtensionRequirements, collect_baseline_metrics, + metrics_hashmap_to_vec, }; use crate::register_evaluation; use async_trait::async_trait; diff --git a/crates/goose-bench/src/eval_suites/vibes/restaurant_research.rs b/crates/goose-bench/src/eval_suites/vibes/restaurant_research.rs index 5d6a55736b19..1ae7915de759 100644 --- a/crates/goose-bench/src/eval_suites/vibes/restaurant_research.rs +++ b/crates/goose-bench/src/eval_suites/vibes/restaurant_research.rs @@ -1,8 +1,8 @@ use crate::bench_session::BenchAgent; use crate::bench_work_dir::BenchmarkWorkDir; use crate::eval_suites::{ - collect_baseline_metrics, metrics_hashmap_to_vec, write_response_to_file, EvalMetricValue, - Evaluation, ExtensionRequirements, + EvalMetricValue, Evaluation, ExtensionRequirements, collect_baseline_metrics, + metrics_hashmap_to_vec, write_response_to_file, }; use crate::register_evaluation; use async_trait::async_trait; diff --git a/crates/goose-bench/src/eval_suites/vibes/squirrel_census.rs b/crates/goose-bench/src/eval_suites/vibes/squirrel_census.rs index 84062b721dce..3875582bcc5d 100644 --- a/crates/goose-bench/src/eval_suites/vibes/squirrel_census.rs +++ b/crates/goose-bench/src/eval_suites/vibes/squirrel_census.rs @@ -1,8 +1,8 @@ use crate::bench_session::BenchAgent; use crate::bench_work_dir::BenchmarkWorkDir; use crate::eval_suites::{ - collect_baseline_metrics, metrics_hashmap_to_vec, EvalMetricValue, Evaluation, - ExtensionRequirements, + EvalMetricValue, Evaluation, ExtensionRequirements, collect_baseline_metrics, + metrics_hashmap_to_vec, }; use crate::register_evaluation; use async_trait::async_trait; diff --git a/crates/goose-bench/src/runners/bench_runner.rs b/crates/goose-bench/src/runners/bench_runner.rs index a48620e67085..0797a7393cf4 100644 --- a/crates/goose-bench/src/runners/bench_runner.rs +++ b/crates/goose-bench/src/runners/bench_runner.rs @@ -19,10 +19,10 @@ impl BenchRunner { Some(path) => { if !path.is_absolute() { anyhow::bail!( - "Config Error in '{}': 'output_dir' must be an absolute path, but found relative path: {}", - config_path.display(), - path.display() - ); + "Config Error in '{}': 'output_dir' must be an absolute path, but found relative path: {}", + config_path.display(), + path.display() + ); } path.clone() } diff --git a/crates/goose-bench/src/runners/eval_runner.rs b/crates/goose-bench/src/runners/eval_runner.rs index 57e818750715..277cc845ce0b 100644 --- a/crates/goose-bench/src/runners/eval_runner.rs +++ b/crates/goose-bench/src/runners/eval_runner.rs @@ -4,7 +4,7 @@ use crate::bench_work_dir::BenchmarkWorkDir; use crate::eval_suites::{EvaluationSuite, ExtensionRequirements}; use crate::reporting::EvaluationResult; use crate::utilities::await_process_exits; -use anyhow::{bail, Context, Result}; +use anyhow::{Context, Result, bail}; use std::env; use std::fs; use std::future::Future; @@ -81,95 +81,98 @@ impl EvalRunner { work_dir.set_eval(&bench_eval.selector, run_id); tracing::info!("Set evaluation directory for {}", bench_eval.selector); - match EvaluationSuite::from(&bench_eval.selector) { Some(eval) => { - let now_stamp = SystemTime::now() - .duration_since(UNIX_EPOCH) - .context("Failed to get current timestamp")? - .as_nanos(); - - let session_id = format!("{}-{}", bench_eval.selector.clone(), now_stamp); - let mut agent = agent_generator(eval.required_extensions(), session_id).await; - tracing::info!("Agent created for {}", eval.name()); - - let mut result = EvaluationResult::new(eval.name().to_string()); - - match eval.run(&mut agent, &mut work_dir).await { - Ok(metrics) => { - tracing::info!("Evaluation run successful with {} metrics", metrics.len()); - for (name, metric) in metrics { - result.add_metric(name, metric); + match EvaluationSuite::from(&bench_eval.selector) { + Some(eval) => { + let now_stamp = SystemTime::now() + .duration_since(UNIX_EPOCH) + .context("Failed to get current timestamp")? + .as_nanos(); + + let session_id = format!("{}-{}", bench_eval.selector.clone(), now_stamp); + let mut agent = agent_generator(eval.required_extensions(), session_id).await; + tracing::info!("Agent created for {}", eval.name()); + + let mut result = EvaluationResult::new(eval.name().to_string()); + + match eval.run(&mut agent, &mut work_dir).await { + Ok(metrics) => { + tracing::info!("Evaluation run successful with {} metrics", metrics.len()); + for (name, metric) in metrics { + result.add_metric(name, metric); + } + } + Err(e) => { + tracing::error!("Evaluation run failed: {}", e); } } - Err(e) => { - tracing::error!("Evaluation run failed: {}", e); + + // Add any errors that occurred + let errors = agent.get_errors().await; + tracing::info!("Agent reported {} errors", errors.len()); + for error in errors { + result.add_error(error); } - } - // Add any errors that occurred - let errors = agent.get_errors().await; - tracing::info!("Agent reported {} errors", errors.len()); - for error in errors { - result.add_error(error); - } + // Write results to file + let eval_results = serde_json::to_string_pretty(&result) + .context("Failed to serialize evaluation results to JSON")?; - // Write results to file - let eval_results = serde_json::to_string_pretty(&result) - .context("Failed to serialize evaluation results to JSON")?; + let eval_results_file = env::current_dir() + .context("Failed to get current directory")? + .join(&self.config.eval_result_filename); - let eval_results_file = env::current_dir() - .context("Failed to get current directory")? - .join(&self.config.eval_result_filename); + fs::write(&eval_results_file, &eval_results).with_context(|| { + format!( + "Failed to write evaluation results to {}", + eval_results_file.display() + ) + })?; - fs::write(&eval_results_file, &eval_results).with_context(|| { - format!( - "Failed to write evaluation results to {}", + tracing::info!( + "Wrote evaluation results to {}", eval_results_file.display() - ) - })?; + ); - tracing::info!( - "Wrote evaluation results to {}", - eval_results_file.display() - ); + self.config.save("config.cfg".to_string()); + work_dir.save(); - self.config.save("config.cfg".to_string()); - work_dir.save(); + // handle running post-process cmd if configured + if let Some(cmd) = &bench_eval.post_process_cmd { + tracing::info!("Running post-process command: {:?}", cmd); - // handle running post-process cmd if configured - if let Some(cmd) = &bench_eval.post_process_cmd { - tracing::info!("Running post-process command: {:?}", cmd); + let handle = Command::new(cmd) + .arg(&eval_results_file) + .spawn() + .with_context(|| { + format!("Failed to execute post-process command: {:?}", cmd) + })?; - let handle = Command::new(cmd) - .arg(&eval_results_file) - .spawn() - .with_context(|| { - format!("Failed to execute post-process command: {:?}", cmd) - })?; + await_process_exits(&mut [handle], Vec::new()); + } - await_process_exits(&mut [handle], Vec::new()); - } + // copy session file into eval-dir + let here = env::current_dir() + .context("Failed to get current directory")? + .canonicalize() + .context("Failed to canonicalize current directory path")?; + + BenchmarkWorkDir::deep_copy( + agent + .session_file() + .expect("Failed to get session file") + .as_path(), + here.as_path(), + false, + ) + .context("Failed to copy session file to evaluation directory")?; - // copy session file into eval-dir - let here = env::current_dir() - .context("Failed to get current directory")? - .canonicalize() - .context("Failed to canonicalize current directory path")?; - - BenchmarkWorkDir::deep_copy( - agent - .session_file() - .expect("Failed to get session file") - .as_path(), - here.as_path(), - false, - ) - .context("Failed to copy session file to evaluation directory")?; - - tracing::info!("Evaluation completed successfully"); - } _ => { - tracing::error!("No evaluation found for selector: {}", bench_eval.selector); - bail!("No evaluation found for selector: {}", bench_eval.selector); - }} + tracing::info!("Evaluation completed successfully"); + } + _ => { + tracing::error!("No evaluation found for selector: {}", bench_eval.selector); + bail!("No evaluation found for selector: {}", bench_eval.selector); + } + } Ok(()) } diff --git a/crates/goose-bench/src/runners/metric_aggregator.rs b/crates/goose-bench/src/runners/metric_aggregator.rs index 6c41ac0088d6..8b55347473f9 100644 --- a/crates/goose-bench/src/runners/metric_aggregator.rs +++ b/crates/goose-bench/src/runners/metric_aggregator.rs @@ -1,4 +1,4 @@ -use anyhow::{bail, ensure, Context, Result}; +use anyhow::{Context, Result, bail, ensure}; use std::path::PathBuf; use tracing; diff --git a/crates/goose-cli/src/cli.rs b/crates/goose-cli/src/cli.rs index 3a8eb17fded5..6e819cf1a9b6 100644 --- a/crates/goose-cli/src/cli.rs +++ b/crates/goose-cli/src/cli.rs @@ -20,7 +20,7 @@ use crate::logging::setup_logging; use crate::recipes::extract_from_cli::extract_recipe_info_from_cli; use crate::recipes::recipe::{explain_recipe_with_parameters, load_recipe_content_as_template}; use crate::session; -use crate::session::{build_session, SessionBuilderConfig, SessionSettings}; +use crate::session::{SessionBuilderConfig, SessionSettings, build_session}; use goose_bench::bench_config::BenchRunConfig; use goose_bench::runners::bench_runner::BenchRunner; use goose_bench::runners::eval_runner::EvalRunner; @@ -896,7 +896,9 @@ pub async fn cli() -> Result<()> { extract_recipe_info_from_cli(recipe_name, params, additional_sub_recipes)? } (None, None, None) => { - eprintln!("Error: Must provide either --instructions (-i), --text (-t), or --recipe. Use -i - for stdin."); + eprintln!( + "Error: Must provide either --instructions (-i), --text (-t), or --recipe. Use -i - for stdin." + ); std::process::exit(1); } }; diff --git a/crates/goose-cli/src/commands/bench.rs b/crates/goose-cli/src/commands/bench.rs index a870cc5346ab..6671a4693667 100644 --- a/crates/goose-cli/src/commands/bench.rs +++ b/crates/goose-cli/src/commands/bench.rs @@ -1,6 +1,6 @@ -use crate::session::build_session; use crate::session::SessionBuilderConfig; -use crate::{logging, session, Session}; +use crate::session::build_session; +use crate::{Session, logging, session}; use async_trait::async_trait; use goose::message::Message; use goose_bench::bench_session::{BenchAgent, BenchBaseSession}; diff --git a/crates/goose-cli/src/commands/configure.rs b/crates/goose-cli/src/commands/configure.rs index bb005ddbbb96..79f58650ca9f 100644 --- a/crates/goose-cli/src/commands/configure.rs +++ b/crates/goose-cli/src/commands/configure.rs @@ -1,12 +1,12 @@ use cliclack::spinner; use console::style; +use goose::agents::Agent; use goose::agents::extension::ToolInfo; use goose::agents::extension_manager::get_parameter_names; use goose::agents::platform_tools::{ PLATFORM_LIST_RESOURCES_TOOL_NAME, PLATFORM_READ_RESOURCE_TOOL_NAME, }; -use goose::agents::Agent; -use goose::agents::{extension::Envs, ExtensionConfig}; +use goose::agents::{ExtensionConfig, extension::Envs}; use goose::config::extensions::name_to_key; use goose::config::permission::PermissionLevel; use goose::config::{ @@ -15,9 +15,9 @@ use goose::config::{ }; use goose::message::Message; use goose::providers::{create, providers}; -use mcp_core::tool::ToolAnnotations; use mcp_core::Tool; -use serde_json::{json, Value}; +use mcp_core::tool::ToolAnnotations; +use serde_json::{Value, json}; use std::collections::HashMap; use std::error::Error; @@ -1036,7 +1036,9 @@ pub fn configure_goose_mode_dialog() -> Result<(), Box> { // Check if GOOSE_MODE is set as an environment variable if std::env::var("GOOSE_MODE").is_ok() { - let _ = cliclack::log::info("Notice: GOOSE_MODE environment variable is set and will override the configuration here."); + let _ = cliclack::log::info( + "Notice: GOOSE_MODE environment variable is set and will override the configuration here.", + ); } let mode = cliclack::select("Which Goose mode would you like to configure?") @@ -1089,7 +1091,9 @@ pub fn configure_goose_router_strategy_dialog() -> Result<(), Box> { // Check if GOOSE_ROUTER_STRATEGY is set as an environment variable if std::env::var("GOOSE_ROUTER_TOOL_SELECTION_STRATEGY").is_ok() { - let _ = cliclack::log::info("Notice: GOOSE_ROUTER_TOOL_SELECTION_STRATEGY environment variable is set. Configuration will override this."); + let _ = cliclack::log::info( + "Notice: GOOSE_ROUTER_TOOL_SELECTION_STRATEGY environment variable is set. Configuration will override this.", + ); } let strategy = cliclack::select("Which router strategy would you like to use?") @@ -1131,7 +1135,9 @@ pub fn configure_tool_output_dialog() -> Result<(), Box> { let config = Config::global(); // Check if GOOSE_CLI_MIN_PRIORITY is set as an environment variable if std::env::var("GOOSE_CLI_MIN_PRIORITY").is_ok() { - let _ = cliclack::log::info("Notice: GOOSE_CLI_MIN_PRIORITY environment variable is set and will override the configuration here."); + let _ = cliclack::log::info( + "Notice: GOOSE_CLI_MIN_PRIORITY environment variable is set and will override the configuration here.", + ); } let tool_log_level = cliclack::select("Which tool output would you like to show?") .item("high", "High Importance", "") @@ -1236,25 +1242,28 @@ pub async fn configure_tool_permissions_dialog() -> Result<(), Box> { let agent = Agent::new(); let new_provider = create(&provider_name, model_config)?; agent.update_provider(new_provider).await?; - match ExtensionConfigManager::get_config_by_name(&selected_extension_name) { Ok(Some(config)) => { - agent - .add_extension(config.clone()) - .await - .unwrap_or_else(|_| { - println!( - "{} Failed to check extension: {}", - style("Error").red().italic(), - config.name() - ); - }); - } _ => { - println!( - "{} Configuration not found for extension: {}", - style("Warning").yellow().italic(), - selected_extension_name - ); - return Ok(()); - }} + match ExtensionConfigManager::get_config_by_name(&selected_extension_name) { + Ok(Some(config)) => { + agent + .add_extension(config.clone()) + .await + .unwrap_or_else(|_| { + println!( + "{} Failed to check extension: {}", + style("Error").red().italic(), + config.name() + ); + }); + } + _ => { + println!( + "{} Configuration not found for extension: {}", + style("Warning").yellow().italic(), + selected_extension_name + ); + return Ok(()); + } + } let mut permission_manager = PermissionManager::default(); let selected_tools = agent @@ -1381,7 +1390,9 @@ fn configure_scheduler_dialog() -> Result<(), Box> { // Check if GOOSE_SCHEDULER_TYPE is set as an environment variable if std::env::var("GOOSE_SCHEDULER_TYPE").is_ok() { - let _ = cliclack::log::info("Notice: GOOSE_SCHEDULER_TYPE environment variable is set and will override the configuration here."); + let _ = cliclack::log::info( + "Notice: GOOSE_SCHEDULER_TYPE environment variable is set and will override the configuration here.", + ); } // Get current scheduler type from config for display @@ -1421,7 +1432,9 @@ fn configure_scheduler_dialog() -> Result<(), Box> { println!(" • Temporal scheduler requires Temporal CLI to be installed"); println!(" • macOS: brew install temporal"); println!(" • Linux/Windows: https://github.com/temporalio/cli/releases"); - println!(" • If Temporal is unavailable, Goose will automatically fall back to the built-in scheduler"); + println!( + " • If Temporal is unavailable, Goose will automatically fall back to the built-in scheduler" + ); println!(" • The scheduling engines do not share the list of schedules"); } _ => unreachable!(), diff --git a/crates/goose-cli/src/commands/info.rs b/crates/goose-cli/src/commands/info.rs index d745abfaf4a6..9ad2fd4809ca 100644 --- a/crates/goose-cli/src/commands/info.rs +++ b/crates/goose-cli/src/commands/info.rs @@ -1,6 +1,6 @@ use anyhow::Result; use console::style; -use etcetera::{choose_app_strategy, AppStrategy}; +use etcetera::{AppStrategy, choose_app_strategy}; use goose::config::Config; use serde_yaml; diff --git a/crates/goose-cli/src/commands/mcp.rs b/crates/goose-cli/src/commands/mcp.rs index 8fbd399f06d9..9176c5ca05bb 100644 --- a/crates/goose-cli/src/commands/mcp.rs +++ b/crates/goose-cli/src/commands/mcp.rs @@ -11,11 +11,11 @@ use std::sync::Arc; use tokio::sync::Notify; #[cfg(unix)] -use nix::sys::signal::{kill, Signal}; -#[cfg(unix)] -use nix::unistd::getpgrp; +use nix::sys::signal::{Signal, kill}; #[cfg(unix)] use nix::unistd::Pid; +#[cfg(unix)] +use nix::unistd::getpgrp; pub async fn run_server(name: &str) -> Result<()> { // Initialize logging diff --git a/crates/goose-cli/src/commands/recipe.rs b/crates/goose-cli/src/commands/recipe.rs index 1b15a912907d..c9ce470fd3d5 100644 --- a/crates/goose-cli/src/commands/recipe.rs +++ b/crates/goose-cli/src/commands/recipe.rs @@ -99,11 +99,7 @@ pub fn handle_list(format: &str, verbose: bool) -> Result<()> { }; let description = if let Some(desc) = &recipe.description { - if desc.is_empty() { - "(none)" - } else { - desc - } + if desc.is_empty() { "(none)" } else { desc } } else { "(none)" }; @@ -227,9 +223,11 @@ response: let result = handle_validate(&recipe_path); assert!(result.is_err()); - assert!(result - .unwrap_err() - .to_string() - .contains("JSON schema validation failed")); + assert!( + result + .unwrap_err() + .to_string() + .contains("JSON schema validation failed") + ); } } diff --git a/crates/goose-cli/src/commands/schedule.rs b/crates/goose-cli/src/commands/schedule.rs index 4d94c6de8e80..e07b217a091c 100644 --- a/crates/goose-cli/src/commands/schedule.rs +++ b/crates/goose-cli/src/commands/schedule.rs @@ -1,8 +1,8 @@ -use anyhow::{bail, Context, Result}; -use base64::engine::{general_purpose::STANDARD as BASE64_STANDARD, Engine}; +use anyhow::{Context, Result, bail}; +use base64::engine::{Engine, general_purpose::STANDARD as BASE64_STANDARD}; use goose::scheduler::{ - get_default_scheduled_recipes_dir, get_default_scheduler_storage_path, ScheduledJob, - SchedulerError, + ScheduledJob, SchedulerError, get_default_scheduled_recipes_dir, + get_default_scheduler_storage_path, }; use goose::scheduler_factory::SchedulerFactory; use goose::temporal_scheduler::TemporalScheduler; @@ -390,7 +390,9 @@ pub async fn handle_schedule_cron_help() -> Result<()> { println!( " goose schedule add --id daily-backup --cron \"@daily\" --recipe-source backup.yaml" ); - println!(" goose schedule add --id weekly-summary --cron \"0 9 * * 1\" --recipe-source summary.yaml"); + println!( + " goose schedule add --id weekly-summary --cron \"0 9 * * 1\" --recipe-source summary.yaml" + ); Ok(()) } diff --git a/crates/goose-cli/src/commands/session.rs b/crates/goose-cli/src/commands/session.rs index ff8f37e47ca6..489eca814bc8 100644 --- a/crates/goose-cli/src/commands/session.rs +++ b/crates/goose-cli/src/commands/session.rs @@ -1,7 +1,7 @@ use crate::session::message_to_markdown; use anyhow::{Context, Result}; use cliclack::{confirm, multiselect, select}; -use goose::session::info::{get_valid_sorted_sessions, SessionInfo, SortOrder}; +use goose::session::info::{SessionInfo, SortOrder, get_valid_sorted_sessions}; use goose::session::{self, Identifier}; use goose::utils::safe_truncate; use regex::Regex; diff --git a/crates/goose-cli/src/commands/web.rs b/crates/goose-cli/src/commands/web.rs index 72b5d32bda9d..4cc1797792c5 100644 --- a/crates/goose-cli/src/commands/web.rs +++ b/crates/goose-cli/src/commands/web.rs @@ -1,12 +1,12 @@ use anyhow::Result; use axum::{ + Json, Router, extract::{ - ws::{Message, WebSocket, WebSocketUpgrade}, State, + ws::{Message, WebSocket, WebSocketUpgrade}, }, response::{Html, IntoResponse, Response}, routing::get, - Json, Router, }; use futures::{sink::SinkExt, stream::StreamExt}; use goose::agents::{Agent, AgentEvent}; diff --git a/crates/goose-cli/src/logging.rs b/crates/goose-cli/src/logging.rs index 82024399e6fc..134edc278074 100644 --- a/crates/goose-cli/src/logging.rs +++ b/crates/goose-cli/src/logging.rs @@ -1,5 +1,5 @@ use anyhow::{Context, Result}; -use etcetera::{choose_app_strategy, AppStrategy}; +use etcetera::{AppStrategy, choose_app_strategy}; use std::fs; use std::path::PathBuf; use std::sync::Arc; @@ -7,8 +7,8 @@ use std::sync::Once; use tokio::sync::Mutex; use tracing_appender::rolling::Rotation; use tracing_subscriber::{ - filter::LevelFilter, fmt, layer::SubscriberExt, util::SubscriberInitExt, EnvFilter, Layer, - Registry, + EnvFilter, Layer, Registry, filter::LevelFilter, fmt, layer::SubscriberExt, + util::SubscriberInitExt, }; use goose::tracing::langfuse_layer; diff --git a/crates/goose-cli/src/project_tracker.rs b/crates/goose-cli/src/project_tracker.rs index 1b11bbf33631..5a3aeb2479d6 100644 --- a/crates/goose-cli/src/project_tracker.rs +++ b/crates/goose-cli/src/project_tracker.rs @@ -1,6 +1,6 @@ use anyhow::{Context, Result}; use chrono::{DateTime, Utc}; -use etcetera::{choose_app_strategy, AppStrategy}; +use etcetera::{AppStrategy, choose_app_strategy}; use serde::{Deserialize, Serialize}; use std::collections::HashMap; use std::fs; diff --git a/crates/goose-cli/src/recipes/extract_from_cli.rs b/crates/goose-cli/src/recipes/extract_from_cli.rs index 199c7091e3a6..a2c0e679bc55 100644 --- a/crates/goose-cli/src/recipes/extract_from_cli.rs +++ b/crates/goose-cli/src/recipes/extract_from_cli.rs @@ -1,6 +1,6 @@ use std::path::PathBuf; -use anyhow::{anyhow, Result}; +use anyhow::{Result, anyhow}; use goose::recipe::{Response, SubRecipe}; use crate::recipes::search_recipe::retrieve_recipe_file; diff --git a/crates/goose-cli/src/recipes/github_recipe.rs b/crates/goose-cli/src/recipes/github_recipe.rs index 0fcbbe9e6c95..2c01dfda0de3 100644 --- a/crates/goose-cli/src/recipes/github_recipe.rs +++ b/crates/goose-cli/src/recipes/github_recipe.rs @@ -1,4 +1,4 @@ -use anyhow::{anyhow, Result}; +use anyhow::{Result, anyhow}; use console::style; use serde::{Deserialize, Serialize}; @@ -48,7 +48,7 @@ pub fn retrieve_recipe_from_github( content, parent_dir: download_dir.clone(), file_path: recipe_file_local_path, - }) + }); } Err(err) => return Err(err), }, @@ -321,7 +321,7 @@ fn get_github_recipe_info(repo: &str, dir_name: &str, recipe_filename: &str) -> if let Some(content_b64) = file_info.get("content").and_then(|c| c.as_str()) { // Decode base64 content - use base64::{engine::general_purpose, Engine as _}; + use base64::{Engine as _, engine::general_purpose}; let content_bytes = general_purpose::STANDARD .decode(content_b64.replace('\n', "")) .map_err(|e| anyhow!("Failed to decode base64 content: {}", e))?; diff --git a/crates/goose-cli/src/recipes/recipe.rs b/crates/goose-cli/src/recipes/recipe.rs index 49b0e6bf7210..fa71f4c74cf8 100644 --- a/crates/goose-cli/src/recipes/recipe.rs +++ b/crates/goose-cli/src/recipes/recipe.rs @@ -2,7 +2,7 @@ use crate::recipes::print_recipe::{ missing_parameters_command_line, print_parameters_with_values, print_recipe_explanation, print_required_parameters_for_template, }; -use crate::recipes::search_recipe::{retrieve_recipe_file, RecipeFile}; +use crate::recipes::search_recipe::{RecipeFile, retrieve_recipe_file}; use crate::recipes::template_recipe::{ parse_recipe_content, render_recipe_content_with_params, render_recipe_for_preview, }; @@ -190,7 +190,10 @@ fn validate_optional_parameters(parameters: &Option>) -> Re if optional_params_without_default_values.is_empty() { Ok(()) } else { - Err(anyhow::anyhow!("Optional parameters missing default values in the recipe: {}. Please provide defaults.", optional_params_without_default_values.join(", "))) + Err(anyhow::anyhow!( + "Optional parameters missing default values in the recipe: {}. Please provide defaults.", + optional_params_without_default_values.join(", ") + )) } } diff --git a/crates/goose-cli/src/recipes/recipe/tests.rs b/crates/goose-cli/src/recipes/recipe/tests.rs index 4b27601ffdd7..32533686e4ef 100644 --- a/crates/goose-cli/src/recipes/recipe/tests.rs +++ b/crates/goose-cli/src/recipes/recipe/tests.rs @@ -111,12 +111,14 @@ mod tests { assert!(load_recipe_result.is_err()); let err = load_recipe_result.unwrap_err(); println!("{}", err.to_string()); - assert!(err - .to_string() - .contains("Unnecessary parameter definitions: wrong_param_key.")); - assert!(err - .to_string() - .contains("Missing definitions for parameters in the recipe file:")); + assert!( + err.to_string() + .contains("Unnecessary parameter definitions: wrong_param_key.") + ); + assert!( + err.to_string() + .contains("Missing definitions for parameters in the recipe file:") + ); assert!(err.to_string().contains("expected_param1")); assert!(err.to_string().contains("expected_param2")); } @@ -154,8 +156,8 @@ mod tests { } #[test] - fn test_load_recipe_as_template_optional_parameters_with_empty_default_values_in_recipe_file( - ) { + fn test_load_recipe_as_template_optional_parameters_with_empty_default_values_in_recipe_file() + { let instructions_and_parameters = r#" "instructions": "Test instructions with {{ optional_param }}", "parameters": [ diff --git a/crates/goose-cli/src/recipes/search_recipe.rs b/crates/goose-cli/src/recipes/search_recipe.rs index 6b9982273a64..5a6e70a843aa 100644 --- a/crates/goose-cli/src/recipes/search_recipe.rs +++ b/crates/goose-cli/src/recipes/search_recipe.rs @@ -1,4 +1,4 @@ -use anyhow::{anyhow, Result}; +use anyhow::{Result, anyhow}; use goose::config::Config; use std::path::{Path, PathBuf}; use std::{env, fs}; @@ -6,8 +6,8 @@ use std::{env, fs}; use crate::recipes::recipe::RECIPE_FILE_EXTENSIONS; use super::github_recipe::{ - list_github_recipes, retrieve_recipe_from_github, RecipeInfo, RecipeSource, - GOOSE_RECIPE_GITHUB_REPO_CONFIG_KEY, + GOOSE_RECIPE_GITHUB_REPO_CONFIG_KEY, RecipeInfo, RecipeSource, list_github_recipes, + retrieve_recipe_from_github, }; const GOOSE_RECIPE_PATH_ENV_VAR: &str = "GOOSE_RECIPE_PATH"; diff --git a/crates/goose-cli/src/session/builder.rs b/crates/goose-cli/src/session/builder.rs index 9782dea333bc..47934ba37418 100644 --- a/crates/goose-cli/src/session/builder.rs +++ b/crates/goose-cli/src/session/builder.rs @@ -1,6 +1,6 @@ use console::style; -use goose::agents::extension::ExtensionError; use goose::agents::Agent; +use goose::agents::extension::ExtensionError; use goose::config::{Config, ExtensionConfig, ExtensionConfigManager}; use goose::providers::create; use goose::recipe::{Response, SubRecipe}; @@ -11,8 +11,8 @@ use rustyline::EditMode; use std::process; use std::sync::Arc; -use super::output; use super::Session; +use super::output; /// Configuration for building a new Goose session /// @@ -102,8 +102,7 @@ async fn offer_extension_debugging_help( // Create a debugging prompt with context about the extension failure let debug_prompt = format!( "I'm having trouble starting an extension called '{}'. Here's the error I encountered:\n\n{}\n\nCan you help me diagnose what might be wrong and suggest how to fix it? Please consider common issues like:\n- Missing dependencies or tools\n- Configuration problems\n- Network connectivity (for remote extensions)\n- Permission issues\n- Path or environment variable problems", - extension_name, - error_message + extension_name, error_message ); // Create a minimal agent for debugging diff --git a/crates/goose-cli/src/session/mod.rs b/crates/goose-cli/src/session/mod.rs index c6ccb09fe3b4..e724d7687e14 100644 --- a/crates/goose-cli/src/session/mod.rs +++ b/crates/goose-cli/src/session/mod.rs @@ -7,20 +7,20 @@ mod prompt; mod thinking; pub use self::export::message_to_markdown; -pub use builder::{build_session, SessionBuilderConfig, SessionSettings}; +pub use builder::{SessionBuilderConfig, SessionSettings, build_session}; use console::Color; use goose::agents::AgentEvent; use goose::message::push_message; -use goose::permission::permission_confirmation::PrincipalType; use goose::permission::Permission; use goose::permission::PermissionConfirmation; +use goose::permission::permission_confirmation::PrincipalType; use goose::providers::base::Provider; pub use goose::session::Identifier; use goose::utils::safe_truncate; use anyhow::{Context, Result}; use completion::GooseCompleter; -use etcetera::{choose_app_strategy, AppStrategy}; +use etcetera::{AppStrategy, choose_app_strategy}; use goose::agents::extension::{Envs, ExtensionConfig}; use goose::agents::{Agent, SessionConfig}; use goose::config::Config; @@ -33,7 +33,7 @@ use mcp_core::prompt::PromptMessage; use mcp_core::protocol::JsonRpcMessage; use mcp_core::protocol::JsonRpcNotification; -use rand::{distributions::Alphanumeric, Rng}; +use rand::{Rng, distributions::Alphanumeric}; use rustyline::EditMode; use serde_json::Value; use std::collections::HashMap; @@ -91,7 +91,9 @@ pub async fn classify_planner_response( message_text: String, provider: Arc, ) -> Result { - let prompt = format!("The text below is the output from an AI model which can either provide a plan or list of clarifying questions. Based on the text below, decide if the output is a \"plan\" or \"clarifying questions\".\n---\n{message_text}"); + let prompt = format!( + "The text below is the output from an AI model which can either provide a plan or list of clarifying questions. Based on the text below, decide if the output is a \"plan\" or \"clarifying questions\".\n---\n{message_text}" + ); // Generate the description let message = Message::user().with_text(&prompt); @@ -478,7 +480,10 @@ impl Session { Some(&content), session_id.as_deref(), ) { - eprintln!("Warning: Failed to update project tracker with instruction: {}", e); + eprintln!( + "Warning: Failed to update project tracker with instruction: {}", + e + ); } // Get the provider from the agent for description generation diff --git a/crates/goose-cli/src/session/output.rs b/crates/goose-cli/src/session/output.rs index 5544cddf6005..ec5fca62caa1 100644 --- a/crates/goose-cli/src/session/output.rs +++ b/crates/goose-cli/src/session/output.rs @@ -1,5 +1,5 @@ use bat::WrappingMode; -use console::{style, Color}; +use console::{Color, style}; use goose::config::Config; use goose::message::{Message, MessageContent, ToolRequest, ToolResponse}; use goose::providers::pricing::get_model_pricing; diff --git a/crates/goose-ffi/src/lib.rs b/crates/goose-ffi/src/lib.rs index 2a60c3912bb6..7f72090f7af2 100644 --- a/crates/goose-ffi/src/lib.rs +++ b/crates/goose-ffi/src/lib.rs @@ -1,4 +1,4 @@ -use std::ffi::{c_char, CStr, CString}; +use std::ffi::{CStr, CString, c_char}; use std::ptr; use std::sync::Arc; @@ -95,15 +95,17 @@ pub struct AsyncResult { /// The result pointer must be a valid pointer returned by a goose FFI function, /// or NULL. #[unsafe(no_mangle)] -pub unsafe extern "C" fn goose_free_async_result(result: *mut AsyncResult) { unsafe { - if !result.is_null() { - let result = &mut *result; - if !result.error_message.is_null() { - let _ = CString::from_raw(result.error_message); +pub unsafe extern "C" fn goose_free_async_result(result: *mut AsyncResult) { + unsafe { + if !result.is_null() { + let result = &mut *result; + if !result.error_message.is_null() { + let _ = CString::from_raw(result.error_message); + } + let _ = Box::from_raw(result); } - let _ = Box::from_raw(result); } -}} +} /// Create a new agent with the given provider configuration /// @@ -120,76 +122,80 @@ pub unsafe extern "C" fn goose_free_async_result(result: *mut AsyncResult) { uns /// The config pointer must be valid or NULL. The resulting agent must be freed /// with goose_agent_free when no longer needed. #[unsafe(no_mangle)] -pub unsafe extern "C" fn goose_agent_new(config: *const ProviderConfigFFI) -> AgentPtr { unsafe { - // Check for null pointer - if config.is_null() { - eprintln!("Error: config pointer is null"); - return ptr::null_mut(); - } +pub unsafe extern "C" fn goose_agent_new(config: *const ProviderConfigFFI) -> AgentPtr { + unsafe { + // Check for null pointer + if config.is_null() { + eprintln!("Error: config pointer is null"); + return ptr::null_mut(); + } - let config = &*config; + let config = &*config; - // We currently only support Databricks provider - // This match ensures future compiler errors if new provider types are added without handling - match config.provider_type { - ProviderType::Databricks => (), // Databricks provider is supported - } + // We currently only support Databricks provider + // This match ensures future compiler errors if new provider types are added without handling + match config.provider_type { + ProviderType::Databricks => (), // Databricks provider is supported + } - // Get api_key from config or environment - let api_key = if !config.api_key.is_null() { - CStr::from_ptr(config.api_key).to_string_lossy().to_string() - } else { - match std::env::var("DATABRICKS_API_KEY") { - Ok(key) => key, - Err(_) => { - eprintln!("Error: api_key not provided and DATABRICKS_API_KEY environment variable not set"); - return ptr::null_mut(); + // Get api_key from config or environment + let api_key = if !config.api_key.is_null() { + CStr::from_ptr(config.api_key).to_string_lossy().to_string() + } else { + match std::env::var("DATABRICKS_API_KEY") { + Ok(key) => key, + Err(_) => { + eprintln!( + "Error: api_key not provided and DATABRICKS_API_KEY environment variable not set" + ); + return ptr::null_mut(); + } } + }; + + // Check and get required model_name (no env fallback for model) + if config.model_name.is_null() { + eprintln!("Error: model_name is required but was null"); + return ptr::null_mut(); } - }; + let model_name = CStr::from_ptr(config.model_name) + .to_string_lossy() + .to_string(); + + // Get host from config or environment + let host = if !config.host.is_null() { + CStr::from_ptr(config.host).to_string_lossy().to_string() + } else { + match std::env::var("DATABRICKS_HOST") { + Ok(url) => url, + Err(_) => { + eprintln!( + "Error: host not provided and DATABRICKS_HOST environment variable not set" + ); + return ptr::null_mut(); + } + } + }; - // Check and get required model_name (no env fallback for model) - if config.model_name.is_null() { - eprintln!("Error: model_name is required but was null"); - return ptr::null_mut(); - } - let model_name = CStr::from_ptr(config.model_name) - .to_string_lossy() - .to_string(); - - // Get host from config or environment - let host = if !config.host.is_null() { - CStr::from_ptr(config.host).to_string_lossy().to_string() - } else { - match std::env::var("DATABRICKS_HOST") { - Ok(url) => url, - Err(_) => { - eprintln!( - "Error: host not provided and DATABRICKS_HOST environment variable not set" - ); - return ptr::null_mut(); + // Create model config with model name + let model_config = ModelConfig::new(model_name); + + // Create Databricks provider with required parameters + match DatabricksProvider::from_params(host, api_key, model_config) { + Ok(provider) => { + let agent = Agent::new(); + get_runtime().block_on(async { + let _ = agent.update_provider(Arc::new(provider)).await; + }); + Box::into_raw(Box::new(agent)) + } + Err(e) => { + eprintln!("Error creating Databricks provider: {:?}", e); + ptr::null_mut() } - } - }; - - // Create model config with model name - let model_config = ModelConfig::new(model_name); - - // Create Databricks provider with required parameters - match DatabricksProvider::from_params(host, api_key, model_config) { - Ok(provider) => { - let agent = Agent::new(); - get_runtime().block_on(async { - let _ = agent.update_provider(Arc::new(provider)).await; - }); - Box::into_raw(Box::new(agent)) - } - Err(e) => { - eprintln!("Error creating Databricks provider: {:?}", e); - ptr::null_mut() } } -}} +} /// Free an agent /// @@ -205,11 +211,13 @@ pub unsafe extern "C" fn goose_agent_new(config: *const ProviderConfigFFI) -> Ag /// or have a null internal pointer. The agent_ptr must not be used after /// calling this function. #[unsafe(no_mangle)] -pub unsafe extern "C" fn goose_agent_free(agent_ptr: AgentPtr) { unsafe { - if !agent_ptr.is_null() { - let _ = Box::from_raw(agent_ptr); +pub unsafe extern "C" fn goose_agent_free(agent_ptr: AgentPtr) { + unsafe { + if !agent_ptr.is_null() { + let _ = Box::from_raw(agent_ptr); + } } -}} +} /// Send a message to the agent and get the response /// @@ -235,51 +243,53 @@ pub unsafe extern "C" fn goose_agent_free(agent_ptr: AgentPtr) { unsafe { pub unsafe extern "C" fn goose_agent_send_message( agent_ptr: AgentPtr, message: *const c_char, -) -> *mut c_char { unsafe { - if agent_ptr.is_null() || message.is_null() { - return ptr::null_mut(); - } +) -> *mut c_char { + unsafe { + if agent_ptr.is_null() || message.is_null() { + return ptr::null_mut(); + } - let agent = &mut *agent_ptr; - let message = CStr::from_ptr(message).to_string_lossy().to_string(); + let agent = &mut *agent_ptr; + let message = CStr::from_ptr(message).to_string_lossy().to_string(); - let messages = vec![Message::user().with_text(&message)]; + let messages = vec![Message::user().with_text(&message)]; - // Block on the async call using our global runtime - let response = get_runtime().block_on(async { - let mut stream = match agent.reply(&messages, None).await { - Ok(stream) => stream, - Err(e) => return format!("Error getting reply from agent: {}", e), - }; + // Block on the async call using our global runtime + let response = get_runtime().block_on(async { + let mut stream = match agent.reply(&messages, None).await { + Ok(stream) => stream, + Err(e) => return format!("Error getting reply from agent: {}", e), + }; - let mut full_response = String::new(); + let mut full_response = String::new(); - while let Some(message_result) = stream.next().await { - match message_result { - Ok(AgentEvent::Message(message)) => { - // Get text or serialize to JSON - // Note: Message doesn't have as_text method, we'll serialize to JSON - if let Ok(json) = serde_json::to_string(&message) { - full_response.push_str(&json); + while let Some(message_result) = stream.next().await { + match message_result { + Ok(AgentEvent::Message(message)) => { + // Get text or serialize to JSON + // Note: Message doesn't have as_text method, we'll serialize to JSON + if let Ok(json) = serde_json::to_string(&message) { + full_response.push_str(&json); + } + } + Ok(AgentEvent::McpNotification(_)) => { + // TODO: Handle MCP notifications. + } + Ok(AgentEvent::ModelChange { .. }) => { + // Model change events are informational, just continue } - } - Ok(AgentEvent::McpNotification(_)) => { - // TODO: Handle MCP notifications. - } - Ok(AgentEvent::ModelChange { .. }) => { - // Model change events are informational, just continue - } - Err(e) => { - full_response.push_str(&format!("\nError in message stream: {}", e)); + Err(e) => { + full_response.push_str(&format!("\nError in message stream: {}", e)); + } } } - } - full_response - }); + full_response + }); - string_to_c_char(&response) -}} + string_to_c_char(&response) + } +} // Tool schema creation will be implemented in a future commit @@ -296,11 +306,13 @@ pub unsafe extern "C" fn goose_agent_send_message( /// The string must have been allocated by a goose FFI function, or be NULL. /// The string must not be used after calling this function. #[unsafe(no_mangle)] -pub unsafe extern "C" fn goose_free_string(s: *mut c_char) { unsafe { - if !s.is_null() { - let _ = CString::from_raw(s); +pub unsafe extern "C" fn goose_free_string(s: *mut c_char) { + unsafe { + if !s.is_null() { + let _ = CString::from_raw(s); + } } -}} +} // Helper function to convert a Rust string to a C char pointer fn string_to_c_char(s: &str) -> *mut c_char { diff --git a/crates/goose-llm/examples/image.rs b/crates/goose-llm/examples/image.rs index 7c607713e9cf..49543952796c 100644 --- a/crates/goose-llm/examples/image.rs +++ b/crates/goose-llm/examples/image.rs @@ -1,10 +1,9 @@ use anyhow::Result; -use base64::{engine::general_purpose::STANDARD as BASE64, Engine as _}; +use base64::{Engine as _, engine::general_purpose::STANDARD as BASE64}; use goose_llm::{ - completion, + Message, ModelConfig, completion, message::MessageContent, types::completion::{CompletionRequest, CompletionResponse}, - Message, ModelConfig, }; use serde_json::json; use std::{fs, vec}; diff --git a/crates/goose-llm/examples/prompt_override.rs b/crates/goose-llm/examples/prompt_override.rs index 3cebffc5198b..76dd6fbead6b 100644 --- a/crates/goose-llm/examples/prompt_override.rs +++ b/crates/goose-llm/examples/prompt_override.rs @@ -2,9 +2,8 @@ use std::vec; use anyhow::Result; use goose_llm::{ - completion, + Message, ModelConfig, completion, types::completion::{CompletionRequest, CompletionResponse}, - Message, ModelConfig, }; use serde_json::json; diff --git a/crates/goose-llm/examples/simple.rs b/crates/goose-llm/examples/simple.rs index efab4b0abc57..ca0f381e430e 100644 --- a/crates/goose-llm/examples/simple.rs +++ b/crates/goose-llm/examples/simple.rs @@ -2,12 +2,11 @@ use std::vec; use anyhow::Result; use goose_llm::{ - completion, + Message, ModelConfig, completion, extractors::generate_tooltip, types::completion::{ CompletionRequest, CompletionResponse, ExtensionConfig, ToolApprovalMode, ToolConfig, }, - Message, ModelConfig, }; use serde_json::json; diff --git a/crates/goose-llm/src/extractors/session_name.rs b/crates/goose-llm/src/extractors/session_name.rs index 0f35a7822097..e961ee10a947 100644 --- a/crates/goose-llm/src/extractors/session_name.rs +++ b/crates/goose-llm/src/extractors/session_name.rs @@ -5,7 +5,7 @@ use crate::{message::Message, types::json_value_ffi::JsonValueFfi}; use anyhow::Result; use goose::utils::safe_truncate; use indoc::indoc; -use serde_json::{json, Value}; +use serde_json::{Value, json}; const SESSION_NAME_EXAMPLES: &[&str] = &[ "Research Synthesis", diff --git a/crates/goose-llm/src/extractors/tooltip.rs b/crates/goose-llm/src/extractors/tooltip.rs index 48336a546ea6..91d29f4765df 100644 --- a/crates/goose-llm/src/extractors/tooltip.rs +++ b/crates/goose-llm/src/extractors/tooltip.rs @@ -5,7 +5,7 @@ use crate::types::core::{Content, Role}; use crate::types::json_value_ffi::JsonValueFfi; use anyhow::Result; use indoc::indoc; -use serde_json::{json, Value}; +use serde_json::{Value, json}; const TOOLTIP_EXAMPLES: &[&str] = &[ "analyzing KPIs", diff --git a/crates/goose-llm/src/message/message_content.rs b/crates/goose-llm/src/message/message_content.rs index c2397b6c1791..db94acc72473 100644 --- a/crates/goose-llm/src/message/message_content.rs +++ b/crates/goose-llm/src/message/message_content.rs @@ -263,8 +263,8 @@ impl From for MessageContent { #[cfg(test)] mod tests { use super::*; - use crate::types::core::{ToolCall, ToolError}; use crate::UniFfiTag; + use crate::types::core::{ToolCall, ToolError}; use serde_json::json; use uniffi::{FfiConverter, RustBuffer}; diff --git a/crates/goose-llm/src/message/mod.rs b/crates/goose-llm/src/message/mod.rs index ac2aaf278f6f..8ff1c8d65ab4 100644 --- a/crates/goose-llm/src/message/mod.rs +++ b/crates/goose-llm/src/message/mod.rs @@ -140,7 +140,7 @@ impl Message { #[cfg(test)] mod tests { - use serde_json::{json, Value}; + use serde_json::{Value, json}; use super::*; use crate::types::core::{ToolCall, ToolError}; diff --git a/crates/goose-llm/src/message/tool_result_serde.rs b/crates/goose-llm/src/message/tool_result_serde.rs index 7f1143228deb..1febd99ea833 100644 --- a/crates/goose-llm/src/message/tool_result_serde.rs +++ b/crates/goose-llm/src/message/tool_result_serde.rs @@ -1,4 +1,4 @@ -use serde::{ser::SerializeStruct, Deserialize, Deserializer, Serialize, Serializer}; +use serde::{Deserialize, Deserializer, Serialize, Serializer, ser::SerializeStruct}; use crate::types::core::{ToolError, ToolResult}; diff --git a/crates/goose-llm/src/prompt_template.rs b/crates/goose-llm/src/prompt_template.rs index eca9facb6e23..620326d2655a 100644 --- a/crates/goose-llm/src/prompt_template.rs +++ b/crates/goose-llm/src/prompt_template.rs @@ -3,7 +3,7 @@ use std::{ sync::{Arc, RwLock}, }; -use include_dir::{include_dir, Dir}; +use include_dir::{Dir, include_dir}; use minijinja::{Environment, Error as MiniJinjaError, Value as MJValue}; use once_cell::sync::Lazy; use serde::Serialize; diff --git a/crates/goose-llm/src/providers/databricks.rs b/crates/goose-llm/src/providers/databricks.rs index 0bfe2ffef67b..a3cf8c8427b8 100644 --- a/crates/goose-llm/src/providers/databricks.rs +++ b/crates/goose-llm/src/providers/databricks.rs @@ -4,13 +4,13 @@ use anyhow::Result; use async_trait::async_trait; use reqwest::{Client, StatusCode}; use serde::{Deserialize, Serialize}; -use serde_json::{json, Value}; +use serde_json::{Value, json}; use url::Url; use super::{ errors::ProviderError, formats::databricks::{create_request, get_usage, response_to_message}, - utils::{get_env, get_model, ImageFormat}, + utils::{ImageFormat, get_env, get_model}, }; use crate::{ message::Message, @@ -307,7 +307,7 @@ impl Provider for DatabricksProvider { return Err(ProviderError::ResponseParseError(format!( "Unexpected content type: {:?}", other - ))) + ))); } }; diff --git a/crates/goose-llm/src/providers/formats/databricks.rs b/crates/goose-llm/src/providers/formats/databricks.rs index 37343f2ebe09..cb4cccbae31b 100644 --- a/crates/goose-llm/src/providers/formats/databricks.rs +++ b/crates/goose-llm/src/providers/formats/databricks.rs @@ -1,5 +1,5 @@ -use anyhow::{anyhow, Error}; -use serde_json::{json, Value}; +use anyhow::{Error, anyhow}; +use serde_json::{Value, json}; use crate::{ message::{Message, MessageContent}, @@ -7,7 +7,7 @@ use crate::{ providers::{ base::Usage, errors::ProviderError, - utils::{convert_image, is_valid_function_name, sanitize_function_name, ImageFormat}, + utils::{ImageFormat, convert_image, is_valid_function_name, sanitize_function_name}, }, types::core::{Content, Role, Tool, ToolCall, ToolError}, }; @@ -122,14 +122,16 @@ pub fn format_messages(messages: &[Message], image_format: &ImageFormat) -> Vec< } } } - let tool_response_content: Value = json!(tool_content - .iter() - .map(|content| match content { - Content::Text(text) => text.text.clone(), - _ => String::new(), - }) - .collect::>() - .join(" ")); + let tool_response_content: Value = json!( + tool_content + .iter() + .map(|content| match content { + Content::Text(text) => text.text.clone(), + _ => String::new(), + }) + .collect::>() + .join(" ") + ); // Add tool response as a separate message result.push(json!({ @@ -751,10 +753,12 @@ mod tests { let result = format_tools(&[tool1, tool2]); assert!(result.is_err()); - assert!(result - .unwrap_err() - .to_string() - .contains("Duplicate tool name")); + assert!( + result + .unwrap_err() + .to_string() + .contains("Duplicate tool name") + ); Ok(()) } diff --git a/crates/goose-llm/src/providers/formats/openai.rs b/crates/goose-llm/src/providers/formats/openai.rs index a2eb43b414eb..5c53856d2481 100644 --- a/crates/goose-llm/src/providers/formats/openai.rs +++ b/crates/goose-llm/src/providers/formats/openai.rs @@ -1,5 +1,5 @@ -use anyhow::{anyhow, Error}; -use serde_json::{json, Value}; +use anyhow::{Error, anyhow}; +use serde_json::{Value, json}; use crate::{ message::{Message, MessageContent}, @@ -7,7 +7,7 @@ use crate::{ providers::{ base::Usage, errors::ProviderError, - utils::{convert_image, is_valid_function_name, sanitize_function_name, ImageFormat}, + utils::{ImageFormat, convert_image, is_valid_function_name, sanitize_function_name}, }, types::core::{Content, Role, Tool, ToolCall, ToolError}, }; @@ -93,14 +93,16 @@ pub fn format_messages(messages: &[Message], image_format: &ImageFormat) -> Vec< } } } - let tool_response_content: Value = json!(tool_content - .iter() - .map(|content| match content { - Content::Text(text) => text.text.clone(), - _ => String::new(), - }) - .collect::>() - .join(" ")); + let tool_response_content: Value = json!( + tool_content + .iter() + .map(|content| match content { + Content::Text(text) => text.text.clone(), + _ => String::new(), + }) + .collect::>() + .join(" ") + ); // First add the tool response with all content output.push(json!({ @@ -632,10 +634,12 @@ mod tests { let result = format_tools(&[tool1, tool2]); assert!(result.is_err()); - assert!(result - .unwrap_err() - .to_string() - .contains("Duplicate tool name")); + assert!( + result + .unwrap_err() + .to_string() + .contains("Duplicate tool name") + ); Ok(()) } diff --git a/crates/goose-llm/src/providers/openai.rs b/crates/goose-llm/src/providers/openai.rs index 82d736f366cf..d5f1decda05e 100644 --- a/crates/goose-llm/src/providers/openai.rs +++ b/crates/goose-llm/src/providers/openai.rs @@ -4,12 +4,12 @@ use anyhow::Result; use async_trait::async_trait; use reqwest::Client; use serde::{Deserialize, Serialize}; -use serde_json::{json, Value}; +use serde_json::{Value, json}; use super::{ errors::ProviderError, formats::openai::{create_request, get_usage, response_to_message}, - utils::{emit_debug_trace, get_env, get_model, handle_response_openai_compat, ImageFormat}, + utils::{ImageFormat, emit_debug_trace, get_env, get_model, handle_response_openai_compat}, }; use crate::{ message::Message, @@ -213,7 +213,7 @@ impl Provider for OpenAiProvider { return Err(ProviderError::ResponseParseError(format!( "Unexpected content type: {:?}", other - ))) + ))); } }; diff --git a/crates/goose-llm/src/providers/utils.rs b/crates/goose-llm/src/providers/utils.rs index b6c00e7bf237..622e7185119d 100644 --- a/crates/goose-llm/src/providers/utils.rs +++ b/crates/goose-llm/src/providers/utils.rs @@ -5,7 +5,7 @@ use base64::Engine; use regex::Regex; use reqwest::{Response, StatusCode}; use serde::{Deserialize, Serialize}; -use serde_json::{from_value, json, Value}; +use serde_json::{Value, from_value, json}; use super::base::Usage; use crate::{ diff --git a/crates/goose-llm/src/structured_outputs.rs b/crates/goose-llm/src/structured_outputs.rs index b6690b641e74..d1b7fa937b16 100644 --- a/crates/goose-llm/src/structured_outputs.rs +++ b/crates/goose-llm/src/structured_outputs.rs @@ -1,7 +1,7 @@ use crate::{ - providers::{create, errors::ProviderError, ProviderExtractResponse}, - types::json_value_ffi::JsonValueFfi, Message, ModelConfig, + providers::{ProviderExtractResponse, create, errors::ProviderError}, + types::json_value_ffi::JsonValueFfi, }; /// Generates a structured output based on the provided schema, diff --git a/crates/goose-llm/tests/providers_extract.rs b/crates/goose-llm/tests/providers_extract.rs index 75faaf7ce42c..5fbf541c68e4 100644 --- a/crates/goose-llm/tests/providers_extract.rs +++ b/crates/goose-llm/tests/providers_extract.rs @@ -2,11 +2,11 @@ use anyhow::Result; use dotenv::dotenv; +use goose_llm::ModelConfig; use goose_llm::message::Message; use goose_llm::providers::base::Provider; use goose_llm::providers::{databricks::DatabricksProvider, openai::OpenAiProvider}; -use goose_llm::ModelConfig; -use serde_json::{json, Value}; +use serde_json::{Value, json}; use std::sync::Arc; #[derive(Debug, PartialEq, Copy, Clone)] @@ -46,10 +46,8 @@ fn check_required_env_vars(required: &[&str]) -> bool { } // --- Shared inputs for "paper" task --- -const PAPER_SYSTEM: &str = - "You are an expert at structured data extraction. Extract the metadata of a research paper into JSON."; -const PAPER_TEXT: &str = - "Application of Quantum Algorithms in Interstellar Navigation: A New Frontier \ +const PAPER_SYSTEM: &str = "You are an expert at structured data extraction. Extract the metadata of a research paper into JSON."; +const PAPER_TEXT: &str = "Application of Quantum Algorithms in Interstellar Navigation: A New Frontier \ by Dr. Stella Voyager, Dr. Nova Star, Dr. Lyra Hunter. Abstract: This paper \ investigates the utilization of quantum algorithms to improve interstellar \ navigation systems. Keywords: Quantum algorithms, interstellar navigation, \ diff --git a/crates/goose-mcp/src/computercontroller/mod.rs b/crates/goose-mcp/src/computercontroller/mod.rs index bdc9651eac90..3ddd2c682cc0 100644 --- a/crates/goose-mcp/src/computercontroller/mod.rs +++ b/crates/goose-mcp/src/computercontroller/mod.rs @@ -1,8 +1,8 @@ use base64::Engine; -use etcetera::{choose_app_strategy, AppStrategy}; +use etcetera::{AppStrategy, choose_app_strategy}; use indoc::{formatdoc, indoc}; use reqwest::{Client, Url}; -use serde_json::{json, Value}; +use serde_json::{Value, json}; use std::{ collections::HashMap, fs, future::Future, path::PathBuf, pin::Pin, sync::Arc, sync::Mutex, }; @@ -12,22 +12,22 @@ use tokio::{process::Command, sync::mpsc}; use std::os::unix::fs::PermissionsExt; use mcp_core::{ + Content, handler::{PromptError, ResourceError, ToolError}, prompt::Prompt, protocol::{JsonRpcMessage, ServerCapabilities}, resource::Resource, tool::{Tool, ToolAnnotations}, - Content, }; -use mcp_server::router::CapabilitiesBuilder; use mcp_server::Router; +use mcp_server::router::CapabilitiesBuilder; mod docx_tool; mod pdf_tool; mod xlsx_tool; mod platform; -use platform::{create_system_automation, SystemAutomation}; +use platform::{SystemAutomation, create_system_automation}; /// An extension designed for non-developers to help them with common tasks like /// web scraping, data processing, and automation. @@ -625,37 +625,38 @@ impl ComputerControllerRouter { } // Process based on save_as parameter - let (content, extension) = - match save_as { - "text" => { - let text = response.text().await.map_err(|e| { - ToolError::ExecutionError(format!("Failed to get text: {}", e)) - })?; - (text.into_bytes(), "txt") - } - "json" => { - let text = response.text().await.map_err(|e| { - ToolError::ExecutionError(format!("Failed to get text: {}", e)) - })?; - // Verify it's valid JSON - serde_json::from_str::(&text).map_err(|e| { - ToolError::ExecutionError(format!("Invalid JSON response: {}", e)) - })?; - (text.into_bytes(), "json") - } - "binary" => { - let bytes = response.bytes().await.map_err(|e| { - ToolError::ExecutionError(format!("Failed to get bytes: {}", e)) - })?; - (bytes.to_vec(), "bin") - } - _ => { - return Err(ToolError::InvalidParameters(format!( + let (content, extension) = match save_as { + "text" => { + let text = response + .text() + .await + .map_err(|e| ToolError::ExecutionError(format!("Failed to get text: {}", e)))?; + (text.into_bytes(), "txt") + } + "json" => { + let text = response + .text() + .await + .map_err(|e| ToolError::ExecutionError(format!("Failed to get text: {}", e)))?; + // Verify it's valid JSON + serde_json::from_str::(&text).map_err(|e| { + ToolError::ExecutionError(format!("Invalid JSON response: {}", e)) + })?; + (text.into_bytes(), "json") + } + "binary" => { + let bytes = response.bytes().await.map_err(|e| { + ToolError::ExecutionError(format!("Failed to get bytes: {}", e)) + })?; + (bytes.to_vec(), "bin") + } + _ => { + return Err(ToolError::InvalidParameters(format!( "Invalid 'save_as' parameter: {}. Valid options are: 'text', 'json', 'binary'", save_as ))); - } - }; + } + }; // Save to cache let cache_path = self.save_to_cache(&content, "web", extension).await?; @@ -739,9 +740,10 @@ impl ComputerControllerRouter { script_path.display().to_string() } _ => { - return Err( ToolError::InvalidParameters( - format!("Invalid 'language' parameter: {}. Valid options are: 'shell', 'batch', 'ruby', 'powershell", language) - )); + return Err(ToolError::InvalidParameters(format!( + "Invalid 'language' parameter: {}. Valid options are: 'shell', 'batch', 'ruby', 'powershell", + language + ))); } }; @@ -1095,7 +1097,7 @@ impl ComputerControllerRouter { _ => Err(ToolError::InvalidParameters(format!( "Invalid 'command' parameter: {}. Valid options are: 'list', 'view', 'delete', 'clear'", command - ))) + ))), } } } diff --git a/crates/goose-mcp/src/computercontroller/pdf_tool.rs b/crates/goose-mcp/src/computercontroller/pdf_tool.rs index 69728ea87f11..6a127d610bc3 100644 --- a/crates/goose-mcp/src/computercontroller/pdf_tool.rs +++ b/crates/goose-mcp/src/computercontroller/pdf_tool.rs @@ -1,4 +1,4 @@ -use lopdf::{content::Content as PdfContent, Document, Object}; +use lopdf::{Document, Object, content::Content as PdfContent}; use mcp_core::{Content, ToolError}; use std::{fs, path::Path}; @@ -56,10 +56,7 @@ pub async fn pdf_tool( let mut last_was_text = false; for element in arr { match element { - Object::String( - bytes, - _, - ) => { + Object::String(bytes, _) => { if let Ok(s) = std::str::from_utf8( bytes, @@ -315,7 +312,7 @@ pub async fn pdf_tool( return Err(ToolError::InvalidParameters(format!( "Invalid operation: {}. Valid operations are: 'extract_text', 'extract_images'", operation - ))) + ))); } }; diff --git a/crates/goose-mcp/src/developer/editor_models/morphllm_editor.rs b/crates/goose-mcp/src/developer/editor_models/morphllm_editor.rs index 8c5d60f8f813..5486223ffa69 100644 --- a/crates/goose-mcp/src/developer/editor_models/morphllm_editor.rs +++ b/crates/goose-mcp/src/developer/editor_models/morphllm_editor.rs @@ -1,7 +1,7 @@ use super::EditorModelImpl; use anyhow::Result; use reqwest::Client; -use serde_json::{json, Value}; +use serde_json::{Value, json}; /// MorphLLM editor that uses the standard chat completions format #[derive(Debug)] diff --git a/crates/goose-mcp/src/developer/editor_models/openai_compatible_editor.rs b/crates/goose-mcp/src/developer/editor_models/openai_compatible_editor.rs index 313b7a873d97..a70628560290 100644 --- a/crates/goose-mcp/src/developer/editor_models/openai_compatible_editor.rs +++ b/crates/goose-mcp/src/developer/editor_models/openai_compatible_editor.rs @@ -1,7 +1,7 @@ use super::EditorModelImpl; use anyhow::Result; use reqwest::Client; -use serde_json::{json, Value}; +use serde_json::{Value, json}; /// OpenAI-compatible editor that uses the standard chat completions format #[derive(Debug)] diff --git a/crates/goose-mcp/src/developer/editor_models/relace_editor.rs b/crates/goose-mcp/src/developer/editor_models/relace_editor.rs index 3cc40bfb13a3..e7ee2b75bb86 100644 --- a/crates/goose-mcp/src/developer/editor_models/relace_editor.rs +++ b/crates/goose-mcp/src/developer/editor_models/relace_editor.rs @@ -1,7 +1,7 @@ use super::EditorModelImpl; use anyhow::Result; use reqwest::Client; -use serde_json::{json, Value}; +use serde_json::{Value, json}; /// Relace-specific editor that uses the predicted outputs convention #[derive(Debug)] diff --git a/crates/goose-mcp/src/developer/mod.rs b/crates/goose-mcp/src/developer/mod.rs index 6b20156df631..fe8e5e8759e9 100644 --- a/crates/goose-mcp/src/developer/mod.rs +++ b/crates/goose-mcp/src/developer/mod.rs @@ -4,9 +4,9 @@ mod shell; use anyhow::Result; use base64::Engine; -use etcetera::{choose_app_strategy, AppStrategy}; +use etcetera::{AppStrategy, choose_app_strategy}; use indoc::formatdoc; -use serde_json::{json, Value}; +use serde_json::{Value, json}; use std::{ collections::HashMap, future::Future, @@ -21,24 +21,24 @@ use tokio::{ }; use url::Url; -use include_dir::{include_dir, Dir}; +use include_dir::{Dir, include_dir}; use mcp_core::{ + Content, handler::{PromptError, ResourceError, ToolError}, protocol::{JsonRpcMessage, JsonRpcNotification, ServerCapabilities}, resource::Resource, tool::Tool, - Content, }; use mcp_core::{ prompt::{Prompt, PromptArgument, PromptTemplate}, tool::ToolAnnotations, }; -use mcp_server::router::CapabilitiesBuilder; use mcp_server::Router; +use mcp_server::router::CapabilitiesBuilder; use mcp_core::role::Role; -use self::editor_models::{create_editor_model, EditorModel}; +use self::editor_models::{EditorModel, create_editor_model}; use self::shell::{expand_path, get_shell_config, is_absolute_path, normalize_line_endings}; use indoc::indoc; use std::process::Stdio; @@ -740,11 +740,9 @@ impl DeveloperRouter { let char_count = output_str.chars().count(); if char_count > MAX_CHAR_COUNT { return Err(ToolError::ExecutionError(format!( - "Shell output from command '{}' has too many characters ({}). Maximum character count is {}.", - command, - char_count, - MAX_CHAR_COUNT - ))); + "Shell output from command '{}' has too many characters ({}). Maximum character count is {}.", + command, char_count, MAX_CHAR_COUNT + ))); } Ok(vec![ @@ -2337,22 +2335,30 @@ mod tests { let text_editor_tool = tools.iter().find(|t| t.name == "text_editor").unwrap(); // Should use traditional description with str_replace command - assert!(text_editor_tool - .description - .contains("Replace a string in a file with a new string")); - assert!(text_editor_tool - .description - .contains("the `old_str` needs to exactly match one")); + assert!( + text_editor_tool + .description + .contains("Replace a string in a file with a new string") + ); + assert!( + text_editor_tool + .description + .contains("the `old_str` needs to exactly match one") + ); assert!(text_editor_tool.description.contains("str_replace")); // Should not contain editor API description or edit_file command - assert!(!text_editor_tool - .description - .contains("Edit the file with the new content")); + assert!( + !text_editor_tool + .description + .contains("Edit the file with the new content") + ); assert!(!text_editor_tool.description.contains("edit_file")); - assert!(!text_editor_tool - .description - .contains("work out how to place old_str with it intelligently")); + assert!( + !text_editor_tool + .description + .contains("work out how to place old_str with it intelligently") + ); temp_dir.close().unwrap(); } diff --git a/crates/goose-mcp/src/google_drive/mod.rs b/crates/goose-mcp/src/google_drive/mod.rs index 627af7f685b9..f6402b0edd96 100644 --- a/crates/goose-mcp/src/google_drive/mod.rs +++ b/crates/goose-mcp/src/google_drive/mod.rs @@ -11,7 +11,7 @@ use mcp_core::protocol::JsonRpcMessage; use mcp_core::tool::ToolAnnotations; use oauth_pkce::PkceOAuth2Client; use regex::Regex; -use serde_json::{json, Value}; +use serde_json::{Value, json}; use std::io::Cursor; use std::{env, fs, future::Future, path::Path, pin::Pin, sync::Arc}; use storage::CredentialsManager; @@ -25,20 +25,19 @@ use mcp_core::{ resource::Resource, tool::Tool, }; -use mcp_server::router::CapabilitiesBuilder; use mcp_server::Router; +use mcp_server::router::CapabilitiesBuilder; use google_docs1::{self, Docs}; use google_drive3::common::ReadSeek; use google_drive3::{ - self, + self, DriveHub, api::{ Comment, File, FileShortcutDetails, LabelFieldModification, LabelModification, ModifyLabelsRequest, Permission, Reply, Scope, }, hyper_rustls::{self, HttpsConnector}, hyper_util::{self, client::legacy::connect::HttpConnector}, - DriveHub, }; use google_labels::DriveLabelsHub; use google_sheets4::{self, Sheets}; @@ -1124,7 +1123,7 @@ impl GoogleDriveRouter { return Err(ToolError::ExecutionError(format!( "Failed to execute google drive label list '{}'.", e - ))) + ))); } }; let label_ids = label_results @@ -1285,8 +1284,8 @@ impl GoogleDriveRouter { "Failed to execute google drive export for {}, {}.", uri, e ))), - Ok(r) => { - match r.into_body().collect().await { Ok(body) => { + Ok(r) => match r.into_body().collect().await { + Ok(body) => { if let Ok(response) = String::from_utf8(body.to_bytes().to_vec()) { if !include_images { let content = self.strip_image_body(&response); @@ -1310,13 +1309,12 @@ impl GoogleDriveRouter { uri, ))) } - } _ => { - Err(ToolError::ExecutionError(format!( - "Failed to export google drive document, {}.", - uri, - ))) - }} - } + } + _ => Err(ToolError::ExecutionError(format!( + "Failed to export google drive document, {}.", + uri, + ))), + }, } } @@ -1344,36 +1342,37 @@ impl GoogleDriveRouter { ))), Ok(r) => { if mime_type.starts_with("text/") || mime_type == "application/json" { - match r.0.into_body().collect().await { Ok(body) => { - if let Ok(response) = String::from_utf8(body.to_bytes().to_vec()) { - if !include_images { - let content = self.strip_image_body(&response); - Ok(vec![Content::text(content).with_priority(0.1)]) + match r.0.into_body().collect().await { + Ok(body) => { + if let Ok(response) = String::from_utf8(body.to_bytes().to_vec()) { + if !include_images { + let content = self.strip_image_body(&response); + Ok(vec![Content::text(content).with_priority(0.1)]) + } else { + let images = self.resize_images(&response).map_err(|e| { + ToolError::ExecutionError(format!( + "Failed to resize image(s): {}", + e + )) + })?; + + let content = self.strip_image_body(&response); + Ok(std::iter::once(Content::text(content).with_priority(0.1)) + .chain(images.iter().cloned()) + .collect::>()) + } } else { - let images = self.resize_images(&response).map_err(|e| { - ToolError::ExecutionError(format!( - "Failed to resize image(s): {}", - e - )) - })?; - - let content = self.strip_image_body(&response); - Ok(std::iter::once(Content::text(content).with_priority(0.1)) - .chain(images.iter().cloned()) - .collect::>()) + Err(ToolError::ExecutionError(format!( + "Failed to convert google drive to string, {}.", + uri, + ))) } - } else { - Err(ToolError::ExecutionError(format!( - "Failed to convert google drive to string, {}.", - uri, - ))) } - } _ => { - Err(ToolError::ExecutionError(format!( + _ => Err(ToolError::ExecutionError(format!( "Failed to get google drive document, {}.", uri, - ))) - }} + ))), + } } else { //TODO: handle base64 image case, see typscript mcp-gdrive Err(ToolError::ExecutionError(format!( @@ -1501,7 +1500,7 @@ impl GoogleDriveRouter { Ok(vec![Content::text(sheets_info).with_priority(0.1)]) } } - }, + } "get_columns" => { // Get the sheet name if provided, otherwise we'll use the first sheet let sheet_name = params @@ -1543,14 +1542,13 @@ impl GoogleDriveRouter { Ok(vec![Content::text(headers).with_priority(0.1)]) } } - }, + } "get_values" => { - let range = params - .get("range") - .and_then(|q| q.as_str()) - .ok_or(ToolError::InvalidParameters( + let range = params.get("range").and_then(|q| q.as_str()).ok_or( + ToolError::InvalidParameters( "The range is required for get_values operation".to_string(), - ))?; + ), + )?; let result = self .sheets @@ -1588,21 +1586,19 @@ impl GoogleDriveRouter { Ok(vec![Content::text(csv_content).with_priority(0.1)]) } } - }, + } "update_values" => { - let range = params - .get("range") - .and_then(|q| q.as_str()) - .ok_or(ToolError::InvalidParameters( + let range = params.get("range").and_then(|q| q.as_str()).ok_or( + ToolError::InvalidParameters( "The range is required for update_values operation".to_string(), - ))?; + ), + )?; - let values_csv = params - .get("values") - .and_then(|q| q.as_str()) - .ok_or(ToolError::InvalidParameters( + let values_csv = params.get("values").and_then(|q| q.as_str()).ok_or( + ToolError::InvalidParameters( "The values parameter is required for update_values operation".to_string(), - ))?; + ), + )?; // Parse the CSV data into a 2D array of values let mut values: Vec> = Vec::new(); @@ -1660,21 +1656,19 @@ impl GoogleDriveRouter { Ok(vec![Content::text(response).with_priority(0.1)]) } } - }, + } "update_cell" => { - let cell = params - .get("cell") - .and_then(|q| q.as_str()) - .ok_or(ToolError::InvalidParameters( + let cell = params.get("cell").and_then(|q| q.as_str()).ok_or( + ToolError::InvalidParameters( "The cell parameter is required for update_cell operation".to_string(), - ))?; + ), + )?; - let value = params - .get("value") - .and_then(|q| q.as_str()) - .ok_or(ToolError::InvalidParameters( + let value = params.get("value").and_then(|q| q.as_str()).ok_or( + ToolError::InvalidParameters( "The value parameter is required for update_cell operation".to_string(), - ))?; + ), + )?; // Determine the input option (default to USER_ENTERED) let value_input_option = params @@ -1709,20 +1703,22 @@ impl GoogleDriveRouter { let update_response = r.1; let updated_range = update_response.updated_range.unwrap_or_default(); - Ok(vec![Content::text(format!( - "Successfully updated cell '{}' with value '{}'.", - updated_range, value - )).with_priority(0.1)]) + Ok(vec![ + Content::text(format!( + "Successfully updated cell '{}' with value '{}'.", + updated_range, value + )) + .with_priority(0.1), + ]) } } - }, + } "add_sheet" => { - let title = params - .get("title") - .and_then(|q| q.as_str()) - .ok_or(ToolError::InvalidParameters( + let title = params.get("title").and_then(|q| q.as_str()).ok_or( + ToolError::InvalidParameters( "The title parameter is required for add_sheet operation".to_string(), - ))?; + ), + )?; // Create the AddSheetReques let add_sheet_request = google_sheets4::api::AddSheetRequest { @@ -1787,20 +1783,19 @@ impl GoogleDriveRouter { } // Generic success message if we couldn't extract specific details - Ok(vec![Content::text(format!( - "Successfully added new sheet '{}'.", - title - )).with_priority(0.1)]) + Ok(vec![ + Content::text(format!("Successfully added new sheet '{}'.", title)) + .with_priority(0.1), + ]) } } - }, + } "clear_values" => { - let range = params - .get("range") - .and_then(|q| q.as_str()) - .ok_or(ToolError::InvalidParameters( + let range = params.get("range").and_then(|q| q.as_str()).ok_or( + ToolError::InvalidParameters( "The range is required for clear_values operation".to_string(), - ))?; + ), + )?; // Create the ClearValuesReques let clear_values_request = google_sheets4::api::ClearValuesRequest::default(); @@ -1824,13 +1819,16 @@ impl GoogleDriveRouter { let response = r.1; let cleared_range = response.cleared_range.unwrap_or_default(); - Ok(vec![Content::text(format!( - "Successfully cleared values in range '{}'.", - cleared_range - )).with_priority(0.1)]) + Ok(vec![ + Content::text(format!( + "Successfully cleared values in range '{}'.", + cleared_range + )) + .with_priority(0.1), + ]) } } - }, + } _ => Err(ToolError::InvalidParameters(format!( "Invalid operation: {}. Supported operations are: list_sheets, get_columns, get_values, update_values, update_cell, add_sheet, clear_values", operation @@ -2075,7 +2073,7 @@ impl GoogleDriveRouter { (None, None) | (Some(_), Some(_)) => { return Err(ToolError::InvalidParameters( "Either the body or path param is required".to_string(), - )) + )); } (Some(b), None) => Box::new(Cursor::new(b.as_bytes().to_owned())), (None, Some(p)) => Box::new(std::fs::File::open(p).map_err(|e| { @@ -2294,7 +2292,7 @@ impl GoogleDriveRouter { return Err(ToolError::InvalidParameters(format!( "Label operation invalid: {:?}", op.get("operation") - ))) + ))); } } }; @@ -2378,7 +2376,7 @@ impl GoogleDriveRouter { (None, None) | (Some(_), Some(_)) => { return Err(ToolError::InvalidParameters( "Either the body or path param is required".to_string(), - )) + )); } (Some(b), None) => Box::new(Cursor::new(b.as_bytes().to_owned())), (None, Some(p)) => Box::new(std::fs::File::open(p).map_err(|e| { @@ -2435,7 +2433,7 @@ impl GoogleDriveRouter { return Err(ToolError::ExecutionError(format!( "Failed to execute google drive comment list, {}.", e - ))) + ))); } Ok(r) => { let mut content = @@ -2626,14 +2624,18 @@ impl GoogleDriveRouter { Ok(vec![Content::text(content).with_priority(0.1)]) } } - }, + } "insert_text" => { let text = params.get("text").and_then(|q| q.as_str()).ok_or( - ToolError::InvalidParameters("The text parameter is required for insert_text operation".to_string()), + ToolError::InvalidParameters( + "The text parameter is required for insert_text operation".to_string(), + ), )?; let position = params.get("position").and_then(|q| q.as_i64()).ok_or( - ToolError::InvalidParameters("The position parameter is required for insert_text operation".to_string()), + ToolError::InvalidParameters( + "The position parameter is required for insert_text operation".to_string(), + ), )?; // Create the insert text request @@ -2670,17 +2672,20 @@ impl GoogleDriveRouter { "Failed to execute Google Docs insert_text operation, {}.", e ))), - Ok(_) => { - Ok(vec![Content::text(format!( + Ok(_) => Ok(vec![ + Content::text(format!( "Successfully inserted text at position {}.", position - )).with_priority(0.1)]) - } + )) + .with_priority(0.1), + ]), } - }, + } "append_text" => { let text = params.get("text").and_then(|q| q.as_str()).ok_or( - ToolError::InvalidParameters("The text parameter is required for append_text operation".to_string()), + ToolError::InvalidParameters( + "The text parameter is required for append_text operation".to_string(), + ), )?; // First, get the document to find the end position @@ -2699,15 +2704,15 @@ impl GoogleDriveRouter { "Failed to get document to determine end position, {}.", e ))); - }, + } Ok(r) => { let document = r.1; if let Some(body) = document.body { - body.content.and_then(|content| { - content.last().and_then(|last_item| { - last_item.end_index + body.content + .and_then(|content| { + content.last().and_then(|last_item| last_item.end_index) }) - }).unwrap_or(1) // Default to 1 if we can't determine the end position + .unwrap_or(1) // Default to 1 if we can't determine the end position } else { 1 // Default to 1 if there's no body } @@ -2748,18 +2753,24 @@ impl GoogleDriveRouter { "Failed to execute Google Docs append_text operation, {}.", e ))), - Ok(_) => { - Ok(vec![Content::text("Successfully appended text to the document.").with_priority(0.1)]) - } + Ok(_) => Ok(vec![ + Content::text("Successfully appended text to the document.") + .with_priority(0.1), + ]), } - }, + } "replace_text" => { let text = params.get("text").and_then(|q| q.as_str()).ok_or( - ToolError::InvalidParameters("The text parameter is required for replace_text operation".to_string()), + ToolError::InvalidParameters( + "The text parameter is required for replace_text operation".to_string(), + ), )?; let replace_text = params.get("replaceText").and_then(|q| q.as_str()).ok_or( - ToolError::InvalidParameters("The replaceText parameter is required for replace_text operation".to_string()), + ToolError::InvalidParameters( + "The replaceText parameter is required for replace_text operation" + .to_string(), + ), )?; // Create the replace all text request @@ -2808,16 +2819,21 @@ impl GoogleDriveRouter { }) .unwrap_or(0); - Ok(vec![Content::text(format!( - "Successfully replaced {} occurrences of '{}' with '{}'.", - replacements, replace_text, text - )).with_priority(0.1)]) + Ok(vec![ + Content::text(format!( + "Successfully replaced {} occurrences of '{}' with '{}'.", + replacements, replace_text, text + )) + .with_priority(0.1), + ]) } } - }, + } "create_paragraph" => { let text = params.get("text").and_then(|q| q.as_str()).ok_or( - ToolError::InvalidParameters("The text parameter is required for create_paragraph operation".to_string()), + ToolError::InvalidParameters( + "The text parameter is required for create_paragraph operation".to_string(), + ), )?; // Get the end position of the document @@ -2836,15 +2852,15 @@ impl GoogleDriveRouter { "Failed to get document to determine end position, {}.", e ))); - }, + } Ok(r) => { let document = r.1; if let Some(body) = document.body { - body.content.and_then(|content| { - content.last().and_then(|last_item| { - last_item.end_index + body.content + .and_then(|content| { + content.last().and_then(|last_item| last_item.end_index) }) - }).unwrap_or(1) // Default to 1 if we can't determine the end position + .unwrap_or(1) // Default to 1 if we can't determine the end position } else { 1 // Default to 1 if there's no body } @@ -2885,18 +2901,24 @@ impl GoogleDriveRouter { "Failed to execute Google Docs create_paragraph operation, {}.", e ))), - Ok(_) => { - Ok(vec![Content::text("Successfully created a new paragraph.").with_priority(0.1)]) - } + Ok(_) => Ok(vec![ + Content::text("Successfully created a new paragraph.").with_priority(0.1), + ]), } - }, + } "delete_content" => { let start_position = params.get("startPosition").and_then(|q| q.as_i64()).ok_or( - ToolError::InvalidParameters("The startPosition parameter is required for delete_content operation".to_string()), + ToolError::InvalidParameters( + "The startPosition parameter is required for delete_content operation" + .to_string(), + ), )?; let end_position = params.get("endPosition").and_then(|q| q.as_i64()).ok_or( - ToolError::InvalidParameters("The endPosition parameter is required for delete_content operation".to_string()), + ToolError::InvalidParameters( + "The endPosition parameter is required for delete_content operation" + .to_string(), + ), )?; // Create the delete content range request @@ -2932,14 +2954,15 @@ impl GoogleDriveRouter { "Failed to execute Google Docs delete_content operation, {}.", e ))), - Ok(_) => { - Ok(vec![Content::text(format!( + Ok(_) => Ok(vec![ + Content::text(format!( "Successfully deleted content from position {} to {}.", start_position, end_position - )).with_priority(0.1)]) - } + )) + .with_priority(0.1), + ]), } - }, + } _ => Err(ToolError::InvalidParameters(format!( "Invalid operation: {}. Supported operations are: get_document, insert_text, append_text, replace_text, create_paragraph, delete_content", operation @@ -2973,7 +2996,7 @@ impl GoogleDriveRouter { return Err(ToolError::ExecutionError(format!( "Failed to execute google drive list, {}.", e - ))) + ))); } Ok(r) => { let mut content = @@ -3012,7 +3035,8 @@ impl GoogleDriveRouter { p.permission_details.unwrap_or_default(), p.role.unwrap_or_default(), p.type_.unwrap_or_default(), - p.id.unwrap_or_default()) + p.id.unwrap_or_default() + ) } async fn get_permissions(&self, params: Value) -> Result, ToolError> { @@ -3046,7 +3070,7 @@ impl GoogleDriveRouter { return Err(ToolError::ExecutionError(format!( "Failed to execute google drive list, {}.", e - ))) + ))); } Ok(r) => { let mut content = @@ -3107,7 +3131,7 @@ impl GoogleDriveRouter { return Err(ToolError::InvalidParameters( "The 'create' operation requires the 'role' and 'type' parameters." .to_string(), - )) + )); } }; let mut req = Permission { @@ -3125,7 +3149,7 @@ impl GoogleDriveRouter { return Err(ToolError::InvalidParameters(format!( "The '{}' operation for type '{}' requires the 'target' parameter.", operation, permission_type - ))) + ))); } } @@ -3156,7 +3180,7 @@ impl GoogleDriveRouter { return Err(ToolError::InvalidParameters( "The 'update' operation requires the 'permissionId', and 'role'." .to_string(), - )) + )); } }; // A permission update requires a permissionId, which is also diff --git a/crates/goose-mcp/src/google_drive/oauth_pkce.rs b/crates/goose-mcp/src/google_drive/oauth_pkce.rs index 47708b953259..52b842514cea 100644 --- a/crates/goose-mcp/src/google_drive/oauth_pkce.rs +++ b/crates/goose-mcp/src/google_drive/oauth_pkce.rs @@ -256,8 +256,8 @@ impl PkceOAuth2Client { Ok(access_token) } - fn start_redirect_server( - ) -> Result<(AuthorizationCode, CsrfToken), Box> { + fn start_redirect_server() + -> Result<(AuthorizationCode, CsrfToken), Box> { let listener = TcpListener::bind("127.0.0.1:18080")?; println!("Listening for the authorization code on http://localhost:18080"); diff --git a/crates/goose-mcp/src/google_drive/storage.rs b/crates/goose-mcp/src/google_drive/storage.rs index 8e8f3c08dec3..8fadb6aba74f 100644 --- a/crates/goose-mcp/src/google_drive/storage.rs +++ b/crates/goose-mcp/src/google_drive/storage.rs @@ -1,6 +1,6 @@ use anyhow::Result; use keyring::Entry; -use serde::{de::DeserializeOwned, Serialize}; +use serde::{Serialize, de::DeserializeOwned}; use std::fs; use std::path::Path; use thiserror::Error; diff --git a/crates/goose-mcp/src/jetbrains/mod.rs b/crates/goose-mcp/src/jetbrains/mod.rs index c015b9deae74..dc35935dfead 100644 --- a/crates/goose-mcp/src/jetbrains/mod.rs +++ b/crates/goose-mcp/src/jetbrains/mod.rs @@ -10,14 +10,14 @@ use mcp_core::{ role::Role, tool::Tool, }; -use mcp_server::router::CapabilitiesBuilder; use mcp_server::Router; +use mcp_server::router::CapabilitiesBuilder; use serde_json::Value; use std::future::Future; use std::pin::Pin; use std::sync::Arc; -use tokio::sync::{mpsc, Mutex}; -use tokio::time::{sleep, Duration}; +use tokio::sync::{Mutex, mpsc}; +use tokio::time::{Duration, sleep}; use tracing::error; use self::proxy::JetBrainsProxy; diff --git a/crates/goose-mcp/src/jetbrains/proxy.rs b/crates/goose-mcp/src/jetbrains/proxy.rs index 382f271497f1..5f0921fb7d5b 100644 --- a/crates/goose-mcp/src/jetbrains/proxy.rs +++ b/crates/goose-mcp/src/jetbrains/proxy.rs @@ -1,4 +1,4 @@ -use anyhow::{anyhow, Result}; +use anyhow::{Result, anyhow}; use mcp_core::{Content, Tool}; use reqwest::Client; use serde::{Deserialize, Serialize}; diff --git a/crates/goose-mcp/src/memory/mod.rs b/crates/goose-mcp/src/memory/mod.rs index eb5adaeeaff4..ccc8985dc83d 100644 --- a/crates/goose-mcp/src/memory/mod.rs +++ b/crates/goose-mcp/src/memory/mod.rs @@ -1,7 +1,7 @@ use async_trait::async_trait; -use etcetera::{choose_app_strategy, AppStrategy}; +use etcetera::{AppStrategy, choose_app_strategy}; use indoc::formatdoc; -use serde_json::{json, Value}; +use serde_json::{Value, json}; use std::{ collections::HashMap, fs, @@ -13,15 +13,15 @@ use std::{ use tokio::sync::mpsc; use mcp_core::{ + Content, handler::{PromptError, ResourceError, ToolError}, prompt::Prompt, protocol::{JsonRpcMessage, ServerCapabilities}, resource::Resource, tool::{Tool, ToolAnnotations, ToolCall}, - Content, }; -use mcp_server::router::CapabilitiesBuilder; use mcp_server::Router; +use mcp_server::router::CapabilitiesBuilder; // MemoryRouter implementation #[derive(Clone)] @@ -608,7 +608,7 @@ impl<'a> MemoryArgs<'a> { return Err(io::Error::new( io::ErrorKind::InvalidInput, "is_global must be a boolean or string 'true'/'false'", - )) + )); } }; diff --git a/crates/goose-mcp/src/tutorial/mod.rs b/crates/goose-mcp/src/tutorial/mod.rs index ea9e32f08589..3318aa883990 100644 --- a/crates/goose-mcp/src/tutorial/mod.rs +++ b/crates/goose-mcp/src/tutorial/mod.rs @@ -1,7 +1,7 @@ use anyhow::Result; -use include_dir::{include_dir, Dir}; +use include_dir::{Dir, include_dir}; use indoc::formatdoc; -use serde_json::{json, Value}; +use serde_json::{Value, json}; use std::{future::Future, pin::Pin}; use tokio::sync::mpsc; @@ -13,8 +13,8 @@ use mcp_core::{ role::Role, tool::{Tool, ToolAnnotations}, }; -use mcp_server::router::CapabilitiesBuilder; use mcp_server::Router; +use mcp_server::router::CapabilitiesBuilder; use mcp_core::content::Content; @@ -148,7 +148,7 @@ impl Router for TutorialRouter { let content = this.load_tutorial(name).await?; Ok(vec![ - Content::text(content).with_audience(vec![Role::Assistant]) + Content::text(content).with_audience(vec![Role::Assistant]), ]) } _ => Err(ToolError::NotFound(format!("Tool {} not found", tool_name))), diff --git a/crates/goose-server/src/commands/agent.rs b/crates/goose-server/src/commands/agent.rs index 5fdfa89ae2ee..7f3c49ff7142 100644 --- a/crates/goose-server/src/commands/agent.rs +++ b/crates/goose-server/src/commands/agent.rs @@ -3,7 +3,7 @@ use std::sync::Arc; use crate::configuration; use crate::state; use anyhow::Result; -use etcetera::{choose_app_strategy, AppStrategy}; +use etcetera::{AppStrategy, choose_app_strategy}; use goose::agents::Agent; use goose::config::APP_STRATEGY; use goose::scheduler_factory::SchedulerFactory; diff --git a/crates/goose-server/src/configuration.rs b/crates/goose-server/src/configuration.rs index f0f3349bace1..d32770e8c08e 100644 --- a/crates/goose-server/src/configuration.rs +++ b/crates/goose-server/src/configuration.rs @@ -1,4 +1,4 @@ -use crate::error::{to_env_var, ConfigError}; +use crate::error::{ConfigError, to_env_var}; use config::{Config, Environment}; use serde::Deserialize; use std::net::SocketAddr; diff --git a/crates/goose-server/src/logging.rs b/crates/goose-server/src/logging.rs index ed69d52d818b..066dfbc119f0 100644 --- a/crates/goose-server/src/logging.rs +++ b/crates/goose-server/src/logging.rs @@ -1,11 +1,11 @@ use anyhow::{Context, Result}; -use etcetera::{choose_app_strategy, AppStrategy}; +use etcetera::{AppStrategy, choose_app_strategy}; use std::fs; use std::path::PathBuf; use tracing_appender::rolling::Rotation; use tracing_subscriber::{ - filter::LevelFilter, fmt, layer::SubscriberExt, util::SubscriberInitExt, EnvFilter, Layer, - Registry, + EnvFilter, Layer, Registry, filter::LevelFilter, fmt, layer::SubscriberExt, + util::SubscriberInitExt, }; use goose::config::APP_STRATEGY; @@ -97,16 +97,19 @@ pub fn setup_logging(name: Option<&str>) -> Result<()> { .with(console_layer.with_filter(LevelFilter::INFO)); // Initialize with Langfuse if available - match langfuse_layer::create_langfuse_observer() { Some(langfuse) => { - subscriber - .with(langfuse.with_filter(LevelFilter::DEBUG)) - .try_init() - .context("Failed to set global subscriber")?; - } _ => { - subscriber - .try_init() - .context("Failed to set global subscriber")?; - }} + match langfuse_layer::create_langfuse_observer() { + Some(langfuse) => { + subscriber + .with(langfuse.with_filter(LevelFilter::DEBUG)) + .try_init() + .context("Failed to set global subscriber")?; + } + _ => { + subscriber + .try_init() + .context("Failed to set global subscriber")?; + } + } Ok(()) } diff --git a/crates/goose-server/src/openapi.rs b/crates/goose-server/src/openapi.rs index ae77398fcf83..2384a0b80e1c 100644 --- a/crates/goose-server/src/openapi.rs +++ b/crates/goose-server/src/openapi.rs @@ -1,16 +1,16 @@ +use goose::agents::ExtensionConfig; use goose::agents::extension::Envs; use goose::agents::extension::ToolInfo; -use goose::agents::ExtensionConfig; -use goose::config::permission::PermissionLevel; use goose::config::ExtensionEntry; +use goose::config::permission::PermissionLevel; use goose::message::{ ContextLengthExceeded, FrontendToolRequest, Message, MessageContent, RedactedThinkingContent, SummarizationRequested, ThinkingContent, ToolConfirmationRequest, ToolRequest, ToolResponse, }; use goose::permission::permission_confirmation::PrincipalType; use goose::providers::base::{ConfigKey, ModelInfo, ProviderMetadata}; -use goose::session::info::SessionInfo; use goose::session::SessionMetadata; +use goose::session::info::SessionInfo; use mcp_core::content::{Annotations, Content, EmbeddedResource, ImageContent, TextContent}; use mcp_core::handler::ToolResultSchema; use mcp_core::resource::ResourceContents; diff --git a/crates/goose-server/src/routes/agent.rs b/crates/goose-server/src/routes/agent.rs index 7167dcae5737..ff84c2a24254 100644 --- a/crates/goose-server/src/routes/agent.rs +++ b/crates/goose-server/src/routes/agent.rs @@ -1,10 +1,10 @@ use super::utils::verify_secret_key; use crate::state::AppState; use axum::{ + Json, Router, extract::{Query, State}, http::{HeaderMap, StatusCode}, routing::{get, post}, - Json, Router, }; use goose::config::Config; use goose::config::PermissionManager; diff --git a/crates/goose-server/src/routes/audio.rs b/crates/goose-server/src/routes/audio.rs index e0071249b79f..49d86a6a59c6 100644 --- a/crates/goose-server/src/routes/audio.rs +++ b/crates/goose-server/src/routes/audio.rs @@ -5,12 +5,12 @@ use super::utils::verify_secret_key; use crate::state::AppState; use axum::{ + Json, Router, extract::State, http::{HeaderMap, StatusCode}, routing::{get, post}, - Json, Router, }; -use base64::{engine::general_purpose::STANDARD as BASE64, Engine}; +use base64::{Engine, engine::general_purpose::STANDARD as BASE64}; use reqwest::Client; use serde::{Deserialize, Serialize}; use std::sync::Arc; diff --git a/crates/goose-server/src/routes/config_management.rs b/crates/goose-server/src/routes/config_management.rs index e21963a062a7..ecd5f63708c0 100644 --- a/crates/goose-server/src/routes/config_management.rs +++ b/crates/goose-server/src/routes/config_management.rs @@ -2,15 +2,15 @@ use super::utils::verify_secret_key; use crate::routes::utils::check_provider_configured; use crate::state::AppState; use axum::{ + Json, Router, extract::State, routing::{delete, get, post}, - Json, Router, }; -use etcetera::{choose_app_strategy, AppStrategy}; -use goose::config::Config; +use etcetera::{AppStrategy, choose_app_strategy}; use goose::config::APP_STRATEGY; -use goose::config::{extensions::name_to_key, PermissionManager}; +use goose::config::Config; use goose::config::{ExtensionConfigManager, ExtensionEntry}; +use goose::config::{PermissionManager, extensions::name_to_key}; use goose::model::ModelConfig; use goose::providers::base::ProviderMetadata; use goose::providers::pricing::{ diff --git a/crates/goose-server/src/routes/context.rs b/crates/goose-server/src/routes/context.rs index 0630b607219f..07a6772bf124 100644 --- a/crates/goose-server/src/routes/context.rs +++ b/crates/goose-server/src/routes/context.rs @@ -1,10 +1,10 @@ use super::utils::verify_secret_key; use crate::state::AppState; use axum::{ + Json, Router, extract::State, http::{HeaderMap, StatusCode}, routing::post, - Json, Router, }; use goose::message::Message; use serde::{Deserialize, Serialize}; diff --git a/crates/goose-server/src/routes/extension.rs b/crates/goose-server/src/routes/extension.rs index 39d8f61bbdaf..dd2d859f61e4 100644 --- a/crates/goose-server/src/routes/extension.rs +++ b/crates/goose-server/src/routes/extension.rs @@ -5,8 +5,8 @@ use std::sync::OnceLock; use super::utils::verify_secret_key; use crate::state::AppState; -use axum::{extract::State, routing::post, Json, Router}; -use goose::agents::{extension::Envs, ExtensionConfig}; +use axum::{Json, Router, extract::State, routing::post}; +use goose::agents::{ExtensionConfig, extension::Envs}; use http::{HeaderMap, StatusCode}; use serde::{Deserialize, Serialize}; use tracing; diff --git a/crates/goose-server/src/routes/health.rs b/crates/goose-server/src/routes/health.rs index aeed1692b983..5b0a46635cf7 100644 --- a/crates/goose-server/src/routes/health.rs +++ b/crates/goose-server/src/routes/health.rs @@ -1,4 +1,4 @@ -use axum::{routing::get, Json, Router}; +use axum::{Json, Router, routing::get}; use serde::Serialize; #[derive(Serialize)] diff --git a/crates/goose-server/src/routes/project.rs b/crates/goose-server/src/routes/project.rs index a83c1a0101e4..280d55a41979 100644 --- a/crates/goose-server/src/routes/project.rs +++ b/crates/goose-server/src/routes/project.rs @@ -3,10 +3,10 @@ use std::sync::Arc; use crate::state::AppState; use axum::{ + Json, Router, extract::{Path, State}, http::{HeaderMap, StatusCode}, routing::{delete, get, post, put}, - Json, Router, }; use goose::project::{Project, ProjectMetadata}; use serde::{Deserialize, Serialize}; diff --git a/crates/goose-server/src/routes/recipe.rs b/crates/goose-server/src/routes/recipe.rs index d2f2df7b5ca3..47305abc7b7f 100644 --- a/crates/goose-server/src/routes/recipe.rs +++ b/crates/goose-server/src/routes/recipe.rs @@ -1,6 +1,6 @@ use std::sync::Arc; -use axum::{extract::State, http::StatusCode, routing::post, Json, Router}; +use axum::{Json, Router, extract::State, http::StatusCode, routing::post}; use goose::message::Message; use goose::recipe::Recipe; use serde::{Deserialize, Serialize}; diff --git a/crates/goose-server/src/routes/reply.rs b/crates/goose-server/src/routes/reply.rs index 55d04d955282..73e32ad24c1f 100644 --- a/crates/goose-server/src/routes/reply.rs +++ b/crates/goose-server/src/routes/reply.rs @@ -1,27 +1,27 @@ use super::utils::verify_secret_key; use crate::state::AppState; use axum::{ + Json, Router, extract::State, http::{self, HeaderMap, StatusCode}, response::IntoResponse, routing::post, - Json, Router, }; use bytes::Bytes; -use futures::{stream::StreamExt, Stream}; +use futures::{Stream, stream::StreamExt}; use goose::{ agents::{AgentEvent, SessionConfig}, - message::{push_message, Message, MessageContent}, + message::{Message, MessageContent, push_message}, permission::permission_confirmation::PrincipalType, }; use goose::{ permission::{Permission, PermissionConfirmation}, session, }; -use mcp_core::{protocol::JsonRpcMessage, role::Role, Content, ToolResult}; +use mcp_core::{Content, ToolResult, protocol::JsonRpcMessage, role::Role}; use serde::{Deserialize, Serialize}; -use serde_json::json; use serde_json::Value; +use serde_json::json; use std::{ convert::Infallible, path::PathBuf, diff --git a/crates/goose-server/src/routes/schedule.rs b/crates/goose-server/src/routes/schedule.rs index 64df30aa5625..aee0c78a7a20 100644 --- a/crates/goose-server/src/routes/schedule.rs +++ b/crates/goose-server/src/routes/schedule.rs @@ -1,10 +1,10 @@ use std::sync::Arc; use axum::{ + Json, Router, extract::{Path, Query, State}, http::{HeaderMap, StatusCode}, routing::{delete, get, post, put}, - Json, Router, }; use serde::{Deserialize, Serialize}; diff --git a/crates/goose-server/src/routes/session.rs b/crates/goose-server/src/routes/session.rs index 8ed509e46f3d..ea7368f3980b 100644 --- a/crates/goose-server/src/routes/session.rs +++ b/crates/goose-server/src/routes/session.rs @@ -5,15 +5,15 @@ use std::sync::Arc; use crate::state::AppState; use axum::{ + Json, Router, extract::{Path, State}, http::{HeaderMap, StatusCode}, routing::get, - Json, Router, }; use goose::message::Message; use goose::session; -use goose::session::info::{get_valid_sorted_sessions, SessionInfo, SortOrder}; use goose::session::SessionMetadata; +use goose::session::info::{SessionInfo, SortOrder, get_valid_sorted_sessions}; use serde::Serialize; use tracing::{error, info}; use utoipa::ToSchema; diff --git a/crates/goose-server/tests/pricing_api_test.rs b/crates/goose-server/tests/pricing_api_test.rs index 5065bb858ccd..e0a15c0f6edf 100644 --- a/crates/goose-server/tests/pricing_api_test.rs +++ b/crates/goose-server/tests/pricing_api_test.rs @@ -1,5 +1,5 @@ -use axum::http::StatusCode; use axum::Router; +use axum::http::StatusCode; use axum::{body::Body, http::Request}; use etcetera::AppStrategy; use serde_json::json; diff --git a/crates/goose/benches/tokenization_benchmark.rs b/crates/goose/benches/tokenization_benchmark.rs index 85be9a0ea32f..6563feb21fcc 100644 --- a/crates/goose/benches/tokenization_benchmark.rs +++ b/crates/goose/benches/tokenization_benchmark.rs @@ -1,4 +1,4 @@ -use criterion::{black_box, criterion_group, criterion_main, Criterion}; +use criterion::{Criterion, black_box, criterion_group, criterion_main}; use goose::token_counter::TokenCounter; fn benchmark_tokenization(c: &mut Criterion) { diff --git a/crates/goose/examples/agent.rs b/crates/goose/examples/agent.rs index c5ac11cba9bc..2787fca5b2ac 100644 --- a/crates/goose/examples/agent.rs +++ b/crates/goose/examples/agent.rs @@ -32,8 +32,10 @@ async fn main() { println!(" {}", extension); } - let messages = vec![Message::user() - .with_text("can you summarize the readme.md in this dir using just a haiku?")]; + let messages = vec![ + Message::user() + .with_text("can you summarize the readme.md in this dir using just a haiku?"), + ]; let mut stream = agent.reply(&messages, None).await.unwrap(); while let Some(Ok(AgentEvent::Message(message))) = stream.next().await { diff --git a/crates/goose/examples/async_token_counter_demo.rs b/crates/goose/examples/async_token_counter_demo.rs index 45aee116a505..84f30104612c 100644 --- a/crates/goose/examples/async_token_counter_demo.rs +++ b/crates/goose/examples/async_token_counter_demo.rs @@ -17,7 +17,7 @@ /// let bytes = response.bytes().await?; /// tokio::fs::write(&file_path, bytes).await?; /// ``` -use goose::token_counter::{create_async_token_counter, TokenCounter}; +use goose::token_counter::{TokenCounter, create_async_token_counter}; use std::time::Instant; #[tokio::main] diff --git a/crates/goose/examples/image_tool.rs b/crates/goose/examples/image_tool.rs index 24a75a745f9e..f3ac6dbccb39 100644 --- a/crates/goose/examples/image_tool.rs +++ b/crates/goose/examples/image_tool.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use base64::{engine::general_purpose::STANDARD as BASE64, Engine as _}; +use base64::{Engine as _, engine::general_purpose::STANDARD as BASE64}; use dotenv::dotenv; use goose::{ message::Message, diff --git a/crates/goose/src/agents/agent.rs b/crates/goose/src/agents/agent.rs index c52807d5d111..ae3b219b2db4 100644 --- a/crates/goose/src/agents/agent.rs +++ b/crates/goose/src/agents/agent.rs @@ -3,9 +3,9 @@ use std::future::Future; use std::pin::Pin; use std::sync::Arc; -use anyhow::{anyhow, Result}; +use anyhow::{Result, anyhow}; use futures::stream::BoxStream; -use futures::{stream, FutureExt, Stream, StreamExt, TryStreamExt}; +use futures::{FutureExt, Stream, StreamExt, TryStreamExt, stream}; use mcp_core::protocol::JsonRpcMessage; use crate::agents::final_output_tool::{FINAL_OUTPUT_CONTINUATION_MESSAGE, FINAL_OUTPUT_TOOL_NAME}; @@ -14,9 +14,9 @@ use crate::agents::sub_recipe_execution_tool::sub_recipe_execute_task_tool::{ }; use crate::agents::sub_recipe_manager::SubRecipeManager; use crate::config::{Config, ExtensionConfigManager, PermissionManager}; -use crate::message::{push_message, Message}; -use crate::permission::permission_judge::check_tool_permissions; +use crate::message::{Message, push_message}; use crate::permission::PermissionConfirmation; +use crate::permission::permission_judge::check_tool_permissions; use crate::providers::base::Provider; use crate::providers::errors::ProviderError; use crate::recipe::{Author, Recipe, Response, Settings, SubRecipe}; @@ -24,11 +24,11 @@ use crate::scheduler_trait::SchedulerTrait; use crate::tool_monitor::{ToolCall, ToolMonitor}; use regex::Regex; use serde_json::Value; -use tokio::sync::{mpsc, Mutex, RwLock}; +use tokio::sync::{Mutex, RwLock, mpsc}; use tracing::{debug, error, instrument}; use crate::agents::extension::{ExtensionConfig, ExtensionError, ExtensionResult, ToolInfo}; -use crate::agents::extension_manager::{get_parameter_names, ExtensionManager}; +use crate::agents::extension_manager::{ExtensionManager, get_parameter_names}; use crate::agents::platform_tools::{ PLATFORM_LIST_RESOURCES_TOOL_NAME, PLATFORM_MANAGE_EXTENSIONS_TOOL_NAME, PLATFORM_MANAGE_SCHEDULE_TOOL_NAME, PLATFORM_READ_RESOURCE_TOOL_NAME, @@ -36,7 +36,7 @@ use crate::agents::platform_tools::{ }; use crate::agents::prompt_manager::PromptManager; use crate::agents::router_tool_selector::{ - create_tool_selector, RouterToolSelectionStrategy, RouterToolSelector, + RouterToolSelectionStrategy, RouterToolSelector, create_tool_selector, }; use crate::agents::router_tools::{ROUTER_LLM_SEARCH_TOOL_NAME, ROUTER_VECTOR_SEARCH_TOOL_NAME}; use crate::agents::tool_router_index_manager::ToolRouterIndexManager; @@ -44,7 +44,7 @@ use crate::agents::tool_vectordb::generate_table_id; use crate::agents::types::SessionConfig; use crate::agents::types::{FrontendTool, ToolResultReceiver}; use mcp_core::{ - prompt::Prompt, protocol::GetPromptResult, tool::Tool, Content, ToolError, ToolResult, + Content, ToolError, ToolResult, prompt::Prompt, protocol::GetPromptResult, tool::Tool, }; use crate::agents::subagent_tools::SUBAGENT_RUN_TASK_TOOL_NAME; @@ -54,7 +54,7 @@ use super::platform_tools; use super::router_tools; use super::subagent_manager::SubAgentManager; use super::subagent_tools; -use super::tool_execution::{ToolCallResult, CHAT_MODE_TOOL_SKIPPED_RESPONSE, DECLINED_RESPONSE}; +use super::tool_execution::{CHAT_MODE_TOOL_SKIPPED_RESPONSE, DECLINED_RESPONSE, ToolCallResult}; const DEFAULT_MAX_TURNS: u32 = 1000; @@ -334,7 +334,7 @@ impl Agent { "Failed to select tools: {}", e ))), - ) + ); } }, None => { @@ -343,7 +343,7 @@ impl Agent { Err(ToolError::ExecutionError( "No tool selector available".to_string(), )), - ) + ); } }; ToolCallResult::from(Ok(selected_tools)) @@ -427,7 +427,7 @@ impl Agent { "Extension '{}' not found. Please check the extension name and try again.", extension_name ))), - ) + ); } Err(e) => { return ( @@ -436,7 +436,7 @@ impl Agent { "Failed to get extension config: {}", e ))), - ) + ); } }; diff --git a/crates/goose/src/agents/context.rs b/crates/goose/src/agents/context.rs index 7ef1c267e3b7..6c3f96fbe6b1 100644 --- a/crates/goose/src/agents/context.rs +++ b/crates/goose/src/agents/context.rs @@ -4,7 +4,7 @@ use crate::message::Message; use crate::token_counter::create_async_token_counter; use crate::context_mgmt::summarize::summarize_messages_async; -use crate::context_mgmt::truncate::{truncate_messages, OldestFirstTruncation}; +use crate::context_mgmt::truncate::{OldestFirstTruncation, truncate_messages}; use crate::context_mgmt::{estimate_target_context_limit, get_messages_token_counts_async}; use super::super::agents::Agent; @@ -40,8 +40,12 @@ impl Agent { new_token_counts.push(assistant_tokens); } else { // If we can't fit the assistant message, at least log what happened - tracing::warn!("Cannot add truncation notice message due to context limits. Current: {}, Assistant: {}, Limit: {}", - current_total, assistant_tokens, target_context_limit); + tracing::warn!( + "Cannot add truncation notice message due to context limits. Current: {}, Assistant: {}, Limit: {}", + current_total, + assistant_tokens, + target_context_limit + ); } Ok((new_messages, new_token_counts)) @@ -77,8 +81,12 @@ impl Agent { new_token_counts.push(assistant_tokens); } else { // If we can't fit the assistant message, at least log what happened - tracing::warn!("Cannot add summarization notice message due to context limits. Current: {}, Assistant: {}, Limit: {}", - current_total, assistant_tokens, target_context_limit); + tracing::warn!( + "Cannot add summarization notice message due to context limits. Current: {}, Assistant: {}, Limit: {}", + current_total, + assistant_tokens, + target_context_limit + ); } } diff --git a/crates/goose/src/agents/extension_manager.rs b/crates/goose/src/agents/extension_manager.rs index a418fe112a9e..f5b6ec9f4bcd 100644 --- a/crates/goose/src/agents/extension_manager.rs +++ b/crates/goose/src/agents/extension_manager.rs @@ -1,7 +1,7 @@ use anyhow::Result; use chrono::{DateTime, TimeZone, Utc}; use futures::stream::{FuturesUnordered, StreamExt}; -use futures::{future, FutureExt}; +use futures::{FutureExt, future}; use mcp_core::protocol::GetPromptResult; use std::collections::{HashMap, HashSet}; use std::sync::Arc; @@ -19,7 +19,7 @@ use crate::config::{Config, ExtensionConfigManager}; use crate::prompt_template; use mcp_client::client::{ClientCapabilities, ClientInfo, McpClient, McpClientTrait}; use mcp_client::transport::{SseTransport, StdioTransport, StreamableHttpTransport, Transport}; -use mcp_core::{prompt::Prompt, Content, Tool, ToolCall, ToolError}; +use mcp_core::{Content, Tool, ToolCall, ToolError, prompt::Prompt}; use serde_json::Value; // By default, we set it to Jan 1, 2020 if the resource does not have a timestamp @@ -340,10 +340,7 @@ impl ExtensionManager { You should only disable extensions found from the search_available_extensions tool. \ List all the extensions available to disable in the response. \ Explain that minimizing extensions helps with the recall of the correct tools to use.", - enabled_extensions_count, - total_tools, - MIN_EXTENSIONS, - MIN_TOOLS, + enabled_extensions_count, total_tools, MIN_EXTENSIONS, MIN_TOOLS, )) } else { Value::String(String::new()) // Empty string if under limits @@ -919,24 +916,32 @@ mod tests { ); // Test basic case - assert!(extension_manager - .get_client_for_tool("test_client__tool") - .is_some()); + assert!( + extension_manager + .get_client_for_tool("test_client__tool") + .is_some() + ); // Test leading underscores - assert!(extension_manager - .get_client_for_tool("__client__tool") - .is_some()); + assert!( + extension_manager + .get_client_for_tool("__client__tool") + .is_some() + ); // Test multiple underscores in client name, and ending with __ - assert!(extension_manager - .get_client_for_tool("__cli__ent____tool") - .is_some()); + assert!( + extension_manager + .get_client_for_tool("__cli__ent____tool") + .is_some() + ); // Test unicode in tool name, "client 🚀" should become "client_" - assert!(extension_manager - .get_client_for_tool("client___tool") - .is_some()); + assert!( + extension_manager + .get_client_for_tool("client___tool") + .is_some() + ); } #[tokio::test] diff --git a/crates/goose/src/agents/final_output_tool.rs b/crates/goose/src/agents/final_output_tool.rs index 7059feb02403..b3e16755c2f8 100644 --- a/crates/goose/src/agents/final_output_tool.rs +++ b/crates/goose/src/agents/final_output_tool.rs @@ -2,8 +2,8 @@ use crate::agents::tool_execution::ToolCallResult; use crate::recipe::Response; use indoc::formatdoc; use mcp_core::{ - tool::{Tool, ToolAnnotations}, Content, ToolCall, ToolError, + tool::{Tool, ToolAnnotations}, }; use serde_json::Value; @@ -107,7 +107,8 @@ impl FinalOutputTool { Err(format!( "Validation failed:\n{}\n\nExpected format:\n{}\n\nPlease correct your output to match the expected JSON schema and try again.", validation_errors.join("\n"), - serde_json::to_string_pretty(self.response.json_schema.as_ref().unwrap()).unwrap_or_else(|_| "Invalid schema".to_string()) + serde_json::to_string_pretty(self.response.json_schema.as_ref().unwrap()) + .unwrap_or_else(|_| "Invalid schema".to_string()) )) } } diff --git a/crates/goose/src/agents/large_response_handler.rs b/crates/goose/src/agents/large_response_handler.rs index 0369bfa5cbb5..be364d6be6c8 100644 --- a/crates/goose/src/agents/large_response_handler.rs +++ b/crates/goose/src/agents/large_response_handler.rs @@ -33,8 +33,7 @@ pub fn process_tool_response( // If file writing fails, include original content with warning let warning = format!( "Warning: Failed to write large response to file: {}. Showing full content instead.\n\n{}", - e, - text_content.text + e, text_content.text ); processed_contents.push(Content::text(warning)); } @@ -120,9 +119,11 @@ mod tests { // Verify the response contains a message about the file assert_eq!(processed.len(), 1); if let Content::Text(text_content) = &processed[0] { - assert!(text_content - .text - .contains("The response returned from the tool call was larger")); + assert!( + text_content + .text + .contains("The response returned from the tool call was larger") + ); assert!(text_content.text.contains("characters")); // Extract the file path from the message @@ -200,9 +201,11 @@ mod tests { // Second item should be a message about the file if let Content::Text(text_content) = &processed[1] { - assert!(text_content - .text - .contains("The response returned from the tool call was larger")); + assert!( + text_content + .text + .contains("The response returned from the tool call was larger") + ); // Extract the file path and clean up if let Some(file_path) = text_content.text.split("stored in the file: ").nth(1) { diff --git a/crates/goose/src/agents/recipe_tools/sub_recipe_tools.rs b/crates/goose/src/agents/recipe_tools/sub_recipe_tools.rs index 928cf8bd0845..8a61fab53b0d 100644 --- a/crates/goose/src/agents/recipe_tools/sub_recipe_tools.rs +++ b/crates/goose/src/agents/recipe_tools/sub_recipe_tools.rs @@ -2,7 +2,7 @@ use std::{collections::HashMap, fs}; use anyhow::Result; use mcp_core::tool::{Tool, ToolAnnotations}; -use serde_json::{json, Map, Value}; +use serde_json::{Map, Value, json}; use crate::agents::sub_recipe_execution_tool::lib::Task; use crate::recipe::{Recipe, RecipeParameter, RecipeParameterRequirement, SubRecipe}; diff --git a/crates/goose/src/agents/reply_parts.rs b/crates/goose/src/agents/reply_parts.rs index 486b09fbbff0..e7a939928214 100644 --- a/crates/goose/src/agents/reply_parts.rs +++ b/crates/goose/src/agents/reply_parts.rs @@ -8,11 +8,11 @@ use futures::stream::StreamExt; use crate::agents::router_tool_selector::RouterToolSelectionStrategy; use crate::config::Config; use crate::message::{Message, MessageContent, ToolRequest}; -use crate::providers::base::{stream_from_single_message, MessageStream, Provider, ProviderUsage}; +use crate::providers::base::{MessageStream, Provider, ProviderUsage, stream_from_single_message}; use crate::providers::errors::ProviderError; use crate::providers::toolshim::{ - augment_message_with_tool_calls, convert_tool_messages_to_text, - modify_system_prompt_for_tool_json, OllamaInterpreter, + OllamaInterpreter, augment_message_with_tool_calls, convert_tool_messages_to_text, + modify_system_prompt_for_tool_json, }; use crate::session; use mcp_core::tool::Tool; diff --git a/crates/goose/src/agents/schedule_tool.rs b/crates/goose/src/agents/schedule_tool.rs index 043866372596..0428c07bd523 100644 --- a/crates/goose/src/agents/schedule_tool.rs +++ b/crates/goose/src/agents/schedule_tool.rs @@ -25,7 +25,7 @@ impl Agent { None => { return Err(ToolError::ExecutionError( "Scheduler not available. This tool only works in server mode.".to_string(), - )) + )); } }; @@ -133,7 +133,7 @@ impl Agent { return Err(ToolError::ExecutionError(format!( "Cannot read recipe file: {}", e - ))) + ))); } } @@ -295,7 +295,10 @@ impl Agent { let duration = Utc::now().signed_duration_since(start_time); Ok(vec![Content::text(format!( "Job '{}' is currently running:\n- Session ID: {}\n- Started: {}\n- Duration: {} seconds", - job_id, session_id, start_time.to_rfc3339(), duration.num_seconds() + job_id, + session_id, + start_time.to_rfc3339(), + duration.num_seconds() ))]) } Ok(None) => Ok(vec![Content::text(format!( diff --git a/crates/goose/src/agents/sub_recipe_execution_tool/executor.rs b/crates/goose/src/agents/sub_recipe_execution_tool/executor.rs index b796d412984d..8484c1d8cf24 100644 --- a/crates/goose/src/agents/sub_recipe_execution_tool/executor.rs +++ b/crates/goose/src/agents/sub_recipe_execution_tool/executor.rs @@ -1,5 +1,5 @@ -use std::sync::atomic::{AtomicBool, AtomicUsize}; use std::sync::Arc; +use std::sync::atomic::{AtomicBool, AtomicUsize}; use tokio::sync::mpsc; use tokio::time::Instant; @@ -7,7 +7,7 @@ use crate::agents::sub_recipe_execution_tool::lib::{ Config, ExecutionResponse, ExecutionStats, Task, TaskResult, }; use crate::agents::sub_recipe_execution_tool::tasks::process_task; -use crate::agents::sub_recipe_execution_tool::workers::{run_scaler, spawn_worker, SharedState}; +use crate::agents::sub_recipe_execution_tool::workers::{SharedState, run_scaler, spawn_worker}; pub async fn execute_single_task(task: &Task, config: Config) -> ExecutionResponse { let start_time = Instant::now(); diff --git a/crates/goose/src/agents/sub_recipe_execution_tool/sub_recipe_execute_task_tool.rs b/crates/goose/src/agents/sub_recipe_execution_tool/sub_recipe_execute_task_tool.rs index 46738b813b13..14379f4b8860 100644 --- a/crates/goose/src/agents/sub_recipe_execution_tool/sub_recipe_execute_task_tool.rs +++ b/crates/goose/src/agents/sub_recipe_execution_tool/sub_recipe_execute_task_tool.rs @@ -1,4 +1,4 @@ -use mcp_core::{tool::ToolAnnotations, Content, Tool, ToolError}; +use mcp_core::{Content, Tool, ToolError, tool::ToolAnnotations}; use serde_json::Value; use crate::agents::{ diff --git a/crates/goose/src/agents/sub_recipe_execution_tool/workers.rs b/crates/goose/src/agents/sub_recipe_execution_tool/workers.rs index e48f19c4d360..a475cfe5f938 100644 --- a/crates/goose/src/agents/sub_recipe_execution_tool/workers.rs +++ b/crates/goose/src/agents/sub_recipe_execution_tool/workers.rs @@ -1,9 +1,9 @@ use crate::agents::sub_recipe_execution_tool::tasks::process_task; use crate::agents::sub_recipe_execution_tool::types::{Task, TaskResult}; -use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; use std::sync::Arc; +use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; use tokio::sync::mpsc; -use tokio::time::{sleep, Duration}; +use tokio::time::{Duration, sleep}; #[cfg(test)] mod tests { diff --git a/crates/goose/src/agents/sub_recipe_manager.rs b/crates/goose/src/agents/sub_recipe_manager.rs index 2441684b4b0e..cf2d4a5067f1 100644 --- a/crates/goose/src/agents/sub_recipe_manager.rs +++ b/crates/goose/src/agents/sub_recipe_manager.rs @@ -5,7 +5,7 @@ use std::collections::HashMap; use crate::{ agents::{ recipe_tools::sub_recipe_tools::{ - create_sub_recipe_task, create_sub_recipe_task_tool, SUB_RECIPE_TASK_TOOL_NAME_PREFIX, + SUB_RECIPE_TASK_TOOL_NAME_PREFIX, create_sub_recipe_task, create_sub_recipe_task_tool, }, tool_execution::ToolCallResult, }, diff --git a/crates/goose/src/agents/subagent.rs b/crates/goose/src/agents/subagent.rs index 0a02e2d1db73..dcd196eff346 100644 --- a/crates/goose/src/agents/subagent.rs +++ b/crates/goose/src/agents/subagent.rs @@ -1,5 +1,5 @@ use crate::{ - agents::{extension_manager::ExtensionManager, Agent}, + agents::{Agent, extension_manager::ExtensionManager}, message::{Message, MessageContent, ToolRequest}, prompt_template::render_global_file, providers::base::Provider, @@ -13,7 +13,7 @@ use mcp_core::{handler::ToolError, role::Role, tool::Tool}; use serde::{Deserialize, Serialize}; use serde_json::{self, json}; use std::{collections::HashMap, sync::Arc}; -use tokio::sync::{mpsc, Mutex, RwLock}; +use tokio::sync::{Mutex, RwLock, mpsc}; use tracing::{debug, error, instrument}; use uuid::Uuid; diff --git a/crates/goose/src/agents/subagent_handler.rs b/crates/goose/src/agents/subagent_handler.rs index f281f7488e4d..f0c84e18cf18 100644 --- a/crates/goose/src/agents/subagent_handler.rs +++ b/crates/goose/src/agents/subagent_handler.rs @@ -3,8 +3,8 @@ use mcp_core::{Content, ToolError}; use serde_json::Value; use std::sync::Arc; -use crate::agents::subagent_types::SpawnSubAgentArgs; use crate::agents::Agent; +use crate::agents::subagent_types::SpawnSubAgentArgs; impl Agent { /// Handle running a complete subagent task (replaces the individual spawn/send/check tools) diff --git a/crates/goose/src/agents/subagent_manager.rs b/crates/goose/src/agents/subagent_manager.rs index 174faceecc1b..10b2f6a12113 100644 --- a/crates/goose/src/agents/subagent_manager.rs +++ b/crates/goose/src/agents/subagent_manager.rs @@ -2,9 +2,9 @@ use std::collections::HashMap; use std::path::Path; use std::sync::Arc; -use anyhow::{anyhow, Result}; +use anyhow::{Result, anyhow}; use mcp_core::protocol::JsonRpcMessage; -use tokio::sync::{mpsc, Mutex, RwLock}; +use tokio::sync::{Mutex, RwLock, mpsc}; use tracing::{debug, error, instrument, warn}; use crate::agents::extension_manager::ExtensionManager; diff --git a/crates/goose/src/agents/tool_execution.rs b/crates/goose/src/agents/tool_execution.rs index 446d1f586004..3cb73694765c 100644 --- a/crates/goose/src/agents/tool_execution.rs +++ b/crates/goose/src/agents/tool_execution.rs @@ -7,8 +7,8 @@ use futures::{Stream, StreamExt}; use mcp_core::protocol::JsonRpcMessage; use tokio::sync::Mutex; -use crate::config::permission::PermissionLevel; use crate::config::PermissionManager; +use crate::config::permission::PermissionLevel; use crate::message::{Message, ToolRequest}; use crate::permission::Permission; use mcp_core::{Content, ToolResult}; @@ -29,7 +29,7 @@ impl From>> for ToolCallResult { } } -use super::agent::{tool_stream, ToolStream}; +use super::agent::{ToolStream, tool_stream}; use crate::agents::Agent; pub const DECLINED_RESPONSE: &str = "The user has declined to run this tool. \ diff --git a/crates/goose/src/agents/tool_router_index_manager.rs b/crates/goose/src/agents/tool_router_index_manager.rs index ec1a3ac9b925..5c9fd87c2d5d 100644 --- a/crates/goose/src/agents/tool_router_index_manager.rs +++ b/crates/goose/src/agents/tool_router_index_manager.rs @@ -1,4 +1,4 @@ -use anyhow::{anyhow, Result}; +use anyhow::{Result, anyhow}; use std::sync::Arc; use tracing; diff --git a/crates/goose/src/agents/tool_vectordb.rs b/crates/goose/src/agents/tool_vectordb.rs index 0635a17ccc85..1349cb973bfc 100644 --- a/crates/goose/src/agents/tool_vectordb.rs +++ b/crates/goose/src/agents/tool_vectordb.rs @@ -555,10 +555,12 @@ mod tests { "Expected error for relative path, got: {:?}", result ); - assert!(result - .unwrap_err() - .to_string() - .contains("must be an absolute path")); + assert!( + result + .unwrap_err() + .to_string() + .contains("must be an absolute path") + ); // Clean up // TODO: Audit that the environment access only happens in single-threaded code. diff --git a/crates/goose/src/agents/types.rs b/crates/goose/src/agents/types.rs index 41711cd03536..b4974e058fd1 100644 --- a/crates/goose/src/agents/types.rs +++ b/crates/goose/src/agents/types.rs @@ -3,7 +3,7 @@ use mcp_core::{Content, Tool, ToolResult}; use serde::{Deserialize, Serialize}; use std::path::PathBuf; use std::sync::Arc; -use tokio::sync::{mpsc, Mutex}; +use tokio::sync::{Mutex, mpsc}; /// Type alias for the tool result channel receiver pub type ToolResultReceiver = Arc>)>>>; diff --git a/crates/goose/src/config/base.rs b/crates/goose/src/config/base.rs index a17ff15ab395..19852b84029f 100644 --- a/crates/goose/src/config/base.rs +++ b/crates/goose/src/config/base.rs @@ -1,4 +1,4 @@ -use etcetera::{choose_app_strategy, AppStrategy, AppStrategyArgs}; +use etcetera::{AppStrategy, AppStrategyArgs, choose_app_strategy}; use fs2::FileExt; use keyring::Entry; use once_cell::sync::{Lazy, OnceCell}; @@ -268,7 +268,10 @@ impl Config { } // Last resort: create a fresh default config file - tracing::error!("Could not recover config file, creating fresh default configuration. Original error: {}", parse_error); + tracing::error!( + "Could not recover config file, creating fresh default configuration. Original error: {}", + parse_error + ); // Try to load from init-config.yaml if it exists, otherwise use empty config let default_config = self @@ -720,7 +723,7 @@ pub fn load_init_config_from_workspace() -> Result, Confi return Err(ConfigError::FileError(std::io::Error::new( std::io::ErrorKind::NotFound, "Could not determine executable path", - ))) + ))); } }; diff --git a/crates/goose/src/config/mod.rs b/crates/goose/src/config/mod.rs index ca9abb01e7ae..b0f799236bc4 100644 --- a/crates/goose/src/config/mod.rs +++ b/crates/goose/src/config/mod.rs @@ -4,7 +4,7 @@ pub mod extensions; pub mod permission; pub use crate::agents::ExtensionConfig; -pub use base::{Config, ConfigError, APP_STRATEGY}; +pub use base::{APP_STRATEGY, Config, ConfigError}; pub use experiments::ExperimentManager; pub use extensions::{ExtensionConfigManager, ExtensionEntry}; pub use permission::PermissionManager; diff --git a/crates/goose/src/config/permission.rs b/crates/goose/src/config/permission.rs index 39757d09b40c..e0cb0a81d788 100644 --- a/crates/goose/src/config/permission.rs +++ b/crates/goose/src/config/permission.rs @@ -1,5 +1,5 @@ use super::APP_STRATEGY; -use etcetera::{choose_app_strategy, AppStrategy}; +use etcetera::{AppStrategy, choose_app_strategy}; use serde::{Deserialize, Serialize}; use std::collections::HashMap; use std::fs; @@ -301,8 +301,10 @@ mod tests { assert!(!config.ask_before.contains(&"prefix__tool3".to_string())); // Verify other entries remain - assert!(config - .always_allow - .contains(&"nonprefix__tool2".to_string())); + assert!( + config + .always_allow + .contains(&"nonprefix__tool2".to_string()) + ); } } diff --git a/crates/goose/src/context_mgmt/summarize.rs b/crates/goose/src/context_mgmt/summarize.rs index 84ea104bb9bc..d9cf79ddd8b7 100644 --- a/crates/goose/src/context_mgmt/summarize.rs +++ b/crates/goose/src/context_mgmt/summarize.rs @@ -220,8 +220,8 @@ mod tests { use crate::providers::base::{Provider, ProviderMetadata, ProviderUsage, Usage}; use crate::providers::errors::ProviderError; use chrono::Utc; - use mcp_core::{tool::Tool, Role}; use mcp_core::{Content, TextContent, ToolCall}; + use mcp_core::{Role, tool::Tool}; use serde_json::json; use std::sync::Arc; diff --git a/crates/goose/src/context_mgmt/truncate.rs b/crates/goose/src/context_mgmt/truncate.rs index e69548b99522..e5fd4b2184fb 100644 --- a/crates/goose/src/context_mgmt/truncate.rs +++ b/crates/goose/src/context_mgmt/truncate.rs @@ -1,6 +1,6 @@ use crate::message::{Message, MessageContent}; use crate::utils::safe_truncate; -use anyhow::{anyhow, Result}; +use anyhow::{Result, anyhow}; use mcp_core::{Content, ResourceContents, Role}; use std::collections::HashSet; use tracing::{debug, warn}; @@ -41,7 +41,10 @@ fn handle_oversized_messages( if estimated_new_tokens > context_limit { // Even truncated message is too large, skip it entirely - warn!("Skipping message {} as even truncated version ({} tokens) exceeds context limit", i, estimated_new_tokens); + warn!( + "Skipping message {} as even truncated version ({} tokens) exceeds context limit", + i, estimated_new_tokens + ); any_truncated = true; continue; } diff --git a/crates/goose/src/message.rs b/crates/goose/src/message.rs index 37b925be0953..6b730d0fd46e 100644 --- a/crates/goose/src/message.rs +++ b/crates/goose/src/message.rs @@ -516,7 +516,7 @@ mod tests { use mcp_core::handler::ToolError; use mcp_core::prompt::PromptMessageContent; use mcp_core::resource::ResourceContents; - use serde_json::{json, Value}; + use serde_json::{Value, json}; #[test] fn test_message_serialization() { diff --git a/crates/goose/src/permission/permission_judge.rs b/crates/goose/src/permission/permission_judge.rs index b8b5110e1820..b872bf216b74 100644 --- a/crates/goose/src/permission/permission_judge.rs +++ b/crates/goose/src/permission/permission_judge.rs @@ -1,14 +1,14 @@ use crate::agents::platform_tools::PLATFORM_MANAGE_EXTENSIONS_TOOL_NAME; -use crate::config::permission::PermissionLevel; use crate::config::PermissionManager; +use crate::config::permission::PermissionLevel; use crate::message::{Message, MessageContent, ToolRequest}; use crate::providers::base::Provider; use chrono::Utc; use indoc::indoc; use mcp_core::tool::ToolAnnotations; -use mcp_core::{tool::Tool, TextContent}; +use mcp_core::{TextContent, tool::Tool}; use serde::{Deserialize, Serialize}; -use serde_json::{json, Value}; +use serde_json::{Value, json}; use std::collections::HashSet; use std::sync::Arc; @@ -270,7 +270,7 @@ mod tests { use crate::providers::errors::ProviderError; use chrono::Utc; use mcp_core::ToolCall; - use mcp_core::{tool::Tool, Role, ToolResult}; + use mcp_core::{Role, ToolResult, tool::Tool}; use serde_json::json; use tempfile::NamedTempFile; @@ -343,9 +343,11 @@ mod tests { assert_eq!(messages.len(), 1); let content = &messages[0].content[0]; if let MessageContent::Text(text_content) = content { - assert!(text_content - .text - .contains("Analyze the tool requests and list the tools")); + assert!( + text_content + .text + .contains("Analyze the tool requests and list the tools") + ); assert!(text_content.text.contains("file_reader")); } else { panic!("Expected text content"); diff --git a/crates/goose/src/permission/permission_store.rs b/crates/goose/src/permission/permission_store.rs index c4eebcf2ee9f..7235b94c8101 100644 --- a/crates/goose/src/permission/permission_store.rs +++ b/crates/goose/src/permission/permission_store.rs @@ -2,7 +2,7 @@ use crate::message::ToolRequest; use anyhow::Result; use blake3::Hasher; use chrono::Utc; -use etcetera::{choose_app_strategy, AppStrategy}; +use etcetera::{AppStrategy, choose_app_strategy}; use serde::{Deserialize, Serialize}; use std::collections::HashMap; use std::time::Duration; diff --git a/crates/goose/src/project/storage.rs b/crates/goose/src/project/storage.rs index d3d5e6640e2d..f9b334e81d01 100644 --- a/crates/goose/src/project/storage.rs +++ b/crates/goose/src/project/storage.rs @@ -1,7 +1,7 @@ use crate::project::{Project, ProjectMetadata}; -use anyhow::{anyhow, Context, Result}; +use anyhow::{Context, Result, anyhow}; use chrono::Utc; -use etcetera::{choose_app_strategy, AppStrategy, AppStrategyArgs}; +use etcetera::{AppStrategy, AppStrategyArgs, choose_app_strategy}; use serde_json; use std::fs::{self, File}; use std::io::Write; diff --git a/crates/goose/src/prompt_template.rs b/crates/goose/src/prompt_template.rs index bf7bd99660b0..f088c3f60084 100644 --- a/crates/goose/src/prompt_template.rs +++ b/crates/goose/src/prompt_template.rs @@ -1,4 +1,4 @@ -use include_dir::{include_dir, Dir}; +use include_dir::{Dir, include_dir}; use minijinja::{Environment, Error as MiniJinjaError, Value as MJValue}; use once_cell::sync::Lazy; use serde::Serialize; diff --git a/crates/goose/src/providers/anthropic.rs b/crates/goose/src/providers/anthropic.rs index 88a71b0f145c..76cfd3c387ec 100644 --- a/crates/goose/src/providers/anthropic.rs +++ b/crates/goose/src/providers/anthropic.rs @@ -85,25 +85,46 @@ impl AnthropicProvider { // https://docs.anthropic.com/en/api/errors match status { - StatusCode::OK => payload.ok_or_else( || ProviderError::RequestFailed("Response body is not valid JSON".to_string()) ), + StatusCode::OK => payload.ok_or_else(|| { + ProviderError::RequestFailed("Response body is not valid JSON".to_string()) + }), StatusCode::UNAUTHORIZED | StatusCode::FORBIDDEN => { - Err(ProviderError::Authentication(format!("Authentication failed. Please ensure your API keys are valid and have the required permissions. \ - Status: {}. Response: {:?}", status, payload))) + Err(ProviderError::Authentication(format!( + "Authentication failed. Please ensure your API keys are valid and have the required permissions. \ + Status: {}. Response: {:?}", + status, payload + ))) } StatusCode::BAD_REQUEST => { let mut error_msg = "Unknown error".to_string(); if let Some(payload) = &payload { if let Some(error) = payload.get("error") { - tracing::debug!("Bad Request Error: {error:?}"); - error_msg = error.get("message").and_then(|m| m.as_str()).unwrap_or("Unknown error").to_string(); - if error_msg.to_lowercase().contains("too long") || error_msg.to_lowercase().contains("too many") { - return Err(ProviderError::ContextLengthExceeded(error_msg.to_string())); + tracing::debug!("Bad Request Error: {error:?}"); + error_msg = error + .get("message") + .and_then(|m| m.as_str()) + .unwrap_or("Unknown error") + .to_string(); + if error_msg.to_lowercase().contains("too long") + || error_msg.to_lowercase().contains("too many") + { + return Err(ProviderError::ContextLengthExceeded( + error_msg.to_string(), + )); + } } - }} + } tracing::debug!( - "{}", format!("Provider request failed with status: {}. Payload: {:?}", status, payload) + "{}", + format!( + "Provider request failed with status: {}. Payload: {:?}", + status, payload + ) ); - Err(ProviderError::RequestFailed(format!("Request failed with status: {}. Message: {}", status, error_msg))) + Err(ProviderError::RequestFailed(format!( + "Request failed with status: {}. Message: {}", + status, error_msg + ))) } StatusCode::TOO_MANY_REQUESTS => { Err(ProviderError::RateLimitExceeded(format!("{:?}", payload))) @@ -113,9 +134,16 @@ impl AnthropicProvider { } _ => { tracing::debug!( - "{}", format!("Provider request failed with status: {}. Payload: {:?}", status, payload) + "{}", + format!( + "Provider request failed with status: {}. Payload: {:?}", + status, payload + ) ); - Err(ProviderError::RequestFailed(format!("Request failed with status: {}", status))) + Err(ProviderError::RequestFailed(format!( + "Request failed with status: {}", + status + ))) } } } diff --git a/crates/goose/src/providers/azure.rs b/crates/goose/src/providers/azure.rs index 46c1f0062d88..d9dc41c77341 100644 --- a/crates/goose/src/providers/azure.rs +++ b/crates/goose/src/providers/azure.rs @@ -10,7 +10,7 @@ use super::azureauth::AzureAuth; use super::base::{ConfigKey, Provider, ProviderMetadata, ProviderUsage, Usage}; use super::errors::ProviderError; use super::formats::openai::{create_request, get_usage, response_to_message}; -use super::utils::{emit_debug_trace, get_model, handle_response_openai_compat, ImageFormat}; +use super::utils::{ImageFormat, emit_debug_trace, get_model, handle_response_openai_compat}; use crate::message::Message; use crate::model::ModelConfig; use mcp_core::tool::Tool; diff --git a/crates/goose/src/providers/bedrock.rs b/crates/goose/src/providers/bedrock.rs index 1657385d8eba..6a388f74abc5 100644 --- a/crates/goose/src/providers/bedrock.rs +++ b/crates/goose/src/providers/bedrock.rs @@ -5,7 +5,7 @@ use anyhow::Result; use async_trait::async_trait; use aws_sdk_bedrockruntime::config::ProvideCredentials; use aws_sdk_bedrockruntime::operation::converse::ConverseError; -use aws_sdk_bedrockruntime::{types as bedrock, Client}; +use aws_sdk_bedrockruntime::{Client, types as bedrock}; use mcp_core::Tool; use serde_json::Value; use tokio::time::sleep; diff --git a/crates/goose/src/providers/claude_code.rs b/crates/goose/src/providers/claude_code.rs index 0ee203360178..021f1581e177 100644 --- a/crates/goose/src/providers/claude_code.rs +++ b/crates/goose/src/providers/claude_code.rs @@ -1,6 +1,6 @@ use anyhow::Result; use async_trait::async_trait; -use serde_json::{json, Value}; +use serde_json::{Value, json}; use std::process::Stdio; use tokio::io::{AsyncBufReadExt, BufReader}; use tokio::process::Command; @@ -10,9 +10,9 @@ use super::errors::ProviderError; use super::utils::emit_debug_trace; use crate::message::{Message, MessageContent}; use crate::model::ModelConfig; +use mcp_core::Role; use mcp_core::content::TextContent; use mcp_core::tool::Tool; -use mcp_core::Role; pub const CLAUDE_CODE_DEFAULT_MODEL: &str = "default"; pub const CLAUDE_CODE_KNOWN_MODELS: &[&str] = &["default"]; diff --git a/crates/goose/src/providers/databricks.rs b/crates/goose/src/providers/databricks.rs index 9ad41042c220..c4f3f96cb7f5 100644 --- a/crates/goose/src/providers/databricks.rs +++ b/crates/goose/src/providers/databricks.rs @@ -15,7 +15,7 @@ use super::embedding::EmbeddingCapable; use super::errors::ProviderError; use super::formats::databricks::{create_request, response_to_message}; use super::oauth; -use super::utils::{get_model, ImageFormat}; +use super::utils::{ImageFormat, get_model}; use crate::config::ConfigError; use crate::message::Message; use crate::model::ModelConfig; @@ -554,15 +554,18 @@ impl Provider for DatabricksProvider { if !response.status().is_success() { let status = response.status(); - match response.text().await { Ok(error_text) => { - tracing::warn!( - "Failed to fetch Databricks models: {} - {}", - status, - error_text - ); - } _ => { - tracing::warn!("Failed to fetch Databricks models: {}", status); - }} + match response.text().await { + Ok(error_text) => { + tracing::warn!( + "Failed to fetch Databricks models: {} - {}", + status, + error_text + ); + } + _ => { + tracing::warn!("Failed to fetch Databricks models: {}", status); + } + } return Ok(None); // Return None to fall back to manual input } diff --git a/crates/goose/src/providers/factory.rs b/crates/goose/src/providers/factory.rs index f23b803c04ec..6b525698177a 100644 --- a/crates/goose/src/providers/factory.rs +++ b/crates/goose/src/providers/factory.rs @@ -177,7 +177,7 @@ mod tests { use crate::message::{Message, MessageContent}; use crate::providers::base::{ProviderMetadata, ProviderUsage, Usage}; use chrono::Utc; - use mcp_core::{content::TextContent, Role}; + use mcp_core::{Role, content::TextContent}; use std::env; #[allow(dead_code)] diff --git a/crates/goose/src/providers/formats/anthropic.rs b/crates/goose/src/providers/formats/anthropic.rs index a59e251a76ef..5cc7952bb828 100644 --- a/crates/goose/src/providers/formats/anthropic.rs +++ b/crates/goose/src/providers/formats/anthropic.rs @@ -2,11 +2,11 @@ use crate::message::{Message, MessageContent}; use crate::model::ModelConfig; use crate::providers::base::Usage; use crate::providers::errors::ProviderError; -use anyhow::{anyhow, Result}; +use anyhow::{Result, anyhow}; use mcp_core::content::Content; use mcp_core::role::Role; use mcp_core::tool::{Tool, ToolCall}; -use serde_json::{json, Value}; +use serde_json::{Value, json}; use std::collections::HashSet; // Constants for frequently used strings in Anthropic API format @@ -541,9 +541,11 @@ mod tests { thinking.thinking, "This is a step-by-step thought process..." ); - assert!(thinking - .signature - .starts_with("EuYBCkQYAiJAVbJNBoH7HQiDcMwwAMhWqNyoe4G2xHRprK8ICM8g")); + assert!( + thinking + .signature + .starts_with("EuYBCkQYAiJAVbJNBoH7HQiDcMwwAMhWqNyoe4G2xHRprK8ICM8g") + ); } else { panic!("Expected Thinking content at index 0"); } diff --git a/crates/goose/src/providers/formats/bedrock.rs b/crates/goose/src/providers/formats/bedrock.rs index 9a1651b57fc3..5140ac00e0f8 100644 --- a/crates/goose/src/providers/formats/bedrock.rs +++ b/crates/goose/src/providers/formats/bedrock.rs @@ -1,7 +1,7 @@ use std::collections::HashMap; use std::path::Path; -use anyhow::{anyhow, bail, Result}; +use anyhow::{Result, anyhow, bail}; use aws_sdk_bedrockruntime::types as bedrock; use aws_smithy_types::{Document, Number}; use base64::Engine; @@ -299,7 +299,7 @@ pub fn from_bedrock_tool_result_content_block( _ => { return Err(ToolError::ExecutionError( "Unsupported tool result from Bedrock".to_string(), - )) + )); } }) } diff --git a/crates/goose/src/providers/formats/databricks.rs b/crates/goose/src/providers/formats/databricks.rs index e47bd3e82ea8..185a74d91a4a 100644 --- a/crates/goose/src/providers/formats/databricks.rs +++ b/crates/goose/src/providers/formats/databricks.rs @@ -1,14 +1,14 @@ use crate::message::{Message, MessageContent}; use crate::model::ModelConfig; use crate::providers::utils::{ - convert_image, detect_image_path, is_valid_function_name, load_image_file, - sanitize_function_name, ImageFormat, + ImageFormat, convert_image, detect_image_path, is_valid_function_name, load_image_file, + sanitize_function_name, }; -use anyhow::{anyhow, Error}; +use anyhow::{Error, anyhow}; use mcp_core::ToolError; use mcp_core::{Content, Role, Tool, ToolCall}; use serde::{Deserialize, Serialize}; -use serde_json::{json, Value}; +use serde_json::{Value, json}; /// Convert internal Message format to Databricks' API message specification /// Databricks is mostly OpenAI compatible, but has some differences (reasoning type, etc) @@ -153,14 +153,16 @@ pub fn format_messages(messages: &[Message], image_format: &ImageFormat) -> Vec< } } } - let tool_response_content: Value = json!(tool_content - .iter() - .map(|content| match content { - Content::Text(text) => text.text.clone(), - _ => String::new(), - }) - .collect::>() - .join(" ")); + let tool_response_content: Value = json!( + tool_content + .iter() + .map(|content| match content { + Content::Text(text) => text.text.clone(), + _ => String::new(), + }) + .collect::>() + .join(" ") + ); // Add tool response as a separate message result.push(json!({ @@ -822,10 +824,12 @@ mod tests { let result = format_tools(&[tool1, tool2]); assert!(result.is_err()); - assert!(result - .unwrap_err() - .to_string() - .contains("Duplicate tool name")); + assert!( + result + .unwrap_err() + .to_string() + .contains("Duplicate tool name") + ); Ok(()) } @@ -863,10 +867,12 @@ mod tests { assert_eq!(content[0]["type"], "text"); assert!(content[0]["text"].as_str().unwrap().contains(png_path_str)); assert_eq!(content[1]["type"], "image_url"); - assert!(content[1]["image_url"]["url"] - .as_str() - .unwrap() - .starts_with("data:image/png;base64,")); + assert!( + content[1]["image_url"]["url"] + .as_str() + .unwrap() + .starts_with("data:image/png;base64,") + ); Ok(()) } diff --git a/crates/goose/src/providers/formats/google.rs b/crates/goose/src/providers/formats/google.rs index 6c801d504538..b5c632e80c53 100644 --- a/crates/goose/src/providers/formats/google.rs +++ b/crates/goose/src/providers/formats/google.rs @@ -7,8 +7,8 @@ use anyhow::Result; use mcp_core::content::Content; use mcp_core::role::Role; use mcp_core::tool::{Tool, ToolCall}; -use rand::{distributions::Alphanumeric, Rng}; -use serde_json::{json, Map, Value}; +use rand::{Rng, distributions::Alphanumeric}; +use serde_json::{Map, Value, json}; /// Convert internal Message format to Google's API message specification pub fn format_messages(messages: &[Message]) -> Vec { diff --git a/crates/goose/src/providers/formats/openai.rs b/crates/goose/src/providers/formats/openai.rs index 7660afe12748..a1818711d0cc 100644 --- a/crates/goose/src/providers/formats/openai.rs +++ b/crates/goose/src/providers/formats/openai.rs @@ -2,16 +2,16 @@ use crate::message::{Message, MessageContent}; use crate::model::ModelConfig; use crate::providers::base::{ProviderUsage, Usage}; use crate::providers::utils::{ - convert_image, detect_image_path, is_valid_function_name, load_image_file, - sanitize_function_name, ImageFormat, + ImageFormat, convert_image, detect_image_path, is_valid_function_name, load_image_file, + sanitize_function_name, }; -use anyhow::{anyhow, Error}; +use anyhow::{Error, anyhow}; use async_stream::try_stream; use futures::Stream; use mcp_core::ToolError; use mcp_core::{Content, Role, Tool, ToolCall}; use serde::{Deserialize, Serialize}; -use serde_json::{json, Value}; +use serde_json::{Value, json}; #[derive(Serialize, Deserialize, Debug)] struct DeltaToolCallFunction { @@ -161,14 +161,16 @@ pub fn format_messages(messages: &[Message], image_format: &ImageFormat) -> Vec< } } } - let tool_response_content: Value = json!(tool_content - .iter() - .map(|content| match content { - Content::Text(text) => text.text.clone(), - _ => String::new(), - }) - .collect::>() - .join(" ")); + let tool_response_content: Value = json!( + tool_content + .iter() + .map(|content| match content { + Content::Text(text) => text.text.clone(), + _ => String::new(), + }) + .collect::>() + .join(" ") + ); // First add the tool response with all content output.push(json!({ @@ -837,10 +839,12 @@ mod tests { let result = format_tools(&[tool1, tool2]); assert!(result.is_err()); - assert!(result - .unwrap_err() - .to_string() - .contains("Duplicate tool name")); + assert!( + result + .unwrap_err() + .to_string() + .contains("Duplicate tool name") + ); Ok(()) } @@ -878,10 +882,12 @@ mod tests { assert_eq!(content[0]["type"], "text"); assert!(content[0]["text"].as_str().unwrap().contains(png_path_str)); assert_eq!(content[1]["type"], "image_url"); - assert!(content[1]["image_url"]["url"] - .as_str() - .unwrap() - .starts_with("data:image/png;base64,")); + assert!( + content[1]["image_url"]["url"] + .as_str() + .unwrap() + .starts_with("data:image/png;base64,") + ); Ok(()) } diff --git a/crates/goose/src/providers/formats/snowflake.rs b/crates/goose/src/providers/formats/snowflake.rs index c7cfe5924bb4..8fa8ca92b58b 100644 --- a/crates/goose/src/providers/formats/snowflake.rs +++ b/crates/goose/src/providers/formats/snowflake.rs @@ -2,11 +2,11 @@ use crate::message::{Message, MessageContent}; use crate::model::ModelConfig; use crate::providers::base::Usage; use crate::providers::errors::ProviderError; -use anyhow::{anyhow, Result}; +use anyhow::{Result, anyhow}; use mcp_core::content::Content; use mcp_core::role::Role; use mcp_core::tool::{Tool, ToolCall}; -use serde_json::{json, Value}; +use serde_json::{Value, json}; use std::collections::HashSet; /// Convert internal Message format to Snowflake's API message specification diff --git a/crates/goose/src/providers/gcpauth.rs b/crates/goose/src/providers/gcpauth.rs index 16d2956fda91..40f12e40a254 100644 --- a/crates/goose/src/providers/gcpauth.rs +++ b/crates/goose/src/providers/gcpauth.rs @@ -1,5 +1,5 @@ use async_trait::async_trait; -use jsonwebtoken::{encode, EncodingKey, Header}; +use jsonwebtoken::{EncodingKey, Header, encode}; use serde::{Deserialize, Serialize}; use std::path::PathBuf; use std::sync::Arc; diff --git a/crates/goose/src/providers/gcpvertexai.rs b/crates/goose/src/providers/gcpvertexai.rs index 6385ec299abc..a504765a47e0 100644 --- a/crates/goose/src/providers/gcpvertexai.rs +++ b/crates/goose/src/providers/gcpvertexai.rs @@ -13,8 +13,8 @@ use crate::providers::base::{ConfigKey, Provider, ProviderMetadata, ProviderUsag use crate::providers::errors::ProviderError; use crate::providers::formats::gcpvertexai::{ - create_request, get_usage, response_to_message, ClaudeVersion, GcpVertexAIModel, GeminiVersion, - ModelProvider, RequestContext, + ClaudeVersion, GcpVertexAIModel, GeminiVersion, ModelProvider, RequestContext, create_request, + get_usage, response_to_message, }; use crate::providers::formats::gcpvertexai::GcpLocation::Iowa; diff --git a/crates/goose/src/providers/gemini_cli.rs b/crates/goose/src/providers/gemini_cli.rs index fc696bab21a8..f18dfc237bf9 100644 --- a/crates/goose/src/providers/gemini_cli.rs +++ b/crates/goose/src/providers/gemini_cli.rs @@ -10,9 +10,9 @@ use super::errors::ProviderError; use super::utils::emit_debug_trace; use crate::message::{Message, MessageContent}; use crate::model::ModelConfig; +use mcp_core::Role; use mcp_core::content::TextContent; use mcp_core::tool::Tool; -use mcp_core::Role; pub const GEMINI_CLI_DEFAULT_MODEL: &str = "default"; pub const GEMINI_CLI_KNOWN_MODELS: &[&str] = &["default"]; diff --git a/crates/goose/src/providers/githubcopilot.rs b/crates/goose/src/providers/githubcopilot.rs index ef7a9fbecc43..3b3443a263ce 100644 --- a/crates/goose/src/providers/githubcopilot.rs +++ b/crates/goose/src/providers/githubcopilot.rs @@ -1,8 +1,8 @@ -use anyhow::{anyhow, Context, Result}; +use anyhow::{Context, Result, anyhow}; use async_trait::async_trait; use axum::http; use chrono::{DateTime, Utc}; -use etcetera::{choose_app_strategy, AppStrategy}; +use etcetera::{AppStrategy, choose_app_strategy}; use reqwest::Client; use serde::{Deserialize, Serialize}; use serde_json::Value; @@ -14,7 +14,7 @@ use std::time::Duration; use super::base::{Provider, ProviderMetadata, ProviderUsage, Usage}; use super::errors::ProviderError; use super::formats::openai::{create_request, get_usage, response_to_message}; -use super::utils::{emit_debug_trace, get_model, handle_response_openai_compat, ImageFormat}; +use super::utils::{ImageFormat, emit_debug_trace, get_model, handle_response_openai_compat}; use crate::config::{Config, ConfigError}; use crate::message::Message; diff --git a/crates/goose/src/providers/groq.rs b/crates/goose/src/providers/groq.rs index 9c8c5af9fecf..c3a7eea76f37 100644 --- a/crates/goose/src/providers/groq.rs +++ b/crates/goose/src/providers/groq.rs @@ -73,14 +73,20 @@ impl GroqProvider { let payload: Option = response.json().await.ok(); match status { - StatusCode::OK => payload.ok_or_else( || ProviderError::RequestFailed("Response body is not valid JSON".to_string()) ), + StatusCode::OK => payload.ok_or_else(|| { + ProviderError::RequestFailed("Response body is not valid JSON".to_string()) + }), StatusCode::UNAUTHORIZED | StatusCode::FORBIDDEN => { - Err(ProviderError::Authentication(format!("Authentication failed. Please ensure your API keys are valid and have the required permissions. \ - Status: {}. Response: {:?}", status, payload))) - } - StatusCode::PAYLOAD_TOO_LARGE => { - Err(ProviderError::ContextLengthExceeded(format!("{:?}", payload))) + Err(ProviderError::Authentication(format!( + "Authentication failed. Please ensure your API keys are valid and have the required permissions. \ + Status: {}. Response: {:?}", + status, payload + ))) } + StatusCode::PAYLOAD_TOO_LARGE => Err(ProviderError::ContextLengthExceeded(format!( + "{:?}", + payload + ))), StatusCode::TOO_MANY_REQUESTS => { Err(ProviderError::RateLimitExceeded(format!("{:?}", payload))) } @@ -89,9 +95,16 @@ impl GroqProvider { } _ => { tracing::debug!( - "{}", format!("Provider request failed with status: {}. Payload: {:?}", status, payload) + "{}", + format!( + "Provider request failed with status: {}. Payload: {:?}", + status, payload + ) ); - Err(ProviderError::RequestFailed(format!("Request failed with status: {}", status))) + Err(ProviderError::RequestFailed(format!( + "Request failed with status: {}", + status + ))) } } } diff --git a/crates/goose/src/providers/lead_worker.rs b/crates/goose/src/providers/lead_worker.rs index ea892342c8d8..d24fb819ffe7 100644 --- a/crates/goose/src/providers/lead_worker.rs +++ b/crates/goose/src/providers/lead_worker.rs @@ -7,7 +7,7 @@ use super::base::{LeadWorkerProviderTrait, Provider, ProviderMetadata, ProviderU use super::errors::ProviderError; use crate::message::{Message, MessageContent}; use crate::model::ModelConfig; -use mcp_core::{tool::Tool, Content}; +use mcp_core::{Content, tool::Tool}; /// A provider that switches between a lead model and a worker model based on turn count /// and can fallback to lead model on consecutive failures @@ -169,7 +169,9 @@ impl LeadWorkerProvider { *fallback_remaining -= 1; if *fallback_remaining == 0 { *in_fallback = false; - tracing::info!("✅ SWITCHING BACK TO WORKER MODEL: Exiting fallback mode - worker model resumed"); + tracing::info!( + "✅ SWITCHING BACK TO WORKER MODEL: Exiting fallback mode - worker model resumed" + ); } } } @@ -380,7 +382,10 @@ impl Provider for LeadWorkerProvider { // For technical failures, try with default model (lead provider) instead let final_result = match &result { Err(_) => { - tracing::warn!("Technical failure with {} provider, retrying with default model (lead provider)", provider_type); + tracing::warn!( + "Technical failure with {} provider, retrying with default model (lead provider)", + provider_type + ); // Try with lead provider as the default/fallback for technical failures let default_result = self.lead_provider.complete(system, messages, tools).await; @@ -393,7 +398,9 @@ impl Provider for LeadWorkerProvider { default_result } Err(_) => { - tracing::error!("❌ Default model (lead provider) also failed - returning original error"); + tracing::error!( + "❌ Default model (lead provider) also failed - returning original error" + ); result // Return the original error } } @@ -455,7 +462,7 @@ mod tests { use crate::message::MessageContent; use crate::providers::base::{ProviderMetadata, ProviderUsage, Usage}; use chrono::Utc; - use mcp_core::{content::TextContent, Role}; + use mcp_core::{Role, content::TextContent}; #[derive(Clone)] struct MockProvider { diff --git a/crates/goose/src/providers/oauth.rs b/crates/goose/src/providers/oauth.rs index 50c6ee0908b7..e519d7732a8a 100644 --- a/crates/goose/src/providers/oauth.rs +++ b/crates/goose/src/providers/oauth.rs @@ -1,14 +1,14 @@ use anyhow::Result; -use axum::{extract::Query, response::Html, routing::get, Router}; +use axum::{Router, extract::Query, response::Html, routing::get}; use base64::Engine; use chrono::{DateTime, Utc}; -use etcetera::{choose_app_strategy, AppStrategy}; +use etcetera::{AppStrategy, choose_app_strategy}; use once_cell::sync::Lazy; use serde::{Deserialize, Serialize}; use serde_json::Value; use sha2::Digest; use std::{collections::HashMap, fs, net::SocketAddr, path::PathBuf, sync::Arc}; -use tokio::sync::{oneshot, Mutex as TokioMutex}; +use tokio::sync::{Mutex as TokioMutex, oneshot}; use url::Url; static OAUTH_MUTEX: Lazy> = Lazy::new(|| TokioMutex::new(())); @@ -454,8 +454,8 @@ pub(crate) async fn get_oauth_token_async( mod tests { use super::*; use wiremock::{ - matchers::{method, path}, Mock, MockServer, ResponseTemplate, + matchers::{method, path}, }; #[tokio::test] diff --git a/crates/goose/src/providers/openai.rs b/crates/goose/src/providers/openai.rs index 767a8f47913a..412c1d9f9ad4 100644 --- a/crates/goose/src/providers/openai.rs +++ b/crates/goose/src/providers/openai.rs @@ -3,7 +3,7 @@ use async_stream::try_stream; use async_trait::async_trait; use futures::TryStreamExt; use reqwest::{Client, Response}; -use serde_json::{json, Value}; +use serde_json::{Value, json}; use std::collections::HashMap; use std::io; use std::time::Duration; @@ -16,7 +16,7 @@ use super::base::{ConfigKey, ModelInfo, Provider, ProviderMetadata, ProviderUsag use super::embedding::{EmbeddingCapable, EmbeddingRequest, EmbeddingResponse}; use super::errors::ProviderError; use super::formats::openai::{create_request, get_usage, response_to_message}; -use super::utils::{emit_debug_trace, get_model, handle_response_openai_compat, ImageFormat}; +use super::utils::{ImageFormat, emit_debug_trace, get_model, handle_response_openai_compat}; use crate::message::Message; use crate::model::ModelConfig; use crate::providers::base::MessageStream; diff --git a/crates/goose/src/providers/openrouter.rs b/crates/goose/src/providers/openrouter.rs index d629c37b014f..b827ae4fd0fd 100644 --- a/crates/goose/src/providers/openrouter.rs +++ b/crates/goose/src/providers/openrouter.rs @@ -1,7 +1,7 @@ use anyhow::{Error, Result}; use async_trait::async_trait; use reqwest::Client; -use serde_json::{json, Value}; +use serde_json::{Value, json}; use std::time::Duration; use super::base::{ConfigKey, Provider, ProviderMetadata, ProviderUsage, Usage}; @@ -296,7 +296,10 @@ impl Provider for OpenRouterProvider { { Ok(response) => response, Err(e) => { - tracing::warn!("Failed to fetch models from OpenRouter API: {}, falling back to manual model entry", e); + tracing::warn!( + "Failed to fetch models from OpenRouter API: {}, falling back to manual model entry", + e + ); return Ok(None); } }; @@ -305,7 +308,10 @@ impl Provider for OpenRouterProvider { let json: serde_json::Value = match response.json().await { Ok(json) => json, Err(e) => { - tracing::warn!("Failed to parse OpenRouter API response as JSON: {}, falling back to manual model entry", e); + tracing::warn!( + "Failed to parse OpenRouter API response as JSON: {}, falling back to manual model entry", + e + ); return Ok(None); } }; @@ -358,7 +364,9 @@ impl Provider for OpenRouterProvider { // If no models with tool support were found, fall back to manual entry if models.is_empty() { - tracing::warn!("No models with tool support found in OpenRouter API response, falling back to manual model entry"); + tracing::warn!( + "No models with tool support found in OpenRouter API response, falling back to manual model entry" + ); return Ok(None); } diff --git a/crates/goose/src/providers/pricing.rs b/crates/goose/src/providers/pricing.rs index 4b25d4cfefb6..3ebb1031d6d6 100644 --- a/crates/goose/src/providers/pricing.rs +++ b/crates/goose/src/providers/pricing.rs @@ -315,15 +315,16 @@ pub async fn get_all_pricing() -> HashMap> cached.pricing.clone() } else { // Try loading from disk - match PRICING_CACHE.load_from_disk().await { Ok(Some(disk_cache)) => { - // Update memory cache - drop(cache); - let mut write_cache = PRICING_CACHE.memory_cache.write().await; - *write_cache = Some(disk_cache.clone()); - disk_cache.pricing - } _ => { - HashMap::new() - }} + match PRICING_CACHE.load_from_disk().await { + Ok(Some(disk_cache)) => { + // Update memory cache + drop(cache); + let mut write_cache = PRICING_CACHE.memory_cache.write().await; + *write_cache = Some(disk_cache.clone()); + disk_cache.pricing + } + _ => HashMap::new(), + } } } diff --git a/crates/goose/src/providers/sagemaker_tgi.rs b/crates/goose/src/providers/sagemaker_tgi.rs index 80d5c5e14be6..524ebb10866d 100644 --- a/crates/goose/src/providers/sagemaker_tgi.rs +++ b/crates/goose/src/providers/sagemaker_tgi.rs @@ -7,7 +7,7 @@ use aws_config; use aws_sdk_bedrockruntime::config::ProvideCredentials; use aws_sdk_sagemakerruntime::Client as SageMakerClient; use mcp_core::Tool; -use serde_json::{json, Value}; +use serde_json::{Value, json}; use tokio::time::sleep; use super::base::{ConfigKey, Provider, ProviderMetadata, ProviderUsage, Usage}; diff --git a/crates/goose/src/providers/snowflake.rs b/crates/goose/src/providers/snowflake.rs index 54309ec4e54a..a49770c01438 100644 --- a/crates/goose/src/providers/snowflake.rs +++ b/crates/goose/src/providers/snowflake.rs @@ -2,13 +2,13 @@ use anyhow::Result; use async_trait::async_trait; use reqwest::{Client, StatusCode}; use serde::{Deserialize, Serialize}; -use serde_json::{json, Value}; +use serde_json::{Value, json}; use std::time::Duration; use super::base::{ConfigKey, Provider, ProviderMetadata, ProviderUsage}; use super::errors::ProviderError; use super::formats::snowflake::{create_request, get_usage, response_to_message}; -use super::utils::{get_model, ImageFormat}; +use super::utils::{ImageFormat, get_model}; use crate::config::ConfigError; use crate::message::Message; use crate::model::ModelConfig; @@ -318,7 +318,7 @@ impl SnowflakeProvider { .unwrap_or_else(|| "Invalid credentials".to_string()); Err(ProviderError::Authentication(format!( - "Authentication failed. Please check your SNOWFLAKE_TOKEN and SNOWFLAKE_HOST configuration. Error: {}", + "Authentication failed. Please check your SNOWFLAKE_TOKEN and SNOWFLAKE_HOST configuration. Error: {}", error_msg ))) } diff --git a/crates/goose/src/providers/toolshim.rs b/crates/goose/src/providers/toolshim.rs index 0647d0a06e74..2deca0342f05 100644 --- a/crates/goose/src/providers/toolshim.rs +++ b/crates/goose/src/providers/toolshim.rs @@ -37,10 +37,10 @@ use crate::message::{Message, MessageContent}; use crate::model::ModelConfig; use crate::providers::formats::openai::create_request; use anyhow::Result; -use mcp_core::tool::{Tool, ToolCall}; use mcp_core::Content; +use mcp_core::tool::{Tool, ToolCall}; use reqwest::Client; -use serde_json::{json, Value}; +use serde_json::{Value, json}; use std::time::Duration; use uuid::Uuid; @@ -373,8 +373,7 @@ pub fn modify_system_prompt_for_tool_json(system_prompt: &str, tools: &[Tool]) - format!( "{}\n\n{}\n\nBreak down your task into smaller steps and do one step and tool call at a time. Do not try to use multiple tools at once. If you want to use a tool, tell the user what tool to use by specifying the tool in this JSON format\n{{\n \"name\": \"tool_name\",\n \"arguments\": {{\n \"parameter1\": \"value1\",\n \"parameter2\": \"value2\"\n }}\n}}. After you get the tool result back, consider the result and then proceed to do the next step and tool call if required.", - system_prompt, - tool_info + system_prompt, tool_info ) } diff --git a/crates/goose/src/providers/utils.rs b/crates/goose/src/providers/utils.rs index 9c4ec8c6cb38..49852aa30165 100644 --- a/crates/goose/src/providers/utils.rs +++ b/crates/goose/src/providers/utils.rs @@ -6,7 +6,7 @@ use base64::Engine; use regex::Regex; use reqwest::{Response, StatusCode}; use serde::{Deserialize, Serialize}; -use serde_json::{from_value, json, Map, Value}; +use serde_json::{Map, Value, from_value, json}; use std::io::Read; use std::path::Path; @@ -57,21 +57,37 @@ pub async fn handle_status_openai_compat(response: Response) -> Result Err(ProviderError::RequestFailed(e.to_string())), (Ok(body), StatusCode::UNAUTHORIZED | StatusCode::FORBIDDEN) => { - Err(ProviderError::Authentication(format!("Authentication failed. Please ensure your API keys are valid and have the required permissions. \ - Status: {}. Response: {:?}", status, body))) + Err(ProviderError::Authentication(format!( + "Authentication failed. Please ensure your API keys are valid and have the required permissions. \ + Status: {}. Response: {:?}", + status, body + ))) } (Ok(body), StatusCode::BAD_REQUEST | StatusCode::NOT_FOUND) => { tracing::debug!( - "{}", format!("Provider request failed with status: {}. Payload: {:?}", status, body) + "{}", + format!( + "Provider request failed with status: {}. Payload: {:?}", + status, body + ) ); if let Ok(err_resp) = from_value::(body) { let err = err_resp.error; if err.is_context_length_exceeded() { - return Err(ProviderError::ContextLengthExceeded(err.message.unwrap_or("Unknown error".to_string()))); + return Err(ProviderError::ContextLengthExceeded( + err.message.unwrap_or("Unknown error".to_string()), + )); } - return Err(ProviderError::RequestFailed(format!("{} (status {})", err, status.as_u16()))); + return Err(ProviderError::RequestFailed(format!( + "{} (status {})", + err, + status.as_u16() + ))); } - Err(ProviderError::RequestFailed(format!("Unknown error (status {})", status))) + Err(ProviderError::RequestFailed(format!( + "Unknown error (status {})", + status + ))) } (Ok(body), StatusCode::TOO_MANY_REQUESTS) => { Err(ProviderError::RateLimitExceeded(format!("{:?}", body))) @@ -81,9 +97,16 @@ pub async fn handle_status_openai_compat(response: Response) -> Result { tracing::debug!( - "{}", format!("Provider request failed with status: {}. Payload: {:?}", status, body) + "{}", + format!( + "Provider request failed with status: {}. Payload: {:?}", + status, body + ) ); - Err(ProviderError::RequestFailed(format!("Request failed with status: {}", status))) + Err(ProviderError::RequestFailed(format!( + "Request failed with status: {}", + status + ))) } } } @@ -153,26 +176,47 @@ pub async fn handle_response_google_compat(response: Response) -> Result payload.ok_or_else( || ProviderError::RequestFailed("Response body is not valid JSON".to_string()) ), + StatusCode::OK => payload.ok_or_else(|| { + ProviderError::RequestFailed("Response body is not valid JSON".to_string()) + }), StatusCode::UNAUTHORIZED | StatusCode::FORBIDDEN => { - Err(ProviderError::Authentication(format!("Authentication failed. Please ensure your API keys are valid and have the required permissions. \ - Status: {}. Response: {:?}", final_status, payload ))) + Err(ProviderError::Authentication(format!( + "Authentication failed. Please ensure your API keys are valid and have the required permissions. \ + Status: {}. Response: {:?}", + final_status, payload + ))) } StatusCode::BAD_REQUEST | StatusCode::NOT_FOUND => { let mut error_msg = "Unknown error".to_string(); if let Some(payload) = &payload { if let Some(error) = payload.get("error") { - error_msg = error.get("message").and_then(|m| m.as_str()).unwrap_or("Unknown error").to_string(); - let error_status = error.get("status").and_then(|s| s.as_str()).unwrap_or("Unknown status"); - if error_status == "INVALID_ARGUMENT" && error_msg.to_lowercase().contains("exceeds") { + error_msg = error + .get("message") + .and_then(|m| m.as_str()) + .unwrap_or("Unknown error") + .to_string(); + let error_status = error + .get("status") + .and_then(|s| s.as_str()) + .unwrap_or("Unknown status"); + if error_status == "INVALID_ARGUMENT" + && error_msg.to_lowercase().contains("exceeds") + { return Err(ProviderError::ContextLengthExceeded(error_msg.to_string())); } } } tracing::debug!( - "{}", format!("Provider request failed with status: {}. Payload: {:?}", final_status, payload) + "{}", + format!( + "Provider request failed with status: {}. Payload: {:?}", + final_status, payload + ) ); - Err(ProviderError::RequestFailed(format!("Request failed with status: {}. Message: {}", final_status, error_msg))) + Err(ProviderError::RequestFailed(format!( + "Request failed with status: {}. Message: {}", + final_status, error_msg + ))) } StatusCode::TOO_MANY_REQUESTS => { Err(ProviderError::RateLimitExceeded(format!("{:?}", payload))) @@ -182,9 +226,16 @@ pub async fn handle_response_google_compat(response: Response) -> Result { tracing::debug!( - "{}", format!("Provider request failed with status: {}. Payload: {:?}", final_status, payload) + "{}", + format!( + "Provider request failed with status: {}. Payload: {:?}", + final_status, payload + ) ); - Err(ProviderError::RequestFailed(format!("Request failed with status: {}", final_status))) + Err(ProviderError::RequestFailed(format!( + "Request failed with status: {}", + final_status + ))) } } } @@ -279,13 +330,13 @@ pub fn load_image_file(path: &str) -> Result { _ => { return Err(ProviderError::RequestFailed( "Unsupported image format".to_string(), - )) + )); } }, None => { return Err(ProviderError::RequestFailed( "Unknown image format".to_string(), - )) + )); } }; @@ -417,10 +468,12 @@ mod tests { // Test loading fake PNG file let result = load_image_file(fake_png_path_str); assert!(result.is_err()); - assert!(result - .unwrap_err() - .to_string() - .contains("not a valid image")); + assert!( + result + .unwrap_err() + .to_string() + .contains("not a valid image") + ); // Test non-existent file let result = load_image_file("nonexistent.png"); @@ -436,10 +489,12 @@ mod tests { // Test loading unsupported GIF format let result = load_image_file(gif_path_str); assert!(result.is_err()); - assert!(result - .unwrap_err() - .to_string() - .contains("Unsupported image format")); + assert!( + result + .unwrap_err() + .to_string() + .contains("Unsupported image format") + ); } #[test] diff --git a/crates/goose/src/providers/venice.rs b/crates/goose/src/providers/venice.rs index 9046cdd58c91..d3cf199d71ff 100644 --- a/crates/goose/src/providers/venice.rs +++ b/crates/goose/src/providers/venice.rs @@ -3,14 +3,14 @@ use async_trait::async_trait; use chrono::Utc; use reqwest::{Client, Response}; use serde::{Deserialize, Serialize}; -use serde_json::{json, Value}; +use serde_json::{Value, json}; use std::time::Duration; use super::base::{ConfigKey, Provider, ProviderMetadata, ProviderUsage, Usage}; use super::errors::ProviderError; use crate::message::{Message, MessageContent}; use crate::model::ModelConfig; -use mcp_core::{tool::Tool, Role, ToolCall, ToolResult}; +use mcp_core::{Role, ToolCall, ToolResult, tool::Tool}; // ---------- Capability Flags ---------- #[derive(Debug)] @@ -170,9 +170,10 @@ impl VeniceProvider { if let Some(errors) = tools.get("_errors") { if errors.to_string().contains("not supported by this model") { let model_name = self.model.model_name.clone(); - return Err(ProviderError::RequestFailed( - format!("The selected model '{}' does not support tool calls. Please select a model that supports tools, such as 'llama-3.3-70b' or 'mistral-31-24b'.", model_name) - )); + return Err(ProviderError::RequestFailed(format!( + "The selected model '{}' does not support tool calls. Please select a model that supports tools, such as 'llama-3.3-70b' or 'mistral-31-24b'.", + model_name + ))); } } } @@ -187,9 +188,10 @@ impl VeniceProvider { { if message.contains("tools is not supported by this model") { let model_name = self.model.model_name.clone(); - return Err(ProviderError::RequestFailed( - format!("The selected model '{}' does not support tool calls. Please select a model that supports tools, such as 'llama-3.3-70b' or 'mistral-31-24b'.", model_name) - )); + return Err(ProviderError::RequestFailed(format!( + "The selected model '{}' does not support tool calls. Please select a model that supports tools, such as 'llama-3.3-70b' or 'mistral-31-24b'.", + model_name + ))); } } } diff --git a/crates/goose/src/providers/xai.rs b/crates/goose/src/providers/xai.rs index cdaebdc0b1b8..36c381895393 100644 --- a/crates/goose/src/providers/xai.rs +++ b/crates/goose/src/providers/xai.rs @@ -100,14 +100,20 @@ impl XaiProvider { let payload: Option = response.json().await.ok(); match status { - StatusCode::OK => payload.ok_or_else( || ProviderError::RequestFailed("Response body is not valid JSON".to_string()) ), + StatusCode::OK => payload.ok_or_else(|| { + ProviderError::RequestFailed("Response body is not valid JSON".to_string()) + }), StatusCode::UNAUTHORIZED | StatusCode::FORBIDDEN => { - Err(ProviderError::Authentication(format!("Authentication failed. Please ensure your API keys are valid and have the required permissions. \ - Status: {}. Response: {:?}", status, payload))) - } - StatusCode::PAYLOAD_TOO_LARGE => { - Err(ProviderError::ContextLengthExceeded(format!("{:?}", payload))) + Err(ProviderError::Authentication(format!( + "Authentication failed. Please ensure your API keys are valid and have the required permissions. \ + Status: {}. Response: {:?}", + status, payload + ))) } + StatusCode::PAYLOAD_TOO_LARGE => Err(ProviderError::ContextLengthExceeded(format!( + "{:?}", + payload + ))), StatusCode::TOO_MANY_REQUESTS => { Err(ProviderError::RateLimitExceeded(format!("{:?}", payload))) } @@ -116,9 +122,16 @@ impl XaiProvider { } _ => { tracing::debug!( - "{}", format!("Provider request failed with status: {}. Payload: {:?}", status, payload) + "{}", + format!( + "Provider request failed with status: {}. Payload: {:?}", + status, payload + ) ); - Err(ProviderError::RequestFailed(format!("Request failed with status: {}", status))) + Err(ProviderError::RequestFailed(format!( + "Request failed with status: {}", + status + ))) } } } diff --git a/crates/goose/src/scheduler.rs b/crates/goose/src/scheduler.rs index 576187bc1357..d77570864a88 100644 --- a/crates/goose/src/scheduler.rs +++ b/crates/goose/src/scheduler.rs @@ -4,13 +4,13 @@ use std::io; use std::path::{Path, PathBuf}; use std::sync::Arc; -use anyhow::{anyhow, Result}; +use anyhow::{Result, anyhow}; use async_trait::async_trait; use chrono::{DateTime, Utc}; -use etcetera::{choose_app_strategy, AppStrategy}; +use etcetera::{AppStrategy, choose_app_strategy}; use serde::{Deserialize, Serialize}; use tokio::sync::Mutex; -use tokio_cron_scheduler::{job::JobId, Job, JobScheduler as TokioJobScheduler}; +use tokio_cron_scheduler::{Job, JobScheduler as TokioJobScheduler, job::JobId}; use crate::agents::AgentEvent; use crate::agents::{Agent, SessionConfig}; @@ -433,7 +433,11 @@ impl Scheduler { let mut jobs_guard = self.jobs.lock().await; for job_to_load in list { if !Path::new(&job_to_load.source).exists() { - tracing::warn!("Recipe file {} for scheduled job {} not found in shared store. Skipping job load.", job_to_load.source, job_to_load.id); + tracing::warn!( + "Recipe file {} for scheduled job {} not found in shared store. Skipping job load.", + job_to_load.source, + job_to_load.id + ); continue; } @@ -1008,15 +1012,18 @@ impl Scheduler { // Abort the running task if it exists { let mut running_tasks_guard = self.running_tasks.lock().await; - match running_tasks_guard.remove(sched_id) { Some(abort_handle) => { - abort_handle.abort(); - tracing::info!("Aborted running task for job '{}'", sched_id); - } _ => { - tracing::warn!( - "No abort handle found for job '{}' in running tasks map", - sched_id - ); - }} + match running_tasks_guard.remove(sched_id) { + Some(abort_handle) => { + abort_handle.abort(); + tracing::info!("Aborted running task for job '{}'", sched_id); + } + _ => { + tracing::warn!( + "No abort handle found for job '{}' in running tasks map", + sched_id + ); + } + } } // Mark the job as no longer running @@ -1281,7 +1288,11 @@ async fn run_scheduled_job_internal( &fallback_metadata, &all_session_messages, ) { - tracing::error!("[Job {}] Failed to persist final messages with fallback metadata: {}", job.id, e_fb); + tracing::error!( + "[Job {}] Failed to persist final messages with fallback metadata: {}", + job.id, + e_fb + ); } } } @@ -1331,7 +1342,7 @@ mod tests { providers::base::{ProviderMetadata, ProviderUsage, Usage}, providers::errors::ProviderError, }; - use mcp_core::{content::TextContent, tool::Tool, Role}; + use mcp_core::{Role, content::TextContent, tool::Tool}; // Removed: use crate::session::storage::{get_most_recent_session, read_metadata}; // `read_metadata` is still used by the test itself, so keep it or its module. use crate::session::storage::read_metadata; diff --git a/crates/goose/src/scheduler_trait.rs b/crates/goose/src/scheduler_trait.rs index f23b124c2e3b..68edd17d7b52 100644 --- a/crates/goose/src/scheduler_trait.rs +++ b/crates/goose/src/scheduler_trait.rs @@ -34,7 +34,7 @@ pub trait SchedulerTrait: Send + Sync { /// Update a schedule's cron expression async fn update_schedule(&self, sched_id: &str, new_cron: String) - -> Result<(), SchedulerError>; + -> Result<(), SchedulerError>; /// Kill a running job async fn kill_running_job(&self, sched_id: &str) -> Result<(), SchedulerError>; diff --git a/crates/goose/src/session/mod.rs b/crates/goose/src/session/mod.rs index 5f4537fe7e6a..980b156cea1a 100644 --- a/crates/goose/src/session/mod.rs +++ b/crates/goose/src/session/mod.rs @@ -3,10 +3,10 @@ pub mod storage; // Re-export common session types and functions pub use storage::{ - ensure_session_dir, generate_description, generate_description_with_schedule_id, - generate_session_id, get_most_recent_session, get_path, list_sessions, persist_messages, - persist_messages_with_schedule_id, read_messages, read_metadata, update_metadata, Identifier, - SessionMetadata, + Identifier, SessionMetadata, ensure_session_dir, generate_description, + generate_description_with_schedule_id, generate_session_id, get_most_recent_session, get_path, + list_sessions, persist_messages, persist_messages_with_schedule_id, read_messages, + read_metadata, update_metadata, }; -pub use info::{get_valid_sorted_sessions, SessionInfo}; +pub use info::{SessionInfo, get_valid_sorted_sessions}; diff --git a/crates/goose/src/session/storage.rs b/crates/goose/src/session/storage.rs index d21e53336a88..ed84509a4f45 100644 --- a/crates/goose/src/session/storage.rs +++ b/crates/goose/src/session/storage.rs @@ -10,7 +10,7 @@ use crate::providers::base::Provider; use crate::utils::safe_truncate; use anyhow::Result; use chrono::Local; -use etcetera::{choose_app_strategy, AppStrategy, AppStrategyArgs}; +use etcetera::{AppStrategy, AppStrategyArgs, choose_app_strategy}; use regex::Regex; use serde::{Deserialize, Serialize}; use std::fs; diff --git a/crates/goose/src/temporal_scheduler.rs b/crates/goose/src/temporal_scheduler.rs index 5f86f8d405f7..2b7579f7988b 100644 --- a/crates/goose/src/temporal_scheduler.rs +++ b/crates/goose/src/temporal_scheduler.rs @@ -9,7 +9,7 @@ use serde::{Deserialize, Serialize}; use tokio::time::sleep; use tracing::{info, warn}; -use crate::scheduler::{normalize_cron_expression, ScheduledJob, SchedulerError}; +use crate::scheduler::{ScheduledJob, SchedulerError, normalize_cron_expression}; use crate::scheduler_trait::SchedulerTrait; use crate::session::storage::SessionMetadata; diff --git a/crates/goose/src/tracing/langfuse_layer.rs b/crates/goose/src/tracing/langfuse_layer.rs index e302ee7f12a1..894ef2eef177 100644 --- a/crates/goose/src/tracing/langfuse_layer.rs +++ b/crates/goose/src/tracing/langfuse_layer.rs @@ -2,7 +2,7 @@ use crate::tracing::observation_layer::{BatchManager, ObservationLayer, SpanTrac use chrono::Utc; use reqwest::{Client, StatusCode}; use serde::{Deserialize, Serialize}; -use serde_json::{json, Value}; +use serde_json::{Value, json}; use std::env; use std::sync::Arc; use std::time::Duration; diff --git a/crates/goose/src/tracing/mod.rs b/crates/goose/src/tracing/mod.rs index caa6bcd989f5..405fca49f1fd 100644 --- a/crates/goose/src/tracing/mod.rs +++ b/crates/goose/src/tracing/mod.rs @@ -1,7 +1,7 @@ pub mod langfuse_layer; mod observation_layer; -pub use langfuse_layer::{create_langfuse_observer, LangfuseBatchManager}; +pub use langfuse_layer::{LangfuseBatchManager, create_langfuse_observer}; pub use observation_layer::{ - flatten_metadata, map_level, BatchManager, ObservationLayer, SpanData, SpanTracker, + BatchManager, ObservationLayer, SpanData, SpanTracker, flatten_metadata, map_level, }; diff --git a/crates/goose/src/tracing/observation_layer.rs b/crates/goose/src/tracing/observation_layer.rs index 08b7c7f302a3..63f3f02d99b9 100644 --- a/crates/goose/src/tracing/observation_layer.rs +++ b/crates/goose/src/tracing/observation_layer.rs @@ -1,14 +1,14 @@ use chrono::Utc; -use serde_json::{json, Value}; +use serde_json::{Value, json}; use std::collections::HashMap; use std::fmt; use std::sync::Arc; use tokio::sync::Mutex; use tracing::field::{Field, Visit}; -use tracing::{span, Event, Id, Level, Metadata, Subscriber}; +use tracing::{Event, Id, Level, Metadata, Subscriber, span}; +use tracing_subscriber::Layer; use tracing_subscriber::layer::Context; use tracing_subscriber::registry::LookupSpan; -use tracing_subscriber::Layer; use uuid::Uuid; #[derive(Debug, Clone)] diff --git a/crates/goose/tests/agent.rs b/crates/goose/tests/agent.rs index b7f19e53aded..9cb994e618ae 100644 --- a/crates/goose/tests/agent.rs +++ b/crates/goose/tests/agent.rs @@ -156,7 +156,10 @@ async fn run_truncate_test( // Ollama and OpenRouter truncate by default even when the context window is exceeded // We don't have control over the truncation behavior in these providers if provider_type == ProviderType::Ollama || provider_type == ProviderType::OpenRouter { - println!("WARNING: Skipping test for {:?} because it truncates by default when the context window is exceeded", provider_type); + println!( + "WARNING: Skipping test for {:?} because it truncates by default when the context window is exceeded", + provider_type + ); return Ok(()); } @@ -446,9 +449,10 @@ mod schedule_tool_tests { assert!(schedule_tool.is_some()); let tool = schedule_tool.unwrap(); - assert!(tool - .description - .contains("Manage scheduled recipe execution")); + assert!( + tool.description + .contains("Manage scheduled recipe execution") + ); } #[tokio::test] @@ -476,9 +480,10 @@ mod schedule_tool_tests { assert!(schedule_tool.is_some()); let tool = schedule_tool.unwrap(); - assert!(tool - .description - .contains("Manage scheduled recipe execution")); + assert!( + tool.description + .contains("Manage scheduled recipe execution") + ); // Verify the tool has the expected actions in its schema if let Some(properties) = tool.input_schema.get("properties") { @@ -521,12 +526,14 @@ mod schedule_tool_tests { session_id_prop.get("type").unwrap().as_str().unwrap(), "string" ); - assert!(session_id_prop - .get("description") - .unwrap() - .as_str() - .unwrap() - .contains("Session identifier for session_content action")); + assert!( + session_id_prop + .get("description") + .unwrap() + .as_str() + .unwrap() + .contains("Session identifier for session_content action") + ); } } } diff --git a/crates/goose/tests/private_tests.rs b/crates/goose/tests/private_tests.rs index 78e7cdd7658c..3cc8677c9fda 100644 --- a/crates/goose/tests/private_tests.rs +++ b/crates/goose/tests/private_tests.rs @@ -6,7 +6,7 @@ use serde_json::json; use goose::agents::platform_tools::PLATFORM_MANAGE_SCHEDULE_TOOL_NAME; mod test_support; use test_support::{ - create_temp_recipe, create_test_session_metadata, MockBehavior, ScheduleToolTestBuilder, + MockBehavior, ScheduleToolTestBuilder, create_temp_recipe, create_test_session_metadata, }; // Test all actions of the scheduler platform tool @@ -128,9 +128,11 @@ async fn test_schedule_tool_create_action() { let content = result.unwrap(); assert_eq!(content.len(), 1); if let Content::Text(text_content) = &content[0] { - assert!(text_content - .text - .contains("Successfully created scheduled job")); + assert!( + text_content + .text + .contains("Successfully created scheduled job") + ); } // Verify the scheduler was called @@ -287,9 +289,11 @@ async fn test_schedule_tool_run_now_action() { let content = result.unwrap(); assert_eq!(content.len(), 1); if let Content::Text(text_content) = &content[0] { - assert!(text_content - .text - .contains("Successfully started job 'job1'")); + assert!( + text_content + .text + .contains("Successfully started job 'job1'") + ); } // Verify the scheduler was called @@ -456,9 +460,11 @@ async fn test_schedule_tool_unpause_action() { let content = result.unwrap(); assert_eq!(content.len(), 1); if let Content::Text(text_content) = &content[0] { - assert!(text_content - .text - .contains("Successfully unpaused job 'job1'")); + assert!( + text_content + .text + .contains("Successfully unpaused job 'job1'") + ); } // Verify the scheduler was called @@ -488,9 +494,11 @@ async fn test_schedule_tool_delete_action() { let content = result.unwrap(); assert_eq!(content.len(), 1); if let Content::Text(text_content) = &content[0] { - assert!(text_content - .text - .contains("Successfully deleted job 'job1'")); + assert!( + text_content + .text + .contains("Successfully deleted job 'job1'") + ); } // Verify the scheduler was called @@ -522,9 +530,11 @@ async fn test_schedule_tool_kill_action() { let content = result.unwrap(); assert_eq!(content.len(), 1); if let Content::Text(text_content) = &content[0] { - assert!(text_content - .text - .contains("Successfully killed running job 'job1'")); + assert!( + text_content + .text + .contains("Successfully killed running job 'job1'") + ); } // Verify the scheduler was called @@ -586,9 +596,11 @@ async fn test_schedule_tool_inspect_action_running() { let content = result.unwrap(); assert_eq!(content.len(), 1); if let Content::Text(text_content) = &content[0] { - assert!(text_content - .text - .contains("Job 'job1' is currently running")); + assert!( + text_content + .text + .contains("Job 'job1' is currently running") + ); } // Verify the scheduler was called @@ -618,9 +630,11 @@ async fn test_schedule_tool_inspect_action_not_running() { let content = result.unwrap(); assert_eq!(content.len(), 1); if let Content::Text(text_content) = &content[0] { - assert!(text_content - .text - .contains("Job 'job1' is not currently running")); + assert!( + text_content + .text + .contains("Job 'job1' is not currently running") + ); } // Verify the scheduler was called @@ -739,9 +753,11 @@ async fn test_schedule_tool_sessions_action_empty() { let content = result.unwrap(); assert_eq!(content.len(), 1); if let Content::Text(text_content) = &content[0] { - assert!(text_content - .text - .contains("No sessions found for job 'job1'")); + assert!( + text_content + .text + .contains("No sessions found for job 'job1'") + ); } // Verify the scheduler was called @@ -810,9 +826,11 @@ async fn test_schedule_tool_session_content_action_with_real_session() { if let Ok(content) = result { assert_eq!(content.len(), 1); if let mcp_core::Content::Text(text_content) = &content[0] { - assert!(text_content - .text - .contains("Session 'test_session_real' Content:")); + assert!( + text_content + .text + .contains("Session 'test_session_real' Content:") + ); assert!(text_content.text.contains("Metadata:")); assert!(text_content.text.contains("Messages:")); assert!(text_content.text.contains("Hello")); diff --git a/crates/goose/tests/providers.rs b/crates/goose/tests/providers.rs index b5b8a434312c..c15cbe5813f3 100644 --- a/crates/goose/tests/providers.rs +++ b/crates/goose/tests/providers.rs @@ -255,7 +255,7 @@ impl ProviderTester { } async fn test_image_content_support(&self) -> Result<()> { - use base64::{engine::general_purpose::STANDARD as BASE64, Engine as _}; + use base64::{Engine as _, engine::general_purpose::STANDARD as BASE64}; use mcp_core::content::ImageContent; use std::fs; From cffe862dac97aa367672f8f172603e03821e9989 Mon Sep 17 00:00:00 2001 From: Jack Amadeo Date: Wed, 16 Jul 2025 21:40:38 -0400 Subject: [PATCH 6/7] Revert "REVERT ME: don't break the build when we fail bindings gen" This reverts commit 25c48e2965327b607aa29e5c7981db5e3607b914. --- crates/goose-ffi/build.rs | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/crates/goose-ffi/build.rs b/crates/goose-ffi/build.rs index 46a8a8a5e29f..a26c3409cdf4 100644 --- a/crates/goose-ffi/build.rs +++ b/crates/goose-ffi/build.rs @@ -33,21 +33,15 @@ fn main() { ..Default::default() }; - let out_path = PathBuf::from(&crate_dir).join("include"); - std::fs::create_dir_all(&out_path).expect("Failed to create include directory"); - cbindgen::Builder::new() + let bindings = cbindgen::Builder::new() .with_crate(&crate_dir) .with_config(config) .generate() - .map_or_else( - |error| match error { - cbindgen::Error::ParseSyntaxError { .. } => {} - e => panic!("{:?}", e), - }, - |bindings| { - bindings.write_to_file(out_path.join("goose_ffi.h")); - }, - ); + .expect("Unable to generate bindings"); + + let out_path = PathBuf::from(&crate_dir).join("include"); + std::fs::create_dir_all(&out_path).expect("Failed to create include directory"); + bindings.write_to_file(out_path.join("goose_ffi.h")); println!("cargo:rerun-if-changed=src/lib.rs"); println!("cargo:rerun-if-changed=build.rs"); From 7afab57870ac2c434989209bfcc3928384eac1a7 Mon Sep 17 00:00:00 2001 From: Jack Amadeo Date: Wed, 16 Jul 2025 21:42:58 -0400 Subject: [PATCH 7/7] upgrade cbindgen --- Cargo.lock | 116 ++++++++++-------------------------- crates/goose-ffi/Cargo.toml | 2 +- 2 files changed, 31 insertions(+), 87 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9a12e35e4328..198bfc03a320 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -721,17 +721,6 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi 0.1.19", - "libc", - "winapi", -] - [[package]] name = "autocfg" version = "1.5.0" @@ -1331,7 +1320,7 @@ dependencies = [ "bincode", "bugreport", "bytesize", - "clap 4.5.41", + "clap", "clircle", "console", "content_inspector", @@ -1377,7 +1366,7 @@ dependencies = [ "bitflags 2.9.1", "cexpr", "clang-sys", - "itertools 0.10.5", + "itertools 0.12.1", "lazy_static", "lazycell", "log", @@ -1693,21 +1682,21 @@ dependencies = [ [[package]] name = "cbindgen" -version = "0.24.5" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b922faaf31122819ec80c4047cc684c6979a087366c069611e33649bf98e18d" +checksum = "975982cdb7ad6a142be15bdf84aea7ec6a9e5d4d797c004d43185b24cfe4e684" dependencies = [ - "clap 3.2.25", - "heck 0.4.1", - "indexmap 1.9.3", + "clap", + "heck 0.5.0", + "indexmap 2.10.0", "log", "proc-macro2", "quote", "serde", "serde_json", - "syn 1.0.109", + "syn 2.0.104", "tempfile", - "toml 0.5.11", + "toml 0.8.23", ] [[package]] @@ -1860,21 +1849,6 @@ dependencies = [ "libloading", ] -[[package]] -name = "clap" -version = "3.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" -dependencies = [ - "atty", - "bitflags 1.3.2", - "clap_lex 0.2.4", - "indexmap 1.9.3", - "strsim 0.10.0", - "termcolor", - "textwrap", -] - [[package]] name = "clap" version = "4.5.41" @@ -1893,8 +1867,8 @@ checksum = "707eab41e9622f9139419d573eca0900137718000c517d47da73045f54331c3d" dependencies = [ "anstream", "anstyle", - "clap_lex 0.7.5", - "strsim 0.11.1", + "clap_lex", + "strsim", "terminal_size", ] @@ -1910,15 +1884,6 @@ dependencies = [ "syn 2.0.104", ] -[[package]] -name = "clap_lex" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" -dependencies = [ - "os_str_bytes", -] - [[package]] name = "clap_lex" version = "0.7.5" @@ -1934,7 +1899,7 @@ dependencies = [ "console", "indicatif", "once_cell", - "strsim 0.11.1", + "strsim", "textwrap", "zeroize", ] @@ -2177,7 +2142,7 @@ dependencies = [ "anes", "cast", "ciborium", - "clap 4.5.41", + "clap", "criterion-plot", "is-terminal", "itertools 0.10.5", @@ -2322,7 +2287,7 @@ dependencies = [ "ident_case", "proc-macro2", "quote", - "strsim 0.11.1", + "strsim", "syn 2.0.104", ] @@ -3053,7 +3018,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.60.2", ] [[package]] @@ -3202,7 +3167,7 @@ checksum = "0ce92ff622d6dadf7349484f42c93271a0d49b7cc4d466a936405bacbe10aa78" dependencies = [ "cfg-if", "rustix 1.0.8", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -3839,7 +3804,7 @@ dependencies = [ "bat", "bytes", "chrono", - "clap 4.5.41", + "clap", "cliclack", "console", "dirs 5.0.1", @@ -3987,7 +3952,7 @@ dependencies = [ "base64 0.21.7", "bytes", "chrono", - "clap 4.5.41", + "clap", "config", "dirs 6.0.0", "etcetera", @@ -4125,15 +4090,6 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" -[[package]] -name = "hermit-abi" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - [[package]] name = "hermit-abi" version = "0.3.9" @@ -4407,7 +4363,7 @@ dependencies = [ "js-sys", "log", "wasm-bindgen", - "windows-core 0.57.0", + "windows-core 0.61.2", ] [[package]] @@ -4718,7 +4674,7 @@ checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" dependencies = [ "hermit-abi 0.5.2", "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -5464,7 +5420,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" dependencies = [ "cfg-if", - "windows-targets 0.48.5", + "windows-targets 0.53.2", ] [[package]] @@ -6608,12 +6564,6 @@ dependencies = [ "pin-project-lite", ] -[[package]] -name = "os_str_bytes" -version = "6.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" - [[package]] name = "outref" version = "0.5.2" @@ -7104,8 +7054,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22505a5c94da8e3b7c2996394d1c933236c4d743e81a410bcca4e6989fc066a4" dependencies = [ "bytes", - "heck 0.4.1", - "itertools 0.10.5", + "heck 0.5.0", + "itertools 0.12.1", "log", "multimap", "once_cell", @@ -7125,7 +7075,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" dependencies = [ "anyhow", - "itertools 0.10.5", + "itertools 0.12.1", "proc-macro2", "quote", "syn 2.0.104", @@ -7282,7 +7232,7 @@ dependencies = [ "once_cell", "socket2 0.5.10", "tracing", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -7750,7 +7700,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys 0.4.15", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -7763,7 +7713,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys 0.9.4", - "windows-sys 0.52.0", + "windows-sys 0.60.2", ] [[package]] @@ -8480,12 +8430,6 @@ version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e51f1e89f093f99e7432c491c382b88a6860a5adbe6bf02574bf0a08efff1978" -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - [[package]] name = "strsim" version = "0.11.1" @@ -8842,7 +8786,7 @@ dependencies = [ "getrandom 0.3.3", "once_cell", "rustix 1.0.8", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -9548,7 +9492,7 @@ dependencies = [ "anyhow", "camino", "cargo_metadata 0.19.2", - "clap 4.5.41", + "clap", "uniffi_bindgen", "uniffi_core", "uniffi_macros", @@ -10143,7 +10087,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] diff --git a/crates/goose-ffi/Cargo.toml b/crates/goose-ffi/Cargo.toml index f5e430f6dbcd..dbd50a11448f 100644 --- a/crates/goose-ffi/Cargo.toml +++ b/crates/goose-ffi/Cargo.toml @@ -25,4 +25,4 @@ libc = "0.2" once_cell = "1.18" [build-dependencies] -cbindgen = "0.24.0" +cbindgen = "0.29.0"