From 6a19f45219bcfc14c56b3e513ed8c820b949a0e2 Mon Sep 17 00:00:00 2001 From: dagmfactory Date: Wed, 15 Jul 2026 13:29:43 -0400 Subject: [PATCH 1/3] Add agent_identity_uid support for remote child agents --- Cargo.lock | 2 +- Cargo.toml | 2 +- app/src/ai/agent/api/convert_from.rs | 4 ++ app/src/ai/agent/api/convert_from_tests.rs | 2 + .../action_model/execute/run_agents.rs | 11 ++++++ .../action_model/execute/run_agents_tests.rs | 2 + .../action_model/execute/start_agent.rs | 2 + .../action_model/execute/start_agent_tests.rs | 1 + .../block/view_impl/orchestration_tests.rs | 1 + app/src/ai/blocklist/block_tests.rs | 39 +++++++++++++++++++ .../run_agents_card_view_tests.rs | 1 + app/src/pane_group/pane/terminal_pane.rs | 8 +++- crates/ai/src/agent/action/mod.rs | 9 +++++ .../src/agent/orchestration_config_tests.rs | 1 + review.json | 5 +++ 15 files changed, 87 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b54941b7228..4254f111b84 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -15709,7 +15709,7 @@ dependencies = [ [[package]] name = "warp_multi_agent_api" version = "0.0.0" -source = "git+https://github.com/warpdotdev/warp-proto-apis.git?rev=2d0e8ddf5a946a663f7e0952144ccbced0068a81#2d0e8ddf5a946a663f7e0952144ccbced0068a81" +source = "git+https://github.com/warpdotdev/warp-proto-apis.git?rev=1497e89f1ef084482c1cef80a51e3073158688b5#1497e89f1ef084482c1cef80a51e3073158688b5" dependencies = [ "prost", "prost-reflect", diff --git a/Cargo.toml b/Cargo.toml index 2748549b138..bd1609a866a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -342,7 +342,7 @@ version-compare = "0.1" vte = { git = "https://github.com/warpdotdev/vte.git", rev = "4b399c87b63ba88f45709edaa6383fc519f6c900", default-features = false } walkdir = "2" warp-workflows = { git = "https://github.com/warpdotdev/workflows", rev = "793a98ddda6ef19682aed66364faebd2829f0e01" } -warp_multi_agent_api = { git = "https://github.com/warpdotdev/warp-proto-apis.git", rev = "2d0e8ddf5a946a663f7e0952144ccbced0068a81" } +warp_multi_agent_api = { git = "https://github.com/warpdotdev/warp-proto-apis.git", rev = "1497e89f1ef084482c1cef80a51e3073158688b5" } wasm-bindgen = "0.2.89" wasm-bindgen-futures = "0.4.42" web-sys = { version = "0.3.69", features = [ diff --git a/app/src/ai/agent/api/convert_from.rs b/app/src/ai/agent/api/convert_from.rs index df0272a12ef..841823983a1 100644 --- a/app/src/ai/agent/api/convert_from.rs +++ b/app/src/ai/agent/api/convert_from.rs @@ -164,6 +164,7 @@ fn convert_run_agents( name: config.name, prompt: config.prompt, title: config.title, + agent_identity_uid: config.agent_identity_uid, }) .collect(), plan_id, @@ -198,6 +199,9 @@ fn convert_start_agent_v2_execution_mode( // Auth secret is plumbed client-side via `RunAgentsRequest`; // StartAgentV2 from the server never carries it. auth_secret_name: None, + // Agent identity is plumbed client-side via `RunAgentsRequest`; + // StartAgentV2 from the server never carries it. + agent_identity_uid: None, } } Some(api::start_agent_v2::execution_mode::Mode::Local(local)) => { diff --git a/app/src/ai/agent/api/convert_from_tests.rs b/app/src/ai/agent/api/convert_from_tests.rs index 8f5a32f3065..64184f72b0c 100644 --- a/app/src/ai/agent/api/convert_from_tests.rs +++ b/app/src/ai/agent/api/convert_from_tests.rs @@ -538,6 +538,7 @@ fn converts_remote_start_agent_with_environment_id() { harness_type: String::new(), title: String::new(), auth_secret_name: None, + agent_identity_uid: None, } ); assert_eq!(lifecycle_subscription, None); @@ -580,6 +581,7 @@ fn converts_remote_start_agent_v2_with_skill_references() { harness_type: "claude-code".to_string(), title: "Remote child".to_string(), auth_secret_name: None, + agent_identity_uid: None, } ); assert_eq!(lifecycle_subscription, None); diff --git a/app/src/ai/blocklist/action_model/execute/run_agents.rs b/app/src/ai/blocklist/action_model/execute/run_agents.rs index 379edcc7be7..69177f2d84d 100644 --- a/app/src/ai/blocklist/action_model/execute/run_agents.rs +++ b/app/src/ai/blocklist/action_model/execute/run_agents.rs @@ -739,6 +739,15 @@ pub fn run_agents_to_start_agent_mode( ) -> Result { match run_execution_mode { RunAgentsExecutionMode::Local => { + // Named-agent identity requires the public-API dispatch path, which + // only remote children use. Mirrors server-side validation. + if !cfg.agent_identity_uid.trim().is_empty() { + return Err( + "agent_identity_uid requires remote execution; local child agents cannot \ + run as a different named agent." + .to_string(), + ); + } let trimmed = run_harness_type.trim(); // Propagate run-wide model selection for local launches. let trimmed_model_id = run_model_id.trim(); @@ -782,6 +791,8 @@ pub fn run_agents_to_start_agent_mode( auth_secret_name: run_auth_secret_name .map(str::to_string) .filter(|s| !s.trim().is_empty()), + agent_identity_uid: Some(cfg.agent_identity_uid.clone()) + .filter(|s| !s.trim().is_empty()), }) } } diff --git a/app/src/ai/blocklist/action_model/execute/run_agents_tests.rs b/app/src/ai/blocklist/action_model/execute/run_agents_tests.rs index bec3a44fe46..99e087b0963 100644 --- a/app/src/ai/blocklist/action_model/execute/run_agents_tests.rs +++ b/app/src/ai/blocklist/action_model/execute/run_agents_tests.rs @@ -235,6 +235,7 @@ fn remote_run_agents_action(harness_type: &str) -> AIAgentAction { name: "child".to_string(), prompt: "Help".to_string(), title: String::new(), + agent_identity_uid: String::new(), }], plan_id: String::new(), harness_auth_secret_name: None, @@ -257,6 +258,7 @@ fn local_codex_run_agents_maps_to_local_harness_mode_when_flag_enabled() { name: "child".to_string(), prompt: "Investigate the failure".to_string(), title: String::new(), + agent_identity_uid: String::new(), }; let mode = run_agents_to_start_agent_mode( diff --git a/app/src/ai/blocklist/action_model/execute/start_agent.rs b/app/src/ai/blocklist/action_model/execute/start_agent.rs index 6230861a4ea..313866ae945 100644 --- a/app/src/ai/blocklist/action_model/execute/start_agent.rs +++ b/app/src/ai/blocklist/action_model/execute/start_agent.rs @@ -432,6 +432,7 @@ impl StartAgentExecutor { harness_type, title, auth_secret_name, + agent_identity_uid, } => { let harness_type = Harness::parse_orchestration_harness(&harness_type) .map(|harness| harness.to_string()) @@ -479,6 +480,7 @@ impl StartAgentExecutor { harness_type, title, auth_secret_name, + agent_identity_uid, }, Some(parent_run_id), ) diff --git a/app/src/ai/blocklist/action_model/execute/start_agent_tests.rs b/app/src/ai/blocklist/action_model/execute/start_agent_tests.rs index 34b7c440b66..cf2d93fef36 100644 --- a/app/src/ai/blocklist/action_model/execute/start_agent_tests.rs +++ b/app/src/ai/blocklist/action_model/execute/start_agent_tests.rs @@ -1039,6 +1039,7 @@ fn execute_returns_error_when_remote_opencode_harness_is_requested() { harness_type: "opencode".to_string(), title: String::new(), auth_secret_name: None, + agent_identity_uid: None, }, ); diff --git a/app/src/ai/blocklist/block/view_impl/orchestration_tests.rs b/app/src/ai/blocklist/block/view_impl/orchestration_tests.rs index 832dee9e305..307db1cf9a1 100644 --- a/app/src/ai/blocklist/block/view_impl/orchestration_tests.rs +++ b/app/src/ai/blocklist/block/view_impl/orchestration_tests.rs @@ -79,6 +79,7 @@ fn start_agent_copy_uses_remote_labels_for_remote_children() { harness_type: String::new(), title: String::new(), auth_secret_name: None, + agent_identity_uid: None, }; assert_eq!(start_agent_success_suffix(&execution_mode), " remotely."); diff --git a/app/src/ai/blocklist/block_tests.rs b/app/src/ai/blocklist/block_tests.rs index ac822121097..e39b349b23b 100644 --- a/app/src/ai/blocklist/block_tests.rs +++ b/app/src/ai/blocklist/block_tests.rs @@ -380,6 +380,7 @@ fn agent_cfg() -> RunAgentsAgentRunConfig { name: "child".to_string(), prompt: "do X".to_string(), title: "Child".to_string(), + agent_identity_uid: String::new(), } } @@ -413,6 +414,7 @@ fn remote_arm_propagates_skills_into_skill_references() { computer_use_enabled, title, auth_secret_name, + agent_identity_uid, } = mode else { panic!("expected Remote start-agent mode"); @@ -425,6 +427,43 @@ fn remote_arm_propagates_skills_into_skill_references() { assert!(computer_use_enabled); assert_eq!(title, "Child"); assert_eq!(auth_secret_name, None); + assert_eq!(agent_identity_uid, None); +} + +#[test] +fn remote_arm_propagates_agent_identity_uid() { + let mut cfg = agent_cfg(); + cfg.agent_identity_uid = "sa-uid-1".to_string(); + let mode = run_agents_to_start_agent_mode( + &RunAgentsExecutionMode::Remote { + environment_id: "env-1".to_string(), + worker_host: "warp".to_string(), + computer_use_enabled: false, + }, + "oz", + "auto", + &[], + None, + &cfg, + ) + .expect("Remote+oz must convert"); + let StartAgentExecutionMode::Remote { + agent_identity_uid, .. + } = mode + else { + panic!("expected Remote start-agent mode"); + }; + assert_eq!(agent_identity_uid.as_deref(), Some("sa-uid-1")); +} + +#[test] +fn local_arm_rejects_agent_identity_uid() { + let mut cfg = agent_cfg(); + cfg.agent_identity_uid = "sa-uid-1".to_string(); + let err = + run_agents_to_start_agent_mode(&RunAgentsExecutionMode::Local, "", "", &[], None, &cfg) + .expect_err("Local + agent_identity_uid must be rejected"); + assert!(err.contains("agent_identity_uid requires remote execution")); } #[test] diff --git a/app/src/ai/blocklist/inline_action/run_agents_card_view_tests.rs b/app/src/ai/blocklist/inline_action/run_agents_card_view_tests.rs index 54fd30d482b..afd4f437d04 100644 --- a/app/src/ai/blocklist/inline_action/run_agents_card_view_tests.rs +++ b/app/src/ai/blocklist/inline_action/run_agents_card_view_tests.rs @@ -31,6 +31,7 @@ fn make_request_with_skills( name: "child".to_string(), prompt: "do work".to_string(), title: "Child agent".to_string(), + agent_identity_uid: String::new(), }], plan_id: String::new(), harness_auth_secret_name: None, diff --git a/app/src/pane_group/pane/terminal_pane.rs b/app/src/pane_group/pane/terminal_pane.rs index 0a37b6aebda..10a2fd6a79b 100644 --- a/app/src/pane_group/pane/terminal_pane.rs +++ b/app/src/pane_group/pane/terminal_pane.rs @@ -1595,6 +1595,7 @@ fn dispatch_start_agent_conversation( harness_type, title, auth_secret_name, + agent_identity_uid, } => { launch_remote_child( group, @@ -1609,6 +1610,7 @@ fn dispatch_start_agent_conversation( harness_type, title, auth_secret_name, + agent_identity_uid, }, ctx, ); @@ -1922,6 +1924,9 @@ struct RemoteLaunchFields { /// harness credentials. Resolved to `AgentConfigSnapshot.harness_auth_secrets` /// when applicable. auth_secret_name: Option, + /// UID of the named agent (service account) the remote child should + /// execute as; forwarded to `SpawnAgentRequest.agent_identity_uid`. + agent_identity_uid: Option, } /// Sets up a hidden ambient-agent pane for a Remote child agent: creates the @@ -1953,6 +1958,7 @@ fn launch_remote_child( harness_type, title, auth_secret_name, + agent_identity_uid, } = fields; let request_id = request.id; @@ -2094,7 +2100,7 @@ fn launch_remote_child( referenced_attachments: vec![], conversation_id: None, initial_snapshot_token: None, - agent_identity_uid: None, + agent_identity_uid: agent_identity_uid.filter(|uid| !uid.trim().is_empty()), snapshot_disabled: should_disable_snapshot(ctx).then_some(true), orchestration_handoff: None, }; diff --git a/crates/ai/src/agent/action/mod.rs b/crates/ai/src/agent/action/mod.rs index fc2349006ab..010912e4cda 100644 --- a/crates/ai/src/agent/action/mod.rs +++ b/crates/ai/src/agent/action/mod.rs @@ -246,6 +246,11 @@ pub struct RunAgentsAgentRunConfig { pub name: String, pub prompt: String, pub title: String, + /// Optional UID of the named agent (service account) this child run + /// should execute as. Empty means the child runs as the caller. Only + /// meaningful for factory agents dispatching sibling factory agents; + /// requires remote execution and is enforced server-side at dispatch. + pub agent_identity_uid: String, } #[derive(Debug, Clone, Eq, PartialEq)] @@ -273,6 +278,9 @@ pub enum StartAgentExecutionMode { /// `None` means no client-side secret was selected — the remote /// environment falls back to its own ambient credentials. auth_secret_name: Option, + /// UID of the named agent (service account) the remote child run + /// should execute as. `None` means the child runs as the caller. + agent_identity_uid: Option, }, } @@ -303,6 +311,7 @@ impl StartAgentExecutionMode { harness_type: String::new(), title: String::new(), auth_secret_name: None, + agent_identity_uid: None, } } } diff --git a/crates/ai/src/agent/orchestration_config_tests.rs b/crates/ai/src/agent/orchestration_config_tests.rs index 6843908afaa..ba7ff03a440 100644 --- a/crates/ai/src/agent/orchestration_config_tests.rs +++ b/crates/ai/src/agent/orchestration_config_tests.rs @@ -36,6 +36,7 @@ fn make_request(model: &str, harness: &str, remote: bool) -> RunAgentsRequest { name: "a".to_string(), prompt: String::new(), title: String::new(), + agent_identity_uid: String::new(), }], plan_id: String::new(), harness_auth_secret_name: None, diff --git a/review.json b/review.json index e69de29bb2d..c18ef3aa234 100644 --- a/review.json +++ b/review.json @@ -0,0 +1,5 @@ +{ + "verdict": "APPROVE", + "body": "## Overview\nAdds `agent_identity_uid` plumbing to allow factory agents to dispatch child agents under a named-agent identity (service account). The change bumps `warp_multi_agent_api` to a new proto rev that carries the field, adds it to `RunAgentsAgentRunConfig` and `StartAgentExecutionMode::Remote`, enforces that local children cannot use it, threads it through the run-agents → start-agent → `SpawnAgentRequest` pipeline, and adds tests for both the happy path (remote propagation) and the rejection path (local + non-empty UID).\n\n## Concerns\n\n**`RunAgentsAgentRunConfig.agent_identity_uid: String` vs `Option`** (`crates/ai/src/agent/action/mod.rs`): The field uses empty string as the sentinel for \"no identity,\" which diverges from `auth_secret_name: Option` in `StartAgentExecutionMode::Remote`. This is consistent with proto3 defaults and matches how `model_id`/`harness_type` are typed in the same structs, so it is likely intentional. The `filter(|s| !s.trim().is_empty())` conversion in `run_agents_to_start_agent_mode` cleanly bridges it to `Option`. Worth keeping in mind if this field is ever surfaced in UI or serialized to non-proto formats that need null-vs-absent semantics.\n\n**Redundant filter in `terminal_pane.rs`**: `agent_identity_uid.filter(|uid| !uid.trim().is_empty())` at the `SpawnAgentRequest` call site is effectively a no-op — `run_agents_to_start_agent_mode` already converts the `String` to a filtered `Option`, so `Some(\" \")` cannot reach `launch_remote_child`. Harmless defense-in-depth, but a direct pass-through would read more clearly.\n\n## Verdict\nFound: 0 critical, 0 important, 2 suggestions\n\n**Approve**", + "comments": [] +} From ae82949371b52688ca11e35fc5b9240f7ad622c8 Mon Sep 17 00:00:00 2001 From: dagmfactory Date: Thu, 16 Jul 2026 13:01:26 -0400 Subject: [PATCH 2/3] Delete review.json --- review.json | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 review.json diff --git a/review.json b/review.json deleted file mode 100644 index c18ef3aa234..00000000000 --- a/review.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "verdict": "APPROVE", - "body": "## Overview\nAdds `agent_identity_uid` plumbing to allow factory agents to dispatch child agents under a named-agent identity (service account). The change bumps `warp_multi_agent_api` to a new proto rev that carries the field, adds it to `RunAgentsAgentRunConfig` and `StartAgentExecutionMode::Remote`, enforces that local children cannot use it, threads it through the run-agents → start-agent → `SpawnAgentRequest` pipeline, and adds tests for both the happy path (remote propagation) and the rejection path (local + non-empty UID).\n\n## Concerns\n\n**`RunAgentsAgentRunConfig.agent_identity_uid: String` vs `Option`** (`crates/ai/src/agent/action/mod.rs`): The field uses empty string as the sentinel for \"no identity,\" which diverges from `auth_secret_name: Option` in `StartAgentExecutionMode::Remote`. This is consistent with proto3 defaults and matches how `model_id`/`harness_type` are typed in the same structs, so it is likely intentional. The `filter(|s| !s.trim().is_empty())` conversion in `run_agents_to_start_agent_mode` cleanly bridges it to `Option`. Worth keeping in mind if this field is ever surfaced in UI or serialized to non-proto formats that need null-vs-absent semantics.\n\n**Redundant filter in `terminal_pane.rs`**: `agent_identity_uid.filter(|uid| !uid.trim().is_empty())` at the `SpawnAgentRequest` call site is effectively a no-op — `run_agents_to_start_agent_mode` already converts the `String` to a filtered `Option`, so `Some(\" \")` cannot reach `launch_remote_child`. Harmless defense-in-depth, but a direct pass-through would read more clearly.\n\n## Verdict\nFound: 0 critical, 0 important, 2 suggestions\n\n**Approve**", - "comments": [] -} From f7113951138856665c198d3b6c791554f51de369 Mon Sep 17 00:00:00 2001 From: dagmfactory Date: Thu, 16 Jul 2026 17:39:34 -0400 Subject: [PATCH 3/3] Repin warp-proto-apis to 3d26f16 (agent_identity_uid in RunAgents AgentRunConfig) Co-Authored-By: Oz --- Cargo.lock | 34 +++++++++++++++++----------------- Cargo.toml | 2 +- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a7d1ee152b6..d8f8406c0b7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -610,7 +610,7 @@ dependencies = [ "objc2-foundation 0.3.2", "parking_lot", "percent-encoding", - "windows-sys 0.52.0", + "windows-sys 0.59.0", "wl-clipboard-rs", "x11rb", ] @@ -2109,7 +2109,7 @@ dependencies = [ "bitflags 2.13.0", "cexpr", "clang-sys", - "itertools 0.10.5", + "itertools 0.11.0", "lazy_static", "lazycell", "log", @@ -3113,7 +3113,7 @@ version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fde0e0ec90c9dfb3b4b1a0891a7dcd0e2bffde2f7efed5fe7c9bb00e5bfb915e" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -4451,7 +4451,7 @@ checksum = "6738d2e996274e499bc7b0d693c858b7720b9cd2543a0643a3087e6cb0a4fa16" dependencies = [ "cfg-if", "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -4756,7 +4756,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -7094,7 +7094,7 @@ checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" dependencies = [ "hermit-abi 0.5.2", "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -7288,7 +7288,7 @@ dependencies = [ "portable-atomic", "portable-atomic-util", "serde_core", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -10506,8 +10506,8 @@ version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "343d3bd7056eda839b03204e68deff7d1b13aba7af2b2fd16890697274262ee7" dependencies = [ - "heck 0.5.0", - "itertools 0.10.5", + "heck 0.4.1", + "itertools 0.11.0", "log", "multimap", "petgraph", @@ -10526,7 +10526,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "27c6023962132f4b30eb4c172c91ce92d933da334c59c23cddee82358ddafb0b" dependencies = [ "anyhow", - "itertools 0.10.5", + "itertools 0.11.0", "proc-macro2", "quote", "syn 2.0.117", @@ -10771,7 +10771,7 @@ dependencies = [ "once_cell", "socket2 0.5.10", "tracing", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -11753,7 +11753,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys 0.4.15", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -11766,7 +11766,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys 0.11.0", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -11834,7 +11834,7 @@ dependencies = [ "security-framework 3.5.1", "security-framework-sys", "webpki-root-certs 1.0.1", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -13508,7 +13508,7 @@ dependencies = [ "getrandom 0.3.4", "once_cell", "rustix 1.1.2", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -15710,7 +15710,7 @@ dependencies = [ [[package]] name = "warp_multi_agent_api" version = "0.0.0" -source = "git+https://github.com/warpdotdev/warp-proto-apis.git?rev=1497e89f1ef084482c1cef80a51e3073158688b5#1497e89f1ef084482c1cef80a51e3073158688b5" +source = "git+https://github.com/warpdotdev/warp-proto-apis.git?rev=3d26f166b74469d5c12080ef6a3423fadee4d0e3#3d26f166b74469d5c12080ef6a3423fadee4d0e3" dependencies = [ "prost", "prost-reflect", @@ -16880,7 +16880,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index bd1609a866a..fa4149bf53c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -342,7 +342,7 @@ version-compare = "0.1" vte = { git = "https://github.com/warpdotdev/vte.git", rev = "4b399c87b63ba88f45709edaa6383fc519f6c900", default-features = false } walkdir = "2" warp-workflows = { git = "https://github.com/warpdotdev/workflows", rev = "793a98ddda6ef19682aed66364faebd2829f0e01" } -warp_multi_agent_api = { git = "https://github.com/warpdotdev/warp-proto-apis.git", rev = "1497e89f1ef084482c1cef80a51e3073158688b5" } +warp_multi_agent_api = { git = "https://github.com/warpdotdev/warp-proto-apis.git", rev = "3d26f166b74469d5c12080ef6a3423fadee4d0e3" } wasm-bindgen = "0.2.89" wasm-bindgen-futures = "0.4.42" web-sys = { version = "0.3.69", features = [