feat(client): bridge digital employee status

This commit is contained in:
baiyanyun
2026-06-05 15:59:48 +08:00
parent 31b4b5a281
commit 15a3285ed5
7 changed files with 268 additions and 60 deletions

View File

@@ -166,7 +166,8 @@ const WEBVIEW_PERF_BRIDGE_PRELOAD = path.join(
function shouldInjectWebviewPerfBridge(url: string): boolean {
try {
const parsed = new URL(url);
return /^https?:$/.test(parsed.protocol);
if (/^https?:$/.test(parsed.protocol)) return true;
return parsed.protocol === "file:" && parsed.pathname.includes("/sgrobot-digital/");
} catch {
return false;
}

View File

@@ -1,6 +1,7 @@
import { contextBridge, ipcRenderer } from "electron";
type PerfPayload = Record<string, unknown>;
type ServiceStatus = Record<string, unknown> | null;
const CHAT_ROUTE_RE = /^\/home\/chat\/\d+\/\d+$/;
const CHAT_ROOT_SELECTOR = '[data-qimingclaw-perf-scope="chat-root"]';
@@ -91,4 +92,70 @@ const perf = {
contextBridge.exposeInMainWorld("QimingClawBridge", {
perf,
digital: {
async getSnapshot() {
const [
agent,
mcp,
computerServer,
lanproxy,
fileServer,
guiServer,
sessionsResult,
] = await Promise.all([
ipcRenderer.invoke("agent:serviceStatus").catch((error) => ({
running: false,
error: String(error),
})),
ipcRenderer.invoke("mcp:status").catch((error) => ({
running: false,
error: String(error),
})),
ipcRenderer.invoke("computerServer:status").catch((error) => ({
running: false,
error: String(error),
})),
ipcRenderer.invoke("lanproxy:status").catch((error) => ({
running: false,
error: String(error),
})),
ipcRenderer.invoke("fileServer:status").catch((error) => ({
running: false,
error: String(error),
})),
ipcRenderer.invoke("guiServer:status").catch((error) => ({
running: false,
error: String(error),
})),
ipcRenderer.invoke("agent:listSessionsDetailed").catch((error) => ({
success: false,
data: [],
error: String(error),
})),
]);
const sessions = Array.isArray(sessionsResult?.data)
? sessionsResult.data
: [];
return {
generatedAt: new Date().toISOString(),
services: {
agent: agent as ServiceStatus,
mcp: mcp as ServiceStatus,
computerServer: computerServer as ServiceStatus,
lanproxy: lanproxy as ServiceStatus,
fileServer: fileServer as ServiceStatus,
guiServer: guiServer as ServiceStatus,
},
sessions: {
total: sessions.length,
active: sessions.filter((session: { status?: string }) =>
session.status === "active" || session.status === "pending",
).length,
items: sessions.slice(0, 10),
},
};
},
},
});