fix(connection): refresh network status after app activation - #5597

Open
DominicVonk wants to merge 3 commits into
pingdotgg:mainfrom
DominicVonk:codex/network-status-refresh
Open

fix(connection): refresh network status after app activation#5597
DominicVonk wants to merge 3 commits into
pingdotgg:mainfrom
DominicVonk:codex/network-status-refresh

Conversation

@DominicVonk

@DominicVonkDominicVonk commented Aug 7, 2026

Copy link
Copy Markdown

Mobile network listeners can miss connectivity changes while the app is suspended. After returning to the foreground, an environment could remain offline or continue an old retry ladder even though the live network was available again.

This change adds one shared connectivity follower that:

  • applies the current network state when a connection runtime starts;
  • refreshes the authoritative platform status on application activation;
  • serializes live reports and refresh snapshots so later reports always win;
  • ignores duplicate reports without invalidating a newer refresh;
  • delivers wakeup signals and refreshed network state in one deterministic order;
  • refreshes managed relay discovery through the same lifecycle path.

The behavior is shared by web, desktop, and mobile through client-runtime. No wire contract or provider adapter changes are required.

Related independent PRs

These PRs all target main and can be merged in any order:

Verification

  • vp test run packages/client-runtime/src/connection/connectivity.test.ts packages/client-runtime/src/connection/supervisor.test.ts packages/client-runtime/src/relay/discovery.test.ts
    • 3 files passed
    • 48 tests passed
  • vp run --filter @t3tools/client-runtime typecheck
    • passed; one pre-existing Effect suggestion remains in relay discovery
  • targeted vp lint for the six changed runtime/test files
    • passed
  • fallow audit --base upstream/main
    • passed the new-change gate; inherited repository findings were excluded

No screenshot is included because this PR changes lifecycle ordering rather than rendered UI.

Built and reviewed with GPT-5 Codex via Codex CLI.

Fork validation PR


Note

Medium Risk
Touches core connection lifecycle (supervisor, registry, relay discovery) and ordering between wakeups and network state; behavior is heavily tested but regressions could affect reconnect timing or discovery offline flags.

Overview
Fixes environments staying offline or on stale retry state when mobile suspends network listeners while the app is backgrounded.

Introduces Connectivity.followNetworkStatus in client-runtime: applies the current status at startup, streams connectivity.changes, and on application-active wakeups re-reads connectivity.status with revision sequencing and a lock so live change events beat stale async snapshots and duplicate applies are skipped.

EnvironmentSupervisor, EnvironmentRegistry, and RelayEnvironmentDiscovery now use this helper instead of separate subscriptions to network changes and wakeups; relay discovery adds networkStateLock so offline/refresh transitions stay consistent with in-flight status reads.

On mobile (platform.ts), connectivity changes no longer polls Network.getNetworkStateAsync on AppState active—that refresh is centralized in followNetworkStatus via wakeups.

New unit tests cover the follower, supervisor recovery when online was missed without a listener event, and relay offline/online edge cases.

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

Note

Refresh network status on app activation using Connectivity.followNetworkStatus

  • Introduces Connectivity.followNetworkStatus in connectivity.ts, a new effect that consumes connectivity status, change events, and wakeup signals to apply network status updates via a callback, with deduplication and revision-based sequencing to prevent stale async reads from overwriting newer change events.
  • Wires followNetworkStatus into EnvironmentSupervisor, EnvironmentRegistry, and RelayEnvironmentDiscovery, replacing direct subscriptions to connectivity.changes and ConnectionWakeups.changes.
  • On app activation (wakeup), the current network status is re-read and applied only if no newer change event has arrived, fixing missed transitions while the app was suspended.
  • RelayEnvironmentDiscovery adds a networkStateLock semaphore to serialize offline/refresh transitions against concurrent connectivity changes.
  • Behavioral Change: the mobile platform layer in platform.ts no longer emits a connectivity event on AppState active transitions; wakeup-driven refresh is now handled entirely within followNetworkStatus.

Macroscope summarized 1cdcc15.

@coderabbitai

coderabbitaiBot commented Aug 7, 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: deaa0201-97bc-486d-a84f-5edd5b49dafb

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

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.

Comment threadpackages/client-runtime/src/connection/connectivity.ts
@macroscopeapp

macroscopeappBot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a new followNetworkStatus utility with revision-based concurrency handling that changes how network status is tracked and refreshed across multiple connection-related components. The synchronization changes and cross-cutting behavioral modifications to core connection infrastructure warrant human review.

No code changes detected at 8e38c0b. Prior analysis still applies.

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

@DominicVonk
DominicVonkforce-pushed the codex/network-status-refresh branch from baad669 to b8f4356CompareAugust 7, 2026 11:27
Comment threadpackages/client-runtime/src/connection/connectivity.ts
@DominicVonk
DominicVonkforce-pushed the codex/network-status-refresh branch 4 times, most recently from cdebe1a to 8fa621eCompareAugust 7, 2026 11:44
Comment threadpackages/client-runtime/src/connection/connectivity.ts
Comment threadpackages/client-runtime/src/relay/discovery.ts Outdated
@DominicVonk
DominicVonkforce-pushed the codex/network-status-refresh branch from 8fa621e to 7920591CompareAugust 7, 2026 15:48

@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.

There are 2 total unresolved issues (including 1 from previous review).

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 7920591. Configure here.

Comment threadpackages/client-runtime/src/connection/supervisor.ts
@DominicVonkDominicVonk changed the title [1/5] fix(connection): refresh network status after app activation[1/3] fix(connection): refresh network status after app activationAug 7, 2026
@DominicVonkDominicVonk changed the title [1/3] fix(connection): refresh network status after app activationfix(connection): refresh network status after app activationAug 7, 2026
DominicVonkand others added 3 commits August 10, 2026 12:58
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: codex <codex@users.noreply.github.com>
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

@DominicVonk
, '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(connection): refresh network status after app activation - #5597

Open
DominicVonk wants to merge 3 commits into
pingdotgg:mainfrom
DominicVonk:codex/network-status-refresh
Open

fix(connection): refresh network status after app activation#5597
DominicVonk wants to merge 3 commits into
pingdotgg:mainfrom
DominicVonk:codex/network-status-refresh

Conversation

@DominicVonk

@DominicVonkDominicVonk commented Aug 7, 2026

Copy link
Copy Markdown

Mobile network listeners can miss connectivity changes while the app is suspended. After returning to the foreground, an environment could remain offline or continue an old retry ladder even though the live network was available again.

This change adds one shared connectivity follower that:

  • applies the current network state when a connection runtime starts;
  • refreshes the authoritative platform status on application activation;
  • serializes live reports and refresh snapshots so later reports always win;
  • ignores duplicate reports without invalidating a newer refresh;
  • delivers wakeup signals and refreshed network state in one deterministic order;
  • refreshes managed relay discovery through the same lifecycle path.

The behavior is shared by web, desktop, and mobile through client-runtime. No wire contract or provider adapter changes are required.

Related independent PRs

These PRs all target main and can be merged in any order:

Verification

  • vp test run packages/client-runtime/src/connection/connectivity.test.ts packages/client-runtime/src/connection/supervisor.test.ts packages/client-runtime/src/relay/discovery.test.ts
    • 3 files passed
    • 48 tests passed
  • vp run --filter @t3tools/client-runtime typecheck
    • passed; one pre-existing Effect suggestion remains in relay discovery
  • targeted vp lint for the six changed runtime/test files
    • passed
  • fallow audit --base upstream/main
    • passed the new-change gate; inherited repository findings were excluded

No screenshot is included because this PR changes lifecycle ordering rather than rendered UI.

Built and reviewed with GPT-5 Codex via Codex CLI.

Fork validation PR


Note

Medium Risk
Touches core connection lifecycle (supervisor, registry, relay discovery) and ordering between wakeups and network state; behavior is heavily tested but regressions could affect reconnect timing or discovery offline flags.

Overview
Fixes environments staying offline or on stale retry state when mobile suspends network listeners while the app is backgrounded.

Introduces Connectivity.followNetworkStatus in client-runtime: applies the current status at startup, streams connectivity.changes, and on application-active wakeups re-reads connectivity.status with revision sequencing and a lock so live change events beat stale async snapshots and duplicate applies are skipped.

EnvironmentSupervisor, EnvironmentRegistry, and RelayEnvironmentDiscovery now use this helper instead of separate subscriptions to network changes and wakeups; relay discovery adds networkStateLock so offline/refresh transitions stay consistent with in-flight status reads.

On mobile (platform.ts), connectivity changes no longer polls Network.getNetworkStateAsync on AppState active—that refresh is centralized in followNetworkStatus via wakeups.

New unit tests cover the follower, supervisor recovery when online was missed without a listener event, and relay offline/online edge cases.

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

Note

Refresh network status on app activation using Connectivity.followNetworkStatus

  • Introduces Connectivity.followNetworkStatus in connectivity.ts, a new effect that consumes connectivity status, change events, and wakeup signals to apply network status updates via a callback, with deduplication and revision-based sequencing to prevent stale async reads from overwriting newer change events.
  • Wires followNetworkStatus into EnvironmentSupervisor, EnvironmentRegistry, and RelayEnvironmentDiscovery, replacing direct subscriptions to connectivity.changes and ConnectionWakeups.changes.
  • On app activation (wakeup), the current network status is re-read and applied only if no newer change event has arrived, fixing missed transitions while the app was suspended.
  • RelayEnvironmentDiscovery adds a networkStateLock semaphore to serialize offline/refresh transitions against concurrent connectivity changes.
  • Behavioral Change: the mobile platform layer in platform.ts no longer emits a connectivity event on AppState active transitions; wakeup-driven refresh is now handled entirely within followNetworkStatus.

Macroscope summarized 1cdcc15.

@coderabbitai

coderabbitaiBot commented Aug 7, 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: deaa0201-97bc-486d-a84f-5edd5b49dafb

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

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.

Comment threadpackages/client-runtime/src/connection/connectivity.ts
@macroscopeapp

macroscopeappBot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a new followNetworkStatus utility with revision-based concurrency handling that changes how network status is tracked and refreshed across multiple connection-related components. The synchronization changes and cross-cutting behavioral modifications to core connection infrastructure warrant human review.

No code changes detected at 8e38c0b. Prior analysis still applies.

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

@DominicVonk
DominicVonkforce-pushed the codex/network-status-refresh branch from baad669 to b8f4356CompareAugust 7, 2026 11:27
Comment threadpackages/client-runtime/src/connection/connectivity.ts
@DominicVonk
DominicVonkforce-pushed the codex/network-status-refresh branch 4 times, most recently from cdebe1a to 8fa621eCompareAugust 7, 2026 11:44
Comment threadpackages/client-runtime/src/connection/connectivity.ts
Comment threadpackages/client-runtime/src/relay/discovery.ts Outdated
@DominicVonk
DominicVonkforce-pushed the codex/network-status-refresh branch from 8fa621e to 7920591CompareAugust 7, 2026 15:48

@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.

There are 2 total unresolved issues (including 1 from previous review).

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 7920591. Configure here.

Comment threadpackages/client-runtime/src/connection/supervisor.ts
@DominicVonkDominicVonk changed the title [1/5] fix(connection): refresh network status after app activation[1/3] fix(connection): refresh network status after app activationAug 7, 2026
@DominicVonkDominicVonk changed the title [1/3] fix(connection): refresh network status after app activationfix(connection): refresh network status after app activationAug 7, 2026
DominicVonkand others added 3 commits August 10, 2026 12:58
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: codex <codex@users.noreply.github.com>
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

@DominicVonk
, '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(connection): refresh network status after app activation - #5597

Open
DominicVonk wants to merge 3 commits into
pingdotgg:mainfrom
DominicVonk:codex/network-status-refresh
Open

fix(connection): refresh network status after app activation#5597
DominicVonk wants to merge 3 commits into
pingdotgg:mainfrom
DominicVonk:codex/network-status-refresh

Conversation

@DominicVonk

@DominicVonkDominicVonk commented Aug 7, 2026

Copy link
Copy Markdown

Mobile network listeners can miss connectivity changes while the app is suspended. After returning to the foreground, an environment could remain offline or continue an old retry ladder even though the live network was available again.

This change adds one shared connectivity follower that:

  • applies the current network state when a connection runtime starts;
  • refreshes the authoritative platform status on application activation;
  • serializes live reports and refresh snapshots so later reports always win;
  • ignores duplicate reports without invalidating a newer refresh;
  • delivers wakeup signals and refreshed network state in one deterministic order;
  • refreshes managed relay discovery through the same lifecycle path.

The behavior is shared by web, desktop, and mobile through client-runtime. No wire contract or provider adapter changes are required.

Related independent PRs

These PRs all target main and can be merged in any order:

Verification

  • vp test run packages/client-runtime/src/connection/connectivity.test.ts packages/client-runtime/src/connection/supervisor.test.ts packages/client-runtime/src/relay/discovery.test.ts
    • 3 files passed
    • 48 tests passed
  • vp run --filter @t3tools/client-runtime typecheck
    • passed; one pre-existing Effect suggestion remains in relay discovery
  • targeted vp lint for the six changed runtime/test files
    • passed
  • fallow audit --base upstream/main
    • passed the new-change gate; inherited repository findings were excluded

No screenshot is included because this PR changes lifecycle ordering rather than rendered UI.

Built and reviewed with GPT-5 Codex via Codex CLI.

Fork validation PR


Note

Medium Risk
Touches core connection lifecycle (supervisor, registry, relay discovery) and ordering between wakeups and network state; behavior is heavily tested but regressions could affect reconnect timing or discovery offline flags.

Overview
Fixes environments staying offline or on stale retry state when mobile suspends network listeners while the app is backgrounded.

Introduces Connectivity.followNetworkStatus in client-runtime: applies the current status at startup, streams connectivity.changes, and on application-active wakeups re-reads connectivity.status with revision sequencing and a lock so live change events beat stale async snapshots and duplicate applies are skipped.

EnvironmentSupervisor, EnvironmentRegistry, and RelayEnvironmentDiscovery now use this helper instead of separate subscriptions to network changes and wakeups; relay discovery adds networkStateLock so offline/refresh transitions stay consistent with in-flight status reads.

On mobile (platform.ts), connectivity changes no longer polls Network.getNetworkStateAsync on AppState active—that refresh is centralized in followNetworkStatus via wakeups.

New unit tests cover the follower, supervisor recovery when online was missed without a listener event, and relay offline/online edge cases.

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

Note

Refresh network status on app activation using Connectivity.followNetworkStatus

  • Introduces Connectivity.followNetworkStatus in connectivity.ts, a new effect that consumes connectivity status, change events, and wakeup signals to apply network status updates via a callback, with deduplication and revision-based sequencing to prevent stale async reads from overwriting newer change events.
  • Wires followNetworkStatus into EnvironmentSupervisor, EnvironmentRegistry, and RelayEnvironmentDiscovery, replacing direct subscriptions to connectivity.changes and ConnectionWakeups.changes.
  • On app activation (wakeup), the current network status is re-read and applied only if no newer change event has arrived, fixing missed transitions while the app was suspended.
  • RelayEnvironmentDiscovery adds a networkStateLock semaphore to serialize offline/refresh transitions against concurrent connectivity changes.
  • Behavioral Change: the mobile platform layer in platform.ts no longer emits a connectivity event on AppState active transitions; wakeup-driven refresh is now handled entirely within followNetworkStatus.

Macroscope summarized 1cdcc15.

@coderabbitai

coderabbitaiBot commented Aug 7, 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: deaa0201-97bc-486d-a84f-5edd5b49dafb

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

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.

Comment threadpackages/client-runtime/src/connection/connectivity.ts
@macroscopeapp

macroscopeappBot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a new followNetworkStatus utility with revision-based concurrency handling that changes how network status is tracked and refreshed across multiple connection-related components. The synchronization changes and cross-cutting behavioral modifications to core connection infrastructure warrant human review.

No code changes detected at 8e38c0b. Prior analysis still applies.

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

@DominicVonk
DominicVonkforce-pushed the codex/network-status-refresh branch from baad669 to b8f4356CompareAugust 7, 2026 11:27
Comment threadpackages/client-runtime/src/connection/connectivity.ts
@DominicVonk
DominicVonkforce-pushed the codex/network-status-refresh branch 4 times, most recently from cdebe1a to 8fa621eCompareAugust 7, 2026 11:44
Comment threadpackages/client-runtime/src/connection/connectivity.ts
Comment threadpackages/client-runtime/src/relay/discovery.ts Outdated
@DominicVonk
DominicVonkforce-pushed the codex/network-status-refresh branch from 8fa621e to 7920591CompareAugust 7, 2026 15:48

@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.

There are 2 total unresolved issues (including 1 from previous review).

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 7920591. Configure here.

Comment threadpackages/client-runtime/src/connection/supervisor.ts
@DominicVonkDominicVonk changed the title [1/5] fix(connection): refresh network status after app activation[1/3] fix(connection): refresh network status after app activationAug 7, 2026
@DominicVonkDominicVonk changed the title [1/3] fix(connection): refresh network status after app activationfix(connection): refresh network status after app activationAug 7, 2026
DominicVonkand others added 3 commits August 10, 2026 12:58
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: codex <codex@users.noreply.github.com>
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

@DominicVonk
, '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(connection): refresh network status after app activation - #5597

Open
DominicVonk wants to merge 3 commits into
pingdotgg:mainfrom
DominicVonk:codex/network-status-refresh
Open

fix(connection): refresh network status after app activation#5597
DominicVonk wants to merge 3 commits into
pingdotgg:mainfrom
DominicVonk:codex/network-status-refresh

Conversation

@DominicVonk

@DominicVonkDominicVonk commented Aug 7, 2026

Copy link
Copy Markdown

Mobile network listeners can miss connectivity changes while the app is suspended. After returning to the foreground, an environment could remain offline or continue an old retry ladder even though the live network was available again.

This change adds one shared connectivity follower that:

  • applies the current network state when a connection runtime starts;
  • refreshes the authoritative platform status on application activation;
  • serializes live reports and refresh snapshots so later reports always win;
  • ignores duplicate reports without invalidating a newer refresh;
  • delivers wakeup signals and refreshed network state in one deterministic order;
  • refreshes managed relay discovery through the same lifecycle path.

The behavior is shared by web, desktop, and mobile through client-runtime. No wire contract or provider adapter changes are required.

Related independent PRs

These PRs all target main and can be merged in any order:

Verification

  • vp test run packages/client-runtime/src/connection/connectivity.test.ts packages/client-runtime/src/connection/supervisor.test.ts packages/client-runtime/src/relay/discovery.test.ts
    • 3 files passed
    • 48 tests passed
  • vp run --filter @t3tools/client-runtime typecheck
    • passed; one pre-existing Effect suggestion remains in relay discovery
  • targeted vp lint for the six changed runtime/test files
    • passed
  • fallow audit --base upstream/main
    • passed the new-change gate; inherited repository findings were excluded

No screenshot is included because this PR changes lifecycle ordering rather than rendered UI.

Built and reviewed with GPT-5 Codex via Codex CLI.

Fork validation PR


Note

Medium Risk
Touches core connection lifecycle (supervisor, registry, relay discovery) and ordering between wakeups and network state; behavior is heavily tested but regressions could affect reconnect timing or discovery offline flags.

Overview
Fixes environments staying offline or on stale retry state when mobile suspends network listeners while the app is backgrounded.

Introduces Connectivity.followNetworkStatus in client-runtime: applies the current status at startup, streams connectivity.changes, and on application-active wakeups re-reads connectivity.status with revision sequencing and a lock so live change events beat stale async snapshots and duplicate applies are skipped.

EnvironmentSupervisor, EnvironmentRegistry, and RelayEnvironmentDiscovery now use this helper instead of separate subscriptions to network changes and wakeups; relay discovery adds networkStateLock so offline/refresh transitions stay consistent with in-flight status reads.

On mobile (platform.ts), connectivity changes no longer polls Network.getNetworkStateAsync on AppState active—that refresh is centralized in followNetworkStatus via wakeups.

New unit tests cover the follower, supervisor recovery when online was missed without a listener event, and relay offline/online edge cases.

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

Note

Refresh network status on app activation using Connectivity.followNetworkStatus

  • Introduces Connectivity.followNetworkStatus in connectivity.ts, a new effect that consumes connectivity status, change events, and wakeup signals to apply network status updates via a callback, with deduplication and revision-based sequencing to prevent stale async reads from overwriting newer change events.
  • Wires followNetworkStatus into EnvironmentSupervisor, EnvironmentRegistry, and RelayEnvironmentDiscovery, replacing direct subscriptions to connectivity.changes and ConnectionWakeups.changes.
  • On app activation (wakeup), the current network status is re-read and applied only if no newer change event has arrived, fixing missed transitions while the app was suspended.
  • RelayEnvironmentDiscovery adds a networkStateLock semaphore to serialize offline/refresh transitions against concurrent connectivity changes.
  • Behavioral Change: the mobile platform layer in platform.ts no longer emits a connectivity event on AppState active transitions; wakeup-driven refresh is now handled entirely within followNetworkStatus.

Macroscope summarized 1cdcc15.

@coderabbitai

coderabbitaiBot commented Aug 7, 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: deaa0201-97bc-486d-a84f-5edd5b49dafb

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

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.

Comment threadpackages/client-runtime/src/connection/connectivity.ts
@macroscopeapp

macroscopeappBot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a new followNetworkStatus utility with revision-based concurrency handling that changes how network status is tracked and refreshed across multiple connection-related components. The synchronization changes and cross-cutting behavioral modifications to core connection infrastructure warrant human review.

No code changes detected at 8e38c0b. Prior analysis still applies.

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

@DominicVonk
DominicVonkforce-pushed the codex/network-status-refresh branch from baad669 to b8f4356CompareAugust 7, 2026 11:27
Comment threadpackages/client-runtime/src/connection/connectivity.ts
@DominicVonk
DominicVonkforce-pushed the codex/network-status-refresh branch 4 times, most recently from cdebe1a to 8fa621eCompareAugust 7, 2026 11:44
Comment threadpackages/client-runtime/src/connection/connectivity.ts
Comment threadpackages/client-runtime/src/relay/discovery.ts Outdated
@DominicVonk
DominicVonkforce-pushed the codex/network-status-refresh branch from 8fa621e to 7920591CompareAugust 7, 2026 15:48

@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.

There are 2 total unresolved issues (including 1 from previous review).

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 7920591. Configure here.

Comment threadpackages/client-runtime/src/connection/supervisor.ts
@DominicVonkDominicVonk changed the title [1/5] fix(connection): refresh network status after app activation[1/3] fix(connection): refresh network status after app activationAug 7, 2026
@DominicVonkDominicVonk changed the title [1/3] fix(connection): refresh network status after app activationfix(connection): refresh network status after app activationAug 7, 2026
DominicVonkand others added 3 commits August 10, 2026 12:58
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: codex <codex@users.noreply.github.com>
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

@DominicVonk
, '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(connection): refresh network status after app activation - #5597

Open
DominicVonk wants to merge 3 commits into
pingdotgg:mainfrom
DominicVonk:codex/network-status-refresh
Open

fix(connection): refresh network status after app activation#5597
DominicVonk wants to merge 3 commits into
pingdotgg:mainfrom
DominicVonk:codex/network-status-refresh

Conversation

@DominicVonk

@DominicVonkDominicVonk commented Aug 7, 2026

Copy link
Copy Markdown

Mobile network listeners can miss connectivity changes while the app is suspended. After returning to the foreground, an environment could remain offline or continue an old retry ladder even though the live network was available again.

This change adds one shared connectivity follower that:

  • applies the current network state when a connection runtime starts;
  • refreshes the authoritative platform status on application activation;
  • serializes live reports and refresh snapshots so later reports always win;
  • ignores duplicate reports without invalidating a newer refresh;
  • delivers wakeup signals and refreshed network state in one deterministic order;
  • refreshes managed relay discovery through the same lifecycle path.

The behavior is shared by web, desktop, and mobile through client-runtime. No wire contract or provider adapter changes are required.

Related independent PRs

These PRs all target main and can be merged in any order:

Verification

  • vp test run packages/client-runtime/src/connection/connectivity.test.ts packages/client-runtime/src/connection/supervisor.test.ts packages/client-runtime/src/relay/discovery.test.ts
    • 3 files passed
    • 48 tests passed
  • vp run --filter @t3tools/client-runtime typecheck
    • passed; one pre-existing Effect suggestion remains in relay discovery
  • targeted vp lint for the six changed runtime/test files
    • passed
  • fallow audit --base upstream/main
    • passed the new-change gate; inherited repository findings were excluded

No screenshot is included because this PR changes lifecycle ordering rather than rendered UI.

Built and reviewed with GPT-5 Codex via Codex CLI.

Fork validation PR


Note

Medium Risk
Touches core connection lifecycle (supervisor, registry, relay discovery) and ordering between wakeups and network state; behavior is heavily tested but regressions could affect reconnect timing or discovery offline flags.

Overview
Fixes environments staying offline or on stale retry state when mobile suspends network listeners while the app is backgrounded.

Introduces Connectivity.followNetworkStatus in client-runtime: applies the current status at startup, streams connectivity.changes, and on application-active wakeups re-reads connectivity.status with revision sequencing and a lock so live change events beat stale async snapshots and duplicate applies are skipped.

EnvironmentSupervisor, EnvironmentRegistry, and RelayEnvironmentDiscovery now use this helper instead of separate subscriptions to network changes and wakeups; relay discovery adds networkStateLock so offline/refresh transitions stay consistent with in-flight status reads.

On mobile (platform.ts), connectivity changes no longer polls Network.getNetworkStateAsync on AppState active—that refresh is centralized in followNetworkStatus via wakeups.

New unit tests cover the follower, supervisor recovery when online was missed without a listener event, and relay offline/online edge cases.

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

Note

Refresh network status on app activation using Connectivity.followNetworkStatus

  • Introduces Connectivity.followNetworkStatus in connectivity.ts, a new effect that consumes connectivity status, change events, and wakeup signals to apply network status updates via a callback, with deduplication and revision-based sequencing to prevent stale async reads from overwriting newer change events.
  • Wires followNetworkStatus into EnvironmentSupervisor, EnvironmentRegistry, and RelayEnvironmentDiscovery, replacing direct subscriptions to connectivity.changes and ConnectionWakeups.changes.
  • On app activation (wakeup), the current network status is re-read and applied only if no newer change event has arrived, fixing missed transitions while the app was suspended.
  • RelayEnvironmentDiscovery adds a networkStateLock semaphore to serialize offline/refresh transitions against concurrent connectivity changes.
  • Behavioral Change: the mobile platform layer in platform.ts no longer emits a connectivity event on AppState active transitions; wakeup-driven refresh is now handled entirely within followNetworkStatus.

Macroscope summarized 1cdcc15.

@coderabbitai

coderabbitaiBot commented Aug 7, 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: deaa0201-97bc-486d-a84f-5edd5b49dafb

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

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.

Comment threadpackages/client-runtime/src/connection/connectivity.ts
@macroscopeapp

macroscopeappBot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a new followNetworkStatus utility with revision-based concurrency handling that changes how network status is tracked and refreshed across multiple connection-related components. The synchronization changes and cross-cutting behavioral modifications to core connection infrastructure warrant human review.

No code changes detected at 8e38c0b. Prior analysis still applies.

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

@DominicVonk
DominicVonkforce-pushed the codex/network-status-refresh branch from baad669 to b8f4356CompareAugust 7, 2026 11:27
Comment threadpackages/client-runtime/src/connection/connectivity.ts
@DominicVonk
DominicVonkforce-pushed the codex/network-status-refresh branch 4 times, most recently from cdebe1a to 8fa621eCompareAugust 7, 2026 11:44
Comment threadpackages/client-runtime/src/connection/connectivity.ts
Comment threadpackages/client-runtime/src/relay/discovery.ts Outdated
@DominicVonk
DominicVonkforce-pushed the codex/network-status-refresh branch from 8fa621e to 7920591CompareAugust 7, 2026 15:48

@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.

There are 2 total unresolved issues (including 1 from previous review).

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 7920591. Configure here.

Comment threadpackages/client-runtime/src/connection/supervisor.ts
@DominicVonkDominicVonk changed the title [1/5] fix(connection): refresh network status after app activation[1/3] fix(connection): refresh network status after app activationAug 7, 2026
@DominicVonkDominicVonk changed the title [1/3] fix(connection): refresh network status after app activationfix(connection): refresh network status after app activationAug 7, 2026
DominicVonkand others added 3 commits August 10, 2026 12:58
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: codex <codex@users.noreply.github.com>
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

@DominicVonk
, '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(connection): refresh network status after app activation - #5597

Open
DominicVonk wants to merge 3 commits into
pingdotgg:mainfrom
DominicVonk:codex/network-status-refresh
Open

fix(connection): refresh network status after app activation#5597
DominicVonk wants to merge 3 commits into
pingdotgg:mainfrom
DominicVonk:codex/network-status-refresh

Conversation

@DominicVonk

@DominicVonkDominicVonk commented Aug 7, 2026

Copy link
Copy Markdown

Mobile network listeners can miss connectivity changes while the app is suspended. After returning to the foreground, an environment could remain offline or continue an old retry ladder even though the live network was available again.

This change adds one shared connectivity follower that:

  • applies the current network state when a connection runtime starts;
  • refreshes the authoritative platform status on application activation;
  • serializes live reports and refresh snapshots so later reports always win;
  • ignores duplicate reports without invalidating a newer refresh;
  • delivers wakeup signals and refreshed network state in one deterministic order;
  • refreshes managed relay discovery through the same lifecycle path.

The behavior is shared by web, desktop, and mobile through client-runtime. No wire contract or provider adapter changes are required.

Related independent PRs

These PRs all target main and can be merged in any order:

Verification

  • vp test run packages/client-runtime/src/connection/connectivity.test.ts packages/client-runtime/src/connection/supervisor.test.ts packages/client-runtime/src/relay/discovery.test.ts
    • 3 files passed
    • 48 tests passed
  • vp run --filter @t3tools/client-runtime typecheck
    • passed; one pre-existing Effect suggestion remains in relay discovery
  • targeted vp lint for the six changed runtime/test files
    • passed
  • fallow audit --base upstream/main
    • passed the new-change gate; inherited repository findings were excluded

No screenshot is included because this PR changes lifecycle ordering rather than rendered UI.

Built and reviewed with GPT-5 Codex via Codex CLI.

Fork validation PR


Note

Medium Risk
Touches core connection lifecycle (supervisor, registry, relay discovery) and ordering between wakeups and network state; behavior is heavily tested but regressions could affect reconnect timing or discovery offline flags.

Overview
Fixes environments staying offline or on stale retry state when mobile suspends network listeners while the app is backgrounded.

Introduces Connectivity.followNetworkStatus in client-runtime: applies the current status at startup, streams connectivity.changes, and on application-active wakeups re-reads connectivity.status with revision sequencing and a lock so live change events beat stale async snapshots and duplicate applies are skipped.

EnvironmentSupervisor, EnvironmentRegistry, and RelayEnvironmentDiscovery now use this helper instead of separate subscriptions to network changes and wakeups; relay discovery adds networkStateLock so offline/refresh transitions stay consistent with in-flight status reads.

On mobile (platform.ts), connectivity changes no longer polls Network.getNetworkStateAsync on AppState active—that refresh is centralized in followNetworkStatus via wakeups.

New unit tests cover the follower, supervisor recovery when online was missed without a listener event, and relay offline/online edge cases.

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

Note

Refresh network status on app activation using Connectivity.followNetworkStatus

  • Introduces Connectivity.followNetworkStatus in connectivity.ts, a new effect that consumes connectivity status, change events, and wakeup signals to apply network status updates via a callback, with deduplication and revision-based sequencing to prevent stale async reads from overwriting newer change events.
  • Wires followNetworkStatus into EnvironmentSupervisor, EnvironmentRegistry, and RelayEnvironmentDiscovery, replacing direct subscriptions to connectivity.changes and ConnectionWakeups.changes.
  • On app activation (wakeup), the current network status is re-read and applied only if no newer change event has arrived, fixing missed transitions while the app was suspended.
  • RelayEnvironmentDiscovery adds a networkStateLock semaphore to serialize offline/refresh transitions against concurrent connectivity changes.
  • Behavioral Change: the mobile platform layer in platform.ts no longer emits a connectivity event on AppState active transitions; wakeup-driven refresh is now handled entirely within followNetworkStatus.

Macroscope summarized 1cdcc15.

@coderabbitai

coderabbitaiBot commented Aug 7, 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: deaa0201-97bc-486d-a84f-5edd5b49dafb

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

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.

Comment threadpackages/client-runtime/src/connection/connectivity.ts
@macroscopeapp

macroscopeappBot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a new followNetworkStatus utility with revision-based concurrency handling that changes how network status is tracked and refreshed across multiple connection-related components. The synchronization changes and cross-cutting behavioral modifications to core connection infrastructure warrant human review.

No code changes detected at 8e38c0b. Prior analysis still applies.

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

@DominicVonk
DominicVonkforce-pushed the codex/network-status-refresh branch from baad669 to b8f4356CompareAugust 7, 2026 11:27
Comment threadpackages/client-runtime/src/connection/connectivity.ts
@DominicVonk
DominicVonkforce-pushed the codex/network-status-refresh branch 4 times, most recently from cdebe1a to 8fa621eCompareAugust 7, 2026 11:44
Comment threadpackages/client-runtime/src/connection/connectivity.ts
Comment threadpackages/client-runtime/src/relay/discovery.ts Outdated
@DominicVonk
DominicVonkforce-pushed the codex/network-status-refresh branch from 8fa621e to 7920591CompareAugust 7, 2026 15:48

@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.

There are 2 total unresolved issues (including 1 from previous review).

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 7920591. Configure here.

Comment threadpackages/client-runtime/src/connection/supervisor.ts
@DominicVonkDominicVonk changed the title [1/5] fix(connection): refresh network status after app activation[1/3] fix(connection): refresh network status after app activationAug 7, 2026
@DominicVonkDominicVonk changed the title [1/3] fix(connection): refresh network status after app activationfix(connection): refresh network status after app activationAug 7, 2026
DominicVonkand others added 3 commits August 10, 2026 12:58
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: codex <codex@users.noreply.github.com>
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

@DominicVonk
, '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(connection): refresh network status after app activation - #5597

Open
DominicVonk wants to merge 3 commits into
pingdotgg:mainfrom
DominicVonk:codex/network-status-refresh
Open

fix(connection): refresh network status after app activation#5597
DominicVonk wants to merge 3 commits into
pingdotgg:mainfrom
DominicVonk:codex/network-status-refresh

Conversation

@DominicVonk

@DominicVonkDominicVonk commented Aug 7, 2026

Copy link
Copy Markdown

Mobile network listeners can miss connectivity changes while the app is suspended. After returning to the foreground, an environment could remain offline or continue an old retry ladder even though the live network was available again.

This change adds one shared connectivity follower that:

  • applies the current network state when a connection runtime starts;
  • refreshes the authoritative platform status on application activation;
  • serializes live reports and refresh snapshots so later reports always win;
  • ignores duplicate reports without invalidating a newer refresh;
  • delivers wakeup signals and refreshed network state in one deterministic order;
  • refreshes managed relay discovery through the same lifecycle path.

The behavior is shared by web, desktop, and mobile through client-runtime. No wire contract or provider adapter changes are required.

Related independent PRs

These PRs all target main and can be merged in any order:

Verification

  • vp test run packages/client-runtime/src/connection/connectivity.test.ts packages/client-runtime/src/connection/supervisor.test.ts packages/client-runtime/src/relay/discovery.test.ts
    • 3 files passed
    • 48 tests passed
  • vp run --filter @t3tools/client-runtime typecheck
    • passed; one pre-existing Effect suggestion remains in relay discovery
  • targeted vp lint for the six changed runtime/test files
    • passed
  • fallow audit --base upstream/main
    • passed the new-change gate; inherited repository findings were excluded

No screenshot is included because this PR changes lifecycle ordering rather than rendered UI.

Built and reviewed with GPT-5 Codex via Codex CLI.

Fork validation PR


Note

Medium Risk
Touches core connection lifecycle (supervisor, registry, relay discovery) and ordering between wakeups and network state; behavior is heavily tested but regressions could affect reconnect timing or discovery offline flags.

Overview
Fixes environments staying offline or on stale retry state when mobile suspends network listeners while the app is backgrounded.

Introduces Connectivity.followNetworkStatus in client-runtime: applies the current status at startup, streams connectivity.changes, and on application-active wakeups re-reads connectivity.status with revision sequencing and a lock so live change events beat stale async snapshots and duplicate applies are skipped.

EnvironmentSupervisor, EnvironmentRegistry, and RelayEnvironmentDiscovery now use this helper instead of separate subscriptions to network changes and wakeups; relay discovery adds networkStateLock so offline/refresh transitions stay consistent with in-flight status reads.

On mobile (platform.ts), connectivity changes no longer polls Network.getNetworkStateAsync on AppState active—that refresh is centralized in followNetworkStatus via wakeups.

New unit tests cover the follower, supervisor recovery when online was missed without a listener event, and relay offline/online edge cases.

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

Note

Refresh network status on app activation using Connectivity.followNetworkStatus

  • Introduces Connectivity.followNetworkStatus in connectivity.ts, a new effect that consumes connectivity status, change events, and wakeup signals to apply network status updates via a callback, with deduplication and revision-based sequencing to prevent stale async reads from overwriting newer change events.
  • Wires followNetworkStatus into EnvironmentSupervisor, EnvironmentRegistry, and RelayEnvironmentDiscovery, replacing direct subscriptions to connectivity.changes and ConnectionWakeups.changes.
  • On app activation (wakeup), the current network status is re-read and applied only if no newer change event has arrived, fixing missed transitions while the app was suspended.
  • RelayEnvironmentDiscovery adds a networkStateLock semaphore to serialize offline/refresh transitions against concurrent connectivity changes.
  • Behavioral Change: the mobile platform layer in platform.ts no longer emits a connectivity event on AppState active transitions; wakeup-driven refresh is now handled entirely within followNetworkStatus.

Macroscope summarized 1cdcc15.

@coderabbitai

coderabbitaiBot commented Aug 7, 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: deaa0201-97bc-486d-a84f-5edd5b49dafb

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

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.

Comment threadpackages/client-runtime/src/connection/connectivity.ts
@macroscopeapp

macroscopeappBot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a new followNetworkStatus utility with revision-based concurrency handling that changes how network status is tracked and refreshed across multiple connection-related components. The synchronization changes and cross-cutting behavioral modifications to core connection infrastructure warrant human review.

No code changes detected at 8e38c0b. Prior analysis still applies.

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

@DominicVonk
DominicVonkforce-pushed the codex/network-status-refresh branch from baad669 to b8f4356CompareAugust 7, 2026 11:27
Comment threadpackages/client-runtime/src/connection/connectivity.ts
@DominicVonk
DominicVonkforce-pushed the codex/network-status-refresh branch 4 times, most recently from cdebe1a to 8fa621eCompareAugust 7, 2026 11:44
Comment threadpackages/client-runtime/src/connection/connectivity.ts
Comment threadpackages/client-runtime/src/relay/discovery.ts Outdated
@DominicVonk
DominicVonkforce-pushed the codex/network-status-refresh branch from 8fa621e to 7920591CompareAugust 7, 2026 15:48

@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.

There are 2 total unresolved issues (including 1 from previous review).

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 7920591. Configure here.

Comment threadpackages/client-runtime/src/connection/supervisor.ts
@DominicVonkDominicVonk changed the title [1/5] fix(connection): refresh network status after app activation[1/3] fix(connection): refresh network status after app activationAug 7, 2026
@DominicVonkDominicVonk changed the title [1/3] fix(connection): refresh network status after app activationfix(connection): refresh network status after app activationAug 7, 2026
DominicVonkand others added 3 commits August 10, 2026 12:58
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: codex <codex@users.noreply.github.com>
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

@DominicVonk
, '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(connection): refresh network status after app activation - #5597

Open
DominicVonk wants to merge 3 commits into
pingdotgg:mainfrom
DominicVonk:codex/network-status-refresh
Open

fix(connection): refresh network status after app activation#5597
DominicVonk wants to merge 3 commits into
pingdotgg:mainfrom
DominicVonk:codex/network-status-refresh

Conversation

@DominicVonk

@DominicVonkDominicVonk commented Aug 7, 2026

Copy link
Copy Markdown

Mobile network listeners can miss connectivity changes while the app is suspended. After returning to the foreground, an environment could remain offline or continue an old retry ladder even though the live network was available again.

This change adds one shared connectivity follower that:

  • applies the current network state when a connection runtime starts;
  • refreshes the authoritative platform status on application activation;
  • serializes live reports and refresh snapshots so later reports always win;
  • ignores duplicate reports without invalidating a newer refresh;
  • delivers wakeup signals and refreshed network state in one deterministic order;
  • refreshes managed relay discovery through the same lifecycle path.

The behavior is shared by web, desktop, and mobile through client-runtime. No wire contract or provider adapter changes are required.

Related independent PRs

These PRs all target main and can be merged in any order:

Verification

  • vp test run packages/client-runtime/src/connection/connectivity.test.ts packages/client-runtime/src/connection/supervisor.test.ts packages/client-runtime/src/relay/discovery.test.ts
    • 3 files passed
    • 48 tests passed
  • vp run --filter @t3tools/client-runtime typecheck
    • passed; one pre-existing Effect suggestion remains in relay discovery
  • targeted vp lint for the six changed runtime/test files
    • passed
  • fallow audit --base upstream/main
    • passed the new-change gate; inherited repository findings were excluded

No screenshot is included because this PR changes lifecycle ordering rather than rendered UI.

Built and reviewed with GPT-5 Codex via Codex CLI.

Fork validation PR


Note

Medium Risk
Touches core connection lifecycle (supervisor, registry, relay discovery) and ordering between wakeups and network state; behavior is heavily tested but regressions could affect reconnect timing or discovery offline flags.

Overview
Fixes environments staying offline or on stale retry state when mobile suspends network listeners while the app is backgrounded.

Introduces Connectivity.followNetworkStatus in client-runtime: applies the current status at startup, streams connectivity.changes, and on application-active wakeups re-reads connectivity.status with revision sequencing and a lock so live change events beat stale async snapshots and duplicate applies are skipped.

EnvironmentSupervisor, EnvironmentRegistry, and RelayEnvironmentDiscovery now use this helper instead of separate subscriptions to network changes and wakeups; relay discovery adds networkStateLock so offline/refresh transitions stay consistent with in-flight status reads.

On mobile (platform.ts), connectivity changes no longer polls Network.getNetworkStateAsync on AppState active—that refresh is centralized in followNetworkStatus via wakeups.

New unit tests cover the follower, supervisor recovery when online was missed without a listener event, and relay offline/online edge cases.

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

Note

Refresh network status on app activation using Connectivity.followNetworkStatus

  • Introduces Connectivity.followNetworkStatus in connectivity.ts, a new effect that consumes connectivity status, change events, and wakeup signals to apply network status updates via a callback, with deduplication and revision-based sequencing to prevent stale async reads from overwriting newer change events.
  • Wires followNetworkStatus into EnvironmentSupervisor, EnvironmentRegistry, and RelayEnvironmentDiscovery, replacing direct subscriptions to connectivity.changes and ConnectionWakeups.changes.
  • On app activation (wakeup), the current network status is re-read and applied only if no newer change event has arrived, fixing missed transitions while the app was suspended.
  • RelayEnvironmentDiscovery adds a networkStateLock semaphore to serialize offline/refresh transitions against concurrent connectivity changes.
  • Behavioral Change: the mobile platform layer in platform.ts no longer emits a connectivity event on AppState active transitions; wakeup-driven refresh is now handled entirely within followNetworkStatus.

Macroscope summarized 1cdcc15.

@coderabbitai

coderabbitaiBot commented Aug 7, 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: deaa0201-97bc-486d-a84f-5edd5b49dafb

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

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.

Comment threadpackages/client-runtime/src/connection/connectivity.ts
@macroscopeapp

macroscopeappBot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a new followNetworkStatus utility with revision-based concurrency handling that changes how network status is tracked and refreshed across multiple connection-related components. The synchronization changes and cross-cutting behavioral modifications to core connection infrastructure warrant human review.

No code changes detected at 8e38c0b. Prior analysis still applies.

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

@DominicVonk
DominicVonkforce-pushed the codex/network-status-refresh branch from baad669 to b8f4356CompareAugust 7, 2026 11:27
Comment threadpackages/client-runtime/src/connection/connectivity.ts
@DominicVonk
DominicVonkforce-pushed the codex/network-status-refresh branch 4 times, most recently from cdebe1a to 8fa621eCompareAugust 7, 2026 11:44
Comment threadpackages/client-runtime/src/connection/connectivity.ts
Comment threadpackages/client-runtime/src/relay/discovery.ts Outdated
@DominicVonk
DominicVonkforce-pushed the codex/network-status-refresh branch from 8fa621e to 7920591CompareAugust 7, 2026 15:48

@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.

There are 2 total unresolved issues (including 1 from previous review).

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 7920591. Configure here.

Comment threadpackages/client-runtime/src/connection/supervisor.ts
@DominicVonkDominicVonk changed the title [1/5] fix(connection): refresh network status after app activation[1/3] fix(connection): refresh network status after app activationAug 7, 2026
@DominicVonkDominicVonk changed the title [1/3] fix(connection): refresh network status after app activationfix(connection): refresh network status after app activationAug 7, 2026
DominicVonkand others added 3 commits August 10, 2026 12:58
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: codex <codex@users.noreply.github.com>
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

@DominicVonk