Repository navigation
fix(cursor): make quiet timeouts retryable by Pi - #1075
Merged
Merged
Conversation
Contributor
|
Thanks @wuuli, merged; it goes out as cursor 0.2.46. I checked Pi's current retry list ( |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
A Cursor Run that goes silent after partial output ends with
Cursor went quiet: … (try again). At that point the response is already an HTTP 200 stream, and Pi classifies the error by its message. Those words do not match Pi's retry rules, so the turn stops without using its retry budget.Append
; stream timed outto the existingQuiet.fire()message, for both idle and heartbeat-only timeouts:The diagnostic prefix, last-frame details, 502 status, timeout limits and failure semantics stay the same. This applies to retained native and stateless Runs. Bump the Cursor package to 0.2.46, update the timeout assertions and README, and add an optional loopback integration script for an installed Pi SDK without adding a dependency.
Related to #550 and #616. #616 already uses
timed outfor the retained Run's lifetime deadline; this applies the same compatibility treatment to the separate quiet watchdog. It does not resolve the underlying Cursor stalls reported in #550.Evidence
With Pi 1.5.2 and synthetic SSE responses, a tool completes once and the following answer emits partial text then the actual
Quiet.fire()error:b40a853)RECOVEREDThe script also asserts that completed tool results remain in retry context and partial output from failed attempts is omitted. All model traffic stays on loopback; no real credentials or user sessions are used. Reproduction commands are in the Cursor README.
[DONE].bun scripts/check.mjs: passed for the full repository.git diff --check: passed.bun test packages/cursor: 421 passed, 0 failed (4268 assertions).bun testwith a temporary home: 8547 passed, 9 skipped, 2 failed. Both failures are outside the changed package:packages/zcode/start.test.mjs, “caps that land after the hold armed…”: expected 24 requests, got 23. The identical assertion failed on the fourth isolated run against unmodifiedb40a853.packages/agent-office/jump.test.mjs, “office.hooks.mjs imported without…”: expected 1 session, got 16 under inherited agent-directory environment variables. The same test passes on both unmodified main and this branch with a minimal isolated environment.Merge Danger
Door: two-way. Reverting restores the old error wording; no configuration or stored-state migration.
Blast Radius: Cursor quiet-timeout errors. Clients that recognize timeout wording can now retry an already-failed turn using their own retry policy, adding requests when Cursor remains unavailable. The plugin adds no retry loop. Normal responses and routing are unchanged; the synthetic Pi cases cover completed-tool preservation, not every client's replay behavior.