吸收数字员工长期记忆闭环

This commit is contained in:
baiyanyun
2026-06-09 13:49:11 +08:00
parent ef8252e2dd
commit ddd39396f7
12 changed files with 817 additions and 34 deletions

View File

@@ -17,8 +17,13 @@ import {
saveDigitalEmployeeCronSettings,
readDigitalEmployeeScheduleRuns,
saveDigitalEmployeeUiState,
listDigitalEmployeeMemories,
upsertDigitalEmployeeMemory,
deleteDigitalEmployeeMemory,
syncQimingclawMemoryEntries,
type DigitalEmployeeManagedService,
type DigitalEmployeeGovernanceCommandRecord,
type DigitalEmployeeMemoryUpsertInput,
type DigitalEmployeeServiceStatus,
type DigitalEmployeeSnapshot,
type DigitalEmployeeUiStateUpdate,
@@ -33,6 +38,7 @@ import {
} from "../services/digitalEmployee/syncService";
import { listDigitalEmployeePlanTemplates } from "../services/digitalEmployee/planTemplateService";
import { listDigitalEmployeeSkillCapabilities } from "../services/digitalEmployee/skillCatalogService";
import { memoryService } from "../services/memory";
export function registerDigitalEmployeeHandlers(ctx: HandlerContext): void {
ipcMain.handle("digitalEmployee:getSnapshot", async () => {
@@ -70,6 +76,50 @@ export function registerDigitalEmployeeHandlers(ctx: HandlerContext): void {
return listDigitalEmployeePlanTemplates();
});
ipcMain.handle("digitalEmployee:listMemories", async (_, options?: { query?: string; category?: string; limit?: number }) => {
if (memoryService.isInitialized()) {
syncQimingclawMemoryEntries(memoryService.listMemories({ status: "active", limit: options?.limit ?? 300 }));
}
return listDigitalEmployeeMemories(options ?? {});
});
ipcMain.handle("digitalEmployee:addMemory", async (_, input: DigitalEmployeeMemoryUpsertInput) => {
const content = typeof input?.content === "string" ? input.content : "";
const category = typeof input?.category === "string" ? input.category : "fact";
const key = typeof input?.key === "string" && input.key.trim() ? input.key.trim() : undefined;
let memoryServiceId: string | null = null;
if (memoryService.isInitialized()) {
memoryServiceId = memoryService.addMemory({
id: input.id || key,
text: content,
category: category as never,
source: "core",
sourcePath: "MEMORY.md",
status: "active",
});
}
return upsertDigitalEmployeeMemory({
...input,
id: input.id || memoryServiceId || key,
key: key || memoryServiceId || input.id,
content,
category,
source: memoryServiceId ? "qimingclaw-memory-service" : "qimingclaw-digital-local",
payload: {
...(input.payload ?? {}),
memoryServiceId,
},
});
});
ipcMain.handle("digitalEmployee:deleteMemory", async (_, keyOrId: string) => {
const deleted = deleteDigitalEmployeeMemory(keyOrId);
if (deleted && memoryService.isInitialized()) {
memoryService.deleteMemory(deleted.id);
}
return deleted;
});
ipcMain.handle(
"digitalEmployee:saveUiState",
async (_, update: DigitalEmployeeUiStateUpdate) => {