/* * SPEC: PJ2026-0104010803 Workbench唯一投影 draft-2026-06-18-p0-unique-projection; PJ2026-010205 HWLAB接入 draft-2026-06-17-r0. * 职责: WorkbenchProjectionWriter 组件入口。唯一封装 Code Agent/AgentRun facts 到 Workbench session projection facts 的持久化写入。 */ import { defaultCodeAgentTraceStore } from "./code-agent-trace-store.ts"; import { safeTraceId } from "./server-http-utils.ts"; export async function writeWorkbenchProjectionSession({ accessController, traceStore = defaultCodeAgentTraceStore, traceId, ownerUserId, ownerRole = null, sessionId = null, projectId = null, conversationId = null, threadId = null, status = "active", session = {}, preserveLastTraceId = false } = {}) { if (!ownerUserId || typeof accessController?.recordAgentSessionOwner !== "function") return null; const safeId = safeTraceId(traceId); try { return await accessController.recordAgentSessionOwner({ ownerUserId, ownerRole, sessionId, projectId, conversationId, threadId, traceId: preserveLastTraceId ? undefined : safeId, status, session }); } catch (error) { if (safeId) appendProjectionDiagnostic(traceStore, safeId, { type: "session-owner", status: "degraded", label: "projection-writer:session-owner:persist-failed", errorCode: "workbench_projection_session_persist_failed", message: error?.message ?? "Workbench projection session persistence failed.", valuesPrinted: false }); return null; } } export function appendProjectionDiagnostic(traceStore = defaultCodeAgentTraceStore, traceId, event = {}) { const safeId = safeTraceId(traceId); if (!safeId || typeof traceStore?.append !== "function") return null; return traceStore.append(safeId, { type: "projection-diagnostic", status: "degraded", label: "projection:diagnostic", ...event, valuesPrinted: false }); }