Change Linux default web port to 8505, add NODE_CMD/NPM_CMD support with version check, and declare Node 20.19+ in web/package.json engines.
Co-authored-by: Cursor <cursoragent@cursor.com>
Remove venv requirement, default PYTHON_CMD to /usr/local/python_env_new/bin/python3, and fix web startup without bash -lc. Add .gitattributes to keep shell scripts LF.
Co-authored-by: Cursor <cursoragent@cursor.com>
Add bash scripts to start/stop netx API (8890) and Vite web (8055) with PID/log files under scripts/.run.
Co-authored-by: Cursor <cursoragent@cursor.com>
Add a guarded managed-ne exec endpoint for oclaw ops tools to login managed devices and run read-only CLI safely.
Include request schema and unit tests for command guardrails and execution flow.
Co-authored-by: Cursor <cursoragent@cursor.com>
Persist full connect test logs (connect_detail) with NE UI detail modal.
Add Huawei/Cisco jump CLI templates and generic CLI hop session path.
Probe Cisco hostname via show configuration | include hostname (60s timeout).
Co-authored-by: Cursor <cursoragent@cursor.com>
Support hop_vendor=linux via Paramiko direct-tcpip tunnel; ZTE CLI hop unchanged. UI hop type selector and distinct list badges.
Co-authored-by: Cursor <cursoragent@cursor.com>
Add POST /v1/managed-ne/batch-hop, shared HopProxyFields form, and toolbar button next to connectivity test.
Co-authored-by: Cursor <cursoragent@cursor.com>
Add hop fields and encrypted credentials, unified Netmiko session factory with ZTE ssh/telnet CLI templates and secondary auth, wire connect/collect paths, and NE management UI with auto-suggested jump commands.
Co-authored-by: Cursor <cursoragent@cursor.com>
Treat timezone-less ISO timestamps from connect_tested_at as UTC before formatting so NE test time renders correctly in the user's system timezone.
Co-authored-by: Cursor <cursoragent@cursor.com>
Default the UME NE list and current alarms sections to collapsed state and add explicit expand/collapse toggles for cleaner initial layout.
Co-authored-by: Cursor <cursoragent@cursor.com>
Avoid false running-state conflicts when starting draft jobs, block overlapping NE runs across jobs, and default the create panel to collapsed for cleaner task-first operation.
Co-authored-by: Cursor <cursoragent@cursor.com>
Allow selecting multiple eligible NEs and adding them into the selected list in one action, while keeping single-item add for precise control.
Co-authored-by: Cursor <cursoragent@cursor.com>
Create collection jobs without auto-running; add /start for first run and re-run. Merge create form with filterable NE picker and selected list.
Co-authored-by: Cursor <cursoragent@cursor.com>
Defer collection scheduling to BackgroundTasks after commit; claim pending runs atomically with retries. Only handle focus-module broadcasts for the matching moduleId so opening one module does not rewrite other tabs.
Co-authored-by: Cursor <cursoragent@cursor.com>
Fix pending mislabeled as fail due to timezone and queue stale checks, show full error details, sync live progress counts, and add retry-failed endpoint for failed NEs only.
Co-authored-by: Cursor <cursoragent@cursor.com>
Expose GET /v1/managed-ne/import/template and a workbench button to download xlsx/csv templates listing supported Netmiko device types.
Co-authored-by: Cursor <cursoragent@cursor.com>
Introduce workbench operations for multi-vendor NE CRUD/connect-test and Netmiko batch collection with job lifecycle controls, log downloads, and paginated run filters.
Co-authored-by: Cursor <cursoragent@cursor.com>
Show inventory/alarms schedulers as running with DB last_run_at during debounce; English interval labels; subscription help on ? click.
Co-authored-by: Cursor <cursoragent@cursor.com>
Detect missing UME subscriptions from WSS/DELETE errors, stop stale reconnects, and prompt to clear local state before re-establishing.
Co-authored-by: Cursor <cursoragent@cursor.com>
Use DELETE delete-subscription, refresh token before cancel, recover orphan subs on establish, and keep local state when UME delete fails.
Co-authored-by: Cursor <cursoragent@cursor.com>
Sort UME current alarms by time_created descending (newest first) with last_seen_at and alarm_key as tie-breakers to keep offset/limit pagination stable. Apply the same default ordering in the MCP tool listing.
Co-authored-by: Cursor <cursoragent@cursor.com>
Only treat UUID-like values as net_id. Prefer extracting ME{uuid} from objectName and ignore ME{numeric} wrappers found in alarmkey so alarms join inventory correctly.
Also constrain legacy alarmkey split formats (#, csv, space) to UUID-like prefixes.
Co-authored-by: Cursor <cursoragent@cursor.com>
When alarmkey does not contain a net_id, fall back to extracting ME{net_id} from objectName so alarms can join inventory correctly. Add regression coverage for the ME{} objectName pattern.
Co-authored-by: Cursor <cursoragent@cursor.com>
Support UME alarmkey values like "<net_id> <x> <y>" when deriving ne_id so current alarms can join inventory correctly. Add regression coverage for hash, csv, and space-delimited alarmkey formats.
Co-authored-by: Cursor <cursoragent@cursor.com>
Log startup exceptions for UME scheduler threads and set runtime task status to error with startup_thread_init_failed details instead of silently swallowing exceptions. This prevents tasks from staying in init without actionable diagnostics.
Co-authored-by: Cursor <cursoragent@cursor.com>
Store UME alarm payload fields as TEXT and run startup ALTER COLUMN upgrades so large alarm records no longer fail with StringDataRightTruncation. Keep full values during sync while hashing only pathological ultra-long alarm keys to preserve idempotent primary keys.
Co-authored-by: Cursor <cursoragent@cursor.com>
- Use last ended_at (done or failed) for debounce; remove duplicate time.sleep after sync\n- On startup mark running+no ended_at jobs failed (crash/interrupt) so interval logic is not fooled\n- Log marker page progress every 25 pages\n- Log when alarm/inventory scheduler threads start
Co-authored-by: Cursor <cursoragent@cursor.com>
- _reset_runtime_pause_flags() after create_all so pause state cannot survive process restart in memory\n- Before each alarms/inventory auto sync, wait until interval elapsed since last status=done job ended_at (any trigger); honor pause during wait\n- Helps avoid immediate duplicate sync on restart when DB was recently updated
Co-authored-by: Cursor <cursoragent@cursor.com>
Makes schedule attempts visible in ume_sync_jobs while HTTP pagination runs; log iteration/sleep/finish for alarms_current and inventory auto loops.
Co-authored-by: Cursor <cursoragent@cursor.com>
Avoid stale last_run_at when sync_alarms_current runs longer than interval; clarifying tooltip on UME page.
Co-authored-by: Cursor <cursoragent@cursor.com>
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>