Этап 4 / Волна 10: корректировка settlement-кейса — доменная фиксация синтеза, честное покрытие, удержание фокуса / Этап 4 / Волна 11: бизнес-якоря, доменное заземление и устранение утечки дебага

This commit is contained in:
2026-03-28 02:17:19 +03:00
parent 914843a8ba
commit a06e575be4
367 changed files with 432257 additions and 3627 deletions
@@ -158,41 +158,50 @@ class AssistantSessionLogger {
this.rootDir = rootDir;
}
persistSession(session) {
(0, files_1.ensureDir)(this.rootDir);
const filePath = path_1.default.resolve(this.rootDir, `${session.session_id}.json`);
const startedAt = session.items[0]?.created_at ?? session.updated_at;
const userMessages = session.items.filter((item) => item.role === "user").length;
const assistantMessages = session.items.filter((item) => item.role === "assistant").length;
const assistantItems = session.items.filter((item) => item.role === "assistant");
const lastAssistant = assistantItems.length > 0 ? assistantItems[assistantItems.length - 1] : null;
const traceIds = unique(session.items.map((item) => item.trace_id));
const replyTypes = Array.from(new Set(session.items
.map((item) => item.reply_type)
.filter((item) => typeof item === "string" && item.length > 0)));
const turns = buildTurns(session.items);
const record = {
schema_version: "assistant_session_log_v1",
session_id: session.session_id,
started_at: startedAt,
updated_at: session.updated_at,
counters: {
total_messages: session.items.length,
user_messages: userMessages,
assistant_messages: assistantMessages
},
trace_ids: traceIds,
reply_types: replyTypes,
investigation_state: session.investigation_state,
turns,
conversation: session.items,
last_assistant: {
message_id: lastAssistant?.message_id ?? null,
reply_type: lastAssistant?.reply_type ?? null,
trace_id: lastAssistant?.trace_id ?? null,
created_at: lastAssistant?.created_at ?? null
try {
(0, files_1.ensureDir)(this.rootDir);
const filePath = path_1.default.resolve(this.rootDir, `${session.session_id}.json`);
const startedAt = session.items[0]?.created_at ?? session.updated_at;
const userMessages = session.items.filter((item) => item.role === "user").length;
const assistantMessages = session.items.filter((item) => item.role === "assistant").length;
const assistantItems = session.items.filter((item) => item.role === "assistant");
const lastAssistant = assistantItems.length > 0 ? assistantItems[assistantItems.length - 1] : null;
const traceIds = unique(session.items.map((item) => item.trace_id));
const replyTypes = Array.from(new Set(session.items
.map((item) => item.reply_type)
.filter((item) => typeof item === "string" && item.length > 0)));
const turns = buildTurns(session.items);
const record = {
schema_version: "assistant_session_log_v1",
session_id: session.session_id,
started_at: startedAt,
updated_at: session.updated_at,
counters: {
total_messages: session.items.length,
user_messages: userMessages,
assistant_messages: assistantMessages
},
trace_ids: traceIds,
reply_types: replyTypes,
investigation_state: session.investigation_state,
turns,
conversation: session.items,
last_assistant: {
message_id: lastAssistant?.message_id ?? null,
reply_type: lastAssistant?.reply_type ?? null,
trace_id: lastAssistant?.trace_id ?? null,
created_at: lastAssistant?.created_at ?? null
}
};
(0, files_1.writeJsonFile)(filePath, record);
}
catch (error) {
const code = error?.code;
if (code === "ENOSPC") {
return;
}
};
(0, files_1.writeJsonFile)(filePath, record);
throw error;
}
}
}
exports.AssistantSessionLogger = AssistantSessionLogger;