[Bug]: Azure DevOps source control shows "not available" on Windows because the 5s CLI probe times out on slow az --version (misclassified as missing) #4

Description

@eddy-curly

Before submitting

  • I searched existing issues and did not find a duplicate. (Closest is pingdotgg/t3code#2576, a different root cause — see "Relationship to other issues".)
  • I included enough detail to reproduce or investigate the problem.

Area

apps/server (source-control discovery). Surfaces in the desktop app's Settings → Source Control Providers UI.

Summary

On Windows, the Azure DevOps connector reports "not available" and shows the install az hint even when the Azure CLI is installed, on PATH, and authenticated. The real cause is not a missing install — it's that the discovery probe runs az --version under a hard-coded 5 s timeout, and az --version on Windows routinely takes 6–8 s (Python startup + the "updates available" check). The probe times out, and the timeout is misclassified as status: "missing", which renders the install hint and skips the (fast, ~1 s) auth check.

This is the next Windows failure mode after pingdotgg/t3code#2576: once az.cmd spawn resolution was fixed, az actually runs — and now it runs too slowly for the 5 s probe budget.

Steps to reproduce

  1. On Windows, install Azure CLI (az 2.87.0) + the azure-devops extension (1.0.6), on the machine PATH.
  2. az login and confirm auth: az account show --query user.name -o tsv returns your user (~1 s).
  3. Confirm az --version works but is slow — on an affected machine it takes ~6–8 s (Azure CLI prints "N updates available" on --version).
  4. Open T3 Code → Settings → Source Control Providers → Azure DevOps.
  5. The connector shows "not available" with the "Install the Azure command-line tools (az) …" hint, even though az is installed and authenticated.

Measured on the reporting machine: az --version = 7,286 / 6,232 / 5,872 ms across runs; az account show … = ~1.1 s. Server logs show the source-control.discovery.probe operations returning Failure at 5,815 / 7,389 / 7,831 / 5,817 ms — i.e. interrupted at the 5 s ceiling (the >5 s tail is the time to tear down the az.cmd → python process tree on Windows).

Expected behavior

  • A CLI that is installed and authenticated but slow to answer --version should be detected as present, not reported as missing.
  • A probe timeout must be distinguished from not installed (ENOENT). Only a genuine spawn failure should render the "install az" hint.
  • The fast auth check (az account show) should still run when the version probe is merely slow.

Actual behavior

The probe times out at 5 s, the timeout is collapsed into status: "missing", the install hint is shown, the auth check is skipped, and a misleading "Hosting integration command was not found on the server PATH." detail is emitted — even though az is on PATH and works.

Root cause (code references, at main @ 18fa89c4a)

Line numbers are for the TypeScript source (the shipped dist/bin.mjs is the bundled form of the same logic).

  1. Discovery specapps/server/src/sourceControl/AzureDevOpsSourceControlProvider.ts:41-51
    executable: "az", versionArgs: ["--version"], authArgs: ["account","show","--query","user.name","-o","tsv"].

  2. Hard-coded 5 s probe timeout + catch-all → "missing"apps/server/src/sourceControl/SourceControlProviderDiscovery.ts:159-201
    probeCli passes timeoutMs: 5_000 (line 170), and its Effect.catch((cause) => …) (lines 189-199) maps every failure — timeout, spawn error, crash — to status: "missing". Note this is a 6× under-cut of the module's own DEFAULT_TIMEOUT_MS = 30_000 (apps/server/src/vcs/VcsProcess.ts:49).

  3. Short-circuit skips the auth checkapps/server/src/sourceControl/SourceControlProviderDiscovery.ts:232-238
    When status !== "available", probeSourceControlProvider returns early with unknownAuth("Hosting integration command was not found on the server PATH.") and never runs authArgs (az account show).

  4. The information to fix this already exists.apps/server/src/vcs/VcsProcess.ts:112 sets timeoutBehavior: "error", and the mapper at VcsProcess.ts:115-140 produces distinct typed errorsVcsProcessTimeoutError for a timeout vs VcsProcessSpawnError for ENOENT (both asserted in VcsProcess.test.ts). probeCli's untyped catch simply discards that distinction.

Decisive signal: a genuinely missing az fails as VcsProcessSpawnError in milliseconds; the observed failures at 5.8–7.8 s are the timeout signature, not absence. No reinstall changes a >5 s answer to --version.

Proposed fix (small, focused)

  1. Stop hard-coding timeoutMs: 5_000 in probeCli — inherit the 30 s default, or raise to ~15–30 s (optionally configurable).
  2. In probeCli's catch, branch on the cause tag: only VcsProcessSpawnErrorstatus: "missing" (install hint). A VcsProcessTimeoutError should be a distinct "present but slow / probe timed out" state that preserves the real detail and still attempts the fast auth command.
  3. Optional: use the fast az account show (the existing authArgs) as the presence signal instead of az --version, since --version triggers Azure CLI's update-availability check, which is the slow part.

I'd be happy to open a PR for (1)+(2) with a test mirroring the existing VcsProcessTimeoutError coverage, if you're open to it.

Impact

Major degradation or frequent failure — the Azure DevOps connector is effectively unusable on any Windows host where az --version exceeds 5 s (common, given Azure CLI is Python-based and runs an update check). Same practical severity as pingdotgg/t3code#2576.

Version or commit

main @ 18fa89c

Environment

Windows 11 Pro 10.0.26200; Azure CLI az 2.87.0 + azure-devops extension 1.0.6 (at …\CLI2\wbin\az.cmd), authenticated (org urbanlighthouse); Node v24.15.0 / Bun 1.3.13.

Logs or stack traces

# t3code server logs (post-restart, confirmed new PID):
source-control.discovery.probe az --version Failure 5815ms
source-control.discovery.probe az --version Failure 7389ms
source-control.discovery.probe az --version Failure 7831ms
source-control.discovery.probe az --version Failure 5817ms
# Direct timings on the same machine:
az --version ~6232-7286 ms
az account show --query user.name -o tsv ~1100 ms

Relationship to other issues

  • pingdotgg/t3code#2576 (closed/COMPLETED) — predecessor: VcsProcessSpawnError because Windows az is az.cmd and spawn couldn't resolve it. Different root cause (fails instantly at the spawn boundary). Its fix is what lets az now run long enough to hit this timeout.
  • pingdotgg/t3code#2537 (open) — cosmetic cmd.exe/conhost flashes from the same provider-probe / VCS-process-kill paths. Different symptom, same subsystem.
  • pingdotgg/t3code#3525 (open) — a separate hard-coded 5 s timeout causing problems (background git fetch), suggesting the 5 s budget is a recurring foot-gun worth revisiting broadly.

Workaround

None reliable from the user side — the CLI is already installed and authenticated. Restarting/reinstalling az does not help because the probe keeps timing out.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      , '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

      [Bug]: Azure DevOps source control shows "not available" on Windows because the 5s CLI probe times out on slow az --version (misclassified as missing) #4

      Description

      @eddy-curly

      Before submitting

      • I searched existing issues and did not find a duplicate. (Closest is pingdotgg/t3code#2576, a different root cause — see "Relationship to other issues".)
      • I included enough detail to reproduce or investigate the problem.

      Area

      apps/server (source-control discovery). Surfaces in the desktop app's Settings → Source Control Providers UI.

      Summary

      On Windows, the Azure DevOps connector reports "not available" and shows the install az hint even when the Azure CLI is installed, on PATH, and authenticated. The real cause is not a missing install — it's that the discovery probe runs az --version under a hard-coded 5 s timeout, and az --version on Windows routinely takes 6–8 s (Python startup + the "updates available" check). The probe times out, and the timeout is misclassified as status: "missing", which renders the install hint and skips the (fast, ~1 s) auth check.

      This is the next Windows failure mode after pingdotgg/t3code#2576: once az.cmd spawn resolution was fixed, az actually runs — and now it runs too slowly for the 5 s probe budget.

      Steps to reproduce

      1. On Windows, install Azure CLI (az 2.87.0) + the azure-devops extension (1.0.6), on the machine PATH.
      2. az login and confirm auth: az account show --query user.name -o tsv returns your user (~1 s).
      3. Confirm az --version works but is slow — on an affected machine it takes ~6–8 s (Azure CLI prints "N updates available" on --version).
      4. Open T3 Code → Settings → Source Control Providers → Azure DevOps.
      5. The connector shows "not available" with the "Install the Azure command-line tools (az) …" hint, even though az is installed and authenticated.

      Measured on the reporting machine: az --version = 7,286 / 6,232 / 5,872 ms across runs; az account show … = ~1.1 s. Server logs show the source-control.discovery.probe operations returning Failure at 5,815 / 7,389 / 7,831 / 5,817 ms — i.e. interrupted at the 5 s ceiling (the >5 s tail is the time to tear down the az.cmd → python process tree on Windows).

      Expected behavior

      • A CLI that is installed and authenticated but slow to answer --version should be detected as present, not reported as missing.
      • A probe timeout must be distinguished from not installed (ENOENT). Only a genuine spawn failure should render the "install az" hint.
      • The fast auth check (az account show) should still run when the version probe is merely slow.

      Actual behavior

      The probe times out at 5 s, the timeout is collapsed into status: "missing", the install hint is shown, the auth check is skipped, and a misleading "Hosting integration command was not found on the server PATH." detail is emitted — even though az is on PATH and works.

      Root cause (code references, at main @ 18fa89c4a)

      Line numbers are for the TypeScript source (the shipped dist/bin.mjs is the bundled form of the same logic).

      1. Discovery specapps/server/src/sourceControl/AzureDevOpsSourceControlProvider.ts:41-51
        executable: "az", versionArgs: ["--version"], authArgs: ["account","show","--query","user.name","-o","tsv"].

      2. Hard-coded 5 s probe timeout + catch-all → "missing"apps/server/src/sourceControl/SourceControlProviderDiscovery.ts:159-201
        probeCli passes timeoutMs: 5_000 (line 170), and its Effect.catch((cause) => …) (lines 189-199) maps every failure — timeout, spawn error, crash — to status: "missing". Note this is a 6× under-cut of the module's own DEFAULT_TIMEOUT_MS = 30_000 (apps/server/src/vcs/VcsProcess.ts:49).

      3. Short-circuit skips the auth checkapps/server/src/sourceControl/SourceControlProviderDiscovery.ts:232-238
        When status !== "available", probeSourceControlProvider returns early with unknownAuth("Hosting integration command was not found on the server PATH.") and never runs authArgs (az account show).

      4. The information to fix this already exists.apps/server/src/vcs/VcsProcess.ts:112 sets timeoutBehavior: "error", and the mapper at VcsProcess.ts:115-140 produces distinct typed errorsVcsProcessTimeoutError for a timeout vs VcsProcessSpawnError for ENOENT (both asserted in VcsProcess.test.ts). probeCli's untyped catch simply discards that distinction.

      Decisive signal: a genuinely missing az fails as VcsProcessSpawnError in milliseconds; the observed failures at 5.8–7.8 s are the timeout signature, not absence. No reinstall changes a >5 s answer to --version.

      Proposed fix (small, focused)

      1. Stop hard-coding timeoutMs: 5_000 in probeCli — inherit the 30 s default, or raise to ~15–30 s (optionally configurable).
      2. In probeCli's catch, branch on the cause tag: only VcsProcessSpawnErrorstatus: "missing" (install hint). A VcsProcessTimeoutError should be a distinct "present but slow / probe timed out" state that preserves the real detail and still attempts the fast auth command.
      3. Optional: use the fast az account show (the existing authArgs) as the presence signal instead of az --version, since --version triggers Azure CLI's update-availability check, which is the slow part.

      I'd be happy to open a PR for (1)+(2) with a test mirroring the existing VcsProcessTimeoutError coverage, if you're open to it.

      Impact

      Major degradation or frequent failure — the Azure DevOps connector is effectively unusable on any Windows host where az --version exceeds 5 s (common, given Azure CLI is Python-based and runs an update check). Same practical severity as pingdotgg/t3code#2576.

      Version or commit

      main @ 18fa89c

      Environment

      Windows 11 Pro 10.0.26200; Azure CLI az 2.87.0 + azure-devops extension 1.0.6 (at …\CLI2\wbin\az.cmd), authenticated (org urbanlighthouse); Node v24.15.0 / Bun 1.3.13.

      Logs or stack traces

      # t3code server logs (post-restart, confirmed new PID):
      source-control.discovery.probe az --version Failure 5815ms
      source-control.discovery.probe az --version Failure 7389ms
      source-control.discovery.probe az --version Failure 7831ms
      source-control.discovery.probe az --version Failure 5817ms
      # Direct timings on the same machine:
      az --version ~6232-7286 ms
      az account show --query user.name -o tsv ~1100 ms

      Relationship to other issues

      • pingdotgg/t3code#2576 (closed/COMPLETED) — predecessor: VcsProcessSpawnError because Windows az is az.cmd and spawn couldn't resolve it. Different root cause (fails instantly at the spawn boundary). Its fix is what lets az now run long enough to hit this timeout.
      • pingdotgg/t3code#2537 (open) — cosmetic cmd.exe/conhost flashes from the same provider-probe / VCS-process-kill paths. Different symptom, same subsystem.
      • pingdotgg/t3code#3525 (open) — a separate hard-coded 5 s timeout causing problems (background git fetch), suggesting the 5 s budget is a recurring foot-gun worth revisiting broadly.

      Workaround

      None reliable from the user side — the CLI is already installed and authenticated. Restarting/reinstalling az does not help because the probe keeps timing out.

      Metadata

      Metadata

      Assignees

      No one assigned

        Labels

        No labels
        No labels

        Projects

        No projects

          Milestone

          No milestone

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

          , '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

          [Bug]: Azure DevOps source control shows "not available" on Windows because the 5s CLI probe times out on slow az --version (misclassified as missing) #4

          Description

          @eddy-curly

          Before submitting

          • I searched existing issues and did not find a duplicate. (Closest is pingdotgg/t3code#2576, a different root cause — see "Relationship to other issues".)
          • I included enough detail to reproduce or investigate the problem.

          Area

          apps/server (source-control discovery). Surfaces in the desktop app's Settings → Source Control Providers UI.

          Summary

          On Windows, the Azure DevOps connector reports "not available" and shows the install az hint even when the Azure CLI is installed, on PATH, and authenticated. The real cause is not a missing install — it's that the discovery probe runs az --version under a hard-coded 5 s timeout, and az --version on Windows routinely takes 6–8 s (Python startup + the "updates available" check). The probe times out, and the timeout is misclassified as status: "missing", which renders the install hint and skips the (fast, ~1 s) auth check.

          This is the next Windows failure mode after pingdotgg/t3code#2576: once az.cmd spawn resolution was fixed, az actually runs — and now it runs too slowly for the 5 s probe budget.

          Steps to reproduce

          1. On Windows, install Azure CLI (az 2.87.0) + the azure-devops extension (1.0.6), on the machine PATH.
          2. az login and confirm auth: az account show --query user.name -o tsv returns your user (~1 s).
          3. Confirm az --version works but is slow — on an affected machine it takes ~6–8 s (Azure CLI prints "N updates available" on --version).
          4. Open T3 Code → Settings → Source Control Providers → Azure DevOps.
          5. The connector shows "not available" with the "Install the Azure command-line tools (az) …" hint, even though az is installed and authenticated.

          Measured on the reporting machine: az --version = 7,286 / 6,232 / 5,872 ms across runs; az account show … = ~1.1 s. Server logs show the source-control.discovery.probe operations returning Failure at 5,815 / 7,389 / 7,831 / 5,817 ms — i.e. interrupted at the 5 s ceiling (the >5 s tail is the time to tear down the az.cmd → python process tree on Windows).

          Expected behavior

          • A CLI that is installed and authenticated but slow to answer --version should be detected as present, not reported as missing.
          • A probe timeout must be distinguished from not installed (ENOENT). Only a genuine spawn failure should render the "install az" hint.
          • The fast auth check (az account show) should still run when the version probe is merely slow.

          Actual behavior

          The probe times out at 5 s, the timeout is collapsed into status: "missing", the install hint is shown, the auth check is skipped, and a misleading "Hosting integration command was not found on the server PATH." detail is emitted — even though az is on PATH and works.

          Root cause (code references, at main @ 18fa89c4a)

          Line numbers are for the TypeScript source (the shipped dist/bin.mjs is the bundled form of the same logic).

          1. Discovery specapps/server/src/sourceControl/AzureDevOpsSourceControlProvider.ts:41-51
            executable: "az", versionArgs: ["--version"], authArgs: ["account","show","--query","user.name","-o","tsv"].

          2. Hard-coded 5 s probe timeout + catch-all → "missing"apps/server/src/sourceControl/SourceControlProviderDiscovery.ts:159-201
            probeCli passes timeoutMs: 5_000 (line 170), and its Effect.catch((cause) => …) (lines 189-199) maps every failure — timeout, spawn error, crash — to status: "missing". Note this is a 6× under-cut of the module's own DEFAULT_TIMEOUT_MS = 30_000 (apps/server/src/vcs/VcsProcess.ts:49).

          3. Short-circuit skips the auth checkapps/server/src/sourceControl/SourceControlProviderDiscovery.ts:232-238
            When status !== "available", probeSourceControlProvider returns early with unknownAuth("Hosting integration command was not found on the server PATH.") and never runs authArgs (az account show).

          4. The information to fix this already exists.apps/server/src/vcs/VcsProcess.ts:112 sets timeoutBehavior: "error", and the mapper at VcsProcess.ts:115-140 produces distinct typed errorsVcsProcessTimeoutError for a timeout vs VcsProcessSpawnError for ENOENT (both asserted in VcsProcess.test.ts). probeCli's untyped catch simply discards that distinction.

          Decisive signal: a genuinely missing az fails as VcsProcessSpawnError in milliseconds; the observed failures at 5.8–7.8 s are the timeout signature, not absence. No reinstall changes a >5 s answer to --version.

          Proposed fix (small, focused)

          1. Stop hard-coding timeoutMs: 5_000 in probeCli — inherit the 30 s default, or raise to ~15–30 s (optionally configurable).
          2. In probeCli's catch, branch on the cause tag: only VcsProcessSpawnErrorstatus: "missing" (install hint). A VcsProcessTimeoutError should be a distinct "present but slow / probe timed out" state that preserves the real detail and still attempts the fast auth command.
          3. Optional: use the fast az account show (the existing authArgs) as the presence signal instead of az --version, since --version triggers Azure CLI's update-availability check, which is the slow part.

          I'd be happy to open a PR for (1)+(2) with a test mirroring the existing VcsProcessTimeoutError coverage, if you're open to it.

          Impact

          Major degradation or frequent failure — the Azure DevOps connector is effectively unusable on any Windows host where az --version exceeds 5 s (common, given Azure CLI is Python-based and runs an update check). Same practical severity as pingdotgg/t3code#2576.

          Version or commit

          main @ 18fa89c

          Environment

          Windows 11 Pro 10.0.26200; Azure CLI az 2.87.0 + azure-devops extension 1.0.6 (at …\CLI2\wbin\az.cmd), authenticated (org urbanlighthouse); Node v24.15.0 / Bun 1.3.13.

          Logs or stack traces

          # t3code server logs (post-restart, confirmed new PID):
          source-control.discovery.probe az --version Failure 5815ms
          source-control.discovery.probe az --version Failure 7389ms
          source-control.discovery.probe az --version Failure 7831ms
          source-control.discovery.probe az --version Failure 5817ms
          # Direct timings on the same machine:
          az --version ~6232-7286 ms
          az account show --query user.name -o tsv ~1100 ms

          Relationship to other issues

          • pingdotgg/t3code#2576 (closed/COMPLETED) — predecessor: VcsProcessSpawnError because Windows az is az.cmd and spawn couldn't resolve it. Different root cause (fails instantly at the spawn boundary). Its fix is what lets az now run long enough to hit this timeout.
          • pingdotgg/t3code#2537 (open) — cosmetic cmd.exe/conhost flashes from the same provider-probe / VCS-process-kill paths. Different symptom, same subsystem.
          • pingdotgg/t3code#3525 (open) — a separate hard-coded 5 s timeout causing problems (background git fetch), suggesting the 5 s budget is a recurring foot-gun worth revisiting broadly.

          Workaround

          None reliable from the user side — the CLI is already installed and authenticated. Restarting/reinstalling az does not help because the probe keeps timing out.

          Metadata

          Metadata

          Assignees

          No one assigned

            Labels

            No labels
            No labels

            Projects

            No projects

              Milestone

              No milestone

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

              , '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

              [Bug]: Azure DevOps source control shows "not available" on Windows because the 5s CLI probe times out on slow az --version (misclassified as missing) #4

              Description

              @eddy-curly

              Before submitting

              • I searched existing issues and did not find a duplicate. (Closest is pingdotgg/t3code#2576, a different root cause — see "Relationship to other issues".)
              • I included enough detail to reproduce or investigate the problem.

              Area

              apps/server (source-control discovery). Surfaces in the desktop app's Settings → Source Control Providers UI.

              Summary

              On Windows, the Azure DevOps connector reports "not available" and shows the install az hint even when the Azure CLI is installed, on PATH, and authenticated. The real cause is not a missing install — it's that the discovery probe runs az --version under a hard-coded 5 s timeout, and az --version on Windows routinely takes 6–8 s (Python startup + the "updates available" check). The probe times out, and the timeout is misclassified as status: "missing", which renders the install hint and skips the (fast, ~1 s) auth check.

              This is the next Windows failure mode after pingdotgg/t3code#2576: once az.cmd spawn resolution was fixed, az actually runs — and now it runs too slowly for the 5 s probe budget.

              Steps to reproduce

              1. On Windows, install Azure CLI (az 2.87.0) + the azure-devops extension (1.0.6), on the machine PATH.
              2. az login and confirm auth: az account show --query user.name -o tsv returns your user (~1 s).
              3. Confirm az --version works but is slow — on an affected machine it takes ~6–8 s (Azure CLI prints "N updates available" on --version).
              4. Open T3 Code → Settings → Source Control Providers → Azure DevOps.
              5. The connector shows "not available" with the "Install the Azure command-line tools (az) …" hint, even though az is installed and authenticated.

              Measured on the reporting machine: az --version = 7,286 / 6,232 / 5,872 ms across runs; az account show … = ~1.1 s. Server logs show the source-control.discovery.probe operations returning Failure at 5,815 / 7,389 / 7,831 / 5,817 ms — i.e. interrupted at the 5 s ceiling (the >5 s tail is the time to tear down the az.cmd → python process tree on Windows).

              Expected behavior

              • A CLI that is installed and authenticated but slow to answer --version should be detected as present, not reported as missing.
              • A probe timeout must be distinguished from not installed (ENOENT). Only a genuine spawn failure should render the "install az" hint.
              • The fast auth check (az account show) should still run when the version probe is merely slow.

              Actual behavior

              The probe times out at 5 s, the timeout is collapsed into status: "missing", the install hint is shown, the auth check is skipped, and a misleading "Hosting integration command was not found on the server PATH." detail is emitted — even though az is on PATH and works.

              Root cause (code references, at main @ 18fa89c4a)

              Line numbers are for the TypeScript source (the shipped dist/bin.mjs is the bundled form of the same logic).

              1. Discovery specapps/server/src/sourceControl/AzureDevOpsSourceControlProvider.ts:41-51
                executable: "az", versionArgs: ["--version"], authArgs: ["account","show","--query","user.name","-o","tsv"].

              2. Hard-coded 5 s probe timeout + catch-all → "missing"apps/server/src/sourceControl/SourceControlProviderDiscovery.ts:159-201
                probeCli passes timeoutMs: 5_000 (line 170), and its Effect.catch((cause) => …) (lines 189-199) maps every failure — timeout, spawn error, crash — to status: "missing". Note this is a 6× under-cut of the module's own DEFAULT_TIMEOUT_MS = 30_000 (apps/server/src/vcs/VcsProcess.ts:49).

              3. Short-circuit skips the auth checkapps/server/src/sourceControl/SourceControlProviderDiscovery.ts:232-238
                When status !== "available", probeSourceControlProvider returns early with unknownAuth("Hosting integration command was not found on the server PATH.") and never runs authArgs (az account show).

              4. The information to fix this already exists.apps/server/src/vcs/VcsProcess.ts:112 sets timeoutBehavior: "error", and the mapper at VcsProcess.ts:115-140 produces distinct typed errorsVcsProcessTimeoutError for a timeout vs VcsProcessSpawnError for ENOENT (both asserted in VcsProcess.test.ts). probeCli's untyped catch simply discards that distinction.

              Decisive signal: a genuinely missing az fails as VcsProcessSpawnError in milliseconds; the observed failures at 5.8–7.8 s are the timeout signature, not absence. No reinstall changes a >5 s answer to --version.

              Proposed fix (small, focused)

              1. Stop hard-coding timeoutMs: 5_000 in probeCli — inherit the 30 s default, or raise to ~15–30 s (optionally configurable).
              2. In probeCli's catch, branch on the cause tag: only VcsProcessSpawnErrorstatus: "missing" (install hint). A VcsProcessTimeoutError should be a distinct "present but slow / probe timed out" state that preserves the real detail and still attempts the fast auth command.
              3. Optional: use the fast az account show (the existing authArgs) as the presence signal instead of az --version, since --version triggers Azure CLI's update-availability check, which is the slow part.

              I'd be happy to open a PR for (1)+(2) with a test mirroring the existing VcsProcessTimeoutError coverage, if you're open to it.

              Impact

              Major degradation or frequent failure — the Azure DevOps connector is effectively unusable on any Windows host where az --version exceeds 5 s (common, given Azure CLI is Python-based and runs an update check). Same practical severity as pingdotgg/t3code#2576.

              Version or commit

              main @ 18fa89c

              Environment

              Windows 11 Pro 10.0.26200; Azure CLI az 2.87.0 + azure-devops extension 1.0.6 (at …\CLI2\wbin\az.cmd), authenticated (org urbanlighthouse); Node v24.15.0 / Bun 1.3.13.

              Logs or stack traces

              # t3code server logs (post-restart, confirmed new PID):
              source-control.discovery.probe az --version Failure 5815ms
              source-control.discovery.probe az --version Failure 7389ms
              source-control.discovery.probe az --version Failure 7831ms
              source-control.discovery.probe az --version Failure 5817ms
              # Direct timings on the same machine:
              az --version ~6232-7286 ms
              az account show --query user.name -o tsv ~1100 ms

              Relationship to other issues

              • pingdotgg/t3code#2576 (closed/COMPLETED) — predecessor: VcsProcessSpawnError because Windows az is az.cmd and spawn couldn't resolve it. Different root cause (fails instantly at the spawn boundary). Its fix is what lets az now run long enough to hit this timeout.
              • pingdotgg/t3code#2537 (open) — cosmetic cmd.exe/conhost flashes from the same provider-probe / VCS-process-kill paths. Different symptom, same subsystem.
              • pingdotgg/t3code#3525 (open) — a separate hard-coded 5 s timeout causing problems (background git fetch), suggesting the 5 s budget is a recurring foot-gun worth revisiting broadly.

              Workaround

              None reliable from the user side — the CLI is already installed and authenticated. Restarting/reinstalling az does not help because the probe keeps timing out.

              Metadata

              Metadata

              Assignees

              No one assigned

                Labels

                No labels
                No labels

                Projects

                No projects

                  Milestone

                  No milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions

                  , '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

                  [Bug]: Azure DevOps source control shows "not available" on Windows because the 5s CLI probe times out on slow az --version (misclassified as missing) #4

                  Description

                  @eddy-curly

                  Before submitting

                  • I searched existing issues and did not find a duplicate. (Closest is pingdotgg/t3code#2576, a different root cause — see "Relationship to other issues".)
                  • I included enough detail to reproduce or investigate the problem.

                  Area

                  apps/server (source-control discovery). Surfaces in the desktop app's Settings → Source Control Providers UI.

                  Summary

                  On Windows, the Azure DevOps connector reports "not available" and shows the install az hint even when the Azure CLI is installed, on PATH, and authenticated. The real cause is not a missing install — it's that the discovery probe runs az --version under a hard-coded 5 s timeout, and az --version on Windows routinely takes 6–8 s (Python startup + the "updates available" check). The probe times out, and the timeout is misclassified as status: "missing", which renders the install hint and skips the (fast, ~1 s) auth check.

                  This is the next Windows failure mode after pingdotgg/t3code#2576: once az.cmd spawn resolution was fixed, az actually runs — and now it runs too slowly for the 5 s probe budget.

                  Steps to reproduce

                  1. On Windows, install Azure CLI (az 2.87.0) + the azure-devops extension (1.0.6), on the machine PATH.
                  2. az login and confirm auth: az account show --query user.name -o tsv returns your user (~1 s).
                  3. Confirm az --version works but is slow — on an affected machine it takes ~6–8 s (Azure CLI prints "N updates available" on --version).
                  4. Open T3 Code → Settings → Source Control Providers → Azure DevOps.
                  5. The connector shows "not available" with the "Install the Azure command-line tools (az) …" hint, even though az is installed and authenticated.

                  Measured on the reporting machine: az --version = 7,286 / 6,232 / 5,872 ms across runs; az account show … = ~1.1 s. Server logs show the source-control.discovery.probe operations returning Failure at 5,815 / 7,389 / 7,831 / 5,817 ms — i.e. interrupted at the 5 s ceiling (the >5 s tail is the time to tear down the az.cmd → python process tree on Windows).

                  Expected behavior

                  • A CLI that is installed and authenticated but slow to answer --version should be detected as present, not reported as missing.
                  • A probe timeout must be distinguished from not installed (ENOENT). Only a genuine spawn failure should render the "install az" hint.
                  • The fast auth check (az account show) should still run when the version probe is merely slow.

                  Actual behavior

                  The probe times out at 5 s, the timeout is collapsed into status: "missing", the install hint is shown, the auth check is skipped, and a misleading "Hosting integration command was not found on the server PATH." detail is emitted — even though az is on PATH and works.

                  Root cause (code references, at main @ 18fa89c4a)

                  Line numbers are for the TypeScript source (the shipped dist/bin.mjs is the bundled form of the same logic).

                  1. Discovery specapps/server/src/sourceControl/AzureDevOpsSourceControlProvider.ts:41-51
                    executable: "az", versionArgs: ["--version"], authArgs: ["account","show","--query","user.name","-o","tsv"].

                  2. Hard-coded 5 s probe timeout + catch-all → "missing"apps/server/src/sourceControl/SourceControlProviderDiscovery.ts:159-201
                    probeCli passes timeoutMs: 5_000 (line 170), and its Effect.catch((cause) => …) (lines 189-199) maps every failure — timeout, spawn error, crash — to status: "missing". Note this is a 6× under-cut of the module's own DEFAULT_TIMEOUT_MS = 30_000 (apps/server/src/vcs/VcsProcess.ts:49).

                  3. Short-circuit skips the auth checkapps/server/src/sourceControl/SourceControlProviderDiscovery.ts:232-238
                    When status !== "available", probeSourceControlProvider returns early with unknownAuth("Hosting integration command was not found on the server PATH.") and never runs authArgs (az account show).

                  4. The information to fix this already exists.apps/server/src/vcs/VcsProcess.ts:112 sets timeoutBehavior: "error", and the mapper at VcsProcess.ts:115-140 produces distinct typed errorsVcsProcessTimeoutError for a timeout vs VcsProcessSpawnError for ENOENT (both asserted in VcsProcess.test.ts). probeCli's untyped catch simply discards that distinction.

                  Decisive signal: a genuinely missing az fails as VcsProcessSpawnError in milliseconds; the observed failures at 5.8–7.8 s are the timeout signature, not absence. No reinstall changes a >5 s answer to --version.

                  Proposed fix (small, focused)

                  1. Stop hard-coding timeoutMs: 5_000 in probeCli — inherit the 30 s default, or raise to ~15–30 s (optionally configurable).
                  2. In probeCli's catch, branch on the cause tag: only VcsProcessSpawnErrorstatus: "missing" (install hint). A VcsProcessTimeoutError should be a distinct "present but slow / probe timed out" state that preserves the real detail and still attempts the fast auth command.
                  3. Optional: use the fast az account show (the existing authArgs) as the presence signal instead of az --version, since --version triggers Azure CLI's update-availability check, which is the slow part.

                  I'd be happy to open a PR for (1)+(2) with a test mirroring the existing VcsProcessTimeoutError coverage, if you're open to it.

                  Impact

                  Major degradation or frequent failure — the Azure DevOps connector is effectively unusable on any Windows host where az --version exceeds 5 s (common, given Azure CLI is Python-based and runs an update check). Same practical severity as pingdotgg/t3code#2576.

                  Version or commit

                  main @ 18fa89c

                  Environment

                  Windows 11 Pro 10.0.26200; Azure CLI az 2.87.0 + azure-devops extension 1.0.6 (at …\CLI2\wbin\az.cmd), authenticated (org urbanlighthouse); Node v24.15.0 / Bun 1.3.13.

                  Logs or stack traces

                  # t3code server logs (post-restart, confirmed new PID):
                  source-control.discovery.probe az --version Failure 5815ms
                  source-control.discovery.probe az --version Failure 7389ms
                  source-control.discovery.probe az --version Failure 7831ms
                  source-control.discovery.probe az --version Failure 5817ms
                  # Direct timings on the same machine:
                  az --version ~6232-7286 ms
                  az account show --query user.name -o tsv ~1100 ms

                  Relationship to other issues

                  • pingdotgg/t3code#2576 (closed/COMPLETED) — predecessor: VcsProcessSpawnError because Windows az is az.cmd and spawn couldn't resolve it. Different root cause (fails instantly at the spawn boundary). Its fix is what lets az now run long enough to hit this timeout.
                  • pingdotgg/t3code#2537 (open) — cosmetic cmd.exe/conhost flashes from the same provider-probe / VCS-process-kill paths. Different symptom, same subsystem.
                  • pingdotgg/t3code#3525 (open) — a separate hard-coded 5 s timeout causing problems (background git fetch), suggesting the 5 s budget is a recurring foot-gun worth revisiting broadly.

                  Workaround

                  None reliable from the user side — the CLI is already installed and authenticated. Restarting/reinstalling az does not help because the probe keeps timing out.

                  Metadata

                  Metadata

                  Assignees

                  No one assigned

                    Labels

                    No labels
                    No labels

                    Projects

                    No projects

                      Milestone

                      No milestone

                      Relationships

                      None yet

                      Development

                      No branches or pull requests

                      Issue actions

                      , '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

                      [Bug]: Azure DevOps source control shows "not available" on Windows because the 5s CLI probe times out on slow az --version (misclassified as missing) #4

                      Description

                      @eddy-curly

                      Before submitting

                      • I searched existing issues and did not find a duplicate. (Closest is pingdotgg/t3code#2576, a different root cause — see "Relationship to other issues".)
                      • I included enough detail to reproduce or investigate the problem.

                      Area

                      apps/server (source-control discovery). Surfaces in the desktop app's Settings → Source Control Providers UI.

                      Summary

                      On Windows, the Azure DevOps connector reports "not available" and shows the install az hint even when the Azure CLI is installed, on PATH, and authenticated. The real cause is not a missing install — it's that the discovery probe runs az --version under a hard-coded 5 s timeout, and az --version on Windows routinely takes 6–8 s (Python startup + the "updates available" check). The probe times out, and the timeout is misclassified as status: "missing", which renders the install hint and skips the (fast, ~1 s) auth check.

                      This is the next Windows failure mode after pingdotgg/t3code#2576: once az.cmd spawn resolution was fixed, az actually runs — and now it runs too slowly for the 5 s probe budget.

                      Steps to reproduce

                      1. On Windows, install Azure CLI (az 2.87.0) + the azure-devops extension (1.0.6), on the machine PATH.
                      2. az login and confirm auth: az account show --query user.name -o tsv returns your user (~1 s).
                      3. Confirm az --version works but is slow — on an affected machine it takes ~6–8 s (Azure CLI prints "N updates available" on --version).
                      4. Open T3 Code → Settings → Source Control Providers → Azure DevOps.
                      5. The connector shows "not available" with the "Install the Azure command-line tools (az) …" hint, even though az is installed and authenticated.

                      Measured on the reporting machine: az --version = 7,286 / 6,232 / 5,872 ms across runs; az account show … = ~1.1 s. Server logs show the source-control.discovery.probe operations returning Failure at 5,815 / 7,389 / 7,831 / 5,817 ms — i.e. interrupted at the 5 s ceiling (the >5 s tail is the time to tear down the az.cmd → python process tree on Windows).

                      Expected behavior

                      • A CLI that is installed and authenticated but slow to answer --version should be detected as present, not reported as missing.
                      • A probe timeout must be distinguished from not installed (ENOENT). Only a genuine spawn failure should render the "install az" hint.
                      • The fast auth check (az account show) should still run when the version probe is merely slow.

                      Actual behavior

                      The probe times out at 5 s, the timeout is collapsed into status: "missing", the install hint is shown, the auth check is skipped, and a misleading "Hosting integration command was not found on the server PATH." detail is emitted — even though az is on PATH and works.

                      Root cause (code references, at main @ 18fa89c4a)

                      Line numbers are for the TypeScript source (the shipped dist/bin.mjs is the bundled form of the same logic).

                      1. Discovery specapps/server/src/sourceControl/AzureDevOpsSourceControlProvider.ts:41-51
                        executable: "az", versionArgs: ["--version"], authArgs: ["account","show","--query","user.name","-o","tsv"].

                      2. Hard-coded 5 s probe timeout + catch-all → "missing"apps/server/src/sourceControl/SourceControlProviderDiscovery.ts:159-201
                        probeCli passes timeoutMs: 5_000 (line 170), and its Effect.catch((cause) => …) (lines 189-199) maps every failure — timeout, spawn error, crash — to status: "missing". Note this is a 6× under-cut of the module's own DEFAULT_TIMEOUT_MS = 30_000 (apps/server/src/vcs/VcsProcess.ts:49).

                      3. Short-circuit skips the auth checkapps/server/src/sourceControl/SourceControlProviderDiscovery.ts:232-238
                        When status !== "available", probeSourceControlProvider returns early with unknownAuth("Hosting integration command was not found on the server PATH.") and never runs authArgs (az account show).

                      4. The information to fix this already exists.apps/server/src/vcs/VcsProcess.ts:112 sets timeoutBehavior: "error", and the mapper at VcsProcess.ts:115-140 produces distinct typed errorsVcsProcessTimeoutError for a timeout vs VcsProcessSpawnError for ENOENT (both asserted in VcsProcess.test.ts). probeCli's untyped catch simply discards that distinction.

                      Decisive signal: a genuinely missing az fails as VcsProcessSpawnError in milliseconds; the observed failures at 5.8–7.8 s are the timeout signature, not absence. No reinstall changes a >5 s answer to --version.

                      Proposed fix (small, focused)

                      1. Stop hard-coding timeoutMs: 5_000 in probeCli — inherit the 30 s default, or raise to ~15–30 s (optionally configurable).
                      2. In probeCli's catch, branch on the cause tag: only VcsProcessSpawnErrorstatus: "missing" (install hint). A VcsProcessTimeoutError should be a distinct "present but slow / probe timed out" state that preserves the real detail and still attempts the fast auth command.
                      3. Optional: use the fast az account show (the existing authArgs) as the presence signal instead of az --version, since --version triggers Azure CLI's update-availability check, which is the slow part.

                      I'd be happy to open a PR for (1)+(2) with a test mirroring the existing VcsProcessTimeoutError coverage, if you're open to it.

                      Impact

                      Major degradation or frequent failure — the Azure DevOps connector is effectively unusable on any Windows host where az --version exceeds 5 s (common, given Azure CLI is Python-based and runs an update check). Same practical severity as pingdotgg/t3code#2576.

                      Version or commit

                      main @ 18fa89c

                      Environment

                      Windows 11 Pro 10.0.26200; Azure CLI az 2.87.0 + azure-devops extension 1.0.6 (at …\CLI2\wbin\az.cmd), authenticated (org urbanlighthouse); Node v24.15.0 / Bun 1.3.13.

                      Logs or stack traces

                      # t3code server logs (post-restart, confirmed new PID):
                      source-control.discovery.probe az --version Failure 5815ms
                      source-control.discovery.probe az --version Failure 7389ms
                      source-control.discovery.probe az --version Failure 7831ms
                      source-control.discovery.probe az --version Failure 5817ms
                      # Direct timings on the same machine:
                      az --version ~6232-7286 ms
                      az account show --query user.name -o tsv ~1100 ms

                      Relationship to other issues

                      • pingdotgg/t3code#2576 (closed/COMPLETED) — predecessor: VcsProcessSpawnError because Windows az is az.cmd and spawn couldn't resolve it. Different root cause (fails instantly at the spawn boundary). Its fix is what lets az now run long enough to hit this timeout.
                      • pingdotgg/t3code#2537 (open) — cosmetic cmd.exe/conhost flashes from the same provider-probe / VCS-process-kill paths. Different symptom, same subsystem.
                      • pingdotgg/t3code#3525 (open) — a separate hard-coded 5 s timeout causing problems (background git fetch), suggesting the 5 s budget is a recurring foot-gun worth revisiting broadly.

                      Workaround

                      None reliable from the user side — the CLI is already installed and authenticated. Restarting/reinstalling az does not help because the probe keeps timing out.

                      Metadata

                      Metadata

                      Assignees

                      No one assigned

                        Labels

                        No labels
                        No labels

                        Projects

                        No projects

                          Milestone

                          No milestone

                          Relationships

                          None yet

                          Development

                          No branches or pull requests

                          Issue actions

                          , '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

                          [Bug]: Azure DevOps source control shows "not available" on Windows because the 5s CLI probe times out on slow az --version (misclassified as missing) #4

                          Description

                          @eddy-curly

                          Before submitting

                          • I searched existing issues and did not find a duplicate. (Closest is pingdotgg/t3code#2576, a different root cause — see "Relationship to other issues".)
                          • I included enough detail to reproduce or investigate the problem.

                          Area

                          apps/server (source-control discovery). Surfaces in the desktop app's Settings → Source Control Providers UI.

                          Summary

                          On Windows, the Azure DevOps connector reports "not available" and shows the install az hint even when the Azure CLI is installed, on PATH, and authenticated. The real cause is not a missing install — it's that the discovery probe runs az --version under a hard-coded 5 s timeout, and az --version on Windows routinely takes 6–8 s (Python startup + the "updates available" check). The probe times out, and the timeout is misclassified as status: "missing", which renders the install hint and skips the (fast, ~1 s) auth check.

                          This is the next Windows failure mode after pingdotgg/t3code#2576: once az.cmd spawn resolution was fixed, az actually runs — and now it runs too slowly for the 5 s probe budget.

                          Steps to reproduce

                          1. On Windows, install Azure CLI (az 2.87.0) + the azure-devops extension (1.0.6), on the machine PATH.
                          2. az login and confirm auth: az account show --query user.name -o tsv returns your user (~1 s).
                          3. Confirm az --version works but is slow — on an affected machine it takes ~6–8 s (Azure CLI prints "N updates available" on --version).
                          4. Open T3 Code → Settings → Source Control Providers → Azure DevOps.
                          5. The connector shows "not available" with the "Install the Azure command-line tools (az) …" hint, even though az is installed and authenticated.

                          Measured on the reporting machine: az --version = 7,286 / 6,232 / 5,872 ms across runs; az account show … = ~1.1 s. Server logs show the source-control.discovery.probe operations returning Failure at 5,815 / 7,389 / 7,831 / 5,817 ms — i.e. interrupted at the 5 s ceiling (the >5 s tail is the time to tear down the az.cmd → python process tree on Windows).

                          Expected behavior

                          • A CLI that is installed and authenticated but slow to answer --version should be detected as present, not reported as missing.
                          • A probe timeout must be distinguished from not installed (ENOENT). Only a genuine spawn failure should render the "install az" hint.
                          • The fast auth check (az account show) should still run when the version probe is merely slow.

                          Actual behavior

                          The probe times out at 5 s, the timeout is collapsed into status: "missing", the install hint is shown, the auth check is skipped, and a misleading "Hosting integration command was not found on the server PATH." detail is emitted — even though az is on PATH and works.

                          Root cause (code references, at main @ 18fa89c4a)

                          Line numbers are for the TypeScript source (the shipped dist/bin.mjs is the bundled form of the same logic).

                          1. Discovery specapps/server/src/sourceControl/AzureDevOpsSourceControlProvider.ts:41-51
                            executable: "az", versionArgs: ["--version"], authArgs: ["account","show","--query","user.name","-o","tsv"].

                          2. Hard-coded 5 s probe timeout + catch-all → "missing"apps/server/src/sourceControl/SourceControlProviderDiscovery.ts:159-201
                            probeCli passes timeoutMs: 5_000 (line 170), and its Effect.catch((cause) => …) (lines 189-199) maps every failure — timeout, spawn error, crash — to status: "missing". Note this is a 6× under-cut of the module's own DEFAULT_TIMEOUT_MS = 30_000 (apps/server/src/vcs/VcsProcess.ts:49).

                          3. Short-circuit skips the auth checkapps/server/src/sourceControl/SourceControlProviderDiscovery.ts:232-238
                            When status !== "available", probeSourceControlProvider returns early with unknownAuth("Hosting integration command was not found on the server PATH.") and never runs authArgs (az account show).

                          4. The information to fix this already exists.apps/server/src/vcs/VcsProcess.ts:112 sets timeoutBehavior: "error", and the mapper at VcsProcess.ts:115-140 produces distinct typed errorsVcsProcessTimeoutError for a timeout vs VcsProcessSpawnError for ENOENT (both asserted in VcsProcess.test.ts). probeCli's untyped catch simply discards that distinction.

                          Decisive signal: a genuinely missing az fails as VcsProcessSpawnError in milliseconds; the observed failures at 5.8–7.8 s are the timeout signature, not absence. No reinstall changes a >5 s answer to --version.

                          Proposed fix (small, focused)

                          1. Stop hard-coding timeoutMs: 5_000 in probeCli — inherit the 30 s default, or raise to ~15–30 s (optionally configurable).
                          2. In probeCli's catch, branch on the cause tag: only VcsProcessSpawnErrorstatus: "missing" (install hint). A VcsProcessTimeoutError should be a distinct "present but slow / probe timed out" state that preserves the real detail and still attempts the fast auth command.
                          3. Optional: use the fast az account show (the existing authArgs) as the presence signal instead of az --version, since --version triggers Azure CLI's update-availability check, which is the slow part.

                          I'd be happy to open a PR for (1)+(2) with a test mirroring the existing VcsProcessTimeoutError coverage, if you're open to it.

                          Impact

                          Major degradation or frequent failure — the Azure DevOps connector is effectively unusable on any Windows host where az --version exceeds 5 s (common, given Azure CLI is Python-based and runs an update check). Same practical severity as pingdotgg/t3code#2576.

                          Version or commit

                          main @ 18fa89c

                          Environment

                          Windows 11 Pro 10.0.26200; Azure CLI az 2.87.0 + azure-devops extension 1.0.6 (at …\CLI2\wbin\az.cmd), authenticated (org urbanlighthouse); Node v24.15.0 / Bun 1.3.13.

                          Logs or stack traces

                          # t3code server logs (post-restart, confirmed new PID):
                          source-control.discovery.probe az --version Failure 5815ms
                          source-control.discovery.probe az --version Failure 7389ms
                          source-control.discovery.probe az --version Failure 7831ms
                          source-control.discovery.probe az --version Failure 5817ms
                          # Direct timings on the same machine:
                          az --version ~6232-7286 ms
                          az account show --query user.name -o tsv ~1100 ms

                          Relationship to other issues

                          • pingdotgg/t3code#2576 (closed/COMPLETED) — predecessor: VcsProcessSpawnError because Windows az is az.cmd and spawn couldn't resolve it. Different root cause (fails instantly at the spawn boundary). Its fix is what lets az now run long enough to hit this timeout.
                          • pingdotgg/t3code#2537 (open) — cosmetic cmd.exe/conhost flashes from the same provider-probe / VCS-process-kill paths. Different symptom, same subsystem.
                          • pingdotgg/t3code#3525 (open) — a separate hard-coded 5 s timeout causing problems (background git fetch), suggesting the 5 s budget is a recurring foot-gun worth revisiting broadly.

                          Workaround

                          None reliable from the user side — the CLI is already installed and authenticated. Restarting/reinstalling az does not help because the probe keeps timing out.

                          Metadata

                          Metadata

                          Assignees

                          No one assigned

                            Labels

                            No labels
                            No labels

                            Projects

                            No projects

                              Milestone

                              No milestone

                              Relationships

                              None yet

                              Development

                              No branches or pull requests

                              Issue actions

                              , '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

                              [Bug]: Azure DevOps source control shows "not available" on Windows because the 5s CLI probe times out on slow az --version (misclassified as missing) #4

                              Description

                              @eddy-curly

                              Before submitting

                              • I searched existing issues and did not find a duplicate. (Closest is pingdotgg/t3code#2576, a different root cause — see "Relationship to other issues".)
                              • I included enough detail to reproduce or investigate the problem.

                              Area

                              apps/server (source-control discovery). Surfaces in the desktop app's Settings → Source Control Providers UI.

                              Summary

                              On Windows, the Azure DevOps connector reports "not available" and shows the install az hint even when the Azure CLI is installed, on PATH, and authenticated. The real cause is not a missing install — it's that the discovery probe runs az --version under a hard-coded 5 s timeout, and az --version on Windows routinely takes 6–8 s (Python startup + the "updates available" check). The probe times out, and the timeout is misclassified as status: "missing", which renders the install hint and skips the (fast, ~1 s) auth check.

                              This is the next Windows failure mode after pingdotgg/t3code#2576: once az.cmd spawn resolution was fixed, az actually runs — and now it runs too slowly for the 5 s probe budget.

                              Steps to reproduce

                              1. On Windows, install Azure CLI (az 2.87.0) + the azure-devops extension (1.0.6), on the machine PATH.
                              2. az login and confirm auth: az account show --query user.name -o tsv returns your user (~1 s).
                              3. Confirm az --version works but is slow — on an affected machine it takes ~6–8 s (Azure CLI prints "N updates available" on --version).
                              4. Open T3 Code → Settings → Source Control Providers → Azure DevOps.
                              5. The connector shows "not available" with the "Install the Azure command-line tools (az) …" hint, even though az is installed and authenticated.

                              Measured on the reporting machine: az --version = 7,286 / 6,232 / 5,872 ms across runs; az account show … = ~1.1 s. Server logs show the source-control.discovery.probe operations returning Failure at 5,815 / 7,389 / 7,831 / 5,817 ms — i.e. interrupted at the 5 s ceiling (the >5 s tail is the time to tear down the az.cmd → python process tree on Windows).

                              Expected behavior

                              • A CLI that is installed and authenticated but slow to answer --version should be detected as present, not reported as missing.
                              • A probe timeout must be distinguished from not installed (ENOENT). Only a genuine spawn failure should render the "install az" hint.
                              • The fast auth check (az account show) should still run when the version probe is merely slow.

                              Actual behavior

                              The probe times out at 5 s, the timeout is collapsed into status: "missing", the install hint is shown, the auth check is skipped, and a misleading "Hosting integration command was not found on the server PATH." detail is emitted — even though az is on PATH and works.

                              Root cause (code references, at main @ 18fa89c4a)

                              Line numbers are for the TypeScript source (the shipped dist/bin.mjs is the bundled form of the same logic).

                              1. Discovery specapps/server/src/sourceControl/AzureDevOpsSourceControlProvider.ts:41-51
                                executable: "az", versionArgs: ["--version"], authArgs: ["account","show","--query","user.name","-o","tsv"].

                              2. Hard-coded 5 s probe timeout + catch-all → "missing"apps/server/src/sourceControl/SourceControlProviderDiscovery.ts:159-201
                                probeCli passes timeoutMs: 5_000 (line 170), and its Effect.catch((cause) => …) (lines 189-199) maps every failure — timeout, spawn error, crash — to status: "missing". Note this is a 6× under-cut of the module's own DEFAULT_TIMEOUT_MS = 30_000 (apps/server/src/vcs/VcsProcess.ts:49).

                              3. Short-circuit skips the auth checkapps/server/src/sourceControl/SourceControlProviderDiscovery.ts:232-238
                                When status !== "available", probeSourceControlProvider returns early with unknownAuth("Hosting integration command was not found on the server PATH.") and never runs authArgs (az account show).

                              4. The information to fix this already exists.apps/server/src/vcs/VcsProcess.ts:112 sets timeoutBehavior: "error", and the mapper at VcsProcess.ts:115-140 produces distinct typed errorsVcsProcessTimeoutError for a timeout vs VcsProcessSpawnError for ENOENT (both asserted in VcsProcess.test.ts). probeCli's untyped catch simply discards that distinction.

                              Decisive signal: a genuinely missing az fails as VcsProcessSpawnError in milliseconds; the observed failures at 5.8–7.8 s are the timeout signature, not absence. No reinstall changes a >5 s answer to --version.

                              Proposed fix (small, focused)

                              1. Stop hard-coding timeoutMs: 5_000 in probeCli — inherit the 30 s default, or raise to ~15–30 s (optionally configurable).
                              2. In probeCli's catch, branch on the cause tag: only VcsProcessSpawnErrorstatus: "missing" (install hint). A VcsProcessTimeoutError should be a distinct "present but slow / probe timed out" state that preserves the real detail and still attempts the fast auth command.
                              3. Optional: use the fast az account show (the existing authArgs) as the presence signal instead of az --version, since --version triggers Azure CLI's update-availability check, which is the slow part.

                              I'd be happy to open a PR for (1)+(2) with a test mirroring the existing VcsProcessTimeoutError coverage, if you're open to it.

                              Impact

                              Major degradation or frequent failure — the Azure DevOps connector is effectively unusable on any Windows host where az --version exceeds 5 s (common, given Azure CLI is Python-based and runs an update check). Same practical severity as pingdotgg/t3code#2576.

                              Version or commit

                              main @ 18fa89c

                              Environment

                              Windows 11 Pro 10.0.26200; Azure CLI az 2.87.0 + azure-devops extension 1.0.6 (at …\CLI2\wbin\az.cmd), authenticated (org urbanlighthouse); Node v24.15.0 / Bun 1.3.13.

                              Logs or stack traces

                              # t3code server logs (post-restart, confirmed new PID):
                              source-control.discovery.probe az --version Failure 5815ms
                              source-control.discovery.probe az --version Failure 7389ms
                              source-control.discovery.probe az --version Failure 7831ms
                              source-control.discovery.probe az --version Failure 5817ms
                              # Direct timings on the same machine:
                              az --version ~6232-7286 ms
                              az account show --query user.name -o tsv ~1100 ms

                              Relationship to other issues

                              • pingdotgg/t3code#2576 (closed/COMPLETED) — predecessor: VcsProcessSpawnError because Windows az is az.cmd and spawn couldn't resolve it. Different root cause (fails instantly at the spawn boundary). Its fix is what lets az now run long enough to hit this timeout.
                              • pingdotgg/t3code#2537 (open) — cosmetic cmd.exe/conhost flashes from the same provider-probe / VCS-process-kill paths. Different symptom, same subsystem.
                              • pingdotgg/t3code#3525 (open) — a separate hard-coded 5 s timeout causing problems (background git fetch), suggesting the 5 s budget is a recurring foot-gun worth revisiting broadly.

                              Workaround

                              None reliable from the user side — the CLI is already installed and authenticated. Restarting/reinstalling az does not help because the probe keeps timing out.

                              Metadata

                              Metadata

                              Assignees

                              No one assigned

                                Labels

                                No labels
                                No labels

                                Projects

                                No projects

                                  Milestone

                                  No milestone

                                  Relationships

                                  None yet

                                  Development

                                  No branches or pull requests

                                  Issue actions