feat(dashboard): operator removal UI for stale machines/sessions (SPEC-004 Task 5)
All checks were successful
All checks were successful
Admin-only per-row Remove + multi-select bulk removal on the machines view, plus per-row purge Remove on the sessions view, wired to the Task-5 admin API (DELETE /api/machines|sessions/:id?purge=true, POST /api/machines/bulk-remove). Confirm modals (danger-styled, focus-trapped), TanStack refetch so purged rows leave the console, structured ApiError surfacing, honest partial-bulk summary, and admin-gating via useAuth().isAdmin as defense-in-depth over the server 403. Replaces the legacy all-user delete trigger. typecheck/lint/build clean. Implements specs/v2-stable-identity/plan.md Task 5 (dashboard portion). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,5 +1,9 @@
|
||||
import { http } from "./client";
|
||||
import type { Session, ViewerTokenResponse } from "./types";
|
||||
import type {
|
||||
RemoveSessionResponse,
|
||||
Session,
|
||||
ViewerTokenResponse,
|
||||
} from "./types";
|
||||
|
||||
/**
|
||||
* GET /api/sessions — all live sessions known to the relay's in-memory session
|
||||
@@ -27,10 +31,25 @@ export function mintViewerToken(
|
||||
}
|
||||
|
||||
/**
|
||||
* DELETE /api/sessions/:id — disconnect/end a live session. The relay sends a
|
||||
* Disconnect to the agent. Returns 200 on success, 404 if the session is not
|
||||
* found. Requires an authenticated dashboard JWT (not admin-gated server-side).
|
||||
* DELETE /api/sessions/:id — disconnect/end a live session (admin only). The
|
||||
* relay sends a Disconnect to the agent. Returns 200 on success, 404 if the
|
||||
* session is not live in memory. This is the live-only path (no `purge`); it
|
||||
* does not soft-delete any persisted row.
|
||||
*/
|
||||
export function endSession(sessionId: string): Promise<void> {
|
||||
return http.del<void>(`/api/sessions/${encodeURIComponent(sessionId)}`);
|
||||
}
|
||||
|
||||
/**
|
||||
* DELETE /api/sessions/:id?purge=true — operator removal of a session (admin
|
||||
* only). Soft-deletes the persisted `connect_sessions` row and drops any live
|
||||
* in-memory session, clearing a ghost/stale session from the console. 404 only
|
||||
* when neither a live nor a persisted session exists.
|
||||
*/
|
||||
export function purgeSession(
|
||||
sessionId: string,
|
||||
): Promise<RemoveSessionResponse> {
|
||||
return http.del<RemoveSessionResponse>(
|
||||
`/api/sessions/${encodeURIComponent(sessionId)}?purge=true`,
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user