Four scopes, one tab
SettingsTab.tsx is 1,154 lines and mixes settings that belong to four different things. The tab is
titled with one agent's name, so everything on it reads as this agent — including the parts that
silently change every agent.
| What |
Actual scope |
Where it is written |
| Instance name, agent settings, behaviour, runner node, tool toggles, write consent, supervision, connections, triggers, loop presets |
this instance |
agent_instances.config |
| Voice, Translation |
account default + explicit per-instance override |
/v1/preferences ← PrefOverride |
| Connect / disconnect Gmail, Google Drive, Zoho WorkDrive |
the whole account |
connector_tokens |
| Link GitHub username |
the whole account |
users.linked_github_login |
| Drive/WorkDrive folder grants, email permission checkbox |
this instance |
connector_grants, AgentState.permissions |
Rows 3 and 4 are the leak. Disconnecting Gmail from the Coder's Settings tab disconnects it for the
Job Application Assistant too. Nothing on screen says so except one 12px line under the GitHub row
(:939) — and Gmail, Drive and WorkDrive don't even have that.
The disconnect confirmations make the same mistake from the other side:
"Disconnect Gmail? Agents will no longer be able to read your inbox for sign-in links."
Correct — plural, account-wide — but you are reading it inside one agent's settings, having clicked a
button in a card about that agent.
The pattern already exists in this file
Voice and Translation get this exactly right (#211): an account default, an explicit "Use my
defaults / Customise for this agent" radio, and a "Use my defaults" that DELETEs the override.
Preferences.tsx's own header comment states the principle — "Only [what an agent IS] and [the
danger zone] are properties of an agent."
A connection is not a property of an agent. A grant is.
Proposal
Move the account half to Preferences. Add a Connections section there — connect/disconnect for
GitHub, Gmail, Drive, WorkDrive, and any registry connector needing OAuth. That page is already
defined as "what every agent falls back to", and it already carries timezone, voice and translation
on the same footing.
Leave the instance half on the instance — and only when it can do something:
Where an instance needs a connection the account doesn't have, link to Preferences rather than
re-rendering connect UI in two places — the same shape as the runner card's pags up remedy.
Why not just add "account-level" labels
Because it doesn't fix what the reader is doing. Someone on the Coder's Settings tab is configuring
the Coder; a label asking them to notice that one card is different is a worse guarantee than putting
the card where its scope is obvious. It is also what #211 already decided for voice — this is the
same argument for the connection rows it didn't reach.
After this
SettingsTab.tsx is on #305's list. Splitting it before this and #352 just relocates the clutter;
after them it separates cleanly into Identity · Runtime · Permissions · Teamwork · Automation ·
Overrides · Danger.
Related: #211 (the override pattern), #305 (large-file split), #352 (registry), #353 (unconfigured
connectors).
Four scopes, one tab
SettingsTab.tsxis 1,154 lines and mixes settings that belong to four different things. The tab istitled with one agent's name, so everything on it reads as this agent — including the parts that
silently change every agent.
agent_instances.config/v1/preferences←PrefOverrideconnector_tokensusers.linked_github_loginconnector_grants,AgentState.permissionsRows 3 and 4 are the leak. Disconnecting Gmail from the Coder's Settings tab disconnects it for the
Job Application Assistant too. Nothing on screen says so except one 12px line under the GitHub row
(
:939) — and Gmail, Drive and WorkDrive don't even have that.The disconnect confirmations make the same mistake from the other side:
Correct — plural, account-wide — but you are reading it inside one agent's settings, having clicked a
button in a card about that agent.
The pattern already exists in this file
Voice and Translation get this exactly right (#211): an account default, an explicit "Use my
defaults / Customise for this agent" radio, and a "Use my defaults" that DELETEs the override.
Preferences.tsx's own header comment states the principle — "Only [what an agent IS] and [thedanger zone] are properties of an agent."
A connection is not a property of an agent. A grant is.
Proposal
Move the account half to Preferences. Add a Connections section there — connect/disconnect for
GitHub, Gmail, Drive, WorkDrive, and any registry connector needing OAuth. That page is already
defined as "what every agent falls back to", and it already carries timezone, voice and translation
on the same footing.
Leave the instance half on the instance — and only when it can do something:
for that connector ([design] Stage 2: register the generic connector OAuth redirect for Drive/WorkDrive/Gmail and retire the dedicated flows (Stage 1 — the registry declaration — has shipped) #352 makes the second half possible);
scoped today.
Where an instance needs a connection the account doesn't have, link to Preferences rather than
re-rendering connect UI in two places — the same shape as the runner card's
pags upremedy.Why not just add "account-level" labels
Because it doesn't fix what the reader is doing. Someone on the Coder's Settings tab is configuring
the Coder; a label asking them to notice that one card is different is a worse guarantee than putting
the card where its scope is obvious. It is also what #211 already decided for voice — this is the
same argument for the connection rows it didn't reach.
After this
SettingsTab.tsxis on #305's list. Splitting it before this and #352 just relocates the clutter;after them it separates cleanly into Identity · Runtime · Permissions · Teamwork · Automation ·
Overrides · Danger.
Related: #211 (the override pattern), #305 (large-file split), #352 (registry), #353 (unconfigured
connectors).