diff --git a/devlog/_plan/260904_dashboard_minimal/assets/031_models_after.png b/devlog/_plan/260904_dashboard_minimal/assets/031_models_after.png new file mode 100644 index 0000000000..d721fb7ef2 Binary files /dev/null and b/devlog/_plan/260904_dashboard_minimal/assets/031_models_after.png differ diff --git a/devlog/_plan/260904_dashboard_minimal/assets/031_models_disclosures_open.png b/devlog/_plan/260904_dashboard_minimal/assets/031_models_disclosures_open.png new file mode 100644 index 0000000000..82bf0e2d7f Binary files /dev/null and b/devlog/_plan/260904_dashboard_minimal/assets/031_models_disclosures_open.png differ diff --git a/gui/src/components/subagents-workspace/SubagentDelegationSection.tsx b/gui/src/components/subagents-workspace/SubagentDelegationSection.tsx index e631570734..7628a8a417 100644 --- a/gui/src/components/subagents-workspace/SubagentDelegationSection.tsx +++ b/gui/src/components/subagents-workspace/SubagentDelegationSection.tsx @@ -7,7 +7,9 @@ * gets called first. */ import { useState } from "react"; -import { Select } from "../../ui"; +import { Select, Tooltip } from "../../ui"; +import { IconInfo } from "../../icons"; +import type { TKey } from "../../i18n/shared"; import { useT } from "../../i18n/shared"; import { formatNamespacedModelId } from "../../provider-icons"; import type { DelegationPatch, DelegationModelOption } from "../../pages/use-subagent-delegation"; @@ -63,6 +65,46 @@ export default function SubagentDelegationSection({ )} + {/* + The multi-agent surface switch (v1 / base / v2). It lived on Models and on the + dashboard; both were editors for the same /api/v2 value. It is a delegation + setting, so it sits above the model that gets delegated to. The long help text + stays reachable from the focusable info button. + */} +
{t(SUBTITLE_TKEY[tab])}
} {/* Panels mount lazily and then stay mounted, hidden — a half-typed combo draft diff --git a/gui/src/pages/use-subagent-delegation.ts b/gui/src/pages/use-subagent-delegation.ts index 4df63db21c..9e5149d3ce 100644 --- a/gui/src/pages/use-subagent-delegation.ts +++ b/gui/src/pages/use-subagent-delegation.ts @@ -29,7 +29,9 @@ export type UltraModeState = { }; export type UltraModePatch = { - multiAgentModeHintText: string | null; + multiAgentModeHintText?: string | null; + /** The v1/base/v2 switch; moved here from Models (030) so delegation settings have one home. */ + multiAgentMode?: "v1" | "default" | "v2"; }; type DelegationResponse = { diff --git a/gui/src/styles.css b/gui/src/styles.css index fe50480908..51b5df44d0 100644 --- a/gui/src/styles.css +++ b/gui/src/styles.css @@ -1195,6 +1195,20 @@ select.input { appearance: none; } flex: 0 0 auto; line-height: normal; } +/* Catalog-wide policy lives behind one disclosure; per-provider rarely-used actions behind a + ⋯ disclosure in the header row. Both are native details: keyboard and aria-expanded come + free, and the revealed controls stay inline (DOM tab order), so neither claims a menu role. */ +.models-advanced { margin: 0 0 12px; } +.models-advanced > summary { cursor: pointer; list-style: none; display: inline-flex; align-items: center; gap: 6px; padding: 4px 0; } +.models-advanced > summary::-webkit-details-marker { display: none; } +.models-advanced > summary::before { content: ""; width: 0; height: 0; border-left: 5px solid var(--muted); border-top: 4px solid transparent; border-bottom: 4px solid transparent; transition: transform var(--motion-fast); } +.models-advanced[open] > summary::before { transform: rotate(90deg); } +.models-advanced[open] > summary { margin-bottom: 8px; } +.models-group-more { display: inline-flex; align-items: center; } +.models-group-more > summary { list-style: none; cursor: pointer; min-width: 28px; justify-content: center; } +.models-group-more > summary::-webkit-details-marker { display: none; } +.models-group-more-body { flex-wrap: wrap; gap: 8px; } +.models-group-more[open] { flex-wrap: wrap; } .switch.switch-labeled::before { content: ""; width: 34px; diff --git a/gui/tests/codex-stale-banner.test.ts b/gui/tests/codex-stale-banner.test.ts index ba2c3f6506..8501e16ae5 100644 --- a/gui/tests/codex-stale-banner.test.ts +++ b/gui/tests/codex-stale-banner.test.ts @@ -8,7 +8,6 @@ import { describe, expect, test } from "bun:test"; import { fetchCodexAppServerState } from "../src/codex-app-server-state"; -const BANNER_SRC = await Bun.file(new URL("../src/components/codex-stale-banner.tsx", import.meta.url)).text(); const MODELS_SRC = await Bun.file(new URL("../src/pages/Models.tsx", import.meta.url)).text(); const APP_TSX_SRC = await Bun.file(new URL("../src/App.tsx", import.meta.url)).text(); @@ -120,11 +119,17 @@ describe("Models page wiring", () => { expect(src.indexOf("');
+ });
+
+ test("the page head no longer carries a third restart button", () => {
+ const head = models.slice(models.indexOf('className="page-head"'), models.indexOf("