fix(server): bound editor discovery latency - #4739

Closed
StiensWout wants to merge 1 commit into
pingdotgg:mainfrom
StiensWout:fix/editor-discovery-latency
Closed

fix(server): bound editor discovery latency#4739
StiensWout wants to merge 1 commit into
pingdotgg:mainfrom
StiensWout:fix/editor-discovery-latency

Conversation

@StiensWout

@StiensWoutStiensWout commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

Summary

  • run editor availability probes concurrently instead of serializing every command lookup
  • cap each editor probe at three seconds and keep successful partial results when another probe stalls
  • preserve the configured editor order and add deterministic virtual-clock regression coverage

Root cause

server.getConfig waits for external editor discovery before returning its configuration snapshot. Editor discovery checked every configured editor sequentially, and every missing Windows command could traverse the full inherited PATH across all PATHEXT variants. Slow filesystem lookups therefore accumulated across the entire editor catalog and blocked provider statuses from reaching the client.

Impact

Optional editor detection can no longer block configuration indefinitely. Fast probes remain visible even when another editor lookup times out, allowing the Providers page and other configuration consumers to resolve within a bounded interval.

Validation

  • pnpm exec vp test run apps/server/src/process/externalLauncher.test.ts (5 tests passed)
  • pnpm exec vp lint --report-unused-disable-directives apps/server/src/process/externalLauncher.ts apps/server/src/process/externalLauncher.test.ts
  • pnpm exec vp run --filter t3 typecheck
  • pnpm exec vp fmt --check apps/server/src/process/externalLauncher.ts apps/server/src/process/externalLauncher.test.ts
  • isolated authenticated web verification: the Providers page rendered completed provider states; on Windows the editor discovery span completed in about 1.62 seconds while individual missing-command probes took about 1.5 seconds

Closes#4210

Current main compatibility

  • based on 3c50a648
  • focused regression tests and targeted package type checks passed
  • targeted formatting and lint passed
  • git diff --check passed

Note

Medium Risk
Changes timing and concurrency of editor detection used on config load; behavior shifts from exhaustive serial probes to bounded parallel races, which could omit editors on very slow disks but fixes indefinite blocking.

Overview
Editor discovery no longer blocks config indefinitely. Availability checks run in parallel across editors and command aliases (via Effect.raceAll / unbounded forEach), and each probe is capped at 3 seconds with Effect.timeoutOption so slow or stuck PATH lookups are dropped while faster hits still appear in order.

ExternalLauncher gains makeWithOptions so tests can stub command availability and discovery timeout; production still defaults to isCommandAvailable. Launch resolves the first responsive alias the same way instead of walking commands serially.

New tests cover responsive fallback aliases (e.g. zed → zeditor) and TestClock regression that partial editor lists survive when other probes never complete.

Reviewed by Cursor Bugbot for commit 5c8af7c. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Bound editor discovery latency by probing aliases concurrently with a 3-second timeout

  • Editor discovery in externalLauncher.ts now probes all editors concurrently instead of sequentially, applying a per-editor timeout (default 3 seconds) and returning partial results for editors that resolved in time.
  • For multi-alias editors (e.g. zed/zeditor), the selected command is now the first alias whose availability check resolves, rather than using a fixed order.
  • A new makeWithOptions factory allows injecting a custom editorCommandAvailability function and editorDiscoveryTimeout, used by tests to control probe timing.
  • Behavioral Change: editors whose availability probes never complete (e.g. hung filesystem checks) are now silently dropped from results after the timeout rather than blocking discovery indefinitely.

Macroscope summarized 5c8af7c.

@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: d785e1c1-479f-470e-a6aa-3887c4108d46

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Jul 28, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR changes editor discovery from sequential to concurrent with timeouts, which is a significant behavioral change affecting which editor gets selected when multiple are available. The algorithm change (race-based vs. ordered iteration) and its user-facing implications warrant human review.

You can customize Macroscope's approvability policy. Learn more.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Provider page stays on "Checking provider status" because server.getConfig blocks on editor discovery

1 participant

@StiensWout
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix(server): bound editor discovery latency - #4739

Closed
StiensWout wants to merge 1 commit into
pingdotgg:mainfrom
StiensWout:fix/editor-discovery-latency
Closed

fix(server): bound editor discovery latency#4739
StiensWout wants to merge 1 commit into
pingdotgg:mainfrom
StiensWout:fix/editor-discovery-latency

Conversation

@StiensWout

@StiensWoutStiensWout commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

Summary

  • run editor availability probes concurrently instead of serializing every command lookup
  • cap each editor probe at three seconds and keep successful partial results when another probe stalls
  • preserve the configured editor order and add deterministic virtual-clock regression coverage

Root cause

server.getConfig waits for external editor discovery before returning its configuration snapshot. Editor discovery checked every configured editor sequentially, and every missing Windows command could traverse the full inherited PATH across all PATHEXT variants. Slow filesystem lookups therefore accumulated across the entire editor catalog and blocked provider statuses from reaching the client.

Impact

Optional editor detection can no longer block configuration indefinitely. Fast probes remain visible even when another editor lookup times out, allowing the Providers page and other configuration consumers to resolve within a bounded interval.

Validation

  • pnpm exec vp test run apps/server/src/process/externalLauncher.test.ts (5 tests passed)
  • pnpm exec vp lint --report-unused-disable-directives apps/server/src/process/externalLauncher.ts apps/server/src/process/externalLauncher.test.ts
  • pnpm exec vp run --filter t3 typecheck
  • pnpm exec vp fmt --check apps/server/src/process/externalLauncher.ts apps/server/src/process/externalLauncher.test.ts
  • isolated authenticated web verification: the Providers page rendered completed provider states; on Windows the editor discovery span completed in about 1.62 seconds while individual missing-command probes took about 1.5 seconds

Closes#4210

Current main compatibility

  • based on 3c50a648
  • focused regression tests and targeted package type checks passed
  • targeted formatting and lint passed
  • git diff --check passed

Note

Medium Risk
Changes timing and concurrency of editor detection used on config load; behavior shifts from exhaustive serial probes to bounded parallel races, which could omit editors on very slow disks but fixes indefinite blocking.

Overview
Editor discovery no longer blocks config indefinitely. Availability checks run in parallel across editors and command aliases (via Effect.raceAll / unbounded forEach), and each probe is capped at 3 seconds with Effect.timeoutOption so slow or stuck PATH lookups are dropped while faster hits still appear in order.

ExternalLauncher gains makeWithOptions so tests can stub command availability and discovery timeout; production still defaults to isCommandAvailable. Launch resolves the first responsive alias the same way instead of walking commands serially.

New tests cover responsive fallback aliases (e.g. zed → zeditor) and TestClock regression that partial editor lists survive when other probes never complete.

Reviewed by Cursor Bugbot for commit 5c8af7c. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Bound editor discovery latency by probing aliases concurrently with a 3-second timeout

  • Editor discovery in externalLauncher.ts now probes all editors concurrently instead of sequentially, applying a per-editor timeout (default 3 seconds) and returning partial results for editors that resolved in time.
  • For multi-alias editors (e.g. zed/zeditor), the selected command is now the first alias whose availability check resolves, rather than using a fixed order.
  • A new makeWithOptions factory allows injecting a custom editorCommandAvailability function and editorDiscoveryTimeout, used by tests to control probe timing.
  • Behavioral Change: editors whose availability probes never complete (e.g. hung filesystem checks) are now silently dropped from results after the timeout rather than blocking discovery indefinitely.

Macroscope summarized 5c8af7c.

@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: d785e1c1-479f-470e-a6aa-3887c4108d46

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Jul 28, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR changes editor discovery from sequential to concurrent with timeouts, which is a significant behavioral change affecting which editor gets selected when multiple are available. The algorithm change (race-based vs. ordered iteration) and its user-facing implications warrant human review.

You can customize Macroscope's approvability policy. Learn more.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Provider page stays on "Checking provider status" because server.getConfig blocks on editor discovery

1 participant

@StiensWout
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(server): bound editor discovery latency - #4739

Closed
StiensWout wants to merge 1 commit into
pingdotgg:mainfrom
StiensWout:fix/editor-discovery-latency
Closed

fix(server): bound editor discovery latency#4739
StiensWout wants to merge 1 commit into
pingdotgg:mainfrom
StiensWout:fix/editor-discovery-latency

Conversation

@StiensWout

@StiensWoutStiensWout commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

Summary

  • run editor availability probes concurrently instead of serializing every command lookup
  • cap each editor probe at three seconds and keep successful partial results when another probe stalls
  • preserve the configured editor order and add deterministic virtual-clock regression coverage

Root cause

server.getConfig waits for external editor discovery before returning its configuration snapshot. Editor discovery checked every configured editor sequentially, and every missing Windows command could traverse the full inherited PATH across all PATHEXT variants. Slow filesystem lookups therefore accumulated across the entire editor catalog and blocked provider statuses from reaching the client.

Impact

Optional editor detection can no longer block configuration indefinitely. Fast probes remain visible even when another editor lookup times out, allowing the Providers page and other configuration consumers to resolve within a bounded interval.

Validation

  • pnpm exec vp test run apps/server/src/process/externalLauncher.test.ts (5 tests passed)
  • pnpm exec vp lint --report-unused-disable-directives apps/server/src/process/externalLauncher.ts apps/server/src/process/externalLauncher.test.ts
  • pnpm exec vp run --filter t3 typecheck
  • pnpm exec vp fmt --check apps/server/src/process/externalLauncher.ts apps/server/src/process/externalLauncher.test.ts
  • isolated authenticated web verification: the Providers page rendered completed provider states; on Windows the editor discovery span completed in about 1.62 seconds while individual missing-command probes took about 1.5 seconds

Closes#4210

Current main compatibility

  • based on 3c50a648
  • focused regression tests and targeted package type checks passed
  • targeted formatting and lint passed
  • git diff --check passed

Note

Medium Risk
Changes timing and concurrency of editor detection used on config load; behavior shifts from exhaustive serial probes to bounded parallel races, which could omit editors on very slow disks but fixes indefinite blocking.

Overview
Editor discovery no longer blocks config indefinitely. Availability checks run in parallel across editors and command aliases (via Effect.raceAll / unbounded forEach), and each probe is capped at 3 seconds with Effect.timeoutOption so slow or stuck PATH lookups are dropped while faster hits still appear in order.

ExternalLauncher gains makeWithOptions so tests can stub command availability and discovery timeout; production still defaults to isCommandAvailable. Launch resolves the first responsive alias the same way instead of walking commands serially.

New tests cover responsive fallback aliases (e.g. zed → zeditor) and TestClock regression that partial editor lists survive when other probes never complete.

Reviewed by Cursor Bugbot for commit 5c8af7c. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Bound editor discovery latency by probing aliases concurrently with a 3-second timeout

  • Editor discovery in externalLauncher.ts now probes all editors concurrently instead of sequentially, applying a per-editor timeout (default 3 seconds) and returning partial results for editors that resolved in time.
  • For multi-alias editors (e.g. zed/zeditor), the selected command is now the first alias whose availability check resolves, rather than using a fixed order.
  • A new makeWithOptions factory allows injecting a custom editorCommandAvailability function and editorDiscoveryTimeout, used by tests to control probe timing.
  • Behavioral Change: editors whose availability probes never complete (e.g. hung filesystem checks) are now silently dropped from results after the timeout rather than blocking discovery indefinitely.

Macroscope summarized 5c8af7c.

@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: d785e1c1-479f-470e-a6aa-3887c4108d46

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Jul 28, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR changes editor discovery from sequential to concurrent with timeouts, which is a significant behavioral change affecting which editor gets selected when multiple are available. The algorithm change (race-based vs. ordered iteration) and its user-facing implications warrant human review.

You can customize Macroscope's approvability policy. Learn more.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Provider page stays on "Checking provider status" because server.getConfig blocks on editor discovery

1 participant

@StiensWout
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(server): bound editor discovery latency - #4739

Closed
StiensWout wants to merge 1 commit into
pingdotgg:mainfrom
StiensWout:fix/editor-discovery-latency
Closed

fix(server): bound editor discovery latency#4739
StiensWout wants to merge 1 commit into
pingdotgg:mainfrom
StiensWout:fix/editor-discovery-latency

Conversation

@StiensWout

@StiensWoutStiensWout commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

Summary

  • run editor availability probes concurrently instead of serializing every command lookup
  • cap each editor probe at three seconds and keep successful partial results when another probe stalls
  • preserve the configured editor order and add deterministic virtual-clock regression coverage

Root cause

server.getConfig waits for external editor discovery before returning its configuration snapshot. Editor discovery checked every configured editor sequentially, and every missing Windows command could traverse the full inherited PATH across all PATHEXT variants. Slow filesystem lookups therefore accumulated across the entire editor catalog and blocked provider statuses from reaching the client.

Impact

Optional editor detection can no longer block configuration indefinitely. Fast probes remain visible even when another editor lookup times out, allowing the Providers page and other configuration consumers to resolve within a bounded interval.

Validation

  • pnpm exec vp test run apps/server/src/process/externalLauncher.test.ts (5 tests passed)
  • pnpm exec vp lint --report-unused-disable-directives apps/server/src/process/externalLauncher.ts apps/server/src/process/externalLauncher.test.ts
  • pnpm exec vp run --filter t3 typecheck
  • pnpm exec vp fmt --check apps/server/src/process/externalLauncher.ts apps/server/src/process/externalLauncher.test.ts
  • isolated authenticated web verification: the Providers page rendered completed provider states; on Windows the editor discovery span completed in about 1.62 seconds while individual missing-command probes took about 1.5 seconds

Closes#4210

Current main compatibility

  • based on 3c50a648
  • focused regression tests and targeted package type checks passed
  • targeted formatting and lint passed
  • git diff --check passed

Note

Medium Risk
Changes timing and concurrency of editor detection used on config load; behavior shifts from exhaustive serial probes to bounded parallel races, which could omit editors on very slow disks but fixes indefinite blocking.

Overview
Editor discovery no longer blocks config indefinitely. Availability checks run in parallel across editors and command aliases (via Effect.raceAll / unbounded forEach), and each probe is capped at 3 seconds with Effect.timeoutOption so slow or stuck PATH lookups are dropped while faster hits still appear in order.

ExternalLauncher gains makeWithOptions so tests can stub command availability and discovery timeout; production still defaults to isCommandAvailable. Launch resolves the first responsive alias the same way instead of walking commands serially.

New tests cover responsive fallback aliases (e.g. zed → zeditor) and TestClock regression that partial editor lists survive when other probes never complete.

Reviewed by Cursor Bugbot for commit 5c8af7c. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Bound editor discovery latency by probing aliases concurrently with a 3-second timeout

  • Editor discovery in externalLauncher.ts now probes all editors concurrently instead of sequentially, applying a per-editor timeout (default 3 seconds) and returning partial results for editors that resolved in time.
  • For multi-alias editors (e.g. zed/zeditor), the selected command is now the first alias whose availability check resolves, rather than using a fixed order.
  • A new makeWithOptions factory allows injecting a custom editorCommandAvailability function and editorDiscoveryTimeout, used by tests to control probe timing.
  • Behavioral Change: editors whose availability probes never complete (e.g. hung filesystem checks) are now silently dropped from results after the timeout rather than blocking discovery indefinitely.

Macroscope summarized 5c8af7c.

@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: d785e1c1-479f-470e-a6aa-3887c4108d46

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Jul 28, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR changes editor discovery from sequential to concurrent with timeouts, which is a significant behavioral change affecting which editor gets selected when multiple are available. The algorithm change (race-based vs. ordered iteration) and its user-facing implications warrant human review.

You can customize Macroscope's approvability policy. Learn more.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Provider page stays on "Checking provider status" because server.getConfig blocks on editor discovery

1 participant

@StiensWout
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix(server): bound editor discovery latency - #4739

Closed
StiensWout wants to merge 1 commit into
pingdotgg:mainfrom
StiensWout:fix/editor-discovery-latency
Closed

fix(server): bound editor discovery latency#4739
StiensWout wants to merge 1 commit into
pingdotgg:mainfrom
StiensWout:fix/editor-discovery-latency

Conversation

@StiensWout

@StiensWoutStiensWout commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

Summary

  • run editor availability probes concurrently instead of serializing every command lookup
  • cap each editor probe at three seconds and keep successful partial results when another probe stalls
  • preserve the configured editor order and add deterministic virtual-clock regression coverage

Root cause

server.getConfig waits for external editor discovery before returning its configuration snapshot. Editor discovery checked every configured editor sequentially, and every missing Windows command could traverse the full inherited PATH across all PATHEXT variants. Slow filesystem lookups therefore accumulated across the entire editor catalog and blocked provider statuses from reaching the client.

Impact

Optional editor detection can no longer block configuration indefinitely. Fast probes remain visible even when another editor lookup times out, allowing the Providers page and other configuration consumers to resolve within a bounded interval.

Validation

  • pnpm exec vp test run apps/server/src/process/externalLauncher.test.ts (5 tests passed)
  • pnpm exec vp lint --report-unused-disable-directives apps/server/src/process/externalLauncher.ts apps/server/src/process/externalLauncher.test.ts
  • pnpm exec vp run --filter t3 typecheck
  • pnpm exec vp fmt --check apps/server/src/process/externalLauncher.ts apps/server/src/process/externalLauncher.test.ts
  • isolated authenticated web verification: the Providers page rendered completed provider states; on Windows the editor discovery span completed in about 1.62 seconds while individual missing-command probes took about 1.5 seconds

Closes#4210

Current main compatibility

  • based on 3c50a648
  • focused regression tests and targeted package type checks passed
  • targeted formatting and lint passed
  • git diff --check passed

Note

Medium Risk
Changes timing and concurrency of editor detection used on config load; behavior shifts from exhaustive serial probes to bounded parallel races, which could omit editors on very slow disks but fixes indefinite blocking.

Overview
Editor discovery no longer blocks config indefinitely. Availability checks run in parallel across editors and command aliases (via Effect.raceAll / unbounded forEach), and each probe is capped at 3 seconds with Effect.timeoutOption so slow or stuck PATH lookups are dropped while faster hits still appear in order.

ExternalLauncher gains makeWithOptions so tests can stub command availability and discovery timeout; production still defaults to isCommandAvailable. Launch resolves the first responsive alias the same way instead of walking commands serially.

New tests cover responsive fallback aliases (e.g. zed → zeditor) and TestClock regression that partial editor lists survive when other probes never complete.

Reviewed by Cursor Bugbot for commit 5c8af7c. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Bound editor discovery latency by probing aliases concurrently with a 3-second timeout

  • Editor discovery in externalLauncher.ts now probes all editors concurrently instead of sequentially, applying a per-editor timeout (default 3 seconds) and returning partial results for editors that resolved in time.
  • For multi-alias editors (e.g. zed/zeditor), the selected command is now the first alias whose availability check resolves, rather than using a fixed order.
  • A new makeWithOptions factory allows injecting a custom editorCommandAvailability function and editorDiscoveryTimeout, used by tests to control probe timing.
  • Behavioral Change: editors whose availability probes never complete (e.g. hung filesystem checks) are now silently dropped from results after the timeout rather than blocking discovery indefinitely.

Macroscope summarized 5c8af7c.

@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: d785e1c1-479f-470e-a6aa-3887c4108d46

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Jul 28, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR changes editor discovery from sequential to concurrent with timeouts, which is a significant behavioral change affecting which editor gets selected when multiple are available. The algorithm change (race-based vs. ordered iteration) and its user-facing implications warrant human review.

You can customize Macroscope's approvability policy. Learn more.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Provider page stays on "Checking provider status" because server.getConfig blocks on editor discovery

1 participant

@StiensWout
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(server): bound editor discovery latency - #4739

Closed
StiensWout wants to merge 1 commit into
pingdotgg:mainfrom
StiensWout:fix/editor-discovery-latency
Closed

fix(server): bound editor discovery latency#4739
StiensWout wants to merge 1 commit into
pingdotgg:mainfrom
StiensWout:fix/editor-discovery-latency

Conversation

@StiensWout

@StiensWoutStiensWout commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

Summary

  • run editor availability probes concurrently instead of serializing every command lookup
  • cap each editor probe at three seconds and keep successful partial results when another probe stalls
  • preserve the configured editor order and add deterministic virtual-clock regression coverage

Root cause

server.getConfig waits for external editor discovery before returning its configuration snapshot. Editor discovery checked every configured editor sequentially, and every missing Windows command could traverse the full inherited PATH across all PATHEXT variants. Slow filesystem lookups therefore accumulated across the entire editor catalog and blocked provider statuses from reaching the client.

Impact

Optional editor detection can no longer block configuration indefinitely. Fast probes remain visible even when another editor lookup times out, allowing the Providers page and other configuration consumers to resolve within a bounded interval.

Validation

  • pnpm exec vp test run apps/server/src/process/externalLauncher.test.ts (5 tests passed)
  • pnpm exec vp lint --report-unused-disable-directives apps/server/src/process/externalLauncher.ts apps/server/src/process/externalLauncher.test.ts
  • pnpm exec vp run --filter t3 typecheck
  • pnpm exec vp fmt --check apps/server/src/process/externalLauncher.ts apps/server/src/process/externalLauncher.test.ts
  • isolated authenticated web verification: the Providers page rendered completed provider states; on Windows the editor discovery span completed in about 1.62 seconds while individual missing-command probes took about 1.5 seconds

Closes#4210

Current main compatibility

  • based on 3c50a648
  • focused regression tests and targeted package type checks passed
  • targeted formatting and lint passed
  • git diff --check passed

Note

Medium Risk
Changes timing and concurrency of editor detection used on config load; behavior shifts from exhaustive serial probes to bounded parallel races, which could omit editors on very slow disks but fixes indefinite blocking.

Overview
Editor discovery no longer blocks config indefinitely. Availability checks run in parallel across editors and command aliases (via Effect.raceAll / unbounded forEach), and each probe is capped at 3 seconds with Effect.timeoutOption so slow or stuck PATH lookups are dropped while faster hits still appear in order.

ExternalLauncher gains makeWithOptions so tests can stub command availability and discovery timeout; production still defaults to isCommandAvailable. Launch resolves the first responsive alias the same way instead of walking commands serially.

New tests cover responsive fallback aliases (e.g. zed → zeditor) and TestClock regression that partial editor lists survive when other probes never complete.

Reviewed by Cursor Bugbot for commit 5c8af7c. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Bound editor discovery latency by probing aliases concurrently with a 3-second timeout

  • Editor discovery in externalLauncher.ts now probes all editors concurrently instead of sequentially, applying a per-editor timeout (default 3 seconds) and returning partial results for editors that resolved in time.
  • For multi-alias editors (e.g. zed/zeditor), the selected command is now the first alias whose availability check resolves, rather than using a fixed order.
  • A new makeWithOptions factory allows injecting a custom editorCommandAvailability function and editorDiscoveryTimeout, used by tests to control probe timing.
  • Behavioral Change: editors whose availability probes never complete (e.g. hung filesystem checks) are now silently dropped from results after the timeout rather than blocking discovery indefinitely.

Macroscope summarized 5c8af7c.

@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: d785e1c1-479f-470e-a6aa-3887c4108d46

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Jul 28, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR changes editor discovery from sequential to concurrent with timeouts, which is a significant behavioral change affecting which editor gets selected when multiple are available. The algorithm change (race-based vs. ordered iteration) and its user-facing implications warrant human review.

You can customize Macroscope's approvability policy. Learn more.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Provider page stays on "Checking provider status" because server.getConfig blocks on editor discovery

1 participant

@StiensWout
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(server): bound editor discovery latency - #4739

Closed
StiensWout wants to merge 1 commit into
pingdotgg:mainfrom
StiensWout:fix/editor-discovery-latency
Closed

fix(server): bound editor discovery latency#4739
StiensWout wants to merge 1 commit into
pingdotgg:mainfrom
StiensWout:fix/editor-discovery-latency

Conversation

@StiensWout

@StiensWoutStiensWout commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

Summary

  • run editor availability probes concurrently instead of serializing every command lookup
  • cap each editor probe at three seconds and keep successful partial results when another probe stalls
  • preserve the configured editor order and add deterministic virtual-clock regression coverage

Root cause

server.getConfig waits for external editor discovery before returning its configuration snapshot. Editor discovery checked every configured editor sequentially, and every missing Windows command could traverse the full inherited PATH across all PATHEXT variants. Slow filesystem lookups therefore accumulated across the entire editor catalog and blocked provider statuses from reaching the client.

Impact

Optional editor detection can no longer block configuration indefinitely. Fast probes remain visible even when another editor lookup times out, allowing the Providers page and other configuration consumers to resolve within a bounded interval.

Validation

  • pnpm exec vp test run apps/server/src/process/externalLauncher.test.ts (5 tests passed)
  • pnpm exec vp lint --report-unused-disable-directives apps/server/src/process/externalLauncher.ts apps/server/src/process/externalLauncher.test.ts
  • pnpm exec vp run --filter t3 typecheck
  • pnpm exec vp fmt --check apps/server/src/process/externalLauncher.ts apps/server/src/process/externalLauncher.test.ts
  • isolated authenticated web verification: the Providers page rendered completed provider states; on Windows the editor discovery span completed in about 1.62 seconds while individual missing-command probes took about 1.5 seconds

Closes#4210

Current main compatibility

  • based on 3c50a648
  • focused regression tests and targeted package type checks passed
  • targeted formatting and lint passed
  • git diff --check passed

Note

Medium Risk
Changes timing and concurrency of editor detection used on config load; behavior shifts from exhaustive serial probes to bounded parallel races, which could omit editors on very slow disks but fixes indefinite blocking.

Overview
Editor discovery no longer blocks config indefinitely. Availability checks run in parallel across editors and command aliases (via Effect.raceAll / unbounded forEach), and each probe is capped at 3 seconds with Effect.timeoutOption so slow or stuck PATH lookups are dropped while faster hits still appear in order.

ExternalLauncher gains makeWithOptions so tests can stub command availability and discovery timeout; production still defaults to isCommandAvailable. Launch resolves the first responsive alias the same way instead of walking commands serially.

New tests cover responsive fallback aliases (e.g. zed → zeditor) and TestClock regression that partial editor lists survive when other probes never complete.

Reviewed by Cursor Bugbot for commit 5c8af7c. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Bound editor discovery latency by probing aliases concurrently with a 3-second timeout

  • Editor discovery in externalLauncher.ts now probes all editors concurrently instead of sequentially, applying a per-editor timeout (default 3 seconds) and returning partial results for editors that resolved in time.
  • For multi-alias editors (e.g. zed/zeditor), the selected command is now the first alias whose availability check resolves, rather than using a fixed order.
  • A new makeWithOptions factory allows injecting a custom editorCommandAvailability function and editorDiscoveryTimeout, used by tests to control probe timing.
  • Behavioral Change: editors whose availability probes never complete (e.g. hung filesystem checks) are now silently dropped from results after the timeout rather than blocking discovery indefinitely.

Macroscope summarized 5c8af7c.

@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: d785e1c1-479f-470e-a6aa-3887c4108d46

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Jul 28, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR changes editor discovery from sequential to concurrent with timeouts, which is a significant behavioral change affecting which editor gets selected when multiple are available. The algorithm change (race-based vs. ordered iteration) and its user-facing implications warrant human review.

You can customize Macroscope's approvability policy. Learn more.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Provider page stays on "Checking provider status" because server.getConfig blocks on editor discovery

1 participant

@StiensWout
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix(server): bound editor discovery latency - #4739

Closed
StiensWout wants to merge 1 commit into
pingdotgg:mainfrom
StiensWout:fix/editor-discovery-latency
Closed

fix(server): bound editor discovery latency#4739
StiensWout wants to merge 1 commit into
pingdotgg:mainfrom
StiensWout:fix/editor-discovery-latency

Conversation

@StiensWout

@StiensWoutStiensWout commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

Summary

  • run editor availability probes concurrently instead of serializing every command lookup
  • cap each editor probe at three seconds and keep successful partial results when another probe stalls
  • preserve the configured editor order and add deterministic virtual-clock regression coverage

Root cause

server.getConfig waits for external editor discovery before returning its configuration snapshot. Editor discovery checked every configured editor sequentially, and every missing Windows command could traverse the full inherited PATH across all PATHEXT variants. Slow filesystem lookups therefore accumulated across the entire editor catalog and blocked provider statuses from reaching the client.

Impact

Optional editor detection can no longer block configuration indefinitely. Fast probes remain visible even when another editor lookup times out, allowing the Providers page and other configuration consumers to resolve within a bounded interval.

Validation

  • pnpm exec vp test run apps/server/src/process/externalLauncher.test.ts (5 tests passed)
  • pnpm exec vp lint --report-unused-disable-directives apps/server/src/process/externalLauncher.ts apps/server/src/process/externalLauncher.test.ts
  • pnpm exec vp run --filter t3 typecheck
  • pnpm exec vp fmt --check apps/server/src/process/externalLauncher.ts apps/server/src/process/externalLauncher.test.ts
  • isolated authenticated web verification: the Providers page rendered completed provider states; on Windows the editor discovery span completed in about 1.62 seconds while individual missing-command probes took about 1.5 seconds

Closes#4210

Current main compatibility

  • based on 3c50a648
  • focused regression tests and targeted package type checks passed
  • targeted formatting and lint passed
  • git diff --check passed

Note

Medium Risk
Changes timing and concurrency of editor detection used on config load; behavior shifts from exhaustive serial probes to bounded parallel races, which could omit editors on very slow disks but fixes indefinite blocking.

Overview
Editor discovery no longer blocks config indefinitely. Availability checks run in parallel across editors and command aliases (via Effect.raceAll / unbounded forEach), and each probe is capped at 3 seconds with Effect.timeoutOption so slow or stuck PATH lookups are dropped while faster hits still appear in order.

ExternalLauncher gains makeWithOptions so tests can stub command availability and discovery timeout; production still defaults to isCommandAvailable. Launch resolves the first responsive alias the same way instead of walking commands serially.

New tests cover responsive fallback aliases (e.g. zed → zeditor) and TestClock regression that partial editor lists survive when other probes never complete.

Reviewed by Cursor Bugbot for commit 5c8af7c. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Bound editor discovery latency by probing aliases concurrently with a 3-second timeout

  • Editor discovery in externalLauncher.ts now probes all editors concurrently instead of sequentially, applying a per-editor timeout (default 3 seconds) and returning partial results for editors that resolved in time.
  • For multi-alias editors (e.g. zed/zeditor), the selected command is now the first alias whose availability check resolves, rather than using a fixed order.
  • A new makeWithOptions factory allows injecting a custom editorCommandAvailability function and editorDiscoveryTimeout, used by tests to control probe timing.
  • Behavioral Change: editors whose availability probes never complete (e.g. hung filesystem checks) are now silently dropped from results after the timeout rather than blocking discovery indefinitely.

Macroscope summarized 5c8af7c.

@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: d785e1c1-479f-470e-a6aa-3887c4108d46

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Jul 28, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR changes editor discovery from sequential to concurrent with timeouts, which is a significant behavioral change affecting which editor gets selected when multiple are available. The algorithm change (race-based vs. ordered iteration) and its user-facing implications warrant human review.

You can customize Macroscope's approvability policy. Learn more.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Provider page stays on "Checking provider status" because server.getConfig blocks on editor discovery

1 participant

@StiensWout