mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-28 06:06:17 +00:00
fix: preserve user turn provenance metadata
This commit is contained in:
@@ -1145,6 +1145,7 @@ export async function runPreparedReply(
|
||||
? (internalOpts?.queuedFollowupAbortSignal ?? opts?.abortSignal)
|
||||
: undefined;
|
||||
const userTurnMediaForPersistence = buildPersistedUserTurnMediaInputsFromFields(ctx);
|
||||
const inputProvenance = ctx.InputProvenance ?? sessionCtx.InputProvenance;
|
||||
const userTurnTranscriptText = resolvePersistedUserTurnText(transcriptBody, {
|
||||
hasMedia: userTurnMediaForPersistence.length > 0,
|
||||
});
|
||||
@@ -1152,6 +1153,7 @@ export async function runPreparedReply(
|
||||
userTurnTranscriptText !== undefined || userTurnMediaForPersistence.length > 0
|
||||
? {
|
||||
text: userTurnTranscriptText,
|
||||
...(inputProvenance ? { provenance: inputProvenance } : {}),
|
||||
...(userTurnMediaForPersistence.length > 0
|
||||
? {
|
||||
media: userTurnMediaForPersistence,
|
||||
@@ -1265,7 +1267,7 @@ export async function runPreparedReply(
|
||||
timeoutMs,
|
||||
blockReplyBreak: resolvedBlockStreamingBreak,
|
||||
ownerNumbers: command.ownerList.length > 0 ? command.ownerList : undefined,
|
||||
inputProvenance: ctx.InputProvenance ?? sessionCtx.InputProvenance,
|
||||
inputProvenance,
|
||||
extraSystemPrompt: extraSystemPromptParts.join("\n\n") || undefined,
|
||||
sourceReplyDeliveryMode: isRoomEvent ? "message_tool_only" : opts?.sourceReplyDeliveryMode,
|
||||
silentReplyPromptMode,
|
||||
|
||||
@@ -2600,6 +2600,7 @@ export const chatHandlers: GatewayRequestHandlers = {
|
||||
text: rawMessage,
|
||||
timestamp: now,
|
||||
idempotencyKey: `${clientRunId}:user`,
|
||||
...(systemInputProvenance ? { provenance: systemInputProvenance } : {}),
|
||||
};
|
||||
const userTurnInputPromise: Promise<UserTurnInput> = userTurnMediaPromise.then((media) => ({
|
||||
...baseUserTurnInput,
|
||||
|
||||
@@ -231,6 +231,11 @@ describe("user turn transcript persistence", () => {
|
||||
text: "What is in this image?",
|
||||
media: [{ path: "/tmp/image.png", contentType: "image/png" }],
|
||||
timestamp: 123,
|
||||
provenance: {
|
||||
kind: "inter_session",
|
||||
sourceSessionKey: "source-main",
|
||||
sourceTool: "sessions_send",
|
||||
},
|
||||
},
|
||||
updateMode: "none",
|
||||
});
|
||||
@@ -245,6 +250,11 @@ describe("user turn transcript persistence", () => {
|
||||
role: "user",
|
||||
content: "What is in this image?",
|
||||
MediaPath: "/tmp/image.png",
|
||||
provenance: {
|
||||
kind: "inter_session",
|
||||
sourceSessionKey: "source-main",
|
||||
sourceTool: "sessions_send",
|
||||
},
|
||||
MediaType: "image/png",
|
||||
}),
|
||||
]);
|
||||
|
||||
@@ -2,6 +2,7 @@ import path from "node:path";
|
||||
import type { AgentMessage } from "@earendil-works/pi-agent-core";
|
||||
import { appendSessionTranscriptMessage } from "../config/sessions/transcript-append.js";
|
||||
import { mimeTypeFromFilePath } from "../media/mime.js";
|
||||
import { applyInputProvenanceToUserMessage, type InputProvenance } from "./input-provenance.js";
|
||||
import { emitSessionTranscriptUpdate } from "./transcript-events.js";
|
||||
|
||||
type TranscriptAppendConfig = Parameters<typeof appendSessionTranscriptMessage>[0]["config"];
|
||||
@@ -34,6 +35,7 @@ export type UserTurnInput = {
|
||||
media?: readonly PersistedUserTurnMediaInput[] | null;
|
||||
timestamp?: number;
|
||||
idempotencyKey?: string;
|
||||
provenance?: InputProvenance;
|
||||
mediaOnlyText?: string;
|
||||
};
|
||||
|
||||
@@ -285,13 +287,14 @@ function buildPersistedUserTurnMessage(params: UserTurnInput): PersistedUserTurn
|
||||
const hasMedia = Boolean(mediaFields.MediaPath);
|
||||
const text = normalizeTranscriptText(params.text);
|
||||
const content = text || (hasMedia ? (params.mediaOnlyText ?? "") : "");
|
||||
return {
|
||||
const message = {
|
||||
role: "user",
|
||||
content,
|
||||
timestamp: params.timestamp ?? Date.now(),
|
||||
...(params.idempotencyKey ? { idempotencyKey: params.idempotencyKey } : {}),
|
||||
...mediaFields,
|
||||
} as PersistedUserTurnMessage;
|
||||
return applyInputProvenanceToUserMessage(message, params.provenance) as PersistedUserTurnMessage;
|
||||
}
|
||||
|
||||
function resolvePersistedUserTurnMessage(
|
||||
|
||||
Reference in New Issue
Block a user