fix: preserve user turn provenance metadata

This commit is contained in:
Shakker
2026-05-27 01:07:10 +01:00
committed by Shakker
parent 91cb04265b
commit 2e8f1d439d
4 changed files with 18 additions and 2 deletions

View File

@@ -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,

View File

@@ -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,

View File

@@ -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",
}),
]);

View File

@@ -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(