diff --git a/Cargo.lock b/Cargo.lock index 7648597..8ac1653 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10,9 +10,9 @@ checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "agent-client-protocol-derive" -version = "2.2.0" +version = "3.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4893bfb11e0e193aa5a64611a126ee87567acb1879556519c902722899229de" +checksum = "5d2d255cb5d3afa4760084fbcaf87c7d214d316328546cd777d8736a8af6e368" dependencies = [ "quote", "syn 3.0.3", @@ -20,7 +20,7 @@ dependencies = [ [[package]] name = "agentkit" -version = "0.12.0" +version = "0.13.0" dependencies = [ "agentkit-acp", "agentkit-adapter-completions", @@ -51,7 +51,7 @@ dependencies = [ [[package]] name = "agentkit-acp" -version = "0.11.0" +version = "0.12.0" dependencies = [ "agentkit-acp-sdk", "agentkit-core", @@ -70,42 +70,36 @@ dependencies = [ [[package]] name = "agentkit-acp-schema" -version = "1.9.1" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfcb839ccca8f4f43bfc9aa26473396f16afbd32071efd00d36801daed62f9d7" +checksum = "11fceebccf753866b268d7375a9ef4904ea358019fefb16438b0146c8a56d0f6" dependencies = [ "anyhow", "derive_more", - "schemars 1.2.2", "serde", "serde_json", "serde_with", "strum", - "tracing", ] [[package]] name = "agentkit-acp-sdk" -version = "2.2.0" +version = "3.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b93c10bb458dd1c2c822275a7e1c390b46846a6bcd3cbc84aafa312563e36ad" +checksum = "34a98bcf96dbdcae3eec8a1a9f44b1c1862f1739f7f6a0e2a23fa515f2af84d3" dependencies = [ "agent-client-protocol-derive", "agentkit-acp-schema", - "async-io", - "async-process", "blocking", "futures", "futures-concurrency", + "libc", "rustc-hash", - "rustix", - "schemars 1.2.2", "serde", "serde_json", - "shell-words", "tracing", "uuid", - "windows-sys 0.61.2", + "wasm-bindgen", ] [[package]] @@ -607,24 +601,6 @@ dependencies = [ "futures-lite", ] -[[package]] -name = "async-io" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" -dependencies = [ - "autocfg", - "cfg-if", - "concurrent-queue", - "futures-io", - "futures-lite", - "parking", - "polling", - "rustix", - "slab", - "windows-sys 0.61.2", -] - [[package]] name = "async-lock" version = "3.4.2" @@ -636,42 +612,6 @@ dependencies = [ "pin-project-lite", ] -[[package]] -name = "async-process" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" -dependencies = [ - "async-channel", - "async-io", - "async-lock", - "async-signal", - "async-task", - "blocking", - "cfg-if", - "event-listener", - "futures-lite", - "rustix", -] - -[[package]] -name = "async-signal" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52b5aaafa020cf5053a01f2a60e8ff5dccf550f0f77ec54a4e47285ac2bab485" -dependencies = [ - "async-io", - "async-lock", - "atomic-waker", - "cfg-if", - "futures-core", - "futures-io", - "rustix", - "signal-hook-registry", - "slab", - "windows-sys 0.61.2", -] - [[package]] name = "async-task" version = "4.7.1" @@ -1638,12 +1578,6 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" -[[package]] -name = "hermit-abi" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" - [[package]] name = "hex" version = "0.4.3" @@ -2061,9 +1995,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.104" +version = "0.3.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e0c1080212aad755ea003d18543e8768dd432c48819efd73a7bf1e39b7a5a3a" +checksum = "ce57d20d1ea864ce2ac172ab472d409214f4fd359f0b2a2775abdf522e2af99e" dependencies = [ "cfg-if", "futures-util", @@ -2630,20 +2564,6 @@ version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6b464fbc74e149a392436b17d523f769e057cb6877f6a5c4618bc6f11800548" -[[package]] -name = "polling" -version = "3.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" -dependencies = [ - "cfg-if", - "concurrent-queue", - "hermit-abi", - "pin-project-lite", - "rustix", - "windows-sys 0.61.2", -] - [[package]] name = "portable-atomic" version = "1.15.0" @@ -3524,12 +3444,6 @@ dependencies = [ "lazy_static", ] -[[package]] -name = "shell-words" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc6fe69c597f9c37bfeeeeeb33da3530379845f10be461a66d16d03eca2ded77" - [[package]] name = "shlex" version = "2.0.1" @@ -4149,9 +4063,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.127" +version = "0.2.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b70935747edd64d89de3efa29d73789b806c15798f8e7dca4d8ac356b50ce70" +checksum = "aecb87a33d3b0c5e3b7aa46336eaf486cffafbd281b195e4c8b80d50df2351bf" dependencies = [ "cfg-if", "once_cell", @@ -4162,9 +4076,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.77" +version = "0.4.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b7777d5cc23d0e91404e53ce2d5e8ec7acae3026b16233dba62cd3246457950" +checksum = "6ef4c5d3d2cdf5c54f4231181768f5510842e350db025faf1f7163b1030ed928" dependencies = [ "js-sys", "wasm-bindgen", @@ -4172,9 +4086,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.127" +version = "0.2.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77775f8f3f7217702089053b94958f8f54061a3f663417df76e19cbdcca29bc1" +checksum = "a690d511e3c1a8b3a55e33511e3c2c00c78415cd23650f32b808627f5696b9ed" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4182,22 +4096,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.127" +version = "0.2.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e11d33f857dc2fb11b8bc75aee111aa9cbeb12cd9f25efd3d4c2a3dd4e235284" +checksum = "411e4887f0071ef2d2164a9d5fdf2d20efbef78fccd3a78b0c10a1dc5295e48a" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.3", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.127" +version = "0.2.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef64dbcc55df09c7e5a46182d181c2cfa3e925f3da937ea764728b4bbb9dcbf" +checksum = "81941cd78d0c92026c33e5e01312845a4cb1e9af3407f9134b100dd03144103e" dependencies = [ "unicode-ident", ] @@ -4217,9 +4131,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.104" +version = "0.3.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c435338968042f4f59a557f690a253676d47ce13ceb55d70100e7facf6620a30" +checksum = "9fbddc4a036f00ec4f18c83445bd3115cb306a91da554919a099d9222fe4a7f8" dependencies = [ "js-sys", "wasm-bindgen", diff --git a/crates/agentkit-acp/Cargo.toml b/crates/agentkit-acp/Cargo.toml index 20af072..0d9faa3 100644 --- a/crates/agentkit-acp/Cargo.toml +++ b/crates/agentkit-acp/Cargo.toml @@ -4,14 +4,14 @@ homepage.workspace = true name = "agentkit-acp" readme = "README.md" repository.workspace = true -version = "0.11.0" +version = "0.12.0" edition.workspace = true license.workspace = true rust-version.workspace = true [features] default = ["stdio"] -stdio = [] +stdio = ["agent-client-protocol/stdio"] unstable-acp = ["agent-client-protocol/unstable"] protocol-v2 = ["agent-client-protocol/unstable_protocol_v2"] unstable-inject = [ @@ -20,7 +20,7 @@ unstable-inject = [ ] [dependencies] -agent-client-protocol = { package = "agentkit-acp-sdk", version = "=2.2.0" } +agent-client-protocol = { package = "agentkit-acp-sdk", version = "=3.6.0" } agentkit-core = { version = "0.10.5", path = "../agentkit-core" } agentkit-loop = { version = "0.11.0", path = "../agentkit-loop" } agentkit-tools-core = { version = "0.10.5", path = "../agentkit-tools-core" } diff --git a/crates/agentkit-acp/src/lib.rs b/crates/agentkit-acp/src/lib.rs index 8f53c13..34c35a0 100644 --- a/crates/agentkit-acp/src/lib.rs +++ b/crates/agentkit-acp/src/lib.rs @@ -2389,13 +2389,23 @@ mod tests { async move |cx| { let cwd = std::env::current_dir() .map_err(agent_client_protocol::Error::into_internal_error)?; + cx.send_request(acp::InitializeRequest::new(ProtocolVersion::V1)) + .block_task() + .await?; let error = cx .send_request(acp::NewSessionRequest::new(cwd)) .block_task() .await .err() .expect("session creation should fail"); - assert!(error.to_string().contains("factory failed")); + assert!( + error + .data + .as_ref() + .and_then(serde_json::Value::as_str) + .is_some_and(|message| message.contains("factory failed")), + "unexpected error: {error:?}" + ); Ok(()) }, ); diff --git a/crates/agentkit-acp/src/v2.rs b/crates/agentkit-acp/src/v2.rs index 562b00d..3db9ae0 100644 --- a/crates/agentkit-acp/src/v2.rs +++ b/crates/agentkit-acp/src/v2.rs @@ -37,7 +37,7 @@ fn sdk_v2_error(error: wire::Error) -> agent_client_protocol::Error { #[cfg(feature = "unstable-inject")] fn session_not_found_error(session_id: &wire::SessionId) -> agent_client_protocol::Error { - sdk_v2_error(wire::Error::resource_not_found(None)).data(serde_json::json!({ + sdk_v2_error(wire::Error::resource_not_found()).data(serde_json::json!({ "sessionId": session_id, })) } @@ -3111,7 +3111,7 @@ fn data_ref_to_resource_content( } fn error_stop_reason() -> wire::StopReason { - wire::StopReason::Other("_error".into()) + wire::StopReason::Error(wire::ErrorStopReason::new()) } fn finish_reason_to_stop_reason(reason: &FinishReason) -> wire::StopReason { @@ -4909,7 +4909,7 @@ mod tests { for reason in [FinishReason::Blocked, FinishReason::Error] { assert_eq!( finish_reason_to_stop_reason(&reason), - wire::StopReason::Other("_error".into()) + wire::StopReason::Error(wire::ErrorStopReason::new()) ); } } @@ -4970,7 +4970,7 @@ mod tests { ¬ification.update, wire::SessionUpdate::StateUpdate(wire::StateUpdate::Idle(idle)) if idle.stop_reason.as_ref() - == Some(&wire::StopReason::Other("_error".into())) + == Some(&wire::StopReason::Error(wire::ErrorStopReason::new())) ) )); assert!(messages.try_recv().is_err()); diff --git a/crates/agentkit-provider-openai/src/responses/websocket/tests.rs b/crates/agentkit-provider-openai/src/responses/websocket/tests.rs index 088be96..2f1c640 100644 --- a/crates/agentkit-provider-openai/src/responses/websocket/tests.rs +++ b/crates/agentkit-provider-openai/src/responses/websocket/tests.rs @@ -620,7 +620,8 @@ async fn uncorrelated_overload_stops_on_budget_or_cancellation() { cfg.profile = OpenAIResponsesProfile::ChatGptPrivate; let resilience = cfg.resilience.as_mut().unwrap(); resilience.max_retries = usize::MAX; - resilience.retry_budget = Duration::from_millis(100); + let retry_budget = Duration::from_secs(2); + resilience.retry_budget = retry_budget; resilience.initial_backoff = Duration::from_secs(1); resilience.max_backoff = Duration::from_secs(1); let adapter = OpenAIResponsesAdapter::new(cfg).unwrap(); @@ -631,8 +632,14 @@ async fn uncorrelated_overload_stops_on_budget_or_cancellation() { let controller = Arc::new(CancellationController::new()); let interrupt = controller.clone(); session.set_retry_observer(Some(Arc::new(move |event| { - if cancel && matches!(event, ProviderRetryEvent::Scheduled(_)) { - interrupt.interrupt(); + if matches!(event, ProviderRetryEvent::Scheduled(_)) { + if cancel { + interrupt.interrupt(); + } else { + // Exhaust the wall-clock budget only after the overload is + // classified, independent of handshake timing and jitter. + std::thread::sleep(retry_budget); + } } }))); let cancellation = controller.handle().checkpoint(); diff --git a/crates/agentkit/Cargo.toml b/crates/agentkit/Cargo.toml index 4400343..9518f2c 100644 --- a/crates/agentkit/Cargo.toml +++ b/crates/agentkit/Cargo.toml @@ -4,14 +4,14 @@ homepage.workspace = true name = "agentkit" readme = "README.md" repository.workspace = true -version = "0.12.0" +version = "0.13.0" edition.workspace = true license.workspace = true rust-version.workspace = true [dependencies] agentkit-capabilities = { version = "0.10.5", path = "../agentkit-capabilities", optional = true } -agentkit-acp = { version = "0.11.0", path = "../agentkit-acp", optional = true } +agentkit-acp = { version = "0.12.0", path = "../agentkit-acp", optional = true } agentkit-compaction = { version = "0.11.0", path = "../agentkit-compaction", optional = true } agentkit-context = { version = "0.10.5", path = "../agentkit-context", optional = true } agentkit-core = { version = "0.10.5", path = "../agentkit-core", optional = true } diff --git a/examples/openrouter-acp-trio/Cargo.toml b/examples/openrouter-acp-trio/Cargo.toml index f2aec15..4db4244 100644 --- a/examples/openrouter-acp-trio/Cargo.toml +++ b/examples/openrouter-acp-trio/Cargo.toml @@ -7,7 +7,7 @@ rust-version.workspace = true version.workspace = true [dependencies] -agent-client-protocol = { package = "agentkit-acp-sdk", version = "2.2.0" } +agent-client-protocol = { package = "agentkit-acp-sdk", version = "=3.6.0" } agentkit-acp = { path = "../../crates/agentkit-acp" } agentkit-core = { path = "../../crates/agentkit-core" } agentkit-loop = { path = "../../crates/agentkit-loop" }