Этап 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
+29 -3
View File
@@ -1,4 +1,4 @@
import { useEffect, useState } from "react";
import { useEffect, useRef, useState } from "react";
import { apiClient } from "./api/client";
import { AssistantPanel } from "./components/AssistantPanel";
import { ConnectionPanel } from "./components/ConnectionPanel";
@@ -23,6 +23,8 @@ import type {
const SESSION_CONFIG_KEY = "ndc_normalizer_session_config_v1";
const ASSISTANT_STAGES = ["Разбираю запрос", "Ищу данные", "Собираю ответ"];
const DEFAULT_UI_MODE: UiMode = "assistant";
const AUTOLOAD_PROMPT_VERSION = "normalizer_v2_0_2";
function withTs(message: string): string {
return `[${new Date().toLocaleTimeString("ru-RU")}] ${message}`;
@@ -72,13 +74,14 @@ export default function App() {
const [evalReport, setEvalReport] = useState<unknown>(null);
const [lastError, setLastError] = useState("");
const [uiMode, setUiMode] = useState<UiMode>("decomposition");
const [uiMode, setUiMode] = useState<UiMode>(DEFAULT_UI_MODE);
const [assistantSessionId, setAssistantSessionId] = useState("");
const [assistantConversation, setAssistantConversation] = useState<AssistantConversationItem[]>([]);
const [assistantInput, setAssistantInput] = useState("");
const [assistantBusy, setAssistantBusy] = useState(false);
const [assistantStatus, setAssistantStatus] = useState("");
const [assistantError, setAssistantError] = useState("");
const presetAutoloadDoneRef = useRef(false);
const log = (message: string) => {
setAppLogs((prev) => [withTs(message), ...prev].slice(0, 300));
@@ -128,7 +131,30 @@ export default function App() {
async function refreshPresets() {
try {
const payload = await apiClient.loadPresets();
setPresetList(payload.presets ?? []);
const presets = payload.presets ?? [];
setPresetList(presets);
if (presetAutoloadDoneRef.current) {
return;
}
const presetForAutoload =
presets.find((item) => item.prompt_version === AUTOLOAD_PROMPT_VERSION) ??
presets.find((item) => item.id === "default-normalizer-v2_0_2");
if (!presetForAutoload) {
presetAutoloadDoneRef.current = true;
log(`Preset autoload skipped: ${AUTOLOAD_PROMPT_VERSION} not found.`);
return;
}
setSelectedPresetId(presetForAutoload.id);
setPreviousPreset(prompts);
setPrompts({
systemPrompt: presetForAutoload.systemPrompt,
developerPrompt: presetForAutoload.developerPrompt,
domainPrompt: presetForAutoload.domainPrompt,
schemaNotes: presetForAutoload.schemaNotes ?? "",
fewShotExamples: presetForAutoload.fewShotExamples ?? ""
});
presetAutoloadDoneRef.current = true;
log(`Preset autoloaded: ${presetForAutoload.name} (${presetForAutoload.prompt_version}).`);
} catch (error) {
log(`Presets load error: ${error instanceof Error ? error.message : String(error)}`);
}
@@ -62,7 +62,7 @@ function buildConversationExport(sessionId: string, conversation: AssistantConve
lines.push("");
if (item.role === "assistant" && item.debug) {
lines.push("### technical_breakdown_json");
lines.push("### debug_payload_json");
lines.push("```json");
lines.push(stringifyDebug(item.debug));
lines.push("```");