import { c as create_ssr_component, o as onDestroy, v as validate_component, d as add_attribute, k as add_classes, e as escape, h as each } from './ssr-6MZFlfLu.js'; import { S as Splitpanes, P as Pane, a as SearchResults } from './SearchResults-bzu8BmOk.js'; import 'docx'; import 'file-saver'; import { g as getToastStore, M as ModalPromptEditor } from './ModalPromptEditor-isPsJANV.js'; import './ProgressBar.svelte_svelte_type_style_lang-H22V2Yrx.js'; import { D as DEFAULT_SEARCH_INPUT_PARAMS } from './constants-PEBBwOxo.js'; import { L as LlmSelector } from './LlmSelector-fG0hpxMx.js'; import { S as SearchTypeSelector } from './SearchTypeSelector-iwYUZlnB.js'; import { g as getModalStore } from './stores-0qksNY90.js'; import './index2-f61NAEsz.js'; const LoadingSpinner = create_ssr_component(($$result, $$props, $$bindings, slots) => { let { size = 20 } = $$props; if ($$props.size === void 0 && $$bindings.size && size !== void 0) $$bindings.size(size); return ``; }); const css$6 = { code: ".llm-health-status.svelte-1wcf73j{color:slategray;font-size:12px;display:inline-flex;align-items:center}.dot.svelte-1wcf73j{width:20px;height:20px}", map: null }; const LlmHealthStatus = create_ssr_component(($$result, $$props, $$bindings, slots) => { let { disableIntervalChecks = false } = $$props; let { llmName = "" } = $$props; let color = "#af4f4c"; let shadowColor = "#af4f4c"; let text = "Сервис LLM недоступен"; let abortController = new AbortController(); let healthInterval; onDestroy(() => { clearInterval(healthInterval); abortController.abort("user canceled"); abortController = new AbortController(); }); if ($$props.disableIntervalChecks === void 0 && $$bindings.disableIntervalChecks && disableIntervalChecks !== void 0) $$bindings.disableIntervalChecks(disableIntervalChecks); if ($$props.llmName === void 0 && $$bindings.llmName && llmName !== void 0) $$bindings.llmName(llmName); $$result.css.add(css$6); return `
${escape(text)}
`; }); const css$5 = { code: ".llm-health-status.svelte-1wcf73j{color:slategray;font-size:12px;display:inline-flex;align-items:center}.dot.svelte-1wcf73j{width:20px;height:20px}", map: null }; const SearchApiHealthStatus = create_ssr_component(($$result, $$props, $$bindings, slots) => { let { disableIntervalChecks = false } = $$props; let color = "#af4f4c"; let shadowColor = "#af4f4c"; let text = "Поиск недоступен"; let abortController = new AbortController(); let healthInterval; onDestroy(() => { clearInterval(healthInterval); abortController.abort("user canceled"); abortController = new AbortController(); }); if ($$props.disableIntervalChecks === void 0 && $$bindings.disableIntervalChecks && disableIntervalChecks !== void 0) $$bindings.disableIntervalChecks(disableIntervalChecks); $$result.css.add(css$5); return `
${escape(text)}
`; }); const css$4 = { code: ".annotation.svelte-1uvb5ib{overflow:hidden;display:block;-webkit-box-orient:vertical;text-overflow:ellipsis;white-space:normal}", map: null }; const ConsultationItem = create_ssr_component(($$result, $$props, $$bindings, slots) => { let { showFullText = Array(10).fill(false) } = $$props; let { index } = $$props; let { title } = $$props; let { text } = $$props; if ($$props.showFullText === void 0 && $$bindings.showFullText && showFullText !== void 0) $$bindings.showFullText(showFullText); if ($$props.index === void 0 && $$bindings.index && index !== void 0) $$bindings.index(index); if ($$props.title === void 0 && $$bindings.title && title !== void 0) $$bindings.title(title); if ($$props.text === void 0 && $$bindings.text && text !== void 0) $$bindings.text(text); $$result.css.add(css$4); return `
${showFullText[index] ? `
${each(text.split("\n"), (line) => { return `

${escape(line)}

`; })}
` : ``}
`; }); const RelevantConsultations = create_ssr_component(($$result, $$props, $$bindings, slots) => { let showFullText = Array(10).fill(false); let { consultations = [] } = $$props; let previousConsultations = []; if ($$props.consultations === void 0 && $$bindings.consultations && consultations !== void 0) $$bindings.consultations(consultations); { { if (consultations !== previousConsultations) { showFullText = Array(consultations.length).fill(false); previousConsultations = consultations; } } } return `

Консультации

${each(consultations, ({ title, text }, index) => { return `${validate_component(ConsultationItem, "ConsultationItem").$$render($$result, { title, text, index, showFullText }, {}, {})}`; })}
`; }); const css$3 = { code: "textarea.svelte-3qvypm{border:1px solid #ccc;border-radius:4px;width:100%;font-size:14px;margin-bottom:10px;box-sizing:border-box;padding:1rem}", map: null }; const UserClarification = create_ssr_component(($$result, $$props, $$bindings, slots) => { let { llmClarification = "" } = $$props; if ($$props.llmClarification === void 0 && $$bindings.llmClarification && llmClarification !== void 0) $$bindings.llmClarification(llmClarification); $$result.css.add(css$3); return `
`; }); const API_BASE_URL = "/api/log"; class LogService { /** * Сохраняет лог в базу данных через API. * @param log - Лог-документ для сохранения. * @returns {Promise} */ static async log(log) { try { const response = await fetch(`${API_BASE_URL}/write`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(log) }); if (!response.ok) { throw new Error("Failed to record log entry"); } const data = await response.json(); return data.id; } catch (error) { console.error("Error while sending log to server:", error); } } /** * Экспортирует логи в формате JSON. * @param dateFrom - Дата начала фильтрации (необязательно). * @param dateTo - Дата окончания фильтрации (необязательно). * @returns {Promise} */ static async exportToJson(dateFrom, dateTo) { try { const queryParams = new URLSearchParams(); if (dateFrom) queryParams.append("dateFrom", dateFrom.toISOString()); if (dateTo) queryParams.append("dateTo", dateTo.toISOString()); const response = await fetch(`${API_BASE_URL}/export/json?${queryParams.toString()}`); if (!response.ok) { throw new Error("Failed to export logs to JSON"); } const result = await response.json(); console.log(result.message); } catch (error) { console.error("Error while exporting logs to JSON:", error); } } /** * Экспортирует логи в формате Excel. * @param dateFrom - Дата начала фильтрации (необязательно). * @param dateTo - Дата окончания фильтрации (необязательно). * @param fields - Поля для экспорта * @returns {Promise} */ static async exportToExcel(dateFrom, dateTo, fields) { try { const queryParams = new URLSearchParams(); if (dateFrom) queryParams.append("dateFrom", dateFrom.toISOString()); if (dateTo) queryParams.append("dateTo", dateTo.toISOString()); if (fields && fields.length > 0) { queryParams.append("fields", fields.join(",")); } const response = await fetch(`${API_BASE_URL}/export/excel?${queryParams.toString()}`); if (!response.ok) { throw new Error("Failed to export logs to Excel"); } const blob = await response.blob(); return blob; } catch (error) { console.error("Error while exporting logs to Excel:", error); } return null; } /** * Обновляет поле userScore в записи на сервере. * @param id - ID записи, которую нужно обновить. * @param score - Новое значение для userScore. * @returns Результат обновления. */ static async logUserScore(id, score, comment) { const response = await fetch("/api/log/write/userScore", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ id, score, comment }) }); if (!response.ok) { throw new Error("Failed to update user score"); } const data = await response.json(); if (data.message !== "User score updated successfully") { throw new Error("User score update failed"); } } } const css$2 = { code: ".star-rating.svelte-zykxm3{display:inline-block;margin-bottom:10px}.star.svelte-zykxm3{font-size:30px;color:grey;background:none;border:none;cursor:pointer}.star.selected.svelte-zykxm3{color:gold}button[disabled].svelte-zykxm3{opacity:0.5;cursor:not-allowed}textarea[disabled].svelte-zykxm3{background-color:#f5f5f5}", map: null }; const Rating = create_ssr_component(($$result, $$props, $$bindings, slots) => { getToastStore(); let selectedRating = 0; let { onSubmit = function(args) { } } = $$props; let hoveredRating = 0; let buttonText = "Отправить"; if ($$props.onSubmit === void 0 && $$bindings.onSubmit && onSubmit !== void 0) $$bindings.onSubmit(onSubmit); $$result.css.add(css$2); return `
Оцените ответ:
${each(Array(5), (_, i) => { return ``; })}
`; }); const SearchSettings = create_ssr_component(($$result, $$props, $$bindings, slots) => { getModalStore(); let { llmParams } = $$props; if ($$props.llmParams === void 0 && $$bindings.llmParams && llmParams !== void 0) $$bindings.llmParams(llmParams); return ` `; }); const css$1 = { code: ".annotation.svelte-1uvb5ib{overflow:hidden;display:block;-webkit-box-orient:vertical;text-overflow:ellipsis;white-space:normal}", map: null }; const ExplanationItem = create_ssr_component(($$result, $$props, $$bindings, slots) => { let { showFullText = Array(10).fill(false) } = $$props; let { index } = $$props; let { title } = $$props; let { text } = $$props; if ($$props.showFullText === void 0 && $$bindings.showFullText && showFullText !== void 0) $$bindings.showFullText(showFullText); if ($$props.index === void 0 && $$bindings.index && index !== void 0) $$bindings.index(index); if ($$props.title === void 0 && $$bindings.title && title !== void 0) $$bindings.title(title); if ($$props.text === void 0 && $$bindings.text && text !== void 0) $$bindings.text(text); $$result.css.add(css$1); return `
${showFullText[index] ? `
${each(text.split("\n"), (line) => { return `

${escape(line)}

`; })}
` : ``}
`; }); const Explanations = create_ssr_component(($$result, $$props, $$bindings, slots) => { let showFullText = Array(10).fill(false); let { explanations = [] } = $$props; let previousExplanations = []; if ($$props.explanations === void 0 && $$bindings.explanations && explanations !== void 0) $$bindings.explanations(explanations); { { if (explanations !== previousExplanations) { showFullText = Array(explanations.length).fill(false); previousExplanations = explanations; } } } return `

Разъяснения

${each(explanations, ({ title, text }, index) => { return `${validate_component(ExplanationItem, "ExplanationItem").$$render($$result, { title, text, index, showFullText }, {}, {})}`; })}
`; }); function getDeclension(count, one, few, many) { const mod10 = count % 10; const mod100 = count % 100; if (mod100 >= 11 && mod100 <= 19) return many; if (mod10 === 1) return one; if (mod10 >= 2 && mod10 <= 4) return few; return many; } const DocumentTypeSelector = create_ssr_component(($$result, $$props, $$bindings, slots) => { let selectedCount; let { disabled = false } = $$props; let { selected = { НКРФ: false, ГКРФ: false, ТКРФ: false, "Федеральный закон": false, "Письмо Минфина": false, "Письмо ФНС": false, "Приказ ФНС": false, "Постановление Правительства": false, "Судебный документ": false, ВНД: false, "Бухгалтерский документ": false } } = $$props; getModalStore(); let documentTypeLabels = { НКРФ: "НК РФ", ГКРФ: "ГК РФ", ТКРФ: "ТК РФ", "Федеральный закон": "Федеральный Закон", "Письмо Минфина": "Письмо Минфина", "Письмо ФНС": "Письмо ФНС", "Приказ ФНС": "Приказ ФНС", "Постановление Правительства": "Постановление Правительства", "Судебный документ": "Судебный документ", ВНД: "ВНД", "Бухгалтерский документ": "ФСБУ" }; let buttonTitle = "Выбрать типы источников для поиска"; if ($$props.disabled === void 0 && $$bindings.disabled && disabled !== void 0) $$bindings.disabled(disabled); if ($$props.selected === void 0 && $$bindings.selected && selected !== void 0) $$bindings.selected(selected); selectedCount = Object.values(selected).filter((v) => v === true).length; buttonTitle = selectedCount > 0 ? `${getDeclension(selectedCount, "Выбран", "Выбрано", "Выбрано")} ${selectedCount} ${getDeclension(selectedCount, "тип", "типа", "типов")} источников` : "Выбрать типы источников для поиска"; return `
${each(Object.entries(documentTypeLabels), ([key, value]) => { return ``; })}
`; }); const InvestigatorSettings = create_ssr_component(($$result, $$props, $$bindings, slots) => { getModalStore(); let { settings } = $$props; if ($$props.settings === void 0 && $$bindings.settings && settings !== void 0) $$bindings.settings(settings); let $$settled; let $$rendered; let previous_head = $$result.head; do { $$settled = true; $$result.head = previous_head; $$rendered = `
Генерация вопросов
${validate_component(ModalPromptEditor, "ModalPromptEditor").$$render( $$result, { label: "system промпт", prompt: settings.prompts.createQuestions[0] }, { prompt: ($$value) => { settings.prompts.createQuestions[0] = $$value; $$settled = false; } }, {} )} ${validate_component(ModalPromptEditor, "ModalPromptEditor").$$render( $$result, { label: "user промпт", prompt: settings.prompts.createQuestions[1] }, { prompt: ($$value) => { settings.prompts.createQuestions[1] = $$value; $$settled = false; } }, {} )} ${validate_component(LlmSelector, "LlmSelector").$$render( $$result, { skipLoadList: true, selectedLLM: settings.llmParams.createQuestions }, { selectedLLM: ($$value) => { settings.llmParams.createQuestions = $$value; $$settled = false; } }, {} )}
Ответы на вопросы
${validate_component(ModalPromptEditor, "ModalPromptEditor").$$render( $$result, { label: "system промпт", prompt: settings.prompts.answerQuestion[0] }, { prompt: ($$value) => { settings.prompts.answerQuestion[0] = $$value; $$settled = false; } }, {} )} ${validate_component(ModalPromptEditor, "ModalPromptEditor").$$render( $$result, { label: "user промпт", prompt: settings.prompts.answerQuestion[1] }, { prompt: ($$value) => { settings.prompts.answerQuestion[1] = $$value; $$settled = false; } }, {} )} ${validate_component(LlmSelector, "LlmSelector").$$render( $$result, { skipLoadList: true, selectedLLM: settings.llmParams.answerQuestion }, { selectedLLM: ($$value) => { settings.llmParams.answerQuestion = $$value; $$settled = false; } }, {} )}
Финальный ответ
${validate_component(ModalPromptEditor, "ModalPromptEditor").$$render( $$result, { label: "system промпт", prompt: settings.prompts.generateFinalAnswer[0] }, { prompt: ($$value) => { settings.prompts.generateFinalAnswer[0] = $$value; $$settled = false; } }, {} )} ${validate_component(ModalPromptEditor, "ModalPromptEditor").$$render( $$result, { label: "user промпт", prompt: settings.prompts.generateFinalAnswer[1] }, { prompt: ($$value) => { settings.prompts.generateFinalAnswer[1] = $$value; $$settled = false; } }, {} )} ${validate_component(LlmSelector, "LlmSelector").$$render( $$result, { skipLoadList: true, selectedLLM: settings.llmParams.generateFinalAnswer }, { selectedLLM: ($$value) => { settings.llmParams.generateFinalAnswer = $$value; $$settled = false; } }, {} )}
`; } while (!$$settled); return $$rendered; }); const css = { code: '.loading-container.svelte-fiifsz.svelte-fiifsz{display:flex;justify-content:center;align-items:center;align-self:center;width:3rem;height:90%;margin-left:5px}.loading-status.svelte-fiifsz.svelte-fiifsz{display:flex;justify-content:center;align-items:center;align-self:center}.grow-wrap.svelte-fiifsz.svelte-fiifsz{display:grid}.grow-wrap.svelte-fiifsz.svelte-fiifsz::after{content:attr(data-replicated-value) " ";white-space:pre-wrap;visibility:hidden;max-width:100%;max-height:250px;display:block;overflow-x:hidden}.grow-wrap.svelte-fiifsz>textarea.svelte-fiifsz{resize:none}.grow-wrap.svelte-fiifsz>textarea.svelte-fiifsz,.grow-wrap.svelte-fiifsz.svelte-fiifsz::after{border:1px solid #ccc;width:100%;padding:1rem;font-size:14px;box-sizing:border-box;grid-area:1/1/2/2}.grow-wrap.svelte-fiifsz>textarea .svelte-fiifsz:focus,.grow-wrap.svelte-fiifsz::after .svelte-fiifsz:focus{outline:none;border-color:#1976d2}.grow-wrap.svelte-fiifsz>textarea .svelte-fiifsz:placeholder,.grow-wrap.svelte-fiifsz::after .svelte-fiifsz:placeholder{color:#aaa}.auto-expand-textarea.svelte-fiifsz.svelte-fiifsz{box-sizing:border-box;width:100%;font-size:16px;border:1px solid #ccc;resize:vertical;overflow-y:auto;min-height:1rem}.search-column.svelte-fiifsz.svelte-fiifsz{flex:1;display:flex;flex-direction:column;border-right:1px solid #ccc}.search-bar.svelte-fiifsz textarea.svelte-fiifsz{width:100%;max-width:100%;padding:1rem;box-sizing:border-box}.textarea-column.svelte-fiifsz.svelte-fiifsz{flex:1;display:flex;flex-direction:column;padding-left:10px}.textarea.svelte-fiifsz.svelte-fiifsz{width:100%;height:100%;margin:10px;margin-left:0px;border:none;outline:none;resize:none;background:transparent}@media(max-width: 767px){.search-column.svelte-fiifsz.svelte-fiifsz,.textarea-column.svelte-fiifsz.svelte-fiifsz{border-right:none}}.search-second-bar.svelte-fiifsz.svelte-fiifsz{display:flex;flex-wrap:wrap}@media(max-width: 600px){.search-second-bar.svelte-fiifsz.svelte-fiifsz{flex-direction:column}}textarea.svelte-fiifsz.svelte-fiifsz{border:1px solid #ccc;width:100%;font-size:14px;box-sizing:border-box;padding:1rem}a.svelte-fiifsz.svelte-fiifsz{cursor:pointer}.reference-btn.svelte-fiifsz.svelte-fiifsz{text-decoration:none;color:black}.reference-btn.svelte-fiifsz.svelte-fiifsz:hover{text-decoration:none;color:black}', map: null }; const Page = create_ssr_component(($$result, $$props, $$bindings, slots) => { let { data } = $$props; const { ENV_DOCUMENT_DB_URL, ENV_ENABLE_DOCUMENT_DB, ENV_ENABLE_DB_SUPPORT, ENV_ENABLE_DEV_FEATURES, ENV_DISABLE_HEALTH_CHECKS, ENV_FAQ_DOCUMENT_ID } = data; let Model = data.Model; let searchResultComponent; let userLlmClarification = ""; let searchCategories = { НКРФ: false, ГКРФ: false, ТКРФ: false, "Федеральный закон": false, "Письмо Минфина": false, "Письмо ФНС": false, "Приказ ФНС": false, "Постановление Правительства": false, "Судебный документ": false, ВНД: false, "Бухгалтерский документ": false }; onDestroy(() => { cancelRequest(); }); let usedSearchResults = []; let relevantConsultations = []; let isSearchLoading = false; let isLlmLoading = false; let isSearchInitiated = false; let baseLlmResponse = ""; let currentUserRequest = ""; let savedUserRequest = ""; let loadingStatusText = ""; let showFullText = []; Array(relevantConsultations.length).fill(false); let useSearchResult; let enableSearchResultSelection = false; let searchInTransactionLedger = false; let enableQueryExpansionSearch = false; let searchLlmParams = DEFAULT_SEARCH_INPUT_PARAMS.llm_params; let useShortestPrompt = false; let shortestPromptGenerationFinished = false; let enableRealtimeLlmReponse = false; let showRatingBlock = false; let showClarifyLlmResponseButton = false; let isClarificationPaneVisible = false; let showOnlyUsedByLlmSearchResults = false; let lastLogId = null; let submitButtonLabel = "Отправить"; let abortController = new AbortController(); const cancelRequest = () => { abortController.abort("user canceled"); abortController = new AbortController(); isLlmLoading = false; loadingStatusText = ""; lastLogId = null; isSearchInitiated = false; isSearchLoading = false; usedSearchResults = []; showOnlyUsedByLlmSearchResults = false; }; async function handleRatingSubmit(data2) { console.log(`Оценка: ${data2.rating} звезд, Комментарий: ${data2.comment}`); if (lastLogId !== null) { await LogService.logUserScore(lastLogId, data2.rating, data2.comment); } } let selectedLlm; if ($$props.data === void 0 && $$bindings.data && data !== void 0) $$bindings.data(data); $$result.css.add(css); let $$settled; let $$rendered; let previous_head = $$result.head; do { $$settled = true; $$result.head = previous_head; { { { searchInTransactionLedger = false; } if (userLlmClarification && (Model.search?.searchResults || []).length > 0 && baseLlmResponse && savedUserRequest == currentUserRequest && !isLlmLoading) { showClarifyLlmResponseButton = true; } else { showClarifyLlmResponseButton = false; } } } submitButtonLabel = isSearchInitiated || isLlmLoading || isSearchLoading ? "Стоп" : "Отправить"; $$rendered = `
${validate_component(LlmHealthStatus, "LlmHealthStatus").$$render( $$result, { disableIntervalChecks: Boolean(ENV_DISABLE_HEALTH_CHECKS) }, {}, {} )} ${validate_component(SearchApiHealthStatus, "SearchApiHealthStatus").$$render( $$result, { disableIntervalChecks: Boolean(ENV_DISABLE_HEALTH_CHECKS) }, {}, {} )} ${validate_component(LlmSelector, "LlmSelector").$$render( $$result, { selectedLLM: selectedLlm }, { selectedLLM: ($$value) => { selectedLlm = $$value; $$settled = false; } }, {} )} ${searchLlmParams ? `${validate_component(SearchSettings, "SearchSettings").$$render( $$result, { llmParams: searchLlmParams }, { llmParams: ($$value) => { searchLlmParams = $$value; $$settled = false; } }, {} )}` : ``} ${Model.investigatorSettings !== null ? `
${validate_component(InvestigatorSettings, "InvestigatorSettings").$$render( $$result, { settings: Model.investigatorSettings }, { settings: ($$value) => { Model.investigatorSettings = $$value; $$settled = false; } }, {} )}
` : ``}
`; } while (!$$settled); return $$rendered; }); export { Page as default }; //# sourceMappingURL=_page.svelte-utVVFjse.js.map