Non-reentrant Lock caused /v1/ume/token/refresh to hang when handshake failed or token empty inside renew; UI stuck on 续期中.
Co-authored-by: Cursor <cursoragent@cursor.com>
- keepalive: call renew when has_token and (expires_in<=0 or below renew_before) so 0s stuck state self-heals\n- alarms/inventory auto loops: set last_error while pulling so table is not stuck at init with no hint\n- UmePage: warn pills for connected+需续期, spinners on token actions, toast ok/err from App, invalidate sync status after token ops
Co-authored-by: Cursor <cursoragent@cursor.com>
Previously exp>mem_exp blocked loading when both were 0 (restart + DB row with missing expiry). Also clear in-memory token when DB row is cleared so token/status matches store after disconnect.
Co-authored-by: Cursor <cursoragent@cursor.com>
GET /v1/ume/alarms accepts host_name (contains on inventory); ne_id query kept for API clients. Web uses host_name field and link on host column.
Co-authored-by: Cursor <cursoragent@cursor.com>
API GET /v1/ume/sync/status exposes deleted only (sum of inventory NE + current-alarm reconcile counts from details_json). UI one column.
Co-authored-by: Cursor <cursoragent@cursor.com>
Drop ume_inventory_equipment_holder on startup; remove ORM model and sync/reconcile paths. Sync status API/UI no longer expose deleted_inventory_holders. Nested holder data remains in ne raw_json if UME returns it.
Co-authored-by: Cursor <cursoragent@cursor.com>
Parse UmeSyncJob.details_json in GET /v1/ume/sync/status for deleted_inventory_ne, deleted_inventory_holders, deleted_stale_current_alarms. Add table columns on UmePage and types.
Co-authored-by: Cursor <cursoragent@cursor.com>
After a complete marker pull (is_end_of_reply, no iterator/dup abort), delete local NE/holders and current alarms not present in this batch. Replace 48h-only current-alarm expiry. Flush before bulk delete to avoid ORM stale updates. Job/batch JSON records deleted counts and reconcile flags.
Co-authored-by: Cursor <cursoragent@cursor.com>
Set trust_env=False on netx->oclaw analyze and health clients so localhost checks are not routed through host proxies.
Co-authored-by: Cursor <cursoragent@cursor.com>
Set up netx as a standalone git-managed project with isolated Python dependencies, alarm ingestion/query APIs, oclaw bridge integration, and ops-focused UI enhancements including history and raw field access.
Co-authored-by: Cursor <cursoragent@cursor.com>