Watch
0
0
Fork
You've already forked hyperhive
0

swarm-ui: fold the agent terminal into AgentsPage's detail panel, not a route

mara's steer on the issue, right as the previous commit's plan was
posted: the swarm-level term isn't a separate page, it's part of the
same pwa -- selecting an agent should show a small preview (no header,
no input) below the existing detail fields. That's the whole MVP for
this issue; the full terminal (+ sending input back to the agent) is
explicit follow-up scope.

AgentTermPage -> AgentTermPreview: drops the Panel wrapper, the
"terminal" nav badge + wouter route, and the back-link -- just the
inline preview, height-capped at 12em (@hive/shared/terminal.css's own
default is a much taller 72vh/60em, sized for a dedicated page rather
than a peek).
This commit is contained in:
iris 2026-09-13 18:38:04 +02:00 • committed by mara
commit 727bfb775b
5 changed files with 42 additions and 64 deletions

View file

@ -26,12 +26,12 @@
// see its own comment) — `viewMode` here just says which one to show.
import { useState } from "preact/hooks";
import type { ComponentChildren } from "preact";
import { useLocation } from "wouter-preact";
import { ApiErrorPanel } from "@hive/shared/api-error-panel.js";
import { readApiError, type ProblemDetails } from "@hive/shared/api-error.js";
import { Badge } from "@hive/shared/badge.js";
import { LinkIcon } from "@hive/shared/icons.js";
import { AgentCard } from "./AgentCard.js";
import { AgentTermPreview } from "./AgentTermPreview.js";
import { FRESHNESS, type AgentRow } from "./AgentTypes.js";
import { Button } from "../../ui/button/Button.js";
import { ConfirmDialog } from "../../ui/confirm-dialog/ConfirmDialog.js";
@ -96,7 +96,6 @@ type ViewMode = "cards" | "table";
const VIEW_MODE_KEY = "swarm-ui:agents:view-mode";
export function AgentsPage() {
const [, navigate] = useLocation();
const [rows, setRows] = useState<AgentRow[] | null>(null);
const [error, setError] = useState<ProblemDetails | null>(null);
const [intervalMs, setIntervalMs] =
@ -566,17 +565,6 @@ export function AgentsPage() {
</dd>
</dl>
<div class="ui-agent-detail-actions">
<Badge
variant="quiet"
icon="🖥️"
value="terminal"
onClick={() =>
navigate(
`/agents/${encodeURIComponent(detailTarget.name)}/term`,
)
}
title={`view ${detailTarget.name}'s live terminal`}
/>
<Badge
variant="quiet"
icon={<LinkIcon />}
@ -594,6 +582,10 @@ export function AgentsPage() {
}
/>
</div>
{/* MVP scope per mara's own ruling: a small read-only
preview, no header/no input — the full terminal
(+ sending input back) is explicit follow-up scope. */}
<AgentTermPreview agentName={detailTarget.name} />
</div>
) : (
<p class="ui-agents-empty">select an agent to see its details</p>