fix(web): preserve WSL provider update results after dismissal - #168

Open
pandec wants to merge 4 commits into
mainfrom
upstream/wsl-update-toast
Open

fix(web): preserve WSL provider update results after dismissal#168
pandec wants to merge 4 commits into
mainfrom
upstream/wsl-update-toast

Conversation

@pandec

@pandecpandec commented Aug 23, 2026

Copy link
Copy Markdown
Owner

Note

Preview of an upstream PR for pingdotgg/t3code. Never merge this; main here is a clean upstream mirror. Close once the upstream PR is open. The branch carries an intermediate design superseded during review; it will be squashed to one commit before the upstream PR.

Problem

The multi-environment (Windows + WSL) provider update popover owns its update request state inside dismissible toast content. Dismiss it mid-update and the request keeps running while its owner unmounts; the sidebar pill only watches primary providers, so success or failure is never reported anywhere. A hung transport is equally silent.

Fix

Split presentation from result delivery:

  • The popover stays live and per-environment: each row keeps its own Update trigger and moves through pending, terminal, and Retry states inline. Triggering one environment's update leaves the others actionable.
  • Terminal-result delivery is owned by the notification host, which outlives any toast: each dispatch registers a generation-scoped claim (targeted instance ids, dispatch time). Live provider state and the RPC response race to finish it, and Map.delete on the claim is the atomic single-winner — no duplicate toasts, in either arrival order. Snapshots older than the dispatch are rejected, so a previous attempt's state can't be reported as this one's outcome.
  • A result toast fires only when the popover is no longer open to show the result itself. A six-minute expiry reports a failure instead of going silent on a hung transport, and interrupted dispatches surface as retryable failures. An unreachable error branch was removed.

Deliberately not in scope: the running-progress duplication between this popover and the sidebar pill for primary providers. These rows are the only progress surface WSL-side providers have, so suppressing them would trade a cosmetic duplication for missing feedback.

Verification

  • 57 focused tests, including: exactly-once reporting across RPC-first and live-state-first orderings, stale-terminal-state rejection, request generations across retries, the unchanged outcome, dismissal followed by delivery, results shown in the still-open popover (no toast), expiry, and interruption. One test renders the production notification host, not just the hook.
  • Mutation-proofed: removing the delete-as-claim guard fails four tests; removing the recency filter fails the stale-state test.
  • vp check and vp run typecheck clean.

[video placeholder: with Windows + WSL connected, click Update on one environment — the popover stays open, that row shows a spinner while the other row stays actionable. Then repeat and dismiss the popover mid-update — the success/failure toast still arrives.]

Related: pingdotgg#7761 (primary-flow result pattern this mirrors), pingdotgg#7425, pingdotgg#6544.

Implemented by gpt-5.6-sol, orchestrated and reviewed (opus + sol panel) in Claude Code (Fable 5).

@pandecpandec changed the title fix(web): report WSL provider update results like primary providersfix(web): preserve WSL provider update results after dismissalAug 23, 2026
@pandec
pandec marked this pull request as ready for review September 1, 2026 07:12
@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

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: defaults

Review profile: CHILL

Plan: Advanced

Run ID: a031906e-cd1b-4913-ab05-46514ef96cda

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

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

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@pandec
, '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(web): preserve WSL provider update results after dismissal - #168

Open
pandec wants to merge 4 commits into
mainfrom
upstream/wsl-update-toast
Open

fix(web): preserve WSL provider update results after dismissal#168
pandec wants to merge 4 commits into
mainfrom
upstream/wsl-update-toast

Conversation

@pandec

@pandecpandec commented Aug 23, 2026

Copy link
Copy Markdown
Owner

Note

Preview of an upstream PR for pingdotgg/t3code. Never merge this; main here is a clean upstream mirror. Close once the upstream PR is open. The branch carries an intermediate design superseded during review; it will be squashed to one commit before the upstream PR.

Problem

The multi-environment (Windows + WSL) provider update popover owns its update request state inside dismissible toast content. Dismiss it mid-update and the request keeps running while its owner unmounts; the sidebar pill only watches primary providers, so success or failure is never reported anywhere. A hung transport is equally silent.

Fix

Split presentation from result delivery:

  • The popover stays live and per-environment: each row keeps its own Update trigger and moves through pending, terminal, and Retry states inline. Triggering one environment's update leaves the others actionable.
  • Terminal-result delivery is owned by the notification host, which outlives any toast: each dispatch registers a generation-scoped claim (targeted instance ids, dispatch time). Live provider state and the RPC response race to finish it, and Map.delete on the claim is the atomic single-winner — no duplicate toasts, in either arrival order. Snapshots older than the dispatch are rejected, so a previous attempt's state can't be reported as this one's outcome.
  • A result toast fires only when the popover is no longer open to show the result itself. A six-minute expiry reports a failure instead of going silent on a hung transport, and interrupted dispatches surface as retryable failures. An unreachable error branch was removed.

Deliberately not in scope: the running-progress duplication between this popover and the sidebar pill for primary providers. These rows are the only progress surface WSL-side providers have, so suppressing them would trade a cosmetic duplication for missing feedback.

Verification

  • 57 focused tests, including: exactly-once reporting across RPC-first and live-state-first orderings, stale-terminal-state rejection, request generations across retries, the unchanged outcome, dismissal followed by delivery, results shown in the still-open popover (no toast), expiry, and interruption. One test renders the production notification host, not just the hook.
  • Mutation-proofed: removing the delete-as-claim guard fails four tests; removing the recency filter fails the stale-state test.
  • vp check and vp run typecheck clean.

[video placeholder: with Windows + WSL connected, click Update on one environment — the popover stays open, that row shows a spinner while the other row stays actionable. Then repeat and dismiss the popover mid-update — the success/failure toast still arrives.]

Related: pingdotgg#7761 (primary-flow result pattern this mirrors), pingdotgg#7425, pingdotgg#6544.

Implemented by gpt-5.6-sol, orchestrated and reviewed (opus + sol panel) in Claude Code (Fable 5).

@pandecpandec changed the title fix(web): report WSL provider update results like primary providersfix(web): preserve WSL provider update results after dismissalAug 23, 2026
@pandec
pandec marked this pull request as ready for review September 1, 2026 07:12
@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

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: defaults

Review profile: CHILL

Plan: Advanced

Run ID: a031906e-cd1b-4913-ab05-46514ef96cda

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

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

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@pandec
, '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(web): preserve WSL provider update results after dismissal - #168

Open
pandec wants to merge 4 commits into
mainfrom
upstream/wsl-update-toast
Open

fix(web): preserve WSL provider update results after dismissal#168
pandec wants to merge 4 commits into
mainfrom
upstream/wsl-update-toast

Conversation

@pandec

@pandecpandec commented Aug 23, 2026

Copy link
Copy Markdown
Owner

Note

Preview of an upstream PR for pingdotgg/t3code. Never merge this; main here is a clean upstream mirror. Close once the upstream PR is open. The branch carries an intermediate design superseded during review; it will be squashed to one commit before the upstream PR.

Problem

The multi-environment (Windows + WSL) provider update popover owns its update request state inside dismissible toast content. Dismiss it mid-update and the request keeps running while its owner unmounts; the sidebar pill only watches primary providers, so success or failure is never reported anywhere. A hung transport is equally silent.

Fix

Split presentation from result delivery:

  • The popover stays live and per-environment: each row keeps its own Update trigger and moves through pending, terminal, and Retry states inline. Triggering one environment's update leaves the others actionable.
  • Terminal-result delivery is owned by the notification host, which outlives any toast: each dispatch registers a generation-scoped claim (targeted instance ids, dispatch time). Live provider state and the RPC response race to finish it, and Map.delete on the claim is the atomic single-winner — no duplicate toasts, in either arrival order. Snapshots older than the dispatch are rejected, so a previous attempt's state can't be reported as this one's outcome.
  • A result toast fires only when the popover is no longer open to show the result itself. A six-minute expiry reports a failure instead of going silent on a hung transport, and interrupted dispatches surface as retryable failures. An unreachable error branch was removed.

Deliberately not in scope: the running-progress duplication between this popover and the sidebar pill for primary providers. These rows are the only progress surface WSL-side providers have, so suppressing them would trade a cosmetic duplication for missing feedback.

Verification

  • 57 focused tests, including: exactly-once reporting across RPC-first and live-state-first orderings, stale-terminal-state rejection, request generations across retries, the unchanged outcome, dismissal followed by delivery, results shown in the still-open popover (no toast), expiry, and interruption. One test renders the production notification host, not just the hook.
  • Mutation-proofed: removing the delete-as-claim guard fails four tests; removing the recency filter fails the stale-state test.
  • vp check and vp run typecheck clean.

[video placeholder: with Windows + WSL connected, click Update on one environment — the popover stays open, that row shows a spinner while the other row stays actionable. Then repeat and dismiss the popover mid-update — the success/failure toast still arrives.]

Related: pingdotgg#7761 (primary-flow result pattern this mirrors), pingdotgg#7425, pingdotgg#6544.

Implemented by gpt-5.6-sol, orchestrated and reviewed (opus + sol panel) in Claude Code (Fable 5).

@pandecpandec changed the title fix(web): report WSL provider update results like primary providersfix(web): preserve WSL provider update results after dismissalAug 23, 2026
@pandec
pandec marked this pull request as ready for review September 1, 2026 07:12
@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

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: defaults

Review profile: CHILL

Plan: Advanced

Run ID: a031906e-cd1b-4913-ab05-46514ef96cda

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

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

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@pandec
, '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(web): preserve WSL provider update results after dismissal - #168

Open
pandec wants to merge 4 commits into
mainfrom
upstream/wsl-update-toast
Open

fix(web): preserve WSL provider update results after dismissal#168
pandec wants to merge 4 commits into
mainfrom
upstream/wsl-update-toast

Conversation

@pandec

@pandecpandec commented Aug 23, 2026

Copy link
Copy Markdown
Owner

Note

Preview of an upstream PR for pingdotgg/t3code. Never merge this; main here is a clean upstream mirror. Close once the upstream PR is open. The branch carries an intermediate design superseded during review; it will be squashed to one commit before the upstream PR.

Problem

The multi-environment (Windows + WSL) provider update popover owns its update request state inside dismissible toast content. Dismiss it mid-update and the request keeps running while its owner unmounts; the sidebar pill only watches primary providers, so success or failure is never reported anywhere. A hung transport is equally silent.

Fix

Split presentation from result delivery:

  • The popover stays live and per-environment: each row keeps its own Update trigger and moves through pending, terminal, and Retry states inline. Triggering one environment's update leaves the others actionable.
  • Terminal-result delivery is owned by the notification host, which outlives any toast: each dispatch registers a generation-scoped claim (targeted instance ids, dispatch time). Live provider state and the RPC response race to finish it, and Map.delete on the claim is the atomic single-winner — no duplicate toasts, in either arrival order. Snapshots older than the dispatch are rejected, so a previous attempt's state can't be reported as this one's outcome.
  • A result toast fires only when the popover is no longer open to show the result itself. A six-minute expiry reports a failure instead of going silent on a hung transport, and interrupted dispatches surface as retryable failures. An unreachable error branch was removed.

Deliberately not in scope: the running-progress duplication between this popover and the sidebar pill for primary providers. These rows are the only progress surface WSL-side providers have, so suppressing them would trade a cosmetic duplication for missing feedback.

Verification

  • 57 focused tests, including: exactly-once reporting across RPC-first and live-state-first orderings, stale-terminal-state rejection, request generations across retries, the unchanged outcome, dismissal followed by delivery, results shown in the still-open popover (no toast), expiry, and interruption. One test renders the production notification host, not just the hook.
  • Mutation-proofed: removing the delete-as-claim guard fails four tests; removing the recency filter fails the stale-state test.
  • vp check and vp run typecheck clean.

[video placeholder: with Windows + WSL connected, click Update on one environment — the popover stays open, that row shows a spinner while the other row stays actionable. Then repeat and dismiss the popover mid-update — the success/failure toast still arrives.]

Related: pingdotgg#7761 (primary-flow result pattern this mirrors), pingdotgg#7425, pingdotgg#6544.

Implemented by gpt-5.6-sol, orchestrated and reviewed (opus + sol panel) in Claude Code (Fable 5).

@pandecpandec changed the title fix(web): report WSL provider update results like primary providersfix(web): preserve WSL provider update results after dismissalAug 23, 2026
@pandec
pandec marked this pull request as ready for review September 1, 2026 07:12
@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

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: defaults

Review profile: CHILL

Plan: Advanced

Run ID: a031906e-cd1b-4913-ab05-46514ef96cda

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

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

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@pandec
, '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(web): preserve WSL provider update results after dismissal - #168

Open
pandec wants to merge 4 commits into
mainfrom
upstream/wsl-update-toast
Open

fix(web): preserve WSL provider update results after dismissal#168
pandec wants to merge 4 commits into
mainfrom
upstream/wsl-update-toast

Conversation

@pandec

@pandecpandec commented Aug 23, 2026

Copy link
Copy Markdown
Owner

Note

Preview of an upstream PR for pingdotgg/t3code. Never merge this; main here is a clean upstream mirror. Close once the upstream PR is open. The branch carries an intermediate design superseded during review; it will be squashed to one commit before the upstream PR.

Problem

The multi-environment (Windows + WSL) provider update popover owns its update request state inside dismissible toast content. Dismiss it mid-update and the request keeps running while its owner unmounts; the sidebar pill only watches primary providers, so success or failure is never reported anywhere. A hung transport is equally silent.

Fix

Split presentation from result delivery:

  • The popover stays live and per-environment: each row keeps its own Update trigger and moves through pending, terminal, and Retry states inline. Triggering one environment's update leaves the others actionable.
  • Terminal-result delivery is owned by the notification host, which outlives any toast: each dispatch registers a generation-scoped claim (targeted instance ids, dispatch time). Live provider state and the RPC response race to finish it, and Map.delete on the claim is the atomic single-winner — no duplicate toasts, in either arrival order. Snapshots older than the dispatch are rejected, so a previous attempt's state can't be reported as this one's outcome.
  • A result toast fires only when the popover is no longer open to show the result itself. A six-minute expiry reports a failure instead of going silent on a hung transport, and interrupted dispatches surface as retryable failures. An unreachable error branch was removed.

Deliberately not in scope: the running-progress duplication between this popover and the sidebar pill for primary providers. These rows are the only progress surface WSL-side providers have, so suppressing them would trade a cosmetic duplication for missing feedback.

Verification

  • 57 focused tests, including: exactly-once reporting across RPC-first and live-state-first orderings, stale-terminal-state rejection, request generations across retries, the unchanged outcome, dismissal followed by delivery, results shown in the still-open popover (no toast), expiry, and interruption. One test renders the production notification host, not just the hook.
  • Mutation-proofed: removing the delete-as-claim guard fails four tests; removing the recency filter fails the stale-state test.
  • vp check and vp run typecheck clean.

[video placeholder: with Windows + WSL connected, click Update on one environment — the popover stays open, that row shows a spinner while the other row stays actionable. Then repeat and dismiss the popover mid-update — the success/failure toast still arrives.]

Related: pingdotgg#7761 (primary-flow result pattern this mirrors), pingdotgg#7425, pingdotgg#6544.

Implemented by gpt-5.6-sol, orchestrated and reviewed (opus + sol panel) in Claude Code (Fable 5).

@pandecpandec changed the title fix(web): report WSL provider update results like primary providersfix(web): preserve WSL provider update results after dismissalAug 23, 2026
@pandec
pandec marked this pull request as ready for review September 1, 2026 07:12
@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

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: defaults

Review profile: CHILL

Plan: Advanced

Run ID: a031906e-cd1b-4913-ab05-46514ef96cda

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

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

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@pandec
, '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(web): preserve WSL provider update results after dismissal - #168

Open
pandec wants to merge 4 commits into
mainfrom
upstream/wsl-update-toast
Open

fix(web): preserve WSL provider update results after dismissal#168
pandec wants to merge 4 commits into
mainfrom
upstream/wsl-update-toast

Conversation

@pandec

@pandecpandec commented Aug 23, 2026

Copy link
Copy Markdown
Owner

Note

Preview of an upstream PR for pingdotgg/t3code. Never merge this; main here is a clean upstream mirror. Close once the upstream PR is open. The branch carries an intermediate design superseded during review; it will be squashed to one commit before the upstream PR.

Problem

The multi-environment (Windows + WSL) provider update popover owns its update request state inside dismissible toast content. Dismiss it mid-update and the request keeps running while its owner unmounts; the sidebar pill only watches primary providers, so success or failure is never reported anywhere. A hung transport is equally silent.

Fix

Split presentation from result delivery:

  • The popover stays live and per-environment: each row keeps its own Update trigger and moves through pending, terminal, and Retry states inline. Triggering one environment's update leaves the others actionable.
  • Terminal-result delivery is owned by the notification host, which outlives any toast: each dispatch registers a generation-scoped claim (targeted instance ids, dispatch time). Live provider state and the RPC response race to finish it, and Map.delete on the claim is the atomic single-winner — no duplicate toasts, in either arrival order. Snapshots older than the dispatch are rejected, so a previous attempt's state can't be reported as this one's outcome.
  • A result toast fires only when the popover is no longer open to show the result itself. A six-minute expiry reports a failure instead of going silent on a hung transport, and interrupted dispatches surface as retryable failures. An unreachable error branch was removed.

Deliberately not in scope: the running-progress duplication between this popover and the sidebar pill for primary providers. These rows are the only progress surface WSL-side providers have, so suppressing them would trade a cosmetic duplication for missing feedback.

Verification

  • 57 focused tests, including: exactly-once reporting across RPC-first and live-state-first orderings, stale-terminal-state rejection, request generations across retries, the unchanged outcome, dismissal followed by delivery, results shown in the still-open popover (no toast), expiry, and interruption. One test renders the production notification host, not just the hook.
  • Mutation-proofed: removing the delete-as-claim guard fails four tests; removing the recency filter fails the stale-state test.
  • vp check and vp run typecheck clean.

[video placeholder: with Windows + WSL connected, click Update on one environment — the popover stays open, that row shows a spinner while the other row stays actionable. Then repeat and dismiss the popover mid-update — the success/failure toast still arrives.]

Related: pingdotgg#7761 (primary-flow result pattern this mirrors), pingdotgg#7425, pingdotgg#6544.

Implemented by gpt-5.6-sol, orchestrated and reviewed (opus + sol panel) in Claude Code (Fable 5).

@pandecpandec changed the title fix(web): report WSL provider update results like primary providersfix(web): preserve WSL provider update results after dismissalAug 23, 2026
@pandec
pandec marked this pull request as ready for review September 1, 2026 07:12
@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

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: defaults

Review profile: CHILL

Plan: Advanced

Run ID: a031906e-cd1b-4913-ab05-46514ef96cda

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

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

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@pandec
, '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(web): preserve WSL provider update results after dismissal - #168

Open
pandec wants to merge 4 commits into
mainfrom
upstream/wsl-update-toast
Open

fix(web): preserve WSL provider update results after dismissal#168
pandec wants to merge 4 commits into
mainfrom
upstream/wsl-update-toast

Conversation

@pandec

@pandecpandec commented Aug 23, 2026

Copy link
Copy Markdown
Owner

Note

Preview of an upstream PR for pingdotgg/t3code. Never merge this; main here is a clean upstream mirror. Close once the upstream PR is open. The branch carries an intermediate design superseded during review; it will be squashed to one commit before the upstream PR.

Problem

The multi-environment (Windows + WSL) provider update popover owns its update request state inside dismissible toast content. Dismiss it mid-update and the request keeps running while its owner unmounts; the sidebar pill only watches primary providers, so success or failure is never reported anywhere. A hung transport is equally silent.

Fix

Split presentation from result delivery:

  • The popover stays live and per-environment: each row keeps its own Update trigger and moves through pending, terminal, and Retry states inline. Triggering one environment's update leaves the others actionable.
  • Terminal-result delivery is owned by the notification host, which outlives any toast: each dispatch registers a generation-scoped claim (targeted instance ids, dispatch time). Live provider state and the RPC response race to finish it, and Map.delete on the claim is the atomic single-winner — no duplicate toasts, in either arrival order. Snapshots older than the dispatch are rejected, so a previous attempt's state can't be reported as this one's outcome.
  • A result toast fires only when the popover is no longer open to show the result itself. A six-minute expiry reports a failure instead of going silent on a hung transport, and interrupted dispatches surface as retryable failures. An unreachable error branch was removed.

Deliberately not in scope: the running-progress duplication between this popover and the sidebar pill for primary providers. These rows are the only progress surface WSL-side providers have, so suppressing them would trade a cosmetic duplication for missing feedback.

Verification

  • 57 focused tests, including: exactly-once reporting across RPC-first and live-state-first orderings, stale-terminal-state rejection, request generations across retries, the unchanged outcome, dismissal followed by delivery, results shown in the still-open popover (no toast), expiry, and interruption. One test renders the production notification host, not just the hook.
  • Mutation-proofed: removing the delete-as-claim guard fails four tests; removing the recency filter fails the stale-state test.
  • vp check and vp run typecheck clean.

[video placeholder: with Windows + WSL connected, click Update on one environment — the popover stays open, that row shows a spinner while the other row stays actionable. Then repeat and dismiss the popover mid-update — the success/failure toast still arrives.]

Related: pingdotgg#7761 (primary-flow result pattern this mirrors), pingdotgg#7425, pingdotgg#6544.

Implemented by gpt-5.6-sol, orchestrated and reviewed (opus + sol panel) in Claude Code (Fable 5).

@pandecpandec changed the title fix(web): report WSL provider update results like primary providersfix(web): preserve WSL provider update results after dismissalAug 23, 2026
@pandec
pandec marked this pull request as ready for review September 1, 2026 07:12
@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

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: defaults

Review profile: CHILL

Plan: Advanced

Run ID: a031906e-cd1b-4913-ab05-46514ef96cda

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

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

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@pandec
, '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(web): preserve WSL provider update results after dismissal - #168

Open
pandec wants to merge 4 commits into
mainfrom
upstream/wsl-update-toast
Open

fix(web): preserve WSL provider update results after dismissal#168
pandec wants to merge 4 commits into
mainfrom
upstream/wsl-update-toast

Conversation

@pandec

@pandecpandec commented Aug 23, 2026

Copy link
Copy Markdown
Owner

Note

Preview of an upstream PR for pingdotgg/t3code. Never merge this; main here is a clean upstream mirror. Close once the upstream PR is open. The branch carries an intermediate design superseded during review; it will be squashed to one commit before the upstream PR.

Problem

The multi-environment (Windows + WSL) provider update popover owns its update request state inside dismissible toast content. Dismiss it mid-update and the request keeps running while its owner unmounts; the sidebar pill only watches primary providers, so success or failure is never reported anywhere. A hung transport is equally silent.

Fix

Split presentation from result delivery:

  • The popover stays live and per-environment: each row keeps its own Update trigger and moves through pending, terminal, and Retry states inline. Triggering one environment's update leaves the others actionable.
  • Terminal-result delivery is owned by the notification host, which outlives any toast: each dispatch registers a generation-scoped claim (targeted instance ids, dispatch time). Live provider state and the RPC response race to finish it, and Map.delete on the claim is the atomic single-winner — no duplicate toasts, in either arrival order. Snapshots older than the dispatch are rejected, so a previous attempt's state can't be reported as this one's outcome.
  • A result toast fires only when the popover is no longer open to show the result itself. A six-minute expiry reports a failure instead of going silent on a hung transport, and interrupted dispatches surface as retryable failures. An unreachable error branch was removed.

Deliberately not in scope: the running-progress duplication between this popover and the sidebar pill for primary providers. These rows are the only progress surface WSL-side providers have, so suppressing them would trade a cosmetic duplication for missing feedback.

Verification

  • 57 focused tests, including: exactly-once reporting across RPC-first and live-state-first orderings, stale-terminal-state rejection, request generations across retries, the unchanged outcome, dismissal followed by delivery, results shown in the still-open popover (no toast), expiry, and interruption. One test renders the production notification host, not just the hook.
  • Mutation-proofed: removing the delete-as-claim guard fails four tests; removing the recency filter fails the stale-state test.
  • vp check and vp run typecheck clean.

[video placeholder: with Windows + WSL connected, click Update on one environment — the popover stays open, that row shows a spinner while the other row stays actionable. Then repeat and dismiss the popover mid-update — the success/failure toast still arrives.]

Related: pingdotgg#7761 (primary-flow result pattern this mirrors), pingdotgg#7425, pingdotgg#6544.

Implemented by gpt-5.6-sol, orchestrated and reviewed (opus + sol panel) in Claude Code (Fable 5).

@pandecpandec changed the title fix(web): report WSL provider update results like primary providersfix(web): preserve WSL provider update results after dismissalAug 23, 2026
@pandec
pandec marked this pull request as ready for review September 1, 2026 07:12
@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

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: defaults

Review profile: CHILL

Plan: Advanced

Run ID: a031906e-cd1b-4913-ab05-46514ef96cda

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

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

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@pandec