mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-09 10:30:44 +00:00
77 lines
2.3 KiB
TypeScript
77 lines
2.3 KiB
TypeScript
import { updateSessionStore } from "../../config/sessions/store.js";
|
|
import { mergeSessionEntry, type SessionEntry } from "../../config/sessions/types.js";
|
|
import {
|
|
formatAgentInternalEventsForPlainPrompt,
|
|
formatAgentInternalEventsForPrompt,
|
|
} from "../internal-events.js";
|
|
import {
|
|
hasInternalRuntimeContext,
|
|
stripInternalRuntimeContext,
|
|
} from "../internal-runtime-context.js";
|
|
import type { AgentCommandOpts } from "./types.js";
|
|
|
|
export type PersistSessionEntryParams = {
|
|
sessionStore: Record<string, SessionEntry>;
|
|
sessionKey: string;
|
|
storePath: string;
|
|
entry: SessionEntry;
|
|
clearedFields?: string[];
|
|
};
|
|
|
|
export async function persistSessionEntry(params: PersistSessionEntryParams): Promise<void> {
|
|
const persisted = await updateSessionStore(params.storePath, (store) => {
|
|
const merged = mergeSessionEntry(store[params.sessionKey], params.entry);
|
|
for (const field of params.clearedFields ?? []) {
|
|
if (!Object.hasOwn(params.entry, field)) {
|
|
Reflect.deleteProperty(merged, field);
|
|
}
|
|
}
|
|
store[params.sessionKey] = merged;
|
|
return merged;
|
|
});
|
|
params.sessionStore[params.sessionKey] = persisted;
|
|
}
|
|
|
|
export function prependInternalEventContext(
|
|
body: string,
|
|
events: AgentCommandOpts["internalEvents"],
|
|
): string {
|
|
if (hasInternalRuntimeContext(body)) {
|
|
return body;
|
|
}
|
|
const renderedEvents = formatAgentInternalEventsForPrompt(events);
|
|
if (!renderedEvents) {
|
|
return body;
|
|
}
|
|
return [renderedEvents, body].filter(Boolean).join("\n\n");
|
|
}
|
|
|
|
function resolvePlainInternalEventBody(
|
|
body: string,
|
|
events: AgentCommandOpts["internalEvents"],
|
|
): string {
|
|
const renderedEvents = formatAgentInternalEventsForPlainPrompt(events);
|
|
if (!renderedEvents) {
|
|
return body;
|
|
}
|
|
const visibleBody = stripInternalRuntimeContext(body).trim();
|
|
return [renderedEvents, visibleBody].filter(Boolean).join("\n\n") || body;
|
|
}
|
|
|
|
export function resolveAcpPromptBody(
|
|
body: string,
|
|
events: AgentCommandOpts["internalEvents"],
|
|
): string {
|
|
return events?.length ? resolvePlainInternalEventBody(body, events) : body;
|
|
}
|
|
|
|
export function resolveInternalEventTranscriptBody(
|
|
body: string,
|
|
events: AgentCommandOpts["internalEvents"],
|
|
): string {
|
|
if (!hasInternalRuntimeContext(body)) {
|
|
return body;
|
|
}
|
|
return resolvePlainInternalEventBody(body, events);
|
|
}
|