chore: v2.8.21 — update progress steps, clone in background, extra SSH keys inline, today's spend

- Plugin update reports its running step (plugin-update-progress.json →
  plugin_update_progress); a hidden update or clone leaves a progress chip.
- Clone here can run in the background.
- Git identity: extra SSH keys are added inline per host (no More keys tab).
- Users: spend today (viewer's local day, ?tz_offset=).
- Prettier on the files touched since v2.8.20.
This commit is contained in:
2026-10-23 10:44:11 +07:00
parent 62b4520507
commit 9dd97a369c
33 changed files with 906 additions and 393 deletions
+4 -1
View File
@@ -538,6 +538,8 @@ export type ServerUserUsage = AuthUser & {
disabled: boolean;
workspaces: number;
sessions: number;
/** Since the viewer's local midnight (absent from an older server). */
today?: { cost: number; tokens: number };
last7d: { cost: number; tokens: number };
last30d: { cost: number; tokens: number };
/** Active login sessions (cookies not expired). */
@@ -1083,7 +1085,8 @@ export const api = {
avatarUrl: (id: number, avatarAt?: string | null) =>
avatarAt ? `${BASE}/users/${id}/avatar?v=${encodeURIComponent(avatarAt)}` : null,
/** GET /api/users — every account with its recent usage (admin/analyst). */
list: () => request<{ users: ServerUserUsage[] }>("/users"),
list: () =>
request<{ users: ServerUserUsage[] }>(`/users?tz_offset=${new Date().getTimezoneOffset()}`),
/** GET /api/users/audit — staff reads of members' sessions and admins'
* account changes, newest first. */
audit: () => request<{ entries: AuditEntry[] }>("/users/audit"),
+8
View File
@@ -1458,6 +1458,14 @@ export interface UpdateStatusPayload {
plugin_root?: string;
finished_at?: string;
} | null;
/** The step a running plugin-update chain is on (null between runs or on
* a server that predates it). Polled while an update runs. */
plugin_update_progress?: {
step: string;
index: number;
total: number;
started_at: string;
} | null;
}
// ───── Terminal run status ─────