fix(web): project default model works on the hosted app - #9142

Merged
juliusmarminge merged 5 commits into
mainfrom
t3code/fix-remote-provider-settings
Sep 2, 2026
Merged

fix(web): project default model works on the hosted app#9142
juliusmarminge merged 5 commits into
mainfrom
t3code/fix-remote-provider-settings

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Sep 2, 2026

Copy link
Copy Markdown
Member

On app.t3.codes, project settings showed "No providers available" for the default model, and the global server-scoped settings (new-thread workspace, background activity, …) displayed schema defaults and silently dropped every write. Not local state: the hosted app registers no PrimaryConnectionTarget (platform.ts returns Stream.empty when isHostedStaticApp()), so everything wired to the primary-environment atoms resolved to nothing there.

Fix

  • Project settings reads providers and provider-instance settings from the environment that owns the project (serverEnvironment.providersValueAtom / useEnvironmentSettings), the same way the composer already does. The model picker now works on hosted; desktop and server-served web are unchanged since primary and project environment coincide there.
  • Stopgap for global settings, which need a proper anchor-environment story separately: SettingsRow gets a serverScoped flag. Rows whose value lives in the primary environment's settings.json (14 across General, Integrations, Source Control) render inert with a tooltip when there is no primary, instead of an editable control that never saves. Client-keyed rows are untouched.
  • useUpdateSettingsTarget toasts "Setting not saved" when a server patch has no environment to go to, instead of discarding it.

usePrimarySettingsAvailable() is primaryEnvironment !== null || !isHostedStaticApp(), so desktop/local never flash the disabled state during boot, and if hosted later gains an anchor environment the disabling switches itself off.

Before / after (hosted mode: VITE_HOSTED_APP_CHANNEL=nightly, server paired as a remote)

BeforeAfter
beforeafter

Server-scoped global rows on hosted:

tooltip

Demo — picking and resetting a project default model on the hosted client, then the inert global rows with their tooltip:

https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b5fa546346309015/hosted-settings-demo-trimmed.mp4

Verified with apps/web typecheck, lint on the changed files, and the useSettings / settingsLayout / ProjectSettingsPanel.logic tests.

Claude Fable 5 via Claude Code in T3 Code.

🤖 Generated with Claude Code


Note

Medium Risk
Touches settings persistence and provider resolution paths; hosted users lose editability for primary-only globals (by design), while desktop/server-served behavior should be unchanged via usePrimarySettingsAvailable.

Overview
Fixes hosted app (app.t3.codes) behavior where project default model showed "No providers available" and global server settings looked editable but never persisted.

Project settings now load providers and provider-instance settings from the project's environment (useEnvironmentSettings / per-environment provider atoms) instead of the primary server, so the default model picker works when every connection is a remote.

Global server-scoped settings get a serverScoped flag on SettingsRow: when there is no primary environment, controls render inert (dimmed, non-interactive) with a tooltip explaining the setting must be changed from desktop or the server's URL. Many General, Integrations, and Source Control rows are marked accordingly; source-control writing sections stay visible instead of being hidden on non-primary environments.

Persistence: useUpdateSettingsTarget shows a "Setting not saved" warning toast instead of silently dropping server patches when no environmentId is available. isHostedStaticApp() is safe to call without window for tests/static render.

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

Note

Make hosted-app settings server-scoped and resolve project default model from its own environment

  • Adds a serverScoped flag to SettingsRow in settingsLayout.tsx so rows become inert and show a shared explanation when the hosted static app has no primary server
  • Adds usePrimarySettingsAvailable in useSettings.ts to detect the hosted-without-server state, and emits a warning toast when server-backed settings are updated without a target environment
  • Reworks ProjectSettingsPanel.tsx to load provider instances, model options, and plan-mode flags from the representative project's environment rather than primary settings
  • Marks many general, legacy, source-control, and integration rows as server-scoped across multiple settings panels
  • Fixes isHostedStaticApp in hostedPairing.ts to avoid accessing window in windowless runtimes
  • Risk: useUpdateSettingsTarget now shows a warning toast and drops server-setting patches that arrive without an environment ID; reviewers should verify the no-env path in useSettings.ts does not regress existing client-side setting saves

Macroscope summarized a79208c.

The hosted app has no primary environment, so anything wired to the
primary-environment atoms resolved to nothing there. Project settings
showed "No providers available" for the default model, and the global
server-scoped settings displayed schema defaults and silently dropped
writes.
Project settings now reads providers and provider-instance settings
from the environment that owns the project. Global rows that live in
the primary environment's settings.json are marked serverScoped and
render inert with a tooltip when there is no primary; dropped server
writes surface a toast instead of vanishing.
Co-Authored-By: Claude Code <noreply@anthropic.com>
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Sep 2, 2026
@github-actions

github-actionsBot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.1 KiB13.2 KiB+80 B (+0.6%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB−4 B (−0.1%)7.3 KiB
CodexLive turn WebSocket wire6.2 KiB6.3 KiB+84 B (+1.3%)7.8 KiB
CodexLive turn WebSocket decoded54.7 KiB55.5 KiB+822 B (+1.5%)66.4 KiB
CodexLive turn messages880 (0.0%)21
ClaudeTotal thread wire13.2 KiB13.4 KiB+295 B (+2.2%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB−4 B (−0.1%)7.3 KiB
ClaudeLive turn WebSocket wire6.3 KiB6.5 KiB+299 B (+4.7%)7.8 KiB
ClaudeLive turn WebSocket decoded55.5 KiB57.8 KiB+2.3 KiB (+4.2%)66.4 KiB
ClaudeLive turn messages810+2 (+25.0%)21

Baseline: b21d872 · PR result: a79208c · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 109.4 KiB
  • Claude decoded thread snapshot: 110.1 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

Comment threadapps/web/src/components/settings/settingsLayout.tsx Outdated
juliusmarmingeand others added 2 commits September 1, 2026 17:38
SettingsRow now calls usePrimarySettingsAvailable on every render, and
settingsLayout.test.tsx renders it with renderToStaticMarkup in node,
where the default-parameter window read threw.
Co-Authored-By: Claude Code <noreply@anthropic.com>
…hosted
Review follow-ups: the tooltip trigger around an inert control is now
focusable so keyboard users can read why it is disabled, and the source
control writing section renders on the hosted app instead of being
hidden, since its rows are serverScoped and explain themselves.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Comment threadapps/web/src/components/settings/IntegrationsSettings.tsx
Co-Authored-By: Claude Code <noreply@anthropic.com>

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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

Fix All in Cursor

Bugbot Autofix is ON, but a cloud agent failed to start.

Reviewed by Cursor Bugbot for commit f078b90. Configure here.

Comment threadapps/web/src/components/settings/settingsLayout.tsx
Co-Authored-By: Claude Code <noreply@anthropic.com>
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR changes how project default-model settings are resolved and changes the availability and persistence behavior of multiple server-scoped settings in the hosted app. The product-default behavior and the desktop/remote environment boundaries warrant human review.

You can add or adjust custom eligibility rules. Learn more.

@juliusmarminge
juliusmarminge merged commit 0e1570b into mainSep 2, 2026
27 checks passed
@juliusmarminge
juliusmarminge deleted the t3code/fix-remote-provider-settings branch September 2, 2026 02:26
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 2, 2026
## What's Changed
* perf(client-runtime): keep turn and checkpoint refs stable while streaming by @t3dotgg in pingdotgg/t3code#9145
* perf(clients): lease sidebar status by visibility by @StiensWout in pingdotgg/t3code#9052
* fix(desktop): show newest changes in nightly previews by @t3dotgg in pingdotgg/t3code#9138
* fix(settings): sync auto-settle and other shared preferences across environments by @t3dotgg in pingdotgg/t3code#9147
* fix(server): prevent accidental service downgrades by @t3dotgg in pingdotgg/t3code#5302
* fix(server): keep attachments until the command commits by @t3dotgg in pingdotgg/t3code#7941
* fix(claude): preview images read from the workspace by @t3dotgg in pingdotgg/t3code#9119
* fix(web): keep generated muted foreground dimmer than entered text by @flamboh in pingdotgg/t3code#9113
* fix(clients): stop repeating expanded commands by @t3dotgg in pingdotgg/t3code#9120
* fix(grok): health check, model selection, and stop all work against the real CLI by @t3dotgg in pingdotgg/t3code#9154
* perf(web): halve the cold-start bundle by splitting Clerk and cold routes by @StiensWout in pingdotgg/t3code#9058
* feat(desktop): update the desktop app on remote Macs from the Update button by @t3dotgg in pingdotgg/t3code#6554
* test(server): measure shell, second client, and reconnect transfer by @t3dotgg in pingdotgg/t3code#9157
* fix(web): project default model works on the hosted app by @juliusmarminge in pingdotgg/t3code#9142
* fix(web): darken neutral control surfaces by @maria-rcks in pingdotgg/t3code#9064
* fix(web): preserve panel state across workspace refreshes by @maria-rcks in pingdotgg/t3code#8968
* feat(files): open markdown, HTML, and PDF files outside the workspace by @juliusmarminge in pingdotgg/t3code#9140
* feat(web): render HTML and PDF files in the file viewer by @juliusmarminge in pingdotgg/t3code#9143
* fix(web): compact project settings actions by @maria-rcks in pingdotgg/t3code#9160
* fix(web): browse folders from file breadcrumbs by @404khai in pingdotgg/t3code#8910
## New Contributors
* @404khai made their first contribution in pingdotgg/t3code#8910
**Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260902.1252...v0.0.39-nightly.20260902.1253
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260902.1253
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:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@juliusmarminge
, '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): project default model works on the hosted app - #9142

Merged
juliusmarminge merged 5 commits into
mainfrom
t3code/fix-remote-provider-settings
Sep 2, 2026
Merged

fix(web): project default model works on the hosted app#9142
juliusmarminge merged 5 commits into
mainfrom
t3code/fix-remote-provider-settings

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Sep 2, 2026

Copy link
Copy Markdown
Member

On app.t3.codes, project settings showed "No providers available" for the default model, and the global server-scoped settings (new-thread workspace, background activity, …) displayed schema defaults and silently dropped every write. Not local state: the hosted app registers no PrimaryConnectionTarget (platform.ts returns Stream.empty when isHostedStaticApp()), so everything wired to the primary-environment atoms resolved to nothing there.

Fix

  • Project settings reads providers and provider-instance settings from the environment that owns the project (serverEnvironment.providersValueAtom / useEnvironmentSettings), the same way the composer already does. The model picker now works on hosted; desktop and server-served web are unchanged since primary and project environment coincide there.
  • Stopgap for global settings, which need a proper anchor-environment story separately: SettingsRow gets a serverScoped flag. Rows whose value lives in the primary environment's settings.json (14 across General, Integrations, Source Control) render inert with a tooltip when there is no primary, instead of an editable control that never saves. Client-keyed rows are untouched.
  • useUpdateSettingsTarget toasts "Setting not saved" when a server patch has no environment to go to, instead of discarding it.

usePrimarySettingsAvailable() is primaryEnvironment !== null || !isHostedStaticApp(), so desktop/local never flash the disabled state during boot, and if hosted later gains an anchor environment the disabling switches itself off.

Before / after (hosted mode: VITE_HOSTED_APP_CHANNEL=nightly, server paired as a remote)

BeforeAfter
beforeafter

Server-scoped global rows on hosted:

tooltip

Demo — picking and resetting a project default model on the hosted client, then the inert global rows with their tooltip:

https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b5fa546346309015/hosted-settings-demo-trimmed.mp4

Verified with apps/web typecheck, lint on the changed files, and the useSettings / settingsLayout / ProjectSettingsPanel.logic tests.

Claude Fable 5 via Claude Code in T3 Code.

🤖 Generated with Claude Code


Note

Medium Risk
Touches settings persistence and provider resolution paths; hosted users lose editability for primary-only globals (by design), while desktop/server-served behavior should be unchanged via usePrimarySettingsAvailable.

Overview
Fixes hosted app (app.t3.codes) behavior where project default model showed "No providers available" and global server settings looked editable but never persisted.

Project settings now load providers and provider-instance settings from the project's environment (useEnvironmentSettings / per-environment provider atoms) instead of the primary server, so the default model picker works when every connection is a remote.

Global server-scoped settings get a serverScoped flag on SettingsRow: when there is no primary environment, controls render inert (dimmed, non-interactive) with a tooltip explaining the setting must be changed from desktop or the server's URL. Many General, Integrations, and Source Control rows are marked accordingly; source-control writing sections stay visible instead of being hidden on non-primary environments.

Persistence: useUpdateSettingsTarget shows a "Setting not saved" warning toast instead of silently dropping server patches when no environmentId is available. isHostedStaticApp() is safe to call without window for tests/static render.

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

Note

Make hosted-app settings server-scoped and resolve project default model from its own environment

  • Adds a serverScoped flag to SettingsRow in settingsLayout.tsx so rows become inert and show a shared explanation when the hosted static app has no primary server
  • Adds usePrimarySettingsAvailable in useSettings.ts to detect the hosted-without-server state, and emits a warning toast when server-backed settings are updated without a target environment
  • Reworks ProjectSettingsPanel.tsx to load provider instances, model options, and plan-mode flags from the representative project's environment rather than primary settings
  • Marks many general, legacy, source-control, and integration rows as server-scoped across multiple settings panels
  • Fixes isHostedStaticApp in hostedPairing.ts to avoid accessing window in windowless runtimes
  • Risk: useUpdateSettingsTarget now shows a warning toast and drops server-setting patches that arrive without an environment ID; reviewers should verify the no-env path in useSettings.ts does not regress existing client-side setting saves

Macroscope summarized a79208c.

The hosted app has no primary environment, so anything wired to the
primary-environment atoms resolved to nothing there. Project settings
showed "No providers available" for the default model, and the global
server-scoped settings displayed schema defaults and silently dropped
writes.
Project settings now reads providers and provider-instance settings
from the environment that owns the project. Global rows that live in
the primary environment's settings.json are marked serverScoped and
render inert with a tooltip when there is no primary; dropped server
writes surface a toast instead of vanishing.
Co-Authored-By: Claude Code <noreply@anthropic.com>
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Sep 2, 2026
@github-actions

github-actionsBot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.1 KiB13.2 KiB+80 B (+0.6%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB−4 B (−0.1%)7.3 KiB
CodexLive turn WebSocket wire6.2 KiB6.3 KiB+84 B (+1.3%)7.8 KiB
CodexLive turn WebSocket decoded54.7 KiB55.5 KiB+822 B (+1.5%)66.4 KiB
CodexLive turn messages880 (0.0%)21
ClaudeTotal thread wire13.2 KiB13.4 KiB+295 B (+2.2%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB−4 B (−0.1%)7.3 KiB
ClaudeLive turn WebSocket wire6.3 KiB6.5 KiB+299 B (+4.7%)7.8 KiB
ClaudeLive turn WebSocket decoded55.5 KiB57.8 KiB+2.3 KiB (+4.2%)66.4 KiB
ClaudeLive turn messages810+2 (+25.0%)21

Baseline: b21d872 · PR result: a79208c · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 109.4 KiB
  • Claude decoded thread snapshot: 110.1 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

Comment threadapps/web/src/components/settings/settingsLayout.tsx Outdated
juliusmarmingeand others added 2 commits September 1, 2026 17:38
SettingsRow now calls usePrimarySettingsAvailable on every render, and
settingsLayout.test.tsx renders it with renderToStaticMarkup in node,
where the default-parameter window read threw.
Co-Authored-By: Claude Code <noreply@anthropic.com>
…hosted
Review follow-ups: the tooltip trigger around an inert control is now
focusable so keyboard users can read why it is disabled, and the source
control writing section renders on the hosted app instead of being
hidden, since its rows are serverScoped and explain themselves.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Comment threadapps/web/src/components/settings/IntegrationsSettings.tsx
Co-Authored-By: Claude Code <noreply@anthropic.com>

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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

Fix All in Cursor

Bugbot Autofix is ON, but a cloud agent failed to start.

Reviewed by Cursor Bugbot for commit f078b90. Configure here.

Comment threadapps/web/src/components/settings/settingsLayout.tsx
Co-Authored-By: Claude Code <noreply@anthropic.com>
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR changes how project default-model settings are resolved and changes the availability and persistence behavior of multiple server-scoped settings in the hosted app. The product-default behavior and the desktop/remote environment boundaries warrant human review.

You can add or adjust custom eligibility rules. Learn more.

@juliusmarminge
juliusmarminge merged commit 0e1570b into mainSep 2, 2026
27 checks passed
@juliusmarminge
juliusmarminge deleted the t3code/fix-remote-provider-settings branch September 2, 2026 02:26
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 2, 2026
## What's Changed
* perf(client-runtime): keep turn and checkpoint refs stable while streaming by @t3dotgg in pingdotgg/t3code#9145
* perf(clients): lease sidebar status by visibility by @StiensWout in pingdotgg/t3code#9052
* fix(desktop): show newest changes in nightly previews by @t3dotgg in pingdotgg/t3code#9138
* fix(settings): sync auto-settle and other shared preferences across environments by @t3dotgg in pingdotgg/t3code#9147
* fix(server): prevent accidental service downgrades by @t3dotgg in pingdotgg/t3code#5302
* fix(server): keep attachments until the command commits by @t3dotgg in pingdotgg/t3code#7941
* fix(claude): preview images read from the workspace by @t3dotgg in pingdotgg/t3code#9119
* fix(web): keep generated muted foreground dimmer than entered text by @flamboh in pingdotgg/t3code#9113
* fix(clients): stop repeating expanded commands by @t3dotgg in pingdotgg/t3code#9120
* fix(grok): health check, model selection, and stop all work against the real CLI by @t3dotgg in pingdotgg/t3code#9154
* perf(web): halve the cold-start bundle by splitting Clerk and cold routes by @StiensWout in pingdotgg/t3code#9058
* feat(desktop): update the desktop app on remote Macs from the Update button by @t3dotgg in pingdotgg/t3code#6554
* test(server): measure shell, second client, and reconnect transfer by @t3dotgg in pingdotgg/t3code#9157
* fix(web): project default model works on the hosted app by @juliusmarminge in pingdotgg/t3code#9142
* fix(web): darken neutral control surfaces by @maria-rcks in pingdotgg/t3code#9064
* fix(web): preserve panel state across workspace refreshes by @maria-rcks in pingdotgg/t3code#8968
* feat(files): open markdown, HTML, and PDF files outside the workspace by @juliusmarminge in pingdotgg/t3code#9140
* feat(web): render HTML and PDF files in the file viewer by @juliusmarminge in pingdotgg/t3code#9143
* fix(web): compact project settings actions by @maria-rcks in pingdotgg/t3code#9160
* fix(web): browse folders from file breadcrumbs by @404khai in pingdotgg/t3code#8910
## New Contributors
* @404khai made their first contribution in pingdotgg/t3code#8910
**Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260902.1252...v0.0.39-nightly.20260902.1253
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260902.1253
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:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@juliusmarminge
, '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): project default model works on the hosted app - #9142

Merged
juliusmarminge merged 5 commits into
mainfrom
t3code/fix-remote-provider-settings
Sep 2, 2026
Merged

fix(web): project default model works on the hosted app#9142
juliusmarminge merged 5 commits into
mainfrom
t3code/fix-remote-provider-settings

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Sep 2, 2026

Copy link
Copy Markdown
Member

On app.t3.codes, project settings showed "No providers available" for the default model, and the global server-scoped settings (new-thread workspace, background activity, …) displayed schema defaults and silently dropped every write. Not local state: the hosted app registers no PrimaryConnectionTarget (platform.ts returns Stream.empty when isHostedStaticApp()), so everything wired to the primary-environment atoms resolved to nothing there.

Fix

  • Project settings reads providers and provider-instance settings from the environment that owns the project (serverEnvironment.providersValueAtom / useEnvironmentSettings), the same way the composer already does. The model picker now works on hosted; desktop and server-served web are unchanged since primary and project environment coincide there.
  • Stopgap for global settings, which need a proper anchor-environment story separately: SettingsRow gets a serverScoped flag. Rows whose value lives in the primary environment's settings.json (14 across General, Integrations, Source Control) render inert with a tooltip when there is no primary, instead of an editable control that never saves. Client-keyed rows are untouched.
  • useUpdateSettingsTarget toasts "Setting not saved" when a server patch has no environment to go to, instead of discarding it.

usePrimarySettingsAvailable() is primaryEnvironment !== null || !isHostedStaticApp(), so desktop/local never flash the disabled state during boot, and if hosted later gains an anchor environment the disabling switches itself off.

Before / after (hosted mode: VITE_HOSTED_APP_CHANNEL=nightly, server paired as a remote)

BeforeAfter
beforeafter

Server-scoped global rows on hosted:

tooltip

Demo — picking and resetting a project default model on the hosted client, then the inert global rows with their tooltip:

https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b5fa546346309015/hosted-settings-demo-trimmed.mp4

Verified with apps/web typecheck, lint on the changed files, and the useSettings / settingsLayout / ProjectSettingsPanel.logic tests.

Claude Fable 5 via Claude Code in T3 Code.

🤖 Generated with Claude Code


Note

Medium Risk
Touches settings persistence and provider resolution paths; hosted users lose editability for primary-only globals (by design), while desktop/server-served behavior should be unchanged via usePrimarySettingsAvailable.

Overview
Fixes hosted app (app.t3.codes) behavior where project default model showed "No providers available" and global server settings looked editable but never persisted.

Project settings now load providers and provider-instance settings from the project's environment (useEnvironmentSettings / per-environment provider atoms) instead of the primary server, so the default model picker works when every connection is a remote.

Global server-scoped settings get a serverScoped flag on SettingsRow: when there is no primary environment, controls render inert (dimmed, non-interactive) with a tooltip explaining the setting must be changed from desktop or the server's URL. Many General, Integrations, and Source Control rows are marked accordingly; source-control writing sections stay visible instead of being hidden on non-primary environments.

Persistence: useUpdateSettingsTarget shows a "Setting not saved" warning toast instead of silently dropping server patches when no environmentId is available. isHostedStaticApp() is safe to call without window for tests/static render.

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

Note

Make hosted-app settings server-scoped and resolve project default model from its own environment

  • Adds a serverScoped flag to SettingsRow in settingsLayout.tsx so rows become inert and show a shared explanation when the hosted static app has no primary server
  • Adds usePrimarySettingsAvailable in useSettings.ts to detect the hosted-without-server state, and emits a warning toast when server-backed settings are updated without a target environment
  • Reworks ProjectSettingsPanel.tsx to load provider instances, model options, and plan-mode flags from the representative project's environment rather than primary settings
  • Marks many general, legacy, source-control, and integration rows as server-scoped across multiple settings panels
  • Fixes isHostedStaticApp in hostedPairing.ts to avoid accessing window in windowless runtimes
  • Risk: useUpdateSettingsTarget now shows a warning toast and drops server-setting patches that arrive without an environment ID; reviewers should verify the no-env path in useSettings.ts does not regress existing client-side setting saves

Macroscope summarized a79208c.

The hosted app has no primary environment, so anything wired to the
primary-environment atoms resolved to nothing there. Project settings
showed "No providers available" for the default model, and the global
server-scoped settings displayed schema defaults and silently dropped
writes.
Project settings now reads providers and provider-instance settings
from the environment that owns the project. Global rows that live in
the primary environment's settings.json are marked serverScoped and
render inert with a tooltip when there is no primary; dropped server
writes surface a toast instead of vanishing.
Co-Authored-By: Claude Code <noreply@anthropic.com>
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Sep 2, 2026
@github-actions

github-actionsBot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.1 KiB13.2 KiB+80 B (+0.6%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB−4 B (−0.1%)7.3 KiB
CodexLive turn WebSocket wire6.2 KiB6.3 KiB+84 B (+1.3%)7.8 KiB
CodexLive turn WebSocket decoded54.7 KiB55.5 KiB+822 B (+1.5%)66.4 KiB
CodexLive turn messages880 (0.0%)21
ClaudeTotal thread wire13.2 KiB13.4 KiB+295 B (+2.2%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB−4 B (−0.1%)7.3 KiB
ClaudeLive turn WebSocket wire6.3 KiB6.5 KiB+299 B (+4.7%)7.8 KiB
ClaudeLive turn WebSocket decoded55.5 KiB57.8 KiB+2.3 KiB (+4.2%)66.4 KiB
ClaudeLive turn messages810+2 (+25.0%)21

Baseline: b21d872 · PR result: a79208c · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 109.4 KiB
  • Claude decoded thread snapshot: 110.1 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

Comment threadapps/web/src/components/settings/settingsLayout.tsx Outdated
juliusmarmingeand others added 2 commits September 1, 2026 17:38
SettingsRow now calls usePrimarySettingsAvailable on every render, and
settingsLayout.test.tsx renders it with renderToStaticMarkup in node,
where the default-parameter window read threw.
Co-Authored-By: Claude Code <noreply@anthropic.com>
…hosted
Review follow-ups: the tooltip trigger around an inert control is now
focusable so keyboard users can read why it is disabled, and the source
control writing section renders on the hosted app instead of being
hidden, since its rows are serverScoped and explain themselves.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Comment threadapps/web/src/components/settings/IntegrationsSettings.tsx
Co-Authored-By: Claude Code <noreply@anthropic.com>

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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

Fix All in Cursor

Bugbot Autofix is ON, but a cloud agent failed to start.

Reviewed by Cursor Bugbot for commit f078b90. Configure here.

Comment threadapps/web/src/components/settings/settingsLayout.tsx
Co-Authored-By: Claude Code <noreply@anthropic.com>
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR changes how project default-model settings are resolved and changes the availability and persistence behavior of multiple server-scoped settings in the hosted app. The product-default behavior and the desktop/remote environment boundaries warrant human review.

You can add or adjust custom eligibility rules. Learn more.

@juliusmarminge
juliusmarminge merged commit 0e1570b into mainSep 2, 2026
27 checks passed
@juliusmarminge
juliusmarminge deleted the t3code/fix-remote-provider-settings branch September 2, 2026 02:26
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 2, 2026
## What's Changed
* perf(client-runtime): keep turn and checkpoint refs stable while streaming by @t3dotgg in pingdotgg/t3code#9145
* perf(clients): lease sidebar status by visibility by @StiensWout in pingdotgg/t3code#9052
* fix(desktop): show newest changes in nightly previews by @t3dotgg in pingdotgg/t3code#9138
* fix(settings): sync auto-settle and other shared preferences across environments by @t3dotgg in pingdotgg/t3code#9147
* fix(server): prevent accidental service downgrades by @t3dotgg in pingdotgg/t3code#5302
* fix(server): keep attachments until the command commits by @t3dotgg in pingdotgg/t3code#7941
* fix(claude): preview images read from the workspace by @t3dotgg in pingdotgg/t3code#9119
* fix(web): keep generated muted foreground dimmer than entered text by @flamboh in pingdotgg/t3code#9113
* fix(clients): stop repeating expanded commands by @t3dotgg in pingdotgg/t3code#9120
* fix(grok): health check, model selection, and stop all work against the real CLI by @t3dotgg in pingdotgg/t3code#9154
* perf(web): halve the cold-start bundle by splitting Clerk and cold routes by @StiensWout in pingdotgg/t3code#9058
* feat(desktop): update the desktop app on remote Macs from the Update button by @t3dotgg in pingdotgg/t3code#6554
* test(server): measure shell, second client, and reconnect transfer by @t3dotgg in pingdotgg/t3code#9157
* fix(web): project default model works on the hosted app by @juliusmarminge in pingdotgg/t3code#9142
* fix(web): darken neutral control surfaces by @maria-rcks in pingdotgg/t3code#9064
* fix(web): preserve panel state across workspace refreshes by @maria-rcks in pingdotgg/t3code#8968
* feat(files): open markdown, HTML, and PDF files outside the workspace by @juliusmarminge in pingdotgg/t3code#9140
* feat(web): render HTML and PDF files in the file viewer by @juliusmarminge in pingdotgg/t3code#9143
* fix(web): compact project settings actions by @maria-rcks in pingdotgg/t3code#9160
* fix(web): browse folders from file breadcrumbs by @404khai in pingdotgg/t3code#8910
## New Contributors
* @404khai made their first contribution in pingdotgg/t3code#8910
**Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260902.1252...v0.0.39-nightly.20260902.1253
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260902.1253
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:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@juliusmarminge
, '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): project default model works on the hosted app - #9142

Merged
juliusmarminge merged 5 commits into
mainfrom
t3code/fix-remote-provider-settings
Sep 2, 2026
Merged

fix(web): project default model works on the hosted app#9142
juliusmarminge merged 5 commits into
mainfrom
t3code/fix-remote-provider-settings

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Sep 2, 2026

Copy link
Copy Markdown
Member

On app.t3.codes, project settings showed "No providers available" for the default model, and the global server-scoped settings (new-thread workspace, background activity, …) displayed schema defaults and silently dropped every write. Not local state: the hosted app registers no PrimaryConnectionTarget (platform.ts returns Stream.empty when isHostedStaticApp()), so everything wired to the primary-environment atoms resolved to nothing there.

Fix

  • Project settings reads providers and provider-instance settings from the environment that owns the project (serverEnvironment.providersValueAtom / useEnvironmentSettings), the same way the composer already does. The model picker now works on hosted; desktop and server-served web are unchanged since primary and project environment coincide there.
  • Stopgap for global settings, which need a proper anchor-environment story separately: SettingsRow gets a serverScoped flag. Rows whose value lives in the primary environment's settings.json (14 across General, Integrations, Source Control) render inert with a tooltip when there is no primary, instead of an editable control that never saves. Client-keyed rows are untouched.
  • useUpdateSettingsTarget toasts "Setting not saved" when a server patch has no environment to go to, instead of discarding it.

usePrimarySettingsAvailable() is primaryEnvironment !== null || !isHostedStaticApp(), so desktop/local never flash the disabled state during boot, and if hosted later gains an anchor environment the disabling switches itself off.

Before / after (hosted mode: VITE_HOSTED_APP_CHANNEL=nightly, server paired as a remote)

BeforeAfter
beforeafter

Server-scoped global rows on hosted:

tooltip

Demo — picking and resetting a project default model on the hosted client, then the inert global rows with their tooltip:

https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b5fa546346309015/hosted-settings-demo-trimmed.mp4

Verified with apps/web typecheck, lint on the changed files, and the useSettings / settingsLayout / ProjectSettingsPanel.logic tests.

Claude Fable 5 via Claude Code in T3 Code.

🤖 Generated with Claude Code


Note

Medium Risk
Touches settings persistence and provider resolution paths; hosted users lose editability for primary-only globals (by design), while desktop/server-served behavior should be unchanged via usePrimarySettingsAvailable.

Overview
Fixes hosted app (app.t3.codes) behavior where project default model showed "No providers available" and global server settings looked editable but never persisted.

Project settings now load providers and provider-instance settings from the project's environment (useEnvironmentSettings / per-environment provider atoms) instead of the primary server, so the default model picker works when every connection is a remote.

Global server-scoped settings get a serverScoped flag on SettingsRow: when there is no primary environment, controls render inert (dimmed, non-interactive) with a tooltip explaining the setting must be changed from desktop or the server's URL. Many General, Integrations, and Source Control rows are marked accordingly; source-control writing sections stay visible instead of being hidden on non-primary environments.

Persistence: useUpdateSettingsTarget shows a "Setting not saved" warning toast instead of silently dropping server patches when no environmentId is available. isHostedStaticApp() is safe to call without window for tests/static render.

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

Note

Make hosted-app settings server-scoped and resolve project default model from its own environment

  • Adds a serverScoped flag to SettingsRow in settingsLayout.tsx so rows become inert and show a shared explanation when the hosted static app has no primary server
  • Adds usePrimarySettingsAvailable in useSettings.ts to detect the hosted-without-server state, and emits a warning toast when server-backed settings are updated without a target environment
  • Reworks ProjectSettingsPanel.tsx to load provider instances, model options, and plan-mode flags from the representative project's environment rather than primary settings
  • Marks many general, legacy, source-control, and integration rows as server-scoped across multiple settings panels
  • Fixes isHostedStaticApp in hostedPairing.ts to avoid accessing window in windowless runtimes
  • Risk: useUpdateSettingsTarget now shows a warning toast and drops server-setting patches that arrive without an environment ID; reviewers should verify the no-env path in useSettings.ts does not regress existing client-side setting saves

Macroscope summarized a79208c.

The hosted app has no primary environment, so anything wired to the
primary-environment atoms resolved to nothing there. Project settings
showed "No providers available" for the default model, and the global
server-scoped settings displayed schema defaults and silently dropped
writes.
Project settings now reads providers and provider-instance settings
from the environment that owns the project. Global rows that live in
the primary environment's settings.json are marked serverScoped and
render inert with a tooltip when there is no primary; dropped server
writes surface a toast instead of vanishing.
Co-Authored-By: Claude Code <noreply@anthropic.com>
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Sep 2, 2026
@github-actions

github-actionsBot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.1 KiB13.2 KiB+80 B (+0.6%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB−4 B (−0.1%)7.3 KiB
CodexLive turn WebSocket wire6.2 KiB6.3 KiB+84 B (+1.3%)7.8 KiB
CodexLive turn WebSocket decoded54.7 KiB55.5 KiB+822 B (+1.5%)66.4 KiB
CodexLive turn messages880 (0.0%)21
ClaudeTotal thread wire13.2 KiB13.4 KiB+295 B (+2.2%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB−4 B (−0.1%)7.3 KiB
ClaudeLive turn WebSocket wire6.3 KiB6.5 KiB+299 B (+4.7%)7.8 KiB
ClaudeLive turn WebSocket decoded55.5 KiB57.8 KiB+2.3 KiB (+4.2%)66.4 KiB
ClaudeLive turn messages810+2 (+25.0%)21

Baseline: b21d872 · PR result: a79208c · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 109.4 KiB
  • Claude decoded thread snapshot: 110.1 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

Comment threadapps/web/src/components/settings/settingsLayout.tsx Outdated
juliusmarmingeand others added 2 commits September 1, 2026 17:38
SettingsRow now calls usePrimarySettingsAvailable on every render, and
settingsLayout.test.tsx renders it with renderToStaticMarkup in node,
where the default-parameter window read threw.
Co-Authored-By: Claude Code <noreply@anthropic.com>
…hosted
Review follow-ups: the tooltip trigger around an inert control is now
focusable so keyboard users can read why it is disabled, and the source
control writing section renders on the hosted app instead of being
hidden, since its rows are serverScoped and explain themselves.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Comment threadapps/web/src/components/settings/IntegrationsSettings.tsx
Co-Authored-By: Claude Code <noreply@anthropic.com>

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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

Fix All in Cursor

Bugbot Autofix is ON, but a cloud agent failed to start.

Reviewed by Cursor Bugbot for commit f078b90. Configure here.

Comment threadapps/web/src/components/settings/settingsLayout.tsx
Co-Authored-By: Claude Code <noreply@anthropic.com>
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR changes how project default-model settings are resolved and changes the availability and persistence behavior of multiple server-scoped settings in the hosted app. The product-default behavior and the desktop/remote environment boundaries warrant human review.

You can add or adjust custom eligibility rules. Learn more.

@juliusmarminge
juliusmarminge merged commit 0e1570b into mainSep 2, 2026
27 checks passed
@juliusmarminge
juliusmarminge deleted the t3code/fix-remote-provider-settings branch September 2, 2026 02:26
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 2, 2026
## What's Changed
* perf(client-runtime): keep turn and checkpoint refs stable while streaming by @t3dotgg in pingdotgg/t3code#9145
* perf(clients): lease sidebar status by visibility by @StiensWout in pingdotgg/t3code#9052
* fix(desktop): show newest changes in nightly previews by @t3dotgg in pingdotgg/t3code#9138
* fix(settings): sync auto-settle and other shared preferences across environments by @t3dotgg in pingdotgg/t3code#9147
* fix(server): prevent accidental service downgrades by @t3dotgg in pingdotgg/t3code#5302
* fix(server): keep attachments until the command commits by @t3dotgg in pingdotgg/t3code#7941
* fix(claude): preview images read from the workspace by @t3dotgg in pingdotgg/t3code#9119
* fix(web): keep generated muted foreground dimmer than entered text by @flamboh in pingdotgg/t3code#9113
* fix(clients): stop repeating expanded commands by @t3dotgg in pingdotgg/t3code#9120
* fix(grok): health check, model selection, and stop all work against the real CLI by @t3dotgg in pingdotgg/t3code#9154
* perf(web): halve the cold-start bundle by splitting Clerk and cold routes by @StiensWout in pingdotgg/t3code#9058
* feat(desktop): update the desktop app on remote Macs from the Update button by @t3dotgg in pingdotgg/t3code#6554
* test(server): measure shell, second client, and reconnect transfer by @t3dotgg in pingdotgg/t3code#9157
* fix(web): project default model works on the hosted app by @juliusmarminge in pingdotgg/t3code#9142
* fix(web): darken neutral control surfaces by @maria-rcks in pingdotgg/t3code#9064
* fix(web): preserve panel state across workspace refreshes by @maria-rcks in pingdotgg/t3code#8968
* feat(files): open markdown, HTML, and PDF files outside the workspace by @juliusmarminge in pingdotgg/t3code#9140
* feat(web): render HTML and PDF files in the file viewer by @juliusmarminge in pingdotgg/t3code#9143
* fix(web): compact project settings actions by @maria-rcks in pingdotgg/t3code#9160
* fix(web): browse folders from file breadcrumbs by @404khai in pingdotgg/t3code#8910
## New Contributors
* @404khai made their first contribution in pingdotgg/t3code#8910
**Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260902.1252...v0.0.39-nightly.20260902.1253
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260902.1253
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:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@juliusmarminge
, '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): project default model works on the hosted app - #9142

Merged
juliusmarminge merged 5 commits into
mainfrom
t3code/fix-remote-provider-settings
Sep 2, 2026
Merged

fix(web): project default model works on the hosted app#9142
juliusmarminge merged 5 commits into
mainfrom
t3code/fix-remote-provider-settings

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Sep 2, 2026

Copy link
Copy Markdown
Member

On app.t3.codes, project settings showed "No providers available" for the default model, and the global server-scoped settings (new-thread workspace, background activity, …) displayed schema defaults and silently dropped every write. Not local state: the hosted app registers no PrimaryConnectionTarget (platform.ts returns Stream.empty when isHostedStaticApp()), so everything wired to the primary-environment atoms resolved to nothing there.

Fix

  • Project settings reads providers and provider-instance settings from the environment that owns the project (serverEnvironment.providersValueAtom / useEnvironmentSettings), the same way the composer already does. The model picker now works on hosted; desktop and server-served web are unchanged since primary and project environment coincide there.
  • Stopgap for global settings, which need a proper anchor-environment story separately: SettingsRow gets a serverScoped flag. Rows whose value lives in the primary environment's settings.json (14 across General, Integrations, Source Control) render inert with a tooltip when there is no primary, instead of an editable control that never saves. Client-keyed rows are untouched.
  • useUpdateSettingsTarget toasts "Setting not saved" when a server patch has no environment to go to, instead of discarding it.

usePrimarySettingsAvailable() is primaryEnvironment !== null || !isHostedStaticApp(), so desktop/local never flash the disabled state during boot, and if hosted later gains an anchor environment the disabling switches itself off.

Before / after (hosted mode: VITE_HOSTED_APP_CHANNEL=nightly, server paired as a remote)

BeforeAfter
beforeafter

Server-scoped global rows on hosted:

tooltip

Demo — picking and resetting a project default model on the hosted client, then the inert global rows with their tooltip:

https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b5fa546346309015/hosted-settings-demo-trimmed.mp4

Verified with apps/web typecheck, lint on the changed files, and the useSettings / settingsLayout / ProjectSettingsPanel.logic tests.

Claude Fable 5 via Claude Code in T3 Code.

🤖 Generated with Claude Code


Note

Medium Risk
Touches settings persistence and provider resolution paths; hosted users lose editability for primary-only globals (by design), while desktop/server-served behavior should be unchanged via usePrimarySettingsAvailable.

Overview
Fixes hosted app (app.t3.codes) behavior where project default model showed "No providers available" and global server settings looked editable but never persisted.

Project settings now load providers and provider-instance settings from the project's environment (useEnvironmentSettings / per-environment provider atoms) instead of the primary server, so the default model picker works when every connection is a remote.

Global server-scoped settings get a serverScoped flag on SettingsRow: when there is no primary environment, controls render inert (dimmed, non-interactive) with a tooltip explaining the setting must be changed from desktop or the server's URL. Many General, Integrations, and Source Control rows are marked accordingly; source-control writing sections stay visible instead of being hidden on non-primary environments.

Persistence: useUpdateSettingsTarget shows a "Setting not saved" warning toast instead of silently dropping server patches when no environmentId is available. isHostedStaticApp() is safe to call without window for tests/static render.

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

Note

Make hosted-app settings server-scoped and resolve project default model from its own environment

  • Adds a serverScoped flag to SettingsRow in settingsLayout.tsx so rows become inert and show a shared explanation when the hosted static app has no primary server
  • Adds usePrimarySettingsAvailable in useSettings.ts to detect the hosted-without-server state, and emits a warning toast when server-backed settings are updated without a target environment
  • Reworks ProjectSettingsPanel.tsx to load provider instances, model options, and plan-mode flags from the representative project's environment rather than primary settings
  • Marks many general, legacy, source-control, and integration rows as server-scoped across multiple settings panels
  • Fixes isHostedStaticApp in hostedPairing.ts to avoid accessing window in windowless runtimes
  • Risk: useUpdateSettingsTarget now shows a warning toast and drops server-setting patches that arrive without an environment ID; reviewers should verify the no-env path in useSettings.ts does not regress existing client-side setting saves

Macroscope summarized a79208c.

The hosted app has no primary environment, so anything wired to the
primary-environment atoms resolved to nothing there. Project settings
showed "No providers available" for the default model, and the global
server-scoped settings displayed schema defaults and silently dropped
writes.
Project settings now reads providers and provider-instance settings
from the environment that owns the project. Global rows that live in
the primary environment's settings.json are marked serverScoped and
render inert with a tooltip when there is no primary; dropped server
writes surface a toast instead of vanishing.
Co-Authored-By: Claude Code <noreply@anthropic.com>
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Sep 2, 2026
@github-actions

github-actionsBot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.1 KiB13.2 KiB+80 B (+0.6%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB−4 B (−0.1%)7.3 KiB
CodexLive turn WebSocket wire6.2 KiB6.3 KiB+84 B (+1.3%)7.8 KiB
CodexLive turn WebSocket decoded54.7 KiB55.5 KiB+822 B (+1.5%)66.4 KiB
CodexLive turn messages880 (0.0%)21
ClaudeTotal thread wire13.2 KiB13.4 KiB+295 B (+2.2%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB−4 B (−0.1%)7.3 KiB
ClaudeLive turn WebSocket wire6.3 KiB6.5 KiB+299 B (+4.7%)7.8 KiB
ClaudeLive turn WebSocket decoded55.5 KiB57.8 KiB+2.3 KiB (+4.2%)66.4 KiB
ClaudeLive turn messages810+2 (+25.0%)21

Baseline: b21d872 · PR result: a79208c · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 109.4 KiB
  • Claude decoded thread snapshot: 110.1 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

Comment threadapps/web/src/components/settings/settingsLayout.tsx Outdated
juliusmarmingeand others added 2 commits September 1, 2026 17:38
SettingsRow now calls usePrimarySettingsAvailable on every render, and
settingsLayout.test.tsx renders it with renderToStaticMarkup in node,
where the default-parameter window read threw.
Co-Authored-By: Claude Code <noreply@anthropic.com>
…hosted
Review follow-ups: the tooltip trigger around an inert control is now
focusable so keyboard users can read why it is disabled, and the source
control writing section renders on the hosted app instead of being
hidden, since its rows are serverScoped and explain themselves.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Comment threadapps/web/src/components/settings/IntegrationsSettings.tsx
Co-Authored-By: Claude Code <noreply@anthropic.com>

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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

Fix All in Cursor

Bugbot Autofix is ON, but a cloud agent failed to start.

Reviewed by Cursor Bugbot for commit f078b90. Configure here.

Comment threadapps/web/src/components/settings/settingsLayout.tsx
Co-Authored-By: Claude Code <noreply@anthropic.com>
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR changes how project default-model settings are resolved and changes the availability and persistence behavior of multiple server-scoped settings in the hosted app. The product-default behavior and the desktop/remote environment boundaries warrant human review.

You can add or adjust custom eligibility rules. Learn more.

@juliusmarminge
juliusmarminge merged commit 0e1570b into mainSep 2, 2026
27 checks passed
@juliusmarminge
juliusmarminge deleted the t3code/fix-remote-provider-settings branch September 2, 2026 02:26
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 2, 2026
## What's Changed
* perf(client-runtime): keep turn and checkpoint refs stable while streaming by @t3dotgg in pingdotgg/t3code#9145
* perf(clients): lease sidebar status by visibility by @StiensWout in pingdotgg/t3code#9052
* fix(desktop): show newest changes in nightly previews by @t3dotgg in pingdotgg/t3code#9138
* fix(settings): sync auto-settle and other shared preferences across environments by @t3dotgg in pingdotgg/t3code#9147
* fix(server): prevent accidental service downgrades by @t3dotgg in pingdotgg/t3code#5302
* fix(server): keep attachments until the command commits by @t3dotgg in pingdotgg/t3code#7941
* fix(claude): preview images read from the workspace by @t3dotgg in pingdotgg/t3code#9119
* fix(web): keep generated muted foreground dimmer than entered text by @flamboh in pingdotgg/t3code#9113
* fix(clients): stop repeating expanded commands by @t3dotgg in pingdotgg/t3code#9120
* fix(grok): health check, model selection, and stop all work against the real CLI by @t3dotgg in pingdotgg/t3code#9154
* perf(web): halve the cold-start bundle by splitting Clerk and cold routes by @StiensWout in pingdotgg/t3code#9058
* feat(desktop): update the desktop app on remote Macs from the Update button by @t3dotgg in pingdotgg/t3code#6554
* test(server): measure shell, second client, and reconnect transfer by @t3dotgg in pingdotgg/t3code#9157
* fix(web): project default model works on the hosted app by @juliusmarminge in pingdotgg/t3code#9142
* fix(web): darken neutral control surfaces by @maria-rcks in pingdotgg/t3code#9064
* fix(web): preserve panel state across workspace refreshes by @maria-rcks in pingdotgg/t3code#8968
* feat(files): open markdown, HTML, and PDF files outside the workspace by @juliusmarminge in pingdotgg/t3code#9140
* feat(web): render HTML and PDF files in the file viewer by @juliusmarminge in pingdotgg/t3code#9143
* fix(web): compact project settings actions by @maria-rcks in pingdotgg/t3code#9160
* fix(web): browse folders from file breadcrumbs by @404khai in pingdotgg/t3code#8910
## New Contributors
* @404khai made their first contribution in pingdotgg/t3code#8910
**Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260902.1252...v0.0.39-nightly.20260902.1253
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260902.1253
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:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@juliusmarminge
, '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): project default model works on the hosted app - #9142

Merged
juliusmarminge merged 5 commits into
mainfrom
t3code/fix-remote-provider-settings
Sep 2, 2026
Merged

fix(web): project default model works on the hosted app#9142
juliusmarminge merged 5 commits into
mainfrom
t3code/fix-remote-provider-settings

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Sep 2, 2026

Copy link
Copy Markdown
Member

On app.t3.codes, project settings showed "No providers available" for the default model, and the global server-scoped settings (new-thread workspace, background activity, …) displayed schema defaults and silently dropped every write. Not local state: the hosted app registers no PrimaryConnectionTarget (platform.ts returns Stream.empty when isHostedStaticApp()), so everything wired to the primary-environment atoms resolved to nothing there.

Fix

  • Project settings reads providers and provider-instance settings from the environment that owns the project (serverEnvironment.providersValueAtom / useEnvironmentSettings), the same way the composer already does. The model picker now works on hosted; desktop and server-served web are unchanged since primary and project environment coincide there.
  • Stopgap for global settings, which need a proper anchor-environment story separately: SettingsRow gets a serverScoped flag. Rows whose value lives in the primary environment's settings.json (14 across General, Integrations, Source Control) render inert with a tooltip when there is no primary, instead of an editable control that never saves. Client-keyed rows are untouched.
  • useUpdateSettingsTarget toasts "Setting not saved" when a server patch has no environment to go to, instead of discarding it.

usePrimarySettingsAvailable() is primaryEnvironment !== null || !isHostedStaticApp(), so desktop/local never flash the disabled state during boot, and if hosted later gains an anchor environment the disabling switches itself off.

Before / after (hosted mode: VITE_HOSTED_APP_CHANNEL=nightly, server paired as a remote)

BeforeAfter
beforeafter

Server-scoped global rows on hosted:

tooltip

Demo — picking and resetting a project default model on the hosted client, then the inert global rows with their tooltip:

https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b5fa546346309015/hosted-settings-demo-trimmed.mp4

Verified with apps/web typecheck, lint on the changed files, and the useSettings / settingsLayout / ProjectSettingsPanel.logic tests.

Claude Fable 5 via Claude Code in T3 Code.

🤖 Generated with Claude Code


Note

Medium Risk
Touches settings persistence and provider resolution paths; hosted users lose editability for primary-only globals (by design), while desktop/server-served behavior should be unchanged via usePrimarySettingsAvailable.

Overview
Fixes hosted app (app.t3.codes) behavior where project default model showed "No providers available" and global server settings looked editable but never persisted.

Project settings now load providers and provider-instance settings from the project's environment (useEnvironmentSettings / per-environment provider atoms) instead of the primary server, so the default model picker works when every connection is a remote.

Global server-scoped settings get a serverScoped flag on SettingsRow: when there is no primary environment, controls render inert (dimmed, non-interactive) with a tooltip explaining the setting must be changed from desktop or the server's URL. Many General, Integrations, and Source Control rows are marked accordingly; source-control writing sections stay visible instead of being hidden on non-primary environments.

Persistence: useUpdateSettingsTarget shows a "Setting not saved" warning toast instead of silently dropping server patches when no environmentId is available. isHostedStaticApp() is safe to call without window for tests/static render.

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

Note

Make hosted-app settings server-scoped and resolve project default model from its own environment

  • Adds a serverScoped flag to SettingsRow in settingsLayout.tsx so rows become inert and show a shared explanation when the hosted static app has no primary server
  • Adds usePrimarySettingsAvailable in useSettings.ts to detect the hosted-without-server state, and emits a warning toast when server-backed settings are updated without a target environment
  • Reworks ProjectSettingsPanel.tsx to load provider instances, model options, and plan-mode flags from the representative project's environment rather than primary settings
  • Marks many general, legacy, source-control, and integration rows as server-scoped across multiple settings panels
  • Fixes isHostedStaticApp in hostedPairing.ts to avoid accessing window in windowless runtimes
  • Risk: useUpdateSettingsTarget now shows a warning toast and drops server-setting patches that arrive without an environment ID; reviewers should verify the no-env path in useSettings.ts does not regress existing client-side setting saves

Macroscope summarized a79208c.

The hosted app has no primary environment, so anything wired to the
primary-environment atoms resolved to nothing there. Project settings
showed "No providers available" for the default model, and the global
server-scoped settings displayed schema defaults and silently dropped
writes.
Project settings now reads providers and provider-instance settings
from the environment that owns the project. Global rows that live in
the primary environment's settings.json are marked serverScoped and
render inert with a tooltip when there is no primary; dropped server
writes surface a toast instead of vanishing.
Co-Authored-By: Claude Code <noreply@anthropic.com>
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Sep 2, 2026
@github-actions

github-actionsBot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.1 KiB13.2 KiB+80 B (+0.6%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB−4 B (−0.1%)7.3 KiB
CodexLive turn WebSocket wire6.2 KiB6.3 KiB+84 B (+1.3%)7.8 KiB
CodexLive turn WebSocket decoded54.7 KiB55.5 KiB+822 B (+1.5%)66.4 KiB
CodexLive turn messages880 (0.0%)21
ClaudeTotal thread wire13.2 KiB13.4 KiB+295 B (+2.2%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB−4 B (−0.1%)7.3 KiB
ClaudeLive turn WebSocket wire6.3 KiB6.5 KiB+299 B (+4.7%)7.8 KiB
ClaudeLive turn WebSocket decoded55.5 KiB57.8 KiB+2.3 KiB (+4.2%)66.4 KiB
ClaudeLive turn messages810+2 (+25.0%)21

Baseline: b21d872 · PR result: a79208c · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 109.4 KiB
  • Claude decoded thread snapshot: 110.1 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

Comment threadapps/web/src/components/settings/settingsLayout.tsx Outdated
juliusmarmingeand others added 2 commits September 1, 2026 17:38
SettingsRow now calls usePrimarySettingsAvailable on every render, and
settingsLayout.test.tsx renders it with renderToStaticMarkup in node,
where the default-parameter window read threw.
Co-Authored-By: Claude Code <noreply@anthropic.com>
…hosted
Review follow-ups: the tooltip trigger around an inert control is now
focusable so keyboard users can read why it is disabled, and the source
control writing section renders on the hosted app instead of being
hidden, since its rows are serverScoped and explain themselves.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Comment threadapps/web/src/components/settings/IntegrationsSettings.tsx
Co-Authored-By: Claude Code <noreply@anthropic.com>

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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

Fix All in Cursor

Bugbot Autofix is ON, but a cloud agent failed to start.

Reviewed by Cursor Bugbot for commit f078b90. Configure here.

Comment threadapps/web/src/components/settings/settingsLayout.tsx
Co-Authored-By: Claude Code <noreply@anthropic.com>
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR changes how project default-model settings are resolved and changes the availability and persistence behavior of multiple server-scoped settings in the hosted app. The product-default behavior and the desktop/remote environment boundaries warrant human review.

You can add or adjust custom eligibility rules. Learn more.

@juliusmarminge
juliusmarminge merged commit 0e1570b into mainSep 2, 2026
27 checks passed
@juliusmarminge
juliusmarminge deleted the t3code/fix-remote-provider-settings branch September 2, 2026 02:26
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 2, 2026
## What's Changed
* perf(client-runtime): keep turn and checkpoint refs stable while streaming by @t3dotgg in pingdotgg/t3code#9145
* perf(clients): lease sidebar status by visibility by @StiensWout in pingdotgg/t3code#9052
* fix(desktop): show newest changes in nightly previews by @t3dotgg in pingdotgg/t3code#9138
* fix(settings): sync auto-settle and other shared preferences across environments by @t3dotgg in pingdotgg/t3code#9147
* fix(server): prevent accidental service downgrades by @t3dotgg in pingdotgg/t3code#5302
* fix(server): keep attachments until the command commits by @t3dotgg in pingdotgg/t3code#7941
* fix(claude): preview images read from the workspace by @t3dotgg in pingdotgg/t3code#9119
* fix(web): keep generated muted foreground dimmer than entered text by @flamboh in pingdotgg/t3code#9113
* fix(clients): stop repeating expanded commands by @t3dotgg in pingdotgg/t3code#9120
* fix(grok): health check, model selection, and stop all work against the real CLI by @t3dotgg in pingdotgg/t3code#9154
* perf(web): halve the cold-start bundle by splitting Clerk and cold routes by @StiensWout in pingdotgg/t3code#9058
* feat(desktop): update the desktop app on remote Macs from the Update button by @t3dotgg in pingdotgg/t3code#6554
* test(server): measure shell, second client, and reconnect transfer by @t3dotgg in pingdotgg/t3code#9157
* fix(web): project default model works on the hosted app by @juliusmarminge in pingdotgg/t3code#9142
* fix(web): darken neutral control surfaces by @maria-rcks in pingdotgg/t3code#9064
* fix(web): preserve panel state across workspace refreshes by @maria-rcks in pingdotgg/t3code#8968
* feat(files): open markdown, HTML, and PDF files outside the workspace by @juliusmarminge in pingdotgg/t3code#9140
* feat(web): render HTML and PDF files in the file viewer by @juliusmarminge in pingdotgg/t3code#9143
* fix(web): compact project settings actions by @maria-rcks in pingdotgg/t3code#9160
* fix(web): browse folders from file breadcrumbs by @404khai in pingdotgg/t3code#8910
## New Contributors
* @404khai made their first contribution in pingdotgg/t3code#8910
**Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260902.1252...v0.0.39-nightly.20260902.1253
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260902.1253
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:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@juliusmarminge
, '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): project default model works on the hosted app - #9142

Merged
juliusmarminge merged 5 commits into
mainfrom
t3code/fix-remote-provider-settings
Sep 2, 2026
Merged

fix(web): project default model works on the hosted app#9142
juliusmarminge merged 5 commits into
mainfrom
t3code/fix-remote-provider-settings

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Sep 2, 2026

Copy link
Copy Markdown
Member

On app.t3.codes, project settings showed "No providers available" for the default model, and the global server-scoped settings (new-thread workspace, background activity, …) displayed schema defaults and silently dropped every write. Not local state: the hosted app registers no PrimaryConnectionTarget (platform.ts returns Stream.empty when isHostedStaticApp()), so everything wired to the primary-environment atoms resolved to nothing there.

Fix

  • Project settings reads providers and provider-instance settings from the environment that owns the project (serverEnvironment.providersValueAtom / useEnvironmentSettings), the same way the composer already does. The model picker now works on hosted; desktop and server-served web are unchanged since primary and project environment coincide there.
  • Stopgap for global settings, which need a proper anchor-environment story separately: SettingsRow gets a serverScoped flag. Rows whose value lives in the primary environment's settings.json (14 across General, Integrations, Source Control) render inert with a tooltip when there is no primary, instead of an editable control that never saves. Client-keyed rows are untouched.
  • useUpdateSettingsTarget toasts "Setting not saved" when a server patch has no environment to go to, instead of discarding it.

usePrimarySettingsAvailable() is primaryEnvironment !== null || !isHostedStaticApp(), so desktop/local never flash the disabled state during boot, and if hosted later gains an anchor environment the disabling switches itself off.

Before / after (hosted mode: VITE_HOSTED_APP_CHANNEL=nightly, server paired as a remote)

BeforeAfter
beforeafter

Server-scoped global rows on hosted:

tooltip

Demo — picking and resetting a project default model on the hosted client, then the inert global rows with their tooltip:

https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b5fa546346309015/hosted-settings-demo-trimmed.mp4

Verified with apps/web typecheck, lint on the changed files, and the useSettings / settingsLayout / ProjectSettingsPanel.logic tests.

Claude Fable 5 via Claude Code in T3 Code.

🤖 Generated with Claude Code


Note

Medium Risk
Touches settings persistence and provider resolution paths; hosted users lose editability for primary-only globals (by design), while desktop/server-served behavior should be unchanged via usePrimarySettingsAvailable.

Overview
Fixes hosted app (app.t3.codes) behavior where project default model showed "No providers available" and global server settings looked editable but never persisted.

Project settings now load providers and provider-instance settings from the project's environment (useEnvironmentSettings / per-environment provider atoms) instead of the primary server, so the default model picker works when every connection is a remote.

Global server-scoped settings get a serverScoped flag on SettingsRow: when there is no primary environment, controls render inert (dimmed, non-interactive) with a tooltip explaining the setting must be changed from desktop or the server's URL. Many General, Integrations, and Source Control rows are marked accordingly; source-control writing sections stay visible instead of being hidden on non-primary environments.

Persistence: useUpdateSettingsTarget shows a "Setting not saved" warning toast instead of silently dropping server patches when no environmentId is available. isHostedStaticApp() is safe to call without window for tests/static render.

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

Note

Make hosted-app settings server-scoped and resolve project default model from its own environment

  • Adds a serverScoped flag to SettingsRow in settingsLayout.tsx so rows become inert and show a shared explanation when the hosted static app has no primary server
  • Adds usePrimarySettingsAvailable in useSettings.ts to detect the hosted-without-server state, and emits a warning toast when server-backed settings are updated without a target environment
  • Reworks ProjectSettingsPanel.tsx to load provider instances, model options, and plan-mode flags from the representative project's environment rather than primary settings
  • Marks many general, legacy, source-control, and integration rows as server-scoped across multiple settings panels
  • Fixes isHostedStaticApp in hostedPairing.ts to avoid accessing window in windowless runtimes
  • Risk: useUpdateSettingsTarget now shows a warning toast and drops server-setting patches that arrive without an environment ID; reviewers should verify the no-env path in useSettings.ts does not regress existing client-side setting saves

Macroscope summarized a79208c.

The hosted app has no primary environment, so anything wired to the
primary-environment atoms resolved to nothing there. Project settings
showed "No providers available" for the default model, and the global
server-scoped settings displayed schema defaults and silently dropped
writes.
Project settings now reads providers and provider-instance settings
from the environment that owns the project. Global rows that live in
the primary environment's settings.json are marked serverScoped and
render inert with a tooltip when there is no primary; dropped server
writes surface a toast instead of vanishing.
Co-Authored-By: Claude Code <noreply@anthropic.com>
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Sep 2, 2026
@github-actions

github-actionsBot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.1 KiB13.2 KiB+80 B (+0.6%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB−4 B (−0.1%)7.3 KiB
CodexLive turn WebSocket wire6.2 KiB6.3 KiB+84 B (+1.3%)7.8 KiB
CodexLive turn WebSocket decoded54.7 KiB55.5 KiB+822 B (+1.5%)66.4 KiB
CodexLive turn messages880 (0.0%)21
ClaudeTotal thread wire13.2 KiB13.4 KiB+295 B (+2.2%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB−4 B (−0.1%)7.3 KiB
ClaudeLive turn WebSocket wire6.3 KiB6.5 KiB+299 B (+4.7%)7.8 KiB
ClaudeLive turn WebSocket decoded55.5 KiB57.8 KiB+2.3 KiB (+4.2%)66.4 KiB
ClaudeLive turn messages810+2 (+25.0%)21

Baseline: b21d872 · PR result: a79208c · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 109.4 KiB
  • Claude decoded thread snapshot: 110.1 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

Comment threadapps/web/src/components/settings/settingsLayout.tsx Outdated
juliusmarmingeand others added 2 commits September 1, 2026 17:38
SettingsRow now calls usePrimarySettingsAvailable on every render, and
settingsLayout.test.tsx renders it with renderToStaticMarkup in node,
where the default-parameter window read threw.
Co-Authored-By: Claude Code <noreply@anthropic.com>
…hosted
Review follow-ups: the tooltip trigger around an inert control is now
focusable so keyboard users can read why it is disabled, and the source
control writing section renders on the hosted app instead of being
hidden, since its rows are serverScoped and explain themselves.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Comment threadapps/web/src/components/settings/IntegrationsSettings.tsx
Co-Authored-By: Claude Code <noreply@anthropic.com>

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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

Fix All in Cursor

Bugbot Autofix is ON, but a cloud agent failed to start.

Reviewed by Cursor Bugbot for commit f078b90. Configure here.

Comment threadapps/web/src/components/settings/settingsLayout.tsx
Co-Authored-By: Claude Code <noreply@anthropic.com>
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR changes how project default-model settings are resolved and changes the availability and persistence behavior of multiple server-scoped settings in the hosted app. The product-default behavior and the desktop/remote environment boundaries warrant human review.

You can add or adjust custom eligibility rules. Learn more.

@juliusmarminge
juliusmarminge merged commit 0e1570b into mainSep 2, 2026
27 checks passed
@juliusmarminge
juliusmarminge deleted the t3code/fix-remote-provider-settings branch September 2, 2026 02:26
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 2, 2026
## What's Changed
* perf(client-runtime): keep turn and checkpoint refs stable while streaming by @t3dotgg in pingdotgg/t3code#9145
* perf(clients): lease sidebar status by visibility by @StiensWout in pingdotgg/t3code#9052
* fix(desktop): show newest changes in nightly previews by @t3dotgg in pingdotgg/t3code#9138
* fix(settings): sync auto-settle and other shared preferences across environments by @t3dotgg in pingdotgg/t3code#9147
* fix(server): prevent accidental service downgrades by @t3dotgg in pingdotgg/t3code#5302
* fix(server): keep attachments until the command commits by @t3dotgg in pingdotgg/t3code#7941
* fix(claude): preview images read from the workspace by @t3dotgg in pingdotgg/t3code#9119
* fix(web): keep generated muted foreground dimmer than entered text by @flamboh in pingdotgg/t3code#9113
* fix(clients): stop repeating expanded commands by @t3dotgg in pingdotgg/t3code#9120
* fix(grok): health check, model selection, and stop all work against the real CLI by @t3dotgg in pingdotgg/t3code#9154
* perf(web): halve the cold-start bundle by splitting Clerk and cold routes by @StiensWout in pingdotgg/t3code#9058
* feat(desktop): update the desktop app on remote Macs from the Update button by @t3dotgg in pingdotgg/t3code#6554
* test(server): measure shell, second client, and reconnect transfer by @t3dotgg in pingdotgg/t3code#9157
* fix(web): project default model works on the hosted app by @juliusmarminge in pingdotgg/t3code#9142
* fix(web): darken neutral control surfaces by @maria-rcks in pingdotgg/t3code#9064
* fix(web): preserve panel state across workspace refreshes by @maria-rcks in pingdotgg/t3code#8968
* feat(files): open markdown, HTML, and PDF files outside the workspace by @juliusmarminge in pingdotgg/t3code#9140
* feat(web): render HTML and PDF files in the file viewer by @juliusmarminge in pingdotgg/t3code#9143
* fix(web): compact project settings actions by @maria-rcks in pingdotgg/t3code#9160
* fix(web): browse folders from file breadcrumbs by @404khai in pingdotgg/t3code#8910
## New Contributors
* @404khai made their first contribution in pingdotgg/t3code#8910
**Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260902.1252...v0.0.39-nightly.20260902.1253
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260902.1253
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:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@juliusmarminge
, '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): project default model works on the hosted app - #9142

Merged
juliusmarminge merged 5 commits into
mainfrom
t3code/fix-remote-provider-settings
Sep 2, 2026
Merged

fix(web): project default model works on the hosted app#9142
juliusmarminge merged 5 commits into
mainfrom
t3code/fix-remote-provider-settings

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Sep 2, 2026

Copy link
Copy Markdown
Member

On app.t3.codes, project settings showed "No providers available" for the default model, and the global server-scoped settings (new-thread workspace, background activity, …) displayed schema defaults and silently dropped every write. Not local state: the hosted app registers no PrimaryConnectionTarget (platform.ts returns Stream.empty when isHostedStaticApp()), so everything wired to the primary-environment atoms resolved to nothing there.

Fix

  • Project settings reads providers and provider-instance settings from the environment that owns the project (serverEnvironment.providersValueAtom / useEnvironmentSettings), the same way the composer already does. The model picker now works on hosted; desktop and server-served web are unchanged since primary and project environment coincide there.
  • Stopgap for global settings, which need a proper anchor-environment story separately: SettingsRow gets a serverScoped flag. Rows whose value lives in the primary environment's settings.json (14 across General, Integrations, Source Control) render inert with a tooltip when there is no primary, instead of an editable control that never saves. Client-keyed rows are untouched.
  • useUpdateSettingsTarget toasts "Setting not saved" when a server patch has no environment to go to, instead of discarding it.

usePrimarySettingsAvailable() is primaryEnvironment !== null || !isHostedStaticApp(), so desktop/local never flash the disabled state during boot, and if hosted later gains an anchor environment the disabling switches itself off.

Before / after (hosted mode: VITE_HOSTED_APP_CHANNEL=nightly, server paired as a remote)

BeforeAfter
beforeafter

Server-scoped global rows on hosted:

tooltip

Demo — picking and resetting a project default model on the hosted client, then the inert global rows with their tooltip:

https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b5fa546346309015/hosted-settings-demo-trimmed.mp4

Verified with apps/web typecheck, lint on the changed files, and the useSettings / settingsLayout / ProjectSettingsPanel.logic tests.

Claude Fable 5 via Claude Code in T3 Code.

🤖 Generated with Claude Code


Note

Medium Risk
Touches settings persistence and provider resolution paths; hosted users lose editability for primary-only globals (by design), while desktop/server-served behavior should be unchanged via usePrimarySettingsAvailable.

Overview
Fixes hosted app (app.t3.codes) behavior where project default model showed "No providers available" and global server settings looked editable but never persisted.

Project settings now load providers and provider-instance settings from the project's environment (useEnvironmentSettings / per-environment provider atoms) instead of the primary server, so the default model picker works when every connection is a remote.

Global server-scoped settings get a serverScoped flag on SettingsRow: when there is no primary environment, controls render inert (dimmed, non-interactive) with a tooltip explaining the setting must be changed from desktop or the server's URL. Many General, Integrations, and Source Control rows are marked accordingly; source-control writing sections stay visible instead of being hidden on non-primary environments.

Persistence: useUpdateSettingsTarget shows a "Setting not saved" warning toast instead of silently dropping server patches when no environmentId is available. isHostedStaticApp() is safe to call without window for tests/static render.

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

Note

Make hosted-app settings server-scoped and resolve project default model from its own environment

  • Adds a serverScoped flag to SettingsRow in settingsLayout.tsx so rows become inert and show a shared explanation when the hosted static app has no primary server
  • Adds usePrimarySettingsAvailable in useSettings.ts to detect the hosted-without-server state, and emits a warning toast when server-backed settings are updated without a target environment
  • Reworks ProjectSettingsPanel.tsx to load provider instances, model options, and plan-mode flags from the representative project's environment rather than primary settings
  • Marks many general, legacy, source-control, and integration rows as server-scoped across multiple settings panels
  • Fixes isHostedStaticApp in hostedPairing.ts to avoid accessing window in windowless runtimes
  • Risk: useUpdateSettingsTarget now shows a warning toast and drops server-setting patches that arrive without an environment ID; reviewers should verify the no-env path in useSettings.ts does not regress existing client-side setting saves

Macroscope summarized a79208c.

The hosted app has no primary environment, so anything wired to the
primary-environment atoms resolved to nothing there. Project settings
showed "No providers available" for the default model, and the global
server-scoped settings displayed schema defaults and silently dropped
writes.
Project settings now reads providers and provider-instance settings
from the environment that owns the project. Global rows that live in
the primary environment's settings.json are marked serverScoped and
render inert with a tooltip when there is no primary; dropped server
writes surface a toast instead of vanishing.
Co-Authored-By: Claude Code <noreply@anthropic.com>
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Sep 2, 2026
@github-actions

github-actionsBot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.1 KiB13.2 KiB+80 B (+0.6%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB−4 B (−0.1%)7.3 KiB
CodexLive turn WebSocket wire6.2 KiB6.3 KiB+84 B (+1.3%)7.8 KiB
CodexLive turn WebSocket decoded54.7 KiB55.5 KiB+822 B (+1.5%)66.4 KiB
CodexLive turn messages880 (0.0%)21
ClaudeTotal thread wire13.2 KiB13.4 KiB+295 B (+2.2%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB−4 B (−0.1%)7.3 KiB
ClaudeLive turn WebSocket wire6.3 KiB6.5 KiB+299 B (+4.7%)7.8 KiB
ClaudeLive turn WebSocket decoded55.5 KiB57.8 KiB+2.3 KiB (+4.2%)66.4 KiB
ClaudeLive turn messages810+2 (+25.0%)21

Baseline: b21d872 · PR result: a79208c · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 109.4 KiB
  • Claude decoded thread snapshot: 110.1 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

Comment threadapps/web/src/components/settings/settingsLayout.tsx Outdated
juliusmarmingeand others added 2 commits September 1, 2026 17:38
SettingsRow now calls usePrimarySettingsAvailable on every render, and
settingsLayout.test.tsx renders it with renderToStaticMarkup in node,
where the default-parameter window read threw.
Co-Authored-By: Claude Code <noreply@anthropic.com>
…hosted
Review follow-ups: the tooltip trigger around an inert control is now
focusable so keyboard users can read why it is disabled, and the source
control writing section renders on the hosted app instead of being
hidden, since its rows are serverScoped and explain themselves.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Comment threadapps/web/src/components/settings/IntegrationsSettings.tsx
Co-Authored-By: Claude Code <noreply@anthropic.com>

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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

Fix All in Cursor

Bugbot Autofix is ON, but a cloud agent failed to start.

Reviewed by Cursor Bugbot for commit f078b90. Configure here.

Comment threadapps/web/src/components/settings/settingsLayout.tsx
Co-Authored-By: Claude Code <noreply@anthropic.com>
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR changes how project default-model settings are resolved and changes the availability and persistence behavior of multiple server-scoped settings in the hosted app. The product-default behavior and the desktop/remote environment boundaries warrant human review.

You can add or adjust custom eligibility rules. Learn more.

@juliusmarminge
juliusmarminge merged commit 0e1570b into mainSep 2, 2026
27 checks passed
@juliusmarminge
juliusmarminge deleted the t3code/fix-remote-provider-settings branch September 2, 2026 02:26
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 2, 2026
## What's Changed
* perf(client-runtime): keep turn and checkpoint refs stable while streaming by @t3dotgg in pingdotgg/t3code#9145
* perf(clients): lease sidebar status by visibility by @StiensWout in pingdotgg/t3code#9052
* fix(desktop): show newest changes in nightly previews by @t3dotgg in pingdotgg/t3code#9138
* fix(settings): sync auto-settle and other shared preferences across environments by @t3dotgg in pingdotgg/t3code#9147
* fix(server): prevent accidental service downgrades by @t3dotgg in pingdotgg/t3code#5302
* fix(server): keep attachments until the command commits by @t3dotgg in pingdotgg/t3code#7941
* fix(claude): preview images read from the workspace by @t3dotgg in pingdotgg/t3code#9119
* fix(web): keep generated muted foreground dimmer than entered text by @flamboh in pingdotgg/t3code#9113
* fix(clients): stop repeating expanded commands by @t3dotgg in pingdotgg/t3code#9120
* fix(grok): health check, model selection, and stop all work against the real CLI by @t3dotgg in pingdotgg/t3code#9154
* perf(web): halve the cold-start bundle by splitting Clerk and cold routes by @StiensWout in pingdotgg/t3code#9058
* feat(desktop): update the desktop app on remote Macs from the Update button by @t3dotgg in pingdotgg/t3code#6554
* test(server): measure shell, second client, and reconnect transfer by @t3dotgg in pingdotgg/t3code#9157
* fix(web): project default model works on the hosted app by @juliusmarminge in pingdotgg/t3code#9142
* fix(web): darken neutral control surfaces by @maria-rcks in pingdotgg/t3code#9064
* fix(web): preserve panel state across workspace refreshes by @maria-rcks in pingdotgg/t3code#8968
* feat(files): open markdown, HTML, and PDF files outside the workspace by @juliusmarminge in pingdotgg/t3code#9140
* feat(web): render HTML and PDF files in the file viewer by @juliusmarminge in pingdotgg/t3code#9143
* fix(web): compact project settings actions by @maria-rcks in pingdotgg/t3code#9160
* fix(web): browse folders from file breadcrumbs by @404khai in pingdotgg/t3code#8910
## New Contributors
* @404khai made their first contribution in pingdotgg/t3code#8910
**Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260902.1252...v0.0.39-nightly.20260902.1253
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260902.1253
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:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@juliusmarminge