diff --git a/internal/cloud/workbench-projection-writer.ts b/internal/cloud/workbench-projection-writer.ts index 1053ddaa..de4046ca 100644 --- a/internal/cloud/workbench-projection-writer.ts +++ b/internal/cloud/workbench-projection-writer.ts @@ -280,7 +280,7 @@ function buildWorkbenchProjectionFacts({ traceId = null, ownerUserId = null, own const timing = projectionTimingForStatus(projection.timing, terminal); const diagnostic = projectionDiagnostics({ traceId: safeId, result: payload, trace: payload?.runnerTrace ?? null, projection }); const finalText = finalResponseTextValue(projection.finalResponse, payload?.finalResponse, session?.finalResponse, payload?.assistantText); - const messages = normalizeMessages(session?.messages, { + const messages = normalizeMessages(workbenchProjectionInputMessages({ session, payload, params, traceId: safeId, timestamp, terminal, terminalStatus, finalText }), { traceId: safeId, sessionId: resolvedSessionId, conversationId: resolvedConversationId, @@ -377,6 +377,48 @@ function buildWorkbenchProjectionFacts({ traceId = null, ownerUserId = null, own }; } +function workbenchProjectionInputMessages({ session = {}, payload = {}, params = {}, traceId = null, timestamp = null, terminal = false, terminalStatus = "completed", finalText = null } = {}) { + if (Array.isArray(session?.messages) && session.messages.length > 0) return session.messages; + if (Array.isArray(payload?.messages) && payload.messages.length > 0) return payload.messages; + if (!traceId) return []; + const turnId = textValue(payload?.turnId) || traceId; + const userText = textValue(params?.message ?? params?.prompt ?? payload?.prompt ?? payload?.message); + const userMessageId = textValue(payload?.userMessageId ?? payload?.userMessage?.messageId) || stableFactId("msg", { traceId, role: "user" }); + const assistantMessageId = textValue(payload?.assistantMessageId ?? payload?.messageId ?? payload?.assistantMessage?.messageId) || stableFactId("msg", { traceId, role: "agent" }); + const createdAt = timestampValue(timestamp ?? payload?.createdAt ?? payload?.updatedAt); + const messages = []; + if (userText) { + messages.push({ + messageId: userMessageId, + role: "user", + status: "sent", + text: userText, + traceId, + turnId, + createdAt, + updatedAt: createdAt, + valuesPrinted: false + }); + } + messages.push({ + messageId: assistantMessageId, + role: "agent", + status: terminal ? terminalStatus : "running", + text: terminal && finalText ? finalText : "", + traceId, + turnId, + timing: payload?.timing, + startedAt: payload?.startedAt, + lastEventAt: payload?.lastEventAt, + finishedAt: payload?.finishedAt, + durationMs: payload?.durationMs, + createdAt, + updatedAt: createdAt, + valuesPrinted: false + }); + return messages; +} + function normalizeMessages(messages, context) { const normalized = Array.isArray(messages) ? messages.map((message, index) => normalizeMessageFact(message, index, context)).filter(Boolean) : []; if (context?.terminal && context?.finalText && context?.traceId && !normalized.some((message) => message.role !== "user" && message.traceId === context.traceId)) {