feat(web): NetX workbench, UME-only UI, i18n, and header status

- Replace sidebar app with workbench home and module tabs (openOrFocusModule)

- Remove legacy pages; add module registry, shared tab channel, WEB.md

- Add zh/en i18n, global ToastProvider, restore oclaw bridge pill in header

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
oliver 2026-05-27 11:18:30 +08:00
parent 664775927b
commit 282dbe75af
33 changed files with 1631 additions and 1677 deletions

View file

@ -1,79 +1,14 @@
export type Batch = {
batch_id: string;
source_file: string;
status: string;
total_rows: number;
success_rows: number;
failed_rows: number;
created_at: string;
};
export type Alarm = {
id: number;
alarm_time: string;
severity_norm: string;
ne_name: string;
alarm_code: string;
};
export type AlarmQueryResponse = {
total: number;
page: number;
page_size: number;
items: Alarm[];
};
export type Diagnostics = {
batch_id: string;
total_alarms: number;
severity_summary?: Array<{ key: string; count: number }>;
top_alarm_codes?: Array<{ key: string; count: number }>;
top_ne?: Array<{ key: string; count: number }>;
protocol_summary?: Array<{ key: string; count: number }>;
};
export type IntegrationStatus = {
netx_api: { status: "up" | "down" | "unknown"; [k: string]: unknown };
db: { status: "up" | "down" | "unknown"; latency_ms?: number; error?: string; [k: string]: unknown };
oclaw_bridge: {
oclaw_bridge?: {
status: "up" | "down" | "unknown";
latency_ms?: number;
http_status?: number | null;
error_kind?: string;
error?: string;
detail?: unknown;
[k: string]: unknown;
};
};
export type ImportHistoryItem = {
kind: "alarms" | "logs" | "config";
ts_ms: number;
file_name: string;
batch_id?: string;
ok: boolean;
summary: string;
};
export type AiAnalyzeHistoryItem = {
id: number;
analysis_request_id?: string;
batch_id: string;
question: string;
filters?: Record<string, unknown>;
ok: boolean;
answer?: string;
error?: string;
created_at: string;
};
export type AiAnalyzeHistoryResponse = {
total: number;
page: number;
page_size: number;
items: AiAnalyzeHistoryItem[];
};
export type UmeSyncJobItem = {
id: number;
domain: string;
@ -82,7 +17,6 @@ export type UmeSyncJobItem = {
pulled_count: number;
inserted_count: number;
updated_count: number;
/** Full-snapshot reconcile deletes (inventory: NE rows; alarms_current: current alarm rows). */
deleted?: number;
error_message?: string;
started_at: string;