web: sessions list shows active pi only; close-pi button in chat header (agent sessions); tests to 154, coverage ≥95 all metrics

This commit is contained in:
Raphael Westphal
2026-08-18 17:56:31 +02:00
parent 71ab821abd
commit a67efdb5ec
8 changed files with 198 additions and 18 deletions
+22
View File
@@ -34,6 +34,18 @@ export default function ChatView({ store, pushToast }: Props) {
const session = store.sessions.find((s) => s.id === sessionId);
// Close the pi behind an agent session (stops + removes the container).
const closePi = useCallback(async (): Promise<void> => {
if (sessionId.length === 0) return;
try {
await fetchJson(Route.SessionContainer(sessionId), { method: "DELETE" });
pushToast(`closed pi ${session?.name ?? sessionId}`);
await store.refresh();
} catch (err) {
pushToast(`close failed: ${errMessage(err)}`);
}
}, [sessionId, session, store, pushToast]);
const applyEvents = useCallback((incoming: EventFrame[]): void => {
setEvents((prev) => {
const merged = mergeEvents(prev, incoming);
@@ -145,6 +157,16 @@ export default function ChatView({ store, pushToast }: Props) {
title={session?.online === true ? "online" : "offline"}
/>
<div className="spacer" />
{session?.agent === true && (
<button
type="button"
className="icon-btn danger"
aria-label={`Close pi ${session.name ?? session.id}`}
onClick={() => void closePi()}
>
close
</button>
)}
<button
type="button"
className="task-toggle icon-btn"