You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
fix(dashboard): give the settings page the launcher's run-option rules
The settings page rendered the run options as flat, independently checkable
boxes while the launcher has real rules between them, so the page could show an
option checked that the launcher shows off, and allowed combinations that mean
nothing: Eco under Vanilla, Browser on Codex, Auto maintenance without
Post-merge cleanup, and anything at all under Transparent.
Move the option table and its rules out of Composer into lib/run-option-rows.ts,
rendered by both surfaces, so a rule cannot hold in one place and not the other.
It is pure data, so the launcher still renders dropdown items and the settings
page renders page rows; neither owns the rules. `checked` is the effective
value, so nothing claims an option is on while the run ignores it.
A disabled row is greyed with its reason rather than hidden: the settings page
is where you go to look for a setting, so a vanished row would be worse than a
greyed one. The launcher is unchanged (it already hid the Eco drops when Eco is
off), and its tests pass untouched.
Two smaller cases of the same mistake, fixed here too:
- the notification rows now show the delivery capability the bell already did
(permission blocked, DISCORD_WEBHOOK / DISCORD_BOT_TOKEN unset)
- the spend offset is bounded to the same range as its slider and the
sanitizer, which used to clamp a typed 9999 to 50 while the box kept 9999
Make the settings page obey the same run-option rules as the launcher (#958).
6
+
7
+
The settings page rendered the run options as flat, independently checkable boxes, while the launcher has real rules between them. So the page could show an option checked that the launcher shows off, and allowed combinations that mean nothing: Eco under Vanilla (nothing left to trim), Browser on Codex (inert, the browser rides Claude Code's MCP config), Auto maintenance without Post-merge cleanup, and anything under Transparent, which overrides the lot.
8
+
9
+
The table and its rules moved out of the composer into one module both surfaces render, so a rule cannot hold in one place and not the other. A row the rules disable is greyed and shows why, rather than disappearing, since the settings page is where you go to look for a setting. `checked` is now the effective value everywhere, so no surface claims an option is on while the run ignores it.
10
+
11
+
Two smaller cases of the same thing: the notification rows now show the delivery capability the bell already showed (browser permission blocked, `DISCORD_WEBHOOK` / `DISCORD_BOT_TOKEN` unset), and the spend offset is bounded to the same range as its slider and the sanitizer, instead of accepting a value that was silently clamped on save.
// The Global options as one table (#314). Autopilot's default-on lives in `autopilotEnabled`; Eco
248
-
// is disabled + dimmed under Vanilla; the Eco sub-drops show only while Eco is on.
249
-
constmainOptions: OptionRow[]=[
250
-
// Named for the agent actually selected (#948): under Codex, "Raw Claude Code" was a lie.
251
-
{key: 'transparent',label: 'Transparent',description: `Raw ${agentLabel} — turns the whole framework off.`,title: `Fully transparent (#625): run the agent exactly like plain ${agentLabel}, with no framework system prompt, controls, dashboard, guard, or TODO loop. Overrides the options below.`,checked: transparent},
252
-
// Says only what it does (#801): the maintenance stance it used to relax left the system prompt
253
-
// with that section (#556), so the countdown is the whole feature.
254
-
{key: 'autopilot',label: 'Autopilot',description: 'Auto-accepts the recommended choice after a countdown.',title: 'Auto-accept the recommended choice after a countdown, instead of waiting for you to pick',checked: autopilot&&!transparent,disabled: transparent,disabledReason: 'off while Transparent is on'},
255
-
{key: 'technical',label: 'Technical control',description: 'Surfaces technical detail like tech-stack choices.',title: 'Expose technical detail (e.g. tech-stack choices)',checked: technical&&!transparent,disabled: transparent,disabledReason: 'off while Transparent is on'},
256
-
{key: 'vanilla',label: 'Disable system prompt',description: 'Drops the added system prompt; keeps the session controls.',title: "Remove the built-in system prompt but keep the framework's session controls. For a fully raw session, use Transparent. Expand 'Enhanced System Prompt' to read what it removes.",checked: vanilla&&!transparent,disabled: transparent,disabledReason: 'off while Transparent is on'},
257
-
{key: 'eco',label: 'Eco',description: 'Trims the system prompt to save tokens.',title: 'Trim the built-in system prompt to save tokens',checked: eco&&!ecoDisabled,disabled: ecoDisabled,disabledReason: 'nothing to trim while the system prompt is off'},
258
-
{key: 'onBeforeMergeableQuality',label: 'Post-merge cleanup',description: 'Runs quality passes once it is ready to merge.',title: "When the session signals it's ready for merge, run maintainability, readability, and security-audit passes",checked: onBeforeMergeableQuality&&!transparent,disabled: transparent,disabledReason: 'off while Transparent is on'},
259
-
// Claude-only (#801): the browser is wired through Claude Code's MCP config, so another agent's
260
-
// driver takes no MCP servers and the box would be checkable but inert. The CLI has always
261
-
// warned about this (`unguardedNotices`); now the dashboard says it too.
262
-
{key: 'browser',label: 'Browser',description: 'Gives the agent a real browser to inspect pages.',title: 'Give the agent a real browser via chrome-devtools-mcp: navigate pages, read console + network, inspect the DOM, and screenshot',checked: browser&&!transparent&&agent==='claude',disabled: transparent||agent!=='claude',disabledReason: transparent ? 'off while Transparent is on' : 'only on Claude Code — the browser is wired through its MCP config'},
263
-
]
264
-
constecoOptions: OptionRow[]=[
265
-
{key: 'ecoPlanning',label: 'Auto planning',description: 'Drops the planning section; the agent plans itself.',title: 'Drop the planning section, letting the agent plan on its own',checked: ecoPlanning},
266
-
{key: 'ecoResearch',label: 'Auto research',description: 'Drops the alternatives/variability section.',title: 'Drop the alternatives/variability section',checked: ecoResearch},
267
-
// Gated on Post-merge cleanup (#801): #556 moved the Maintenance section out of the system
268
-
// prompt and into the on-before-mergeable prompt, so this trims nothing unless that pass runs.
269
-
{key: 'ecoMaintenance',label: 'Auto maintenance',description: 'Drops the maintenance section from the post-merge prompt.',title: 'Drop the Maintenance section from the post-merge cleanup prompt',checked: ecoMaintenance&&onBeforeMergeableQuality,disabled: !onBeforeMergeableQuality,disabledReason: 'only applies while Post-merge cleanup is on'},
270
-
]
241
+
// The Global options as one table (#314), with every rule between them (#958). The table lives
242
+
// in lib/run-option-rows.ts because the settings page renders the same options: a second copy
243
+
// would let a rule hold in one place and not the other.
0 commit comments