fix(desktop): reduce update restart time - #4777

Open
0x4bs3nt wants to merge 7 commits into
pingdotgg:mainfrom
0x4bs3nt:fix/faster-desktop-update-restarts
Open

fix(desktop): reduce update restart time#4777
0x4bs3nt wants to merge 7 commits into
pingdotgg:mainfrom
0x4bs3nt:fix/faster-desktop-update-restarts

Conversation

@0x4bs3nt

@0x4bs3nt0x4bs3nt commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

What Changed

  • Pre-stage macOS updates during the download phase so the Restart action is only enabled once Squirrel has finished preparing the update.
  • Show a clear “Preparing update…” state while the updater is taking over.
  • Only force-destroy application windows on Windows, where NSIS requires it. macOS and Linux retain their normal quit lifecycle.
  • Show an immediate startup splash when reopening after an update.
  • Keep JavaScript dependencies inside ASAR on macOS and Linux while preserving the existing broad unpacking required for Windows WSL support.
  • Continue unpacking native modules and executables such as Claude, node-pty, passkeys, ffi-rs, and fff.

Why

Restarting after an update could appear to do nothing for around 20 seconds or longer.

Most of that delay came from two bottlenecks:

  1. Squirrel’s native update preparation did not begin until the user clicked Restart.
  2. The packaged application contained roughly 14,500 unpacked files, all of which Squirrel had to process individually.

This change moves native macOS preparation into the download flow and reduces the unpacked application tree to 184 files in a test package. The remaining restart flow is primarily normal application and backend startup, while the user receives visible feedback throughout the transition.

The platform-specific behavior is preserved:

  • macOS uses native pre-staging.
  • Windows retains the unpacking and window shutdown behavior required by WSL and NSIS.
  • Linux continues using its existing AppImage installation lifecycle.

UI Changes

  • The update control now displays “Preparing update…” instead of appearing stuck at 100% downloaded.
  • The update action is disabled while the updater is taking over, preventing duplicate restart attempts.
  • The first launch after an update immediately displays a “Starting T3 Code…” splash while the backend reconnects.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes - not applicable
  • I included a video for animation/interaction changes - not applicable

Note

Medium Risk
Changes core desktop update and quit/relaunch paths across platforms with new async coordination on macOS; behavior is heavily tested in this PR but regressions would affect all packaged users during updates.

Overview
Moves macOS Squirrel native staging into the download flow so Restart is only offered after electron.autoUpdater reports the staged app is ready, with a “Preparing update…” state instead of looking stuck at 100% downloaded.

Install/relaunch behavior now persists a one-shot relaunch marker before quitAndInstall, clears it on failed installs, shows a “Starting T3 Code…” startup splash when the marker is consumed, and only force-destroys windows on Windows (NSIS); macOS and Linux keep their normal quit lifecycle. autoInstallOnAppQuit is enabled only on darwin to drive native pre-staging.

Startup splashshowConnectingSplash takes a reason (wsl vs update-relaunch) and can refresh copy on an existing splash. Web update UI disables actions and shows “Preparing…” during staging and pre-install takeover.

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

Note

Reduce update restart time by pre-staging macOS updates natively and showing a preparing splash

  • On macOS, the update download now waits for the native Electron autoUpdaterupdate-downloaded event before completing, enabling OS-level pre-staging before restart.
  • A persistent relaunch marker (DesktopUpdateRelaunch) is written before quit and consumed at startup to show a 'Starting T3 Code…' splash instead of a cold-boot splash.
  • showConnectingSplash in DesktopWindow.ts now takes a ConnectingSplashReason ('wsl' | 'update-relaunch') and can refresh an existing splash in-place when the reason changes.
  • UI surfaces (sidebar pill, settings button, tooltips) show a 'Preparing…' state during native staging via new isDesktopUpdatePreparing and isDesktopUpdatePreparingToInstall helpers.
  • Behavioral Change: on macOS, windows are no longer force-destroyed before quit; on Windows the existing destroy behavior is retained.

Macroscope summarized ff79a9b.

@coderabbitai

coderabbitaiBot commented Jul 28, 2026

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: f15b82ea-3c3e-41f5-8006-165699eec1ef

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
Comment threadapps/desktop/src/updates/DesktopUpdates.ts
Comment threadapps/desktop/src/updates/DesktopUpdates.ts
Comment threadapps/desktop/src/updates/DesktopUpdates.ts
Comment threadapps/desktop/src/updates/DesktopUpdates.ts
@macroscopeapp

macroscopeappBot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces new macOS-specific native update pre-staging functionality, adding persistent marker files, deferred async coordination, platform-specific behavioral differences, and new UI states. These are significant runtime behavior changes to the update/restart flow that warrant human review.

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

Comment threadapps/desktop/src/updates/DesktopUpdates.ts
Comment threadapps/desktop/src/updates/DesktopUpdates.ts
Comment threadapps/desktop/src/updates/DesktopUpdates.ts
Comment threadapps/desktop/src/window/DesktopWindow.ts Outdated
@0x4bs3nt
0x4bs3ntforce-pushed the fix/faster-desktop-update-restarts branch from a256a88 to 16b01a9CompareJuly 29, 2026 21:30

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 16b01a9. Configure here.

Comment threadapps/desktop/src/app/DesktopApp.ts

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed against the Effect service conventions. One finding: a synthetic Error is manufactured only to satisfy a required cause on DesktopUpdaterReportedError, which also gives this locally-detected invariant a misleading updater-reported message. Everything else (namespace imports, make/layer shape, dependency acquisition via yield* Foo.Foo, scoped listener acquisition, catchTags usage) looks consistent with the conventions.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/desktop/src/updates/DesktopUpdates.ts Outdated
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.

1 participant

@0x4bs3nt
, '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(desktop): reduce update restart time - #4777

Open
0x4bs3nt wants to merge 7 commits into
pingdotgg:mainfrom
0x4bs3nt:fix/faster-desktop-update-restarts
Open

fix(desktop): reduce update restart time#4777
0x4bs3nt wants to merge 7 commits into
pingdotgg:mainfrom
0x4bs3nt:fix/faster-desktop-update-restarts

Conversation

@0x4bs3nt

@0x4bs3nt0x4bs3nt commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

What Changed

  • Pre-stage macOS updates during the download phase so the Restart action is only enabled once Squirrel has finished preparing the update.
  • Show a clear “Preparing update…” state while the updater is taking over.
  • Only force-destroy application windows on Windows, where NSIS requires it. macOS and Linux retain their normal quit lifecycle.
  • Show an immediate startup splash when reopening after an update.
  • Keep JavaScript dependencies inside ASAR on macOS and Linux while preserving the existing broad unpacking required for Windows WSL support.
  • Continue unpacking native modules and executables such as Claude, node-pty, passkeys, ffi-rs, and fff.

Why

Restarting after an update could appear to do nothing for around 20 seconds or longer.

Most of that delay came from two bottlenecks:

  1. Squirrel’s native update preparation did not begin until the user clicked Restart.
  2. The packaged application contained roughly 14,500 unpacked files, all of which Squirrel had to process individually.

This change moves native macOS preparation into the download flow and reduces the unpacked application tree to 184 files in a test package. The remaining restart flow is primarily normal application and backend startup, while the user receives visible feedback throughout the transition.

The platform-specific behavior is preserved:

  • macOS uses native pre-staging.
  • Windows retains the unpacking and window shutdown behavior required by WSL and NSIS.
  • Linux continues using its existing AppImage installation lifecycle.

UI Changes

  • The update control now displays “Preparing update…” instead of appearing stuck at 100% downloaded.
  • The update action is disabled while the updater is taking over, preventing duplicate restart attempts.
  • The first launch after an update immediately displays a “Starting T3 Code…” splash while the backend reconnects.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes - not applicable
  • I included a video for animation/interaction changes - not applicable

Note

Medium Risk
Changes core desktop update and quit/relaunch paths across platforms with new async coordination on macOS; behavior is heavily tested in this PR but regressions would affect all packaged users during updates.

Overview
Moves macOS Squirrel native staging into the download flow so Restart is only offered after electron.autoUpdater reports the staged app is ready, with a “Preparing update…” state instead of looking stuck at 100% downloaded.

Install/relaunch behavior now persists a one-shot relaunch marker before quitAndInstall, clears it on failed installs, shows a “Starting T3 Code…” startup splash when the marker is consumed, and only force-destroys windows on Windows (NSIS); macOS and Linux keep their normal quit lifecycle. autoInstallOnAppQuit is enabled only on darwin to drive native pre-staging.

Startup splashshowConnectingSplash takes a reason (wsl vs update-relaunch) and can refresh copy on an existing splash. Web update UI disables actions and shows “Preparing…” during staging and pre-install takeover.

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

Note

Reduce update restart time by pre-staging macOS updates natively and showing a preparing splash

  • On macOS, the update download now waits for the native Electron autoUpdaterupdate-downloaded event before completing, enabling OS-level pre-staging before restart.
  • A persistent relaunch marker (DesktopUpdateRelaunch) is written before quit and consumed at startup to show a 'Starting T3 Code…' splash instead of a cold-boot splash.
  • showConnectingSplash in DesktopWindow.ts now takes a ConnectingSplashReason ('wsl' | 'update-relaunch') and can refresh an existing splash in-place when the reason changes.
  • UI surfaces (sidebar pill, settings button, tooltips) show a 'Preparing…' state during native staging via new isDesktopUpdatePreparing and isDesktopUpdatePreparingToInstall helpers.
  • Behavioral Change: on macOS, windows are no longer force-destroyed before quit; on Windows the existing destroy behavior is retained.

Macroscope summarized ff79a9b.

@coderabbitai

coderabbitaiBot commented Jul 28, 2026

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: f15b82ea-3c3e-41f5-8006-165699eec1ef

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
Comment threadapps/desktop/src/updates/DesktopUpdates.ts
Comment threadapps/desktop/src/updates/DesktopUpdates.ts
Comment threadapps/desktop/src/updates/DesktopUpdates.ts
Comment threadapps/desktop/src/updates/DesktopUpdates.ts
@macroscopeapp

macroscopeappBot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces new macOS-specific native update pre-staging functionality, adding persistent marker files, deferred async coordination, platform-specific behavioral differences, and new UI states. These are significant runtime behavior changes to the update/restart flow that warrant human review.

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

Comment threadapps/desktop/src/updates/DesktopUpdates.ts
Comment threadapps/desktop/src/updates/DesktopUpdates.ts
Comment threadapps/desktop/src/updates/DesktopUpdates.ts
Comment threadapps/desktop/src/window/DesktopWindow.ts Outdated
@0x4bs3nt
0x4bs3ntforce-pushed the fix/faster-desktop-update-restarts branch from a256a88 to 16b01a9CompareJuly 29, 2026 21:30

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 16b01a9. Configure here.

Comment threadapps/desktop/src/app/DesktopApp.ts

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed against the Effect service conventions. One finding: a synthetic Error is manufactured only to satisfy a required cause on DesktopUpdaterReportedError, which also gives this locally-detected invariant a misleading updater-reported message. Everything else (namespace imports, make/layer shape, dependency acquisition via yield* Foo.Foo, scoped listener acquisition, catchTags usage) looks consistent with the conventions.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/desktop/src/updates/DesktopUpdates.ts Outdated
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.

1 participant

@0x4bs3nt
, '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(desktop): reduce update restart time - #4777

Open
0x4bs3nt wants to merge 7 commits into
pingdotgg:mainfrom
0x4bs3nt:fix/faster-desktop-update-restarts
Open

fix(desktop): reduce update restart time#4777
0x4bs3nt wants to merge 7 commits into
pingdotgg:mainfrom
0x4bs3nt:fix/faster-desktop-update-restarts

Conversation

@0x4bs3nt

@0x4bs3nt0x4bs3nt commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

What Changed

  • Pre-stage macOS updates during the download phase so the Restart action is only enabled once Squirrel has finished preparing the update.
  • Show a clear “Preparing update…” state while the updater is taking over.
  • Only force-destroy application windows on Windows, where NSIS requires it. macOS and Linux retain their normal quit lifecycle.
  • Show an immediate startup splash when reopening after an update.
  • Keep JavaScript dependencies inside ASAR on macOS and Linux while preserving the existing broad unpacking required for Windows WSL support.
  • Continue unpacking native modules and executables such as Claude, node-pty, passkeys, ffi-rs, and fff.

Why

Restarting after an update could appear to do nothing for around 20 seconds or longer.

Most of that delay came from two bottlenecks:

  1. Squirrel’s native update preparation did not begin until the user clicked Restart.
  2. The packaged application contained roughly 14,500 unpacked files, all of which Squirrel had to process individually.

This change moves native macOS preparation into the download flow and reduces the unpacked application tree to 184 files in a test package. The remaining restart flow is primarily normal application and backend startup, while the user receives visible feedback throughout the transition.

The platform-specific behavior is preserved:

  • macOS uses native pre-staging.
  • Windows retains the unpacking and window shutdown behavior required by WSL and NSIS.
  • Linux continues using its existing AppImage installation lifecycle.

UI Changes

  • The update control now displays “Preparing update…” instead of appearing stuck at 100% downloaded.
  • The update action is disabled while the updater is taking over, preventing duplicate restart attempts.
  • The first launch after an update immediately displays a “Starting T3 Code…” splash while the backend reconnects.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes - not applicable
  • I included a video for animation/interaction changes - not applicable

Note

Medium Risk
Changes core desktop update and quit/relaunch paths across platforms with new async coordination on macOS; behavior is heavily tested in this PR but regressions would affect all packaged users during updates.

Overview
Moves macOS Squirrel native staging into the download flow so Restart is only offered after electron.autoUpdater reports the staged app is ready, with a “Preparing update…” state instead of looking stuck at 100% downloaded.

Install/relaunch behavior now persists a one-shot relaunch marker before quitAndInstall, clears it on failed installs, shows a “Starting T3 Code…” startup splash when the marker is consumed, and only force-destroys windows on Windows (NSIS); macOS and Linux keep their normal quit lifecycle. autoInstallOnAppQuit is enabled only on darwin to drive native pre-staging.

Startup splashshowConnectingSplash takes a reason (wsl vs update-relaunch) and can refresh copy on an existing splash. Web update UI disables actions and shows “Preparing…” during staging and pre-install takeover.

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

Note

Reduce update restart time by pre-staging macOS updates natively and showing a preparing splash

  • On macOS, the update download now waits for the native Electron autoUpdaterupdate-downloaded event before completing, enabling OS-level pre-staging before restart.
  • A persistent relaunch marker (DesktopUpdateRelaunch) is written before quit and consumed at startup to show a 'Starting T3 Code…' splash instead of a cold-boot splash.
  • showConnectingSplash in DesktopWindow.ts now takes a ConnectingSplashReason ('wsl' | 'update-relaunch') and can refresh an existing splash in-place when the reason changes.
  • UI surfaces (sidebar pill, settings button, tooltips) show a 'Preparing…' state during native staging via new isDesktopUpdatePreparing and isDesktopUpdatePreparingToInstall helpers.
  • Behavioral Change: on macOS, windows are no longer force-destroyed before quit; on Windows the existing destroy behavior is retained.

Macroscope summarized ff79a9b.

@coderabbitai

coderabbitaiBot commented Jul 28, 2026

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: f15b82ea-3c3e-41f5-8006-165699eec1ef

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
Comment threadapps/desktop/src/updates/DesktopUpdates.ts
Comment threadapps/desktop/src/updates/DesktopUpdates.ts
Comment threadapps/desktop/src/updates/DesktopUpdates.ts
Comment threadapps/desktop/src/updates/DesktopUpdates.ts
@macroscopeapp

macroscopeappBot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces new macOS-specific native update pre-staging functionality, adding persistent marker files, deferred async coordination, platform-specific behavioral differences, and new UI states. These are significant runtime behavior changes to the update/restart flow that warrant human review.

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

Comment threadapps/desktop/src/updates/DesktopUpdates.ts
Comment threadapps/desktop/src/updates/DesktopUpdates.ts
Comment threadapps/desktop/src/updates/DesktopUpdates.ts
Comment threadapps/desktop/src/window/DesktopWindow.ts Outdated
@0x4bs3nt
0x4bs3ntforce-pushed the fix/faster-desktop-update-restarts branch from a256a88 to 16b01a9CompareJuly 29, 2026 21:30

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 16b01a9. Configure here.

Comment threadapps/desktop/src/app/DesktopApp.ts

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed against the Effect service conventions. One finding: a synthetic Error is manufactured only to satisfy a required cause on DesktopUpdaterReportedError, which also gives this locally-detected invariant a misleading updater-reported message. Everything else (namespace imports, make/layer shape, dependency acquisition via yield* Foo.Foo, scoped listener acquisition, catchTags usage) looks consistent with the conventions.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/desktop/src/updates/DesktopUpdates.ts Outdated
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.

1 participant

@0x4bs3nt
, '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(desktop): reduce update restart time - #4777

Open
0x4bs3nt wants to merge 7 commits into
pingdotgg:mainfrom
0x4bs3nt:fix/faster-desktop-update-restarts
Open

fix(desktop): reduce update restart time#4777
0x4bs3nt wants to merge 7 commits into
pingdotgg:mainfrom
0x4bs3nt:fix/faster-desktop-update-restarts

Conversation

@0x4bs3nt

@0x4bs3nt0x4bs3nt commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

What Changed

  • Pre-stage macOS updates during the download phase so the Restart action is only enabled once Squirrel has finished preparing the update.
  • Show a clear “Preparing update…” state while the updater is taking over.
  • Only force-destroy application windows on Windows, where NSIS requires it. macOS and Linux retain their normal quit lifecycle.
  • Show an immediate startup splash when reopening after an update.
  • Keep JavaScript dependencies inside ASAR on macOS and Linux while preserving the existing broad unpacking required for Windows WSL support.
  • Continue unpacking native modules and executables such as Claude, node-pty, passkeys, ffi-rs, and fff.

Why

Restarting after an update could appear to do nothing for around 20 seconds or longer.

Most of that delay came from two bottlenecks:

  1. Squirrel’s native update preparation did not begin until the user clicked Restart.
  2. The packaged application contained roughly 14,500 unpacked files, all of which Squirrel had to process individually.

This change moves native macOS preparation into the download flow and reduces the unpacked application tree to 184 files in a test package. The remaining restart flow is primarily normal application and backend startup, while the user receives visible feedback throughout the transition.

The platform-specific behavior is preserved:

  • macOS uses native pre-staging.
  • Windows retains the unpacking and window shutdown behavior required by WSL and NSIS.
  • Linux continues using its existing AppImage installation lifecycle.

UI Changes

  • The update control now displays “Preparing update…” instead of appearing stuck at 100% downloaded.
  • The update action is disabled while the updater is taking over, preventing duplicate restart attempts.
  • The first launch after an update immediately displays a “Starting T3 Code…” splash while the backend reconnects.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes - not applicable
  • I included a video for animation/interaction changes - not applicable

Note

Medium Risk
Changes core desktop update and quit/relaunch paths across platforms with new async coordination on macOS; behavior is heavily tested in this PR but regressions would affect all packaged users during updates.

Overview
Moves macOS Squirrel native staging into the download flow so Restart is only offered after electron.autoUpdater reports the staged app is ready, with a “Preparing update…” state instead of looking stuck at 100% downloaded.

Install/relaunch behavior now persists a one-shot relaunch marker before quitAndInstall, clears it on failed installs, shows a “Starting T3 Code…” startup splash when the marker is consumed, and only force-destroys windows on Windows (NSIS); macOS and Linux keep their normal quit lifecycle. autoInstallOnAppQuit is enabled only on darwin to drive native pre-staging.

Startup splashshowConnectingSplash takes a reason (wsl vs update-relaunch) and can refresh copy on an existing splash. Web update UI disables actions and shows “Preparing…” during staging and pre-install takeover.

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

Note

Reduce update restart time by pre-staging macOS updates natively and showing a preparing splash

  • On macOS, the update download now waits for the native Electron autoUpdaterupdate-downloaded event before completing, enabling OS-level pre-staging before restart.
  • A persistent relaunch marker (DesktopUpdateRelaunch) is written before quit and consumed at startup to show a 'Starting T3 Code…' splash instead of a cold-boot splash.
  • showConnectingSplash in DesktopWindow.ts now takes a ConnectingSplashReason ('wsl' | 'update-relaunch') and can refresh an existing splash in-place when the reason changes.
  • UI surfaces (sidebar pill, settings button, tooltips) show a 'Preparing…' state during native staging via new isDesktopUpdatePreparing and isDesktopUpdatePreparingToInstall helpers.
  • Behavioral Change: on macOS, windows are no longer force-destroyed before quit; on Windows the existing destroy behavior is retained.

Macroscope summarized ff79a9b.

@coderabbitai

coderabbitaiBot commented Jul 28, 2026

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: f15b82ea-3c3e-41f5-8006-165699eec1ef

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
Comment threadapps/desktop/src/updates/DesktopUpdates.ts
Comment threadapps/desktop/src/updates/DesktopUpdates.ts
Comment threadapps/desktop/src/updates/DesktopUpdates.ts
Comment threadapps/desktop/src/updates/DesktopUpdates.ts
@macroscopeapp

macroscopeappBot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces new macOS-specific native update pre-staging functionality, adding persistent marker files, deferred async coordination, platform-specific behavioral differences, and new UI states. These are significant runtime behavior changes to the update/restart flow that warrant human review.

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

Comment threadapps/desktop/src/updates/DesktopUpdates.ts
Comment threadapps/desktop/src/updates/DesktopUpdates.ts
Comment threadapps/desktop/src/updates/DesktopUpdates.ts
Comment threadapps/desktop/src/window/DesktopWindow.ts Outdated
@0x4bs3nt
0x4bs3ntforce-pushed the fix/faster-desktop-update-restarts branch from a256a88 to 16b01a9CompareJuly 29, 2026 21:30

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 16b01a9. Configure here.

Comment threadapps/desktop/src/app/DesktopApp.ts

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed against the Effect service conventions. One finding: a synthetic Error is manufactured only to satisfy a required cause on DesktopUpdaterReportedError, which also gives this locally-detected invariant a misleading updater-reported message. Everything else (namespace imports, make/layer shape, dependency acquisition via yield* Foo.Foo, scoped listener acquisition, catchTags usage) looks consistent with the conventions.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/desktop/src/updates/DesktopUpdates.ts Outdated
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.

1 participant

@0x4bs3nt
, '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(desktop): reduce update restart time - #4777

Open
0x4bs3nt wants to merge 7 commits into
pingdotgg:mainfrom
0x4bs3nt:fix/faster-desktop-update-restarts
Open

fix(desktop): reduce update restart time#4777
0x4bs3nt wants to merge 7 commits into
pingdotgg:mainfrom
0x4bs3nt:fix/faster-desktop-update-restarts

Conversation

@0x4bs3nt

@0x4bs3nt0x4bs3nt commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

What Changed

  • Pre-stage macOS updates during the download phase so the Restart action is only enabled once Squirrel has finished preparing the update.
  • Show a clear “Preparing update…” state while the updater is taking over.
  • Only force-destroy application windows on Windows, where NSIS requires it. macOS and Linux retain their normal quit lifecycle.
  • Show an immediate startup splash when reopening after an update.
  • Keep JavaScript dependencies inside ASAR on macOS and Linux while preserving the existing broad unpacking required for Windows WSL support.
  • Continue unpacking native modules and executables such as Claude, node-pty, passkeys, ffi-rs, and fff.

Why

Restarting after an update could appear to do nothing for around 20 seconds or longer.

Most of that delay came from two bottlenecks:

  1. Squirrel’s native update preparation did not begin until the user clicked Restart.
  2. The packaged application contained roughly 14,500 unpacked files, all of which Squirrel had to process individually.

This change moves native macOS preparation into the download flow and reduces the unpacked application tree to 184 files in a test package. The remaining restart flow is primarily normal application and backend startup, while the user receives visible feedback throughout the transition.

The platform-specific behavior is preserved:

  • macOS uses native pre-staging.
  • Windows retains the unpacking and window shutdown behavior required by WSL and NSIS.
  • Linux continues using its existing AppImage installation lifecycle.

UI Changes

  • The update control now displays “Preparing update…” instead of appearing stuck at 100% downloaded.
  • The update action is disabled while the updater is taking over, preventing duplicate restart attempts.
  • The first launch after an update immediately displays a “Starting T3 Code…” splash while the backend reconnects.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes - not applicable
  • I included a video for animation/interaction changes - not applicable

Note

Medium Risk
Changes core desktop update and quit/relaunch paths across platforms with new async coordination on macOS; behavior is heavily tested in this PR but regressions would affect all packaged users during updates.

Overview
Moves macOS Squirrel native staging into the download flow so Restart is only offered after electron.autoUpdater reports the staged app is ready, with a “Preparing update…” state instead of looking stuck at 100% downloaded.

Install/relaunch behavior now persists a one-shot relaunch marker before quitAndInstall, clears it on failed installs, shows a “Starting T3 Code…” startup splash when the marker is consumed, and only force-destroys windows on Windows (NSIS); macOS and Linux keep their normal quit lifecycle. autoInstallOnAppQuit is enabled only on darwin to drive native pre-staging.

Startup splashshowConnectingSplash takes a reason (wsl vs update-relaunch) and can refresh copy on an existing splash. Web update UI disables actions and shows “Preparing…” during staging and pre-install takeover.

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

Note

Reduce update restart time by pre-staging macOS updates natively and showing a preparing splash

  • On macOS, the update download now waits for the native Electron autoUpdaterupdate-downloaded event before completing, enabling OS-level pre-staging before restart.
  • A persistent relaunch marker (DesktopUpdateRelaunch) is written before quit and consumed at startup to show a 'Starting T3 Code…' splash instead of a cold-boot splash.
  • showConnectingSplash in DesktopWindow.ts now takes a ConnectingSplashReason ('wsl' | 'update-relaunch') and can refresh an existing splash in-place when the reason changes.
  • UI surfaces (sidebar pill, settings button, tooltips) show a 'Preparing…' state during native staging via new isDesktopUpdatePreparing and isDesktopUpdatePreparingToInstall helpers.
  • Behavioral Change: on macOS, windows are no longer force-destroyed before quit; on Windows the existing destroy behavior is retained.

Macroscope summarized ff79a9b.

@coderabbitai

coderabbitaiBot commented Jul 28, 2026

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: f15b82ea-3c3e-41f5-8006-165699eec1ef

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
Comment threadapps/desktop/src/updates/DesktopUpdates.ts
Comment threadapps/desktop/src/updates/DesktopUpdates.ts
Comment threadapps/desktop/src/updates/DesktopUpdates.ts
Comment threadapps/desktop/src/updates/DesktopUpdates.ts
@macroscopeapp

macroscopeappBot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces new macOS-specific native update pre-staging functionality, adding persistent marker files, deferred async coordination, platform-specific behavioral differences, and new UI states. These are significant runtime behavior changes to the update/restart flow that warrant human review.

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

Comment threadapps/desktop/src/updates/DesktopUpdates.ts
Comment threadapps/desktop/src/updates/DesktopUpdates.ts
Comment threadapps/desktop/src/updates/DesktopUpdates.ts
Comment threadapps/desktop/src/window/DesktopWindow.ts Outdated
@0x4bs3nt
0x4bs3ntforce-pushed the fix/faster-desktop-update-restarts branch from a256a88 to 16b01a9CompareJuly 29, 2026 21:30

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 16b01a9. Configure here.

Comment threadapps/desktop/src/app/DesktopApp.ts

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed against the Effect service conventions. One finding: a synthetic Error is manufactured only to satisfy a required cause on DesktopUpdaterReportedError, which also gives this locally-detected invariant a misleading updater-reported message. Everything else (namespace imports, make/layer shape, dependency acquisition via yield* Foo.Foo, scoped listener acquisition, catchTags usage) looks consistent with the conventions.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/desktop/src/updates/DesktopUpdates.ts Outdated
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.

1 participant

@0x4bs3nt
, '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(desktop): reduce update restart time - #4777

Open
0x4bs3nt wants to merge 7 commits into
pingdotgg:mainfrom
0x4bs3nt:fix/faster-desktop-update-restarts
Open

fix(desktop): reduce update restart time#4777
0x4bs3nt wants to merge 7 commits into
pingdotgg:mainfrom
0x4bs3nt:fix/faster-desktop-update-restarts

Conversation

@0x4bs3nt

@0x4bs3nt0x4bs3nt commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

What Changed

  • Pre-stage macOS updates during the download phase so the Restart action is only enabled once Squirrel has finished preparing the update.
  • Show a clear “Preparing update…” state while the updater is taking over.
  • Only force-destroy application windows on Windows, where NSIS requires it. macOS and Linux retain their normal quit lifecycle.
  • Show an immediate startup splash when reopening after an update.
  • Keep JavaScript dependencies inside ASAR on macOS and Linux while preserving the existing broad unpacking required for Windows WSL support.
  • Continue unpacking native modules and executables such as Claude, node-pty, passkeys, ffi-rs, and fff.

Why

Restarting after an update could appear to do nothing for around 20 seconds or longer.

Most of that delay came from two bottlenecks:

  1. Squirrel’s native update preparation did not begin until the user clicked Restart.
  2. The packaged application contained roughly 14,500 unpacked files, all of which Squirrel had to process individually.

This change moves native macOS preparation into the download flow and reduces the unpacked application tree to 184 files in a test package. The remaining restart flow is primarily normal application and backend startup, while the user receives visible feedback throughout the transition.

The platform-specific behavior is preserved:

  • macOS uses native pre-staging.
  • Windows retains the unpacking and window shutdown behavior required by WSL and NSIS.
  • Linux continues using its existing AppImage installation lifecycle.

UI Changes

  • The update control now displays “Preparing update…” instead of appearing stuck at 100% downloaded.
  • The update action is disabled while the updater is taking over, preventing duplicate restart attempts.
  • The first launch after an update immediately displays a “Starting T3 Code…” splash while the backend reconnects.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes - not applicable
  • I included a video for animation/interaction changes - not applicable

Note

Medium Risk
Changes core desktop update and quit/relaunch paths across platforms with new async coordination on macOS; behavior is heavily tested in this PR but regressions would affect all packaged users during updates.

Overview
Moves macOS Squirrel native staging into the download flow so Restart is only offered after electron.autoUpdater reports the staged app is ready, with a “Preparing update…” state instead of looking stuck at 100% downloaded.

Install/relaunch behavior now persists a one-shot relaunch marker before quitAndInstall, clears it on failed installs, shows a “Starting T3 Code…” startup splash when the marker is consumed, and only force-destroys windows on Windows (NSIS); macOS and Linux keep their normal quit lifecycle. autoInstallOnAppQuit is enabled only on darwin to drive native pre-staging.

Startup splashshowConnectingSplash takes a reason (wsl vs update-relaunch) and can refresh copy on an existing splash. Web update UI disables actions and shows “Preparing…” during staging and pre-install takeover.

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

Note

Reduce update restart time by pre-staging macOS updates natively and showing a preparing splash

  • On macOS, the update download now waits for the native Electron autoUpdaterupdate-downloaded event before completing, enabling OS-level pre-staging before restart.
  • A persistent relaunch marker (DesktopUpdateRelaunch) is written before quit and consumed at startup to show a 'Starting T3 Code…' splash instead of a cold-boot splash.
  • showConnectingSplash in DesktopWindow.ts now takes a ConnectingSplashReason ('wsl' | 'update-relaunch') and can refresh an existing splash in-place when the reason changes.
  • UI surfaces (sidebar pill, settings button, tooltips) show a 'Preparing…' state during native staging via new isDesktopUpdatePreparing and isDesktopUpdatePreparingToInstall helpers.
  • Behavioral Change: on macOS, windows are no longer force-destroyed before quit; on Windows the existing destroy behavior is retained.

Macroscope summarized ff79a9b.

@coderabbitai

coderabbitaiBot commented Jul 28, 2026

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: f15b82ea-3c3e-41f5-8006-165699eec1ef

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
Comment threadapps/desktop/src/updates/DesktopUpdates.ts
Comment threadapps/desktop/src/updates/DesktopUpdates.ts
Comment threadapps/desktop/src/updates/DesktopUpdates.ts
Comment threadapps/desktop/src/updates/DesktopUpdates.ts
@macroscopeapp

macroscopeappBot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces new macOS-specific native update pre-staging functionality, adding persistent marker files, deferred async coordination, platform-specific behavioral differences, and new UI states. These are significant runtime behavior changes to the update/restart flow that warrant human review.

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

Comment threadapps/desktop/src/updates/DesktopUpdates.ts
Comment threadapps/desktop/src/updates/DesktopUpdates.ts
Comment threadapps/desktop/src/updates/DesktopUpdates.ts
Comment threadapps/desktop/src/window/DesktopWindow.ts Outdated
@0x4bs3nt
0x4bs3ntforce-pushed the fix/faster-desktop-update-restarts branch from a256a88 to 16b01a9CompareJuly 29, 2026 21:30

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 16b01a9. Configure here.

Comment threadapps/desktop/src/app/DesktopApp.ts

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed against the Effect service conventions. One finding: a synthetic Error is manufactured only to satisfy a required cause on DesktopUpdaterReportedError, which also gives this locally-detected invariant a misleading updater-reported message. Everything else (namespace imports, make/layer shape, dependency acquisition via yield* Foo.Foo, scoped listener acquisition, catchTags usage) looks consistent with the conventions.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/desktop/src/updates/DesktopUpdates.ts Outdated
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.

1 participant

@0x4bs3nt
, '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(desktop): reduce update restart time - #4777

Open
0x4bs3nt wants to merge 7 commits into
pingdotgg:mainfrom
0x4bs3nt:fix/faster-desktop-update-restarts
Open

fix(desktop): reduce update restart time#4777
0x4bs3nt wants to merge 7 commits into
pingdotgg:mainfrom
0x4bs3nt:fix/faster-desktop-update-restarts

Conversation

@0x4bs3nt

@0x4bs3nt0x4bs3nt commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

What Changed

  • Pre-stage macOS updates during the download phase so the Restart action is only enabled once Squirrel has finished preparing the update.
  • Show a clear “Preparing update…” state while the updater is taking over.
  • Only force-destroy application windows on Windows, where NSIS requires it. macOS and Linux retain their normal quit lifecycle.
  • Show an immediate startup splash when reopening after an update.
  • Keep JavaScript dependencies inside ASAR on macOS and Linux while preserving the existing broad unpacking required for Windows WSL support.
  • Continue unpacking native modules and executables such as Claude, node-pty, passkeys, ffi-rs, and fff.

Why

Restarting after an update could appear to do nothing for around 20 seconds or longer.

Most of that delay came from two bottlenecks:

  1. Squirrel’s native update preparation did not begin until the user clicked Restart.
  2. The packaged application contained roughly 14,500 unpacked files, all of which Squirrel had to process individually.

This change moves native macOS preparation into the download flow and reduces the unpacked application tree to 184 files in a test package. The remaining restart flow is primarily normal application and backend startup, while the user receives visible feedback throughout the transition.

The platform-specific behavior is preserved:

  • macOS uses native pre-staging.
  • Windows retains the unpacking and window shutdown behavior required by WSL and NSIS.
  • Linux continues using its existing AppImage installation lifecycle.

UI Changes

  • The update control now displays “Preparing update…” instead of appearing stuck at 100% downloaded.
  • The update action is disabled while the updater is taking over, preventing duplicate restart attempts.
  • The first launch after an update immediately displays a “Starting T3 Code…” splash while the backend reconnects.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes - not applicable
  • I included a video for animation/interaction changes - not applicable

Note

Medium Risk
Changes core desktop update and quit/relaunch paths across platforms with new async coordination on macOS; behavior is heavily tested in this PR but regressions would affect all packaged users during updates.

Overview
Moves macOS Squirrel native staging into the download flow so Restart is only offered after electron.autoUpdater reports the staged app is ready, with a “Preparing update…” state instead of looking stuck at 100% downloaded.

Install/relaunch behavior now persists a one-shot relaunch marker before quitAndInstall, clears it on failed installs, shows a “Starting T3 Code…” startup splash when the marker is consumed, and only force-destroys windows on Windows (NSIS); macOS and Linux keep their normal quit lifecycle. autoInstallOnAppQuit is enabled only on darwin to drive native pre-staging.

Startup splashshowConnectingSplash takes a reason (wsl vs update-relaunch) and can refresh copy on an existing splash. Web update UI disables actions and shows “Preparing…” during staging and pre-install takeover.

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

Note

Reduce update restart time by pre-staging macOS updates natively and showing a preparing splash

  • On macOS, the update download now waits for the native Electron autoUpdaterupdate-downloaded event before completing, enabling OS-level pre-staging before restart.
  • A persistent relaunch marker (DesktopUpdateRelaunch) is written before quit and consumed at startup to show a 'Starting T3 Code…' splash instead of a cold-boot splash.
  • showConnectingSplash in DesktopWindow.ts now takes a ConnectingSplashReason ('wsl' | 'update-relaunch') and can refresh an existing splash in-place when the reason changes.
  • UI surfaces (sidebar pill, settings button, tooltips) show a 'Preparing…' state during native staging via new isDesktopUpdatePreparing and isDesktopUpdatePreparingToInstall helpers.
  • Behavioral Change: on macOS, windows are no longer force-destroyed before quit; on Windows the existing destroy behavior is retained.

Macroscope summarized ff79a9b.

@coderabbitai

coderabbitaiBot commented Jul 28, 2026

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: f15b82ea-3c3e-41f5-8006-165699eec1ef

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
Comment threadapps/desktop/src/updates/DesktopUpdates.ts
Comment threadapps/desktop/src/updates/DesktopUpdates.ts
Comment threadapps/desktop/src/updates/DesktopUpdates.ts
Comment threadapps/desktop/src/updates/DesktopUpdates.ts
@macroscopeapp

macroscopeappBot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces new macOS-specific native update pre-staging functionality, adding persistent marker files, deferred async coordination, platform-specific behavioral differences, and new UI states. These are significant runtime behavior changes to the update/restart flow that warrant human review.

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

Comment threadapps/desktop/src/updates/DesktopUpdates.ts
Comment threadapps/desktop/src/updates/DesktopUpdates.ts
Comment threadapps/desktop/src/updates/DesktopUpdates.ts
Comment threadapps/desktop/src/window/DesktopWindow.ts Outdated
@0x4bs3nt
0x4bs3ntforce-pushed the fix/faster-desktop-update-restarts branch from a256a88 to 16b01a9CompareJuly 29, 2026 21:30

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 16b01a9. Configure here.

Comment threadapps/desktop/src/app/DesktopApp.ts

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed against the Effect service conventions. One finding: a synthetic Error is manufactured only to satisfy a required cause on DesktopUpdaterReportedError, which also gives this locally-detected invariant a misleading updater-reported message. Everything else (namespace imports, make/layer shape, dependency acquisition via yield* Foo.Foo, scoped listener acquisition, catchTags usage) looks consistent with the conventions.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/desktop/src/updates/DesktopUpdates.ts Outdated
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.

1 participant

@0x4bs3nt
, '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(desktop): reduce update restart time - #4777

Open
0x4bs3nt wants to merge 7 commits into
pingdotgg:mainfrom
0x4bs3nt:fix/faster-desktop-update-restarts
Open

fix(desktop): reduce update restart time#4777
0x4bs3nt wants to merge 7 commits into
pingdotgg:mainfrom
0x4bs3nt:fix/faster-desktop-update-restarts

Conversation

@0x4bs3nt

@0x4bs3nt0x4bs3nt commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

What Changed

  • Pre-stage macOS updates during the download phase so the Restart action is only enabled once Squirrel has finished preparing the update.
  • Show a clear “Preparing update…” state while the updater is taking over.
  • Only force-destroy application windows on Windows, where NSIS requires it. macOS and Linux retain their normal quit lifecycle.
  • Show an immediate startup splash when reopening after an update.
  • Keep JavaScript dependencies inside ASAR on macOS and Linux while preserving the existing broad unpacking required for Windows WSL support.
  • Continue unpacking native modules and executables such as Claude, node-pty, passkeys, ffi-rs, and fff.

Why

Restarting after an update could appear to do nothing for around 20 seconds or longer.

Most of that delay came from two bottlenecks:

  1. Squirrel’s native update preparation did not begin until the user clicked Restart.
  2. The packaged application contained roughly 14,500 unpacked files, all of which Squirrel had to process individually.

This change moves native macOS preparation into the download flow and reduces the unpacked application tree to 184 files in a test package. The remaining restart flow is primarily normal application and backend startup, while the user receives visible feedback throughout the transition.

The platform-specific behavior is preserved:

  • macOS uses native pre-staging.
  • Windows retains the unpacking and window shutdown behavior required by WSL and NSIS.
  • Linux continues using its existing AppImage installation lifecycle.

UI Changes

  • The update control now displays “Preparing update…” instead of appearing stuck at 100% downloaded.
  • The update action is disabled while the updater is taking over, preventing duplicate restart attempts.
  • The first launch after an update immediately displays a “Starting T3 Code…” splash while the backend reconnects.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes - not applicable
  • I included a video for animation/interaction changes - not applicable

Note

Medium Risk
Changes core desktop update and quit/relaunch paths across platforms with new async coordination on macOS; behavior is heavily tested in this PR but regressions would affect all packaged users during updates.

Overview
Moves macOS Squirrel native staging into the download flow so Restart is only offered after electron.autoUpdater reports the staged app is ready, with a “Preparing update…” state instead of looking stuck at 100% downloaded.

Install/relaunch behavior now persists a one-shot relaunch marker before quitAndInstall, clears it on failed installs, shows a “Starting T3 Code…” startup splash when the marker is consumed, and only force-destroys windows on Windows (NSIS); macOS and Linux keep their normal quit lifecycle. autoInstallOnAppQuit is enabled only on darwin to drive native pre-staging.

Startup splashshowConnectingSplash takes a reason (wsl vs update-relaunch) and can refresh copy on an existing splash. Web update UI disables actions and shows “Preparing…” during staging and pre-install takeover.

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

Note

Reduce update restart time by pre-staging macOS updates natively and showing a preparing splash

  • On macOS, the update download now waits for the native Electron autoUpdaterupdate-downloaded event before completing, enabling OS-level pre-staging before restart.
  • A persistent relaunch marker (DesktopUpdateRelaunch) is written before quit and consumed at startup to show a 'Starting T3 Code…' splash instead of a cold-boot splash.
  • showConnectingSplash in DesktopWindow.ts now takes a ConnectingSplashReason ('wsl' | 'update-relaunch') and can refresh an existing splash in-place when the reason changes.
  • UI surfaces (sidebar pill, settings button, tooltips) show a 'Preparing…' state during native staging via new isDesktopUpdatePreparing and isDesktopUpdatePreparingToInstall helpers.
  • Behavioral Change: on macOS, windows are no longer force-destroyed before quit; on Windows the existing destroy behavior is retained.

Macroscope summarized ff79a9b.

@coderabbitai

coderabbitaiBot commented Jul 28, 2026

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: f15b82ea-3c3e-41f5-8006-165699eec1ef

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
Comment threadapps/desktop/src/updates/DesktopUpdates.ts
Comment threadapps/desktop/src/updates/DesktopUpdates.ts
Comment threadapps/desktop/src/updates/DesktopUpdates.ts
Comment threadapps/desktop/src/updates/DesktopUpdates.ts
@macroscopeapp

macroscopeappBot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces new macOS-specific native update pre-staging functionality, adding persistent marker files, deferred async coordination, platform-specific behavioral differences, and new UI states. These are significant runtime behavior changes to the update/restart flow that warrant human review.

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

Comment threadapps/desktop/src/updates/DesktopUpdates.ts
Comment threadapps/desktop/src/updates/DesktopUpdates.ts
Comment threadapps/desktop/src/updates/DesktopUpdates.ts
Comment threadapps/desktop/src/window/DesktopWindow.ts Outdated
@0x4bs3nt
0x4bs3ntforce-pushed the fix/faster-desktop-update-restarts branch from a256a88 to 16b01a9CompareJuly 29, 2026 21:30

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 16b01a9. Configure here.

Comment threadapps/desktop/src/app/DesktopApp.ts

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed against the Effect service conventions. One finding: a synthetic Error is manufactured only to satisfy a required cause on DesktopUpdaterReportedError, which also gives this locally-detected invariant a misleading updater-reported message. Everything else (namespace imports, make/layer shape, dependency acquisition via yield* Foo.Foo, scoped listener acquisition, catchTags usage) looks consistent with the conventions.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/desktop/src/updates/DesktopUpdates.ts Outdated
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.

1 participant

@0x4bs3nt