diff --git a/server/migrations/0003_run_cursor_request_id.sql b/server/migrations/0003_run_cursor_request_id.sql
new file mode 100644
index 0000000..9a12dcc
--- /dev/null
+++ b/server/migrations/0003_run_cursor_request_id.sql
@@ -0,0 +1,6 @@
+-- Cursor may reuse one transport request id for multiple queued executions.
+-- Keep that id as an association key while each local Run keeps its own identity.
+ALTER TABLE runs ADD COLUMN cursor_request_id TEXT;
+
+CREATE INDEX idx_runs_cursor_request_active
+ON runs(cursor_request_id, status, created_at_ms DESC);
diff --git a/server/src/cursor/actor.rs b/server/src/cursor/actor.rs
index 590c669..6ca1cdd 100644
--- a/server/src/cursor/actor.rs
+++ b/server/src/cursor/actor.rs
@@ -89,24 +89,42 @@ impl CursorActor {
.map(|parent| parent.tool_call_id.clone()),
request.conversation_state.clone(),
);
- let parent = handle.parent().map(|parent| {
- (
- crate::model::RunId::new(&parent.run_id),
- parent.tool_call_id.clone(),
+ let prepared = async {
+ let parent = match handle.parent() {
+ Some(parent) => {
+ let parent_run_id = dependencies
+ .store
+ .active_run_for_cursor_request(
+ &parent.request_id,
+ )
+ .await?
+ .ok_or_else(|| {
+ crate::Error::Protocol(format!(
+ "Cursor parent request {} has no active local Run",
+ parent.request_id
+ ))
+ })?;
+ Some((
+ parent_run_id,
+ parent.tool_call_id.clone(),
+ ))
+ }
+ None => None,
+ };
+ request::prepare(
+ handle.request_id(),
+ &request,
+ parent,
+ request::PrepareDependencies {
+ compiler: &dependencies.compiler,
+ store: &dependencies.store,
+ checkpoint: &checkpoint,
+ blob_sync: &blob_sync,
+ context_sync: &context_sync,
+ },
)
- });
- let prepared = request::prepare(
- handle.request_id(),
- &request,
- parent,
- request::PrepareDependencies {
- compiler: &dependencies.compiler,
- store: &dependencies.store,
- checkpoint: &checkpoint,
- blob_sync: &blob_sync,
- context_sync: &context_sync,
- },
- )
+ .await
+ }
.await;
let (prepared, context) = match prepared {
Ok(prepared) => prepared,
diff --git a/server/src/cursor/handlers.rs b/server/src/cursor/handlers.rs
index 4b292eb..5fe9d5e 100644
--- a/server/src/cursor/handlers.rs
+++ b/server/src/cursor/handlers.rs
@@ -203,12 +203,12 @@ async fn buffered(request: Request
) -> Result<(axum::http::request::Parts,
}
fn parent_headers(headers: &HeaderMap) -> Result