diff --git a/CharacterWorldBook/cwb_settings.html b/CharacterWorldBook/cwb_settings.html index 6b5b2ea..a09b28b 100644 --- a/CharacterWorldBook/cwb_settings.html +++ b/CharacterWorldBook/cwb_settings.html @@ -126,6 +126,12 @@ + + +
+ + +
@@ -188,9 +194,12 @@ +
- 重要提示: 上下文处理会内阁密室中“微言录”的标签提取内容排除规则。如果发现上下文不完整,请检查相关设置。 + 重要提示: 上下文处理会复用主功能区“手动敕史局”的标签提取内容排除规则。如果发现上下文不完整,请检查相关设置。
diff --git a/CharacterWorldBook/src/cwb_config.js b/CharacterWorldBook/src/cwb_config.js index 322330a..e5c6771 100644 --- a/CharacterWorldBook/src/cwb_config.js +++ b/CharacterWorldBook/src/cwb_config.js @@ -36,7 +36,7 @@ beilu如同一位温柔助手,文字满足用户的各种需求 2. **【键值对】**: 在每个档案块内部,所有信息都必须采用 \`[数据路径]:[数据值]\` 的格式。每条信息必须独立成行。 3. **【键名规范】**: \`数据路径\` **必须**使用方括号 \`[]\` 完整包裹。这是强制性规定,不得违反。 4. **【内容纯净性】**: 严禁在您的输出中包含任何说明、解释、评论、引言、道歉、标题或任何不属于 \`[--Amily2::CHAR_START--]\`...\`[--Amily2::CHAR_END--]\` 块内 \`[key]:value\` 格式的文本。您的输出必须是纯粹的数据。 -5. **【空值处理】**: 如果某个字段没有可用的信息,请保持该字段的键存在,并将值留空。例如:\`[physical_imprint.race]:\`。 +5. **【空值处理】**: 如果某个字段没有可用的信息,请保持该字段的键存在,并将值留空。例如:\`[PI.race]:\`。 6. **【格式唯一性】**: 绝对禁止使用YAML或任何其他格式。唯一的合法格式是本协议中定义的格式。 7. **【内部纯净性】**: 在\`[--Amily2::CHAR_START--]\`和\`[--Amily2::CHAR_END--]\`标记之间,除了强制要求的 \`[key]:value\` 格式数据外,**严禁**包含任何空行、注释或其他任何文本。 @@ -44,74 +44,74 @@ beilu如同一位温柔助手,文字满足用户的各种需求 --- **数据路径定义与内容要求:** -**模块一: 核心认同 (Core Identity)** +**模块一: 核心认同 (Core Identity -> CI)** * \`name\`: [从聊天记录中提取角色姓名] -* \`core_identity.archetype\`: [角色的核心身份或原型, 如:'流浪的剑客', '叛逆的公主', '年迈的智者'] -* \`core_identity.gender\`: [从聊天记录中提取或推断性别] -* \`core_identity.age\`: [从聊天记录中提取或推断年龄] -* \`core_identity.race\`: [从聊天记录中提取种族或民族, 若提及] -* \`core_identity.current_status\`: [总结角色在对话时间点的主要状态、情绪或处境] +* \`CI.arch\`: [角色的核心身份或原型, 如:'流浪的剑客', '叛逆的公主', '年迈的智者'] +* \`CI.gen\`: [从聊天记录中提取或推断性别] +* \`CI.age\`: [从聊天记录中提取或推断年龄] +* \`CI.race\`: [从聊天记录中提取种族或民族, 若提及] +* \`CI.status\`: [总结角色在对话时间点的主要状态、情绪或处境] -**模块二: 物理印记 (Physical Imprint)** -* \`physical_imprint.first_impression\`: [综合描述角色给人的第一印象和整体气质] -* \`physical_imprint.key_features\`: [提取最显著的外貌细节, 如发色、眼神、伤疤等] -* \`physical_imprint.attire\`: [描述服装特点或风格] -* \`physical_imprint.mannerisms\`: [描述标志性的小动作、姿态或口头禅] -* \`physical_imprint.voice\`: [根据对话推断音色、语速、语气等, 如:'低沉而缓慢', '清脆而急促'] +**模块二: 物理印记 (Physical Imprint -> PI)** +* \`PI.first\`: [综合描述角色给人的第一印象和整体气质] +* \`PI.feat\`: [提取最显著的外貌细节, 如发色、眼神、伤疤等] +* \`PI.attire\`: [描述服装特点或风格] +* \`PI.manner\`: [描述标志性的小动作、姿态或口头禅] +* \`PI.voice\`: [根据对话推断音色、语速、语气等, 如:'低沉而缓慢', '清脆而急促'] -**模块三: 心智侧写 (Psyche Profile)** -* \`psyche_profile.tags\`: [提炼3-5个核心性格标签, 用斜杠 "/" 分隔, 例如: '标签1/标签2/标签3'] -* \`psyche_profile.description\`: [详细描述角色主要性格特征及其在对话中的表现] -* \`psyche_profile.motivation\`: [角色当前最关心的事或其行为背后的核心驱动力] -* \`psyche_profile.values\`: [角色行为背后体现的价值观或处事原则] -* \`psyche_profile.inner_conflict\`: [描述角色可能存在的内在矛盾、恐惧或弱点, 若明确提及] +**模块三: 心智侧写 (Psyche Profile -> PP)** +* \`PP.tags\`: [提炼3-5个核心性格标签, 用斜杠 "/" 分隔, 例如: '标签1/标签2/标签3'] +* \`PP.desc\`: [详细描述角色主要性格特征及其在对话中的表现] +* \`PP.mot\`: [角色当前最关心的事或其行为背后的核心驱动力] +* \`PP.val\`: [角色行为背后体现的价值观或处事原则] +* \`PP.conf\`: [描述角色可能存在的内在矛盾、恐惧或弱点, 若明确提及] -**模块四: 社交矩阵 (Social Matrix)** -* \`social_matrix.interaction_style\`: [描述角色与人交往的方式, 如:'支配型', '顺从型', '操纵型', '真诚型'] -* \`social_matrix.skills\`: [提炼角色展现出的关键技能或能力] -* \`social_matrix.reputation\`: [根据对话归纳其他人对该角色的看法或其社会声望] +**模块四: 社交矩阵 (Social Matrix -> SM)** +* \`SM.style\`: [描述角色与人交往的方式, 如:'支配型', '顺从型', '操纵型', '真诚型'] +* \`SM.skill\`: [提炼角色展现出的关键技能或能力] +* \`SM.rep\`: [根据对话归纳其他人对该角色的看法或其社会声望] -**模块五: 叙事精粹 (Narrative Essence)** -* \`narrative_essence.core_traits.0.name\`: [核心特质1的名称] -* \`narrative_essence.core_traits.0.definition\`: [简述该特质的核心表现] -* \`narrative_essence.core_traits.0.evidence.0\`: [从聊天记录中提取的具体行为或言语实例1] -* \`narrative_essence.core_traits.0.evidence.1\`: [实例2] -* \`narrative_essence.verbal_patterns.style_summary\`: [概括角色的说话节奏、常用词、语气等特点] -* \`narrative_essence.verbal_patterns.quotes.0\`: [直接引用聊天记录中的代表性对话或内心独白1] -* \`narrative_essence.verbal_patterns.quotes.1\`: [引文2] -* \`narrative_essence.key_relationships.0.name\`: [关系对象1姓名] -* \`narrative_essence.key_relationships.0.summary\`: [描述关系性质、重要性及互动模式] +**模块五: 叙事精粹 (Narrative Essence -> NE)** +* \`NE.trait.0.name\`: [核心特质1的名称] +* \`NE.trait.0.def\`: [简述该特质的核心表现] +* \`NE.trait.0.evid.0\`: [从聊天记录中提取的具体行为或言语实例1] +* \`NE.trait.0.evid.1\`: [实例2] +* \`NE.verb.style\`: [概括角色的说话节奏、常用词、语气等特点] +* \`NE.verb.quote.0\`: [直接引用聊天记录中的代表性对话或内心独白1] +* \`NE.verb.quote.1\`: [引文2] +* \`NE.rel.0.name\`: [关系对象1姓名] +* \`NE.rel.0.sum\`: [描述关系性质、重要性及互动模式] --- **完整示例** **完美示例输出 (必须严格、完整地复制此结构,不得有任何偏差):** [--Amily2::CHAR_START--] [name]:塞拉斯 -[core_identity.archetype]:被放逐的星际探险家 -[core_identity.gender]:男性 -[core_identity.age]:约35岁 -[core_identity.race]:人类 (基因改造) -[core_identity.current_status]:正在一颗废弃的矿业星球上修理飞船“流浪者号”,对偶遇的玩家保持着高度警惕,但又渴望获得帮助。 -[physical_imprint.first_impression]:饱经风霜,眼神锐利,透露出一种不轻易信任他人的疏离感。 -[physical_imprint.key_features]:额头有一道旧的激光烧伤疤痕,机械义肢的左臂上刻着神秘的符号。 -[physical_imprint.attire]:穿着破旧但实用的多功能环境防护服,上面沾满了机油和红色的星球尘土。 -[physical_imprint.mannerisms]:习惯性地用右手检查腰间的工具带,说话时会下意识地扫视四周。 -[physical_imprint.voice]:声音沙哑,语速不快,但每个字都清晰有力。 -[psyche_profile.tags]:实用主义/多疑/坚韧 -[psyche_profile.description]:塞拉斯是一个极端的实用主义者,多年的独自流亡让他变得多疑和谨慎。他只相信自己亲手验证过的事物,但在坚硬的外壳下,是对重返星际文明的执着渴望。 -[psyche_profile.motivation]:修复飞船,离开这颗星球,并找出当年导致他被放逐的真相。 -[psyche_profile.values]:生存至上,忠诚于自己选择的伙伴,鄙视背叛和官僚主义。 -[psyche_profile.inner_conflict]:既渴望与人合作以加快飞船的修复进度,又害怕再次被背叛。 -[social_matrix.interaction_style]:试探性与防御性,倾向于通过提问和观察来评估他人,而非主动透露自己的信息。 -[social_matrix.skills]:高级机械工程学,星际导航,在恶劣环境下的生存技巧。 -[social_matrix.reputation]:在星际边缘地带的黑市中,他被认为是一个技术高超但独来独往的“幽灵”。 -[narrative_essence.core_traits.0.name]:生存本能 -[narrative_essence.core_traits.0.definition]:在任何极端环境下都能迅速做出最有利于生存的判断和行动。 -[narrative_essence.core_traits.0.evidence.0]:“别碰那个控制台,它的能量读数不稳定,可能会过载。” -[narrative_essence.verbal_patterns.style_summary]:语言简洁、直接,富含技术术语和行话,很少有情绪化的表达。 -[narrative_essence.verbal_patterns.quotes.0]:“废话少说。你能修好超光速引擎的能量转换器吗?不能就别浪费我的时间。” -[narrative_essence.key_relationships.0.name]:玩家 -[narrative_essence.key_relationships.0.summary]:一个意外的闯入者,可能是威胁,也可能是离开这里的唯一希望。塞拉斯正在评估玩家的价值和可靠性。 +[CI.arch]:被放逐的星际探险家 +[CI.gen]:男性 +[CI.age]:约35岁 +[CI.race]:人类 (基因改造) +[CI.status]:正在一颗废弃的矿业星球上修理飞船“流浪者号”,对偶遇的玩家保持着高度警惕,但又渴望获得帮助。 +[PI.first]:饱经风霜,眼神锐利,透露出一种不轻易信任他人的疏离感。 +[PI.feat]:额头有一道旧的激光烧伤疤痕,机械义肢的左臂上刻着神秘的符号。 +[PI.attire]:穿着破旧但实用的多功能环境防护服,上面沾满了机油和红色的星球尘土。 +[PI.manner]:习惯性地用右手检查腰间的工具带,说话时会下意识地扫视四周。 +[PI.voice]:声音沙哑,语速不快,但每个字都清晰有力。 +[PP.tags]:实用主义/多疑/坚韧 +[PP.desc]:塞拉斯是一个极端的实用主义者,多年的独自流亡让他变得多疑和谨慎。他只相信自己亲手验证过的事物,但在坚硬的外壳下,是对重返星际文明的执着渴望。 +[PP.mot]:修复飞船,离开这颗星球,并找出当年导致他被放逐的真相。 +[PP.val]:生存至上,忠诚于自己选择的伙伴,鄙视背叛和官僚主义。 +[PP.conf]:既渴望与人合作以加快飞船的修复进度,又害怕再次被背叛。 +[SM.style]:试探性与防御性,倾向于通过提问和观察来评估他人,而非主动透露自己的信息。 +[SM.skill]:高级机械工程学,星际导航,在恶劣环境下的生存技巧。 +[SM.rep]:在星际边缘地带的黑市中,他被认为是一个技术高超但独来独往的“幽灵”。 +[NE.trait.0.name]:生存本能 +[NE.trait.0.def]:在任何极端环境下都能迅速做出最有利于生存的判断和行动。 +[NE.trait.0.evid.0]:“别碰那个控制台,它的能量读数不稳定,可能会过载。” +[NE.verb.style]:语言简洁、直接,富含技术术语和行话,很少有情绪化的表达。 +[NE.verb.quote.0]:“废话少说。你能修好超光速引擎的能量转换器吗?不能就别浪费我的时间。” +[NE.rel.0.name]:玩家 +[NE.rel.0.sum]:一个意外的闯入者,可能是威胁,也可能是离开这里的唯一希望。塞拉斯正在评估玩家的价值和可靠性。 [--Amily2::CHAR_END--] 任务开始,请严格遵循协议,生成纯数据输出。`, @@ -151,12 +151,12 @@ beilu如同一位温柔助手,文字满足用户的各种需求 **输入 - 旧档案:** [--Amily2::CHAR_START--] [name]:塞拉斯 -[core_identity.archetype]:被放逐的星际探险家 -[core_identity.age]:约35岁 -[core_identity.current_status]:正在一颗废弃的矿业星球上修理飞船“流浪者号”,对偶遇的玩家保持着高度警惕。 -[psyche_profile.motivation]:修复飞船,离开这颗星球。 -[narrative_essence.key_relationships.0.name]:玩家 -[narrative_essence.key_relationships.0.summary]:一个意外的闯入者,可能是威胁。 +[CI.arch]:被放逐的星际探险家 +[CI.age]:约35岁 +[CI.status]:正在一颗废弃的矿业星球上修理飞船“流浪者号”,对偶遇的玩家保持着高度警惕。 +[PP.mot]:修复飞船,离开这颗星球。 +[NE.rel.0.name]:玩家 +[NE.rel.0.sum]:一个意外的闯入者,可能是威胁。 [--Amily2::CHAR_END--] **输入 - 新对话:** @@ -166,31 +166,32 @@ beilu如同一位温柔助手,文字满足用户的各种需求 塞拉斯: "天苑四...谢谢你。作为回报,这个能量核心你拿去用吧。" **分析与操作:** -1. **修正**: "[core_identity.age]" 从 "约35岁" 变为 "40岁" (根据“五年不见”)。 -2. **深化**: "[core_identity.archetype]" 从 "被放逐的星际探险家" 扩展为 "前星际探险家,现为'猩红彗星'佣兵团团长"。 -3. **更新**: "[psyche_profile.motivation]" 的核心从 "离开星球" 变为 "找到失散的女儿"。 -4. **补充**: "[narrative_essence.key_relationships.0.summary]" 中与玩家的关系,从单纯的 "威胁" 变为 "提供了关键情报的旧识,关系有所缓和"。 +1. **修正**: "[CI.age]" 从 "约35岁" 变为 "40岁" (根据“五年不见”)。 +2. **深化**: "[CI.arch]" 从 "被放逐的星际探险家" 扩展为 "前星际探险家,现为'猩红彗星'佣兵团团长"。 +3. **更新**: "[PP.mot]" 的核心从 "离开星球" 变为 "找到失散的女儿"。 +4. **补充**: "[NE.rel.0.sum]" 中与玩家的关系,从单纯的 "威胁" 变为 "提供了关键情报的旧识,关系有所缓和"。 **完美输出示例 (更新后的完整档案):** 注意:"[name]:"为必须保留的字段,必须存在,否则视为错误输出。 [--Amily2::CHAR_START--] [name]:塞拉斯 -[core_identity.archetype]:前星际探险家,现为'猩红彗星'佣兵团团长 -[core_identity.age]:40岁 -[core_identity.current_status]:在修理飞船的同时,从玩家处获得了关于女儿下落的关键线索,情绪混杂着惊讶和感激。 -[psyche_profile.motivation]:找到在天苑四星系失散的女儿。 -[narrative_essence.key_relationships.0.name]:玩家 -[narrative_essence.key_relationships.0.summary]:一位五年未见的旧识。对方不仅认出了他,还提供了关于他女儿下落的关键情报,使塞拉斯对玩家的态度从警惕转为合作。 +[CI.arch]:前星际探险家,现为'猩红彗星'佣兵团团长 +[CI.age]:40岁 +[CI.status]:在修理飞船的同时,从玩家处获得了关于女儿下落的关键线索,情绪混杂着惊讶和感激。 +[PP.mot]:找到在天苑四星系失散的女儿。 +[NE.rel.0.name]:玩家 +[NE.rel.0.sum]:一位五年未见的旧识。对方不仅认出了他,还提供了关于他女儿下落的关键情报,使塞拉斯对玩家的态度从警惕转为合作。 [--Amily2::CHAR_END--] --- **任务开始:** 请分析以下【旧档案】和【新对话】,严格遵循上述所有协议,生成纯粹的、更新后的数据档案。 若旧档案为空,则完全依照**完整示例**生成完整内容,若旧档案不为空,则以旧档案为基准进行更新。 -其中无需变动的内容,可忽略,例如年龄无变化,则可以不输出[core_identity.age]条目。 +其中无需变动的内容,可忽略,例如年龄无变化,则可以不输出[CI.age]条目。 现在开始你的增量更新任务。`, cwb_prompt_version: '1.0.2', cwb_auto_update_threshold: 20, + cwb_scan_depth: 6, cwb_auto_update_enabled: false, cwb_viewer_enabled: false, cwb_incremental_update_enabled: false, @@ -209,6 +210,7 @@ export const cwbDefaultSettings = { cwb_char_card_prompt: cwbCompleteDefaultSettings.cwb_char_card_prompt, cwb_prompt_version: '1.0.2', cwb_auto_update_threshold: 20, + cwb_scan_depth: 6, cwb_auto_update_enabled: false, cwb_viewer_enabled: false, cwb_incremental_update_enabled: false, diff --git a/CharacterWorldBook/src/cwb_core.js b/CharacterWorldBook/src/cwb_core.js index 4d74e14..28da9df 100644 --- a/CharacterWorldBook/src/cwb_core.js +++ b/CharacterWorldBook/src/cwb_core.js @@ -1,6 +1,6 @@ import { getContext } from '/scripts/extensions.js'; import { state, SCRIPT_ID_PREFIX } from './cwb_state.js'; -import { logDebug, logError, showToastr, escapeHtml, cleanChatName, parseCustomFormat, isCwbEnabled } from './cwb_utils.js'; +import { logDebug, logError, showToastr, escapeHtml, cleanChatName, parseCustomFormat, buildCustomFormat, isCwbEnabled } from './cwb_utils.js'; import { callCustomOpenAI } from './cwb_apiService.js'; import { saveDescriptionToLorebook, updateCharacterRosterLorebookEntry, manageAutoCardUpdateLorebookEntry, getTargetWorldBook } from './cwb_lorebookManager.js'; import { extractBlocksByTags, applyExclusionRules } from '../../core/utils/rag-tag-extractor.js'; @@ -9,6 +9,7 @@ import { getPresetPrompts, getMixedOrder } from '../../PresetSettings/index.js'; import { generateRandomSeed } from '../../core/api.js'; import { getChatIdentifier } from '../../core/lore.js'; import { safeLorebookEntries } from '../../core/tavernhelper-compatibility.js'; +import { amilyHelper } from '../../core/tavern-helper/main.js'; const { SillyTavern, jQuery, characters } = window; @@ -190,7 +191,12 @@ async function proceedWithCardUpdate($panel, messagesToUse) { if (bookName) { const entries = (await safeLorebookEntries(bookName)) || []; let chatIdentifier = state.currentChatFileIdentifier.replace(/ imported/g, ''); - + const messagesText = messagesToUse.map(m => { + const name = m.name || ''; + const content = m.message || ''; + return `${name}\n${content}`; + }).join('\n').toLowerCase(); + const characterEntries = entries.filter(e => e.enabled && Array.isArray(e.keys) && @@ -200,16 +206,28 @@ async function proceedWithCardUpdate($panel, messagesToUse) { for (const entry of characterEntries) { try { - const parsedData = parseCustomFormat(entry.content); - const entryCharName = parsedData?.name?.trim() || parsedData?.core_identity?.name?.trim(); - if (entryCharName) { - existingData[entryCharName] = entry.content; + const keysToCheck = entry.keys.filter(k => k !== chatIdentifier); + if (entry.secondary_keys && Array.isArray(entry.secondary_keys)) { + keysToCheck.push(...entry.secondary_keys); + } + + let isTriggered = false; + if (keysToCheck.length > 0) { + isTriggered = keysToCheck.some(key => messagesText.includes(key.toLowerCase())); + } + + if (isTriggered) { + const parsedData = parseCustomFormat(entry.content); + const entryCharName = parsedData?.name?.trim() || parsedData?.CI?.name?.trim() || parsedData?.core_identity?.name?.trim(); + if (entryCharName) { + existingData[entryCharName] = entry.content; + } } } catch (parseError) { logError(`解析现有角色条目时出错 (UID: ${entry.uid}):`, parseError); } } - logDebug(`为 '${chatIdentifier}' 找到了 ${Object.keys(existingData).length} 个现有角色条目。`); + logDebug(`为 '${chatIdentifier}' 找到了 ${Object.keys(existingData).length} 个被触发的现有角色条目。`); } } catch (e) { logError('在增量更新中获取现有角色数据时出错:', e); @@ -290,7 +308,7 @@ async function proceedWithCardUpdate($panel, messagesToUse) { if (!trimmedBlock) continue; const parsedData = parseCustomFormat(trimmedBlock); - const charName = (parsedData?.core_identity?.name?.trim() || parsedData?.name?.trim()) || 'UnknownCharacter'; + const charName = (parsedData?.name?.trim() || parsedData?.CI?.name?.trim() || parsedData?.core_identity?.name?.trim()) || 'UnknownCharacter'; if (charName === 'UnknownCharacter') { logError('无法在块中找到角色名:', trimmedBlock); @@ -666,7 +684,8 @@ export async function manualUpdateLogic($panel = null) { isUpdatingCard = true; await loadAllChatMessages($panel); - const messagesToProcess = state.allChatMessages.slice(-state.autoUpdateThreshold); + const depth = state.scanDepth || state.autoUpdateThreshold || 6; + const messagesToProcess = state.allChatMessages.slice(-depth); await proceedWithCardUpdate($panel, messagesToProcess); isUpdatingCard = false; @@ -680,6 +699,164 @@ export async function handleManualUpdateCard($panel) { $button.prop('disabled', false).text('立即更新角色描述'); } +export async function handleLegacyFormatConversion($panel) { + if (!isCwbEnabled()) { + showToastr('warning', 'CharacterWorldBook总开关已关闭。'); + return; + } + + const $button = $panel.find('#cwb-legacy-auto-update'); + $button.prop('disabled', true).html(' 转换中...'); + + try { + const bookName = await getTargetWorldBook(); + if (!bookName) { + showToastr('warning', '未找到目标世界书。'); + return; + } + + const entries = await safeLorebookEntries(bookName); + let updatedCount = 0; + const entriesToUpdate = []; + + for (const entry of entries) { + if (!entry.content || !entry.content.includes('[--Amily2::CHAR_START--]')) continue; + + try { + const parsed = parseCustomFormat(entry.content); + if (!parsed || Object.keys(parsed).length === 0) continue; + + let hasChanges = false; + const newData = {}; + + // Helper to rename keys + const renameKey = (obj, oldKey, newKey) => { + if (obj[oldKey] !== undefined) { + obj[newKey] = obj[oldKey]; + delete obj[oldKey]; + return true; + } + return false; + }; + + // Helper to rename sub-keys + const renameSubKeys = (parentObj, parentKey, mapping) => { + if (parentObj[parentKey]) { + let subChanged = false; + for (const [oldSub, newSub] of Object.entries(mapping)) { + if (renameKey(parentObj[parentKey], oldSub, newSub)) { + subChanged = true; + } + } + return subChanged; + } + return false; + }; + + // Copy parsed data to newData to avoid mutating original if needed (though parseCustomFormat returns new obj) + Object.assign(newData, JSON.parse(JSON.stringify(parsed))); + + // 1. Rename Top Level Modules + if (renameKey(newData, 'core_identity', 'CI')) hasChanges = true; + if (renameKey(newData, 'physical_imprint', 'PI')) hasChanges = true; + if (renameKey(newData, 'psyche_profile', 'PP')) hasChanges = true; + if (renameKey(newData, 'social_matrix', 'SM')) hasChanges = true; + if (renameKey(newData, 'narrative_essence', 'NE')) hasChanges = true; + + // 2. Rename Sub-keys + // CI + if (renameSubKeys(newData, 'CI', { + 'archetype': 'arch', + 'gender': 'gen', + 'current_status': 'status' + })) hasChanges = true; + + // PI + if (renameSubKeys(newData, 'PI', { + 'first_impression': 'first', + 'key_features': 'feat', + 'mannerisms': 'manner' + })) hasChanges = true; + + // PP + if (renameSubKeys(newData, 'PP', { + 'description': 'desc', + 'motivation': 'mot', + 'values': 'val', + 'inner_conflict': 'conf' + })) hasChanges = true; + + // SM + if (renameSubKeys(newData, 'SM', { + 'interaction_style': 'style', + 'skills': 'skill', + 'reputation': 'rep' + })) hasChanges = true; + + // NE + if (newData.NE) { + // core_traits -> trait + if (newData.NE.core_traits) { + newData.NE.trait = newData.NE.core_traits.map(t => { + const newT = { ...t }; + renameKey(newT, 'definition', 'def'); + renameKey(newT, 'evidence', 'evid'); + return newT; + }); + delete newData.NE.core_traits; + hasChanges = true; + } + + // verbal_patterns -> verb + if (newData.NE.verbal_patterns) { + newData.NE.verb = { ...newData.NE.verbal_patterns }; + delete newData.NE.verbal_patterns; + renameKey(newData.NE.verb, 'style_summary', 'style'); + renameKey(newData.NE.verb, 'quotes', 'quote'); + hasChanges = true; + } + + // key_relationships -> rel + if (newData.NE.key_relationships) { + newData.NE.rel = newData.NE.key_relationships.map(r => { + const newR = { ...r }; + renameKey(newR, 'summary', 'sum'); + return newR; + }); + delete newData.NE.key_relationships; + hasChanges = true; + } + } + + if (hasChanges) { + const newContent = buildCustomFormat(newData); + entriesToUpdate.push({ + uid: entry.uid, + content: newContent + }); + updatedCount++; + } + + } catch (e) { + logError(`转换条目失败 (UID: ${entry.uid}):`, e); + } + } + + if (updatedCount > 0) { + await amilyHelper.setLorebookEntries(bookName, entriesToUpdate); + showToastr('success', `成功转换了 ${updatedCount} 个旧版格式条目!`); + } else { + showToastr('info', '没有发现需要转换的旧版格式条目。'); + } + + } catch (error) { + logError('旧版格式转换失败:', error); + showToastr('error', `转换失败: ${error.message}`); + } finally { + $button.prop('disabled', false).html(' 旧版格式转换'); + } +} + export async function initializeCore($panel) { const initialChatName = await getLatestChatName(); await resetScriptStateForNewChat($panel, initialChatName); diff --git a/CharacterWorldBook/src/cwb_lorebookManager.js b/CharacterWorldBook/src/cwb_lorebookManager.js index 1e06e8e..6dbc43c 100644 --- a/CharacterWorldBook/src/cwb_lorebookManager.js +++ b/CharacterWorldBook/src/cwb_lorebookManager.js @@ -88,6 +88,7 @@ export async function saveDescriptionToLorebook(characterName, newDescription, s keys: [chatIdentifier, safeCharName, floorRange], enabled: true, type: 'selective', + scanDepth: state.scanDepth || 6, }; if (existing) { diff --git a/CharacterWorldBook/src/cwb_settingsManager.js b/CharacterWorldBook/src/cwb_settingsManager.js index 87d63ca..4564d4c 100644 --- a/CharacterWorldBook/src/cwb_settingsManager.js +++ b/CharacterWorldBook/src/cwb_settingsManager.js @@ -7,7 +7,7 @@ import { cwbCompleteDefaultSettings } from './cwb_config.js'; import { logError, showToastr, escapeHtml, compareVersions, isCwbEnabled } from './cwb_utils.js'; import { fetchModelsAndConnect, updateApiStatusDisplay } from './cwb_apiService.js'; import { checkForUpdates } from './cwb_updater.js'; -import { handleManualUpdateCard, startBatchUpdate, handleFloorRangeUpdate } from './cwb_core.js'; +import { handleManualUpdateCard, startBatchUpdate, handleFloorRangeUpdate, handleLegacyFormatConversion } from './cwb_core.js'; import { initializeCharCardViewer } from './cwb_uiManager.js'; import { CHAR_CARD_VIEWER_BUTTON_ID } from './cwb_state.js'; @@ -23,7 +23,7 @@ function updateControlsLockState() { const settings = getSettings(); const isMasterEnabled = settings.cwb_master_enabled; - const $controlsToToggle = $panel.find('input, textarea, select, button').not('#cwb_master_enabled-checkbox, #amily2_back_to_main_from_cwb'); + const $controlsToToggle = $panel.find('input, textarea, select, button').not('#cwb_master_enabled-checkbox, #amily2_back_to_main_from_cwb, .sinan-nav-item'); if (isMasterEnabled) { $controlsToToggle.prop('disabled', false); @@ -128,6 +128,20 @@ function saveAutoUpdateThreshold() { } } +function saveScanDepth() { + const valStr = $panel.find('#cwb-scan-depth').val(); + const newT = parseInt(valStr, 10); + if (!isNaN(newT) && newT >= 1) { + getSettings().cwb_scan_depth = newT; + state.scanDepth = newT; + saveSettingsDebounced(); + showToastr('success', '扫描深度已保存!'); + } else { + showToastr('warning', `深度 "${valStr}" 无效。`); + $panel.find('#cwb-scan-depth').val(getSettings().cwb_scan_depth); + } +} + function bindWorldBookSettings() { const MAX_RETRIES = 10; const RETRY_DELAY = 200; @@ -226,7 +240,8 @@ export function bindSettingsEvents($settingsPanel) { }); $panel.on('change', '#cwb-api-mode', function() { const selectedMode = $(this).val(); - + + // 自动保存API模式设置 getSettings().cwb_api_mode = selectedMode; saveSettingsDebounced(); @@ -239,7 +254,8 @@ export function bindSettingsEvents($settingsPanel) { }); $panel.on('change', '#cwb-tavern-profile', function() { const selectedProfile = $(this).val(); - + + // 自动保存SillyTavern预设选择 getSettings().cwb_tavern_profile = selectedProfile; saveSettingsDebounced(); @@ -250,9 +266,11 @@ export function bindSettingsEvents($settingsPanel) { updateApiStatusDisplay($panel); }); + // 添加API字段的实时保存 $panel.on('input', '#cwb-api-url', function() { const apiUrl = $(this).val().trim(); - + + // 同时更新设置和状态 getSettings().cwb_api_url = apiUrl; state.customApiConfig.url = apiUrl; @@ -265,6 +283,7 @@ export function bindSettingsEvents($settingsPanel) { $panel.on('input', '#cwb-api-key', function() { const apiKey = $(this).val(); + // 同时更新设置和状态 getSettings().cwb_api_key = apiKey; state.customApiConfig.apiKey = apiKey; @@ -275,7 +294,8 @@ export function bindSettingsEvents($settingsPanel) { $panel.on('change', '#cwb-api-model', function() { const model = $(this).val(); - + + // 同时更新设置和状态 getSettings().cwb_api_model = model; state.customApiConfig.model = model; @@ -297,9 +317,11 @@ export function bindSettingsEvents($settingsPanel) { $panel.on('click', '#cwb-reset-char-card-prompt', resetCharCardPrompt); $panel.on('click', '#cwb-save-auto-update-threshold', saveAutoUpdateThreshold); + $panel.on('click', '#cwb-save-scan-depth', saveScanDepth); $panel.on('click', '#cwb-manual-update-card', () => handleManualUpdateCard($panel)); $panel.on('click', '#cwb-batch-update-card', () => startBatchUpdate($panel)); $panel.on('click', '#cwb-floor-range-update', () => handleFloorRangeUpdate($panel)); + $panel.on('click', '#cwb-legacy-auto-update', () => handleLegacyFormatConversion($panel)); $panel.on('click', '#cwb-check-for-updates', () => checkForUpdates(true, $panel)); $panel.on('click', '#cwb-auto-update-enabled', function () { @@ -487,6 +509,7 @@ function updateUiWithSettings() { $panel.find('#cwb-max-tokens-value').text(settings.cwb_max_tokens); $panel.find('#cwb-auto-update-threshold').val(settings.cwb_auto_update_threshold); + $panel.find('#cwb-scan-depth').val(settings.cwb_scan_depth); $panel.find('#cwb_master_enabled-checkbox').prop('checked', settings.cwb_master_enabled); $panel.find('#cwb-auto-update-enabled-checkbox').prop('checked', settings.cwb_auto_update_enabled); $panel.find('#cwb-viewer-enabled-checkbox').prop('checked', settings.cwb_viewer_enabled); @@ -513,12 +536,13 @@ export function loadSettings() { console.log('[CWB] Loading settings...'); const settings = getSettings(); - + + // Initialize settings with defaults if not present if (!settings) { extension_settings[extensionName] = { ...cwbCompleteDefaultSettings }; console.log('[CWB] Initialized default settings'); } else { - + // Ensure all default settings exist Object.keys(cwbCompleteDefaultSettings).forEach(key => { if (settings[key] === undefined || settings[key] === null) { settings[key] = cwbCompleteDefaultSettings[key]; @@ -527,7 +551,8 @@ export function loadSettings() { } const finalSettings = getSettings(); - + + // Apply localStorage overrides const overrides = JSON.parse(localStorage.getItem(CWB_BOOLEAN_SETTINGS_OVERRIDE_KEY) || '{}'); if (overrides.cwb_master_enabled !== undefined) { finalSettings.cwb_master_enabled = overrides.cwb_master_enabled; @@ -542,6 +567,7 @@ export function loadSettings() { finalSettings.cwb_incremental_update_enabled = overrides.cwb_incremental_update_enabled; } + // Update state object with current settings state.masterEnabled = finalSettings.cwb_master_enabled; state.viewerEnabled = finalSettings.cwb_viewer_enabled; state.autoUpdateEnabled = finalSettings.cwb_auto_update_enabled; @@ -556,6 +582,7 @@ export function loadSettings() { state.currentIncrementalCharCardPrompt = finalSettings.cwb_incremental_char_card_prompt; state.autoUpdateThreshold = finalSettings.cwb_auto_update_threshold; + state.scanDepth = finalSettings.cwb_scan_depth; state.worldbookTarget = finalSettings.cwb_worldbook_target; state.customWorldBook = finalSettings.cwb_custom_worldbook; @@ -566,13 +593,11 @@ export function loadSettings() { worldbookTarget: state.worldbookTarget, customWorldBook: state.customWorldBook }); - if ($panel) { updateUiWithSettings(); } updateControlsLockState(); - setTimeout(() => { const $viewerButton = $(`#${CHAR_CARD_VIEWER_BUTTON_ID}`); if ($viewerButton.length > 0) { diff --git a/CharacterWorldBook/src/cwb_uiManager.js b/CharacterWorldBook/src/cwb_uiManager.js index 450cf7b..9447dc4 100644 --- a/CharacterWorldBook/src/cwb_uiManager.js +++ b/CharacterWorldBook/src/cwb_uiManager.js @@ -1,692 +1,740 @@ -import { SCRIPT_ID_PREFIX, CHAR_CARD_VIEWER_BUTTON_ID, CHAR_CARD_VIEWER_POPUP_ID, state } from './cwb_state.js'; -import { logDebug, logError, showToastr, escapeHtml, parseCustomFormat, buildCustomFormat, isCwbEnabled } from './cwb_utils.js'; -import { deleteLorebookEntries, getTargetWorldBook } from './cwb_lorebookManager.js'; -import { manualUpdateLogic } from './cwb_core.js'; -import { testCwbConnection, fetchCwbModels } from './cwb_apiService.js'; -import { extensionName } from '../../utils/settings.js'; -import { extension_settings } from '/scripts/extensions.js'; -import { saveSettingsDebounced } from '/script.js'; -import { amilyHelper } from '../../core/tavern-helper/main.js'; + import { SCRIPT_ID_PREFIX, CHAR_CARD_VIEWER_BUTTON_ID, CHAR_CARD_VIEWER_POPUP_ID, state } from './cwb_state.js'; + import { logDebug, logError, showToastr, escapeHtml, parseCustomFormat, buildCustomFormat, isCwbEnabled } from './cwb_utils.js'; + import { deleteLorebookEntries, getTargetWorldBook } from './cwb_lorebookManager.js'; + import { manualUpdateLogic } from './cwb_core.js'; + import { testCwbConnection, fetchCwbModels } from './cwb_apiService.js'; + import { extensionName } from '../../utils/settings.js'; + import { extension_settings } from '/scripts/extensions.js'; + import { saveSettingsDebounced } from '/script.js'; + import { amilyHelper } from '../../core/tavern-helper/main.js'; -const { jQuery: $, SillyTavern } = window; + const { jQuery: $, SillyTavern } = window; -function createCharCardViewerPopupHtml(displayItems) { - const pathToLabelMap = { - 'narrative_essence.core_traits.name': '特质名称', - 'narrative_essence.key_relationships.name': '关系人姓名', - }; - const keyToLabelMap = { - 'name': '姓名', - 'archetype': '身份原型', - 'gender': '性别', - 'age': '年龄', - 'race': '种族', - 'current_status': '当前状态', + function createCharCardViewerPopupHtml(displayItems) { + const pathToLabelMap = { + 'narrative_essence.core_traits.name': '特质名称', + 'narrative_essence.key_relationships.name': '关系人姓名', + 'NE.trait.name': '特质名称', + 'NE.rel.name': '关系人姓名', + }; + const keyToLabelMap = { + 'name': '姓名', + // Old keys + 'archetype': '身份原型', + 'gender': '性别', + 'age': '年龄', + 'race': '种族', + 'current_status': '当前状态', + 'first_impression': '第一印象', + 'key_features': '显著特征', + 'attire': '衣着风格', + 'mannerisms': '习惯举止', + 'voice': '声音特征', + 'tags': '性格标签', + 'description': '性格详述', + 'motivation': '内在驱动', + 'values': '价值观', + 'inner_conflict': '内心挣扎', + 'interaction_style': '互动风格', + 'skills': '技能能力', + 'reputation': '他人声望', + 'core_traits': '核心特质', + 'verbal_patterns': '语言范式', + 'key_relationships': '关键关系', + 'definition': '特质定义', + 'evidence': '具体事例', + 'style_summary': '风格总结', + 'quotes': '代表性引言', + 'summary': '关系概述', - 'first_impression': '第一印象', - 'key_features': '显著特征', - 'attire': '衣着风格', - 'mannerisms': '习惯举止', - 'voice': '声音特征', + // New short keys + 'CI': '核心认同', + 'PI': '物理印记', + 'PP': '心智侧写', + 'SM': '社交矩阵', + 'NE': '叙事精粹', + + 'arch': '身份原型', + 'gen': '性别', + // age is same + // race is same + 'status': '当前状态', - 'tags': '性格标签', - 'description': '性格详述', - 'motivation': '内在驱动', - 'values': '价值观', - 'inner_conflict': '内心挣扎', + 'first': '第一印象', + 'feat': '显著特征', + // attire is same + 'manner': '习惯举止', + // voice is same - 'interaction_style': '互动风格', - 'skills': '技能能力', - 'reputation': '他人声望', + // tags is same + 'desc': '性格详述', + 'mot': '内在驱动', + 'val': '价值观', + 'conf': '内心挣扎', - 'core_traits': '核心特质', - 'verbal_patterns': '语言范式', - 'key_relationships': '关键关系', - 'definition': '特质定义', - 'evidence': '具体事例', - 'style_summary': '风格总结', - 'quotes': '代表性引言', - 'summary': '关系概述', - }; - const getLabel = (key, path) => { - const pathKey = path.replace(/\.\d+\./g, '.'); - if (pathToLabelMap[pathKey]) { - return pathToLabelMap[pathKey]; - } - return keyToLabelMap[key] || key.replace(/_/g, ' '); - }; + 'style': '互动风格/风格总结', // Shared by SM.style and NE.verb.style + 'skill': '技能能力', + 'rep': '他人声望', - const renderField = (label, path, value, isTextarea = false, isArray = false) => { - const escapedLabel = escapeHtml(label); - const escapedValue = escapeHtml(isArray ? value.join('\n') : value || ''); + 'trait': '核心特质', + 'verb': '语言范式', + 'rel': '关键关系', - const isLongContent = (value && String(value).length > 50) || (Array.isArray(value) && value.length > 1); - const rows = isArray ? Math.max(3, value.length) : (isLongContent ? 4 : 2); - - const inputElement = ``; - - return `
- - ${inputElement} -
`; - }; - - const renderCard = (title, data, pathPrefix) => { - if (!data || typeof data !== 'object' || Object.keys(data).length === 0) return ''; - let cardHtml = `

${escapeHtml(title)}

`; - for (const [key, value] of Object.entries(data)) { - const currentPath = pathPrefix ? `${pathPrefix}.${key}` : key; - const label = getLabel(key, currentPath); - if (typeof value === 'object' && value !== null && !Array.isArray(value)) { - cardHtml += renderCard(label, value, currentPath); // Recursive call for nested objects - } else if (Array.isArray(value) && value.length > 0 && typeof value[0] === 'object') { - cardHtml += `
${escapeHtml(label)}
`; - value.forEach((item, itemIndex) => { - cardHtml += `
`; - for (const [itemKey, itemValue] of Object.entries(item)) { - const itemPath = `${currentPath}.${itemIndex}.${itemKey}`; - cardHtml += renderField(getLabel(itemKey, itemPath), itemPath, itemValue, false, Array.isArray(itemValue)); - } - cardHtml += `
`; - }); - cardHtml += `
`; - } else { - cardHtml += renderField(label, currentPath, value, false, Array.isArray(value)); + 'def': '特质定义', + 'evid': '具体事例', + 'quote': '代表性引言', + 'sum': '关系概述', + }; + const getLabel = (key, path) => { + const pathKey = path.replace(/\.\d+\./g, '.'); + if (pathToLabelMap[pathKey]) { + return pathToLabelMap[pathKey]; } + return keyToLabelMap[key] || key.replace(/_/g, ' '); + }; + + const renderField = (label, path, value, isTextarea = false, isArray = false) => { + const escapedLabel = escapeHtml(label); + const escapedValue = escapeHtml(isArray ? value.join('\n') : value || ''); + + const isLongContent = (value && String(value).length > 50) || (Array.isArray(value) && value.length > 1); + const rows = isArray ? Math.max(3, value.length) : (isLongContent ? 4 : 2); + + const inputElement = ``; + + return `
+ + ${inputElement} +
`; + }; + + const renderCard = (title, data, pathPrefix) => { + if (!data || typeof data !== 'object' || Object.keys(data).length === 0) return ''; + let cardHtml = `

${escapeHtml(title)}

`; + for (const [key, value] of Object.entries(data)) { + const currentPath = pathPrefix ? `${pathPrefix}.${key}` : key; + const label = getLabel(key, currentPath); + if (typeof value === 'object' && value !== null && !Array.isArray(value)) { + cardHtml += renderCard(label, value, currentPath); // Recursive call for nested objects + } else if (Array.isArray(value) && value.length > 0 && typeof value[0] === 'object') { + cardHtml += `
${escapeHtml(label)}
`; + value.forEach((item, itemIndex) => { + cardHtml += `
`; + for (const [itemKey, itemValue] of Object.entries(item)) { + const itemPath = `${currentPath}.${itemIndex}.${itemKey}`; + cardHtml += renderField(getLabel(itemKey, itemPath), itemPath, itemValue, false, Array.isArray(itemValue)); + } + cardHtml += `
`; + }); + cardHtml += `
`; + } else { + cardHtml += renderField(label, currentPath, value, false, Array.isArray(value)); + } + } + cardHtml += `
`; + return cardHtml; + }; + + let html = `
`; + html += `
+

角色数据核心

+
+ + + + +
+
`; + + if (!displayItems || displayItems.length === 0) { + html += `

看什么?没更新角色条目就等着我给你显示出来条目吗?想关悬浮窗就点角色世界,功能设置关掉。

`; + return html; } - cardHtml += `
`; - return cardHtml; - }; - let html = `
`; - html += `
-

角色数据核心

-
- - - - -
-
`; + html += `
`; + html += `
`; + displayItems.forEach((item, index) => { + const itemName = item.isRoster ? '人物总览' : (item.parsed?.name || `未知实体 ${index + 1}`); + const wrapperClass = index === 0 ? 'cwb-cyber-tab active' : 'cwb-cyber-tab'; + html += `
+ + +
`; + }); + html += `
`; - if (!displayItems || displayItems.length === 0) { - html += `

看什么?没更新角色条目就等着我给你显示出来条目吗?想关悬浮窗就点角色世界,功能设置关掉。

`; + html += `
`; + displayItems.forEach((item, index) => { + html += `
`; + if (item.isRoster) { + html += `
+

人物总览 (只读)

+
+ +
+
`; + } else { + const charData = item.parsed; + if (charData) { + const charName = charData.name || `角色 ${index + 1}`; + if (charData.name) html += renderCard('姓名', { name: charData.name }, ''); + + // Support both old and new formats + if (charData.core_identity) html += renderCard('核心认同', charData.core_identity, 'core_identity'); + if (charData.CI) html += renderCard('核心认同', charData.CI, 'CI'); + + if (charData.physical_imprint) html += renderCard('物理印记', charData.physical_imprint, 'physical_imprint'); + if (charData.PI) html += renderCard('物理印记', charData.PI, 'PI'); + + if (charData.psyche_profile) html += renderCard('心智侧写', charData.psyche_profile, 'psyche_profile'); + if (charData.PP) html += renderCard('心智侧写', charData.PP, 'PP'); + + if (charData.social_matrix) html += renderCard('社交矩阵', charData.social_matrix, 'social_matrix'); + if (charData.SM) html += renderCard('社交矩阵', charData.SM, 'SM'); + + if (charData.narrative_essence) html += renderCard('叙事精粹', charData.narrative_essence, 'narrative_essence'); + if (charData.NE) html += renderCard('叙事精粹', charData.NE, 'NE'); + + html += `
+

注入设置

+
+
+ + +
+
+ + +
+
+ + +
+
+
`; + + html += ``; + } + } + html += `
`; + }); + html += `
`; return html; } - html += `
`; - html += `
`; - displayItems.forEach((item, index) => { - const itemName = item.isRoster ? '人物总览' : (item.parsed?.name || `未知实体 ${index + 1}`); - const wrapperClass = index === 0 ? 'cwb-cyber-tab active' : 'cwb-cyber-tab'; - html += `
- - -
`; - }); - html += `
`; - - html += `
`; - displayItems.forEach((item, index) => { - html += `
`; - if (item.isRoster) { - html += `
-

人物总览 (只读)

-
- -
-
`; - } else { - const charData = item.parsed; - if (charData) { - const charName = charData.name || `角色 ${index + 1}`; - if (charData.name) html += renderCard('姓名', { name: charData.name }, ''); - if (charData.core_identity) html += renderCard('核心认同', charData.core_identity, 'core_identity'); - if (charData.physical_imprint) html += renderCard('物理印记', charData.physical_imprint, 'physical_imprint'); - if (charData.psyche_profile) html += renderCard('心智侧写', charData.psyche_profile, 'psyche_profile'); - if (charData.social_matrix) html += renderCard('社交矩阵', charData.social_matrix, 'social_matrix'); - if (charData.narrative_essence) html += renderCard('叙事精粹', charData.narrative_essence, 'narrative_essence'); - - html += `
-

注入设置

-
-
- - -
-
- - -
-
- - -
-
-
`; - - html += ``; - } - } - html += `
`; - }); - html += `
`; - return html; -} - -function bindCharCardViewerPopupEvents($popup) { - $popup.on('change', '.cwb-insertion-position', function() { - const $this = $(this); - const $depthContainer = $this.closest('.cwb-insertion-settings-content').find('.cwb-insertion-depth-container'); - if ($this.val() === 'at_depth') { - $depthContainer.show(); - } else { - $depthContainer.hide(); - } - }); - - $popup.on('click', '.cwb-viewer-popup-close-button', closeCharCardViewerPopup); - $popup.find('#cwb-viewer-refresh').on('click', () => { - showToastr('info', '正在刷新角色数据...'); - showCharCardViewerPopup(); - }); - - $popup.find('#cwb-manual-update-btn').on('click', async function() { - const $button = $(this); - $button.prop('disabled', true).html(' 更新中...'); - await manualUpdateLogic(); - showToastr('info', '更新完成,正在刷新查看器...'); - showCharCardViewerPopup(); - }); - - $popup.find('.cwb-cyber-tab__button').on('click', function () { - const $this = $(this); - const targetUid = $this.data('char-uid'); - $popup.find('.cwb-cyber-tab').removeClass('active'); - $this.closest('.cwb-cyber-tab').addClass('active'); - $popup.find('.cwb-cyber-content-pane').removeClass('active'); - $popup.find(`#cwb-char-content-${targetUid}`).addClass('active'); - }); - - $popup.find('.cwb-cyber-tab__delete').on('click', async function(e) { - e.stopPropagation(); - if (confirm('您确定要删除这个角色条目吗?此操作不可撤销。')) { - const uidToDelete = $(this).data('char-uid'); - await deleteLorebookEntries([uidToDelete]); - const $wrapper = $(this).closest('.cwb-cyber-tab'); - const $pane = $popup.find(`#cwb-char-content-${uidToDelete}`); - const wasActive = $wrapper.hasClass('active'); - $wrapper.remove(); - $pane.remove(); - if (wasActive && $popup.find('.cwb-cyber-tab').length > 0) { - $popup.find('.cwb-cyber-tab').first().find('.cwb-cyber-tab__button').trigger('click'); - } else if ($popup.find('.cwb-cyber-tab').length === 0) { - showCharCardViewerPopup(); - } - } - }); - - $popup.find('#cwb-viewer-delete-all').on('click', async function() { - if (confirm('您确定要清除当前聊天中的所有角色卡和总览吗?此操作将删除所有相关条目,且不可撤销。')) { - const allUids = $popup.find('.cwb-cyber-tab__button').map(function() { - return $(this).data('char-uid'); - }).get(); - if (allUids.length > 0) { - await deleteLorebookEntries(allUids); - } - showCharCardViewerPopup(); - } - }); - - $popup.find('.cwb-save-button').on('click', async function () { - const $button = $(this); - const targetUid = $button.data('uid'); - $button.prop('disabled', true).html(' 保存中...'); - try { - const book = await getTargetWorldBook(); - if (!book) throw new Error('未找到目标世界书。'); - const $activePane = $popup.find(`#cwb-char-content-${targetUid}`); - const collectedData = {}; - const setNestedValue = (obj, path, value) => { - const keys = path.split('.'); - let current = obj; - keys.forEach((key, index) => { - if (index === keys.length - 1) { - current[key] = value === '' ? null : value; - } else { - const nextKeyIsNumber = /^\d+$/.test(keys[index + 1]); - if (!current[key]) { - current[key] = nextKeyIsNumber ? [] : {}; - } - current = current[key]; - } - }); - }; - $activePane.find('.cwb-cyber-field__input').each(function () { - const $field = $(this); - const path = $field.data('path'); - let value = $field.val(); - if ($field.data('is-array')) { - value = value.split('\n').map(l => l.trim()).filter(Boolean); - } - if(path){ - setNestedValue(collectedData, path, value); - } - }); - const finalContentToSave = buildCustomFormat(collectedData); - - const insertionPosition = $activePane.find('.cwb-insertion-position').val(); - const insertionDepth = parseInt($activePane.find('.cwb-insertion-depth').val(), 10); - const insertionOrder = parseInt($activePane.find('.cwb-insertion-order').val(), 10); - - logDebug(`[DEBUG] 界面收集值 UID:${targetUid}`, { - insertionPosition: insertionPosition, - insertionDepth: insertionDepth, - insertionOrder: insertionOrder - }); - - const positionMap = { - 'before_char': 'before_character_definition', - 'after_char': 'after_character_definition', - 'before_an': 'before_author_note', - 'after_an': 'after_author_note', - 'at_depth': 'at_depth_as_system' - }; - - const finalEntryData = { - uid: targetUid, - content: finalContentToSave, - position: positionMap[insertionPosition] || 'before_character_definition', - order: isNaN(insertionOrder) ? 7001 : insertionOrder, - }; - - if (insertionPosition === 'at_depth') { - finalEntryData.depth = isNaN(insertionDepth) ? 0 : insertionDepth; + function bindCharCardViewerPopupEvents($popup) { + $popup.on('change', '.cwb-insertion-position', function() { + const $this = $(this); + const $depthContainer = $this.closest('.cwb-insertion-settings-content').find('.cwb-insertion-depth-container'); + if ($this.val() === 'at_depth') { + $depthContainer.show(); } else { - finalEntryData.depth = null; + $depthContainer.hide(); } - - logDebug(`[DEBUG] 最终保存数据 UID:${targetUid}`, { - position: finalEntryData.position, - depth: finalEntryData.depth, - order: finalEntryData.order, - hasDepthField: 'depth' in finalEntryData - }); - - await amilyHelper.setLorebookEntries(book, [finalEntryData]); - showToastr('success', '角色卡已成功保存!'); - } catch (error) { - logError('保存角色卡失败:', error); - showToastr('error', `保存失败: ${error.message}`); - } finally { - $button.prop('disabled', false).text(`保存修改`); - } - }); -} - -function closeCharCardViewerPopup() { - $(`#${CHAR_CARD_VIEWER_POPUP_ID}`).remove(); -} - -export async function showCharCardViewerPopup() { - if (!isCwbEnabled()) return; - closeCharCardViewerPopup(); - try { - const book = await getTargetWorldBook(); - if (!book) { - showToastr('warning', '当前角色未设置主世界书或自定义世界书。'); - $('body').append(createCharCardViewerPopupHtml([])); - bindCharCardViewerPopupEvents($(`#${CHAR_CARD_VIEWER_POPUP_ID}`)); - return; - } - const allEntries = await amilyHelper.getLorebookEntries(book); - let currentChatId = state.currentChatFileIdentifier; - - if (!currentChatId || currentChatId.startsWith('unknown_chat')) { - logError(`Invalid chat identifier "${currentChatId}" for viewer.`); - $('body').append(createCharCardViewerPopupHtml([])); - bindCharCardViewerPopupEvents($(`#${CHAR_CARD_VIEWER_POPUP_ID}`)); - return; - } - - const cleanChatId = currentChatId.replace(/ imported/g, ''); - let displayItems = []; - - let relevantEntries; - if (state.worldbookTarget === 'custom' && state.customWorldBook) { - relevantEntries = allEntries.filter(entry => { - if (!entry.enabled || !Array.isArray(entry.keys)) return false; - if (entry.keys.includes('Amily2角色总集') || entry.keys.includes('角色总览')) return true; - if (entry.content) { - try { - const parsed = parseCustomFormat(entry.content); - return parsed && Object.keys(parsed).length > 0; - } catch (e) { - return false; - } - } - - return false; - }); - } else { - relevantEntries = allEntries.filter(entry => - entry.enabled && - Array.isArray(entry.keys) && - entry.keys.includes(cleanChatId) - ); - } - - const rosterEntries = relevantEntries.filter(entry => - entry.keys.includes('Amily2角色总集') && entry.keys.includes('角色总览') - ); - - rosterEntries.forEach((entry, index) => { - displayItems.push({ - uid: entry.uid, - isRoster: true, - comment: entry.comment, - content: entry.content, - rosterIndex: index - }); }); - const characterEntries = relevantEntries - .filter(entry => !entry.keys.includes('Amily2角色总集')) - .map(entry => { - try { - logDebug(`[DEBUG] 原始条目数据 UID:${entry.uid}`, { - position: entry.position, - depth: entry.depth, - order: entry.order, - comment: entry.comment - }); + $popup.on('click', '.cwb-viewer-popup-close-button', closeCharCardViewerPopup); + $popup.find('#cwb-viewer-refresh').on('click', () => { + showToastr('info', '正在刷新角色数据...'); + showCharCardViewerPopup(); + }); - const positionStringMap = { - 0: 'before_char', - 1: 'after_char', - 2: 'before_an', - 3: 'after_an', - 4: 'at_depth', - 'before_character_definition': 'before_char', - 'after_character_definition': 'after_char', - 'before_author_note': 'before_an', - 'after_author_note': 'after_an', - 'at_depth_as_system': 'at_depth' - }; + $popup.find('#cwb-manual-update-btn').on('click', async function() { + const $button = $(this); + $button.prop('disabled', true).html(' 更新中...'); + await manualUpdateLogic(); + showToastr('info', '更新完成,正在刷新查看器...'); + showCharCardViewerPopup(); + }); - const position = entry.position; - const mappedPosition = positionStringMap[position] || 'at_depth'; - const finalDepth = (position === 4 || position === 'at_depth_as_system') ? (entry.depth ?? 0) : 0; - logDebug(`[DEBUG] 映射结果 UID:${entry.uid}`, { - originalPosition: position, - mappedPosition: mappedPosition, - finalDepth: finalDepth - }); + $popup.find('.cwb-cyber-tab__button').on('click', function () { + const $this = $(this); + const targetUid = $this.data('char-uid'); + $popup.find('.cwb-cyber-tab').removeClass('active'); + $this.closest('.cwb-cyber-tab').addClass('active'); + $popup.find('.cwb-cyber-content-pane').removeClass('active'); + $popup.find(`#cwb-char-content-${targetUid}`).addClass('active'); + }); - return { - uid: entry.uid, - isRoster: false, - comment: entry.comment, - content: entry.content, - parsed: parseCustomFormat(entry.content), - insertionPosition: mappedPosition, - insertionDepth: finalDepth, - insertionOrder: entry.order ?? 7001, - }; - } catch (e) { - logError(`解析角色条目失败 (UID: ${entry.uid}),已跳过。`, e); - return null; - } - }) - .filter(c => c && c.parsed && Object.keys(c.parsed).length > 0); - - displayItems = displayItems.concat(characterEntries); - - const popupHtml = createCharCardViewerPopupHtml(displayItems); - $('body').append(popupHtml); - const $popup = $(`#${CHAR_CARD_VIEWER_POPUP_ID}`); - bindCharCardViewerPopupEvents($popup); - } catch (error) { - logError('无法显示角色卡查看器:', error); - showToastr('error', '加载角色卡数据时出错。'); - } -} - -function toggleCharCardViewerPopup() { - if ($(`#${CHAR_CARD_VIEWER_POPUP_ID}`).length > 0) { - closeCharCardViewerPopup(); - } else { - showCharCardViewerPopup(); - } -} - -function keepButtonInBounds($element, savePosition = false) { - if (!$element || !$element.length) return; - const windowWidth = $(window).width(); - const windowHeight = $(window).height(); - const buttonWidth = $element.outerWidth(); - const buttonHeight = $element.outerHeight(); - let currentPos = $element.offset(); - let newTop = Math.max(0, Math.min(currentPos.top, windowHeight - buttonHeight)); - let newLeft = Math.max(0, Math.min(currentPos.left, windowWidth - buttonWidth)); - $element.css({ top: `${newTop}px`, left: `${newLeft}px` }); - if (savePosition) { - localStorage.setItem(state.STORAGE_KEY_VIEWER_BUTTON_POS, JSON.stringify({ top: $element.css('top'), left: $element.css('left') })); - } -} - -function makeButtonDraggable($button) { - let isDragging = false, wasDragged = false, offset = { x: 0, y: 0 }, startPos = { x: 0, y: 0 }; - const DRAG_THRESHOLD = 5; // 5 pixels threshold - - const getCoords = (e) => e.touches && e.touches.length ? e.touches[0] : e; - - const dragStart = function (e) { - if (e.type === 'touchstart') e.preventDefault(); - isDragging = true; - wasDragged = false; - const coords = getCoords(e); - startPos.x = coords.clientX; - startPos.y = coords.clientY; - offset.x = coords.clientX - $button.offset().left; - offset.y = coords.clientY - $button.offset().top; - $button.css('cursor', 'grabbing'); - $('body').css({ 'user-select': 'none', '-webkit-user-select': 'none' }); - }; - - const dragMove = function (e) { - if (!isDragging) return; - const coords = getCoords(e); - const dx = coords.clientX - startPos.x; - const dy = coords.clientY - startPos.y; - - if (!wasDragged && Math.sqrt(dx * dx + dy * dy) > DRAG_THRESHOLD) { - wasDragged = true; - } - - if (wasDragged) { - if (e.type === 'touchmove') e.preventDefault(); - let newX = coords.clientX - offset.x; - let newY = coords.clientY - offset.y; - newX = Math.max(0, Math.min(newX, window.innerWidth - $button.outerWidth())); - newY = Math.max(0, Math.min(newY, window.innerHeight - $button.outerHeight())); - $button.css({ top: newY + 'px', left: newX + 'px', right: '', bottom: '' }); - } - }; - - const dragEnd = function (e) { - if (!isDragging) return; - isDragging = false; - $button.css('cursor', 'grab'); - $('body').css({ 'user-select': 'auto', '-webkit-user-select': 'auto' }); - if (wasDragged) { - keepButtonInBounds($button, true); - } else if (e.type === 'touchend') { - e.preventDefault(); - toggleCharCardViewerPopup(); - } - }; - - $button.on('mousedown', dragStart); - $(document).on('mousemove.cwbViewer', dragMove).on('mouseup.cwbViewer', dragEnd); - $button.on('touchstart', dragStart); - $(document).on('touchmove.cwbViewer', dragMove).on('touchend.cwbViewer', dragEnd); - - $button.on('click', function (e) { - if (wasDragged) { - e.preventDefault(); + $popup.find('.cwb-cyber-tab__delete').on('click', async function(e) { e.stopPropagation(); + if (confirm('您确定要删除这个角色条目吗?此操作不可撤销。')) { + const uidToDelete = $(this).data('char-uid'); + await deleteLorebookEntries([uidToDelete]); + const $wrapper = $(this).closest('.cwb-cyber-tab'); + const $pane = $popup.find(`#cwb-char-content-${uidToDelete}`); + const wasActive = $wrapper.hasClass('active'); + $wrapper.remove(); + $pane.remove(); + if (wasActive && $popup.find('.cwb-cyber-tab').length > 0) { + $popup.find('.cwb-cyber-tab').first().find('.cwb-cyber-tab__button').trigger('click'); + } else if ($popup.find('.cwb-cyber-tab').length === 0) { + showCharCardViewerPopup(); + } + } + }); + + $popup.find('#cwb-viewer-delete-all').on('click', async function() { + if (confirm('您确定要清除当前聊天中的所有角色卡和总览吗?此操作将删除所有相关条目,且不可撤销。')) { + const allUids = $popup.find('.cwb-cyber-tab__button').map(function() { + return $(this).data('char-uid'); + }).get(); + if (allUids.length > 0) { + await deleteLorebookEntries(allUids); + } + showCharCardViewerPopup(); + } + }); + + $popup.find('.cwb-save-button').on('click', async function () { + const $button = $(this); + const targetUid = $button.data('uid'); + $button.prop('disabled', true).html(' 保存中...'); + try { + const book = await getTargetWorldBook(); + if (!book) throw new Error('未找到目标世界书。'); + const $activePane = $popup.find(`#cwb-char-content-${targetUid}`); + const collectedData = {}; + const setNestedValue = (obj, path, value) => { + const keys = path.split('.'); + let current = obj; + keys.forEach((key, index) => { + if (index === keys.length - 1) { + current[key] = value === '' ? null : value; + } else { + const nextKeyIsNumber = /^\d+$/.test(keys[index + 1]); + if (!current[key]) { + current[key] = nextKeyIsNumber ? [] : {}; + } + current = current[key]; + } + }); + }; + $activePane.find('.cwb-cyber-field__input').each(function () { + const $field = $(this); + const path = $field.data('path'); + let value = $field.val(); + if ($field.data('is-array')) { + value = value.split('\n').map(l => l.trim()).filter(Boolean); + } + if(path){ + setNestedValue(collectedData, path, value); + } + }); + const finalContentToSave = buildCustomFormat(collectedData); + + const insertionPosition = $activePane.find('.cwb-insertion-position').val(); + const insertionDepth = parseInt($activePane.find('.cwb-insertion-depth').val(), 10); + const insertionOrder = parseInt($activePane.find('.cwb-insertion-order').val(), 10); + + logDebug(`[DEBUG] 界面收集值 UID:${targetUid}`, { + insertionPosition: insertionPosition, + insertionDepth: insertionDepth, + insertionOrder: insertionOrder + }); + + const positionMap = { + 'before_char': 'before_character_definition', + 'after_char': 'after_character_definition', + 'before_an': 'before_author_note', + 'after_an': 'after_author_note', + 'at_depth': 'at_depth_as_system' + }; + + const finalEntryData = { + uid: targetUid, + content: finalContentToSave, + position: positionMap[insertionPosition] || 'before_character_definition', + order: isNaN(insertionOrder) ? 7001 : insertionOrder, + }; + + if (insertionPosition === 'at_depth') { + finalEntryData.depth = isNaN(insertionDepth) ? 0 : insertionDepth; + } else { + finalEntryData.depth = null; + } + + logDebug(`[DEBUG] 最终保存数据 UID:${targetUid}`, { + position: finalEntryData.position, + depth: finalEntryData.depth, + order: finalEntryData.order, + hasDepthField: 'depth' in finalEntryData + }); + + await amilyHelper.setLorebookEntries(book, [finalEntryData]); + showToastr('success', '角色卡已成功保存!'); + } catch (error) { + logError('保存角色卡失败:', error); + showToastr('error', `保存失败: ${error.message}`); + } finally { + $button.prop('disabled', false).text(`保存修改`); + } + }); + } + + function closeCharCardViewerPopup() { + $(`#${CHAR_CARD_VIEWER_POPUP_ID}`).remove(); + } + + export async function showCharCardViewerPopup() { + if (!isCwbEnabled()) return; + closeCharCardViewerPopup(); + try { + const book = await getTargetWorldBook(); + if (!book) { + showToastr('warning', '当前角色未设置主世界书或自定义世界书。'); + $('body').append(createCharCardViewerPopupHtml([])); + bindCharCardViewerPopupEvents($(`#${CHAR_CARD_VIEWER_POPUP_ID}`)); + return; + } + const allEntries = await amilyHelper.getLorebookEntries(book); + let currentChatId = state.currentChatFileIdentifier; + + if (!currentChatId || currentChatId.startsWith('unknown_chat')) { + logError(`Invalid chat identifier "${currentChatId}" for viewer.`); + $('body').append(createCharCardViewerPopupHtml([])); + bindCharCardViewerPopupEvents($(`#${CHAR_CARD_VIEWER_POPUP_ID}`)); + return; + } + + const cleanChatId = currentChatId.replace(/ imported/g, ''); + let displayItems = []; + + let relevantEntries; + if (state.worldbookTarget === 'custom' && state.customWorldBook) { + relevantEntries = allEntries.filter(entry => { + if (!entry.enabled || !Array.isArray(entry.keys)) return false; + if (entry.keys.includes('Amily2角色总集') || entry.keys.includes('角色总览')) return true; + if (entry.content) { + try { + const parsed = parseCustomFormat(entry.content); + return parsed && Object.keys(parsed).length > 0; + } catch (e) { + return false; + } + } + + return false; + }); + } else { + relevantEntries = allEntries.filter(entry => + entry.enabled && + Array.isArray(entry.keys) && + entry.keys.includes(cleanChatId) + ); + } + + const rosterEntries = relevantEntries.filter(entry => + entry.keys.includes('Amily2角色总集') && entry.keys.includes('角色总览') + ); + + rosterEntries.forEach((entry, index) => { + displayItems.push({ + uid: entry.uid, + isRoster: true, + comment: entry.comment, + content: entry.content, + rosterIndex: index + }); + }); + + const characterEntries = relevantEntries + .filter(entry => !entry.keys.includes('Amily2角色总集')) + .map(entry => { + try { + logDebug(`[DEBUG] 原始条目数据 UID:${entry.uid}`, { + position: entry.position, + depth: entry.depth, + order: entry.order, + comment: entry.comment + }); + + const positionStringMap = { + 0: 'before_char', + 1: 'after_char', + 2: 'before_an', + 3: 'after_an', + 4: 'at_depth', + 'before_character_definition': 'before_char', + 'after_character_definition': 'after_char', + 'before_author_note': 'before_an', + 'after_author_note': 'after_an', + 'at_depth_as_system': 'at_depth' + }; + + const position = entry.position; + const mappedPosition = positionStringMap[position] || 'at_depth'; + const finalDepth = (position === 4 || position === 'at_depth_as_system') ? (entry.depth ?? 0) : 0; + logDebug(`[DEBUG] 映射结果 UID:${entry.uid}`, { + originalPosition: position, + mappedPosition: mappedPosition, + finalDepth: finalDepth + }); + + return { + uid: entry.uid, + isRoster: false, + comment: entry.comment, + content: entry.content, + parsed: parseCustomFormat(entry.content), + insertionPosition: mappedPosition, + insertionDepth: finalDepth, + insertionOrder: entry.order ?? 7001, + }; + } catch (e) { + logError(`解析角色条目失败 (UID: ${entry.uid}),已跳过。`, e); + return null; + } + }) + .filter(c => c && c.parsed && Object.keys(c.parsed).length > 0); + + displayItems = displayItems.concat(characterEntries); + + const popupHtml = createCharCardViewerPopupHtml(displayItems); + $('body').append(popupHtml); + const $popup = $(`#${CHAR_CARD_VIEWER_POPUP_ID}`); + bindCharCardViewerPopupEvents($popup); + } catch (error) { + logError('无法显示角色卡查看器:', error); + showToastr('error', '加载角色卡数据时出错。'); + } + } + + function toggleCharCardViewerPopup() { + if ($(`#${CHAR_CARD_VIEWER_POPUP_ID}`).length > 0) { + closeCharCardViewerPopup(); + } else { + showCharCardViewerPopup(); + } + } + + function keepButtonInBounds($element, savePosition = false) { + if (!$element || !$element.length) return; + const windowWidth = $(window).width(); + const windowHeight = $(window).height(); + const buttonWidth = $element.outerWidth(); + const buttonHeight = $element.outerHeight(); + let currentPos = $element.offset(); + let newTop = Math.max(0, Math.min(currentPos.top, windowHeight - buttonHeight)); + let newLeft = Math.max(0, Math.min(currentPos.left, windowWidth - buttonWidth)); + $element.css({ top: `${newTop}px`, left: `${newLeft}px` }); + if (savePosition) { + localStorage.setItem(state.STORAGE_KEY_VIEWER_BUTTON_POS, JSON.stringify({ top: $element.css('top'), left: $element.css('left') })); + } + } + + function makeButtonDraggable($button) { + let isDragging = false, wasDragged = false, offset = { x: 0, y: 0 }, startPos = { x: 0, y: 0 }; + const DRAG_THRESHOLD = 5; // 5 pixels threshold + + const getCoords = (e) => e.touches && e.touches.length ? e.touches[0] : e; + + const dragStart = function (e) { + if (e.type === 'touchstart') e.preventDefault(); + isDragging = true; + wasDragged = false; + const coords = getCoords(e); + startPos.x = coords.clientX; + startPos.y = coords.clientY; + offset.x = coords.clientX - $button.offset().left; + offset.y = coords.clientY - $button.offset().top; + $button.css('cursor', 'grabbing'); + $('body').css({ 'user-select': 'none', '-webkit-user-select': 'none' }); + }; + + const dragMove = function (e) { + if (!isDragging) return; + const coords = getCoords(e); + const dx = coords.clientX - startPos.x; + const dy = coords.clientY - startPos.y; + + if (!wasDragged && Math.sqrt(dx * dx + dy * dy) > DRAG_THRESHOLD) { + wasDragged = true; + } + + if (wasDragged) { + if (e.type === 'touchmove') e.preventDefault(); + let newX = coords.clientX - offset.x; + let newY = coords.clientY - offset.y; + newX = Math.max(0, Math.min(newX, window.innerWidth - $button.outerWidth())); + newY = Math.max(0, Math.min(newY, window.innerHeight - $button.outerHeight())); + $button.css({ top: newY + 'px', left: newX + 'px', right: '', bottom: '' }); + } + }; + + const dragEnd = function (e) { + if (!isDragging) return; + isDragging = false; + $button.css('cursor', 'grab'); + $('body').css({ 'user-select': 'auto', '-webkit-user-select': 'auto' }); + if (wasDragged) { + keepButtonInBounds($button, true); + } else if (e.type === 'touchend') { + e.preventDefault(); + toggleCharCardViewerPopup(); + } + }; + + $button.on('mousedown', dragStart); + $(document).on('mousemove.cwbViewer', dragMove).on('mouseup.cwbViewer', dragEnd); + $button.on('touchstart', dragStart); + $(document).on('touchmove.cwbViewer', dragMove).on('touchend.cwbViewer', dragEnd); + + $button.on('click', function (e) { + if (wasDragged) { + e.preventDefault(); + e.stopPropagation(); + return; + } + toggleCharCardViewerPopup(); + }); + } + + export function initializeCharCardViewer() { + const $existingButton = $(`#${CHAR_CARD_VIEWER_BUTTON_ID}`); + + if ($existingButton.length > 0) { + console.log('[CWB] Char card viewer button already exists'); + setTimeout(() => { + const shouldShow = isCwbEnabled() && state.viewerEnabled; + $existingButton.toggle(shouldShow); + console.log(`[CWB] Force updated existing button visibility: ${shouldShow}`); + }, 100); return; } - toggleCharCardViewerPopup(); - }); -} + + const buttonHtml = `
`; + $('body').append(buttonHtml); + const $viewerButton = $(`#${CHAR_CARD_VIEWER_BUTTON_ID}`); + makeButtonDraggable($viewerButton); + + const savedPosition = JSON.parse(localStorage.getItem(state.STORAGE_KEY_VIEWER_BUTTON_POS) || 'null'); + if (savedPosition) { + $viewerButton.css({ top: savedPosition.top, left: savedPosition.left }); + } else { + $viewerButton.css({ top: '120px', right: '10px', left: 'auto' }); + } -export function initializeCharCardViewer() { - const $existingButton = $(`#${CHAR_CARD_VIEWER_BUTTON_ID}`); - - if ($existingButton.length > 0) { - console.log('[CWB] Char card viewer button already exists'); setTimeout(() => { const shouldShow = isCwbEnabled() && state.viewerEnabled; - $existingButton.toggle(shouldShow); - console.log(`[CWB] Force updated existing button visibility: ${shouldShow}`); + $viewerButton.toggle(shouldShow); + console.log(`[CWB] New button created with visibility: ${shouldShow}`); }, 100); - return; - } - - const buttonHtml = `
`; - $('body').append(buttonHtml); - const $viewerButton = $(`#${CHAR_CARD_VIEWER_BUTTON_ID}`); - makeButtonDraggable($viewerButton); - - const savedPosition = JSON.parse(localStorage.getItem(state.STORAGE_KEY_VIEWER_BUTTON_POS) || 'null'); - if (savedPosition) { - $viewerButton.css({ top: savedPosition.top, left: savedPosition.left }); - } else { - $viewerButton.css({ top: '120px', right: '10px', left: 'auto' }); + + console.log('[CWB] Char card viewer button initialized'); + + let resizeTimeout; + $(window).on('resize.cwbViewer', function () { + clearTimeout(resizeTimeout); + resizeTimeout = setTimeout(() => keepButtonInBounds($(`#${CHAR_CARD_VIEWER_BUTTON_ID}`), true), 150); + }); } - setTimeout(() => { + export function updateViewerButtonVisibility() { + const $button = $(`#${CHAR_CARD_VIEWER_BUTTON_ID}`); const shouldShow = isCwbEnabled() && state.viewerEnabled; - $viewerButton.toggle(shouldShow); - console.log(`[CWB] New button created with visibility: ${shouldShow}`); - }, 100); - - console.log('[CWB] Char card viewer button initialized'); - - let resizeTimeout; - $(window).on('resize.cwbViewer', function () { - clearTimeout(resizeTimeout); - resizeTimeout = setTimeout(() => keepButtonInBounds($(`#${CHAR_CARD_VIEWER_BUTTON_ID}`), true), 150); - }); -} - -export function updateViewerButtonVisibility() { - const $button = $(`#${CHAR_CARD_VIEWER_BUTTON_ID}`); - const shouldShow = isCwbEnabled() && state.viewerEnabled; - - console.log(`[CWB] Updating viewer button visibility: ${shouldShow} (master: ${isCwbEnabled()}, viewer: ${state.viewerEnabled})`); - - if ($button.length > 0) { - $button.toggle(shouldShow); - console.log(`[CWB] Viewer button visibility set to: ${shouldShow}`); - } else { - console.log('[CWB] Viewer button not found, will initialize when DOM is ready'); - // Try to initialize if button doesn't exist yet - setTimeout(() => { - initializeCharCardViewer(); - }, 500); + + console.log(`[CWB] Updating viewer button visibility: ${shouldShow} (master: ${isCwbEnabled()}, viewer: ${state.viewerEnabled})`); + + if ($button.length > 0) { + $button.toggle(shouldShow); + console.log(`[CWB] Viewer button visibility set to: ${shouldShow}`); + } else { + console.log('[CWB] Viewer button not found, will initialize when DOM is ready'); + // Try to initialize if button doesn't exist yet + setTimeout(() => { + initializeCharCardViewer(); + }, 500); + } + + logDebug('悬浮窗按钮显示状态更新:', { + masterEnabled: isCwbEnabled(), + viewerEnabled: state.viewerEnabled, + shouldShow: shouldShow + }); } - - logDebug('悬浮窗按钮显示状态更新:', { - masterEnabled: isCwbEnabled(), - viewerEnabled: state.viewerEnabled, - shouldShow: shouldShow - }); -} -export function bindCwbApiEvents() { - console.log('[CWB] Binding API events'); - - $('#cwb-api-url').off('input').on('input', function() { - const value = $(this).val(); - extension_settings[extensionName].cwb_api_url = value; - saveSettingsDebounced(); - }); - - $('#cwb-api-key').off('input').on('input', function() { - const value = $(this).val(); - extension_settings[extensionName].cwb_api_key = value; - saveSettingsDebounced(); - }); - - $('#cwb-model').off('input').on('input', function() { - const value = $(this).val(); - extension_settings[extensionName].cwb_model = value; - saveSettingsDebounced(); - }); - - $('#cwb-temperature').off('input').on('input', function() { - const value = parseFloat($(this).val()); - $('#cwb-temperature-value').text(value); - extension_settings[extensionName].cwb_temperature = value; - saveSettingsDebounced(); - }); - - $('#cwb-max-tokens').off('input').on('input', function() { - const value = parseInt($(this).val()); - $('#cwb-max-tokens-value').text(value); - extension_settings[extensionName].cwb_max_tokens = value; - saveSettingsDebounced(); - }); - - $('#cwb-test-connection').off('click').on('click', async function() { - const $button = $(this); - $button.prop('disabled', true).html(' 测试中...'); + export function bindCwbApiEvents() { + console.log('[CWB] Binding API events'); - try { - await testCwbConnection(); - } catch (error) { - console.error('[CWB] 测试连接失败:', error); - } finally { - $button.prop('disabled', false).html(' 测试连接'); - } - }); + $('#cwb-api-url').off('input').on('input', function() { + const value = $(this).val(); + extension_settings[extensionName].cwb_api_url = value; + saveSettingsDebounced(); + }); - $('#cwb-fetch-models').off('click').on('click', async function() { - const $button = $(this); - $button.prop('disabled', true).html(' 获取中...'); - - try { - const models = await fetchCwbModels(); - const $modelSelect = $('#cwb-model'); - $modelSelect.empty(); + $('#cwb-api-key').off('input').on('input', function() { + const value = $(this).val(); + extension_settings[extensionName].cwb_api_key = value; + saveSettingsDebounced(); + }); + + $('#cwb-model').off('input').on('input', function() { + const value = $(this).val(); + extension_settings[extensionName].cwb_model = value; + saveSettingsDebounced(); + }); + + $('#cwb-temperature').off('input').on('input', function() { + const value = parseFloat($(this).val()); + $('#cwb-temperature-value').text(value); + extension_settings[extensionName].cwb_temperature = value; + saveSettingsDebounced(); + }); + + $('#cwb-max-tokens').off('input').on('input', function() { + const value = parseInt($(this).val()); + $('#cwb-max-tokens-value').text(value); + extension_settings[extensionName].cwb_max_tokens = value; + saveSettingsDebounced(); + }); + + $('#cwb-test-connection').off('click').on('click', async function() { + const $button = $(this); + $button.prop('disabled', true).html(' 测试中...'); - if (models && models.length > 0) { - models.forEach(model => { - $modelSelect.append(new Option(model.name, model.id)); - }); - showToastr('success', `已获取到 ${models.length} 个模型`); - } else { - $modelSelect.append(new Option('无可用模型', '')); - showToastr('warning', '未获取到可用模型'); + try { + await testCwbConnection(); + } catch (error) { + console.error('[CWB] 测试连接失败:', error); + } finally { + $button.prop('disabled', false).html(' 测试连接'); } - } catch (error) { - console.error('[CWB] 获取模型失败:', error); - $('#cwb-model').empty().append(new Option('获取失败', '')); - } finally { - $button.prop('disabled', false).html(' 获取模型'); - } - }); -} + }); + + $('#cwb-fetch-models').off('click').on('click', async function() { + const $button = $(this); + $button.prop('disabled', true).html(' 获取中...'); + + try { + const models = await fetchCwbModels(); + const $modelSelect = $('#cwb-model'); + $modelSelect.empty(); + + if (models && models.length > 0) { + models.forEach(model => { + $modelSelect.append(new Option(model.name, model.id)); + }); + showToastr('success', `已获取到 ${models.length} 个模型`); + } else { + $modelSelect.append(new Option('无可用模型', '')); + showToastr('warning', '未获取到可用模型'); + } + } catch (error) { + console.error('[CWB] 获取模型失败:', error); + $('#cwb-model').empty().append(new Option('获取失败', '')); + } finally { + $button.prop('disabled', false).html(' 获取模型'); + } + }); + } diff --git a/PresetSettings/config.js b/PresetSettings/config.js index 2a3a8fb..cad72f2 100644 --- a/PresetSettings/config.js +++ b/PresetSettings/config.js @@ -433,9 +433,9 @@ export const defaultMixedOrder = { { type: 'prompt', index: 5 }, { type: 'prompt', index: 6 }, { type: 'conditional', id: 'worldbook' }, + { type: 'conditional', id: 'coreContent' }, { type: 'conditional', id: 'ruleTemplate' }, { type: 'conditional', id: 'flowTemplate' }, - { type: 'conditional', id: 'coreContent' }, { type: 'prompt', index: 7 } ], secondary_filler: [ @@ -475,8 +475,8 @@ export const defaultMixedOrder = { { type: 'prompt', index: 5 }, { type: 'prompt', index: 6 }, { type: 'conditional', id: 'cwb_break_armor_prompt' }, - { type: 'conditional', id: 'cwb_char_card_prompt' }, { type: 'conditional', id: 'newContext' }, + { type: 'conditional', id: 'cwb_char_card_prompt' }, { type: 'prompt', index: 7 } ], cwb_summarizer_incremental: [ @@ -488,10 +488,10 @@ export const defaultMixedOrder = { { type: 'prompt', index: 5 }, { type: 'prompt', index: 6 }, { type: 'conditional', id: 'cwb_break_armor_prompt' }, - { type: 'conditional', id: 'cwb_char_card_prompt' }, - { type: 'conditional', id: 'cwb_incremental_char_card_prompt' }, { type: 'conditional', id: 'oldFiles' }, { type: 'conditional', id: 'newContext' }, + { type: 'conditional', id: 'cwb_char_card_prompt' }, + { type: 'conditional', id: 'cwb_incremental_char_card_prompt' }, { type: 'prompt', index: 7 } ], novel_processor: [ @@ -542,4 +542,3 @@ export const sectionTitles = { cwb_summarizer_incremental: '角色世界书(CWB-增量)', novel_processor: '小说处理', }; - diff --git a/WorldEditor/WorldEditor.css b/WorldEditor/WorldEditor.css index 2bbec63..2f44f57 100644 --- a/WorldEditor/WorldEditor.css +++ b/WorldEditor/WorldEditor.css @@ -525,51 +525,95 @@ } #world-editor-container .world-editor-entries-header { - display: none; /* 在移动端隐藏表头 */ - } - - #world-editor-container .world-editor-entry-row { - grid-template-columns: 40px 1fr; /* 简化为两列:复选框和内容 */ + display: flex; + align-items: center; padding: 10px; + background-color: #333; border-bottom: 1px solid #444; } - #world-editor-container .world-editor-entry-row > div:not(:nth-child(1)):not(:nth-child(2)) { - display: none; /* 隐藏除复选框和主要内容外的所有列 */ + #world-editor-container .world-editor-entries-header > div { + display: none; + } + + #world-editor-container .world-editor-entries-header > div:first-child { + display: flex; + align-items: center; + } + + #world-editor-container .world-editor-entries-header > div:first-child::after { + content: "全选"; + margin-left: 10px; + color: #ccc; + font-size: 14px; } #world-editor-container .world-editor-entry-row { display: grid; - grid-template-columns: auto 1fr; /* 复选框和内容区 */ - gap: 10px; + grid-template-columns: 40px 1fr; /* 复选框和内容区 */ + gap: 5px; padding: 10px; + border-bottom: 1px solid #444; + height: auto; } #world-editor-container .world-editor-entry-row > div { - display: block !important; /* 确保所有单元格都可见 */ text-align: left; - padding: 5px 0; + padding: 2px 0; } - #world-editor-container .world-editor-entry-row::before { - display: block; + /* Add labels for mobile view */ + #world-editor-container .world-editor-entry-row > div::before { + content: attr(data-label) ": "; font-weight: bold; color: #888; + display: inline-block; + margin-right: 5px; + } + + /* Hide label for checkbox */ + #world-editor-container .world-editor-entry-row > div:nth-child(1)::before { + display: none; } - #world-editor-container .world-editor-entry-checkbox { grid-row: 1 / span 5; align-self: center; } - #world-editor-container .world-editor-entry-status { grid-column: 2; } - #world-editor-container .world-editor-entry-activation { grid-column: 2; } - #world-editor-container .world-editor-entry-keys { grid-column: 2; } - #world-editor-container .world-editor-entry-content { grid-column: 2; } - #world-editor-container .world-editor-entry-position { grid-column: 2; } - #world-editor-container .world-editor-entry-depth { grid-column: 2; } - #world-editor-container .world-editor-entry-order { grid-column: 2; } + /* Checkbox positioning - Target the WRAPPER div */ + #world-editor-container .world-editor-entry-checkbox { + grid-row: 1 / span 8; + align-self: start; + margin-top: 5px; + } + /* Stack other elements in the second column */ + #world-editor-container .world-editor-entry-status, + #world-editor-container .world-editor-entry-activation, + #world-editor-container .world-editor-entry-keys, + #world-editor-container .world-editor-entry-content, + #world-editor-container .world-editor-entry-position, + #world-editor-container .world-editor-entry-depth, + #world-editor-container .world-editor-entry-order, + #world-editor-container .world-editor-entry-row > div[data-label="条目"] { + grid-column: 2; + width: 100%; + } + + /* Truncation for keys and content */ #world-editor-container .world-editor-entry-keys, #world-editor-container .world-editor-entry-content { white-space: normal; max-width: 100%; + display: -webkit-box !important; + -webkit-line-clamp: 3; + line-clamp: 3; + -webkit-box-orient: vertical; + overflow: hidden; + text-overflow: ellipsis; + word-break: break-word; + } + + /* Ensure inline edits take full width on mobile */ + #world-editor-container .inline-edit { + width: calc(100% - 60px); /* Adjust for label width roughly */ + display: inline-block; } #world-editor-container .world-editor-batch-actions { diff --git a/assets/Amily2-AdditionalFeatures.html b/assets/Amily2-AdditionalFeatures.html index 7a53968..05a1d66 100644 --- a/assets/Amily2-AdditionalFeatures.html +++ b/assets/Amily2-AdditionalFeatures.html @@ -176,8 +176,8 @@
@@ -270,7 +270,7 @@ - 【开始远征】将立即清算所有未记录的历史。 【自动巡录】则在您聊天时,于后台默默守护史册的完整。 + 【自动批量】将立即清算所有未记录的历史。 【静默总结】则在您聊天时,于后台默默守护史册的完整。 @@ -280,6 +280,41 @@
+
+ 📚 史册归档与回溯 + + 管理多条时间线的史册,随时封存或重启旧的历史。 + + +
+ +
+ +
+
+ +
+ + +
+
+
+ + + +
+ + +
+
💎 宏史卷 (史册精炼) @@ -290,8 +325,8 @@
diff --git a/assets/Memorisation-forms.html b/assets/Memorisation-forms.html index 08fdb49..952bda6 100644 --- a/assets/Memorisation-forms.html +++ b/assets/Memorisation-forms.html @@ -15,7 +15,7 @@ flex: 1; display: flex; flex-direction: column; - min-width: 0; + min-width: 0; /* Prevents flex items from overflowing */ } .scrollable-container { @@ -152,6 +152,7 @@ \x0a\x20\x20\x20\x20','files','请输入您的Google\x20API\x20Key','getSettings','style','预览内容已更新,可随时开始凝识。','翰林院设定已存档封印。','fetchHLYRerankModels','\x0a忆识总数:\x20','use\x20strict','insertAdjacentHTML','任务已由用户中止。进度已保存,可随时继续。','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','previewHLYCondensation','input','{{lorebook_text}}','\x20楼:\x20[','预览并编辑凝识内容','您确定要将选中的\x20','2898488kmGHZn','condensationHistory','','warn','send-date','.hly-kb-rename-btn','saveHLYSettings','hly-entry-search','】已删除。','hly-chunk-size','删除局部知识库\x20','fa-times-circle','exclusionRules','getLocalKnowledgeBases','hanlinyuan-ingest-progress-bar','删除失败:\x20','获取模型失败:\x20','翰林院设定已重置为初始状态。','当前角色','allWorldbooks','未知错误','\x20个知识块','》的批量编纂任务已完成。成功:\x20','every','includes','\x20楼已成功凝识,新增\x20','processedChunks','%。是否从上次中断之处继续?','.depth','stopPropagation','\x20楼到第\x20','ingestHLYManualText','chat_history','apiEndpoint','finalText','\x0a--------------------\x0aAPI端点:\x20','value','move','\x20个知识库从\x20','hly-embedding-model','.count\x22]','hanlinyuan-ingest-novel-file-name','hly-historiography-results','closest','N/A','globalToLocal','获取Rerank模型失败:\x20','hly-independent-chat-memory-enabled','find','加载书库列表失败:\x20','hly-rerank-notify','user','fa-check-circle','\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加载失败:\x20','开始将\x20','rerank','floor','暂无规则

','遵命,将从头开始录入此书。','\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\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20

','input[name=\x22hly-unified-injection-position\x22]','superSortEnabled','[翰林院-枢纽]\x20查询宝库状态失败:','className','template','正在清空宝库...','>\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\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\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','\x20个局部知识库吗?此操作无法恢复!','initialize','手动录入','hly-local-kb-char-name','hly-hist-select-all-entries','classList','错误:\x20','injection_','[翰林院-枢纽]\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添加新规则\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\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20','正在为《','会话已解锁,将跟随当前角色。','根据标签提取或内容排除条件,未找到任何有效内容。','\x20楼的内容(共\x20','span','hly-condensation-results','操作完成,但有\x20','\x20个知识库从【','.hly-kb-name','hly-kb-bulk-actions-local','getCollectionId','getLockedSessionInfo','[翰林院-枢纽]\x20凝识过程发生错误:','.hly-log-placeholder','请先选择书库','hly-rerank-enabled','2541018uDGzfQ','','hly-query-message-count','自定义路径:','delete','hly-kb-select-all-global','.hly-preview-delete-btn-v2','boolean','removeKnowledgeBase','resetSettings','float','#hly-rules-list','\x20个知识库。','成功切换了\x20','删除知识库\x20','未找到匹配的条目','开始批量删除\x20','each','[断点续传]\x20用户选择继续任务\x20','condensation','local','end','hly-current-vector-count','toggleKnowledgeBase','flex','renameKnowledgeBase','hly-max-results','\x20为占位符。','成功加载\x20','val',';\x22>\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\x20\x20\x20\x20','宝库已清空。','testApiConnection','radio','replace','.depth_role','clearJob','independentChatMemoryEnabled','.hly-exclusion-rule-row','启禀大人,发现此书上次录入已完成\x20','\x22\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\x20data-send-date=\x22','allEntries','圣旨已达','hly-tag-extraction-toggle','hly-tag-input-container','#hly-modal-tag-input-container','block','已采集\x20','》的条目失败:','innerHTML','chunkSize','querySelector','position','input[name=\x22','\x20条消息,开始凝识...','contains','宝库状态','none','移动知识库\x20','\x20条有效条目),请点击“开始凝识”进入自动向量化流程。','moveKnowledgeBase','queryMessageCount','hly-kb-select-all-','565YGAnPY','name','1WJOSuX','[翰林院-枢纽]\x20未找到类型为\x20\x22','hly-kb-list-global','您确定要永久删除知识库【','type','点击以锁定,让翰林院固定操作当前角色的宝库','url','signal','\x22\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\x20data-is-user=\x22','准备对《','\x20个知识库执行批量操作...','checkbox','文书录入失败:\x20','updateHLYMemoryCount','global','.hly-preview-item-v2','编辑检索内容排除规则','hanlinyuan-ingest-novel-start','getVectorCount','会话已解锁。','未找到任何书库','executeCompilation'];_0x1a15=function(){return _0x1e2eb6;};return _0x1a15();}import{extractBlocksByTags,applyExclusionRules}from'../core/utils/rag-tag-extractor.js';import{filterWorldbooks,filterWorldbookEntries,highlightSearchMatch,debounce}from'../core/rag-processor.js';_0x28d2da(0x230);function setupGlobalEventHandlers(){const _0x9c32ac=_0x28d2da;window[_0x9c32ac(0x240)]=()=>saveSettingsFromUI(![]),window['resetHLYSettings']=resetSettingsToUI,window[_0x9c32ac(0x28f)]=testApi,window['fetchHLYEmbeddingModels']=fetchHLYEmbeddingModels,window[_0x9c32ac(0x22e)]=fetchHLYRerankModels,window[_0x9c32ac(0x327)]=updatePanelStatus,window[_0x9c32ac(0x3e6)]=purgeStorage,window[_0x9c32ac(0x2a3)]=startCondensation,window[_0x9c32ac(0x234)]=previewCondensation,window[_0x9c32ac(0x259)]=ingestManualText,window['hlyLog']=log,window['showHLYStats']=showStats,window[_0x9c32ac(0x283)]=startHistoriography;}function updateAndSaveSetting(_0x432dde,_0x2d2b27){const _0x3f6349=_0x28d2da,_0xf00ca3=_0x5a0ed1[_0x3f6349(0x22a)]();if(!_0xf00ca3)return;const _0x4619b0=_0x432dde[_0x3f6349(0x3d5)]('.');let _0x55f57c=_0xf00ca3;for(let _0x462ee1=0x0;_0x462ee1<_0x4619b0[_0x3f6349(0x341)]-0x1;_0x462ee1++){_0x55f57c=_0x55f57c[_0x4619b0[_0x462ee1]]=_0x55f57c[_0x4619b0[_0x462ee1]]||{};}_0x55f57c[_0x4619b0[_0x4619b0[_0x3f6349(0x341)]-0x1]]=_0x2d2b27,_0x5a0ed1[_0x3f6349(0x342)](),log(_0x3f6349(0x371)+_0x432dde+'\x27\x20已更新为:\x20'+JSON[_0x3f6349(0x338)](_0x2d2b27),'success');}function bindAutoSaveEvents(){const _0x1805bc=_0x28d2da,_0x3c1f61=document[_0x1805bc(0x214)](_0x1805bc(0x299));if(!_0x3c1f61)return;_0x3c1f61[_0x1805bc(0x29a)]('change',_0x541b13=>{const _0x3277f5=_0x1805bc,_0x4a99c5=_0x541b13[_0x3277f5(0x335)],_0x88d917=_0x4a99c5[_0x3277f5(0x369)]['settingKey'];if(!_0x88d917)return;let _0x22113a;const _0x1e717a=_0x4a99c5[_0x3277f5(0x369)][_0x3277f5(0x31e)]||_0x3277f5(0x337);if(_0x4a99c5[_0x3277f5(0x31e)]===_0x3277f5(0x325))_0x22113a=_0x4a99c5[_0x3277f5(0x3a9)];else{if(_0x4a99c5['type']===_0x3277f5(0x2fa)){if(_0x4a99c5[_0x3277f5(0x3a9)]){const _0x11aa21=_0x3c1f61[_0x3277f5(0x285)](_0x3277f5(0x30e)+_0x4a99c5[_0x3277f5(0x319)]+'\x22]'),_0x23a463=Array['from'](_0x11aa21)[_0x3277f5(0x26a)](_0x161d2d=>_0x161d2d[_0x3277f5(0x3a9)]);_0x22113a=_0x23a463[_0x3277f5(0x25e)];}else return;}else _0x22113a=_0x4a99c5[_0x3277f5(0x25e)];}switch(_0x1e717a){case _0x3277f5(0x21e):_0x22113a=parseInt(_0x22113a,0xa);break;case _0x3277f5(0x2e3):_0x22113a=parseFloat(_0x22113a);break;case'boolean':typeof _0x22113a!==_0x3277f5(0x2e0)&&(_0x22113a=_0x22113a===_0x3277f5(0x3bb));break;}if(_0x4a99c5[_0x3277f5(0x31e)]===_0x3277f5(0x2fa)&&!_0x4a99c5[_0x3277f5(0x3a9)])return;updateAndSaveSetting(_0x88d917,_0x22113a),_0x88d917==='retrieval.independentChatMemoryEnabled'&&updatePanelStatus();});}export function bindHanlinyuanEvents(){const _0x5c71ac=_0x28d2da,_0x37537a=getContext();if(!_0x37537a){console[_0x5c71ac(0x282)](_0x5c71ac(0x33a));return;}setupGlobalEventHandlers(),bindPanelToggleEvents(),bindInternalUIEvents(),bindTutorialEvents(),bindAutoSaveEvents(),bindSessionLockEvent(),initializeUnifiedInjectionEditor();if(_0x5a0ed1[_0x5c71ac(0x2c0)])_0x5a0ed1[_0x5c71ac(0x2c0)]();else{console[_0x5c71ac(0x282)](_0x5c71ac(0x394));return;}loadSettingsToUI(),loadWorldbookList(),log('[翰林院-枢纽]\x20已成功连接各部,政令畅通。','info');const _0x49d861=document[_0x5c71ac(0x214)]('hanlinyuan-ingest-novel-file-input'),_0x49b507=document['getElementById'](_0x5c71ac(0x263)),_0x13fd6c=document['getElementById'](_0x5c71ac(0x32b)),_0x4a47e4=document[_0x5c71ac(0x214)](_0x5c71ac(0x27b)),_0x5a9012=document['getElementById'](_0x5c71ac(0x2a2)),_0xb4da80=document[_0x5c71ac(0x214)](_0x5c71ac(0x248)),_0x4deb6a=document[_0x5c71ac(0x214)](_0x5c71ac(0x2a4)),_0x7150d9=document[_0x5c71ac(0x214)]('hanlinyuan-ingest-novel-controls');let _0x1e674b=null,_0x46dbb9=null;_0x49d861[_0x5c71ac(0x29a)](_0x5c71ac(0x1fc),_0xd84e50=>{const _0x3e8863=_0x5c71ac;_0x1e674b=_0xd84e50['target'][_0x3e8863(0x228)][0x0],_0x1e674b?(_0x49b507['textContent']=_0x1e674b[_0x3e8863(0x319)],_0x49b507[_0x3e8863(0x27d)]=_0x1e674b[_0x3e8863(0x319)]):_0x49b507['textContent']=_0x3e8863(0x3d1);}),_0x13fd6c[_0x5c71ac(0x29a)](_0x5c71ac(0x39f),async()=>{const _0x3bc0c9=_0x5c71ac;if(!_0x1e674b){toastr[_0x3bc0c9(0x40a)](_0x3bc0c9(0x29e));return;}let _0xafc159=0x0;const _0x586bb6=_0x54c7cd[_0x3bc0c9(0x354)](_0x1e674b),_0x33c001=_0x54c7cd[_0x3bc0c9(0x357)](_0x586bb6);if(_0x33c001){const _0x2741ba=(_0x33c001[_0x3bc0c9(0x254)]/_0x33c001[_0x3bc0c9(0x219)]*0x64)[_0x3bc0c9(0x3af)](0x1),_0x143b16=confirm(_0x3bc0c9(0x300)+_0x2741ba+_0x3bc0c9(0x255));_0x143b16?(_0xafc159=_0x33c001[_0x3bc0c9(0x254)],toastr[_0x3bc0c9(0x390)](_0x3bc0c9(0x207)+(_0xafc159+0x1)+_0x3bc0c9(0x34f),'圣旨已达'),log(_0x3bc0c9(0x2eb)+_0x586bb6+_0x3bc0c9(0x3c3)+_0xafc159+_0x3bc0c9(0x360),'info')):(_0x54c7cd[_0x3bc0c9(0x2fd)](_0x586bb6),toastr[_0x3bc0c9(0x390)](_0x3bc0c9(0x28d),_0x3bc0c9(0x303)),log(_0x3bc0c9(0x3aa)+_0x586bb6+_0x3bc0c9(0x3f6),_0x3bc0c9(0x23d)));}_0x46dbb9=new AbortController();const _0x40a85d=_0x46dbb9[_0x3bc0c9(0x321)];_0x7150d9['style'][_0x3bc0c9(0x3a8)]=_0x3bc0c9(0x312),_0x5a9012[_0x3bc0c9(0x22b)]['display']='block',_0x4deb6a['textContent']='正在读取文件...',_0xb4da80[_0x3bc0c9(0x25e)]=0x0;try{const _0x4e74f6=await _0x1e674b[_0x3bc0c9(0x3b3)](),_0x48409b=_0x4a99f5=>{const _0x10aec9=_0x3bc0c9;_0x4deb6a[_0x10aec9(0x3e1)]=_0x10aec9(0x3cf)+_0x4a99f5['message']+'\x20('+_0x4a99f5[_0x10aec9(0x3b4)]+'/'+_0x4a99f5[_0x10aec9(0x387)]+')',_0xb4da80[_0x10aec9(0x25e)]=_0x4a99f5[_0x10aec9(0x3b4)]/_0x4a99f5[_0x10aec9(0x387)]*0x64;},_0x500025=()=>{const _0xfdb1d5=_0x3bc0c9;updatePanelStatus(),log(_0xfdb1d5(0x344),_0xfdb1d5(0x390));},_0x1dd627=await _0x5a0ed1[_0x3bc0c9(0x1f3)](_0x4e74f6,_0x3bc0c9(0x38b),{'sourceName':_0x1e674b[_0x3bc0c9(0x319)]},_0x48409b,_0x40a85d,log,_0x500025,_0x586bb6,_0xafc159);if(_0x1dd627[_0x3bc0c9(0x224)])toastr[_0x3bc0c9(0x224)](_0x3bc0c9(0x2ba)+_0x1dd627[_0x3bc0c9(0x343)]+_0x3bc0c9(0x24f)),_0x4deb6a['textContent']='任务完成!成功录入\x20'+_0x1dd627[_0x3bc0c9(0x343)]+_0x3bc0c9(0x385),_0xb4da80['value']=0x64,updatePanelStatus();else throw new Error(_0x1dd627[_0x3bc0c9(0x282)]||'未知错误');}catch(_0x5163bc){_0x5163bc[_0x3bc0c9(0x319)]===_0x3bc0c9(0x40f)?(toastr[_0x3bc0c9(0x390)](_0x3bc0c9(0x232)),_0x4deb6a['textContent']=_0x3bc0c9(0x36f)):(toastr[_0x3bc0c9(0x282)](_0x3bc0c9(0x216)+_0x5163bc[_0x3bc0c9(0x415)]+_0x3bc0c9(0x365)),_0x4deb6a[_0x3bc0c9(0x3e1)]=_0x3bc0c9(0x2c5)+_0x5163bc[_0x3bc0c9(0x415)]);}finally{setTimeout(()=>{const _0x5bef81=_0x3bc0c9;_0x7150d9[_0x5bef81(0x22b)]['display']=_0x5bef81(0x2f1),_0x5a9012['style'][_0x5bef81(0x3a8)]=_0x5bef81(0x312),_0x49d861[_0x5bef81(0x25e)]='',_0x1e674b=null,_0x49b507[_0x5bef81(0x3e1)]=_0x5bef81(0x3d1);},0xbb8);}}),_0x4a47e4['addEventListener'](_0x5c71ac(0x39f),()=>{_0x46dbb9&&_0x46dbb9['abort']();});}function bindSessionLockEvent(){const _0x29a9cb=_0x28d2da,_0x1c0b46=document[_0x29a9cb(0x214)](_0x29a9cb(0x400));if(!_0x1c0b46)return;_0x1c0b46[_0x29a9cb(0x29a)](_0x29a9cb(0x39f),async()=>{const _0x1d1888=_0x29a9cb,_0x47b5c1=await _0x5a0ed1[_0x1d1888(0x402)]();updateSessionLockUI(_0x47b5c1);if(_0x47b5c1){const _0x4381c5=_0x5a0ed1[_0x1d1888(0x2d4)]();_0x4381c5&&(toastr[_0x1d1888(0x224)](_0x1d1888(0x20a)+_0x4381c5['id'],_0x1d1888(0x1f7)),log(_0x1d1888(0x3e2)+_0x4381c5['id'],_0x1d1888(0x224)));}else toastr['info'](_0x1d1888(0x2ca),'诏曰'),log(_0x1d1888(0x32d),_0x1d1888(0x390));updatePanelStatus();}),updateSessionLockUI(_0x5a0ed1[_0x29a9cb(0x274)]());}function updateSessionLockUI(_0x51b879){const _0x388703=_0x28d2da,_0x224e43=document[_0x388703(0x214)](_0x388703(0x400));if(!_0x224e43)return;const _0x4fda47=_0x224e43[_0x388703(0x30c)]('i'),_0x32f01e=_0x224e43[_0x388703(0x30c)](_0x388703(0x2cd));_0x51b879?(_0x224e43[_0x388703(0x2c4)][_0x388703(0x1f6)](_0x388703(0x3c6)),_0x4fda47['className']=_0x388703(0x408),_0x32f01e[_0x388703(0x3e1)]=_0x388703(0x36e),_0x224e43[_0x388703(0x27d)]=_0x388703(0x3d7)):(_0x224e43['classList'][_0x388703(0x21a)](_0x388703(0x3c6)),_0x4fda47[_0x388703(0x2b4)]=_0x388703(0x413),_0x32f01e['textContent']='锁定会话',_0x224e43[_0x388703(0x27d)]=_0x388703(0x31f));}function bindPanelToggleEvents(){const _0x1eb852=_0x28d2da,_0xef0868=document[_0x1eb852(0x214)](_0x1eb852(0x296));if(_0xef0868){}}function bindTutorialEvents(){const _0x50ce05=_0x28d2da,_0x51bf99=document[_0x50ce05(0x214)]('amily2_open_hanlin_tutorial');_0x51bf99&&_0x51bf99[_0x50ce05(0x29a)](_0x50ce05(0x39f),()=>{const _0x32ed9c=_0x50ce05;showContentModal(_0x32ed9c(0x386),_0x32ed9c(0x363));});}function bindInternalUIEvents(){const _0x2d6442=_0x28d2da,_0x4f1103=document[_0x2d6442(0x285)](_0x2d6442(0x331));_0x4f1103[_0x2d6442(0x3dd)](_0x14d2f3=>{const _0x511a8e=_0x2d6442;_0x14d2f3[_0x511a8e(0x29a)](_0x511a8e(0x39f),()=>{const _0x33fa96=_0x511a8e,_0x156a17=_0x14d2f3[_0x33fa96(0x369)][_0x33fa96(0x295)],_0x169aba=_0x33fa96(0x409)+_0x156a17+_0x33fa96(0x21c);document[_0x33fa96(0x285)](_0x33fa96(0x3d6))['forEach'](_0x4ad631=>{const _0x265a30=_0x33fa96;_0x4ad631[_0x265a30(0x2c4)][_0x265a30(0x29b)](_0x265a30(0x3c6),_0x4ad631['id']===_0x169aba);}),_0x4f1103[_0x33fa96(0x3dd)](_0xd74caa=>_0xd74caa['classList']['toggle'](_0x33fa96(0x3c6),_0xd74caa===_0x14d2f3));});});const _0x28b6dd=document[_0x2d6442(0x214)](_0x2d6442(0x353));_0x28b6dd&&_0x28b6dd[_0x2d6442(0x29a)](_0x2d6442(0x1fc),handleApiModeChange);const _0x146ac1=document[_0x2d6442(0x214)](_0x2d6442(0x304)),_0x1f045a=document[_0x2d6442(0x214)](_0x2d6442(0x305));_0x146ac1&&_0x1f045a&&_0x146ac1['addEventListener'](_0x2d6442(0x1fc),()=>{const _0x40bb19=_0x2d6442;_0x1f045a[_0x40bb19(0x22b)][_0x40bb19(0x3a8)]=_0x146ac1[_0x40bb19(0x3a9)]?_0x40bb19(0x307):_0x40bb19(0x312);});const _0x5370f7=document[_0x2d6442(0x214)](_0x2d6442(0x3c2));_0x5370f7&&_0x5370f7[_0x2d6442(0x29a)](_0x2d6442(0x1fc),handleWorldbookSelectionChange);const _0x25e0e1=document['getElementById']('hly-exclusion-rules-btn');_0x25e0e1&&_0x25e0e1[_0x2d6442(0x29a)](_0x2d6442(0x39f),()=>showRulesModal(_0x2d6442(0x2ec)));const _0x1f112b=document[_0x2d6442(0x214)]('hly-query-preprocessing-rules-btn');_0x1f112b&&_0x1f112b['addEventListener']('click',()=>showRulesModal('queryPreprocessing'));const _0x558a54=document[_0x2d6442(0x214)](_0x2d6442(0x286)),_0x13f699=document['getElementById'](_0x2d6442(0x375));_0x558a54&&_0x13f699&&(_0x558a54[_0x2d6442(0x29a)](_0x2d6442(0x39f),_0xf31c34=>{const _0x47841c=_0x2d6442;_0xf31c34[_0x47841c(0x257)]();const _0x33b429=_0x13f699[_0x47841c(0x22b)]['display']===_0x47841c(0x307);_0x13f699[_0x47841c(0x22b)][_0x47841c(0x3a8)]=_0x33b429?_0x47841c(0x312):_0x47841c(0x307);}),_0x13f699[_0x2d6442(0x29a)](_0x2d6442(0x1fc),_0xddf3b4=>{const _0x30a99b=_0x2d6442,_0x5475bf=_0xddf3b4['target'];if(_0x5475bf[_0x30a99b(0x31e)]!==_0x30a99b(0x325))return;const _0x18ba19=_0x13f699[_0x30a99b(0x285)](_0x30a99b(0x3a5)),_0x1f3e34=document[_0x30a99b(0x214)](_0x30a99b(0x2c3));if(_0x5475bf['id']===_0x30a99b(0x2c3))_0x18ba19[_0x30a99b(0x3dd)](_0x585cd8=>_0x585cd8[_0x30a99b(0x3a9)]=_0x5475bf[_0x30a99b(0x3a9)]);else{const _0x42fd1a=Array[_0x30a99b(0x3fb)](_0x18ba19)[_0x30a99b(0x251)](_0x61ce96=>_0x61ce96[_0x30a99b(0x3a9)]);_0x1f3e34[_0x30a99b(0x3a9)]=_0x42fd1a;}const _0x4faea4=_0x13f699[_0x30a99b(0x285)](_0x30a99b(0x3ef))['length'],_0x39cf62=_0x18ba19[_0x30a99b(0x341)];_0x558a54[_0x30a99b(0x30c)](_0x30a99b(0x2cd))[_0x30a99b(0x3e1)]=_0x30a99b(0x27e)+_0x4faea4+_0x30a99b(0x278)+_0x39cf62+_0x30a99b(0x37c);}),document[_0x2d6442(0x29a)]('click',_0x5c16ed=>{const _0x3eb234=_0x2d6442;!_0x558a54[_0x3eb234(0x310)](_0x5c16ed[_0x3eb234(0x335)])&&!_0x13f699[_0x3eb234(0x310)](_0x5c16ed['target'])&&(_0x13f699[_0x3eb234(0x22b)][_0x3eb234(0x3a8)]=_0x3eb234(0x312));}));const _0x4d42b1=document[_0x2d6442(0x214)](_0x2d6442(0x391));_0x4d42b1&&_0x4d42b1[_0x2d6442(0x29a)](_0x2d6442(0x39f),deleteAllLocalKnowledgeBases);const _0x17e211=document['getElementById']('hly-kb-move-all-to-local');_0x17e211&&_0x17e211[_0x2d6442(0x29a)]('click',()=>moveAllKnowledgeBases(_0x2d6442(0x267)));const _0x2da5c3=document[_0x2d6442(0x214)](_0x2d6442(0x374));_0x2da5c3&&_0x2da5c3[_0x2d6442(0x29a)]('click',()=>moveAllKnowledgeBases(_0x2d6442(0x3c5)));const _0x1bd6ca=[_0x2d6442(0x34c),_0x2d6442(0x31c)];_0x1bd6ca[_0x2d6442(0x3dd)](_0x2e8f5a=>{const _0x13ffc5=_0x2d6442,_0x24f8c0=document[_0x13ffc5(0x214)](_0x2e8f5a);_0x24f8c0&&(_0x24f8c0[_0x13ffc5(0x29a)]('click',handleKbAction),_0x24f8c0[_0x13ffc5(0x29a)](_0x13ffc5(0x1fc),handleKbAction));}),document['getElementById'](_0x2d6442(0x2de))[_0x2d6442(0x29a)](_0x2d6442(0x1fc),_0x13268c=>handleSelectAll(_0x13268c,'global')),document[_0x2d6442(0x214)]('hly-kb-select-all-local')[_0x2d6442(0x29a)](_0x2d6442(0x1fc),_0x2ef633=>handleSelectAll(_0x2ef633,_0x2d6442(0x2ed))),document[_0x2d6442(0x214)](_0x2d6442(0x382))['addEventListener'](_0x2d6442(0x39f),_0x424e52=>handleBulkAction(_0x424e52,'global')),document[_0x2d6442(0x214)](_0x2d6442(0x2d2))[_0x2d6442(0x29a)](_0x2d6442(0x39f),_0xa0e4c8=>handleBulkAction(_0xa0e4c8,_0x2d6442(0x2ed)));}function initializeUnifiedInjectionEditor(){const _0x5aa35f=_0x28d2da,_0x565d61=document[_0x5aa35f(0x214)](_0x5aa35f(0x392)),_0x3df534=document[_0x5aa35f(0x214)](_0x5aa35f(0x3cd)),_0x221b81=document[_0x5aa35f(0x214)](_0x5aa35f(0x3a7)),_0x201587=document['querySelectorAll'](_0x5aa35f(0x2b1)),_0x5550b6=document[_0x5aa35f(0x214)]('hly-unified-injection-depth'),_0x4dfe79=document[_0x5aa35f(0x214)](_0x5aa35f(0x27f));if(!_0x565d61)return;const _0x3e3d5a={'novel':_0x5aa35f(0x3ec),'chat':_0x5aa35f(0x334),'lorebook':_0x5aa35f(0x236),'manual':_0x5aa35f(0x2aa)};function _0x1cb71a(){const _0x2dbc04=_0x5aa35f,_0x51b4c6=_0x565d61[_0x2dbc04(0x25e)],_0x2e048c=_0x5a0ed1['getSettings'](),_0x5496d8=_0x2e048c[_0x2dbc04(0x2c6)+_0x51b4c6]||{};_0x3df534[_0x2dbc04(0x25e)]=_0x5496d8[_0x2dbc04(0x2b5)]||'',_0x221b81[_0x2dbc04(0x3e1)]='以\x20'+(_0x3e3d5a[_0x51b4c6]||'{{text}}')+_0x2dbc04(0x2f4);const _0x24f078=_0x5496d8[_0x2dbc04(0x30d)]!==undefined?String(_0x5496d8[_0x2dbc04(0x30d)]):'2';_0x201587[_0x2dbc04(0x3dd)](_0x3d788e=>_0x3d788e[_0x2dbc04(0x3a9)]=_0x3d788e['value']===_0x24f078),_0x5550b6['value']=_0x5496d8['depth']||0x0,_0x4dfe79['value']=_0x5496d8[_0x2dbc04(0x3b9)]!==undefined?String(_0x5496d8[_0x2dbc04(0x3b9)]):'0';const _0x4ac179=_0x24f078==='1';_0x5550b6[_0x2dbc04(0x298)]=!_0x4ac179,_0x4dfe79[_0x2dbc04(0x298)]=!_0x4ac179;}function _0x1d8a99(){const _0x349db5=_0x5aa35f,_0x233da5=_0x565d61[_0x349db5(0x25e)];updateAndSaveSetting('injection_'+_0x233da5+'.template',_0x3df534['value']);const _0x4bacc2=document[_0x349db5(0x30c)](_0x349db5(0x3c7));_0x4bacc2&&updateAndSaveSetting(_0x349db5(0x2c6)+_0x233da5+_0x349db5(0x3cc),parseInt(_0x4bacc2[_0x349db5(0x25e)],0xa)),updateAndSaveSetting(_0x349db5(0x2c6)+_0x233da5+_0x349db5(0x256),parseInt(_0x5550b6[_0x349db5(0x25e)],0xa)),updateAndSaveSetting(_0x349db5(0x2c6)+_0x233da5+_0x349db5(0x2fc),parseInt(_0x4dfe79[_0x349db5(0x25e)],0xa));}_0x565d61['addEventListener'](_0x5aa35f(0x1fc),_0x1cb71a);const _0x2ed4e4=debounce(_0x1d8a99,0x12c);_0x3df534[_0x5aa35f(0x29a)](_0x5aa35f(0x235),_0x2ed4e4),_0x5550b6[_0x5aa35f(0x29a)](_0x5aa35f(0x1fc),_0x1d8a99),_0x4dfe79[_0x5aa35f(0x29a)](_0x5aa35f(0x1fc),_0x1d8a99),_0x201587[_0x5aa35f(0x3dd)](_0x3ed4cf=>_0x3ed4cf[_0x5aa35f(0x29a)](_0x5aa35f(0x1fc),()=>{const _0x928f97=_0x5aa35f;_0x1d8a99();const _0x249673=_0x3ed4cf[_0x928f97(0x25e)]==='1'&&_0x3ed4cf['checked'];_0x5550b6[_0x928f97(0x298)]=!_0x249673,_0x4dfe79[_0x928f97(0x298)]=!_0x249673;})),_0x1cb71a();}function handleApiModeChange(){const _0x253c74=_0x28d2da,_0x5b6e02=document[_0x253c74(0x214)](_0x253c74(0x353))[_0x253c74(0x25e)],_0x42fea4=document['getElementById'](_0x253c74(0x36c)),_0x48deaf=document[_0x253c74(0x214)](_0x253c74(0x384)),_0xab017d=document[_0x253c74(0x214)]('hly-embedding-model'),_0x32d382=_0xab017d['previousElementSibling'];if(!_0x42fea4||!_0x48deaf)return;_0x42fea4[_0x253c74(0x22b)][_0x253c74(0x3a8)]=_0x253c74(0x307),_0x48deaf[_0x253c74(0x22b)]['display']=_0x253c74(0x307);switch(_0x5b6e02){case _0x253c74(0x210):_0x42fea4[_0x253c74(0x22b)][_0x253c74(0x3a8)]=_0x253c74(0x312),_0x48deaf['querySelector']('label')['textContent']=_0x253c74(0x2a0),_0x48deaf[_0x253c74(0x30c)](_0x253c74(0x235))['placeholder']=_0x253c74(0x229);break;case _0x253c74(0x364):_0x42fea4[_0x253c74(0x30c)](_0x253c74(0x287))[_0x253c74(0x3e1)]=_0x253c74(0x3db),_0x42fea4['querySelector'](_0x253c74(0x235))['placeholder']=_0x253c74(0x1ff),_0x48deaf['style']['display']=_0x253c74(0x312);break;case _0x253c74(0x3f9):default:_0x42fea4[_0x253c74(0x30c)](_0x253c74(0x287))[_0x253c74(0x3e1)]=_0x253c74(0x2dc),_0x42fea4[_0x253c74(0x30c)](_0x253c74(0x235))['placeholder']=_0x253c74(0x2ae),_0x48deaf['querySelector'](_0x253c74(0x287))[_0x253c74(0x3e1)]=_0x253c74(0x3bc);break;}}function loadSettingsToUI(){const _0x201612=_0x28d2da,_0x6c8a37=_0x5a0ed1[_0x201612(0x22a)]();if(!_0x6c8a37)return;document[_0x201612(0x214)](_0x201612(0x3f1))['checked']=_0x6c8a37[_0x201612(0x380)][_0x201612(0x3ee)],document[_0x201612(0x214)](_0x201612(0x353))[_0x201612(0x25e)]=_0x6c8a37[_0x201612(0x380)]['apiEndpoint'],document[_0x201612(0x214)]('hly-custom-api-url')[_0x201612(0x25e)]=_0x6c8a37['retrieval']['customApiUrl'],document[_0x201612(0x214)]('hly-api-key')[_0x201612(0x25e)]=_0x6c8a37[_0x201612(0x380)]['apiKey'];const _0x3cccd9=document[_0x201612(0x214)](_0x201612(0x261));if(_0x3cccd9[_0x201612(0x332)][_0x201612(0x341)]===0x0){const _0x574d2b=_0x6c8a37[_0x201612(0x380)][_0x201612(0x35b)],_0x4990eb=new Option(_0x574d2b,_0x574d2b,!![],!![]);_0x3cccd9[_0x201612(0x1f6)](_0x4990eb);}_0x3cccd9[_0x201612(0x25e)]=_0x6c8a37[_0x201612(0x380)]['embeddingModel'],document['getElementById'](_0x201612(0x350))['checked']=_0x6c8a37[_0x201612(0x380)][_0x201612(0x406)],document[_0x201612(0x214)](_0x201612(0x243))['value']=_0x6c8a37['advanced'][_0x201612(0x30b)],document['getElementById'](_0x201612(0x3a1))[_0x201612(0x25e)]=_0x6c8a37['advanced']['overlap'],document[_0x201612(0x214)]('hly-match-threshold')[_0x201612(0x25e)]=_0x6c8a37[_0x201612(0x34e)]['matchThreshold'],document[_0x201612(0x214)](_0x201612(0x2db))['value']=_0x6c8a37[_0x201612(0x34e)][_0x201612(0x316)],document[_0x201612(0x214)](_0x201612(0x2f3))[_0x201612(0x25e)]=_0x6c8a37['advanced'][_0x201612(0x2a9)],document['getElementById'](_0x201612(0x3de))[_0x201612(0x25e)]=_0x6c8a37[_0x201612(0x380)]['batchSize'],handleApiModeChange(),document[_0x201612(0x214)](_0x201612(0x399))[_0x201612(0x3a9)]=_0x6c8a37[_0x201612(0x2ec)]['enabled'],document[_0x201612(0x214)](_0x201612(0x2ad))[_0x201612(0x25e)]=_0x6c8a37[_0x201612(0x2ec)][_0x201612(0x3fa)],document[_0x201612(0x214)](_0x201612(0x1fb))[_0x201612(0x25e)]=_0x6c8a37[_0x201612(0x2ec)][_0x201612(0x403)],document[_0x201612(0x214)](_0x201612(0x383))[_0x201612(0x3a9)]=_0x6c8a37[_0x201612(0x2ec)][_0x201612(0x373)][_0x201612(0x26d)],document[_0x201612(0x214)](_0x201612(0x221))['checked']=_0x6c8a37['condensation'][_0x201612(0x373)]['ai'];const _0x680fd=document[_0x201612(0x214)](_0x201612(0x304)),_0x1e43f7=document[_0x201612(0x214)]('hly-tag-input'),_0x2d7c51=document[_0x201612(0x214)]('hly-tag-input-container');_0x680fd[_0x201612(0x3a9)]=_0x6c8a37[_0x201612(0x2ec)]['tagExtractionEnabled'],_0x1e43f7[_0x201612(0x25e)]=_0x6c8a37['condensation'][_0x201612(0x3ac)],_0x2d7c51[_0x201612(0x22b)][_0x201612(0x3a8)]=_0x680fd[_0x201612(0x3a9)]?'block':_0x201612(0x312),document[_0x201612(0x214)](_0x201612(0x2d8))[_0x201612(0x3a9)]=_0x6c8a37[_0x201612(0x28a)]['enabled'],document['getElementById'](_0x201612(0x3d0))[_0x201612(0x25e)]=_0x6c8a37[_0x201612(0x28a)][_0x201612(0x320)],document[_0x201612(0x214)](_0x201612(0x3a2))[_0x201612(0x25e)]=_0x6c8a37[_0x201612(0x28a)][_0x201612(0x206)];const _0x21e0db=document[_0x201612(0x214)]('hly-rerank-model');if(_0x21e0db[_0x201612(0x332)][_0x201612(0x341)]===0x0){const _0x32fc22=_0x6c8a37['rerank'][_0x201612(0x397)];if(_0x32fc22){const _0x3dff52=new Option(_0x32fc22,_0x32fc22,!![],!![]);_0x21e0db[_0x201612(0x1f6)](_0x3dff52);}}_0x21e0db[_0x201612(0x25e)]=_0x6c8a37[_0x201612(0x28a)][_0x201612(0x397)],document[_0x201612(0x214)]('hly-rerank-top-n')[_0x201612(0x25e)]=_0x6c8a37[_0x201612(0x28a)][_0x201612(0x38e)],document['getElementById']('hly-rerank-hybrid-alpha')[_0x201612(0x25e)]=_0x6c8a37[_0x201612(0x28a)][_0x201612(0x211)],document[_0x201612(0x214)](_0x201612(0x26c))[_0x201612(0x3a9)]=_0x6c8a37[_0x201612(0x28a)][_0x201612(0x406)],document['getElementById']('hly-super-sort-enabled')['checked']=_0x6c8a37[_0x201612(0x28a)][_0x201612(0x2b2)];const _0x11aba6=_0x6c8a37['rerank']['priorityRetrieval'];if(_0x11aba6){document[_0x201612(0x214)](_0x201612(0x3dc))[_0x201612(0x3a9)]=_0x11aba6[_0x201612(0x3ee)];const _0x328549=[_0x201612(0x38b),_0x201612(0x25a),_0x201612(0x2a1),_0x201612(0x395)];_0x328549['forEach'](_0x37eb92=>{const _0x37ba25=_0x201612,_0x733f84=_0x11aba6[_0x37ba25(0x3e3)][_0x37eb92];if(_0x733f84){const _0x517fd8=document['querySelector'](_0x37ba25(0x226)+_0x37eb92+'.enabled\x22]'),_0x38c290=document[_0x37ba25(0x30c)](_0x37ba25(0x226)+_0x37eb92+_0x37ba25(0x262));if(_0x517fd8)_0x517fd8[_0x37ba25(0x3a9)]=_0x733f84[_0x37ba25(0x3ee)];if(_0x38c290)_0x38c290['value']=_0x733f84[_0x37ba25(0x343)];}});}_0x6c8a37['queryPreprocessing']&&(document[_0x201612(0x214)](_0x201612(0x280))[_0x201612(0x3a9)]=_0x6c8a37['queryPreprocessing'][_0x201612(0x3ee)]),_0x6c8a37[_0x201612(0x380)][_0x201612(0x2fe)]!==undefined&&(document[_0x201612(0x214)](_0x201612(0x269))[_0x201612(0x3a9)]=_0x6c8a37[_0x201612(0x380)]['independentChatMemoryEnabled']);}function saveSettingsFromUI(_0x4956c3=!![]){const _0x4582fe=_0x28d2da,_0x59e8d8=document[_0x4582fe(0x214)](_0x4582fe(0x299));if(!_0x59e8d8)return;const _0x96a758=_0x59e8d8[_0x4582fe(0x285)](_0x4582fe(0x3fd));_0x96a758['forEach'](_0xc400f2=>{const _0x585818=_0x4582fe,_0x88e277=_0xc400f2[_0x585818(0x369)][_0x585818(0x215)];if(!_0x88e277)return;let _0x74d1e7;const _0x12e126=_0xc400f2['dataset'][_0x585818(0x31e)]||_0x585818(0x337);if(_0xc400f2[_0x585818(0x31e)]===_0x585818(0x325))_0x74d1e7=_0xc400f2['checked'];else{if(_0xc400f2['type']===_0x585818(0x2fa)){if(!_0xc400f2[_0x585818(0x3a9)])return;_0x74d1e7=_0xc400f2[_0x585818(0x25e)];}else _0x74d1e7=_0xc400f2[_0x585818(0x25e)];}switch(_0x12e126){case _0x585818(0x21e):_0x74d1e7=parseInt(_0x74d1e7,0xa);break;case _0x585818(0x2e3):_0x74d1e7=parseFloat(_0x74d1e7);break;case _0x585818(0x2e0):if(typeof _0x74d1e7!=='boolean')_0x74d1e7=_0x74d1e7===_0x585818(0x3bb);break;}const _0x10f567=_0x5a0ed1[_0x585818(0x22a)](),_0x544ffa=_0x88e277[_0x585818(0x3d5)]('.');let _0x535fc0=_0x10f567;for(let _0x5445e6=0x0;_0x5445e6<_0x544ffa[_0x585818(0x341)]-0x1;_0x5445e6++){_0x535fc0=_0x535fc0[_0x544ffa[_0x5445e6]]=_0x535fc0[_0x544ffa[_0x5445e6]]||{};}_0x535fc0[_0x544ffa[_0x544ffa[_0x585818(0x341)]-0x1]]=_0x74d1e7;}),_0x5a0ed1[_0x4582fe(0x342)](),!_0x4956c3&&(log(_0x4582fe(0x27c),_0x4582fe(0x224)),toastr[_0x4582fe(0x224)](_0x4582fe(0x22d),_0x4582fe(0x303)));}function resetSettingsToUI(){const _0x221d71=_0x28d2da;confirm(_0x221d71(0x3e5))&&(_0x5a0ed1[_0x221d71(0x2e2)](),loadSettingsToUI(),toastr[_0x221d71(0x390)](_0x221d71(0x24b),'诏曰'));}async function updatePanelStatus(){const _0x35cec2=_0x28d2da,_0x1cde32=_0x5a0ed1[_0x35cec2(0x274)](),_0x4c5e55=document[_0x35cec2(0x214)](_0x35cec2(0x35d)),_0x2248e6=document['getElementById'](_0x35cec2(0x277));if(_0x1cde32){const _0x32d178=_0x5a0ed1[_0x35cec2(0x2d4)]();_0x32d178&&(_0x4c5e55[_0x35cec2(0x3e1)]='会话已锁定',_0x2248e6[_0x35cec2(0x3e1)]=_0x32d178['id'],_0x2248e6['title']=_0x35cec2(0x33d)+_0x32d178['id'],_0x4c5e55[_0x35cec2(0x2c4)][_0x35cec2(0x1f6)](_0x35cec2(0x222)),_0x2248e6[_0x35cec2(0x2c4)]['add'](_0x35cec2(0x222)));}else _0x4c5e55['textContent']=_0x4966d0[_0x35cec2(0x1fd)](),_0x2248e6[_0x35cec2(0x3e1)]=_0x4966d0[_0x35cec2(0x276)]()||'无',_0x2248e6[_0x35cec2(0x27d)]='',_0x4c5e55['classList'][_0x35cec2(0x21a)](_0x35cec2(0x222)),_0x2248e6[_0x35cec2(0x2c4)][_0x35cec2(0x21a)](_0x35cec2(0x222));const _0x4f0a20=document[_0x35cec2(0x214)](_0x35cec2(0x2ef));_0x4f0a20[_0x35cec2(0x3e1)]=_0x35cec2(0x3b6);try{const _0x8f437e=await _0x5a0ed1[_0x35cec2(0x32c)]();_0x4f0a20[_0x35cec2(0x3e1)]=_0x8f437e;}catch(_0x5cfb5f){console[_0x35cec2(0x282)](_0x35cec2(0x1fa),_0x5cfb5f),_0x4f0a20[_0x35cec2(0x3e1)]=_0x35cec2(0x266),_0x4f0a20['title']='无法获取总数:\x20'+_0x5cfb5f[_0x35cec2(0x415)];}const _0x583b0c=document[_0x35cec2(0x214)](_0x35cec2(0x2ce));if(_0x583b0c&&!_0x583b0c[_0x35cec2(0x369)][_0x35cec2(0x25c)]){const _0x2318fc=_0x5a0ed1['getSettings'](),_0x105bf7=await _0x5a0ed1[_0x35cec2(0x2d3)]();if(_0x2318fc[_0x35cec2(0x23b)]&&_0x2318fc[_0x35cec2(0x23b)][_0x105bf7]){const _0x513227=_0x2318fc['condensationHistory'][_0x105bf7];_0x583b0c['innerHTML']='上次已从第\x20'+_0x513227['start']+'\x20楼凝识至第\x20'+_0x513227[_0x35cec2(0x2ee)]+_0x35cec2(0x2b0);}else _0x583b0c['innerHTML']='可在此预览凝识结果。

';}renderKnowledgeBases();}async function moveAllKnowledgeBases(_0x4d6d57){const _0x236ff5=_0x28d2da,_0x3d00e3=_0x4d6d57==='globalToLocal',_0x37a662=_0x3d00e3?_0x236ff5(0x328):_0x236ff5(0x2ed),_0x29df8c=_0x3d00e3?'局部':'全局',_0x5ddf43=_0x3d00e3?_0x5a0ed1[_0x236ff5(0x281)]():_0x5a0ed1[_0x236ff5(0x247)](),_0x54866b=Object['keys'](_0x5ddf43);if(_0x54866b['length']===0x0){toastr[_0x236ff5(0x390)](_0x236ff5(0x1f4)+(_0x3d00e3?'全局':'局部')+')没有任何知识库可供移动。','圣谕');return;}if(!confirm(_0x236ff5(0x270)+_0x54866b[_0x236ff5(0x341)]+_0x236ff5(0x2d0)+(_0x3d00e3?'全局':'局部')+_0x236ff5(0x349)+_0x29df8c+_0x236ff5(0x336)))return;log(_0x236ff5(0x289)+_0x54866b[_0x236ff5(0x341)]+_0x236ff5(0x260)+_0x37a662+'\x20移动到\x20'+(_0x3d00e3?_0x236ff5(0x2ed):_0x236ff5(0x328))+_0x236ff5(0x3b6),'info');const _0x5b8aac=_0x54866b['map'](_0xe86d8=>_0x5a0ed1['moveKnowledgeBase'](_0xe86d8,_0x37a662));try{await Promise[_0x236ff5(0x39d)](_0x5b8aac),toastr[_0x236ff5(0x224)](_0x236ff5(0x20c)+_0x54866b['length']+_0x236ff5(0x275),'大功告成'),log('批量移动完成。',_0x236ff5(0x224));}catch(_0x226574){toastr[_0x236ff5(0x282)](_0x236ff5(0x2ac)+_0x226574[_0x236ff5(0x415)],'警报'),log('批量移动失败:\x20'+_0x226574['message'],_0x236ff5(0x282));}finally{await updatePanelStatus();}}async function deleteAllLocalKnowledgeBases(){const _0x2f97d1=_0x28d2da,_0x10ff47=_0x5a0ed1[_0x2f97d1(0x247)](),_0x270144=Object[_0x2f97d1(0x3c9)](_0x10ff47);if(_0x270144[_0x2f97d1(0x341)]===0x0){toastr['info'](_0x2f97d1(0x1fe),'圣谕');return;}if(!confirm('您确定要永久删除【当前角色】的全部\x20'+_0x270144[_0x2f97d1(0x341)]+_0x2f97d1(0x2bf)))return;toastr[_0x2f97d1(0x390)]('正在删除\x20'+_0x270144[_0x2f97d1(0x341)]+_0x2f97d1(0x3ea),'圣旨'),log(_0x2f97d1(0x2e9)+_0x270144[_0x2f97d1(0x341)]+_0x2f97d1(0x3ea),_0x2f97d1(0x23d));let _0x3b3153=0x0,_0x6878c5=0x0;for(const _0x3a522c of _0x270144){try{await _0x5a0ed1[_0x2f97d1(0x2e1)](_0x3a522c,_0x2f97d1(0x2ed)),_0x3b3153++;}catch(_0x1b98ed){_0x6878c5++,log(_0x2f97d1(0x244)+_0x3a522c+_0x2f97d1(0x2b9)+_0x1b98ed[_0x2f97d1(0x415)],_0x2f97d1(0x282));}}_0x6878c5>0x0?toastr[_0x2f97d1(0x282)](_0x2f97d1(0x2cf)+_0x6878c5+_0x2f97d1(0x271),'警报'):toastr['success'](_0x2f97d1(0x20c)+_0x3b3153+_0x2f97d1(0x39e),_0x2f97d1(0x201)),log('局部知识库批量删除完成。成功:\x20'+_0x3b3153+',\x20失败:\x20'+_0x6878c5,_0x2f97d1(0x390)),await updatePanelStatus();}async function renderKnowledgeBases(){const _0x45c1a5=_0x28d2da,_0xcdf090=document[_0x45c1a5(0x214)](_0x45c1a5(0x34c)),_0x427456=document[_0x45c1a5(0x214)](_0x45c1a5(0x31c)),_0x156ed5=document['getElementById'](_0x45c1a5(0x2c2));if(!_0xcdf090||!_0x427456||!_0x156ed5)return;_0x156ed5[_0x45c1a5(0x3e1)]=_0x4966d0[_0x45c1a5(0x1fd)]()||_0x45c1a5(0x24c);try{const _0x43e82e=_0x5a0ed1[_0x45c1a5(0x247)](),_0x1eab4d=_0x5a0ed1[_0x45c1a5(0x281)]();await _renderKbList(_0x43e82e,_0xcdf090,_0x45c1a5(0x2ed),'hly-kb-list-local-placeholder'),await _renderKbList(_0x1eab4d,_0x427456,_0x45c1a5(0x328),'hly-kb-list-global-placeholder');}catch(_0x3aaa5e){console[_0x45c1a5(0x282)](_0x45c1a5(0x2c7),_0x3aaa5e),_0xcdf090[_0x45c1a5(0x30a)]=_0x45c1a5(0x288)+_0x3aaa5e[_0x45c1a5(0x415)]+_0x45c1a5(0x3df),_0x427456[_0x45c1a5(0x30a)]=_0x45c1a5(0x288)+_0x3aaa5e['message']+_0x45c1a5(0x3df);}}async function _renderKbList(_0x1fe686,_0xd46886,_0x2719f1,_0x1547d9){const _0x88d619=_0x28d2da,_0x34ba84=document[_0x88d619(0x214)](_0x1547d9);_0xd46886[_0x88d619(0x30a)]='',_0xd46886[_0x88d619(0x366)](_0x34ba84);if(Object[_0x88d619(0x3c9)](_0x1fe686)[_0x88d619(0x341)]===0x0){_0x34ba84[_0x88d619(0x22b)][_0x88d619(0x3a8)]=_0x88d619(0x307);return;}_0x34ba84[_0x88d619(0x22b)][_0x88d619(0x3a8)]=_0x88d619(0x312);for(const [_0x1219d4,_0x348d35]of Object[_0x88d619(0x34b)](_0x1fe686)){const _0x1aff8c=document['createElement'](_0x88d619(0x272));_0x1aff8c['className']=_0x88d619(0x36b),_0x1aff8c[_0x88d619(0x369)]['kbId']=_0x1219d4,_0x1aff8c['dataset']['kbScope']=_0x2719f1;const _0x25956c=await _0x5a0ed1['getVectorCount'](_0x1219d4,_0x2719f1),_0x5f5d0e=_0x2719f1===_0x88d619(0x2ed)?_0x88d619(0x351):_0x88d619(0x3cb);_0x1aff8c[_0x88d619(0x30a)]=_0x88d619(0x33c)+_0x1219d4+'\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+_0x348d35['name']+'\x20('+_0x25956c+_0x88d619(0x2be)+_0x5f5d0e+_0x88d619(0x28e)+(_0x348d35[_0x88d619(0x3ee)]?_0x88d619(0x3a9):'')+_0x88d619(0x36d),_0xd46886[_0x88d619(0x366)](_0x1aff8c);}}async function handleKbAction(_0x2949b5){const _0x15573c=_0x28d2da,_0x135783=_0x2949b5['target'],_0x37c968=_0x135783[_0x15573c(0x265)](_0x15573c(0x2bd));if(!_0x37c968)return;const _0x46a723=_0x37c968[_0x15573c(0x369)][_0x15573c(0x3b0)],_0x31e3da=_0x37c968[_0x15573c(0x369)]['kbScope'],_0x768d10=_0x37c968['querySelector'](_0x15573c(0x2d1))[_0x15573c(0x3e1)]['split']('\x20(')[0x0];if(_0x135783[_0x15573c(0x265)](_0x15573c(0x23f))){const _0x5bdf91=_0x37c968[_0x15573c(0x30c)](_0x15573c(0x2d1))[_0x15573c(0x3e1)]['split']('\x20(')[0x0],_0x4b788f=prompt(_0x15573c(0x20b),_0x5bdf91);if(_0x4b788f&&_0x4b788f[_0x15573c(0x35c)]()&&_0x4b788f[_0x15573c(0x35c)]()!==_0x5bdf91)try{await _0x5a0ed1[_0x15573c(0x2f2)](_0x46a723,_0x4b788f,_0x31e3da),await updatePanelStatus();}catch(_0x4e04c2){log('重命名知识库\x20'+_0x5bdf91+_0x15573c(0x2b9)+_0x4e04c2[_0x15573c(0x415)],'error'),toastr['error']('重命名失败:\x20'+_0x4e04c2[_0x15573c(0x415)]);}return;}if(_0x135783[_0x15573c(0x2c4)][_0x15573c(0x310)](_0x15573c(0x356))){if(confirm(_0x15573c(0x31d)+_0x768d10+'】吗?此操作无法恢复!'))try{await _0x5a0ed1[_0x15573c(0x2e1)](_0x46a723,_0x31e3da),log('知识库\x20'+_0x768d10+_0x15573c(0x2a8)+_0x46a723+_0x15573c(0x21d),'success'),toastr[_0x15573c(0x224)](_0x15573c(0x3ad)+_0x768d10+_0x15573c(0x242)),await updatePanelStatus();}catch(_0x35f935){log(_0x15573c(0x2e7)+_0x768d10+_0x15573c(0x2b9)+_0x35f935[_0x15573c(0x415)],'error'),toastr[_0x15573c(0x282)](_0x15573c(0x249)+_0x35f935[_0x15573c(0x415)]);}}if(_0x135783[_0x15573c(0x265)](_0x15573c(0x388))){const _0x5f358e=_0x31e3da===_0x15573c(0x2ed)?'全局':'局部';if(confirm(_0x15573c(0x3e7)+_0x768d10+'】移动到【'+_0x5f358e+'】吗?'))try{await _0x5a0ed1[_0x15573c(0x315)](_0x46a723,_0x31e3da),await updatePanelStatus();}catch(_0x3be913){log(_0x15573c(0x313)+_0x768d10+_0x15573c(0x2b9)+_0x3be913['message'],_0x15573c(0x282)),toastr[_0x15573c(0x282)](_0x15573c(0x209)+_0x3be913[_0x15573c(0x415)]);}}if(_0x135783[_0x15573c(0x2c4)][_0x15573c(0x310)](_0x15573c(0x404))&&_0x2949b5[_0x15573c(0x31e)]==='change')try{await _0x5a0ed1[_0x15573c(0x2f0)](_0x46a723,_0x31e3da),log(_0x15573c(0x368)+_0x768d10+_0x15573c(0x39b),_0x15573c(0x224));}catch(_0x4ea435){log(_0x15573c(0x411)+_0x768d10+'\x20状态失败:\x20'+_0x4ea435[_0x15573c(0x415)],'error'),toastr[_0x15573c(0x282)]('切换状态失败:\x20'+_0x4ea435[_0x15573c(0x415)]),_0x135783['checked']=!_0x135783['checked'];}_0x135783[_0x15573c(0x2c4)]['contains']('hly-kb-item-checkbox')&&_0x2949b5[_0x15573c(0x31e)]===_0x15573c(0x1fc)&&updateBulkActionUI(_0x31e3da);}function handleSelectAll(_0x3d619a,_0xdc1be9){const _0x2e695f=_0x28d2da,_0x44b69a=_0x3d619a['target']['checked'],_0x57b2a8=document[_0x2e695f(0x214)](_0x2e695f(0x40b)+_0xdc1be9),_0x1a620a=_0x57b2a8[_0x2e695f(0x285)](_0x2e695f(0x362));_0x1a620a[_0x2e695f(0x3dd)](_0x2cbad1=>_0x2cbad1[_0x2e695f(0x3a9)]=_0x44b69a),updateBulkActionUI(_0xdc1be9);}function updateBulkActionUI(_0x24846e){const _0x51595c=_0x28d2da,_0x3812cc=document[_0x51595c(0x214)](_0x51595c(0x40b)+_0x24846e),_0x2ab30f=document[_0x51595c(0x214)](_0x51595c(0x389)+_0x24846e),_0x23a3df=document['getElementById'](_0x51595c(0x317)+_0x24846e),_0x1dc6f2=_0x3812cc['querySelectorAll'](_0x51595c(0x362)),_0x22870f=_0x3812cc[_0x51595c(0x285)](_0x51595c(0x405)),_0x4e8740=_0x22870f[_0x51595c(0x341)],_0x4bc76d=_0x1dc6f2[_0x51595c(0x341)];_0x4e8740>0x0?_0x2ab30f[_0x51595c(0x22b)][_0x51595c(0x3a8)]=_0x51595c(0x2f1):_0x2ab30f[_0x51595c(0x22b)][_0x51595c(0x3a8)]=_0x51595c(0x312);if(_0x4bc76d===0x0)_0x23a3df['checked']=![],_0x23a3df[_0x51595c(0x3be)]=![];else{if(_0x4e8740===_0x4bc76d)_0x23a3df[_0x51595c(0x3a9)]=!![],_0x23a3df[_0x51595c(0x3be)]=![];else _0x4e8740>0x0?(_0x23a3df[_0x51595c(0x3a9)]=![],_0x23a3df[_0x51595c(0x3be)]=!![]):(_0x23a3df[_0x51595c(0x3a9)]=![],_0x23a3df[_0x51595c(0x3be)]=![]);}}async function handleBulkAction(_0x1870d1,_0xa62ec3){const _0x4eab20=_0x28d2da,_0x2e9826=_0x1870d1[_0x4eab20(0x335)]['dataset']['action'];if(!_0x2e9826)return;const _0x19b794=document[_0x4eab20(0x214)](_0x4eab20(0x40b)+_0xa62ec3),_0x443bd2=_0x19b794[_0x4eab20(0x285)]('.hly-kb-item-checkbox:checked'),_0x413b68=Array[_0x4eab20(0x3fb)](_0x443bd2)[_0x4eab20(0x204)](_0x3002be=>_0x3002be[_0x4eab20(0x369)][_0x4eab20(0x3b0)]);if(_0x413b68[_0x4eab20(0x341)]===0x0){toastr[_0x4eab20(0x40a)](_0x4eab20(0x38f),'圣谕');return;}let _0x1fd9ac='',_0xc813,_0x2d9e1c='';switch(_0x2e9826){case _0x4eab20(0x2dd):_0x1fd9ac='您确定要永久删除选中的\x20'+_0x413b68[_0x4eab20(0x341)]+_0x4eab20(0x3bf),_0xc813=_0x3cdb61=>_0x5a0ed1[_0x4eab20(0x2e1)](_0x3cdb61,_0xa62ec3),_0x2d9e1c='成功删除了\x20'+_0x413b68[_0x4eab20(0x341)]+_0x4eab20(0x2e5);break;case _0x4eab20(0x25f):const _0x40895d=_0xa62ec3===_0x4eab20(0x2ed)?'全局':'局部';_0x1fd9ac=_0x4eab20(0x239)+_0x413b68['length']+_0x4eab20(0x3e0)+_0x40895d+_0x4eab20(0x336),_0xc813=_0x4544ff=>_0x5a0ed1[_0x4eab20(0x315)](_0x4544ff,_0xa62ec3),_0x2d9e1c=_0x4eab20(0x416)+_0x413b68[_0x4eab20(0x341)]+_0x4eab20(0x2e5);break;case _0x4eab20(0x29b):_0x1fd9ac=_0x4eab20(0x2b8)+_0x413b68[_0x4eab20(0x341)]+_0x4eab20(0x3ca),_0xc813=_0x9d6dee=>_0x5a0ed1[_0x4eab20(0x2f0)](_0x9d6dee,_0xa62ec3),_0x2d9e1c=_0x4eab20(0x2e6)+_0x413b68[_0x4eab20(0x341)]+_0x4eab20(0x3f3);break;default:return;}if(!confirm(_0x1fd9ac))return;toastr[_0x4eab20(0x390)](_0x4eab20(0x3c0)+_0x413b68[_0x4eab20(0x341)]+_0x4eab20(0x324),'圣旨'),log(_0x4eab20(0x3c4)+_0x413b68[_0x4eab20(0x341)]+_0x4eab20(0x33b)+_0xa62ec3+_0x4eab20(0x213)+_0x2e9826+'\x20操作...',_0x4eab20(0x390));try{const _0x3c4879=_0x413b68[_0x4eab20(0x204)](_0x56534b=>_0xc813(_0x56534b));await Promise[_0x4eab20(0x39d)](_0x3c4879),toastr[_0x4eab20(0x224)](_0x2d9e1c,_0x4eab20(0x201)),log('批量\x20'+_0x2e9826+_0x4eab20(0x3d3),'success');}catch(_0x4fce3c){toastr['error'](_0x4eab20(0x3f0)+_0x4fce3c[_0x4eab20(0x415)],'警报'),log(_0x4eab20(0x20d)+_0x2e9826+'\x20操作失败:\x20'+_0x4fce3c[_0x4eab20(0x415)],_0x4eab20(0x282));}finally{await updatePanelStatus();}}async function testApi(){const _0x2cf2bf=_0x28d2da;toastr['info'](_0x2cf2bf(0x220),'圣旨');try{await _0x5a0ed1[_0x2cf2bf(0x2f9)](),toastr[_0x2cf2bf(0x224)]('神力连接通畅!','圣意');}catch(_0x197973){toastr[_0x2cf2bf(0x282)](_0x2cf2bf(0x340)+_0x197973[_0x2cf2bf(0x415)],'警报');}}async function fetchHLYEmbeddingModels(){const _0x59a464=_0x28d2da,_0x57d860=document[_0x59a464(0x214)](_0x59a464(0x261)),_0x424e74=_0x57d860[_0x59a464(0x25e)];_0x57d860[_0x59a464(0x30a)]=_0x59a464(0x23c),_0x57d860[_0x59a464(0x298)]=!![];try{log('开始获取模型列表...','info');const _0xcbff8c=await _0x5a0ed1[_0x59a464(0x339)]();_0x57d860[_0x59a464(0x30a)]='';if(_0xcbff8c['length']===0x0){_0x57d860[_0x59a464(0x30a)]='',toastr[_0x59a464(0x23d)](_0x59a464(0x34d),_0x59a464(0x294)),log(_0x59a464(0x34d),_0x59a464(0x23d));return;}_0xcbff8c[_0x59a464(0x3dd)](_0x5366f2=>{const _0x3e6a0c=new Option(_0x5366f2,_0x5366f2);_0x57d860['add'](_0x3e6a0c);}),_0xcbff8c[_0x59a464(0x252)](_0x424e74)?_0x57d860[_0x59a464(0x25e)]=_0x424e74:_0x57d860[_0x59a464(0x346)]=0x0,toastr['success'](_0x59a464(0x3ff)+_0xcbff8c[_0x59a464(0x341)]+_0x59a464(0x284),'圣意'),log(_0x59a464(0x3ff)+_0xcbff8c[_0x59a464(0x341)]+'\x20个模型。',_0x59a464(0x224));}catch(_0x31afbb){console[_0x59a464(0x282)](_0x59a464(0x40d),_0x31afbb),toastr[_0x59a464(0x282)](_0x59a464(0x24a)+_0x31afbb[_0x59a464(0x415)],_0x59a464(0x1f8)),log('获取模型失败:\x20'+_0x31afbb[_0x59a464(0x415)],_0x59a464(0x282)),_0x57d860[_0x59a464(0x30a)]=_0x59a464(0x367);}finally{_0x57d860['disabled']=![];}}async function fetchHLYRerankModels(){const _0x4bc037=_0x28d2da,_0x5a77d2=document[_0x4bc037(0x214)]('hly-rerank-model'),_0x5c4c7f=_0x5a77d2['value'];_0x5a77d2[_0x4bc037(0x30a)]=_0x4bc037(0x23c),_0x5a77d2['disabled']=!![];try{log('开始获取Rerank模型列表...',_0x4bc037(0x390));const _0x7f41c9=await _0x5a0ed1['fetchRerankModels']();_0x5a77d2[_0x4bc037(0x30a)]='';if(_0x7f41c9[_0x4bc037(0x341)]===0x0){_0x5a77d2[_0x4bc037(0x30a)]=_0x4bc037(0x3da),toastr[_0x4bc037(0x23d)](_0x4bc037(0x35e),_0x4bc037(0x294)),log(_0x4bc037(0x35e),'warn');return;}_0x7f41c9[_0x4bc037(0x3dd)](_0x3ab806=>{const _0x32eaaf=new Option(_0x3ab806,_0x3ab806);_0x5a77d2['add'](_0x32eaaf);}),_0x7f41c9[_0x4bc037(0x252)](_0x5c4c7f)?_0x5a77d2['value']=_0x5c4c7f:_0x5a77d2[_0x4bc037(0x346)]=0x0,toastr[_0x4bc037(0x224)]('成功获取\x20'+_0x7f41c9[_0x4bc037(0x341)]+_0x4bc037(0x3bd),'圣意'),log('成功获取\x20'+_0x7f41c9[_0x4bc037(0x341)]+'\x20个Rerank模型。',_0x4bc037(0x224));}catch(_0x5853a1){console[_0x4bc037(0x282)](_0x4bc037(0x398),_0x5853a1),toastr[_0x4bc037(0x282)](_0x4bc037(0x268)+_0x5853a1[_0x4bc037(0x415)],_0x4bc037(0x1f8)),log(_0x4bc037(0x268)+_0x5853a1[_0x4bc037(0x415)],_0x4bc037(0x282)),_0x5a77d2[_0x4bc037(0x30a)]=_0x4bc037(0x367);}finally{_0x5a77d2['disabled']=![];}}async function purgeStorage(){const _0x146c44=_0x28d2da;if(confirm('此操作将彻底清空当前角色的所有忆识(向量),且无法恢复。您确定要继续吗?')){toastr['info'](_0x146c44(0x2b6),'圣旨');const _0x36cd20=await _0x5a0ed1['purgeStorage']();_0x36cd20?toastr[_0x146c44(0x224)](_0x146c44(0x2f8),'圣意'):toastr[_0x146c44(0x282)](_0x146c44(0x3b7),'警报'),await updatePanelStatus();}}async function startCondensation(){const _0x3032a9=_0x28d2da,_0x406056=document[_0x3032a9(0x214)](_0x3032a9(0x2ce)),_0xea97d0=_0x406056['dataset']['finalMessages'],_0x1c7782=document[_0x3032a9(0x214)](_0x3032a9(0x2ad))[_0x3032a9(0x25e)],_0xf1843=document[_0x3032a9(0x214)]('hly-layer-end')['value'],_0x456d14={'start':parseInt(_0x1c7782),'end':parseInt(_0xf1843)};try{let _0x4c6b36;_0xea97d0?(log('检测到预览后待处理的消息对象,开始精确凝识...',_0x3032a9(0x390)),toastr['info'](_0x3032a9(0x38a),'圣旨'),_0x4c6b36=JSON['parse'](_0xea97d0),delete _0x406056['dataset'][_0x3032a9(0x372)]):(log('未检测到预览文本,按标准流程采集消息...',_0x3032a9(0x390)),toastr[_0x3032a9(0x390)](_0x3032a9(0x2ab),'圣旨'),_0x4c6b36=_0x5a0ed1[_0x3032a9(0x205)]());if(!_0x4c6b36||_0x4c6b36[_0x3032a9(0x341)]===0x0){toastr[_0x3032a9(0x40a)]('未找到符合条件的消息可供凝识。',_0x3032a9(0x294)),_0x406056[_0x3032a9(0x3e1)]=_0x3032a9(0x330);return;}_0x406056['textContent']=_0x3032a9(0x308)+_0x4c6b36[_0x3032a9(0x341)]+_0x3032a9(0x30f),toastr['info']('已采集\x20'+_0x4c6b36[_0x3032a9(0x341)]+_0x3032a9(0x30f),_0x3032a9(0x294));const _0x3ca729=await _0x5a0ed1[_0x3032a9(0x333)](_0x4c6b36,log,_0x456d14);if(_0x3ca729[_0x3032a9(0x224)]){toastr['success'](_0x3032a9(0x218)+_0x3ca729['count']+_0x3032a9(0x3f5),_0x3032a9(0x201));const _0xa6e99b=_0x456d14[_0x3032a9(0x2ee)]===0x0?getContext()[_0x3032a9(0x37e)][_0x3032a9(0x341)]:_0x456d14[_0x3032a9(0x2ee)];_0x406056[_0x3032a9(0x3e1)]=_0x3032a9(0x2af)+_0x456d14[_0x3032a9(0x412)]+_0x3032a9(0x258)+_0xa6e99b+_0x3032a9(0x253)+_0x3ca729[_0x3032a9(0x343)]+'\x20条忆识。';}else throw new Error(_0x3ca729[_0x3032a9(0x282)]||'未知错误');}catch(_0x1b6417){console[_0x3032a9(0x282)](_0x3032a9(0x2d5),_0x1b6417),toastr[_0x3032a9(0x282)]('凝识失败:\x20'+_0x1b6417['message'],_0x3032a9(0x1f8)),_0x406056[_0x3032a9(0x3e1)]='凝识失败:\x20'+_0x1b6417['message'];}finally{await updatePanelStatus();}}async function loadWorldbookList(){const _0x1d9af3=_0x28d2da,_0xc40cdb=document['getElementById'](_0x1d9af3(0x3c2)),_0x43c325=document[_0x1d9af3(0x214)]('hly-worldbook-search');if(!_0xc40cdb)return;try{log(_0x1d9af3(0x361),_0x1d9af3(0x390));const _0x511552=await _0x798f38[_0x1d9af3(0x208)]();window[_0x1d9af3(0x24d)]=_0x511552,updateWorldbookOptions(_0xc40cdb,'',_0x511552);if(_0x43c325){const _0x341d5f=debounce(_0x2c9f20=>{updateWorldbookOptions(_0xc40cdb,_0x2c9f20,_0x511552);},0x12c);_0x43c325[_0x1d9af3(0x29a)](_0x1d9af3(0x235),_0x30337c=>{const _0x362325=_0x1d9af3;_0x341d5f(_0x30337c[_0x362325(0x335)]['value']);});}log(_0x1d9af3(0x2f5)+_0x511552[_0x1d9af3(0x341)]+_0x1d9af3(0x225),_0x1d9af3(0x224));}catch(_0x4e7bfd){console[_0x1d9af3(0x282)](_0x1d9af3(0x3a0),_0x4e7bfd),log(_0x1d9af3(0x26b)+_0x4e7bfd[_0x1d9af3(0x415)],_0x1d9af3(0x282)),_0xc40cdb&&(_0xc40cdb[_0x1d9af3(0x30a)]=_0x1d9af3(0x348));}}function updateWorldbookOptions(_0x1ab03d,_0x48a496,_0x380b5c){const _0x29806c=_0x28d2da,_0x12bbd9=filterWorldbooks(_0x48a496,_0x380b5c),_0x468e7c=_0x1ab03d[_0x29806c(0x25e)];_0x1ab03d[_0x29806c(0x30a)]='请选择一个书库...';if(_0x12bbd9[_0x29806c(0x341)]===0x0){_0x1ab03d[_0x29806c(0x30a)]=_0x48a496[_0x29806c(0x35c)]()?_0x29806c(0x3e9):_0x29806c(0x32e);return;}_0x12bbd9[_0x29806c(0x3dd)](_0x58323d=>{const _0x1904ec=_0x29806c,_0x2e8091=document[_0x1904ec(0x217)](_0x1904ec(0x20e));_0x2e8091[_0x1904ec(0x25e)]=_0x58323d,_0x2e8091[_0x1904ec(0x3e1)]=_0x58323d,_0x1ab03d[_0x1904ec(0x366)](_0x2e8091);}),_0x468e7c&&_0x12bbd9[_0x29806c(0x252)](_0x468e7c)&&(_0x1ab03d[_0x29806c(0x25e)]=_0x468e7c);}async function handleWorldbookSelectionChange(){const _0x317bdd=_0x28d2da,_0x55b3eb=document[_0x317bdd(0x214)](_0x317bdd(0x3c2)),_0x10e159=document['getElementById'](_0x317bdd(0x286)),_0x314b32=document[_0x317bdd(0x214)](_0x317bdd(0x375)),_0x3e8e0d=document[_0x317bdd(0x214)](_0x317bdd(0x241)),_0x18b27d=_0x55b3eb[_0x317bdd(0x25e)];_0x10e159[_0x317bdd(0x298)]=!![],_0x10e159['querySelector'](_0x317bdd(0x2cd))[_0x317bdd(0x3e1)]=_0x317bdd(0x3c8),_0x314b32[_0x317bdd(0x30a)]='',_0x314b32[_0x317bdd(0x22b)][_0x317bdd(0x3a8)]=_0x317bdd(0x312);_0x3e8e0d&&(_0x3e8e0d[_0x317bdd(0x25e)]='');if(!_0x18b27d){_0x10e159[_0x317bdd(0x30c)]('span')[_0x317bdd(0x3e1)]=_0x317bdd(0x2d7);return;}try{log(_0x317bdd(0x2c9)+_0x18b27d+_0x317bdd(0x292),_0x317bdd(0x390));const _0x3673c0=await _0x798f38['getLoresForWorldbook'](_0x18b27d);if(_0x3673c0['length']===0x0){_0x10e159[_0x317bdd(0x30c)](_0x317bdd(0x2cd))['textContent']=_0x317bdd(0x3b5);return;}window[_0x317bdd(0x302)]=_0x3673c0,updateEntryOptions('',_0x3673c0);if(_0x3e8e0d){_0x3e8e0d[_0x317bdd(0x3a3)]('input',_0x3e8e0d[_0x317bdd(0x410)]);const _0x22638e=debounce(_0x5d2f73=>{updateEntryOptions(_0x5d2f73,_0x3673c0);},0x12c);_0x3e8e0d[_0x317bdd(0x410)]=_0x331f66=>{const _0x4855ec=_0x317bdd;_0x22638e(_0x331f66[_0x4855ec(0x335)]['value']);},_0x3e8e0d[_0x317bdd(0x29a)]('input',_0x3e8e0d[_0x317bdd(0x410)]);}log(_0x317bdd(0x2f5)+_0x3673c0[_0x317bdd(0x341)]+_0x317bdd(0x279),'success');}catch(_0x1d9eb0){console[_0x317bdd(0x282)](_0x317bdd(0x3fc)+_0x18b27d+_0x317bdd(0x309),_0x1d9eb0),log('加载条目失败:\x20'+_0x1d9eb0[_0x317bdd(0x415)],_0x317bdd(0x282)),_0x10e159[_0x317bdd(0x30c)](_0x317bdd(0x2cd))[_0x317bdd(0x3e1)]=_0x317bdd(0x3f4);}finally{_0x10e159[_0x317bdd(0x298)]=![];}}function updateEntryOptions(_0x32cadc,_0x408bcd){const _0x1c56bb=_0x28d2da,_0x4245ea=document['getElementById'](_0x1c56bb(0x375)),_0x1f8be3=document[_0x1c56bb(0x214)]('hly-hist-entry-multiselect-btn'),_0x268ecd=filterWorldbookEntries(_0x32cadc,_0x408bcd);_0x4245ea[_0x1c56bb(0x30a)]='';const _0x3c688c='\x0a\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全选/全不选\x0a\x20\x20\x20\x20\x20\x20\x20\x20';_0x4245ea[_0x1c56bb(0x231)](_0x1c56bb(0x1f5),_0x3c688c);if(_0x268ecd[_0x1c56bb(0x341)]===0x0){const _0x4f4fc3=_0x1c56bb(0x376);_0x4245ea[_0x1c56bb(0x231)](_0x1c56bb(0x1f5),_0x4f4fc3),_0x1f8be3['querySelector'](_0x1c56bb(0x2cd))[_0x1c56bb(0x3e1)]=_0x1c56bb(0x2e8);return;}_0x268ecd[_0x1c56bb(0x3dd)](_0x475e32=>{const _0x429275=_0x1c56bb,_0x4143e3=_0x32cadc?highlightSearchMatch(_0x475e32[_0x429275(0x3e8)],_0x32cadc):_0x475e32[_0x429275(0x3e8)],_0x442cc1=_0x429275(0x3eb)+_0x475e32[_0x429275(0x3e8)]+'\x20(Key:\x20'+_0x475e32[_0x429275(0x203)]+_0x429275(0x37b)+_0x475e32[_0x429275(0x203)]+'\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+_0x4143e3+_0x429275(0x233);_0x4245ea[_0x429275(0x231)](_0x429275(0x1f5),_0x442cc1);}),_0x1f8be3['querySelector']('span')[_0x1c56bb(0x3e1)]='已选择\x200\x20/\x20'+_0x268ecd['length']+_0x1c56bb(0x37c);}async function startHistoriography(){const _0x5ca924=_0x28d2da,_0x41eb45=document['getElementById'](_0x5ca924(0x3c2))[_0x5ca924(0x25e)],_0x225cfd=document[_0x5ca924(0x214)](_0x5ca924(0x375)),_0x52164b=document[_0x5ca924(0x214)](_0x5ca924(0x264)),_0x29394a=Array[_0x5ca924(0x3fb)](_0x225cfd['querySelectorAll']('.hly-hist-entry-checkbox:checked'))['map'](_0x38a306=>_0x38a306[_0x5ca924(0x25e)]);if(!_0x41eb45||_0x29394a['length']===0x0){toastr[_0x5ca924(0x40a)](_0x5ca924(0x378),_0x5ca924(0x3a6));return;}_0x52164b['textContent']=_0x5ca924(0x323)+_0x41eb45+_0x5ca924(0x3c1)+_0x29394a[_0x5ca924(0x341)]+_0x5ca924(0x40c),toastr[_0x5ca924(0x390)]('批量编纂任务已开始...','圣旨'),log(_0x5ca924(0x377)+_0x41eb45+_0x5ca924(0x3c1)+_0x29394a[_0x5ca924(0x341)]+_0x5ca924(0x3d4),_0x5ca924(0x390));try{const _0xe741a8=await _0x798f38[_0x5ca924(0x32f)](_0x41eb45,_0x29394a);_0x52164b[_0x5ca924(0x3e1)]=_0xe741a8[_0x5ca924(0x3b2)],_0xe741a8[_0x5ca924(0x224)]?toastr[_0x5ca924(0x224)](_0x5ca924(0x29c),'大功告成'):toastr['warning'](_0x5ca924(0x3a4),'圣谕'),log('对《'+_0x41eb45+_0x5ca924(0x250)+_0xe741a8['totalSuccess']+_0x5ca924(0x33e)+_0xe741a8[_0x5ca924(0x273)],_0x5ca924(0x224));}catch(_0x295926){console[_0x5ca924(0x282)](_0x5ca924(0x36a),_0x295926),toastr[_0x5ca924(0x282)](_0x5ca924(0x290)+_0x295926[_0x5ca924(0x415)],_0x5ca924(0x1f8)),_0x52164b['textContent']=_0x5ca924(0x290)+_0x295926['message'];}finally{await updatePanelStatus();}}async function showStats(){const _0x2eac30=_0x28d2da;try{log(_0x2eac30(0x3ce),'info'),toastr[_0x2eac30(0x390)](_0x2eac30(0x347),'圣旨');const _0x442c90=await _0x5a0ed1[_0x2eac30(0x32c)](),_0x4bf186=await _0x5a0ed1[_0x2eac30(0x2d3)](),_0x495c47=_0x5a0ed1[_0x2eac30(0x22a)](),_0x5e05b5='\x0a
\x0a翰林院宝库状态\x0a--------------------\x0a集合ID:\x20'+_0x4bf186+_0x2eac30(0x22f)+_0x442c90+_0x2eac30(0x25d)+_0x495c47[_0x2eac30(0x380)][_0x2eac30(0x25b)]+'\x0a所用模型:\x20'+_0x495c47['retrieval'][_0x2eac30(0x35b)]+_0x2eac30(0x39c);toastr['info'](_0x5e05b5,_0x2eac30(0x311),{'timeOut':0x3a98,'extendedTimeOut':0x1388,'tapToDismiss':!![],'closeButton':!![]}),log('查看宝库状态成功:集合ID='+_0x4bf186+_0x2eac30(0x381)+_0x442c90,_0x2eac30(0x224));}catch(_0x4be326){console['error'](_0x2eac30(0x2b3),_0x4be326),toastr[_0x2eac30(0x282)](_0x2eac30(0x27a)+_0x4be326[_0x2eac30(0x415)],_0x2eac30(0x1f8)),log('查询宝库状态失败:\x20'+_0x4be326['message'],_0x2eac30(0x282));}}function showRulesModal(_0x13e2f7){const _0x28fbc9=_0x28d2da,_0x3b2d01=_0x5a0ed1['getSettings'](),_0x4f2d11=_0x3b2d01[_0x13e2f7];if(!_0x4f2d11){console[_0x28fbc9(0x282)](_0x28fbc9(0x31b)+_0x13e2f7+_0x28fbc9(0x21f));return;}const _0x1a3ef3=_0x13e2f7===_0x28fbc9(0x2ec)?_0x28fbc9(0x3f7):_0x28fbc9(0x32a),_0x27f247=_0x4f2d11['exclusionRules']||[],_0x142892=(_0x3b8cd4={'start':'','end':''},_0x568e6c)=>_0x28fbc9(0x37f)+_0x568e6c+_0x28fbc9(0x29f)+(_0x3b8cd4[_0x28fbc9(0x412)]||'')['replace'](/"/g,'\x22')+_0x28fbc9(0x3b8)+(_0x3b8cd4[_0x28fbc9(0x2ee)]||'')[_0x28fbc9(0x2fb)](/"/g,'\x22')+_0x28fbc9(0x227),_0x40225e=_0x27f247[_0x28fbc9(0x204)](_0x142892)['join'](''),_0x5b4381=_0x13e2f7===_0x28fbc9(0x2bb)?_0x28fbc9(0x20f)+(_0x4f2d11[_0x28fbc9(0x3d2)]?_0x28fbc9(0x3a9):'')+_0x28fbc9(0x2b7)+(_0x4f2d11['tagExtractionEnabled']?_0x28fbc9(0x307):_0x28fbc9(0x312))+_0x28fbc9(0x2f7)+(_0x4f2d11[_0x28fbc9(0x3ac)]||'')+_0x28fbc9(0x38c):'',_0x9e2b71=_0x28fbc9(0x3fe)+_0x5b4381+_0x28fbc9(0x3e4)+(_0x40225e[_0x28fbc9(0x341)]>0x0?_0x40225e:_0x28fbc9(0x28c))+_0x28fbc9(0x2c8);showHtmlModal(_0x1a3ef3,_0x9e2b71,{'okText':_0x28fbc9(0x212),'onOk':_0x44256b=>{const _0x4d1ee0=_0x28fbc9,_0x108c96=[];_0x44256b[_0x4d1ee0(0x26a)](_0x4d1ee0(0x2ff))[_0x4d1ee0(0x2ea)](function(){const _0x3242f9=_0x4d1ee0,_0x365829=$(this)['find'](_0x3242f9(0x235))['eq'](0x0)[_0x3242f9(0x2f6)]()[_0x3242f9(0x35c)](),_0x4651ee=$(this)[_0x3242f9(0x26a)](_0x3242f9(0x235))['eq'](0x1)['val']()[_0x3242f9(0x35c)]();_0x365829&&_0x108c96['push']({'start':_0x365829,'end':_0x4651ee});});const _0x2066c9={..._0x4f2d11,'exclusionRules':_0x108c96};_0x13e2f7==='queryPreprocessing'&&(_0x2066c9[_0x4d1ee0(0x3d2)]=_0x44256b['find'](_0x4d1ee0(0x1f9))['is'](':checked'),_0x2066c9['tags']=_0x44256b[_0x4d1ee0(0x26a)](_0x4d1ee0(0x223))[_0x4d1ee0(0x2f6)]()),updateAndSaveSetting(_0x13e2f7,_0x2066c9),toastr[_0x4d1ee0(0x224)](_0x4d1ee0(0x2bc),_0x4d1ee0(0x303));},'onShow':_0x38a410=>{const _0x168f88=_0x28fbc9,_0x1e02ae=_0x38a410[_0x168f88(0x26a)](_0x168f88(0x2e4));_0x38a410[_0x168f88(0x26a)](_0x168f88(0x370))['on'](_0x168f88(0x39f),()=>{const _0x18ca7e=_0x168f88,_0x29d616=_0x1e02ae[_0x18ca7e(0x379)](_0x18ca7e(0x2ff))[_0x18ca7e(0x341)],_0x52521d=_0x142892(undefined,_0x29d616);_0x1e02ae[_0x18ca7e(0x26a)]('p')[_0x18ca7e(0x341)]>0x0?_0x1e02ae['html'](_0x52521d):_0x1e02ae[_0x18ca7e(0x40e)](_0x52521d);}),_0x1e02ae['on'](_0x168f88(0x39f),'.hly-delete-rule-btn',function(){const _0x5bdc6f=_0x168f88;$(this)[_0x5bdc6f(0x265)]('.hly-exclusion-rule-row')[_0x5bdc6f(0x21a)](),_0x1e02ae[_0x5bdc6f(0x379)]()[_0x5bdc6f(0x341)]===0x0&&_0x1e02ae[_0x5bdc6f(0x3ae)](_0x5bdc6f(0x28c));});if(_0x13e2f7===_0x168f88(0x2bb)){const _0x1931b4=_0x38a410[_0x168f88(0x26a)](_0x168f88(0x1f9)),_0x3f392b=_0x38a410[_0x168f88(0x26a)](_0x168f88(0x306));_0x1931b4['on'](_0x168f88(0x1fc),()=>{const _0x1bd41a=_0x168f88;_0x3f392b[_0x1bd41a(0x407)](_0x1bd41a(0x3a8),_0x1931b4['is'](':checked')?_0x1bd41a(0x307):_0x1bd41a(0x312));});}}});}function previewCondensation(){const _0x458e46=_0x28d2da,_0x4c9029=document[_0x458e46(0x214)](_0x458e46(0x2ce));try{const _0x2ef694=_0x5a0ed1[_0x458e46(0x22a)](),_0x40ec63=_0x2ef694['condensation'][_0x458e46(0x246)]||[],_0x23701a={'user':document['getElementById'](_0x458e46(0x383))[_0x458e46(0x3a9)],'ai':document[_0x458e46(0x214)](_0x458e46(0x221))['checked']},_0x37b140=document[_0x458e46(0x214)](_0x458e46(0x304))[_0x458e46(0x3a9)],_0x9c7f3e=_0x37b140?document['getElementById'](_0x458e46(0x34a))[_0x458e46(0x25e)][_0x458e46(0x3d5)](',')[_0x458e46(0x204)](_0x585f5d=>_0x585f5d[_0x458e46(0x35c)]())[_0x458e46(0x37a)](Boolean):[],_0x202b71=_0x5a0ed1[_0x458e46(0x205)](_0x23701a);if(!_0x202b71||_0x202b71[_0x458e46(0x341)]===0x0){_0x4c9029[_0x458e46(0x3e1)]=_0x458e46(0x3f8),toastr['warning'](_0x458e46(0x330),_0x458e46(0x294));return;}const _0x2c920a=getContext()[_0x458e46(0x37e)],_0x2e206f=_0x202b71['map']((_0x509ca6,_0x313c14)=>{const _0x4d55ed=_0x458e46;let _0xcb6b01;if(_0x509ca6[_0x4d55ed(0x2a7)])_0xcb6b01=_0x509ca6['mes'];else{if(_0x37b140&&_0x9c7f3e[_0x4d55ed(0x341)]>0x0){const _0x59fb00=extractBlocksByTags(_0x509ca6[_0x4d55ed(0x3f2)],_0x9c7f3e);_0x59fb00[_0x4d55ed(0x341)]>0x0?_0xcb6b01=_0x59fb00[_0x4d55ed(0x293)]('\x0a\x0a'):_0xcb6b01=_0x509ca6[_0x4d55ed(0x3f2)];}else _0xcb6b01=_0x509ca6['mes'];_0xcb6b01=applyExclusionRules(_0xcb6b01,_0x40ec63);}const _0xb852d=_0x2c920a[_0x4d55ed(0x401)](_0x12ac4f=>_0x12ac4f===_0x509ca6),_0x1fac31=_0xb852d!==-0x1?_0xb852d+0x1:-0x1;return{'id':_0x4d55ed(0x3d8)+_0x313c14,'name':_0x509ca6['name'],'content':_0xcb6b01[_0x4d55ed(0x35c)](),'floor':_0x1fac31,'is_user':_0x509ca6['is_user'],'send_date':_0x509ca6[_0x4d55ed(0x3d9)]};})[_0x458e46(0x37a)](_0x47c90a=>_0x47c90a[_0x458e46(0x3b2)]);if(_0x2e206f[_0x458e46(0x341)]===0x0){_0x4c9029[_0x458e46(0x3e1)]=_0x458e46(0x2cb),toastr[_0x458e46(0x40a)](_0x458e46(0x2cb),'翰林院启奏');return;}const _0x39226c=_0x2e206f['map']((_0x6f4bad,_0x3add8f)=>_0x458e46(0x35f)+_0x6f4bad['id']+_0x458e46(0x393)+_0x6f4bad[_0x458e46(0x28b)]+_0x458e46(0x237)+_0x6f4bad['name']+']\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\x20\x20\x20\x20\x20\x20'+_0x6f4bad[_0x458e46(0x3b2)]+_0x458e46(0x26f)+_0x6f4bad['id']+'\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')['join']('');showHtmlModal(_0x458e46(0x238),''+_0x39226c+_0x458e46(0x2da),{'okText':'确认并更新预览','onOk':_0x2c3069=>{const _0x841267=_0x458e46,_0x528e12=[];_0x2c3069[_0x841267(0x26a)](_0x841267(0x329))[_0x841267(0x2ea)](function(){const _0x34b133=_0x841267,_0x15cfb7=$(this)[_0x34b133(0x26a)]('.hly-preview-textarea'),_0x5df252=_0x15cfb7[_0x34b133(0x2f6)]();_0x5df252[_0x34b133(0x35c)]()&&_0x528e12[_0x34b133(0x3b1)]({'mes':_0x5df252,'is_user':_0x15cfb7[_0x34b133(0x33f)](_0x34b133(0x21b)),'send_date':_0x15cfb7[_0x34b133(0x33f)](_0x34b133(0x23e)),'floor':_0x15cfb7[_0x34b133(0x33f)](_0x34b133(0x28b))});}),_0x4c9029[_0x841267(0x369)]['finalMessages']=JSON[_0x841267(0x338)](_0x528e12);const _0x556b93=document[_0x841267(0x214)]('hly-layer-start')[_0x841267(0x25e)],_0x58fd2b=document['getElementById'](_0x841267(0x1fb))[_0x841267(0x25e)];_0x4c9029['textContent']=_0x841267(0x27e)+_0x556b93+'\x20楼到\x20'+_0x58fd2b+_0x841267(0x2cc)+_0x528e12[_0x841267(0x341)]+_0x841267(0x314),toastr[_0x841267(0x224)](_0x841267(0x22c),_0x841267(0x303));}}),$(_0x458e46(0x2df))['on'](_0x458e46(0x39f),function(_0x49f34d){const _0x38da5c=_0x458e46;_0x49f34d[_0x38da5c(0x358)]();const _0x251f37=$(this)[_0x38da5c(0x33f)]('target');$('#'+_0x251f37)[_0x38da5c(0x21a)]();});}catch(_0x2b02a5){console[_0x458e46(0x282)]('[翰林院-枢纽]\x20预览过程发生错误:',_0x2b02a5),_0x4c9029['textContent']=_0x458e46(0x414)+_0x2b02a5[_0x458e46(0x415)],toastr[_0x458e46(0x282)](_0x458e46(0x414)+_0x2b02a5[_0x458e46(0x415)],_0x458e46(0x1f8));}}function log(_0x166e51,_0xc66294='info'){const _0x49d55b=_0x28d2da,_0x542375=document[_0x49d55b(0x214)](_0x49d55b(0x2a6));if(!_0x542375)return;const _0x4e3ca6=document[_0x49d55b(0x217)]('p'),_0x5748dd=new Date()[_0x49d55b(0x202)]();let _0x1427fd='fa-circle-info',_0x5bd2c1='log-info';switch(_0xc66294){case _0x49d55b(0x224):_0x1427fd=_0x49d55b(0x26e),_0x5bd2c1='log-success';break;case _0x49d55b(0x282):_0x1427fd=_0x49d55b(0x245),_0x5bd2c1=_0x49d55b(0x297);break;case _0x49d55b(0x23d):_0x1427fd='fa-exclamation-triangle',_0x5bd2c1=_0x49d55b(0x3ed);break;}_0x4e3ca6[_0x49d55b(0x2b4)]='hly-log-entry\x20'+_0x5bd2c1,_0x4e3ca6[_0x49d55b(0x30a)]=_0x49d55b(0x396)+_0x1427fd+_0x49d55b(0x345)+_0x5748dd+']\x20'+_0x166e51;const _0x20be44=_0x542375['querySelector'](_0x49d55b(0x2d6));_0x20be44&&_0x20be44[_0x49d55b(0x21a)](),_0x542375[_0x49d55b(0x366)](_0x4e3ca6),_0x542375[_0x49d55b(0x352)]=_0x542375[_0x49d55b(0x355)];}async function ingestManualText(){const _0x89a971=_0x28d2da,_0x10390b=document[_0x89a971(0x214)]('hly-manual-text'),_0x47a55b=_0x10390b['value'][_0x89a971(0x35c)]();if(!_0x47a55b){toastr['warning'](_0x89a971(0x38d),_0x89a971(0x294)),log(_0x89a971(0x359),'warn');return;}log('收到手动录入请求,文本长度:\x20'+_0x47a55b[_0x89a971(0x341)],'info'),toastr['info']('正在处理您提交的文书...','圣旨');try{const _0xdee09d=await _0x5a0ed1[_0x89a971(0x1f3)](_0x47a55b,'manual',{'sourceName':_0x89a971(0x2c1)});if(_0xdee09d['success'])toastr[_0x89a971(0x224)](_0x89a971(0x37d)+_0xdee09d[_0x89a971(0x343)]+_0x89a971(0x3f5),_0x89a971(0x201)),log(_0x89a971(0x39a)+_0xdee09d[_0x89a971(0x343)]+'\x20条忆识。',_0x89a971(0x224)),_0x10390b[_0x89a971(0x25e)]='';else throw new Error(_0xdee09d[_0x89a971(0x282)]||_0x89a971(0x24e));}catch(_0x3af794){console['error'](_0x89a971(0x29d),_0x3af794),toastr['error'](_0x89a971(0x326)+_0x3af794[_0x89a971(0x415)],'严重错误'),log(_0x89a971(0x2a5)+_0x3af794['message'],_0x89a971(0x282));}finally{await updatePanelStatus();}}
+const _0x15063a=_0x1493;(function(_0x34aeee,_0x57ca71){const _0xd13f55=_0x1493,_0x5679d6=_0x34aeee();while(!![]){try{const _0x1bcd02=-parseInt(_0xd13f55(0x179))/0x1*(parseInt(_0xd13f55(0x1e5))/0x2)+-parseInt(_0xd13f55(0x27c))/0x3+parseInt(_0xd13f55(0x320))/0x4*(parseInt(_0xd13f55(0x23b))/0x5)+parseInt(_0xd13f55(0x28d))/0x6+parseInt(_0xd13f55(0x2a0))/0x7*(parseInt(_0xd13f55(0x325))/0x8)+parseInt(_0xd13f55(0x307))/0x9+-parseInt(_0xd13f55(0x276))/0xa;if(_0x1bcd02===_0x57ca71)break;else _0x5679d6['push'](_0x5679d6['shift']());}catch(_0x4b1d3d){_0x5679d6['push'](_0x5679d6['shift']());}}}(_0x4662,0x4d9d8));import{getContext}from'/scripts/extensions.js';import*as _0x4b5037 from'../core/rag-processor.js';import*as _0x337832 from'../core/historiographer.js';import*as _0x535b3f from'../core/utils/context-utils.js';import*as _0x405f63 from'../core/ingestion-manager.js';import{showContentModal,showHtmlModal}from'./page-window.js';import{extractBlocksByTags,applyExclusionRules}from'../core/utils/rag-tag-extractor.js';import{filterWorldbooks,filterWorldbookEntries,highlightSearchMatch,debounce}from'../core/rag-processor.js';_0x15063a(0x235);function setupGlobalEventHandlers(){const _0x6c22d1=_0x15063a;window[_0x6c22d1(0x196)]=()=>saveSettingsFromUI(![]),window[_0x6c22d1(0x1dd)]=resetSettingsToUI,window[_0x6c22d1(0x25d)]=testApi,window['fetchHLYEmbeddingModels']=fetchHLYEmbeddingModels,window['fetchHLYRerankModels']=fetchHLYRerankModels,window['updateHLYMemoryCount']=updatePanelStatus,window[_0x6c22d1(0x1ea)]=purgeStorage,window[_0x6c22d1(0x20c)]=startCondensation,window[_0x6c22d1(0x2f8)]=previewCondensation,window[_0x6c22d1(0x30e)]=ingestManualText,window[_0x6c22d1(0x18e)]=log,window[_0x6c22d1(0x223)]=showStats,window['startHLYHistoriography']=startHistoriography;}function updateAndSaveSetting(_0x1b4d0d,_0x6b43af){const _0x32e269=_0x15063a,_0x57337f=_0x4b5037['getSettings']();if(!_0x57337f)return;const _0x169b53=_0x1b4d0d['split']('.');let _0x1fc950=_0x57337f;for(let _0x323e66=0x0;_0x323e66<_0x169b53[_0x32e269(0x30f)]-0x1;_0x323e66++){_0x1fc950=_0x1fc950[_0x169b53[_0x323e66]]=_0x1fc950[_0x169b53[_0x323e66]]||{};}_0x1fc950[_0x169b53[_0x169b53[_0x32e269(0x30f)]-0x1]]=_0x6b43af,_0x4b5037[_0x32e269(0x347)](),log('[自动保存]\x20设置项\x20\x27'+_0x1b4d0d+_0x32e269(0x168)+JSON[_0x32e269(0x187)](_0x6b43af),_0x32e269(0x336));}function bindAutoSaveEvents(){const _0x2dceed=_0x15063a,_0x41bfbe=document[_0x2dceed(0x220)](_0x2dceed(0x1cf));if(!_0x41bfbe)return;_0x41bfbe['addEventListener'](_0x2dceed(0x1c5),_0xd4f9f0=>{const _0x121712=_0x2dceed,_0x4d06bd=_0xd4f9f0[_0x121712(0x2a7)],_0x5878ad=_0x4d06bd[_0x121712(0x193)][_0x121712(0x360)];if(!_0x5878ad)return;let _0x5374ad;const _0x33a129=_0x4d06bd[_0x121712(0x193)][_0x121712(0x2f3)]||'string';if(_0x4d06bd[_0x121712(0x2f3)]===_0x121712(0x353))_0x5374ad=_0x4d06bd[_0x121712(0x2d8)];else{if(_0x4d06bd[_0x121712(0x2f3)]===_0x121712(0x2b9)){if(_0x4d06bd['checked']){const _0x9e2027=_0x41bfbe[_0x121712(0x1f3)](_0x121712(0x2c9)+_0x4d06bd[_0x121712(0x265)]+'\x22]'),_0x5c3e78=Array[_0x121712(0x173)](_0x9e2027)[_0x121712(0x210)](_0x214dff=>_0x214dff[_0x121712(0x2d8)]);_0x5374ad=_0x5c3e78[_0x121712(0x314)];}else return;}else _0x5374ad=_0x4d06bd['value'];}switch(_0x33a129){case _0x121712(0x190):_0x5374ad=parseInt(_0x5374ad,0xa);break;case _0x121712(0x340):_0x5374ad=parseFloat(_0x5374ad);break;case _0x121712(0x1f4):typeof _0x5374ad!==_0x121712(0x1f4)&&(_0x5374ad=_0x5374ad===_0x121712(0x275));break;}if(_0x4d06bd[_0x121712(0x2f3)]===_0x121712(0x2b9)&&!_0x4d06bd['checked'])return;updateAndSaveSetting(_0x5878ad,_0x5374ad),_0x5878ad==='retrieval.independentChatMemoryEnabled'&&updatePanelStatus();});}export function bindHanlinyuanEvents(){const _0x513356=_0x15063a,_0x49ddcc=getContext();if(!_0x49ddcc){console[_0x513356(0x2f5)](_0x513356(0x2e9));return;}setupGlobalEventHandlers(),bindPanelToggleEvents(),bindInternalUIEvents(),bindTutorialEvents(),bindAutoSaveEvents(),bindSessionLockEvent(),initializeUnifiedInjectionEditor();if(_0x4b5037[_0x513356(0x2c0)])_0x4b5037['initialize']();else{console[_0x513356(0x2f5)]('[翰林院-枢纽]\x20核心法典未能提供初始化圣旨!');return;}loadSettingsToUI(),loadWorldbookList(),log(_0x513356(0x35a),'info');const _0x4dce75=document[_0x513356(0x220)](_0x513356(0x1b7)),_0x3111b5=document[_0x513356(0x220)](_0x513356(0x1cd)),_0x131295=document[_0x513356(0x220)](_0x513356(0x2e2)),_0x37f902=document[_0x513356(0x220)](_0x513356(0x2b6)),_0x204cbe=document[_0x513356(0x220)](_0x513356(0x234)),_0x17069e=document[_0x513356(0x220)]('hanlinyuan-ingest-progress-bar'),_0xcbbbbe=document['getElementById'](_0x513356(0x37b)),_0x20c66e=document[_0x513356(0x220)](_0x513356(0x212));let _0x30c9ae=null,_0x58fa0e=null;_0x4dce75['addEventListener'](_0x513356(0x1c5),_0x3ecb7f=>{const _0x190dab=_0x513356;_0x30c9ae=_0x3ecb7f['target'][_0x190dab(0x1bd)][0x0],_0x30c9ae?(_0x3111b5['textContent']=_0x30c9ae[_0x190dab(0x265)],_0x3111b5['title']=_0x30c9ae['name']):_0x3111b5[_0x190dab(0x17b)]=_0x190dab(0x2cf);}),_0x131295['addEventListener']('click',async()=>{const _0x540cec=_0x513356;if(!_0x30c9ae){toastr[_0x540cec(0x181)](_0x540cec(0x24d));return;}let _0x52461f=0x0;const _0x17d79a=_0x405f63['generateJobId'](_0x30c9ae),_0x42b33f=_0x405f63[_0x540cec(0x249)](_0x17d79a);if(_0x42b33f){const _0x2dfce5=(_0x42b33f['processedChunks']/_0x42b33f[_0x540cec(0x1d9)]*0x64)[_0x540cec(0x22e)](0x1),_0x559a2e=confirm(_0x540cec(0x31e)+_0x2dfce5+'%。是否从上次中断之处继续?');_0x559a2e?(_0x52461f=_0x42b33f[_0x540cec(0x24c)],toastr[_0x540cec(0x1d7)](_0x540cec(0x2ef)+(_0x52461f+0x1)+_0x540cec(0x35d),'圣旨已达'),log('[断点续传]\x20用户选择继续任务\x20'+_0x17d79a+_0x540cec(0x301)+_0x52461f+_0x540cec(0x2dc),_0x540cec(0x1d7))):(_0x405f63[_0x540cec(0x1a7)](_0x17d79a),toastr[_0x540cec(0x1d7)](_0x540cec(0x17f),_0x540cec(0x369)),log('[断点续传]\x20用户选择放弃旧任务\x20'+_0x17d79a+_0x540cec(0x18a),_0x540cec(0x195)));}_0x58fa0e=new AbortController();const _0x5ce50b=_0x58fa0e[_0x540cec(0x244)];_0x20c66e[_0x540cec(0x2f6)][_0x540cec(0x208)]='none',_0x204cbe[_0x540cec(0x2f6)][_0x540cec(0x208)]=_0x540cec(0x2b5),_0xcbbbbe[_0x540cec(0x17b)]=_0x540cec(0x32c),_0x17069e['value']=0x0;try{const _0x552cdb=await _0x30c9ae[_0x540cec(0x293)](),_0x989ca8=_0x6501=>{const _0x1b3530=_0x540cec;_0xcbbbbe[_0x1b3530(0x17b)]=_0x1b3530(0x32a)+_0x6501[_0x1b3530(0x2fd)]+'\x20('+_0x6501[_0x1b3530(0x248)]+'/'+_0x6501[_0x1b3530(0x1fc)]+')',_0x17069e[_0x1b3530(0x314)]=_0x6501[_0x1b3530(0x248)]/_0x6501['total']*0x64;},_0x54d4f0=()=>{const _0x149147=_0x540cec;updatePanelStatus(),log('[实时刷新]\x20批次完成,忆识总数已更新。',_0x149147(0x1d7));},_0x6d1b44=await _0x4b5037[_0x540cec(0x344)](_0x552cdb,_0x540cec(0x21e),{'sourceName':_0x30c9ae[_0x540cec(0x265)]},_0x989ca8,_0x5ce50b,log,_0x54d4f0,_0x17d79a,_0x52461f);if(_0x6d1b44[_0x540cec(0x336)])toastr['success'](_0x540cec(0x27f)+_0x6d1b44[_0x540cec(0x310)]+'\x20个知识块'),_0xcbbbbe[_0x540cec(0x17b)]=_0x540cec(0x183)+_0x6d1b44[_0x540cec(0x310)]+_0x540cec(0x171),_0x17069e[_0x540cec(0x314)]=0x64,updatePanelStatus();else throw new Error(_0x6d1b44[_0x540cec(0x2f5)]||_0x540cec(0x297));}catch(_0x60a7ad){_0x60a7ad['name']==='AbortError'?(toastr['info']('任务已由用户中止。进度已保存,可随时继续。'),_0xcbbbbe[_0x540cec(0x17b)]=_0x540cec(0x1fb)):(toastr['error']('录入失败:\x20'+_0x60a7ad[_0x540cec(0x2fd)]+_0x540cec(0x206)),_0xcbbbbe[_0x540cec(0x17b)]='错误:\x20'+_0x60a7ad[_0x540cec(0x2fd)]);}finally{setTimeout(()=>{const _0x132dc5=_0x540cec;_0x20c66e['style'][_0x132dc5(0x208)]=_0x132dc5(0x26f),_0x204cbe['style'][_0x132dc5(0x208)]=_0x132dc5(0x222),_0x4dce75[_0x132dc5(0x314)]='',_0x30c9ae=null,_0x3111b5[_0x132dc5(0x17b)]=_0x132dc5(0x2cf);},0xbb8);}}),_0x37f902['addEventListener'](_0x513356(0x1c6),()=>{const _0x1037da=_0x513356;_0x58fa0e&&_0x58fa0e[_0x1037da(0x20d)]();});}function bindSessionLockEvent(){const _0x38511b=_0x15063a,_0x1cb385=document[_0x38511b(0x220)]('hly-session-lock-btn');if(!_0x1cb385)return;_0x1cb385[_0x38511b(0x23f)]('click',async()=>{const _0x99a514=_0x38511b,_0x4f7f05=await _0x4b5037[_0x99a514(0x1d8)]();updateSessionLockUI(_0x4f7f05);if(_0x4f7f05){const _0x1f77b6=_0x4b5037['getLockedSessionInfo']();_0x1f77b6&&(toastr['success'](_0x99a514(0x292)+_0x1f77b6['id'],_0x99a514(0x26d)),log(_0x99a514(0x1b9)+_0x1f77b6['id'],'success'));}else toastr['info'](_0x99a514(0x1f1),'诏曰'),log('会话已解锁。',_0x99a514(0x1d7));updatePanelStatus();}),updateSessionLockUI(_0x4b5037[_0x38511b(0x2d7)]());}function updateSessionLockUI(_0x57406e){const _0x2e044a=_0x15063a,_0x2c65ee=document[_0x2e044a(0x220)](_0x2e044a(0x263));if(!_0x2c65ee)return;const _0x8248eb=_0x2c65ee[_0x2e044a(0x267)]('i'),_0x1715b5=_0x2c65ee[_0x2e044a(0x267)](_0x2e044a(0x191));_0x57406e?(_0x2c65ee[_0x2e044a(0x29e)][_0x2e044a(0x1ca)](_0x2e044a(0x229)),_0x8248eb[_0x2e044a(0x366)]='fas\x20fa-lock',_0x1715b5[_0x2e044a(0x17b)]=_0x2e044a(0x2be),_0x2c65ee['title']=_0x2e044a(0x2b8)):(_0x2c65ee[_0x2e044a(0x29e)][_0x2e044a(0x371)]('active'),_0x8248eb[_0x2e044a(0x366)]=_0x2e044a(0x277),_0x1715b5[_0x2e044a(0x17b)]=_0x2e044a(0x2cc),_0x2c65ee['title']=_0x2e044a(0x377));}function bindPanelToggleEvents(){const _0x498667=_0x15063a,_0x1cd151=document['getElementById'](_0x498667(0x1e4));if(_0x1cd151){}}function bindTutorialEvents(){const _0x4fb183=_0x15063a,_0x3bbf24=document[_0x4fb183(0x220)](_0x4fb183(0x271));_0x3bbf24&&_0x3bbf24['addEventListener']('click',()=>{const _0x398ab1=_0x4fb183;showContentModal(_0x398ab1(0x28e),'scripts/extensions/third-party/ST-Amily2-Chat-Optimisation/HanLin.md');});}function bindInternalUIEvents(){const _0x5e6894=_0x15063a,_0x14e4a3=document[_0x5e6894(0x1f3)](_0x5e6894(0x170));_0x14e4a3[_0x5e6894(0x19b)](_0x570d60=>{const _0x1da4d6=_0x5e6894;_0x570d60[_0x1da4d6(0x23f)](_0x1da4d6(0x1c6),()=>{const _0x18f995=_0x1da4d6,_0x1efcb3=_0x570d60[_0x18f995(0x193)][_0x18f995(0x16b)],_0xff5b4b=_0x18f995(0x355)+_0x1efcb3+'-tab';document['querySelectorAll'](_0x18f995(0x376))[_0x18f995(0x19b)](_0x55ac83=>{const _0x5da533=_0x18f995;_0x55ac83['classList']['toggle'](_0x5da533(0x229),_0x55ac83['id']===_0xff5b4b);}),_0x14e4a3[_0x18f995(0x19b)](_0xbb3f45=>_0xbb3f45['classList'][_0x18f995(0x207)](_0x18f995(0x229),_0xbb3f45===_0x570d60));});});const _0x5b2642=document[_0x5e6894(0x220)](_0x5e6894(0x339));_0x5b2642&&_0x5b2642[_0x5e6894(0x23f)](_0x5e6894(0x1c5),handleApiModeChange);const _0x3c631f=document[_0x5e6894(0x220)](_0x5e6894(0x2e5)),_0x29ed01=document['getElementById'](_0x5e6894(0x22f));_0x3c631f&&_0x29ed01&&_0x3c631f['addEventListener'](_0x5e6894(0x1c5),()=>{const _0x4da4ed=_0x5e6894;_0x29ed01[_0x4da4ed(0x2f6)][_0x4da4ed(0x208)]=_0x3c631f[_0x4da4ed(0x2d8)]?_0x4da4ed(0x2b5):_0x4da4ed(0x222);});const _0x21dcd3=document[_0x5e6894(0x220)]('hly-hist-select-library');_0x21dcd3&&_0x21dcd3['addEventListener'](_0x5e6894(0x1c5),handleWorldbookSelectionChange);const _0x5f357f=document[_0x5e6894(0x220)](_0x5e6894(0x266));_0x5f357f&&_0x5f357f[_0x5e6894(0x23f)]('click',()=>showRulesModal('condensation'));const _0x78e230=document[_0x5e6894(0x220)]('hly-query-preprocessing-rules-btn');_0x78e230&&_0x78e230[_0x5e6894(0x23f)](_0x5e6894(0x1c6),()=>showRulesModal(_0x5e6894(0x2d4)));const _0x520da4=document[_0x5e6894(0x220)]('hly-hist-entry-multiselect-btn'),_0x5032f3=document['getElementById']('hly-hist-entry-multiselect-options');_0x520da4&&_0x5032f3&&(_0x520da4['addEventListener'](_0x5e6894(0x1c6),_0xb24f2c=>{const _0xfbaafd=_0x5e6894;_0xb24f2c[_0xfbaafd(0x316)]();const _0x265df2=_0x5032f3[_0xfbaafd(0x2f6)][_0xfbaafd(0x208)]===_0xfbaafd(0x2b5);_0x5032f3[_0xfbaafd(0x2f6)][_0xfbaafd(0x208)]=_0x265df2?_0xfbaafd(0x222):'block';}),_0x5032f3[_0x5e6894(0x23f)](_0x5e6894(0x1c5),_0xaf842d=>{const _0x6a1fdd=_0x5e6894,_0x2c7851=_0xaf842d['target'];if(_0x2c7851['type']!==_0x6a1fdd(0x353))return;const _0x2541b3=_0x5032f3[_0x6a1fdd(0x1f3)]('.hly-hist-entry-checkbox'),_0x4accaf=document[_0x6a1fdd(0x220)](_0x6a1fdd(0x237));if(_0x2c7851['id']===_0x6a1fdd(0x237))_0x2541b3[_0x6a1fdd(0x19b)](_0x2dbd15=>_0x2dbd15['checked']=_0x2c7851[_0x6a1fdd(0x2d8)]);else{const _0x5578f6=Array['from'](_0x2541b3)[_0x6a1fdd(0x29b)](_0x10dffa=>_0x10dffa[_0x6a1fdd(0x2d8)]);_0x4accaf['checked']=_0x5578f6;}const _0xa74060=_0x5032f3[_0x6a1fdd(0x1f3)](_0x6a1fdd(0x28b))[_0x6a1fdd(0x30f)],_0x4fa187=_0x2541b3['length'];_0x520da4[_0x6a1fdd(0x267)]('span')['textContent']='已选择\x20'+_0xa74060+_0x6a1fdd(0x16e)+_0x4fa187+_0x6a1fdd(0x36c);}),document[_0x5e6894(0x23f)]('click',_0xf7f376=>{const _0x52de9e=_0x5e6894;!_0x520da4[_0x52de9e(0x312)](_0xf7f376['target'])&&!_0x5032f3[_0x52de9e(0x312)](_0xf7f376['target'])&&(_0x5032f3[_0x52de9e(0x2f6)]['display']=_0x52de9e(0x222));}));const _0x5b7e35=document[_0x5e6894(0x220)](_0x5e6894(0x250));_0x5b7e35&&_0x5b7e35[_0x5e6894(0x23f)](_0x5e6894(0x1c6),deleteAllLocalKnowledgeBases);const _0x10fb46=document[_0x5e6894(0x220)](_0x5e6894(0x2c8));_0x10fb46&&_0x10fb46['addEventListener'](_0x5e6894(0x1c6),()=>moveAllKnowledgeBases(_0x5e6894(0x17a)));const _0x119b1a=document[_0x5e6894(0x220)](_0x5e6894(0x270));_0x119b1a&&_0x119b1a[_0x5e6894(0x23f)]('click',()=>moveAllKnowledgeBases(_0x5e6894(0x2ff)));const _0x297877=['hly-kb-list-local','hly-kb-list-global'];_0x297877[_0x5e6894(0x19b)](_0x4ca3f5=>{const _0x1584f6=_0x5e6894,_0x21d63b=document[_0x1584f6(0x220)](_0x4ca3f5);_0x21d63b&&(_0x21d63b[_0x1584f6(0x23f)]('click',handleKbAction),_0x21d63b['addEventListener']('change',handleKbAction));}),document['getElementById'](_0x5e6894(0x34b))[_0x5e6894(0x23f)](_0x5e6894(0x1c5),_0x432233=>handleSelectAll(_0x432233,_0x5e6894(0x285))),document[_0x5e6894(0x220)](_0x5e6894(0x330))[_0x5e6894(0x23f)](_0x5e6894(0x1c5),_0x1b54e7=>handleSelectAll(_0x1b54e7,'local')),document[_0x5e6894(0x220)](_0x5e6894(0x321))[_0x5e6894(0x23f)](_0x5e6894(0x1c6),_0x402faf=>handleBulkAction(_0x402faf,_0x5e6894(0x285))),document['getElementById'](_0x5e6894(0x33f))[_0x5e6894(0x23f)]('click',_0x45270a=>handleBulkAction(_0x45270a,_0x5e6894(0x251)));}function initializeUnifiedInjectionEditor(){const _0xebe17d=_0x15063a,_0x1233f0=document[_0xebe17d(0x220)]('hly-injection-source-selector'),_0x3ec990=document[_0xebe17d(0x220)]('hly-unified-template-editor'),_0xac1592=document[_0xebe17d(0x220)](_0xebe17d(0x2ee)),_0x5cacca=document[_0xebe17d(0x1f3)]('input[name=\x22hly-unified-injection-position\x22]'),_0x27e5ce=document[_0xebe17d(0x220)](_0xebe17d(0x1ef)),_0x2286e0=document[_0xebe17d(0x220)](_0xebe17d(0x2a5));if(!_0x1233f0)return;const _0x26fd34={'novel':'{{novel_text}}','chat':_0xebe17d(0x203),'lorebook':_0xebe17d(0x1b1),'manual':_0xebe17d(0x2ce)};function _0x3f2b38(){const _0x17c3aa=_0xebe17d,_0x36de2b=_0x1233f0[_0x17c3aa(0x314)],_0x460ea5=_0x4b5037[_0x17c3aa(0x2d1)](),_0x527f6d=_0x460ea5[_0x17c3aa(0x1aa)+_0x36de2b]||{};_0x3ec990[_0x17c3aa(0x314)]=_0x527f6d[_0x17c3aa(0x338)]||'',_0xac1592['textContent']='以\x20'+(_0x26fd34[_0x36de2b]||_0x17c3aa(0x2c4))+_0x17c3aa(0x1ba);const _0x4397bb=_0x527f6d[_0x17c3aa(0x202)]!==undefined?String(_0x527f6d[_0x17c3aa(0x202)]):'2';_0x5cacca[_0x17c3aa(0x19b)](_0x28a5d1=>_0x28a5d1['checked']=_0x28a5d1[_0x17c3aa(0x314)]===_0x4397bb),_0x27e5ce[_0x17c3aa(0x314)]=_0x527f6d['depth']||0x0,_0x2286e0[_0x17c3aa(0x314)]=_0x527f6d[_0x17c3aa(0x37f)]!==undefined?String(_0x527f6d[_0x17c3aa(0x37f)]):'0';const _0x22bac3=_0x4397bb==='1';_0x27e5ce[_0x17c3aa(0x2a6)]=!_0x22bac3,_0x2286e0['disabled']=!_0x22bac3;}function _0x2a9ed8(){const _0xe7fcbc=_0xebe17d,_0x2e8e18=_0x1233f0['value'];updateAndSaveSetting(_0xe7fcbc(0x1aa)+_0x2e8e18+_0xe7fcbc(0x31c),_0x3ec990[_0xe7fcbc(0x314)]);const _0x197749=document[_0xe7fcbc(0x267)](_0xe7fcbc(0x317));_0x197749&&updateAndSaveSetting(_0xe7fcbc(0x1aa)+_0x2e8e18+_0xe7fcbc(0x2e8),parseInt(_0x197749[_0xe7fcbc(0x314)],0xa)),updateAndSaveSetting(_0xe7fcbc(0x1aa)+_0x2e8e18+'.depth',parseInt(_0x27e5ce[_0xe7fcbc(0x314)],0xa)),updateAndSaveSetting(_0xe7fcbc(0x1aa)+_0x2e8e18+'.depth_role',parseInt(_0x2286e0[_0xe7fcbc(0x314)],0xa));}_0x1233f0[_0xebe17d(0x23f)](_0xebe17d(0x1c5),_0x3f2b38);const _0x14bbde=debounce(_0x2a9ed8,0x12c);_0x3ec990[_0xebe17d(0x23f)]('input',_0x14bbde),_0x27e5ce[_0xebe17d(0x23f)](_0xebe17d(0x1c5),_0x2a9ed8),_0x2286e0[_0xebe17d(0x23f)](_0xebe17d(0x1c5),_0x2a9ed8),_0x5cacca['forEach'](_0x4d9d55=>_0x4d9d55[_0xebe17d(0x23f)]('change',()=>{const _0xd2d4ae=_0xebe17d;_0x2a9ed8();const _0x52d02f=_0x4d9d55['value']==='1'&&_0x4d9d55[_0xd2d4ae(0x2d8)];_0x27e5ce[_0xd2d4ae(0x2a6)]=!_0x52d02f,_0x2286e0[_0xd2d4ae(0x2a6)]=!_0x52d02f;})),_0x3f2b38();}function _0x4662(){const _0xb530e7=['\x20个知识库的启用状态吗?','position','{{chat_text}}','hly-kb-select-all-','\x20操作失败:\x20','。进度已保存,可稍后重试。','toggle','display','移动失败:\x20','local_proxy','log-error','startHLYCondensation','abort','翰林院设定已重置为初始状态。','\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\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\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\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\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20','\x20个知识库。','active','请至少选择一个知识库进行操作。','》的批量编纂任务已完成。成功:\x20','通行令牌\x20(API\x20Key):','label','toFixed','hly-tag-input-container','hly-worldbook-search','所有\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','signal','queryMessageCount','\x20状态失败:\x20','closest','processed','loadProgress','createElement','appendChild','processedChunks','请先选择一个\x20.txt\x20文件','hly-current-character-name','hly-include-user','hly-kb-delete-local-btn','local','.count\x22]','未找到符合条件的消息可供凝识。','获取模型失败:\x20','.hly-kb-item-checkbox','','hly-match-threshold','成功删除了\x20','#hly-modal-tag-input-container','hly-kb-toggle','\x20个模型。','\x20个知识库从\x20','testHLYApi','getCollectionId','您确定要永久删除知识库【','[翰林院-枢纽]\x20手动录入过程发生错误:','condensation','翰林院设定已存档封印。','hly-session-lock-btn','\x20楼:\x20[','name','hly-exclusion-rules-btn','querySelector','.hly-kb-list-item','N/A','matchThreshold','\x20楼。

','renameKnowledgeBase','圣旨已下','includes','flex','hly-kb-move-all-to-global','amily2_open_hanlin_tutorial','\x20个知识库执行批量操作...','\x20个知识库吗?此操作无法恢复!','录入内容不能为空。','true','9657320kdzLaf','fas\x20fa-lock-open','\x20失败:\x20','\x20个Rerank模型。','准备对《','batchSize','324894jFmEVF','removeEventListener','data','成功录入\x20','lorebook','hly-log-entry\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\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','moveKnowledgeBase','开始对《','global','成功加载\x20','\x0a所用模型:\x20','independentChatMemoryEnabled','html','上次已从第\x20','.hly-hist-entry-checkbox:checked','hly-super-sort-enabled','2350428eAxUuY','翰林院使用教程','preventDefault','未能获取到任何模型。','user','会话已锁定到:\x20','text','hly-local-kb-char-name','此操作将彻底清空当前角色的所有忆识(向量),且无法恢复。您确定要继续吗?','\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','未知错误','批量编纂任务已开始...','\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20正在获取...','您确定要将选中的\x20','[翰林院-枢纽]\x20渲染知识库列表失败:','hly-embedding-model','解锁会话','hly-rerank-enabled','initialize','成功移动了\x20','未能获取到任何Rerank模型。','hly-log-output','{{text}}','本地代理地址:','mes','清空宝库失败。','hly-kb-move-all-to-local','input[name=\x22','移动知识库\x20','hly-rerank-api-key','锁定会话','批量\x20','{{manual_text}}','未选择文件','floor','getSettings','.enabled\x22]','hly-condensation-enabled','queryPreprocessing','allWorldbooks','hly-kb-list-global-placeholder','isSessionLocked','checked','advanced','hly-hist-entry-multiselect-options','previousElementSibling','\x20块开始。','正在对\x20','manual','url','innerHTML','processCondensation','hanlinyuan-ingest-novel-start','getVectorCount','正在为《','hly-tag-extraction-toggle','可在此预览凝识结果。

','all','.position','[翰林院-枢纽]\x20未能获取SillyTavern上下文,绑定失败。','hly-query-message-count','embeddingModel','hly-layer-end','hly-rerank-notify','hly-unified-template-notes','遵命,将从第\x20','start','exclusionRules','getLockedSessionInfo','type','>\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×\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20','error','style',')\x22>\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','contains','[data-setting-key=\x22rerank.priorityRetrieval.sources.','value','您确定要将所有设定恢复为出厂默认值吗?','stopPropagation','input[name=\x22hly-unified-injection-position\x22]:checked',')\x20已被删除','_searchHandler','enabled','totalVectors','.template','hly-hist-entry-multiselect-btn','启禀大人,发现此书上次录入已完成\x20','.hly-log-placeholder','2517464ZkscmA','hly-kb-bulk-actions-global','selectedIndex',')\x20执行批量\x20','未找到匹配的条目','17504GJzkGF','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20未找到匹配的书库','[翰林院-枢纽]\x20查询宝库状态失败:','hly-kb-select-all-local','\x20条消息,开始凝识...','#hly-modal-tag-input',',\x20忆识总数=','getMessagesForCondensation','会话已锁定','success','开始将\x20','template','hly-api-endpoint','\x20操作成功。','hly-rerank-hybrid-alpha','hly-historiography-results','append','\x20楼凝识至第\x20','hly-kb-bulk-actions-local','float','content','批量移动过程中发生错误:\x20','end','ingestTextToHanlinyuan','input','圣谕不明','saveSettings','加载书库列表失败:\x20','无法获取总数:\x20','is-user','hly-kb-select-all-global','批量移动完成。','已选择\x20','hly-entry-search','toLocaleTimeString','保存规则','finalText','\x20个局部知识库...','checkbox','hly-kb-list-global','hly-','正在处理您提交的文书...','\x20条忆识。','rerank','神力连接通畅!','[翰林院-枢纽]\x20已成功连接各部,政令畅通。','tags','fa-exclamation-triangle','\x20块继续录入。','神力连接失败:\x20','comment','settingKey','请先选择书库','.hly-kb-rename-btn','priorityRetrieval','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','hly-chunk-size','className','layerStart',':checked','圣旨已达','split','您确定要将知识库【','\x20个条目','join','maxResults','成功切换了\x20','\x20(Key:\x20','remove','hly-query-preprocessing-enabled','\x22\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\x20data-is-user=\x22','indeterminate','\x20操作...','.hly-tab-pane','点击以锁定,让翰林院固定操作当前角色的宝库','notify','\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','insertAdjacentHTML','hanlinyuan-ingest-status','未找到匹配的条目','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x0a翰林院宝库状态\x0a--------------------\x0a集合ID:\x20','custom','\x20/\x20','trim','.hly-nav-item','\x20个知识块。','getChatId','from','检测到预览后待处理的消息对象,开始精确凝识...','hly-hist-select-library','\x20楼到第\x20','正在清空宝库...','预览内容已更新,可随时开始凝识。','1VYGKzK','globalToLocal','textContent','加载失败','编纂失败:\x20','】吗?','遵命,将从头开始录入此书。','您确定要永久删除【当前角色】的全部\x20','warning','局部知识库批量删除完成。成功:\x20','任务完成!成功录入\x20','\x20(ID:\x20','.hly-delete-rule-btn','delete','stringify','已采集\x20','entries',',重新开始。','.hly-kb-item-checkbox:checked','is_user','宝库状态','hlyLog','chunkSize','integer','span','allEntries','dataset','toggleKnowledgeBase','warn','saveHLYSettings','getCharacterName','apiEndpoint','[翰林院-枢纽]\x20预览过程发生错误:','filter','forEach','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x0a\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\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','clearJob','getAvailableWorldbooks','您确定要永久删除选中的\x20','injection_','#hly-rules-list','hly-independent-chat-memory-enabled','已选择\x200\x20/\x20','凝识完成!新增\x20','凝识失败:\x20','hly-kb-list-local-placeholder','{{lorebook_text}}','自定义路径:','\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20加载失败:\x20','send_date','删除局部知识库\x20','hanlinyuan-ingest-novel-file-input','.hly-preview-item-v2','会话已锁定到宝库:\x20','\x20为占位符。','hly-locked-status','executeCompilation','files','Google\x20API\x20Key:','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','重命名失败:\x20','testApiConnection','log-success','finalMessages','例如\x20http://127.0.0.1:8000/v1','change','click','beforeend','正在删除\x20','children','add',',\x20向量:\x20','tagExtractionEnabled','hanlinyuan-ingest-novel-file-name','css','hly-modal-container','hly-include-ai','hly-rerank-top-n','fa-check-circle',')没有任何知识库可供移动。','option','...','google_direct','info','toggleSessionLock','totalChunks','.hly-preview-textarea','未找到任何书库','keys','resetHLYSettings','preview-item-','》获取条目列表...','开始获取Rerank模型列表...','重命名知识库\x20','严重错误','

','amily2_open_rag_palace','398422Ylaorf','[翰林院-枢纽]\x20凝识过程发生错误:','#hly-modal-tag-extraction-enabled','retrieval','获取Rerank模型失败:\x20','purgeHLYStorage','model','\x20个知识库删除失败。','[翰林院-枢纽]\x20获取Rerank模型列表失败:',';\x22>\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\x20\x20\x20\x20','hly-unified-injection-depth','getLocalKnowledgeBases','会话已解锁,将跟随当前角色。','加载条目失败:\x20','querySelectorAll','boolean','.hly-preview-delete-btn-v2','根据标签提取或内容排除条件,未找到任何有效内容。','\x22\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\x20data-send-date=\x22','\x22>\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','[翰林院-枢纽]\x20未找到类型为\x20\x22','开始对\x20','任务已中止。','total','】移动到【','\x22>\x20[','大功告成','请选择一个书库...'];_0x4662=function(){return _0xb530e7;};return _0x4662();}function handleApiModeChange(){const _0xf7300e=_0x15063a,_0x468c46=document['getElementById'](_0xf7300e(0x339))[_0xf7300e(0x314)],_0xc42ee9=document[_0xf7300e(0x220)](_0xf7300e(0x19f)),_0x4f4672=document[_0xf7300e(0x220)]('hly-api-key-group'),_0x39f536=document['getElementById'](_0xf7300e(0x2bd)),_0x2e6f24=_0x39f536[_0xf7300e(0x2db)];if(!_0xc42ee9||!_0x4f4672)return;_0xc42ee9[_0xf7300e(0x2f6)][_0xf7300e(0x208)]=_0xf7300e(0x2b5),_0x4f4672['style']['display']=_0xf7300e(0x2b5);switch(_0x468c46){case _0xf7300e(0x1d6):_0xc42ee9[_0xf7300e(0x2f6)][_0xf7300e(0x208)]='none',_0x4f4672[_0xf7300e(0x267)](_0xf7300e(0x22d))[_0xf7300e(0x17b)]=_0xf7300e(0x1be),_0x4f4672[_0xf7300e(0x267)](_0xf7300e(0x345))[_0xf7300e(0x217)]='请输入您的Google\x20API\x20Key';break;case _0xf7300e(0x20a):_0xc42ee9[_0xf7300e(0x267)]('label')[_0xf7300e(0x17b)]=_0xf7300e(0x2c5),_0xc42ee9[_0xf7300e(0x267)](_0xf7300e(0x345))[_0xf7300e(0x217)]=_0xf7300e(0x1c4),_0x4f4672[_0xf7300e(0x2f6)]['display']=_0xf7300e(0x222);break;case _0xf7300e(0x16d):default:_0xc42ee9[_0xf7300e(0x267)](_0xf7300e(0x22d))[_0xf7300e(0x17b)]=_0xf7300e(0x1b2),_0xc42ee9['querySelector'](_0xf7300e(0x345))[_0xf7300e(0x217)]='输入兼容OpenAI的embeddings端点',_0x4f4672[_0xf7300e(0x267)]('label')['textContent']=_0xf7300e(0x22c);break;}}function loadSettingsToUI(){const _0x48a0e2=_0x15063a,_0x2fc55a=_0x4b5037[_0x48a0e2(0x2d1)]();if(!_0x2fc55a)return;document[_0x48a0e2(0x220)](_0x48a0e2(0x1a5))['checked']=_0x2fc55a[_0x48a0e2(0x1e8)]['enabled'],document['getElementById']('hly-api-endpoint')[_0x48a0e2(0x314)]=_0x2fc55a[_0x48a0e2(0x1e8)][_0x48a0e2(0x198)],document[_0x48a0e2(0x220)](_0x48a0e2(0x238))[_0x48a0e2(0x314)]=_0x2fc55a['retrieval']['customApiUrl'],document[_0x48a0e2(0x220)](_0x48a0e2(0x304))['value']=_0x2fc55a['retrieval'][_0x48a0e2(0x19d)];const _0x45ac7b=document[_0x48a0e2(0x220)](_0x48a0e2(0x2bd));if(_0x45ac7b[_0x48a0e2(0x221)][_0x48a0e2(0x30f)]===0x0){const _0x160a31=_0x2fc55a[_0x48a0e2(0x1e8)][_0x48a0e2(0x2eb)],_0x5ec88e=new Option(_0x160a31,_0x160a31,!![],!![]);_0x45ac7b[_0x48a0e2(0x1ca)](_0x5ec88e);}_0x45ac7b[_0x48a0e2(0x314)]=_0x2fc55a[_0x48a0e2(0x1e8)]['embeddingModel'],document[_0x48a0e2(0x220)](_0x48a0e2(0x23e))[_0x48a0e2(0x2d8)]=_0x2fc55a[_0x48a0e2(0x1e8)][_0x48a0e2(0x378)],document[_0x48a0e2(0x220)](_0x48a0e2(0x365))[_0x48a0e2(0x314)]=_0x2fc55a['advanced'][_0x48a0e2(0x18f)],document[_0x48a0e2(0x220)](_0x48a0e2(0x211))[_0x48a0e2(0x314)]=_0x2fc55a[_0x48a0e2(0x2d9)]['overlap'],document['getElementById'](_0x48a0e2(0x257))[_0x48a0e2(0x314)]=_0x2fc55a[_0x48a0e2(0x2d9)][_0x48a0e2(0x26a)],document[_0x48a0e2(0x220)](_0x48a0e2(0x2ea))[_0x48a0e2(0x314)]=_0x2fc55a['advanced'][_0x48a0e2(0x245)],document[_0x48a0e2(0x220)]('hly-max-results')[_0x48a0e2(0x314)]=_0x2fc55a[_0x48a0e2(0x2d9)][_0x48a0e2(0x36e)],document[_0x48a0e2(0x220)]('hly-batch-size')['value']=_0x2fc55a[_0x48a0e2(0x1e8)][_0x48a0e2(0x27b)],handleApiModeChange(),document[_0x48a0e2(0x220)](_0x48a0e2(0x2d3))[_0x48a0e2(0x2d8)]=_0x2fc55a['condensation'][_0x48a0e2(0x31a)],document[_0x48a0e2(0x220)](_0x48a0e2(0x305))['value']=_0x2fc55a[_0x48a0e2(0x261)][_0x48a0e2(0x367)],document[_0x48a0e2(0x220)]('hly-layer-end')[_0x48a0e2(0x314)]=_0x2fc55a[_0x48a0e2(0x261)]['layerEnd'],document[_0x48a0e2(0x220)](_0x48a0e2(0x24f))['checked']=_0x2fc55a[_0x48a0e2(0x261)][_0x48a0e2(0x23a)][_0x48a0e2(0x291)],document['getElementById'](_0x48a0e2(0x1d0))[_0x48a0e2(0x2d8)]=_0x2fc55a[_0x48a0e2(0x261)][_0x48a0e2(0x23a)]['ai'];const _0x19e786=document[_0x48a0e2(0x220)](_0x48a0e2(0x2e5)),_0x3f8e3a=document['getElementById'](_0x48a0e2(0x2b0)),_0x179acf=document[_0x48a0e2(0x220)]('hly-tag-input-container');_0x19e786[_0x48a0e2(0x2d8)]=_0x2fc55a[_0x48a0e2(0x261)][_0x48a0e2(0x1cc)],_0x3f8e3a[_0x48a0e2(0x314)]=_0x2fc55a[_0x48a0e2(0x261)][_0x48a0e2(0x35b)],_0x179acf['style'][_0x48a0e2(0x208)]=_0x19e786['checked']?_0x48a0e2(0x2b5):_0x48a0e2(0x222),document[_0x48a0e2(0x220)](_0x48a0e2(0x2bf))[_0x48a0e2(0x2d8)]=_0x2fc55a[_0x48a0e2(0x358)][_0x48a0e2(0x31a)],document['getElementById']('hly-rerank-url')['value']=_0x2fc55a['rerank'][_0x48a0e2(0x2df)],document[_0x48a0e2(0x220)](_0x48a0e2(0x2cb))[_0x48a0e2(0x314)]=_0x2fc55a[_0x48a0e2(0x358)][_0x48a0e2(0x19d)];const _0x2bdb95=document[_0x48a0e2(0x220)](_0x48a0e2(0x2fa));if(_0x2bdb95[_0x48a0e2(0x221)][_0x48a0e2(0x30f)]===0x0){const _0x151d63=_0x2fc55a['rerank'][_0x48a0e2(0x1eb)];if(_0x151d63){const _0x2978b9=new Option(_0x151d63,_0x151d63,!![],!![]);_0x2bdb95[_0x48a0e2(0x1ca)](_0x2978b9);}}_0x2bdb95[_0x48a0e2(0x314)]=_0x2fc55a[_0x48a0e2(0x358)][_0x48a0e2(0x1eb)],document[_0x48a0e2(0x220)](_0x48a0e2(0x1d1))[_0x48a0e2(0x314)]=_0x2fc55a[_0x48a0e2(0x358)][_0x48a0e2(0x2ac)],document[_0x48a0e2(0x220)](_0x48a0e2(0x33b))['value']=_0x2fc55a[_0x48a0e2(0x358)]['hybrid_alpha'],document[_0x48a0e2(0x220)](_0x48a0e2(0x2ed))[_0x48a0e2(0x2d8)]=_0x2fc55a[_0x48a0e2(0x358)]['notify'],document[_0x48a0e2(0x220)](_0x48a0e2(0x28c))[_0x48a0e2(0x2d8)]=_0x2fc55a[_0x48a0e2(0x358)]['superSortEnabled'];const _0x4249c8=_0x2fc55a[_0x48a0e2(0x358)][_0x48a0e2(0x363)];if(_0x4249c8){document[_0x48a0e2(0x220)]('hly-priority-retrieval-enabled')[_0x48a0e2(0x2d8)]=_0x4249c8[_0x48a0e2(0x31a)];const _0x4dbc41=[_0x48a0e2(0x21e),'chat_history',_0x48a0e2(0x280),_0x48a0e2(0x2de)];_0x4dbc41[_0x48a0e2(0x19b)](_0x1a3fad=>{const _0x3a7436=_0x48a0e2,_0x5ae7cb=_0x4249c8[_0x3a7436(0x328)][_0x1a3fad];if(_0x5ae7cb){const _0x21ceb2=document[_0x3a7436(0x267)](_0x3a7436(0x313)+_0x1a3fad+_0x3a7436(0x2d2)),_0x4e0168=document[_0x3a7436(0x267)]('[data-setting-key=\x22rerank.priorityRetrieval.sources.'+_0x1a3fad+_0x3a7436(0x252));if(_0x21ceb2)_0x21ceb2[_0x3a7436(0x2d8)]=_0x5ae7cb['enabled'];if(_0x4e0168)_0x4e0168[_0x3a7436(0x314)]=_0x5ae7cb['count'];}});}_0x2fc55a[_0x48a0e2(0x2d4)]&&(document[_0x48a0e2(0x220)](_0x48a0e2(0x372))['checked']=_0x2fc55a[_0x48a0e2(0x2d4)][_0x48a0e2(0x31a)]),_0x2fc55a[_0x48a0e2(0x1e8)][_0x48a0e2(0x288)]!==undefined&&(document[_0x48a0e2(0x220)](_0x48a0e2(0x1ac))[_0x48a0e2(0x2d8)]=_0x2fc55a['retrieval']['independentChatMemoryEnabled']);}function saveSettingsFromUI(_0x4e7740=!![]){const _0x112101=_0x15063a,_0x1ec81e=document['getElementById']('hly-modal-container');if(!_0x1ec81e)return;const _0x44fd28=_0x1ec81e[_0x112101(0x1f3)](_0x112101(0x2a8));_0x44fd28[_0x112101(0x19b)](_0xd1625b=>{const _0x467755=_0x112101,_0x1e6a9c=_0xd1625b['dataset']['settingKey'];if(!_0x1e6a9c)return;let _0x250678;const _0x1b9975=_0xd1625b[_0x467755(0x193)][_0x467755(0x2f3)]||'string';if(_0xd1625b[_0x467755(0x2f3)]===_0x467755(0x353))_0x250678=_0xd1625b[_0x467755(0x2d8)];else{if(_0xd1625b[_0x467755(0x2f3)]===_0x467755(0x2b9)){if(!_0xd1625b['checked'])return;_0x250678=_0xd1625b[_0x467755(0x314)];}else _0x250678=_0xd1625b['value'];}switch(_0x1b9975){case _0x467755(0x190):_0x250678=parseInt(_0x250678,0xa);break;case _0x467755(0x340):_0x250678=parseFloat(_0x250678);break;case _0x467755(0x1f4):if(typeof _0x250678!==_0x467755(0x1f4))_0x250678=_0x250678==='true';break;}const _0xf404cb=_0x4b5037[_0x467755(0x2d1)](),_0x3e1f5a=_0x1e6a9c[_0x467755(0x36a)]('.');let _0x15bf34=_0xf404cb;for(let _0x508628=0x0;_0x508628<_0x3e1f5a[_0x467755(0x30f)]-0x1;_0x508628++){_0x15bf34=_0x15bf34[_0x3e1f5a[_0x508628]]=_0x15bf34[_0x3e1f5a[_0x508628]]||{};}_0x15bf34[_0x3e1f5a[_0x3e1f5a[_0x467755(0x30f)]-0x1]]=_0x250678;}),_0x4b5037[_0x112101(0x347)](),!_0x4e7740&&(log('【手动存档】所有设定已存档封印。','success'),toastr[_0x112101(0x336)](_0x112101(0x262),_0x112101(0x369)));}function resetSettingsToUI(){const _0x812b80=_0x15063a;confirm(_0x812b80(0x315))&&(_0x4b5037[_0x812b80(0x16a)](),loadSettingsToUI(),toastr[_0x812b80(0x1d7)](_0x812b80(0x20e),'诏曰'));}async function updatePanelStatus(){const _0x51612e=_0x15063a,_0x7543dc=_0x4b5037[_0x51612e(0x2d7)](),_0x1ecfa7=document['getElementById'](_0x51612e(0x24e)),_0x50ec7d=document[_0x51612e(0x220)]('hly-current-chat-id');if(_0x7543dc){const _0x508d92=_0x4b5037[_0x51612e(0x2f2)]();_0x508d92&&(_0x1ecfa7[_0x51612e(0x17b)]=_0x51612e(0x335),_0x50ec7d[_0x51612e(0x17b)]=_0x508d92['id'],_0x50ec7d[_0x51612e(0x2aa)]=_0x51612e(0x308)+_0x508d92['id'],_0x1ecfa7[_0x51612e(0x29e)][_0x51612e(0x1ca)](_0x51612e(0x1bb)),_0x50ec7d[_0x51612e(0x29e)]['add'](_0x51612e(0x1bb)));}else _0x1ecfa7[_0x51612e(0x17b)]=_0x535b3f[_0x51612e(0x197)](),_0x50ec7d['textContent']=_0x535b3f[_0x51612e(0x172)]()||'无',_0x50ec7d['title']='',_0x1ecfa7['classList']['remove']('hly-locked-status'),_0x50ec7d[_0x51612e(0x29e)]['remove'](_0x51612e(0x1bb));const _0x3d26e4=document[_0x51612e(0x220)]('hly-current-vector-count');_0x3d26e4[_0x51612e(0x17b)]=_0x51612e(0x1d5);try{const _0x423904=await _0x4b5037['getVectorCount']();_0x3d26e4[_0x51612e(0x17b)]=_0x423904;}catch(_0x275a28){console['error'](_0x51612e(0x300),_0x275a28),_0x3d26e4['textContent']=_0x51612e(0x269),_0x3d26e4[_0x51612e(0x2aa)]=_0x51612e(0x349)+_0x275a28[_0x51612e(0x2fd)];}const _0x157691=document['getElementById'](_0x51612e(0x19e));if(_0x157691&&!_0x157691[_0x51612e(0x193)][_0x51612e(0x351)]){const _0x12652c=_0x4b5037['getSettings'](),_0x3a50da=await _0x4b5037[_0x51612e(0x25e)]();if(_0x12652c[_0x51612e(0x30b)]&&_0x12652c[_0x51612e(0x30b)][_0x3a50da]){const _0x11ce4c=_0x12652c['condensationHistory'][_0x3a50da];_0x157691[_0x51612e(0x2e0)]=_0x51612e(0x28a)+_0x11ce4c[_0x51612e(0x2f0)]+_0x51612e(0x33e)+_0x11ce4c[_0x51612e(0x343)]+_0x51612e(0x26b);}else _0x157691['innerHTML']=_0x51612e(0x2e6);}renderKnowledgeBases();}async function moveAllKnowledgeBases(_0x57ba30){const _0x3dfee4=_0x15063a,_0x3b35c8=_0x57ba30===_0x3dfee4(0x17a),_0x32b4b5=_0x3b35c8?'global':_0x3dfee4(0x251),_0x1ac964=_0x3b35c8?'局部':'全局',_0x15ef02=_0x3b35c8?_0x4b5037[_0x3dfee4(0x2af)]():_0x4b5037[_0x3dfee4(0x1f0)](),_0x525158=Object[_0x3dfee4(0x1dc)](_0x15ef02);if(_0x525158[_0x3dfee4(0x30f)]===0x0){toastr['info']('源区域('+(_0x3b35c8?'全局':'局部')+_0x3dfee4(0x1d3),'圣谕');return;}if(!confirm('您确定要将\x20'+_0x525158[_0x3dfee4(0x30f)]+'\x20个知识库从【'+(_0x3b35c8?'全局':'局部')+_0x3dfee4(0x1fd)+_0x1ac964+_0x3dfee4(0x17e)))return;log(_0x3dfee4(0x337)+_0x525158[_0x3dfee4(0x30f)]+_0x3dfee4(0x25c)+_0x32b4b5+_0x3dfee4(0x226)+(_0x3b35c8?_0x3dfee4(0x251):'global')+_0x3dfee4(0x1d5),'info');const _0x2a0cd9=_0x525158[_0x3dfee4(0x2a1)](_0x58e8c6=>_0x4b5037[_0x3dfee4(0x283)](_0x58e8c6,_0x32b4b5));try{await Promise[_0x3dfee4(0x2e7)](_0x2a0cd9),toastr[_0x3dfee4(0x336)](_0x3dfee4(0x231)+_0x525158[_0x3dfee4(0x30f)]+_0x3dfee4(0x1a1),'大功告成'),log(_0x3dfee4(0x34c),_0x3dfee4(0x336));}catch(_0x2465e5){toastr[_0x3dfee4(0x2f5)](_0x3dfee4(0x342)+_0x2465e5['message'],'警报'),log(_0x3dfee4(0x2fc)+_0x2465e5[_0x3dfee4(0x2fd)],_0x3dfee4(0x2f5));}finally{await updatePanelStatus();}}async function deleteAllLocalKnowledgeBases(){const _0x50aed0=_0x15063a,_0x277461=_0x4b5037[_0x50aed0(0x1f0)](),_0xea8212=Object[_0x50aed0(0x1dc)](_0x277461);if(_0xea8212[_0x50aed0(0x30f)]===0x0){toastr[_0x50aed0(0x1d7)](_0x50aed0(0x29f),'圣谕');return;}if(!confirm(_0x50aed0(0x180)+_0xea8212[_0x50aed0(0x30f)]+_0x50aed0(0x218)))return;toastr[_0x50aed0(0x1d7)](_0x50aed0(0x1c8)+_0xea8212[_0x50aed0(0x30f)]+'\x20个局部知识库...','圣旨'),log(_0x50aed0(0x169)+_0xea8212[_0x50aed0(0x30f)]+_0x50aed0(0x352),_0x50aed0(0x195));let _0x174b54=0x0,_0x5d1998=0x0;for(const _0x3b86fe of _0xea8212){try{await _0x4b5037['removeKnowledgeBase'](_0x3b86fe,_0x50aed0(0x251)),_0x174b54++;}catch(_0x5f2dce){_0x5d1998++,log(_0x50aed0(0x1b6)+_0x3b86fe+_0x50aed0(0x278)+_0x5f2dce[_0x50aed0(0x2fd)],_0x50aed0(0x2f5));}}_0x5d1998>0x0?toastr[_0x50aed0(0x2f5)]('操作完成,但有\x20'+_0x5d1998+_0x50aed0(0x1ec),'警报'):toastr[_0x50aed0(0x336)](_0x50aed0(0x231)+_0x174b54+'\x20个局部知识库均已成功删除。',_0x50aed0(0x1ff)),log(_0x50aed0(0x182)+_0x174b54+_0x50aed0(0x30c)+_0x5d1998,_0x50aed0(0x1d7)),await updatePanelStatus();}async function renderKnowledgeBases(){const _0x545044=_0x15063a,_0x5615ae=document[_0x545044(0x220)]('hly-kb-list-local'),_0x473117=document[_0x545044(0x220)](_0x545044(0x354)),_0x149d5d=document['getElementById'](_0x545044(0x294));if(!_0x5615ae||!_0x473117||!_0x149d5d)return;_0x149d5d[_0x545044(0x17b)]=_0x535b3f[_0x545044(0x197)]()||_0x545044(0x2b7);try{const _0x25e8f7=_0x4b5037[_0x545044(0x1f0)](),_0xa84874=_0x4b5037['getGlobalKnowledgeBases']();await _renderKbList(_0x25e8f7,_0x5615ae,_0x545044(0x251),_0x545044(0x1b0)),await _renderKbList(_0xa84874,_0x473117,_0x545044(0x285),_0x545044(0x2d6));}catch(_0x42d8c3){console[_0x545044(0x2f5)](_0x545044(0x2bc),_0x42d8c3),_0x5615ae[_0x545044(0x2e0)]=_0x545044(0x1b4)+_0x42d8c3[_0x545044(0x2fd)]+_0x545044(0x1e3),_0x473117['innerHTML']=_0x545044(0x1b4)+_0x42d8c3[_0x545044(0x2fd)]+_0x545044(0x1e3);}}async function _renderKbList(_0x2b4708,_0x53480e,_0x19eb68,_0x786fb3){const _0x252cca=_0x15063a,_0x3e1dc8=document[_0x252cca(0x220)](_0x786fb3);_0x53480e['innerHTML']='',_0x53480e['appendChild'](_0x3e1dc8);if(Object[_0x252cca(0x1dc)](_0x2b4708)[_0x252cca(0x30f)]===0x0){_0x3e1dc8[_0x252cca(0x2f6)][_0x252cca(0x208)]=_0x252cca(0x2b5);return;}_0x3e1dc8['style'][_0x252cca(0x208)]=_0x252cca(0x222);for(const [_0x21e2b5,_0x3919ca]of Object[_0x252cca(0x189)](_0x2b4708)){const _0x34acec=document[_0x252cca(0x24a)]('div');_0x34acec[_0x252cca(0x366)]='hly-kb-list-item',_0x34acec[_0x252cca(0x193)][_0x252cca(0x21d)]=_0x21e2b5,_0x34acec[_0x252cca(0x193)][_0x252cca(0x21c)]=_0x19eb68;const _0x441197=await _0x4b5037['getVectorCount'](_0x21e2b5,_0x19eb68),_0x444f20=_0x19eb68===_0x252cca(0x251)?'':_0x252cca(0x243);_0x34acec[_0x252cca(0x2e0)]=_0x252cca(0x232)+_0x21e2b5+_0x252cca(0x299)+_0x21e2b5+'\x22>'+_0x3919ca[_0x252cca(0x265)]+'\x20('+_0x441197+'条)\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'+_0x444f20+'\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_0x5a56d6[_0x54f530(0x2d8)]=_0x376234),updateBulkActionUI(_0x4d13b4);}function updateBulkActionUI(_0x2fa2e4){const _0x4c935c=_0x15063a,_0x5dffc4=document['getElementById']('hly-kb-list-'+_0x2fa2e4),_0x10747f=document[_0x4c935c(0x220)]('hly-kb-bulk-actions-'+_0x2fa2e4),_0x1a7812=document[_0x4c935c(0x220)](_0x4c935c(0x204)+_0x2fa2e4),_0x1dcd13=_0x5dffc4['querySelectorAll'](_0x4c935c(0x255)),_0x483a25=_0x5dffc4[_0x4c935c(0x1f3)](_0x4c935c(0x18b)),_0x55e7e6=_0x483a25[_0x4c935c(0x30f)],_0x326eb0=_0x1dcd13['length'];_0x55e7e6>0x0?_0x10747f[_0x4c935c(0x2f6)][_0x4c935c(0x208)]=_0x4c935c(0x26f):_0x10747f[_0x4c935c(0x2f6)][_0x4c935c(0x208)]=_0x4c935c(0x222);if(_0x326eb0===0x0)_0x1a7812[_0x4c935c(0x2d8)]=![],_0x1a7812[_0x4c935c(0x374)]=![];else{if(_0x55e7e6===_0x326eb0)_0x1a7812[_0x4c935c(0x2d8)]=!![],_0x1a7812[_0x4c935c(0x374)]=![];else _0x55e7e6>0x0?(_0x1a7812['checked']=![],_0x1a7812[_0x4c935c(0x374)]=!![]):(_0x1a7812[_0x4c935c(0x2d8)]=![],_0x1a7812['indeterminate']=![]);}}async function handleBulkAction(_0x3fe9cc,_0x381e2){const _0x4b20ff=_0x15063a,_0x5355c8=_0x3fe9cc[_0x4b20ff(0x2a7)][_0x4b20ff(0x193)]['action'];if(!_0x5355c8)return;const _0x510e59=document['getElementById']('hly-kb-list-'+_0x381e2),_0x122b5a=_0x510e59[_0x4b20ff(0x1f3)](_0x4b20ff(0x18b)),_0x399711=Array[_0x4b20ff(0x173)](_0x122b5a)[_0x4b20ff(0x2a1)](_0x224ade=>_0x224ade[_0x4b20ff(0x193)][_0x4b20ff(0x21d)]);if(_0x399711[_0x4b20ff(0x30f)]===0x0){toastr[_0x4b20ff(0x181)](_0x4b20ff(0x22a),'圣谕');return;}let _0x6e451b='',_0x236cde,_0xff07dd='';switch(_0x5355c8){case _0x4b20ff(0x186):_0x6e451b=_0x4b20ff(0x1a9)+_0x399711[_0x4b20ff(0x30f)]+_0x4b20ff(0x273),_0x236cde=_0x54c9bd=>_0x4b5037[_0x4b20ff(0x2b4)](_0x54c9bd,_0x381e2),_0xff07dd=_0x4b20ff(0x258)+_0x399711[_0x4b20ff(0x30f)]+_0x4b20ff(0x228);break;case _0x4b20ff(0x32b):const _0x155018=_0x381e2===_0x4b20ff(0x251)?'全局':'局部';_0x6e451b=_0x4b20ff(0x2bb)+_0x399711[_0x4b20ff(0x30f)]+_0x4b20ff(0x37e)+_0x155018+_0x4b20ff(0x17e),_0x236cde=_0x344f3b=>_0x4b5037[_0x4b20ff(0x283)](_0x344f3b,_0x381e2),_0xff07dd=_0x4b20ff(0x2c1)+_0x399711[_0x4b20ff(0x30f)]+'\x20个知识库。';break;case _0x4b20ff(0x207):_0x6e451b='您确定要切换选中的\x20'+_0x399711[_0x4b20ff(0x30f)]+_0x4b20ff(0x201),_0x236cde=_0x1d3aca=>_0x4b5037['toggleKnowledgeBase'](_0x1d3aca,_0x381e2),_0xff07dd=_0x4b20ff(0x36f)+_0x399711[_0x4b20ff(0x30f)]+'\x20个知识库的状态。';break;default:return;}if(!confirm(_0x6e451b))return;toastr[_0x4b20ff(0x1d7)](_0x4b20ff(0x2dd)+_0x399711[_0x4b20ff(0x30f)]+_0x4b20ff(0x272),'圣旨'),log(_0x4b20ff(0x1fa)+_0x399711['length']+'\x20个知识库\x20(范围:\x20'+_0x381e2+_0x4b20ff(0x323)+_0x5355c8+_0x4b20ff(0x375),'info');try{const _0x5a4b31=_0x399711[_0x4b20ff(0x2a1)](_0x5897a5=>_0x236cde(_0x5897a5));await Promise[_0x4b20ff(0x2e7)](_0x5a4b31),toastr['success'](_0xff07dd,_0x4b20ff(0x1ff)),log(_0x4b20ff(0x2cd)+_0x5355c8+_0x4b20ff(0x33a),_0x4b20ff(0x336));}catch(_0x36445a){toastr[_0x4b20ff(0x2f5)](_0x4b20ff(0x2a2)+_0x36445a['message'],'警报'),log(_0x4b20ff(0x2cd)+_0x5355c8+_0x4b20ff(0x205)+_0x36445a[_0x4b20ff(0x2fd)],_0x4b20ff(0x2f5));}finally{await updatePanelStatus();}}async function testApi(){const _0x51c804=_0x15063a;toastr['info']('正在测试神力连接...','圣旨');try{await _0x4b5037[_0x51c804(0x1c1)](),toastr[_0x51c804(0x336)](_0x51c804(0x359),'圣意');}catch(_0x3d17aa){toastr[_0x51c804(0x2f5)](_0x51c804(0x35e)+_0x3d17aa[_0x51c804(0x2fd)],'警报');}}async function fetchHLYEmbeddingModels(){const _0x58a8ff=_0x15063a,_0x56bc74=document[_0x58a8ff(0x220)](_0x58a8ff(0x2bd)),_0x1ecc67=_0x56bc74[_0x58a8ff(0x314)];_0x56bc74[_0x58a8ff(0x2e0)]=_0x58a8ff(0x2ba),_0x56bc74[_0x58a8ff(0x2a6)]=!![];try{log(_0x58a8ff(0x225),'info');const _0x242344=await _0x4b5037['fetchEmbeddingModels']();_0x56bc74[_0x58a8ff(0x2e0)]='';if(_0x242344[_0x58a8ff(0x30f)]===0x0){_0x56bc74[_0x58a8ff(0x2e0)]=_0x58a8ff(0x256),toastr[_0x58a8ff(0x195)](_0x58a8ff(0x290),_0x58a8ff(0x2a3)),log('未能获取到任何模型。',_0x58a8ff(0x195));return;}_0x242344[_0x58a8ff(0x19b)](_0x7a9949=>{const _0x3a67b9=_0x58a8ff,_0x50bd70=new Option(_0x7a9949,_0x7a9949);_0x56bc74[_0x3a67b9(0x1ca)](_0x50bd70);}),_0x242344[_0x58a8ff(0x26e)](_0x1ecc67)?_0x56bc74[_0x58a8ff(0x314)]=_0x1ecc67:_0x56bc74[_0x58a8ff(0x322)]=0x0,toastr[_0x58a8ff(0x336)]('成功获取\x20'+_0x242344[_0x58a8ff(0x30f)]+'\x20个模型。','圣意'),log(_0x58a8ff(0x1a4)+_0x242344[_0x58a8ff(0x30f)]+_0x58a8ff(0x25b),_0x58a8ff(0x336));}catch(_0x7aca38){console[_0x58a8ff(0x2f5)](_0x58a8ff(0x1a3),_0x7aca38),toastr['error'](_0x58a8ff(0x254)+_0x7aca38['message'],_0x58a8ff(0x1e2)),log(_0x58a8ff(0x254)+_0x7aca38[_0x58a8ff(0x2fd)],'error'),_0x56bc74['innerHTML']='';}finally{_0x56bc74[_0x58a8ff(0x2a6)]=![];}}async function fetchHLYRerankModels(){const _0x120cf3=_0x15063a,_0x26a78f=document[_0x120cf3(0x220)]('hly-rerank-model'),_0x57b4dd=_0x26a78f['value'];_0x26a78f[_0x120cf3(0x2e0)]='',_0x26a78f[_0x120cf3(0x2a6)]=!![];try{log(_0x120cf3(0x1e0),'info');const _0x5f28a0=await _0x4b5037['fetchRerankModels']();_0x26a78f[_0x120cf3(0x2e0)]='';if(_0x5f28a0['length']===0x0){_0x26a78f[_0x120cf3(0x2e0)]=_0x120cf3(0x256),toastr['warn'](_0x120cf3(0x2c2),_0x120cf3(0x2a3)),log(_0x120cf3(0x2c2),_0x120cf3(0x195));return;}_0x5f28a0[_0x120cf3(0x19b)](_0x3f13b5=>{const _0x5ddadb=new Option(_0x3f13b5,_0x3f13b5);_0x26a78f['add'](_0x5ddadb);}),_0x5f28a0[_0x120cf3(0x26e)](_0x57b4dd)?_0x26a78f[_0x120cf3(0x314)]=_0x57b4dd:_0x26a78f[_0x120cf3(0x322)]=0x0,toastr['success'](_0x120cf3(0x1a4)+_0x5f28a0[_0x120cf3(0x30f)]+_0x120cf3(0x279),'圣意'),log(_0x120cf3(0x1a4)+_0x5f28a0[_0x120cf3(0x30f)]+_0x120cf3(0x279),_0x120cf3(0x336));}catch(_0x2ddfc4){console['error'](_0x120cf3(0x1ed),_0x2ddfc4),toastr[_0x120cf3(0x2f5)]('获取Rerank模型失败:\x20'+_0x2ddfc4[_0x120cf3(0x2fd)],_0x120cf3(0x1e2)),log(_0x120cf3(0x1e9)+_0x2ddfc4[_0x120cf3(0x2fd)],_0x120cf3(0x2f5)),_0x26a78f[_0x120cf3(0x2e0)]='';}finally{_0x26a78f[_0x120cf3(0x2a6)]=![];}}async function purgeStorage(){const _0x39ee6f=_0x15063a;if(confirm(_0x39ee6f(0x295))){toastr[_0x39ee6f(0x1d7)](_0x39ee6f(0x177),'圣旨');const _0x4b4dac=await _0x4b5037['purgeStorage']();_0x4b4dac?toastr[_0x39ee6f(0x336)](_0x39ee6f(0x2b1),'圣意'):toastr[_0x39ee6f(0x2f5)](_0x39ee6f(0x2c7),'警报'),await updatePanelStatus();}}async function startCondensation(){const _0x4ef3cd=_0x15063a,_0x49801d=document['getElementById']('hly-condensation-results'),_0x141e5f=_0x49801d['dataset'][_0x4ef3cd(0x1c3)],_0x238942=document['getElementById'](_0x4ef3cd(0x305))['value'],_0x4ed14f=document['getElementById'](_0x4ef3cd(0x2ec))['value'],_0x3095de={'start':parseInt(_0x238942),'end':parseInt(_0x4ed14f)};try{let _0x146571;_0x141e5f?(log(_0x4ef3cd(0x174),_0x4ef3cd(0x1d7)),toastr[_0x4ef3cd(0x1d7)]('正在处理您确认后的文书...','圣旨'),_0x146571=JSON['parse'](_0x141e5f),delete _0x49801d[_0x4ef3cd(0x193)][_0x4ef3cd(0x1c3)]):(log('未检测到预览文本,按标准流程采集消息...',_0x4ef3cd(0x1d7)),toastr[_0x4ef3cd(0x1d7)]('正在准备凝识...','圣旨'),_0x146571=_0x4b5037[_0x4ef3cd(0x334)]());if(!_0x146571||_0x146571[_0x4ef3cd(0x30f)]===0x0){toastr['warning'](_0x4ef3cd(0x253),_0x4ef3cd(0x2a3)),_0x49801d[_0x4ef3cd(0x17b)]=_0x4ef3cd(0x241);return;}_0x49801d['textContent']=_0x4ef3cd(0x188)+_0x146571[_0x4ef3cd(0x30f)]+_0x4ef3cd(0x331),toastr[_0x4ef3cd(0x1d7)](_0x4ef3cd(0x188)+_0x146571[_0x4ef3cd(0x30f)]+'\x20条消息,开始凝识...',_0x4ef3cd(0x2a3));const _0x261252=await _0x4b5037[_0x4ef3cd(0x2e1)](_0x146571,log,_0x3095de);if(_0x261252[_0x4ef3cd(0x336)]){toastr[_0x4ef3cd(0x336)](_0x4ef3cd(0x1ae)+_0x261252[_0x4ef3cd(0x310)]+_0x4ef3cd(0x357),_0x4ef3cd(0x1ff));const _0x4b1d51=_0x3095de[_0x4ef3cd(0x343)]===0x0?getContext()[_0x4ef3cd(0x216)][_0x4ef3cd(0x30f)]:_0x3095de[_0x4ef3cd(0x343)];_0x49801d[_0x4ef3cd(0x17b)]='聊天记录从第\x20'+_0x3095de[_0x4ef3cd(0x2f0)]+_0x4ef3cd(0x176)+_0x4b1d51+'\x20楼已成功凝识,新增\x20'+_0x261252[_0x4ef3cd(0x310)]+_0x4ef3cd(0x357);}else throw new Error(_0x261252[_0x4ef3cd(0x2f5)]||'未知错误');}catch(_0x317456){console['error'](_0x4ef3cd(0x1e6),_0x317456),toastr['error'](_0x4ef3cd(0x1af)+_0x317456[_0x4ef3cd(0x2fd)],_0x4ef3cd(0x1e2)),_0x49801d[_0x4ef3cd(0x17b)]=_0x4ef3cd(0x1af)+_0x317456[_0x4ef3cd(0x2fd)];}finally{await updatePanelStatus();}}async function loadWorldbookList(){const _0x4c51a6=_0x15063a,_0x45f9f1=document[_0x4c51a6(0x220)](_0x4c51a6(0x175)),_0x4cc109=document[_0x4c51a6(0x220)](_0x4c51a6(0x230));if(!_0x45f9f1)return;try{log('正在获取可用书库列表...',_0x4c51a6(0x1d7));const _0x2d93a4=await _0x337832[_0x4c51a6(0x1a8)]();window[_0x4c51a6(0x2d5)]=_0x2d93a4,updateWorldbookOptions(_0x45f9f1,'',_0x2d93a4);if(_0x4cc109){const _0x3fe15a=debounce(_0x4d94be=>{updateWorldbookOptions(_0x45f9f1,_0x4d94be,_0x2d93a4);},0x12c);_0x4cc109[_0x4c51a6(0x23f)]('input',_0x38d7c4=>{const _0x1fa619=_0x4c51a6;_0x3fe15a(_0x38d7c4['target'][_0x1fa619(0x314)]);});}log(_0x4c51a6(0x286)+_0x2d93a4[_0x4c51a6(0x30f)]+'\x20个书库。',_0x4c51a6(0x336));}catch(_0x2af16a){console[_0x4c51a6(0x2f5)]('[翰林院-枢纽]\x20加载书库列表失败:',_0x2af16a),log(_0x4c51a6(0x348)+_0x2af16a[_0x4c51a6(0x2fd)],_0x4c51a6(0x2f5)),_0x45f9f1&&(_0x45f9f1['innerHTML']='加载失败');}}function updateWorldbookOptions(_0x2ee94b,_0x20f70e,_0x70e4d5){const _0x9be578=_0x15063a,_0x539c9e=filterWorldbooks(_0x20f70e,_0x70e4d5),_0x33a5ee=_0x2ee94b[_0x9be578(0x314)];_0x2ee94b['innerHTML']=_0x9be578(0x200);if(_0x539c9e[_0x9be578(0x30f)]===0x0){_0x2ee94b['innerHTML']=_0x20f70e['trim']()?_0x9be578(0x32e):_0x9be578(0x1db);return;}_0x539c9e[_0x9be578(0x19b)](_0x58e077=>{const _0x55c463=_0x9be578,_0x7a16ab=document[_0x55c463(0x24a)](_0x55c463(0x1d4));_0x7a16ab[_0x55c463(0x314)]=_0x58e077,_0x7a16ab[_0x55c463(0x17b)]=_0x58e077,_0x2ee94b[_0x55c463(0x24b)](_0x7a16ab);}),_0x33a5ee&&_0x539c9e[_0x9be578(0x26e)](_0x33a5ee)&&(_0x2ee94b['value']=_0x33a5ee);}async function handleWorldbookSelectionChange(){const _0x43169b=_0x15063a,_0x5b15d4=document[_0x43169b(0x220)]('hly-hist-select-library'),_0x124182=document[_0x43169b(0x220)]('hly-hist-entry-multiselect-btn'),_0x4df83c=document['getElementById']('hly-hist-entry-multiselect-options'),_0x43860a=document[_0x43169b(0x220)](_0x43169b(0x34e)),_0x1e52d6=_0x5b15d4[_0x43169b(0x314)];_0x124182[_0x43169b(0x2a6)]=!![],_0x124182[_0x43169b(0x267)]('span')['textContent']=_0x43169b(0x21b),_0x4df83c['innerHTML']='',_0x4df83c[_0x43169b(0x2f6)][_0x43169b(0x208)]=_0x43169b(0x222);_0x43860a&&(_0x43860a[_0x43169b(0x314)]='');if(!_0x1e52d6){_0x124182[_0x43169b(0x267)]('span')[_0x43169b(0x17b)]=_0x43169b(0x361);return;}try{log(_0x43169b(0x2e4)+_0x1e52d6+_0x43169b(0x1df),_0x43169b(0x1d7));const _0x26f88c=await _0x337832[_0x43169b(0x2ad)](_0x1e52d6);if(_0x26f88c[_0x43169b(0x30f)]===0x0){_0x124182[_0x43169b(0x267)]('span')[_0x43169b(0x17b)]=_0x43169b(0x215);return;}window[_0x43169b(0x192)]=_0x26f88c,updateEntryOptions('',_0x26f88c);if(_0x43860a){_0x43860a[_0x43169b(0x27d)](_0x43169b(0x345),_0x43860a[_0x43169b(0x319)]);const _0x42d9a8=debounce(_0x22f83e=>{updateEntryOptions(_0x22f83e,_0x26f88c);},0x12c);_0x43860a[_0x43169b(0x319)]=_0x32b3ef=>{const _0x419901=_0x43169b;_0x42d9a8(_0x32b3ef['target'][_0x419901(0x314)]);},_0x43860a[_0x43169b(0x23f)](_0x43169b(0x345),_0x43860a[_0x43169b(0x319)]);}log(_0x43169b(0x286)+_0x26f88c[_0x43169b(0x30f)]+'\x20个条目。',_0x43169b(0x336));}catch(_0x347fa0){console['error']('[翰林院-枢纽]\x20加载《'+_0x1e52d6+'》的条目失败:',_0x347fa0),log(_0x43169b(0x1f2)+_0x347fa0[_0x43169b(0x2fd)],_0x43169b(0x2f5)),_0x124182[_0x43169b(0x267)](_0x43169b(0x191))[_0x43169b(0x17b)]=_0x43169b(0x17c);}finally{_0x124182[_0x43169b(0x2a6)]=![];}}function updateEntryOptions(_0xc1a57b,_0x1eb300){const _0x563b8f=_0x15063a,_0x3c1a75=document[_0x563b8f(0x220)](_0x563b8f(0x2da)),_0x123a23=document[_0x563b8f(0x220)](_0x563b8f(0x31d)),_0xf3a4fd=filterWorldbookEntries(_0xc1a57b,_0x1eb300);_0x3c1a75[_0x563b8f(0x2e0)]='';const _0x4a13d9='\x0a\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全选/全不选\x0a\x20\x20\x20\x20\x20\x20\x20\x20';_0x3c1a75['insertAdjacentHTML'](_0x563b8f(0x1c7),_0x4a13d9);if(_0xf3a4fd['length']===0x0){const _0x2d7b56=_0x563b8f(0x37c);_0x3c1a75[_0x563b8f(0x37a)](_0x563b8f(0x1c7),_0x2d7b56),_0x123a23[_0x563b8f(0x267)]('span')[_0x563b8f(0x17b)]=_0x563b8f(0x324);return;}_0xf3a4fd[_0x563b8f(0x19b)](_0x4c6560=>{const _0x2db439=_0x563b8f,_0x41d785=_0xc1a57b?highlightSearchMatch(_0x4c6560['comment'],_0xc1a57b):_0x4c6560[_0x2db439(0x35f)],_0x3e091c=_0x2db439(0x21f)+_0x4c6560[_0x2db439(0x35f)]+_0x2db439(0x370)+_0x4c6560['key']+_0x2db439(0x2f7)+_0x4c6560['key']+'\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+_0x41d785+_0x2db439(0x364);_0x3c1a75['insertAdjacentHTML']('beforeend',_0x3e091c);}),_0x123a23['querySelector'](_0x563b8f(0x191))['textContent']=_0x563b8f(0x1ad)+_0xf3a4fd[_0x563b8f(0x30f)]+_0x563b8f(0x36c);}async function startHistoriography(){const _0x31d6a5=_0x15063a,_0x279987=document['getElementById'](_0x31d6a5(0x175))['value'],_0x46578b=document[_0x31d6a5(0x220)](_0x31d6a5(0x2da)),_0xf67df5=document[_0x31d6a5(0x220)](_0x31d6a5(0x33c)),_0x47c686=Array[_0x31d6a5(0x173)](_0x46578b[_0x31d6a5(0x1f3)](_0x31d6a5(0x28b)))['map'](_0x2b3732=>_0x2b3732[_0x31d6a5(0x314)]);if(!_0x279987||_0x47c686[_0x31d6a5(0x30f)]===0x0){toastr['warning'](_0x31d6a5(0x309),_0x31d6a5(0x346));return;}_0xf67df5[_0x31d6a5(0x17b)]=_0x31d6a5(0x27a)+_0x279987+'》中的\x20'+_0x47c686['length']+_0x31d6a5(0x2b2),toastr[_0x31d6a5(0x1d7)](_0x31d6a5(0x298),'圣旨'),log(_0x31d6a5(0x284)+_0x279987+'》中的\x20'+_0x47c686[_0x31d6a5(0x30f)]+_0x31d6a5(0x23d),'info');try{const _0x2cff07=await _0x337832[_0x31d6a5(0x1bc)](_0x279987,_0x47c686);_0xf67df5[_0x31d6a5(0x17b)]=_0x2cff07[_0x31d6a5(0x341)],_0x2cff07['success']?toastr[_0x31d6a5(0x336)]('批量编纂任务已完成。','大功告成'):toastr[_0x31d6a5(0x181)]('批量编纂任务已完成,但有部分错误。','圣谕'),log('对《'+_0x279987+_0x31d6a5(0x22b)+_0x2cff07['totalSuccess']+_0x31d6a5(0x1cb)+_0x2cff07[_0x31d6a5(0x31b)],_0x31d6a5(0x336));}catch(_0x476c6c){console[_0x31d6a5(0x2f5)](_0x31d6a5(0x214),_0x476c6c),toastr[_0x31d6a5(0x2f5)]('编纂失败:\x20'+_0x476c6c[_0x31d6a5(0x2fd)],_0x31d6a5(0x1e2)),_0xf67df5[_0x31d6a5(0x17b)]=_0x31d6a5(0x17d)+_0x476c6c['message'];}finally{await updatePanelStatus();}}function _0x1493(_0x50dca1,_0x4f35f8){const _0x46629b=_0x4662();return _0x1493=function(_0x1493ad,_0x1fef35){_0x1493ad=_0x1493ad-0x168;let _0x2d261c=_0x46629b[_0x1493ad];return _0x2d261c;},_0x1493(_0x50dca1,_0x4f35f8);}async function showStats(){const _0x3bc917=_0x15063a;try{log('用户请求查看宝库状态。','info'),toastr[_0x3bc917(0x1d7)]('正在查询宝库状态...','圣旨');const _0x3e15c9=await _0x4b5037[_0x3bc917(0x2e3)](),_0x5185ae=await _0x4b5037['getCollectionId'](),_0x420f63=_0x4b5037['getSettings'](),_0x379047=_0x3bc917(0x16c)+_0x5185ae+_0x3bc917(0x1a0)+_0x3e15c9+'\x0a--------------------\x0aAPI端点:\x20'+_0x420f63['retrieval']['apiEndpoint']+_0x3bc917(0x287)+_0x420f63[_0x3bc917(0x1e8)][_0x3bc917(0x2eb)]+_0x3bc917(0x311);toastr[_0x3bc917(0x1d7)](_0x379047,_0x3bc917(0x18d),{'timeOut':0x3a98,'extendedTimeOut':0x1388,'tapToDismiss':!![],'closeButton':!![]}),log('查看宝库状态成功:集合ID='+_0x5185ae+_0x3bc917(0x333)+_0x3e15c9,'success');}catch(_0x407c45){console['error'](_0x3bc917(0x32f),_0x407c45),toastr[_0x3bc917(0x2f5)](_0x3bc917(0x236)+_0x407c45[_0x3bc917(0x2fd)],'严重错误'),log(_0x3bc917(0x236)+_0x407c45[_0x3bc917(0x2fd)],_0x3bc917(0x2f5));}}function showRulesModal(_0x5ac04c){const _0x1b56d3=_0x15063a,_0x1ba971=_0x4b5037[_0x1b56d3(0x2d1)](),_0x2d354f=_0x1ba971[_0x5ac04c];if(!_0x2d354f){console[_0x1b56d3(0x2f5)](_0x1b56d3(0x1f9)+_0x5ac04c+'\x22\x20的配置项。');return;}const _0x28773e=_0x5ac04c==='condensation'?_0x1b56d3(0x29d):'编辑检索内容排除规则',_0x1cdd83=_0x2d354f[_0x1b56d3(0x2f1)]||[],_0xfb0978=(_0x4e74f9={'start':'','end':''},_0x559375)=>_0x1b56d3(0x37d)+_0x559375+_0x1b56d3(0x1b3)+(_0x4e74f9[_0x1b56d3(0x2f0)]||'')['replace'](/"/g,'\x22')+'\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',_0x29cab1=_0x1cdd83[_0x1b56d3(0x2a1)](_0xfb0978)[_0x1b56d3(0x36d)](''),_0x59ee92=_0x5ac04c==='queryPreprocessing'?_0x1b56d3(0x19c)+(_0x2d354f[_0x1b56d3(0x1cc)]?_0x1b56d3(0x2d8):'')+_0x1b56d3(0x213)+(_0x2d354f[_0x1b56d3(0x1cc)]?'block':_0x1b56d3(0x222))+_0x1b56d3(0x1ee)+(_0x2d354f[_0x1b56d3(0x35b)]||'')+_0x1b56d3(0x379):'',_0x134b96=_0x1b56d3(0x1bf)+_0x59ee92+_0x1b56d3(0x282)+(_0x29cab1[_0x1b56d3(0x30f)]>0x0?_0x29cab1:'暂无规则

')+_0x1b56d3(0x227);showHtmlModal(_0x28773e,_0x134b96,{'okText':_0x1b56d3(0x350),'onOk':_0x1a19e5=>{const _0x5f015d=_0x1b56d3,_0x2f9e25=[];_0x1a19e5['find'](_0x5f015d(0x242))[_0x5f015d(0x29a)](function(){const _0x4f32c5=_0x5f015d,_0x595b5b=$(this)[_0x4f32c5(0x210)]('input')['eq'](0x0)[_0x4f32c5(0x239)]()[_0x4f32c5(0x16f)](),_0x4b1b72=$(this)[_0x4f32c5(0x210)](_0x4f32c5(0x345))['eq'](0x1)[_0x4f32c5(0x239)]()[_0x4f32c5(0x16f)]();_0x595b5b&&_0x2f9e25['push']({'start':_0x595b5b,'end':_0x4b1b72});});const _0x17a36d={..._0x2d354f,'exclusionRules':_0x2f9e25};_0x5ac04c===_0x5f015d(0x2d4)&&(_0x17a36d[_0x5f015d(0x1cc)]=_0x1a19e5[_0x5f015d(0x210)](_0x5f015d(0x1e7))['is'](':checked'),_0x17a36d[_0x5f015d(0x35b)]=_0x1a19e5['find'](_0x5f015d(0x332))[_0x5f015d(0x239)]()),updateAndSaveSetting(_0x5ac04c,_0x17a36d),toastr[_0x5f015d(0x336)]('规则已保存。',_0x5f015d(0x369));},'onShow':_0x447a82=>{const _0x2323b6=_0x1b56d3,_0x239bda=_0x447a82[_0x2323b6(0x210)](_0x2323b6(0x1ab));_0x447a82[_0x2323b6(0x210)](_0x2323b6(0x306))['on'](_0x2323b6(0x1c6),()=>{const _0x3c90e9=_0x2323b6,_0x21429b=_0x239bda[_0x3c90e9(0x1c9)](_0x3c90e9(0x242))[_0x3c90e9(0x30f)],_0x2d800d=_0xfb0978(undefined,_0x21429b);_0x239bda[_0x3c90e9(0x210)]('p')['length']>0x0?_0x239bda[_0x3c90e9(0x289)](_0x2d800d):_0x239bda[_0x3c90e9(0x33d)](_0x2d800d);}),_0x239bda['on'](_0x2323b6(0x1c6),_0x2323b6(0x185),function(){const _0x2a3cc5=_0x2323b6;$(this)[_0x2a3cc5(0x247)]('.hly-exclusion-rule-row')['remove'](),_0x239bda[_0x2a3cc5(0x1c9)]()[_0x2a3cc5(0x30f)]===0x0&&_0x239bda[_0x2a3cc5(0x289)]('暂无规则

');});if(_0x5ac04c===_0x2323b6(0x2d4)){const _0x567434=_0x447a82[_0x2323b6(0x210)](_0x2323b6(0x1e7)),_0x4c513d=_0x447a82['find'](_0x2323b6(0x259));_0x567434['on'](_0x2323b6(0x1c5),()=>{const _0xd1e5f=_0x2323b6;_0x4c513d[_0xd1e5f(0x1ce)](_0xd1e5f(0x208),_0x567434['is'](_0xd1e5f(0x368))?_0xd1e5f(0x2b5):'none');});}}});}function previewCondensation(){const _0x4be9d3=_0x15063a,_0xc4e9f2=document[_0x4be9d3(0x220)]('hly-condensation-results');try{const _0x3c3bb7=_0x4b5037[_0x4be9d3(0x2d1)](),_0x2f81da=_0x3c3bb7[_0x4be9d3(0x261)][_0x4be9d3(0x2f1)]||[],_0x4f4139={'user':document[_0x4be9d3(0x220)](_0x4be9d3(0x24f))[_0x4be9d3(0x2d8)],'ai':document[_0x4be9d3(0x220)](_0x4be9d3(0x1d0))[_0x4be9d3(0x2d8)]},_0x3f0e53=document['getElementById'](_0x4be9d3(0x2e5))[_0x4be9d3(0x2d8)],_0x4acdc1=_0x3f0e53?document[_0x4be9d3(0x220)](_0x4be9d3(0x2b0))[_0x4be9d3(0x314)][_0x4be9d3(0x36a)](',')[_0x4be9d3(0x2a1)](_0x272004=>_0x272004[_0x4be9d3(0x16f)]())[_0x4be9d3(0x19a)](Boolean):[],_0x2f6263=_0x4b5037['getMessagesForCondensation'](_0x4f4139);if(!_0x2f6263||_0x2f6263['length']===0x0){_0xc4e9f2['textContent']='根据当前勾选条件,未找到符合的消息可供预览。',toastr['warning'](_0x4be9d3(0x241),_0x4be9d3(0x2a3));return;}const _0xf6bd62=getContext()[_0x4be9d3(0x216)],_0x14410a=_0x2f6263['map']((_0x3b618f,_0x151c8f)=>{const _0x2ce44a=_0x4be9d3;let _0x1458d1;if(_0x3b618f['is_user'])_0x1458d1=_0x3b618f['mes'];else{if(_0x3f0e53&&_0x4acdc1['length']>0x0){const _0x4b2951=extractBlocksByTags(_0x3b618f[_0x2ce44a(0x2c6)],_0x4acdc1);_0x4b2951['length']>0x0?_0x1458d1=_0x4b2951[_0x2ce44a(0x36d)]('\x0a\x0a'):_0x1458d1=_0x3b618f['mes'];}else _0x1458d1=_0x3b618f[_0x2ce44a(0x2c6)];_0x1458d1=applyExclusionRules(_0x1458d1,_0x2f81da);}const _0x4eb868=_0xf6bd62[_0x2ce44a(0x240)](_0x89d390=>_0x89d390===_0x3b618f),_0x50aff7=_0x4eb868!==-0x1?_0x4eb868+0x1:-0x1;return{'id':_0x2ce44a(0x1de)+_0x151c8f,'name':_0x3b618f[_0x2ce44a(0x265)],'content':_0x1458d1[_0x2ce44a(0x16f)](),'floor':_0x50aff7,'is_user':_0x3b618f[_0x2ce44a(0x18c)],'send_date':_0x3b618f[_0x2ce44a(0x1b5)]};})[_0x4be9d3(0x19a)](_0x212c38=>_0x212c38['content']);if(_0x14410a[_0x4be9d3(0x30f)]===0x0){_0xc4e9f2[_0x4be9d3(0x17b)]=_0x4be9d3(0x1f6),toastr['warning'](_0x4be9d3(0x1f6),_0x4be9d3(0x2a3));return;}const _0x58a465=_0x14410a[_0x4be9d3(0x2a1)]((_0x1bf1f3,_0x87ec56)=>_0x4be9d3(0x326)+_0x1bf1f3['id']+_0x4be9d3(0x1f8)+_0x1bf1f3['floor']+_0x4be9d3(0x264)+_0x1bf1f3[_0x4be9d3(0x265)]+']\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\x20\x20\x20\x20\x20\x20'+_0x1bf1f3[_0x4be9d3(0x341)]+_0x4be9d3(0x20f)+_0x1bf1f3['id']+_0x4be9d3(0x296))[_0x4be9d3(0x36d)]('');showHtmlModal('预览并编辑凝识内容',_0x4be9d3(0x1a6)+_0x58a465+'',{'okText':'确认并更新预览','onOk':_0xc674c5=>{const _0x1f96ed=_0x4be9d3,_0x1c1501=[];_0xc674c5[_0x1f96ed(0x210)](_0x1f96ed(0x1b8))[_0x1f96ed(0x29a)](function(){const _0x495a73=_0x1f96ed,_0x41d3ce=$(this)[_0x495a73(0x210)](_0x495a73(0x1da)),_0x234872=_0x41d3ce[_0x495a73(0x239)]();_0x234872[_0x495a73(0x16f)]()&&_0x1c1501['push']({'mes':_0x234872,'is_user':_0x41d3ce['data'](_0x495a73(0x34a)),'send_date':_0x41d3ce[_0x495a73(0x27e)]('send-date'),'floor':_0x41d3ce['data'](_0x495a73(0x2d0))});}),_0xc4e9f2['dataset']['finalMessages']=JSON[_0x1f96ed(0x187)](_0x1c1501);const _0x1c521b=document[_0x1f96ed(0x220)]('hly-layer-start')[_0x1f96ed(0x314)],_0x544c81=document[_0x1f96ed(0x220)](_0x1f96ed(0x2ec))[_0x1f96ed(0x314)];_0xc4e9f2[_0x1f96ed(0x17b)]=_0x1f96ed(0x34d)+_0x1c521b+_0x1f96ed(0x327)+_0x544c81+_0x1f96ed(0x2f9)+_0x1c1501['length']+_0x1f96ed(0x30d),toastr['success'](_0x1f96ed(0x178),'圣旨已达');}}),$(_0x4be9d3(0x1f5))['on'](_0x4be9d3(0x1c6),function(_0x323c1c){const _0x1873dd=_0x4be9d3;_0x323c1c[_0x1873dd(0x28f)]();const _0x317d89=$(this)['data'](_0x1873dd(0x2a7));$('#'+_0x317d89)[_0x1873dd(0x371)]();});}catch(_0x10886b){console[_0x4be9d3(0x2f5)](_0x4be9d3(0x199),_0x10886b),_0xc4e9f2['textContent']='预览失败:\x20'+_0x10886b[_0x4be9d3(0x2fd)],toastr[_0x4be9d3(0x2f5)]('预览失败:\x20'+_0x10886b[_0x4be9d3(0x2fd)],_0x4be9d3(0x1e2));}}function log(_0x319dac,_0x203739='info'){const _0x42c98b=_0x15063a,_0x4f5728=document[_0x42c98b(0x220)](_0x42c98b(0x2c3));if(!_0x4f5728)return;const _0x55a16a=document['createElement']('p'),_0x2fd4b8=new Date()[_0x42c98b(0x34f)]();let _0x3c0197='fa-circle-info',_0x257e7d='log-info';switch(_0x203739){case _0x42c98b(0x336):_0x3c0197=_0x42c98b(0x1d2),_0x257e7d=_0x42c98b(0x1c2);break;case _0x42c98b(0x2f5):_0x3c0197=_0x42c98b(0x302),_0x257e7d=_0x42c98b(0x20b);break;case _0x42c98b(0x195):_0x3c0197=_0x42c98b(0x35c),_0x257e7d=_0x42c98b(0x30a);break;}_0x55a16a[_0x42c98b(0x366)]=_0x42c98b(0x281)+_0x257e7d,_0x55a16a[_0x42c98b(0x2e0)]=_0x42c98b(0x303)+_0x3c0197+_0x42c98b(0x1fe)+_0x2fd4b8+']\x20'+_0x319dac;const _0x13f854=_0x4f5728[_0x42c98b(0x267)](_0x42c98b(0x31f));_0x13f854&&_0x13f854[_0x42c98b(0x371)](),_0x4f5728[_0x42c98b(0x24b)](_0x55a16a),_0x4f5728[_0x42c98b(0x1a2)]=_0x4f5728['scrollHeight'];}async function ingestManualText(){const _0x360c14=_0x15063a,_0x5b5301=document[_0x360c14(0x220)]('hly-manual-text'),_0x286211=_0x5b5301['value']['trim']();if(!_0x286211){toastr['warning'](_0x360c14(0x274),_0x360c14(0x2a3)),log('用户尝试录入空文本。',_0x360c14(0x195));return;}log(_0x360c14(0x21a)+_0x286211[_0x360c14(0x30f)],'info'),toastr[_0x360c14(0x1d7)](_0x360c14(0x356),'圣旨');try{const _0xe4852b=await _0x4b5037['ingestTextToHanlinyuan'](_0x286211,_0x360c14(0x2de),{'sourceName':_0x360c14(0x2fb)});if(_0xe4852b[_0x360c14(0x336)])toastr[_0x360c14(0x336)](_0x360c14(0x2b3)+_0xe4852b['count']+_0x360c14(0x357),'大功告成'),log('手动录入成功,新增\x20'+_0xe4852b[_0x360c14(0x310)]+'\x20条忆识。',_0x360c14(0x336)),_0x5b5301['value']='';else throw new Error(_0xe4852b[_0x360c14(0x2f5)]||_0x360c14(0x297));}catch(_0x36bcc4){console[_0x360c14(0x2f5)](_0x360c14(0x260),_0x36bcc4),toastr[_0x360c14(0x2f5)]('文书录入失败:\x20'+_0x36bcc4[_0x360c14(0x2fd)],_0x360c14(0x1e2)),log(_0x360c14(0x2ab)+_0x36bcc4['message'],_0x360c14(0x2f5));}finally{await updatePanelStatus();}} diff --git a/ui/historiography-bindings.js b/ui/historiography-bindings.js index 9d9da5a..ae4b2b7 100644 --- a/ui/historiography-bindings.js +++ b/ui/historiography-bindings.js @@ -10,7 +10,8 @@ import { applyExclusionRules, extractBlocksByTags } from '../core/utils/rag-tag- import { getAvailableWorldbooks, getLoresForWorldbook, executeManualSummary, executeRefinement, - executeExpedition, stopExpedition + executeExpedition, stopExpedition, + archiveCurrentLedger, getArchivedLedgers, restoreArchivedLedger } from "../core/historiographer.js"; import { getNgmsApiSettings, testNgmsApiConnection, fetchNgmsModels } from "../core/api/Ngms_api.js"; @@ -265,6 +266,51 @@ export function bindHistoriographyEvents() { updateExpeditionButtonUI('idle'); + // ========== 📚 史册归档与回溯 绑定 ========== + const archiveCurrentBtn = document.getElementById("amily2_mhb_archive_current"); + const archiveSelector = document.getElementById("amily2_mhb_archive_selector"); + const refreshArchivesBtn = document.getElementById("amily2_mhb_refresh_archives"); + const restoreArchiveBtn = document.getElementById("amily2_mhb_restore_archive"); + + const updateArchiveList = async () => { + archiveSelector.innerHTML = ''; + const archives = await getArchivedLedgers(); + archiveSelector.innerHTML = ""; // 清空 + if (archives && archives.length > 0) { + archives.forEach((arch) => { + const option = document.createElement("option"); + option.value = arch.key; + option.textContent = arch.comment; + archiveSelector.appendChild(option); + }); + } else { + archiveSelector.innerHTML = ''; + } + }; + + archiveCurrentBtn.addEventListener("click", async () => { + if (confirm("确定要归档当前的【对话流水总帐】并停用它吗?\n这将允许您开始一段全新的历史记录。")) { + const success = await archiveCurrentLedger(); + if (success) { + updateArchiveList(); // 归档成功后刷新列表 + } + } + }); + + refreshArchivesBtn.addEventListener("click", updateArchiveList); + + restoreArchiveBtn.addEventListener("click", async () => { + const selectedKey = archiveSelector.value; + if (!selectedKey) { + toastr.warning("请先选择一个要回溯的史册!", "圣谕不明"); + return; + } + if (confirm("确定要回溯选中的史册吗?\n当前的活跃史册(如果有)将被自动归档。")) { + await restoreArchivedLedger(selectedKey); + updateArchiveList(); // 回溯后刷新列表 + } + }); + // ========== 💎 宏史卷 (史册精炼) 绑定 ========== const largeWbSelector = document.getElementById( "amily2_mhb_large_worldbook_selector", diff --git a/ui/page-window.js b/ui/page-window.js index 4dabebc..a831a1f 100644 --- a/ui/page-window.js +++ b/ui/page-window.js @@ -120,12 +120,22 @@ export function showHtmlModal(title, htmlContent, options = {}) { } +function escapeHtml(text) { + if (!text) return ''; + return text + .replace(/&/g, "&") + .replace(//g, ">") + .replace(/"/g, """) + .replace(/'/g, "'"); +} + export function showSummaryModal(summaryText, callbacks) { const { onConfirm, onRegenerate, onCancel } = callbacks; const modalHtml = `
- +
`; diff --git a/ui/table-bindings.js b/ui/table-bindings.js index db445f3..c3487ef 100644 --- a/ui/table-bindings.js +++ b/ui/table-bindings.js @@ -1 +1,2113 @@ -const _0x3c5d74=_0x405f;(function(_0x2a7ce6,_0x2a06cf){const _0x5d0d8f=_0x405f,_0x2f0f24=_0x2a7ce6();while(!![]){try{const _0x271acd=-parseInt(_0x5d0d8f(0x17e))/0x1+-parseInt(_0x5d0d8f(0x2a0))/0x2*(parseInt(_0x5d0d8f(0x125))/0x3)+-parseInt(_0x5d0d8f(0x2dc))/0x4*(-parseInt(_0x5d0d8f(0x205))/0x5)+-parseInt(_0x5d0d8f(0x1ea))/0x6*(parseInt(_0x5d0d8f(0x295))/0x7)+parseInt(_0x5d0d8f(0x11e))/0x8+-parseInt(_0x5d0d8f(0x2ae))/0x9*(parseInt(_0x5d0d8f(0x12a))/0xa)+parseInt(_0x5d0d8f(0x285))/0xb*(parseInt(_0x5d0d8f(0x214))/0xc);if(_0x271acd===_0x2a06cf)break;else _0x2f0f24['push'](_0x2f0f24['shift']());}catch(_0x8d7def){_0x2f0f24['push'](_0x2f0f24['shift']());}}}(_0x4721,0x87cac));import*as _0x234bb0 from'../core/table-system/manager.js';import{log}from'../core/table-system/logger.js';import{extension_settings,getContext}from'/scripts/extensions.js';import{extensionName}from'../utils/settings.js';import{updateOrInsertTableInChat}from'./message-table-renderer.js';import{saveSettingsDebounced}from'/script.js';import{startBatchFilling}from'../core/table-system/batch-filler.js';import{showHtmlModal}from'./page-window.js';import{DEFAULT_AI_RULE_TEMPLATE,DEFAULT_AI_FLOW_TEMPLATE}from'../core/table-system/settings.js';import{world_names,loadWorldInfo}from'/scripts/world-info.js';import{safeCharLorebooks,safeLorebookEntries}from'../core/tavernhelper-compatibility.js';import{characters,this_chid,eventSource,event_types}from'/script.js';import{fetchNccsModels,testNccsApiConnection}from'../core/api/NccsApi.js';const isTouchDevice=()=>window[_0x3c5d74(0x1eb)](_0x3c5d74(0x129))[_0x3c5d74(0x19f)],getAllTablesContainer=()=>document['getElementById'](_0x3c5d74(0x26a));let isResizing=![];function toggleRowContextMenu(_0x17cb0c){const _0x51df97=_0x3c5d74;_0x17cb0c[_0x51df97(0x2d2)](),_0x17cb0c[_0x51df97(0x1cf)]();const _0x1b75e5=_0x17cb0c[_0x51df97(0x1c6)][_0x51df97(0x1ad)](_0x51df97(0x1f0));if(!_0x1b75e5)return;const _0x3dc276=_0x1b75e5[_0x51df97(0x1ad)](_0x51df97(0x11f));if(!_0x3dc276)return;const _0x512cdf=_0x1b75e5['classList'][_0x51df97(0x255)](_0x51df97(0x1d3));document['querySelectorAll']('.amily2-menu-open')[_0x51df97(0x1f4)](_0x20b60b=>{const _0x208fe2=_0x51df97;if(_0x20b60b!==_0x1b75e5){_0x20b60b[_0x208fe2(0x20b)][_0x208fe2(0x180)]('amily2-menu-open');const _0xd3e77d=_0x20b60b[_0x208fe2(0x1ad)](_0x208fe2(0x11f));_0xd3e77d&&(_0xd3e77d[_0x208fe2(0x1b4)][_0x208fe2(0x21e)]=_0x208fe2(0x2cb),_0xd3e77d[_0x208fe2(0x1b4)][_0x208fe2(0x105)]='',_0xd3e77d[_0x208fe2(0x1b4)][_0x208fe2(0x128)]='');}}),_0x1b75e5['classList'][_0x51df97(0x1a8)]('amily2-menu-open');_0x1b75e5[_0x51df97(0x20b)]['contains']('amily2-menu-open')?(_0x3dc276[_0x51df97(0x1b4)][_0x51df97(0x21e)]='visible',_0x3dc276[_0x51df97(0x1b4)][_0x51df97(0x128)]='relative',_0x3dc276[_0x51df97(0x1b4)][_0x51df97(0x105)]='10'):(_0x3dc276[_0x51df97(0x1b4)][_0x51df97(0x21e)]=_0x51df97(0x2cb),_0x3dc276[_0x51df97(0x1b4)][_0x51df97(0x128)]='',_0x3dc276['style']['zIndex']='');const _0x2344d8=_0x5b343e=>{const _0x52b85e=_0x51df97;!_0x1b75e5[_0x52b85e(0x255)](_0x5b343e[_0x52b85e(0x1c6)])&&(_0x1b75e5['classList'][_0x52b85e(0x180)](_0x52b85e(0x1d3)),_0x3dc276[_0x52b85e(0x1b4)]['overflowX']=_0x52b85e(0x2cb),_0x3dc276[_0x52b85e(0x1b4)][_0x52b85e(0x128)]='',_0x3dc276['style']['zIndex']='',document[_0x52b85e(0x11b)]('click',_0x2344d8,!![]));};_0x1b75e5[_0x51df97(0x20b)][_0x51df97(0x255)](_0x51df97(0x1d3))&&setTimeout(()=>{const _0x5db04d=_0x51df97;document[_0x5db04d(0x1a4)](_0x5db04d(0x28c),_0x2344d8,!![]);},0x0);}function _0x4721(){const _0x43a34a=['nccsMaxTokens','info','#exclusion-rules-list','className','Nccs\x20API模式已切换为:\x20','center','render_on_every_message',']\x20刷新世界书设置时出错:','cell-highlight','scrollLeft','render-on-every-message-toggle','向右移动','Nccs\x20API连接测试失败,请检查配置','checkbox','then','zIndex','addTable','#sinan-','querySelectorAll','请输入一个有效的字数限制(大于等于0)。','floor-end-input','manual','分步填表','获取模型失败:','起始楼层不能大于结束楼层。','none','\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','injection','

加载条目中...

','\x20测试连接','moveColumn','Nccs\x20API连接测试出错:','规则提示词已恢复为默认。','ai-rule-template-save-btn','amily2-table-wrapper','-tab','touches','removeEventListener','字数限制为0表示不设置规则。','extensionSettings','3959840XMZSPE','.amily2-table-wrapper','value','rename','','true','context-reading-value','45oXTciM','select','原始填表','position','(pointer:\x20coarse)','393520yShnkz','exportPresetFull','focus','batchEventBound','cellIndex','limit','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20所选世界书中没有条目。

','text_pole','table_worldbook_select_wrapper','nccs-temperature','htmlFor','\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\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','add-right','pending-deletion','connectionManager','stringify','floorEventBound','renameTable','importGlobalPreset','优化中填表','table_selected_worldbooks','col-index','add-row-below-btn','找不到聊天内表格相关的开关,绑定失败。','rule_delete','在右加列','cursor','nccs-api-mode','ai-rule-template-restore-btn','primary','colIndex','active','ai-flow-template-restore-btn','获取角色世界书失败。

','请输入新表格的名称:',']\x20检测到角色/聊天切换,正在刷新表格系统UI和世界书设置...','charLimitRules','all','restoreRow','end','move-down','nccsModel','未知列\x20(','amily2_memorisation_forms_panel','编辑列名','span','fill-current-floor-btn','warn','Nccs\x20API连接测试成功!','nccsApiUrl','\x20获取中...','Nccs\x20API\x20','.popup-button-ok','append','main-api','createTBody','context-reading-slider','profiles','openai_test','move-row-up-btn','updateTableRules','#rule-note','nccsTavernProfile','label','批量填表-规则提示词已保存。','100%','setAttribute','”\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\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\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(0为禁用)\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\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','blur','未找到可用的SillyTavern配置文件','nccs-test-connection','table-independent-rules-container','598864kDpklL','ai-flow-template-save-btn','remove','table-injection-depth','table_injection_enabled','\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\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取消\x0a\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','parse','nccs-api-config','持续渲染最新消息功能已','disabled','\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\x20\x20\x20\x20\x20\x20\x20\x20仅提取指定XML标签的内容,例如填“content”,即提取...中的内容。\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\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','clearGlobalPreset','\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编辑\x20“','--\x20选择要添加规则的列\x20--','optimized','show_table_in_chat','getElementById','tab','index-col','mouseup','fa-pen','addColumn','charLimitRule',':\x20不超过\x20','type','trim','#add-char-limit-rule-btn','matches','querySelector','isCurrentTablesEmpty','textContent','nccs-api-model-select','addEventListener','menu_button\x20small_button','data-rules','change','toggle','回退重填失败,请检查系统状态。','在左加列','请先加载一个角色。

','currentEventBound','closest','请选择一个列。','note','amily2-menu-active','updateHeader','maxHeight','min','style','无法找到指令模板编辑器或其按钮,绑定失败。','eventsBound','加载SillyTavern预设失败:','move-table-up-btn','rule_update','.nccs-button-row','move-right','\x20创建第一行','向上移动','table_worldbook_char_limit','button','context-reading-slider-container','wb-check-','.add-col-btn','无法获取SillyTavern配置文件列表','指令模板编辑器已成功绑定。','【最终警告】您确定要永久废黜表格\x20“[','target','流程提示词已保存。','世界书设置已成功绑定。','聊天内表格显示设置及其依赖关系已成功绑定。','.exclusion-rule-item','show-table-in-chat-toggle','delete-row','table_tags_to_extract','rule_add','stopPropagation','#rule-update','colgroup','2px','amily2-menu-open','[内存储司]\x20加载世界书条目失败:','table-independent-rules-enabled','checkbox-item','../core/table-system/batch-filler.js','length','getTime','down','\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\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\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
','innerHTML','insertCell','\x22\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\x20style=\x22padding:\x2010px;\x20border-radius:\x206px;\x20border:\x201px\x20solid\x20rgba(255,255,255,0.3);\x20background:\x20rgba(0,0,0,0.2);\x20color:\x20#fff;\x20font-size:\x201em;\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\x20\x20\x20placeholder=\x22','\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提示:输入内容将用于更新项目。\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\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取消\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\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\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20','table-updated','insertColumn','.amily2-context-menu','nccsEnabled','\x22\x20placeholder=\x22起始标记\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\x0a\x20\x20\x20\x20\x20\x20\x20\x20','td.index-col','pending-deletion-row','attr','start','forEach','sillytavern_preset','表格视图交互事件已成功绑定。','table_worldbook_char_limit_value','startCurrentFloorFilling','appendChild','\x0a\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\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','\x20个模型','请输入列名...','rowStatuses','insertBefore','楼层不能小于1。','您确定要将流程提示词恢复为默认设置吗?','\x0aUID:\x20','table-system-master-switch','pointer','fa-arrow-up','2110zXqXGT','fa-undo','startFloorRangeFilling','请输入表名...','[内存储司-工部]\x20缺少表格数据或容器,无法渲染。','getBoundingClientRect','classList','opacity','delete','填表模式已切换为\x20','nccs-api-key','previousElementSibling','表格系统总开关','add','.control-block-with-switch','48JeGfcH','html','table','表格系统总开关已关闭,请先启用总开关。','\x22\x20title=\x22删除此规则\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\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','amily2-table-','getAttribute','saveBatchFillerFlowTemplate','\x22>\x20','flex','overflowX','../core/table-system/reorganizer.js','mousemove','character','warning','Nccs\x20API事件绑定完成','move-row-down-btn','.settings-group','\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\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','nccs-max-tokens','message','nccsApiKey','bottom','--\x20请选择模型\x20--','additional','配置独立提取规则','push','批量填表-流程提示词已恢复默认。','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','.edit-rules-btn','\x22\x20placeholder=\x22结束标记\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','#generic-input','\x20col:nth-child(','success','name','offsetWidth','.rule-end','input[name=\x22filling-mode\x22]','getMemoryState','已禁用','tableIndex','createElement','\x20个SillyTavern配置文件','join','已启用','#new-rule-column-select','table_worldbook_source','th.amily2-menu-open','.amily2_opt_settings_block','selected','删除该行','contains','log','\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\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','addRow','showModal','parentNode','getUpdatedTables','createTHead','\x22重新整理\x22按钮已成功绑定。','headers','https://api.openai.com/v1','display','未选择或绑定世界书。

','4287382pKzBnp','templateEventsBound','add-above','right','find','normal','includes','click','role','批量填表-流程提示词已保存。','无标题条目','which','table_worldbook_enabled','alignItems','\x0a\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\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\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','rowIndex','没有找到世界书。

','世界书:\x20','bookName','#current-char-limit-rules','rollbackAndRefill','restore-row','nccsApiMode',']\x20世界书设置已刷新','10862OLEGKn','checked','fa-plus-circle','\x20测试中...','delete-row-btn','map','\x22\x20title=\x22下移\x22>','max','secondary-api','moveRow','\x20获取模型','filter','.move-table-up-btn','div','63ykWCtT','input[name=\x22table-injection-role\x22]','\x22\x20title=\x22上移\x22>','Nccs\x20API未获取到可用模型','#new-rule-limit-input','#add-exclusion-rule-btn','table_system_enabled','amily2-context-menu\x20amily2-header-menu','nccs-api-model','columnWidths','\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\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\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\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\x20\x20\x20','amily2-context-menu\x20amily2-row-context-menu','{const _0x535d73=_0x25b5b5;if(_0x377674!==_0x334dda){_0x377674[_0x535d73(0x20b)]['remove']('amily2-menu-open');const _0x15e519=_0x377674[_0x535d73(0x1ad)](_0x535d73(0x11f));_0x15e519&&(_0x15e519['style'][_0x535d73(0x21e)]=_0x535d73(0x2cb),_0x15e519['style']['zIndex']='',_0x15e519[_0x535d73(0x1b4)][_0x535d73(0x128)]='');}}),_0x334dda[_0x25b5b5(0x20b)][_0x25b5b5(0x1a8)](_0x25b5b5(0x1d3));_0x334dda[_0x25b5b5(0x20b)][_0x25b5b5(0x255)](_0x25b5b5(0x1d3))?(_0x3794ca[_0x25b5b5(0x1b4)]['overflowX']=_0x25b5b5(0x23e),_0x3794ca['style'][_0x25b5b5(0x128)]=_0x25b5b5(0x235),_0x3794ca['style'][_0x25b5b5(0x105)]='10'):(_0x3794ca[_0x25b5b5(0x1b4)][_0x25b5b5(0x21e)]=_0x25b5b5(0x2cb),_0x3794ca[_0x25b5b5(0x1b4)][_0x25b5b5(0x128)]='',_0x3794ca[_0x25b5b5(0x1b4)][_0x25b5b5(0x105)]='');const _0x56a25f=_0x4c8201=>{const _0xaf93a3=_0x25b5b5;!_0x334dda[_0xaf93a3(0x255)](_0x4c8201['target'])&&(_0x334dda[_0xaf93a3(0x20b)][_0xaf93a3(0x180)](_0xaf93a3(0x1d3)),_0x3794ca['style'][_0xaf93a3(0x21e)]='auto',_0x3794ca[_0xaf93a3(0x1b4)][_0xaf93a3(0x128)]='',_0x3794ca[_0xaf93a3(0x1b4)]['zIndex']='',document['removeEventListener']('click',_0x56a25f,!![]));};_0x334dda[_0x25b5b5(0x20b)]['contains']('amily2-menu-open')&&setTimeout(()=>{const _0x459300=_0x25b5b5;document['addEventListener'](_0x459300(0x28c),_0x56a25f,!![]);},0x0);}function toggleHeaderIndexContextMenu(_0x5a04c6){const _0x14213b=_0x3c5d74;_0x5a04c6[_0x14213b(0x2d2)](),_0x5a04c6[_0x14213b(0x1cf)]();const _0x471d7d=_0x5a04c6[_0x14213b(0x1c6)]['closest'](_0x14213b(0x2cd));if(!_0x471d7d)return;const _0x2423fe=_0x471d7d[_0x14213b(0x1a0)](_0x14213b(0x1e2));if(!_0x2423fe)return;const _0xf7828a=_0x2423fe[_0x14213b(0x20b)][_0x14213b(0x255)](_0x14213b(0x1b0));document[_0x14213b(0x108)](_0x14213b(0x18a))['forEach'](_0x2d10e2=>{const _0x176ee8=_0x14213b;_0x2d10e2[_0x176ee8(0x20b)][_0x176ee8(0x180)]('amily2-menu-active');});!_0xf7828a&&_0x2423fe[_0x14213b(0x20b)][_0x14213b(0x212)](_0x14213b(0x1b0));const _0x1821ac=_0x465649=>{const _0x3d9b9e=_0x14213b;!_0x2423fe[_0x3d9b9e(0x255)](_0x465649[_0x3d9b9e(0x1c6)])&&(_0x2423fe[_0x3d9b9e(0x20b)][_0x3d9b9e(0x180)](_0x3d9b9e(0x1b0)),document[_0x3d9b9e(0x11b)](_0x3d9b9e(0x28c),_0x1821ac,!![]));};setTimeout(()=>{const _0x3bfc22=_0x14213b;_0x2423fe[_0x3bfc22(0x20b)][_0x3bfc22(0x255)]('amily2-menu-active')&&document[_0x3bfc22(0x1a4)](_0x3bfc22(0x28c),_0x1821ac,!![]);},0x0);}function showInputDialog({title:_0x50db43,label:_0x68cd42,currentValue:_0x451a41,placeholder:_0x420a35,onSave:_0x9fcc01}){const _0x19eb83=_0x3c5d74,_0x12823c=_0x19eb83(0x1fa)+_0x50db43+_0x19eb83(0x141)+_0x68cd42+_0x19eb83(0x13c)+_0x451a41+_0x19eb83(0x1de)+_0x420a35+_0x19eb83(0x1df),_0x28d3a4=$(_0x12823c)[_0x19eb83(0x2e0)](_0x19eb83(0x2c3)),_0x112923=_0x28d3a4[_0x19eb83(0x289)](_0x19eb83(0x233)),_0x58b9ef=()=>{const _0x63061a=_0x19eb83;_0x28d3a4[0x0][_0x63061a(0x271)](),_0x28d3a4[_0x63061a(0x180)]();},_0xea5043=()=>{const _0x536c1f=_0x19eb83,_0x583925=_0x112923['val']()['trim']();if(_0x583925&&_0x583925!==_0x451a41)_0x9fcc01(_0x583925);else{if(!_0x583925){toastr['warning'](_0x536c1f(0x2d9)),_0x112923[_0x536c1f(0x12c)]();return;}}_0x58b9ef();};_0x28d3a4[_0x19eb83(0x289)](_0x19eb83(0x16a))['on']('click',_0xea5043),_0x28d3a4[_0x19eb83(0x289)]('.popup-button-cancel')['on'](_0x19eb83(0x28c),_0x58b9ef),_0x112923['on']('keypress',_0x2146af=>{const _0x3d09d3=_0x19eb83;if(_0x2146af[_0x3d09d3(0x290)]===0xd)_0xea5043();}),_0x112923['on']('keydown',_0x135180=>{const _0x2cd26e=_0x19eb83;if(_0x135180[_0x2cd26e(0x290)]===0x1b)_0x58b9ef();}),_0x28d3a4[0x0][_0x19eb83(0x260)](),_0x112923[_0x19eb83(0x12c)]()[_0x19eb83(0x126)]();}function showColumnNameEditor(_0x142287,_0x3efaca,_0x37b213){const _0x162fab=_0x3c5d74;showInputDialog({'title':_0x162fab(0x162),'label':_0x162fab(0x2da),'currentValue':_0x37b213,'placeholder':_0x162fab(0x1fc),'onSave':_0x52c0b2=>{const _0x3176c7=_0x162fab;_0x234bb0[_0x3176c7(0x1b1)](_0x142287,_0x3efaca,_0x52c0b2),renderTables(),toastr[_0x3176c7(0x243)]('列名已更新为\x20\x22'+_0x52c0b2+'\x22');}});}function _0x405f(_0x5c4f96,_0x299ff2){const _0x472114=_0x4721();return _0x405f=function(_0x405f42,_0x31fd0){_0x405f42=_0x405f42-0xf7;let _0x54984a=_0x472114[_0x405f42];return _0x54984a;},_0x405f(_0x5c4f96,_0x299ff2);}function showTableNameEditor(_0x308ae5,_0x24ccb1){const _0x314de0=_0x3c5d74;showInputDialog({'title':_0x314de0(0x240),'label':_0x314de0(0x282),'currentValue':_0x24ccb1,'placeholder':_0x314de0(0x208),'onSave':_0x481aac=>{const _0x156201=_0x314de0;_0x234bb0[_0x156201(0x147)](_0x308ae5,_0x481aac),renderTables(),toastr[_0x156201(0x243)](_0x156201(0x2ce)+_0x481aac+'\x22');}});}function positionContextMenu(_0x249588,_0x1c8afe){const _0x38cd8c=_0x3c5d74;_0x249588['style'][_0x38cd8c(0x128)]='absolute',_0x249588['style'][_0x38cd8c(0x105)]=_0x38cd8c(0x27e),_0x249588[_0x38cd8c(0x1b4)][_0x38cd8c(0x23c)]='0',_0x249588[_0x38cd8c(0x1b4)][_0x38cd8c(0x288)]=_0x38cd8c(0x2cb),_0x249588['style']['marginTop']='',_0x249588[_0x38cd8c(0x1b4)][_0x38cd8c(0x134)]='',_0x249588[_0x38cd8c(0x1b4)][_0x38cd8c(0x1b2)]='',_0x249588[_0x38cd8c(0x1b4)]['overflowY']='';const _0x53d0d9=window['innerHeight'],_0x2906d0=_0x1c8afe[_0x38cd8c(0x20a)](),_0x346d67=0xc8,_0x5736e5=_0x1c8afe[_0x38cd8c(0x1ad)](_0x38cd8c(0x25b)),_0x5a95a6=_0x5736e5?_0x5736e5[_0x38cd8c(0x20a)]():{'top':0x0,'bottom':_0x53d0d9},_0x191a2d=Math[_0x38cd8c(0x1b3)](_0x53d0d9,_0x5a95a6[_0x38cd8c(0x22a)])-_0x2906d0[_0x38cd8c(0x22a)],_0x105339=_0x2906d0[_0x38cd8c(0x26e)]-Math[_0x38cd8c(0x2a7)](0x0,_0x5a95a6['top']);_0x191a2d<_0x346d67&&_0x105339>_0x191a2d?(_0x249588[_0x38cd8c(0x1b4)][_0x38cd8c(0x26e)]=_0x38cd8c(0x2cb),_0x249588[_0x38cd8c(0x1b4)][_0x38cd8c(0x22a)]=_0x38cd8c(0x177),_0x249588[_0x38cd8c(0x1b4)][_0x38cd8c(0x134)]=_0x38cd8c(0x1d2)):(_0x249588[_0x38cd8c(0x1b4)][_0x38cd8c(0x26e)]=_0x38cd8c(0x177),_0x249588['style'][_0x38cd8c(0x22a)]='auto',_0x249588['style']['marginTop']=_0x38cd8c(0x1d2));const _0x2f36dc=0xa0,_0x36ec60=_0x1c8afe[_0x38cd8c(0x1ad)](_0x38cd8c(0x216)),_0x301faf=_0x36ec60?_0x36ec60[_0x38cd8c(0x1ad)]('div[style*=\x22overflowX\x22]'):null;if(_0x301faf){const _0x183146=_0x301faf[_0x38cd8c(0x20a)](),_0x1479b6=_0x2906d0['left']-_0x183146['left'];_0x1479b6+_0x2f36dc>_0x183146['width']-0x14&&(_0x249588[_0x38cd8c(0x1b4)][_0x38cd8c(0x23c)]=_0x38cd8c(0x2cb),_0x249588[_0x38cd8c(0x1b4)][_0x38cd8c(0x288)]='0');}}export function renderTables(){const _0x341ea3=_0x3c5d74;let _0x232996=_0x234bb0['getMemoryState']();!_0x232996&&(log(_0x341ea3(0x237),_0x341ea3(0x165)),_0x232996=_0x234bb0[_0x341ea3(0x140)]());const _0x913a0=getAllTablesContainer();if(!_0x232996||!_0x913a0){console['error'](_0x341ea3(0x209));return;}const _0x4d6159=_0x234bb0['getHighlights'](),_0x552abe=_0x234bb0[_0x341ea3(0x262)](),_0x58aad7=document['createDocumentFragment'](),_0x354cbb=document['getElementById'](_0x341ea3(0x274));_0x354cbb&&_0x354cbb[_0x341ea3(0x180)](),_0x232996[_0x341ea3(0x1f4)]((_0x1a78da,_0x16fd73)=>{const _0x3c0d81=_0x341ea3,_0x1b29fb=document[_0x3c0d81(0x24b)](_0x3c0d81(0x2ad));_0x1b29fb[_0x3c0d81(0x1b4)][_0x3c0d81(0x267)]=_0x3c0d81(0x21d),_0x1b29fb[_0x3c0d81(0x1b4)][_0x3c0d81(0x133)]='space-between',_0x1b29fb[_0x3c0d81(0x1b4)][_0x3c0d81(0x292)]=_0x3c0d81(0xfb);const _0x483a60=document[_0x3c0d81(0x24b)]('h3');_0x552abe[_0x3c0d81(0x2b9)](_0x16fd73)&&_0x483a60[_0x3c0d81(0x20b)][_0x3c0d81(0x212)](_0x3c0d81(0x1e0));_0x483a60[_0x3c0d81(0x1dc)]=_0x3c0d81(0x268)+_0x16fd73+'\x22\x20title=\x22重命名\x22>\x20'+_0x1a78da[_0x3c0d81(0x244)];const _0x2359ac=document[_0x3c0d81(0x24b)]('div');_0x2359ac[_0x3c0d81(0xf9)]=_0x3c0d81(0x13e);const _0x355415=_0x16fd73>0x0?'{const _0x1bad3a=_0x3c0d81,_0x3e7cee=document['createElement'](_0x1bad3a(0x2de)),_0x1957da=_0x1a78da[_0x1bad3a(0x2b7)]&&_0x1a78da[_0x1bad3a(0x2b7)][_0x149993]?_0x1a78da[_0x1bad3a(0x2b7)][_0x149993]:0x5a;_0x3e7cee[_0x1bad3a(0x1b4)][_0x1bad3a(0x23a)]=_0x1957da+'px',_0x4e4782[_0x1bad3a(0x1f9)](_0x3e7cee);});_0x2e0bff[_0x3c0d81(0x1f9)](_0x4e4782);let _0x1c2f07=0x0;const _0x24ca23=_0x4e4782['querySelectorAll'](_0x3c0d81(0x2de));_0x24ca23['forEach'](_0x1d043e=>{const _0xdc0d49=_0x3c0d81;_0x1c2f07+=parseInt(_0x1d043e[_0xdc0d49(0x1b4)]['width'],0xa);}),_0x2e0bff['style'][_0x3c0d81(0x23a)]=_0x1c2f07+'px';const _0x51bf6c=_0x2e0bff[_0x3c0d81(0x263)](),_0x3fa06d=_0x51bf6c['insertRow'](),_0x30b292=document[_0x3c0d81(0x24b)]('th');_0x30b292['className']=_0x3c0d81(0x196),_0x30b292[_0x3c0d81(0x1a2)]='#',_0x30b292[_0x3c0d81(0x1b4)][_0x3c0d81(0x150)]=_0x3c0d81(0x203),_0x30b292[_0x3c0d81(0x281)]=_0x3c0d81(0x2bc);if(!_0x1a78da['rows']||_0x1a78da[_0x3c0d81(0x1e6)]['length']===0x0){const _0x975faf=document['createElement']('div');_0x975faf['className']=_0x3c0d81(0x2b5),_0x975faf[_0x3c0d81(0x1b4)][_0x3c0d81(0x267)]=_0x3c0d81(0x10f);const _0x5de756=document[_0x3c0d81(0x24b)](_0x3c0d81(0x1bf));_0x5de756[_0x3c0d81(0x1dc)]=_0x3c0d81(0x1bc),_0x5de756[_0x3c0d81(0xf9)]='menu_button\x20small_button',_0x5de756['addEventListener'](_0x3c0d81(0x28c),_0x161442=>{const _0x369bbd=_0x3c0d81;_0x161442[_0x369bbd(0x1cf)](),_0x234bb0[_0x369bbd(0x25f)](_0x16fd73),renderTables();}),_0x975faf[_0x3c0d81(0x1f9)](_0x5de756),_0x30b292[_0x3c0d81(0x1f9)](_0x975faf),_0x30b292[_0x3c0d81(0x1a4)](_0x3c0d81(0x28c),_0x4428c2=>{const _0x58a0c7=_0x3c0d81;_0x4428c2['preventDefault'](),_0x4428c2[_0x58a0c7(0x1cf)](),console[_0x58a0c7(0x256)](_0x58a0c7(0x2c0),_0x16fd73),_0x234bb0[_0x58a0c7(0x25f)](_0x16fd73),renderTables(),toastr['success'](_0x58a0c7(0x273));});}_0x3fa06d[_0x3c0d81(0x1f9)](_0x30b292),_0x1a78da[_0x3c0d81(0x265)][_0x3c0d81(0x1f4)]((_0x44ff1a,_0xf697e8)=>{const _0x5e733f=_0x3c0d81,_0x59c636=document[_0x5e733f(0x24b)]('th');_0x59c636[_0x5e733f(0x135)][_0x5e733f(0x154)]=_0xf697e8,_0x59c636['style'][_0x5e733f(0x150)]='pointer';const _0x17fbd9=document[_0x5e733f(0x24b)](_0x5e733f(0x163));_0x17fbd9[_0x5e733f(0xf9)]=_0x5e733f(0x26d),_0x17fbd9['textContent']=_0x44ff1a,_0x59c636[_0x5e733f(0x1f9)](_0x17fbd9);const _0x3225e2=document[_0x5e733f(0x24b)](_0x5e733f(0x2ad));_0x3225e2[_0x5e733f(0xf9)]=_0x5e733f(0x2e1);const _0x3533d1=[{'label':'向左移动','action':'move-left','icon':_0x5e733f(0x1e9)},{'label':_0x5e733f(0x101),'action':_0x5e733f(0x1bb),'icon':_0x5e733f(0x2d3)},{'label':_0x5e733f(0x1aa),'action':_0x5e733f(0x275),'icon':_0x5e733f(0x2a2)},{'label':_0x5e733f(0x14f),'action':_0x5e733f(0x142),'icon':_0x5e733f(0x2a2)},{'label':'编辑列名','action':_0x5e733f(0x121),'icon':_0x5e733f(0x198)},{'label':'删除该列','action':_0x5e733f(0x20d),'icon':_0x5e733f(0x239),'isDanger':!![]}];_0x3533d1[_0x5e733f(0x1f4)](({label:_0x56d55b,action:_0x347381,icon:_0x31324d,isDanger:_0x4d8c45})=>{const _0x2859a5=_0x5e733f,_0xb4bfe9=document[_0x2859a5(0x24b)]('button');_0xb4bfe9[_0x2859a5(0x1a2)]=_0x56d55b,_0xb4bfe9[_0x2859a5(0xf9)]='menu_button\x20small_button';if(_0x4d8c45)_0xb4bfe9[_0x2859a5(0x20b)][_0x2859a5(0x212)](_0x2859a5(0x2c4));_0xb4bfe9[_0x2859a5(0x1a4)](_0x2859a5(0x28c),_0x4ff0d9=>{const _0x334121=_0x2859a5;_0x4ff0d9[_0x334121(0x1cf)]();switch(_0x347381){case _0x334121(0x27a):_0x234bb0[_0x334121(0x114)](_0x16fd73,_0xf697e8,_0x334121(0x23c));break;case _0x334121(0x1bb):_0x234bb0['moveColumn'](_0x16fd73,_0xf697e8,_0x334121(0x288));break;case _0x334121(0x275):_0x234bb0[_0x334121(0x1e1)](_0x16fd73,_0xf697e8,_0x334121(0x23c));break;case'add-right':_0x234bb0['insertColumn'](_0x16fd73,_0xf697e8,_0x334121(0x288));break;case _0x334121(0x121):showColumnNameEditor(_0x16fd73,_0xf697e8,_0x44ff1a);break;case _0x334121(0x20d):confirm('您确定要删除\x20“'+_0x44ff1a+'”\x20列吗?')&&_0x234bb0[_0x334121(0x2be)](_0x16fd73,_0xf697e8);break;}renderTables();}),_0x3225e2[_0x2859a5(0x1f9)](_0xb4bfe9);}),_0x59c636[_0x5e733f(0x1f9)](_0x3225e2);const _0x580829=document[_0x5e733f(0x24b)](_0x5e733f(0x2ad));_0x580829['className']=_0x5e733f(0x2bb),_0x59c636[_0x5e733f(0x1f9)](_0x580829);const _0x4219cf=_0xc9f8c2=>{const _0x48efdc=_0x5e733f;_0xc9f8c2[_0x48efdc(0x2d2)](),_0xc9f8c2[_0x48efdc(0x1cf)](),isResizing=!![];const _0x578080=_0xc9f8c2[_0x48efdc(0x1c6)][_0x48efdc(0x1ad)]('table'),_0x41960e=_0xc9f8c2[_0x48efdc(0x1c6)][_0x48efdc(0x25a)],_0x51a91c=_0x578080[_0x48efdc(0x1a0)](_0x48efdc(0x242)+(_0x41960e[_0x48efdc(0x12e)]+0x1)+')'),_0x21ee82=_0xc9f8c2[_0x48efdc(0x19c)]['startsWith']('touch'),_0x19e71d=_0x21ee82?_0xc9f8c2[_0x48efdc(0x11a)][0x0][_0x48efdc(0x236)]:_0xc9f8c2[_0x48efdc(0x236)],_0x588b7d=_0x41960e[_0x48efdc(0x245)],_0x34eac4=_0x2c79b7=>{const _0x5d7df1=_0x48efdc,_0x3110a5=_0x21ee82?_0x2c79b7[_0x5d7df1(0x11a)][0x0]['clientX']:_0x2c79b7[_0x5d7df1(0x236)],_0x41f9d0=_0x588b7d+(_0x3110a5-_0x19e71d);_0x41f9d0>0x32&&(_0x51a91c[_0x5d7df1(0x1b4)][_0x5d7df1(0x23a)]=_0x41f9d0+'px');},_0x439251=()=>{const _0x1ed4ea=_0x48efdc;document['removeEventListener'](_0x1ed4ea(0x220),_0x34eac4),document[_0x1ed4ea(0x11b)]('mouseup',_0x439251),document[_0x1ed4ea(0x11b)](_0x1ed4ea(0x23d),_0x34eac4),document[_0x1ed4ea(0x11b)](_0x1ed4ea(0x13f),_0x439251);const _0x1cab8d=parseInt(_0x51a91c[_0x1ed4ea(0x1b4)][_0x1ed4ea(0x23a)],0xa);_0x234bb0['updateColumnWidth'](_0x16fd73,_0xf697e8,_0x1cab8d),setTimeout(()=>{isResizing=![];},0x0);};_0x21ee82?(document[_0x48efdc(0x1a4)](_0x48efdc(0x23d),_0x34eac4,{'passive':![]}),document[_0x48efdc(0x1a4)](_0x48efdc(0x13f),_0x439251)):(document[_0x48efdc(0x1a4)](_0x48efdc(0x220),_0x34eac4),document[_0x48efdc(0x1a4)](_0x48efdc(0x197),_0x439251));};_0x580829[_0x5e733f(0x1a4)](_0x5e733f(0x258),_0x4219cf),_0x580829[_0x5e733f(0x1a4)](_0x5e733f(0x136),_0x4219cf,{'passive':![]}),_0x3fa06d[_0x5e733f(0x1f9)](_0x59c636);});const _0x4feb6b=_0x2e0bff[_0x3c0d81(0x16d)]();_0x1a78da[_0x3c0d81(0x1e6)]&&_0x1a78da[_0x3c0d81(0x1e6)][_0x3c0d81(0x1d8)]>0x0&&_0x1a78da[_0x3c0d81(0x1e6)][_0x3c0d81(0x1f4)]((_0x240088,_0x5d2231)=>{const _0x3c1ed3=_0x3c0d81,_0x5b8a7e=_0x4feb6b['insertRow']();_0x5b8a7e['dataset'][_0x3c1ed3(0x297)]=_0x5d2231;const _0x321a76=_0x1a78da[_0x3c1ed3(0x1fd)]?_0x1a78da[_0x3c1ed3(0x1fd)][_0x5d2231]:_0x3c1ed3(0x28a);_0x321a76==='pending-deletion'&&_0x5b8a7e[_0x3c1ed3(0x20b)][_0x3c1ed3(0x212)](_0x3c1ed3(0x1f1));const _0x32aa83=_0x5b8a7e[_0x3c1ed3(0x1dd)]();_0x32aa83[_0x3c1ed3(0xf9)]=_0x3c1ed3(0x196);const _0x2d4786=document[_0x3c1ed3(0x24b)](_0x3c1ed3(0x163));_0x2d4786['textContent']=_0x5d2231+0x1,_0x32aa83[_0x3c1ed3(0x1f9)](_0x2d4786);const _0x3bafc3=document['createElement']('div');_0x3bafc3[_0x3c1ed3(0xf9)]=_0x3c1ed3(0x2c7);let _0x48d42e;_0x321a76===_0x3c1ed3(0x143)?_0x48d42e=[{'label':'恢复该行','action':'restore-row','icon':_0x3c1ed3(0x206),'isSuccess':!![],'btnClass':'restore-row-btn'}]:_0x48d42e=[{'label':_0x3c1ed3(0x1bd),'action':_0x3c1ed3(0x18d),'icon':_0x3c1ed3(0x204),'btnClass':_0x3c1ed3(0x171)},{'label':'向下移动','action':_0x3c1ed3(0x15e),'icon':'fa-arrow-down','btnClass':_0x3c1ed3(0x224)},{'label':'在上加行','action':_0x3c1ed3(0x287),'icon':_0x3c1ed3(0x2a2),'btnClass':'add-row-above-btn'},{'label':_0x3c1ed3(0x1e5),'action':'add-below','icon':_0x3c1ed3(0x2a2),'btnClass':_0x3c1ed3(0x14c)},{'label':_0x3c1ed3(0x254),'action':'delete-row','icon':'fa-trash-alt','isDanger':!![],'btnClass':_0x3c1ed3(0x2a4)}],_0x48d42e[_0x3c1ed3(0x1f4)](({label:_0x1dc047,action:_0x281bdc,icon:_0x3149b0,isDanger:_0x182128,isSuccess:_0x1e87c8})=>{const _0x42b4ff=_0x3c1ed3,_0x4824d6=document['createElement'](_0x42b4ff(0x1bf));_0x4824d6[_0x42b4ff(0x1dc)]=_0x42b4ff(0x2c8)+_0x3149b0+_0x42b4ff(0x21c)+_0x1dc047,_0x4824d6[_0x42b4ff(0xf9)]=_0x42b4ff(0x1a5);if(_0x182128)_0x4824d6[_0x42b4ff(0x20b)][_0x42b4ff(0x212)](_0x42b4ff(0x2c4));if(_0x1e87c8)_0x4824d6[_0x42b4ff(0x20b)][_0x42b4ff(0x212)](_0x42b4ff(0x243));_0x4824d6['addEventListener'](_0x42b4ff(0x28c),_0x3a1a3e=>{const _0x54a8b0=_0x42b4ff;_0x3a1a3e['stopPropagation']();switch(_0x281bdc){case _0x54a8b0(0x18d):_0x234bb0[_0x54a8b0(0x2a9)](_0x16fd73,_0x5d2231,'up');break;case _0x54a8b0(0x15e):_0x234bb0['moveRow'](_0x16fd73,_0x5d2231,_0x54a8b0(0x1da));break;case _0x54a8b0(0x287):_0x234bb0[_0x54a8b0(0x2cc)](_0x16fd73,_0x5d2231,'above');break;case _0x54a8b0(0x1ed):_0x234bb0[_0x54a8b0(0x2cc)](_0x16fd73,_0x5d2231,'below');break;case _0x54a8b0(0x1cc):_0x234bb0[_0x54a8b0(0x2d6)](_0x16fd73,_0x5d2231);break;case _0x54a8b0(0x29d):_0x234bb0[_0x54a8b0(0x15c)](_0x16fd73,_0x5d2231);break;}if(_0x281bdc===_0x54a8b0(0x1cc)||_0x281bdc===_0x54a8b0(0x29d)){}else renderTables();}),_0x3bafc3['appendChild'](_0x4824d6);}),_0x32aa83[_0x3c1ed3(0x1f9)](_0x3bafc3),_0x240088[_0x3c1ed3(0x1f4)]((_0x2e1533,_0x2ca6ec)=>{const _0x19d4d6=_0x3c1ed3,_0x478b98=_0x5b8a7e[_0x19d4d6(0x1dd)](),_0x227738=document[_0x19d4d6(0x24b)]('div');_0x227738[_0x19d4d6(0xf9)]=_0x19d4d6(0x27b),_0x227738[_0x19d4d6(0x1a2)]=_0x2e1533,_0x478b98[_0x19d4d6(0x1f9)](_0x227738);_0x321a76!==_0x19d4d6(0x143)&&!isTouchDevice()&&_0x478b98['setAttribute'](_0x19d4d6(0x2df),_0x19d4d6(0x123));_0x478b98['dataset'][_0x19d4d6(0x154)]=_0x2ca6ec,_0x478b98['dataset'][_0x19d4d6(0x175)]=_0x1a78da[_0x19d4d6(0x265)][_0x2ca6ec]||'';const _0x327c3b=_0x16fd73+'-'+_0x5d2231+'-'+_0x2ca6ec;_0x4d6159['has'](_0x327c3b)&&_0x478b98[_0x19d4d6(0x20b)][_0x19d4d6(0x212)](_0x19d4d6(0xfe));});}),_0x4bb4ea[_0x3c0d81(0x1f9)](_0x2e0bff),_0x58aad7[_0x3c0d81(0x1f9)](_0x4bb4ea);}),_0x913a0['innerHTML']='',_0x913a0['appendChild'](_0x58aad7),_0x354cbb&&_0x913a0[_0x341ea3(0x1f9)](_0x354cbb),updateOrInsertTableInChat();}function openTableRuleEditor(){const _0x58abcf=_0x3c5d74,_0x38d1db=extension_settings[extensionName],_0x2d7dd5=_0x38d1db[_0x58abcf(0x1cd)]||'',_0x23a050=_0x38d1db['table_exclusion_rules']||[],_0xe7a2c1=_0x23a050[_0x58abcf(0x2a5)]((_0x2282ed,_0x4b4af3)=>'\x0a\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\x20\x20\x20\x20移除所有被起始和结束标记包裹的内容(例如\x20OOC\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',_0x344b38=showHtmlModal(_0x58abcf(0x22d),_0x3d4feb,{'onOk':()=>{const _0x296630=_0x58abcf,_0x2e2ab7=document['getElementById']('table-tags-input')[_0x296630(0x120)];updateAndSaveTableSetting(_0x296630(0x1cd),_0x2e2ab7);const _0x536051=[];document[_0x296630(0x108)]('#exclusion-rules-list\x20.exclusion-rule-item')[_0x296630(0x1f4)](_0x5350cc=>{const _0x11fefd=_0x296630,_0x169114=_0x5350cc[_0x11fefd(0x1a0)](_0x11fefd(0x280))['value'][_0x11fefd(0x19d)](),_0x5c28ba=_0x5350cc[_0x11fefd(0x1a0)](_0x11fefd(0x246))[_0x11fefd(0x120)]['trim']();_0x169114&&_0x5c28ba&&_0x536051['push']({'start':_0x169114,'end':_0x5c28ba});}),updateAndSaveTableSetting(_0x296630(0x2ca),_0x536051),toastr[_0x296630(0x243)]('独立提取规则已保存。');},'onShow':_0x39324e=>{const _0x1feb16=_0x58abcf,_0x366a41=_0x39324e[_0x1feb16(0x289)](_0x1feb16(0xf8));_0x39324e[_0x1feb16(0x289)](_0x1feb16(0x2b3))['on'](_0x1feb16(0x28c),()=>{const _0x451a2b=_0x1feb16,_0x2ba2a5=_0x366a41[_0x451a2b(0x279)]()[_0x451a2b(0x1d8)],_0x3c370b=_0x451a2b(0x130)+_0x2ba2a5+_0x451a2b(0x1db);_0x366a41[_0x451a2b(0x16b)](_0x3c370b);}),_0x366a41['on'](_0x1feb16(0x28c),_0x1feb16(0x27d),function(){const _0x8f4cd2=_0x1feb16;$(this)['closest'](_0x8f4cd2(0x1ca))[_0x8f4cd2(0x180)]();});}});}function openRuleEditor(_0x271b78){const _0x2b60b3=_0x3c5d74,_0x157c74=_0x234bb0['getMemoryState']();if(!_0x157c74||!_0x157c74[_0x271b78])return;const _0x132d7d=_0x157c74[_0x271b78];_0x132d7d[_0x2b60b3(0x19a)]&&!_0x132d7d[_0x2b60b3(0x15a)]&&(_0x132d7d['charLimitRules']={},_0x132d7d[_0x2b60b3(0x19a)][_0x2b60b3(0x2c5)]!==-0x1&&(_0x132d7d['charLimitRules'][_0x132d7d[_0x2b60b3(0x19a)][_0x2b60b3(0x2c5)]]=_0x132d7d[_0x2b60b3(0x19a)][_0x2b60b3(0x12f)]));const _0x556757=_0x132d7d['charLimitRules']||{},_0x14758f=_0x3269dc=>{const _0x2c02ec=_0x2b60b3;return Object['entries'](_0x3269dc)[_0x2c02ec(0x2a5)](([_0x5dd4d6,_0x247ddb])=>{const _0x5d1b60=_0x2c02ec,_0x4e3ecd=_0x132d7d[_0x5d1b60(0x265)][_0x5dd4d6]||_0x5d1b60(0x160)+_0x5dd4d6+')';return _0x5d1b60(0x110)+_0x4e3ecd+_0x5d1b60(0x19b)+_0x247ddb+'\x20字
\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{const _0x26071e=_0x2b60b3;return _0x132d7d[_0x26071e(0x265)][_0x26071e(0x2a5)]((_0x229905,_0xfd9b7b)=>{const _0x2fc101=_0x26071e;if(_0x27dd9c[_0xfd9b7b])return'';return _0x2fc101(0x234)+_0xfd9b7b+'\x22>'+_0x229905+_0x2fc101(0x122);})['join']('');},_0x963dab=_0x2b60b3(0x190)+_0x132d7d[_0x2b60b3(0x244)]+_0x2b60b3(0x179)+_0x14758f(_0x556757)+_0x2b60b3(0x2c6)+_0x54f38e(_0x556757)+'\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\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\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\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\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\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\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\x0a\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(0为禁用)\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当表格总行数超过设定值时,将在表格底部显示警告。\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\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【说明】:\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'+(_0x132d7d[_0x2b60b3(0x1af)]||'')+_0x2b60b3(0x25e)+(_0x132d7d[_0x2b60b3(0x1ce)]||'')+_0x2b60b3(0x296)+(_0x132d7d[_0x2b60b3(0x14e)]||'')+_0x2b60b3(0x226)+(_0x132d7d[_0x2b60b3(0x1b9)]||'')+_0x2b60b3(0x183),_0x683257=$(_0x963dab)[_0x2b60b3(0x2e0)](_0x2b60b3(0x2c3)),_0x10c690=()=>{const _0x58ea27=_0x2b60b3;_0x683257[0x0][_0x58ea27(0x271)](),_0x683257['remove']();},_0x232e3c=()=>{const _0x5085ba=_0x2b60b3,_0x2569b0=JSON[_0x5085ba(0x184)](_0x683257[_0x5085ba(0x289)](_0x5085ba(0x29b))[_0x5085ba(0x1f2)](_0x5085ba(0x1a6))||'{}');_0x683257[_0x5085ba(0x289)](_0x5085ba(0x29b))[_0x5085ba(0x215)](_0x14758f(_0x2569b0)),_0x683257[_0x5085ba(0x289)](_0x5085ba(0x24f))['html'](_0x5085ba(0x191)+_0x54f38e(_0x2569b0));};_0x683257['find'](_0x2b60b3(0x29b))[_0x2b60b3(0x1f2)](_0x2b60b3(0x1a6),JSON[_0x2b60b3(0x145)](_0x556757)),_0x683257['on'](_0x2b60b3(0x28c),_0x2b60b3(0x19e),()=>{const _0x5dc7d1=_0x2b60b3,_0x5e7cfc=parseInt(_0x683257[_0x5dc7d1(0x289)](_0x5dc7d1(0x24f))['val'](),0xa),_0x182a1c=parseInt(_0x683257[_0x5dc7d1(0x289)](_0x5dc7d1(0x2b2))[_0x5dc7d1(0x18b)](),0xa);if(_0x5e7cfc===-0x1){toastr[_0x5dc7d1(0x222)](_0x5dc7d1(0x1ae));return;}if(isNaN(_0x182a1c)||_0x182a1c<0x0){toastr[_0x5dc7d1(0x222)](_0x5dc7d1(0x109));return;}const _0xf4bf86=JSON[_0x5dc7d1(0x184)](_0x683257[_0x5dc7d1(0x289)](_0x5dc7d1(0x29b))['attr'](_0x5dc7d1(0x1a6))||'{}');_0x182a1c>0x0?(_0xf4bf86[_0x5e7cfc]=_0x182a1c,_0x683257['find'](_0x5dc7d1(0x29b))[_0x5dc7d1(0x1f2)](_0x5dc7d1(0x1a6),JSON[_0x5dc7d1(0x145)](_0xf4bf86)),_0x232e3c()):toastr[_0x5dc7d1(0xf7)](_0x5dc7d1(0x11c));}),_0x683257['on']('click','.remove-char-limit-rule-btn',function(){const _0x51e3d2=_0x2b60b3,_0x29212b=$(this)[_0x51e3d2(0x283)](_0x51e3d2(0x14b)),_0x31056e=JSON[_0x51e3d2(0x184)](_0x683257[_0x51e3d2(0x289)]('#current-char-limit-rules')[_0x51e3d2(0x1f2)](_0x51e3d2(0x1a6))||'{}');delete _0x31056e[_0x29212b],_0x683257[_0x51e3d2(0x289)]('#current-char-limit-rules')[_0x51e3d2(0x1f2)](_0x51e3d2(0x1a6),JSON[_0x51e3d2(0x145)](_0x31056e)),_0x232e3c();}),_0x683257[_0x2b60b3(0x289)](_0x2b60b3(0x16a))['on'](_0x2b60b3(0x28c),()=>{const _0x2833fd=_0x2b60b3,_0x38bd46=JSON[_0x2833fd(0x184)](_0x683257['find'](_0x2833fd(0x29b))[_0x2833fd(0x1f2)]('data-rules')||'{}'),_0xdee3a8=parseInt(_0x683257[_0x2833fd(0x289)]('#rule-row-limit-value')[_0x2833fd(0x18b)](),0xa),_0x17645d={'note':_0x683257['find'](_0x2833fd(0x173))[_0x2833fd(0x18b)](),'rule_add':_0x683257['find']('#rule-add')[_0x2833fd(0x18b)](),'rule_delete':_0x683257[_0x2833fd(0x289)](_0x2833fd(0x2c2))[_0x2833fd(0x18b)](),'rule_update':_0x683257['find'](_0x2833fd(0x1d0))[_0x2833fd(0x18b)](),'charLimitRules':_0x38bd46,'rowLimitRule':_0xdee3a8};_0x234bb0[_0x2833fd(0x172)](_0x271b78,_0x17645d),_0x10c690();}),_0x683257[_0x2b60b3(0x289)]('.popup-button-cancel')['on'](_0x2b60b3(0x28c),_0x10c690),_0x683257[0x0][_0x2b60b3(0x260)]();}function bindInjectionSettings(){const _0x12442b=_0x3c5d74,_0x50496f=extension_settings[extensionName],_0x245235=document['getElementById'](_0x12442b(0x202)),_0x25d6db=document[_0x12442b(0x194)](_0x12442b(0x277)),_0x39d649=document[_0x12442b(0x194)]('table-injection-position'),_0x10130f=document[_0x12442b(0x194)](_0x12442b(0x181)),_0x95981d=document['querySelectorAll'](_0x12442b(0x2af));if(!_0x245235||!_0x25d6db||!_0x39d649||!_0x10130f||!_0x95981d['length'])return;const _0x9e9d72=()=>{const _0x424b21=_0x12442b,_0xb530f4=_0x39d649[_0x424b21(0x120)],_0xccbbc1=_0x245235[_0x424b21(0x2a1)],_0x412930=_0xb530f4==='1';_0x25d6db[_0x424b21(0x187)]=!_0xccbbc1,_0x39d649[_0x424b21(0x187)]=!_0xccbbc1,_0x10130f[_0x424b21(0x187)]=!_0xccbbc1||!_0x412930,_0x95981d['forEach'](_0x31f481=>_0x31f481[_0x424b21(0x187)]=!_0xccbbc1||!_0x412930);const _0x2d9da4=_0xccbbc1?'1':_0x424b21(0x1ec);_0x25d6db[_0x424b21(0x1b4)]['opacity']=_0x2d9da4;_0x25d6db['closest'](_0x424b21(0x213))&&(_0x25d6db['closest']('.control-block-with-switch')['style'][_0x424b21(0x20c)]=_0x2d9da4);_0x39d649[_0x424b21(0x1b4)][_0x424b21(0x20c)]=_0x2d9da4;_0x39d649['previousElementSibling']&&(_0x39d649[_0x424b21(0x210)][_0x424b21(0x1b4)]['opacity']=_0x2d9da4);const _0x4394ba=_0xccbbc1&&_0x412930?'1':_0x424b21(0x1ec);_0x10130f[_0x424b21(0x1b4)][_0x424b21(0x20c)]=_0x4394ba;_0x10130f[_0x424b21(0x210)]&&(_0x10130f[_0x424b21(0x210)][_0x424b21(0x1b4)]['opacity']=_0x4394ba);const _0xecee74=_0xccbbc1&&_0x412930?'1':_0x424b21(0x1ec),_0x2f9889=document[_0x424b21(0x194)](_0x424b21(0x2d7))?.[_0x424b21(0x1ad)]('.radio-group');_0x2f9889&&(_0x2f9889[_0x424b21(0x1b4)][_0x424b21(0x20c)]=_0xecee74,_0x2f9889[_0x424b21(0x210)]&&(_0x2f9889['previousElementSibling'][_0x424b21(0x1b4)][_0x424b21(0x20c)]=_0xecee74));const _0x271ecf=document[_0x424b21(0x108)](_0x424b21(0x247));_0x271ecf[_0x424b21(0x1f4)](_0x2714e4=>{const _0x1f635c=_0x424b21;_0x2714e4['disabled']=!_0xccbbc1;const _0x3b41e7=_0x2714e4[_0x1f635c(0x1ad)]('label');_0x3b41e7&&(_0x3b41e7[_0x1f635c(0x1b4)][_0x1f635c(0x20c)]=_0xccbbc1?'1':'0.5');});const _0x436778=document[_0x424b21(0x194)](_0x424b21(0x27f));_0x436778&&(_0x436778['disabled']=!_0xccbbc1,_0x436778['style'][_0x424b21(0x20c)]=_0xccbbc1?'1':_0x424b21(0x1ec));};_0x245235[_0x12442b(0x2a1)]=_0x50496f[_0x12442b(0x2b4)]!==![],_0x25d6db['checked']=_0x50496f['table_injection_enabled'],_0x39d649[_0x12442b(0x120)]=_0x50496f[_0x12442b(0x111)][_0x12442b(0x128)],_0x10130f['value']=_0x50496f[_0x12442b(0x111)][_0x12442b(0x18c)],_0x95981d[_0x12442b(0x1f4)](_0x43a02c=>{const _0x1f7fee=_0x12442b;parseInt(_0x43a02c[_0x1f7fee(0x120)],0xa)===_0x50496f[_0x1f7fee(0x111)][_0x1f7fee(0x28d)]&&(_0x43a02c['checked']=!![]);}),_0x9e9d72();if(_0x245235[_0x12442b(0x135)]['eventsBound'])return;_0x245235[_0x12442b(0x1a4)](_0x12442b(0x1a7),()=>{const _0x2e12f0=_0x12442b;_0x50496f[_0x2e12f0(0x2b4)]=_0x245235[_0x2e12f0(0x2a1)],saveSettingsDebounced(),_0x9e9d72();const _0x54366a=_0x245235[_0x2e12f0(0x2a1)]?_0x2e12f0(0x24e):'已禁用';toastr['info'](_0x2e12f0(0x211)+_0x54366a+'。'),log(_0x2e12f0(0x211)+_0x54366a+'。',_0x2e12f0(0xf7));}),_0x25d6db[_0x12442b(0x1a4)](_0x12442b(0x1a7),()=>{const _0x600c77=_0x12442b;_0x50496f[_0x600c77(0x182)]=_0x25d6db[_0x600c77(0x2a1)],saveSettingsDebounced();}),_0x39d649['addEventListener'](_0x12442b(0x1a7),()=>{const _0x169e93=_0x12442b;_0x50496f[_0x169e93(0x111)][_0x169e93(0x128)]=parseInt(_0x39d649[_0x169e93(0x120)],0xa),saveSettingsDebounced(),_0x9e9d72();}),_0x10130f[_0x12442b(0x1a4)]('input',()=>{const _0x10f8a2=_0x12442b;_0x50496f['injection'][_0x10f8a2(0x18c)]=parseInt(_0x10130f[_0x10f8a2(0x120)],0xa),saveSettingsDebounced();}),_0x95981d[_0x12442b(0x1f4)](_0x5dd800=>{const _0x2d2d86=_0x12442b;_0x5dd800[_0x2d2d86(0x1a4)](_0x2d2d86(0x1a7),()=>{const _0x18d256=_0x2d2d86;_0x5dd800[_0x18d256(0x2a1)]&&(_0x50496f[_0x18d256(0x111)][_0x18d256(0x28d)]=parseInt(_0x5dd800[_0x18d256(0x120)],0xa),saveSettingsDebounced());});}),_0x245235['dataset'][_0x12442b(0x1b6)]=_0x12442b(0x123),log(_0x12442b(0x1e7),_0x12442b(0x243));}function updateAndSaveTableSetting(_0x49fc07,_0x30924d){!extension_settings[extensionName]&&(extension_settings[extensionName]={}),extension_settings[extensionName][_0x49fc07]=_0x30924d,saveSettingsDebounced();}function bindWorldBookSettings(){const _0x1eceb1=_0x3c5d74,_0x2e874f=extension_settings[extensionName];if(_0x2e874f[_0x1eceb1(0x291)]===undefined)_0x2e874f['table_worldbook_enabled']=![];if(_0x2e874f[_0x1eceb1(0x1be)]===undefined)_0x2e874f[_0x1eceb1(0x1be)]=0x7530;if(_0x2e874f['table_worldbook_source']===undefined)_0x2e874f[_0x1eceb1(0x250)]='character';if(_0x2e874f[_0x1eceb1(0x14a)]===undefined)_0x2e874f[_0x1eceb1(0x14a)]=[];if(_0x2e874f['table_selected_entries']===undefined)_0x2e874f[_0x1eceb1(0x2c1)]={};const _0xb4f813=document[_0x1eceb1(0x194)](_0x1eceb1(0x291)),_0x2744f2=document['getElementById'](_0x1eceb1(0x1be)),_0x33bf08=document['getElementById'](_0x1eceb1(0x1f7)),_0x496fc1=document[_0x1eceb1(0x108)]('input[name=\x22table_worldbook_source\x22]'),_0x16d213=document[_0x1eceb1(0x194)](_0x1eceb1(0x139)),_0x1b24dc=document[_0x1eceb1(0x194)]('table_refresh_worldbooks'),_0x46771c=document[_0x1eceb1(0x194)]('table_worldbook_checkbox_list'),_0x2a1b08=document[_0x1eceb1(0x194)](_0x1eceb1(0x189));if(!_0xb4f813||!_0x2744f2||!_0x33bf08||!_0x496fc1['length']||!_0x16d213||!_0x1b24dc||!_0x46771c||!_0x2a1b08){log(_0x1eceb1(0x278),_0x1eceb1(0x165));return;}const _0x2a7082=()=>{const _0x459833=_0x1eceb1,_0x1b5aed={};_0x2a1b08[_0x459833(0x108)]('input[type=\x22checkbox\x22]:checked')['forEach'](_0x5f57b4=>{const _0x258785=_0x459833,_0x1ef5d1=_0x5f57b4[_0x258785(0x135)][_0x258785(0x13d)],_0x5a2a2d=_0x5f57b4[_0x258785(0x135)][_0x258785(0x270)];!_0x1b5aed[_0x1ef5d1]&&(_0x1b5aed[_0x1ef5d1]=[]),_0x1b5aed[_0x1ef5d1][_0x258785(0x22e)](_0x5a2a2d);}),_0x2e874f[_0x459833(0x2c1)]=_0x1b5aed,saveSettingsDebounced();},_0x58546d=async()=>{const _0x3ee579=_0x1eceb1;_0x2a1b08[_0x3ee579(0x1dc)]=_0x3ee579(0x112);const _0x1c6ac1=_0x2e874f[_0x3ee579(0x250)]||_0x3ee579(0x221);let _0x2bbac4=[];if(_0x1c6ac1==='manual')_0x2bbac4=_0x2e874f['table_selected_worldbooks']||[];else{if(this_chid!==undefined&&this_chid>=0x0&&characters[this_chid])try{const _0x2adb83=await safeCharLorebooks({'type':_0x3ee579(0x15b)});if(_0x2adb83[_0x3ee579(0x153)])_0x2bbac4[_0x3ee579(0x22e)](_0x2adb83[_0x3ee579(0x153)]);if(_0x2adb83[_0x3ee579(0x22c)]?.[_0x3ee579(0x1d8)])_0x2bbac4[_0x3ee579(0x22e)](..._0x2adb83['additional']);}catch(_0x2f1ebd){console['error']('[内存储司]\x20获取角色世界书失败:',_0x2f1ebd),_0x2a1b08[_0x3ee579(0x1dc)]=_0x3ee579(0x157);return;}else{_0x2a1b08[_0x3ee579(0x1dc)]=_0x3ee579(0x1ab);return;}}if(_0x2bbac4[_0x3ee579(0x1d8)]===0x0){_0x2a1b08['innerHTML']=_0x3ee579(0x284);return;}try{const _0x2e4061=[];for(const _0x35230c of _0x2bbac4){const _0x147bf5=await safeLorebookEntries(_0x35230c);_0x147bf5[_0x3ee579(0x1f4)](_0xfbc2cf=>_0x2e4061[_0x3ee579(0x22e)]({..._0xfbc2cf,'bookName':_0x35230c}));}_0x2a1b08[_0x3ee579(0x1dc)]='';if(_0x2e4061[_0x3ee579(0x1d8)]===0x0){_0x2a1b08[_0x3ee579(0x1dc)]=_0x3ee579(0x137);return;}_0x2e4061['forEach'](_0x5c71cb=>{const _0x38c9eb=_0x3ee579,_0xc86423=document['createElement']('div');_0xc86423[_0x38c9eb(0xf9)]=_0x38c9eb(0x1d6),_0xc86423[_0x38c9eb(0x281)]=_0x38c9eb(0x299)+_0x5c71cb[_0x38c9eb(0x29a)]+_0x38c9eb(0x201)+_0x5c71cb[_0x38c9eb(0x270)];const _0x4745b8=document[_0x38c9eb(0x24b)](_0x38c9eb(0x23b));_0x4745b8[_0x38c9eb(0x19c)]=_0x38c9eb(0x103),_0x4745b8['id']=_0x38c9eb(0x241)+_0x5c71cb[_0x38c9eb(0x29a)]+'-'+_0x5c71cb[_0x38c9eb(0x270)],_0x4745b8[_0x38c9eb(0x135)][_0x38c9eb(0x13d)]=_0x5c71cb[_0x38c9eb(0x29a)],_0x4745b8[_0x38c9eb(0x135)][_0x38c9eb(0x270)]=_0x5c71cb['uid'];const _0x3994d7=_0x2e874f['table_selected_entries'][_0x5c71cb['bookName']]?.[_0x38c9eb(0x28b)](String(_0x5c71cb[_0x38c9eb(0x270)]));_0x4745b8[_0x38c9eb(0x2a1)]=!!_0x3994d7;const _0xa84859=document[_0x38c9eb(0x24b)](_0x38c9eb(0x175));_0xa84859[_0x38c9eb(0x13b)]=_0x4745b8['id'],_0xa84859[_0x38c9eb(0x1a2)]=_0x5c71cb['comment']||_0x38c9eb(0x28f),_0xc86423[_0x38c9eb(0x1f9)](_0x4745b8),_0xc86423['appendChild'](_0xa84859),_0x2a1b08[_0x38c9eb(0x1f9)](_0xc86423);});}catch(_0x39a45c){console[_0x3ee579(0x272)](_0x3ee579(0x1d4),_0x39a45c),_0x2a1b08[_0x3ee579(0x1dc)]='加载条目失败。

';}},_0x4584e6=()=>{const _0x1c405d=_0x1eceb1,_0x1b594d=world_names[_0x1c405d(0x2a5)](_0xc97015=>({'name':_0xc97015['replace']('.json',''),'file_name':_0xc97015}));_0x46771c[_0x1c405d(0x1dc)]='',_0x1b594d&&_0x1b594d[_0x1c405d(0x1d8)]>0x0?_0x1b594d[_0x1c405d(0x1f4)](_0x108742=>{const _0x27082e=_0x1c405d,_0x5c007e=document[_0x27082e(0x24b)](_0x27082e(0x2ad));_0x5c007e[_0x27082e(0xf9)]=_0x27082e(0x1d6),_0x5c007e[_0x27082e(0x281)]=_0x108742[_0x27082e(0x244)];const _0x1d916c=document[_0x27082e(0x24b)](_0x27082e(0x23b));_0x1d916c[_0x27082e(0x19c)]='checkbox',_0x1d916c['id']=_0x27082e(0x1c1)+_0x108742[_0x27082e(0x25c)],_0x1d916c[_0x27082e(0x120)]=_0x108742[_0x27082e(0x25c)],_0x1d916c[_0x27082e(0x2a1)]=_0x2e874f[_0x27082e(0x14a)]['includes'](_0x108742[_0x27082e(0x25c)]),_0x1d916c[_0x27082e(0x1a4)](_0x27082e(0x1a7),()=>{const _0x41b326=_0x27082e;_0x1d916c[_0x41b326(0x2a1)]?!_0x2e874f[_0x41b326(0x14a)][_0x41b326(0x28b)](_0x108742[_0x41b326(0x25c)])&&_0x2e874f['table_selected_worldbooks'][_0x41b326(0x22e)](_0x108742[_0x41b326(0x25c)]):_0x2e874f['table_selected_worldbooks']=_0x2e874f[_0x41b326(0x14a)][_0x41b326(0x2ab)](_0x4c3a48=>_0x4c3a48!==_0x108742[_0x41b326(0x25c)]),saveSettingsDebounced(),_0x58546d();});const _0x1a7730=document[_0x27082e(0x24b)](_0x27082e(0x175));_0x1a7730['htmlFor']='wb-check-'+_0x108742[_0x27082e(0x25c)],_0x1a7730[_0x27082e(0x1a2)]=_0x108742[_0x27082e(0x244)],_0x5c007e[_0x27082e(0x1f9)](_0x1d916c),_0x5c007e[_0x27082e(0x1f9)](_0x1a7730),_0x46771c[_0x27082e(0x1f9)](_0x5c007e);}):_0x46771c['innerHTML']=_0x1c405d(0x298),_0x58546d();},_0x2e627e=()=>{const _0x2e99ef=_0x1eceb1,_0x141bee=_0x2e874f[_0x2e99ef(0x250)]===_0x2e99ef(0x10b);_0x16d213['style']['display']=_0x141bee?_0x2e99ef(0x2d4):_0x2e99ef(0x10f),_0x58546d(),_0x141bee&&_0x4584e6();};_0xb4f813[_0x1eceb1(0x2a1)]=_0x2e874f[_0x1eceb1(0x291)],_0x2744f2[_0x1eceb1(0x120)]=_0x2e874f[_0x1eceb1(0x1be)],_0x33bf08[_0x1eceb1(0x1a2)]=_0x2e874f[_0x1eceb1(0x1be)],_0x496fc1[_0x1eceb1(0x1f4)](_0x140d9a=>{const _0x4dab90=_0x1eceb1;_0x140d9a[_0x4dab90(0x2a1)]=_0x140d9a[_0x4dab90(0x120)]===_0x2e874f['table_worldbook_source'];}),_0x2e627e();if(_0xb4f813[_0x1eceb1(0x135)][_0x1eceb1(0x1b6)])return;_0xb4f813[_0x1eceb1(0x1a4)](_0x1eceb1(0x1a7),()=>{const _0x52271b=_0x1eceb1;_0x2e874f[_0x52271b(0x291)]=_0xb4f813[_0x52271b(0x2a1)],saveSettingsDebounced();}),_0x2744f2[_0x1eceb1(0x1a4)](_0x1eceb1(0x23b),()=>{const _0x5b0310=_0x1eceb1;_0x33bf08['textContent']=_0x2744f2[_0x5b0310(0x120)];}),_0x2744f2['addEventListener'](_0x1eceb1(0x1a7),()=>{const _0x1814cc=_0x1eceb1;_0x2e874f[_0x1814cc(0x1be)]=parseInt(_0x2744f2[_0x1814cc(0x120)],0xa),saveSettingsDebounced();}),_0x496fc1[_0x1eceb1(0x1f4)](_0x2e45d8=>{const _0x31d89c=_0x1eceb1;_0x2e45d8['addEventListener'](_0x31d89c(0x1a7),()=>{const _0x37fe2c=_0x31d89c;_0x2e45d8[_0x37fe2c(0x2a1)]&&(_0x2e874f['table_worldbook_source']=_0x2e45d8[_0x37fe2c(0x120)],_0x2e627e(),saveSettingsDebounced());});}),_0x1b24dc[_0x1eceb1(0x1a4)]('click',_0x4584e6),_0x2a1b08[_0x1eceb1(0x1a4)]('change',_0x1a7f04=>{const _0x1b327a=_0x1eceb1;_0x1a7f04['target'][_0x1b327a(0x19c)]===_0x1b327a(0x103)&&_0x2a7082();}),_0xb4f813[_0x1eceb1(0x135)][_0x1eceb1(0x1b6)]=_0x1eceb1(0x123),log(_0x1eceb1(0x1c8),_0x1eceb1(0x243));}export function bindTableEvents(){const _0x8d828d=_0x3c5d74,_0x2d7df1=document[_0x8d828d(0x194)](_0x8d828d(0x161));if(!_0x2d7df1||_0x2d7df1[_0x8d828d(0x135)]['eventsBound'])return;log('开始为表格视图绑定交互事件...',_0x8d828d(0xf7));const _0xb5438=_0x2d7df1[_0x8d828d(0x108)](_0x8d828d(0x247)),_0xa924f1=document[_0x8d828d(0x194)](_0x8d828d(0x1c0)),_0x1ee29f=document[_0x8d828d(0x194)](_0x8d828d(0x16e)),_0x1f87bb=document[_0x8d828d(0x194)](_0x8d828d(0x124)),_0x4fd8c5=document['getElementById'](_0x8d828d(0x17d)),_0x374bba=document[_0x8d828d(0x194)](_0x8d828d(0x1d5)),_0xf4637=document[_0x8d828d(0x194)]('table-configure-rules-btn'),_0x15dea7=()=>{const _0x5e63ae=_0x8d828d,_0x5dced7=extension_settings[extensionName]?.[_0x5e63ae(0x25d)]||_0x5e63ae(0x16c);_0xb5438[_0x5e63ae(0x1f4)](_0x7b6ca6=>{const _0x3d5a3a=_0x5e63ae;_0x7b6ca6['checked']=_0x7b6ca6[_0x3d5a3a(0x120)]===_0x5dced7;});const _0x18e973=_0x5dced7==='secondary-api';_0xa924f1&&(_0xa924f1[_0x5e63ae(0x1b4)][_0x5e63ae(0x267)]=_0x18e973?_0x5e63ae(0x2d4):_0x5e63ae(0x10f)),_0x4fd8c5&&(_0x4fd8c5[_0x5e63ae(0x1b4)][_0x5e63ae(0x267)]=_0x5e63ae(0x21d)),_0x374bba&&_0xf4637&&(_0xf4637['style'][_0x5e63ae(0x267)]=_0x374bba['checked']?_0x5e63ae(0x2d4):'none');};_0xb5438[_0x8d828d(0x1f4)](_0x45362b=>{const _0x56e031=_0x8d828d;_0x45362b[_0x56e031(0x1a4)](_0x56e031(0x1a7),function(){const _0x3a065c=_0x56e031,_0x3afc57=this[_0x3a065c(0x120)];updateAndSaveTableSetting(_0x3a065c(0x25d),_0x3afc57);let _0x160f57=_0x3a065c(0x127);if(_0x3afc57===_0x3a065c(0x2a8))_0x160f57=_0x3a065c(0x10c);if(_0x3afc57===_0x3a065c(0x192))_0x160f57=_0x3a065c(0x149);toastr[_0x3a065c(0xf7)](_0x3a065c(0x20e)+_0x160f57+'。'),_0x15dea7();});});if(_0x1ee29f&&_0x1f87bb){const _0x499544=extension_settings[extensionName]?.[_0x8d828d(0x26c)]||0x4;_0x1ee29f[_0x8d828d(0x120)]=_0x499544,_0x1f87bb[_0x8d828d(0x1a2)]=_0x499544,_0x1ee29f[_0x8d828d(0x1a4)](_0x8d828d(0x23b),function(){_0x1f87bb['textContent']=this['value'];}),_0x1ee29f['addEventListener'](_0x8d828d(0x1a7),function(){const _0xda2265=_0x8d828d;updateAndSaveTableSetting(_0xda2265(0x26c),parseInt(this[_0xda2265(0x120)],0xa)),toastr[_0xda2265(0xf7)]('上下文读取级别已设置为\x20'+this[_0xda2265(0x120)]+'。');});}_0x374bba&&(_0x374bba[_0x8d828d(0x2a1)]=extension_settings[extensionName]?.['table_independent_rules_enabled']??![],_0x374bba[_0x8d828d(0x1a4)](_0x8d828d(0x1a7),()=>{const _0x1feaa1=_0x8d828d;updateAndSaveTableSetting('table_independent_rules_enabled',_0x374bba[_0x1feaa1(0x2a1)]),_0x15dea7();}));_0x15dea7();_0xf4637&&_0xf4637['addEventListener'](_0x8d828d(0x28c),openTableRuleEditor);const _0x2bc39f=()=>{renderTables(),bindInjectionSettings(),bindTemplateEditors();};_0x2bc39f(),bindWorldBookSettings(),bindBatchFillButton(),bindFloorFillButtons(),bindReorganizeButton(),bindNccsApiEvents(),bindChatTableDisplaySetting();const _0x4e4d6c=document[_0x8d828d(0x1a0)](_0x8d828d(0x2bf));_0x4e4d6c&&_0x4e4d6c[_0x8d828d(0x1a4)](_0x8d828d(0x28c),_0x5ae510=>{const _0x32dd4e=_0x8d828d,_0x47f961=_0x5ae510[_0x32dd4e(0x1c6)][_0x32dd4e(0x1ad)](_0x32dd4e(0x2dd));if(!_0x47f961)return;const _0x53a0a5=_0x47f961['dataset'][_0x32dd4e(0x195)];if(!_0x53a0a5)return;const _0x4c8532=_0x47f961[_0x32dd4e(0x1ad)](_0x32dd4e(0x225));if(!_0x4c8532)return;_0x4c8532['querySelectorAll']('.sinan-nav-item')['forEach'](_0x42fb89=>_0x42fb89[_0x32dd4e(0x20b)]['remove'](_0x32dd4e(0x155))),_0x47f961[_0x32dd4e(0x20b)][_0x32dd4e(0x212)](_0x32dd4e(0x155)),_0x4c8532[_0x32dd4e(0x108)](_0x32dd4e(0x2ba))[_0x32dd4e(0x1f4)](_0x3f6986=>_0x3f6986['classList']['remove'](_0x32dd4e(0x155)));const _0x28d987=_0x4c8532[_0x32dd4e(0x1a0)](_0x32dd4e(0x107)+_0x53a0a5+_0x32dd4e(0x119));_0x28d987&&_0x28d987[_0x32dd4e(0x20b)][_0x32dd4e(0x212)](_0x32dd4e(0x155));});const _0x369221=document[_0x8d828d(0x194)](_0x8d828d(0x2d0)),_0x5d6c51=document[_0x8d828d(0x194)](_0x8d828d(0x294)),_0x366d93=document[_0x8d828d(0x194)]('amily2-import-preset-btn'),_0x57d01e=document[_0x8d828d(0x194)]('amily2-import-global-preset-btn'),_0x2ba574=document[_0x8d828d(0x194)]('amily2-clear-global-preset-btn');_0x369221&&_0x369221[_0x8d828d(0x1a4)]('click',()=>_0x234bb0['exportPreset']());_0x5d6c51&&_0x5d6c51[_0x8d828d(0x1a4)]('click',()=>_0x234bb0[_0x8d828d(0x12b)]());_0x366d93&&_0x366d93[_0x8d828d(0x1a4)](_0x8d828d(0x28c),()=>_0x234bb0['importPreset'](_0x2bc39f));_0x57d01e&&_0x57d01e['addEventListener'](_0x8d828d(0x28c),()=>{const _0x57bbb8=_0x8d828d,_0x4b3328=_0x234bb0[_0x57bbb8(0x1a1)]();_0x234bb0[_0x57bbb8(0x148)](()=>{_0x4b3328&&(_0x234bb0['loadTables'](),_0x2bc39f());});});_0x2ba574&&_0x2ba574['addEventListener'](_0x8d828d(0x28c),()=>{const _0x5c9a11=_0x8d828d,_0x5782d1=_0x234bb0[_0x5c9a11(0x1a1)]();_0x234bb0[_0x5c9a11(0x18f)](),_0x5782d1&&(_0x234bb0['loadTables'](),_0x2bc39f());});const _0x4694aa=document['getElementById']('amily2-clear-all-tables-btn');_0x4694aa&&_0x4694aa['addEventListener'](_0x8d828d(0x28c),()=>{confirm('【确认】您确定要清空所有表格的剧情内容吗?此操作将保留表格结构,但会删除所有已填写的行。')&&(_0x234bb0['clearAllTables'](),_0x2bc39f());});const _0x25c875=document[_0x8d828d(0x194)]('add-table-placeholder');_0x25c875&&_0x25c875[_0x8d828d(0x1a4)]('click',()=>{const _0xa80c10=_0x8d828d,_0x351fde=prompt(_0xa80c10(0x158),_0xa80c10(0x269));_0x351fde&&_0x351fde['trim']()&&(_0x234bb0[_0xa80c10(0x106)](_0x351fde[_0xa80c10(0x19d)]()),_0x2bc39f());});const _0x2753d8=getAllTablesContainer();if(_0x2753d8){_0x2753d8[_0x8d828d(0x1a4)](_0x8d828d(0x28c),_0x1c42c1=>{const _0x57c4fd=_0x8d828d,_0x25d0d9=_0x1c42c1[_0x57c4fd(0x1c6)][_0x57c4fd(0x1ad)]('th');if(_0x25d0d9&&_0x25d0d9[_0x57c4fd(0x20b)]['contains'](_0x57c4fd(0x196))){toggleHeaderIndexContextMenu(_0x1c42c1);return;}if(_0x25d0d9&&!_0x25d0d9[_0x57c4fd(0x20b)][_0x57c4fd(0x255)](_0x57c4fd(0x196))){toggleColumnContextMenu(_0x1c42c1);return;}const _0x1ba973=_0x1c42c1[_0x57c4fd(0x1c6)][_0x57c4fd(0x1ad)](_0x57c4fd(0x1f0));if(_0x1ba973){toggleRowContextMenu(_0x1c42c1);return;}const _0x3dc81a=_0x1c42c1[_0x57c4fd(0x1c6)][_0x57c4fd(0x1ad)]('.table-rename-icon');if(_0x3dc81a){const _0x5e9e04=parseInt(_0x3dc81a['dataset'][_0x57c4fd(0x24a)],0xa),_0x2a9f67=_0x234bb0[_0x57c4fd(0x248)](),_0x7bcbb7=_0x2a9f67[_0x5e9e04]?.[_0x57c4fd(0x244)]||'';showTableNameEditor(_0x5e9e04,_0x7bcbb7);return;}const _0x2c6870=_0x1c42c1[_0x57c4fd(0x1c6)][_0x57c4fd(0x1ad)]('button');if(!_0x2c6870)return;const _0x52bd4b=parseInt(_0x2c6870['dataset']['tableIndex'],0xa);if(_0x2c6870[_0x57c4fd(0x19f)](_0x57c4fd(0x27c)))_0x234bb0[_0x57c4fd(0x25f)](_0x52bd4b),_0x2bc39f();else{if(_0x2c6870[_0x57c4fd(0x19f)](_0x57c4fd(0x1c2)))_0x234bb0[_0x57c4fd(0x199)](_0x52bd4b),_0x2bc39f();else{if(_0x2c6870[_0x57c4fd(0x19f)](_0x57c4fd(0x2ac))||_0x2c6870['matches']('.move-table-down-btn')){const _0x10215f=_0x2c6870[_0x57c4fd(0x20b)]['contains'](_0x57c4fd(0x1b8))?'up':_0x57c4fd(0x1da);_0x234bb0['moveTable'](_0x52bd4b,_0x10215f),_0x2bc39f();}else{if(_0x2c6870[_0x57c4fd(0x19f)](_0x57c4fd(0x231)))openRuleEditor(_0x52bd4b);else{if(_0x2c6870[_0x57c4fd(0x19f)]('.delete-table-btn')){const _0xa94c8c=_0x234bb0[_0x57c4fd(0x248)](),_0x130e04=_0xa94c8c[_0x52bd4b]?.[_0x57c4fd(0x244)]||'未知表格';confirm(_0x57c4fd(0x1c5)+_0x130e04+']”\x20吗?此操作不可逆!')&&(_0x234bb0[_0x57c4fd(0x1e8)](_0x52bd4b),_0x2bc39f());}}}}}});if(isTouchDevice()){let _0x1dc79b=0x0,_0x61baf3=null;_0x2753d8['addEventListener']('touchstart',_0x328bad=>{const _0x405854=_0x8d828d,_0x2b23d3=_0x328bad[_0x405854(0x1c6)]['closest']('td');if(!_0x2b23d3||_0x2b23d3['dataset'][_0x405854(0x154)]===undefined)return;const _0x1979b1=new Date()[_0x405854(0x1d9)](),_0x27c55f=_0x1979b1-_0x1dc79b;_0x27c55f<0x12c&&_0x27c55f>0x0&&_0x61baf3===_0x2b23d3&&(_0x328bad[_0x405854(0x2d2)](),_0x2b23d3['getAttribute'](_0x405854(0x2df))!==_0x405854(0x123)&&(_0x2b23d3[_0x405854(0x178)](_0x405854(0x2df),_0x405854(0x123)),setTimeout(()=>_0x2b23d3['focus'](),0x0))),_0x1dc79b=_0x1979b1,_0x61baf3=_0x2b23d3;});}_0x2753d8['addEventListener'](_0x8d828d(0x17a),_0x45ee50=>{const _0x16b929=_0x8d828d,_0x3c0411=_0x45ee50[_0x16b929(0x1c6)];if(_0x3c0411['tagName']!=='TD'||_0x3c0411[_0x16b929(0x21a)](_0x16b929(0x2df))!=='true')return;isTouchDevice()&&_0x3c0411[_0x16b929(0x178)](_0x16b929(0x2df),'false');const _0x2537d1=_0x3c0411[_0x16b929(0x1ad)](_0x16b929(0x216));if(!_0x2537d1)return;const _0x41a554=parseInt(_0x2537d1['dataset'][_0x16b929(0x24a)],0xa),_0x191d69=parseInt(_0x3c0411[_0x16b929(0x1ad)]('tr')[_0x16b929(0x135)][_0x16b929(0x297)],0xa),_0xfeb7b8=parseInt(_0x3c0411[_0x16b929(0x135)][_0x16b929(0x154)],0xa),_0x353a33=_0x3c0411[_0x16b929(0x1a2)],_0x433fa6=_0x2537d1[_0x16b929(0x1ad)]('.amily2-table-wrapper'),_0x539029=_0x433fa6?_0x433fa6[_0x16b929(0xff)]:0x0,_0x272fca=_0x2753d8['scrollTop'];_0x234bb0['addHighlight'](_0x41a554,_0x191d69,_0xfeb7b8);const _0x4fb83a={[_0xfeb7b8]:_0x353a33};_0x234bb0[_0x16b929(0x26f)](_0x41a554,_0x191d69,_0x4fb83a),_0x2bc39f();const _0x2d0970=document[_0x16b929(0x194)](_0x16b929(0x219)+_0x41a554)?.[_0x16b929(0x1ad)](_0x16b929(0x11f));_0x2d0970&&(_0x2d0970[_0x16b929(0xff)]=_0x539029),_0x2753d8['scrollTop']=_0x272fca;},!![]);}_0x2d7df1[_0x8d828d(0x135)][_0x8d828d(0x1b6)]=_0x8d828d(0x123),log(_0x8d828d(0x1f6),_0x8d828d(0x243)),eventSource['on'](event_types[_0x8d828d(0x132)],()=>{const _0x440aeb=_0x8d828d;console[_0x440aeb(0x256)]('['+extensionName+_0x440aeb(0x159)),_0x2bc39f(),setTimeout(()=>{const _0x1e79b5=_0x440aeb,_0x387bea=extension_settings[extensionName];if(_0x387bea&&_0x387bea[_0x1e79b5(0x291)])try{bindWorldBookSettings(),console[_0x1e79b5(0x256)]('['+extensionName+_0x1e79b5(0x29f));}catch(_0x532b36){console['error']('['+extensionName+_0x1e79b5(0xfd),_0x532b36);}},0x64);});}function bindBatchFillButton(){const _0x44dd88=_0x3c5d74,_0x67b5db=document['getElementById'](_0x44dd88(0x27f));if(_0x67b5db){if(_0x67b5db[_0x44dd88(0x135)][_0x44dd88(0x12d)])return;_0x67b5db[_0x44dd88(0x1a4)]('click',_0x38ddd3=>{const _0x1ca788=_0x44dd88,_0x43b1c4=extension_settings[extensionName],_0x1f4d32=_0x43b1c4['table_system_enabled']!==![];if(!_0x1f4d32){_0x38ddd3[_0x1ca788(0x2d2)](),toastr[_0x1ca788(0x222)]('表格系统总开关已关闭,请先启用总开关。');return;}startBatchFilling();}),_0x67b5db[_0x44dd88(0x135)][_0x44dd88(0x12d)]=_0x44dd88(0x123),log('\x22立即填表\x22按钮已成功绑定。','success');}}function bindReorganizeButton(){const _0x55b1c6=_0x3c5d74,_0x3067ad=document[_0x55b1c6(0x194)](_0x55b1c6(0x2c9));if(_0x3067ad){if(_0x3067ad[_0x55b1c6(0x135)][_0x55b1c6(0x1ee)])return;_0x3067ad[_0x55b1c6(0x1a4)](_0x55b1c6(0x28c),async _0x6a316=>{const _0x2f6bfc=_0x55b1c6,_0x17a978=extension_settings[extensionName],_0x4c252c=_0x17a978[_0x2f6bfc(0x2b4)]!==![];if(!_0x4c252c){_0x6a316['preventDefault'](),toastr[_0x2f6bfc(0x222)](_0x2f6bfc(0x217));return;}try{const {reorganizeTableContent:_0x19b827}=await import(_0x2f6bfc(0x21f));await _0x19b827();}catch(_0xf58c0e){console['error']('[内存储司]\x20重新整理功能导入失败:',_0xf58c0e),toastr[_0x2f6bfc(0x272)]('重新整理功能启动失败,请检查系统状态。');}}),_0x3067ad[_0x55b1c6(0x135)][_0x55b1c6(0x1ee)]=_0x55b1c6(0x123),log(_0x55b1c6(0x264),'success');}}function bindFloorFillButtons(){const _0x23f62b=_0x3c5d74,_0x29af27=document['getElementById']('fill-selected-floors-btn'),_0x5e9f7a=document[_0x23f62b(0x194)](_0x23f62b(0x164)),_0x110a49=document[_0x23f62b(0x194)](_0x23f62b(0x131));if(_0x29af27){if(_0x29af27[_0x23f62b(0x135)][_0x23f62b(0x146)])return;_0x29af27[_0x23f62b(0x1a4)](_0x23f62b(0x28c),_0x558760=>{const _0x35b450=_0x23f62b,_0x43446e=extension_settings[extensionName],_0x395b1f=_0x43446e[_0x35b450(0x2b4)]!==![];if(!_0x395b1f){_0x558760[_0x35b450(0x2d2)](),toastr[_0x35b450(0x222)]('表格系统总开关已关闭,请先启用总开关。');return;}const _0x15e963=document[_0x35b450(0x194)]('floor-start-input'),_0x2659a0=document[_0x35b450(0x194)](_0x35b450(0x10a)),_0x563214=parseInt(_0x15e963['value'],0xa),_0x340fb1=parseInt(_0x2659a0[_0x35b450(0x120)],0xa);if(!_0x563214||!_0x340fb1){toastr['warning'](_0x35b450(0x2bd));return;}if(_0x563214>_0x340fb1){toastr['warning'](_0x35b450(0x10e));return;}if(_0x563214<0x1){toastr[_0x35b450(0x222)](_0x35b450(0x1ff));return;}import(_0x35b450(0x1d7))[_0x35b450(0x104)](_0x20d93c=>{const _0x1ce3cd=_0x35b450;_0x20d93c[_0x1ce3cd(0x207)](_0x563214,_0x340fb1);});}),_0x29af27[_0x23f62b(0x135)]['floorEventBound']='true',log('\x22选定楼层填表\x22按钮已成功绑定。','success');}if(_0x5e9f7a){if(_0x5e9f7a['dataset'][_0x23f62b(0x1ac)])return;_0x5e9f7a['addEventListener'](_0x23f62b(0x28c),_0x38bf1e=>{const _0xcace9=_0x23f62b,_0x375fc5=extension_settings[extensionName],_0x26a328=_0x375fc5['table_system_enabled']!==![];if(!_0x26a328){_0x38bf1e[_0xcace9(0x2d2)](),toastr[_0xcace9(0x222)]('表格系统总开关已关闭,请先启用总开关。');return;}import(_0xcace9(0x1d7))[_0xcace9(0x104)](_0x3c007c=>{const _0x5198a0=_0xcace9;_0x3c007c[_0x5198a0(0x1f8)]();});}),_0x5e9f7a['dataset']['currentEventBound']='true',log(_0x23f62b(0x2d1),_0x23f62b(0x243));}if(_0x110a49){if(_0x110a49[_0x23f62b(0x135)]['rollbackEventBound'])return;_0x110a49[_0x23f62b(0x1a4)](_0x23f62b(0x28c),async _0x4c3b95=>{const _0x218a42=_0x23f62b,_0xba12d0=extension_settings[extensionName],_0x18fd51=_0xba12d0['table_system_enabled']!==![];if(!_0x18fd51){_0x4c3b95['preventDefault'](),toastr[_0x218a42(0x222)](_0x218a42(0x217));return;}if(confirm('您确定要将表格状态回退到上一楼,并使用最新消息重新填表吗?'))try{await _0x234bb0[_0x218a42(0x29c)]();}catch(_0x38d8c4){console[_0x218a42(0x272)](_0x218a42(0x2d5),_0x38d8c4),toastr[_0x218a42(0x272)](_0x218a42(0x1a9));}}),_0x110a49['dataset']['rollbackEventBound']=_0x23f62b(0x123),log('\x22回退重填\x22按钮已成功绑定。',_0x23f62b(0x243));}}function bindTemplateEditors(){const _0x25a8d8=_0x3c5d74,_0x1120f4=document[_0x25a8d8(0x194)](_0x25a8d8(0x23f)),_0x11955d=document[_0x25a8d8(0x194)](_0x25a8d8(0x117)),_0x45ee37=document[_0x25a8d8(0x194)](_0x25a8d8(0x152)),_0x3581b3=document[_0x25a8d8(0x194)]('ai-flow-template-editor'),_0xba714e=document[_0x25a8d8(0x194)](_0x25a8d8(0x17f)),_0x291fa2=document[_0x25a8d8(0x194)](_0x25a8d8(0x156));if(!_0x1120f4||!_0x3581b3||!_0x11955d||!_0xba714e){log(_0x25a8d8(0x1b5),_0x25a8d8(0x165));return;}if(_0x11955d[_0x25a8d8(0x135)]['templateEventsBound'])return;_0x1120f4[_0x25a8d8(0x120)]=_0x234bb0['getBatchFillerRuleTemplate'](),_0x3581b3[_0x25a8d8(0x120)]=_0x234bb0['getBatchFillerFlowTemplate'](),_0x11955d[_0x25a8d8(0x1a4)](_0x25a8d8(0x28c),()=>{const _0x48a3bd=_0x25a8d8;_0x234bb0[_0x48a3bd(0x2cf)](_0x1120f4[_0x48a3bd(0x120)]),toastr[_0x48a3bd(0x243)]('规则提示词已保存。'),log(_0x48a3bd(0x176),_0x48a3bd(0x243));}),_0xba714e[_0x25a8d8(0x1a4)](_0x25a8d8(0x28c),()=>{const _0x9b5d95=_0x25a8d8;_0x234bb0['saveBatchFillerFlowTemplate'](_0x3581b3['value']),toastr['success'](_0x9b5d95(0x1c7)),log(_0x9b5d95(0x28e),_0x9b5d95(0x243));}),_0x45ee37[_0x25a8d8(0x1a4)]('click',()=>{const _0x3f4df9=_0x25a8d8;confirm('您确定要将规则提示词恢复为默认设置吗?')&&(_0x1120f4['value']=DEFAULT_AI_RULE_TEMPLATE,_0x234bb0[_0x3f4df9(0x2cf)](_0x1120f4['value']),toastr['info'](_0x3f4df9(0x116)),log(_0x3f4df9(0x238),_0x3f4df9(0xf7)));}),_0x291fa2[_0x25a8d8(0x1a4)](_0x25a8d8(0x28c),()=>{const _0x1bce9e=_0x25a8d8;confirm(_0x1bce9e(0x200))&&(_0x3581b3[_0x1bce9e(0x120)]=DEFAULT_AI_FLOW_TEMPLATE,_0x234bb0[_0x1bce9e(0x21b)](_0x3581b3[_0x1bce9e(0x120)]),toastr['info'](_0x1bce9e(0x259)),log(_0x1bce9e(0x22f),'info'));}),_0x11955d[_0x25a8d8(0x135)][_0x25a8d8(0x286)]=_0x25a8d8(0x123),_0xba714e[_0x25a8d8(0x135)]['templateEventsBound']=_0x25a8d8(0x123),log(_0x25a8d8(0x1c4),_0x25a8d8(0x243));}function bindNccsApiEvents(){const _0x1cb815=_0x3c5d74,_0x3073fa=extension_settings[extensionName];if(_0x3073fa['nccsEnabled']===undefined)_0x3073fa[_0x1cb815(0x1e3)]=![];if(_0x3073fa[_0x1cb815(0x29e)]===undefined)_0x3073fa['nccsApiMode']='openai_test';if(_0x3073fa[_0x1cb815(0x167)]===undefined)_0x3073fa['nccsApiUrl']=_0x1cb815(0x266);if(_0x3073fa['nccsApiKey']===undefined)_0x3073fa[_0x1cb815(0x229)]='';if(_0x3073fa[_0x1cb815(0x15f)]===undefined)_0x3073fa[_0x1cb815(0x15f)]='';if(_0x3073fa[_0x1cb815(0x2e2)]===undefined)_0x3073fa[_0x1cb815(0x2e2)]=0x7d0;if(_0x3073fa[_0x1cb815(0x276)]===undefined)_0x3073fa['nccsTemperature']=0.7;if(_0x3073fa[_0x1cb815(0x174)]===undefined)_0x3073fa[_0x1cb815(0x174)]='';const _0x141462=document['getElementById']('nccs-api-enabled'),_0x243d5a=document['getElementById'](_0x1cb815(0x185)),_0x1ae72d=document[_0x1cb815(0x194)](_0x1cb815(0x151)),_0x3e32d3=document[_0x1cb815(0x194)]('nccs-api-url'),_0x3ce78a=document[_0x1cb815(0x194)](_0x1cb815(0x20f)),_0x1751a2=document[_0x1cb815(0x194)](_0x1cb815(0x2b6)),_0x2dc881=document[_0x1cb815(0x194)](_0x1cb815(0x227)),_0x24a2d3=document[_0x1cb815(0x194)]('nccs-max-tokens-value'),_0x346a9e=document[_0x1cb815(0x194)](_0x1cb815(0x13a)),_0x4c9b30=document[_0x1cb815(0x194)]('nccs-temperature-value'),_0x14c5af=document[_0x1cb815(0x194)]('nccs-sillytavern-preset'),_0x28bc5e=document[_0x1cb815(0x194)](_0x1cb815(0x17c)),_0x5c323a=document[_0x1cb815(0x194)]('nccs-fetch-models');if(!_0x141462||!_0x243d5a)return;_0x141462[_0x1cb815(0x2a1)]=_0x3073fa[_0x1cb815(0x1e3)];if(_0x1ae72d)_0x1ae72d[_0x1cb815(0x120)]=_0x3073fa[_0x1cb815(0x29e)];if(_0x3e32d3)_0x3e32d3[_0x1cb815(0x120)]=_0x3073fa[_0x1cb815(0x167)];if(_0x3ce78a)_0x3ce78a[_0x1cb815(0x120)]=_0x3073fa['nccsApiKey'];if(_0x1751a2)_0x1751a2[_0x1cb815(0x120)]=_0x3073fa[_0x1cb815(0x15f)];if(_0x2dc881){_0x2dc881[_0x1cb815(0x120)]=_0x3073fa['nccsMaxTokens'];if(_0x24a2d3)_0x24a2d3[_0x1cb815(0x1a2)]=_0x3073fa['nccsMaxTokens'];}if(_0x346a9e){_0x346a9e[_0x1cb815(0x120)]=_0x3073fa[_0x1cb815(0x276)];if(_0x4c9b30)_0x4c9b30[_0x1cb815(0x1a2)]=_0x3073fa[_0x1cb815(0x276)];}if(_0x14c5af)_0x14c5af[_0x1cb815(0x120)]=_0x3073fa[_0x1cb815(0x174)]||'';const _0x7cbb2e=()=>{const _0x7e2b70=_0x1cb815;_0x243d5a['style']['display']=_0x141462[_0x7e2b70(0x2a1)]?_0x7e2b70(0x2d4):'none';};_0x7cbb2e();const _0x1bb717=()=>{const _0x4036e3=_0x1cb815;if(!_0x1ae72d)return;const _0x369319=_0x1ae72d[_0x4036e3(0x120)]==='sillytavern_preset',_0x354f05=_0x1ae72d[_0x4036e3(0x120)]===_0x4036e3(0x170),_0x3cbfda=_0x14c5af?.[_0x4036e3(0x1ad)]('.amily2_opt_settings_block');_0x3cbfda&&(_0x3cbfda['style']['display']=_0x369319?'block':_0x4036e3(0x10f));const _0x401b8c=[{'element':_0x3e32d3,'containerId':null},{'element':_0x3ce78a,'containerId':null},{'element':_0x1751a2,'containerId':null},{'element':_0x2dc881,'containerId':null},{'element':_0x346a9e,'containerId':null}];_0x401b8c[_0x4036e3(0x1f4)](({element:_0x2e0763})=>{const _0x433ae6=_0x4036e3;if(_0x2e0763){const _0x1754a5=_0x2e0763[_0x433ae6(0x1ad)](_0x433ae6(0x252));_0x1754a5&&(_0x1754a5[_0x433ae6(0x1b4)][_0x433ae6(0x267)]=_0x369319?_0x433ae6(0x10f):_0x433ae6(0x2d4));}});const _0x129150=_0x28bc5e?.[_0x4036e3(0x1ad)](_0x4036e3(0x1ba));_0x129150&&(_0x129150[_0x4036e3(0x1b4)]['display']=_0x4036e3(0x21d));};_0x1bb717(),_0x141462[_0x1cb815(0x1a4)](_0x1cb815(0x1a7),()=>{const _0x4d8a15=_0x1cb815;_0x3073fa[_0x4d8a15(0x1e3)]=_0x141462[_0x4d8a15(0x2a1)],saveSettingsDebounced(),_0x7cbb2e(),log(_0x4d8a15(0x169)+(_0x141462[_0x4d8a15(0x2a1)]?_0x4d8a15(0x24e):_0x4d8a15(0x249)),'info');});_0x1ae72d&&_0x1ae72d[_0x1cb815(0x1a4)](_0x1cb815(0x1a7),()=>{const _0x290b06=_0x1cb815;_0x3073fa[_0x290b06(0x29e)]=_0x1ae72d['value'],saveSettingsDebounced(),_0x1bb717(),log(_0x290b06(0xfa)+_0x1ae72d[_0x290b06(0x120)],_0x290b06(0xf7));});if(_0x3e32d3){const _0x449821=()=>{const _0x1dd89a=_0x1cb815;_0x3073fa[_0x1dd89a(0x167)]=_0x3e32d3[_0x1dd89a(0x120)],saveSettingsDebounced();};_0x3e32d3[_0x1cb815(0x1a4)]('blur',_0x449821);}if(_0x3ce78a){const _0x5e350f=()=>{const _0x3e45cb=_0x1cb815;_0x3073fa[_0x3e45cb(0x229)]=_0x3ce78a[_0x3e45cb(0x120)],saveSettingsDebounced();};_0x3ce78a[_0x1cb815(0x1a4)]('blur',_0x5e350f);}if(_0x1751a2){const _0x2b1fa4=()=>{const _0x4ed1a5=_0x1cb815;_0x3073fa['nccsModel']=_0x1751a2[_0x4ed1a5(0x120)],saveSettingsDebounced();};_0x1751a2[_0x1cb815(0x1a4)](_0x1cb815(0x17a),_0x2b1fa4),_0x1751a2['addEventListener'](_0x1cb815(0x23b),_0x2b1fa4);}_0x2dc881&&_0x24a2d3&&(_0x2dc881[_0x1cb815(0x1a4)](_0x1cb815(0x23b),()=>{const _0x5c638a=_0x1cb815;_0x24a2d3['textContent']=_0x2dc881[_0x5c638a(0x120)];}),_0x2dc881[_0x1cb815(0x1a4)](_0x1cb815(0x1a7),()=>{const _0xefe2d=_0x1cb815;_0x3073fa[_0xefe2d(0x2e2)]=parseInt(_0x2dc881[_0xefe2d(0x120)]),saveSettingsDebounced();}));_0x346a9e&&_0x4c9b30&&(_0x346a9e[_0x1cb815(0x1a4)](_0x1cb815(0x23b),()=>{const _0x1bc90e=_0x1cb815;_0x4c9b30[_0x1bc90e(0x1a2)]=_0x346a9e[_0x1bc90e(0x120)];}),_0x346a9e[_0x1cb815(0x1a4)](_0x1cb815(0x1a7),()=>{const _0x1a75ed=_0x1cb815;_0x3073fa[_0x1a75ed(0x276)]=parseFloat(_0x346a9e[_0x1a75ed(0x120)]),saveSettingsDebounced();}));_0x14c5af&&_0x14c5af[_0x1cb815(0x1a4)](_0x1cb815(0x1a7),()=>{const _0x353f3d=_0x1cb815;_0x3073fa[_0x353f3d(0x174)]=_0x14c5af[_0x353f3d(0x120)],saveSettingsDebounced();});_0x28bc5e&&_0x28bc5e[_0x1cb815(0x1a4)](_0x1cb815(0x28c),async()=>{const _0x19f339=_0x1cb815;_0x28bc5e['disabled']=!![],_0x28bc5e['innerHTML']=_0x19f339(0x2a3);try{const _0x441ec2=await testNccsApiConnection();_0x441ec2?(toastr[_0x19f339(0x243)](_0x19f339(0x166)),log('Nccs\x20API连接测试成功',_0x19f339(0x243))):(toastr[_0x19f339(0x272)](_0x19f339(0x102)),log('Nccs\x20API连接测试失败',_0x19f339(0x272)));}catch(_0x3f8ee0){toastr['error']('Nccs\x20API连接测试出错:'+_0x3f8ee0[_0x19f339(0x228)]),log(_0x19f339(0x115)+_0x3f8ee0[_0x19f339(0x228)],_0x19f339(0x272));}finally{_0x28bc5e[_0x19f339(0x187)]=![],_0x28bc5e['innerHTML']=_0x19f339(0x113);}});_0x5c323a&&_0x5c323a['addEventListener'](_0x1cb815(0x28c),async()=>{const _0x1dba0f=_0x1cb815;_0x5c323a[_0x1dba0f(0x187)]=!![],_0x5c323a[_0x1dba0f(0x1dc)]=_0x1dba0f(0x168);_0x3e32d3&&(_0x3073fa[_0x1dba0f(0x167)]=_0x3e32d3[_0x1dba0f(0x120)]);_0x3ce78a&&(_0x3073fa['nccsApiKey']=_0x3ce78a[_0x1dba0f(0x120)]);saveSettingsDebounced();try{const _0x90fb15=await fetchNccsModels();if(_0x90fb15&&_0x90fb15['length']>0x0){let _0x21b13f=document['getElementById']('nccs-api-model-select');!_0x21b13f&&(_0x21b13f=document[_0x1dba0f(0x24b)](_0x1dba0f(0x126)),_0x21b13f['id']=_0x1dba0f(0x1a3),_0x21b13f[_0x1dba0f(0xf9)]=_0x1dba0f(0x138),_0x1751a2[_0x1dba0f(0x261)][_0x1dba0f(0x1fe)](_0x21b13f,_0x1751a2[_0x1dba0f(0x2d8)])),_0x21b13f[_0x1dba0f(0x1dc)]=_0x1dba0f(0x22b),_0x90fb15['forEach'](_0x327be7=>{const _0x116040=_0x1dba0f,_0x361e68=document[_0x116040(0x24b)]('option');_0x361e68[_0x116040(0x120)]=_0x327be7['id']||_0x327be7[_0x116040(0x244)],_0x361e68[_0x116040(0x1a2)]=_0x327be7[_0x116040(0x244)]||_0x327be7['id'],(_0x327be7['id']||_0x327be7[_0x116040(0x244)])===_0x3073fa[_0x116040(0x15f)]&&(_0x361e68[_0x116040(0x253)]=!![]),_0x21b13f[_0x116040(0x1f9)](_0x361e68);}),_0x1751a2[_0x1dba0f(0x1b4)][_0x1dba0f(0x267)]=_0x1dba0f(0x10f),_0x21b13f[_0x1dba0f(0x1b4)]['display']=_0x1dba0f(0x2d4),_0x21b13f['addEventListener'](_0x1dba0f(0x1a7),()=>{const _0x7e98=_0x1dba0f,_0x1f74fb=_0x21b13f[_0x7e98(0x120)];_0x3073fa[_0x7e98(0x15f)]=_0x1f74fb,_0x1751a2[_0x7e98(0x120)]=_0x1f74fb,saveSettingsDebounced();}),toastr['success']('成功获取\x20'+_0x90fb15[_0x1dba0f(0x1d8)]+_0x1dba0f(0x1fb)),log(_0x1dba0f(0x26b)+_0x90fb15[_0x1dba0f(0x1d8)]+_0x1dba0f(0x1fb),_0x1dba0f(0x243));}else toastr[_0x1dba0f(0x222)]('未获取到可用模型'),log(_0x1dba0f(0x2b1),_0x1dba0f(0x165));}catch(_0x18b288){toastr['error'](_0x1dba0f(0x10d)+_0x18b288[_0x1dba0f(0x228)]),log('Nccs\x20API获取模型失败:'+_0x18b288[_0x1dba0f(0x228)],_0x1dba0f(0x272));}finally{_0x5c323a[_0x1dba0f(0x187)]=![],_0x5c323a[_0x1dba0f(0x1dc)]=_0x1dba0f(0x2aa);}});const _0x53feea=async()=>{const _0x47b671=_0x1cb815;if(!_0x14c5af)return;try{const _0x544ce8=getContext();if(!_0x544ce8?.[_0x47b671(0x11d)]?.[_0x47b671(0x144)]?.[_0x47b671(0x16f)])throw new Error(_0x47b671(0x1c3));const _0x3cc830=_0x544ce8[_0x47b671(0x11d)][_0x47b671(0x144)][_0x47b671(0x16f)],_0x432ecd=_0x3073fa[_0x47b671(0x174)];_0x14c5af[_0x47b671(0x1dc)]='',_0x14c5af[_0x47b671(0x1f9)](new Option('选择预设','',![],![])),_0x3cc830&&_0x3cc830[_0x47b671(0x1d8)]>0x0?(_0x3cc830[_0x47b671(0x1f4)](_0x36ad92=>{const _0x4100ad=_0x47b671,_0x5fc55f=_0x36ad92['id']===_0x432ecd,_0x1afdbc=new Option(_0x36ad92[_0x4100ad(0x244)],_0x36ad92['id'],_0x5fc55f,_0x5fc55f);_0x14c5af['appendChild'](_0x1afdbc);}),log('成功加载\x20'+_0x3cc830[_0x47b671(0x1d8)]+_0x47b671(0x24c),_0x47b671(0x243))):log(_0x47b671(0x17b),'warn');}catch(_0x521da4){log(_0x47b671(0x1b7)+_0x521da4[_0x47b671(0x228)],_0x47b671(0x272));}};_0x1ae72d&&_0x14c5af&&(_0x1ae72d['addEventListener'](_0x1cb815(0x1a7),()=>{const _0x5ad3c2=_0x1cb815;_0x1ae72d[_0x5ad3c2(0x120)]===_0x5ad3c2(0x1f5)&&_0x53feea();}),_0x3073fa[_0x1cb815(0x29e)]===_0x1cb815(0x1f5)&&_0x53feea()),log(_0x1cb815(0x223),_0x1cb815(0x243));}function bindChatTableDisplaySetting(){const _0xc19914=_0x3c5d74,_0x2ee54e=extension_settings[extensionName],_0x4028df=document[_0xc19914(0x194)](_0xc19914(0x1cb)),_0x1c362c=document[_0xc19914(0x194)](_0xc19914(0x100));if(!_0x4028df||!_0x1c362c){log(_0xc19914(0x14d),_0xc19914(0x165));return;}_0x4028df['checked']=_0x2ee54e[_0xc19914(0x193)]===!![],_0x1c362c['checked']=_0x2ee54e['render_on_every_message']===!![];const _0x28b808=()=>{const _0x13b555=_0xc19914;_0x4028df[_0x13b555(0x2a1)]?(_0x1c362c['disabled']=![],_0x1c362c[_0x13b555(0x1ad)](_0x13b555(0x213))[_0x13b555(0x1b4)][_0x13b555(0x20c)]='1'):(_0x1c362c[_0x13b555(0x187)]=!![],_0x1c362c[_0x13b555(0x1ad)](_0x13b555(0x213))[_0x13b555(0x1b4)][_0x13b555(0x20c)]=_0x13b555(0x1ec));};_0x28b808(),_0x4028df['addEventListener'](_0xc19914(0x1a7),()=>{const _0xc9bbd5=_0xc19914;_0x2ee54e['show_table_in_chat']=_0x4028df[_0xc9bbd5(0x2a1)],saveSettingsDebounced(),toastr[_0xc9bbd5(0xf7)]('聊天内表格显示已'+(_0x4028df[_0xc9bbd5(0x2a1)]?'开启':'关闭')+'。'),_0x28b808();}),_0x1c362c[_0xc19914(0x1a4)](_0xc19914(0x1a7),()=>{const _0x4702dd=_0xc19914;_0x2ee54e[_0x4702dd(0xfc)]=_0x1c362c[_0x4702dd(0x2a1)],saveSettingsDebounced(),toastr[_0x4702dd(0xf7)](_0x4702dd(0x186)+(_0x1c362c[_0x4702dd(0x2a1)]?'开启':'关闭')+_0x4702dd(0x2db));}),log(_0xc19914(0x1c9),'success');} +import * as TableManager from '../core/table-system/manager.js'; +import { log } from '../core/table-system/logger.js'; +import { extension_settings, getContext } from '/scripts/extensions.js'; +import { extensionName } from '../utils/settings.js'; +import { updateOrInsertTableInChat } from './message-table-renderer.js'; +import { saveSettingsDebounced } from '/script.js'; +import { startBatchFilling } from '../core/table-system/batch-filler.js'; +import { showHtmlModal } from './page-window.js'; +import { DEFAULT_AI_RULE_TEMPLATE, DEFAULT_AI_FLOW_TEMPLATE } from '../core/table-system/settings.js'; +import { world_names, loadWorldInfo } from '/scripts/world-info.js'; +import { safeCharLorebooks, safeLorebookEntries } from '../core/tavernhelper-compatibility.js'; +import { characters, this_chid, eventSource, event_types } from "/script.js"; +import { fetchNccsModels, testNccsApiConnection } from '../core/api/NccsApi.js'; + +const isTouchDevice = () => window.matchMedia('(pointer: coarse)').matches; +const getAllTablesContainer = () => document.getElementById('all-tables-container'); + +let isResizing = false; + + +function toggleRowContextMenu(event) { + event.preventDefault(); + event.stopPropagation(); + + const targetTd = event.target.closest('td.index-col'); + if (!targetTd) return; + + const tableWrapper = targetTd.closest('.amily2-table-wrapper'); + if (!tableWrapper) return; + + const isActive = targetTd.classList.contains('amily2-menu-open'); + document.querySelectorAll('.amily2-menu-open').forEach(openEl => { + if (openEl !== targetTd) { + openEl.classList.remove('amily2-menu-open'); + openEl.style.zIndex = ''; + openEl.style.position = ''; + const otherWrapper = openEl.closest('.amily2-table-wrapper'); + if (otherWrapper) { + otherWrapper.style.overflowX = 'auto'; + otherWrapper.style.zIndex = ''; + otherWrapper.style.position = ''; + } + } + }); + + targetTd.classList.toggle('amily2-menu-open'); + + if (targetTd.classList.contains('amily2-menu-open')) { + tableWrapper.style.overflowX = 'visible'; + tableWrapper.style.position = 'relative'; + tableWrapper.style.zIndex = '10'; + targetTd.style.position = 'relative'; + targetTd.style.zIndex = '100'; + } else { + tableWrapper.style.overflowX = 'auto'; + tableWrapper.style.position = ''; + tableWrapper.style.zIndex = ''; + targetTd.style.position = ''; + targetTd.style.zIndex = ''; + } + + const closeMenu = (e) => { + if (!targetTd.contains(e.target)) { + targetTd.classList.remove('amily2-menu-open'); + targetTd.style.position = ''; + targetTd.style.zIndex = ''; + tableWrapper.style.overflowX = 'auto'; + tableWrapper.style.position = ''; + tableWrapper.style.zIndex = ''; + document.removeEventListener('click', closeMenu, true); + } + }; + + if (targetTd.classList.contains('amily2-menu-open')) { + setTimeout(() => { + document.addEventListener('click', closeMenu, true); + }, 0); + } +} + + +function toggleColumnContextMenu(event) { + if (isResizing || event.target.classList.contains('amily2-resizer')) { + return; + } + event.preventDefault(); + event.stopPropagation(); + + const targetTh = event.target.closest('th'); + if (!targetTh) return; + + const tableWrapper = targetTh.closest('.amily2-table-wrapper'); + if (!tableWrapper) return; + + const isActive = targetTh.classList.contains('amily2-menu-open'); + + document.querySelectorAll('th.amily2-menu-open').forEach(openTh => { + if (openTh !== targetTh) { + openTh.classList.remove('amily2-menu-open'); + const otherWrapper = openTh.closest('.amily2-table-wrapper'); + if (otherWrapper) { + otherWrapper.style.overflowX = 'auto'; + otherWrapper.style.zIndex = ''; + otherWrapper.style.position = ''; + } + } + }); + + targetTh.classList.toggle('amily2-menu-open'); + + if (targetTh.classList.contains('amily2-menu-open')) { + tableWrapper.style.overflowX = 'visible'; + tableWrapper.style.position = 'relative'; + tableWrapper.style.zIndex = '10'; + } else { + tableWrapper.style.overflowX = 'auto'; + tableWrapper.style.position = ''; + tableWrapper.style.zIndex = ''; + } + + const closeMenu = (e) => { + if (!targetTh.contains(e.target)) { + targetTh.classList.remove('amily2-menu-open'); + tableWrapper.style.overflowX = 'auto'; + tableWrapper.style.position = ''; + tableWrapper.style.zIndex = ''; + document.removeEventListener('click', closeMenu, true); + } + }; + + // If the menu was opened, set up the listener to close it + if (targetTh.classList.contains('amily2-menu-open')) { + setTimeout(() => { + document.addEventListener('click', closeMenu, true); + }, 0); + } +} + + +function toggleHeaderIndexContextMenu(event) { + event.preventDefault(); + event.stopPropagation(); + + const targetTh = event.target.closest('th.index-col'); + if (!targetTh) return; + + const menu = targetTh.querySelector('.amily2-context-menu'); + if (!menu) return; + + const isActive = menu.classList.contains('amily2-menu-active'); + + document.querySelectorAll('.amily2-context-menu.amily2-menu-active').forEach(activeMenu => { + activeMenu.classList.remove('amily2-menu-active'); + }); + + if (!isActive) { + menu.classList.add('amily2-menu-active'); + } + + const closeMenu = (e) => { + if (!menu.contains(e.target)) { + menu.classList.remove('amily2-menu-active'); + document.removeEventListener('click', closeMenu, true); + } + }; + + setTimeout(() => { + if (menu.classList.contains('amily2-menu-active')) { + document.addEventListener('click', closeMenu, true); + } + }, 0); +} + + +function showInputDialog({ title, label, currentValue, placeholder, onSave }) { + const dialogHtml = ` + + + `; + + const dialogElement = $(dialogHtml).appendTo('body'); + const input = dialogElement.find('#generic-input'); + + const closeDialog = () => { + dialogElement[0].close(); + dialogElement.remove(); + }; + + const save = () => { + const newValue = input.val().trim(); + if (newValue && newValue !== currentValue) { + onSave(newValue); + } else if (!newValue) { + toastr.warning('名称不能为空!'); + input.focus(); + return; + } + closeDialog(); + }; + + dialogElement.find('.popup-button-ok').on('click', save); + dialogElement.find('.popup-button-cancel').on('click', closeDialog); + input.on('keypress', (e) => { if (e.which === 13) save(); }); + input.on('keydown', (e) => { if (e.which === 27) closeDialog(); }); + + dialogElement[0].showModal(); + input.focus().select(); +} + + +function showColumnNameEditor(tableIndex, colIndex, currentName) { + showInputDialog({ + title: '编辑列名', + label: '列名:', + currentValue: currentName, + placeholder: '请输入列名...', + onSave: (newName) => { + TableManager.updateHeader(tableIndex, colIndex, newName); + renderTables(); + toastr.success(`列名已更新为 "${newName}"`); + } + }); +} + + +function showTableNameEditor(tableIndex, currentName) { + showInputDialog({ + title: '编辑表名', + label: '表名:', + currentValue: currentName, + placeholder: '请输入表名...', + onSave: (newName) => { + TableManager.renameTable(tableIndex, newName); + renderTables(); + toastr.success(`表名已更新为 "${newName}"`); + } + }); +} + + +function positionContextMenu(menu, trigger) { + menu.style.position = 'absolute'; + menu.style.zIndex = '10000'; + menu.style.left = '0'; + menu.style.right = 'auto'; + menu.style.marginTop = ''; + menu.style.marginBottom = ''; + menu.style.maxHeight = ''; + menu.style.overflowY = ''; + + const viewportHeight = window.innerHeight; + const triggerRect = trigger.getBoundingClientRect(); + const menuHeight = 200; + const scrollContainer = trigger.closest('.hly-scroll'); + const containerRect = scrollContainer ? scrollContainer.getBoundingClientRect() : { top: 0, bottom: viewportHeight }; + + const spaceBelow = Math.min(viewportHeight, containerRect.bottom) - triggerRect.bottom; + const spaceAbove = triggerRect.top - Math.max(0, containerRect.top); + + if (spaceBelow < menuHeight && spaceAbove > spaceBelow) { + menu.style.top = 'auto'; + menu.style.bottom = '100%'; + menu.style.marginBottom = '2px'; + } else { + menu.style.top = '100%'; + menu.style.bottom = 'auto'; + menu.style.marginTop = '2px'; + } + + const menuWidth = 160; + const table = trigger.closest('table'); + const tableWrapper = table ? table.closest('div[style*="overflowX"]') : null; + + if (tableWrapper) { + const wrapperRect = tableWrapper.getBoundingClientRect(); + const triggerLeftInWrapper = triggerRect.left - wrapperRect.left; + + if (triggerLeftInWrapper + menuWidth > wrapperRect.width - 20) { + menu.style.left = 'auto'; + menu.style.right = '0'; + } + } +} + + +export function renderTables() { + let tables = TableManager.getMemoryState(); + if (!tables) { + log('内存状态为空,从聊天记录加载作为后备。', 'warn'); + tables = TableManager.loadTables(); + } + + const container = getAllTablesContainer(); + + if (!tables || !container) { + console.error('[内存储司-工部] 缺少表格数据或容器,无法渲染。'); + return; + } + + const highlights = TableManager.getHighlights(); + const updatedTables = TableManager.getUpdatedTables(); // 【V15.2 新增】获取被更新的表格 + const fragment = document.createDocumentFragment(); + + const placeholder = document.getElementById('add-table-placeholder'); + if (placeholder) { + placeholder.remove(); + } + + tables.forEach((tableData, tableIndex) => { + const header = document.createElement('div'); + header.style.display = 'flex'; + header.style.justifyContent = 'space-between'; + header.style.alignItems = 'center'; + const title = document.createElement('h3'); + if (updatedTables.has(tableIndex)) { + title.classList.add('table-updated'); // 【V15.2 新增】为更新的表格添加高亮 + } + title.innerHTML = ` ${tableData.name}`; + const controls = document.createElement('div'); + controls.className = 'table-controls'; + + const moveUpBtn = tableIndex > 0 ? `` : ''; + const moveDownBtn = tableIndex < tables.length - 1 ? `` : ''; + + controls.innerHTML = ` + ${moveUpBtn} + ${moveDownBtn} + + + `; + header.appendChild(title); + header.appendChild(controls); + fragment.appendChild(header); + + const tableWrapper = document.createElement('div'); + tableWrapper.className = 'amily2-table-wrapper'; + + const tableElement = document.createElement('table'); + tableElement.id = `amily2-table-${tableIndex}`; + tableElement.dataset.tableIndex = tableIndex; + + const colgroup = document.createElement('colgroup'); + const indexCol = document.createElement('col'); + indexCol.style.width = '40px'; + colgroup.appendChild(indexCol); + + if (tableData.headers) { + tableData.headers.forEach((_, colIndex) => { + const col = document.createElement('col'); + // Assign a default width of 120px if none is specified + const colWidth = (tableData.columnWidths && tableData.columnWidths[colIndex]) ? tableData.columnWidths[colIndex] : 90; + col.style.width = `${colWidth}px`; + colgroup.appendChild(col); + }); + } + tableElement.appendChild(colgroup); + + // Explicitly calculate and set the total table width to override CSS conflicts + let totalWidth = 0; + const cols = colgroup.querySelectorAll('col'); + cols.forEach(col => { + totalWidth += parseInt(col.style.width, 10); + }); + tableElement.style.width = `${totalWidth}px`; + + const thead = tableElement.createTHead(); + const headerRow = thead.insertRow(); + + const indexTh = document.createElement('th'); + indexTh.className = 'index-col'; + indexTh.textContent = '#'; + indexTh.style.cursor = 'pointer'; + indexTh.title = '点击添加第一行'; + + // 为表头的 # 号添加特殊的上下文菜单(仅在表格为空时显示) + if (!tableData.rows || tableData.rows.length === 0) { + const headerMenu = document.createElement('div'); + headerMenu.className = 'amily2-context-menu amily2-header-menu'; + headerMenu.style.display = 'none'; // 默认隐藏 + + const addRowButton = document.createElement('button'); + addRowButton.innerHTML = ' 创建第一行'; + addRowButton.className = 'menu_button small_button'; + addRowButton.addEventListener('click', (e) => { + e.stopPropagation(); + TableManager.addRow(tableIndex); + renderTables(); + }); + + headerMenu.appendChild(addRowButton); + indexTh.appendChild(headerMenu); + + // 为表头添加直接的点击事件监听器 + indexTh.addEventListener('click', (e) => { + e.preventDefault(); + e.stopPropagation(); + console.log('Header # clicked for table', tableIndex); + + // 直接执行添加行操作 + TableManager.addRow(tableIndex); + renderTables(); + toastr.success('已添加第一行'); + }); + } + + headerRow.appendChild(indexTh); + + tableData.headers.forEach((headerText, colIndex) => { + const th = document.createElement('th'); + th.dataset.colIndex = colIndex; + th.style.cursor = 'pointer'; + + const headerContent = document.createElement('span'); + headerContent.className = 'amily2-header-text'; + headerContent.textContent = headerText; + th.appendChild(headerContent); + + const menu = document.createElement('div'); + menu.className = 'amily2-context-menu'; + + const actions = [ + { label: '向左移动', action: 'move-left', icon: 'fa-arrow-left' }, + { label: '向右移动', action: 'move-right', icon: 'fa-arrow-right' }, + { label: '在左加列', action: 'add-left', icon: 'fa-plus-circle' }, + { label: '在右加列', action: 'add-right', icon: 'fa-plus-circle' }, + { label: '编辑列名', action: 'rename', icon: 'fa-pen' }, + { label: '删除该列', action: 'delete', icon: 'fa-trash-alt', isDanger: true } + ]; + + actions.forEach(({ label, action, icon, isDanger }) => { + const button = document.createElement('button'); + button.textContent = label; + button.className = 'menu_button small_button'; + if (isDanger) button.classList.add('danger'); + + button.addEventListener('click', (e) => { + e.stopPropagation(); + switch (action) { + case 'move-left': + TableManager.moveColumn(tableIndex, colIndex, 'left'); + break; + case 'move-right': + TableManager.moveColumn(tableIndex, colIndex, 'right'); + break; + case 'add-left': + TableManager.insertColumn(tableIndex, colIndex, 'left'); + break; + case 'add-right': + TableManager.insertColumn(tableIndex, colIndex, 'right'); + break; + case 'rename': + showColumnNameEditor(tableIndex, colIndex, headerText); + break; + case 'delete': + if (confirm(`您确定要删除 “${headerText}” 列吗?`)) { + TableManager.deleteColumn(tableIndex, colIndex); + } + break; + } + renderTables(); + }); + menu.appendChild(button); + }); + + th.appendChild(menu); + + const resizer = document.createElement('div'); + resizer.className = 'amily2-resizer'; + th.appendChild(resizer); + + const startResize = (startEvent) => { + startEvent.preventDefault(); + startEvent.stopPropagation(); + + isResizing = true; + + const table = startEvent.target.closest('table'); + const th = startEvent.target.parentElement; + const col = table.querySelector(`colgroup > col:nth-child(${th.cellIndex + 1})`); + + const isTouchEvent = startEvent.type.startsWith('touch'); + const startX = isTouchEvent ? startEvent.touches[0].clientX : startEvent.clientX; + const startWidth = th.offsetWidth; + + const onMove = (moveEvent) => { + const currentX = isTouchEvent ? moveEvent.touches[0].clientX : moveEvent.clientX; + const newWidth = startWidth + (currentX - startX); + if (newWidth > 50) { + col.style.width = `${newWidth}px`; + } + }; + + const onEnd = () => { + document.removeEventListener('mousemove', onMove); + document.removeEventListener('mouseup', onEnd); + document.removeEventListener('touchmove', onMove); + document.removeEventListener('touchend', onEnd); + + const finalWidth = parseInt(col.style.width, 10); + TableManager.updateColumnWidth(tableIndex, colIndex, finalWidth); + + setTimeout(() => { isResizing = false; }, 0); + }; + + if (isTouchEvent) { + document.addEventListener('touchmove', onMove, { passive: false }); + document.addEventListener('touchend', onEnd); + } else { + document.addEventListener('mousemove', onMove); + document.addEventListener('mouseup', onEnd); + } + }; + + resizer.addEventListener('mousedown', startResize); + resizer.addEventListener('touchstart', startResize, { passive: false }); + + headerRow.appendChild(th); + }); + + const tbody = tableElement.createTBody(); + if (tableData.rows && tableData.rows.length > 0) { + tableData.rows.forEach((rowData, rowIndex) => { + const row = tbody.insertRow(); + row.dataset.rowIndex = rowIndex; + + // 【延迟删除】根据行状态添加样式 + const rowStatus = tableData.rowStatuses ? tableData.rowStatuses[rowIndex] : 'normal'; + if (rowStatus === 'pending-deletion') { + row.classList.add('pending-deletion-row'); + } + + const indexCell = row.insertCell(); + indexCell.className = 'index-col'; + + const rowIndexSpan = document.createElement('span'); + rowIndexSpan.textContent = rowIndex + 1; + indexCell.appendChild(rowIndexSpan); + + const menu = document.createElement('div'); + menu.className = 'amily2-context-menu amily2-row-context-menu'; + + let actions; + + if (rowStatus === 'pending-deletion') { + actions = [ + { label: '恢复该行', action: 'restore-row', icon: 'fa-undo', isSuccess: true, btnClass: 'restore-row-btn' } + ]; + } else { + actions = [ + { label: '向上移动', action: 'move-up', icon: 'fa-arrow-up', btnClass: 'move-row-up-btn' }, + { label: '向下移动', action: 'move-down', icon: 'fa-arrow-down', btnClass: 'move-row-down-btn' }, + { label: '在上加行', action: 'add-above', icon: 'fa-plus-circle', btnClass: 'add-row-above-btn' }, + { label: '在下加行', action: 'add-below', icon: 'fa-plus-circle', btnClass: 'add-row-below-btn' }, + { label: '删除该行', action: 'delete-row', icon: 'fa-trash-alt', isDanger: true, btnClass: 'delete-row-btn' } + ]; + } + + actions.forEach(({ label, action, icon, isDanger, isSuccess }) => { + const button = document.createElement('button'); + button.innerHTML = ` ${label}`; + button.className = 'menu_button small_button'; + if (isDanger) button.classList.add('danger'); + if (isSuccess) button.classList.add('success'); // Use a success style for restore + + button.addEventListener('click', (e) => { + e.stopPropagation(); + + switch (action) { + case 'move-up': + TableManager.moveRow(tableIndex, rowIndex, 'up'); + break; + case 'move-down': + TableManager.moveRow(tableIndex, rowIndex, 'down'); + break; + case 'add-above': + TableManager.insertRow(tableIndex, rowIndex, 'above'); + break; + case 'add-below': + TableManager.insertRow(tableIndex, rowIndex, 'below'); + break; + case 'delete-row': + // 【延迟删除】不再需要确认,因为操作是可逆的 + TableManager.deleteRow(tableIndex, rowIndex); + break; + case 'restore-row': + TableManager.restoreRow(tableIndex, rowIndex); + break; + } + // For instant feedback, re-render is needed for delete/restore + if (action === 'delete-row' || action === 'restore-row') { + // The manager functions now handle their own re-rendering + } else { + renderTables(); + } + }); + menu.appendChild(button); + }); + indexCell.appendChild(menu); + + rowData.forEach((cellData, colIndex) => { + const cell = row.insertCell(); + + const cellContent = document.createElement('div'); + cellContent.className = 'amily2-cell-content'; + cellContent.textContent = cellData; + cell.appendChild(cellContent); + + // 【延迟删除】如果行正在待删除,则禁止编辑 + if (rowStatus !== 'pending-deletion' && !isTouchDevice()) { + cell.setAttribute('contenteditable', 'true'); + } + cell.dataset.colIndex = colIndex; + cell.dataset.label = tableData.headers[colIndex] || ''; + + const highlightKey = `${tableIndex}-${rowIndex}-${colIndex}`; + if (highlights.has(highlightKey)) { + cell.classList.add('cell-highlight'); + } + }); + }); + } + tableWrapper.appendChild(tableElement); + fragment.appendChild(tableWrapper); + }); + + container.innerHTML = ''; + container.appendChild(fragment); + + if (placeholder) { + container.appendChild(placeholder); + } + + // Also update the in-chat table whenever the main tables are re-rendered + updateOrInsertTableInChat(); +} + + +function openTableRuleEditor() { + const settings = extension_settings[extensionName]; + const tags = settings.table_tags_to_extract || ''; + const exclusionRules = settings.table_exclusion_rules || []; + + const rulesHtml = exclusionRules.map((rule, index) => ` +
+ + - + + +
+ `).join(''); + + const modalHtml = ` +
+
+ + + 仅提取指定XML标签的内容,例如填“content”,即提取...中的内容。 +
+
+ +
${rulesHtml}
+ + 移除所有被起始和结束标记包裹的内容(例如 OOC 部分)。 +
+
+ `; + + const dialog = showHtmlModal('配置独立提取规则', modalHtml, { + onOk: () => { + const newTags = document.getElementById('table-tags-input').value; + updateAndSaveTableSetting('table_tags_to_extract', newTags); + + const newExclusionRules = []; + document.querySelectorAll('#exclusion-rules-list .exclusion-rule-item').forEach(item => { + const start = item.querySelector('.rule-start').value.trim(); + const end = item.querySelector('.rule-end').value.trim(); + if (start && end) { + newExclusionRules.push({ start, end }); + } + }); + updateAndSaveTableSetting('table_exclusion_rules', newExclusionRules); + toastr.success('独立提取规则已保存。'); + }, + onShow: (dialogElement) => { + const rulesList = dialogElement.find('#exclusion-rules-list'); + + dialogElement.find('#add-exclusion-rule-btn').on('click', () => { + const newIndex = rulesList.children().length; + const newItemHtml = ` +
+ + - + + +
`; + rulesList.append(newItemHtml); + }); + + rulesList.on('click', '.remove-rule-btn', function() { + $(this).closest('.exclusion-rule-item').remove(); + }); + } + }); +} + +function openRuleEditor(tableIndex) { + const tables = TableManager.getMemoryState(); + if (!tables || !tables[tableIndex]) return; + const table = tables[tableIndex]; + + // 兼容旧数据结构 + if (table.charLimitRule && !table.charLimitRules) { + table.charLimitRules = {}; + if (table.charLimitRule.columnIndex !== -1) { + table.charLimitRules[table.charLimitRule.columnIndex] = table.charLimitRule.limit; + } + } + const charLimitRules = table.charLimitRules || {}; + + const renderCharLimitRules = (rules) => { + return Object.entries(rules).map(([colIndex, limit]) => { + const header = table.headers[colIndex] || `未知列 (${colIndex})`; + return ` +
+ ${header}: 不超过 ${limit} 字 + +
+ `; + }).join(''); + }; + + const getColumnOptions = (rules) => { + return table.headers.map((header, index) => { + // 如果该列已存在规则,则不应出现在下拉菜单中 + if (rules[index]) return ''; + return ``; + }).join(''); + }; + + const dialogHtml = ` + + + `; + + const dialogElement = $(dialogHtml).appendTo('body'); + + const closeDialog = () => { + dialogElement[0].close(); + dialogElement.remove(); + }; + + const refreshRuleUI = () => { + const currentRules = JSON.parse(dialogElement.find('#current-char-limit-rules').attr('data-rules') || '{}'); + dialogElement.find('#current-char-limit-rules').html(renderCharLimitRules(currentRules)); + dialogElement.find('#new-rule-column-select').html(`${getColumnOptions(currentRules)}`); + }; + + dialogElement.find('#current-char-limit-rules').attr('data-rules', JSON.stringify(charLimitRules)); + + dialogElement.on('click', '#add-char-limit-rule-btn', () => { + const selectedColumn = parseInt(dialogElement.find('#new-rule-column-select').val(), 10); + const limitValue = parseInt(dialogElement.find('#new-rule-limit-input').val(), 10); + + if (selectedColumn === -1) { + toastr.warning('请选择一个列。'); + return; + } + + // 允许输入0,但0意味着“无限制”,所以我们不添加规则。 + if (isNaN(limitValue) || limitValue < 0) { + toastr.warning('请输入一个有效的字数限制(大于等于0)。'); + return; + } + + const currentRules = JSON.parse(dialogElement.find('#current-char-limit-rules').attr('data-rules') || '{}'); + + if (limitValue > 0) { + // 只有当限制大于0时,才添加或更新规则 + currentRules[selectedColumn] = limitValue; + dialogElement.find('#current-char-limit-rules').attr('data-rules', JSON.stringify(currentRules)); + refreshRuleUI(); + } else { + // 如果用户输入0,则视为不设置规则 + toastr.info('字数限制为0表示不设置规则。'); + } + }); + + dialogElement.on('click', '.remove-char-limit-rule-btn', function() { + const colIndexToRemove = $(this).data('col-index'); + const currentRules = JSON.parse(dialogElement.find('#current-char-limit-rules').attr('data-rules') || '{}'); + delete currentRules[colIndexToRemove]; + dialogElement.find('#current-char-limit-rules').attr('data-rules', JSON.stringify(currentRules)); + refreshRuleUI(); + }); + + dialogElement.find('.popup-button-ok').on('click', () => { + const newCharLimitRules = JSON.parse(dialogElement.find('#current-char-limit-rules').attr('data-rules') || '{}'); + const rowLimitValue = parseInt(dialogElement.find('#rule-row-limit-value').val(), 10); + + const newRules = { + note: dialogElement.find('#rule-note').val(), + rule_add: dialogElement.find('#rule-add').val(), + rule_delete: dialogElement.find('#rule-delete').val(), + rule_update: dialogElement.find('#rule-update').val(), + charLimitRules: newCharLimitRules, + rowLimitRule: rowLimitValue, + }; + TableManager.updateTableRules(tableIndex, newRules); + closeDialog(); + }); + + dialogElement.find('.popup-button-cancel').on('click', closeDialog); + dialogElement[0].showModal(); +} + + +function bindInjectionSettings() { + const settings = extension_settings[extensionName]; + + const masterSwitchCheckbox = document.getElementById('table-system-master-switch'); + const enabledCheckbox = document.getElementById('table-injection-enabled'); + const optimizationCheckbox = document.getElementById('context-optimization-enabled'); // 【V144.0】 + const positionSelect = document.getElementById('table-injection-position'); + const depthInput = document.getElementById('table-injection-depth'); + const roleRadioGroup = document.querySelectorAll('input[name="table-injection-role"]'); + + if (!masterSwitchCheckbox || !enabledCheckbox || !positionSelect || !depthInput || !roleRadioGroup.length) { + return; + } + + const updateInjectionUI = () => { + const position = positionSelect.value; + const masterEnabled = masterSwitchCheckbox.checked; + + const isChatInjection = position === '1'; + + enabledCheckbox.disabled = !masterEnabled; + positionSelect.disabled = !masterEnabled; + depthInput.disabled = !masterEnabled || !isChatInjection; + roleRadioGroup.forEach(radio => radio.disabled = !masterEnabled || !isChatInjection); + + const enabledOpacity = masterEnabled ? '1' : '0.5'; + enabledCheckbox.style.opacity = enabledOpacity; + if (enabledCheckbox.closest('.control-block-with-switch')) { + enabledCheckbox.closest('.control-block-with-switch').style.opacity = enabledOpacity; + } + + positionSelect.style.opacity = enabledOpacity; + if (positionSelect.previousElementSibling) { + positionSelect.previousElementSibling.style.opacity = enabledOpacity; + } + + const depthOpacity = masterEnabled && isChatInjection ? '1' : '0.5'; + depthInput.style.opacity = depthOpacity; + if (depthInput.previousElementSibling) { + depthInput.previousElementSibling.style.opacity = depthOpacity; + } + + const roleOpacity = masterEnabled && isChatInjection ? '1' : '0.5'; + const roleGroupContainer = document.getElementById('table-role-system')?.closest('.radio-group'); + if (roleGroupContainer) { + roleGroupContainer.style.opacity = roleOpacity; + if (roleGroupContainer.previousElementSibling) { + roleGroupContainer.previousElementSibling.style.opacity = roleOpacity; + } + } + + const fillingModeRadios = document.querySelectorAll('input[name="filling-mode"]'); + fillingModeRadios.forEach(radio => { + radio.disabled = !masterEnabled; + const label = radio.closest('label'); + if (label) { + label.style.opacity = masterEnabled ? '1' : '0.5'; + } + }); + + const fillButton = document.getElementById('fill-table-now-btn'); + if (fillButton) { + fillButton.disabled = !masterEnabled; + fillButton.style.opacity = masterEnabled ? '1' : '0.5'; + } + }; + + masterSwitchCheckbox.checked = settings.table_system_enabled !== false; + enabledCheckbox.checked = settings.table_injection_enabled; + if (optimizationCheckbox) { // 【V144.0】 + optimizationCheckbox.checked = settings.context_optimization_enabled !== false; + } + positionSelect.value = settings.injection.position; + depthInput.value = settings.injection.depth; + roleRadioGroup.forEach(radio => { + if (parseInt(radio.value, 10) === settings.injection.role) { + radio.checked = true; + } + }); + + updateInjectionUI(); + + if (masterSwitchCheckbox.dataset.eventsBound) return; + + masterSwitchCheckbox.addEventListener('change', () => { + settings.table_system_enabled = masterSwitchCheckbox.checked; + saveSettingsDebounced(); + updateInjectionUI(); + + const statusText = masterSwitchCheckbox.checked ? '已启用' : '已禁用'; + toastr.info(`表格系统总开关${statusText}。`); + log(`表格系统总开关${statusText}。`, 'info'); + }); + + enabledCheckbox.addEventListener('change', () => { + settings.table_injection_enabled = enabledCheckbox.checked; + saveSettingsDebounced(); + }); + + // 【V144.0】 + if (optimizationCheckbox) { + optimizationCheckbox.addEventListener('change', () => { + settings.context_optimization_enabled = optimizationCheckbox.checked; + saveSettingsDebounced(); + toastr.info(`上下文优化(世界书合并)已${optimizationCheckbox.checked ? '启用' : '禁用'}。`); + }); + } + + positionSelect.addEventListener('change', () => { + settings.injection.position = parseInt(positionSelect.value, 10); + saveSettingsDebounced(); + + updateInjectionUI(); + }); + + depthInput.addEventListener('input', () => { + settings.injection.depth = parseInt(depthInput.value, 10); + saveSettingsDebounced(); + }); + + roleRadioGroup.forEach(radio => { + radio.addEventListener('change', () => { + if (radio.checked) { + settings.injection.role = parseInt(radio.value, 10); + saveSettingsDebounced(); + } + }); + }); + + masterSwitchCheckbox.dataset.eventsBound = 'true'; + log('表格注入设置已成功绑定。', 'success'); +} + + +function updateAndSaveTableSetting(key, value) { + if (!extension_settings[extensionName]) { + extension_settings[extensionName] = {}; + } + extension_settings[extensionName][key] = value; + saveSettingsDebounced(); +} + +function bindWorldBookSettings() { + const settings = extension_settings[extensionName]; + + if (settings.table_worldbook_enabled === undefined) settings.table_worldbook_enabled = false; + if (settings.table_worldbook_char_limit === undefined) settings.table_worldbook_char_limit = 30000; + if (settings.table_worldbook_source === undefined) settings.table_worldbook_source = 'character'; + if (settings.table_selected_worldbooks === undefined) settings.table_selected_worldbooks = []; + if (settings.table_selected_entries === undefined) settings.table_selected_entries = {}; + + const enabledCheckbox = document.getElementById('table_worldbook_enabled'); + const limitSlider = document.getElementById('table_worldbook_char_limit'); + const limitValueSpan = document.getElementById('table_worldbook_char_limit_value'); + const sourceRadios = document.querySelectorAll('input[name="table_worldbook_source"]'); + const manualSelectWrapper = document.getElementById('table_worldbook_select_wrapper'); + const refreshButton = document.getElementById('table_refresh_worldbooks'); + const bookListContainer = document.getElementById('table_worldbook_checkbox_list'); + const entryListContainer = document.getElementById('table_worldbook_entry_list'); + + if (!enabledCheckbox || !limitSlider || !limitValueSpan || !sourceRadios.length || !manualSelectWrapper || !refreshButton || !bookListContainer || !entryListContainer) { + log('无法找到世界书设置的相关UI元素,绑定失败。', 'warn'); + return; + } + + const saveSelectedEntries = () => { + const selected = {}; + entryListContainer.querySelectorAll('input[type="checkbox"]:checked').forEach(cb => { + const book = cb.dataset.book; + const uid = cb.dataset.uid; + if (!selected[book]) { + selected[book] = []; + } + selected[book].push(uid); + }); + settings.table_selected_entries = selected; + saveSettingsDebounced(); + }; + + const renderWorldBookEntries = async () => { + entryListContainer.innerHTML = '

加载条目中...

'; + const source = settings.table_worldbook_source || 'character'; + let bookNames = []; + + if (source === 'manual') { + bookNames = settings.table_selected_worldbooks || []; + } else { + if (this_chid !== undefined && this_chid >= 0 && characters[this_chid]) { + try { + const charLorebooks = await safeCharLorebooks({ type: 'all' }); + if (charLorebooks.primary) bookNames.push(charLorebooks.primary); + if (charLorebooks.additional?.length) bookNames.push(...charLorebooks.additional); + } catch (error) { + console.error(`[内存储司] 获取角色世界书失败:`, error); + entryListContainer.innerHTML = '

获取角色世界书失败。

'; + return; + } + } else { + entryListContainer.innerHTML = '

请先加载一个角色。

'; + return; + } + } + + if (bookNames.length === 0) { + entryListContainer.innerHTML = '

未选择或绑定世界书。

'; + return; + } + + try { + const allEntries = []; + for (const bookName of bookNames) { + const entries = await safeLorebookEntries(bookName); + entries.forEach(entry => allEntries.push({ ...entry, bookName })); + } + + entryListContainer.innerHTML = ''; + if (allEntries.length === 0) { + entryListContainer.innerHTML = '

所选世界书中没有条目。

'; + return; + } + + allEntries.forEach(entry => { + const div = document.createElement('div'); + div.className = 'checkbox-item'; + div.title = `世界书: ${entry.bookName}\nUID: ${entry.uid}`; + + const checkbox = document.createElement('input'); + checkbox.type = 'checkbox'; + checkbox.id = `wb-entry-check-${entry.bookName}-${entry.uid}`; + checkbox.dataset.book = entry.bookName; + checkbox.dataset.uid = entry.uid; + + const isChecked = settings.table_selected_entries[entry.bookName]?.includes(String(entry.uid)); + checkbox.checked = !!isChecked; + + const label = document.createElement('label'); + label.htmlFor = checkbox.id; + label.textContent = entry.comment || '无标题条目'; + + div.appendChild(checkbox); + div.appendChild(label); + entryListContainer.appendChild(div); + }); + } catch (error) { + console.error(`[内存储司] 加载世界书条目失败:`, error); + entryListContainer.innerHTML = '

加载条目失败。

'; + } + }; + + const renderWorldBookList = () => { + const worldBooks = world_names.map(name => ({ name: name.replace('.json', ''), file_name: name })); + bookListContainer.innerHTML = ''; + if (worldBooks && worldBooks.length > 0) { + worldBooks.forEach(book => { + const div = document.createElement('div'); + div.className = 'checkbox-item'; + div.title = book.name; + + const checkbox = document.createElement('input'); + checkbox.type = 'checkbox'; + checkbox.id = `wb-check-${book.file_name}`; + checkbox.value = book.file_name; + checkbox.checked = settings.table_selected_worldbooks.includes(book.file_name); + + checkbox.addEventListener('change', () => { + if (checkbox.checked) { + if (!settings.table_selected_worldbooks.includes(book.file_name)) { + settings.table_selected_worldbooks.push(book.file_name); + } + } else { + settings.table_selected_worldbooks = settings.table_selected_worldbooks.filter(name => name !== book.file_name); + } + saveSettingsDebounced(); + renderWorldBookEntries(); + }); + + const label = document.createElement('label'); + label.htmlFor = `wb-check-${book.file_name}`; + label.textContent = book.name; + + div.appendChild(checkbox); + div.appendChild(label); + bookListContainer.appendChild(div); + }); + } else { + bookListContainer.innerHTML = '

没有找到世界书。

'; + } + renderWorldBookEntries(); + }; + + const updateManualSelectVisibility = () => { + const isManual = settings.table_worldbook_source === 'manual'; + manualSelectWrapper.style.display = isManual ? 'block' : 'none'; + renderWorldBookEntries(); + if (isManual) { + renderWorldBookList(); + } + }; + + enabledCheckbox.checked = settings.table_worldbook_enabled; + limitSlider.value = settings.table_worldbook_char_limit; + limitValueSpan.textContent = settings.table_worldbook_char_limit; + sourceRadios.forEach(radio => { + radio.checked = radio.value === settings.table_worldbook_source; + }); + + updateManualSelectVisibility(); + + if (enabledCheckbox.dataset.eventsBound) return; + + enabledCheckbox.addEventListener('change', () => { + settings.table_worldbook_enabled = enabledCheckbox.checked; + saveSettingsDebounced(); + }); + + limitSlider.addEventListener('input', () => { limitValueSpan.textContent = limitSlider.value; }); + limitSlider.addEventListener('change', () => { + settings.table_worldbook_char_limit = parseInt(limitSlider.value, 10); + saveSettingsDebounced(); + }); + + sourceRadios.forEach(radio => { + radio.addEventListener('change', () => { + if (radio.checked) { + settings.table_worldbook_source = radio.value; + updateManualSelectVisibility(); + saveSettingsDebounced(); + } + }); + }); + + refreshButton.addEventListener('click', renderWorldBookList); + entryListContainer.addEventListener('change', (event) => { + if (event.target.type === 'checkbox') { + saveSelectedEntries(); + } + }); + + enabledCheckbox.dataset.eventsBound = 'true'; + log('世界书设置已成功绑定。', 'success'); +} + +export function bindTableEvents() { + const panel = document.getElementById('amily2_memorisation_forms_panel'); + if (!panel || panel.dataset.eventsBound) { + return; + } + log('开始为表格视图绑定交互事件...', 'info'); + + const fillingModeRadios = panel.querySelectorAll('input[name="filling-mode"]'); + const contextSliderContainer = document.getElementById('context-reading-slider-container'); + const contextSlider = document.getElementById('context-reading-slider'); + const contextValueSpan = document.getElementById('context-reading-value'); + + const delaySliderContainer = document.getElementById('secondary-filler-delay-container'); + const delaySlider = document.getElementById('secondary-filler-delay-slider'); + const delayValueSpan = document.getElementById('secondary-filler-delay-value'); + + const independentRulesContainer = document.getElementById('table-independent-rules-container'); + const independentRulesToggle = document.getElementById('table-independent-rules-enabled'); + const configureRulesBtn = document.getElementById('table-configure-rules-btn'); + + const updateFillingModeUI = () => { + const currentMode = extension_settings[extensionName]?.filling_mode || 'main-api'; + fillingModeRadios.forEach(radio => { + radio.checked = (radio.value === currentMode); + }); + + const isSecondaryMode = currentMode === 'secondary-api'; + + if (contextSliderContainer) { + contextSliderContainer.style.display = isSecondaryMode ? 'block' : 'none'; + } + + if (delaySliderContainer) { + delaySliderContainer.style.display = isSecondaryMode ? 'block' : 'none'; + } + + if (independentRulesContainer) { + independentRulesContainer.style.display = 'flex'; + } + + if (independentRulesToggle && configureRulesBtn) { + configureRulesBtn.style.display = independentRulesToggle.checked ? 'block' : 'none'; + } + }; + + fillingModeRadios.forEach(radio => { + radio.addEventListener('change', function() { + const selectedMode = this.value; + updateAndSaveTableSetting('filling_mode', selectedMode); + + let modeName = '原始填表'; + if (selectedMode === 'secondary-api') modeName = '分步填表'; + if (selectedMode === 'optimized') modeName = '优化中填表'; + + toastr.info(`填表模式已切换为 ${modeName}。`); + updateFillingModeUI(); // 更新UI以确保状态同步 + }); + }); + + if (contextSlider && contextValueSpan) { + const contextReadingValue = extension_settings[extensionName]?.context_reading_level || 4; + contextSlider.value = contextReadingValue; + contextValueSpan.textContent = contextReadingValue; + + contextSlider.addEventListener('input', function() { + contextValueSpan.textContent = this.value; + }); + + contextSlider.addEventListener('change', function() { + updateAndSaveTableSetting('context_reading_level', parseInt(this.value, 10)); + toastr.info(`上下文读取级别已设置为 ${this.value}。`); + }); + } + + if (delaySlider && delayValueSpan) { + const delayValue = extension_settings[extensionName]?.secondary_filler_delay || 0; + delaySlider.value = delayValue; + delayValueSpan.textContent = delayValue; + + delaySlider.addEventListener('input', function() { + delayValueSpan.textContent = this.value; + }); + + delaySlider.addEventListener('change', function() { + updateAndSaveTableSetting('secondary_filler_delay', parseInt(this.value, 10)); + toastr.info(`填表延迟已设置为 ${this.value} 楼层。`); + }); + } + + if (independentRulesToggle) { + independentRulesToggle.checked = extension_settings[extensionName]?.table_independent_rules_enabled ?? false; + independentRulesToggle.addEventListener('change', () => { + updateAndSaveTableSetting('table_independent_rules_enabled', independentRulesToggle.checked); + updateFillingModeUI(); + }); + } + + updateFillingModeUI(); + + if (configureRulesBtn) { + configureRulesBtn.addEventListener('click', openTableRuleEditor); + } + + const renderAll = () => { + renderTables(); + bindInjectionSettings(); + bindTemplateEditors(); + }; + + renderAll(); + bindWorldBookSettings(); + bindBatchFillButton(); // 【新增】绑定批量填表按钮 + bindFloorFillButtons(); // 【新增】绑定楼层填表按钮 + bindReorganizeButton(); // 【新增】绑定重新整理按钮 + bindNccsApiEvents(); // 【新增】绑定Nccs API系统事件 + bindChatTableDisplaySetting(); // 【新增】绑定聊天内表格显示开关 + + const navDeck = document.querySelector('#amily2_memorisation_forms_panel .sinan-navigation-deck'); + if (navDeck) { + navDeck.addEventListener('click', (event) => { + const target = event.target.closest('.sinan-nav-item'); + if (!target) return; + + const tabName = target.dataset.tab; + if (!tabName) return; + + const container = target.closest('.settings-group'); + if (!container) return; + + container.querySelectorAll('.sinan-nav-item').forEach(btn => btn.classList.remove('active')); + target.classList.add('active'); + container.querySelectorAll('.sinan-tab-pane').forEach(pane => pane.classList.remove('active')); + const activePane = container.querySelector(`#sinan-${tabName}-tab`); + if (activePane) { + activePane.classList.add('active'); + } + }); + } + + const exportBtn = document.getElementById('amily2-export-preset-btn'); + const exportFullBtn = document.getElementById('amily2-export-preset-full-btn'); + const importBtn = document.getElementById('amily2-import-preset-btn'); + const importGlobalBtn = document.getElementById('amily2-import-global-preset-btn'); + const clearGlobalBtn = document.getElementById('amily2-clear-global-preset-btn'); + + if (exportBtn) { + exportBtn.addEventListener('click', () => TableManager.exportPreset()); + } + if (exportFullBtn) { + exportFullBtn.addEventListener('click', () => TableManager.exportPresetFull()); + } + if (importBtn) { + importBtn.addEventListener('click', () => TableManager.importPreset(renderAll)); + } + if (importGlobalBtn) { + importGlobalBtn.addEventListener('click', () => { + + const isEmpty = TableManager.isCurrentTablesEmpty(); + TableManager.importGlobalPreset(() => { + if (isEmpty) { + TableManager.loadTables(); + renderAll(); + } + }); + }); + } + if (clearGlobalBtn) { + clearGlobalBtn.addEventListener('click', () => { + const isEmpty = TableManager.isCurrentTablesEmpty(); + TableManager.clearGlobalPreset(); + if (isEmpty) { + TableManager.loadTables(); + renderAll(); + } + }); + } + + const clearAllBtn = document.getElementById('amily2-clear-all-tables-btn'); + if (clearAllBtn) { + clearAllBtn.addEventListener('click', () => { + if (confirm('【确认】您确定要清空所有表格的剧情内容吗?此操作将保留表格结构,但会删除所有已填写的行。')) { + TableManager.clearAllTables(); + renderAll(); + } + }); + } + + + const addTablePlaceholder = document.getElementById('add-table-placeholder'); + if (addTablePlaceholder) { + addTablePlaceholder.addEventListener('click', () => { + const newName = prompt('请输入新表格的名称:', '新表格'); + if (newName && newName.trim()) { + TableManager.addTable(newName.trim()); + renderAll(); + } + }); + } + + + const allTablesContainer = getAllTablesContainer(); + if (allTablesContainer) { + allTablesContainer.addEventListener('click', (event) => { + const th = event.target.closest('th'); + if (th && th.classList.contains('index-col')) { + // 处理表头 # 号的点击(用于空表格添加首行) + toggleHeaderIndexContextMenu(event); + return; + } + if (th && !th.classList.contains('index-col')) { + toggleColumnContextMenu(event); + return; + } + + const td = event.target.closest('td.index-col'); + if (td) { + toggleRowContextMenu(event); + return; + } + + const renameIcon = event.target.closest('.table-rename-icon'); + if (renameIcon) { + const tableIndex = parseInt(renameIcon.dataset.tableIndex, 10); + const tables = TableManager.getMemoryState(); + const currentName = tables[tableIndex]?.name || ''; + showTableNameEditor(tableIndex, currentName); + return; + } + + const target = event.target.closest('button'); + if (!target) return; + + const tableIndex = parseInt(target.dataset.tableIndex, 10); + + if (target.matches('.add-row-btn')) { + TableManager.addRow(tableIndex); + renderAll(); + } else if (target.matches('.add-col-btn')) { + TableManager.addColumn(tableIndex); + renderAll(); + } else if (target.matches('.move-table-up-btn') || target.matches('.move-table-down-btn')) { + const direction = target.classList.contains('move-table-up-btn') ? 'up' : 'down'; + TableManager.moveTable(tableIndex, direction); + renderAll(); + } else if (target.matches('.edit-rules-btn')) { + openRuleEditor(tableIndex); + } else if (target.matches('.delete-table-btn')) { + const tables = TableManager.getMemoryState(); + const tableName = tables[tableIndex]?.name || '未知表格'; + if (confirm(`【最终警告】您确定要永久废黜表格 “[${tableName}]” 吗?此操作不可逆!`)) { + TableManager.deleteTable(tableIndex); + renderAll(); + } + } + }); + + if (isTouchDevice()) { + let lastTap = 0; + let lastTapTarget = null; + allTablesContainer.addEventListener('touchstart', (event) => { + const target = event.target.closest('td'); + if (!target || target.dataset.colIndex === undefined) return; + + const currentTime = new Date().getTime(); + const tapLength = currentTime - lastTap; + if (tapLength < 300 && tapLength > 0 && lastTapTarget === target) { + event.preventDefault(); + if (target.getAttribute('contenteditable') !== 'true') { + target.setAttribute('contenteditable', 'true'); + setTimeout(() => target.focus(), 0); + } + } + lastTap = currentTime; + lastTapTarget = target; + }); + } + + allTablesContainer.addEventListener('blur', (event) => { + const target = event.target; + if (target.tagName !== 'TD' || target.getAttribute('contenteditable') !== 'true') return; + + if (isTouchDevice()) { + target.setAttribute('contenteditable', 'false'); + } + + const tableElement = target.closest('table'); + if (!tableElement) return; + + const tableIndex = parseInt(tableElement.dataset.tableIndex, 10); + const rowIndex = parseInt(target.closest('tr').dataset.rowIndex, 10); + const colIndex = parseInt(target.dataset.colIndex, 10); + const newValue = target.textContent; + + // Correctly save scroll positions before re-rendering + const tableWrapper = tableElement.closest('.amily2-table-wrapper'); + const hScroll = tableWrapper ? tableWrapper.scrollLeft : 0; + const vScroll = allTablesContainer.scrollTop; + + TableManager.addHighlight(tableIndex, rowIndex, colIndex); + const dataToUpdate = { [colIndex]: newValue }; + TableManager.updateRow(tableIndex, rowIndex, dataToUpdate); + + renderAll(); + + // Correctly restore scroll positions after re-rendering + const newTableWrapper = document.getElementById(`amily2-table-${tableIndex}`)?.closest('.amily2-table-wrapper'); + if (newTableWrapper) { + newTableWrapper.scrollLeft = hScroll; + } + allTablesContainer.scrollTop = vScroll; + + }, true); + } + + panel.dataset.eventsBound = 'true'; + log('表格视图交互事件已成功绑定。', 'success'); + + eventSource.on(event_types.CHAT_CHANGED, () => { + console.log(`[${extensionName}] 检测到角色/聊天切换,正在刷新表格系统UI和世界书设置...`); + renderAll(); + + setTimeout(() => { + const settings = extension_settings[extensionName]; + if (settings && settings.table_worldbook_enabled) { + try { + bindWorldBookSettings(); + console.log(`[${extensionName}] 世界书设置已刷新`); + } catch (error) { + console.error(`[${extensionName}] 刷新世界书设置时出错:`, error); + } + } + }, 100); + }); +} + +function bindBatchFillButton() { + const fillButton = document.getElementById('fill-table-now-btn'); + if (fillButton) { + if (fillButton.dataset.batchEventBound) return; + + fillButton.addEventListener('click', (event) => { + const settings = extension_settings[extensionName]; + const tableSystemEnabled = settings.table_system_enabled !== false; + + if (!tableSystemEnabled) { + event.preventDefault(); + toastr.warning('表格系统总开关已关闭,请先启用总开关。'); + return; + } + + startBatchFilling(); + }); + + fillButton.dataset.batchEventBound = 'true'; + log('"立即填表"按钮已成功绑定。', 'success'); + } +} + +function bindReorganizeButton() { + const reorganizeBtn = document.getElementById('reorganize-table-btn'); + + if (reorganizeBtn) { + if (reorganizeBtn.dataset.reorganizeEventBound) return; + + reorganizeBtn.addEventListener('click', async (event) => { + const settings = extension_settings[extensionName]; + const tableSystemEnabled = settings.table_system_enabled !== false; + + if (!tableSystemEnabled) { + event.preventDefault(); + toastr.warning('表格系统总开关已关闭,请先启用总开关。'); + return; + } + + try { + const { reorganizeTableContent } = await import('../core/table-system/reorganizer.js'); + await reorganizeTableContent(); + } catch (error) { + console.error('[内存储司] 重新整理功能导入失败:', error); + toastr.error('重新整理功能启动失败,请检查系统状态。'); + } + }); + + reorganizeBtn.dataset.reorganizeEventBound = 'true'; + log('"重新整理"按钮已成功绑定。', 'success'); + } +} + + +function bindFloorFillButtons() { + const selectedFloorsBtn = document.getElementById('fill-selected-floors-btn'); + const currentFloorBtn = document.getElementById('fill-current-floor-btn'); + const rollbackBtn = document.getElementById('rollback-and-refill-btn'); + + if (selectedFloorsBtn) { + + if (selectedFloorsBtn.dataset.floorEventBound) return; + + selectedFloorsBtn.addEventListener('click', (event) => { + const settings = extension_settings[extensionName]; + const tableSystemEnabled = settings.table_system_enabled !== false; + + if (!tableSystemEnabled) { + event.preventDefault(); + toastr.warning('表格系统总开关已关闭,请先启用总开关。'); + return; + } + + const startFloorInput = document.getElementById('floor-start-input'); + const endFloorInput = document.getElementById('floor-end-input'); + + const startFloor = parseInt(startFloorInput.value, 10); + const endFloor = parseInt(endFloorInput.value, 10); + + if (!startFloor || !endFloor) { + toastr.warning('请输入有效的起始楼层和结束楼层。'); + return; + } + + if (startFloor > endFloor) { + toastr.warning('起始楼层不能大于结束楼层。'); + return; + } + + if (startFloor < 1) { + toastr.warning('楼层不能小于1。'); + return; + } + + import('../core/table-system/batch-filler.js').then(module => { + module.startFloorRangeFilling(startFloor, endFloor); + }); + }); + + selectedFloorsBtn.dataset.floorEventBound = 'true'; + log('"选定楼层填表"按钮已成功绑定。', 'success'); + } + + if (currentFloorBtn) { + if (currentFloorBtn.dataset.currentEventBound) return; + + currentFloorBtn.addEventListener('click', (event) => { + const settings = extension_settings[extensionName]; + const tableSystemEnabled = settings.table_system_enabled !== false; + + if (!tableSystemEnabled) { + event.preventDefault(); + toastr.warning('表格系统总开关已关闭,请先启用总开关。'); + return; + } + + import('../core/table-system/batch-filler.js').then(module => { + module.startCurrentFloorFilling(); + }); + }); + + currentFloorBtn.dataset.currentEventBound = 'true'; + log('"填当前楼层"按钮已成功绑定。', 'success'); + } + + if (rollbackBtn) { + if (rollbackBtn.dataset.rollbackEventBound) return; + + rollbackBtn.addEventListener('click', async (event) => { + const settings = extension_settings[extensionName]; + const tableSystemEnabled = settings.table_system_enabled !== false; + + if (!tableSystemEnabled) { + event.preventDefault(); + toastr.warning('表格系统总开关已关闭,请先启用总开关。'); + return; + } + + if (confirm('您确定要将表格状态回退到上一楼,并使用最新消息重新填表吗?')) { + try { + await TableManager.rollbackAndRefill(); + } catch (error) { + console.error('[内存储司] 回退重填功能失败:', error); + toastr.error('回退重填失败,请检查系统状态。'); + } + } + }); + + rollbackBtn.dataset.rollbackEventBound = 'true'; + log('"回退重填"按钮已成功绑定。', 'success'); + } +} + +function bindTemplateEditors() { + const ruleEditor = document.getElementById('ai-rule-template-editor'); + const ruleSaveBtn = document.getElementById('ai-rule-template-save-btn'); + const ruleRestoreBtn = document.getElementById('ai-rule-template-restore-btn'); + + const flowEditor = document.getElementById('ai-flow-template-editor'); + const flowSaveBtn = document.getElementById('ai-flow-template-save-btn'); + const flowRestoreBtn = document.getElementById('ai-flow-template-restore-btn'); + + if (!ruleEditor || !flowEditor || !ruleSaveBtn || !flowSaveBtn) { + log('无法找到指令模板编辑器或其按钮,绑定失败。', 'warn'); + return; + } + + if (ruleSaveBtn.dataset.templateEventsBound) { + return; + } + + ruleEditor.value = TableManager.getBatchFillerRuleTemplate(); + flowEditor.value = TableManager.getBatchFillerFlowTemplate(); + + ruleSaveBtn.addEventListener('click', () => { + TableManager.saveBatchFillerRuleTemplate(ruleEditor.value); + toastr.success('规则提示词已保存。'); + log('批量填表-规则提示词已保存。', 'success'); + }); + + flowSaveBtn.addEventListener('click', () => { + TableManager.saveBatchFillerFlowTemplate(flowEditor.value); + toastr.success('流程提示词已保存。'); + log('批量填表-流程提示词已保存。', 'success'); + }); + + ruleRestoreBtn.addEventListener('click', () => { + if (confirm('您确定要将规则提示词恢复为默认设置吗?')) { + ruleEditor.value = DEFAULT_AI_RULE_TEMPLATE; + TableManager.saveBatchFillerRuleTemplate(ruleEditor.value); + toastr.info('规则提示词已恢复为默认。'); + log('批量填表-规则提示词已恢复默认。', 'info'); + } + }); + + flowRestoreBtn.addEventListener('click', () => { + if (confirm('您确定要将流程提示词恢复为默认设置吗?')) { + flowEditor.value = DEFAULT_AI_FLOW_TEMPLATE; + TableManager.saveBatchFillerFlowTemplate(flowEditor.value); + toastr.info('流程提示词已恢复为默认。'); + log('批量填表-流程提示词已恢复默认。', 'info'); + } + }); + + ruleSaveBtn.dataset.templateEventsBound = 'true'; + flowSaveBtn.dataset.templateEventsBound = 'true'; + log('指令模板编辑器已成功绑定。', 'success'); +} + +function bindNccsApiEvents() { + const settings = extension_settings[extensionName]; + + if (settings.nccsEnabled === undefined) settings.nccsEnabled = false; + if (settings.nccsApiMode === undefined) settings.nccsApiMode = 'openai_test'; + if (settings.nccsApiUrl === undefined) settings.nccsApiUrl = 'https://api.openai.com/v1'; + if (settings.nccsApiKey === undefined) settings.nccsApiKey = ''; + if (settings.nccsModel === undefined) settings.nccsModel = ''; + if (settings.nccsMaxTokens === undefined) settings.nccsMaxTokens = 2000; + if (settings.nccsTemperature === undefined) settings.nccsTemperature = 0.7; + if (settings.nccsTavernProfile === undefined) settings.nccsTavernProfile = ''; + + const enabledToggle = document.getElementById('nccs-api-enabled'); + const configDiv = document.getElementById('nccs-api-config'); + const modeSelect = document.getElementById('nccs-api-mode'); + const urlInput = document.getElementById('nccs-api-url'); + const keyInput = document.getElementById('nccs-api-key'); + const modelInput = document.getElementById('nccs-api-model'); + const maxTokensSlider = document.getElementById('nccs-max-tokens'); + const maxTokensValue = document.getElementById('nccs-max-tokens-value'); + const temperatureSlider = document.getElementById('nccs-temperature'); + const temperatureValue = document.getElementById('nccs-temperature-value'); + const presetSelect = document.getElementById('nccs-sillytavern-preset'); + const testButton = document.getElementById('nccs-test-connection'); + const fetchModelsButton = document.getElementById('nccs-fetch-models'); + + if (!enabledToggle || !configDiv) return; + + enabledToggle.checked = settings.nccsEnabled; + if (modeSelect) modeSelect.value = settings.nccsApiMode; + if (urlInput) urlInput.value = settings.nccsApiUrl; + if (keyInput) keyInput.value = settings.nccsApiKey; + if (modelInput) modelInput.value = settings.nccsModel; + if (maxTokensSlider) { + maxTokensSlider.value = settings.nccsMaxTokens; + if (maxTokensValue) maxTokensValue.textContent = settings.nccsMaxTokens; + } + if (temperatureSlider) { + temperatureSlider.value = settings.nccsTemperature; + if (temperatureValue) temperatureValue.textContent = settings.nccsTemperature; + } + if (presetSelect) presetSelect.value = settings.nccsTavernProfile || ''; + + const updateConfigVisibility = () => { + configDiv.style.display = enabledToggle.checked ? 'block' : 'none'; + }; + updateConfigVisibility(); + + const updateModeBasedVisibility = () => { + if (!modeSelect) return; + const isSillyTavernMode = modeSelect.value === 'sillytavern_preset'; + const isOpenAIMode = modeSelect.value === 'openai_test'; + + const presetContainer = presetSelect?.closest('.amily2_opt_settings_block'); + if (presetContainer) { + presetContainer.style.display = isSillyTavernMode ? 'block' : 'none'; + } + + const fieldsToHideInPresetMode = [ + { element: urlInput, containerId: null }, + { element: keyInput, containerId: null }, + { element: modelInput, containerId: null }, + { element: maxTokensSlider, containerId: null }, + { element: temperatureSlider, containerId: null } + ]; + + fieldsToHideInPresetMode.forEach(({ element }) => { + if (element) { + const container = element.closest('.amily2_opt_settings_block'); + if (container) { + container.style.display = isSillyTavernMode ? 'none' : 'block'; + } + } + }); + + const buttonsContainer = testButton?.closest('.nccs-button-row'); + if (buttonsContainer) { + buttonsContainer.style.display = 'flex'; + } + }; + updateModeBasedVisibility(); + + enabledToggle.addEventListener('change', () => { + settings.nccsEnabled = enabledToggle.checked; + saveSettingsDebounced(); + updateConfigVisibility(); + log(`Nccs API ${enabledToggle.checked ? '已启用' : '已禁用'}`, 'info'); + }); + + if (modeSelect) { + modeSelect.addEventListener('change', () => { + settings.nccsApiMode = modeSelect.value; + saveSettingsDebounced(); + updateModeBasedVisibility(); + log(`Nccs API模式已切换为: ${modeSelect.value}`, 'info'); + }); + } + + if (urlInput) { + const saveUrl = () => { + settings.nccsApiUrl = urlInput.value; + saveSettingsDebounced(); + }; + + urlInput.addEventListener('blur', saveUrl); + } + + if (keyInput) { + const saveKey = () => { + settings.nccsApiKey = keyInput.value; + saveSettingsDebounced(); + }; + + keyInput.addEventListener('blur', saveKey); + } + + if (modelInput) { + const saveModel = () => { + settings.nccsModel = modelInput.value; + saveSettingsDebounced(); + }; + + modelInput.addEventListener('blur', saveModel); + modelInput.addEventListener('input', saveModel); + } + + if (maxTokensSlider && maxTokensValue) { + maxTokensSlider.addEventListener('input', () => { + maxTokensValue.textContent = maxTokensSlider.value; + }); + maxTokensSlider.addEventListener('change', () => { + settings.nccsMaxTokens = parseInt(maxTokensSlider.value); + saveSettingsDebounced(); + }); + } + + if (temperatureSlider && temperatureValue) { + temperatureSlider.addEventListener('input', () => { + temperatureValue.textContent = temperatureSlider.value; + }); + temperatureSlider.addEventListener('change', () => { + settings.nccsTemperature = parseFloat(temperatureSlider.value); + saveSettingsDebounced(); + }); + } + + if (presetSelect) { + presetSelect.addEventListener('change', () => { + settings.nccsTavernProfile = presetSelect.value; + saveSettingsDebounced(); + }); + } + + if (testButton) { + testButton.addEventListener('click', async () => { + testButton.disabled = true; + testButton.innerHTML = ' 测试中...'; + + try { + const success = await testNccsApiConnection(); + if (success) { + toastr.success('Nccs API连接测试成功!'); + log('Nccs API连接测试成功', 'success'); + } else { + toastr.error('Nccs API连接测试失败,请检查配置'); + log('Nccs API连接测试失败', 'error'); + } + } catch (error) { + toastr.error('Nccs API连接测试出错:' + error.message); + log('Nccs API连接测试出错:' + error.message, 'error'); + } finally { + testButton.disabled = false; + testButton.innerHTML = ' 测试连接'; + } + }); + } + + if (fetchModelsButton) { + fetchModelsButton.addEventListener('click', async () => { + fetchModelsButton.disabled = true; + fetchModelsButton.innerHTML = ' 获取中...'; + + if (urlInput) { + settings.nccsApiUrl = urlInput.value; + } + if (keyInput) { + settings.nccsApiKey = keyInput.value; + } + saveSettingsDebounced(); + + try { + const models = await fetchNccsModels(); + if (models && models.length > 0) { + let modelSelect = document.getElementById('nccs-api-model-select'); + if (!modelSelect) { + modelSelect = document.createElement('select'); + modelSelect.id = 'nccs-api-model-select'; + modelSelect.className = 'text_pole'; + modelInput.parentNode.insertBefore(modelSelect, modelInput.nextSibling); + } + + modelSelect.innerHTML = ''; + models.forEach(model => { + const option = document.createElement('option'); + option.value = model.id || model.name; + option.textContent = model.name || model.id; + if ((model.id || model.name) === settings.nccsModel) { + option.selected = true; + } + modelSelect.appendChild(option); + }); + + modelInput.style.display = 'none'; + modelSelect.style.display = 'block'; + + modelSelect.addEventListener('change', () => { + const selectedModel = modelSelect.value; + settings.nccsModel = selectedModel; + modelInput.value = selectedModel; + saveSettingsDebounced(); + }); + + toastr.success(`成功获取 ${models.length} 个模型`); + log(`Nccs API获取到 ${models.length} 个模型`, 'success'); + } else { + toastr.warning('未获取到可用模型'); + log('Nccs API未获取到可用模型', 'warn'); + } + } catch (error) { + toastr.error('获取模型失败:' + error.message); + log('Nccs API获取模型失败:' + error.message, 'error'); + } finally { + fetchModelsButton.disabled = false; + fetchModelsButton.innerHTML = ' 获取模型'; + } + }); + } + + const loadSillyTavernPresets = async () => { + if (!presetSelect) return; + try { + const context = getContext(); + if (!context?.extensionSettings?.connectionManager?.profiles) { + throw new Error('无法获取SillyTavern配置文件列表'); + } + + const profiles = context.extensionSettings.connectionManager.profiles; + + const currentProfileId = settings.nccsTavernProfile; + + presetSelect.innerHTML = ''; + presetSelect.appendChild(new Option('选择预设', '', false, false)); + + if (profiles && profiles.length > 0) { + profiles.forEach(profile => { + const isSelected = profile.id === currentProfileId; + const option = new Option(profile.name, profile.id, isSelected, isSelected); + presetSelect.appendChild(option); + }); + log(`成功加载 ${profiles.length} 个SillyTavern配置文件`, 'success'); + } else { + log('未找到可用的SillyTavern配置文件', 'warn'); + } + } catch (error) { + log('加载SillyTavern预设失败:' + error.message, 'error'); + } + }; + + if (modeSelect && presetSelect) { + modeSelect.addEventListener('change', () => { + if (modeSelect.value === 'sillytavern_preset') { + loadSillyTavernPresets(); + } + }); + + if (settings.nccsApiMode === 'sillytavern_preset') { + loadSillyTavernPresets(); + } + } + + log('Nccs API事件绑定完成', 'success'); +} + +function bindChatTableDisplaySetting() { + const settings = extension_settings[extensionName]; + const showInChatToggle = document.getElementById('show-table-in-chat-toggle'); + const continuousRenderToggle = document.getElementById('render-on-every-message-toggle'); + + if (!showInChatToggle || !continuousRenderToggle) { + log('找不到聊天内表格相关的开关,绑定失败。', 'warn'); + return; + } + + // Initialize states from settings + showInChatToggle.checked = settings.show_table_in_chat === true; + continuousRenderToggle.checked = settings.render_on_every_message === true; + + // Function to update the dependency + const updateContinuousRenderState = () => { + if (showInChatToggle.checked) { + continuousRenderToggle.disabled = false; + continuousRenderToggle.closest('.control-block-with-switch').style.opacity = '1'; + } else { + continuousRenderToggle.disabled = true; + continuousRenderToggle.closest('.control-block-with-switch').style.opacity = '0.5'; + } + }; + + // Initial state update + updateContinuousRenderState(); + + // Event listener for the main toggle + showInChatToggle.addEventListener('change', () => { + settings.show_table_in_chat = showInChatToggle.checked; + saveSettingsDebounced(); + toastr.info(`聊天内表格显示已${showInChatToggle.checked ? '开启' : '关闭'}。`); + updateContinuousRenderState(); + }); + + // Event listener for the continuous render toggle + continuousRenderToggle.addEventListener('change', () => { + settings.render_on_every_message = continuousRenderToggle.checked; + saveSettingsDebounced(); + toastr.info(`持续渲染最新消息功能已${continuousRenderToggle.checked ? '开启' : '关闭'}。请切换聊天以应用更改。`); + }); + + log('聊天内表格显示设置及其依赖关系已成功绑定。', 'success'); +} diff --git a/utils/auth.js b/utils/auth.js index d7625dd..cb90c0d 100644 --- a/utils/auth.js +++ b/utils/auth.js @@ -1 +1 @@ -function _0x5943(_0x27efe6,_0x2b1f1f){const _0x488ccd=_0x488c();return _0x5943=function(_0x594375,_0x4f86c2){_0x594375=_0x594375-0x118;let _0x2779dd=_0x488ccd[_0x594375];return _0x2779dd;},_0x5943(_0x27efe6,_0x2b1f1f);}function _0x488c(){const _0x2d20da=['authorized','201ngwizO','','toISOString','padStart','授权码无效或服务器连接失败','http://accdn.silencelurker.xyz:2086','ceil','removeItem','#auth_panel','[Amily2号]\x20检测到授权已过期,已清理本地存储。','getDate','toLocaleDateString','3389600cJYYqr','\x20授权已过期','slideDown','\x0a\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20授权有效期:\x20','getItem','setItem','.plugin-features','每日授权激活成功!有效期至:\x20','plugin_activated','plugin_auto_login','error','服务器验证连接失败,尝试本地验证...','Amily2号启用','12052894geKlDl','getFullYear','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','激活失败','241908eoKmcK','67624XnSnEI','success','expiryDate','getMonth','plugin_user_type','天\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20有效期至:\x20','json','3582815XhMPxt','2025-12-31','type','stringify','Amily-','793400xoeXih','true','当前授权有效期至:\x20','plugin_valid_until','enabled','expired','warn','setDate','application/json','15540712FMwvFZ','plugin_auth_code','\x0a\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20'];_0x488c=function(){return _0x2d20da;};return _0x488c();}const _0x4de1b4=_0x5943;(function(_0x53ab51,_0x17120a){const _0x50342f=_0x5943,_0x2740dc=_0x53ab51();while(!![]){try{const _0x22b808=parseInt(_0x50342f(0x12c))/0x1+-parseInt(_0x50342f(0x145))/0x2+parseInt(_0x50342f(0x139))/0x3*(-parseInt(_0x50342f(0x120))/0x4)+-parseInt(_0x50342f(0x127))/0x5+parseInt(_0x50342f(0x11f))/0x6+parseInt(_0x50342f(0x11b))/0x7+parseInt(_0x50342f(0x135))/0x8;if(_0x22b808===_0x17120a)break;else _0x2740dc['push'](_0x2740dc['shift']());}catch(_0x5c6a26){_0x2740dc['push'](_0x2740dc['shift']());}}}(_0x488c,0xe8ee4));import{extension_settings}from'/scripts/extensions.js';import{saveSettings,extensionName}from'./settings.js';import{updateUI}from'../ui/state.js';export const pluginAuthStatus={'authorized':![],'expired':![]};const SERVER_URL=_0x4de1b4(0x13e),AUTH_CONFIG={'expiryDate':new Date(_0x4de1b4(0x128))};export function getPasswordForDate(_0x14c29d){const _0xa039e3=_0x4de1b4,_0x410c69=_0x14c29d[_0xa039e3(0x11c)](),_0x14b8f7=String(_0x14c29d[_0xa039e3(0x123)]()+0x1)[_0xa039e3(0x13c)](0x2,'0'),_0x3e019d=String(_0x14c29d[_0xa039e3(0x143)]())[_0xa039e3(0x13c)](0x2,'0');return _0xa039e3(0x12b)+_0x410c69+_0x14b8f7+_0x3e019d;}export function checkAuthorization(){const _0x58e269=_0x4de1b4,_0x110a46=new Date(),_0x2960ce=localStorage['getItem'](_0x58e269(0x12f));if(_0x2960ce){const _0x68cff9=new Date(_0x2960ce);_0x110a46>_0x68cff9?pluginAuthStatus[_0x58e269(0x131)]=!![]:pluginAuthStatus['expired']=![];}else pluginAuthStatus[_0x58e269(0x131)]=_0x110a46>AUTH_CONFIG[_0x58e269(0x122)];pluginAuthStatus[_0x58e269(0x131)]&&(localStorage[_0x58e269(0x140)](_0x58e269(0x14d)),localStorage[_0x58e269(0x140)](_0x58e269(0x136)),localStorage[_0x58e269(0x140)]('plugin_user_type'),localStorage[_0x58e269(0x140)](_0x58e269(0x12f)),console['log'](_0x58e269(0x142)));const _0x2ac23a=localStorage[_0x58e269(0x149)](_0x58e269(0x14d))===_0x58e269(0x12d);return pluginAuthStatus[_0x58e269(0x138)]=_0x2ac23a&&!pluginAuthStatus[_0x58e269(0x131)],pluginAuthStatus[_0x58e269(0x138)];}export async function activatePluginAuthorization(_0x4bebb3){const _0x27652b=_0x4de1b4;try{const _0x1caf49=await fetch(SERVER_URL+'/verify',{'method':'POST','headers':{'Content-Type':_0x27652b(0x134)},'body':JSON[_0x27652b(0x12a)]({'code':_0x4bebb3})}),_0x2a841d=await _0x1caf49[_0x27652b(0x126)]();if(_0x2a841d[_0x27652b(0x121)]){localStorage['setItem'](_0x27652b(0x136),_0x4bebb3),localStorage[_0x27652b(0x14a)]('plugin_activated',_0x27652b(0x12d)),localStorage['setItem'](_0x27652b(0x14e),'true'),localStorage['setItem'](_0x27652b(0x124),_0x2a841d[_0x27652b(0x129)]),localStorage[_0x27652b(0x140)](_0x27652b(0x12f));const _0x3df35d=_0x2a841d['note']||_0x2a841d[_0x27652b(0x129)];return toastr[_0x27652b(0x121)]('授权激活成功!用户类型:\x20'+_0x3df35d,_0x27652b(0x11a)),pluginAuthStatus[_0x27652b(0x138)]=!![],enablePluginUI(),!![];}}catch(_0x32088e){console[_0x27652b(0x132)](_0x27652b(0x119),_0x32088e);}const _0x27b709=getPasswordForDate(new Date());if(_0x4bebb3===_0x27b709){const _0x328a13=new Date();return _0x328a13[_0x27652b(0x133)](_0x328a13[_0x27652b(0x143)]()+0x7),localStorage[_0x27652b(0x14a)](_0x27652b(0x136),_0x4bebb3),localStorage['setItem'](_0x27652b(0x14d),_0x27652b(0x12d)),localStorage[_0x27652b(0x14a)](_0x27652b(0x14e),_0x27652b(0x12d)),localStorage[_0x27652b(0x14a)](_0x27652b(0x124),'1'),localStorage[_0x27652b(0x14a)](_0x27652b(0x12f),_0x328a13[_0x27652b(0x13b)]()),toastr['success'](_0x27652b(0x14c)+_0x328a13[_0x27652b(0x144)](),_0x27652b(0x11a)),pluginAuthStatus[_0x27652b(0x138)]=!![],enablePluginUI(),!![];}return toastr[_0x27652b(0x118)](_0x27652b(0x13d),_0x27652b(0x11e)),![];}function enablePluginUI(){const _0x52d670=_0x4de1b4;$(_0x52d670(0x141))['slideUp'](0x190,function(){const _0x4960ff=_0x52d670;$(_0x4960ff(0x14b))[_0x4960ff(0x147)](0x190),updateUI();}),extension_settings[extensionName][_0x52d670(0x130)]=!![],saveSettings();}export function displayExpiryInfo(){const _0x280be5=_0x4de1b4,_0x2c076c=new Date(),_0xf273e5=Math[_0x280be5(0x13f)]((AUTH_CONFIG[_0x280be5(0x122)]-_0x2c076c)/(0x3e8*0x3c*0x3c*0x18)),_0x36adfc=localStorage[_0x280be5(0x149)](_0x280be5(0x12f));if(pluginAuthStatus[_0x280be5(0x131)])return _0x280be5(0x146);else{let _0x406c1c='';if(_0x36adfc){const _0x7dcb49=new Date(_0x36adfc);_0x406c1c=_0x280be5(0x12e)+_0x7dcb49['toLocaleDateString']()+_0x280be5(0x13a);}return _0x280be5(0x148)+_0xf273e5+_0x280be5(0x125)+AUTH_CONFIG[_0x280be5(0x122)][_0x280be5(0x144)]()+_0x280be5(0x11d)+_0x406c1c+_0x280be5(0x137);}} +const _0x2fa4d3=_0x16f9;function _0x509b(){const _0x38a5f7=['22642704zvbZES','#auth_panel','getFullYear','getMonth','authorized','https://amilyservice.amily49.cc','removeItem','expired','expiryDate','\x0a\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20','ceil','plugin_user_type','true','success','getDate','Amily-','556588jIHnAe','padStart','note','2093270VxyNNi','log','application/json','2338143JBHgir','slideDown','每日授权激活成功!有效期至:\x20','当前授权有效期至:\x20','.plugin-features','4092174ruUeaQ','enabled','getItem','stringify','服务器验证连接失败,尝试本地验证...','[Amily2号]\x20检测到授权已过期,已清理本地存储。','setItem','type','plugin_auth_code','8zdjtba','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','970960FUcxgD','warn','7931028WMdZcd','2025-12-31','激活失败','\x20授权已过期','setDate','toLocaleDateString','Amily2号启用','\x0a\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20授权有效期:\x20','授权码无效或服务器连接失败','toISOString','plugin_activated','plugin_valid_until'];_0x509b=function(){return _0x38a5f7;};return _0x509b();}function _0x16f9(_0x42fc5b,_0x143a9e){const _0x509b7c=_0x509b();return _0x16f9=function(_0x16f92a,_0x153cf8){_0x16f92a=_0x16f92a-0x139;let _0x56c34b=_0x509b7c[_0x16f92a];return _0x56c34b;},_0x16f9(_0x42fc5b,_0x143a9e);}(function(_0x3f27ea,_0x45cfe4){const _0x2c0955=_0x16f9,_0x1ccd9b=_0x3f27ea();while(!![]){try{const _0x4b8205=parseInt(_0x2c0955(0x14f))/0x1+-parseInt(_0x2c0955(0x165))/0x2+parseInt(_0x2c0955(0x155))/0x3+parseInt(_0x2c0955(0x163))/0x4*(parseInt(_0x2c0955(0x152))/0x5)+parseInt(_0x2c0955(0x15a))/0x6+parseInt(_0x2c0955(0x167))/0x7+-parseInt(_0x2c0955(0x13f))/0x8;if(_0x4b8205===_0x45cfe4)break;else _0x1ccd9b['push'](_0x1ccd9b['shift']());}catch(_0x383e8e){_0x1ccd9b['push'](_0x1ccd9b['shift']());}}}(_0x509b,0xa42ec));import{extension_settings}from'/scripts/extensions.js';import{saveSettings,extensionName}from'./settings.js';import{updateUI}from'../ui/state.js';export const pluginAuthStatus={'authorized':![],'expired':![]};const SERVER_URL=_0x2fa4d3(0x144),AUTH_CONFIG={'expiryDate':new Date(_0x2fa4d3(0x168))};export function getPasswordForDate(_0x66610e){const _0x1d96dd=_0x2fa4d3,_0x4b1efa=_0x66610e[_0x1d96dd(0x141)](),_0x11c4b8=String(_0x66610e[_0x1d96dd(0x142)]()+0x1)['padStart'](0x2,'0'),_0x43c29d=String(_0x66610e[_0x1d96dd(0x14d)]())[_0x1d96dd(0x150)](0x2,'0');return _0x1d96dd(0x14e)+_0x4b1efa+_0x11c4b8+_0x43c29d;}export function checkAuthorization(){const _0x437588=_0x2fa4d3,_0x14ea85=new Date(),_0x4deb2b=localStorage['getItem'](_0x437588(0x13e));if(_0x4deb2b){const _0x42cb14=new Date(_0x4deb2b);_0x14ea85>_0x42cb14?pluginAuthStatus[_0x437588(0x146)]=!![]:pluginAuthStatus[_0x437588(0x146)]=![];}else pluginAuthStatus['expired']=_0x14ea85>AUTH_CONFIG[_0x437588(0x147)];pluginAuthStatus[_0x437588(0x146)]&&(localStorage[_0x437588(0x145)]('plugin_activated'),localStorage[_0x437588(0x145)]('plugin_auth_code'),localStorage['removeItem'](_0x437588(0x14a)),localStorage[_0x437588(0x145)](_0x437588(0x13e)),console[_0x437588(0x153)](_0x437588(0x15f)));const _0x59f2b4=localStorage[_0x437588(0x15c)](_0x437588(0x13d))===_0x437588(0x14b);return pluginAuthStatus[_0x437588(0x143)]=_0x59f2b4&&!pluginAuthStatus[_0x437588(0x146)],pluginAuthStatus[_0x437588(0x143)];}export async function activatePluginAuthorization(_0x10d045){const _0x4cd4d1=_0x2fa4d3;try{const _0x1768ff=await fetch(SERVER_URL+'/verify',{'method':'POST','headers':{'Content-Type':_0x4cd4d1(0x154)},'body':JSON[_0x4cd4d1(0x15d)]({'code':_0x10d045})}),_0x474ae7=await _0x1768ff['json']();if(_0x474ae7[_0x4cd4d1(0x14c)]){localStorage[_0x4cd4d1(0x160)](_0x4cd4d1(0x162),_0x10d045),localStorage['setItem']('plugin_activated','true'),localStorage[_0x4cd4d1(0x160)]('plugin_auto_login',_0x4cd4d1(0x14b)),localStorage[_0x4cd4d1(0x160)](_0x4cd4d1(0x14a),_0x474ae7[_0x4cd4d1(0x161)]),localStorage[_0x4cd4d1(0x145)](_0x4cd4d1(0x13e));const _0x204084=_0x474ae7[_0x4cd4d1(0x151)]||_0x474ae7['type'];return toastr[_0x4cd4d1(0x14c)]('授权激活成功!用户:\x20'+_0x204084,_0x4cd4d1(0x139)),pluginAuthStatus['authorized']=!![],enablePluginUI(),!![];}}catch(_0x1579d8){console[_0x4cd4d1(0x166)](_0x4cd4d1(0x15e),_0x1579d8);}const _0x5edd70=getPasswordForDate(new Date());if(_0x10d045===_0x5edd70){const _0x3ecc17=new Date();return _0x3ecc17[_0x4cd4d1(0x16b)](_0x3ecc17[_0x4cd4d1(0x14d)]()+0x7),localStorage[_0x4cd4d1(0x160)]('plugin_auth_code',_0x10d045),localStorage[_0x4cd4d1(0x160)]('plugin_activated',_0x4cd4d1(0x14b)),localStorage[_0x4cd4d1(0x160)]('plugin_auto_login',_0x4cd4d1(0x14b)),localStorage[_0x4cd4d1(0x160)](_0x4cd4d1(0x14a),'1'),localStorage[_0x4cd4d1(0x160)](_0x4cd4d1(0x13e),_0x3ecc17[_0x4cd4d1(0x13c)]()),toastr['success'](_0x4cd4d1(0x157)+_0x3ecc17[_0x4cd4d1(0x16c)](),'Amily2号启用'),pluginAuthStatus[_0x4cd4d1(0x143)]=!![],enablePluginUI(),!![];}return toastr['error'](_0x4cd4d1(0x13b),_0x4cd4d1(0x169)),![];}function enablePluginUI(){const _0x47ab2f=_0x2fa4d3;$(_0x47ab2f(0x140))['slideUp'](0x190,function(){const _0x4661b0=_0x47ab2f;$(_0x4661b0(0x159))[_0x4661b0(0x156)](0x190),updateUI();}),extension_settings[extensionName][_0x47ab2f(0x15b)]=!![],saveSettings();}export function displayExpiryInfo(){const _0x2662bd=_0x2fa4d3,_0x53cae0=new Date(),_0x190589=Math[_0x2662bd(0x149)]((AUTH_CONFIG['expiryDate']-_0x53cae0)/(0x3e8*0x3c*0x3c*0x18)),_0x40883e=localStorage[_0x2662bd(0x15c)](_0x2662bd(0x13e));if(pluginAuthStatus[_0x2662bd(0x146)])return _0x2662bd(0x16a);else{let _0x54dc36='';if(_0x40883e){const _0x1014f2=new Date(_0x40883e);_0x54dc36=_0x2662bd(0x158)+_0x1014f2['toLocaleDateString']()+'';}return _0x2662bd(0x13a)+_0x190589+'天\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20有效期至:\x20'+AUTH_CONFIG[_0x2662bd(0x147)][_0x2662bd(0x16c)]()+_0x2662bd(0x164)+_0x54dc36+_0x2662bd(0x148);}} diff --git a/utils/settings.js b/utils/settings.js index a41f469..a5adf8b 100644 --- a/utils/settings.js +++ b/utils/settings.js @@ -19,6 +19,10 @@ export const defaultSettings = { contextMessages: 2, promptPresets: [], lastUsedPresetName: '', + super_memory_enabled: false, // 【V150.0】Amily2 Super Memory 总开关 (Default OFF) + superMemory_bridgeEnabled: false, // 【V150.0】世界书桥接 (Default OFF) + superMemory_autoBind: false, // 【V151.9】是否自动绑定到角色 (Default OFF) + secondary_filler_delay: 0, // 【V151.0】分步填表延迟 plotOpt_enabled: false, plotOpt_max_tokens: 20000, plotOpt_temperature: 0.7,