50 lines
1.7 KiB
TypeScript
50 lines
1.7 KiB
TypeScript
import type { AssistantConversationItem, AssistantSessionState } from "../types/assistant";
|
|
|
|
export interface CommitAssistantTurnAndLogInput {
|
|
sessionId: string;
|
|
assistantItem: AssistantConversationItem;
|
|
eventType: string;
|
|
logDetails: Record<string, unknown>;
|
|
appendItem: (sessionId: string, item: AssistantConversationItem) => void;
|
|
getSession: (sessionId: string) => AssistantSessionState | null;
|
|
persistSession: (session: AssistantSessionState) => void;
|
|
cloneConversation: (items: AssistantConversationItem[]) => AssistantConversationItem[];
|
|
logEvent: (payload: {
|
|
timestamp: string;
|
|
level: "info";
|
|
service: "assistant_loop";
|
|
message: "assistant_message_processed";
|
|
sessionId: string;
|
|
eventType: string;
|
|
details: Record<string, unknown>;
|
|
}) => void;
|
|
nowIso?: () => string;
|
|
}
|
|
|
|
export interface CommitAssistantTurnAndLogOutput {
|
|
currentSession: AssistantSessionState | null;
|
|
conversation: AssistantConversationItem[];
|
|
}
|
|
|
|
export function commitAssistantTurnAndLog(input: CommitAssistantTurnAndLogInput): CommitAssistantTurnAndLogOutput {
|
|
input.appendItem(input.sessionId, input.assistantItem);
|
|
const currentSession = input.getSession(input.sessionId);
|
|
if (currentSession) {
|
|
input.persistSession(currentSession);
|
|
}
|
|
const conversation = input.cloneConversation(currentSession?.items ?? []);
|
|
input.logEvent({
|
|
timestamp: (input.nowIso ?? (() => new Date().toISOString()))(),
|
|
level: "info",
|
|
service: "assistant_loop",
|
|
message: "assistant_message_processed",
|
|
sessionId: input.sessionId,
|
|
eventType: input.eventType,
|
|
details: input.logDetails
|
|
});
|
|
return {
|
|
currentSession,
|
|
conversation
|
|
};
|
|
}
|