🤖 fix: add timeout to workspace list post-compaction state fetching #1250
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.
Problem
When the
POST_COMPACTION_CONTEXTexperiment is enabled, theworkspace.list()API call blocks for up to 2 minutes per SSH workspace if SSH hosts are unreachable. This causes the app to hang on "Loading workspaces..." forever.Root cause:
getPostCompactionState()callsfileExists()which callsruntime.stat(), which for SSH runtimes waits on the connection pool with a 2-minute default timeout. The existingcatchblock only fires after the timeout expires.Solution
Add a 3-second timeout wrapper around each
getPostCompactionState()call inlist(). If the timeout expires, the workspace is returned without post-compaction state (matching existing error-case behavior).This ensures app startup completes quickly even when SSH hosts are unreachable - users can work with local workspaces while SSH workspaces simply lack the post-compaction state indicator until connectivity is restored.
Changes
src/node/services/workspaceService.ts: WrapgetPostCompactionState()calls withPromise.race()timeoutsrc/node/services/workspaceService.test.ts: Add test verifying timeout behaviorGenerated with
mux• Model:anthropic:claude-opus-4-5• Thinking:high