fix(cursor): answer interactionQuery so hosted fetch can continue
Cursor hosted web search / Exa / unnamed field-9 WebFetch send interaction_query and block the Run RPC until the client writes interaction_response. Dropping the frame leaves the HTTP/2 stream alive on heartbeats that are not semantic progress, so the 300s idle watchdog aborts with "Provider stream stalled while waiting for the next event". Approve network permission gates and reject interactive ask / switch-mode / create-plan. Leave VM setup unanswered rather than inventing a success result.
This commit is contained in:
@@ -450,8 +450,12 @@ Cursor's integration in `packages/ai` operates over an HTTP/2 Connect RPC transp
|
||||
- **Trailer & Transport Error Handling**:
|
||||
- Monitors HTTP/2 trailers (`grpc-status`, `grpc-message`) and maps socket or TLS disconnects using `mapH2TransportError`.
|
||||
- **Bi-Directional RPC Dispatch**:
|
||||
- Server streams `AgentServerMessage` (`interactionUpdate`, `execServerMessage`, `kvServerMessage`).
|
||||
- Client writes `AgentClientMessage` (`runRequest`, periodic `clientHeartbeat` every 5 seconds) and `ExecClientMessage` tool responses (`readResult`, `writeResult`, `execClientThrow`, `requestContextResult`).
|
||||
- Server streams `AgentServerMessage` (`interactionUpdate`, `execServerMessage`, `kvServerMessage`, `interactionQuery`).
|
||||
- Client writes `AgentClientMessage` (`runRequest`, periodic `clientHeartbeat` every 5 seconds, `interactionResponse`) and `ExecClientMessage` tool responses (`readResult`, `writeResult`, `execClientThrow`, `requestContextResult`).
|
||||
- **Interaction Query Handshake**:
|
||||
- Hosted web search / Exa / unnamed field-9 WebFetch send `interactionQuery` and block the turn until the client writes `interactionResponse`.
|
||||
- Heartbeats keep HTTP/2 alive but are not semantic progress; an unanswered query sits silent until the 300s idle watchdog (`Provider stream stalled while waiting for the next event`).
|
||||
- `handleInteractionQuery` approves network permission gates and rejects interactive ask / switch-mode / create-plan. VM setup is left unanswered because its result oneof is success-only.
|
||||
- **Async Execution Drain & Turn Completion**:
|
||||
- `handleServerMessage` processes frames asynchronously so the socket continues draining. Dispatches are tracked in `inFlightDispatches` and bounded by `options.signal` abort handling before finalizing stream completion.
|
||||
- Stream completion verifies `turnEnded` (`sawTurnEnded`) or throws `incomplete-stream`.
|
||||
|
||||
Reference in New Issue
Block a user