openclaw/src/sessions/transcript-events.ts

51 lines
1.5 KiB
TypeScript

export type SessionTranscriptUpdate = {
sessionFile: string;
sessionKey?: string;
message?: unknown;
messageId?: string;
};
type SessionTranscriptListener = (update: SessionTranscriptUpdate) => void;
const SESSION_TRANSCRIPT_LISTENERS = new Set<SessionTranscriptListener>();
export function onSessionTranscriptUpdate(listener: SessionTranscriptListener): () => void {
SESSION_TRANSCRIPT_LISTENERS.add(listener);
return () => {
SESSION_TRANSCRIPT_LISTENERS.delete(listener);
};
}
export function emitSessionTranscriptUpdate(update: string | SessionTranscriptUpdate): void {
const normalized =
typeof update === "string"
? { sessionFile: update }
: {
sessionFile: update.sessionFile,
sessionKey: update.sessionKey,
message: update.message,
messageId: update.messageId,
};
const trimmed = normalized.sessionFile.trim();
if (!trimmed) {
return;
}
const nextUpdate: SessionTranscriptUpdate = {
sessionFile: trimmed,
...(typeof normalized.sessionKey === "string" && normalized.sessionKey.trim()
? { sessionKey: normalized.sessionKey.trim() }
: {}),
...(normalized.message !== undefined ? { message: normalized.message } : {}),
...(typeof normalized.messageId === "string" && normalized.messageId.trim()
? { messageId: normalized.messageId.trim() }
: {}),
};
for (const listener of SESSION_TRANSCRIPT_LISTENERS) {
try {
listener(nextUpdate);
} catch {
/* ignore */
}
}
}