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; sessionKey: string; storePath: string; entry: SessionEntry; clearedFields?: string[]; }; export async function persistSessionEntry(params: PersistSessionEntryParams): Promise { 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); }