Accepts keys like nz-admin.pem (BEGIN RSA PRIVATE KEY); rejects invalid PEM
before encrypting. Public key field optional on create/update.
Co-authored-by: Cursor <cursoragent@cursor.com>
The ssh-key-presets API returns a plain array; fetchPagePerPage left the
list empty so new keys appeared not to save.
Co-authored-by: Cursor <cursoragent@cursor.com>
So str(exc) passthrough on scripts, batch, sync, and schedule routes
returns Chinese without relying only on the HTTP detail translation layer.
Co-authored-by: Cursor <cursoragent@cursor.com>
Stop exposing raw reason codes like admin_not_found in TOTP setup errors;
auth routes and JWT guard now use Chinese literals with auth_failure_detail.
Co-authored-by: Cursor <cursoragent@cursor.com>
Add a global detail translator for common 4xx messages (Server not found,
auth headers, settings not found, etc.) while keeping /api/agent/* in English.
Co-authored-by: Cursor <cursoragent@cursor.com>
Record production evidence (101 机器人 vs old 5) and update AI handoff
with current deploy state and TOP 10 priorities.
Co-authored-by: Cursor <cursoragent@cursor.com>
Push page previously fetched only 200 servers by ID order, so large categories
like 机器人 showed a handful of machines. Also decouple unset-path panel from
the main category chip filter and align category labels with the servers page.
Co-authored-by: Cursor <cursoragent@cursor.com>
Sample fleet averages every heartbeat flush into fleet_metric_samples;
expose GET /api/servers/fleet-metrics and Dashboard sparkline card (B-02).
Co-authored-by: Cursor <cursoragent@cursor.com>
Unify upgrade-agent with install.sh via agent_deploy; auto-sync Git web/app after
Docker upgrade to prevent vite hash drift; extend prod_probe for Beijing TZ checks.
Co-authored-by: Cursor <cursoragent@cursor.com>
Cron matching, audit/alert date filters, and schedule UI align on Asia/Shanghai
while JWT/TOTP/heartbeat stay UTC; follow-ups add WS alert timestamps, fixed
install timezone copy, and 422 on invalid date filters.
Co-authored-by: Cursor <cursoragent@cursor.com>
Align index.html with a complete Vite output set and remove 116 orphaned
chunks so git clone loads the SPA correctly.
Co-authored-by: Cursor <cursoragent@cursor.com>
SSH origin checks cover auth contracts and once-schedule create/delete
when external HTTPS is blocked; includes install script for probe credentials.
Co-authored-by: Cursor <cursoragent@cursor.com>
Record .cursorrules rules to avoid full-repo diffs over web/app/assets,
and document production health checks for the alerts/schedule fix batch.
Co-authored-by: Cursor <cursoragent@cursor.com>
Restore alert history filters and stats fields, paginate command/session logs for the SPA, show script labels on schedules, and land integration/E2E coverage with rebuilt web assets.
Store alert metrics without per-value Redis members to stop duplicate recovery pushes; format all operator-facing timestamps in Asia/Shanghai across Web UI and Telegram.