diff --git a/Cargo.lock b/Cargo.lock index 9010c94c13..9cec3385d6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -77,23 +77,6 @@ dependencies = [ "syn 3.0.4", ] -[[package]] -name = "agent-client-protocol-http" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b4d8db045bc66b84526dfe4ef2ffb87d651b81c4ff945f91c63a2bc677a582c" -dependencies = [ - "agent-client-protocol", - "async-stream", - "axum", - "futures", - "serde_json", - "tokio", - "tower-http 0.7.1", - "tracing", - "uuid", -] - [[package]] name = "agent-client-protocol-schema" version = "1.5.0" @@ -106,7 +89,7 @@ dependencies = [ "serde", "serde_json", "serde_with", - "strum 0.28.0", + "strum", "tracing", ] @@ -133,21 +116,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "alloc-no-stdlib" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" - -[[package]] -name = "alloc-stdlib" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e76a019e91224d279006ff972f1e984179a6e9feb050adba6ce8274aef23195" -dependencies = [ - "alloc-no-stdlib", -] - [[package]] name = "allocator-api2" version = "0.2.21" @@ -252,23 +220,6 @@ dependencies = [ "derive_arbitrary", ] -[[package]] -name = "arboard" -version = "3.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0348a1c054491f4bfe6ab86a7b6ab1e44e45d899005de92f58b3df180b36ddaf" -dependencies = [ - "clipboard-win", - "log", - "objc2", - "objc2-app-kit", - "objc2-foundation", - "parking_lot", - "percent-encoding", - "windows-sys 0.60.2", - "x11rb", -] - [[package]] name = "arc-swap" version = "1.9.2" @@ -302,45 +253,6 @@ version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56" -[[package]] -name = "asn1-rs" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7f43a50ac4fdca5df8e885c21b835997f0a1cdee65494a6847694a98652d9d8" -dependencies = [ - "asn1-rs-derive", - "asn1-rs-impl", - "displaydoc", - "nom", - "num-traits", - "rusticata-macros", - "thiserror 2.0.20", - "time", -] - -[[package]] -name = "asn1-rs-derive" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3109e49b1e4909e9db6515a30c633684d68cdeaa252f215214cb4fa1a5bfee2c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", - "synstructure", -] - -[[package]] -name = "asn1-rs-impl" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - [[package]] name = "async-broadcast" version = "0.7.2" @@ -576,7 +488,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16e2cdb6d5ed835199484bb92bb8b3edd526effe995c61732580439c1a67e2e9" dependencies = [ "base64 0.22.1", - "http 1.5.0", + "http", "log", "rustls", "serde", @@ -640,68 +552,6 @@ dependencies = [ "thiserror 2.0.20", ] -[[package]] -name = "aws-smithy-async" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f02e407fb3b54891734224b9ffac8a71fdd35f542500fa1af95754a6b2beb316" -dependencies = [ - "futures-util", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "aws-smithy-runtime-api" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "954c563ce84507722d2679f07a35d21b9c6466b3872d513020d0281fc8112ac9" -dependencies = [ - "aws-smithy-async", - "aws-smithy-runtime-api-macros", - "aws-smithy-types", - "bytes", - "http 0.2.12", - "http 1.5.0", - "pin-project-lite", - "tokio", - "tracing", -] - -[[package]] -name = "aws-smithy-runtime-api-macros" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "221eaa237ddf1ca79b60d1372aad77e47f9c0ea5b3ce5099da8c61d027dc77b3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "aws-smithy-types" -version = "1.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fce83ce9abbb198d25bc7131e468d0f9fe1257125e58c39f3f9fc9f5098c9647" -dependencies = [ - "base64-simd", - "bytes", - "bytes-utils", - "http 0.2.12", - "http 1.5.0", - "http-body 0.4.6", - "http-body 1.1.0", - "http-body-util", - "itoa", - "num-integer", - "pin-project-lite", - "pin-utils", - "ryu", - "serde", - "time", -] - [[package]] name = "axum" version = "0.8.9" @@ -714,8 +564,8 @@ dependencies = [ "bytes", "form_urlencoded", "futures-util", - "http 1.5.0", - "http-body 1.1.0", + "http", + "http-body", "http-body-util", "hyper", "hyper-util", @@ -747,8 +597,8 @@ checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1" dependencies = [ "bytes", "futures-core", - "http 1.5.0", - "http-body 1.1.0", + "http", + "http-body", "http-body-util", "mime", "pin-project-lite", @@ -769,28 +619,6 @@ dependencies = [ "syn 2.0.119", ] -[[package]] -name = "axum-server" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1df331683d982a0b9492b38127151e6453639cd34926eb9c07d4cd8c6d22bfc" -dependencies = [ - "arc-swap", - "bytes", - "either", - "fs-err", - "http 1.5.0", - "http-body 1.1.0", - "hyper", - "hyper-util", - "pin-project-lite", - "rustls", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tower-service", -] - [[package]] name = "backon" version = "1.6.0" @@ -826,16 +654,6 @@ version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac07cdecf99051d9a5238b80f35af32cdeba5b336e55d957b318b50137e18da5" -[[package]] -name = "base64-simd" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "339abbe78e73178762e23bea9dfd08e697eb3f3301cd4be981c0f78ba5859195" -dependencies = [ - "outref", - "vsimd", -] - [[package]] name = "base64ct" version = "1.8.3" @@ -901,15 +719,6 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" -[[package]] -name = "bit-vec" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b71798fca2c1fe1086445a7258a4bc81e6e49dcd24c8d0dd9a1e57395b603f51" -dependencies = [ - "serde", -] - [[package]] name = "bitcoin-consensus-encoding" version = "1.2.0" @@ -1074,33 +883,6 @@ dependencies = [ "syn 3.0.4", ] -[[package]] -name = "borrow-or-share" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc0b364ead1874514c8c2855ab558056ebfeb775653e7ae45ff72f28f8f3166c" - -[[package]] -name = "brotli" -version = "8.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc91aac060a7a1e25823bdccbfb6af1875b88f17c6daac97894eed8207166b3" -dependencies = [ - "alloc-no-stdlib", - "alloc-stdlib", - "brotli-decompressor", -] - -[[package]] -name = "brotli-decompressor" -version = "5.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a32acac15fe1967bc3986b2a6347dffc965602354ea6f450ad07e8bfd253583" -dependencies = [ - "alloc-no-stdlib", - "alloc-stdlib", -] - [[package]] name = "bs58" version = "0.5.1" @@ -1201,14 +983,12 @@ dependencies = [ "fs2", "futures", "getrandom 0.4.3", - "goose", "goose-agent", "goose-context-management", "goose-provider-types", "goose-providers", "goose-sdk-types", "hex", - "idna_adapter", "nix 0.31.3", "reqwest 0.13.4", "rmcp 3.2.0", @@ -1255,7 +1035,7 @@ dependencies = [ "chrono", "futures-util", "hex", - "jsonwebtoken 10.4.0", + "jsonwebtoken", "nostr 0.44.8", "rand 0.10.2", "reqwest 0.13.4", @@ -1275,7 +1055,7 @@ version = "0.1.0" dependencies = [ "chrono", "hex", - "http 1.5.0", + "http", "http-body-util", "k8s-openapi", "kube", @@ -1423,7 +1203,7 @@ dependencies = [ "git-credential-nostr", "git-sign-nostr", "ignore", - "image 0.25.10", + "image", "nix 0.31.3", "nostr 0.44.8", "reqwest 0.13.4", @@ -1454,7 +1234,7 @@ dependencies = [ "futures-core", "futures-util", "hex", - "image 0.25.10", + "image", "imagesize", "infer", "mp4", @@ -1587,7 +1367,7 @@ dependencies = [ "thiserror 2.0.20", "tokio", "tower", - "tower-http 0.6.11", + "tower-http", "tracing", "tracing-subscriber", "url", @@ -1657,7 +1437,7 @@ dependencies = [ "tokio-tungstenite 0.29.0", "tokio-util", "tower", - "tower-http 0.6.11", + "tower-http", "tracing", "tracing-opentelemetry", "tracing-subscriber", @@ -1808,12 +1588,6 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64fa3c856b712db6612c019f14756e64e4bcea13337a6b33b696333a9eaa2d06" -[[package]] -name = "bytecount" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e" - [[package]] name = "bytemuck" version = "1.25.2" @@ -1838,16 +1612,6 @@ version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" -[[package]] -name = "bytes-utils" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dafe3a8757b027e2be6e4e5601ed563c55989fcf1546e933c66c8eb3a058d35" -dependencies = [ - "bytes", - "either", -] - [[package]] name = "bzip2" version = "0.4.4" @@ -1877,16 +1641,6 @@ dependencies = [ "pkg-config", ] -[[package]] -name = "calendrical_calculations" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5abbd6eeda6885048d357edc66748eea6e0268e3dd11f326fff5bd248d779c26" -dependencies = [ - "core_maths", - "displaydoc", -] - [[package]] name = "castaway" version = "0.2.4" @@ -2001,16 +1755,6 @@ dependencies = [ "windows-link 0.2.1", ] -[[package]] -name = "chrono-tz" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6139a8597ed92cf816dfb33f5dd6cf0bb93a6adc938f11039f371bc5bcd26c3" -dependencies = [ - "chrono", - "phf 0.12.1", -] - [[package]] name = "cipher" version = "0.4.4" @@ -2062,15 +1806,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" -[[package]] -name = "clipboard-win" -version = "5.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bde03770d3df201d4fb868f2c9c59e66a3e4e2bd06692a0fe701e7103c7e84d4" -dependencies = [ - "error-code", -] - [[package]] name = "cmake" version = "0.1.58" @@ -2164,12 +1899,9 @@ version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce2548391e9c1929c21bf6aa2680af86fe4c1b33e6cea9ac1cfeec0bd11218cf" dependencies = [ - "brotli", "compression-core", "flate2", "memchr", - "zstd", - "zstd-safe", ] [[package]] @@ -2261,35 +1993,6 @@ dependencies = [ "unicode-segmentation", ] -[[package]] -name = "cookie" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a373e3602691c3cdea496d2f0ee5935151e6168fe87739483c463db1b2f2f87" -dependencies = [ - "percent-encoding", - "time", - "version_check", -] - -[[package]] -name = "cookie_store" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15b2c103cf610ec6cae3da84a766285b42fd16aad564758459e6ecf128c75206" -dependencies = [ - "cookie", - "document-features", - "idna", - "log", - "publicsuffix", - "serde", - "serde_derive", - "serde_json", - "time", - "url", -] - [[package]] name = "cordyceps" version = "0.3.5" @@ -2326,15 +2029,6 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" -[[package]] -name = "core_maths" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77745e017f5edba1a9c1d854f6f3a52dac8a12dd5af5d2f54aecf61e43d80d30" -dependencies = [ - "libm", -] - [[package]] name = "countdown-bot" version = "0.1.0" @@ -2414,21 +2108,10 @@ checksum = "089df96cf6a25253b4b6b6744d86f91150a3d4df546f31a95def47976b8cba97" dependencies = [ "chrono", "once_cell", - "phf 0.11.3", + "phf", "winnow 0.7.15", ] -[[package]] -name = "croner" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4aa42bcd3d846ebf66e15bd528d1087f75d1c6c1c66ebff626178a106353c576" -dependencies = [ - "chrono", - "derive_builder", - "strum 0.27.2", -] - [[package]] name = "crossbeam-channel" version = "0.5.16" @@ -2578,7 +2261,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb2a7d3066da2de787b7f032c736763eb7ae5d355f81a68bab2675a96008b0bf" dependencies = [ "lab", - "phf 0.11.3", + "phf", ] [[package]] @@ -2918,20 +2601,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "der-parser" -version = "10.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07da5016415d5a3c4dd39b11ed26f915f52fc4e0dc197d87908bc916e51bc1a6" -dependencies = [ - "asn1-rs", - "displaydoc", - "nom", - "num-bigint 0.4.8", - "num-traits", - "rusticata-macros", -] - [[package]] name = "deranged" version = "0.5.8" @@ -3171,15 +2840,6 @@ dependencies = [ "serde", ] -[[package]] -name = "email_address" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e079f19b08ca6239f47f8ba8509c11cf3ea30095831f7fed61441475edd8c449" -dependencies = [ - "serde", -] - [[package]] name = "embedded-io" version = "0.4.0" @@ -3261,12 +2921,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "error-code" -version = "3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b5343afd4a8365a643ac588dab4cf234a190c7f6c88c9f6dd6ffe00837661b7" - [[package]] name = "esaxx-rs" version = "0.1.10" @@ -3356,28 +3010,6 @@ dependencies = [ "regex-syntax", ] -[[package]] -name = "fancy-regex" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72cf461f865c862bb7dc573f643dd6a2b6842f7c30b07882b56bd148cc2761b8" -dependencies = [ - "bit-set 0.8.0", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "fancy-regex" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "476de73bddf2ef8490aa4ee8f1cf40b430bf1d56c48c22080e5186952cd580e6" -dependencies = [ - "bit-set 0.8.0", - "regex-automata", - "regex-syntax", -] - [[package]] name = "faster-hex" version = "0.10.0" @@ -3471,17 +3103,6 @@ dependencies = [ "zlib-rs", ] -[[package]] -name = "fluent-uri" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc74ac4d8359ae70623506d512209619e5cf8f347124910440dbc221714b328e" -dependencies = [ - "borrow-or-share", - "ref-cast", - "serde", -] - [[package]] name = "flume" version = "0.11.1" @@ -3546,26 +3167,6 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "fraction" -version = "0.15.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e076045bb43dac435333ed5f04caf35c7463631d0dae2deb2638d94dd0a5b872" -dependencies = [ - "lazy_static", - "num", -] - -[[package]] -name = "fs-err" -version = "3.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b91aa448ca50d7e79433bdf3ee8d99215430d2ec02ade5aefab2a073a1822e8a" -dependencies = [ - "autocfg", - "tokio", -] - [[package]] name = "fs2" version = "0.4.3" @@ -3755,16 +3356,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "gethostname" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" -dependencies = [ - "rustix 1.1.4", - "windows-link 0.2.1", -] - [[package]] name = "getrandom" version = "0.2.17" @@ -3816,16 +3407,6 @@ dependencies = [ "polyval", ] -[[package]] -name = "gif" -version = "0.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ae047235e33e2829703574b54fdec96bfbad892062d97fed2f76022287de61b" -dependencies = [ - "color_quant", - "weezl", -] - [[package]] name = "gif" version = "0.14.2" @@ -3904,140 +3485,39 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "goose" -version = "1.48.0" -source = "git+https://github.com/aaif-goose/goose?rev=0a9749b1cbf38d182080a53286c4942629f66565#0a9749b1cbf38d182080a53286c4942629f66565" -dependencies = [ - "agent-client-protocol", - "agent-client-protocol-http", - "agent-client-protocol-schema", - "anyhow", - "arboard", - "async-stream", - "async-trait", - "aws-lc-rs", - "axum", - "axum-server", - "base64 0.23.1", - "blake3", - "chrono", - "clap", - "dirs", - "etcetera", - "fs-err", - "fs2", - "futures", - "gethostname", - "goose-acp-macros", - "goose-agent", - "goose-context-management", - "goose-download-manager", - "goose-providers", - "goose-sdk-types", - "icu_calendar", - "icu_locale", - "ignore", - "image 0.24.9", - "include_dir", - "indexmap 2.14.1", - "indoc", - "jsonschema", - "jsonwebtoken 11.0.0", - "libc", - "lru", - "minijinja", - "nanoid", - "ntapi", - "oauth2", - "once_cell", - "pastey", - "pem 4.0.0", - "process-wrap", - "rand 0.10.2", - "rayon", - "rcgen", - "regex", - "reqwest 0.13.4", - "rmcp 3.2.0", - "rustls", - "schemars 1.2.2", - "serde", - "serde_json", - "serde_path_to_error", - "serde_urlencoded", - "serde_yaml", - "sha2 0.11.0", - "shell-words", - "shellexpand", - "smithy-transport-reqwest", - "sqlx", - "strum 0.28.0", - "subtle", - "sys-info", - "tempfile", - "thiserror 2.0.20", - "tiktoken-rs", - "tokio", - "tokio-cron-scheduler", - "tokio-stream", - "tokio-util", - "tower-http 0.7.1", - "tracing", - "tracing-appender", - "tracing-futures", - "tracing-subscriber", - "tree-sitter", - "tree-sitter-go", - "tree-sitter-java", - "tree-sitter-javascript", - "tree-sitter-kotlin-ng", - "tree-sitter-python", - "tree-sitter-ruby", - "tree-sitter-rust", - "tree-sitter-swift", - "tree-sitter-typescript", - "unicode-normalization", - "url", - "urlencoding", - "uuid", - "v_htmlescape", - "webbrowser", - "which", - "winapi", -] - -[[package]] -name = "goose-acp-macros" -version = "1.48.0" -source = "git+https://github.com/aaif-goose/goose?rev=0a9749b1cbf38d182080a53286c4942629f66565#0a9749b1cbf38d182080a53286c4942629f66565" -dependencies = [ - "quote", - "syn 3.0.4", -] - [[package]] name = "goose-agent" version = "0.1.0-alpha.6" -source = "git+https://github.com/aaif-goose/goose?rev=0a9749b1cbf38d182080a53286c4942629f66565#0a9749b1cbf38d182080a53286c4942629f66565" +source = "git+https://github.com/aaif-goose/goose?rev=5a9a13b72aaf8f9aa17ce064bd4d4d761d656982#5a9a13b72aaf8f9aa17ce064bd4d4d761d656982" dependencies = [ "anyhow", "async-trait", "futures", "goose-provider-types", + "goose-sdk-types", + "ignore", + "indexmap 2.14.1", + "libc", + "minijinja", + "once_cell", + "regex", "rmcp 3.2.0", + "serde", "serde_json", + "serde_yaml", + "shell-words", "tokio", "tokio-util", "tracing", "tracing-futures", + "unicode-normalization", "uuid", ] [[package]] name = "goose-context-management" version = "0.1.0-alpha.6" -source = "git+https://github.com/aaif-goose/goose?rev=0a9749b1cbf38d182080a53286c4942629f66565#0a9749b1cbf38d182080a53286c4942629f66565" +source = "git+https://github.com/aaif-goose/goose?rev=5a9a13b72aaf8f9aa17ce064bd4d4d761d656982#5a9a13b72aaf8f9aa17ce064bd4d4d761d656982" dependencies = [ "anyhow", "async-trait", @@ -4050,23 +3530,10 @@ dependencies = [ "tracing", ] -[[package]] -name = "goose-download-manager" -version = "0.1.0-alpha.6" -source = "git+https://github.com/aaif-goose/goose?rev=0a9749b1cbf38d182080a53286c4942629f66565#0a9749b1cbf38d182080a53286c4942629f66565" -dependencies = [ - "anyhow", - "once_cell", - "reqwest 0.13.4", - "serde", - "tokio", - "tracing", -] - [[package]] name = "goose-provider-types" version = "0.1.0-alpha.6" -source = "git+https://github.com/aaif-goose/goose?rev=0a9749b1cbf38d182080a53286c4942629f66565#0a9749b1cbf38d182080a53286c4942629f66565" +source = "git+https://github.com/aaif-goose/goose?rev=5a9a13b72aaf8f9aa17ce064bd4d4d761d656982#5a9a13b72aaf8f9aa17ce064bd4d4d761d656982" dependencies = [ "anyhow", "async-stream", @@ -4081,7 +3548,7 @@ dependencies = [ "rmcp 3.2.0", "serde", "serde_json", - "strum 0.28.0", + "strum", "thiserror 2.0.20", "tokio", "tracing", @@ -4092,7 +3559,7 @@ dependencies = [ [[package]] name = "goose-providers" version = "0.1.0-alpha.6" -source = "git+https://github.com/aaif-goose/goose?rev=0a9749b1cbf38d182080a53286c4942629f66565#0a9749b1cbf38d182080a53286c4942629f66565" +source = "git+https://github.com/aaif-goose/goose?rev=5a9a13b72aaf8f9aa17ce064bd4d4d761d656982#5a9a13b72aaf8f9aa17ce064bd4d4d761d656982" dependencies = [ "anyhow", "async-stream", @@ -4116,7 +3583,7 @@ dependencies = [ [[package]] name = "goose-sdk-types" version = "0.1.0-alpha.6" -source = "git+https://github.com/aaif-goose/goose?rev=0a9749b1cbf38d182080a53286c4942629f66565#0a9749b1cbf38d182080a53286c4942629f66565" +source = "git+https://github.com/aaif-goose/goose?rev=5a9a13b72aaf8f9aa17ce064bd4d4d761d656982#5a9a13b72aaf8f9aa17ce064bd4d4d761d656982" dependencies = [ "agent-client-protocol", "agent-client-protocol-schema", @@ -4136,7 +3603,7 @@ dependencies = [ "fnv", "futures-core", "futures-sink", - "http 1.5.0", + "http", "indexmap 2.14.1", "slab", "tokio", @@ -4272,7 +3739,7 @@ dependencies = [ "anyhow", "async-trait", "bytes", - "http 1.5.0", + "http", "more-asserts", "serde", "serde_json", @@ -4303,7 +3770,7 @@ dependencies = [ "futures-util", "h2", "hickory-proto", - "http 1.5.0", + "http", "idna", "ipnet", "jni 0.22.4", @@ -4410,17 +3877,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "http" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - [[package]] name = "http" version = "1.5.0" @@ -4431,17 +3887,6 @@ dependencies = [ "itoa", ] -[[package]] -name = "http-body" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" -dependencies = [ - "bytes", - "http 0.2.12", - "pin-project-lite", -] - [[package]] name = "http-body" version = "1.1.0" @@ -4449,7 +3894,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" dependencies = [ "bytes", - "http 1.5.0", + "http", ] [[package]] @@ -4460,8 +3905,8 @@ checksum = "23169fe34a5fbcdd3f3862e78fb9b6fccd5f02a6dc6f732547005d45631ce71c" dependencies = [ "bytes", "futures-core", - "http 1.5.0", - "http-body 1.1.0", + "http", + "http-body", "pin-project-lite", ] @@ -4509,8 +3954,8 @@ dependencies = [ "futures-channel", "futures-core", "h2", - "http 1.5.0", - "http-body 1.1.0", + "http", + "http-body", "httparse", "httpdate", "itoa", @@ -4526,7 +3971,7 @@ version = "0.27.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" dependencies = [ - "http 1.5.0", + "http", "hyper", "hyper-util", "log", @@ -4577,8 +4022,8 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.5.0", - "http-body 1.1.0", + "http", + "http-body", "hyper", "ipnet", "libc", @@ -4616,57 +4061,18 @@ dependencies = [ "cc", ] -[[package]] -name = "icu_calendar" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6f0e52e009b6b16ba9c0693578796f2dd4aaa59a7f8f920423706714a89ac4e" -dependencies = [ - "calendrical_calculations", - "displaydoc", - "icu_locale_core", - "icu_provider 2.3.1", - "tinystr 0.8.4", - "zerovec 0.11.8", -] - [[package]] name = "icu_collections" -version = "1.5.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" -dependencies = [ - "displaydoc", - "yoke 0.7.5", - "zerofrom", - "zerovec 0.10.4", -] - -[[package]] -name = "icu_collections" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +checksum = "fa68d21081c4a05d5a901a1c62add574c77048b6a1c67be3b50ce0b60d4ca513" dependencies = [ "displaydoc", "potential_utf", - "yoke 0.8.3", + "utf8_iter", + "yoke", "zerofrom", - "zerovec 0.11.8", -] - -[[package]] -name = "icu_locale" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "532b11722e350ab6bf916ba6eb0efe3ee54b932666afec989465f9243fe6dd60" -dependencies = [ - "icu_collections 2.1.1", - "icu_locale_core", - "icu_provider 2.3.1", - "potential_utf", - "tinystr 0.8.4", - "zerovec 0.11.8", + "zerovec", ] [[package]] @@ -4676,107 +4082,52 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d56e28588da92eee5c3201a6eff33fabdd49b62269c8938d4ff050ce4d900deb" dependencies = [ "displaydoc", - "litemap 0.8.3", - "serde", - "tinystr 0.8.4", - "writeable 0.6.4", - "zerovec 0.11.8", + "litemap", + "tinystr", + "writeable", + "zerovec", ] -[[package]] -name = "icu_locid" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" -dependencies = [ - "displaydoc", - "litemap 0.7.5", - "tinystr 0.7.6", - "writeable 0.5.5", - "zerovec 0.10.4", -] - -[[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 1.5.0", - "tinystr 0.7.6", - "zerovec 0.10.4", -] - -[[package]] -name = "icu_locid_transform_data" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" - [[package]] name = "icu_normalizer" -version = "1.5.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +checksum = "12f9cf5f235641ed274641dd81c3f28d870e276763d0797aeeab72317b1c646f" dependencies = [ - "displaydoc", - "icu_collections 1.5.0", + "icu_collections", "icu_normalizer_data", "icu_properties", - "icu_provider 1.5.0", + "icu_provider", "smallvec", - "utf16_iter", - "utf8_iter", - "write16", - "zerovec 0.10.4", + "zerovec", ] [[package]] name = "icu_normalizer_data" -version = "1.5.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" +checksum = "1563da1ed3e0b3bf3d74c9b85917ac9c56464d2f57242270c09c9e752f8021a0" [[package]] name = "icu_properties" -version = "1.5.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +checksum = "7e7ca276ad3145661a65914e6daf131ca5120cd3dcee8f8f3214b8875184a148" dependencies = [ "displaydoc", - "icu_collections 1.5.0", - "icu_locid_transform", + "icu_collections", + "icu_locale_core", "icu_properties_data", - "icu_provider 1.5.0", - "tinystr 0.7.6", - "zerovec 0.10.4", + "icu_provider", + "zerotrie", + "zerovec", ] [[package]] name = "icu_properties_data" -version = "1.5.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" - -[[package]] -name = "icu_provider" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_provider_macros", - "stable_deref_trait", - "tinystr 0.7.6", - "writeable 0.5.5", - "yoke 0.7.5", - "zerofrom", - "zerovec 0.10.4", -] +checksum = "e590f038c1464a96894fd6d10127e90a8be4509f56ff7ecef851b15cee0b7caa" [[package]] name = "icu_provider" @@ -4786,24 +4137,11 @@ checksum = "d27bbb9d3abbefac45d55f647c9de1d44aafcd1186eb91879afef17c396c3e73" dependencies = [ "displaydoc", "icu_locale_core", - "serde", - "stable_deref_trait", - "writeable 0.6.4", - "yoke 0.8.3", + "writeable", + "yoke", "zerofrom", "zerotrie", - "zerovec 0.11.8", -] - -[[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.119", + "zerovec", ] [[package]] @@ -4831,9 +4169,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.0" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" dependencies = [ "icu_normalizer", "icu_properties", @@ -4858,7 +4196,7 @@ dependencies = [ "attohttpc", "bytes", "futures", - "http 1.5.0", + "http", "http-body-util", "hyper", "hyper-util", @@ -4885,21 +4223,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "image" -version = "0.24.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" -dependencies = [ - "bytemuck", - "byteorder", - "color_quant", - "gif 0.13.3", - "jpeg-decoder", - "num-traits", - "png 0.17.16", -] - [[package]] name = "image" version = "0.25.10" @@ -4909,11 +4232,11 @@ dependencies = [ "bytemuck", "byteorder-lite", "color_quant", - "gif 0.14.2", + "gif", "image-webp", "moxcms", "num-traits", - "png 0.18.1", + "png", "zune-core", "zune-jpeg", ] @@ -5068,7 +4391,7 @@ dependencies = [ "futures-util", "getrandom 0.4.3", "hickory-resolver", - "http 1.5.0", + "http", "ipnet", "iroh-base", "iroh-dns", @@ -5092,7 +4415,7 @@ dependencies = [ "rustls-pki-types", "serde", "smallvec", - "strum 0.28.0", + "strum", "time", "tokio", "tokio-stream", @@ -5139,7 +4462,7 @@ dependencies = [ "rand 0.10.2", "rustls", "simple-dns", - "strum 0.28.0", + "strum", "tokio", "tracing", "url", @@ -5185,7 +4508,7 @@ dependencies = [ "derive_more", "getrandom 0.4.3", "hickory-resolver", - "http 1.5.0", + "http", "http-body-util", "hyper", "hyper-util", @@ -5206,7 +4529,7 @@ dependencies = [ "rustls-pki-types", "serde", "serde_bytes", - "strum 0.28.0", + "strum", "tokio", "tokio-rustls", "tokio-util", @@ -5375,12 +4698,6 @@ dependencies = [ "libc", ] -[[package]] -name = "jpeg-decoder" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00810f1d8b74be64b13dbf3db89ac67740615d6c891f0e7b6179326533011a07" - [[package]] name = "js-sys" version = "0.3.104" @@ -5415,58 +4732,6 @@ dependencies = [ "thiserror 2.0.20", ] -[[package]] -name = "jsonschema" -version = "0.49.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ec8a241beed129f06114aa68007e905ca350e7baeb6e17a7631bb7978d91b2" -dependencies = [ - "ahash", - "bytecount", - "data-encoding", - "email_address", - "fancy-regex 0.19.0", - "fraction", - "getrandom 0.3.4", - "idna", - "itoa", - "jsonschema-regex", - "jsonschema-value", - "num-cmp", - "num-traits", - "percent-encoding", - "referencing", - "regex", - "serde", - "serde_json", - "strum 0.28.0", - "unicode-general-category", - "uuid-simd", -] - -[[package]] -name = "jsonschema-regex" -version = "0.49.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91994f45017ed5e66aa8e59b8415f4cb033a6380d7200387b7cf117595fbdf85" -dependencies = [ - "regex-syntax", -] - -[[package]] -name = "jsonschema-value" -version = "0.49.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ec7637f83e510868ae6ed625f7ebfbbde4554ee8ce49854caa5126a8b9b9ecb" -dependencies = [ - "ahash", - "bytecount", - "fraction", - "num-cmp", - "num-traits", - "serde_json", -] - [[package]] name = "jsonwebtoken" version = "10.4.0" @@ -5477,25 +4742,7 @@ dependencies = [ "base64 0.22.1", "getrandom 0.2.17", "js-sys", - "pem 3.0.6", - "serde", - "serde_json", - "signature 2.2.0", - "simple_asn1", - "zeroize", -] - -[[package]] -name = "jsonwebtoken" -version = "11.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "881733cbc631fc9e472e24447ce32a64bedf2da498d6d8570b08edc87de71f65" -dependencies = [ - "aws-lc-rs", - "base64 0.22.1", - "getrandom 0.2.17", - "js-sys", - "pem 3.0.6", + "pem", "serde", "serde_json", "signature 2.2.0", @@ -5583,8 +4830,8 @@ dependencies = [ "either", "futures", "home", - "http 1.5.0", - "http-body 1.1.0", + "http", + "http-body", "http-body-util", "hyper", "hyper-rustls", @@ -5593,7 +4840,7 @@ dependencies = [ "jsonpath-rust", "k8s-openapi", "kube-core", - "pem 3.0.6", + "pem", "rustls", "secrecy", "serde", @@ -5603,7 +4850,7 @@ dependencies = [ "tokio", "tokio-util", "tower", - "tower-http 0.6.11", + "tower-http", "tracing", ] @@ -5616,7 +4863,7 @@ dependencies = [ "chrono", "derive_more", "form_urlencoded", - "http 1.5.0", + "http", "k8s-openapi", "serde", "serde-value", @@ -5694,7 +4941,6 @@ version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1f111c8c41e7c61a49cd34e44c7619462967221a6443b0ec299e0ac30cfb9b1" dependencies = [ - "cc", "pkg-config", "vcpkg", ] @@ -5732,12 +4978,6 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" -[[package]] -name = "litemap" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" - [[package]] name = "litemap" version = "0.8.3" @@ -6155,7 +5395,7 @@ dependencies = [ "flate2", "futures-util", "hex", - "http 1.5.0", + "http", "http-body-util", "httparse", "iroh", @@ -6517,12 +5757,6 @@ dependencies = [ "sketches-ddsketch", ] -[[package]] -name = "micromap" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a86d3146ed3995b5913c414f6664344b9617457320782e64f0bb44afd49d74" - [[package]] name = "miette" version = "7.6.0" @@ -6821,15 +6055,6 @@ dependencies = [ "n0-future", ] -[[package]] -name = "nanoid" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8628de41fe064cc3f0cf07f3d299ee3e73521adaff72278731d5c8cae3797873" -dependencies = [ - "rand 0.9.5", -] - [[package]] name = "native-tls" version = "0.2.18" @@ -7293,12 +6518,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "num-cmp" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63335b2e2c34fae2fb0aa2cecfd9f0832a1e24b3b32ecec612c3426d46dc8aaa" - [[package]] name = "num-complex" version = "0.4.6" @@ -7405,9 +6624,8 @@ dependencies = [ "base64 0.22.1", "chrono", "getrandom 0.2.17", - "http 1.5.0", + "http", "rand 0.8.8", - "reqwest 0.12.28", "serde", "serde_json", "serde_path_to_error", @@ -7433,7 +6651,6 @@ checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" dependencies = [ "bitflags 2.13.1", "objc2", - "objc2-core-graphics", "objc2-foundation", ] @@ -7450,19 +6667,6 @@ dependencies = [ "objc2", ] -[[package]] -name = "objc2-core-graphics" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" -dependencies = [ - "bitflags 2.13.1", - "dispatch2", - "objc2", - "objc2-core-foundation", - "objc2-io-surface", -] - [[package]] name = "objc2-core-wlan" version = "0.3.2" @@ -7506,17 +6710,6 @@ dependencies = [ "objc2-core-foundation", ] -[[package]] -name = "objc2-io-surface" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" -dependencies = [ - "bitflags 2.13.1", - "objc2", - "objc2-core-foundation", -] - [[package]] name = "objc2-security" version = "0.3.2" @@ -7552,15 +6745,6 @@ dependencies = [ "objc2-security", ] -[[package]] -name = "oid-registry" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12f40cff3dde1b6087cc5d5f5d4d65712f34016a03ed60e9c08dcc392736b5b7" -dependencies = [ - "asn1-rs", -] - [[package]] name = "once_cell" version = "1.21.4" @@ -7701,7 +6885,7 @@ checksum = "d7a6d09a73194e6b66df7c8f1b680f156d916a1a942abf2de06823dd02b7855d" dependencies = [ "async-trait", "bytes", - "http 1.5.0", + "http", "opentelemetry 0.31.0", "reqwest 0.12.28", ] @@ -7712,7 +6896,7 @@ version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f69cd6acbb9af919df949cd1ec9e5e7fdc2ef15d234b6b795aaa525cc02f71f" dependencies = [ - "http 1.5.0", + "http", "opentelemetry 0.31.0", "opentelemetry-http", "opentelemetry-proto 0.31.0", @@ -7728,7 +6912,7 @@ version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9966929966d17620d7c316c643ba62631826e10021409357772d5eea84f62c35" dependencies = [ - "http 1.5.0", + "http", "opentelemetry 0.32.0", "opentelemetry-proto 0.32.0", "opentelemetry_sdk 0.32.1", @@ -7882,12 +7066,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "outref" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e" - [[package]] name = "palette" version = "0.7.7" @@ -8009,16 +7187,6 @@ dependencies = [ "serde_core", ] -[[package]] -name = "pem" -version = "4.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d354a98a3d1251555de99e8fdd8afda05573c31b82f59063a7b0a29b5527f120" -dependencies = [ - "base64 0.23.1", - "serde_core", -] - [[package]] name = "pem-rfc7468" version = "1.0.0" @@ -8114,16 +7282,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" dependencies = [ "phf_macros", - "phf_shared 0.11.3", -] - -[[package]] -name = "phf" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "913273894cec178f401a31ec4b656318d95473527be05c0752cc41cdc32be8b7" -dependencies = [ - "phf_shared 0.12.1", + "phf_shared", ] [[package]] @@ -8133,7 +7292,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" dependencies = [ "phf_generator", - "phf_shared 0.11.3", + "phf_shared", ] [[package]] @@ -8142,7 +7301,7 @@ version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" dependencies = [ - "phf_shared 0.11.3", + "phf_shared", "rand 0.8.8", ] @@ -8153,7 +7312,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" dependencies = [ "phf_generator", - "phf_shared 0.11.3", + "phf_shared", "proc-macro2", "quote", "syn 2.0.119", @@ -8168,15 +7327,6 @@ dependencies = [ "siphasher", ] -[[package]] -name = "phf_shared" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06005508882fb681fd97892ecff4b7fd0fee13ef1aa569f8695dae7ab9099981" -dependencies = [ - "siphasher", -] - [[package]] name = "pin-project" version = "1.1.13" @@ -8203,12 +7353,6 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - [[package]] name = "piper" version = "0.2.5" @@ -8249,19 +7393,6 @@ dependencies = [ "time", ] -[[package]] -name = "png" -version = "0.17.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" -dependencies = [ - "bitflags 1.3.2", - "crc32fast", - "fdeflate", - "flate2", - "miniz_oxide 0.8.9", -] - [[package]] name = "png" version = "0.18.1" @@ -8389,9 +7520,7 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d83eb9bc6d8e5cf568e7a1101d60ee05e81ed50ea106026f3d18deeb046d7661" dependencies = [ - "serde_core", - "writeable 0.6.4", - "zerovec 0.11.8", + "zerovec", ] [[package]] @@ -8698,22 +7827,6 @@ dependencies = [ "thiserror 1.0.69", ] -[[package]] -name = "psl-types" -version = "2.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33cb294fe86a74cbcf50d4445b37da762029549ebeea341421c7c70370f86cac" - -[[package]] -name = "publicsuffix" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42ea446cab60335f76979ec15e12619a2165b5ae2c12166bef27d283a9fadf" -dependencies = [ - "idna", - "psl-types", -] - [[package]] name = "pulldown-cmark" version = "0.13.4" @@ -9015,7 +8128,7 @@ dependencies = [ "lru", "palette", "serde", - "strum 0.28.0", + "strum", "thiserror 2.0.20", "unicode-segmentation", "unicode-truncate", @@ -9079,7 +8192,7 @@ dependencies = [ "line-clipping", "ratatui-core", "serde", - "strum 0.28.0", + "strum", "time", "unicode-segmentation", "unicode-width 0.2.2", @@ -9131,20 +8244,6 @@ dependencies = [ "crossbeam-utils", ] -[[package]] -name = "rcgen" -version = "0.14.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8774e05a7d0de114588e6a28fe7e71694b82614ed569d86d8b389dfbc98b8ad8" -dependencies = [ - "aws-lc-rs", - "pem 4.0.0", - "rustls-pki-types", - "time", - "x509-parser", - "yasna", -] - [[package]] name = "redb" version = "3.1.3" @@ -9225,23 +8324,6 @@ dependencies = [ "syn 3.0.4", ] -[[package]] -name = "referencing" -version = "0.49.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6efa2154ea6f5ce0fdecdd2a8d18f2fa1a39a8fbba91564f555a592e4dce8278" -dependencies = [ - "ahash", - "fluent-uri", - "getrandom 0.3.4", - "hashbrown 0.17.1", - "itoa", - "micromap", - "parking_lot", - "percent-encoding", - "serde_json", -] - [[package]] name = "regex" version = "1.13.1" @@ -9290,8 +8372,8 @@ dependencies = [ "futures-core", "futures-util", "h2", - "http 1.5.0", - "http-body 1.1.0", + "http", + "http-body", "http-body-util", "hyper", "hyper-rustls", @@ -9315,7 +8397,7 @@ dependencies = [ "tokio-rustls", "tokio-util", "tower", - "tower-http 0.6.11", + "tower-http", "tower-service", "url", "wasm-bindgen", @@ -9333,15 +8415,12 @@ checksum = "219c5811de6525e5416c7d5d53bb656d3afdbc6c5af816e0802bcfa42dbdc1c3" dependencies = [ "base64 0.22.1", "bytes", - "cookie", - "cookie_store", "encoding_rs", - "futures-channel", "futures-core", "futures-util", "h2", - "http 1.5.0", - "http-body 1.1.0", + "http", + "http-body", "http-body-util", "hyper", "hyper-rustls", @@ -9364,7 +8443,7 @@ dependencies = [ "tokio-rustls", "tokio-util", "tower", - "tower-http 0.6.11", + "tower-http", "tower-service", "url", "wasm-bindgen", @@ -9381,7 +8460,7 @@ checksum = "07bc3f1384cffa4f274dad2d4ddd73aed32fed8f786d96c6be8aa4e5fd3c3b58" dependencies = [ "anyhow", "async-trait", - "http 1.5.0", + "http", "reqwest 0.13.4", "thiserror 2.0.20", "tower-service", @@ -9418,8 +8497,8 @@ dependencies = [ "bytes", "chrono", "futures", - "http 1.5.0", - "http-body 1.1.0", + "http", + "http-body", "http-body-util", "pastey", "pin-project-lite", @@ -9447,14 +8526,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42b6914fac0be956fe704a38239c3f44a9f841d1b06a5713d2f638065593f5b5" dependencies = [ "async-trait", - "base64 0.23.1", - "bytes", "chrono", "futures", - "http 1.5.0", - "http-body-util", - "hyper", - "hyper-util", "indexmap 2.14.1", "oauth2", "pastey", @@ -9465,7 +8538,6 @@ dependencies = [ "schemars 1.2.2", "serde", "serde_json", - "sse-stream", "thiserror 2.0.20", "tokio", "tokio-stream", @@ -9536,7 +8608,7 @@ dependencies = [ "futures-util", "hex", "hmac 0.12.1", - "http 1.5.0", + "http", "log", "maybe-async", "md5", @@ -9571,15 +8643,6 @@ dependencies = [ "semver", ] -[[package]] -name = "rusticata-macros" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" -dependencies = [ - "nom", -] - [[package]] name = "rustix" version = "0.38.44" @@ -10476,19 +9539,6 @@ dependencies = [ "serde", ] -[[package]] -name = "smithy-transport-reqwest" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "566dc85be03a09c384f77a122188d9af000e1f1bd23551b346a9b555838da7e1" -dependencies = [ - "aws-smithy-runtime-api", - "aws-smithy-types", - "http 1.5.0", - "parking_lot", - "reqwest 0.13.4", -] - [[package]] name = "socket-pktinfo" version = "0.3.2" @@ -10762,7 +9812,7 @@ checksum = "c123f296ade4ec4b8b0f6162116e6629f5146922ca5ab40ca9d3c2e73ab4761e" dependencies = [ "bytes", "futures-util", - "http-body 1.1.0", + "http-body", "http-body-util", "pin-project-lite", ] @@ -10789,12 +9839,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "streaming-iterator" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b2231b7c3057d5e4ad0156fb3dc807d900806020c5ffa3ee6ff2c8c76fb8520" - [[package]] name = "stringprep" version = "0.1.5" @@ -10812,34 +9856,13 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" -[[package]] -name = "strum" -version = "0.27.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" -dependencies = [ - "strum_macros 0.27.2", -] - [[package]] name = "strum" version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9628de9b8791db39ceda2b119bbe13134770b56c138ec1d3af810d045c04f9bd" dependencies = [ - "strum_macros 0.28.0", -] - -[[package]] -name = "strum_macros" -version = "0.27.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.119", + "strum_macros", ] [[package]] @@ -11077,16 +10100,6 @@ dependencies = [ "syn 2.0.119", ] -[[package]] -name = "sys-info" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b3a0d0aba8bf96a0e1ddfdc352fc53b3df7f39318c71854910c3c4b024ae52c" -dependencies = [ - "cc", - "libc", -] - [[package]] name = "sysinfo" version = "0.37.2" @@ -11196,7 +10209,7 @@ checksum = "d4ea810f0692f9f51b382fff5893887bb4580f5fa246fde546e0b13e7fcee662" dependencies = [ "fnv", "nom", - "phf 0.11.3", + "phf", "phf_codegen", ] @@ -11233,7 +10246,7 @@ dependencies = [ "ordered-float 4.6.0", "pest", "pest_derive", - "phf 0.11.3", + "phf", "sha2 0.10.9", "signal-hook", "siphasher", @@ -11300,21 +10313,6 @@ dependencies = [ "cfg-if 1.0.4", ] -[[package]] -name = "tiktoken-rs" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "027853bbf8c7763b77c5c595f1c271c7d536ced7d6f83452911b944621e57fc2" -dependencies = [ - "anyhow", - "base64 0.22.1", - "bstr", - "fancy-regex 0.17.0", - "lazy_static", - "regex", - "rustc-hash", -] - [[package]] name = "time" version = "0.3.55" @@ -11357,16 +10355,6 @@ dependencies = [ "crunchy", ] -[[package]] -name = "tinystr" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" -dependencies = [ - "displaydoc", - "zerovec 0.10.4", -] - [[package]] name = "tinystr" version = "0.8.4" @@ -11374,8 +10362,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1e27c91459209c2986af3dcf603a5a74a4368754ce37414f59acc971167f643" dependencies = [ "displaydoc", - "serde_core", - "zerovec 0.11.8", + "zerovec", ] [[package]] @@ -11443,22 +10430,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "tokio-cron-scheduler" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f50e41f200fd8ed426489bd356910ede4f053e30cebfbd59ef0f856f0d7432a" -dependencies = [ - "chrono", - "chrono-tz", - "croner", - "num-derive", - "num-traits", - "tokio", - "tracing", - "uuid", -] - [[package]] name = "tokio-happy-eyeballs" version = "0.1.0" @@ -11594,7 +10565,7 @@ dependencies = [ "futures-core", "futures-sink", "getrandom 0.4.3", - "http 1.5.0", + "http", "httparse", "rand 0.10.2", "ring", @@ -11717,8 +10688,8 @@ dependencies = [ "base64 0.22.1", "bytes", "h2", - "http 1.5.0", - "http-body 1.1.0", + "http", + "http-body", "http-body-util", "hyper", "hyper-timeout", @@ -11789,8 +10760,8 @@ dependencies = [ "bytes", "futures-core", "futures-util", - "http 1.5.0", - "http-body 1.1.0", + "http", + "http-body", "http-body-util", "http-range-header", "httpdate", @@ -11807,21 +10778,6 @@ dependencies = [ "url", ] -[[package]] -name = "tower-http" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08a05a66a4fdd61cbbe0a1d755ffe0ca6aba159dd4820936a0ff8a8278245b9c" -dependencies = [ - "bitflags 2.13.1", - "bytes", - "http 1.5.0", - "percent-encoding", - "pin-project-lite", - "tower-layer", - "tower-service", -] - [[package]] name = "tower-layer" version = "0.3.3" @@ -11944,123 +10900,12 @@ dependencies = [ "sharded-slab", "smallvec", "thread_local", - "time", "tracing", "tracing-core", "tracing-log", "tracing-serde", ] -[[package]] -name = "tree-sitter" -version = "0.26.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17ebdd3a5a7e28a1890b876fdbd0c3c0fe0a6336cffaa104f11b9f720c9daa29" -dependencies = [ - "cc", - "regex", - "regex-syntax", - "serde_json", - "streaming-iterator", - "tree-sitter-language", -] - -[[package]] -name = "tree-sitter-go" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8560a4d2f835cc0d4d2c2e03cbd0dde2f6114b43bc491164238d333e28b16ea" -dependencies = [ - "cc", - "tree-sitter-language", -] - -[[package]] -name = "tree-sitter-java" -version = "0.23.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0aa6cbcdc8c679b214e616fd3300da67da0e492e066df01bcf5a5921a71e90d6" -dependencies = [ - "cc", - "tree-sitter-language", -] - -[[package]] -name = "tree-sitter-javascript" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68204f2abc0627a90bdf06e605f5c470aa26fdcb2081ea553a04bdad756693f5" -dependencies = [ - "cc", - "tree-sitter-language", -] - -[[package]] -name = "tree-sitter-kotlin-ng" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e800ebbda938acfbf224f4d2c34947a31994b1295ee6e819b65226c7b51b4450" -dependencies = [ - "cc", - "tree-sitter-language", -] - -[[package]] -name = "tree-sitter-language" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca0d1bf6fdd806e43ae5198f82f527056d359def39e54e67a0f478ac09dac081" - -[[package]] -name = "tree-sitter-python" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bf85fd39652e740bf60f46f4cda9492c3a9ad75880575bf14960f775cb74a1c" -dependencies = [ - "cc", - "tree-sitter-language", -] - -[[package]] -name = "tree-sitter-ruby" -version = "0.23.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be0484ea4ef6bb9c575b4fdabde7e31340a8d2dbc7d52b321ac83da703249f95" -dependencies = [ - "cc", - "tree-sitter-language", -] - -[[package]] -name = "tree-sitter-rust" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439e577dbe07423ec2582ac62c7531120dbfccfa6e5f92406f93dd271a120e45" -dependencies = [ - "cc", - "tree-sitter-language", -] - -[[package]] -name = "tree-sitter-swift" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe36052155b9dd69ca82b3b8f1b4ccfb2d867125ac1a4db1dd7331829242668c" -dependencies = [ - "cc", - "tree-sitter-language", -] - -[[package]] -name = "tree-sitter-typescript" -version = "0.23.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c5f76ed8d947a75cc446d5fccd8b602ebf0cde64ccf2ffa434d873d7a575eff" -dependencies = [ - "cc", - "tree-sitter-language", -] - [[package]] name = "try-lock" version = "0.2.5" @@ -12075,7 +10920,7 @@ checksum = "8628dcc84e5a09eb3d8423d6cb682965dea9133204e8fb3efee74c2a0c259442" dependencies = [ "bytes", "data-encoding", - "http 1.5.0", + "http", "httparse", "log", "rand 0.9.5", @@ -12094,7 +10939,7 @@ checksum = "6c01152af293afb9c7c2a57e4b559c5620b421f6d133261c60dd2d0cdb38e6b8" dependencies = [ "bytes", "data-encoding", - "http 1.5.0", + "http", "httparse", "log", "rand 0.9.5", @@ -12167,12 +11012,6 @@ version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" -[[package]] -name = "unicode-general-category" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b993bddc193ae5bd0d623b49ec06ac3e9312875fdae725a975c51db1cc1677f" - [[package]] name = "unicode-ident" version = "1.0.24" @@ -12319,12 +11158,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_iter" version = "1.0.4" @@ -12350,31 +11183,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "uuid-simd" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b082222b4f6619906941c17eb2297fff4c2fb96cb60164170522942a200bd8" -dependencies = [ - "outref", - "vsimd", -] - -[[package]] -name = "v_escape-base" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1212fce830b75af194b578e55b3db9049f2c8c45f58d397fb25602fdb50fb3d" - -[[package]] -name = "v_htmlescape" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "befb3d53c9e3ec641417685896cbc8cc5bd264d6a2e190c56aaef1af24740d99" -dependencies = [ - "v_escape-base", -] - [[package]] name = "valuable" version = "0.1.1" @@ -12393,12 +11201,6 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" -[[package]] -name = "vsimd" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" - [[package]] name = "vtparse" version = "0.6.2" @@ -12691,15 +11493,6 @@ dependencies = [ "wezterm-dynamic", ] -[[package]] -name = "which" -version = "8.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bae2f2b2b816647a1cab1acc91f5bd20812d53cb344382635ec2181940c8034f" -dependencies = [ - "libc", -] - [[package]] name = "whoami" version = "2.1.3" @@ -13230,18 +12023,6 @@ dependencies = [ "windows-core 0.62.2", ] -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" - [[package]] name = "writeable" version = "0.6.4" @@ -13267,41 +12048,6 @@ dependencies = [ "web-sys", ] -[[package]] -name = "x11rb" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414" -dependencies = [ - "gethostname", - "rustix 1.1.4", - "x11rb-protocol", -] - -[[package]] -name = "x11rb-protocol" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd" - -[[package]] -name = "x509-parser" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d43b0f71ce057da06bc0851b23ee24f3f86190b07203dd8f567d0b706a185202" -dependencies = [ - "asn1-rs", - "aws-lc-rs", - "data-encoding", - "der-parser", - "lazy_static", - "nom", - "oid-registry", - "rusticata-macros", - "thiserror 2.0.20", - "time", -] - [[package]] name = "xattr" version = "1.6.1" @@ -13334,7 +12080,7 @@ dependencies = [ "bytes", "crc32fast", "futures", - "http 1.5.0", + "http", "hyper", "more-asserts", "rand 0.10.2", @@ -13402,7 +12148,7 @@ dependencies = [ "bytes", "chrono", "gearhash", - "http 1.5.0", + "http", "itertools", "more-asserts", "rand 0.10.2", @@ -13493,28 +12239,6 @@ dependencies = [ "lzma-sys", ] -[[package]] -name = "yasna" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5f6765e852b9b4dc8e2a76843e4d64d1cea8e79bcde0b6901aea8e7c7f08282" -dependencies = [ - "bit-vec 0.9.1", - "time", -] - -[[package]] -name = "yoke" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" -dependencies = [ - "serde", - "stable_deref_trait", - "yoke-derive 0.7.5", - "zerofrom", -] - [[package]] name = "yoke" version = "0.8.3" @@ -13522,22 +12246,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" dependencies = [ "stable_deref_trait", - "yoke-derive 0.8.2", + "yoke-derive", "zerofrom", ] -[[package]] -name = "yoke-derive" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", - "synstructure", -] - [[package]] name = "yoke-derive" version = "0.8.2" @@ -13674,18 +12386,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ea269c3bd32f0a32c321907a2ae912ba6f4649bb0fc764a15627e99a7095a3f" dependencies = [ "displaydoc", - "zerovec 0.11.8", -] - -[[package]] -name = "zerovec" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" -dependencies = [ - "yoke 0.7.5", + "yoke", "zerofrom", - "zerovec-derive 0.10.4", ] [[package]] @@ -13694,21 +12396,9 @@ version = "0.11.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb0464e17806c1d976d5cba29399c7f08e516e279e2ba493f63123b5fca67dd8" dependencies = [ - "serde", - "yoke 0.8.3", + "yoke", "zerofrom", - "zerovec-derive 0.11.6", -] - -[[package]] -name = "zerovec-derive" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e3c6377872d72510393f688a555d7097b0f741995c7a00f0407f786dd486b2d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", + "zerovec-derive", ] [[package]] diff --git a/crates/buzz-agent/Cargo.toml b/crates/buzz-agent/Cargo.toml index 37fbfadf8b..ac6ff9137b 100644 --- a/crates/buzz-agent/Cargo.toml +++ b/crates/buzz-agent/Cargo.toml @@ -44,25 +44,15 @@ path = "tests/bin/auth_worker.rs" [dependencies] # For the `buzz-agent auth ` subcommand only. Provider auth for the -# agent loop itself is goose's; this is the interactive PKCE login that seeds -# the token cache that goose (and the desktop model picker) then read. +# agent loop itself is GDK-based; this is the interactive PKCE login that seeds +# the token cache used by inference and the desktop model picker. buzz-model-catalog = { path = "../buzz-model-catalog" } -goose = { git = "https://github.com/aaif-goose/goose", rev = "0a9749b1cbf38d182080a53286c4942629f66565", default-features = false, features = ["rustls-tls"] } -# Consume the GDK loop primitives from their owning crate. Keep this on the -# exact same Goose revision as `goose` so shared conversation types stay unified. -goose-agent = { git = "https://github.com/aaif-goose/goose", rev = "0a9749b1cbf38d182080a53286c4942629f66565" } -goose-provider-types = { git = "https://github.com/aaif-goose/goose", rev = "0a9749b1cbf38d182080a53286c4942629f66565" } -goose-context-management = { git = "https://github.com/aaif-goose/goose", rev = "0a9749b1cbf38d182080a53286c4942629f66565" } -goose-sdk-types = { git = "https://github.com/aaif-goose/goose", rev = "0a9749b1cbf38d182080a53286c4942629f66565" } -# ModelConfig: goose re-exports it from goose-providers; goose::model_config -# keeps its own copy private. -goose-providers = { git = "https://github.com/aaif-goose/goose", rev = "0a9749b1cbf38d182080a53286c4942629f66565" } -# Resolution guard: goose pins icu_locale "=2.1.1" (needs icu_collections -# ~2.1.1) while url 2.5.x -> idna -> idna_adapter 1.2.2 pulls icu_normalizer -# 2.2.0 (needs icu_collections ~2.2.0). Only one 2.x icu_collections can be -# selected. 1.2.0 is the last idna_adapter on ICU4X 1.x, which keeps IDNA off -# the icu_collections 2.x line entirely and lets both resolve. -idna_adapter = "=1.2.0" +# Keep all GDK crates on the exact same Goose revision so shared types stay unified. +goose-agent = { git = "https://github.com/aaif-goose/goose", rev = "5a9a13b72aaf8f9aa17ce064bd4d4d761d656982" } +goose-provider-types = { git = "https://github.com/aaif-goose/goose", rev = "5a9a13b72aaf8f9aa17ce064bd4d4d761d656982" } +goose-context-management = { git = "https://github.com/aaif-goose/goose", rev = "5a9a13b72aaf8f9aa17ce064bd4d4d761d656982" } +goose-sdk-types = { git = "https://github.com/aaif-goose/goose", rev = "5a9a13b72aaf8f9aa17ce064bd4d4d761d656982" } +goose-providers = { git = "https://github.com/aaif-goose/goose", rev = "5a9a13b72aaf8f9aa17ce064bd4d4d761d656982" } tokio-util = { version = "0.7", features = ["rt"] } futures = "0.3" anyhow = "1" diff --git a/crates/buzz-agent/src/config.rs b/crates/buzz-agent/src/config.rs index e3754cbc13..7cd8b28474 100644 --- a/crates/buzz-agent/src/config.rs +++ b/crates/buzz-agent/src/config.rs @@ -122,8 +122,8 @@ fn parse_approval(raw: Option<&str>) -> GooseMode { /// Translate a Buzz provider id into the name goose's registry knows. /// -/// Unknown names pass through untouched — goose owns the registry, so -/// gatekeeping here would break every provider it gains that we don't list. +/// Unknown names pass through so provider construction can return the +/// authoritative supported-provider error. fn goose_provider_name(provider: &str) -> &str { match provider { // Buzz's OpenAI-wire-compatible providers; goose calls them `openai`. @@ -656,7 +656,7 @@ mod tests { #[test] fn unknown_providers_pass_through_untouched() { - // Goose owns the registry; we must not gatekeep names we don't know. + // Keep translation separate from the finite provider factory. assert_eq!(goose_provider_name("anthropic"), "anthropic"); assert_eq!( goose_provider_name("some_future_provider"), diff --git a/crates/buzz-agent/src/lib.rs b/crates/buzz-agent/src/lib.rs index eab24b3f7e..6616d60c1e 100644 --- a/crates/buzz-agent/src/lib.rs +++ b/crates/buzz-agent/src/lib.rs @@ -26,6 +26,7 @@ pub mod hooks; pub mod loop_drive; pub mod mcp; pub mod model; +mod model_config; pub mod ops; pub mod permission; pub mod prompt; @@ -153,9 +154,8 @@ async fn build_agent( .or_else(|| std::env::var("GOOSE_MODEL").ok()) .ok_or_else(|| AgentError::Llm("no model configured".into()))?; let provider = build_provider(&provider_name).await?; - let model_config = - goose::model_config::model_config_from_user_config(&provider_name, &model_name) - .map_err(|error| AgentError::LlmModelNotFound(error.to_string()))?; + let model_config = crate::model_config::from_env(&provider_name, &model_name) + .map_err(|error| AgentError::LlmModelNotFound(error.to_string()))?; let model = crate::model::SessionModel::new(provider, model_config, model_name); let prompt = crate::prompt::SessionPrompt::new(cfg.goose_mode); @@ -895,8 +895,8 @@ async fn cancel_session(app: &Arc, params: Value) { /// Swap the model for an existing session. /// -/// Rebuilds the provider (base-url/credential resolution lives in goose's -/// registry) and installs it with the new `ModelConfig`. `SharedProvider` is an +/// Rebuilds the configured Buzz provider and installs it with the new +/// `ModelConfig`. `SharedProvider` is an /// `Arc>>` precisely so this is hot-swappable /// (goose `agents/types.rs:11-12`). /// Construct the goose provider. See [`crate::provider`]. @@ -909,7 +909,7 @@ async fn build_provider( async fn apply_model(model: &crate::model::SessionModel, model_id: &str) -> Result<(), AgentError> { let provider_name = std::env::var("GOOSE_PROVIDER").unwrap_or_else(|_| "openai".to_string()); let provider = build_provider(&provider_name).await?; - let model_config = goose::model_config::model_config_from_user_config(&provider_name, model_id) + let model_config = crate::model_config::from_env(&provider_name, model_id) .map_err(|e| AgentError::LlmModelNotFound(e.to_string()))?; // Swapped on buzz's own handle. `Agent::update_provider` would do the same // thing plus a write to goose's session row; see [`crate::model`]. diff --git a/crates/buzz-agent/src/loop_drive.rs b/crates/buzz-agent/src/loop_drive.rs index 82f1add7fe..201c7248aa 100644 --- a/crates/buzz-agent/src/loop_drive.rs +++ b/crates/buzz-agent/src/loop_drive.rs @@ -518,7 +518,11 @@ async fn infer( ) -> Result, AgentError> { let (provider, model_config, _model_id) = ctx.model.snapshot().await; - let system_prompt = ctx.prompt.build(&session.working_dir).await; + let system_prompt = ctx + .prompt + .build(&session.working_dir) + .await + .map_err(|error| AgentError::Llm(format!("system prompt: {error}")))?; let tools = ctx.mcp.rmcp_tools(); let mut stream = provider diff --git a/crates/buzz-agent/src/mcp.rs b/crates/buzz-agent/src/mcp.rs index 495fd0a067..cb997efd84 100644 --- a/crates/buzz-agent/src/mcp.rs +++ b/crates/buzz-agent/src/mcp.rs @@ -35,6 +35,64 @@ pub struct ResultBudget { pub text: usize, } +fn discover_skills( + working_dir: &std::path::Path, +) -> Vec { + use goose_agent::skills::{SkillDiscoveryOptions, SkillRoot, SkillScope}; + + let mut roots = Vec::new(); + if let Some(home) = dirs::home_dir() { + for (precedence, path) in [ + home.join(".agents/skills"), + home.join(".config/goose/skills"), + home.join(".claude/skills"), + ] + .into_iter() + .enumerate() + { + roots.push(SkillRoot { + path, + scope: SkillScope::Global, + precedence: precedence as u32, + writable: false, + preserve_path: false, + }); + } + } + for (offset, path) in [ + working_dir.join(".agents/skills"), + working_dir.join(".goose/skills"), + working_dir.join(".claude/skills"), + ] + .into_iter() + .enumerate() + { + roots.push(SkillRoot { + path, + scope: SkillScope::Project, + precedence: 100 + offset as u32, + writable: false, + preserve_path: false, + }); + } + + match goose_agent::skills::discover_skills(&SkillDiscoveryOptions { + roots, + working_dir: Some(working_dir.to_path_buf()), + }) { + Ok(discovery) => { + for diagnostic in discovery.diagnostics { + tracing::warn!(path = %diagnostic.path.display(), error = diagnostic.message, "skill ignored"); + } + discovery.skills + } + Err(error) => { + tracing::warn!(%error, "skill discovery failed"); + Vec::new() + } + } +} + const PASSTHROUGH_ENV: &[&str] = &[ // Core "PATH", @@ -216,12 +274,7 @@ impl McpRegistry { hook_timeout: Duration::from_millis( env_u64("BUZZ_AGENT_HOOK_TIMEOUT_MS", 2_500).max(1), ), - skills: goose::skills::discover_skills(Some(std::path::Path::new(cwd))) - .into_iter() - .filter(|skill| { - skill.source_type != goose_sdk_types::custom_requests::SourceType::BuiltinSkill - }) - .collect(), + skills: discover_skills(std::path::Path::new(cwd)), }; let mut seen_names = HashSet::new(); diff --git a/crates/buzz-agent/src/model_config.rs b/crates/buzz-agent/src/model_config.rs new file mode 100644 index 0000000000..e7d3f63da2 --- /dev/null +++ b/crates/buzz-agent/src/model_config.rs @@ -0,0 +1,76 @@ +use anyhow::{bail, Result}; +use goose_provider_types::thinking::ThinkingEffort; +use goose_providers::model::ModelConfig; +use std::collections::HashMap; + +pub fn from_env(provider_name: &str, model_name: &str) -> Result { + let temperature = parse_optional::("GOOSE_TEMPERATURE")?; + if temperature.is_some_and(|value| value < 0.0) { + bail!("GOOSE_TEMPERATURE must be non-negative"); + } + let max_tokens = parse_optional::("GOOSE_MAX_TOKENS")?; + if max_tokens.is_some_and(|value| value <= 0) { + bail!("GOOSE_MAX_TOKENS must be greater than zero"); + } + let toolshim = optional_env("GOOSE_TOOLSHIM") + .map(|value| parse_bool("GOOSE_TOOLSHIM", &value)) + .transpose()? + .unwrap_or(false); + let toolshim_model = optional_env("GOOSE_TOOLSHIM_OLLAMA_MODEL"); + let mut model = ModelConfig::new(model_name) + .with_temperature(temperature) + .with_max_tokens(max_tokens) + .with_toolshim(toolshim) + .with_toolshim_model(toolshim_model); + if let Some(effort) = optional_env("GOOSE_THINKING_EFFORT") { + model = model.with_default_thinking_effort(Some( + effort + .parse::() + .map_err(anyhow::Error::msg)?, + )); + } + if let Some(ttl) = optional_env("GOOSE_CACHE_TTL") { + let ttl = ttl.to_ascii_lowercase(); + if !matches!(ttl.as_str(), "5m" | "1h") { + bail!("GOOSE_CACHE_TTL must be '5m' or '1h'"); + } + model = model.with_cache_ttl(&ttl); + } + if provider_name == "openai" { + if let Some(store) = optional_env("OPENAI_STORE") { + model = model.with_merged_request_params(HashMap::from([( + "store".to_string(), + serde_json::Value::Bool(parse_bool("OPENAI_STORE", &store)?), + )])); + } + } + Ok(model.with_canonical_limits(provider_name)) +} + +fn optional_env(key: &str) -> Option { + std::env::var(key) + .ok() + .map(|value| value.trim().to_string()) + .filter(|value| !value.is_empty()) +} + +fn parse_optional(key: &str) -> Result> +where + T::Err: std::fmt::Display, +{ + optional_env(key) + .map(|value| { + value + .parse() + .map_err(|error| anyhow::anyhow!("invalid {key} {value:?}: {error}")) + }) + .transpose() +} + +fn parse_bool(key: &str, value: &str) -> Result { + match value.to_ascii_lowercase().as_str() { + "1" | "true" | "yes" | "on" => Ok(true), + "0" | "false" | "no" | "off" => Ok(false), + _ => bail!("invalid {key} {value:?}"), + } +} diff --git a/crates/buzz-agent/src/prompt.rs b/crates/buzz-agent/src/prompt.rs index 6d80d661c7..3ba58489a7 100644 --- a/crates/buzz-agent/src/prompt.rs +++ b/crates/buzz-agent/src/prompt.rs @@ -1,81 +1,96 @@ -//! buzz-agent's system prompt, assembled with goose's `PromptManager`. -//! -//! `Agent::prompt_manager` is `pub(super)` in goose, and `Agent::reply` is the -//! only thing that reads it. Since buzz-agent owns the loop it also owns the -//! prompt: we keep our own `PromptManager` and call it at the top of each -//! round, which is exactly what goose's inference step does internally. -//! -//! Owning it is not just a workaround for the visibility — it is the seam that -//! makes the persona work at all. goose's ACP server never reads -//! `systemPrompt`, so an agent driven over plain ACP silently loses Fizz and -//! the `[Base]` operating manual. Building the prompt here puts them in front -//! of the model. +//! Per-session system prompt composition using the Goose GDK. use std::path::Path; use std::sync::Arc; -use goose::agents::PromptManager; +use goose_agent::prompt::{ + InstructionDiscovery, InstructionDiscoveryOptions, PromptComposer, PromptContext, PromptSource, +}; use goose_provider_types::goose_mode::GooseMode; use tokio::sync::Mutex; +struct PromptState { + composer: PromptComposer, + instructions: InstructionDiscovery, + root_instructions_loaded: bool, +} + /// The system prompt for one session. -/// -/// Cloneable so a turn can hold it without borrowing the session map. #[derive(Clone)] pub struct SessionPrompt { - manager: Arc>, + state: Arc>, mode: GooseMode, } impl SessionPrompt { pub fn new(mode: GooseMode) -> Self { Self { - manager: Arc::new(Mutex::new(PromptManager::new())), + state: Arc::new(Mutex::new(PromptState { + composer: PromptComposer::new(PromptSource::Literal(String::new())), + instructions: InstructionDiscovery::new(InstructionDiscoveryOptions::default()), + root_instructions_loaded: false, + })), mode, } } - /// Replace goose's base template with the harness-supplied persona. + /// Replace the base prompt with the harness-supplied persona template. pub async fn set_override(&self, template: String) { - self.manager + self.state .lock() .await - .set_system_prompt_override(template); + .composer + .set_base(PromptSource::Template(template)); } - /// Append a keyed section (AGENTS.md hints, the skill index, hook - /// guidance). Extras survive an override — goose appends them to whichever - /// base template is in force. + /// Append or replace a keyed prompt section. pub async fn add_extra(&self, key: &str, instruction: String) { - self.manager + self.state .lock() .await - .add_system_prompt_extra(key.to_string(), instruction); + .composer + .add_extra(key.to_string(), instruction); } /// Render the prompt for one inference. - /// - /// Called per round rather than once per session because - /// `build_system_prompt` also folds in subdirectory hints discovered from - /// the tool arguments seen so far — a prompt built once at session start - /// would never pick them up. - pub async fn build(&self, working_dir: &Path) -> String { - self.manager - .lock() - .await - .build_system_prompt(working_dir, Vec::new(), self.mode) + pub async fn build(&self, working_dir: &Path) -> anyhow::Result { + let mut state = self.state.lock().await; + if !state.root_instructions_loaded { + for instruction in state.instructions.discover_root(working_dir)? { + state + .composer + .add_extra(instruction.key, instruction.content); + } + state.root_instructions_loaded = true; + } + for instruction in state + .instructions + .discover_new_subdirectory_instructions(working_dir)? + { + state + .composer + .add_extra(instruction.key, instruction.content); + } + state.composer.render( + &PromptContext { + current_date_time: String::new(), + goose_mode: self.mode, + variables: Default::default(), + }, + [], + ) } - /// Feed tool arguments to the subdirectory-hint tracker, so entering a new - /// part of the tree pulls in that directory's AGENTS.md on the next round. + /// Feed tool arguments to the subdirectory-instruction tracker. pub async fn record_tool_arguments( &self, arguments: &Option>, working_dir: &Path, ) { - self.manager + self.state .lock() .await + .instructions .record_tool_arguments(arguments, working_dir); } } @@ -88,21 +103,31 @@ mod tests { async fn override_replaces_the_base_template() { let prompt = SessionPrompt::new(GooseMode::Auto); prompt.set_override("You are Fizz.".to_string()).await; - let built = prompt.build(Path::new(".")).await; + let built = prompt.build(Path::new(".")).await.unwrap(); assert!(built.contains("You are Fizz.")); } #[tokio::test] async fn extras_survive_an_override() { - // The persona arrives as an override and the hints as an extra; losing - // either one is a silent failure the harness cannot detect. let prompt = SessionPrompt::new(GooseMode::Auto); prompt.set_override("You are Fizz.".to_string()).await; prompt .add_extra("buzz_hints", "Always ship the sprocket first.".to_string()) .await; - let built = prompt.build(Path::new(".")).await; + let built = prompt.build(Path::new(".")).await.unwrap(); assert!(built.contains("You are Fizz.")); assert!(built.contains("Always ship the sprocket first.")); } + + #[tokio::test] + async fn instructions_are_loaded_once() { + let root = tempfile::tempdir().unwrap(); + std::fs::write(root.path().join("AGENTS.md"), "Project instruction").unwrap(); + let prompt = SessionPrompt::new(GooseMode::Auto); + prompt.set_override("Persona".to_string()).await; + let first = prompt.build(root.path()).await.unwrap(); + let second = prompt.build(root.path()).await.unwrap(); + assert_eq!(first.matches("Project instruction").count(), 1); + assert_eq!(second.matches("Project instruction").count(), 1); + } } diff --git a/crates/buzz-agent/src/provider.rs b/crates/buzz-agent/src/provider.rs index a6c9816dee..425a4c8695 100644 --- a/crates/buzz-agent/src/provider.rs +++ b/crates/buzz-agent/src/provider.rs @@ -1,132 +1,228 @@ -//! Provider construction. -//! -//! Almost all of this is goose's: `goose::providers::create` resolves base -//! URLs, credentials and model metadata from its own registry, and buzz does -//! not duplicate any of it. -//! -//! # Databricks is the exception, on purpose -//! -//! Both sides implement OAuth 2.0 Authorization Code + PKCE against the same -//! Databricks host, and before this module they did it with **two separate -//! token caches**: -//! -//! | | flow | cache | -//! |---|---|---| -//! | inference | goose `providers::oauth` | goose's config dir | -//! | model picker | [`buzz_model_catalog::auth`] | `~/.config/buzz-agent/oauth/databricks/` | -//! -//! A user could be authenticated for inference and not for the model picker, -//! or the reverse, and be sent through the browser twice for the same host. -//! -//! Buzz's engine is the hardened one — PR #5534 gave it `O_NOFOLLOW`, mode -//! `0600` from creation and unique temp names — and it is also the one the -//! desktop calls directly, since the desktop cannot link goose at all (see -//! `buzz-model-catalog`'s lib.rs). So buzz's engine wins and goose's provider -//! is constructed around it. -//! -//! goose supports this without a fork: `DatabricksV2Provider::new` takes a -//! `DatabricksOauthTokenProvider` closure, and `databricks_v2_def::from_env` -//! is simply the variant that passes goose's own. Buzz passes its own instead. -//! Everything else about the provider — retries, the session-id header, -//! endpoint resolution, the wire format — stays goose's. +//! Provider construction for Buzz's supported provider set. +use std::collections::HashMap; use std::sync::Arc; +use std::time::Duration; +use goose_providers::anthropic::{AnthropicProviderBuilder, ANTHROPIC_API_VERSION}; +use goose_providers::api_client::{ApiClient, AuthMethod}; use goose_providers::base::Provider; +use goose_providers::databricks::DatabricksProvider; use goose_providers::databricks_auth::{ DatabricksAuth, DatabricksOauthTokenProvider, DatabricksRefreshHook, }; use goose_providers::databricks_v2::DatabricksV2Provider; +use goose_providers::ollama::{ + OllamaOptions, OllamaProviderBuilder, OLLAMA_DEFAULT_CHUNK_TIMEOUT_SECS, OLLAMA_DEFAULT_PORT, + OLLAMA_PROVIDER_NAME, +}; +use goose_providers::openai::{ + parse_custom_headers, parse_openai_base_url, OpenAiProviderBuilder, OPEN_AI_DEFAULT_BASE_PATH, + OPEN_AI_VERSIONLESS_BASE_PATH, +}; +use goose_providers::openrouter::OpenRouterProvider; use crate::types::AgentError; -/// goose's registry name for the v2 Databricks provider. -const DATABRICKS_V2: &str = "databricks_v2"; +const DEFAULT_TIMEOUT_SECS: u64 = 600; -/// Construct the goose provider for `provider_name`. -/// -/// Relay-mesh `auto` is resolved by the desktop before spawn -/// (`managed_agents/relay_mesh.rs:relay_mesh_wire_model`), so buzz-agent sends -/// whatever model it was given and does not know meshes exist (#5289). pub async fn build(provider_name: &str) -> Result, AgentError> { - if provider_name == DATABRICKS_V2 { - if let Some(host) = databricks_host() { - // Only when buzz has a host to authenticate against. Without one - // there is nothing to improve on, and falling through to goose's - // registry keeps `DATABRICKS_TOKEN`-only setups working unchanged. - return databricks_v2_with_buzz_oauth(host); + let provider = match provider_name { + "anthropic" => anthropic(), + "openai" | "openai-compat" | "openai_compat" | "relay-mesh" | "relay_mesh" => openai(), + "openrouter" => openrouter(), + "ollama" => ollama(), + "databricks" => databricks(false), + "databricks_v2" | "databricks-v2" => databricks(true), + other => Err(anyhow::anyhow!( + "unsupported Buzz provider {other:?}; supported providers: anthropic, openai, openai-compat, openrouter, ollama, databricks, databricks_v2" + )), + }; + provider.map_err(|error| crate::map_provider_error(&error.to_string())) +} + +fn required_env(key: &str) -> anyhow::Result { + env(key).ok_or_else(|| anyhow::anyhow!("{key} is not set")) +} + +fn env(key: &str) -> Option { + std::env::var(key) + .ok() + .map(|value| value.trim().to_string()) + .filter(|value| !value.is_empty()) +} + +fn env_parse(key: &str) -> Option { + env(key).and_then(|value| value.parse().ok()) +} + +fn anthropic() -> anyhow::Result> { + let api_client = ApiClient::with_timeout_and_tls( + env("ANTHROPIC_HOST").unwrap_or_else(|| "https://api.anthropic.com".to_string()), + AuthMethod::ApiKey { + header_name: "x-api-key".to_string(), + key: required_env("ANTHROPIC_API_KEY")?, + }, + Duration::from_secs(env_parse("ANTHROPIC_TIMEOUT").unwrap_or(DEFAULT_TIMEOUT_SECS)), + None, + )? + .with_header("anthropic-version", ANTHROPIC_API_VERSION)?; + Ok(Arc::new(AnthropicProviderBuilder::new(api_client).build())) +} + +fn openai() -> anyhow::Result> { + let raw_base = env("OPENAI_BASE_URL") + .or_else(|| env("OPENAI_HOST")) + .unwrap_or_else(|| "https://api.openai.com".to_string()); + let (host, query, has_v1) = parse_openai_base_url(&raw_base)?; + let direct_openai = url::Url::parse(&host) + .ok() + .and_then(|url| url.host_str().map(str::to_owned)) + .is_some_and(|host| host.eq_ignore_ascii_case("api.openai.com")); + let auth = env("OPENAI_API_KEY") + .map(AuthMethod::BearerToken) + .unwrap_or(AuthMethod::NoAuth); + let mut api_client = ApiClient::with_timeout_and_tls( + host, + auth, + Duration::from_secs(env_parse("OPENAI_TIMEOUT").unwrap_or(DEFAULT_TIMEOUT_SECS)), + None, + )? + .with_query(query); + let organization = env("OPENAI_ORGANIZATION"); + let project = env("OPENAI_PROJECT"); + if let Some(value) = &organization { + api_client = api_client.with_header("OpenAI-Organization", value)?; + } + if let Some(value) = &project { + api_client = api_client.with_header("OpenAI-Project", value)?; + } + let custom_headers = env("OPENAI_CUSTOM_HEADERS").map(parse_custom_headers); + if let Some(headers) = &custom_headers { + for (key, value) in headers { + api_client = api_client.with_header(key, value)?; } } - - goose::providers::create(provider_name, Vec::new()) - .await - .map_err(|e| crate::map_provider_error(&e.to_string())) + let base_path = env("OPENAI_BASE_PATH").unwrap_or_else(|| { + if has_v1 { + OPEN_AI_DEFAULT_BASE_PATH.to_string() + } else { + OPEN_AI_VERSIONLESS_BASE_PATH.to_string() + } + }); + Ok(Arc::new( + OpenAiProviderBuilder::new(api_client) + .base_path(base_path) + .organization(organization) + .project(project) + .custom_headers(custom_headers) + .preserve_thinking_context(!direct_openai) + .build(), + )) } -/// The Databricks workspace host, from the environment. -/// -/// Read from the environment rather than from goose's `Config` because -/// `Config::get_secret` consults the OS keyring, and an agent subprocess is -/// launched with the environment the desktop gives it. -fn databricks_host() -> Option { - std::env::var("DATABRICKS_HOST") - .ok() - .map(|host| host.trim().to_string()) - .filter(|host| !host.is_empty()) +fn openrouter() -> anyhow::Result> { + let host = env("OPENROUTER_HOST").unwrap_or_else(|| "https://openrouter.ai".to_string()); + let api_client = ApiClient::new_with_tls( + host, + AuthMethod::BearerToken(required_env("OPENROUTER_API_KEY")?), + None, + )? + .with_header("HTTP-Referer", "https://buzz.block.xyz")? + .with_header("X-Title", "buzz-agent")? + .with_header("X-OpenRouter-Categories", "cli-agent,productivity")?; + let parameters = env("OPENROUTER_PARAMETERS") + .map(|value| serde_json::from_str::>(&value)) + .transpose()?; + Ok(Arc::new(OpenRouterProvider::new( + api_client, parameters, None, + ))) } -/// goose's `databricks_v2` provider, backed by buzz's PKCE token source. -fn databricks_v2_with_buzz_oauth(host: String) -> Result, AgentError> { - // A static token still wins, exactly as in goose's own `from_env`: a - // configured `DATABRICKS_TOKEN` is an explicit instruction not to run an - // interactive flow at all. - let auth = match std::env::var("DATABRICKS_TOKEN") { - Ok(token) if !token.trim().is_empty() => DatabricksAuth::token(token), - _ => DatabricksAuth::oauth(host.clone()), +fn ollama() -> anyhow::Result> { + let raw = env("OLLAMA_HOST").unwrap_or_else(|| "localhost".to_string()); + let with_scheme = if raw.contains("://") { + raw + } else { + format!("http://{raw}") }; + let mut url = url::Url::parse(&with_scheme)?; + if url.port().is_none() && matches!(url.host_str(), Some("localhost" | "127.0.0.1" | "::1")) { + url.set_port(Some(OLLAMA_DEFAULT_PORT)) + .map_err(|_| anyhow::anyhow!("invalid Ollama port"))?; + } + let timeout = env_parse("OLLAMA_TIMEOUT").unwrap_or(DEFAULT_TIMEOUT_SECS); + let options = OllamaOptions { + input_limit: env_parse::("GOOSE_INPUT_LIMIT").filter(|limit| *limit > 0), + stream_usage: env("OLLAMA_STREAM_USAGE") + .and_then(|value| value.parse().ok()) + .unwrap_or(true), + chunk_timeout_secs: env_parse::("OLLAMA_STREAM_TIMEOUT") + .or_else(|| env_parse("GOOSE_STREAM_TIMEOUT")) + .or_else(|| env_parse("OLLAMA_TIMEOUT")) + .filter(|timeout| *timeout > 0) + .unwrap_or(OLLAMA_DEFAULT_CHUNK_TIMEOUT_SECS), + }; + let api_client = ApiClient::with_timeout_and_tls( + url.to_string(), + AuthMethod::NoAuth, + Duration::from_secs(timeout), + None, + )?; + Ok(Arc::new( + OllamaProviderBuilder::new(api_client) + .name(OLLAMA_PROVIDER_NAME) + .options(options) + .build(), + )) +} +fn databricks(v2: bool) -> anyhow::Result> { + let host = required_env("DATABRICKS_HOST")?; + let auth = match env("DATABRICKS_TOKEN") { + Some(token) => DatabricksAuth::token(token), + None => DatabricksAuth::oauth(host.clone()), + }; let oauth_token_source = match &auth { - DatabricksAuth::OAuth { .. } => Some( - buzz_model_catalog::auth::PkceOAuthTokenSource::new( - buzz_model_catalog::databricks_pkce_config(&host), - ) - .map_err(|e| AgentError::Llm(format!("databricks oauth: {e}")))?, - ), + DatabricksAuth::OAuth { .. } => Some(buzz_model_catalog::auth::PkceOAuthTokenSource::new( + buzz_model_catalog::databricks_pkce_config(&host), + )?), DatabricksAuth::Token(_) => None, }; let oauth_token_provider = oauth_token_source .as_ref() .map(|source| buzz_oauth_token_provider(Arc::clone(source))); let refresh_hook = oauth_token_source.map(buzz_oauth_refresh_hook); - - let retry_config = DatabricksV2Provider::load_retry_config(|key| std::env::var(key).ok()); - - let provider = DatabricksV2Provider::new( - host, - auth, - retry_config, - None, - oauth_token_provider, - Some(Arc::new(|| { - std::env::var("DATABRICKS_TOKEN") - .ok() - .filter(|token| !token.trim().is_empty()) - })), - None, - refresh_hook, - ) - .map_err(|e| AgentError::Llm(format!("databricks provider: {e}")))?; - - Ok(Arc::new(provider)) + let token_resolver = Some(Arc::new(|| env("DATABRICKS_TOKEN")) as _); + if v2 { + let retry = DatabricksV2Provider::load_retry_config(env); + Ok(Arc::new(DatabricksV2Provider::new( + host, + auth, + retry, + None, + oauth_token_provider, + token_resolver, + None, + refresh_hook, + )?)) + } else { + let retry = DatabricksProvider::load_retry_config(env); + Ok(Arc::new(DatabricksProvider::new( + host, + auth, + retry, + None, + oauth_token_provider, + token_resolver, + None, + None, + refresh_hook, + None, + )?)) + } } -/// Adapts buzz's [`TokenSource`](buzz_model_catalog::auth::TokenSource) to the -/// closure shape goose's Databricks provider asks for. -/// -/// `bearer_no_browser` rather than `bearer`: this runs inside an inference -/// request on a headless agent subprocess, where the browser step would hang -/// with nobody to see it. Interactive login stays where a human can answer it -/// — `buzz-agent auth databricks`, and the desktop model picker. fn buzz_oauth_token_provider( source: Arc, ) -> DatabricksOauthTokenProvider { @@ -137,14 +233,11 @@ fn buzz_oauth_token_provider( source .bearer_no_browser() .await - .map_err(|e| anyhow::anyhow!("{e}")) + .map_err(|error| anyhow::anyhow!("{error}")) }) }) } -/// Goose's refresh hook is synchronous, so mark the rejected access token in -/// shared state and let the next async token-provider call force-refresh it. -/// This keeps the refresh grant headless and avoids blocking a runtime worker. fn buzz_oauth_refresh_hook( source: Arc, ) -> DatabricksRefreshHook { @@ -155,84 +248,13 @@ fn buzz_oauth_refresh_hook( mod tests { use super::*; - /// Guards against the environment leaking between these tests and the rest - /// of the suite: they mutate process-global state. - fn with_env(vars: &[(&str, Option<&str>)], f: impl FnOnce() -> T) -> T { - let previous: Vec<(String, Option)> = vars - .iter() - .map(|(key, _)| (key.to_string(), std::env::var(key).ok())) - .collect(); - for (key, value) in vars { - match value { - Some(value) => std::env::set_var(key, value), - None => std::env::remove_var(key), - } - } - let result = f(); - for (key, value) in previous { - match value { - Some(value) => std::env::set_var(&key, value), - None => std::env::remove_var(&key), - } - } - result - } - - /// One test, not three, because `std::env` is process-global and Rust - /// runs tests in this binary on parallel threads: separate tests touching - /// `DATABRICKS_HOST` would race each other and fail intermittently. - #[test] - fn the_host_is_read_and_trimmed_and_blank_means_absent() { - with_env( - &[("DATABRICKS_HOST", Some(" https://example.databricks.com "))], - || { - assert_eq!( - databricks_host().as_deref(), - Some("https://example.databricks.com") - ); - }, - ); - // An empty or whitespace host is what a desktop launch with an - // unconfigured workspace produces. Treating it as present would build - // a provider pointed at "", failing later with a confusing URL error - // instead of falling back to goose's registry cleanly. - for blank in ["", " "] { - with_env(&[("DATABRICKS_HOST", Some(blank))], || { - assert!(databricks_host().is_none(), "blank host {blank:?} accepted"); - }); - } - with_env(&[("DATABRICKS_HOST", None)], || { - assert!(databricks_host().is_none()); - }); - } - - /// Also one test: same process-global environment, same race otherwise. - #[test] - fn the_provider_builds_with_a_token_and_without_one() { - let host = "https://example.databricks.com"; - // A configured token is an explicit instruction not to run any - // interactive flow, and goose's own `from_env` honours it. buzz must - // not quietly change that. - with_env( - &[ - ("DATABRICKS_HOST", Some(host)), - ("DATABRICKS_TOKEN", Some("dapi-secret")), - ], - || assert!(databricks_v2_with_buzz_oauth(host.to_string()).is_ok()), - ); - // A blank token is not a token. Treating it as one would send - // `Authorization: Bearer ` and 401 every request, never trying the - // cached OAuth credential that would have worked. - with_env( - &[ - ("DATABRICKS_HOST", Some(host)), - ("DATABRICKS_TOKEN", Some(" ")), - ], - || assert!(databricks_v2_with_buzz_oauth(host.to_string()).is_ok()), - ); - with_env( - &[("DATABRICKS_HOST", Some(host)), ("DATABRICKS_TOKEN", None)], - || assert!(databricks_v2_with_buzz_oauth(host.to_string()).is_ok()), - ); + #[tokio::test] + async fn unsupported_provider_fails_clearly() { + let error = match build("not-a-provider").await { + Ok(_) => panic!("unsupported provider was accepted"), + Err(error) => error.to_string(), + }; + assert!(error.contains("unsupported Buzz provider")); + assert!(error.contains("openrouter")); } } diff --git a/crates/buzz-agent/src/skills.rs b/crates/buzz-agent/src/skills.rs index 25e23d3bc9..9402d93745 100644 --- a/crates/buzz-agent/src/skills.rs +++ b/crates/buzz-agent/src/skills.rs @@ -1,7 +1,7 @@ //! The skill index for the system prompt. //! //! Discovery, `load_skill`, argument templating, supporting-file loading and -//! the path-escape guard are all [`goose::skills`]. The only thing left here +//! the path-escape guard come from [`goose_agent::skills`]. The only thing left here //! is rendering the index, and only because the piece of goose that renders it //! (`ops_skills::skill_instructions`) is reachable through `SkillOperation`, //! which is `pub(super)` — its concrete operations stay internal to goose @@ -42,7 +42,7 @@ pub fn load_skill( .unwrap_or(""); let args = arguments.get("args").and_then(serde_json::Value::as_str); if let Some(skill) = skills.iter().find(|skill| skill.name == name) { - return match goose::skills::loaded_skill_context_with_args(skill, args) { + return match goose_agent::skills::loaded_skill_context_with_args(skill, args) { Ok(rendered) => { rmcp::model::CallToolResult::success(vec![rmcp::model::ContentBlock::text( rendered, @@ -160,44 +160,3 @@ mod tests { assert!(alpha < zebra, "index must not reorder between rounds"); } } - -/// Nothing in this crate may *load* hint files. -/// -/// buzz-agent used to walk `AGENTS.md` itself while goose's -/// `PromptManager::build_system_prompt` was already loading the same files, so -/// every hint landed in the system prompt twice. This guard outlived the -/// module it was written in (`hints.rs`, deleted along with the duplicate -/// skills code it shared a file with), so it moves here rather than being -/// dropped. -/// -/// It looks for the *filename literals* a loader would need, not for the -/// names in prose -- the previous version banned the bare word and could only -/// live in a file that never explained itself. The literals are assembled at -/// runtime so the guard does not trip over its own source text. -#[cfg(test)] -mod hint_files_are_gooses_job { - const SOURCES: &[(&str, &str)] = &[ - ("lib.rs", include_str!("lib.rs")), - ("prompt.rs", include_str!("prompt.rs")), - ("loop_drive.rs", include_str!("loop_drive.rs")), - ("skills.rs", include_str!("skills.rs")), - ]; - - #[test] - fn no_module_loads_hint_files() { - let quote = '"'; - // Assembled rather than written out, so this test's own source does - // not count as a violation of the rule it enforces. - for name in [format!("AGENTS{}md", '.'), format!(".goose{}", "hints")] { - let literal = format!("{quote}{name}{quote}"); - for (file, source) in SOURCES { - assert!( - !source.contains(&literal), - "{file} has a {literal} string literal: hint-file loading \ - belongs to goose's PromptManager, or hints render twice \ - in the prompt" - ); - } - } - } -}