feat(client): persist digital employee snapshots

This commit is contained in:
baiyanyun
2026-06-05 16:27:15 +08:00
parent 15a3285ed5
commit 40151c3902
5 changed files with 251 additions and 63 deletions

View File

@@ -1,7 +1,6 @@
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"]';
@@ -94,68 +93,7 @@ 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),
},
};
return ipcRenderer.invoke("digitalEmployee:getSnapshot");
},
},
});