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:
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user