























@@ -1,14 +1,18 @@
11import path from "node:path";
22import type { AgentMessage } from "@earendil-works/pi-agent-core";
3-import { runAgentHarnessBeforeMessageWriteHook } from "../agents/harness/hook-helpers.js";
43import { appendSessionTranscriptMessage } from "../config/sessions/transcript-append.js";
5-import { resolveSessionTranscriptFile } from "../config/sessions/transcript.js";
6-import type { SessionEntry } from "../config/sessions/types.js";
7-import type { OpenClawConfig } from "../config/types.openclaw.js";
8-import { logVerbose } from "../globals.js";
94import { mimeTypeFromFilePath } from "../media/mime.js";
105import { emitSessionTranscriptUpdate } from "./transcript-events.js";
1167+type TranscriptAppendConfig = Parameters<typeof appendSessionTranscriptMessage>[0]["config"];
8+9+type UserTurnSessionEntry = {
10+sessionId: string;
11+updatedAt: number;
12+sessionFile?: string;
13+threadId?: string | number;
14+} & Record<string, unknown>;
15+1216type PersistedUserTurnMediaInput = {
1317path?: string | null;
1418url?: string | null;
@@ -35,6 +39,12 @@ export type UserTurnInput = {
35393640type UserTurnTranscriptUpdateMode = "inline" | "none";
374142+export type UserTurnBeforeMessageWrite = (params: {
43+message: PersistedUserTurnMessage;
44+agentId?: string;
45+sessionKey?: string;
46+}) => AgentMessage | null;
47+3848type AppendUserTurnTranscriptMessageParams = {
3949transcriptPath: string;
4050input?: UserTurnInput;
@@ -43,23 +53,25 @@ type AppendUserTurnTranscriptMessageParams = {
4353agentId?: string;
4454sessionKey?: string;
4555cwd?: string;
46-config?: OpenClawConfig;
56+config?: TranscriptAppendConfig;
4757updateMode?: UserTurnTranscriptUpdateMode;
58+beforeMessageWrite?: UserTurnBeforeMessageWrite;
4859};
49605061type PersistUserTurnTranscriptParams = {
5162input?: UserTurnInput;
5263message?: PersistedUserTurnMessage;
5364sessionId: string;
5465sessionKey: string;
55-sessionEntry: SessionEntry | undefined;
56-sessionStore?: Record<string, SessionEntry>;
66+sessionEntry: UserTurnSessionEntry | undefined;
67+sessionStore?: Record<string, UserTurnSessionEntry>;
5768storePath?: string;
5869agentId: string;
5970threadId?: string | number;
6071cwd?: string;
61-config?: OpenClawConfig;
72+config?: TranscriptAppendConfig;
6273updateMode?: UserTurnTranscriptUpdateMode;
74+beforeMessageWrite?: UserTurnBeforeMessageWrite;
6375};
64766577type UserTurnTranscriptPersistenceTarget = Omit<
@@ -73,14 +85,14 @@ type UserTurnTranscriptFileTarget = {
7385agentId?: string;
7486sessionKey?: string;
7587cwd?: string;
76-config?: OpenClawConfig;
88+config?: TranscriptAppendConfig;
7789};
78907991type UserTurnTranscriptTarget = UserTurnTranscriptPersistenceTarget | UserTurnTranscriptFileTarget;
80928193type UserTurnTranscriptPersistResult = {
8294sessionFile: string;
83-sessionEntry: SessionEntry | undefined;
95+sessionEntry: UserTurnSessionEntry | undefined;
8496messageId: string;
8597message: PersistedUserTurnMessage;
8698};
@@ -113,6 +125,7 @@ type CreateUserTurnTranscriptRecorderParams = {
113125message?: PersistedUserTurnMessage;
114126target: UserTurnTranscriptTargetResolver;
115127updateMode?: UserTurnTranscriptUpdateMode;
128+beforeMessageWrite?: UserTurnBeforeMessageWrite;
116129errorContext?: string;
117130onPersistenceError?: (error: unknown) => void;
118131};
@@ -351,12 +364,18 @@ export function mergePreparedUserTurnMessageForRuntime(params: {
351364352365function applyBeforeMessageWriteToUserTurn(
353366message: PersistedUserTurnMessage,
354-params: Pick<AppendUserTurnTranscriptMessageParams, "agentId" | "sessionKey">,
367+params: Pick<
368+AppendUserTurnTranscriptMessageParams,
369+"agentId" | "sessionKey" | "beforeMessageWrite"
370+>,
355371): PersistedUserTurnMessage | undefined {
372+if (!params.beforeMessageWrite) {
373+return message;
374+}
356375const originalMessage = message as unknown as { idempotencyKey?: unknown };
357376const idempotencyKey =
358377typeof originalMessage.idempotencyKey === "string" ? originalMessage.idempotencyKey : undefined;
359-const nextMessage = runAgentHarnessBeforeMessageWriteHook({
378+const nextMessage = params.beforeMessageWrite({
360379 message,
361380 ...(params.agentId ? { agentId: params.agentId } : {}),
362381 ...(params.sessionKey ? { sessionKey: params.sessionKey } : {}),
@@ -429,6 +448,7 @@ export async function persistUserTurnTranscript(
429448return undefined;
430449}
431450451+const { resolveSessionTranscriptFile } = await import("../config/sessions/transcript.js");
432452const { sessionFile, sessionEntry } = await resolveSessionTranscriptFile({
433453sessionId: params.sessionId,
434454sessionKey: params.sessionKey,
@@ -448,6 +468,7 @@ export async function persistUserTurnTranscript(
448468 ...(params.cwd ? { cwd: params.cwd } : {}),
449469 ...(params.config ? { config: params.config } : {}),
450470 ...(params.updateMode ? { updateMode: params.updateMode } : {}),
471+ ...(params.beforeMessageWrite ? { beforeMessageWrite: params.beforeMessageWrite } : {}),
451472});
452473if (!appended) {
453474return undefined;
@@ -486,9 +507,13 @@ export function createUserTurnTranscriptRecorder(
486507params.onPersistenceError(error);
487508return;
488509}
489-logVerbose(
490-`failed to persist ${params.errorContext ?? "user turn transcript"}: ${String(error)}`,
491-);
510+void import("../globals.js")
511+.then(({ logVerbose }) => {
512+logVerbose(
513+`failed to persist ${params.errorContext ?? "user turn transcript"}: ${String(error)}`,
514+);
515+})
516+.catch(() => undefined);
492517};
493518494519const waitForRuntimePersistence = async () => {
@@ -537,6 +562,7 @@ export function createUserTurnTranscriptRecorder(
537562 ...target,
538563 message,
539564 updateMode,
565+ ...(params.beforeMessageWrite ? { beforeMessageWrite: params.beforeMessageWrite } : {}),
540566}).then((appended) =>
541567appended
542568 ? {
@@ -549,6 +575,7 @@ export function createUserTurnTranscriptRecorder(
549575 ...target,
550576 message,
551577 updateMode,
578+ ...(params.beforeMessageWrite ? { beforeMessageWrite: params.beforeMessageWrite } : {}),
552579});
553580if (result) {
554581persisted = true;
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。