web-ui: remove dead ask->operator inline-answer binding from the per-agent terminal
hyperhive#2922: the inline-answer slot (pendingAskBinds/reconcileAskBinds/ buildAnswerForm) depended on a since-removed /api/loose-ends endpoint and had been silently non-functional the whole time — nothing ever reassigned lastLooseEnds, so the reconciler always no-op'd. Per mara's call on the issue (ask/answer is deprecated per #2850, only the main dashboard UI needs to work, remove the broken per-agent inline view): ripped out the dead JS (binding + form + CSS) rather than restoring the endpoint. An ask tool call now renders like any other tool call, no inline answer affordance; the operator answers via the dashboard's own question surfacing. Also fixed adjacent doc staleness this same removal made newly contradictory (docs/web-ui/agent.md, docs/terminal-rendering.md): the doc already described the loose-ends/bash-tasks flyouts and the ask-binding as recently dead, but the endpoint reference table and a header-pills bullet list still described them as live.
This commit is contained in:
parent
98d895cf9e
commit
ecf9ff4d80
4 changed files with 37 additions and 288 deletions
|
|
@ -62,15 +62,9 @@ through. Three flex columns:
|
|||
- **Right cluster** (`.agent-header-pills`): flyout pills + overflow.
|
||||
- **Inbox pill** (`📬 inbox · N`): hidden when empty; click opens
|
||||
the inbox flyout in the side panel.
|
||||
- **Loose-ends pill** (`🪢 loose ends · N`): hidden when empty;
|
||||
click opens the loose-ends flyout.
|
||||
- **Tasks pill** (`⚙ tasks · N`): hidden when empty; click opens the
|
||||
running-bash-tasks flyout (`GET /api/bash-tasks` — the in-flight
|
||||
Pending/Running tasks from the in-container `bash-tasks/` dir). Unlike
|
||||
loose-ends (refreshed on turn_end), tasks start + finish asynchronously
|
||||
between turns and `/api/state` isn't polled while online, so the pill
|
||||
polls the endpoint on a light interval (≈4s). Snapshot only (no SSE push
|
||||
yet).
|
||||
- **Todos pill** (`📋 todos · N`): hidden when empty; click opens
|
||||
the todos flyout — see the todos-flyout paragraph below
|
||||
(`GET /api/todos`, refreshed on cold load + every `turn_end`).
|
||||
- **Overflow button** (`⋯`): always visible. Opens a frosted popover
|
||||
(`#overflow-menu`, positioned outside the header to escape any
|
||||
stacking context) with four management rows followed by a model
|
||||
|
|
@ -176,39 +170,17 @@ Older per-agent flyouts this doc used to describe (a "loose-ends"
|
|||
list of questions/approvals/reminders backed by a since-removed
|
||||
`GET /api/loose-ends`, and a read-only "tasks" list of in-flight bash
|
||||
tasks backed by a since-removed `GET /api/bash-tasks`) no longer
|
||||
exist — todos superseded both. One open gap from that migration:
|
||||
the "Ask → operator inline-answer binding" described below relies on
|
||||
that removed `/api/loose-ends` endpoint and is currently non-functional
|
||||
(hyperhive#2922) — the operator can still answer a pending question via
|
||||
the main dashboard's own question surfacing, just not inline in this
|
||||
agent's terminal.
|
||||
|
||||
**Ask → operator inline-answer binding** (currently non-functional,
|
||||
see the todos-flyout paragraph above + hyperhive#2922 — described here
|
||||
for the intended design, which is what a fix would restore). When the
|
||||
agent emits `mcp__hyperhive__ask(to: "operator", ...)`, the tool_use
|
||||
renderer mounts an empty slot (`<div class="ask-answer-inline-slot">`)
|
||||
right under the `↳ ask → operator` row in the terminal scrollback
|
||||
and pushes a reference into `pendingAskBinds`. The broker assigns
|
||||
the question id asynchronously, so the slot waits — and the next
|
||||
`/api/loose-ends` refresh runs `reconcileAskBinds()`, which walks
|
||||
the slot list and pairs each unbound slot with the first unclaimed
|
||||
pending operator-bound question whose `question` text matches the
|
||||
slot's stashed `_askQuestion`. On match the slot mounts the
|
||||
`buildAnswerForm` (same form shape as the loose-ends flyout —
|
||||
POSTs to the core's `POST /api/answer-question/{id}` cross-origin). Slots
|
||||
stay in the array after binding so the reconciler can flip them
|
||||
to a neutral `[resolved]` tag when the question later disappears
|
||||
from the pending list. Disappearance can mean answered, cancelled
|
||||
by the asker, or TTL-expired — the neutral label avoids
|
||||
mis-asserting "✓" on the cancel / expire paths; full resolution
|
||||
state is visible via the side-panel history. A defensive prune
|
||||
walks the slot list each tick and drops any whose DOM node has
|
||||
been removed (e.g. via a future "clear single row" affordance),
|
||||
so stale references don't accumulate. Slots whose question never
|
||||
arrives (e.g. the agent cancelled the ask, or the question is
|
||||
older than the loose-ends retention window) stay empty — the
|
||||
operator can still answer via the side panel, no regression.
|
||||
exist — todos superseded both. A third casualty of that migration —
|
||||
an "ask → operator" inline-answer form that used to mount under an
|
||||
`mcp__hyperhive__ask(to: "operator", ...)` row in the terminal
|
||||
scrollback — depended on the same removed `/api/loose-ends` endpoint
|
||||
and was found dead (hyperhive#2922: the binding never fired, so the
|
||||
slot never mounted a form). Per mara's call on that issue, it was
|
||||
removed rather than rebuilt — the main dashboard's own question
|
||||
surfacing (`dashboard/src/swarm.js` + `call.js`) is the one supported
|
||||
path for answering a pending question as the operator; this agent's
|
||||
own terminal just shows the `ask` tool call like any other tool call,
|
||||
with no inline answer affordance.
|
||||
|
||||
## Live view
|
||||
|
||||
|
|
@ -302,8 +274,8 @@ Successful POSTs return 200 (no 303 redirects). Error responses
|
|||
use semantic status codes: **400** for missing/invalid input
|
||||
(`body` required, unknown model name, invalid effort level),
|
||||
**409** for retryable state conflicts (turn in flight when
|
||||
`/compact` is called, hive-c0re busy on `GET /api/loose-ends`),
|
||||
**500** only for genuine server/transport failures. The matching
|
||||
`/compact` is called), **500** only for genuine server/transport
|
||||
failures. The matching
|
||||
mutations fire `LiveEvent` variants on the per-agent bus, so the
|
||||
client doesn't refetch `/api/state` on submit — the SSE stream
|
||||
delivers the new state faster anyway. Only the login flow still
|
||||
|
|
@ -371,13 +343,10 @@ shaped).
|
|||
rate_limited, links }`. Only called when the container is running;
|
||||
skipped (muted badges) when stopped. Also accessible via the gateway
|
||||
at `/agent/<name>/api/dashboard-state`.
|
||||
- `GET /api/loose-ends` — loose-ends snapshot consumed by the inbox
|
||||
flyout (`renderLooseEnds`). Returns pending questions the agent asked
|
||||
or owes, plus pending reminders. Also calls `reconcileAskBinds()` to
|
||||
wire inline answer forms to open `question_asked` events.
|
||||
- `GET /api/bash-tasks` — in-flight bash-task snapshot; returns only
|
||||
`Pending` and `Running` tasks (completed/killed tasks are excluded).
|
||||
Consumed by the running-bash-tasks flyout.
|
||||
- `GET /api/todos` — harness-local todos snapshot (loose-ends v2)
|
||||
consumed by the todos flyout (`refreshTodos` / `buildTodosList`).
|
||||
See the todos-flyout paragraph above for the producer/subsystem
|
||||
model and the bulk mark-done row.
|
||||
- `GET /api/stats?window=24h|7d|30d|all` — time-bucketed turn analytics
|
||||
`Snapshot` consumed by the `/stats` page. `all` ranges from the
|
||||
earliest recorded turn with an adaptive bucket width.
|
||||
|
|
|
|||
Loading…
Reference in a new issue