diff --git a/docs/web-ui/agent.md b/docs/web-ui/agent.md index 899a9c3a..fb956086 100644 --- a/docs/web-ui/agent.md +++ b/docs/web-ui/agent.md @@ -69,29 +69,34 @@ structurally rather than for one specific trigger. Two columns: unprivileged process can't make directly). - **Inbox / todos pills** (`๐Ÿ“ฌ inbox ยท N` / `๐Ÿ“‹ todos ยท N`): hidden when empty; click opens the matching flyout in the side panel. - - **Links badge** (`๐Ÿ”—`): opens a popover listing this agent's - `agent_links()`-sourced navigation (stats, screen when VNC is - enabled, forge profile + config-repo mirror when the agent has a - forge account, any `hyperhive.dashboardLinks` extras) as real - `` elements โ€” not a `Dropdown`-style command list, so - ctrl/middle-click and "copy link address" keep working. Each - `AgentLink.kind` resolves differently: `container` โ†’ same-origin - path; `forge` โ†’ `state.forge_public_url + url`, and the link is - dropped entirely when that's unset (never guessed from + - **Links badge** (`๐Ÿ”—`): opens a popover listing `โ†‘ dashboard` + (back-link to the host dashboard, `${dashboardBase}dashboard.html`) + followed by this agent's `agent_links()`-sourced navigation (stats, + screen when VNC is enabled, forge profile + config-repo mirror when + the agent has a forge account, any `hyperhive.dashboardLinks` + extras) โ€” all as real `` elements, not a `Dropdown`-style + command list, so ctrl/middle-click and "copy link address" keep + working. Each `AgentLink.kind` resolves differently: `container` โ†’ + same-origin path; `forge` โ†’ `state.forge_public_url + url`, and the + link is dropped entirely when that's unset (never guessed from `:3000`); `external` โ†’ already absolute. Same source (`GET /api/state`'s `links` field) also feeds `DashboardState.links` for the dashboard card's icon strip โ€” `agent_links()` in hive-agent is the single source of truth for - both. - - **Overflow badge** (`โ‹ฏ`): a `Dropdown` with two rows โ€” - `โ†‘ dashboard` (link) and `โ†ป rebuild container` (select-twice - confirm, same action as the dashboard R3BU1LD button). Everything - else that used to live here (model/effort pickers, new-session, - logout) has a better home now: pickers are real badges above, and - `/new-session` / `/logout` are typed slash commands with their own - type-twice confirm (see below) โ€” a modal doesn't fit a text-input - flow, and burying rare-but-important actions in one flat menu was - the design guide's own named anti-example. + both. There is no separate overflow (`โ‹ฏ`) menu any more โ€” it used + to hold exactly this dashboard link plus a rebuild-container action + (mara, hyperhive#3704: "remove rebuild button, move link to + dashboards into links menu") โ€” rebuild had no real discoverability + need of its own (the dashboard's own R3BU1LD button already covers + it) so it's gone outright, and the dashboard link moved here, + leaving nothing to justify a separate menu. Everything else that + used to live in the old overflow menu (model/effort pickers, + new-session, logout) already had a better home before this: pickers + are real badges above, and `/new-session` / `/logout` are typed + slash commands with their own type-twice confirm (see below) โ€” a + modal doesn't fit a text-input flow, and burying rare-but-important + actions in one flat menu was the design guide's own named + anti-example. - No header cancel-turn button any more โ€” `/cancel` (slash command, below) is the only path; the turn-loop state badge already shows `thinking` as the discoverability cue. diff --git a/frontend/packages/agent/src/Root.tsx b/frontend/packages/agent/src/Root.tsx index baae05ed..d2124074 100644 --- a/frontend/packages/agent/src/Root.tsx +++ b/frontend/packages/agent/src/Root.tsx @@ -15,7 +15,6 @@ import { SidePanel } from './components/SidePanel.js'; import { InboxPanel } from './components/InboxPanel.js'; import { TodosPanel } from './components/TodosPanel.js'; import { TermInput } from './components/TermInput.js'; -import { OverflowMenu } from './components/OverflowMenu.js'; import { LoginFlow } from './components/LoginFlow.js'; import { useAgentState } from './hooks/useAgentState.js'; import { useTodos } from './hooks/useTodos.js'; @@ -89,11 +88,18 @@ export function Root() { <> setOpenPanel('inbox')} /> setOpenPanel('todos')} /> - {/* Needs a loaded snapshot for their data (links/forge_public_url, - * dashboard_port) โ€” both omitted (like the old page's - * populateOverflowMenu) until the first /api/state resolves. */} - {state ? : null} - {state ? : null} + {/* Needs a loaded snapshot for its data (links/forge_public_url, + * dashboard_port) โ€” omitted until the first /api/state resolves, + * same as the old page's populateOverflowMenu (now deleted โ€” + * dashboard-link moved here, rebuild removed outright, see + * MetaNav.tsx's file comment). */} + {state ? ( + + ) : null} ); // Kept mounted regardless of `openPanel` (open/closed toggles just the diff --git a/frontend/packages/agent/src/components/MetaNav.css b/frontend/packages/agent/src/components/MetaNav.css index 3c957fa7..84e9d5c7 100644 --- a/frontend/packages/agent/src/components/MetaNav.css +++ b/frontend/packages/agent/src/components/MetaNav.css @@ -3,10 +3,8 @@ same "reuse the values, not the component" call `.login-card` (LoginFlow.css) already made, for the same reason: this popover's items are real `` tags, not `Dropdown`'s command-dispatch - `