diff --git a/ui/bindings.js b/ui/bindings.js index 3489cf5..932c8e0 100644 --- a/ui/bindings.js +++ b/ui/bindings.js @@ -1,526 +1 @@ -import { extension_settings } from "/scripts/extensions.js"; -import { saveSettingsDebounced } from "/script.js"; -import { defaultSettings, extensionName } from "../utils/settings.js"; -import { pluginAuthStatus, activatePluginAuthorization, getPasswordForDate } from "../utils/auth.js"; -import { fetchSupportedModels } from "../core/api.js"; - -import { setAvailableModels, populateModelDropdown, getLatestUpdateInfo } from "./state.js"; -import { fixCommand, testReplyChecker } from "../core/commands.js"; -import { createDrawer } from '../ui/drawer.js'; -import { messageFormatting } from '/script.js'; -import { executeManualCommand } from '../core/autoHideManager.js'; -import { showContentModal, showHtmlModal } from './page-window.js'; - -function displayDailyAuthCode() { - const displayEl = document.getElementById('amily2_daily_code_display'); - const copyBtn = document.getElementById('amily2_copy_daily_code'); - - if (displayEl && copyBtn) { - const todayCode = getPasswordForDate(new Date()); - displayEl.textContent = todayCode; - - copyBtn.addEventListener('click', () => { - navigator.clipboard.writeText(todayCode).then(() => { - toastr.success('授权码已复制到剪贴板!'); - }, () => { - toastr.error('复制失败,请手动复制。'); - }); - }); - } -} - -export function bindModalEvents() { - const container = $("#amily2_drawer_content").length ? $("#amily2_drawer_content") : $("#amily2_chat_optimiser"); - displayDailyAuthCode(); // 在绑定事件时就显示今日授权码 - function updateModelInputView() { - const settings = extension_settings[extensionName] || {}; - const forceProxy = settings.forceProxyForCustomApi === true; - const model = settings.model || ''; - - container.find('#amily2_force_proxy').prop('checked', forceProxy); - container.find('#amily2_manual_model_input').val(model); - - const autoFetchWrapper = container.find('#amily2_model_autofetch_wrapper'); - const manualInput = container.find('#amily2_manual_model_input'); - - if (forceProxy) { - autoFetchWrapper.hide(); - manualInput.show(); - } else { - autoFetchWrapper.show(); - manualInput.hide(); - } - } - - if (!container.length || container.data("events-bound")) return; - - const snakeToCamel = (s) => s.replace(/_([a-z])/g, (g) => g[1].toUpperCase()); - const updateAndSaveSetting = (key, value) => { - console.log(`[Amily-谕令确认] 收到指令: 将 [${key}] 设置为 ->`, value); - if (!extension_settings[extensionName]) { - extension_settings[extensionName] = {}; - } - extension_settings[extensionName] = { ...extension_settings[extensionName], [key]: value }; - saveSettingsDebounced(); - console.log(`[Amily-谕令镌刻] [${key}] 的新状态已保存。`); - }; - - // 在这里添加以下代码 - container - .off("change.amily2.force_proxy") - .on("change.amily2.force_proxy", '#amily2_force_proxy', function () { - if (!pluginAuthStatus.authorized) return; - // 镌刻圣意 - updateAndSaveSetting('forceProxyForCustomApi', this.checked); - // 立即执行仪式,切换界面 - updateModelInputView(); - }); - // 在这里添加以下代码 - container - .off("change.amily2.manual_model") - .on("change.amily2.manual_model", '#amily2_manual_model_input', function() { - if (!pluginAuthStatus.authorized) return; - // 将您御笔钦定的模型名称,镌刻入“model”这条核心法典 - updateAndSaveSetting('model', this.value); - toastr.success(`模型ID [${this.value}] 已自动保存!`, "Amily2号"); - }); - - - container - .off("click.amily2.auth") - .on("click.amily2.auth", "#auth_submit", async function () { - const authCode = $("#amily2_auth_code").val().trim(); - if (authCode) { - await activatePluginAuthorization(authCode); - } else { - toastr.warning("请输入授权码", "Amily2号"); - } - }); - - container - .off("click.amily2.actions") - .on( - "click.amily2.actions", - "#amily2_refresh_models, #amily2_test, #amily2_fix_now", - async function () { - if (!pluginAuthStatus.authorized) return; - const button = $(this); - const originalHtml = button.html(); - button - .prop("disabled", true) - .html(' 处理中'); - try { - switch (this.id) { - case "amily2_refresh_models": - const models = await fetchSupportedModels(); - if (models.length > 0) { - setAvailableModels(models); - localStorage.setItem( - "cached_models_amily2", - JSON.stringify(models), - ); - populateModelDropdown(); - } - break; - case "amily2_test": - await testReplyChecker(); - break; - case "amily2_fix_now": - await fixCommand(); - break; - } - } catch (error) { - console.error(`[Amily2-工部] 操作按钮 ${this.id} 执行失败:`, error); - toastr.error(`操作失败: ${error.message}`, "Amily2号"); - } finally { - button.prop("disabled", false).html(originalHtml); - } - }, - ); - - container - .off("click.amily2.expand_editor") - .on("click.amily2.expand_editor", "#amily2_expand_editor", function (event) { - if (!pluginAuthStatus.authorized) return; - event.stopPropagation(); - const selectedKey = $("#amily2_prompt_selector").val(); - const currentContent = $("#amily2_unified_editor").val(); - const dialogHtml = ` - - - `; - const dialogElement = $(dialogHtml).appendTo('body'); - const dialogTextarea = dialogElement.find('#amily2_dialog_editor'); - dialogTextarea.val(currentContent); - const closeDialog = () => { dialogElement[0].close(); dialogElement.remove(); }; - dialogElement.find('.popup-button-ok').on('click', () => { - const newContent = dialogTextarea.val(); - $("#amily2_unified_editor").val(newContent); - updateAndSaveSetting(selectedKey, newContent); - toastr.success(`谕令 [${selectedKey}] 已镌刻!`, "Amily2号"); - closeDialog(); - }); - dialogElement.find('.popup-button-cancel').on('click', closeDialog); - dialogElement[0].showModal(); - }); - - container - .off("click.amily2.tutorial") - .on("click.amily2.tutorial", "#amily2_open_tutorial, #amily2_open_neige_tutorial", function() { - if (!pluginAuthStatus.authorized) return; - - const tutorials = { - "amily2_open_tutorial": { - title: "主殿使用教程", - url: "scripts/extensions/third-party/ST-Amily2-Chat-Optimisation/ZhuDian.md" - }, - "amily2_open_neige_tutorial": { - title: "内阁使用教程", - url: "scripts/extensions/third-party/ST-Amily2-Chat-Optimisation/NeiGe.md" - } - }; - - const tutorial = tutorials[this.id]; - if (tutorial) { - showContentModal(tutorial.title, tutorial.url); - } - }); - - container - .off("click.amily2.update") - .on("click.amily2.update", "#amily2_update_button", function() { - $("#amily2_update_indicator").hide(); - const updateInfo = getLatestUpdateInfo(); - if (updateInfo && updateInfo.changelog) { - const formattedChangelog = messageFormatting(updateInfo.changelog); - - - const dialogHtml = ` - - `; - const dialogElement = $(dialogHtml).appendTo('body'); - const closeDialog = () => { dialogElement[0].close(); dialogElement.remove(); }; - dialogElement.find('.popup-button-ok').on('click', closeDialog); - dialogElement[0].showModal(); - } else { - toastr.info("未能获取到云端情报,请稍后再试。", "情报部回报"); - } - }); - - container - .off("click.amily2.update_new") - .on("click.amily2.update_new", "#amily2_update_button_new", function() { - // 最终修正:根据用户提供的元素信息,使用属性选择器定位并点击“管理扩展”按钮 - $('span[data-i18n="Manage extensions"]').first().click(); - }); - - // This block is intentionally left empty as the logic is now handled - // within the 'change.amily2.checkbox' event listener below. - - - - container - .off("click.amily2.manual_command") - .on( - "click.amily2.manual_command", - "#amily2_unhide_all_button, #amily2_manual_hide_confirm, #amily2_manual_unhide_confirm", - async function () { - if (!pluginAuthStatus.authorized) return; - - const buttonId = this.id; - let commandType = ''; - let params = {}; - - switch (buttonId) { - case 'amily2_unhide_all_button': - commandType = 'unhide_all'; - break; - - case 'amily2_manual_hide_confirm': - commandType = 'manual_hide'; - params = { - from: $('#amily2_manual_hide_from').val(), - to: $('#amily2_manual_hide_to').val() - }; - break; - - case 'amily2_manual_unhide_confirm': - commandType = 'manual_unhide'; - params = { - from: $('#amily2_manual_unhide_from').val(), - to: $('#amily2_manual_unhide_to').val() - }; - break; - } - - if (commandType) { - await executeManualCommand(commandType, params); - } - } - ); - -container - .off("click.amily2.chamber_nav") - .on("click.amily2.chamber_nav", "#amily2_open_additional_features, #amily2_open_rag_palace, #amily2_back_to_main_settings, #amily2_back_to_main_from_hanlinyuan", function () { - if (!pluginAuthStatus.authorized) return; - - const mainPanel = container.find('.plugin-features'); - const additionalPanel = container.find('#amily2_additional_features_panel'); - const hanlinyuanPanel = container.find('#amily2_hanlinyuan_panel'); - - // Hide all panels first - mainPanel.hide(); - additionalPanel.hide(); - hanlinyuanPanel.hide(); - - switch (this.id) { - case 'amily2_open_additional_features': - additionalPanel.show(); - break; - case 'amily2_open_rag_palace': - hanlinyuanPanel.show(); - break; - case 'amily2_back_to_main_settings': - case 'amily2_back_to_main_from_hanlinyuan': - mainPanel.show(); - break; - } - }); - - container - .off("change.amily2.checkbox") - .on( - "change.amily2.checkbox", - 'input[type="checkbox"][id^="amily2_"]', - function (event) { - if (!pluginAuthStatus.authorized) return; - - const elementId = this.id; - const mainToggle = $(this); - const key = snakeToCamel(elementId.replace("amily2_", "")); - - // Default behavior for all checkboxes: save their state immediately. - updateAndSaveSetting(key, mainToggle.prop('checked')); - - // Special action for the exclusion toggle: also open the modal, but only when turning it ON. - if (elementId === 'amily2_optimization_exclusion_enabled' && mainToggle.prop('checked')) { - const settings = extension_settings[extensionName]; - const rules = settings.optimizationExclusionRules || []; - - const createRuleRowHtml = (rule = { start: '', end: '' }, index) => ` -
- - - - -
`; - - const rulesHtml = rules.map(createRuleRowHtml).join(''); - const modalHtml = ` -
-

在这里定义需要从优化内容中排除的文本片段。例如,排除HTML注释,可以设置开始字符为 \`\`。

-
${rulesHtml}
-
- -
-
`; - - showHtmlModal('编辑内容排除规则', modalHtml, { - okText: '确认', - cancelText: '取消', - onOk: (dialog) => { - const newRules = []; - dialog.find('.opt-exclusion-rule-row').each(function() { - const start = $(this).find('input').eq(0).val().trim(); - const end = $(this).find('input').eq(1).val().trim(); - if (start && end) newRules.push({ start, end }); - }); - updateAndSaveSetting('optimizationExclusionRules', newRules); - toastr.success('排除规则已更新。', 'Amily2号'); - }, - onCancel: () => { - // Do nothing, just close the modal. - } - }); - - const modalContent = $('#optimization-exclusion-rules-container'); - const rulesList = modalContent.find('#optimization-rules-list'); - - modalContent.find('#optimization-add-rule-btn').on('click', () => { - const newIndex = rulesList.children().length; - rulesList.append(createRuleRowHtml(undefined, newIndex)); - }); - - rulesList.on('click', '.delete-rule-btn', function() { - $(this).closest('.opt-exclusion-rule-row').remove(); - }); - } - }, - ); - - container - .off("change.amily2.radio") - .on( - "change.amily2.radio", - 'input[type="radio"][name^="amily2_"]:not([name="amily2_icon_location"])', - function () { - if (!pluginAuthStatus.authorized) return; - const key = snakeToCamel(this.name.replace("amily2_", "")); - const value = $(`input[name="${this.name}"]:checked`).val(); - updateAndSaveSetting(key, value); - }, - ); - - container - .off("change.amily2.text") - .on("change.amily2.text", "#amily2_api_url, #amily2_api_key, #amily2_optimization_target_tag", function () { - if (!pluginAuthStatus.authorized) return; - const key = snakeToCamel(this.id.replace("amily2_", "")); - updateAndSaveSetting(key, this.value); - toastr.success(`配置 [${key}] 已自动保存!`, "Amily2号"); - }); - - container - .off("change.amily2.select") - .on("change.amily2.select", "select#amily2_model", function () { - if (!pluginAuthStatus.authorized) return; - const key = snakeToCamel(this.id.replace("amily2_", "")); - updateAndSaveSetting(key, this.value); - populateModelDropdown(); - }); - - container - .off("input.amily2.range") - .on( - "input.amily2.range", - 'input[type="range"][id^="amily2_"]', - function () { - if (!pluginAuthStatus.authorized) return; - const key = snakeToCamel(this.id.replace("amily2_", "")); - const value = this.id.includes("temperature") - ? parseFloat(this.value) - : parseInt(this.value, 10); - $(`#${this.id}_value`).text(value); - updateAndSaveSetting(key, value); - }, - ); - - const promptMap = { - mainPrompt: "#amily2_main_prompt", - systemPrompt: "#amily2_system_prompt", - outputFormatPrompt: "#amily2_output_format_prompt", - }; - const selector = "#amily2_prompt_selector"; - const editor = "#amily2_unified_editor"; - const unifiedSaveButton = "#amily2_unified_save_button"; - - function updateEditorView() { - if (!$(selector).length) return; - const selectedKey = $(selector).val(); - if (!selectedKey) return; - const content = extension_settings[extensionName][selectedKey] || ""; - $(editor).val(content); - } - - container - .off("change.amily2.prompt_selector") - .on("change.amily2.prompt_selector", selector, updateEditorView); - - container - .off("click.amily2.unified_save") - .on("click.amily2.unified_save", unifiedSaveButton, function () { - const selectedKey = $(selector).val(); - if (!selectedKey) return; - const newContent = $(editor).val(); - updateAndSaveSetting(selectedKey, newContent); - toastr.success(`谕令 [${selectedKey}] 已镌刻!`, "Amily2号"); - }); - - container - .off("click.amily2.unified_restore") - .on("click.amily2.unified_restore", "#amily2_unified_restore_button", function () { - const selectedKey = $(selector).val(); - if (!selectedKey) return; - const defaultValue = defaultSettings[selectedKey]; - $(editor).val(defaultValue); - updateAndSaveSetting(selectedKey, defaultValue); - toastr.success(`谕令 [${selectedKey}] 已成功恢复为帝国初始蓝图。`, "Amily2号"); - }); - - container - .off("change.amily2.lore_settings") - .on("change.amily2.lore_settings", - 'select[id^="amily2_lore_"], input#amily2_lore_depth_input', - function () { - if (!pluginAuthStatus.authorized) return; - - - - let key = snakeToCamel(this.id.replace("amily2_", "")); - if (key === 'loreDepthInput') { - key = 'loreDepth'; - } - - const value = (this.type === 'number') ? parseInt(this.value, 10) : this.value; - updateAndSaveSetting(key, value); - - - if (this.id === 'amily2_lore_insertion_position') { - const depthContainer = $('#amily2_lore_depth_container'); - - if (this.value === 'at_depth') { - depthContainer.slideDown(200); - } else { - depthContainer.slideUp(200); - } - } - } - ); - - container - .off("click.amily2.lore_save") - .on("click.amily2.lore_save", '#amily2_save_lore_settings', function () { - if (!pluginAuthStatus.authorized) return; - - const button = $(this); - const statusElement = $('#amily2_lore_save_status'); - - button.prop('disabled', true).html(' 已确认'); - statusElement.text('圣意已在您每次更改时自动镌刻。').stop().fadeIn(); - - setTimeout(() => { - button.prop('disabled', false).html(' 确认敕令'); - statusElement.fadeOut(); - }, 2500); - }); - - setTimeout(updateEditorView, 100); - updateModelInputView(); // 首次加载时执行仪式,初始化界面 - - container.data("events-bound", true); - - -} -$(document).on('change', 'input[name="amily2_icon_location"]', function() { - if (!pluginAuthStatus.authorized) return; - const newLocation = $(this).val(); - extension_settings[extensionName]['iconLocation'] = newLocation; - saveSettingsDebounced(); - console.log(`[Amily-禁卫军] 收到迁都指令 -> ${newLocation}。圣意已存档。`); - toastr.info(`正在将帝国徽记迁往 [${newLocation === 'topbar' ? '顶栏' : '扩展区'}]...`, "迁都令", { timeOut: 2000 }); - $('#amily2_main_drawer').remove(); - $(document).off("mousedown.amily2Drawer"); - $('#amily2_extension_frame').remove(); - - setTimeout(createDrawer, 50); -}); +const _0x7bbaf1=_0x2c1c;(function(_0x176244,_0x1f51d3){const _0x2ef816=_0x2c1c,_0x405096=_0x176244();while(!![]){try{const _0x1e09d9=parseInt(_0x2ef816(0x165))/0x1+-parseInt(_0x2ef816(0x130))/0x2*(-parseInt(_0x2ef816(0x144))/0x3)+parseInt(_0x2ef816(0x143))/0x4*(parseInt(_0x2ef816(0x19c))/0x5)+parseInt(_0x2ef816(0x133))/0x6+-parseInt(_0x2ef816(0x15c))/0x7+-parseInt(_0x2ef816(0x19d))/0x8*(-parseInt(_0x2ef816(0x13e))/0x9)+-parseInt(_0x2ef816(0x15e))/0xa;if(_0x1e09d9===_0x1f51d3)break;else _0x405096['push'](_0x405096['shift']());}catch(_0x5db059){_0x405096['push'](_0x405096['shift']());}}}(_0x33d7,0x58b53));import{extension_settings}from'/scripts/extensions.js';import{saveSettingsDebounced}from'/script.js';import{defaultSettings,extensionName}from'../utils/settings.js';function _0x2c1c(_0x3bc7fa,_0x345bcc){const _0x33d75f=_0x33d7();return _0x2c1c=function(_0x2c1c22,_0x248b8b){_0x2c1c22=_0x2c1c22-0x11e;let _0x2e7de9=_0x33d75f[_0x2c1c22];return _0x2e7de9;},_0x2c1c(_0x3bc7fa,_0x345bcc);}import{pluginAuthStatus,activatePluginAuthorization,getPasswordForDate}from'../utils/auth.js';import{fetchSupportedModels}from'../core/api.js';import{setAvailableModels,populateModelDropdown,getLatestUpdateInfo}from'./state.js';import{fixCommand,testReplyChecker}from'../core/commands.js';import{createDrawer}from'../ui/drawer.js';import{messageFormatting}from'/script.js';import{executeManualCommand}from'../core/autoHideManager.js';import{showContentModal,showHtmlModal}from'./page-window.js';function displayDailyAuthCode(){const _0x16e33c=_0x2c1c,_0x473c9e=document[_0x16e33c(0x1ac)](_0x16e33c(0x178)),_0x138488=document[_0x16e33c(0x1ac)](_0x16e33c(0x15d));if(_0x473c9e&&_0x138488){const _0x94748e=getPasswordForDate(new Date());_0x473c9e[_0x16e33c(0x1a8)]=_0x94748e,_0x138488[_0x16e33c(0x15f)](_0x16e33c(0x1ce),()=>{const _0x211869=_0x16e33c;navigator['clipboard'][_0x211869(0x1a4)](_0x94748e)[_0x211869(0x197)](()=>{const _0x99dadb=_0x211869;toastr[_0x99dadb(0x1b4)](_0x99dadb(0x1c4));},()=>{const _0x420095=_0x211869;toastr[_0x420095(0x155)](_0x420095(0x142));});});}}export function bindModalEvents(){const _0x161e84=_0x2c1c,_0x7d171d=$('#amily2_drawer_content')[_0x161e84(0x1cf)]?$(_0x161e84(0x182)):$(_0x161e84(0x163));displayDailyAuthCode();function _0x53734d(){const _0x11fdf4=_0x161e84,_0x2770e8=extension_settings[extensionName]||{},_0x2c36e0=_0x2770e8[_0x11fdf4(0x13c)]===!![],_0xa5fd4e=_0x2770e8[_0x11fdf4(0x161)]||'';_0x7d171d[_0x11fdf4(0x1a6)](_0x11fdf4(0x1b0))[_0x11fdf4(0x18f)](_0x11fdf4(0x1af),_0x2c36e0),_0x7d171d[_0x11fdf4(0x1a6)](_0x11fdf4(0x19a))[_0x11fdf4(0x131)](_0xa5fd4e);const _0x1aa8af=_0x7d171d[_0x11fdf4(0x1a6)](_0x11fdf4(0x12b)),_0x3fb61b=_0x7d171d[_0x11fdf4(0x1a6)](_0x11fdf4(0x19a));_0x2c36e0?(_0x1aa8af[_0x11fdf4(0x1c7)](),_0x3fb61b[_0x11fdf4(0x14b)]()):(_0x1aa8af[_0x11fdf4(0x14b)](),_0x3fb61b[_0x11fdf4(0x1c7)]());}if(!_0x7d171d[_0x161e84(0x1cf)]||_0x7d171d[_0x161e84(0x136)](_0x161e84(0x140)))return;const _0x3bc9de=_0x3d8f5d=>_0x3d8f5d[_0x161e84(0x12f)](/_([a-z])/g,_0x39b71e=>_0x39b71e[0x1][_0x161e84(0x123)]()),_0x40bcd1=(_0x18aa29,_0x46fff9)=>{const _0x32b99c=_0x161e84;console[_0x32b99c(0x194)](_0x32b99c(0x183)+_0x18aa29+_0x32b99c(0x1a2),_0x46fff9),!extension_settings[extensionName]&&(extension_settings[extensionName]={}),extension_settings[extensionName]={...extension_settings[extensionName],[_0x18aa29]:_0x46fff9},saveSettingsDebounced(),console[_0x32b99c(0x194)](_0x32b99c(0x1c8)+_0x18aa29+']\x20的新状态已保存。');};_0x7d171d['off'](_0x161e84(0x1d1))['on'](_0x161e84(0x1d1),_0x161e84(0x1b0),function(){const _0x4c420e=_0x161e84;if(!pluginAuthStatus[_0x4c420e(0x18c)])return;_0x40bcd1(_0x4c420e(0x13c),this[_0x4c420e(0x1af)]),_0x53734d();}),_0x7d171d[_0x161e84(0x18d)](_0x161e84(0x132))['on'](_0x161e84(0x132),_0x161e84(0x19a),function(){const _0x3a7f20=_0x161e84;if(!pluginAuthStatus[_0x3a7f20(0x18c)])return;_0x40bcd1(_0x3a7f20(0x161),this[_0x3a7f20(0x186)]),toastr[_0x3a7f20(0x1b4)](_0x3a7f20(0x16b)+this[_0x3a7f20(0x186)]+_0x3a7f20(0x16f),'Amily2号');}),_0x7d171d[_0x161e84(0x18d)](_0x161e84(0x14d))['on'](_0x161e84(0x14d),_0x161e84(0x1b2),async function(){const _0x30d501=_0x161e84,_0x1b2f9b=$(_0x30d501(0x173))['val']()[_0x30d501(0x1ad)]();_0x1b2f9b?await activatePluginAuthorization(_0x1b2f9b):toastr['warning']('请输入授权码','Amily2号');}),_0x7d171d[_0x161e84(0x18d)](_0x161e84(0x1b3))['on'](_0x161e84(0x1b3),_0x161e84(0x141),async function(){const _0x34a6a6=_0x161e84;if(!pluginAuthStatus[_0x34a6a6(0x18c)])return;const _0x440439=$(this),_0x32cb90=_0x440439['html']();_0x440439[_0x34a6a6(0x18f)](_0x34a6a6(0x138),!![])[_0x34a6a6(0x181)]('\x20处理中');try{switch(this['id']){case _0x34a6a6(0x164):const _0x59a54d=await fetchSupportedModels();_0x59a54d['length']>0x0&&(setAvailableModels(_0x59a54d),localStorage['setItem']('cached_models_amily2',JSON['stringify'](_0x59a54d)),populateModelDropdown());break;case _0x34a6a6(0x157):await testReplyChecker();break;case _0x34a6a6(0x147):await fixCommand();break;}}catch(_0x336263){console['error'](_0x34a6a6(0x15a)+this['id']+_0x34a6a6(0x1cc),_0x336263),toastr[_0x34a6a6(0x155)](_0x34a6a6(0x156)+_0x336263[_0x34a6a6(0x184)],'Amily2号');}finally{_0x440439[_0x34a6a6(0x18f)](_0x34a6a6(0x138),![])['html'](_0x32cb90);}}),_0x7d171d[_0x161e84(0x18d)]('click.amily2.expand_editor')['on'](_0x161e84(0x135),_0x161e84(0x145),function(_0x279157){const _0x31f54c=_0x161e84;if(!pluginAuthStatus[_0x31f54c(0x18c)])return;_0x279157[_0x31f54c(0x17d)]();const _0xc06db3=$(_0x31f54c(0x11e))[_0x31f54c(0x131)](),_0x2c71ff=$(_0x31f54c(0x175))[_0x31f54c(0x131)](),_0x15c247=_0x31f54c(0x193)+_0xc06db3+_0x31f54c(0x124),_0x392bb2=$(_0x15c247)[_0x31f54c(0x159)](_0x31f54c(0x1c3)),_0x309252=_0x392bb2[_0x31f54c(0x1a6)](_0x31f54c(0x1b5));_0x309252['val'](_0x2c71ff);const _0x46cb00=()=>{const _0x1c5f73=_0x31f54c;_0x392bb2[0x0][_0x1c5f73(0x179)](),_0x392bb2['remove']();};_0x392bb2[_0x31f54c(0x1a6)](_0x31f54c(0x1c2))['on'](_0x31f54c(0x1ce),()=>{const _0x259c2f=_0x31f54c,_0x44e5e1=_0x309252[_0x259c2f(0x131)]();$(_0x259c2f(0x175))[_0x259c2f(0x131)](_0x44e5e1),_0x40bcd1(_0xc06db3,_0x44e5e1),toastr['success'](_0x259c2f(0x188)+_0xc06db3+_0x259c2f(0x16d),_0x259c2f(0x185)),_0x46cb00();}),_0x392bb2[_0x31f54c(0x1a6)](_0x31f54c(0x129))['on'](_0x31f54c(0x1ce),_0x46cb00),_0x392bb2[0x0]['showModal']();}),_0x7d171d['off'](_0x161e84(0x171))['on']('click.amily2.tutorial',_0x161e84(0x148),function(){const _0x57af06=_0x161e84;if(!pluginAuthStatus[_0x57af06(0x18c)])return;const _0xc57402={'amily2_open_tutorial':{'title':'主殿使用教程','url':_0x57af06(0x14a)},'amily2_open_neige_tutorial':{'title':_0x57af06(0x151),'url':_0x57af06(0x191)}},_0x2fdfce=_0xc57402[this['id']];_0x2fdfce&&showContentModal(_0x2fdfce[_0x57af06(0x14c)],_0x2fdfce['url']);}),_0x7d171d['off']('click.amily2.update')['on'](_0x161e84(0x1a7),'#amily2_update_button',function(){const _0x4d076c=_0x161e84;$('#amily2_update_indicator')[_0x4d076c(0x1c7)]();const _0xf71901=getLatestUpdateInfo();if(_0xf71901&&_0xf71901[_0x4d076c(0x14e)]){const _0x3e380a=messageFormatting(_0xf71901['changelog']),_0x5195e3='\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20帝国最新情报\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+_0x3e380a+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20朕已阅\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20',_0x262eea=$(_0x5195e3)['appendTo']('body'),_0x2b7981=()=>{const _0x18da3a=_0x4d076c;_0x262eea[0x0][_0x18da3a(0x179)](),_0x262eea[_0x18da3a(0x18e)]();};_0x262eea['find']('.popup-button-ok')['on'](_0x4d076c(0x1ce),_0x2b7981),_0x262eea[0x0]['showModal']();}else toastr[_0x4d076c(0x18a)](_0x4d076c(0x146),'情报部回报');}),_0x7d171d['off'](_0x161e84(0x187))['on'](_0x161e84(0x187),'#amily2_update_button_new',function(){const _0x1a71b3=_0x161e84;$(_0x1a71b3(0x1a5))[_0x1a71b3(0x169)]()[_0x1a71b3(0x1ce)]();}),_0x7d171d['off'](_0x161e84(0x1a9))['on'](_0x161e84(0x1a9),_0x161e84(0x17a),async function(){const _0x1167de=_0x161e84;if(!pluginAuthStatus['authorized'])return;const _0x287ff3=this['id'];let _0x24e08f='',_0x3c5f8b={};switch(_0x287ff3){case'amily2_unhide_all_button':_0x24e08f=_0x1167de(0x125);break;case _0x1167de(0x1b9):_0x24e08f=_0x1167de(0x17c),_0x3c5f8b={'from':$(_0x1167de(0x1c5))['val'](),'to':$(_0x1167de(0x196))[_0x1167de(0x131)]()};break;case _0x1167de(0x1a1):_0x24e08f=_0x1167de(0x121),_0x3c5f8b={'from':$(_0x1167de(0x1c6))[_0x1167de(0x131)](),'to':$(_0x1167de(0x1b7))['val']()};break;}_0x24e08f&&await executeManualCommand(_0x24e08f,_0x3c5f8b);}),_0x7d171d[_0x161e84(0x18d)](_0x161e84(0x120))['on'](_0x161e84(0x120),_0x161e84(0x1d2),function(){const _0x2e2c6d=_0x161e84;if(!pluginAuthStatus[_0x2e2c6d(0x18c)])return;const _0x1676bc=_0x7d171d['find']('.plugin-features'),_0x21d45a=_0x7d171d[_0x2e2c6d(0x1a6)](_0x2e2c6d(0x1bc)),_0x18e37a=_0x7d171d[_0x2e2c6d(0x1a6)](_0x2e2c6d(0x19f));_0x1676bc[_0x2e2c6d(0x1c7)](),_0x21d45a[_0x2e2c6d(0x1c7)](),_0x18e37a['hide']();switch(this['id']){case _0x2e2c6d(0x1bd):_0x21d45a[_0x2e2c6d(0x14b)]();break;case'amily2_open_rag_palace':_0x18e37a[_0x2e2c6d(0x14b)]();break;case _0x2e2c6d(0x126):case _0x2e2c6d(0x180):_0x1676bc[_0x2e2c6d(0x14b)]();break;}}),_0x7d171d[_0x161e84(0x18d)](_0x161e84(0x13f))['on'](_0x161e84(0x13f),'input[type=\x22checkbox\x22][id^=\x22amily2_\x22]',function(_0x141fb8){const _0x34196a=_0x161e84;if(!pluginAuthStatus[_0x34196a(0x18c)])return;const _0x4062fc=this['id'],_0x517fac=$(this),_0x57c5c6=_0x3bc9de(_0x4062fc[_0x34196a(0x12f)]('amily2_',''));_0x40bcd1(_0x57c5c6,_0x517fac[_0x34196a(0x18f)]('checked'));if(_0x4062fc===_0x34196a(0x17e)&&_0x517fac['prop'](_0x34196a(0x1af))){const _0x40422b=extension_settings[extensionName],_0x27b71a=_0x40422b['optimizationExclusionRules']||[],_0x5924a3=(_0x136f82={'start':'','end':''},_0x52ab37)=>_0x34196a(0x162)+_0x52ab37+_0x34196a(0x19b)+_0x136f82[_0x34196a(0x1ca)]+_0x34196a(0x153)+_0x136f82[_0x34196a(0x13a)]+_0x34196a(0x199),_0x6ef57d=_0x27b71a[_0x34196a(0x1aa)](_0x5924a3)[_0x34196a(0x15b)](''),_0x2207fa=_0x34196a(0x1d9)+_0x6ef57d+_0x34196a(0x1d6);showHtmlModal(_0x34196a(0x168),_0x2207fa,{'okText':'确认','cancelText':'取消','onOk':_0xed65dc=>{const _0x48f5aa=_0x34196a,_0x1ef7d3=[];_0xed65dc[_0x48f5aa(0x1a6)]('.opt-exclusion-rule-row')[_0x48f5aa(0x1bf)](function(){const _0x4b892c=_0x48f5aa,_0x11cb3e=$(this)['find'](_0x4b892c(0x18b))['eq'](0x0)['val']()['trim'](),_0x2d75af=$(this)['find'](_0x4b892c(0x18b))['eq'](0x1)[_0x4b892c(0x131)]()[_0x4b892c(0x1ad)]();if(_0x11cb3e&&_0x2d75af)_0x1ef7d3[_0x4b892c(0x137)]({'start':_0x11cb3e,'end':_0x2d75af});}),_0x40bcd1(_0x48f5aa(0x12d),_0x1ef7d3),toastr[_0x48f5aa(0x1b4)](_0x48f5aa(0x17f),'Amily2号');},'onCancel':()=>{}});const _0x14d17f=$(_0x34196a(0x152)),_0x358b88=_0x14d17f['find'](_0x34196a(0x1c9));_0x14d17f['find'](_0x34196a(0x1be))['on']('click',()=>{const _0x3f961b=_0x34196a,_0x4952bb=_0x358b88['children']()[_0x3f961b(0x1cf)];_0x358b88[_0x3f961b(0x1a3)](_0x5924a3(undefined,_0x4952bb));}),_0x358b88['on'](_0x34196a(0x1ce),'.delete-rule-btn',function(){const _0x16f831=_0x34196a;$(this)[_0x16f831(0x166)]('.opt-exclusion-rule-row')[_0x16f831(0x18e)]();});}}),_0x7d171d[_0x161e84(0x18d)]('change.amily2.radio')['on'](_0x161e84(0x14f),_0x161e84(0x195),function(){const _0x9a739d=_0x161e84;if(!pluginAuthStatus['authorized'])return;const _0x3f7351=_0x3bc9de(this[_0x9a739d(0x1d7)][_0x9a739d(0x12f)](_0x9a739d(0x16c),'')),_0x4e7b8d=$(_0x9a739d(0x189)+this[_0x9a739d(0x1d7)]+'\x22]:checked')[_0x9a739d(0x131)]();_0x40bcd1(_0x3f7351,_0x4e7b8d);}),_0x7d171d[_0x161e84(0x18d)](_0x161e84(0x12e))['on']('change.amily2.text',_0x161e84(0x1bb),function(){const _0x2682cc=_0x161e84;if(!pluginAuthStatus['authorized'])return;const _0x44fc87=_0x3bc9de(this['id']['replace'](_0x2682cc(0x16c),''));_0x40bcd1(_0x44fc87,this[_0x2682cc(0x186)]),toastr[_0x2682cc(0x1b4)]('配置\x20['+_0x44fc87+_0x2682cc(0x16f),'Amily2号');}),_0x7d171d[_0x161e84(0x18d)](_0x161e84(0x1a0))['on'](_0x161e84(0x1a0),_0x161e84(0x1b6),function(){if(!pluginAuthStatus['authorized'])return;const _0x208f39=_0x3bc9de(this['id']['replace']('amily2_',''));_0x40bcd1(_0x208f39,this['value']),populateModelDropdown();}),_0x7d171d[_0x161e84(0x18d)](_0x161e84(0x170))['on']('input.amily2.range','input[type=\x22range\x22][id^=\x22amily2_\x22]',function(){const _0x2796c2=_0x161e84;if(!pluginAuthStatus[_0x2796c2(0x18c)])return;const _0x64be6b=_0x3bc9de(this['id'][_0x2796c2(0x12f)](_0x2796c2(0x16c),'')),_0x2c8a10=this['id'][_0x2796c2(0x11f)](_0x2796c2(0x1d0))?parseFloat(this[_0x2796c2(0x186)]):parseInt(this[_0x2796c2(0x186)],0xa);$('#'+this['id']+_0x2796c2(0x12a))[_0x2796c2(0x149)](_0x2c8a10),_0x40bcd1(_0x64be6b,_0x2c8a10);});const _0x4e4906={'mainPrompt':_0x161e84(0x172),'systemPrompt':_0x161e84(0x1b1),'outputFormatPrompt':_0x161e84(0x174)},_0x13333f=_0x161e84(0x11e),_0x572211='#amily2_unified_editor',_0x274951=_0x161e84(0x134);function _0x39ff97(){const _0x114552=_0x161e84;if(!$(_0x13333f)[_0x114552(0x1cf)])return;const _0x12a195=$(_0x13333f)[_0x114552(0x131)]();if(!_0x12a195)return;const _0x1aab74=extension_settings[extensionName][_0x12a195]||'';$(_0x572211)[_0x114552(0x131)](_0x1aab74);}_0x7d171d[_0x161e84(0x18d)](_0x161e84(0x127))['on'](_0x161e84(0x127),_0x13333f,_0x39ff97),_0x7d171d[_0x161e84(0x18d)](_0x161e84(0x19e))['on'](_0x161e84(0x19e),_0x274951,function(){const _0x194b92=_0x161e84,_0x2febd1=$(_0x13333f)[_0x194b92(0x131)]();if(!_0x2febd1)return;const _0x4347c5=$(_0x572211)[_0x194b92(0x131)]();_0x40bcd1(_0x2febd1,_0x4347c5),toastr[_0x194b92(0x1b4)]('谕令\x20['+_0x2febd1+_0x194b92(0x1cb),_0x194b92(0x185));}),_0x7d171d[_0x161e84(0x18d)](_0x161e84(0x1ae))['on']('click.amily2.unified_restore',_0x161e84(0x158),function(){const _0x5e5fbc=_0x161e84,_0x36033e=$(_0x13333f)[_0x5e5fbc(0x131)]();if(!_0x36033e)return;const _0x5cfa71=defaultSettings[_0x36033e];$(_0x572211)[_0x5e5fbc(0x131)](_0x5cfa71),_0x40bcd1(_0x36033e,_0x5cfa71),toastr['success']('谕令\x20['+_0x36033e+_0x5e5fbc(0x1b8),_0x5e5fbc(0x185));}),_0x7d171d[_0x161e84(0x18d)](_0x161e84(0x13b))['on'](_0x161e84(0x13b),'select[id^=\x22amily2_lore_\x22],\x20input#amily2_lore_depth_input',function(){const _0x18d840=_0x161e84;if(!pluginAuthStatus[_0x18d840(0x18c)])return;let _0x3cb8f5=_0x3bc9de(this['id'][_0x18d840(0x12f)](_0x18d840(0x16c),''));_0x3cb8f5===_0x18d840(0x154)&&(_0x3cb8f5=_0x18d840(0x16e));const _0x3842c8=this[_0x18d840(0x13d)]===_0x18d840(0x167)?parseInt(this[_0x18d840(0x186)],0xa):this[_0x18d840(0x186)];_0x40bcd1(_0x3cb8f5,_0x3842c8);if(this['id']===_0x18d840(0x1cd)){const _0x585529=$(_0x18d840(0x190));this[_0x18d840(0x186)]===_0x18d840(0x1ab)?_0x585529['slideDown'](0xc8):_0x585529[_0x18d840(0x150)](0xc8);}}),_0x7d171d['off'](_0x161e84(0x17b))['on'](_0x161e84(0x17b),_0x161e84(0x1d8),function(){const _0x8d4162=_0x161e84;if(!pluginAuthStatus['authorized'])return;const _0x144e26=$(this),_0x36dbe8=$(_0x8d4162(0x128));_0x144e26['prop']('disabled',!![])[_0x8d4162(0x181)](_0x8d4162(0x1c1)),_0x36dbe8[_0x8d4162(0x149)](_0x8d4162(0x1d4))[_0x8d4162(0x1d5)]()[_0x8d4162(0x192)](),setTimeout(()=>{const _0x38c142=_0x8d4162;_0x144e26[_0x38c142(0x18f)](_0x38c142(0x138),![])[_0x38c142(0x181)](_0x38c142(0x160)),_0x36dbe8[_0x38c142(0x122)]();},0x9c4);}),setTimeout(_0x39ff97,0x64),_0x53734d(),_0x7d171d['data'](_0x161e84(0x140),!![]);}$(document)['on'](_0x7bbaf1(0x12c),'input[name=\x22amily2_icon_location\x22]',function(){const _0x48f2e7=_0x7bbaf1;if(!pluginAuthStatus['authorized'])return;const _0x2f172c=$(this)[_0x48f2e7(0x131)]();extension_settings[extensionName][_0x48f2e7(0x139)]=_0x2f172c,saveSettingsDebounced(),console[_0x48f2e7(0x194)]('[Amily-禁卫军]\x20收到迁都指令\x20->\x20'+_0x2f172c+_0x48f2e7(0x16a)),toastr[_0x48f2e7(0x18a)](_0x48f2e7(0x177)+(_0x2f172c===_0x48f2e7(0x198)?'顶栏':_0x48f2e7(0x1ba))+_0x48f2e7(0x1d3),'迁都令',{'timeOut':0x7d0}),$(_0x48f2e7(0x176))[_0x48f2e7(0x18e)](),$(document)['off']('mousedown.amily2Drawer'),$(_0x48f2e7(0x1c0))[_0x48f2e7(0x18e)](),setTimeout(createDrawer,0x32);});function _0x33d7(){const _0x270243=['\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20保存并关闭取消\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','unhide_all','amily2_back_to_main_settings','change.amily2.prompt_selector','#amily2_lore_save_status','.popup-button-cancel','_value','#amily2_model_autofetch_wrapper','change','optimizationExclusionRules','change.amily2.text','replace','16NYCmOV','val','change.amily2.manual_model','3994116prfYti','#amily2_unified_save_button','click.amily2.expand_editor','data','push','disabled','iconLocation','end','change.amily2.lore_settings','forceProxyForCustomApi','type','9ocAoxk','change.amily2.checkbox','events-bound','#amily2_refresh_models,\x20#amily2_test,\x20#amily2_fix_now','复制失败,请手动复制。','401236DGZwkB','34428aybKEP','#amily2_expand_editor','未能获取到云端情报,请稍后再试。','amily2_fix_now','#amily2_open_tutorial,\x20#amily2_open_neige_tutorial','text','scripts/extensions/third-party/ST-Amily2-Chat-Optimisation/ZhuDian.md','show','title','click.amily2.auth','changelog','change.amily2.radio','slideUp','内阁使用教程','#optimization-exclusion-rules-container','\x22\x20placeholder=\x22开始字符,\x20如\x20\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20×\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','#amily2_manual_model_input','\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','append','writeText','span[data-i18n=\x22Manage\x20extensions\x22]','find','click.amily2.update','textContent','click.amily2.manual_command','map','at_depth','getElementById','trim','click.amily2.unified_restore','checked','#amily2_force_proxy','#amily2_system_prompt','#auth_submit','click.amily2.actions','success','#amily2_dialog_editor','select#amily2_model','#amily2_manual_unhide_to',']\x20已成功恢复为帝国初始蓝图。','amily2_manual_hide_confirm','扩展区','#amily2_api_url,\x20#amily2_api_key,\x20#amily2_optimization_target_tag','#amily2_additional_features_panel','amily2_open_additional_features','#optimization-add-rule-btn','each','#amily2_extension_frame','\x20已确认','.popup-button-ok','body','授权码已复制到剪贴板!','#amily2_manual_hide_from','#amily2_manual_unhide_from','hide','[Amily-谕令镌刻]\x20[','#optimization-rules-list','start',']\x20已镌刻!','\x20执行失败:','amily2_lore_insertion_position','click','length','temperature','change.amily2.force_proxy','#amily2_open_additional_features,\x20#amily2_open_rag_palace,\x20#amily2_back_to_main_settings,\x20#amily2_back_to_main_from_hanlinyuan',']...','圣意已在您每次更改时自动镌刻。','stop','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20添加新规则\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','name','#amily2_save_lore_settings','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20在这里定义需要从优化内容中排除的文本片段。例如,排除HTML注释,可以设置开始字符为\x20``。

\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','#amily2_prompt_selector','includes','click.amily2.chamber_nav','manual_unhide','fadeOut','toUpperCase'];_0x33d7=function(){return _0x270243;};return _0x33d7();} \ No newline at end of file diff --git a/ui/drawer.js b/ui/drawer.js index 34c2256..7566e60 100644 --- a/ui/drawer.js +++ b/ui/drawer.js @@ -1,221 +1 @@ -import { getSlideToggleOptions } from '/script.js'; -import { slideToggle } from '/lib.js'; -import { extension_settings, renderExtensionTemplateAsync } from "/scripts/extensions.js"; -import { extensionName, defaultSettings } from "../utils/settings.js"; -import { - checkAuthorization, - displayExpiryInfo, - pluginAuthStatus, -} from "../utils/auth.js"; -import { - updateUI, - setAvailableModels, - populateModelDropdown, - applyUpdateIndicator, -} from "./state.js"; -import { bindModalEvents } from "./bindings.js"; -import { fetchSupportedModels } from "../core/api.js"; -import { bindHistoriographyEvents } from "./historiography-bindings.js"; -import { bindHanlinyuanEvents } from "./hanlinyuan-bindings.js"; -import { showContentModal } from "./page-window.js"; -const extensionFolderPath = `scripts/extensions/third-party/${extensionName}`; - - -async function loadSettings() { - extension_settings[extensionName] = { - ...defaultSettings, - ...(extension_settings[extensionName] || {}), - }; - - - checkAuthorization(); - - - const autoLogin = localStorage.getItem("plugin_auto_login") === "true"; - console.log( - `[Amily2-调试] 授权状态: ${pluginAuthStatus.authorized}, 自动登录标志: ${autoLogin}`, - ); - if (autoLogin && pluginAuthStatus.authorized) { - console.log("[Amily2号] 检测到有效授权,将执行自动UI更新。"); - } - - $("#expiry_info").html(displayExpiryInfo()); - updateUI(); - - if (pluginAuthStatus.authorized && extension_settings[extensionName].apiUrl) { - const cachedModels = localStorage.getItem("cached_models_amily2"); - if (cachedModels) { - const models = JSON.parse(cachedModels); - console.log(`[Amily2号] 从缓存加载模型列表 (${models.length}个)`); - setAvailableModels(models); - populateModelDropdown(); - } else { - toastr.info("正在自动加载模型列表...", "Amily2号"); - setTimeout(async () => { - const models = await fetchSupportedModels(); - if (models.length > 0) { - setAvailableModels(models); - localStorage.setItem("cached_models_amily2", JSON.stringify(models)); - populateModelDropdown(); - } - }, 500); - } - } -} - -async function initializePanel(contentPanel, errorContainer) { - if (contentPanel.data("initialized")) return; - - try { - const modalContent = await $.get(`${extensionFolderPath}/assets/amily2-modal.html`); - contentPanel.html(modalContent); - const mainContainer = contentPanel.find('#amily2_chat_optimiser'); - - if (mainContainer.length) { - const additionalFeaturesContent = await $.get(`${extensionFolderPath}/assets/Amily2-AdditionalFeatures.html`); - const additionalPanelHtml = ``; - mainContainer.append(additionalPanelHtml); - - const hanlinyuanContent = await $.get(`${extensionFolderPath}/assets/hanlinyuan.html`); - const hanlinyuanPanelHtml = ``; - mainContainer.append(hanlinyuanPanelHtml); - } - - await loadSettings(); - bindModalEvents(); - bindHistoriographyEvents(); - bindHanlinyuanEvents(); - contentPanel.data("initialized", true); - console.log("[Amily-重构] 宫殿模块已按蓝图竣工。"); - applyUpdateIndicator(); - } catch (error) { - console.error("[Amily-建设部] 紧急报告:加载模块化蓝图时发生意外:", error); - const errorMessage = errorContainer - ? '

紧急报告:在扩展区域建造Amily2号府邸时发生意外。

' - : '

紧急报告:无法加载Amily2号府邸内饰。

'; - - if (errorContainer) { - errorContainer.append(errorMessage); - } else { - contentPanel.html(errorMessage); - } - } -} - -/** - * 【兼容性核心】为旧版SillyTavern提供的抽屉切换后备方案。 - * 这个函数综合了我们之前所有调试的经验,确保了稳定和兼容。 - */ -function toggleDrawerFallback() { - const drawerIcon = $('#amily2_drawer_icon'); - const contentPanel = $('#amily2_drawer_content'); - - // 状态同步:如果图标和面板状态不一致(被外部关闭),先强制同步 - if (drawerIcon.hasClass('openIcon') && !contentPanel.is(':visible')) { - drawerIcon.removeClass('openIcon').addClass('closedIcon'); - } - - // 核心逻辑:基于图标的 class 来判断 - if (drawerIcon.hasClass('closedIcon')) { - // 打开抽屉 - // 1. 关闭其他所有打开的抽屉(使用正确的 toggleClass,确保非破坏性) - $('.openDrawer').not(contentPanel).not('.pinnedOpen').addClass('resizing').each((_, el) => { - slideToggle(el, { - ...getSlideToggleOptions(), - onAnimationEnd: function (el) { - el.closest('.drawer-content').classList.remove('resizing'); - }, - }); - }); - $('.openIcon').not(drawerIcon).not('.drawerPinnedOpen').toggleClass('closedIcon openIcon'); - $('.openDrawer').not(contentPanel).not('.pinnedOpen').toggleClass('closedDrawer openDrawer'); - - // 2. 打开当前抽屉 - drawerIcon.toggleClass('closedIcon openIcon'); - contentPanel.toggleClass('closedDrawer openDrawer'); - - contentPanel.addClass('resizing').each((_, el) => { - slideToggle(el, { - ...getSlideToggleOptions(), - onAnimationEnd: function (el) { - el.closest('.drawer-content').classList.remove('resizing'); - }, - }); - }); - } else { - // 关闭当前抽屉 - drawerIcon.toggleClass('openIcon closedIcon'); - contentPanel.toggleClass('openDrawer closedDrawer'); - - contentPanel.addClass('resizing').each((_, el) => { - slideToggle(el, { - ...getSlideToggleOptions(), - onAnimationEnd: function (el) { - el.closest('.drawer-content').classList.remove('resizing'); - }, - }); - }); - } -} - - -export async function createDrawer() { - const settings = extension_settings[extensionName]; - const location = settings.iconLocation || 'topbar'; - - if (location === 'topbar') { - if ($("#amily2_main_drawer").length > 0) return; - - // 使用与st-memory-enhancement完全一致的HTML结构,确保兼容性 - const amily2DrawerHtml = ` -
-
-
-
-
-
-
- `; - $("#sys-settings-button").after(amily2DrawerHtml); - - const contentPanel = $("#amily2_drawer_content"); - await initializePanel(contentPanel); - - // 【兼容性核心】使用动态导入来判断环境并绑定点击事件 - try { - const { doNavbarIconClick } = await import('/script.js'); - if (typeof doNavbarIconClick === 'function') { - // 新版SillyTavern:使用官方函数 - $('#amily2_main_drawer .drawer-toggle').on('click', doNavbarIconClick); - console.log('[Amily2-兼容性] 检测到新版环境,已绑定官方点击事件。'); - } else { - // 理论上不存在的导出项会直接抛出错误,但作为双重保险 - throw new Error('doNavbarIconClick is not a function'); - } - } catch (error) { - // 旧版SillyTavern:动态导入失败,使用我们的后备方案 - $('#amily2_main_drawer .drawer-toggle').on('click', toggleDrawerFallback); - console.log('[Amily2-兼容性] 检测到旧版环境 (无法导入 doNavbarIconClick),已绑定后备点击事件。'); - } - - } else if (location === 'extensions') { - if ($("#extensions_settings2 #amily2_chat_optimiser").length > 0) return; - const amilyFrameHtml = ` -
-
-
- Amily2号 优化中枢 -
-
- -
-
- `; - - const frame = $(amilyFrameHtml); - $('#extensions_settings2').append(frame); - const contentPanel = frame.find('.inline-drawer-content'); - initializePanel(contentPanel, frame); - } -} +const _0x38a0e4=_0xaffc;(function(_0x83275d,_0x5123cb){const _0x1532d3=_0xaffc,_0x2ad276=_0x83275d();while(!![]){try{const _0x3301ce=-parseInt(_0x1532d3(0x172))/0x1*(parseInt(_0x1532d3(0x170))/0x2)+-parseInt(_0x1532d3(0x16f))/0x3*(-parseInt(_0x1532d3(0x151))/0x4)+-parseInt(_0x1532d3(0x17a))/0x5*(parseInt(_0x1532d3(0x178))/0x6)+parseInt(_0x1532d3(0x176))/0x7*(parseInt(_0x1532d3(0x15a))/0x8)+parseInt(_0x1532d3(0x183))/0x9*(parseInt(_0x1532d3(0x155))/0xa)+-parseInt(_0x1532d3(0x14d))/0xb+parseInt(_0x1532d3(0x18a))/0xc*(parseInt(_0x1532d3(0x14f))/0xd);if(_0x3301ce===_0x5123cb)break;else _0x2ad276['push'](_0x2ad276['shift']());}catch(_0x1b9d92){_0x2ad276['push'](_0x2ad276['shift']());}}}(_0x5cf7,0xaf8da));import{getSlideToggleOptions}from'/script.js';import{slideToggle}from'/lib.js';function _0x5cf7(){const _0x31d098=['doNavbarIconClick\x20is\x20not\x20a\x20function','6VodJNB','\x0a\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Amily2号\x20优化中枢\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20','2312435PSKJQr','[Amily2号]\x20检测到有效授权,将执行自动UI更新。','#extensions_settings2','[Amily2-兼容性]\x20检测到旧版环境\x20(无法导入\x20doNavbarIconClick),已绑定后备点击事件。','#sys-settings-button','\x0a\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20','[Amily2-调试]\x20授权状态:\x20','openIcon','plugin_auto_login','1467zpMjnm','not','.inline-drawer-content','data','.openIcon','#amily2_drawer_content','authorized','12kULFcj','','[Amily2号]\x20从缓存加载模型列表\x20(','closedDrawer\x20openDrawer','resizing','getItem','info','.openDrawer','parse','.pinnedOpen','each','#extensions_settings2\x20#amily2_chat_optimiser','Amily2号','/assets/hanlinyuan.html','length','toggleClass','closedIcon\x20openIcon','/assets/Amily2-AdditionalFeatures.html','#expiry_info','remove','.drawer-content','append','/script.js',',\x20自动登录标志:\x20','true','15569301RvGDlY','#amily2_drawer_icon','12107186GJgOvS','closedIcon','293032ksBqZb','function','error','[Amily-建设部]\x20紧急报告:加载模块化蓝图时发生意外:','32950oNmTFI','initialized','get','紧急报告:在扩展区域建造Amily2号府邸时发生意外。

','find','4280qIgGcY',':visible','/assets/amily2-modal.html','iconLocation','closest','openIcon\x20closedIcon','classList','hasClass','[Amily2-兼容性]\x20检测到新版环境,已绑定官方点击事件。','log','html','scripts/extensions/third-party/','.drawerPinnedOpen','#amily2_chat_optimiser','正在自动加载模型列表...','','','#amily2_main_drawer\x20.drawer-toggle','click','openDrawer\x20closedDrawer','[Amily-重构]\x20宫殿模块已按蓝图竣工。','21xLlLHz','2hkMXde','removeClass','691274RluxZa','topbar','紧急报告:无法加载Amily2号府邸内饰。

','addClass','17101puJmrn'];_0x5cf7=function(){return _0x31d098;};return _0x5cf7();}import{extension_settings,renderExtensionTemplateAsync}from'/scripts/extensions.js';import{extensionName,defaultSettings}from'../utils/settings.js';import{checkAuthorization,displayExpiryInfo,pluginAuthStatus}from'../utils/auth.js';import{updateUI,setAvailableModels,populateModelDropdown,applyUpdateIndicator}from'./state.js';import{bindModalEvents}from'./bindings.js';import{fetchSupportedModels}from'../core/api.js';import{bindHistoriographyEvents}from'./historiography-bindings.js';import{bindHanlinyuanEvents}from'./hanlinyuan-bindings.js';import{showContentModal}from'./page-window.js';const extensionFolderPath=_0x38a0e4(0x165)+extensionName;async function loadSettings(){const _0x771de9=_0x38a0e4;extension_settings[extensionName]={...defaultSettings,...extension_settings[extensionName]||{}},checkAuthorization();const _0xcc9759=localStorage[_0x771de9(0x18f)](_0x771de9(0x182))===_0x771de9(0x14c);console[_0x771de9(0x163)](_0x771de9(0x180)+pluginAuthStatus['authorized']+_0x771de9(0x14b)+_0xcc9759);_0xcc9759&&pluginAuthStatus[_0x771de9(0x189)]&&console[_0x771de9(0x163)](_0x771de9(0x17b));$(_0x771de9(0x146))[_0x771de9(0x164)](displayExpiryInfo()),updateUI();if(pluginAuthStatus[_0x771de9(0x189)]&&extension_settings[extensionName]['apiUrl']){const _0x9fb226=localStorage[_0x771de9(0x18f)]('cached_models_amily2');if(_0x9fb226){const _0x56a679=JSON[_0x771de9(0x192)](_0x9fb226);console[_0x771de9(0x163)](_0x771de9(0x18c)+_0x56a679[_0x771de9(0x142)]+'个)'),setAvailableModels(_0x56a679),populateModelDropdown();}else toastr[_0x771de9(0x190)](_0x771de9(0x168),_0x771de9(0x140)),setTimeout(async()=>{const _0x2d531c=await fetchSupportedModels();_0x2d531c['length']>0x0&&(setAvailableModels(_0x2d531c),localStorage['setItem']('cached_models_amily2',JSON['stringify'](_0x2d531c)),populateModelDropdown());},0x1f4);}}async function initializePanel(_0x4dc13d,_0x4b12fc){const _0x510a17=_0x38a0e4;if(_0x4dc13d[_0x510a17(0x186)](_0x510a17(0x156)))return;try{const _0x11b1bf=await $[_0x510a17(0x157)](extensionFolderPath+_0x510a17(0x15c));_0x4dc13d[_0x510a17(0x164)](_0x11b1bf);const _0x367df2=_0x4dc13d[_0x510a17(0x159)](_0x510a17(0x167));if(_0x367df2['length']){const _0x2d15c3=await $[_0x510a17(0x157)](extensionFolderPath+_0x510a17(0x145)),_0x55bb27=_0x510a17(0x18b)+_0x2d15c3+_0x510a17(0x16a);_0x367df2[_0x510a17(0x149)](_0x55bb27);const _0x3a7d27=await $[_0x510a17(0x157)](extensionFolderPath+_0x510a17(0x141)),_0x2a6072=_0x510a17(0x169)+_0x3a7d27+'';_0x367df2[_0x510a17(0x149)](_0x2a6072);}await loadSettings(),bindModalEvents(),bindHistoriographyEvents(),bindHanlinyuanEvents(),_0x4dc13d[_0x510a17(0x186)]('initialized',!![]),console[_0x510a17(0x163)](_0x510a17(0x16e)),applyUpdateIndicator();}catch(_0x53213c){console[_0x510a17(0x153)](_0x510a17(0x154),_0x53213c);const _0x2c22fc=_0x4b12fc?_0x510a17(0x158):_0x510a17(0x174);_0x4b12fc?_0x4b12fc['append'](_0x2c22fc):_0x4dc13d[_0x510a17(0x164)](_0x2c22fc);}}function _0xaffc(_0xe42ec0,_0x3bf86f){const _0x5cf776=_0x5cf7();return _0xaffc=function(_0xaffcb6,_0x3b371a){_0xaffcb6=_0xaffcb6-0x140;let _0x2f417b=_0x5cf776[_0xaffcb6];return _0x2f417b;},_0xaffc(_0xe42ec0,_0x3bf86f);}function toggleDrawerFallback(){const _0x218213=_0x38a0e4,_0x394dcd=$(_0x218213(0x14e)),_0xbe36df=$('#amily2_drawer_content');_0x394dcd[_0x218213(0x161)](_0x218213(0x181))&&!_0xbe36df['is'](_0x218213(0x15b))&&_0x394dcd[_0x218213(0x171)](_0x218213(0x181))[_0x218213(0x175)](_0x218213(0x150)),_0x394dcd[_0x218213(0x161)](_0x218213(0x150))?($(_0x218213(0x191))[_0x218213(0x184)](_0xbe36df)[_0x218213(0x184)](_0x218213(0x193))['addClass']('resizing')['each']((_0x1edb09,_0x11b0ae)=>{slideToggle(_0x11b0ae,{...getSlideToggleOptions(),'onAnimationEnd':function(_0xffbf62){const _0x158282=_0xaffc;_0xffbf62[_0x158282(0x15e)](_0x158282(0x148))['classList'][_0x158282(0x147)](_0x158282(0x18e));}});}),$(_0x218213(0x187))['not'](_0x394dcd)[_0x218213(0x184)](_0x218213(0x166))['toggleClass']('closedIcon\x20openIcon'),$(_0x218213(0x191))['not'](_0xbe36df)[_0x218213(0x184)]('.pinnedOpen')[_0x218213(0x143)](_0x218213(0x18d)),_0x394dcd['toggleClass'](_0x218213(0x144)),_0xbe36df[_0x218213(0x143)]('closedDrawer\x20openDrawer'),_0xbe36df[_0x218213(0x175)](_0x218213(0x18e))[_0x218213(0x194)]((_0x13af92,_0x1809c1)=>{slideToggle(_0x1809c1,{...getSlideToggleOptions(),'onAnimationEnd':function(_0x428acb){const _0x39de17=_0xaffc;_0x428acb[_0x39de17(0x15e)](_0x39de17(0x148))[_0x39de17(0x160)][_0x39de17(0x147)](_0x39de17(0x18e));}});})):(_0x394dcd[_0x218213(0x143)](_0x218213(0x15f)),_0xbe36df[_0x218213(0x143)](_0x218213(0x16d)),_0xbe36df[_0x218213(0x175)]('resizing')[_0x218213(0x194)]((_0x5e3849,_0x4e0a1e)=>{slideToggle(_0x4e0a1e,{...getSlideToggleOptions(),'onAnimationEnd':function(_0x30a661){const _0x1134cd=_0xaffc;_0x30a661[_0x1134cd(0x15e)]('.drawer-content')[_0x1134cd(0x160)][_0x1134cd(0x147)](_0x1134cd(0x18e));}});}));}export async function createDrawer(){const _0x427024=_0x38a0e4,_0x3f5608=extension_settings[extensionName],_0x3280fc=_0x3f5608[_0x427024(0x15d)]||_0x427024(0x173);if(_0x3280fc===_0x427024(0x173)){if($('#amily2_main_drawer')['length']>0x0)return;const _0x435678=_0x427024(0x17f);$(_0x427024(0x17e))['after'](_0x435678);const _0x5de5fd=$(_0x427024(0x188));await initializePanel(_0x5de5fd);try{const {doNavbarIconClick:_0x4d04f8}=await import(_0x427024(0x14a));if(typeof _0x4d04f8===_0x427024(0x152))$('#amily2_main_drawer\x20.drawer-toggle')['on'](_0x427024(0x16c),_0x4d04f8),console[_0x427024(0x163)](_0x427024(0x162));else throw new Error(_0x427024(0x177));}catch(_0x12561f){$(_0x427024(0x16b))['on']('click',toggleDrawerFallback),console['log'](_0x427024(0x17d));}}else{if(_0x3280fc==='extensions'){if($(_0x427024(0x195))['length']>0x0)return;const _0x277477=_0x427024(0x179),_0x445664=$(_0x277477);$(_0x427024(0x17c))[_0x427024(0x149)](_0x445664);const _0x2c6fc8=_0x445664[_0x427024(0x159)](_0x427024(0x185));initializePanel(_0x2c6fc8,_0x445664);}}} \ No newline at end of file diff --git a/ui/hanlinyuan-bindings.js b/ui/hanlinyuan-bindings.js index d8af22d..28fb69f 100644 --- a/ui/hanlinyuan-bindings.js +++ b/ui/hanlinyuan-bindings.js @@ -1,1180 +1 @@ -/** - * ===================================================================== - * =========== 【翰林院】中枢机要室 - 负责政令传达 v4.0 =========== - * =========== Amily 奉旨重铸,确保政令畅通 ============= - * ===================================================================== - */ - -import { getContext } from '/scripts/extensions.js'; -// 废除 extension_prompt_types,我们直接使用正确的数字值 -import * as HanlinyuanCore from '../core/rag-processor.js'; -import * as Historiographer from '../core/historiographer.js'; -import * as ContextUtils from '../core/utils/context-utils.js'; -import * as IngestionManager from '../core/ingestion-manager.js'; // 【新增】导入任务总管 -import { showContentModal, showHtmlModal } from './page-window.js'; -import { extractBlocksByTags, applyExclusionRules } from '../core/utils/rag-tag-extractor.js'; - -'use strict'; - -// 将UI交互函数暴露到全局,供HTML的onclick调用 -function setupGlobalEventHandlers() { - // 【重构】手动保存和重置现在由新的事件绑定器处理,但保留全局函数以防万一 - window.saveHLYSettings = () => saveSettingsFromUI(false); // false表示非自动保存 - window.resetHLYSettings = resetSettingsToUI; - window.testHLYApi = testApi; - window.fetchHLYEmbeddingModels = fetchHLYEmbeddingModels; - window.fetchHLYRerankModels = fetchHLYRerankModels; // 新增 - window.updateHLYMemoryCount = updatePanelStatus; - window.purgeHLYStorage = purgeStorage; - window.startHLYCondensation = startCondensation; - window.previewHLYCondensation = previewCondensation; - window.ingestHLYManualText = ingestManualText; - window.hlyLog = log; - window.showHLYStats = showStats; - // 【新增】书库编纂相关 - window.startHLYHistoriography = startHistoriography; -} - -/** - * 【全新】核心函数:更新单个设置项,保存并记录日志 - * @param {string} key - 设置键,例如 'retrieval.enabled' - * @param {*} value - 新的设置值 - */ -function updateAndSaveSetting(key, value) { - const settings = HanlinyuanCore.getSettings(); - if (!settings) return; - - // 使用 lodash-like set a value in a nested object - const keys = key.split('.'); - let current = settings; - for (let i = 0; i < keys.length - 1; i++) { - current = current[keys[i]] = current[keys[i]] || {}; - } - current[keys[keys.length - 1]] = value; - - HanlinyuanCore.saveSettings(); - log(`[自动保存] 设置项 '${key}' 已更新为: ${JSON.stringify(value)}`, 'success'); -} - -/** - * 【全新】绑定所有带 data-setting-key 属性的控件的自动保存事件 - */ -function bindAutoSaveEvents() { - const container = document.getElementById('hly-modal-container'); - if (!container) return; - - container.addEventListener('change', (event) => { - const target = event.target; - const key = target.dataset.settingKey; - if (!key) return; - - let value; - const type = target.dataset.type || 'string'; - - if (target.type === 'checkbox') { - value = target.checked; - } else if (target.type === 'radio') { - if (target.checked) { - const radioGroup = container.querySelectorAll(`input[name="${target.name}"]`); - const checkedRadio = Array.from(radioGroup).find(r => r.checked); - value = checkedRadio.value; - } else { - return; // 如果不是选中的那个radio,则不处理 - } - } else { - value = target.value; - } - - // 类型转换 - switch (type) { - case 'integer': - value = parseInt(value, 10); - break; - case 'float': - value = parseFloat(value); - break; - case 'boolean': - // Checkbox value is already a boolean - if (typeof value !== 'boolean') { - value = value === 'true'; - } - break; - } - - // 对于radio按钮,我们需要确保只处理一次 - if (target.type === 'radio' && !target.checked) return; - - updateAndSaveSetting(key, value); - }); -} - - -/** - * 主初始化函数 - */ -export function bindHanlinyuanEvents() { - const context = getContext(); - if (!context) { - console.error('[翰林院-枢纽] 未能获取SillyTavern上下文,绑定失败。'); - return; - } - - setupGlobalEventHandlers(); - bindPanelToggleEvents(); - bindInternalUIEvents(); - bindTutorialEvents(); // 【新增】绑定教程按钮事件 - bindAutoSaveEvents(); // 【新增】激活自动保存机制 - bindSessionLockEvent(); // 【新增】绑定会话锁定事件 - - // 确保核心已经初始化 - if (HanlinyuanCore.initialize) { - HanlinyuanCore.initialize(); - } else { - console.error('[翰林院-枢纽] 核心法典未能提供初始化圣旨!'); - return; - } - - loadSettingsToUI(); - loadWorldbookList(); // 【新增】加载书库列表 - log('[翰林院-枢纽] 已成功连接各部,政令畅通。', 'info'); - - // 【新增】为“整本录入”按钮绑定事件 (V2 - 带进度条和中止功能) - // const startNovelIngestionBtn_old = document.getElementById('hanlin_start_novel_ingestion'); - // if (startNovelIngestionBtn_old) { ... } // 旧逻辑已被完全替换 - - const fileInput = document.getElementById('hanlinyuan-ingest-novel-file-input'); - const fileNameSpan = document.getElementById('hanlinyuan-ingest-novel-file-name'); - const startBtn = document.getElementById('hanlinyuan-ingest-novel-start'); - const abortBtn = document.getElementById('hanlinyuan-ingest-abort'); - const progressContainer = document.getElementById('hanlinyuan-ingest-progress-container'); - const progressBar = document.getElementById('hanlinyuan-ingest-progress-bar'); - const statusText = document.getElementById('hanlinyuan-ingest-status'); - const controlsContainer = document.getElementById('hanlinyuan-ingest-novel-controls'); - - let selectedFile = null; - let abortController = null; - - fileInput.addEventListener('change', (event) => { - selectedFile = event.target.files[0]; - if (selectedFile) { - fileNameSpan.textContent = selectedFile.name; - fileNameSpan.title = selectedFile.name; - } else { - fileNameSpan.textContent = '未选择文件'; - } - }); - - startBtn.addEventListener('click', async () => { - if (!selectedFile) { - toastr.warning('请先选择一个 .txt 文件'); - return; - } - - let resumeFromIndex = 0; - const jobId = IngestionManager.generateJobId(selectedFile); - const savedState = IngestionManager.loadProgress(jobId); - - if (savedState) { - const progressPercentage = ((savedState.processedChunks / savedState.totalChunks) * 100).toFixed(1); - const userChoice = confirm(`启禀大人,发现此书上次录入已完成 ${progressPercentage}%。是否从上次中断之处继续?`); - - if (userChoice) { - resumeFromIndex = savedState.processedChunks; - toastr.info(`遵命,将从第 ${resumeFromIndex + 1} 块继续录入。`, '圣旨已达'); - log(`[断点续传] 用户选择继续任务 ${jobId},从第 ${resumeFromIndex} 块开始。`, 'info'); - } else { - IngestionManager.clearJob(jobId); - toastr.info('遵命,将从头开始录入此书。', '圣旨已达'); - log(`[断点续传] 用户选择放弃旧任务 ${jobId},重新开始。`, 'warn'); - } - } - - abortController = new AbortController(); - const signal = abortController.signal; - - controlsContainer.style.display = 'none'; - progressContainer.style.display = 'block'; - statusText.textContent = '正在读取文件...'; - progressBar.value = 0; - - try { - const text = await selectedFile.text(); - - const progressCallback = (progress) => { - statusText.textContent = `处理中: ${progress.message} (${progress.processed}/${progress.total})`; - progressBar.value = (progress.processed / progress.total) * 100; - }; - - const batchCompleteCallback = () => { - updatePanelStatus(); - log('[实时刷新] 批次完成,忆识总数已更新。', 'info'); - }; - - const result = await HanlinyuanCore.ingestTextToHanlinyuan( - text, - 'novel', - selectedFile.name, - progressCallback, - signal, - log, - batchCompleteCallback, - jobId, - resumeFromIndex - ); - - if (result.success) { - toastr.success(`成功录入 ${result.count} 个知识块`); - statusText.textContent = `任务完成!成功录入 ${result.count} 个知识块。`; - progressBar.value = 100; - updatePanelStatus(); - } else { - throw new Error(result.error || '未知错误'); - } - - } catch (error) { - if (error.name === 'AbortError') { - toastr.info('任务已由用户中止。进度已保存,可随时继续。'); - statusText.textContent = '任务已中止。'; - } else { - toastr.error(`录入失败: ${error.message}。进度已保存,可稍后重试。`); - statusText.textContent = `错误: ${error.message}`; - } - } finally { - setTimeout(() => { - controlsContainer.style.display = 'flex'; - progressContainer.style.display = 'none'; - fileInput.value = ''; - selectedFile = null; - fileNameSpan.textContent = '未选择文件'; - }, 3000); - } - }); - - abortBtn.addEventListener('click', () => { - if (abortController) { - abortController.abort(); - } - }); -} - -/** - * 【新增】为会话锁定按钮绑定事件和逻辑 - */ -function bindSessionLockEvent() { - const lockButton = document.getElementById('hly-session-lock-btn'); - if (!lockButton) return; - - lockButton.addEventListener('click', () => { - const isNowLocked = HanlinyuanCore.toggleSessionLock(); - updateSessionLockUI(isNowLocked); - - if (isNowLocked) { - const lockedInfo = HanlinyuanCore.getLockedSessionInfo(); - toastr.success(`会话已锁定到: ${lockedInfo.id}`, '圣旨已下'); - log(`会话已锁定到宝库: ${lockedInfo.id}`, 'success'); - } else { - toastr.info('会话已解锁,将跟随当前角色。', '诏曰'); - log('会话已解锁。', 'info'); - } - // 锁定/解锁后,立即刷新状态面板以反映正确的ID和数量 - updatePanelStatus(); - }); - - // 初始化时也更新一次UI - updateSessionLockUI(HanlinyuanCore.isSessionLocked()); -} - -/** - * 【新增】根据锁定状态更新UI元素 - * @param {boolean} isLocked - 当前是否处于锁定状态 - */ -function updateSessionLockUI(isLocked) { - const lockButton = document.getElementById('hly-session-lock-btn'); - if (!lockButton) return; - - const icon = lockButton.querySelector('i'); - const text = lockButton.querySelector('span'); - - if (isLocked) { - lockButton.classList.add('active'); - icon.className = 'fas fa-lock'; - text.textContent = '解锁会话'; - lockButton.title = '点击以解锁,让翰林院跟随当前角色'; - } else { - lockButton.classList.remove('active'); - icon.className = 'fas fa-lock-open'; - text.textContent = '锁定会话'; - lockButton.title = '点击以锁定,让翰林院固定操作当前角色的宝库'; - } -} - -function bindPanelToggleEvents() { - // 【最终版】权力回归中央 - // “返回主殿”按钮的逻辑已由 ui/bindings.js 中的中央导航系统统一处理。 - // 我们只需处理“打开翰林院”的按钮即可。 - const openButton = document.getElementById('amily2_open_rag_palace'); - if (openButton) { - // 这个按钮的逻辑依然由中央导航系统处理,我们无需在此添加监听器。 - // 保留此函数结构以备将来可能的扩展,但目前它无需执行任何操作。 - } - - // 我们自己的返回按钮 (hly-back-to-main) 已被赋予新的ID,并由中央接管。 - // 此处不再需要为它绑定任何事件。 -} - -function bindTutorialEvents() { - const tutorialButton = document.getElementById('amily2_open_hanlin_tutorial'); - if (tutorialButton) { - tutorialButton.addEventListener('click', () => { - // 我们需要从Amily2主模块获取授权状态,但为解耦,此处暂不检查 - // if (!pluginAuthStatus.authorized) return; - showContentModal("翰林院使用教程", "scripts/extensions/third-party/ST-Amily2-Chat-Optimisation/HanLin.md"); - }); - } -} - -function bindInternalUIEvents() { - const tabs = document.querySelectorAll('.hly-nav-item'); - tabs.forEach(tab => { - tab.addEventListener('click', () => { - const targetTabId = tab.dataset.tab; - // 修正选择器以匹配新的 'historiography' ID - const targetPaneId = `hly-${targetTabId}-tab`; - document.querySelectorAll('.hly-tab-pane').forEach(pane => { - pane.classList.toggle('active', pane.id === targetPaneId); - }); - tabs.forEach(t => t.classList.toggle('active', t === tab)); - }); - }); - - const apiEndpointSelect = document.getElementById('hly-api-endpoint'); - if (apiEndpointSelect) { - apiEndpointSelect.addEventListener('change', toggleCustomEndpointDocket); - } - - // 为最终版注入位置单选框绑定事件 - const positionRadios = document.querySelectorAll('input[name="hly-injection-position"]'); - positionRadios.forEach(radio => { - radio.addEventListener('change', toggleInjectionDetails); - }); - - // 【新增】为“标签提取”复选框绑定事件 - const tagExtractionToggle = document.getElementById('hly-tag-extraction-toggle'); - const tagInputContainer = document.getElementById('hly-tag-input-container'); - if (tagExtractionToggle && tagInputContainer) { - tagExtractionToggle.addEventListener('change', () => { - tagInputContainer.style.display = tagExtractionToggle.checked ? 'block' : 'none'; - }); - } - - // 【新增】为“书库选择”下拉框绑定联动事件 - const librarySelect = document.getElementById('hly-hist-select-library'); - if (librarySelect) { - librarySelect.addEventListener('change', handleWorldbookSelectionChange); - } - - // 【新增】为“内容排除”按钮绑定事件 - const exclusionRulesBtn = document.getElementById('hly-exclusion-rules-btn'); - if (exclusionRulesBtn) { - exclusionRulesBtn.addEventListener('click', showExclusionRulesModal); - } -} - -/** - * 新增:根据注入位置启用/禁用详细设置 - */ -function toggleInjectionDetails() { - const position = document.querySelector('input[name="hly-injection-position"]:checked').value; - const depthInput = document.getElementById('hly-injection-depth'); - const roleSelect = document.getElementById('hly-injection-role'); - - // 只有当 position 为 "1" (聊天内) 时,才启用详细设置 - const isChatMode = (position === '1'); - depthInput.disabled = !isChatMode; - roleSelect.disabled = !isChatMode; -} - -function toggleCustomEndpointDocket() { - const endpoint = document.getElementById('hly-api-endpoint').value; - const docket = document.getElementById('hly-custom-endpoint-docket'); - if (docket) { - docket.style.display = (endpoint === 'custom' || endpoint === 'azure') ? 'block' : 'none'; - } -} - -function loadSettingsToUI() { - const settings = HanlinyuanCore.getSettings(); - if (!settings) return; - - // 检索设置 - document.getElementById('hly-retrieval-enabled').checked = settings.retrieval.enabled; - document.getElementById('hly-api-endpoint').value = settings.retrieval.apiEndpoint; - document.getElementById('hly-custom-api-url').value = settings.retrieval.customApiUrl; - document.getElementById('hly-api-key').value = settings.retrieval.apiKey; - // 对于下拉框,我们只设置初始值,但不清空列表 - const modelSelect = document.getElementById('hly-embedding-model'); - if (modelSelect.options.length === 0) { - const currentModel = settings.retrieval.embeddingModel; - const option = new Option(currentModel, currentModel, true, true); - modelSelect.add(option); - } - modelSelect.value = settings.retrieval.embeddingModel; - document.getElementById('hly-retrieval-notify').checked = settings.retrieval.notify; - - // 高级设定 - document.getElementById('hly-chunk-size').value = settings.advanced.chunkSize; - document.getElementById('hly-overlap-size').value = settings.advanced.overlap; - document.getElementById('hly-match-threshold').value = settings.advanced.matchThreshold; - document.getElementById('hly-query-message-count').value = settings.advanced.queryMessageCount; - document.getElementById('hly-max-results').value = settings.advanced.maxResults; - document.getElementById('hly-batch-size').value = settings.retrieval.batchSize; - - // 注入设定 (最终版逻辑) - document.getElementById('hly-injection-template').value = settings.injection.template; - const positionRadio = document.querySelector(`input[name="hly-injection-position"][value="${settings.injection.position}"]`); - if (positionRadio) { - positionRadio.checked = true; - } - document.getElementById('hly-injection-depth').value = settings.injection.depth; - document.getElementById('hly-injection-role').value = settings.injection.depth_role; - - // 根据加载的设置,更新UI显示状态 - toggleInjectionDetails(); - - // 凝识设置 - document.getElementById('hly-condensation-enabled').checked = settings.condensation.enabled; - document.getElementById('hly-layer-start').value = settings.condensation.layerStart; - document.getElementById('hly-layer-end').value = settings.condensation.layerEnd; - document.getElementById('hly-include-user').checked = settings.condensation.messageTypes.user; - document.getElementById('hly-include-ai').checked = settings.condensation.messageTypes.ai; - - // 新增:加载标签提取设置 - const tagExtractionToggle = document.getElementById('hly-tag-extraction-toggle'); - const tagInput = document.getElementById('hly-tag-input'); - const tagInputContainer = document.getElementById('hly-tag-input-container'); - - tagExtractionToggle.checked = settings.condensation.tagExtractionEnabled; - tagInput.value = settings.condensation.tags; // 直接使用从核心获取的值 - tagInputContainer.style.display = tagExtractionToggle.checked ? 'block' : 'none'; - - // Rerank 设置 - document.getElementById('hly-rerank-enabled').checked = settings.rerank.enabled; - document.getElementById('hly-rerank-url').value = settings.rerank.url; - document.getElementById('hly-rerank-api-key').value = settings.rerank.apiKey; - const rerankModelSelect = document.getElementById('hly-rerank-model'); - if (rerankModelSelect.options.length === 0) { - const currentModel = settings.rerank.model; - if (currentModel) { - const option = new Option(currentModel, currentModel, true, true); - rerankModelSelect.add(option); - } - } - rerankModelSelect.value = settings.rerank.model; - document.getElementById('hly-rerank-top-n').value = settings.rerank.top_n; - document.getElementById('hly-rerank-hybrid-alpha').value = settings.rerank.hybrid_alpha; - document.getElementById('hly-rerank-notify').checked = settings.rerank.notify; - - - toggleCustomEndpointDocket(); -} - -/** - * 【重构】手动从UI保存所有设置。主要用于“存档封印”按钮,作为一种保险机制。 - * @param {boolean} isAutoSave - 标记是否为自动保存调用 - */ -function saveSettingsFromUI(isAutoSave = true) { - const container = document.getElementById('hly-modal-container'); - if (!container) return; - - const inputs = container.querySelectorAll('[data-setting-key]'); - - inputs.forEach(target => { - const key = target.dataset.settingKey; - if (!key) return; - - let value; - const type = target.dataset.type || 'string'; - - if (target.type === 'checkbox') { - value = target.checked; - } else if (target.type === 'radio') { - if (!target.checked) return; // 只处理选中的radio - value = target.value; - } else { - value = target.value; - } - - // 类型转换 - switch (type) { - case 'integer': - value = parseInt(value, 10); - break; - case 'float': - value = parseFloat(value); - break; - case 'boolean': - if (typeof value !== 'boolean') value = (value === 'true'); - break; - } - - // 直接调用核心更新函数,但不在这里重复记录日志 - const settings = HanlinyuanCore.getSettings(); - const keys = key.split('.'); - let current = settings; - for (let i = 0; i < keys.length - 1; i++) { - current = current[keys[i]] = current[keys[i]] || {}; - } - current[keys[keys.length - 1]] = value; - }); - - HanlinyuanCore.saveSettings(); - - if (!isAutoSave) { - log('【手动存档】所有设定已存档封印。', 'success'); - toastr.success('翰林院设定已存档封印。', '圣旨已达'); - } - // 自动保存的日志已在 updateAndSaveSetting 中处理,此处不再重复 -} - -function resetSettingsToUI() { - if (confirm('您确定要将所有设定恢复为出厂默认值吗?')) { - HanlinyuanCore.resetSettings(); - loadSettingsToUI(); - toastr.info('翰林院设定已重置为初始状态。', '诏曰'); - } -} - -async function updatePanelStatus() { - // 【V5.1 改造】根据锁定状态更新显示 - const isLocked = HanlinyuanCore.isSessionLocked(); - const charNameEl = document.getElementById('hly-current-character-name'); - const chatIdEl = document.getElementById('hly-current-chat-id'); - - if (isLocked) { - const lockedInfo = HanlinyuanCore.getLockedSessionInfo(); - charNameEl.textContent = '会话已锁定'; - chatIdEl.textContent = lockedInfo.id; - chatIdEl.title = `当前所有操作都将指向这个锁定的宝库:${lockedInfo.id}`; - charNameEl.classList.add('hly-locked-status'); - chatIdEl.classList.add('hly-locked-status'); - } else { - charNameEl.textContent = ContextUtils.getCharacterName(); - chatIdEl.textContent = ContextUtils.getChatId() || '无'; - chatIdEl.title = ''; - charNameEl.classList.remove('hly-locked-status'); - chatIdEl.classList.remove('hly-locked-status'); - } - - const countEl = document.getElementById('hly-current-vector-count'); - countEl.textContent = '...'; - try { - const count = await HanlinyuanCore.getVectorCount(); - countEl.textContent = count; - } catch (error) { - console.error('[翰林院-枢纽] 更新忆识数量失败:', error); - countEl.textContent = 'N/A'; - countEl.title = `无法获取总数: ${error.message}`; - } - - // 【V5.3 新增】显示上次凝识记录 - const recordEl = document.getElementById('hly-condensation-results'); - // 只有在没有进行中的预览时才更新记录 - if (recordEl && !recordEl.dataset.finalText) { - const settings = HanlinyuanCore.getSettings(); - const collectionId = HanlinyuanCore.getCollectionId(); - - if (settings.condensationHistory && settings.condensationHistory[collectionId]) { - const record = settings.condensationHistory[collectionId]; - // V5.4 - record.end is now always a number, so the text is simpler. - recordEl.innerHTML = `

上次已从第 ${record.start} 楼凝识至第 ${record.end} 楼。

`; - } else { - recordEl.innerHTML = `

可在此预览凝识结果。

`; - } - } -} - -async function testApi() { - toastr.info('正在测试神力连接...', '圣旨'); - try { - await HanlinyuanCore.testApiConnection(); - toastr.success('神力连接通畅!', '圣意'); - } catch (error) { - toastr.error(`神力连接失败: ${error.message}`, '警报'); - } -} - -/** - * 新增:获取并填充嵌入模型列表 - */ -async function fetchHLYEmbeddingModels() { - const modelSelect = document.getElementById('hly-embedding-model'); - const currentModel = modelSelect.value; // 保存当前选中的模型 - modelSelect.innerHTML = ''; - modelSelect.disabled = true; - - try { - log('开始获取模型列表...', 'info'); - const models = await HanlinyuanCore.fetchEmbeddingModels(); - modelSelect.innerHTML = ''; // 清空 - - if (models.length === 0) { - modelSelect.innerHTML = ''; - toastr.warn('未能获取到任何模型。', '翰林院启奏'); - log('未能获取到任何模型。', 'warn'); - return; - } - - models.forEach(modelId => { - const option = new Option(modelId, modelId); - modelSelect.add(option); - }); - - // 尝试恢复之前的选择 - if (models.includes(currentModel)) { - modelSelect.value = currentModel; - } else { - // 如果之前的模型不在新列表中,则默认选中第一个 - modelSelect.selectedIndex = 0; - } - - toastr.success(`成功获取 ${models.length} 个模型。`, '圣意'); - log(`成功获取 ${models.length} 个模型。`, 'success'); - - } catch (error) { - console.error('[翰林院-枢纽] 获取模型列表失败:', error); - toastr.error(`获取模型失败: ${error.message}`, '严重错误'); - log(`获取模型失败: ${error.message}`, 'error'); - modelSelect.innerHTML = ``; - } finally { - modelSelect.disabled = false; - } -} - -/** - * 新增:获取并填充Rerank模型列表 - */ -async function fetchHLYRerankModels() { - const modelSelect = document.getElementById('hly-rerank-model'); - const currentModel = modelSelect.value; - modelSelect.innerHTML = ''; - modelSelect.disabled = true; - - try { - log('开始获取Rerank模型列表...', 'info'); - const models = await HanlinyuanCore.fetchRerankModels(); - modelSelect.innerHTML = ''; - - if (models.length === 0) { - modelSelect.innerHTML = ''; - toastr.warn('未能获取到任何Rerank模型。', '翰林院启奏'); - log('未能获取到任何Rerank模型。', 'warn'); - return; - } - - models.forEach(modelId => { - const option = new Option(modelId, modelId); - modelSelect.add(option); - }); - - if (models.includes(currentModel)) { - modelSelect.value = currentModel; - } else { - modelSelect.selectedIndex = 0; - } - - toastr.success(`成功获取 ${models.length} 个Rerank模型。`, '圣意'); - log(`成功获取 ${models.length} 个Rerank模型。`, 'success'); - - } catch (error) { - console.error('[翰林院-枢纽] 获取Rerank模型列表失败:', error); - toastr.error(`获取Rerank模型失败: ${error.message}`, '严重错误'); - log(`获取Rerank模型失败: ${error.message}`, 'error'); - modelSelect.innerHTML = ``; - } finally { - modelSelect.disabled = false; - } -} - -async function purgeStorage() { - if (confirm('此操作将彻底清空当前角色的所有忆识(向量),且无法恢复。您确定要继续吗?')) { - toastr.info('正在清空宝库...', '圣旨'); - const success = await HanlinyuanCore.purgeStorage(); - if (success) { - toastr.success('宝库已清空。', '圣意'); - } else { - toastr.error('清空宝库失败。', '警报'); - } - await updatePanelStatus(); - } -} - -async function startCondensation() { - const resultsEl = document.getElementById('hly-condensation-results'); - const preprocessedText = resultsEl.dataset.finalText; - - // 【V5.3 新增】获取范围以供记录 - const layerStart = document.getElementById('hly-layer-start').value; - const layerEnd = document.getElementById('hly-layer-end').value; - const range = { start: parseInt(layerStart), end: parseInt(layerEnd) }; - - try { - // 路径一:如果经过了预览和编辑,直接处理最终文本 - if (preprocessedText && preprocessedText.trim()) { - log('检测到预览后待处理的文本,开始直接凝识...', 'info'); - toastr.info('正在处理您确认后的文书...', '圣旨'); - resultsEl.textContent = '正在处理预览后的文本...'; - - // 【V5.3 修改】传递范围 - const result = await HanlinyuanCore.ingestTextToHanlinyuan(preprocessedText, 'chat_history', `聊天记录 ${range.start}-${range.end}`, ()=>{}, null, log, ()=>{}, null, 0, range); - if (result.success) { - toastr.success(`文书已成功录入宝库,新增 ${result.count} 条忆识。`, '大功告成'); - log(`预览后文本录入成功,新增 ${result.count} 条忆识。`, 'success'); - const finalEnd = range.end === 0 ? getContext().chat.length : range.end; - resultsEl.textContent = `聊天记录从第 ${range.start} 楼到第 ${finalEnd} 楼已成功凝识,新增 ${result.count} 条忆识。`; - delete resultsEl.dataset.finalText; // 清理暂存数据 - } else { - throw new Error(result.error || '未知错误'); - } - } - // 路径二:用户未经过预览,按原流程处理 - else { - resultsEl.textContent = '正在采集消息...'; - toastr.info('正在准备凝识...', '圣旨'); - log('未检测到预览文本,按标准流程采集消息...', 'info'); - - const messages = HanlinyuanCore.getMessagesForCondensation(); - if (!messages || messages.length === 0) { - toastr.warning('未找到符合条件的消息可供凝识。', '翰林院启奏'); - resultsEl.textContent = '未找到符合条件的消息。'; - return; - } - - resultsEl.textContent = `已采集 ${messages.length} 条消息,开始凝识...`; - toastr.info(`已采集 ${messages.length} 条消息,开始凝识...`, '翰林院启奏'); - - // 【V5.3 修改】传递范围 - const result = await HanlinyuanCore.processCondensation(messages, log, range); - - if (result.success) { - toastr.success(`凝识完成!新增 ${result.count} 条忆识。`, '大功告成'); - const finalEnd = range.end === 0 ? getContext().chat.length : range.end; - resultsEl.textContent = `聊天记录从第 ${range.start} 楼到第 ${finalEnd} 楼已成功凝识,新增 ${result.count} 条忆识。`; - } else { - throw new Error(result.error || '未知错误'); - } - } - } catch (error) { - console.error('[翰林院-枢纽] 凝识过程发生错误:', error); - toastr.error(`凝识失败: ${error.message}`, '严重错误'); - resultsEl.textContent = `凝识失败: ${error.message}`; - } finally { - await updatePanelStatus(); - } -} - -// ===================================================================== -// ======================= 【新增】书库编纂相关函数 ======================= -// ===================================================================== - -/** - * 加载所有可用的世界书到“选择书库”下拉框 - */ -async function loadWorldbookList() { - const selectEl = document.getElementById('hly-hist-select-library'); - if (!selectEl) return; - - try { - log('正在获取可用书库列表...', 'info'); - const books = await Historiographer.getAvailableWorldbooks(); - selectEl.innerHTML = ''; // 清空并添加占位符 - - if (books.length === 0) { - selectEl.innerHTML = ''; - return; - } - - books.forEach(bookName => { - const option = new Option(bookName, bookName); - selectEl.add(option); - }); - log(`成功加载 ${books.length} 个书库。`, 'success'); - } catch (error) { - console.error('[翰林院-枢纽] 加载书库列表失败:', error); - log(`加载书库列表失败: ${error.message}`, 'error'); - selectEl.innerHTML = ''; - } -} - -/** - * 处理书库选择变化,联动更新条目下拉框 - */ -async function handleWorldbookSelectionChange() { - const librarySelect = document.getElementById('hly-hist-select-library'); - const entrySelect = document.getElementById('hly-hist-select-entry'); - const selectedBook = librarySelect.value; - - entrySelect.innerHTML = ''; - entrySelect.disabled = true; - - if (!selectedBook) { - entrySelect.innerHTML = ''; - return; - } - - try { - log(`正在为《${selectedBook}》获取条目列表...`, 'info'); - const entries = await Historiographer.getLoresForWorldbook(selectedBook); - entrySelect.innerHTML = ''; - - if (entries.length === 0) { - entrySelect.innerHTML = ''; - return; - } - - entries.forEach(entry => { - const option = new Option(`${entry.comment} (Key: ${entry.key})`, entry.key); - entrySelect.add(option); - }); - log(`成功加载 ${entries.length} 个条目。`, 'success'); - } catch (error) { - console.error(`[翰林院-枢纽] 加载《${selectedBook}》的条目失败:`, error); - log(`加载条目失败: ${error.message}`, 'error'); - entrySelect.innerHTML = ''; - } finally { - entrySelect.disabled = false; - } -} - -/** - * 【存根】开始书库编纂的核心函数 - */ -async function startHistoriography() { - const library = document.getElementById('hly-hist-select-library').value; - const entry = document.getElementById('hly-hist-select-entry').value; - const resultsEl = document.getElementById('hly-historiography-results'); - - if (!library || !entry) { - toastr.warning('请先选择一个书库和要编纂的条目。', '圣谕不明'); - return; - } - - resultsEl.textContent = `准备对《${library}》中的条目 (Key: ${entry}) 进行编纂...`; - toastr.info('编纂任务已开始...', '圣旨'); - log(`开始对《${library}》-${entry} 进行编纂...`, 'info'); - - try { - const result = await Historiographer.executeCompilation(library, entry); - if (result.success) { - const entrySelect = document.getElementById('hly-hist-select-entry'); - const entryName = entrySelect.options[entrySelect.selectedIndex].text; - const message = `《${library}》中的条目【${entryName}】已成功编纂入库。`; - resultsEl.textContent = message; - toastr.success('编纂任务已完成。', '大功告成'); - log(`对《${library}》中条目 (Key: ${entry}) 的编纂任务已完成。`, 'success'); - } else { - throw new Error(result.error || "未知的编纂错误"); - } - } catch (error) { - console.error('[翰林院-枢纽] 编纂过程发生错误:', error); - toastr.error(`编纂失败: ${error.message}`, '严重错误'); - resultsEl.textContent = `编纂失败: ${error.message}`; - } -} - -/** - * 修复:实现缺失的“查看宝库”功能 - */ -async function showStats() { - try { - log('用户请求查看宝库状态。', 'info'); - toastr.info('正在查询宝库状态...', '圣旨'); - - const count = await HanlinyuanCore.getVectorCount(); - const collectionId = HanlinyuanCore.getCollectionId(); - const settings = HanlinyuanCore.getSettings(); - - // 使用 pre 标签来保持格式 - const statsText = ` -
-翰林院宝库状态
---------------------
-集合ID: ${collectionId}
-忆识总数: ${count}
---------------------
-API端点: ${settings.retrieval.apiEndpoint}
-所用模型: ${settings.retrieval.embeddingModel}
-
- `; - - toastr.info(statsText, '宝库状态', { - timeOut: 15000, // 延长显示时间 - extendedTimeOut: 5000, - tapToDismiss: true, - closeButton: true, - }); - - log(`查看宝库状态成功:集合ID=${collectionId}, 忆识总数=${count}`, 'success'); - - } catch (error) { - console.error('[翰林院-枢纽] 查询宝库状态失败:', error); - toastr.error(`查询宝库状态失败: ${error.message}`, '严重错误'); - log(`查询宝库状态失败: ${error.message}`, 'error'); - } -} - -/** - * 新增:显示和编辑内容排除规则的弹窗 - */ -function showExclusionRulesModal() { - const settings = HanlinyuanCore.getSettings(); - const rules = settings.condensation.exclusionRules || []; - - // Function to create a single rule row HTML - const createRuleRowHtml = (rule = { start: '', end: '' }, index) => ` -
- - - - -
- `; - - // Build the initial HTML for all existing rules - const rulesHtml = rules.map(createRuleRowHtml).join(''); - - const modalHtml = ` -
-

在这里定义需要从提取内容中排除的文本片段。例如,排除HTML注释,可以设置开始字符为 \`\`。

-
${rulesHtml}
- -
- - `; - - showHtmlModal('编辑内容排除规则', modalHtml, { - okText: '保存规则', - onOk: (dialogElement) => { - const newRules = []; - dialogElement.find('.hly-exclusion-rule-row').each(function() { - const start = $(this).find('input').eq(0).val().trim(); - const end = $(this).find('input').eq(1).val().trim(); - if (start && end) { - newRules.push({ start, end }); - } - }); - updateAndSaveSetting('condensation.exclusionRules', newRules); - toastr.success('内容排除规则已保存。', '圣旨已达'); - } - }); - - // Event listeners for the modal content (add/delete) - const modalContent = document.getElementById('hly-exclusion-rules-container'); - const rulesList = modalContent.querySelector('#hly-rules-list'); - - // Add rule button - modalContent.querySelector('#hly-add-rule-btn').addEventListener('click', () => { - const newIndex = rulesList.children.length; - const newRowHtml = createRuleRowHtml({ start: '', end: '' }, newIndex); - rulesList.insertAdjacentHTML('beforeend', newRowHtml); - }); - - // Delete rule button (using event delegation) - rulesList.addEventListener('click', (event) => { - if (event.target.classList.contains('hly-delete-rule-btn')) { - event.target.closest('.hly-exclusion-rule-row').remove(); - } - }); -} - -function previewCondensation() { - const resultsEl = document.getElementById('hly-condensation-results'); - try { - // 1. 获取UI设置和新规则 - const settings = HanlinyuanCore.getSettings(); - const exclusionRules = settings.condensation.exclusionRules || []; - const overrideMessageTypes = { - user: document.getElementById('hly-include-user').checked, - ai: document.getElementById('hly-include-ai').checked, - }; - const useTagExtraction = document.getElementById('hly-tag-extraction-toggle').checked; - const tagsToExtract = useTagExtraction - ? document.getElementById('hly-tag-input').value.split(',').map(t => t.trim()).filter(Boolean) - : []; - - // 2. 获取原始消息 - const messages = HanlinyuanCore.getMessagesForCondensation(overrideMessageTypes); - - if (!messages || messages.length === 0) { - resultsEl.textContent = '根据当前勾选条件,未找到符合的消息可供预览。'; - toastr.warning('未找到符合条件的消息。', '翰林院启奏'); - return; - } - - // 3. 处理消息内容 - const processedMessages = messages.map((msg, index) => { - let content; - - // 【V5.2 最终规则】用户消息不受标签提取和内容排除的任何影响 - if (msg.is_user) { - content = msg.mes; - } - // AI消息则遵循所有规则 - else { - if (useTagExtraction && tagsToExtract.length > 0) { - const blocks = extractBlocksByTags(msg.mes, tagsToExtract); - content = blocks.join('\n\n'); - } else { - content = msg.mes; - } - // 内容排除规则只对AI消息生效 - content = applyExclusionRules(content, exclusionRules); - } - - return { - id: `preview-item-${index}`, - name: msg.name, - content: content.trim(), - }; - }).filter(item => item.content); // 过滤掉处理后内容为空的条目 - - if (processedMessages.length === 0) { - resultsEl.textContent = '根据标签提取或内容排除条件,未找到任何有效内容。'; - toastr.warning('根据标签提取或内容排除条件,未找到任何有效内容。', '翰林院启奏'); - return; - } - - // 4. 构建编辑器HTML (V3 - 优化布局和交互) - const editorHtml = processedMessages.map((item, index) => ` -
-
- - 第 ${index + 1} 楼: [${item.name}] - -
- -
-
- -
- `).join(''); - - // 5. 显示模态窗口 - showHtmlModal('预览并编辑凝识内容', `
${editorHtml}
`, { - okText: '确认并更新预览', - onOk: (dialogElement) => { - const finalContent = []; - dialogElement.find('.hly-preview-item-v2').each(function() { - const text = $(this).find('.hly-preview-textarea').val(); - if (text.trim()) { // 只保留非空内容 - finalContent.push(text); - } - }); - - const finalText = finalContent.join('\n\n---\n\n'); - // 更新预览区UI - const layerStart = document.getElementById('hly-layer-start').value; - const layerEnd = document.getElementById('hly-layer-end').value; - resultsEl.textContent = `已选择 ${layerStart} 楼到 ${layerEnd} 楼的内容(共 ${finalContent.length} 条有效条目),请点击“开始凝识”进入自动向量化流程。`; - // 将最终文本暂存到dataset中,供“开始凝识”使用 - resultsEl.dataset.finalText = finalText; - toastr.success('预览内容已更新,可随时开始凝识。', '圣旨已达'); - } - }); - - // 6. 为新生成的删除按钮绑定事件 (V2) - $('.hly-preview-delete-btn-v2').on('click', function(e) { - e.preventDefault(); - const targetId = $(this).data('target'); - $(`#${targetId}`).remove(); - }); - - } catch (error) { - console.error('[翰林院-枢纽] 预览过程发生错误:', error); - resultsEl.textContent = `预览失败: ${error.message}`; - toastr.error(`预览失败: ${error.message}`, '严重错误'); - } -} - -/** - * 新增:日志记录函数 - * @param {string} message - 要记录的消息 - * @param {string} type - 'info', 'success', 'error', 'warn' - */ -function log(message, type = 'info') { - const logOutput = document.getElementById('hly-log-output'); - if (!logOutput) return; - - const p = document.createElement('p'); - const timestamp = new Date().toLocaleTimeString(); - - let icon = 'fa-circle-info'; - let colorClass = 'log-info'; - - switch (type) { - case 'success': - icon = 'fa-check-circle'; - colorClass = 'log-success'; - break; - case 'error': - icon = 'fa-times-circle'; - colorClass = 'log-error'; - break; - case 'warn': - icon = 'fa-exclamation-triangle'; - colorClass = 'log-warn'; - break; - } - - p.className = `hly-log-entry ${colorClass}`; - p.innerHTML = ` [${timestamp}] ${message}`; - - // 移除初始的占位符 - const placeholder = logOutput.querySelector('.hly-log-placeholder'); - if (placeholder) { - placeholder.remove(); - } - - logOutput.appendChild(p); - logOutput.scrollTop = logOutput.scrollHeight; // 自动滚动到底部 -} - - -/** - * 新增:处理手动录入的文本 - */ -async function ingestManualText() { - const textArea = document.getElementById('hly-manual-text'); - const text = textArea.value.trim(); - - if (!text) { - toastr.warning('录入内容不能为空。', '翰林院启奏'); - log('用户尝试录入空文本。', 'warn'); - return; - } - - log(`收到手动录入请求,文本长度: ${text.length}`, 'info'); - toastr.info('正在处理您提交的文书...', '圣旨'); - - try { - const result = await HanlinyuanCore.ingestTextToHanlinyuan(text, 'manual', '手动录入'); - if (result.success) { - toastr.success(`文书已成功录入宝库,新增 ${result.count} 条忆识。`, '大功告成'); - log(`手动录入成功,新增 ${result.count} 条忆识。`, 'success'); - textArea.value = ''; // 清空文本域 - } else { - throw new Error(result.error || '未知错误'); - } - } catch (error) { - console.error('[翰林院-枢纽] 手动录入过程发生错误:', error); - toastr.error(`文书录入失败: ${error.message}`, '严重错误'); - log(`手动录入失败: ${error.message}`, 'error'); - } finally { - await updatePanelStatus(); - } -} +const _0x34a9aa=_0x2a3e;(function(_0x2f1c95,_0x1baf57){const _0x5eb2ee=_0x2a3e,_0xe7c316=_0x2f1c95();while(!![]){try{const _0x5f506e=-parseInt(_0x5eb2ee(0xd9))/0x1+-parseInt(_0x5eb2ee(0x17c))/0x2+-parseInt(_0x5eb2ee(0x127))/0x3*(-parseInt(_0x5eb2ee(0x1a7))/0x4)+parseInt(_0x5eb2ee(0x1df))/0x5*(parseInt(_0x5eb2ee(0x1b8))/0x6)+parseInt(_0x5eb2ee(0x163))/0x7+parseInt(_0x5eb2ee(0x1b1))/0x8+parseInt(_0x5eb2ee(0x18d))/0x9;if(_0x5f506e===_0x1baf57)break;else _0xe7c316['push'](_0xe7c316['shift']());}catch(_0x375de8){_0xe7c316['push'](_0xe7c316['shift']());}}}(_0x22ab,0x844a7));import{getContext}from'/scripts/extensions.js';import*as _0x1750b8 from'../core/rag-processor.js';import*as _0x41ee77 from'../core/historiographer.js';import*as _0x3e1193 from'../core/utils/context-utils.js';import*as _0x58a2b6 from'../core/ingestion-manager.js';import{showContentModal,showHtmlModal}from'./page-window.js';function _0x22ab(){const _0x5cf9be=['from','请选择一个书库...','清空宝库失败。','hly-overlap-size','\x20块继续录入。','开始获取Rerank模型列表...','children','》中条目\x20(Key:\x20','ingestTextToHanlinyuan','未能获取到任何Rerank模型。','scripts/extensions/third-party/ST-Amily2-Chat-Optimisation/HanLin.md','signal','\x22\x20placeholder=\x22开始字符,\x20如\x20`。

\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','您确定要将所有设定恢复为出厂默认值吗?','checkbox','integer','hlyLog','hly-modal-container','\x20楼:\x20[','加载失败','loadProgress','fas\x20fa-lock-open','\x20个Rerank模型。','hanlinyuan-ingest-novel-controls','fetchHLYRerankModels','hanlinyuan-ingest-novel-file-input','hly-rerank-top-n','此书库为空','resetHLYSettings','display','[翰林院-枢纽]\x20获取Rerank模型列表失败:','[翰林院-枢纽]\x20核心法典未能提供初始化圣旨!','】已成功编纂入库。','hly-locked-status','根据标签提取或内容排除条件,未找到任何有效内容。','》中的条目\x20(Key:\x20','','hly-injection-role','finalText','检测到预览后待处理的文本,开始直接凝识...','amily2_open_rag_palace','成功获取\x20','未找到任何书库','hanlinyuan-ingest-progress-bar','内容排除规则已保存。','正在处理预览后的文本...','none','未知错误','\x22\x20title=\x22删除此条\x22>×\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20','float','hanlinyuan-ingest-progress-container','radio',',\x20忆识总数=','hly-retrieval-enabled','chat_history','getCharacterName','className','position','翰林院使用教程','任务完成!成功录入\x20','锁定会话','retrieval','根据当前勾选条件,未找到符合的消息可供预览。','预览内容已更新,可随时开始凝识。','hly-hist-select-entry','当前所有操作都将指向这个锁定的宝库:','innerHTML','hly-layer-start','\x20个条目。','\x20进行编纂...','initialize','-tab','请先选择一个\x20.txt\x20文件','此操作将彻底清空当前角色的所有忆识(向量),且无法恢复。您确定要继续吗?','聊天记录\x20','manual','fas\x20fa-lock','hly-api-endpoint','key','点击以解锁,让翰林院跟随当前角色','hly-current-vector-count','message','开始获取模型列表...','》获取条目列表...','processedChunks','\x20楼。

','custom','\x20楼已成功凝识,新增\x20','val','.hly-exclusion-rule-row','hly-condensation-enabled','用户尝试录入空文本。','getMessagesForCondensation','会话已锁定到宝库:\x20','815283jHBuEm','正在清空宝库...','start','info','\x20条消息,开始凝识...','','已选择\x20','azure','正在准备凝识...','未选择文件','length','未找到符合条件的消息。','preventDefault','active','total','startHLYHistoriography','','condensation','includes','toLocaleTimeString','warn','hanlinyuan-ingest-novel-start','name','\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','编纂失败:\x20','正在处理您提交的文书...','classList','翰林院启奏','model','split','hly-tag-input-container','可在此预览凝识结果。

','tags','fa-circle-info','%。是否从上次中断之处继续?','stringify','严重错误','手动录入失败:\x20','222MQxHzD','use\x20strict','用户请求查看宝库状态。','请先选择一个书库和要编纂的条目。','ingestHLYManualText','is_user','[翰林院-枢纽]\x20加载书库列表失败:','手动录入','count','.hly-tab-pane','input','hly-injection-depth','hly-batch-size','hly-rerank-model','预览失败:\x20','加载条目失败:\x20','成功加载\x20','hly-match-threshold','preview-item-','hly-rerank-api-key','\x20条有效条目),请点击“开始凝识”进入自动向量化流程。','log-info','forEach','#hly-add-rule-btn','AbortError','任务已中止。','','\x27\x20已更新为:\x20','#hly-rules-list','[翰林院-枢纽]\x20已成功连接各部,政令畅通。','join','value','rerank','chat','comment','手动录入成功,新增\x20','toggle','layerStart','trim','injection','hly-injection-template','未知的编纂错误','正在处理您确认后的文书...','hly-max-results','请先选择书库','error','[翰林院-枢纽]\x20凝识过程发生错误:','input[name=\x22hly-injection-position\x22][value=\x22','add','[翰林院-枢纽]\x20编纂过程发生错误:','会话已锁定','tab','hly-condensation-results','toggleSessionLock','聊天记录从第\x20','','selectedIndex','mes','fa-exclamation-triangle','\x0a\x0a---\x0a\x0a','4640041wvuFzE','testApiConnection','queryMessageCount','getLockedSessionInfo','log-warn','fetchRerankModels'];_0x22ab=function(){return _0x5cf9be;};return _0x22ab();}import{extractBlocksByTags,applyExclusionRules}from'../core/utils/rag-tag-extractor.js';_0x34a9aa(0x128);function setupGlobalEventHandlers(){const _0x5d2a10=_0x34a9aa;window['saveHLYSettings']=()=>saveSettingsFromUI(![]),window[_0x5d2a10(0x203)]=resetSettingsToUI,window[_0x5d2a10(0x1b2)]=testApi,window['fetchHLYEmbeddingModels']=fetchHLYEmbeddingModels,window[_0x5d2a10(0x1ff)]=fetchHLYRerankModels,window['updateHLYMemoryCount']=updatePanelStatus,window['purgeHLYStorage']=purgeStorage,window['startHLYCondensation']=startCondensation,window['previewHLYCondensation']=previewCondensation,window[_0x5d2a10(0x12b)]=ingestManualText,window[_0x5d2a10(0x1f7)]=log,window['showHLYStats']=showStats,window[_0x5d2a10(0xe8)]=startHistoriography;}function updateAndSaveSetting(_0x4f6a9a,_0x348cf9){const _0x52b2c4=_0x34a9aa,_0x2ae122=_0x1750b8[_0x52b2c4(0x1e1)]();if(!_0x2ae122)return;const _0xdd281a=_0x4f6a9a[_0x52b2c4(0x11e)]('.');let _0x87009b=_0x2ae122;for(let _0x4c93d9=0x0;_0x4c93d9<_0xdd281a[_0x52b2c4(0xe3)]-0x1;_0x4c93d9++){_0x87009b=_0x87009b[_0xdd281a[_0x4c93d9]]=_0x87009b[_0xdd281a[_0x4c93d9]]||{};}_0x87009b[_0xdd281a[_0xdd281a[_0x52b2c4(0xe3)]-0x1]]=_0x348cf9,_0x1750b8[_0x52b2c4(0x1a1)](),log('[自动保存]\x20设置项\x20\x27'+_0x4f6a9a+_0x52b2c4(0x142)+JSON[_0x52b2c4(0x124)](_0x348cf9),_0x52b2c4(0x1d3));}function bindAutoSaveEvents(){const _0x4fc348=_0x34a9aa,_0x4b25c6=document['getElementById'](_0x4fc348(0x1f8));if(!_0x4b25c6)return;_0x4b25c6[_0x4fc348(0x1b0)](_0x4fc348(0x18f),_0x5d6aac=>{const _0x5e1ff7=_0x4fc348,_0x2da7d8=_0x5d6aac[_0x5e1ff7(0x104)],_0x1e3f45=_0x2da7d8[_0x5e1ff7(0x188)][_0x5e1ff7(0x1ef)];if(!_0x1e3f45)return;let _0x588b9a;const _0x2bf221=_0x2da7d8[_0x5e1ff7(0x188)]['type']||_0x5e1ff7(0x1c7);if(_0x2da7d8[_0x5e1ff7(0x1a8)]===_0x5e1ff7(0x1f5))_0x588b9a=_0x2da7d8[_0x5e1ff7(0x1a4)];else{if(_0x2da7d8[_0x5e1ff7(0x1a8)]==='radio'){if(_0x2da7d8['checked']){const _0x411feb=_0x4b25c6[_0x5e1ff7(0x1d0)](_0x5e1ff7(0x1bb)+_0x2da7d8['name']+'\x22]'),_0x384def=Array[_0x5e1ff7(0x169)](_0x411feb)[_0x5e1ff7(0x1c0)](_0x3501b3=>_0x3501b3[_0x5e1ff7(0x1a4)]);_0x588b9a=_0x384def[_0x5e1ff7(0x146)];}else return;}else _0x588b9a=_0x2da7d8[_0x5e1ff7(0x146)];}switch(_0x2bf221){case _0x5e1ff7(0x1f6):_0x588b9a=parseInt(_0x588b9a,0xa);break;case _0x5e1ff7(0x218):_0x588b9a=parseFloat(_0x588b9a);break;case _0x5e1ff7(0x1e4):typeof _0x588b9a!==_0x5e1ff7(0x1e4)&&(_0x588b9a=_0x588b9a===_0x5e1ff7(0x108));break;}if(_0x2da7d8[_0x5e1ff7(0x1a8)]===_0x5e1ff7(0x21a)&&!_0x2da7d8[_0x5e1ff7(0x1a4)])return;updateAndSaveSetting(_0x1e3f45,_0x588b9a);});}export function bindHanlinyuanEvents(){const _0x5745e2=_0x34a9aa,_0x506a83=getContext();if(!_0x506a83){console[_0x5745e2(0x154)](_0x5745e2(0xfe));return;}setupGlobalEventHandlers(),bindPanelToggleEvents(),bindInternalUIEvents(),bindTutorialEvents(),bindAutoSaveEvents(),bindSessionLockEvent();if(_0x1750b8[_0x5745e2(0x22d)])_0x1750b8[_0x5745e2(0x22d)]();else{console[_0x5745e2(0x154)](_0x5745e2(0x206));return;}loadSettingsToUI(),loadWorldbookList(),log(_0x5745e2(0x144),_0x5745e2(0xdc));const _0x47e735=document['getElementById'](_0x5745e2(0x200)),_0x43665e=document[_0x5745e2(0x1bf)](_0x5745e2(0x10a)),_0x567273=document[_0x5745e2(0x1bf)](_0x5745e2(0xee)),_0x36275c=document[_0x5745e2(0x1bf)]('hanlinyuan-ingest-abort'),_0x35e8f7=document['getElementById'](_0x5745e2(0x219)),_0x1c1c93=document[_0x5745e2(0x1bf)](_0x5745e2(0x212)),_0x33bafb=document[_0x5745e2(0x1bf)]('hanlinyuan-ingest-status'),_0x2a937e=document['getElementById'](_0x5745e2(0x1fe));let _0x5b28c6=null,_0x4b415c=null;_0x47e735['addEventListener']('change',_0x112de2=>{const _0x230c42=_0x5745e2;_0x5b28c6=_0x112de2['target'][_0x230c42(0x1a5)][0x0],_0x5b28c6?(_0x43665e[_0x230c42(0x1ed)]=_0x5b28c6[_0x230c42(0xef)],_0x43665e[_0x230c42(0x189)]=_0x5b28c6[_0x230c42(0xef)]):_0x43665e[_0x230c42(0x1ed)]='未选择文件';}),_0x567273[_0x5745e2(0x1b0)](_0x5745e2(0x18e),async()=>{const _0x2851e6=_0x5745e2;if(!_0x5b28c6){toastr['warning'](_0x2851e6(0x22f));return;}let _0x58f60f=0x0;const _0x3ba3fc=_0x58a2b6[_0x2851e6(0x1e3)](_0x5b28c6),_0x53052d=_0x58a2b6[_0x2851e6(0x1fb)](_0x3ba3fc);if(_0x53052d){const _0x1169a8=(_0x53052d['processedChunks']/_0x53052d[_0x2851e6(0x196)]*0x64)['toFixed'](0x1),_0x19459c=confirm('启禀大人,发现此书上次录入已完成\x20'+_0x1169a8+_0x2851e6(0x123));_0x19459c?(_0x58f60f=_0x53052d[_0x2851e6(0x23b)],toastr[_0x2851e6(0xdc)]('遵命,将从第\x20'+(_0x58f60f+0x1)+_0x2851e6(0x16e),_0x2851e6(0x197)),log(_0x2851e6(0x1c9)+_0x3ba3fc+_0x2851e6(0x1e6)+_0x58f60f+'\x20块开始。',_0x2851e6(0xdc))):(_0x58a2b6[_0x2851e6(0x1d5)](_0x3ba3fc),toastr[_0x2851e6(0xdc)]('遵命,将从头开始录入此书。','圣旨已达'),log('[断点续传]\x20用户选择放弃旧任务\x20'+_0x3ba3fc+',重新开始。',_0x2851e6(0xed)));}_0x4b415c=new AbortController();const _0x17efb7=_0x4b415c[_0x2851e6(0x175)];_0x2a937e[_0x2851e6(0x1de)]['display']=_0x2851e6(0x215),_0x35e8f7[_0x2851e6(0x1de)][_0x2851e6(0x204)]='block',_0x33bafb[_0x2851e6(0x1ed)]='正在读取文件...',_0x1c1c93[_0x2851e6(0x146)]=0x0;try{const _0x5efe7a=await _0x5b28c6[_0x2851e6(0x18b)](),_0x401bcd=_0x411fb6=>{const _0x5c6c23=_0x2851e6;_0x33bafb['textContent']=_0x5c6c23(0x10c)+_0x411fb6[_0x5c6c23(0x238)]+'\x20('+_0x411fb6[_0x5c6c23(0x1aa)]+'/'+_0x411fb6[_0x5c6c23(0xe7)]+')',_0x1c1c93[_0x5c6c23(0x146)]=_0x411fb6[_0x5c6c23(0x1aa)]/_0x411fb6['total']*0x64;},_0x2f33d3=()=>{const _0x547377=_0x2851e6;updatePanelStatus(),log('[实时刷新]\x20批次完成,忆识总数已更新。',_0x547377(0xdc));},_0x48c08c=await _0x1750b8[_0x2851e6(0x172)](_0x5efe7a,'novel',_0x5b28c6[_0x2851e6(0xef)],_0x401bcd,_0x17efb7,log,_0x2f33d3,_0x3ba3fc,_0x58f60f);if(_0x48c08c[_0x2851e6(0x1d3)])toastr[_0x2851e6(0x1d3)](_0x2851e6(0x1e0)+_0x48c08c[_0x2851e6(0x12f)]+'\x20个知识块'),_0x33bafb[_0x2851e6(0x1ed)]=_0x2851e6(0x222)+_0x48c08c['count']+'\x20个知识块。',_0x1c1c93[_0x2851e6(0x146)]=0x64,updatePanelStatus();else throw new Error(_0x48c08c[_0x2851e6(0x154)]||'未知错误');}catch(_0x529ea8){_0x529ea8[_0x2851e6(0xef)]===_0x2851e6(0x13f)?(toastr[_0x2851e6(0xdc)]('任务已由用户中止。进度已保存,可随时继续。'),_0x33bafb[_0x2851e6(0x1ed)]=_0x2851e6(0x140)):(toastr[_0x2851e6(0x154)]('录入失败:\x20'+_0x529ea8[_0x2851e6(0x238)]+_0x2851e6(0x1ad)),_0x33bafb[_0x2851e6(0x1ed)]=_0x2851e6(0xf9)+_0x529ea8['message']);}finally{setTimeout(()=>{const _0x379c5a=_0x2851e6;_0x2a937e[_0x379c5a(0x1de)][_0x379c5a(0x204)]=_0x379c5a(0xf8),_0x35e8f7[_0x379c5a(0x1de)][_0x379c5a(0x204)]=_0x379c5a(0x215),_0x47e735[_0x379c5a(0x146)]='',_0x5b28c6=null,_0x43665e[_0x379c5a(0x1ed)]=_0x379c5a(0xe2);},0xbb8);}}),_0x36275c[_0x5745e2(0x1b0)]('click',()=>{const _0x4436f6=_0x5745e2;_0x4b415c&&_0x4b415c[_0x4436f6(0x187)]();});}function bindSessionLockEvent(){const _0x35824c=_0x34a9aa,_0x2c13a8=document[_0x35824c(0x1bf)](_0x35824c(0x1b7));if(!_0x2c13a8)return;_0x2c13a8['addEventListener'](_0x35824c(0x18e),()=>{const _0x1edf09=_0x35824c,_0x43142d=_0x1750b8[_0x1edf09(0x15c)]();updateSessionLockUI(_0x43142d);if(_0x43142d){const _0x2b031c=_0x1750b8[_0x1edf09(0x166)]();toastr[_0x1edf09(0x1d3)]('会话已锁定到:\x20'+_0x2b031c['id'],_0x1edf09(0x1c4)),log(_0x1edf09(0xd8)+_0x2b031c['id'],_0x1edf09(0x1d3));}else toastr[_0x1edf09(0xdc)]('会话已解锁,将跟随当前角色。','诏曰'),log(_0x1edf09(0x1c5),'info');updatePanelStatus();}),updateSessionLockUI(_0x1750b8[_0x35824c(0xff)]());}function _0x2a3e(_0x424898,_0x4029f0){const _0x22ab15=_0x22ab();return _0x2a3e=function(_0x2a3ec8,_0x19ddad){_0x2a3ec8=_0x2a3ec8-0xd3;let _0x459762=_0x22ab15[_0x2a3ec8];return _0x459762;},_0x2a3e(_0x424898,_0x4029f0);}function updateSessionLockUI(_0x2c99e5){const _0x205ebf=_0x34a9aa,_0x45a59e=document[_0x205ebf(0x1bf)](_0x205ebf(0x1b7));if(!_0x45a59e)return;const _0x3511e5=_0x45a59e[_0x205ebf(0x115)]('i'),_0x5465fb=_0x45a59e['querySelector'](_0x205ebf(0x1cc));_0x2c99e5?(_0x45a59e[_0x205ebf(0x11b)]['add'](_0x205ebf(0xe6)),_0x3511e5[_0x205ebf(0x21f)]=_0x205ebf(0x233),_0x5465fb[_0x205ebf(0x1ed)]=_0x205ebf(0x109),_0x45a59e[_0x205ebf(0x189)]=_0x205ebf(0x236)):(_0x45a59e[_0x205ebf(0x11b)][_0x205ebf(0xf4)](_0x205ebf(0xe6)),_0x3511e5[_0x205ebf(0x21f)]=_0x205ebf(0x1fc),_0x5465fb['textContent']=_0x205ebf(0x223),_0x45a59e[_0x205ebf(0x189)]='点击以锁定,让翰林院固定操作当前角色的宝库');}function bindPanelToggleEvents(){const _0x3338a8=_0x34a9aa,_0x2f7c52=document[_0x3338a8(0x1bf)](_0x3338a8(0x20f));if(_0x2f7c52){}}function bindTutorialEvents(){const _0x504026=_0x34a9aa,_0x192654=document[_0x504026(0x1bf)]('amily2_open_hanlin_tutorial');_0x192654&&_0x192654[_0x504026(0x1b0)](_0x504026(0x18e),()=>{const _0x416253=_0x504026;showContentModal(_0x416253(0x221),_0x416253(0x174));});}function bindInternalUIEvents(){const _0x589c4d=_0x34a9aa,_0xe3d428=document[_0x589c4d(0x1d0)]('.hly-nav-item');_0xe3d428[_0x589c4d(0x13d)](_0x42f33a=>{const _0x23a7ac=_0x589c4d;_0x42f33a[_0x23a7ac(0x1b0)]('click',()=>{const _0x7049bb=_0x23a7ac,_0x18d7f9=_0x42f33a[_0x7049bb(0x188)][_0x7049bb(0x15a)],_0x20107c=_0x7049bb(0x10b)+_0x18d7f9+_0x7049bb(0x22e);document[_0x7049bb(0x1d0)](_0x7049bb(0x130))[_0x7049bb(0x13d)](_0x377ed3=>{const _0x34a6fd=_0x7049bb;_0x377ed3['classList'][_0x34a6fd(0x14b)](_0x34a6fd(0xe6),_0x377ed3['id']===_0x20107c);}),_0xe3d428[_0x7049bb(0x13d)](_0x56dd80=>_0x56dd80['classList'][_0x7049bb(0x14b)](_0x7049bb(0xe6),_0x56dd80===_0x42f33a));});});const _0x598d14=document[_0x589c4d(0x1bf)](_0x589c4d(0x234));_0x598d14&&_0x598d14[_0x589c4d(0x1b0)](_0x589c4d(0x18f),toggleCustomEndpointDocket);const _0x40af14=document[_0x589c4d(0x1d0)](_0x589c4d(0x178));_0x40af14[_0x589c4d(0x13d)](_0x5219d5=>{const _0x2c22b6=_0x589c4d;_0x5219d5[_0x2c22b6(0x1b0)](_0x2c22b6(0x18f),toggleInjectionDetails);});const _0x41dc34=document[_0x589c4d(0x1bf)](_0x589c4d(0x1eb)),_0x2cb1a6=document[_0x589c4d(0x1bf)](_0x589c4d(0x11f));_0x41dc34&&_0x2cb1a6&&_0x41dc34[_0x589c4d(0x1b0)](_0x589c4d(0x18f),()=>{const _0x195067=_0x589c4d;_0x2cb1a6['style'][_0x195067(0x204)]=_0x41dc34[_0x195067(0x1a4)]?'block':_0x195067(0x215);});const _0x45a57f=document['getElementById'](_0x589c4d(0xf1));_0x45a57f&&_0x45a57f[_0x589c4d(0x1b0)]('change',handleWorldbookSelectionChange);const _0x20abd7=document[_0x589c4d(0x1bf)]('hly-exclusion-rules-btn');_0x20abd7&&_0x20abd7[_0x589c4d(0x1b0)](_0x589c4d(0x18e),showExclusionRulesModal);}function toggleInjectionDetails(){const _0x10fc24=_0x34a9aa,_0x17621d=document[_0x10fc24(0x115)](_0x10fc24(0xf5))[_0x10fc24(0x146)],_0x8f97e=document[_0x10fc24(0x1bf)](_0x10fc24(0x132)),_0xa5eb66=document[_0x10fc24(0x1bf)](_0x10fc24(0x20c)),_0x4e6bc0=_0x17621d==='1';_0x8f97e[_0x10fc24(0x19e)]=!_0x4e6bc0,_0xa5eb66[_0x10fc24(0x19e)]=!_0x4e6bc0;}function toggleCustomEndpointDocket(){const _0x1fdcd9=_0x34a9aa,_0x2723b8=document[_0x1fdcd9(0x1bf)](_0x1fdcd9(0x234))[_0x1fdcd9(0x146)],_0x31f9e9=document[_0x1fdcd9(0x1bf)]('hly-custom-endpoint-docket');_0x31f9e9&&(_0x31f9e9[_0x1fdcd9(0x1de)][_0x1fdcd9(0x204)]=_0x2723b8===_0x1fdcd9(0x23d)||_0x2723b8===_0x1fdcd9(0xe0)?_0x1fdcd9(0x105):_0x1fdcd9(0x215));}function loadSettingsToUI(){const _0x53ccfe=_0x34a9aa,_0x322a13=_0x1750b8[_0x53ccfe(0x1e1)]();if(!_0x322a13)return;document[_0x53ccfe(0x1bf)](_0x53ccfe(0x21c))[_0x53ccfe(0x1a4)]=_0x322a13[_0x53ccfe(0x224)][_0x53ccfe(0x199)],document['getElementById']('hly-api-endpoint')[_0x53ccfe(0x146)]=_0x322a13[_0x53ccfe(0x224)][_0x53ccfe(0x19b)],document['getElementById'](_0x53ccfe(0x17a))[_0x53ccfe(0x146)]=_0x322a13['retrieval']['customApiUrl'],document[_0x53ccfe(0x1bf)]('hly-api-key')[_0x53ccfe(0x146)]=_0x322a13[_0x53ccfe(0x224)][_0x53ccfe(0x1ce)];const _0x2b222e=document[_0x53ccfe(0x1bf)](_0x53ccfe(0x1ec));if(_0x2b222e['options'][_0x53ccfe(0xe3)]===0x0){const _0x30c757=_0x322a13[_0x53ccfe(0x224)]['embeddingModel'],_0x3216ca=new Option(_0x30c757,_0x30c757,!![],!![]);_0x2b222e[_0x53ccfe(0x157)](_0x3216ca);}_0x2b222e[_0x53ccfe(0x146)]=_0x322a13[_0x53ccfe(0x224)]['embeddingModel'],document[_0x53ccfe(0x1bf)](_0x53ccfe(0xf6))[_0x53ccfe(0x1a4)]=_0x322a13[_0x53ccfe(0x224)][_0x53ccfe(0x185)],document[_0x53ccfe(0x1bf)]('hly-chunk-size')[_0x53ccfe(0x146)]=_0x322a13[_0x53ccfe(0x114)]['chunkSize'],document[_0x53ccfe(0x1bf)](_0x53ccfe(0x16d))[_0x53ccfe(0x146)]=_0x322a13[_0x53ccfe(0x114)][_0x53ccfe(0xf7)],document['getElementById'](_0x53ccfe(0x138))[_0x53ccfe(0x146)]=_0x322a13[_0x53ccfe(0x114)]['matchThreshold'],document['getElementById'](_0x53ccfe(0x113))['value']=_0x322a13[_0x53ccfe(0x114)][_0x53ccfe(0x165)],document[_0x53ccfe(0x1bf)](_0x53ccfe(0x152))[_0x53ccfe(0x146)]=_0x322a13[_0x53ccfe(0x114)]['maxResults'],document[_0x53ccfe(0x1bf)](_0x53ccfe(0x133))[_0x53ccfe(0x146)]=_0x322a13['retrieval'][_0x53ccfe(0x192)],document[_0x53ccfe(0x1bf)](_0x53ccfe(0x14f))[_0x53ccfe(0x146)]=_0x322a13[_0x53ccfe(0x14e)][_0x53ccfe(0x100)];const _0x1ee224=document[_0x53ccfe(0x115)](_0x53ccfe(0x156)+_0x322a13[_0x53ccfe(0x14e)][_0x53ccfe(0x220)]+'\x22]');_0x1ee224&&(_0x1ee224[_0x53ccfe(0x1a4)]=!![]);document[_0x53ccfe(0x1bf)](_0x53ccfe(0x132))['value']=_0x322a13[_0x53ccfe(0x14e)][_0x53ccfe(0x1c2)],document['getElementById'](_0x53ccfe(0x20c))[_0x53ccfe(0x146)]=_0x322a13[_0x53ccfe(0x14e)][_0x53ccfe(0x1cb)],toggleInjectionDetails(),document['getElementById'](_0x53ccfe(0xd5))[_0x53ccfe(0x1a4)]=_0x322a13[_0x53ccfe(0xea)][_0x53ccfe(0x199)],document['getElementById'](_0x53ccfe(0x22a))['value']=_0x322a13[_0x53ccfe(0xea)][_0x53ccfe(0x14c)],document[_0x53ccfe(0x1bf)]('hly-layer-end')[_0x53ccfe(0x146)]=_0x322a13['condensation']['layerEnd'],document[_0x53ccfe(0x1bf)]('hly-include-user')[_0x53ccfe(0x1a4)]=_0x322a13[_0x53ccfe(0xea)][_0x53ccfe(0x1a3)][_0x53ccfe(0x110)],document[_0x53ccfe(0x1bf)](_0x53ccfe(0x191))[_0x53ccfe(0x1a4)]=_0x322a13['condensation'][_0x53ccfe(0x1a3)]['ai'];const _0x57d9ce=document[_0x53ccfe(0x1bf)](_0x53ccfe(0x1eb)),_0x48f06a=document[_0x53ccfe(0x1bf)]('hly-tag-input'),_0x359330=document['getElementById'](_0x53ccfe(0x11f));_0x57d9ce[_0x53ccfe(0x1a4)]=_0x322a13[_0x53ccfe(0xea)]['tagExtractionEnabled'],_0x48f06a[_0x53ccfe(0x146)]=_0x322a13[_0x53ccfe(0xea)][_0x53ccfe(0x121)],_0x359330[_0x53ccfe(0x1de)][_0x53ccfe(0x204)]=_0x57d9ce[_0x53ccfe(0x1a4)]?_0x53ccfe(0x105):_0x53ccfe(0x215),document[_0x53ccfe(0x1bf)]('hly-rerank-enabled')[_0x53ccfe(0x1a4)]=_0x322a13[_0x53ccfe(0x147)]['enabled'],document[_0x53ccfe(0x1bf)]('hly-rerank-url')[_0x53ccfe(0x146)]=_0x322a13['rerank']['url'],document[_0x53ccfe(0x1bf)](_0x53ccfe(0x13a))[_0x53ccfe(0x146)]=_0x322a13[_0x53ccfe(0x147)][_0x53ccfe(0x1ce)];const _0x5a81ef=document['getElementById'](_0x53ccfe(0x134));if(_0x5a81ef[_0x53ccfe(0x1f0)][_0x53ccfe(0xe3)]===0x0){const _0x38a52f=_0x322a13[_0x53ccfe(0x147)][_0x53ccfe(0x11d)];if(_0x38a52f){const _0x352f00=new Option(_0x38a52f,_0x38a52f,!![],!![]);_0x5a81ef[_0x53ccfe(0x157)](_0x352f00);}}_0x5a81ef['value']=_0x322a13[_0x53ccfe(0x147)][_0x53ccfe(0x11d)],document[_0x53ccfe(0x1bf)](_0x53ccfe(0x201))['value']=_0x322a13[_0x53ccfe(0x147)][_0x53ccfe(0x180)],document['getElementById']('hly-rerank-hybrid-alpha')['value']=_0x322a13['rerank'][_0x53ccfe(0x183)],document['getElementById'](_0x53ccfe(0x10d))[_0x53ccfe(0x1a4)]=_0x322a13[_0x53ccfe(0x147)][_0x53ccfe(0x185)],toggleCustomEndpointDocket();}function saveSettingsFromUI(_0x1a629e=!![]){const _0x47879d=_0x34a9aa,_0x30a827=document[_0x47879d(0x1bf)]('hly-modal-container');if(!_0x30a827)return;const _0x52e951=_0x30a827[_0x47879d(0x1d0)]('[data-setting-key]');_0x52e951[_0x47879d(0x13d)](_0x53e076=>{const _0x126531=_0x47879d,_0x4d1123=_0x53e076[_0x126531(0x188)]['settingKey'];if(!_0x4d1123)return;let _0x12e2db;const _0x8d79a9=_0x53e076['dataset'][_0x126531(0x1a8)]||_0x126531(0x1c7);if(_0x53e076[_0x126531(0x1a8)]===_0x126531(0x1f5))_0x12e2db=_0x53e076[_0x126531(0x1a4)];else{if(_0x53e076[_0x126531(0x1a8)]==='radio'){if(!_0x53e076['checked'])return;_0x12e2db=_0x53e076['value'];}else _0x12e2db=_0x53e076[_0x126531(0x146)];}switch(_0x8d79a9){case _0x126531(0x1f6):_0x12e2db=parseInt(_0x12e2db,0xa);break;case _0x126531(0x218):_0x12e2db=parseFloat(_0x12e2db);break;case _0x126531(0x1e4):if(typeof _0x12e2db!==_0x126531(0x1e4))_0x12e2db=_0x12e2db===_0x126531(0x108);break;}const _0xa4699b=_0x1750b8[_0x126531(0x1e1)](),_0x4ee61f=_0x4d1123['split']('.');let _0x569222=_0xa4699b;for(let _0x2929a4=0x0;_0x2929a4<_0x4ee61f[_0x126531(0xe3)]-0x1;_0x2929a4++){_0x569222=_0x569222[_0x4ee61f[_0x2929a4]]=_0x569222[_0x4ee61f[_0x2929a4]]||{};}_0x569222[_0x4ee61f[_0x4ee61f[_0x126531(0xe3)]-0x1]]=_0x12e2db;}),_0x1750b8[_0x47879d(0x1a1)](),!_0x1a629e&&(log('【手动存档】所有设定已存档封印。',_0x47879d(0x1d3)),toastr['success'](_0x47879d(0x101),_0x47879d(0x197)));}function resetSettingsToUI(){const _0x1dd817=_0x34a9aa;confirm(_0x1dd817(0x1f4))&&(_0x1750b8['resetSettings'](),loadSettingsToUI(),toastr[_0x1dd817(0xdc)](_0x1dd817(0x1a9),'诏曰'));}async function updatePanelStatus(){const _0x25db05=_0x34a9aa,_0x488587=_0x1750b8['isSessionLocked'](),_0x18efd5=document['getElementById'](_0x25db05(0xf3)),_0x3ff3ca=document[_0x25db05(0x1bf)]('hly-current-chat-id');if(_0x488587){const _0x232c5f=_0x1750b8['getLockedSessionInfo']();_0x18efd5[_0x25db05(0x1ed)]=_0x25db05(0x159),_0x3ff3ca['textContent']=_0x232c5f['id'],_0x3ff3ca[_0x25db05(0x189)]=_0x25db05(0x228)+_0x232c5f['id'],_0x18efd5[_0x25db05(0x11b)]['add'](_0x25db05(0x208)),_0x3ff3ca[_0x25db05(0x11b)][_0x25db05(0x157)](_0x25db05(0x208));}else _0x18efd5[_0x25db05(0x1ed)]=_0x3e1193[_0x25db05(0x21e)](),_0x3ff3ca[_0x25db05(0x1ed)]=_0x3e1193[_0x25db05(0x19f)]()||'无',_0x3ff3ca['title']='',_0x18efd5[_0x25db05(0x11b)]['remove'](_0x25db05(0x208)),_0x3ff3ca[_0x25db05(0x11b)]['remove'](_0x25db05(0x208));const _0x5b8a63=document[_0x25db05(0x1bf)](_0x25db05(0x237));_0x5b8a63[_0x25db05(0x1ed)]=_0x25db05(0x1d7);try{const _0x5795ec=await _0x1750b8[_0x25db05(0x1ea)]();_0x5b8a63[_0x25db05(0x1ed)]=_0x5795ec;}catch(_0x5db4d0){console[_0x25db05(0x154)](_0x25db05(0x1b3),_0x5db4d0),_0x5b8a63[_0x25db05(0x1ed)]=_0x25db05(0x190),_0x5b8a63[_0x25db05(0x189)]='无法获取总数:\x20'+_0x5db4d0[_0x25db05(0x238)];}const _0x4d1e89=document[_0x25db05(0x1bf)](_0x25db05(0x15b));if(_0x4d1e89&&!_0x4d1e89['dataset'][_0x25db05(0x20d)]){const _0x1df04f=_0x1750b8['getSettings'](),_0xd9a31a=_0x1750b8['getCollectionId']();if(_0x1df04f[_0x25db05(0x193)]&&_0x1df04f[_0x25db05(0x193)][_0xd9a31a]){const _0x176b3f=_0x1df04f['condensationHistory'][_0xd9a31a];_0x4d1e89[_0x25db05(0x229)]='上次已从第\x20'+_0x176b3f[_0x25db05(0xdb)]+_0x25db05(0x17b)+_0x176b3f['end']+_0x25db05(0x23c);}else _0x4d1e89[_0x25db05(0x229)]=_0x25db05(0x120);}}async function testApi(){const _0x33cac0=_0x34a9aa;toastr[_0x33cac0(0xdc)]('正在测试神力连接...','圣旨');try{await _0x1750b8[_0x33cac0(0x164)](),toastr[_0x33cac0(0x1d3)](_0x33cac0(0x19d),'圣意');}catch(_0xb41add){toastr['error'](_0x33cac0(0x107)+_0xb41add[_0x33cac0(0x238)],'警报');}}async function fetchHLYEmbeddingModels(){const _0x429a9f=_0x34a9aa,_0x5793c3=document[_0x429a9f(0x1bf)](_0x429a9f(0x1ec)),_0x1c1d07=_0x5793c3['value'];_0x5793c3['innerHTML']=_0x429a9f(0xe9),_0x5793c3[_0x429a9f(0x19e)]=!![];try{log(_0x429a9f(0x239),_0x429a9f(0xdc));const _0x11eb99=await _0x1750b8[_0x429a9f(0x1da)]();_0x5793c3[_0x429a9f(0x229)]='';if(_0x11eb99['length']===0x0){_0x5793c3[_0x429a9f(0x229)]='',toastr[_0x429a9f(0xed)]('未能获取到任何模型。',_0x429a9f(0x11c)),log('未能获取到任何模型。','warn');return;}_0x11eb99['forEach'](_0xd8971a=>{const _0x5c907d=new Option(_0xd8971a,_0xd8971a);_0x5793c3['add'](_0x5c907d);}),_0x11eb99['includes'](_0x1c1d07)?_0x5793c3[_0x429a9f(0x146)]=_0x1c1d07:_0x5793c3[_0x429a9f(0x15f)]=0x0,toastr[_0x429a9f(0x1d3)](_0x429a9f(0x210)+_0x11eb99['length']+'\x20个模型。','圣意'),log(_0x429a9f(0x210)+_0x11eb99[_0x429a9f(0xe3)]+_0x429a9f(0x1f1),_0x429a9f(0x1d3));}catch(_0x5afd81){console[_0x429a9f(0x154)](_0x429a9f(0x184),_0x5afd81),toastr[_0x429a9f(0x154)](_0x429a9f(0x1af)+_0x5afd81[_0x429a9f(0x238)],_0x429a9f(0x125)),log(_0x429a9f(0x1af)+_0x5afd81['message'],_0x429a9f(0x154)),_0x5793c3[_0x429a9f(0x229)]=_0x429a9f(0x15e);}finally{_0x5793c3[_0x429a9f(0x19e)]=![];}}async function fetchHLYRerankModels(){const _0x339c0d=_0x34a9aa,_0x3edfd3=document[_0x339c0d(0x1bf)](_0x339c0d(0x134)),_0x589ece=_0x3edfd3[_0x339c0d(0x146)];_0x3edfd3[_0x339c0d(0x229)]=_0x339c0d(0xe9),_0x3edfd3[_0x339c0d(0x19e)]=!![];try{log(_0x339c0d(0x16f),_0x339c0d(0xdc));const _0x4b80ee=await _0x1750b8[_0x339c0d(0x168)]();_0x3edfd3['innerHTML']='';if(_0x4b80ee[_0x339c0d(0xe3)]===0x0){_0x3edfd3[_0x339c0d(0x229)]=_0x339c0d(0x141),toastr[_0x339c0d(0xed)](_0x339c0d(0x173),_0x339c0d(0x11c)),log(_0x339c0d(0x173),_0x339c0d(0xed));return;}_0x4b80ee['forEach'](_0x414326=>{const _0x4e70b5=new Option(_0x414326,_0x414326);_0x3edfd3['add'](_0x4e70b5);}),_0x4b80ee[_0x339c0d(0xeb)](_0x589ece)?_0x3edfd3[_0x339c0d(0x146)]=_0x589ece:_0x3edfd3[_0x339c0d(0x15f)]=0x0,toastr[_0x339c0d(0x1d3)]('成功获取\x20'+_0x4b80ee[_0x339c0d(0xe3)]+_0x339c0d(0x1fd),'圣意'),log(_0x339c0d(0x210)+_0x4b80ee[_0x339c0d(0xe3)]+_0x339c0d(0x1fd),_0x339c0d(0x1d3));}catch(_0x2318db){console['error'](_0x339c0d(0x205),_0x2318db),toastr['error'](_0x339c0d(0x1db)+_0x2318db[_0x339c0d(0x238)],_0x339c0d(0x125)),log('获取Rerank模型失败:\x20'+_0x2318db[_0x339c0d(0x238)],_0x339c0d(0x154)),_0x3edfd3[_0x339c0d(0x229)]=_0x339c0d(0x15e);}finally{_0x3edfd3[_0x339c0d(0x19e)]=![];}}async function purgeStorage(){const _0x3b7ea6=_0x34a9aa;if(confirm(_0x3b7ea6(0x230))){toastr[_0x3b7ea6(0xdc)](_0x3b7ea6(0xda),'圣旨');const _0x246a73=await _0x1750b8[_0x3b7ea6(0x17d)]();_0x246a73?toastr[_0x3b7ea6(0x1d3)]('宝库已清空。','圣意'):toastr[_0x3b7ea6(0x154)](_0x3b7ea6(0x16c),'警报'),await updatePanelStatus();}}async function startCondensation(){const _0x5076ea=_0x34a9aa,_0x37c567=document[_0x5076ea(0x1bf)]('hly-condensation-results'),_0x15e2a1=_0x37c567['dataset'][_0x5076ea(0x20d)],_0x14f74b=document[_0x5076ea(0x1bf)]('hly-layer-start')[_0x5076ea(0x146)],_0x5157cf=document[_0x5076ea(0x1bf)]('hly-layer-end')[_0x5076ea(0x146)],_0x26e650={'start':parseInt(_0x14f74b),'end':parseInt(_0x5157cf)};try{if(_0x15e2a1&&_0x15e2a1[_0x5076ea(0x14d)]()){log(_0x5076ea(0x20e),_0x5076ea(0xdc)),toastr[_0x5076ea(0xdc)](_0x5076ea(0x151),'圣旨'),_0x37c567['textContent']=_0x5076ea(0x214);const _0x22bc6c=await _0x1750b8['ingestTextToHanlinyuan'](_0x15e2a1,_0x5076ea(0x21d),_0x5076ea(0x231)+_0x26e650['start']+'-'+_0x26e650[_0x5076ea(0x1f2)],()=>{},null,log,()=>{},null,0x0,_0x26e650);if(_0x22bc6c[_0x5076ea(0x1d3)]){toastr[_0x5076ea(0x1d3)](_0x5076ea(0x179)+_0x22bc6c['count']+_0x5076ea(0x1cd),_0x5076ea(0x1cf)),log(_0x5076ea(0x181)+_0x22bc6c[_0x5076ea(0x12f)]+_0x5076ea(0x1cd),'success');const _0x341b60=_0x26e650['end']===0x0?getContext()[_0x5076ea(0x148)][_0x5076ea(0xe3)]:_0x26e650[_0x5076ea(0x1f2)];_0x37c567[_0x5076ea(0x1ed)]=_0x5076ea(0x15d)+_0x26e650[_0x5076ea(0xdb)]+'\x20楼到第\x20'+_0x341b60+'\x20楼已成功凝识,新增\x20'+_0x22bc6c[_0x5076ea(0x12f)]+'\x20条忆识。',delete _0x37c567[_0x5076ea(0x188)][_0x5076ea(0x20d)];}else throw new Error(_0x22bc6c[_0x5076ea(0x154)]||_0x5076ea(0x216));}else{_0x37c567[_0x5076ea(0x1ed)]='正在采集消息...',toastr[_0x5076ea(0xdc)](_0x5076ea(0xe1),'圣旨'),log('未检测到预览文本,按标准流程采集消息...',_0x5076ea(0xdc));const _0xb1e147=_0x1750b8[_0x5076ea(0xd7)]();if(!_0xb1e147||_0xb1e147[_0x5076ea(0xe3)]===0x0){toastr[_0x5076ea(0x17e)](_0x5076ea(0x1a6),_0x5076ea(0x11c)),_0x37c567[_0x5076ea(0x1ed)]=_0x5076ea(0xe4);return;}_0x37c567[_0x5076ea(0x1ed)]=_0x5076ea(0xfc)+_0xb1e147[_0x5076ea(0xe3)]+_0x5076ea(0xdd),toastr[_0x5076ea(0xdc)](_0x5076ea(0xfc)+_0xb1e147[_0x5076ea(0xe3)]+'\x20条消息,开始凝识...','翰林院启奏');const _0x3385e1=await _0x1750b8[_0x5076ea(0x1e5)](_0xb1e147,log,_0x26e650);if(_0x3385e1[_0x5076ea(0x1d3)]){toastr[_0x5076ea(0x1d3)](_0x5076ea(0x1ac)+_0x3385e1[_0x5076ea(0x12f)]+_0x5076ea(0x1cd),_0x5076ea(0x1cf));const _0x23075a=_0x26e650['end']===0x0?getContext()[_0x5076ea(0x148)][_0x5076ea(0xe3)]:_0x26e650[_0x5076ea(0x1f2)];_0x37c567[_0x5076ea(0x1ed)]=_0x5076ea(0x15d)+_0x26e650[_0x5076ea(0xdb)]+_0x5076ea(0x111)+_0x23075a+_0x5076ea(0x23e)+_0x3385e1['count']+_0x5076ea(0x1cd);}else throw new Error(_0x3385e1['error']||_0x5076ea(0x216));}}catch(_0x21b87f){console[_0x5076ea(0x154)](_0x5076ea(0x155),_0x21b87f),toastr['error']('凝识失败:\x20'+_0x21b87f['message'],_0x5076ea(0x125)),_0x37c567[_0x5076ea(0x1ed)]='凝识失败:\x20'+_0x21b87f['message'];}finally{await updatePanelStatus();}}async function loadWorldbookList(){const _0x308526=_0x34a9aa,_0x16947e=document[_0x308526(0x1bf)](_0x308526(0xf1));if(!_0x16947e)return;try{log('正在获取可用书库列表...','info');const _0x5d3d82=await _0x41ee77['getAvailableWorldbooks']();_0x16947e['innerHTML']=_0x308526(0x16b);if(_0x5d3d82['length']===0x0){_0x16947e['innerHTML']=_0x308526(0x211);return;}_0x5d3d82[_0x308526(0x13d)](_0x370e3d=>{const _0x20c0a1=_0x308526,_0x17fcf3=new Option(_0x370e3d,_0x370e3d);_0x16947e[_0x20c0a1(0x157)](_0x17fcf3);}),log(_0x308526(0x137)+_0x5d3d82[_0x308526(0xe3)]+_0x308526(0x106),_0x308526(0x1d3));}catch(_0x4dc907){console[_0x308526(0x154)](_0x308526(0x12d),_0x4dc907),log('加载书库列表失败:\x20'+_0x4dc907[_0x308526(0x238)],_0x308526(0x154)),_0x16947e[_0x308526(0x229)]=_0x308526(0x1fa);}}async function handleWorldbookSelectionChange(){const _0x209036=_0x34a9aa,_0x316f79=document[_0x209036(0x1bf)](_0x209036(0xf1)),_0x56d907=document[_0x209036(0x1bf)](_0x209036(0x227)),_0x4fe0df=_0x316f79['value'];_0x56d907[_0x209036(0x229)]=_0x209036(0x1ca),_0x56d907[_0x209036(0x19e)]=!![];if(!_0x4fe0df){_0x56d907[_0x209036(0x229)]=_0x209036(0x153);return;}try{log('正在为《'+_0x4fe0df+_0x209036(0x23a),'info');const _0x41b598=await _0x41ee77[_0x209036(0x1bd)](_0x4fe0df);_0x56d907[_0x209036(0x229)]=_0x209036(0x1d2);if(_0x41b598[_0x209036(0xe3)]===0x0){_0x56d907['innerHTML']=_0x209036(0x202);return;}_0x41b598[_0x209036(0x13d)](_0x1658a6=>{const _0x2a2a68=_0x209036,_0x255ebb=new Option(_0x1658a6[_0x2a2a68(0x149)]+_0x2a2a68(0x10e)+_0x1658a6[_0x2a2a68(0x235)]+')',_0x1658a6[_0x2a2a68(0x235)]);_0x56d907[_0x2a2a68(0x157)](_0x255ebb);}),log(_0x209036(0x137)+_0x41b598[_0x209036(0xe3)]+_0x209036(0x22b),_0x209036(0x1d3));}catch(_0x5cd36d){console[_0x209036(0x154)](_0x209036(0x103)+_0x4fe0df+'》的条目失败:',_0x5cd36d),log(_0x209036(0x136)+_0x5cd36d[_0x209036(0x238)],_0x209036(0x154)),_0x56d907[_0x209036(0x229)]='加载失败';}finally{_0x56d907['disabled']=![];}}async function startHistoriography(){const _0x2fca0c=_0x34a9aa,_0x4f8ef6=document['getElementById'](_0x2fca0c(0xf1))[_0x2fca0c(0x146)],_0x44af13=document['getElementById'](_0x2fca0c(0x227))[_0x2fca0c(0x146)],_0x2e02ba=document[_0x2fca0c(0x1bf)]('hly-historiography-results');if(!_0x4f8ef6||!_0x44af13){toastr[_0x2fca0c(0x17e)](_0x2fca0c(0x12a),_0x2fca0c(0x18a));return;}_0x2e02ba['textContent']=_0x2fca0c(0xfd)+_0x4f8ef6+_0x2fca0c(0x20a)+_0x44af13+_0x2fca0c(0x117),toastr[_0x2fca0c(0xdc)](_0x2fca0c(0x17f),'圣旨'),log(_0x2fca0c(0x1c1)+_0x4f8ef6+'》-'+_0x44af13+_0x2fca0c(0x22c),_0x2fca0c(0xdc));try{const _0xbc959b=await _0x41ee77[_0x2fca0c(0x1e9)](_0x4f8ef6,_0x44af13);if(_0xbc959b[_0x2fca0c(0x1d3)]){const _0x2dca18=document[_0x2fca0c(0x1bf)](_0x2fca0c(0x227)),_0x59804f=_0x2dca18[_0x2fca0c(0x1f0)][_0x2dca18['selectedIndex']]['text'],_0x678382='《'+_0x4f8ef6+'》中的条目【'+_0x59804f+_0x2fca0c(0x207);_0x2e02ba[_0x2fca0c(0x1ed)]=_0x678382,toastr['success'](_0x2fca0c(0x1d4),'大功告成'),log('对《'+_0x4f8ef6+_0x2fca0c(0x171)+_0x44af13+')\x20的编纂任务已完成。',_0x2fca0c(0x1d3));}else throw new Error(_0xbc959b['error']||_0x2fca0c(0x150));}catch(_0x50d411){console[_0x2fca0c(0x154)](_0x2fca0c(0x158),_0x50d411),toastr[_0x2fca0c(0x154)](_0x2fca0c(0x119)+_0x50d411[_0x2fca0c(0x238)],_0x2fca0c(0x125)),_0x2e02ba['textContent']=_0x2fca0c(0x119)+_0x50d411[_0x2fca0c(0x238)];}}async function showStats(){const _0x1ae9d9=_0x34a9aa;try{log(_0x1ae9d9(0x129),_0x1ae9d9(0xdc)),toastr[_0x1ae9d9(0xdc)](_0x1ae9d9(0x1ba),'圣旨');const _0x57c968=await _0x1750b8[_0x1ae9d9(0x1ea)](),_0x5a3649=_0x1750b8[_0x1ae9d9(0x112)](),_0x3cf900=_0x1750b8['getSettings'](),_0x301d08=_0x1ae9d9(0x186)+_0x5a3649+_0x1ae9d9(0x1d6)+_0x57c968+'\x0a--------------------\x0aAPI端点:\x20'+_0x3cf900['retrieval'][_0x1ae9d9(0x19b)]+'\x0a所用模型:\x20'+_0x3cf900[_0x1ae9d9(0x224)][_0x1ae9d9(0x1b9)]+'\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20';toastr[_0x1ae9d9(0xdc)](_0x301d08,'宝库状态',{'timeOut':0x3a98,'extendedTimeOut':0x1388,'tapToDismiss':!![],'closeButton':!![]}),log(_0x1ae9d9(0x182)+_0x5a3649+_0x1ae9d9(0x21b)+_0x57c968,'success');}catch(_0x1f3586){console[_0x1ae9d9(0x154)]('[翰林院-枢纽]\x20查询宝库状态失败:',_0x1f3586),toastr['error'](_0x1ae9d9(0x177)+_0x1f3586[_0x1ae9d9(0x238)],'严重错误'),log(_0x1ae9d9(0x177)+_0x1f3586[_0x1ae9d9(0x238)],_0x1ae9d9(0x154));}}function showExclusionRulesModal(){const _0x209f78=_0x34a9aa,_0x492ca8=_0x1750b8[_0x209f78(0x1e1)](),_0x4fd468=_0x492ca8['condensation'][_0x209f78(0x1a0)]||[],_0x26d5a6=(_0x261144={'start':'','end':''},_0x3aa8c9)=>_0x209f78(0x1e7)+_0x3aa8c9+_0x209f78(0xf0)+_0x261144[_0x209f78(0xdb)]+_0x209f78(0x176)+_0x261144['end']+'\x22\x20placeholder=\x22结束字符,\x20如\x20-->\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20×\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20',_0x4e1d58=_0x4fd468[_0x209f78(0x1b5)](_0x26d5a6)[_0x209f78(0x145)](''),_0x356969=_0x209f78(0x1f3)+_0x4e1d58+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20添加新规则\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20';showHtmlModal('编辑内容排除规则',_0x356969,{'okText':'保存规则','onOk':_0x459df0=>{const _0x3d108e=_0x209f78,_0xb478db=[];_0x459df0['find'](_0x3d108e(0xd4))[_0x3d108e(0x102)](function(){const _0x53f4fc=_0x3d108e,_0x453b55=$(this)[_0x53f4fc(0x1c0)](_0x53f4fc(0x131))['eq'](0x0)[_0x53f4fc(0xd3)]()[_0x53f4fc(0x14d)](),_0x1a1d51=$(this)[_0x53f4fc(0x1c0)]('input')['eq'](0x1)['val']()[_0x53f4fc(0x14d)]();_0x453b55&&_0x1a1d51&&_0xb478db[_0x53f4fc(0x1c8)]({'start':_0x453b55,'end':_0x1a1d51});}),updateAndSaveSetting('condensation.exclusionRules',_0xb478db),toastr[_0x3d108e(0x1d3)](_0x3d108e(0x213),_0x3d108e(0x197));}});const _0x24abb7=document[_0x209f78(0x1bf)]('hly-exclusion-rules-container'),_0x2a5308=_0x24abb7[_0x209f78(0x115)](_0x209f78(0x143));_0x24abb7[_0x209f78(0x115)](_0x209f78(0x13e))[_0x209f78(0x1b0)]('click',()=>{const _0xdd662=_0x209f78,_0x4e5237=_0x2a5308[_0xdd662(0x170)][_0xdd662(0xe3)],_0x5e5439=_0x26d5a6({'start':'','end':''},_0x4e5237);_0x2a5308['insertAdjacentHTML'](_0xdd662(0x1ae),_0x5e5439);}),_0x2a5308['addEventListener'](_0x209f78(0x18e),_0x46cad4=>{const _0x178666=_0x209f78;_0x46cad4['target']['classList'][_0x178666(0xfa)]('hly-delete-rule-btn')&&_0x46cad4[_0x178666(0x104)][_0x178666(0x194)](_0x178666(0xd4))[_0x178666(0xf4)]();});}function previewCondensation(){const _0x314d8d=_0x34a9aa,_0x148943=document['getElementById'](_0x314d8d(0x15b));try{const _0x21757a=_0x1750b8[_0x314d8d(0x1e1)](),_0x45b768=_0x21757a[_0x314d8d(0xea)]['exclusionRules']||[],_0x287f06={'user':document[_0x314d8d(0x1bf)]('hly-include-user')['checked'],'ai':document['getElementById'](_0x314d8d(0x191))['checked']},_0x50d2f2=document[_0x314d8d(0x1bf)]('hly-tag-extraction-toggle')['checked'],_0x41abcc=_0x50d2f2?document['getElementById'](_0x314d8d(0x1b4))[_0x314d8d(0x146)][_0x314d8d(0x11e)](',')['map'](_0x474c6b=>_0x474c6b[_0x314d8d(0x14d)]())[_0x314d8d(0x1ab)](Boolean):[],_0x13a751=_0x1750b8[_0x314d8d(0xd7)](_0x287f06);if(!_0x13a751||_0x13a751[_0x314d8d(0xe3)]===0x0){_0x148943[_0x314d8d(0x1ed)]=_0x314d8d(0x225),toastr[_0x314d8d(0x17e)](_0x314d8d(0xe4),_0x314d8d(0x11c));return;}const _0x37e283=_0x13a751[_0x314d8d(0x1b5)]((_0x2c7586,_0x1cc6aa)=>{const _0x335b95=_0x314d8d;let _0x1b9c7d;if(_0x2c7586[_0x335b95(0x12c)])_0x1b9c7d=_0x2c7586[_0x335b95(0x160)];else{if(_0x50d2f2&&_0x41abcc['length']>0x0){const _0x233549=extractBlocksByTags(_0x2c7586[_0x335b95(0x160)],_0x41abcc);_0x1b9c7d=_0x233549[_0x335b95(0x145)]('\x0a\x0a');}else _0x1b9c7d=_0x2c7586[_0x335b95(0x160)];_0x1b9c7d=applyExclusionRules(_0x1b9c7d,_0x45b768);}return{'id':_0x335b95(0x139)+_0x1cc6aa,'name':_0x2c7586[_0x335b95(0xef)],'content':_0x1b9c7d[_0x335b95(0x14d)]()};})[_0x314d8d(0x1ab)](_0x6c0b1b=>_0x6c0b1b['content']);if(_0x37e283['length']===0x0){_0x148943['textContent']='根据标签提取或内容排除条件,未找到任何有效内容。',toastr[_0x314d8d(0x17e)](_0x314d8d(0x209),_0x314d8d(0x11c));return;}const _0x35e20c=_0x37e283[_0x314d8d(0x1b5)]((_0x2d878c,_0x1f15b7)=>'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20第\x20'+(_0x1f15b7+0x1)+_0x314d8d(0x1f9)+_0x2d878c['name']+_0x314d8d(0x118)+_0x2d878c[_0x314d8d(0x1e8)]+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{const _0x28c145=_0x314d8d,_0x812433=[];_0x41e1e8[_0x28c145(0x1c0)](_0x28c145(0x1c3))[_0x28c145(0x102)](function(){const _0x43b049=_0x28c145,_0x3c6f09=$(this)[_0x43b049(0x1c0)]('.hly-preview-textarea')['val']();_0x3c6f09[_0x43b049(0x14d)]()&&_0x812433['push'](_0x3c6f09);});const _0x20eeb4=_0x812433[_0x28c145(0x145)](_0x28c145(0x162)),_0x5f28dc=document[_0x28c145(0x1bf)](_0x28c145(0x22a))[_0x28c145(0x146)],_0x2ad06b=document[_0x28c145(0x1bf)](_0x28c145(0x1e2))[_0x28c145(0x146)];_0x148943[_0x28c145(0x1ed)]=_0x28c145(0xdf)+_0x5f28dc+'\x20楼到\x20'+_0x2ad06b+'\x20楼的内容(共\x20'+_0x812433[_0x28c145(0xe3)]+_0x28c145(0x13b),_0x148943[_0x28c145(0x188)][_0x28c145(0x20d)]=_0x20eeb4,toastr[_0x28c145(0x1d3)](_0x28c145(0x226),_0x28c145(0x197));}}),$(_0x314d8d(0x19a))['on'](_0x314d8d(0x18e),function(_0x5d6578){const _0x3ab938=_0x314d8d;_0x5d6578[_0x3ab938(0xe5)]();const _0x52045f=$(this)['data'](_0x3ab938(0x104));$('#'+_0x52045f)[_0x3ab938(0xf4)]();});}catch(_0x509b60){console['error'](_0x314d8d(0x10f),_0x509b60),_0x148943[_0x314d8d(0x1ed)]=_0x314d8d(0x135)+_0x509b60[_0x314d8d(0x238)],toastr['error'](_0x314d8d(0x135)+_0x509b60['message'],_0x314d8d(0x125));}}function log(_0x1a055c,_0x429d02=_0x34a9aa(0xdc)){const _0x5507be=_0x34a9aa,_0x4bc8a2=document[_0x5507be(0x1bf)](_0x5507be(0x1bc));if(!_0x4bc8a2)return;const _0x760fde=document[_0x5507be(0x1ee)]('p'),_0x3095c7=new Date()[_0x5507be(0xec)]();let _0x35beba=_0x5507be(0x122),_0x28908a=_0x5507be(0x13c);switch(_0x429d02){case _0x5507be(0x1d3):_0x35beba=_0x5507be(0x195),_0x28908a='log-success';break;case'error':_0x35beba=_0x5507be(0x1a2),_0x28908a=_0x5507be(0x1d8);break;case _0x5507be(0xed):_0x35beba=_0x5507be(0x161),_0x28908a=_0x5507be(0x167);break;}_0x760fde[_0x5507be(0x21f)]=_0x5507be(0x1be)+_0x28908a,_0x760fde['innerHTML']=_0x5507be(0x16a)+_0x35beba+_0x5507be(0x1b6)+_0x3095c7+']\x20'+_0x1a055c;const _0x207b33=_0x4bc8a2[_0x5507be(0x115)](_0x5507be(0xfb));_0x207b33&&_0x207b33[_0x5507be(0xf4)](),_0x4bc8a2[_0x5507be(0x1dc)](_0x760fde),_0x4bc8a2[_0x5507be(0x1dd)]=_0x4bc8a2[_0x5507be(0x1c6)];}async function ingestManualText(){const _0xb75136=_0x34a9aa,_0x48eaa0=document[_0xb75136(0x1bf)](_0xb75136(0x116)),_0x427ac7=_0x48eaa0['value'][_0xb75136(0x14d)]();if(!_0x427ac7){toastr['warning'](_0xb75136(0x1d1),_0xb75136(0x11c)),log(_0xb75136(0xd6),_0xb75136(0xed));return;}log(_0xb75136(0x19c)+_0x427ac7[_0xb75136(0xe3)],_0xb75136(0xdc)),toastr[_0xb75136(0xdc)](_0xb75136(0x11a),'圣旨');try{const _0x27aeee=await _0x1750b8['ingestTextToHanlinyuan'](_0x427ac7,_0xb75136(0x232),_0xb75136(0x12e));if(_0x27aeee[_0xb75136(0x1d3)])toastr[_0xb75136(0x1d3)](_0xb75136(0x179)+_0x27aeee[_0xb75136(0x12f)]+_0xb75136(0x1cd),_0xb75136(0x1cf)),log(_0xb75136(0x14a)+_0x27aeee[_0xb75136(0x12f)]+_0xb75136(0x1cd),_0xb75136(0x1d3)),_0x48eaa0[_0xb75136(0x146)]='';else throw new Error(_0x27aeee[_0xb75136(0x154)]||'未知错误');}catch(_0x5eda10){console[_0xb75136(0x154)](_0xb75136(0xf2),_0x5eda10),toastr[_0xb75136(0x154)](_0xb75136(0x18c)+_0x5eda10[_0xb75136(0x238)],_0xb75136(0x125)),log(_0xb75136(0x126)+_0x5eda10[_0xb75136(0x238)],_0xb75136(0x154));}finally{await updatePanelStatus();}} \ No newline at end of file diff --git a/ui/historiography-bindings.js b/ui/historiography-bindings.js index 25d93a5..609889d 100644 --- a/ui/historiography-bindings.js +++ b/ui/historiography-bindings.js @@ -1,407 +1 @@ -import { extension_settings } from "/scripts/extensions.js"; -import { - extensionName, - defaultSettings, - saveSettings, -} from "../utils/settings.js"; -import { showHtmlModal } from './page-window.js'; -import { applyExclusionRules, extractBlocksByTags } from '../core/utils/rag-tag-extractor.js'; - -import { - getAvailableWorldbooks, getLoresForWorldbook, - executeManualSummary, executeRefinement, - executeExpedition, stopExpedition // 【新】停战钦差已就位! -} from "../core/historiographer.js"; - - -// 一个辅助函数,用于处理两个谕旨编辑器的通用逻辑 -function setupPromptEditor(type) { - const selector = document.getElementById( - `amily2_mhb_${type}_prompt_selector`, - ); - const editor = document.getElementById(`amily2_mhb_${type}_editor`); - const saveBtn = document.getElementById(`amily2_mhb_${type}_save_button`); - const restoreBtn = document.getElementById( - `amily2_mhb_${type}_restore_button`, - ); - - // 我们需要从主设置对象中读取这些真实、隐藏的提示词 - const jailbreakKey = - type === "small" - ? "historiographySmallJailbreakPrompt" - : "historiographyLargeJailbreakPrompt"; - const mainPromptKey = - type === "small" - ? "historiographySmallSummaryPrompt" - : "historiographyLargeRefinePrompt"; - - // 更新编辑器内容以匹配选择 - const updateEditorView = () => { - const selected = selector.value; - if (selected === "jailbreak") { - editor.value = extension_settings[extensionName][jailbreakKey]; - } else { - editor.value = extension_settings[extensionName][mainPromptKey]; - } - }; - - // 事件监听 - selector.addEventListener("change", updateEditorView); - - saveBtn.addEventListener("click", () => { - const selected = selector.value; - if (selected === "jailbreak") { - extension_settings[extensionName][jailbreakKey] = editor.value; - } else { - extension_settings[extensionName][mainPromptKey] = editor.value; - } - if (saveSettings()) { - toastr.success( - `${type === "small" ? "微言录" : "宏史卷"}的${selected === "jailbreak" ? "破限谕旨" : "纲要"}已保存!`, - ); - } - }); - - restoreBtn.addEventListener("click", () => { - const selected = selector.value; - if (selected === "jailbreak") { - editor.value = defaultSettings[jailbreakKey]; - } else { - editor.value = defaultSettings[mainPromptKey]; - } - toastr.info("已恢复为默认谕旨,请点击“保存当前”以确认。"); - }); - - // 初始化视图 - updateEditorView(); - -//=======【从这里开始新增】======= - - // 【最终圣谕:为“展开谕旨”按钮注入灵魂】 - const expandBtn = document.getElementById(`amily2_mhb_${type}_expand_editor`); - - expandBtn.addEventListener('click', () => { - const selectedValue = selector.value; - const selectedText = selector.options[selector.selectedIndex].text; // 获取"破限谕旨"或"敕史纲要" - const currentContent = editor.value; - - const dialogHtml = ` - - - `; - - const dialogElement = $(dialogHtml).appendTo('body'); - const dialogTextarea = dialogElement.find('textarea'); - dialogTextarea.val(currentContent); - - const closeDialog = () => { dialogElement[0].close(); dialogElement.remove(); }; - - dialogElement.find('.popup-button-ok').on('click', () => { - const newContent = dialogTextarea.val(); - // 1. 将新内容更新回我们小小的编辑器 - editor.value = newContent; - - // 2.【核心】调用我们已有的保存逻辑,将改动真正写入帝国法典 - if (selectedValue === "jailbreak") { - extension_settings[extensionName][jailbreakKey] = newContent; - } else { - extension_settings[extensionName][mainPromptKey] = newContent; - } - if (saveSettings()) { - toastr.success(`${type === 'small' ? '微言录' : '宏史卷'}的${selectedText}已镌刻!`); - } - - // 3. 关闭这个弹出窗口 - closeDialog(); - }); - - dialogElement.find('.popup-button-cancel').on('click', closeDialog); - dialogElement[0].showModal(); - }); - -} - -// 帝国【敕史局工部】的主体 -// 帝国【敕史局工部】的主体 (已全面升级) -export function bindHistoriographyEvents() { - console.log("[Amily2号-工部] 【敕史局】的专属工匠已就位..."); - - setupPromptEditor("small"); - setupPromptEditor("large"); - - // ========== 📜 微言录 (Small Summary) 绑定 (无改动) ========== - const smallStartFloor = document.getElementById("amily2_mhb_small_start_floor"); - const smallEndFloor = document.getElementById("amily2_mhb_small_end_floor"); - const smallExecuteBtn = document.getElementById("amily2_mhb_small_manual_execute"); - const smallAutoEnable = document.getElementById("amily2_mhb_small_auto_enabled"); - const smallTriggerThreshold = document.getElementById("amily2_mhb_small_trigger_count"); - const writeToLorebook = document.getElementById("historiography_write_to_lorebook"); - const ingestToRag = document.getElementById("historiography_ingest_to_rag"); - - smallExecuteBtn.addEventListener("click", () => { - const start = parseInt(smallStartFloor.value, 10); - const end = parseInt(smallEndFloor.value, 10); - if (isNaN(start) || isNaN(end) || start <= 0 || end <= 0 || start > end) { - toastr.error("请输入有效的起始和结束楼层!", "圣谕有误"); - return; - } - executeManualSummary(start, end); - }); - - smallAutoEnable.addEventListener("change", (event) => { - extension_settings[extensionName].historiographySmallAutoEnable = event.target.checked; - saveSettings(); - }); - - smallTriggerThreshold.addEventListener("change", (event) => { - const value = parseInt(event.target.value, 10); - if (isNaN(value) || value < 1) { - // 如果输入无效,则从默认设置中恢复,而不是硬编码 - event.target.value = defaultSettings.historiographySmallTriggerThreshold; - toastr.warning("远征阈值必须是大于0的数字。已重置。", "圣谕有误"); - return; // 阻止保存无效值 - } - extension_settings[extensionName].historiographySmallTriggerThreshold = value; - saveSettings(); - }); - - writeToLorebook.addEventListener("change", (event) => { - extension_settings[extensionName].historiographyWriteToLorebook = event.target.checked; - saveSettings(); - }); - - ingestToRag.addEventListener("change", (event) => { - extension_settings[extensionName].historiographyIngestToRag = event.target.checked; - saveSettings(); - }); - - // 初始化加载设置 - smallAutoEnable.checked = extension_settings[extensionName].historiographySmallAutoEnable ?? false; - smallTriggerThreshold.value = extension_settings[extensionName].historiographySmallTriggerThreshold ?? 30; - writeToLorebook.checked = extension_settings[extensionName].historiographyWriteToLorebook ?? true; - ingestToRag.checked = extension_settings[extensionName].historiographyIngestToRag ?? false; - - // 【新增】为“交互式巡录”开关注入灵魂 - const autoSummaryInteractive = document.getElementById("historiography_auto_summary_interactive"); - autoSummaryInteractive.checked = extension_settings[extensionName].historiographyAutoSummaryInteractive ?? false; - autoSummaryInteractive.addEventListener("change", (event) => { - extension_settings[extensionName].historiographyAutoSummaryInteractive = event.target.checked; - saveSettings(); - }); - - // ========== 🏷️ 标签与排除规则绑定 (新增) ========== - const tagExtractionToggle = document.getElementById("historiography-tag-extraction-toggle"); - const tagInputContainer = document.getElementById("historiography-tag-input-container"); - const tagInput = document.getElementById("historiography-tag-input"); - const exclusionRulesBtn = document.getElementById("historiography-exclusion-rules-btn"); - - // 加载设置 - tagExtractionToggle.checked = extension_settings[extensionName].historiographyTagExtractionEnabled ?? false; - tagInput.value = extension_settings[extensionName].historiographyTags ?? ''; - tagInputContainer.style.display = tagExtractionToggle.checked ? 'block' : 'none'; - - // 绑定事件 - tagExtractionToggle.addEventListener("change", (event) => { - const isEnabled = event.target.checked; - extension_settings[extensionName].historiographyTagExtractionEnabled = isEnabled; - tagInputContainer.style.display = isEnabled ? 'block' : 'none'; - saveSettings(); - }); - - tagInput.addEventListener("change", (event) => { - extension_settings[extensionName].historiographyTags = event.target.value; - saveSettings(); - }); - - exclusionRulesBtn.addEventListener("click", showHistoriographyExclusionRulesModal); - - - // ========== ⚔️ 远征指挥台 (Expedition Command) 绑定 (核心升级区) ========== - const expeditionExecuteBtn = document.getElementById("amily2_mhb_small_expedition_execute"); - - // 【新】百变神兵:一个专门负责更新指挥按钮状态的函数 - const updateExpeditionButtonUI = (state) => { - expeditionExecuteBtn.dataset.state = state; // 将当前状态记录在按钮上 - switch (state) { - case 'running': - expeditionExecuteBtn.innerHTML = ' 停止远征'; - expeditionExecuteBtn.className = 'menu_button small_button interactable danger'; // 更换为“危险”的红色战旗 - break; - case 'paused': - expeditionExecuteBtn.innerHTML = ' 继续远征'; - expeditionExecuteBtn.className = 'menu_button small_button interactable success'; // 更换为“希望”的绿色战旗 - break; - case 'idle': - default: - expeditionExecuteBtn.innerHTML = ' 开始远征'; - expeditionExecuteBtn.className = 'menu_button small_button interactable'; // 恢复默认战旗 (紫色) - break; - } - }; - - // 【新】顺风之耳:监听来自【大史官】的帝国广播,实时更新UI - document.addEventListener('amily2-expedition-state-change', (e) => { - const { isRunning, manualStop } = e.detail; - if (isRunning) { - updateExpeditionButtonUI('running'); - } else if (manualStop) { - updateExpeditionButtonUI('paused'); - } else { - updateExpeditionButtonUI('idle'); - } - }); - - // 【新】智能核心:指挥按钮现在拥有了判断战局的能力 - expeditionExecuteBtn.addEventListener("click", () => { - const currentState = expeditionExecuteBtn.dataset.state || 'idle'; - if (currentState === 'running') { - stopExpedition(); // 如果正在打仗,就派钦差去叫停 - } else { - executeExpedition(); // 否则,就命令战争大臣开战或继续 - } - }); - - // 【初始仪仗】确保每次进入殿堂时,按钮都处于正确的“开始远征”状态 - updateExpeditionButtonUI('idle'); - - // ========== 💎 宏史卷 (史册精炼) 绑定 ========== - const largeWbSelector = document.getElementById( - "amily2_mhb_large_worldbook_selector", - ); - const largeLoreSelector = document.getElementById( - "amily2_mhb_large_lore_selector", - ); - const largeRefreshWbBtn = document.getElementById( - "amily2_mhb_large_refresh_worldbooks", - ); - const largeRefreshLoresBtn = document.getElementById( - "amily2_mhb_large_refresh_lores", - ); - const largeRefineBtn = document.getElementById( - "amily2_mhb_large_refine_execute", - ); - - const updateWorldbookList = async () => { - largeWbSelector.innerHTML = ''; - const worldbooks = await getAvailableWorldbooks(); - largeWbSelector.innerHTML = ""; // 清空 - if (worldbooks && worldbooks.length > 0) { - worldbooks.forEach((wb) => { - const option = document.createElement("option"); - option.value = wb; - option.textContent = wb; - largeWbSelector.appendChild(option); - }); - // 自动触发一次change来加载第一个世界书的条目 - largeWbSelector.dispatchEvent(new Event("change")); - } else { - largeWbSelector.innerHTML = ''; - } - }; - - const updateLoreList = async () => { - const selectedWb = largeWbSelector.value; - if (!selectedWb) { - largeLoreSelector.innerHTML = ''; - return; - } - largeLoreSelector.innerHTML = ''; - const lores = await getLoresForWorldbook(selectedWb); - largeLoreSelector.innerHTML = ""; // 清空 - if (lores && lores.length > 0) { - lores.forEach((lore) => { - const option = document.createElement("option"); - option.value = lore.key; - option.textContent = `[${lore.key}] ${lore.comment}`; - largeLoreSelector.appendChild(option); - }); - } else { - largeLoreSelector.innerHTML = ''; - } - }; - - largeRefreshWbBtn.addEventListener("click", updateWorldbookList); - largeWbSelector.addEventListener("change", updateLoreList); - largeRefreshLoresBtn.addEventListener("click", updateLoreList); - - largeRefineBtn.addEventListener("click", () => { - const worldbook = largeWbSelector.value; - const loreKey = largeLoreSelector.value; - if (!worldbook || !loreKey) { - toastr.error("请先选择一个国史馆及其中的史册条目!", "圣谕不全"); - return; - } - // 调用未来的【大史官】执行精炼任务 - executeRefinement(worldbook, loreKey); - }); -} - - -/** - * 【新增】显示和编辑史官内容排除规则的弹窗 - */ -function showHistoriographyExclusionRulesModal() { - const rules = extension_settings[extensionName].historiographyExclusionRules || []; - - const createRuleRowHtml = (rule = { start: '', end: '' }, index) => ` -
- - - - -
- `; - - const rulesHtml = rules.map(createRuleRowHtml).join(''); - - const modalHtml = ` -
-

在这里定义需要从提取内容中排除的文本片段。例如,排除HTML注释,可以设置开始字符为 \`\`。

-
${rulesHtml}
- -
- - `; - - showHtmlModal('编辑内容排除规则', modalHtml, { - okText: '保存规则', - onOk: (dialogElement) => { - const newRules = []; - dialogElement.find('.hly-exclusion-rule-row').each(function() { - const start = $(this).find('input').eq(0).val().trim(); - const end = $(this).find('input').eq(1).val().trim(); - if (start && end) { - newRules.push({ start, end }); - } - }); - extension_settings[extensionName].historiographyExclusionRules = newRules; - saveSettings(); - toastr.success('内容排除规则已保存。', '圣旨已达'); - } - }); - - const modalContent = document.getElementById('historiography-exclusion-rules-container'); - const rulesList = modalContent.querySelector('#historiography-rules-list'); - - modalContent.querySelector('#historiography-add-rule-btn').addEventListener('click', () => { - const newIndex = rulesList.children.length; - const newRowHtml = createRuleRowHtml({ start: '', end: '' }, newIndex); - rulesList.insertAdjacentHTML('beforeend', newRowHtml); - }); - - rulesList.addEventListener('click', (event) => { - if (event.target.classList.contains('hly-delete-rule-btn')) { - event.target.closest('.hly-exclusion-rule-row').remove(); - } - }); -} +function _0x4f8d(_0x579cb9,_0xe08b63){const _0x3d1da6=_0x3d1d();return _0x4f8d=function(_0x4f8d5d,_0x308b21){_0x4f8d5d=_0x4f8d5d-0xb4;let _0x156aca=_0x3d1da6[_0x4f8d5d];return _0x156aca;},_0x4f8d(_0x579cb9,_0xe08b63);}function _0x3d1d(){const _0x587a99=['amily2_mhb_large_refresh_lores','amily2_mhb_small_end_floor','closest','9658HRlhDL','_expand_editor','historiography-tag-extraction-toggle','historiographyIngestToRag','appendChild','getElementById','historiographyWriteToLorebook','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20保存并关闭取消\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','内容排除规则已保存。','\x20开始远征','#historiography-add-rule-btn','dataset','display','innerHTML','amily2_mhb_large_refine_execute','menu_button\x20small_button\x20interactable','warning','push','圣旨已达','此国史馆为空','467277dUQtZj','已保存!','value','8820jYnzpx','historiographyExclusionRules','[Amily2号-工部]\x20【敕史局】的专属工匠已就位...','10GOMhNb','微言录','length','close','find','none','请先选择国史馆','472585PjGCBt','amily2_mhb_large_worldbook_selector','map','historiography-exclusion-rules-container','historiographyLargeJailbreakPrompt','正在遍览帝国疆域...','65136qOVkNH','破限谕旨','historiography_ingest_to_rag','圣谕不全','\x20停止远征','target','key','9465381rHaYlt','textarea','historiographySmallAutoEnable','amily2_mhb_small_start_floor','each','圣谕有误','dispatchEvent','historiography-tag-input','\x22\x20placeholder=\x22开始字符,\x20如\x20\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20×\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20','running','正在检阅史册...','addEventListener','className','small','val','amily2_mhb_','children','.popup-button-cancel','historiographySmallTriggerThreshold','detail','远征阈值必须是大于0的数字。已重置。','74835ggfTRb','error','end','textContent','historiographyTags','click','jailbreak','未发现任何国史馆','5901avRzrS','createElement','state','宏史卷','style','\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20正在编辑:\x20','join','comment','input','success','已镌刻!','historiographySmallJailbreakPrompt','historiographySmallSummaryPrompt','_save_button'];_0x3d1d=function(){return _0x587a99;};return _0x3d1d();}(function(_0x5154f9,_0x5cd525){const _0x5f0b58=_0x4f8d,_0x5ac255=_0x5154f9();while(!![]){try{const _0x249f53=parseInt(_0x5f0b58(0xd0))/0x1+-parseInt(_0x5f0b58(0xf3))/0x2*(-parseInt(_0x5f0b58(0x11c))/0x3)+-parseInt(_0x5f0b58(0x12b))/0x4*(-parseInt(_0x5f0b58(0xdd))/0x5)+-parseInt(_0x5f0b58(0xd3))/0x6*(-parseInt(_0x5f0b58(0x124))/0x7)+parseInt(_0x5f0b58(0xf7))/0x8+parseInt(_0x5f0b58(0xea))/0x9*(parseInt(_0x5f0b58(0xd6))/0xa)+parseInt(_0x5f0b58(0xbc))/0xb*(-parseInt(_0x5f0b58(0xe3))/0xc);if(_0x249f53===_0x5cd525)break;else _0x5ac255['push'](_0x5ac255['shift']());}catch(_0x4cd6f2){_0x5ac255['push'](_0x5ac255['shift']());}}}(_0x3d1d,0xc67b5));import{extension_settings}from'/scripts/extensions.js';import{extensionName,defaultSettings,saveSettings}from'../utils/settings.js';import{showHtmlModal}from'./page-window.js';import{applyExclusionRules,extractBlocksByTags}from'../core/utils/rag-tag-extractor.js';import{getAvailableWorldbooks,getLoresForWorldbook,executeManualSummary,executeRefinement,executeExpedition,stopExpedition}from'../core/historiographer.js';function setupPromptEditor(_0x5bf17f){const _0x43cb26=_0x4f8d,_0x3ec868=document[_0x43cb26(0xc1)](_0x43cb26(0x116)+_0x5bf17f+'_prompt_selector'),_0x19c727=document['getElementById'](_0x43cb26(0x116)+_0x5bf17f+'_editor'),_0x2a8be9=document[_0x43cb26(0xc1)](_0x43cb26(0x116)+_0x5bf17f+_0x43cb26(0xb8)),_0x59a7ac=document[_0x43cb26(0xc1)](_0x43cb26(0x116)+_0x5bf17f+'_restore_button'),_0x572168=_0x5bf17f===_0x43cb26(0x114)?_0x43cb26(0xb6):_0x43cb26(0xe1),_0x46577d=_0x5bf17f==='small'?_0x43cb26(0xb7):'historiographyLargeRefinePrompt',_0xf7cf57=()=>{const _0x2fb04c=_0x43cb26,_0x3aeaac=_0x3ec868[_0x2fb04c(0xd2)];_0x3aeaac===_0x2fb04c(0x122)?_0x19c727['value']=extension_settings[extensionName][_0x572168]:_0x19c727[_0x2fb04c(0xd2)]=extension_settings[extensionName][_0x46577d];};_0x3ec868[_0x43cb26(0x112)](_0x43cb26(0x10b),_0xf7cf57),_0x2a8be9[_0x43cb26(0x112)](_0x43cb26(0x121),()=>{const _0x12402e=_0x43cb26,_0x49cea9=_0x3ec868[_0x12402e(0xd2)];_0x49cea9===_0x12402e(0x122)?extension_settings[extensionName][_0x572168]=_0x19c727[_0x12402e(0xd2)]:extension_settings[extensionName][_0x46577d]=_0x19c727[_0x12402e(0xd2)],saveSettings()&&toastr[_0x12402e(0xb4)]((_0x5bf17f===_0x12402e(0x114)?_0x12402e(0xd7):_0x12402e(0x127))+'的'+(_0x49cea9===_0x12402e(0x122)?_0x12402e(0xe4):'纲要')+_0x12402e(0xd1));}),_0x59a7ac[_0x43cb26(0x112)](_0x43cb26(0x121),()=>{const _0x37c33b=_0x43cb26,_0x3cebf0=_0x3ec868[_0x37c33b(0xd2)];_0x3cebf0==='jailbreak'?_0x19c727[_0x37c33b(0xd2)]=defaultSettings[_0x572168]:_0x19c727[_0x37c33b(0xd2)]=defaultSettings[_0x46577d],toastr['info'](_0x37c33b(0x10e));}),_0xf7cf57();const _0x299602=document[_0x43cb26(0xc1)](_0x43cb26(0x116)+_0x5bf17f+_0x43cb26(0xbd));_0x299602[_0x43cb26(0x112)](_0x43cb26(0x121),()=>{const _0xb5ee76=_0x43cb26,_0x3be57d=_0x3ec868[_0xb5ee76(0xd2)],_0x3fcfbd=_0x3ec868[_0xb5ee76(0xfb)][_0x3ec868[_0xb5ee76(0xfd)]]['text'],_0x892e7e=_0x19c727[_0xb5ee76(0xd2)],_0x8e25ac=_0xb5ee76(0x12e)+_0x3fcfbd+_0xb5ee76(0xc3),_0x90d3c0=$(_0x8e25ac)[_0xb5ee76(0x10a)](_0xb5ee76(0x12c)),_0x38dccf=_0x90d3c0['find'](_0xb5ee76(0xeb));_0x38dccf[_0xb5ee76(0x115)](_0x892e7e);const _0x100274=()=>{const _0x450ce3=_0xb5ee76;_0x90d3c0[0x0][_0x450ce3(0xd9)](),_0x90d3c0[_0x450ce3(0x108)]();};_0x90d3c0[_0xb5ee76(0xda)]('.popup-button-ok')['on'](_0xb5ee76(0x121),()=>{const _0x26db34=_0xb5ee76,_0xf2d6fa=_0x38dccf[_0x26db34(0x115)]();_0x19c727[_0x26db34(0xd2)]=_0xf2d6fa,_0x3be57d===_0x26db34(0x122)?extension_settings[extensionName][_0x572168]=_0xf2d6fa:extension_settings[extensionName][_0x46577d]=_0xf2d6fa,saveSettings()&&toastr[_0x26db34(0xb4)]((_0x5bf17f==='small'?_0x26db34(0xd7):_0x26db34(0x127))+'的'+_0x3fcfbd+_0x26db34(0xb5)),_0x100274();}),_0x90d3c0[_0xb5ee76(0xda)](_0xb5ee76(0x118))['on'](_0xb5ee76(0x121),_0x100274),_0x90d3c0[0x0][_0xb5ee76(0xfe)]();});}export function bindHistoriographyEvents(){const _0xf9dce7=_0x4f8d;console[_0xf9dce7(0x104)](_0xf9dce7(0xd5)),setupPromptEditor(_0xf9dce7(0x114)),setupPromptEditor('large');const _0x10e00d=document['getElementById'](_0xf9dce7(0xed)),_0x36498d=document[_0xf9dce7(0xc1)](_0xf9dce7(0xba)),_0x2e397f=document[_0xf9dce7(0xc1)]('amily2_mhb_small_manual_execute'),_0x33f5c3=document[_0xf9dce7(0xc1)]('amily2_mhb_small_auto_enabled'),_0x2c6bd8=document[_0xf9dce7(0xc1)](_0xf9dce7(0xf5)),_0x328475=document[_0xf9dce7(0xc1)](_0xf9dce7(0x105)),_0x101d9c=document[_0xf9dce7(0xc1)](_0xf9dce7(0xe5));_0x2e397f['addEventListener'](_0xf9dce7(0x121),()=>{const _0x1415e8=_0xf9dce7,_0x235ce2=parseInt(_0x10e00d[_0x1415e8(0xd2)],0xa),_0x1b738c=parseInt(_0x36498d['value'],0xa);if(isNaN(_0x235ce2)||isNaN(_0x1b738c)||_0x235ce2<=0x0||_0x1b738c<=0x0||_0x235ce2>_0x1b738c){toastr[_0x1415e8(0x11d)](_0x1415e8(0x102),_0x1415e8(0xef));return;}executeManualSummary(_0x235ce2,_0x1b738c);}),_0x33f5c3[_0xf9dce7(0x112)](_0xf9dce7(0x10b),_0x454a94=>{const _0x12d5c9=_0xf9dce7;extension_settings[extensionName][_0x12d5c9(0xec)]=_0x454a94[_0x12d5c9(0xe8)]['checked'],saveSettings();}),_0x2c6bd8[_0xf9dce7(0x112)](_0xf9dce7(0x10b),_0x42755f=>{const _0x4afa33=_0xf9dce7,_0xfc626=parseInt(_0x42755f[_0x4afa33(0xe8)]['value'],0xa);if(isNaN(_0xfc626)||_0xfc626<0x1){_0x42755f['target'][_0x4afa33(0xd2)]=defaultSettings[_0x4afa33(0x119)],toastr[_0x4afa33(0xcc)](_0x4afa33(0x11b),_0x4afa33(0xef));return;}extension_settings[extensionName][_0x4afa33(0x119)]=_0xfc626,saveSettings();}),_0x328475[_0xf9dce7(0x112)](_0xf9dce7(0x10b),_0x4545d6=>{const _0x3947df=_0xf9dce7;extension_settings[extensionName][_0x3947df(0xc2)]=_0x4545d6[_0x3947df(0xe8)][_0x3947df(0xf6)],saveSettings();}),_0x101d9c[_0xf9dce7(0x112)]('change',_0x96094e=>{const _0x1dac27=_0xf9dce7;extension_settings[extensionName]['historiographyIngestToRag']=_0x96094e[_0x1dac27(0xe8)]['checked'],saveSettings();}),_0x33f5c3['checked']=extension_settings[extensionName][_0xf9dce7(0xec)]??![],_0x2c6bd8['value']=extension_settings[extensionName]['historiographySmallTriggerThreshold']??0x1e,_0x328475[_0xf9dce7(0xf6)]=extension_settings[extensionName][_0xf9dce7(0xc2)]??!![],_0x101d9c[_0xf9dce7(0xf6)]=extension_settings[extensionName][_0xf9dce7(0xbf)]??![];const _0x194c17=document['getElementById'](_0xf9dce7(0xf9));_0x194c17['checked']=extension_settings[extensionName][_0xf9dce7(0xfc)]??![],_0x194c17['addEventListener']('change',_0x589446=>{const _0xe4fcc8=_0xf9dce7;extension_settings[extensionName][_0xe4fcc8(0xfc)]=_0x589446[_0xe4fcc8(0xe8)][_0xe4fcc8(0xf6)],saveSettings();});const _0x5c55d3=document[_0xf9dce7(0xc1)](_0xf9dce7(0xbe)),_0x28dfa5=document[_0xf9dce7(0xc1)]('historiography-tag-input-container'),_0x4f3fda=document[_0xf9dce7(0xc1)](_0xf9dce7(0xf1)),_0x549c34=document[_0xf9dce7(0xc1)]('historiography-exclusion-rules-btn');_0x5c55d3[_0xf9dce7(0xf6)]=extension_settings[extensionName]['historiographyTagExtractionEnabled']??![],_0x4f3fda[_0xf9dce7(0xd2)]=extension_settings[extensionName]['historiographyTags']??'',_0x28dfa5['style'][_0xf9dce7(0xc8)]=_0x5c55d3[_0xf9dce7(0xf6)]?_0xf9dce7(0x106):_0xf9dce7(0xdb),_0x5c55d3[_0xf9dce7(0x112)](_0xf9dce7(0x10b),_0x4129fd=>{const _0x44ec6e=_0xf9dce7,_0x3a49c6=_0x4129fd[_0x44ec6e(0xe8)][_0x44ec6e(0xf6)];extension_settings[extensionName][_0x44ec6e(0xf4)]=_0x3a49c6,_0x28dfa5[_0x44ec6e(0x128)][_0x44ec6e(0xc8)]=_0x3a49c6?_0x44ec6e(0x106):_0x44ec6e(0xdb),saveSettings();}),_0x4f3fda[_0xf9dce7(0x112)](_0xf9dce7(0x10b),_0x2ef318=>{const _0x18b524=_0xf9dce7;extension_settings[extensionName][_0x18b524(0x120)]=_0x2ef318['target'][_0x18b524(0xd2)],saveSettings();}),_0x549c34[_0xf9dce7(0x112)](_0xf9dce7(0x121),showHistoriographyExclusionRulesModal);const _0x4d0cb8=document[_0xf9dce7(0xc1)](_0xf9dce7(0x101)),_0x2b3abd=_0x5bb597=>{const _0x1eea1a=_0xf9dce7;_0x4d0cb8[_0x1eea1a(0xc7)][_0x1eea1a(0x126)]=_0x5bb597;switch(_0x5bb597){case _0x1eea1a(0x110):_0x4d0cb8[_0x1eea1a(0xc9)]=_0x1eea1a(0xe7),_0x4d0cb8['className']='menu_button\x20small_button\x20interactable\x20danger';break;case'paused':_0x4d0cb8[_0x1eea1a(0xc9)]='\x20继续远征',_0x4d0cb8[_0x1eea1a(0x113)]='menu_button\x20small_button\x20interactable\x20success';break;case _0x1eea1a(0x12d):default:_0x4d0cb8[_0x1eea1a(0xc9)]=_0x1eea1a(0xc5),_0x4d0cb8[_0x1eea1a(0x113)]=_0x1eea1a(0xcb);break;}};document[_0xf9dce7(0x112)](_0xf9dce7(0x109),_0x478404=>{const _0xda2678=_0xf9dce7,{isRunning:_0xd70272,manualStop:_0x5ad457}=_0x478404[_0xda2678(0x11a)];if(_0xd70272)_0x2b3abd(_0xda2678(0x110));else _0x5ad457?_0x2b3abd('paused'):_0x2b3abd('idle');}),_0x4d0cb8['addEventListener'](_0xf9dce7(0x121),()=>{const _0x48d177=_0xf9dce7,_0x589f26=_0x4d0cb8[_0x48d177(0xc7)][_0x48d177(0x126)]||'idle';_0x589f26===_0x48d177(0x110)?stopExpedition():executeExpedition();}),_0x2b3abd(_0xf9dce7(0x12d));const _0x1ef0fd=document[_0xf9dce7(0xc1)](_0xf9dce7(0xde)),_0x176c14=document[_0xf9dce7(0xc1)]('amily2_mhb_large_lore_selector'),_0x53f794=document[_0xf9dce7(0xc1)]('amily2_mhb_large_refresh_worldbooks'),_0x314734=document[_0xf9dce7(0xc1)](_0xf9dce7(0xb9)),_0x49a012=document[_0xf9dce7(0xc1)](_0xf9dce7(0xca)),_0x1d8929=async()=>{const _0x58b0cb=_0xf9dce7;_0x1ef0fd[_0x58b0cb(0xc9)]=_0x58b0cb(0xe2);const _0x35b157=await getAvailableWorldbooks();_0x1ef0fd['innerHTML']='',_0x35b157&&_0x35b157[_0x58b0cb(0xd8)]>0x0?(_0x35b157[_0x58b0cb(0x103)](_0x2672a7=>{const _0x434159=_0x58b0cb,_0x37faaf=document[_0x434159(0x125)]('option');_0x37faaf[_0x434159(0xd2)]=_0x2672a7,_0x37faaf[_0x434159(0x11f)]=_0x2672a7,_0x1ef0fd[_0x434159(0xc0)](_0x37faaf);}),_0x1ef0fd[_0x58b0cb(0xf0)](new Event(_0x58b0cb(0x10b)))):_0x1ef0fd['innerHTML']=_0x58b0cb(0x123);},_0x5e6011=async()=>{const _0x2fde9f=_0xf9dce7,_0x9677fd=_0x1ef0fd[_0x2fde9f(0xd2)];if(!_0x9677fd){_0x176c14['innerHTML']=_0x2fde9f(0xdc);return;}_0x176c14[_0x2fde9f(0xc9)]=_0x2fde9f(0x111);const _0x489251=await getLoresForWorldbook(_0x9677fd);_0x176c14[_0x2fde9f(0xc9)]='',_0x489251&&_0x489251[_0x2fde9f(0xd8)]>0x0?_0x489251[_0x2fde9f(0x103)](_0x2ef681=>{const _0x3fd0c7=_0x2fde9f,_0x5b5846=document['createElement']('option');_0x5b5846[_0x3fd0c7(0xd2)]=_0x2ef681[_0x3fd0c7(0xe9)],_0x5b5846['textContent']='['+_0x2ef681[_0x3fd0c7(0xe9)]+']\x20'+_0x2ef681[_0x3fd0c7(0x130)],_0x176c14[_0x3fd0c7(0xc0)](_0x5b5846);}):_0x176c14[_0x2fde9f(0xc9)]=_0x2fde9f(0xcf);};_0x53f794['addEventListener']('click',_0x1d8929),_0x1ef0fd[_0xf9dce7(0x112)](_0xf9dce7(0x10b),_0x5e6011),_0x314734['addEventListener'](_0xf9dce7(0x121),_0x5e6011),_0x49a012[_0xf9dce7(0x112)](_0xf9dce7(0x121),()=>{const _0x370071=_0xf9dce7,_0x120e93=_0x1ef0fd[_0x370071(0xd2)],_0x9267b0=_0x176c14[_0x370071(0xd2)];if(!_0x120e93||!_0x9267b0){toastr['error']('请先选择一个国史馆及其中的史册条目!',_0x370071(0xe6));return;}executeRefinement(_0x120e93,_0x9267b0);});}function showHistoriographyExclusionRulesModal(){const _0x1130c1=_0x4f8d,_0x35460d=extension_settings[extensionName][_0x1130c1(0xd4)]||[],_0x288d26=(_0x167234={'start':'','end':''},_0x545a70)=>_0x1130c1(0x12a)+_0x545a70+_0x1130c1(0x129)+_0x167234['start']+_0x1130c1(0xf2)+_0x167234[_0x1130c1(0x11e)]+_0x1130c1(0x10f),_0x4d3463=_0x35460d[_0x1130c1(0xdf)](_0x288d26)[_0x1130c1(0x12f)](''),_0x1ed899='\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20在这里定义需要从提取内容中排除的文本片段。例如,排除HTML注释,可以设置开始字符为\x20``。

\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+_0x4d3463+_0x1130c1(0xfa);showHtmlModal(_0x1130c1(0x10d),_0x1ed899,{'okText':'保存规则','onOk':_0x38ea18=>{const _0x40f05a=_0x1130c1,_0x41a221=[];_0x38ea18[_0x40f05a(0xda)](_0x40f05a(0x10c))[_0x40f05a(0xee)](function(){const _0x2501cd=_0x40f05a,_0x3688c2=$(this)['find'](_0x2501cd(0x131))['eq'](0x0)[_0x2501cd(0x115)]()[_0x2501cd(0x100)](),_0x215067=$(this)['find'](_0x2501cd(0x131))['eq'](0x1)[_0x2501cd(0x115)]()[_0x2501cd(0x100)]();_0x3688c2&&_0x215067&&_0x41a221[_0x2501cd(0xcd)]({'start':_0x3688c2,'end':_0x215067});}),extension_settings[extensionName][_0x40f05a(0xd4)]=_0x41a221,saveSettings(),toastr[_0x40f05a(0xb4)](_0x40f05a(0xc4),_0x40f05a(0xce));}});const _0x4a0859=document[_0x1130c1(0xc1)](_0x1130c1(0xe0)),_0x2d4b19=_0x4a0859[_0x1130c1(0x107)](_0x1130c1(0xff));_0x4a0859[_0x1130c1(0x107)](_0x1130c1(0xc6))[_0x1130c1(0x112)]('click',()=>{const _0x34f4a3=_0x1130c1,_0x51820e=_0x2d4b19[_0x34f4a3(0x117)][_0x34f4a3(0xd8)],_0xf61a56=_0x288d26({'start':'','end':''},_0x51820e);_0x2d4b19['insertAdjacentHTML']('beforeend',_0xf61a56);}),_0x2d4b19['addEventListener']('click',_0x1277bd=>{const _0xad226d=_0x1130c1;_0x1277bd[_0xad226d(0xe8)]['classList']['contains'](_0xad226d(0xf8))&&_0x1277bd[_0xad226d(0xe8)][_0xad226d(0xbb)](_0xad226d(0x10c))[_0xad226d(0x108)]();});} \ No newline at end of file diff --git a/ui/page-window.js b/ui/page-window.js index 45024b7..c147434 100644 --- a/ui/page-window.js +++ b/ui/page-window.js @@ -1,183 +1 @@ -import { messageFormatting } from '/script.js'; - -// 动态加载 Showdown.js 解析器 -function loadShowdown() { - return new Promise((resolve, reject) => { - if (window.showdown) { - resolve(); - return; - } - const script = document.createElement('script'); - script.src = 'https://cdnjs.cloudflare.com/ajax/libs/showdown/2.1.0/showdown.min.js'; - script.onload = resolve; - script.onerror = reject; - document.head.appendChild(script); - }); -} - -/** - * 创建并显示一个包含从URL加载的Markdown内容的模态弹窗。 - * @param {string} title - 弹窗的标题。 - * @param {string} contentUrl - 要加载的Markdown文件的URL。 - */ -export async function showContentModal(title, contentUrl) { - try { - // 确保Showdown库已加载 - await loadShowdown(); - - // 异步获取Markdown文件内容 - const markdownContent = await $.get(contentUrl); - - // 使用Showdown将Markdown转换为HTML,并开启表格等扩展 - const converter = new showdown.Converter({ - tables: true, - strikethrough: true, - ghCodeBlocks: true - }); - const htmlContent = converter.makeHtml(markdownContent); - - // 创建弹窗的HTML结构,复用更新日志的样式 - const dialogHtml = ` - - - `; - - // 将弹窗添加到body并显示 - const dialogElement = $(dialogHtml).appendTo('body'); - const closeDialog = () => { - dialogElement[0].close(); - dialogElement.remove(); - }; - dialogElement.find('.popup-button-ok').on('click', closeDialog); - dialogElement[0].showModal(); - - } catch (error) { - console.error(`[Amily-翰林院] 紧急报告:加载教程内容 [${title}] 时发生意外:`, error); - toastr.error(`无法加载教程: ${error.message}`, "翰林院回报"); - } -} - -/** - * 创建并显示一个包含自定义HTML内容的模态弹窗,并提供回调功能。 - * @param {string} title - 弹窗的标题。 - * @param {string} htmlContent - 要在弹窗中显示的HTML字符串。 - * @param {Object} [options={}] - 配置选项 - * @param {string} [options.okText='确认'] - “确认”按钮的文本。 - * @param {string} [options.cancelText='取消'] - “取消”按钮的文本。 - * @param {function} [options.onOk] - 点击“确认”按钮时执行的回调函数。接收弹窗的jQuery元素作为参数。 - * @param {function} [options.onCancel] - 点击“取消”按钮时执行的回调函数。 - * @param {boolean} [options.showCancel=true] - 是否显示“取消”按钮。 - */ -export function showHtmlModal(title, htmlContent, options = {}) { - const { - okText = '确认', - cancelText = '取消', - onOk, - onCancel, - showCancel = true, - } = options; - - // 构建按钮HTML - const buttonsHtml = ` - ${showCancel ? `` : ''} - - `; - - const dialogHtml = ` - - - `; - - const dialogElement = $(dialogHtml).appendTo('body'); - - const closeDialog = () => { - dialogElement[0].close(); - dialogElement.remove(); - }; - - dialogElement.find('.popup-button-ok').on('click', () => { - if (onOk) { - // 将关闭逻辑交给回调函数决定,或者默认关闭 - const shouldClose = onOk(dialogElement); - if (shouldClose !== false) { - closeDialog(); - } - } else { - closeDialog(); - } - }); - - if (showCancel) { - dialogElement.find('.popup-button-cancel').on('click', () => { - if (onCancel) { - onCancel(); - } - closeDialog(); - }); - } - - dialogElement[0].showModal(); - return dialogElement; // 返回弹窗元素以便外部可以操作 -} - -/** - * 创建并显示一个用于预览和编辑微言录总结的模态弹窗。 - * @param {string} summaryText - 初始的总结文本。 - * @param {Object} callbacks - 包含各个按钮回调函数的对象。 - * @param {function} callbacks.onConfirm - 点击“确认写入”时的回调,接收编辑后的文本。 - * @param {function} callbacks.onRegenerate - 点击“重新生成”时的回调。 - * @param {function} callbacks.onCancel - 点击“取消写入”时的回调。 - */ -export function showSummaryModal(summaryText, callbacks) { - const { onConfirm, onRegenerate, onCancel } = callbacks; - - const modalHtml = ` -
- -
- `; - - const dialogElement = showHtmlModal('预览与修订', modalHtml, { - okText: '确认写入', - cancelText: '取消写入', - showCancel: true, - onOk: (dialog) => { - const editedText = dialog.find('textarea').val(); - if (onConfirm) { - onConfirm(editedText); - } - // 返回 true 或 undefined 以关闭弹窗 - }, - onCancel: () => { - if (onCancel) { - onCancel(); - } - } - }); - - // 添加“重新生成”按钮 - const regenerateButton = $(''); - regenerateButton.on('click', () => { - if (onRegenerate) { - onRegenerate(dialogElement); // 将弹窗元素传递给回调,以便更新内容 - } - }); - - dialogElement.find('.popup-controls').prepend(regenerateButton); -} +(function(_0x4467c0,_0x244965){const _0x125dd8=_0x4f9e,_0x34dec2=_0x4467c0();while(!![]){try{const _0x5c1192=-parseInt(_0x125dd8(0xde))/0x1*(parseInt(_0x125dd8(0xe0))/0x2)+-parseInt(_0x125dd8(0xc2))/0x3*(-parseInt(_0x125dd8(0xd5))/0x4)+-parseInt(_0x125dd8(0xc4))/0x5+parseInt(_0x125dd8(0xd3))/0x6+parseInt(_0x125dd8(0xc7))/0x7*(-parseInt(_0x125dd8(0xc6))/0x8)+-parseInt(_0x125dd8(0xdb))/0x9+parseInt(_0x125dd8(0xce))/0xa*(parseInt(_0x125dd8(0xd0))/0xb);if(_0x5c1192===_0x244965)break;else _0x34dec2['push'](_0x34dec2['shift']());}catch(_0x4ef8b1){_0x34dec2['push'](_0x34dec2['shift']());}}}(_0x5610,0xaf2f4));import{messageFormatting}from'/script.js';function loadShowdown(){return new Promise((_0x3f970a,_0x493fdb)=>{const _0x1d7e4f=_0x4f9e;if(window[_0x1d7e4f(0xe2)]){_0x3f970a();return;}const _0x53d7ca=document[_0x1d7e4f(0xe3)](_0x1d7e4f(0xc8));_0x53d7ca[_0x1d7e4f(0xdd)]=_0x1d7e4f(0xe4),_0x53d7ca[_0x1d7e4f(0xd1)]=_0x3f970a,_0x53d7ca['onerror']=_0x493fdb,document[_0x1d7e4f(0xbb)][_0x1d7e4f(0xd7)](_0x53d7ca);});}function _0x4f9e(_0x360755,_0x25907c){const _0x56105c=_0x5610();return _0x4f9e=function(_0x4f9e8d,_0x2dc775){_0x4f9e8d=_0x4f9e8d-0xb6;let _0x2d9907=_0x56105c[_0x4f9e8d];return _0x2d9907;},_0x4f9e(_0x360755,_0x25907c);}export async function showContentModal(_0x357e8b,_0xf320ec){const _0x11e4c2=_0x4f9e;try{await loadShowdown();const _0x56d266=await $[_0x11e4c2(0xe1)](_0xf320ec),_0x33c03a=new showdown[(_0x11e4c2(0xdf))]({'tables':!![],'strikethrough':!![],'ghCodeBlocks':!![]}),_0x50d9d8=_0x33c03a[_0x11e4c2(0xb6)](_0x56d266),_0x5275ba=_0x11e4c2(0xd2)+_0x357e8b+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+_0x50d9d8+_0x11e4c2(0xcb),_0xf5f8c6=$(_0x5275ba)[_0x11e4c2(0xd9)](_0x11e4c2(0xdc)),_0x3b1367=()=>{const _0x1b2e0c=_0x11e4c2;_0xf5f8c6[0x0][_0x1b2e0c(0xd8)](),_0xf5f8c6[_0x1b2e0c(0xc3)]();};_0xf5f8c6[_0x11e4c2(0xbc)]('.popup-button-ok')['on'](_0x11e4c2(0xe8),_0x3b1367),_0xf5f8c6[0x0]['showModal']();}catch(_0x2b247d){console['error']('[Amily-翰林院]\x20紧急报告:加载教程内容\x20['+_0x357e8b+_0x11e4c2(0xe5),_0x2b247d),toastr[_0x11e4c2(0xcc)](_0x11e4c2(0xe7)+_0x2b247d[_0x11e4c2(0xbe)],_0x11e4c2(0xda));}}export function showHtmlModal(_0x45cc81,_0x497918,_0x34d970={}){const _0x37bdcc=_0x4f9e,{okText:okText='确认',cancelText:cancelText='取消',onOk:_0x55011f,onCancel:_0x1cd856,showCancel:showCancel=!![]}=_0x34d970,_0xa71ebb=_0x37bdcc(0xe6)+(showCancel?_0x37bdcc(0xc9)+cancelText+_0x37bdcc(0xb7):'')+_0x37bdcc(0xba)+okText+_0x37bdcc(0xd4),_0x2e7ee5=_0x37bdcc(0xbf)+_0x45cc81+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+_0x497918+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+_0xa71ebb+_0x37bdcc(0xc0),_0x5ef0a7=$(_0x2e7ee5)[_0x37bdcc(0xd9)](_0x37bdcc(0xdc)),_0x38b168=()=>{const _0x163d42=_0x37bdcc;_0x5ef0a7[0x0][_0x163d42(0xd8)](),_0x5ef0a7[_0x163d42(0xc3)]();};return _0x5ef0a7[_0x37bdcc(0xbc)]('.popup-button-ok')['on'](_0x37bdcc(0xe8),()=>{if(_0x55011f){const _0x29e7ac=_0x55011f(_0x5ef0a7);_0x29e7ac!==![]&&_0x38b168();}else _0x38b168();}),showCancel&&_0x5ef0a7[_0x37bdcc(0xbc)](_0x37bdcc(0xc5))['on'](_0x37bdcc(0xe8),()=>{_0x1cd856&&_0x1cd856(),_0x38b168();}),_0x5ef0a7[0x0][_0x37bdcc(0xc1)](),_0x5ef0a7;}function _0x5610(){const _0xf0c564=['\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20朕已阅\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','error','取消写入','10NvoPDM','重新生成','10786127urxmtM','onload','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','6415806anycuj','\x0a\x20\x20\x20\x20','12jKjmgB','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20','appendChild','close','appendTo','翰林院回报','8083503aRyUOX','body','src','1550fuySEp','Converter','158HdTHBk','get','showdown','createElement','https://cdnjs.cloudflare.com/ajax/libs/showdown/2.1.0/showdown.min.js',']\x20时发生意外:','\x0a\x20\x20\x20\x20\x20\x20\x20\x20','无法加载教程:\x20','click','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','makeHtml','','.popup-controls','textarea','\x0a\x20\x20\x20\x20\x20\x20\x20\x20','head','find','prepend','message','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20','showModal','849618hAeDeM','remove','4649205jiCYql','.popup-button-cancel','132264JuTCQj','98aHtblJ','script','','确认写入'];_0x5610=function(){return _0xf0c564;};return _0x5610();}export function showSummaryModal(_0x510fce,_0x43df1d){const _0x2c7f4f=_0x4f9e,{onConfirm:_0x34d9ae,onRegenerate:_0x41ac71,onCancel:_0x73801}=_0x43df1d,_0x4edc2e=_0x2c7f4f(0xe9)+_0x510fce+_0x2c7f4f(0xd6),_0x27b0d6=showHtmlModal('预览与修订',_0x4edc2e,{'okText':_0x2c7f4f(0xca),'cancelText':_0x2c7f4f(0xcd),'showCancel':!![],'onOk':_0x1335bc=>{const _0x1181f4=_0x2c7f4f,_0x2668e1=_0x1335bc[_0x1181f4(0xbc)](_0x1181f4(0xb9))['val']();_0x34d9ae&&_0x34d9ae(_0x2668e1);},'onCancel':()=>{_0x73801&&_0x73801();}}),_0x58f109=$(_0x2c7f4f(0xcf));_0x58f109['on'](_0x2c7f4f(0xe8),()=>{_0x41ac71&&_0x41ac71(_0x27b0d6);}),_0x27b0d6[_0x2c7f4f(0xbc)](_0x2c7f4f(0xb8))[_0x2c7f4f(0xbd)](_0x58f109);} \ No newline at end of file diff --git a/ui/state.js b/ui/state.js index 167a86f..534ec6b 100644 --- a/ui/state.js +++ b/ui/state.js @@ -1,149 +1 @@ -import { extension_settings } from "/scripts/extensions.js"; -import { extensionName } from "../utils/settings.js"; -import { pluginAuthStatus } from "../utils/auth.js"; - - - -let availableModels = []; -let latestUpdateInfo = null; -let newVersionAvailable = false; - -export function setUpdateInfo(isNew, updateInfo) { - newVersionAvailable = isNew; - latestUpdateInfo = updateInfo; -} - - -export function applyUpdateIndicator() { - if (newVersionAvailable) { - $('#amily2_update_indicator').show(); - $('#amily2_update_button_new').show(); - } else { - $('#amily2_update_indicator').hide(); - $('#amily2_update_button_new').hide(); - } -} - -export function getLatestUpdateInfo() { - return latestUpdateInfo; -} - -export function setAvailableModels(models) { - availableModels = models; -} - - -export function populateModelDropdown() { - const modelSelect = $("#amily2_model"); - const modelNotes = $("#amily2_model_notes"); - - modelSelect.empty(); - const currentModel = extension_settings[extensionName]?.model || ""; - - if (availableModels.length === 0) { - modelSelect.append(''); - modelNotes.html( - '请检查API配置后点击"刷新模型"', - ); - return; - } - - const defaultOption = $("").val("").text("-- 选择模型 --"); - modelSelect.append(defaultOption); - - availableModels.forEach((model) => { - const option = $("").val(model).text(model); - if (model === currentModel) { - option.attr("selected", "selected"); - } - modelSelect.append(option); - }); - - if (currentModel && modelSelect.val() === currentModel) { - modelNotes.html(`已选择: ${currentModel}`); - } else { - modelNotes.html(`已加载 ${availableModels.length} 个可用模型`); - } -} - - -export function updateUI() { - if (!pluginAuthStatus.authorized) { - $("#auth_panel").show(); - $(".plugin-features").hide(); - } else { - $("#auth_panel").hide(); - $(".plugin-features").show(); - - const settings = extension_settings[extensionName]; - if (!settings) return; - - $("#amily2_enabled").prop("checked", settings.enabled); - $("#amily2_api_url").val(settings.apiUrl); - $("#amily2_api_key").val(settings.apiKey); - $("#amily2_model").val(settings.model); - - - $("#amily2_max_tokens").val(settings.maxTokens); - $("#amily2_max_tokens_value").text(settings.maxTokens); - $("#amily2_temperature").val(settings.temperature); - $("#amily2_temperature_value").text(settings.temperature); - $("#amily2_context_messages").val(settings.contextMessages); - $("#amily2_context_messages_value").text(settings.contextMessages); - $("#amily2_optimization_target_tag").val(settings.optimizationTargetTag); - - - $( - `input[name="amily2_optimization_mode"][value="${settings.optimizationMode}"]`, - ).prop("checked", true); - $("#amily2_optimization_enabled").prop( - "checked", - settings.optimizationEnabled, - ); - $("#amily2_optimization_exclusion_enabled").prop( - "checked", - settings.optimizationExclusionEnabled, - ); - $("#amily2_show_optimization_toast").prop( - "checked", - settings.showOptimizationToast, - ); - $("#amily2_suppress_toast").prop("checked", settings.suppressToast); - - - $("#amily2_system_prompt").val(settings.systemPrompt); - $("#amily2_main_prompt").val(settings.mainPrompt); - $("#amily2_output_format_prompt").val(settings.outputFormatPrompt); - $("#amily2_summarization_prompt").val(settings.summarizationPrompt); - - - $("#amily2_worldbook_enabled").prop("checked", settings.worldbookEnabled); - $("#amily2_summarization_enabled").prop( - "checked", - settings.summarizationEnabled, - ); - $( - `input[name="amily2_lorebook_target"][value="${settings.lorebookTarget}"]`, - ).prop("checked", true); - - $(`input[name="amily2_icon_location"][value="${settings.iconLocation}"]`).prop("checked", true); - $("#amily2_auto_hide_enabled").prop("checked", settings.autoHideEnabled); - $("#amily2_auto_hide_threshold").val(settings.autoHideThreshold); - $("#amily2_auto_hide_threshold_value").text(settings.autoHideThreshold); - $('#amily2_lore_activation_mode').val(settings.loreActivationMode); - $('#amily2_lore_insertion_position').val(settings.loreInsertionPosition); - $('#amily2_lore_depth_input').val(settings.loreDepth); - if (settings.loreInsertionPosition === 'at_depth') { - $('#amily2_lore_depth_container').show(); - } else { - $('#amily2_lore_depth_container').hide(); - } - if (settings.historiographySmallAutoEnable !== undefined) { - $('#amily2_mhb_small_auto_enabled').prop('checked', settings.historiographySmallAutoEnable); - } - if (settings.historiographySmallTriggerThreshold !== undefined) { - $('#amily2_mhb_small_trigger_count').val(settings.historiographySmallTriggerThreshold); - } - populateModelDropdown(); - } -} +(function(_0x4929c8,_0x25f4c1){const _0x9e2b26=_0x338b,_0x13cf90=_0x4929c8();while(!![]){try{const _0x2eea82=-parseInt(_0x9e2b26(0x1a4))/0x1+parseInt(_0x9e2b26(0x17d))/0x2*(-parseInt(_0x9e2b26(0x198))/0x3)+parseInt(_0x9e2b26(0x18e))/0x4+-parseInt(_0x9e2b26(0x1a3))/0x5*(-parseInt(_0x9e2b26(0x1af))/0x6)+-parseInt(_0x9e2b26(0x1be))/0x7+-parseInt(_0x9e2b26(0x1ca))/0x8*(parseInt(_0x9e2b26(0x189))/0x9)+parseInt(_0x9e2b26(0x194))/0xa*(parseInt(_0x9e2b26(0x18a))/0xb);if(_0x2eea82===_0x25f4c1)break;else _0x13cf90['push'](_0x13cf90['shift']());}catch(_0x50e344){_0x13cf90['push'](_0x13cf90['shift']());}}}(_0x2a97,0xcd015));function _0x338b(_0x44f213,_0x15ef03){const _0x2a97ce=_0x2a97();return _0x338b=function(_0x338bfe,_0x60275d){_0x338bfe=_0x338bfe-0x17a;let _0x193f22=_0x2a97ce[_0x338bfe];return _0x193f22;},_0x338b(_0x44f213,_0x15ef03);}function _0x2a97(){const _0x4ec353=['suppressToast','summarizationPrompt','#amily2_auto_hide_enabled','autoHideThreshold','#amily2_lore_depth_container','1416366ARAFld','hide','loreDepth','--\x20选择模型\x20--','historiographySmallAutoEnable','#amily2_lore_depth_input','#amily2_context_messages','selected','optimizationEnabled','val','worldbookEnabled','#amily2_optimization_exclusion_enabled','5692608qpjaGr','apiKey','无可用模型,请刷新','#amily2_update_indicator','#amily2_model','19520eRSZlo','#amily2_main_prompt','\x20个可用模型','autoHideEnabled','loreActivationMode','showOptimizationToast','mainPrompt','html','lorebookTarget','#amily2_max_tokens','input[name=\x22amily2_optimization_mode\x22][value=\x22','append','9wrKPiB','71126vpNPXS','optimizationExclusionEnabled','#amily2_temperature_value','.plugin-features','5739932PXYQef','checked','temperature','apiUrl','summarizationEnabled','#amily2_output_format_prompt','5210Sobqcm','empty','#amily2_mhb_small_trigger_count','iconLocation','486FnZUFC','contextMessages','text','#amily2_api_url','historiographySmallTriggerThreshold','#amily2_context_messages_value','#amily2_api_key','#amily2_mhb_small_auto_enabled','#auth_panel','enabled','#amily2_optimization_target_tag','13315zczQVt','1642129UlGIsZ','input[name=\x22amily2_icon_location\x22][value=\x22','已选择:\x20','#amily2_model_notes','optimizationMode','#amily2_summarization_prompt','#amily2_temperature','请检查API配置后点击\x22刷新模型\x22','maxTokens','#amily2_update_button_new','#amily2_lore_activation_mode','390ovCfzD','at_depth','#amily2_show_optimization_toast','show','outputFormatPrompt','loreInsertionPosition','prop','length','#amily2_summarization_enabled',''];_0x2a97=function(){return _0x4ec353;};return _0x2a97();}import{extension_settings}from'/scripts/extensions.js';import{extensionName}from'../utils/settings.js';import{pluginAuthStatus}from'../utils/auth.js';let availableModels=[],latestUpdateInfo=null,newVersionAvailable=![];export function setUpdateInfo(_0x280a1b,_0x557536){newVersionAvailable=_0x280a1b,latestUpdateInfo=_0x557536;}export function applyUpdateIndicator(){const _0x479bcc=_0x338b;newVersionAvailable?($(_0x479bcc(0x17b))[_0x479bcc(0x1b2)](),$(_0x479bcc(0x1ad))[_0x479bcc(0x1b2)]()):($(_0x479bcc(0x17b))[_0x479bcc(0x1bf)](),$('#amily2_update_button_new')['hide']());}export function getLatestUpdateInfo(){return latestUpdateInfo;}export function setAvailableModels(_0x230755){availableModels=_0x230755;}export function populateModelDropdown(){const _0x1f30db=_0x338b,_0x31cbc9=$(_0x1f30db(0x17c)),_0x3eba67=$(_0x1f30db(0x1a7));_0x31cbc9[_0x1f30db(0x195)]();const _0x35ebfb=extension_settings[extensionName]?.['model']||'';if(availableModels[_0x1f30db(0x1b6)]===0x0){_0x31cbc9[_0x1f30db(0x188)](_0x1f30db(0x17a)),_0x3eba67[_0x1f30db(0x184)](_0x1f30db(0x1ab));return;}const _0x5bd6f7=$(_0x1f30db(0x1b8))['val']('')['text'](_0x1f30db(0x1c1));_0x31cbc9[_0x1f30db(0x188)](_0x5bd6f7),availableModels['forEach'](_0x44880b=>{const _0x36a991=_0x1f30db,_0x1abab8=$(_0x36a991(0x1b8))[_0x36a991(0x1c7)](_0x44880b)[_0x36a991(0x19a)](_0x44880b);_0x44880b===_0x35ebfb&&_0x1abab8['attr'](_0x36a991(0x1c5),_0x36a991(0x1c5)),_0x31cbc9['append'](_0x1abab8);}),_0x35ebfb&&_0x31cbc9[_0x1f30db(0x1c7)]()===_0x35ebfb?_0x3eba67[_0x1f30db(0x184)](_0x1f30db(0x1a6)+_0x35ebfb+''):_0x3eba67['html']('已加载\x20'+availableModels['length']+_0x1f30db(0x17f));}export function updateUI(){const _0x4823e1=_0x338b;if(!pluginAuthStatus['authorized'])$(_0x4823e1(0x1a0))['show'](),$(_0x4823e1(0x18d))['hide']();else{$(_0x4823e1(0x1a0))['hide'](),$(_0x4823e1(0x18d))[_0x4823e1(0x1b2)]();const _0x217344=extension_settings[extensionName];if(!_0x217344)return;$('#amily2_enabled')[_0x4823e1(0x1b5)](_0x4823e1(0x18f),_0x217344[_0x4823e1(0x1a1)]),$(_0x4823e1(0x19b))[_0x4823e1(0x1c7)](_0x217344[_0x4823e1(0x191)]),$(_0x4823e1(0x19e))[_0x4823e1(0x1c7)](_0x217344[_0x4823e1(0x1cb)]),$(_0x4823e1(0x17c))[_0x4823e1(0x1c7)](_0x217344['model']),$(_0x4823e1(0x186))[_0x4823e1(0x1c7)](_0x217344[_0x4823e1(0x1ac)]),$('#amily2_max_tokens_value')[_0x4823e1(0x19a)](_0x217344[_0x4823e1(0x1ac)]),$(_0x4823e1(0x1aa))[_0x4823e1(0x1c7)](_0x217344['temperature']),$(_0x4823e1(0x18c))['text'](_0x217344[_0x4823e1(0x190)]),$(_0x4823e1(0x1c4))['val'](_0x217344['contextMessages']),$(_0x4823e1(0x19d))[_0x4823e1(0x19a)](_0x217344[_0x4823e1(0x199)]),$(_0x4823e1(0x1a2))[_0x4823e1(0x1c7)](_0x217344['optimizationTargetTag']),$(_0x4823e1(0x187)+_0x217344[_0x4823e1(0x1a8)]+'\x22]')['prop'](_0x4823e1(0x18f),!![]),$('#amily2_optimization_enabled')[_0x4823e1(0x1b5)](_0x4823e1(0x18f),_0x217344[_0x4823e1(0x1c6)]),$(_0x4823e1(0x1c9))[_0x4823e1(0x1b5)]('checked',_0x217344[_0x4823e1(0x18b)]),$(_0x4823e1(0x1b1))['prop'](_0x4823e1(0x18f),_0x217344[_0x4823e1(0x182)]),$('#amily2_suppress_toast')['prop'](_0x4823e1(0x18f),_0x217344[_0x4823e1(0x1b9)]),$('#amily2_system_prompt')[_0x4823e1(0x1c7)](_0x217344['systemPrompt']),$(_0x4823e1(0x17e))[_0x4823e1(0x1c7)](_0x217344[_0x4823e1(0x183)]),$(_0x4823e1(0x193))[_0x4823e1(0x1c7)](_0x217344[_0x4823e1(0x1b3)]),$(_0x4823e1(0x1a9))[_0x4823e1(0x1c7)](_0x217344[_0x4823e1(0x1ba)]),$('#amily2_worldbook_enabled')[_0x4823e1(0x1b5)]('checked',_0x217344[_0x4823e1(0x1c8)]),$(_0x4823e1(0x1b7))[_0x4823e1(0x1b5)]('checked',_0x217344[_0x4823e1(0x192)]),$('input[name=\x22amily2_lorebook_target\x22][value=\x22'+_0x217344[_0x4823e1(0x185)]+'\x22]')[_0x4823e1(0x1b5)](_0x4823e1(0x18f),!![]),$(_0x4823e1(0x1a5)+_0x217344[_0x4823e1(0x197)]+'\x22]')[_0x4823e1(0x1b5)](_0x4823e1(0x18f),!![]),$(_0x4823e1(0x1bb))['prop'](_0x4823e1(0x18f),_0x217344[_0x4823e1(0x180)]),$('#amily2_auto_hide_threshold')['val'](_0x217344[_0x4823e1(0x1bc)]),$('#amily2_auto_hide_threshold_value')[_0x4823e1(0x19a)](_0x217344[_0x4823e1(0x1bc)]),$(_0x4823e1(0x1ae))[_0x4823e1(0x1c7)](_0x217344[_0x4823e1(0x181)]),$('#amily2_lore_insertion_position')['val'](_0x217344[_0x4823e1(0x1b4)]),$(_0x4823e1(0x1c3))[_0x4823e1(0x1c7)](_0x217344[_0x4823e1(0x1c0)]),_0x217344[_0x4823e1(0x1b4)]===_0x4823e1(0x1b0)?$(_0x4823e1(0x1bd))[_0x4823e1(0x1b2)]():$('#amily2_lore_depth_container')[_0x4823e1(0x1bf)](),_0x217344[_0x4823e1(0x1c2)]!==undefined&&$(_0x4823e1(0x19f))[_0x4823e1(0x1b5)](_0x4823e1(0x18f),_0x217344[_0x4823e1(0x1c2)]),_0x217344[_0x4823e1(0x19c)]!==undefined&&$(_0x4823e1(0x196))[_0x4823e1(0x1c7)](_0x217344[_0x4823e1(0x19c)]),populateModelDropdown();}} \ No newline at end of file