diff --git a/Cargo.lock b/Cargo.lock index 0cf315c..46bfdbc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1128,7 +1128,7 @@ checksum = "52560adf09603e58c9a7ee1fe1dcb95a16927b17c127f0ac02d6e768a0e25bc1" [[package]] name = "cursor-byok-desktop" -version = "0.1.0-beta.9" +version = "0.1.0-beta.10" dependencies = [ "axum", "cursor-server", diff --git a/apps/desktop/package-lock.json b/apps/desktop/package-lock.json index 8209e06..62a39b4 100644 --- a/apps/desktop/package-lock.json +++ b/apps/desktop/package-lock.json @@ -1,12 +1,12 @@ { "name": "cursor-byok-desktop", - "version": "0.1.0-beta.9", + "version": "0.1.0-beta.10", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "cursor-byok-desktop", - "version": "0.1.0-beta.9", + "version": "0.1.0-beta.10", "license": "MIT", "dependencies": { "@floating-ui/dom": "^1.8.0", diff --git a/apps/desktop/package.json b/apps/desktop/package.json index e787a76..80eae06 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -1,6 +1,6 @@ { "name": "cursor-byok-desktop", - "version": "0.1.0-beta.9", + "version": "0.1.0-beta.10", "description": "Cursor BYOK desktop management application", "type": "module", "scripts": { diff --git a/apps/desktop/src-tauri/Cargo.toml b/apps/desktop/src-tauri/Cargo.toml index 9b87aff..6f0895f 100644 --- a/apps/desktop/src-tauri/Cargo.toml +++ b/apps/desktop/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cursor-byok-desktop" -version = "0.1.0-beta.9" +version = "0.1.0-beta.10" edition = "2021" publish = false diff --git a/apps/desktop/src-tauri/tauri.conf.json b/apps/desktop/src-tauri/tauri.conf.json index 30fbbcc..9f1a6ca 100644 --- a/apps/desktop/src-tauri/tauri.conf.json +++ b/apps/desktop/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2", "productName": "Cursor BYOK", - "version": "0.1.0-beta.9", + "version": "0.1.0-beta.10", "identifier": "dev.cursorbyok.desktop", "build": { "beforeDevCommand": "npm run dev", diff --git a/server/src/cursor/request/prepare.rs b/server/src/cursor/request/prepare.rs index 0b94b31..1f88129 100644 --- a/server/src/cursor/request/prepare.rs +++ b/server/src/cursor/request/prepare.rs @@ -274,20 +274,7 @@ pub(crate) async fn prepare( }; RunAction::Resume { pending_tool_round } }; - let kind = match (request.subagent_type_name.as_deref(), parent) { - (None, _) => RunKind::Root, - (Some(name), Some((parent_run_id, parent_tool_call_id))) => RunKind::Subagent { - parent_run_id, - parent_tool_call_id, - kind: model::subagent_kind(name), - background: false, - }, - (Some(_), None) => { - return Err(Error::Protocol( - "subagent Run is missing its parent Run and tool call".into(), - )); - } - }; + let kind = run_kind(request.subagent_type_name.as_deref(), parent)?; let exec = exec_context( request, &request_context, @@ -322,6 +309,21 @@ pub(crate) async fn prepare( )) } +fn run_kind(subagent_type_name: Option<&str>, parent: Option<(RunId, String)>) -> Result { + match (subagent_type_name, parent) { + (None | Some("side-chat"), _) => Ok(RunKind::Root), + (Some(name), Some((parent_run_id, parent_tool_call_id))) => Ok(RunKind::Subagent { + parent_run_id, + parent_tool_call_id, + kind: model::subagent_kind(name), + background: false, + }), + (Some(_), None) => Err(Error::Protocol( + "subagent Run is missing its parent Run and tool call".into(), + )), + } +} + fn validate_prompt_root(messages: &[CanonicalMessage]) -> Result<()> { let prompts = messages .iter() @@ -579,6 +581,23 @@ mod tests { assert!(mode_from_proto(99).is_err()); } + #[test] + fn side_chat_without_task_parent_is_an_independent_root_run() { + assert!(matches!( + run_kind(Some("side-chat"), None).unwrap(), + RunKind::Root + )); + } + + #[test] + fn task_subagent_without_parent_is_still_rejected() { + assert!(matches!( + run_kind(Some("explore"), None), + Err(Error::Protocol(message)) + if message == "subagent Run is missing its parent Run and tool call" + )); + } + #[test] fn current_user_message_consumes_the_mode_instead_of_history_mode() { let request = pb::AgentRunRequest {