diff --git a/CharacterWorldBook/src/cwb_core.js b/CharacterWorldBook/src/cwb_core.js index ff4e533..4d74e14 100644 --- a/CharacterWorldBook/src/cwb_core.js +++ b/CharacterWorldBook/src/cwb_core.js @@ -324,6 +324,10 @@ async function proceedWithCardUpdate($panel, messagesToUse) { async function triggerAutomaticUpdate($panel) { logDebug(`检查是否需要更新。总消息数: ${state.allChatMessages.length}, 自动更新启用: ${state.autoUpdateEnabled}`); + if (!isCwbEnabled()) { + logDebug('更新检查已跳过 - CharacterWorldBook总开关已关闭。'); + return; + } if (!state.autoUpdateEnabled || isUpdatingCard || !state.customApiConfig.url || !state.customApiConfig.model || state.allChatMessages.length === 0) { logDebug('更新检查已跳过(未启用、正在更新、未配置或无消息)。'); return; @@ -544,6 +548,10 @@ async function processNextBatch($panel) { } export async function startBatchUpdate($panel) { + if (!isCwbEnabled()) { + showToastr('warning', 'CharacterWorldBook总开关已关闭,无法执行批量更新。'); + return; + } await loadAllChatMessages($panel); if (!state.customApiConfig.url || !state.customApiConfig.model) { showToastr('warning', '请先配置API信息。'); @@ -581,6 +589,10 @@ export async function startBatchUpdate($panel) { } export async function handleFloorRangeUpdate($panel) { + if (!isCwbEnabled()) { + showToastr('warning', 'CharacterWorldBook总开关已关闭,无法执行楼层范围更新。'); + return; + } await loadAllChatMessages($panel); if (isUpdatingCard || isBatchUpdating) { showToastr('info', '已有更新任务在进行中。'); @@ -639,6 +651,10 @@ export async function handleFloorRangeUpdate($panel) { } export async function manualUpdateLogic($panel = null) { + if (!isCwbEnabled()) { + logDebug('手动更新已跳过 - CharacterWorldBook总开关已关闭。'); + return; + } if (isUpdatingCard) { showToastr('info', '已有更新任务在进行中。'); return; diff --git a/WorldEditor.html b/WorldEditor.html index 8da4dca..7815343 100644 --- a/WorldEditor.html +++ b/WorldEditor.html @@ -78,6 +78,7 @@ + diff --git a/WorldEditor/WorldEditor.css b/WorldEditor/WorldEditor.css index c999d30..2bbec63 100644 --- a/WorldEditor/WorldEditor.css +++ b/WorldEditor/WorldEditor.css @@ -37,6 +37,14 @@ cursor: pointer; font-size: 12px; transition: background-color 0.3s; + color: white; + font-weight: 500; + white-space: nowrap; +} + +#world-editor-container .world-editor-btn:disabled { + opacity: 0.5; + cursor: not-allowed; } #world-editor-container .world-editor-btn-primary { @@ -75,6 +83,15 @@ background-color: #e68900; } +#world-editor-container .world-editor-btn-info { + background-color: #17a2b8; + color: white; +} + +#world-editor-container .world-editor-btn-info:hover { + background-color: #138496; +} + #world-editor-container .world-editor-content { flex: 1; padding: 20px; @@ -400,6 +417,12 @@ .world-editor-btn.small-btn { padding: 4px 8px; font-size: 11px; + color: white; + background-color: #4a90e2; +} + +.world-editor-btn.small-btn:hover { + background-color: #357abd; } #world-editor-container .world-editor-selector h3 { @@ -414,6 +437,26 @@ align-items: center; } +#world-editor-container .world-editor-selector button { + color: white; + font-weight: 500; + background-color: #4a90e2; +} + +#world-editor-container .world-editor-selector button:hover { + background-color: #357abd; +} + +/* 确保返回列表按钮有颜色 */ +#world-editor-back-to-list-btn { + color: white !important; + background-color: #4a90e2 !important; +} + +#world-editor-back-to-list-btn:hover { + background-color: #357abd !important; +} + /* ====== 布局修正 v2:针对 fieldset ====== */ /* 1. 重置 fieldset 的默认样式,使其表现为标准的 flex 容器 */ diff --git a/WorldEditor/WorldEditor.js b/WorldEditor/WorldEditor.js index d042773..3bcb7a2 100644 --- a/WorldEditor/WorldEditor.js +++ b/WorldEditor/WorldEditor.js @@ -51,7 +51,7 @@ class WorldEditor { 'world-editor-select-all', 'world-editor-selected-count', 'world-editor-batch-actions', 'world-editor-entries-container', 'world-editor-enable-selected-btn', 'world-editor-disable-selected-btn', - 'world-editor-set-blue-btn', 'world-editor-set-green-btn', 'world-editor-delete-selected-btn', + 'world-editor-set-blue-btn', 'world-editor-set-green-btn', 'world-editor-copy-entries-btn', 'world-editor-delete-selected-btn', 'world-editor-set-disable-recursion-btn', 'world-editor-set-prevent-recursion-btn' ]; this.elements = {}; @@ -95,6 +95,7 @@ class WorldEditor { this.elements.worldEditorDisableSelectedBtn.addEventListener('click', () => this.batchUpdateEntries({ enabled: false })); this.elements.worldEditorSetBlueBtn.addEventListener('click', () => this.batchUpdateEntries({ type: 'constant' })); this.elements.worldEditorSetGreenBtn.addEventListener('click', () => this.batchUpdateEntries({ type: 'selective' })); + this.elements.worldEditorCopyEntriesBtn.addEventListener('click', () => this.copySelectedEntries()); this.elements.worldEditorDeleteSelectedBtn.addEventListener('click', () => this.batchDeleteEntries()); this.elements.worldEditorSetDisableRecursionBtn.addEventListener('click', () => this.toggleBatchRecursion('exclude_recursion', '不可递归')); this.elements.worldEditorSetPreventRecursionBtn.addEventListener('click', () => this.toggleBatchRecursion('prevent_recursion', '防止递归')); @@ -298,13 +299,37 @@ class WorldEditor { this.setLoading(true); this.currentWorldBook = worldBookName; try { - const rawEntries = await safeLorebookEntries(worldBookName); - this.entries = (rawEntries || []).map(e => ({ - uid: e.uid, enabled: e.enabled, type: e.type || (e.constant ? 'constant' : 'selective'), - keys: e.keys || [], content: e.content || '', position: e.position || 'before_character_definition', - depth: (String(e.position)?.startsWith('at_depth')) ? e.depth : null, order: e.order || 100, comment: e.comment || '', - exclude_recursion: e.exclude_recursion, prevent_recursion: e.prevent_recursion + const bookData = await loadWorldInfo(worldBookName); + if (!bookData || !bookData.entries) { + this.entries = []; + this.filteredEntries = []; + this.renderEntries(); + this.updateEntryCount(); + return; + } + + const positionMap = { + 0: 'before_character_definition', + 1: 'after_character_definition', + 2: 'before_author_note', + 3: 'after_author_note', + 4: 'at_depth' + }; + + this.entries = Object.entries(bookData.entries).map(([uid, e]) => ({ + uid: parseInt(uid), + enabled: !e.disable, + type: e.constant ? 'constant' : 'selective', + keys: e.key || [], + content: e.content || '', + position: positionMap[e.position] || 'at_depth', + depth: e.depth != null ? e.depth : 4, + order: e.order != null ? e.order : 100, + comment: e.comment || '', + exclude_recursion: e.excludeRecursion || false, + prevent_recursion: e.preventRecursion || false })); + this.filteredEntries = [...this.entries]; this.renderEntries(); this.updateEntryCount(); @@ -488,6 +513,114 @@ class WorldEditor { this.batchUpdateEntries({ [field]: shouldEnable }, confirmation); } + async copySelectedEntries() { + if (this.selectedEntries.size === 0) { + this.showError('请先选择要复制的条目'); + return; + } + + // 获取所有世界书列表(包括当前世界书,允许在同一世界书内复制) + const availableBooks = this.allWorldBooks.map(book => book.name); + + if (availableBooks.length === 0) { + this.showError('没有可用的世界书'); + return; + } + + console.log('[世界书编辑器] 准备复制条目,已选择:', this.selectedEntries.size, '个条目'); + console.log('[世界书编辑器] 选中的UID:', Array.from(this.selectedEntries)); + + // 创建选择对话框 + const selectHtml = ` + +
+ + +
+ 将复制 ${this.selectedEntries.size} 个条目到目标世界书 +
+
+ `; + + showHtmlModal('复制条目', selectHtml, { + onOk: async (dialog) => { + const targetBook = dialog.find('#target-worldbook').val(); + + if (!targetBook) { + this.showError('请选择目标世界书'); + return false; + } + + await this.performCopy(targetBook); + return true; + } + }); + } + + async performCopy(targetBookName) { + this.setLoading(true); + try { + // 获取要复制的条目 + const entriesToCopy = this.entries.filter(e => this.selectedEntries.has(e.uid)); + + console.log('[世界书编辑器] 过滤后的条目数量:', entriesToCopy.length); + console.log('[世界书编辑器] 条目详情:', entriesToCopy); + + if (entriesToCopy.length === 0) { + this.showError('没有选中的条目'); + return; + } + + // 加载目标世界书 + const targetBookData = await loadWorldInfo(targetBookName); + if (!targetBookData) { + this.showError(`目标世界书 "${targetBookName}" 不存在`); + return; + } + + // 准备要创建的条目数据 + const newEntries = entriesToCopy.map(entry => ({ + enabled: entry.enabled, + type: entry.type, + keys: Array.isArray(entry.keys) ? entry.keys : [], + content: entry.content || '', + position: entry.position, + depth: entry.depth != null ? entry.depth : 4, + order: entry.order != null ? entry.order : 100, + comment: entry.comment || '', + exclude_recursion: entry.exclude_recursion || false, + prevent_recursion: entry.prevent_recursion || false + })); + + console.log('[世界书编辑器] 准备创建的条目:', newEntries); + + // 在目标世界书中创建条目 + await amilyHelper.createLorebookEntries(targetBookName, newEntries); + + if (window.toastr) { + window.toastr.success(`成功复制 ${entriesToCopy.length} 个条目到 "${targetBookName}"`); + } + + // 如果复制到当前世界书,刷新视图 + if (targetBookName === this.currentWorldBook) { + await this.loadWorldBookEntries(this.currentWorldBook); + } + + } catch (error) { + console.error('[世界书编辑器] 复制失败:', error); + this.showError(`复制失败: ${error.message}`); + } finally { + this.setLoading(false); + } + } + async batchDeleteEntries() { if (this.selectedEntries.size === 0 || !confirm(`删除 ${this.selectedEntries.size} 个条目?`)) return; try { diff --git a/amily2_message_board.json b/amily2_message_board.json index aee2495..01f248a 100644 --- a/amily2_message_board.json +++ b/amily2_message_board.json @@ -1,5 +1,5 @@ { - "message": "插件群:1060183271,更新了多个版本了,现在是v1.5.7,术语表上线。个人原因,降低更新频率以及无暇看帖子,有问题最好加群。" + "message": "插件群:1060183271,有问题最好加群。" } @@ -43,5 +43,6 @@ + diff --git a/amily2_update_info.json b/amily2_update_info.json index 3ec7699..1e2e6c0 100644 --- a/amily2_update_info.json +++ b/amily2_update_info.json @@ -1,4 +1,4 @@ { - "version": "1.5.0", - "changelog": "### Amily2号 - 重要链接\n\n- **插件发布帖**: [点击跳转](https://discord.com/channels/1134557553011998840/1393908367377956965)\n- **插件答疑卡**: [点击跳转](https://discord.com/channels/1134557553011998840/1410520358989201438/1411564423297892393)\n- **详细使用教程**: [点击跳转](https://docs.google.com/document/d/11E7HIFg59up0afv-lV0cAF5G3jzJXCkZK8cBCOMZ9zo/edit?usp=sharing)\n\n---\n\n### v1.5.0 更新\n- **世界编辑功能上线**\n - 世界书的批量编辑功能,支持批量:一键关闭,一键开启,一键蓝绿灯,一键删除,一键递归的设置。\n - 支持快速深度与顺序设置\n - 支持条目名搜索,以及内容搜索\n - 点击内容可细化编辑\n - Ps:暂时对移动端不太友好,目前还仅仅只是一个雏形,后面可能会接入ai,可以对世界书深化编辑、排版等等。\n- **翰林院功能优化**\n - 知识库支持多选批量编辑的操作:一键开关,一键局部与全局移动,一键删除\n - 向量化内容注入时不再是全部一起注入到同一个位置,而是分开不同的位置注入,让大模型思路更加清晰,且避免思路混乱的问题。举例来说,你可以将文风使用手动录入的方式录入进去,注入模板更改为文风模板,位置设置到一个合适的位置,这样就能在合适的环境下使用合适的文风。\n - Ps:感谢功能思路友情提供:Silence_Lurker潜默\n\n---\n\n### v1.4.9 更新\n- **翰林院 (RAG) 升级**\n - 向量化文件增加了一键全局和一键局部功能。\n - 翰林院世界书向量化新增世界书搜索与条目搜索。\n\n---\n\n### v1.4.8 更新\n- **保留层数功能更新**:优化了保留层数的设置,并新增了一键全局设置选项。\n\n---\n\n### v1.4.7 更新\n- **提示词链编辑器升级**:左下角魔法棒入口,自定义的提示词支持sillytavern的宏了,各种变量也完美兼容,例如你在提示词链新增一条内容为`{{user}}`的条目,发送给插件ai的时候,会自动替换为你的名字。\n- **UI升级**:响应大爹们的要求,因为美化的问题可能会导致我们扩展文字看不清楚,所以现在新增背景色、按钮色、字体色的调整,另外增加了扩展的背景图上传,以及背景透明度可调整。(首次更新手动调整一下背景透明度。)\n- **翰林院升级**:还是应大爹们的要求,为了避免需要重复迁徙向量化文件,让不同角色卡使用同一个向量化文件,现在知识库分为局部和全局,可以将向量化文件移动到全局,这样这个向量化文件,每个角色卡就都可以使用了。\n\n---\n\n### v1.4.6 更新\n- **统一提示词编辑器**:增加了角色世界书的两种更新提示词模式,便于后续更新预设。\n- **交互优化**:条目删除增加确认弹窗,避免移动端误触。\n- **UI优化**:角色世界书弹窗UI改为自适应,优化移动端体验。\n\n---\n\n### v1.4.5 更新\n- **剧情推进大改**\n - **独立API系统**:剧情优化新增Jqyh API系统,可独立配置温度、最大字符数,并支持世界书及条目搜索。\n - **交互优化**:新增中止优化、自动重试逻辑,并优化UI,整合统一提示词编辑器。\n - **Bug修复**:修复导入导出图标颠倒、保存即新建、刷新后预设未加载等问题。\n- **各项优化**\n - **角色世界书**:改为即时保存逻辑,并新增温度与最大字符数设定。\n - **API配置**:修复主页及NCCS API配置在刷新后的视觉问题。\n - **密折司**:新增搜索框,可快速定位内容并高亮显示。\n\n---\n\n### v1.4.4 更新\n- 修复主页API配置影响其他API模式的问题。\n- 角色世界书自动更新逻辑优化,采用类似小总结的机制。\n- 表格修改不再判断触摸屏,直接区分移动端与PC端。\n\n---\n\n### v1.4.0 - v1.4.3 角色世界书专题更新\n- **核心功能:角色世界书**\n - 动态从对话中提取角色设定,并以世界书条目形式更新。\n - 支持自动、增量、手动等多种更新方式,确保角色状态实时同步。\n - 可自定义写入的世界书及更新规则,沿用标签提取与排除逻辑。\n- **功能优化**\n - **UI整合**:将扩展入口整合至统一容器,界面更清爽。\n - **独立API配置**:为填表、总结功能增加独立的 NCCS/NGMS API 系统。\n - **翰林院优化**:优化向量化批处理间隔,避免因请求过快导致数据清零。\n- **Bug修复 (v1.4.1-v1.4.3)**\n - 修复角色世界书在多种场景下的兼容性与UI问题(如CLI/Build反代、悬浮窗点击等)。\n - 修复 NCCS API 无法获取Build模型的问题。\n - 优化角色世界书关键词逻辑及填表提示词。\n\n---\n\n### v1.3.9 更新\n- 优化RAG向量和表格的注入逻辑。\n- **表格加强**:新增一键整理冗长表格功能;分步与批量填表支持读取世界书。\n\n---\n\n### v1.3.8 更新\n- 支持通过点击图标修改表名。\n- **密折司加强**:新增Tokens与字数统计;可标注表格与向量内容的注入位置。\n- **预设提示词优化**:编辑器改为折叠式,并修复修改后的排序错乱问题。\n\n---\n\n### v1.3.7 更新\n- 新增左下角扩展菜单内的提示词编辑器。\n- 表格新增全局预设的导入与清除功能。\n- 所有提示词统一到同一文件进行编辑和排序。\n\n---\n\n### v1.3.6 更新\n- 修复移动端“查看优化前文”按钮的拖动问题。\n- 修复总结写入时因UI选择导致无法写入的Bug。\n- 填表功能新增按“选定楼层”或“当前楼层”填表。\n- 剧情优化推进功能支持注入插件的表格内容。\n\n---\n\n### v1.3.5 更新\n- 将已废弃的剧情推进功能迁移并整合进插件。\n- 全面升级总结、填表、优化、剧情推进的破限提示词。\n- 优化API调用,解决空回与截断问题。\n\n---\n\n### v1.3.4 更新\n- 针对Flash模型优化了分步填表、正文优化、大小总结的破限词。\n- 大总结新增自动将处理过的内容送去向量化的功能。\n\n---\n\n### v1.3.3 更新\n- 修复谷歌向量API,并增加对本地向量模型与重排序代理的支持。\n- 主殿API强制代理可刷出模型,且密钥跟随SillyTavern主设置。\n\n---\n\n### v1.3.0 - v1.3.2 更新\n- **超级更新:表格功能重做**\n - 新增原始、分步等多种填表逻辑。\n - 移动端样式优化,增加双击修改锁,避免误触。\n - 增强行列操控性(移动、增删、编辑)。\n - 表格字体跟随酒馆设置。\n- **修复与优化**\n - 修复填表中断、空回等问题,增加修改高亮。\n - 修复表格与优化功能的冲突。\n - 自动小总结默认保留最近两层不总结。\n\n---\n\n### v1.2.9 超级更新\n- **革命性更新**:插件内嵌表格系统,实现总结、向量、表格功能一体化。\n\n---\n\n### v1.2.0 - v1.2.8 翰林院(RAG)与核心功能优化\n- **翰林院 (RAG) 优化**\n - 向量化来源标识加强,模型可清晰分辨上下文来源。\n - 修复向量化锁定会话报错及异常归零的Bug。\n- **新功能:优化前文查看器**\n - 在左下角扩展菜单中新增,可查看最近一次优化的原始文本。\n- **核心功能重构**\n - “即时总结”升级为“内容排除”,可按规则排除特定内容,让模型更专注核心文本。\n - 增强API防429机制,提升稳定性。\n - 优化功能可智能保留正文中的“美化”标签。\n- **问题修复**\n - 修复“内容排除”刷新后自动关闭及插件“冷启动”问题。\n - 修复 v1.1.9 中“即时总结”可能导致正文丢失的严重问题。\n\n---\n\n### v1.1.0 - v1.1.9 早期核心功能迭代\n- **v1.1.9**: 引入`Tt佬`的破限提示词,大幅提升破限成功率。\n- **v1.1.8**: 上线“密折司”模块,可拦截并编辑发送给主模型的提示词。\n- **v1.1.7**: 翰林院(RAG)新增「忆识精炼」(Rerank)与多样化注入方式。\n- **v1.1.5**: 翰林院(RAG)系统首次引入。\n- **v1.1.0**: 新增“微言录”(小总结)与“宏史卷”(大总结)功能。\n\n---\n\n### v1.0.1 - v1.0.9 (远古版本)\n- **v1.0.9**: 重构“优化”与“总结”任务逻辑。\n- **v1.0.8**: UI升级,新增“内阁密室”入口与自动/手动隐藏楼层功能。\n- **v1.0.6**: 新增自定义优化标签功能,解决格式丢失问题。\n- **v1.0.1**: **首次发布**,核心功能为“聊天正文优化”与“即时总结”。" + "version": "1.6.2", + "changelog": "### Amily2号 - 重要链接\n\n- **插件发布帖**: [点击跳转](https://discord.com/channels/1134557553011998840/1393908367377956965)\n- **插件答疑卡**: [点击跳转](https://discord.com/channels/1134557553011998840/1410520358989201438/1411564423297892393)\n- **详细使用教程**: [点击跳转](https://docs.google.com/document/d/11E7HIFg59up0afv-lV0cAF5G3jzJXCkZK8cBCOMZ9zo/edit?usp=sharing)\n\n---\n\n### v1.6.2 更新\n- **分步填表优化**:注入格式更改为AI更易读的Markdown表格,旨在改善表格内容出现在正文输出中的问题。\n- **Bug修复**:修复了特定情况下因分步填表导致翻页后无法填表的Bug(感谢网友的问题反馈与修复方案)。\n- **UI兼容**:世界书批量编辑功能对移动端进行了兼容性优化。\n- **向量模块大改**\n - **知识库管理**:条目新增重命名功能。\n - **角色独立向量**:新增角色独立向量逻辑,允许同一角色卡在新聊天中创建独立的向量化文件,同时不影响全局知识库。\n - **检索逻辑优化**:可提取上下文中的标签进行检索,并排除思维链、注释等无关信息,使检索结果更精准。\n\n---\n\n### v1.6.1 更新\n- **UI优化**:界面UI进一步简化,视觉效果更清爽。\n- **渲染功能**:新增SillyTavern渲染功能,可作为酒馆助手的轻量化替代,并能与之无冲突共存(渲染功能默认关闭,需手动开启)。\n- **文案优化**:修改了部分功能的标题,使其更易于理解。\n\n---\n\n### v1.6.0 更新\n- **核心Bug修复**\n - 修复了角色世界书加载角色卡数据异常、增量模式与关键词无法写入等一系列世界书相关问题。\n - 修复了世界书编辑器因先前更新导致的读取与修改逻辑混乱问题。\n - 修复了小总结新建独立档案后,需刷新浏览器才能显示的问题。\n - 修复了小总结在未勾选用户或AI消息时,内容依然被发送的Bug。\n\n---\n\n### v1.5.8 更新\n- **兼容性修复**\n - 修复了因酒馆版本更新导致的世界书读取、修改异常,增强了后续版本兼容性。\n - 修复了因酒馆助手频繁更新导致的多种异常(如加载角色卡数据出错),实现与酒馆助手解耦,避免未来受其更新影响。\n- **表格功能优化**:删除行时不再立即删除,而是以红色高亮标出,在下一轮AI交互时再执行删除,期间不影响表格功能。\n- **功能增强**\n - **剧情优化**:新增Ejs预更新功能(由 @code_ducker_64 提供)。\n - **分步填表**:思考框架提示词开放自定义,可在提示词链中进行修改。\n\n---\n\n### v1.5.7 更新\n- **术语表功能解封**\n - 开放测试,可将长篇小说上传并让AI滚动式总结生成世界观、角色、时间线等条目,便于创作同人或代入原著剧情。\n- **功能修复与优化**\n - 优化了分步填表和批量填表在处理大量数据时导致浏览器存储占用过高的问题。\n - 修复了表格重整理功能,并明确其效果依赖于提示词链中的自定义提示词。\n - 修复了切换开场白时弹出黄色填表回退警告的问题。\n - 修复了剧情推进功能无法读取自定义世界书的问题。\n\n---\n\n### v1.5.6 更新\n- **世界书批量编辑器增强**:新增对世界书的批量删除、备份、新建、重命名功能。\n- **Bug修复**\n - 修复了翰林院开启“优先注入”后Rerank成功提示不显示的问题。\n - 修复了正文优化成功后的弹窗不显示的问题。\n - 修复了角色世界书在特定情况下角色卡数据加载错误、抓不到上下文的Bug。\n- **UI优化**:对主页UI进行了微调。\n\n---\n\n### v1.5.5 更新\n- **向量化多检索功能**:向量化新增多次检索功能,分为“优先池”和“普通池”,确保不同重要度的知识库内容(如“大总结”与“小说原文”)都能被有效检索。\n\n---\n\n### v1.5.4 更新\n- **表格功能全方位优化**\n - **内容约束**:新增规则,可设定列的最大字符数与行的最大数量,超出部分由AI在下次更新时自动合理缩减。\n - **持续渲染**:开启后,表格将始终固定在最新消息栏,方便实时查看与编辑。\n - **功能完善**:修复了分步填表读取世界书与上下文的Bug,并正式支持“重制”(右箭头)操作。\n - **独立规则**:表格的标签提取与排除规则正式独立,不再与微言录共享设置。\n - **新增操作**:增加“回退并重新填表”按钮,可在保留原文的同时让AI重新生成表格。\n- **其他优化与修复**\n - 世界书批量编辑器不再渲染内容,避免界面卡顿。\n - 修复了角色世界书存储来源无法切换的Bug。\n - 合并了来自`潜默`的代码,修复了特定情况下TavernHelper调用失败的问题。\n\n---\n\n### v1.5.3 更新\n- **默认设置调整**:“剧情优化”与“角色世界”功能的所有开关默认关闭,避免新用户困扰。\n- **功能适配与完善**\n - “重制正文”(右箭头)功能完成适配。\n - 正文优化的世界书读取逻辑增加全选、全不选和搜索功能。\n - 角色世界、NCCS、JQYH、NGMS API的全兼容模式均已支持谷歌直连。\n- **Bug修复**:修复了角色世界存储来源切换、上下文抓取失败等多个问题。\n- **UI优化**:聊天内显示表格在PC端采用换行逻辑,移动端采用横向滑动,避免内容溢出。\n\n---\n\n### v1.5.2 超级更新\n- **表格功能强化**\n - **宏注册**:新增`{{{Amily2EditContent}}}`占位符,可在任意位置注入填表流程与表格内容。\n - **聊天内显示**:支持在最新消息下方显示表格,并高亮AI修改的内容,同时适配移动端。\n - **独立规则**:表格功能拥有独立的标签提取与内容排除规则。\n - **体验优化**:手动编辑表格后不再重载UI,提升流畅度。\n- **翰林院加强**\n - **UI更新**:将检索与重排序开关整合至一处。\n - **超级排序**:新增功能,可对检索内容进行精准的自动分类排序。\n- **正文优化加强**\n - 新增对世界书条目的读取。\n - “查看优化前文”功能新增前后文对比视图。\n\n---\n\n### v1.5.1 更新\n- 修复了大总结功能中Ngms API系统存在的问题。\n\n---\n\n### v1.5.0 更新\n- **世界编辑功能上线**\n - 世界书的批量编辑功能,支持批量:一键关闭,一键开启,一键蓝绿灯,一键删除,一键递归的设置。\n - 支持快速深度与顺序设置\n - 支持条目名搜索,以及内容搜索\n - 点击内容可细化编辑\n - Ps:暂时对移动端不太友好,目前还仅仅只是一个雏形,后面可能会接入ai,可以对世界书深化编辑、排版等等。\n- **翰林院功能优化**\n - 知识库支持多选批量编辑的操作:一键开关,一键局部与全局移动,一键删除\n - 向量化内容注入时不再是全部一起注入到同一个位置,而是分开不同的位置注入,让大模型思路更加清晰,且避免思路混乱的问题。举例来说,你可以将文风使用手动录入的方式录入进去,注入模板更改为文风模板,位置设置到一个合适的位置,这样就能在合适的环境下使用合适的文风。\n - Ps:感谢功能思路友情提供:Silence_Lurker潜默\n\n---\n\n### v1.4.9 更新\n- **翰林院 (RAG) 升级**\n - 向量化文件增加了一键全局和一键局部功能。\n - 翰林院世界书向量化新增世界书搜索与条目搜索。\n\n---\n\n### v1.4.8 更新\n- **保留层数功能更新**:优化了保留层数的设置,并新增了一键全局设置选项。\n\n---\n\n### v1.4.7 更新\n- **提示词链编辑器升级**:左下角魔法棒入口,自定义的提示词支持sillytavern的宏了,各种变量也完美兼容,例如你在提示词链新增一条内容为`{{user}}`的条目,发送给插件ai的时候,会自动替换为你的名字。\n- **UI升级**:响应大爹们的要求,因为美化的问题可能会导致我们扩展文字看不清楚,所以现在新增背景色、按钮色、字体色的调整,另外增加了扩展的背景图上传,以及背景透明度可调整。(首次更新手动调整一下背景透明度。)\n- **翰林院升级**:还是应大爹们的要求,为了避免需要重复迁徙向量化文件,让不同角色卡使用同一个向量化文件,现在知识库分为局部和全局,可以将向量化文件移动到全局,这样这个向量化文件,每个角色卡就都可以使用了。\n\n---\n\n### v1.4.6 更新\n- **统一提示词编辑器**:增加了角色世界书的两种更新提示词模式,便于后续更新预设。\n- **交互优化**:条目删除增加确认弹窗,避免移动端误触。\n- **UI优化**:角色世界书弹窗UI改为自适应,优化移动端体验。\n\n---\n\n### v1.4.5 更新\n- **剧情推进大改**\n - **独立API系统**:剧情优化新增Jqyh API系统,可独立配置温度、最大字符数,并支持世界书及条目搜索。\n - **交互优化**:新增中止优化、自动重试逻辑,并优化UI,整合统一提示词编辑器。\n - **Bug修复**:修复导入导出图标颠倒、保存即新建、刷新后预设未加载等问题。\n- **各项优化**\n - **角色世界书**:改为即时保存逻辑,并新增温度与最大字符数设定。\n - **API配置**:修复主页及NCCS API配置在刷新后的视觉问题。\n - **密折司**:新增搜索框,可快速定位内容并高亮显示。\n\n---\n\n### v1.4.4 更新\n- 修复主页API配置影响其他API模式的问题。\n- 角色世界书自动更新逻辑优化,采用类似小总结的机制。\n- 表格修改不再判断触摸屏,直接区分移动端与PC端。\n\n---\n\n### v1.4.0 - v1.4.3 角色世界书专题更新\n- **核心功能:角色世界书**\n - 动态从对话中提取角色设定,并以世界书条目形式更新。\n - 支持自动、增量、手动等多种更新方式,确保角色状态实时同步。\n - 可自定义写入的世界书及更新规则,沿用标签提取与排除逻辑。\n- **功能优化**\n - **UI整合**:将扩展入口整合至统一容器,界面更清爽。\n - **独立API配置**:为填表、总结功能增加独立的 NCCS/NGMS API 系统。\n - **翰林院优化**:优化向量化批处理间隔,避免因请求过快导致数据清零。\n- **Bug修复 (v1.4.1-v1.4.3)**\n - 修复角色世界书在多种场景下的兼容性与UI问题(如CLI/Build反代、悬浮窗点击等)。\n - 修复 NCCS API 无法获取Build模型的问题。\n - 优化角色世界书关键词逻辑及填表提示词。\n\n---\n\n### v1.3.9 更新\n- 优化RAG向量和表格的注入逻辑。\n- **表格加强**:新增一键整理冗长表格功能;分步与批量填表支持读取世界书。\n\n---\n\n### v1.3.8 更新\n- 支持通过点击图标修改表名。\n- **密折司加强**:新增Tokens与字数统计;可标注表格与向量内容的注入位置。\n- **预设提示词优化**:编辑器改为折叠式,并修复修改后的排序错乱问题。\n\n---\n\n### v1.3.7 更新\n- 新增左下角扩展菜单内的提示词编辑器。\n- 表格新增全局预设的导入与清除功能。\n- 所有提示词统一到同一文件进行编辑和排序。\n\n---\n\n### v1.3.6 更新\n- 修复移动端“查看优化前文”按钮的拖动问题。\n- 修复总结写入时因UI选择导致无法写入的Bug。\n- 填表功能新增按“选定楼层”或“当前楼层”填表。\n- 剧情优化推进功能支持注入插件的表格内容。\n\n---\n\n### v1.3.5 更新\n- 将已废弃的剧情推进功能迁移并整合进插件。\n- 全面升级总结、填表、优化、剧情推进的破限提示词。\n- 优化API调用,解决空回与截断问题。\n\n---\n\n### v1.3.4 更新\n- 针对Flash模型优化了分步填表、正文优化、大小总结的破限词。\n- 大总结新增自动将处理过的内容送去向量化的功能。\n\n---\n\n### v1.3.3 更新\n- 修复谷歌向量API,并增加对本地向量模型与重排序代理的支持。\n- 主殿API强制代理可刷出模型,且密钥跟随SillyTavern主设置。\n\n---\n\n### v1.3.0 - v1.3.2 更新\n- **超级更新:表格功能重做**\n - 新增原始、分步等多种填表逻辑。\n - 移动端样式优化,增加双击修改锁,避免误触。\n - 增强行列操控性(移动、增删、编辑)。\n - 表格字体跟随酒馆设置。\n- **修复与优化**\n - 修复填表中断、空回等问题,增加修改高亮。\n - 修复表格与优化功能的冲突。\n - 自动小总结默认保留最近两层不总结。\n\n---\n\n### v1.2.9 超级更新\n- **革命性更新**:插件内嵌表格系统,实现总结、向量、表格功能一体化。\n\n---\n\n### v1.2.0 - v1.2.8 翰林院(RAG)与核心功能优化\n- **翰林院 (RAG) 优化**\n - 向量化来源标识加强,模型可清晰分辨上下文来源。\n - 修复向量化锁定会话报错及异常归零的Bug。\n- **新功能:优化前文查看器**\n - 在左下角扩展菜单中新增,可查看最近一次优化的原始文本。\n- **核心功能重构**\n - “即时总结”升级为“内容排除”,可按规则排除特定内容,让模型更专注核心文本。\n - 增强API防429机制,提升稳定性。\n - 优化功能可智能保留正文中的“美化”标签。\n- **问题修复**\n - 修复“内容排除”刷新后自动关闭及插件“冷启动”问题。\n - 修复 v1.1.9 中“即时总结”可能导致正文丢失的严重问题。\n\n---\n\n### v1.1.0 - v1.1.9 早期核心功能迭代\n- **v1.1.9**: 引入`Tt佬`的破限提示词,大幅提升破限成功率。\n- **v1.1.8**: 上线“密折司”模块,可拦截并编辑发送给主模型的提示词。\n- **v1.1.7**: 翰林院(RAG)新增「忆识精炼」(Rerank)与多样化注入方式。\n- **v1.1.5**: 翰林院(RAG)系统首次引入。\n- **v1.1.0**: 新增“微言录”(小总结)与“宏史卷”(大总结)功能。\n\n---\n\n### v1.0.1 - v1.0.9 (远古版本)\n- **v1.0.9**: 重构“优化”与“总结”任务逻辑。\n- **v1.0.8**: UI升级,新增“内阁密室”入口与自动/手动隐藏楼层功能。\n- **v1.0.6**: 新增自定义优化标签功能,解决格式丢失问题。\n- **v1.0.1**: **首次发布**,核心功能为“聊天正文优化”与“即时总结”。" } diff --git a/assets/Amily2-AdditionalFeatures.html b/assets/Amily2-AdditionalFeatures.html index 96c2ccf..7a53968 100644 --- a/assets/Amily2-AdditionalFeatures.html +++ b/assets/Amily2-AdditionalFeatures.html @@ -15,12 +15,20 @@
- +
+ +
+ + +
diff --git a/core/autoHideManager.js b/core/autoHideManager.js index c76f327..1c00db9 100644 --- a/core/autoHideManager.js +++ b/core/autoHideManager.js @@ -1 +1,129 @@ -(function(_0x4ee988,_0x4037de){const _0x37bb46=_0x58cf,_0x4f5812=_0x4ee988();while(!![]){try{const _0x1c6d7c=-parseInt(_0x37bb46(0x1c9))/0x1*(parseInt(_0x37bb46(0x1df))/0x2)+parseInt(_0x37bb46(0x1da))/0x3*(-parseInt(_0x37bb46(0x1d0))/0x4)+-parseInt(_0x37bb46(0x1d2))/0x5+-parseInt(_0x37bb46(0x1ea))/0x6+parseInt(_0x37bb46(0x1dd))/0x7*(-parseInt(_0x37bb46(0x1d6))/0x8)+-parseInt(_0x37bb46(0x1d1))/0x9+parseInt(_0x37bb46(0x1d7))/0xa;if(_0x1c6d7c===_0x4037de)break;else _0x4f5812['push'](_0x4f5812['shift']());}catch(_0xa818b5){_0x4f5812['push'](_0x4f5812['shift']());}}}(_0x5992,0xc4f22));function _0x58cf(_0x18e475,_0x4450b0){const _0x599238=_0x5992();return _0x58cf=function(_0x58cf6f,_0x5e2dd5){_0x58cf6f=_0x58cf6f-0x1c0;let _0x33b306=_0x599238[_0x58cf6f];return _0x33b306;},_0x58cf(_0x18e475,_0x4450b0);}import{getContext,extension_settings}from'/scripts/extensions.js';import{SlashCommandParser}from'/scripts/slash-commands/SlashCommandParser.js';import{extensionName}from'../utils/settings.js';async function executeSlashCommand(_0x28ecae){const _0x4e2c65=_0x58cf;if(!_0x28ecae)return;try{console['log']('[Amily-敕令执行官]\x20准备执行圣谕:\x20'+_0x28ecae);const _0x54b194=new SlashCommandParser(),_0x2ebd11=_0x54b194[_0x4e2c65(0x1e8)](_0x28ecae,![]);if(_0x2ebd11&&typeof _0x2ebd11[_0x4e2c65(0x1c7)]===_0x4e2c65(0x1e4))await _0x2ebd11[_0x4e2c65(0x1c7)](),console[_0x4e2c65(0x1d3)]('[Amily-敕令执行官]\x20圣谕:\x20\x22'+_0x28ecae+_0x4e2c65(0x1cd)),toastr[_0x4e2c65(0x1e5)](_0x4e2c65(0x1c1)+_0x28ecae+'\x22\x20已成功颁布','敕令司回报');else{const _0x4902df=_0x4e2c65(0x1db)+_0x28ecae;console[_0x4e2c65(0x1e6)](_0x4e2c65(0x1d8)+_0x4902df),toastr[_0x4e2c65(0x1e6)](_0x4902df,_0x4e2c65(0x1e2));}}catch(_0x3fb9f0){console[_0x4e2c65(0x1e6)](_0x4e2c65(0x1cb)+_0x28ecae+_0x4e2c65(0x1c5),_0x3fb9f0),toastr[_0x4e2c65(0x1e6)](_0x4e2c65(0x1e0)+_0x3fb9f0[_0x4e2c65(0x1c6)],_0x4e2c65(0x1e2));}}export async function executeAutoHide(){const _0x5f18de=_0x58cf;try{const _0x5185f0=extension_settings[extensionName];if(!_0x5185f0[_0x5f18de(0x1c8)])return;const _0x1bd89b=_0x5185f0['autoHideThreshold']||0x1e,_0x4cdc8a=getContext(),_0x22e5ff=_0x4cdc8a['chat']['length'],_0x430d62=_0x22e5ff-_0x1bd89b-0x1;if(_0x430d62<0x0){;return;}const _0x4768bf=_0x5f18de(0x1c3)+_0x430d62;console[_0x5f18de(0x1d3)](_0x5f18de(0x1ca)+_0x4768bf);const _0x1b6e36=new SlashCommandParser(),_0x31a7eb=_0x1b6e36[_0x5f18de(0x1e8)](_0x4768bf,![]);_0x31a7eb&&typeof _0x31a7eb[_0x5f18de(0x1c7)]===_0x5f18de(0x1e4)?(await _0x31a7eb[_0x5f18de(0x1c7)](),console[_0x5f18de(0x1d3)]('[Amily-史册管理员]\x20圣谕颁布成功。')):console[_0x5f18de(0x1e6)](_0x5f18de(0x1e3));}catch(_0x170bc5){console[_0x5f18de(0x1e6)](_0x5f18de(0x1e7),_0x170bc5);}}export async function executeManualCommand(_0xaf2ae3,_0x15bb0a={}){const _0x567b75=_0x58cf,{from:_0x1666d9,to:_0x3462b1}=_0x15bb0a;let _0x5cc3b1='';switch(_0xaf2ae3){case _0x567b75(0x1de):{const _0x6bd434=getContext()[_0x567b75(0x1e1)][_0x567b75(0x1c4)];if(_0x6bd434>0x0){const _0x4dbd57=_0x6bd434-0x1;_0x5cc3b1=_0x567b75(0x1cf)+_0x4dbd57;}else{toastr[_0x567b75(0x1c0)](_0x567b75(0x1ce),'敕令司回报');return;}break;}case _0x567b75(0x1c2):case _0x567b75(0x1d5):{const _0x582643=_0xaf2ae3===_0x567b75(0x1c2)?'/hide':_0x567b75(0x1cc);if(_0x1666d9===''&&_0x3462b1!=='')_0x5cc3b1=_0x582643+'\x20'+_0x3462b1;else{if(_0x1666d9!==''&&_0x3462b1!==''){if(parseInt(_0x1666d9)>parseInt(_0x3462b1)){toastr[_0x567b75(0x1e9)](_0x567b75(0x1d9),_0x567b75(0x1dc));return;}_0x5cc3b1=_0x582643+'\x20'+_0x1666d9+'-'+_0x3462b1;}else{toastr[_0x567b75(0x1e9)]('请输入有效的楼层范围',_0x567b75(0x1dc));return;}}break;}default:console[_0x567b75(0x1e6)](_0x567b75(0x1d4)+_0xaf2ae3);return;}await executeSlashCommand(_0x5cc3b1);}function _0x5992(){const _0x133664=['success','error','[Amily-史册管理员]\x20执行自动隐藏律法时发生意外错误:','parse','warning','8803272zKOyks','info','圣谕\x20\x22','manual_hide','/hide\x200-','length','\x22\x20时发生意外:','message','execute','autoHideEnabled','17XaePWh','[Amily-史册管理员]\x20颁布圣谕:\x20','[Amily-敕令执行官]\x20执行圣谕\x20\x22','/unhide','\x22\x20已成功颁布。','史册为空,无需解除隐藏。','/unhide\x200-','3241588UWNBsl','2333502whztNt','6368380RiIATK','log','[Amily-手动敕令司]\x20未知的命令类型:\x20','manual_unhide','12590440mhbLFH','65756490EvHMoU','[Amily-敕令执行官]\x20','起始层不能大于结束层','3MrmhsI','铸造出的圣谕法印无法执行!指令:\x20','敕令司提示','7TQjRrw','unhide_all','45246UriBuS','执行圣谕时发生意外:\x20','chat','敕令司紧急报告','[Amily-史册管理员]\x20致命错误:铸造出的圣谕法印无法执行!','function'];_0x5992=function(){return _0x133664;};return _0x5992();} \ No newline at end of file +import { getContext, extension_settings } from "/scripts/extensions.js"; +import { SlashCommandParser } from "/scripts/slash-commands/SlashCommandParser.js"; +import { extensionName } from "../utils/settings.js"; +import { readGoldenLedgerProgress } from "./historiographer.js"; +import { characters } from "/script.js"; +import { getChatIdentifier } from "./lore.js"; + + +async function executeSlashCommand(commandString) { + if (!commandString) return; + try { + console.log(`[Amily-敕令执行官] 准备执行圣谕: ${commandString}`); + const parser = new SlashCommandParser(); + const closure = parser.parse(commandString, false); + + if (closure && typeof closure.execute === 'function') { + await closure.execute(); + console.log(`[Amily-敕令执行官] 圣谕: "${commandString}" 已成功颁布。`); + toastr.success(`圣谕 "${commandString}" 已成功颁布`, "敕令司回报"); + } else { + const errorMsg = `铸造出的圣谕法印无法执行!指令: ${commandString}`; + console.error(`[Amily-敕令执行官] ${errorMsg}`); + toastr.error(errorMsg, "敕令司紧急报告"); + } + } catch (error) { + console.error(`[Amily-敕令执行官] 执行圣谕 "${commandString}" 时发生意外:`, error); + toastr.error(`执行圣谕时发生意外: ${error.message}`, "敕令司紧急报告"); + } +} + +export async function executeAutoHide() { + try { + const settings = extension_settings[extensionName]; + const context = getContext(); + const chatLength = context.chat.length; + let hideUntilIndex = -1; + + if (settings.autoHideSummarizedEnabled) { + let targetLorebookName; + switch (settings.lorebookTarget) { + case "character_main": + targetLorebookName = characters[context.characterId]?.data?.extensions?.world; + break; + case "dedicated": + const chatIdentifier = await getChatIdentifier(); + targetLorebookName = `Amily2-Lore-${chatIdentifier}`; + break; + } + + if (targetLorebookName) { + const summarizedCount = await readGoldenLedgerProgress(targetLorebookName); + if (summarizedCount > 0) { + hideUntilIndex = summarizedCount - 1; + } + } + } + + if (settings.autoHideEnabled) { + const threshold = settings.autoHideThreshold || 30; + const thresholdHideIndex = chatLength - threshold - 1; + if (thresholdHideIndex > hideUntilIndex) { + hideUntilIndex = thresholdHideIndex; + } + } + + if (hideUntilIndex < 0) { + return; + } + + const commandString = `/hide 0-${hideUntilIndex}`; + console.log(`[Amily-史册管理员] 颁布圣谕: ${commandString}`); + const parser = new SlashCommandParser(); + const closure = parser.parse(commandString, false); + + if (closure && typeof closure.execute === 'function') { + await closure.execute(); + console.log(`[Amily-史册管理员] 圣谕颁布成功。`); + } else { + console.error('[Amily-史册管理员] 致命错误:铸造出的圣谕法印无法执行!'); + } + + } catch (error) { + console.error('[Amily-史册管理员] 执行自动隐藏律法时发生意外错误:', error); + } +} + +export async function executeManualCommand(commandType, params = {}) { + const { from, to } = params; + + let commandString = ''; + + switch (commandType) { + case 'unhide_all': { + const chatLength = getContext().chat.length; + if (chatLength > 0) { + const lastIndex = chatLength - 1; + commandString = `/unhide 0-${lastIndex}`; + } else { + toastr.info("史册为空,无需解除隐藏。", "敕令司回报"); + return; + } + break; + } + + case 'manual_hide': + case 'manual_unhide': { + const command = commandType === 'manual_hide' ? '/hide' : '/unhide'; + if (from === '' && to !== '') { + commandString = `${command} ${to}`; + } else if (from !== '' && to !== '') { + if (parseInt(from) > parseInt(to)) { + toastr.warning("起始层不能大于结束层", "敕令司提示"); + return; + } + commandString = `${command} ${from}-${to}`; + } else { + toastr.warning("请输入有效的楼层范围", "敕令司提示"); + return; + } + break; + } + + default: + console.error(`[Amily-手动敕令司] 未知的命令类型: ${commandType}`); + return; + } + + await executeSlashCommand(commandString); +} diff --git a/core/historiographer.js b/core/historiographer.js index 105c7b6..1fd1082 100644 --- a/core/historiographer.js +++ b/core/historiographer.js @@ -16,6 +16,7 @@ import { showSummaryModal, showHtmlModal } from "../ui/page-window.js"; import { getPresetPrompts, getMixedOrder } from '../PresetSettings/index.js'; import { callAI, generateRandomSeed } from "./api.js"; import { callNgmsAI } from "./api/Ngms_api.js"; +import { executeAutoHide } from "./autoHideManager.js"; let isExpeditionRunning = false; let manualStopRequested = false; @@ -24,7 +25,7 @@ const RUNNING_LOG_COMMENT = "【敕史局】对话流水总帐"; const PROGRESS_SEAL_REGEX = /本条勿动【前(\d+)楼总结已完成】否则后续总结无法进行。$/; -async function readGoldenLedgerProgress(targetLorebookName) { +export async function readGoldenLedgerProgress(targetLorebookName) { if (!targetLorebookName) return 0; try { const bookData = await loadWorldInfo(targetLorebookName); @@ -127,10 +128,9 @@ export async function executeManualSummary(startFloor, endFloor, isAuto = false) onRegenerate: async (summaryDialog) => { summaryDialog.find('textarea').prop('disabled', true).val('正在重新生成,请稍候...'); const newSummary = await getSummary(textToSummarize, toastTitle); - if (newSummary) { - summaryDialog.find('textarea').prop('disabled', false).val(newSummary); - } else { - summaryDialog.find('textarea').prop('disabled', false).val(summary); + summaryDialog.find('textarea').prop('disabled', false).val(newSummary || summary); + summaryDialog[0].showModal(); // 重新显示弹窗 + if (!newSummary) { toastr.error("重新生成失败,已恢复原始内容。", "模型召唤失败"); } }, @@ -242,10 +242,9 @@ export async function executeManualSummary(startFloor, endFloor, isAuto = false) onRegenerate: async (summaryDialog) => { summaryDialog.find('textarea').prop('disabled', true).val('正在重新生成,请稍候...'); const newSummary = await getSummary(textToSummarize, toastTitle); - if (newSummary) { - summaryDialog.find('textarea').prop('disabled', false).val(newSummary); - } else { - summaryDialog.find('textarea').prop('disabled', false).val(summary); + summaryDialog.find('textarea').prop('disabled', false).val(newSummary || summary); + summaryDialog[0].showModal(); // 重新显示弹窗 + if (!newSummary) { toastr.error("重新生成失败,已恢复原始内容。", "模型召唤失败"); } }, @@ -454,6 +453,7 @@ async function writeSummary(summary, startFloor, endFloor, toastTitle) { if (success) { toastr.success(`编年史已成功更新!`, `${toastTitle} - 国史馆`); + executeAutoHide(); // 总结成功后立即触发自动隐藏 return true; } else { // 错误已在 compatibleWriteToLorebook 内部处理和记录 @@ -618,10 +618,9 @@ export async function executeRefinement(worldbook, loreKey) { onRegenerate: async (dialog) => { dialog.find('textarea').prop('disabled', true).val('正在重新生成,请稍候...'); const newContent = await getRefinedContent(); - if (newContent) { - dialog.find('textarea').prop('disabled', false).val(newContent); - } else { - dialog.find('textarea').prop('disabled', false).val(currentRefinedContent); + dialog.find('textarea').prop('disabled', false).val(newContent || currentRefinedContent); + dialog[0].showModal(); // 重新显示弹窗 + if (!newContent) { toastr.error("重新生成失败,已恢复原始内容。", "模型召唤失败"); } }, diff --git a/core/table-system/manager.js b/core/table-system/manager.js index f4e5f00..71f84f9 100644 --- a/core/table-system/manager.js +++ b/core/table-system/manager.js @@ -1 +1 @@ -const _0x5cf5ff=_0x8bba;(function(_0x5d0531,_0x138b26){const _0x171552=_0x8bba,_0x529a39=_0x5d0531();while(!![]){try{const _0x43e125=-parseInt(_0x171552(0x1f7))/0x1*(-parseInt(_0x171552(0x1fa))/0x2)+parseInt(_0x171552(0x2c9))/0x3*(-parseInt(_0x171552(0x270))/0x4)+-parseInt(_0x171552(0x1fb))/0x5+-parseInt(_0x171552(0x278))/0x6*(-parseInt(_0x171552(0x2b8))/0x7)+parseInt(_0x171552(0x266))/0x8*(parseInt(_0x171552(0x2ae))/0x9)+parseInt(_0x171552(0x20a))/0xa+-parseInt(_0x171552(0x21c))/0xb;if(_0x43e125===_0x138b26)break;else _0x529a39['push'](_0x529a39['shift']());}catch(_0x472f46){_0x529a39['push'](_0x529a39['shift']());}}}(_0x2ce6,0x6aa4a));import{getContext,extension_settings}from'/scripts/extensions.js';import{saveChat,saveSettingsDebounced}from'/script.js';import{log}from'./logger.js';import{fillWithSecondaryApi}from'./secondary-filler.js';import{getChatPiece,saveChatDebounced}from'../../utils/utils.js';import{extensionName}from'../../utils/settings.js';import{DEFAULT_AI_RULE_TEMPLATE,DEFAULT_AI_FLOW_TEMPLATE}from'./settings.js';import{renderTables}from'../../ui/table-bindings.js';import{updateOrInsertTableInChat}from'../../ui/message-table-renderer.js';const TABLE_DATA_KEY=_0x5cf5ff(0x26b);let currentTablesState=null,highlightedCells=new Set(),updatedTables=new Set();export function addHighlight(_0x3ab956,_0xe98281,_0x1ac017){const _0x293d13=_0x5cf5ff,_0x19b57d=_0x3ab956+'-'+_0xe98281+'-'+_0x1ac017;highlightedCells[_0x293d13(0x249)](_0x19b57d);}export function getHighlights(){return highlightedCells;}export function clearHighlights(){const _0x18b5a4=_0x5cf5ff;highlightedCells[_0x18b5a4(0x1e1)]>0x0&&(highlightedCells[_0x18b5a4(0x269)](),log(_0x18b5a4(0x205),'info'));}export function getUpdatedTables(){return updatedTables;}export function clearUpdatedTables(){const _0x3d8ec4=_0x5cf5ff;updatedTables[_0x3d8ec4(0x1e1)]>0x0&&(updatedTables[_0x3d8ec4(0x269)](),log(_0x3d8ec4(0x200),'info'));}export function setMemoryState(_0x2f0d1c){currentTablesState=_0x2f0d1c;}export function getMemoryState(){return currentTablesState;}const defaultTemplate={'tables':[{'name':_0x5cf5ff(0x211),'headers':['日期','时段','时间','地点',_0x5cf5ff(0x28f)],'note':'【核心作用】此表格用于精确追踪故事发生的即时时空背景,确保时间与空间的连续性。它应该始终只包含一行,代表当前的“镜头”位置。\x0a【字段详解】\x0a-\x20日期:\x20格式为\x27YYYY-MM-DD\x27。若日期未知,请根据上下文合理推断或设定一个初始日期,如\x27大夏3年-9月-10日\x27。\x0a-\x20时段:\x20严格遵循规定(凌晨:0-5时;早晨:5-8时;上午:8-11时;中午:11-13时;下午:13-16时;傍晚:16-19时;晚上:19-24时)。\x0a-\x20时间:\x20格式为\x27HH:MM\x27。若时间未知,可根据时段估算,如\x2708:30\x27。\x0a-\x20地点:\x20描述当前场景发生的具体位置,应尽可能精确,例如\x27XX街的咖啡馆\x27而非\x27城里\x27。\x0a-\x20此地角色:\x20列出当前场景中所有在场且参与互动的主要角色,用\x27/\x27分隔。','rule_add':_0x5cf5ff(0x25a),'rule_delete':_0x5cf5ff(0x2c7),'rule_update':_0x5cf5ff(0x26f),'charLimitRules':{},'rowLimitRule':0x1,'rows':[]},{'name':_0x5cf5ff(0x223),'headers':['角色名','外貌','身形','衣着','性格','身份','职业',_0x5cf5ff(0x286),'爱好','住所',_0x5cf5ff(0x293)],'note':'【核心作用】此表格是角色关系和状态的核心数据库,用于记录所有在故事中出现的重要角色的详细信息。\x0a【字段详解】\x0a-\x20角色名:\x20角色的唯一标识。\x0a-\x20外貌:\x20描述五官、发型、发色、肤色等面部特征。\x0a-\x20身形:\x20描述身高、体型、肌肉状况、特殊身体标记(如伤疤)等。\x0a-\x20衣着:\x20描述角色当前或标志性的穿着,包括服装、配饰等。\x0a-\x20性格:\x20概括角色的核心性格特质,使用1-3个关键词,如\x27勇敢/鲁莽/忠诚\x27。\x0a-\x20身份:\x20角色的社会背景或出身,如\x27贵族后裔\x27、\x27流浪者\x27。\x0a-\x20职业:\x20角色赖以谋生的工作或职责,如\x27佣兵\x27、\x27学者\x27。\x0a-\x20与关系:\x20描述该角色与主角之间的社会或情感关系,如\x27盟友\x27、\x27导师\x27、\x27敌人\x27。\x0a-\x20爱好:\x20角色的兴趣和消遣活动。\x0a-\x20住所:\x20角色的常住地。\x0a-\x20其他重要信息:\x20记录任何不属于以上类别但对角色至关重要的信息,如特殊能力、过去的经历等。','rule_add':_0x5cf5ff(0x2d1),'rule_delete':_0x5cf5ff(0x2d5),'rule_update':_0x5cf5ff(0x29a),'charLimitRules':{'10':0x1e},'rowLimitRule':0x0,'rows':[]},{'name':_0x5cf5ff(0x23f),'headers':['任务名','类型','详情','状态',_0x5cf5ff(0x2d7),'地点',_0x5cf5ff(0x224),'结果'],'note':_0x5cf5ff(0x27d),'rule_add':_0x5cf5ff(0x246),'rule_delete':_0x5cf5ff(0x2ab),'rule_update':_0x5cf5ff(0x2ca),'charLimitRules':{},'rowLimitRule':0xa,'rows':[]},{'name':_0x5cf5ff(0x23a),'headers':['物品名','类型','详情','状态',_0x5cf5ff(0x23d),_0x5cf5ff(0x238)],'note':_0x5cf5ff(0x203),'rule_add':_0x5cf5ff(0x2d3),'rule_delete':_0x5cf5ff(0x1e8),'rule_update':_0x5cf5ff(0x2b7),'charLimitRules':{},'rowLimitRule':0x0,'rows':[]},{'name':'技能栏','headers':[_0x5cf5ff(0x1dc),_0x5cf5ff(0x259)],'note':_0x5cf5ff(0x22c),'rule_add':_0x5cf5ff(0x288),'rule_delete':_0x5cf5ff(0x251),'rule_update':'【触发条件】当一个已知技能的效果发生进化、变异或被添加了新的限制/效果时(例如,技能升级),必须更新其“技能效果”描述。','charLimitRules':{},'rowLimitRule':0x0,'rows':[]},{'name':_0x5cf5ff(0x1fc),'headers':['类型','具体描述'],'note':'【核心作用】此表格记录了来自的、超越故事本身的“元指令”或世界观设定,拥有最高解释权。内容应被严格遵守,禁止AI自行修改。\x0a【字段详解】\x0a-\x20类型:\x20指令的分类,如\x27世界观设定\x27、\x27剧情走向要求\x27、\x27角色行为禁令\x27。\x0a-\x20具体描述:\x20完整、准确地记录提出的具体要求。','rule_add':_0x5cf5ff(0x28e),'rule_delete':'【触发条件】只能在明确表示要移除或废弃某条设定时,才能删除对应行。','rule_update':'【触发条件】只能在明确表示要修改某条设定时,才能更新对应行的描述。','charLimitRules':{},'rowLimitRule':0x0,'rows':[]}]};function _0x2ce6(){const _0x16998a=['新列\x20','message',')第(','result','below','readAsText','appendChild','重要原因','injectionFlowTemplate','物品栏','执行AI指令:\x20insertRow(tableIndex=','纯净预设','拥有者','全局预设已成功导入并保存到扩展设置中。','任务栏','名为\x20\x22','AI指令块为空,无需执行任何操作。','未能保存回退状态,操作中止。','未在聊天记录中找到表格,正在加载全局预设...','dispatchEvent','createElement','【触发条件】当以下情况发生时,应添加新行:\x0a1.\x20角色接下一个明确的、有目标的委托或命令。\x0a2.\x20角色们达成一个具体的、需要在未来执行的约定。\x0a3.\x20角色为自己设定一个长期的、关键性的目标。','\x20行已标记为待删除。','Amily2-','add','extra','正在尝试从第\x20','预设已成功导入并应用。','note','\x22\x20的表格已存在。','batch_filler_flow_template','在第\x20','【触发条件】如果发现表格中存在两个描述完全相同的重复技能,应删除其中一个。如果记录了非的技能,应立即删除。','aiTemplate','新表格状态已强制写入最新消息并立即保存。','完整备份','rule_update','聊天记录不足,无法执行回退操作。','trim','click','技能效果','【触发条件】当故事开始,且此表格为空时,必须立即根据初始场景创建第一行。',']\x20的顺序已调整。','\x20(索引\x20','chat',']\x20的规则已更新。','type','无法移动表格:索引\x20','插入行失败:找不到索引为\x20','全局预设已清除,新聊天将使用默认模板。','文件格式无效或缺少版本号/表格数据。','【清除全局预设】\x0a\x0a您确定要清除已设置的全局预设吗?\x0a\x0a清除后,新聊天将恢复使用扩展内置的默认表格模板。','amily2_ai_template','8MUezBP','导出成功','当前没有设置全局预设。','clear','所有表格的剧情内容已清空。','amily2_tables_data','操作完成',',\x20data=','执行失败','【触发条件】当以下任一情况发生时,必须更新此行:\x0a1.\x20时间发生显著跳跃(例如,\x27几小时后\x27、\x27第二天\x27)。\x0a2.\x20角色从一个地点移动到另一个地点。\x0a3.\x20场景中关键角色的出入导致在场人员发生变化。','4ifrMtI','\x20条表格操作指令...','rowIndex,','href','表格名称不能为空。','加载全局预设失败:\x20','【修改】:\x20','map','3462024nSnblV','重命名失败:名称不能为空。',',\x20rowIndex=',')超出规定(','Amily2-Table-Preset-v2.0-full','【核心作用】追踪故事中的主要情节线、目标和挑战。只记录对剧情发展有重大影响的“任务”,忽略日常琐事。\x0a【字段详解】\x0a-\x20任务名:\x20任务的简洁概括,如\x27寻找失落的神器\x27。\x0a-\x20类型:\x20任务的分类,如\x27主线\x27、\x27支线\x27、\x27个人\x27、\x27约定\x27。\x0a-\x20详情:\x20对任务目标和背景的简要描述。\x0a-\x20状态:\x20任务的当前进展,如\x27未开始\x27、\x27进行中\x27、\x27已完成\x27、\x27已失败\x27、\x27已取消\x27。\x0a-\x20执行者:\x20负责完成此任务的角色名。\x0a-\x20地点:\x20任务关键环节发生的地点。\x0a-\x20开始时间/结束时间:\x20记录任务的起止时间,格式\x27YYYY-MM-DD\x27,若未结束则结束时间留空。\x0a-\x20结果:\x20任务完成或失败后的最终结果。','AI\x20指令更新了表格\x20[','global_table_preset','导入成功','已提交并永久删除了\x20','(该表当前内容为空)\x0a','执行AI指令时发生错误:\x20',']\x20末尾新增一行。','removeChild','与关系','columnWidths','【触发条件】当在故事中首次成功施展或习得一个全新的、表格中未记录的技能时,必须添加。','移动。','操作成功','charLimitRule','Amily2-Table-Preset-v2.0-clean','”已更新为“','【触发条件】当通过括号、旁白或其他明确的“第四面墙”方式,提出关于故事背景、规则或未来走向的指令时,必须记录于此。','此地角色','stringify','getPrototypeOf','无法回退:聊天记录不足。','其他重要信息','rule_add','\x20条消息加载表格状态...','导入操作已取消。','表格不存在。','toString',']\x20已被成功废黜。','【触发条件】当角色的任何信息发生持久性或关键性变化时,必须更新对应单元格。例如:\x0a1.\x20外貌/身形/衣着发生永久性改变(如断肢、换上新装备)。\x0a2.\x20性格因重大事件而扭转。\x0a3.\x20身份或职业发生变更(如继承王位、被解雇)。\x0a4.\x20与的关系发生根本性转变(如从敌人变为盟友)。','columnIndex','\x20中操作。','缺少状态或目标消息,无法保存。','batchFillerRuleTemplate','headers','”已向','【说明】:\x0a','表格\x20[','\x20列。',')行以下,但切莫完全删除。】','没有可导出的表格数据。','所有AI指令已成功执行完毕。','target',']\x20新增了一列。','mes','function','【触发条件】当任务列表超过10行时,优先删除最早的、已经“已完成”且与当前剧情关联度最低的任务。如果存在内容完全重复的任务,应删除。','length','未能在上一楼找到可用的表格状态。','4724739caHdOH','成功将表格\x20','清空行数据后的状态已强制写入最新消息并立即保存。','files','\x0a*\x20','已成功将回退后的状态保存至最新消息。','无法导出:当前表格状态为空。','body',']\x20新增了一行。','【触发条件】当物品的“状态”(如被损坏)、“拥有者”(如被转交或被盗)或“详情”(如发现了新功能)发生变化时,必须更新。','7hzQNPf',']\x20在第\x20','执行AI指令:\x20updateRow(tableIndex=','UI已更新以显示回退后的状态。','无法找到可锚定的消息或保存失败,顺序调整可能不会被持久化!','replace','onload','file','\x20条消息中找到基准表格数据。','这是一个新创建的表格。','aiFlowTemplate','split','\x0a---\x0a','执行AI指令时出错:\x20','重命名失败','【触发条件】任何时候,如果此表格的行数超过一行,必须删除旧的行,只保留最新、最准确的一行。','charLimitRules','2453931pdnECt','【触发条件】当任务的“状态”发生任何变化时,必须更新。例如,从\x27进行中\x27变为\x27已完成\x27。当任务的“详情”或“结果”有新的关键信息补充时,也应更新。','batchFillerFlowTemplate','version','表格\x20\x22','重新填表失败:\x20','未知操作','\x20的列。','【触发条件】当一个有名有姓的角色首次出现,并与或当前剧情发生有意义的互动时,必须为其创建新的一行。','\x22\x20已重命名为\x20\x22','【触发条件】当一个物品被明确赋予了特殊意义(如被赠予、在关键事件中扮演重要角色)或展示出独特功能时,应为其创建条目。','isArray','【触发条件】当一个角色被确认永久性死亡(非假死或失踪),且其存在不再对后续剧情有直接影响时,可以删除该行。','表格顺序调整后的状态已强制写入最新消息并立即保存。','执行者','fill','warn','\x20行移动到第\x20','success','filter','batch_filler_rule_template','above','parse','成功删除了表格\x20','执行AI指令:\x20deleteRow(tableIndex=','所有表格的行数据已在内存中清空。','废黜表格后的状态已强制写入最新消息并立即保存。','技能名','状态回退成功,准备重新填表...','object','error','\x22\x20已更新内存状态。','size','\x20已在边界。','some',')列,字符超出规定(','\x20的表格。','join','未在AI返回内容中找到有效的\x20\x20指令块。','【触发条件】当一个物品被彻底摧毁、消耗完毕或永久失去其特殊意义时,可以删除。','download','every','left','.json','AI返回内容为空,无法更新表格。','回退状态保存失败,操作中止。','准备执行从AI返回的\x20','导入的预设已强制写入最新消息并立即保存。','rows','aiRuleTemplate','rule_delete','match','无法找到可锚定的消息或保存失败,清空操作可能不会被持久化!','input','46285PrBWdv','tables',')行(','26svHneE','393665RJGexp','设定栏','\x20行位置插入了新行。','forEach',']\x20的第\x20','已清除所有表格的更新标记。','导入的表格数据格式不正确:\x20','用户取消了清除全局预设的操作。','【核心作用】记录那些在故事中具有特殊功能、背景或情感价值的关键物品。普通物品不应记录。\x0a【字段详解】\x0a-\x20物品名:\x20物品的名称。\x0a-\x20类型:\x20物品的分类,如\x27武器\x27、\x27道具\x27、\x27信物\x27、\x27关键物品\x27。\x0a-\x20详情:\x20描述物品的外观、材质和已知功能。\x0a-\x20状态:\x20物品的当前状况,如\x27完好\x27、\x27破损\x27、\x27能量耗尽\x27。\x0a-\x20拥有者:\x20当前持有该物品的角色名。\x0a-\x20重要原因:\x20解释该物品为何重要,例如\x27是解开谜题的钥匙\x27或\x27是母亲的遗物\x27。','删除列失败:在表格\x20','已清除所有单元格高亮标记。','AI指令意图更新不存在的行\x20(rowIndex:\x20','runner','toISOString','limit','5829960qJeaWr','插入了新列。','pending-deletion','导入失败:','全局预设已被清除。','无需清除,当前未设置任何全局预设。','normal','时空栏','onchange','\x0a\x20\x20\x20\x20\x20\x20\x20\x20','\x20行。','application/json','创建失败','number','...]','rowLimitRule','Amily2-Table-Preset-v3.0-separated_templates','AI指令错误:尝试在不存在的表格索引\x20','10484716LusrZX','操作已取消。','constructor','splice','push','\x20行已恢复。','confirm','角色栏','开始时间/结束时间','createObjectURL','rowStatuses','无法找到可锚定的消息或保存失败,新表格可能不会被持久化!','】已开始下载。','回退重填过程中发生错误:\x20','slice','用户取消了全局预设导入操作。','【核心作用】专门用于记录主角掌握的各种技能、魔法、被动能力或特殊专长。\x0a【字段详解】\x0a-\x20技能名:\x20技能的正式名称。\x0a-\x20技能效果:\x20清晰、简洁地描述该技能使用时产生的具体效果、消耗和限制条件。','revokeObjectURL','【删除】:\x20','name','info'];_0x2ce6=function(){return _0x16998a;};return _0x2ce6();}function getDefaultTables(){const _0x34c537=_0x5cf5ff;log('从预设模板生成默认表格...',_0x34c537(0x230));const _0x430d2a=JSON[_0x34c537(0x2df)](JSON[_0x34c537(0x290)](defaultTemplate[_0x34c537(0x1f8)]));return _0x430d2a['forEach'](_0x13e39c=>{const _0x5e72bd=_0x34c537;_0x13e39c['charLimitRule']={'columnIndex':-0x1,'limit':0x0},_0x13e39c['rowLimitRule']=0x0,_0x13e39c[_0x5e72bd(0x287)]=[];}),_0x430d2a;}export function loadTables(_0x39b312=-0x1){const _0x1bf0b7=_0x5cf5ff,_0xc82263=getContext();if(_0xc82263&&_0xc82263[_0x1bf0b7(0x25d)]&&_0xc82263[_0x1bf0b7(0x25d)]['length']>0x0){const _0x422576=_0x39b312===-0x1?_0xc82263[_0x1bf0b7(0x25d)][_0x1bf0b7(0x2ac)]-0x1:_0x39b312-0x1;for(let _0x1d307a=_0x422576;_0x1d307a>=0x0;_0x1d307a--){const _0x25c6f2=_0xc82263[_0x1bf0b7(0x25d)][_0x1d307a];if(_0x25c6f2[_0x1bf0b7(0x24a)]&&_0x25c6f2[_0x1bf0b7(0x24a)][TABLE_DATA_KEY]){log(_0x1bf0b7(0x250)+_0x1d307a+_0x1bf0b7(0x2c0),'info');let _0x574b07=JSON[_0x1bf0b7(0x2df)](JSON[_0x1bf0b7(0x290)](_0x25c6f2['extra'][TABLE_DATA_KEY]));return _0x574b07[_0x1bf0b7(0x1fe)](_0xbdff8c=>{const _0x30b150=_0x1bf0b7;if(_0xbdff8c['note']===undefined)_0xbdff8c[_0x30b150(0x24d)]='无';if(_0xbdff8c[_0x30b150(0x294)]===undefined)_0xbdff8c[_0x30b150(0x294)]='允许';if(_0xbdff8c[_0x30b150(0x1f3)]===undefined)_0xbdff8c[_0x30b150(0x1f3)]='允许';if(_0xbdff8c[_0x30b150(0x255)]===undefined)_0xbdff8c[_0x30b150(0x255)]='允许';_0xbdff8c[_0x30b150(0x28b)]&&!_0xbdff8c[_0x30b150(0x2c8)]&&(_0xbdff8c['charLimitRules']={},_0xbdff8c[_0x30b150(0x28b)][_0x30b150(0x29b)]!==-0x1&&_0xbdff8c['charLimitRule']['limit']>0x0&&(_0xbdff8c['charLimitRules'][_0xbdff8c[_0x30b150(0x28b)][_0x30b150(0x29b)]]=_0xbdff8c['charLimitRule'][_0x30b150(0x209)]));delete _0xbdff8c[_0x30b150(0x28b)];if(_0xbdff8c[_0x30b150(0x219)]===undefined)_0xbdff8c[_0x30b150(0x219)]=0x0;if(_0xbdff8c[_0x30b150(0x287)]===undefined)_0xbdff8c[_0x30b150(0x287)]=[];!_0xbdff8c[_0x30b150(0x226)]&&(_0xbdff8c[_0x30b150(0x226)]=Array(_0xbdff8c[_0x30b150(0x1f1)][_0x30b150(0x2ac)])['fill'](_0x30b150(0x210)));}),currentTablesState=_0x574b07,currentTablesState;}}}if(extension_settings[extensionName]?.[_0x1bf0b7(0x27f)]){log(_0x1bf0b7(0x243),'info');try{const _0x495caf=extension_settings[extensionName]['global_table_preset'];return currentTablesState=JSON[_0x1bf0b7(0x2df)](JSON['stringify'](_0x495caf[_0x1bf0b7(0x1f8)])),_0x495caf[_0x1bf0b7(0x29e)]!==undefined&&saveBatchFillerRuleTemplate(_0x495caf[_0x1bf0b7(0x29e)]),_0x495caf[_0x1bf0b7(0x2cb)]!==undefined&&saveBatchFillerFlowTemplate(_0x495caf['batchFillerFlowTemplate']),currentTablesState;}catch(_0x265c56){log(_0x1bf0b7(0x275)+_0x265c56['message'],_0x1bf0b7(0x1df));}}return log('未找到任何表格数据或全局预设,使用默认模板。','info'),currentTablesState=getDefaultTables(),currentTablesState;}export function saveStateToMessage(_0x43faad,_0x8a3cf6){const _0x4b3dd1=_0x5cf5ff;if(!_0x43faad||!_0x8a3cf6)return log(_0x4b3dd1(0x29d),'error'),![];return!_0x8a3cf6[_0x4b3dd1(0x24a)]&&(_0x8a3cf6[_0x4b3dd1(0x24a)]={}),_0x8a3cf6[_0x4b3dd1(0x24a)][TABLE_DATA_KEY]=JSON[_0x4b3dd1(0x2df)](JSON[_0x4b3dd1(0x290)](_0x43faad)),log('表格状态已准备写入消息\x20['+_0x8a3cf6[_0x4b3dd1(0x2a9)]['substring'](0x0,0x14)+_0x4b3dd1(0x218),_0x4b3dd1(0x230)),!![];}export function saveTables(_0xd0fa2a=_0x5cf5ff(0x2cf)){const _0x5a7e23=_0x5cf5ff;return log('UI操作\x20\x22'+_0xd0fa2a+_0x5a7e23(0x1e0),'info'),!![];}export function deleteColumn(_0x5cfef1,_0x400b4b){const _0x1596e4=_0x5cf5ff,_0x168183=getMemoryState();if(!_0x168183[_0x5cfef1]||_0x400b4b<0x0||_0x400b4b>=_0x168183[_0x5cfef1][_0x1596e4(0x29f)][_0x1596e4(0x2ac)]){log(_0x1596e4(0x204)+_0x5cfef1+'\x20中找不到索引为\x20'+_0x400b4b+_0x1596e4(0x2d0),_0x1596e4(0x1df));return;}_0x168183[_0x5cfef1][_0x1596e4(0x29f)]['splice'](_0x400b4b,0x1),_0x168183[_0x5cfef1][_0x1596e4(0x1f1)][_0x1596e4(0x1fe)](_0x17d884=>{const _0x49a3fd=_0x1596e4;_0x17d884[_0x49a3fd(0x2ac)]>_0x400b4b&&_0x17d884[_0x49a3fd(0x21f)](_0x400b4b,0x1);}),_0x168183[_0x5cfef1][_0x1596e4(0x287)]&&_0x168183[_0x5cfef1][_0x1596e4(0x287)][_0x1596e4(0x2ac)]>_0x400b4b&&_0x168183[_0x5cfef1][_0x1596e4(0x287)][_0x1596e4(0x21f)](_0x400b4b,0x1),log(_0x1596e4(0x2e0)+_0x5cfef1+'\x20的第\x20'+(_0x400b4b+0x1)+_0x1596e4(0x2a3),_0x1596e4(0x2db)),saveTables(_0x168183);}export function moveRow(_0x27fd43,_0x3d87b9,_0x435c2d){const _0x550651=_0x5cf5ff,_0x49b26a=getMemoryState(),_0x7053cf=_0x49b26a[_0x27fd43];if(!_0x7053cf||_0x3d87b9<0x0||_0x3d87b9>=_0x7053cf[_0x550651(0x1f1)][_0x550651(0x2ac)])return;const _0x47c421=_0x435c2d==='up'?_0x3d87b9-0x1:_0x3d87b9+0x1;if(_0x47c421<0x0||_0x47c421>=_0x7053cf[_0x550651(0x1f1)]['length'])return;const [_0x55b71f]=_0x7053cf[_0x550651(0x1f1)][_0x550651(0x21f)](_0x3d87b9,0x1);_0x7053cf[_0x550651(0x1f1)][_0x550651(0x21f)](_0x47c421,0x0,_0x55b71f);if(_0x7053cf[_0x550651(0x226)]&&_0x7053cf['rowStatuses']['length']===_0x7053cf[_0x550651(0x1f1)][_0x550651(0x2ac)]+0x1){const [_0x1dcec7]=_0x7053cf['rowStatuses'][_0x550651(0x21f)](_0x3d87b9,0x1);_0x7053cf[_0x550651(0x226)][_0x550651(0x21f)](_0x47c421,0x0,_0x1dcec7);}log(_0x550651(0x2af)+_0x27fd43+'\x20的第\x20'+(_0x3d87b9+0x1)+_0x550651(0x2da)+(_0x47c421+0x1)+_0x550651(0x214),_0x550651(0x2db)),saveTables(_0x49b26a);}export function insertRow(_0x2c4fb5,_0x5438c7,_0x3a0c2b=_0x5cf5ff(0x235)){const _0x600e4c=_0x5cf5ff,_0x5c094b=getMemoryState(),_0x53a8b6=_0x5c094b[_0x2c4fb5];if(!_0x53a8b6){log(_0x600e4c(0x261)+_0x2c4fb5+_0x600e4c(0x1e5),'error');return;}let _0x40c8ad;typeof _0x5438c7===_0x600e4c(0x217)?_0x40c8ad=_0x3a0c2b===_0x600e4c(0x2de)?_0x5438c7:_0x5438c7+0x1:_0x40c8ad=_0x53a8b6[_0x600e4c(0x1f1)][_0x600e4c(0x2ac)];if(_0x40c8ad<0x0)_0x40c8ad=0x0;if(_0x40c8ad>_0x53a8b6[_0x600e4c(0x1f1)][_0x600e4c(0x2ac)])_0x40c8ad=_0x53a8b6[_0x600e4c(0x1f1)][_0x600e4c(0x2ac)];const _0x5e7d6f=new Array(_0x53a8b6[_0x600e4c(0x29f)]['length'])[_0x600e4c(0x2d8)]('');if(typeof _0x5438c7===_0x600e4c(0x1de)&&_0x5438c7!==null)for(const _0x393aba in _0x5438c7){const _0x318faf=parseInt(_0x393aba,0xa);!isNaN(_0x318faf)&&_0x318faf<_0x5e7d6f[_0x600e4c(0x2ac)]&&(_0x5e7d6f[_0x318faf]=_0x5438c7[_0x393aba],addHighlight(_0x2c4fb5,_0x40c8ad,_0x318faf));}_0x53a8b6['rows'][_0x600e4c(0x21f)](_0x40c8ad,0x0,_0x5e7d6f);if(!_0x53a8b6[_0x600e4c(0x226)])_0x53a8b6[_0x600e4c(0x226)]=Array(_0x53a8b6[_0x600e4c(0x1f1)][_0x600e4c(0x2ac)])['fill'](_0x600e4c(0x210));_0x53a8b6[_0x600e4c(0x226)][_0x600e4c(0x21f)](_0x40c8ad,0x0,_0x600e4c(0x210)),updatedTables['add'](_0x2c4fb5),log('成功在表格\x20'+_0x53a8b6[_0x600e4c(0x22f)]+_0x600e4c(0x25c)+_0x2c4fb5+')\x20的第\x20'+(_0x40c8ad+0x1)+_0x600e4c(0x1fd),_0x600e4c(0x2db));const _0x5e236c=getContext();if(_0x5e236c[_0x600e4c(0x25d)]&&_0x5e236c[_0x600e4c(0x25d)][_0x600e4c(0x2ac)]>0x0){const _0x33ada6=_0x5e236c[_0x600e4c(0x25d)][_0x5e236c[_0x600e4c(0x25d)][_0x600e4c(0x2ac)]-0x1];if(saveStateToMessage(_0x5c094b,_0x33ada6)){saveChat();return;}}saveChatDebounced();}export function addRow(_0x580950){const _0xc24c1e=_0x5cf5ff;if(!currentTablesState||!currentTablesState[_0x580950])return;const _0x5cbf4d=currentTablesState[_0x580950],_0x4b7789=_0x5cbf4d[_0xc24c1e(0x29f)][_0xc24c1e(0x2ac)],_0xc142b7=Array(_0x4b7789)[_0xc24c1e(0x2d8)]('');_0x5cbf4d[_0xc24c1e(0x1f1)][_0xc24c1e(0x220)](_0xc142b7);if(!_0x5cbf4d[_0xc24c1e(0x226)])_0x5cbf4d['rowStatuses']=Array(_0x5cbf4d[_0xc24c1e(0x1f1)][_0xc24c1e(0x2ac)])[_0xc24c1e(0x2d8)]('normal');_0x5cbf4d[_0xc24c1e(0x226)][_0xc24c1e(0x220)]('normal'),updatedTables[_0xc24c1e(0x249)](_0x580950);const _0x5887dd='表格\x20['+_0x5cbf4d[_0xc24c1e(0x22f)]+_0xc24c1e(0x2b6);log(_0x5887dd,_0xc24c1e(0x230));const _0x4f37d9=getContext();if(_0x4f37d9[_0xc24c1e(0x25d)]&&_0x4f37d9[_0xc24c1e(0x25d)]['length']>0x0){const _0x2e1dc2=_0x4f37d9['chat'][_0x4f37d9[_0xc24c1e(0x25d)][_0xc24c1e(0x2ac)]-0x1];if(saveStateToMessage(currentTablesState,_0x2e1dc2)){saveChat();return;}}saveChatDebounced();}export function addColumn(_0x23ac72){const _0x4eedb8=_0x5cf5ff;if(!currentTablesState||!currentTablesState[_0x23ac72])return;const _0x242c25=currentTablesState[_0x23ac72],_0x3c975a=_0x4eedb8(0x231)+(_0x242c25[_0x4eedb8(0x29f)][_0x4eedb8(0x2ac)]+0x1);_0x242c25['headers'][_0x4eedb8(0x220)](_0x3c975a),_0x242c25[_0x4eedb8(0x1f1)][_0x4eedb8(0x1fe)](_0x3c41d9=>_0x3c41d9[_0x4eedb8(0x220)](''));if(!_0x242c25[_0x4eedb8(0x287)])_0x242c25[_0x4eedb8(0x287)]=[];_0x242c25[_0x4eedb8(0x287)][_0x4eedb8(0x220)](null);const _0x14acaa=_0x4eedb8(0x2a2)+_0x242c25[_0x4eedb8(0x22f)]+_0x4eedb8(0x2a8);log(_0x14acaa,'info');const _0xa7916=getContext();if(_0xa7916[_0x4eedb8(0x25d)]&&_0xa7916['chat']['length']>0x0){const _0x164454=_0xa7916[_0x4eedb8(0x25d)][_0xa7916[_0x4eedb8(0x25d)][_0x4eedb8(0x2ac)]-0x1];if(saveStateToMessage(currentTablesState,_0x164454)){saveChat();return;}}saveChatDebounced();}export function updateHeader(_0x43b31d,_0x39914e,_0x493fe5){const _0x20f60f=_0x5cf5ff;if(!currentTablesState||!currentTablesState[_0x43b31d]||currentTablesState[_0x43b31d][_0x20f60f(0x29f)][_0x39914e]===undefined)return;const _0x4fc9ff=currentTablesState[_0x43b31d][_0x20f60f(0x22f)],_0x4f74f9=currentTablesState[_0x43b31d][_0x20f60f(0x29f)][_0x39914e];currentTablesState[_0x43b31d][_0x20f60f(0x29f)][_0x39914e]=_0x493fe5;const _0x46af9f='表格\x20['+_0x4fc9ff+']\x20的表头“'+_0x4f74f9+_0x20f60f(0x28d)+_0x493fe5+'”。';log(_0x46af9f,_0x20f60f(0x230));const _0x312619=getContext();if(_0x312619[_0x20f60f(0x25d)]&&_0x312619['chat'][_0x20f60f(0x2ac)]>0x0){const _0x36a4c6=_0x312619['chat'][_0x312619['chat']['length']-0x1];if(saveStateToMessage(currentTablesState,_0x36a4c6)){saveChat();return;}}saveChatDebounced();}export async function deleteRow(_0x3410bd,_0x17ed90){const _0x4c194c=_0x5cf5ff,_0x3115c2=currentTablesState?.[_0x3410bd];if(!_0x3115c2||!_0x3115c2[_0x4c194c(0x1f1)][_0x17ed90])return;!_0x3115c2['rowStatuses']&&(_0x3115c2[_0x4c194c(0x226)]=Array(_0x3115c2['rows'][_0x4c194c(0x2ac)])[_0x4c194c(0x2d8)](_0x4c194c(0x210)));_0x3115c2[_0x4c194c(0x226)][_0x17ed90]=_0x4c194c(0x20c),updatedTables['add'](_0x3410bd);const _0x39aef0='表格\x20['+_0x3115c2[_0x4c194c(0x22f)]+']\x20的第\x20'+(_0x17ed90+0x1)+_0x4c194c(0x247);log(_0x39aef0,_0x4c194c(0x230));const _0xa4a1b8=getContext();if(_0xa4a1b8['chat']?.[_0x4c194c(0x2ac)]>0x0){const _0x21a04c=_0xa4a1b8[_0x4c194c(0x25d)][_0xa4a1b8[_0x4c194c(0x25d)][_0x4c194c(0x2ac)]-0x1];if(saveStateToMessage(currentTablesState,_0x21a04c)){await saveChat(),renderTables();return;}}await saveChatDebounced(),renderTables();}export async function restoreRow(_0x47866a,_0x294ccd){const _0x54cd13=_0x5cf5ff,_0x337c1c=currentTablesState?.[_0x47866a];if(!_0x337c1c||!_0x337c1c[_0x54cd13(0x1f1)][_0x294ccd]||!_0x337c1c['rowStatuses'])return;_0x337c1c[_0x54cd13(0x226)][_0x294ccd]=_0x54cd13(0x210),updatedTables[_0x54cd13(0x249)](_0x47866a);const _0x549fa4=_0x54cd13(0x2a2)+_0x337c1c['name']+']\x20的第\x20'+(_0x294ccd+0x1)+_0x54cd13(0x221);log(_0x549fa4,_0x54cd13(0x230));const _0x2e6d96=getContext();if(_0x2e6d96['chat']?.[_0x54cd13(0x2ac)]>0x0){const _0x489e79=_0x2e6d96['chat'][_0x2e6d96[_0x54cd13(0x25d)]['length']-0x1];if(saveStateToMessage(currentTablesState,_0x489e79)){await saveChat(),renderTables();return;}}await saveChatDebounced(),renderTables();}export function commitPendingDeletions(){const _0x5385fb=_0x5cf5ff;if(!currentTablesState)return![];let _0x12a0a8=0x0;currentTablesState['forEach']((_0x44e24c,_0x3405f7)=>{const _0x2193cf=_0x8bba;if(!_0x44e24c[_0x2193cf(0x226)]||_0x44e24c[_0x2193cf(0x226)][_0x2193cf(0x2ac)]===0x0)return;let _0x38e493=![];for(let _0xc66ef6=_0x44e24c[_0x2193cf(0x1f1)]['length']-0x1;_0xc66ef6>=0x0;_0xc66ef6--){_0x44e24c[_0x2193cf(0x226)][_0xc66ef6]===_0x2193cf(0x20c)&&(_0x44e24c['rows'][_0x2193cf(0x21f)](_0xc66ef6,0x1),_0x44e24c[_0x2193cf(0x226)][_0x2193cf(0x21f)](_0xc66ef6,0x1),_0x12a0a8++,_0x38e493=!![]);}_0x38e493&&updatedTables['add'](_0x3405f7);});if(_0x12a0a8>0x0)return log(_0x5385fb(0x281)+_0x12a0a8+_0x5385fb(0x214),'info'),!![];return![];}export function insertColumn(_0x1be27c,_0x40dfd3,_0xa1a59){const _0x5f5af7=_0x5cf5ff;if(!currentTablesState||!currentTablesState[_0x1be27c])return;const _0x1f7c85=currentTablesState[_0x1be27c],_0x3bcffb=_0xa1a59==='left'?_0x40dfd3:_0x40dfd3+0x1,_0x2b69dc='新列';_0x1f7c85[_0x5f5af7(0x29f)][_0x5f5af7(0x21f)](_0x3bcffb,0x0,_0x2b69dc),_0x1f7c85[_0x5f5af7(0x1f1)]['forEach'](_0x11a114=>_0x11a114[_0x5f5af7(0x21f)](_0x3bcffb,0x0,''));if(!_0x1f7c85[_0x5f5af7(0x287)])_0x1f7c85[_0x5f5af7(0x287)]=[];_0x1f7c85[_0x5f5af7(0x287)]['splice'](_0x3bcffb,0x0,null);const _0xb5cb6e='表格\x20['+_0x1f7c85[_0x5f5af7(0x22f)]+_0x5f5af7(0x2b9)+(_0x40dfd3+0x1)+'\x20列的'+(_0xa1a59===_0x5f5af7(0x1eb)?'左侧':'右侧')+_0x5f5af7(0x20b);log(_0xb5cb6e,_0x5f5af7(0x230));const _0x6a724d=getContext();if(_0x6a724d[_0x5f5af7(0x25d)]&&_0x6a724d['chat'][_0x5f5af7(0x2ac)]>0x0){const _0x4ddd86=_0x6a724d[_0x5f5af7(0x25d)][_0x6a724d['chat'][_0x5f5af7(0x2ac)]-0x1];if(saveStateToMessage(currentTablesState,_0x4ddd86)){saveChat();return;}}saveChatDebounced();}export function moveColumn(_0x79cc16,_0x1a188a,_0x15df15){const _0x400297=_0x5cf5ff;if(!currentTablesState||!currentTablesState[_0x79cc16])return;const _0x35e514=currentTablesState[_0x79cc16],_0x55355e=_0x35e514[_0x400297(0x29f)],_0x1ab8f0=_0x35e514[_0x400297(0x1f1)],_0x595228=_0x15df15==='left'?_0x1a188a-0x1:_0x1a188a+0x1;if(_0x595228<0x0||_0x595228>=_0x55355e['length']){log('无法移动列:索引\x20'+_0x1a188a+_0x400297(0x1e2),_0x400297(0x2d9));return;}const [_0x4a5148]=_0x55355e[_0x400297(0x21f)](_0x1a188a,0x1);_0x55355e['splice'](_0x595228,0x0,_0x4a5148),_0x1ab8f0[_0x400297(0x1fe)](_0x4e6fbd=>{const _0x425a2f=_0x400297,[_0xa4239d]=_0x4e6fbd[_0x425a2f(0x21f)](_0x1a188a,0x1);_0x4e6fbd['splice'](_0x595228,0x0,_0xa4239d);});if(_0x35e514[_0x400297(0x287)]&&_0x35e514[_0x400297(0x287)]['length']>_0x1a188a){const [_0xfd4a6b]=_0x35e514['columnWidths'][_0x400297(0x21f)](_0x1a188a,0x1);_0x35e514[_0x400297(0x287)][_0x400297(0x21f)](_0x595228,0x0,_0xfd4a6b);}const _0x3d4292=_0x400297(0x2a2)+_0x35e514['name']+']\x20的列“'+_0x4a5148+_0x400297(0x2a0)+(_0x15df15===_0x400297(0x1eb)?'左':'右')+_0x400297(0x289);log(_0x3d4292,'info');const _0x30d2ba=getContext();if(_0x30d2ba[_0x400297(0x25d)]&&_0x30d2ba[_0x400297(0x25d)][_0x400297(0x2ac)]>0x0){const _0x255ea4=_0x30d2ba[_0x400297(0x25d)][_0x30d2ba[_0x400297(0x25d)][_0x400297(0x2ac)]-0x1];if(saveStateToMessage(currentTablesState,_0x255ea4)){saveChat();return;}}saveChatDebounced();}export function deleteTable(_0x735e57){const _0xe42acf=_0x5cf5ff;if(!currentTablesState||!currentTablesState[_0x735e57])return;const _0x213081=currentTablesState[_0x735e57][_0xe42acf(0x22f)];currentTablesState[_0xe42acf(0x21f)](_0x735e57,0x1);const _0x3da7ce=_0xe42acf(0x2a2)+_0x213081+_0xe42acf(0x299);log(_0x3da7ce,_0xe42acf(0x2db));const _0x2359e1=getContext();if(_0x2359e1[_0xe42acf(0x25d)]&&_0x2359e1[_0xe42acf(0x25d)][_0xe42acf(0x2ac)]>0x0){const _0x5b0409=_0x2359e1[_0xe42acf(0x25d)][_0x2359e1[_0xe42acf(0x25d)][_0xe42acf(0x2ac)]-0x1];if(saveStateToMessage(currentTablesState,_0x5b0409)){saveChat(),log(_0xe42acf(0x1db),'success');return;}}log('无法找到可锚定的消息或保存失败,删除操作可能不会被持久化!',_0xe42acf(0x1df)),saveChatDebounced();}export function addTable(_0x571cd2){const _0x4fc2d7=_0x5cf5ff;if(!_0x571cd2||!_0x571cd2[_0x4fc2d7(0x257)]()){log('无法创建表格:名称不能为空。',_0x4fc2d7(0x1df)),toastr[_0x4fc2d7(0x1df)](_0x4fc2d7(0x274),_0x4fc2d7(0x216));return;}!currentTablesState&&loadTables();if(currentTablesState[_0x4fc2d7(0x1e3)](_0x11e6ff=>_0x11e6ff[_0x4fc2d7(0x22f)]===_0x571cd2['trim']())){log('无法创建表格:名为\x20\x22'+_0x571cd2+'\x22\x20的表格已存在。',_0x4fc2d7(0x1df)),toastr[_0x4fc2d7(0x1df)]('名为\x20\x22'+_0x571cd2+'\x22\x20的表格已存在。',_0x4fc2d7(0x216));return;}const _0x60604d={'name':_0x571cd2['trim'](),'headers':['新列\x201'],'rows':[],'rowStatuses':[],'columnWidths':[],'note':_0x4fc2d7(0x2c1),'rule_add':'允许','rule_delete':'允许','rule_update':'允许','charLimitRules':{},'rowLimitRule':0x0};currentTablesState[_0x4fc2d7(0x220)](_0x60604d);const _0x19f2c8='已成功创建新表格:['+_0x571cd2['trim']()+']。';log(_0x19f2c8,'success');const _0x22cf51=getContext();if(_0x22cf51[_0x4fc2d7(0x25d)]&&_0x22cf51['chat'][_0x4fc2d7(0x2ac)]>0x0){const _0x20b0b5=_0x22cf51[_0x4fc2d7(0x25d)][_0x22cf51['chat'][_0x4fc2d7(0x2ac)]-0x1];if(saveStateToMessage(currentTablesState,_0x20b0b5)){saveChat(),log(_0x4fc2d7(0x253),_0x4fc2d7(0x2db));return;}}log(_0x4fc2d7(0x227),_0x4fc2d7(0x1df)),saveChatDebounced();}export function renameTable(_0xd17636,_0x4a7b7f){const _0x2614c2=_0x5cf5ff;if(!currentTablesState||!currentTablesState[_0xd17636]){log('重命名失败:表格不存在。',_0x2614c2(0x1df)),toastr[_0x2614c2(0x1df)](_0x2614c2(0x297),'重命名失败');return;}const _0x27c58c=_0x4a7b7f[_0x2614c2(0x257)]();if(!_0x27c58c){log(_0x2614c2(0x279),_0x2614c2(0x1df)),toastr[_0x2614c2(0x1df)](_0x2614c2(0x274),_0x2614c2(0x2c6));return;}if(currentTablesState[_0x2614c2(0x1e3)]((_0x2addb3,_0x107806)=>_0x107806!==_0xd17636&&_0x2addb3[_0x2614c2(0x22f)]===_0x27c58c)){log('重命名失败:名为\x20\x22'+_0x27c58c+_0x2614c2(0x24e),_0x2614c2(0x1df)),toastr[_0x2614c2(0x1df)](_0x2614c2(0x240)+_0x27c58c+_0x2614c2(0x24e),'重命名失败');return;}const _0x3b811a=currentTablesState[_0xd17636][_0x2614c2(0x22f)];currentTablesState[_0xd17636]['name']=_0x27c58c,log(_0x2614c2(0x2cd)+_0x3b811a+_0x2614c2(0x2d2)+_0x27c58c+'\x22。','success');const _0x1f8d69=getContext();if(_0x1f8d69[_0x2614c2(0x25d)]&&_0x1f8d69['chat']['length']>0x0){const _0x3e8a75=_0x1f8d69[_0x2614c2(0x25d)][_0x1f8d69[_0x2614c2(0x25d)][_0x2614c2(0x2ac)]-0x1];if(saveStateToMessage(currentTablesState,_0x3e8a75)){saveChat();return;}}saveChatDebounced();}export function moveTable(_0x451a60,_0x3c2f0c){const _0x2ce06c=_0x5cf5ff;if(!currentTablesState||!currentTablesState[_0x451a60])return;const _0x147d68=_0x3c2f0c==='up'?_0x451a60-0x1:_0x451a60+0x1;if(_0x147d68<0x0||_0x147d68>=currentTablesState[_0x2ce06c(0x2ac)]){log(_0x2ce06c(0x260)+_0x451a60+_0x2ce06c(0x1e2),_0x2ce06c(0x2d9));return;}const _0x354400=currentTablesState[_0x451a60];currentTablesState[_0x451a60]=currentTablesState[_0x147d68],currentTablesState[_0x147d68]=_0x354400;const _0x5f174b=_0x2ce06c(0x2a2)+_0x354400[_0x2ce06c(0x22f)]+_0x2ce06c(0x25b);log(_0x5f174b,_0x2ce06c(0x2db));const _0x34e3ea=getContext();if(_0x34e3ea['chat']&&_0x34e3ea[_0x2ce06c(0x25d)]['length']>0x0){const _0x36fdfc=_0x34e3ea[_0x2ce06c(0x25d)][_0x34e3ea['chat'][_0x2ce06c(0x2ac)]-0x1];if(saveStateToMessage(currentTablesState,_0x36fdfc)){saveChat(),log(_0x2ce06c(0x2d6),_0x2ce06c(0x2db));return;}}log(_0x2ce06c(0x2bc),_0x2ce06c(0x1df)),saveChatDebounced();}export function updateTableRules(_0x24cdb2,_0x4ab488){const _0xb8d2e5=_0x5cf5ff;if(!currentTablesState||!currentTablesState[_0x24cdb2])return;const _0x19b3ca=currentTablesState[_0x24cdb2];_0x19b3ca[_0xb8d2e5(0x24d)]=_0x4ab488[_0xb8d2e5(0x24d)],_0x19b3ca[_0xb8d2e5(0x294)]=_0x4ab488['rule_add'],_0x19b3ca[_0xb8d2e5(0x1f3)]=_0x4ab488[_0xb8d2e5(0x1f3)],_0x19b3ca[_0xb8d2e5(0x255)]=_0x4ab488[_0xb8d2e5(0x255)],_0x19b3ca[_0xb8d2e5(0x2c8)]=_0x4ab488['charLimitRules'],_0x19b3ca[_0xb8d2e5(0x219)]=_0x4ab488[_0xb8d2e5(0x219)],delete _0x19b3ca[_0xb8d2e5(0x28b)];const _0x414c1b='表格\x20['+_0x19b3ca[_0xb8d2e5(0x22f)]+_0xb8d2e5(0x25e);log(_0x414c1b,_0xb8d2e5(0x230));const _0x56c8e=getContext();if(_0x56c8e[_0xb8d2e5(0x25d)]&&_0x56c8e[_0xb8d2e5(0x25d)][_0xb8d2e5(0x2ac)]>0x0){const _0x212d86=_0x56c8e[_0xb8d2e5(0x25d)][_0x56c8e['chat']['length']-0x1];if(saveStateToMessage(currentTablesState,_0x212d86)){saveChat();return;}}saveChatDebounced();}export function updateRow(_0x3381ae,_0x374e61,_0x37c172){const _0x4340a4=_0x5cf5ff;if(!currentTablesState||!currentTablesState[_0x3381ae]){log(_0x4340a4(0x21b)+_0x3381ae+_0x4340a4(0x29c),_0x4340a4(0x1df));return;}const _0x1e88f6=currentTablesState[_0x3381ae];if(_0x374e61>=_0x1e88f6[_0x4340a4(0x1f1)][_0x4340a4(0x2ac)]){log(_0x4340a4(0x206)+_0x374e61+'),已智能转换为在表格\x20['+_0x1e88f6[_0x4340a4(0x22f)]+_0x4340a4(0x284),'warn'),insertRow(_0x3381ae,_0x37c172);return;}const _0x327a7f=_0x1e88f6[_0x4340a4(0x1f1)][_0x374e61];for(const _0x1ebff4 in _0x37c172){const _0x4f0c9e=parseInt(_0x1ebff4,0xa);_0x4f0c9e<_0x327a7f[_0x4340a4(0x2ac)]&&(_0x327a7f[_0x4f0c9e]=_0x37c172[_0x4f0c9e],addHighlight(_0x3381ae,_0x374e61,_0x4f0c9e));}updatedTables[_0x4340a4(0x249)](_0x3381ae);const _0x54059f=_0x4340a4(0x27e)+_0x1e88f6[_0x4340a4(0x22f)]+_0x4340a4(0x1ff)+(_0x374e61+0x1)+_0x4340a4(0x214);log(_0x54059f,'info');const _0x15f758=getContext();if(_0x15f758[_0x4340a4(0x25d)]&&_0x15f758['chat']['length']>0x0){const _0x158f4e=_0x15f758[_0x4340a4(0x25d)][_0x15f758['chat'][_0x4340a4(0x2ac)]-0x1];if(saveStateToMessage(currentTablesState,_0x158f4e)){saveChat();return;}}saveChatDebounced();}export function clearAllTables(){const _0x29e187=_0x5cf5ff;if(!currentTablesState){log('无法清空:当前表格状态为空。',_0x29e187(0x1df));return;}currentTablesState['forEach']((_0x5bd7c7,_0x1ad3c8)=>{const _0x1738c2=_0x29e187;_0x5bd7c7[_0x1738c2(0x1f1)][_0x1738c2(0x2ac)]>0x0&&updatedTables[_0x1738c2(0x249)](_0x1ad3c8),_0x5bd7c7[_0x1738c2(0x1f1)]=[],_0x5bd7c7[_0x1738c2(0x226)]=[];}),log(_0x29e187(0x1da),_0x29e187(0x2d9));const _0x5b5a1a=getContext();if(_0x5b5a1a[_0x29e187(0x25d)]&&_0x5b5a1a[_0x29e187(0x25d)][_0x29e187(0x2ac)]>0x0){const _0x30c38c=_0x5b5a1a[_0x29e187(0x25d)][_0x5b5a1a[_0x29e187(0x25d)][_0x29e187(0x2ac)]-0x1];if(saveStateToMessage(currentTablesState,_0x30c38c)){saveChat(),log(_0x29e187(0x2b0),_0x29e187(0x2db)),toastr['success'](_0x29e187(0x26a),_0x29e187(0x26c));return;}}log(_0x29e187(0x1f5),_0x29e187(0x1df)),saveChatDebounced();}function checkTableRules(_0x531c5b){const _0x16f95c=_0x5cf5ff;let _0x6168b4=[];_0x531c5b[_0x16f95c(0x219)]&&_0x531c5b[_0x16f95c(0x219)]>0x0&&_0x531c5b['rows']['length']>_0x531c5b['rowLimitRule']&&_0x6168b4['push']('【当前('+_0x531c5b[_0x16f95c(0x22f)]+_0x16f95c(0x27b)+_0x531c5b[_0x16f95c(0x219)]+')行,请结合剧情缩减至('+_0x531c5b[_0x16f95c(0x219)]+_0x16f95c(0x2a4));const _0x2b029b=_0x531c5b[_0x16f95c(0x2c8)]||{};for(const _0x410d1c in _0x2b029b){const _0x2980db=parseInt(_0x410d1c,0xa),_0x957517=_0x2b029b[_0x2980db];if(_0x957517>0x0&&_0x2980db>=0x0&&_0x2980db<_0x531c5b[_0x16f95c(0x29f)][_0x16f95c(0x2ac)]){const _0x43c4a0=_0x531c5b[_0x16f95c(0x29f)][_0x2980db],_0x1466fc=[];_0x531c5b['rows'][_0x16f95c(0x1fe)]((_0x3d352d,_0x357fc5)=>{const _0x51d06f=_0x16f95c;if(_0x531c5b[_0x51d06f(0x226)]&&_0x531c5b['rowStatuses'][_0x357fc5]===_0x51d06f(0x20c))return;const _0x54e00a=_0x3d352d[_0x2980db]||'';_0x54e00a[_0x51d06f(0x2ac)]>_0x957517&&_0x1466fc[_0x51d06f(0x220)](_0x357fc5);});if(_0x1466fc[_0x16f95c(0x2ac)]>0x0){const _0x94c697=_0x1466fc[_0x16f95c(0x1e6)]('、');_0x6168b4[_0x16f95c(0x220)]('【当前('+_0x531c5b[_0x16f95c(0x22f)]+_0x16f95c(0x233)+_0x94c697+_0x16f95c(0x1f9)+_0x43c4a0+_0x16f95c(0x1e4)+_0x957517+')字限制,请进行缩减。】');}}}return _0x6168b4[_0x16f95c(0x1e6)]('\x0a');}export function convertTablesToCsvString(){const _0x343821=_0x5cf5ff;!currentTablesState&&loadTables();if(!currentTablesState)return'';let _0x993d17='';return currentTablesState[_0x343821(0x1fe)]((_0x439f41,_0x2d3dfe)=>{const _0x23413a=_0x343821;_0x993d17+=_0x23413a(0x2b2)+_0x2d3dfe+':'+_0x439f41[_0x23413a(0x22f)]+'\x0a',_0x993d17+=_0x23413a(0x2a1)+(_0x439f41[_0x23413a(0x24d)]||'无')+'\x0a';const _0x5b6851=_0x439f41[_0x23413a(0x22f)][_0x23413a(0x2bd)](/\s/g,'')+'内容';_0x993d17+='<'+_0x5b6851+'>\x0a';const _0x4202a3=_0x439f41[_0x23413a(0x29f)][_0x23413a(0x277)]((_0x413b38,_0x2d5295)=>_0x2d5295+':'+_0x413b38)[_0x23413a(0x1e6)](',');_0x993d17+=_0x23413a(0x272)+_0x4202a3+'\x0a';_0x439f41[_0x23413a(0x1f1)][_0x23413a(0x2ac)]===0x0||_0x439f41[_0x23413a(0x1f1)]['every']((_0x330072,_0x230b06)=>_0x439f41[_0x23413a(0x226)]&&_0x439f41[_0x23413a(0x226)][_0x230b06]===_0x23413a(0x20c))?_0x993d17+='(该表当前内容为空)\x0a':_0x439f41[_0x23413a(0x1f1)]['forEach']((_0x1a764e,_0x46527a)=>{const _0xe0ba17=_0x23413a;if(_0x439f41[_0xe0ba17(0x226)]&&_0x439f41[_0xe0ba17(0x226)][_0x46527a]===_0xe0ba17(0x20c))return;if(Array[_0xe0ba17(0x2d4)](_0x1a764e)){const _0x220f1a=_0x1a764e[_0xe0ba17(0x277)](_0x4f26c9=>{const _0x27a30d=_0xe0ba17;return _0x4f26c9===null||_0x4f26c9===undefined||_0x4f26c9===''?'未知':_0x4f26c9[_0x27a30d(0x298)]();})[_0xe0ba17(0x1e6)](',');_0x993d17+=_0x46527a+','+_0x220f1a+'\x0a';}});const _0x36ef0c=checkTableRules(_0x439f41);_0x36ef0c&&(_0x993d17+=_0x36ef0c+'\x0a'),_0x993d17+='\x0a',_0x993d17+='【增加】:\x20'+(_0x439f41[_0x23413a(0x294)]||'允许')+'\x0a',_0x993d17+=_0x23413a(0x22e)+(_0x439f41[_0x23413a(0x1f3)]||'允许')+'\x0a',_0x993d17+=_0x23413a(0x276)+(_0x439f41['rule_update']||'允许')+'\x0a',_0x2d3dfe{const _0x491a98=_0x154035;_0x358dd8+='\x0a<'+_0x3e21f5['name']+'>\x0a';const _0x3cef70='|\x20'+_0x3e21f5['headers'][_0x491a98(0x1e6)]('\x20|\x20')+'\x20|';_0x358dd8+=_0x3cef70+'\x0a';const _0x1d3a93='|'+_0x3e21f5[_0x491a98(0x29f)][_0x491a98(0x277)](()=>'---')[_0x491a98(0x1e6)]('|')+'|';_0x358dd8+=_0x1d3a93+'\x0a';const _0x422860=_0x3e21f5['rows']['filter']((_0x2f7eb5,_0x253c15)=>!_0x3e21f5[_0x491a98(0x226)]||_0x3e21f5[_0x491a98(0x226)][_0x253c15]!==_0x491a98(0x20c));_0x422860[_0x491a98(0x2ac)]>0x0?_0x422860['forEach'](_0x5a3af3=>{const _0x338b78=_0x491a98;if(Array[_0x338b78(0x2d4)](_0x5a3af3)){const _0xdfbcc2=_0x5a3af3[_0x338b78(0x277)](_0x18e7bd=>_0x18e7bd===null||_0x18e7bd===undefined||_0x18e7bd===''?'\x20':_0x18e7bd[_0x338b78(0x298)]()),_0x32e495='|\x20'+_0xdfbcc2[_0x338b78(0x1e6)]('\x20|\x20')+'\x20|';_0x358dd8+=_0x32e495+'\x0a';}}):_0x358dd8+=_0x491a98(0x282),_0x358dd8+='\x0a';}),_0x358dd8[_0x154035(0x257)]();}loadTables();export function getBatchFillerRuleTemplate(){const _0x218b42=_0x5cf5ff;return extension_settings[extensionName]?.[_0x218b42(0x2dd)]??DEFAULT_AI_RULE_TEMPLATE;}export function saveBatchFillerRuleTemplate(_0xf75747){extension_settings[extensionName]['batch_filler_rule_template']=_0xf75747,saveSettingsDebounced();}export function getBatchFillerFlowTemplate(){const _0x1be54c=_0x5cf5ff;return extension_settings[extensionName]?.[_0x1be54c(0x24f)]??DEFAULT_AI_FLOW_TEMPLATE;}export function saveBatchFillerFlowTemplate(_0x510d77){const _0x3bfa83=_0x5cf5ff;extension_settings[extensionName][_0x3bfa83(0x24f)]=_0x510d77,saveSettingsDebounced();}export function getAiFlowTemplateForInjection(){const _0x49edc3=_0x5cf5ff;return extension_settings[extensionName]?.[_0x49edc3(0x265)]??DEFAULT_AI_FLOW_TEMPLATE;}export async function updateTableFromText(_0x50ca49){const _0x57320c=_0x5cf5ff;if(!_0x50ca49){log(_0x57320c(0x1ed),_0x57320c(0x2d9));return;}const _0x1790ea=_0x50ca49[_0x57320c(0x1f4)](/([\s\S]*?)<\/Amily2Edit>/);if(!_0x1790ea||!_0x1790ea[0x1]){log(_0x57320c(0x1e7),_0x57320c(0x2d9));return;}let _0x2ccf84=_0x1790ea[0x1][_0x57320c(0x2bd)](//g,'')[_0x57320c(0x257)]();if(!_0x2ccf84){log(_0x57320c(0x241),_0x57320c(0x230));return;}const _0xe68068=_0x2ccf84[_0x57320c(0x2c3)]('\x0a')[_0x57320c(0x2dc)](_0xe99f71=>_0xe99f71['trim']()!=='');log(_0x57320c(0x1ef)+_0xe68068[_0x57320c(0x2ac)]+_0x57320c(0x271),_0x57320c(0x230));const _0x29eaac={'insertRow':(_0x5411de,_0x2b8f1b)=>{const _0x1ec01c=_0x57320c;log(_0x1ec01c(0x23b)+_0x5411de+_0x1ec01c(0x26d)+JSON[_0x1ec01c(0x290)](_0x2b8f1b)+')',_0x1ec01c(0x230)),insertRow(_0x5411de,_0x2b8f1b);},'deleteRow':(_0xdcf451,_0x313e0a)=>{const _0x26435e=_0x57320c;log(_0x26435e(0x2e1)+_0xdcf451+_0x26435e(0x27a)+_0x313e0a+')',_0x26435e(0x230)),deleteRow(_0xdcf451,_0x313e0a);},'updateRow':(_0x1f1ab4,_0xf5032d,_0x23bf40)=>{const _0x1d9810=_0x57320c;log(_0x1d9810(0x2ba)+_0x1f1ab4+',\x20rowIndex='+_0xf5032d+',\x20data='+JSON[_0x1d9810(0x290)](_0x23bf40)+')',_0x1d9810(0x230)),updateRow(_0x1f1ab4,_0xf5032d,_0x23bf40);}};try{const _0xd97c67=Object[_0x57320c(0x291)](async function(){})[_0x57320c(0x21e)],_0xbbf377=new _0xd97c67(_0x57320c(0x207),'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20const\x20{\x20insertRow,\x20deleteRow,\x20updateRow\x20}\x20=\x20runner;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+_0x2ccf84+_0x57320c(0x213));await _0xbbf377(_0x29eaac),log(_0x57320c(0x2a6),_0x57320c(0x2db)),toastr['success']('已根据AI的指示成功更新表格!','填表完成'),document[_0x57320c(0x244)](new CustomEvent('amily2-force-ui-reload'));}catch(_0xb0675d){log(_0x57320c(0x283)+_0xb0675d[_0x57320c(0x232)],_0x57320c(0x1df)),toastr[_0x57320c(0x1df)](_0x57320c(0x2c5)+_0xb0675d[_0x57320c(0x232)],_0x57320c(0x26e));}}export function saveAiTemplate(_0x1e8526){extension_settings[extensionName]['amily2_ai_template']=_0x1e8526,saveSettingsDebounced();}export function getAiTemplate(){return getAiFlowTemplateForInjection();}function exportPresetBase(_0x5e1829=![]){const _0x590252=_0x5cf5ff;if(!currentTablesState){log(_0x590252(0x2b4),'error'),toastr[_0x590252(0x1df)](_0x590252(0x2a5));return;}let _0x963da7,_0x2948f7,_0x217d44;_0x5e1829?(_0x963da7=JSON['parse'](JSON[_0x590252(0x290)](currentTablesState)),_0x2948f7=_0x590252(0x27c),_0x217d44=_0x590252(0x254)):(_0x963da7=currentTablesState[_0x590252(0x277)](_0x5eb455=>({'name':_0x5eb455['name'],'headers':_0x5eb455[_0x590252(0x29f)],'columnWidths':_0x5eb455[_0x590252(0x287)]||[],'note':_0x5eb455['note'],'rule_add':_0x5eb455[_0x590252(0x294)],'rule_delete':_0x5eb455[_0x590252(0x1f3)],'rule_update':_0x5eb455[_0x590252(0x255)],'charLimitRules':_0x5eb455['charLimitRules']||{},'rowLimitRule':_0x5eb455[_0x590252(0x219)]||0x0,'rows':[],'rowStatuses':[]})),_0x2948f7=_0x590252(0x28c),_0x217d44=_0x590252(0x23c));const _0x3ac02a={'version':_0x590252(0x21a),'batchFillerRuleTemplate':getBatchFillerRuleTemplate(),'batchFillerFlowTemplate':getBatchFillerFlowTemplate(),'tables':_0x963da7},_0x351af9=new Blob([JSON[_0x590252(0x290)](_0x3ac02a,null,0x2)],{'type':_0x590252(0x215)}),_0x334f8a=URL[_0x590252(0x225)](_0x351af9),_0x5965a0=document['createElement']('a');_0x5965a0[_0x590252(0x273)]=_0x334f8a,_0x5965a0[_0x590252(0x1e9)]=_0x590252(0x248)+_0x217d44+'-'+new Date()[_0x590252(0x208)]()[_0x590252(0x22a)](0x0,0xa)+_0x590252(0x1ec),document[_0x590252(0x2b5)][_0x590252(0x237)](_0x5965a0),_0x5965a0['click'](),document[_0x590252(0x2b5)][_0x590252(0x285)](_0x5965a0),URL[_0x590252(0x22d)](_0x334f8a),log('【'+_0x217d44+'】已成功导出。',_0x590252(0x2db)),toastr['success']('【'+_0x217d44+_0x590252(0x228),_0x590252(0x267));}export function exportPreset(){exportPresetBase(![]);}export function exportPresetFull(){exportPresetBase(!![]);}export function importPreset(_0x2f47f4){const _0x491693=_0x5cf5ff,_0x38e956=document[_0x491693(0x245)](_0x491693(0x1f6));_0x38e956[_0x491693(0x25f)]=_0x491693(0x2bf),_0x38e956['accept']=_0x491693(0x1ec),_0x38e956[_0x491693(0x212)]=_0x3193fd=>{const _0x1cee3b=_0x491693,_0x394510=_0x3193fd[_0x1cee3b(0x2a7)]['files'][0x0];if(!_0x394510)return;const _0x429a3d=new FileReader();_0x429a3d[_0x1cee3b(0x2be)]=_0x496a98=>{const _0x4de077=_0x1cee3b;try{const _0x5e1293=JSON[_0x4de077(0x2df)](_0x496a98[_0x4de077(0x2a7)][_0x4de077(0x234)]);if(!_0x5e1293[_0x4de077(0x2cc)]||!Array[_0x4de077(0x2d4)](_0x5e1293['tables']))throw new Error(_0x4de077(0x263));const _0x298f41=window[_0x4de077(0x222)]('【警告】\x0a\x0a导入操作将完全覆盖您当前的AI指令模板和所有表格(包括结构和内容)。\x0a\x0a此操作不可逆,是否确定要继续?');if(!_0x298f41){log('用户取消了导入操作。',_0x4de077(0x230)),toastr[_0x4de077(0x230)](_0x4de077(0x296));return;}if(_0x5e1293[_0x4de077(0x2cc)]==='Amily2-Table-Preset-v3.0-separated_templates')saveBatchFillerRuleTemplate(_0x5e1293[_0x4de077(0x29e)]||''),saveBatchFillerFlowTemplate(_0x5e1293[_0x4de077(0x2cb)]||''),saveAiTemplate(_0x5e1293[_0x4de077(0x239)]||'');else{if(_0x5e1293['aiRuleTemplate']!==undefined&&_0x5e1293[_0x4de077(0x2c2)]!==undefined)saveBatchFillerRuleTemplate(_0x5e1293['aiRuleTemplate']||''),saveBatchFillerFlowTemplate(_0x5e1293[_0x4de077(0x2c2)]||''),saveAiTemplate(_0x5e1293[_0x4de077(0x2c2)]||'');else _0x5e1293[_0x4de077(0x252)]?(saveBatchFillerRuleTemplate(''),saveBatchFillerFlowTemplate(_0x5e1293[_0x4de077(0x252)]||''),saveAiTemplate(_0x5e1293[_0x4de077(0x252)]||'')):log('导入的预设中缺少指令模板字段,模板将不会被更新。',_0x4de077(0x2d9));}const _0x4f4f06=_0x5e1293[_0x4de077(0x1f8)];_0x4f4f06[_0x4de077(0x1fe)](_0x1dadc8=>{const _0x465821=_0x4de077;if(_0x1dadc8[_0x465821(0x22f)]===undefined||_0x1dadc8[_0x465821(0x29f)]===undefined||_0x1dadc8[_0x465821(0x1f1)]===undefined)throw new Error(_0x465821(0x201)+JSON[_0x465821(0x290)](_0x1dadc8));if(_0x1dadc8['note']===undefined)_0x1dadc8[_0x465821(0x24d)]='无';if(_0x1dadc8[_0x465821(0x294)]===undefined)_0x1dadc8[_0x465821(0x294)]='允许';if(_0x1dadc8[_0x465821(0x1f3)]===undefined)_0x1dadc8['rule_delete']='允许';if(_0x1dadc8[_0x465821(0x255)]===undefined)_0x1dadc8[_0x465821(0x255)]='允许';if(_0x1dadc8[_0x465821(0x28b)]&&!_0x1dadc8[_0x465821(0x2c8)])_0x1dadc8[_0x465821(0x2c8)]={},_0x1dadc8['charLimitRule'][_0x465821(0x29b)]!==-0x1&&_0x1dadc8[_0x465821(0x28b)][_0x465821(0x209)]>0x0&&(_0x1dadc8['charLimitRules'][_0x1dadc8['charLimitRule'][_0x465821(0x29b)]]=_0x1dadc8['charLimitRule'][_0x465821(0x209)]);else _0x1dadc8['charLimitRules']===undefined&&(_0x1dadc8[_0x465821(0x2c8)]={});delete _0x1dadc8['charLimitRule'],!_0x1dadc8[_0x465821(0x226)]&&(_0x1dadc8['rowStatuses']=Array(_0x1dadc8[_0x465821(0x1f1)][_0x465821(0x2ac)])[_0x465821(0x2d8)]('normal')),_0x1dadc8[_0x465821(0x219)]===undefined&&(_0x1dadc8[_0x465821(0x219)]=0x0),_0x1dadc8[_0x465821(0x287)]===undefined&&(_0x1dadc8[_0x465821(0x287)]=[]);}),setMemoryState(_0x4f4f06);const _0x3e173e=getContext();if(_0x3e173e[_0x4de077(0x25d)]&&_0x3e173e[_0x4de077(0x25d)][_0x4de077(0x2ac)]>0x0){const _0x2f6919=_0x3e173e[_0x4de077(0x25d)][_0x3e173e[_0x4de077(0x25d)][_0x4de077(0x2ac)]-0x1];saveStateToMessage(getMemoryState(),_0x2f6919)&&(saveChat(),log(_0x4de077(0x1f0),'success'));}else saveChatDebounced();log(_0x4de077(0x24c),_0x4de077(0x2db)),toastr[_0x4de077(0x2db)]('预设已成功导入!',_0x4de077(0x280)),typeof _0x2f47f4===_0x4de077(0x2aa)&&_0x2f47f4();}catch(_0x59cca0){log('导入预设失败:\x20'+_0x59cca0['message'],_0x4de077(0x1df)),toastr[_0x4de077(0x1df)](_0x4de077(0x20d)+_0x59cca0[_0x4de077(0x232)],'错误');}},_0x429a3d[_0x1cee3b(0x236)](_0x394510);},_0x38e956['click']();}function _0x8bba(_0x526c0b,_0x50cdd5){const _0x2ce62b=_0x2ce6();return _0x8bba=function(_0x8bbac3,_0x4d35ba){_0x8bbac3=_0x8bbac3-0x1da;let _0x1360e0=_0x2ce62b[_0x8bbac3];return _0x1360e0;},_0x8bba(_0x526c0b,_0x50cdd5);}export async function rollbackState(){const _0x5496c2=_0x5cf5ff,_0xdae7dd=getContext();if(!_0xdae7dd||!_0xdae7dd[_0x5496c2(0x25d)]||_0xdae7dd[_0x5496c2(0x25d)][_0x5496c2(0x2ac)]<0x2)return log(_0x5496c2(0x292),_0x5496c2(0x2d9)),toastr['warning'](_0x5496c2(0x256)),![];const _0x4946de=_0xdae7dd[_0x5496c2(0x25d)],_0x14c70b=_0x4946de['length']-0x1,_0x1e1fd2=_0x4946de[_0x14c70b];log(_0x5496c2(0x24b)+(_0x14c70b-0x1)+_0x5496c2(0x295),_0x5496c2(0x230));const _0x169bee=loadTables(_0x14c70b);if(!_0x169bee)return log('未能在上一楼找到可用的表格状态,无法回退。',_0x5496c2(0x1df)),toastr[_0x5496c2(0x1df)](_0x5496c2(0x2ad)),![];setMemoryState(_0x169bee);if(saveStateToMessage(_0x169bee,_0x1e1fd2))await saveChat(),log(_0x5496c2(0x2b3),'success');else return log(_0x5496c2(0x1ee),_0x5496c2(0x1df)),toastr[_0x5496c2(0x1df)](_0x5496c2(0x242)),![];return renderTables(),updateOrInsertTableInChat(),log(_0x5496c2(0x2bb),_0x5496c2(0x230)),!![];}export async function rollbackAndRefill(){const _0x156e4c=_0x5cf5ff;toastr[_0x156e4c(0x230)]('正在执行回退并重新填表...');const _0x2ad974=await rollbackState();if(!_0x2ad974){toastr[_0x156e4c(0x1df)]('状态回退失败,已中止操作。');return;}toastr[_0x156e4c(0x2db)](_0x156e4c(0x1dd));const _0x40d147=getContext(),_0x54be8e=_0x40d147['chat'][_0x40d147[_0x156e4c(0x25d)][_0x156e4c(0x2ac)]-0x1];try{await fillWithSecondaryApi(_0x54be8e,!![]),log('回退并重新填表操作完成。',_0x156e4c(0x2db));}catch(_0x4855e4){log(_0x156e4c(0x229)+_0x4855e4['message'],_0x156e4c(0x1df)),toastr[_0x156e4c(0x1df)](_0x156e4c(0x2ce)+_0x4855e4['message']);}}export function updateColumnWidth(_0x5e363a,_0x3a8588,_0x9ddf4e){const _0x3b0670=_0x5cf5ff;if(!currentTablesState||!currentTablesState[_0x5e363a])return;const _0x4038ee=currentTablesState[_0x5e363a];!_0x4038ee[_0x3b0670(0x287)]&&(_0x4038ee['columnWidths']=[]);while(_0x4038ee[_0x3b0670(0x287)]['length']<_0x4038ee['headers'][_0x3b0670(0x2ac)]){_0x4038ee[_0x3b0670(0x287)][_0x3b0670(0x220)](null);}_0x4038ee['columnWidths'][_0x3a8588]=_0x9ddf4e;const _0x2c3de6=getContext();if(_0x2c3de6[_0x3b0670(0x25d)]&&_0x2c3de6[_0x3b0670(0x25d)][_0x3b0670(0x2ac)]>0x0){const _0x2c2dab=_0x2c3de6['chat'][_0x2c3de6['chat']['length']-0x1];if(saveStateToMessage(currentTablesState,_0x2c2dab)){saveChat();return;}}saveChatDebounced();}export function isCurrentTablesEmpty(){const _0x3d48ee=_0x5cf5ff,_0x3b5374=getMemoryState();if(!_0x3b5374||_0x3b5374[_0x3d48ee(0x2ac)]===0x0)return!![];return _0x3b5374[_0x3d48ee(0x1ea)](_0x5494d7=>!_0x5494d7[_0x3d48ee(0x1f1)]||_0x5494d7[_0x3d48ee(0x1f1)][_0x3d48ee(0x2ac)]===0x0);}export function clearGlobalPreset(){const _0x30cd67=_0x5cf5ff;if(extension_settings[extensionName]&&extension_settings[extensionName]['global_table_preset']){const _0x546e77=window[_0x30cd67(0x222)](_0x30cd67(0x264));_0x546e77?(delete extension_settings[extensionName][_0x30cd67(0x27f)],saveSettingsDebounced(),log(_0x30cd67(0x20e),'success'),toastr['success'](_0x30cd67(0x262),_0x30cd67(0x28a))):(log(_0x30cd67(0x202),'info'),toastr[_0x30cd67(0x230)](_0x30cd67(0x21d)));}else log(_0x30cd67(0x20f),_0x30cd67(0x230)),toastr[_0x30cd67(0x230)](_0x30cd67(0x268),'提示');}export function importGlobalPreset(_0x24274c){const _0x3ea7b3=_0x5cf5ff,_0x5c73bb=document['createElement']('input');_0x5c73bb[_0x3ea7b3(0x25f)]='file',_0x5c73bb['accept']=_0x3ea7b3(0x1ec),_0x5c73bb['onchange']=_0x494cea=>{const _0x313fc1=_0x3ea7b3,_0x50f239=_0x494cea[_0x313fc1(0x2a7)][_0x313fc1(0x2b1)][0x0];if(!_0x50f239)return;const _0x4d1998=new FileReader();_0x4d1998[_0x313fc1(0x2be)]=_0x1fcffe=>{const _0x3cb5d3=_0x313fc1;try{const _0x157a3d=JSON[_0x3cb5d3(0x2df)](_0x1fcffe['target']['result']);if(!_0x157a3d['version']||!Array[_0x3cb5d3(0x2d4)](_0x157a3d[_0x3cb5d3(0x1f8)]))throw new Error(_0x3cb5d3(0x263));const _0x4cf22a=window[_0x3cb5d3(0x222)]('【全局预设导入】\x0a\x0a这将把选定的预设设置为所有新聊天的默认表格。\x0a\x0a此操作将覆盖任何已存在的全局预设,是否确定?');if(!_0x4cf22a){log(_0x3cb5d3(0x22b),_0x3cb5d3(0x230)),toastr[_0x3cb5d3(0x230)](_0x3cb5d3(0x21d));return;}const _0x62444f=_0x157a3d[_0x3cb5d3(0x1f8)][_0x3cb5d3(0x277)](_0x54581d=>({'name':_0x54581d[_0x3cb5d3(0x22f)],'headers':_0x54581d[_0x3cb5d3(0x29f)],'note':_0x54581d['note'],'rule_add':_0x54581d[_0x3cb5d3(0x294)],'rule_delete':_0x54581d[_0x3cb5d3(0x1f3)],'rule_update':_0x54581d[_0x3cb5d3(0x255)],'rows':[]}));!extension_settings[extensionName]&&(extension_settings[extensionName]={});extension_settings[extensionName]['global_table_preset']={'version':_0x157a3d[_0x3cb5d3(0x2cc)],'tables':_0x62444f,'batchFillerRuleTemplate':_0x157a3d[_0x3cb5d3(0x29e)],'batchFillerFlowTemplate':_0x157a3d[_0x3cb5d3(0x2cb)]},saveSettingsDebounced();if(_0x157a3d[_0x3cb5d3(0x2cc)]===_0x3cb5d3(0x21a))saveBatchFillerRuleTemplate(_0x157a3d[_0x3cb5d3(0x29e)]||''),saveBatchFillerFlowTemplate(_0x157a3d[_0x3cb5d3(0x2cb)]||''),saveAiTemplate(_0x157a3d['injectionFlowTemplate']||'');else{if(_0x157a3d[_0x3cb5d3(0x1f2)]!==undefined&&_0x157a3d['aiFlowTemplate']!==undefined)saveBatchFillerRuleTemplate(_0x157a3d[_0x3cb5d3(0x1f2)]||''),saveBatchFillerFlowTemplate(_0x157a3d[_0x3cb5d3(0x2c2)]||''),saveAiTemplate(_0x157a3d['aiFlowTemplate']||'');else _0x157a3d[_0x3cb5d3(0x252)]&&(saveBatchFillerRuleTemplate(''),saveBatchFillerFlowTemplate(_0x157a3d['aiTemplate']||''),saveAiTemplate(_0x157a3d['aiTemplate']||''));}log(_0x3cb5d3(0x23e),'success'),toastr[_0x3cb5d3(0x2db)]('全局预设已设置!新聊天将默认使用此预设。','设置成功'),typeof _0x24274c===_0x3cb5d3(0x2aa)&&_0x24274c();}catch(_0x65996a){log('导入全局预设失败:\x20'+_0x65996a[_0x3cb5d3(0x232)],_0x3cb5d3(0x1df)),toastr[_0x3cb5d3(0x1df)]('导入失败:'+_0x65996a[_0x3cb5d3(0x232)],'错误');}},_0x4d1998[_0x313fc1(0x236)](_0x50f239);},_0x5c73bb[_0x3ea7b3(0x258)]();} +const _0x16a5d7=_0x1220;(function(_0x14696e,_0x27dc8a){const _0xc5a7e0=_0x1220,_0x37402b=_0x14696e();while(!![]){try{const _0x15ccb0=-parseInt(_0xc5a7e0(0x1a9))/0x1+parseInt(_0xc5a7e0(0x1a8))/0x2*(parseInt(_0xc5a7e0(0x286))/0x3)+parseInt(_0xc5a7e0(0x1fc))/0x4*(-parseInt(_0xc5a7e0(0x1ca))/0x5)+parseInt(_0xc5a7e0(0x288))/0x6*(-parseInt(_0xc5a7e0(0x1c1))/0x7)+parseInt(_0xc5a7e0(0x20a))/0x8*(-parseInt(_0xc5a7e0(0x275))/0x9)+-parseInt(_0xc5a7e0(0x198))/0xa*(parseInt(_0xc5a7e0(0x1b3))/0xb)+-parseInt(_0xc5a7e0(0x1f5))/0xc*(-parseInt(_0xc5a7e0(0x1c0))/0xd);if(_0x15ccb0===_0x27dc8a)break;else _0x37402b['push'](_0x37402b['shift']());}catch(_0x3834b5){_0x37402b['push'](_0x37402b['shift']());}}}(_0xbc99,0xe35a6));import{getContext,extension_settings}from'/scripts/extensions.js';import{saveChat,saveSettingsDebounced}from'/script.js';import{log}from'./logger.js';import{fillWithSecondaryApi}from'./secondary-filler.js';import{getChatPiece,saveChatDebounced}from'../../utils/utils.js';import{extensionName}from'../../utils/settings.js';import{DEFAULT_AI_RULE_TEMPLATE,DEFAULT_AI_FLOW_TEMPLATE}from'./settings.js';import{renderTables}from'../../ui/table-bindings.js';import{updateOrInsertTableInChat}from'../../ui/message-table-renderer.js';const TABLE_DATA_KEY=_0x16a5d7(0x244);let currentTablesState=null,highlightedCells=new Set(),updatedTables=new Set();export function addHighlight(_0xf4b9d9,_0x3ee86a,_0x29313e){const _0x1241b1=_0x16a5d7,_0x3e9a14=_0xf4b9d9+'-'+_0x3ee86a+'-'+_0x29313e;highlightedCells[_0x1241b1(0x268)](_0x3e9a14);}export function getHighlights(){return highlightedCells;}export function clearHighlights(){const _0x3100e4=_0x16a5d7;highlightedCells[_0x3100e4(0x1eb)]>0x0&&(highlightedCells[_0x3100e4(0x223)](),log('已清除所有单元格高亮标记。','info'));}export function getUpdatedTables(){return updatedTables;}export function clearUpdatedTables(){const _0x14f821=_0x16a5d7;updatedTables[_0x14f821(0x1eb)]>0x0&&(updatedTables[_0x14f821(0x223)](),log(_0x14f821(0x17f),_0x14f821(0x259)));}export function setMemoryState(_0x24135d){currentTablesState=_0x24135d;}export function getMemoryState(){return currentTablesState;}const defaultTemplate={'tables':[{'name':_0x16a5d7(0x188),'headers':['日期','时段','时间','地点',_0x16a5d7(0x1cb)],'note':_0x16a5d7(0x25a),'rule_add':_0x16a5d7(0x1b8),'rule_delete':'【触发条件】任何时候,如果此表格的行数超过一行,必须删除旧的行,只保留最新、最准确的一行。','rule_update':_0x16a5d7(0x196),'charLimitRules':{},'rowLimitRule':0x1,'rows':[]},{'name':_0x16a5d7(0x218),'headers':[_0x16a5d7(0x210),'外貌','身形','衣着','性格','身份','职业',_0x16a5d7(0x265),'爱好','住所',_0x16a5d7(0x24f)],'note':_0x16a5d7(0x195),'rule_add':_0x16a5d7(0x206),'rule_delete':_0x16a5d7(0x250),'rule_update':_0x16a5d7(0x1dc),'charLimitRules':{'10':0x1e},'rowLimitRule':0x0,'rows':[]},{'name':_0x16a5d7(0x1d9),'headers':[_0x16a5d7(0x1c3),'类型','详情','状态','执行者','地点',_0x16a5d7(0x18d),'结果'],'note':_0x16a5d7(0x1db),'rule_add':_0x16a5d7(0x248),'rule_delete':_0x16a5d7(0x28c),'rule_update':_0x16a5d7(0x20b),'charLimitRules':{},'rowLimitRule':0xa,'rows':[]},{'name':_0x16a5d7(0x291),'headers':[_0x16a5d7(0x1cc),'类型','详情','状态','拥有者',_0x16a5d7(0x24e)],'note':_0x16a5d7(0x1bb),'rule_add':'【触发条件】当一个物品被明确赋予了特殊意义(如被赠予、在关键事件中扮演重要角色)或展示出独特功能时,应为其创建条目。','rule_delete':'【触发条件】当一个物品被彻底摧毁、消耗完毕或永久失去其特殊意义时,可以删除。','rule_update':_0x16a5d7(0x278),'charLimitRules':{},'rowLimitRule':0x0,'rows':[]},{'name':_0x16a5d7(0x22f),'headers':[_0x16a5d7(0x289),'技能效果'],'note':_0x16a5d7(0x20d),'rule_add':_0x16a5d7(0x1d8),'rule_delete':'【触发条件】如果发现表格中存在两个描述完全相同的重复技能,应删除其中一个。如果记录了非的技能,应立即删除。','rule_update':_0x16a5d7(0x194),'charLimitRules':{},'rowLimitRule':0x0,'rows':[]},{'name':_0x16a5d7(0x19c),'headers':['类型',_0x16a5d7(0x23d)],'note':_0x16a5d7(0x1b2),'rule_add':_0x16a5d7(0x1c7),'rule_delete':_0x16a5d7(0x19f),'rule_update':'【触发条件】只能在明确表示要修改某条设定时,才能更新对应行的描述。','charLimitRules':{},'rowLimitRule':0x0,'rows':[]}]};function getDefaultTables(){const _0x4125c0=_0x16a5d7;log(_0x4125c0(0x276),_0x4125c0(0x259));const _0xa73b56=JSON[_0x4125c0(0x26f)](JSON[_0x4125c0(0x270)](defaultTemplate[_0x4125c0(0x23a)]));return _0xa73b56[_0x4125c0(0x243)](_0xd5ad96=>{const _0x5e7e8a=_0x4125c0;_0xd5ad96[_0x5e7e8a(0x1df)]={'columnIndex':-0x1,'limit':0x0},_0xd5ad96[_0x5e7e8a(0x203)]=0x0,_0xd5ad96['columnWidths']=[];}),_0xa73b56;}export function loadTables(_0x23a21d=-0x1){const _0x488c88=_0x16a5d7,_0x2b747e=getContext();if(_0x2b747e&&_0x2b747e['chat']&&_0x2b747e[_0x488c88(0x254)][_0x488c88(0x18e)]>0x0){const _0x204f7e=_0x23a21d===-0x1?_0x2b747e[_0x488c88(0x254)]['length']-0x1:_0x23a21d-0x1;for(let _0x7453cd=_0x204f7e;_0x7453cd>=0x0;_0x7453cd--){const _0x45c274=_0x2b747e[_0x488c88(0x254)][_0x7453cd];if(_0x45c274[_0x488c88(0x217)]&&_0x45c274['extra'][TABLE_DATA_KEY]){log(_0x488c88(0x17e)+_0x7453cd+_0x488c88(0x1d1),_0x488c88(0x259));let _0x1cd6f9=JSON[_0x488c88(0x26f)](JSON[_0x488c88(0x270)](_0x45c274['extra'][TABLE_DATA_KEY]));return _0x1cd6f9[_0x488c88(0x243)](_0x152d82=>{const _0x266360=_0x488c88;if(_0x152d82['note']===undefined)_0x152d82[_0x266360(0x1f1)]='无';if(_0x152d82['rule_add']===undefined)_0x152d82[_0x266360(0x242)]='允许';if(_0x152d82[_0x266360(0x23c)]===undefined)_0x152d82[_0x266360(0x23c)]='允许';if(_0x152d82[_0x266360(0x1e6)]===undefined)_0x152d82[_0x266360(0x1e6)]='允许';_0x152d82[_0x266360(0x1df)]&&!_0x152d82[_0x266360(0x1de)]&&(_0x152d82[_0x266360(0x1de)]={},_0x152d82['charLimitRule'][_0x266360(0x27b)]!==-0x1&&_0x152d82[_0x266360(0x1df)][_0x266360(0x272)]>0x0&&(_0x152d82['charLimitRules'][_0x152d82[_0x266360(0x1df)][_0x266360(0x27b)]]=_0x152d82[_0x266360(0x1df)][_0x266360(0x272)]));delete _0x152d82[_0x266360(0x1df)];if(_0x152d82[_0x266360(0x203)]===undefined)_0x152d82[_0x266360(0x203)]=0x0;if(_0x152d82[_0x266360(0x224)]===undefined)_0x152d82[_0x266360(0x224)]=[];!_0x152d82[_0x266360(0x22a)]&&(_0x152d82[_0x266360(0x22a)]=Array(_0x152d82['rows'][_0x266360(0x18e)])[_0x266360(0x249)]('normal'));}),currentTablesState=_0x1cd6f9,currentTablesState;}}}if(extension_settings[extensionName]?.[_0x488c88(0x216)]){log(_0x488c88(0x261),_0x488c88(0x259));try{const _0x248c1b=extension_settings[extensionName][_0x488c88(0x216)];return currentTablesState=JSON[_0x488c88(0x26f)](JSON['stringify'](_0x248c1b['tables'])),_0x248c1b[_0x488c88(0x200)]!==undefined&&saveBatchFillerRuleTemplate(_0x248c1b[_0x488c88(0x200)]),_0x248c1b[_0x488c88(0x285)]!==undefined&&saveBatchFillerFlowTemplate(_0x248c1b[_0x488c88(0x285)]),currentTablesState;}catch(_0x253883){log(_0x488c88(0x1c8)+_0x253883[_0x488c88(0x21d)],_0x488c88(0x18a));}}return log(_0x488c88(0x21f),_0x488c88(0x259)),currentTablesState=getDefaultTables(),currentTablesState;}export function saveStateToMessage(_0xdcdfa5,_0x11bf07){const _0x50e968=_0x16a5d7;if(!_0xdcdfa5||!_0x11bf07)return log('缺少状态或目标消息,无法保存。','error'),![];return!_0x11bf07['extra']&&(_0x11bf07['extra']={}),_0x11bf07['extra'][TABLE_DATA_KEY]=JSON[_0x50e968(0x26f)](JSON['stringify'](_0xdcdfa5)),log(_0x50e968(0x1ad)+_0x11bf07[_0x50e968(0x269)][_0x50e968(0x238)](0x0,0x14)+_0x50e968(0x193),_0x50e968(0x259)),!![];}export function saveTables(_0x45d2e9='未知操作'){const _0x20c43b=_0x16a5d7;return log(_0x20c43b(0x1f4)+_0x45d2e9+_0x20c43b(0x260),'info'),!![];}export function deleteColumn(_0xc1a54e,_0x7bfb2d){const _0x151946=_0x16a5d7,_0x4b575b=getMemoryState();if(!_0x4b575b[_0xc1a54e]||_0x7bfb2d<0x0||_0x7bfb2d>=_0x4b575b[_0xc1a54e][_0x151946(0x208)][_0x151946(0x18e)]){log(_0x151946(0x1a5)+_0xc1a54e+_0x151946(0x1a6)+_0x7bfb2d+_0x151946(0x1ea),'error');return;}_0x4b575b[_0xc1a54e][_0x151946(0x208)][_0x151946(0x186)](_0x7bfb2d,0x1),_0x4b575b[_0xc1a54e]['rows'][_0x151946(0x243)](_0xddead0=>{const _0xe0cca2=_0x151946;_0xddead0[_0xe0cca2(0x18e)]>_0x7bfb2d&&_0xddead0[_0xe0cca2(0x186)](_0x7bfb2d,0x1);}),_0x4b575b[_0xc1a54e][_0x151946(0x224)]&&_0x4b575b[_0xc1a54e]['columnWidths'][_0x151946(0x18e)]>_0x7bfb2d&&_0x4b575b[_0xc1a54e][_0x151946(0x224)]['splice'](_0x7bfb2d,0x1),log(_0x151946(0x293)+_0xc1a54e+_0x151946(0x1b0)+(_0x7bfb2d+0x1)+_0x151946(0x1e7),_0x151946(0x25d)),saveTables(_0x4b575b);}export function moveRow(_0xd1828d,_0x36be42,_0x1a59d6){const _0x6053d7=_0x16a5d7,_0x265dfd=getMemoryState(),_0x4fbb0f=_0x265dfd[_0xd1828d];if(!_0x4fbb0f||_0x36be42<0x0||_0x36be42>=_0x4fbb0f[_0x6053d7(0x221)][_0x6053d7(0x18e)])return;const _0x55a08c=_0x1a59d6==='up'?_0x36be42-0x1:_0x36be42+0x1;if(_0x55a08c<0x0||_0x55a08c>=_0x4fbb0f[_0x6053d7(0x221)]['length'])return;const [_0x3e0a54]=_0x4fbb0f[_0x6053d7(0x221)]['splice'](_0x36be42,0x1);_0x4fbb0f[_0x6053d7(0x221)][_0x6053d7(0x186)](_0x55a08c,0x0,_0x3e0a54);if(_0x4fbb0f['rowStatuses']&&_0x4fbb0f[_0x6053d7(0x22a)]['length']===_0x4fbb0f[_0x6053d7(0x221)]['length']+0x1){const [_0x4b0d27]=_0x4fbb0f[_0x6053d7(0x22a)]['splice'](_0x36be42,0x1);_0x4fbb0f['rowStatuses']['splice'](_0x55a08c,0x0,_0x4b0d27);}log(_0x6053d7(0x1a4)+_0xd1828d+_0x6053d7(0x1b0)+(_0x36be42+0x1)+_0x6053d7(0x232)+(_0x55a08c+0x1)+_0x6053d7(0x27a),_0x6053d7(0x25d)),saveTables(_0x265dfd);}export function insertRow(_0x40ecea,_0x12dc27,_0x4fc6a2=_0x16a5d7(0x1aa)){const _0x4e73b4=_0x16a5d7,_0x449c6a=getMemoryState(),_0x12aa3e=_0x449c6a[_0x40ecea];if(!_0x12aa3e){log('插入行失败:找不到索引为\x20'+_0x40ecea+'\x20的表格。',_0x4e73b4(0x18a));return;}let _0x493804;typeof _0x12dc27===_0x4e73b4(0x1d4)?_0x493804=_0x4fc6a2==='above'?_0x12dc27:_0x12dc27+0x1:_0x493804=_0x12aa3e[_0x4e73b4(0x221)][_0x4e73b4(0x18e)];if(_0x493804<0x0)_0x493804=0x0;if(_0x493804>_0x12aa3e[_0x4e73b4(0x221)][_0x4e73b4(0x18e)])_0x493804=_0x12aa3e[_0x4e73b4(0x221)][_0x4e73b4(0x18e)];const _0x334fa4=new Array(_0x12aa3e[_0x4e73b4(0x208)][_0x4e73b4(0x18e)])[_0x4e73b4(0x249)]('');if(typeof _0x12dc27===_0x4e73b4(0x1c5)&&_0x12dc27!==null)for(const _0xb566d5 in _0x12dc27){const _0x575ff4=parseInt(_0xb566d5,0xa);!isNaN(_0x575ff4)&&_0x575ff4<_0x334fa4[_0x4e73b4(0x18e)]&&(_0x334fa4[_0x575ff4]=_0x12dc27[_0xb566d5],addHighlight(_0x40ecea,_0x493804,_0x575ff4));}_0x12aa3e[_0x4e73b4(0x221)][_0x4e73b4(0x186)](_0x493804,0x0,_0x334fa4);if(!_0x12aa3e[_0x4e73b4(0x22a)])_0x12aa3e[_0x4e73b4(0x22a)]=Array(_0x12aa3e[_0x4e73b4(0x221)][_0x4e73b4(0x18e)])[_0x4e73b4(0x249)](_0x4e73b4(0x292));_0x12aa3e[_0x4e73b4(0x22a)][_0x4e73b4(0x186)](_0x493804,0x0,_0x4e73b4(0x292)),updatedTables[_0x4e73b4(0x268)](_0x40ecea),log(_0x4e73b4(0x18f)+_0x12aa3e[_0x4e73b4(0x205)]+_0x4e73b4(0x256)+_0x40ecea+')\x20的第\x20'+(_0x493804+0x1)+_0x4e73b4(0x1e9),_0x4e73b4(0x25d));const _0x2fd96c=getContext();if(_0x2fd96c['chat']&&_0x2fd96c[_0x4e73b4(0x254)]['length']>0x0){const _0x46474f=_0x2fd96c['chat'][_0x2fd96c[_0x4e73b4(0x254)][_0x4e73b4(0x18e)]-0x1];if(saveStateToMessage(_0x449c6a,_0x46474f)){saveChat();return;}}saveChatDebounced();}export function addRow(_0x545454){const _0xbbc637=_0x16a5d7;if(!currentTablesState||!currentTablesState[_0x545454])return;const _0x2db000=currentTablesState[_0x545454],_0x505250=_0x2db000[_0xbbc637(0x208)][_0xbbc637(0x18e)],_0xf432cd=Array(_0x505250)[_0xbbc637(0x249)]('');_0x2db000[_0xbbc637(0x221)][_0xbbc637(0x27f)](_0xf432cd);if(!_0x2db000[_0xbbc637(0x22a)])_0x2db000[_0xbbc637(0x22a)]=Array(_0x2db000[_0xbbc637(0x221)]['length'])[_0xbbc637(0x249)]('normal');_0x2db000[_0xbbc637(0x22a)][_0xbbc637(0x27f)]('normal'),updatedTables[_0xbbc637(0x268)](_0x545454);const _0x5087a8='表格\x20['+_0x2db000[_0xbbc637(0x205)]+_0xbbc637(0x207);log(_0x5087a8,_0xbbc637(0x259));const _0x1a7257=getContext();if(_0x1a7257['chat']&&_0x1a7257['chat']['length']>0x0){const _0x5005c1=_0x1a7257[_0xbbc637(0x254)][_0x1a7257[_0xbbc637(0x254)][_0xbbc637(0x18e)]-0x1];if(saveStateToMessage(currentTablesState,_0x5005c1)){saveChat();return;}}saveChatDebounced();}export function addColumn(_0x264213){const _0x4f0585=_0x16a5d7;if(!currentTablesState||!currentTablesState[_0x264213])return;const _0x55495f=currentTablesState[_0x264213],_0xc75acf='新列\x20'+(_0x55495f['headers'][_0x4f0585(0x18e)]+0x1);_0x55495f['headers']['push'](_0xc75acf),_0x55495f[_0x4f0585(0x221)][_0x4f0585(0x243)](_0x155783=>_0x155783['push'](''));if(!_0x55495f['columnWidths'])_0x55495f[_0x4f0585(0x224)]=[];_0x55495f['columnWidths'][_0x4f0585(0x27f)](null);const _0xb95d46='表格\x20['+_0x55495f[_0x4f0585(0x205)]+_0x4f0585(0x1c2);log(_0xb95d46,_0x4f0585(0x259));const _0x59749b=getContext();if(_0x59749b[_0x4f0585(0x254)]&&_0x59749b[_0x4f0585(0x254)][_0x4f0585(0x18e)]>0x0){const _0x17b06f=_0x59749b['chat'][_0x59749b[_0x4f0585(0x254)][_0x4f0585(0x18e)]-0x1];if(saveStateToMessage(currentTablesState,_0x17b06f)){saveChat();return;}}saveChatDebounced();}export function updateHeader(_0x29eacc,_0x1e21b9,_0x3ac7e5){const _0x2dfe37=_0x16a5d7;if(!currentTablesState||!currentTablesState[_0x29eacc]||currentTablesState[_0x29eacc][_0x2dfe37(0x208)][_0x1e21b9]===undefined)return;const _0x29b0cb=currentTablesState[_0x29eacc][_0x2dfe37(0x205)],_0xdfe04e=currentTablesState[_0x29eacc][_0x2dfe37(0x208)][_0x1e21b9];currentTablesState[_0x29eacc]['headers'][_0x1e21b9]=_0x3ac7e5;const _0x4097a7='表格\x20['+_0x29b0cb+']\x20的表头“'+_0xdfe04e+_0x2dfe37(0x271)+_0x3ac7e5+'”。';log(_0x4097a7,_0x2dfe37(0x259));const _0x36aa5a=getContext();if(_0x36aa5a[_0x2dfe37(0x254)]&&_0x36aa5a[_0x2dfe37(0x254)][_0x2dfe37(0x18e)]>0x0){const _0x151c21=_0x36aa5a[_0x2dfe37(0x254)][_0x36aa5a[_0x2dfe37(0x254)][_0x2dfe37(0x18e)]-0x1];if(saveStateToMessage(currentTablesState,_0x151c21)){saveChat();return;}}saveChatDebounced();}export async function deleteRow(_0x12bc4b,_0x1684b5){const _0x395ea4=_0x16a5d7,_0x2e67e9=currentTablesState?.[_0x12bc4b];if(!_0x2e67e9||!_0x2e67e9['rows'][_0x1684b5])return;!_0x2e67e9[_0x395ea4(0x22a)]&&(_0x2e67e9[_0x395ea4(0x22a)]=Array(_0x2e67e9[_0x395ea4(0x221)][_0x395ea4(0x18e)])[_0x395ea4(0x249)](_0x395ea4(0x292)));_0x2e67e9['rowStatuses'][_0x1684b5]=_0x395ea4(0x181),updatedTables[_0x395ea4(0x268)](_0x12bc4b);const _0xe965a3=_0x395ea4(0x253)+_0x2e67e9[_0x395ea4(0x205)]+_0x395ea4(0x1ae)+(_0x1684b5+0x1)+_0x395ea4(0x23e);log(_0xe965a3,_0x395ea4(0x259));const _0x547b46=getContext();if(_0x547b46['chat']?.[_0x395ea4(0x18e)]>0x0){const _0x8ef4b9=_0x547b46[_0x395ea4(0x254)][_0x547b46[_0x395ea4(0x254)][_0x395ea4(0x18e)]-0x1];if(saveStateToMessage(currentTablesState,_0x8ef4b9)){await saveChat(),renderTables();return;}}await saveChatDebounced(),renderTables();}export async function restoreRow(_0x227286,_0x2e9ac7){const _0x2818da=_0x16a5d7,_0x558518=currentTablesState?.[_0x227286];if(!_0x558518||!_0x558518[_0x2818da(0x221)][_0x2e9ac7]||!_0x558518[_0x2818da(0x22a)])return;_0x558518['rowStatuses'][_0x2e9ac7]=_0x2818da(0x292),updatedTables['add'](_0x227286);const _0x1a5db9='表格\x20['+_0x558518[_0x2818da(0x205)]+_0x2818da(0x1ae)+(_0x2e9ac7+0x1)+'\x20行已恢复。';log(_0x1a5db9,_0x2818da(0x259));const _0x1ff3e6=getContext();if(_0x1ff3e6['chat']?.[_0x2818da(0x18e)]>0x0){const _0x235b1a=_0x1ff3e6[_0x2818da(0x254)][_0x1ff3e6['chat'][_0x2818da(0x18e)]-0x1];if(saveStateToMessage(currentTablesState,_0x235b1a)){await saveChat(),renderTables();return;}}await saveChatDebounced(),renderTables();}export function commitPendingDeletions(){const _0x517c27=_0x16a5d7;if(!currentTablesState)return![];let _0x3cf108=0x0;currentTablesState[_0x517c27(0x243)]((_0x441ca9,_0x3b447f)=>{const _0x46cf1f=_0x517c27;if(!_0x441ca9['rowStatuses']||_0x441ca9[_0x46cf1f(0x22a)][_0x46cf1f(0x18e)]===0x0)return;let _0x6dcee3=![];for(let _0x19e727=_0x441ca9[_0x46cf1f(0x221)][_0x46cf1f(0x18e)]-0x1;_0x19e727>=0x0;_0x19e727--){_0x441ca9[_0x46cf1f(0x22a)][_0x19e727]===_0x46cf1f(0x181)&&(_0x441ca9['rows'][_0x46cf1f(0x186)](_0x19e727,0x1),_0x441ca9[_0x46cf1f(0x22a)]['splice'](_0x19e727,0x1),_0x3cf108++,_0x6dcee3=!![]);}_0x6dcee3&&updatedTables[_0x46cf1f(0x268)](_0x3b447f);});if(_0x3cf108>0x0)return log(_0x517c27(0x274)+_0x3cf108+_0x517c27(0x27a),'info'),!![];return![];}export function insertColumn(_0x345e2c,_0x29873e,_0x1be415){const _0x358106=_0x16a5d7;if(!currentTablesState||!currentTablesState[_0x345e2c])return;const _0x33f02a=currentTablesState[_0x345e2c],_0x1f0a09=_0x1be415==='left'?_0x29873e:_0x29873e+0x1,_0x15381e='新列';_0x33f02a[_0x358106(0x208)][_0x358106(0x186)](_0x1f0a09,0x0,_0x15381e),_0x33f02a['rows']['forEach'](_0x1179c9=>_0x1179c9[_0x358106(0x186)](_0x1f0a09,0x0,''));if(!_0x33f02a[_0x358106(0x224)])_0x33f02a[_0x358106(0x224)]=[];_0x33f02a[_0x358106(0x224)][_0x358106(0x186)](_0x1f0a09,0x0,null);const _0x59b114=_0x358106(0x253)+_0x33f02a[_0x358106(0x205)]+_0x358106(0x245)+(_0x29873e+0x1)+_0x358106(0x255)+(_0x1be415==='left'?'左侧':'右侧')+_0x358106(0x1be);log(_0x59b114,'info');const _0x485613=getContext();if(_0x485613['chat']&&_0x485613[_0x358106(0x254)]['length']>0x0){const _0x37ceb8=_0x485613[_0x358106(0x254)][_0x485613['chat'][_0x358106(0x18e)]-0x1];if(saveStateToMessage(currentTablesState,_0x37ceb8)){saveChat();return;}}saveChatDebounced();}export function moveColumn(_0x256453,_0x14f007,_0x2ccab){const _0x314f7e=_0x16a5d7;if(!currentTablesState||!currentTablesState[_0x256453])return;const _0x3bc12d=currentTablesState[_0x256453],_0x44359f=_0x3bc12d['headers'],_0x3d9a19=_0x3bc12d[_0x314f7e(0x221)],_0x5ede0f=_0x2ccab==='left'?_0x14f007-0x1:_0x14f007+0x1;if(_0x5ede0f<0x0||_0x5ede0f>=_0x44359f[_0x314f7e(0x18e)]){log(_0x314f7e(0x229)+_0x14f007+_0x314f7e(0x220),_0x314f7e(0x231));return;}const [_0x213f3c]=_0x44359f[_0x314f7e(0x186)](_0x14f007,0x1);_0x44359f[_0x314f7e(0x186)](_0x5ede0f,0x0,_0x213f3c),_0x3d9a19[_0x314f7e(0x243)](_0x3e683d=>{const _0x47509e=_0x314f7e,[_0x49b3a7]=_0x3e683d['splice'](_0x14f007,0x1);_0x3e683d[_0x47509e(0x186)](_0x5ede0f,0x0,_0x49b3a7);});if(_0x3bc12d['columnWidths']&&_0x3bc12d[_0x314f7e(0x224)]['length']>_0x14f007){const [_0x552753]=_0x3bc12d[_0x314f7e(0x224)][_0x314f7e(0x186)](_0x14f007,0x1);_0x3bc12d[_0x314f7e(0x224)][_0x314f7e(0x186)](_0x5ede0f,0x0,_0x552753);}const _0x1e33cd='表格\x20['+_0x3bc12d[_0x314f7e(0x205)]+_0x314f7e(0x1e3)+_0x213f3c+_0x314f7e(0x219)+(_0x2ccab===_0x314f7e(0x204)?'左':'右')+_0x314f7e(0x20c);log(_0x1e33cd,_0x314f7e(0x259));const _0x85f4b3=getContext();if(_0x85f4b3[_0x314f7e(0x254)]&&_0x85f4b3[_0x314f7e(0x254)][_0x314f7e(0x18e)]>0x0){const _0x19deaf=_0x85f4b3[_0x314f7e(0x254)][_0x85f4b3[_0x314f7e(0x254)][_0x314f7e(0x18e)]-0x1];if(saveStateToMessage(currentTablesState,_0x19deaf)){saveChat();return;}}saveChatDebounced();}export function deleteTable(_0x4154af){const _0x2a4347=_0x16a5d7;if(!currentTablesState||!currentTablesState[_0x4154af])return;const _0xe756b5=currentTablesState[_0x4154af][_0x2a4347(0x205)];currentTablesState[_0x2a4347(0x186)](_0x4154af,0x1);const _0x1faf34=_0x2a4347(0x253)+_0xe756b5+_0x2a4347(0x209);log(_0x1faf34,_0x2a4347(0x25d));const _0x4c37eb=getContext();if(_0x4c37eb[_0x2a4347(0x254)]&&_0x4c37eb[_0x2a4347(0x254)][_0x2a4347(0x18e)]>0x0){const _0x59e219=_0x4c37eb[_0x2a4347(0x254)][_0x4c37eb['chat'][_0x2a4347(0x18e)]-0x1];if(saveStateToMessage(currentTablesState,_0x59e219)){saveChat(),log(_0x2a4347(0x1a1),_0x2a4347(0x25d));return;}}log(_0x2a4347(0x237),_0x2a4347(0x18a)),saveChatDebounced();}export function addTable(_0x4ec3fa){const _0x17a67f=_0x16a5d7;if(!_0x4ec3fa||!_0x4ec3fa[_0x17a67f(0x213)]()){log(_0x17a67f(0x28e),'error'),toastr[_0x17a67f(0x18a)](_0x17a67f(0x18b),_0x17a67f(0x1b6));return;}!currentTablesState&&loadTables();if(currentTablesState['some'](_0x2c8839=>_0x2c8839['name']===_0x4ec3fa[_0x17a67f(0x213)]())){log(_0x17a67f(0x191)+_0x4ec3fa+'\x22\x20的表格已存在。','error'),toastr[_0x17a67f(0x18a)](_0x17a67f(0x228)+_0x4ec3fa+_0x17a67f(0x27e),'创建失败');return;}const _0x1c1844={'name':_0x4ec3fa[_0x17a67f(0x213)](),'headers':[_0x17a67f(0x257)],'rows':[],'rowStatuses':[],'columnWidths':[],'note':_0x17a67f(0x214),'rule_add':'允许','rule_delete':'允许','rule_update':'允许','charLimitRules':{},'rowLimitRule':0x0};currentTablesState['push'](_0x1c1844);const _0x462c50='已成功创建新表格:['+_0x4ec3fa['trim']()+']。';log(_0x462c50,_0x17a67f(0x25d));const _0x31272e=getContext();if(_0x31272e[_0x17a67f(0x254)]&&_0x31272e[_0x17a67f(0x254)][_0x17a67f(0x18e)]>0x0){const _0x218dbe=_0x31272e[_0x17a67f(0x254)][_0x31272e[_0x17a67f(0x254)]['length']-0x1];if(saveStateToMessage(currentTablesState,_0x218dbe)){saveChat(),log(_0x17a67f(0x1a2),_0x17a67f(0x25d));return;}}log(_0x17a67f(0x24d),_0x17a67f(0x18a)),saveChatDebounced();}export function renameTable(_0x35e313,_0x510f8e){const _0x34d42e=_0x16a5d7;if(!currentTablesState||!currentTablesState[_0x35e313]){log(_0x34d42e(0x1da),_0x34d42e(0x18a)),toastr[_0x34d42e(0x18a)](_0x34d42e(0x1bd),_0x34d42e(0x19a));return;}const _0x15f56d=_0x510f8e['trim']();if(!_0x15f56d){log(_0x34d42e(0x1e2),_0x34d42e(0x18a)),toastr[_0x34d42e(0x18a)](_0x34d42e(0x18b),_0x34d42e(0x19a));return;}if(currentTablesState[_0x34d42e(0x1c4)]((_0x40c517,_0x4b32ae)=>_0x4b32ae!==_0x35e313&&_0x40c517['name']===_0x15f56d)){log('重命名失败:名为\x20\x22'+_0x15f56d+_0x34d42e(0x27e),_0x34d42e(0x18a)),toastr[_0x34d42e(0x18a)](_0x34d42e(0x228)+_0x15f56d+'\x22\x20的表格已存在。',_0x34d42e(0x19a));return;}const _0x5d322f=currentTablesState[_0x35e313][_0x34d42e(0x205)];currentTablesState[_0x35e313][_0x34d42e(0x205)]=_0x15f56d,log(_0x34d42e(0x1e5)+_0x5d322f+_0x34d42e(0x1c6)+_0x15f56d+'\x22。',_0x34d42e(0x25d));const _0x17cbb6=getContext();if(_0x17cbb6[_0x34d42e(0x254)]&&_0x17cbb6[_0x34d42e(0x254)]['length']>0x0){const _0x5d618c=_0x17cbb6[_0x34d42e(0x254)][_0x17cbb6['chat'][_0x34d42e(0x18e)]-0x1];if(saveStateToMessage(currentTablesState,_0x5d618c)){saveChat();return;}}saveChatDebounced();}function _0x1220(_0x199c46,_0x403574){const _0xbc990c=_0xbc99();return _0x1220=function(_0x1220f1,_0x5bf74d){_0x1220f1=_0x1220f1-0x17d;let _0x1c1492=_0xbc990c[_0x1220f1];return _0x1c1492;},_0x1220(_0x199c46,_0x403574);}export function moveTable(_0x3850db,_0x39d402){const _0x7fddc3=_0x16a5d7;if(!currentTablesState||!currentTablesState[_0x3850db])return;const _0x458cbc=_0x39d402==='up'?_0x3850db-0x1:_0x3850db+0x1;if(_0x458cbc<0x0||_0x458cbc>=currentTablesState[_0x7fddc3(0x18e)]){log(_0x7fddc3(0x182)+_0x3850db+_0x7fddc3(0x220),_0x7fddc3(0x231));return;}const _0x948371=currentTablesState[_0x3850db];currentTablesState[_0x3850db]=currentTablesState[_0x458cbc],currentTablesState[_0x458cbc]=_0x948371;const _0x1b2bc2=_0x7fddc3(0x253)+_0x948371[_0x7fddc3(0x205)]+_0x7fddc3(0x1d7);log(_0x1b2bc2,_0x7fddc3(0x25d));const _0x598331=getContext();if(_0x598331[_0x7fddc3(0x254)]&&_0x598331[_0x7fddc3(0x254)][_0x7fddc3(0x18e)]>0x0){const _0x5d086c=_0x598331['chat'][_0x598331[_0x7fddc3(0x254)][_0x7fddc3(0x18e)]-0x1];if(saveStateToMessage(currentTablesState,_0x5d086c)){saveChat(),log(_0x7fddc3(0x212),_0x7fddc3(0x25d));return;}}log('无法找到可锚定的消息或保存失败,顺序调整可能不会被持久化!',_0x7fddc3(0x18a)),saveChatDebounced();}export function updateTableRules(_0x33a244,_0xc59eb9){const _0x7e69bf=_0x16a5d7;if(!currentTablesState||!currentTablesState[_0x33a244])return;const _0x38361b=currentTablesState[_0x33a244];_0x38361b['note']=_0xc59eb9[_0x7e69bf(0x1f1)],_0x38361b[_0x7e69bf(0x242)]=_0xc59eb9[_0x7e69bf(0x242)],_0x38361b[_0x7e69bf(0x23c)]=_0xc59eb9['rule_delete'],_0x38361b[_0x7e69bf(0x1e6)]=_0xc59eb9[_0x7e69bf(0x1e6)],_0x38361b['charLimitRules']=_0xc59eb9['charLimitRules'],_0x38361b[_0x7e69bf(0x203)]=_0xc59eb9[_0x7e69bf(0x203)],delete _0x38361b['charLimitRule'];const _0x279e7b='表格\x20['+_0x38361b[_0x7e69bf(0x205)]+_0x7e69bf(0x26e);log(_0x279e7b,_0x7e69bf(0x259));const _0x46c0fd=getContext();if(_0x46c0fd['chat']&&_0x46c0fd['chat'][_0x7e69bf(0x18e)]>0x0){const _0x5532a5=_0x46c0fd[_0x7e69bf(0x254)][_0x46c0fd['chat'][_0x7e69bf(0x18e)]-0x1];if(saveStateToMessage(currentTablesState,_0x5532a5)){saveChat();return;}}saveChatDebounced();}export function updateRow(_0x44d290,_0x751d3d,_0x204572){const _0x165cc4=_0x16a5d7;if(!currentTablesState||!currentTablesState[_0x44d290]){log(_0x165cc4(0x283)+_0x44d290+_0x165cc4(0x266),_0x165cc4(0x18a));return;}const _0xbb44c6=currentTablesState[_0x44d290];if(_0x751d3d>=_0xbb44c6[_0x165cc4(0x221)]['length']){log('AI指令意图更新不存在的行\x20(rowIndex:\x20'+_0x751d3d+_0x165cc4(0x1cd)+_0xbb44c6[_0x165cc4(0x205)]+_0x165cc4(0x180),_0x165cc4(0x231)),insertRow(_0x44d290,_0x204572);return;}const _0x20132a=_0xbb44c6['rows'][_0x751d3d];for(const _0x3bf0c8 in _0x204572){const _0x4c2eaf=parseInt(_0x3bf0c8,0xa);_0x4c2eaf<_0x20132a['length']&&(_0x20132a[_0x4c2eaf]=_0x204572[_0x4c2eaf],addHighlight(_0x44d290,_0x751d3d,_0x4c2eaf));}updatedTables[_0x165cc4(0x268)](_0x44d290);const _0x4d1014=_0x165cc4(0x1b5)+_0xbb44c6[_0x165cc4(0x205)]+_0x165cc4(0x1ae)+(_0x751d3d+0x1)+_0x165cc4(0x27a);log(_0x4d1014,_0x165cc4(0x259));const _0x1fc6d2=getContext();if(_0x1fc6d2[_0x165cc4(0x254)]&&_0x1fc6d2['chat']['length']>0x0){const _0x25f5f5=_0x1fc6d2['chat'][_0x1fc6d2['chat']['length']-0x1];if(saveStateToMessage(currentTablesState,_0x25f5f5)){saveChat();return;}}saveChatDebounced();}export function clearAllTables(){const _0x12e72e=_0x16a5d7;if(!currentTablesState){log(_0x12e72e(0x1f7),_0x12e72e(0x18a));return;}currentTablesState['forEach']((_0x27c34d,_0x31d9ab)=>{const _0x4c08bb=_0x12e72e;_0x27c34d[_0x4c08bb(0x221)][_0x4c08bb(0x18e)]>0x0&&updatedTables[_0x4c08bb(0x268)](_0x31d9ab),_0x27c34d['rows']=[],_0x27c34d[_0x4c08bb(0x22a)]=[];}),log(_0x12e72e(0x201),'warn');const _0x585a70=getContext();if(_0x585a70[_0x12e72e(0x254)]&&_0x585a70['chat']['length']>0x0){const _0x5666c1=_0x585a70[_0x12e72e(0x254)][_0x585a70[_0x12e72e(0x254)]['length']-0x1];if(saveStateToMessage(currentTablesState,_0x5666c1)){saveChat(),log(_0x12e72e(0x1d2),_0x12e72e(0x25d)),toastr['success']('所有表格的剧情内容已清空。',_0x12e72e(0x28b));return;}}log('无法找到可锚定的消息或保存失败,清空操作可能不会被持久化!',_0x12e72e(0x18a)),saveChatDebounced();}function _0xbc99(){const _0x454916=['global_table_preset','extra','角色栏','”已向','导入的表格数据格式不正确:\x20','导入预设失败:\x20','constructor','message','accept','未找到任何表格数据或全局预设,使用默认模板。','\x20已在边界。','rows','replace','clear','columnWidths','input','用户取消了导入操作。','执行AI指令:\x20deleteRow(tableIndex=','名为\x20\x22','无法移动列:索引\x20','rowStatuses','表格系统总开关已关闭,无法执行回退填表。','状态回退失败,已中止操作。','状态回退成功,准备重新填表...','聊天记录不足,无法执行回退操作。','技能栏','\x20条表格操作指令...','warn','\x20行移动到第\x20','执行AI指令时出错:\x20','【增加】:\x20','confirm','target','无法找到可锚定的消息或保存失败,删除操作可能不会被持久化!','substring',')列,字符超出规定(','tables','回退状态保存失败,操作中止。','rule_delete','具体描述','\x20行已标记为待删除。',')超出规定(','用户取消了全局预设导入操作。','createObjectURL','rule_add','forEach','amily2_tables_data',']\x20在第\x20','全局预设已设置!新聊天将默认使用此预设。','\x20条消息加载表格状态...','【触发条件】当以下情况发生时,应添加新行:\x0a1.\x20角色接下一个明确的、有目标的委托或命令。\x0a2.\x20角色们达成一个具体的、需要在未来执行的约定。\x0a3.\x20角色为自己设定一个长期的、关键性的目标。','fill','toString','当前没有设置全局预设。','map','无法找到可锚定的消息或保存失败,新表格可能不会被持久化!','重要原因','其他重要信息','【触发条件】当一个角色被确认永久性死亡(非假死或失踪),且其存在不再对后续剧情有直接影响时,可以删除该行。','UI已更新以显示回退后的状态。','全局预设已被清除。','表格\x20[','chat','\x20列的','\x20(索引\x20','新列\x201','createElement','info','【核心作用】此表格用于精确追踪故事发生的即时时空背景,确保时间与空间的连续性。它应该始终只包含一行,代表当前的“镜头”位置。\x0a【字段详解】\x0a-\x20日期:\x20格式为\x27YYYY-MM-DD\x27。若日期未知,请根据上下文合理推断或设定一个初始日期,如\x27大夏3年-9月-10日\x27。\x0a-\x20时段:\x20严格遵循规定(凌晨:0-5时;早晨:5-8时;上午:8-11时;中午:11-13时;下午:13-16时;傍晚:16-19时;晚上:19-24时)。\x0a-\x20时间:\x20格式为\x27HH:MM\x27。若时间未知,可根据时段估算,如\x2708:30\x27。\x0a-\x20地点:\x20描述当前场景发生的具体位置,应尽可能精确,例如\x27XX街的咖啡馆\x27而非\x27城里\x27。\x0a-\x20此地角色:\x20列出当前场景中所有在场且参与互动的主要角色,用\x27/\x27分隔。','Amily2-Table-Preset-v2.0-clean','无需清除,当前未设置任何全局预设。','success','isArray','Amily2-Table-Preset-v2.0-full','\x22\x20已更新内存状态。','未在聊天记录中找到表格,正在加载全局预设...','function',',\x20rowIndex=','split','与关系','\x20中操作。','已根据AI的指示成功更新表格!','add','mes','toISOString','用户取消了清除全局预设的操作。','操作已取消。','AI返回内容为空,无法更新表格。',']\x20的规则已更新。','parse','stringify','”已更新为“','limit','无法回退:聊天记录不足。','已提交并永久删除了\x20','7688151BshCHd','从预设模板生成默认表格...','【修改】:\x20','【触发条件】当物品的“状态”(如被损坏)、“拥有者”(如被转交或被盗)或“详情”(如发现了新功能)发生变化时,必须更新。',')字限制,请进行缩减。】','\x20行。','columnIndex','操作成功','未在AI返回内容中找到有效的\x20\x20指令块。','\x22\x20的表格已存在。','push','(该表当前内容为空)\x0a','.json','onchange','AI指令错误:尝试在不存在的表格索引\x20','aiRuleTemplate','batchFillerFlowTemplate','5577783bAwxqL','AI指令块为空,无需执行任何操作。','6726WwnFiA','技能名','\x0a---\x0a','操作完成','【触发条件】当任务列表超过10行时,优先删除最早的、已经“已完成”且与当前剧情关联度最低的任务。如果存在内容完全重复的任务,应删除。','正在执行回退并重新填表...','无法创建表格:名称不能为空。','injectionFlowTemplate','表格系统总开关已关闭,跳过回退填表。','物品栏','normal','成功删除了表格\x20','无法导出:当前表格状态为空。','在第\x20','已清除所有表格的更新标记。',']\x20末尾新增一行。','pending-deletion','无法移动表格:索引\x20','】已开始下载。','aiFlowTemplate','未能在上一楼找到可用的表格状态。','splice','slice','时空栏','【删除】:\x20','error','表格名称不能为空。','】已成功导出。','开始时间/结束时间','length','成功在表格\x20','导入成功','无法创建表格:名为\x20\x22','\x0a\x20\x20\x20\x20\x20\x20\x20\x20','...]','【触发条件】当一个已知技能的效果发生进化、变异或被添加了新的限制/效果时(例如,技能升级),必须更新其“技能效果”描述。','【核心作用】此表格是角色关系和状态的核心数据库,用于记录所有在故事中出现的重要角色的详细信息。\x0a【字段详解】\x0a-\x20角色名:\x20角色的唯一标识。\x0a-\x20外貌:\x20描述五官、发型、发色、肤色等面部特征。\x0a-\x20身形:\x20描述身高、体型、肌肉状况、特殊身体标记(如伤疤)等。\x0a-\x20衣着:\x20描述角色当前或标志性的穿着,包括服装、配饰等。\x0a-\x20性格:\x20概括角色的核心性格特质,使用1-3个关键词,如\x27勇敢/鲁莽/忠诚\x27。\x0a-\x20身份:\x20角色的社会背景或出身,如\x27贵族后裔\x27、\x27流浪者\x27。\x0a-\x20职业:\x20角色赖以谋生的工作或职责,如\x27佣兵\x27、\x27学者\x27。\x0a-\x20与关系:\x20描述该角色与主角之间的社会或情感关系,如\x27盟友\x27、\x27导师\x27、\x27敌人\x27。\x0a-\x20爱好:\x20角色的兴趣和消遣活动。\x0a-\x20住所:\x20角色的常住地。\x0a-\x20其他重要信息:\x20记录任何不属于以上类别但对角色至关重要的信息,如特殊能力、过去的经历等。','【触发条件】当以下任一情况发生时,必须更新此行:\x0a1.\x20时间发生显著跳跃(例如,\x27几小时后\x27、\x27第二天\x27)。\x0a2.\x20角色从一个地点移动到另一个地点。\x0a3.\x20场景中关键角色的出入导致在场人员发生变化。','join','110etKSUF','文件格式无效或缺少版本号/表格数据。','重命名失败','result','设定栏','\x20|\x20','填表完成','【触发条件】只能在明确表示要移除或废弃某条设定时,才能删除对应行。',',\x20data=','废黜表格后的状态已强制写入最新消息并立即保存。','新表格状态已强制写入最新消息并立即保存。','amily2_ai_template','成功将表格\x20','删除列失败:在表格\x20','\x20中找不到索引为\x20','table_system_enabled','2wZoDNV','56189VBXsAJ','below','removeChild','type','表格状态已准备写入消息\x20[',']\x20的第\x20','已成功将回退后的状态保存至最新消息。','\x20的第\x20','导入失败:','【核心作用】此表格记录了来自的、超越故事本身的“元指令”或世界观设定,拥有最高解释权。内容应被严格遵守,禁止AI自行修改。\x0a【字段详解】\x0a-\x20类型:\x20指令的分类,如\x27世界观设定\x27、\x27剧情走向要求\x27、\x27角色行为禁令\x27。\x0a-\x20具体描述:\x20完整、准确地记录提出的具体要求。','1261997gYOsGP','href','AI\x20指令更新了表格\x20[','创建失败','click','【触发条件】当故事开始,且此表格为空时,必须立即根据初始场景创建第一行。','Amily2-','warning','【核心作用】记录那些在故事中具有特殊功能、背景或情感价值的关键物品。普通物品不应记录。\x0a【字段详解】\x0a-\x20物品名:\x20物品的名称。\x0a-\x20类型:\x20物品的分类,如\x27武器\x27、\x27道具\x27、\x27信物\x27、\x27关键物品\x27。\x0a-\x20详情:\x20描述物品的外观、材质和已知功能。\x0a-\x20状态:\x20物品的当前状况,如\x27完好\x27、\x27破损\x27、\x27能量耗尽\x27。\x0a-\x20拥有者:\x20当前持有该物品的角色名。\x0a-\x20重要原因:\x20解释该物品为何重要,例如\x27是解开谜题的钥匙\x27或\x27是母亲的遗物\x27。','执行AI指令:\x20updateRow(tableIndex=','表格不存在。','插入了新列。','导入的预设中缺少指令模板字段,模板将不会被更新。','26zRKlja','7854MvRZib',']\x20新增了一列。','任务名','some','object','\x22\x20已重命名为\x20\x22','【触发条件】当通过括号、旁白或其他明确的“第四面墙”方式,提出关于故事背景、规则或未来走向的指令时,必须记录于此。','加载全局预设失败:\x20','filter','110JLfqsV','此地角色','物品名','),已智能转换为在表格\x20[','未能保存回退状态,操作中止。',')行,请结合剧情缩减至(','导入操作已取消。','\x20条消息中找到基准表格数据。','清空行数据后的状态已强制写入最新消息并立即保存。','正在尝试从第\x20','number','导入的预设已强制写入最新消息并立即保存。','body',']\x20的顺序已调整。','【触发条件】当在故事中首次成功施展或习得一个全新的、表格中未记录的技能时,必须添加。','任务栏','重命名失败:表格不存在。','【核心作用】追踪故事中的主要情节线、目标和挑战。只记录对剧情发展有重大影响的“任务”,忽略日常琐事。\x0a【字段详解】\x0a-\x20任务名:\x20任务的简洁概括,如\x27寻找失落的神器\x27。\x0a-\x20类型:\x20任务的分类,如\x27主线\x27、\x27支线\x27、\x27个人\x27、\x27约定\x27。\x0a-\x20详情:\x20对任务目标和背景的简要描述。\x0a-\x20状态:\x20任务的当前进展,如\x27未开始\x27、\x27进行中\x27、\x27已完成\x27、\x27已失败\x27、\x27已取消\x27。\x0a-\x20执行者:\x20负责完成此任务的角色名。\x0a-\x20地点:\x20任务关键环节发生的地点。\x0a-\x20开始时间/结束时间:\x20记录任务的起止时间,格式\x27YYYY-MM-DD\x27,若未结束则结束时间留空。\x0a-\x20结果:\x20任务完成或失败后的最终结果。','【触发条件】当角色的任何信息发生持久性或关键性变化时,必须更新对应单元格。例如:\x0a1.\x20外貌/身形/衣着发生永久性改变(如断肢、换上新装备)。\x0a2.\x20性格因重大事件而扭转。\x0a3.\x20身份或职业发生变更(如继承王位、被解雇)。\x0a4.\x20与的关系发生根本性转变(如从敌人变为盟友)。','download','charLimitRules','charLimitRule','Amily2-Table-Preset-v3.0-separated_templates','getPrototypeOf','重命名失败:名称不能为空。',']\x20的列“','【清除全局预设】\x0a\x0a您确定要清除已设置的全局预设吗?\x0a\x0a清除后,新聊天将恢复使用扩展内置的默认表格模板。','表格\x20\x22','rule_update','\x20列。','【警告】\x0a\x0a导入操作将完全覆盖您当前的AI指令模板和所有表格(包括结构和内容)。\x0a\x0a此操作不可逆,是否确定要继续?','\x20行位置插入了新行。','\x20的列。','size','全局预设已成功导入并保存到扩展设置中。','aiTemplate','file','batch_filler_rule_template','rowIndex','note','files','【当前(','UI操作\x20\x22','16167588Npnqht','设置成功','无法清空:当前表格状态为空。','回退并重新填表操作完成。','---','application/json','预设已成功导入并应用。','34988uZGMLK','batch_filler_flow_template','readAsText','所有AI指令已成功执行完毕。','batchFillerRuleTemplate','所有表格的行数据已在内存中清空。','every','rowLimitRule','left','name','【触发条件】当一个有名有姓的角色首次出现,并与或当前剧情发生有意义的互动时,必须为其创建新的一行。',']\x20新增了一行。','headers',']\x20已被成功废黜。','8qylUxQ','【触发条件】当任务的“状态”发生任何变化时,必须更新。例如,从\x27进行中\x27变为\x27已完成\x27。当任务的“详情”或“结果”有新的关键信息补充时,也应更新。','移动。','【核心作用】专门用于记录主角掌握的各种技能、魔法、被动能力或特殊专长。\x0a【字段详解】\x0a-\x20技能名:\x20技能的正式名称。\x0a-\x20技能效果:\x20清晰、简洁地描述该技能使用时产生的具体效果、消耗和限制条件。','重新填表失败:\x20','导出成功','角色名','\x20|\x0a','表格顺序调整后的状态已强制写入最新消息并立即保存。','trim','这是一个新创建的表格。','version'];_0xbc99=function(){return _0x454916;};return _0xbc99();}function checkTableRules(_0x50454f){const _0x47425f=_0x16a5d7;let _0x3ace0a=[];_0x50454f[_0x47425f(0x203)]&&_0x50454f['rowLimitRule']>0x0&&_0x50454f[_0x47425f(0x221)]['length']>_0x50454f[_0x47425f(0x203)]&&_0x3ace0a['push'](_0x47425f(0x1f3)+_0x50454f[_0x47425f(0x205)]+_0x47425f(0x23f)+_0x50454f[_0x47425f(0x203)]+_0x47425f(0x1cf)+_0x50454f['rowLimitRule']+')行以下,但切莫完全删除。】');const _0x185a44=_0x50454f[_0x47425f(0x1de)]||{};for(const _0x848444 in _0x185a44){const _0x462d64=parseInt(_0x848444,0xa),_0x4d41d4=_0x185a44[_0x462d64];if(_0x4d41d4>0x0&&_0x462d64>=0x0&&_0x462d64<_0x50454f['headers'][_0x47425f(0x18e)]){const _0x44be7e=_0x50454f['headers'][_0x462d64],_0x373c61=[];_0x50454f[_0x47425f(0x221)][_0x47425f(0x243)]((_0x2a6b2b,_0x26945b)=>{const _0x2896aa=_0x47425f;if(_0x50454f['rowStatuses']&&_0x50454f[_0x2896aa(0x22a)][_0x26945b]==='pending-deletion')return;const _0x443482=_0x2a6b2b[_0x462d64]||'';_0x443482[_0x2896aa(0x18e)]>_0x4d41d4&&_0x373c61[_0x2896aa(0x27f)](_0x26945b);});if(_0x373c61[_0x47425f(0x18e)]>0x0){const _0x248898=_0x373c61[_0x47425f(0x197)]('、');_0x3ace0a[_0x47425f(0x27f)]('【当前('+_0x50454f[_0x47425f(0x205)]+')第('+_0x248898+')行('+_0x44be7e+_0x47425f(0x239)+_0x4d41d4+_0x47425f(0x279));}}}return _0x3ace0a[_0x47425f(0x197)]('\x0a');}export function convertTablesToCsvString(){const _0x16d2d3=_0x16a5d7;!currentTablesState&&loadTables();if(!currentTablesState)return'';let _0x272a11='';return currentTablesState[_0x16d2d3(0x243)]((_0x746834,_0x3376d8)=>{const _0x38a1f3=_0x16d2d3;_0x272a11+='\x0a*\x20'+_0x3376d8+':'+_0x746834[_0x38a1f3(0x205)]+'\x0a',_0x272a11+='【说明】:\x0a'+(_0x746834[_0x38a1f3(0x1f1)]||'无')+'\x0a';const _0x131fb1=_0x746834[_0x38a1f3(0x205)][_0x38a1f3(0x222)](/\s/g,'')+'内容';_0x272a11+='<'+_0x131fb1+'>\x0a';const _0xeeb06a=[_0x38a1f3(0x1f0),..._0x746834[_0x38a1f3(0x208)][_0x38a1f3(0x24c)]((_0x2aa599,_0x3ea949)=>_0x3ea949+':'+_0x2aa599)];_0x272a11+='|\x20'+_0xeeb06a[_0x38a1f3(0x197)]('\x20|\x20')+_0x38a1f3(0x211),_0x272a11+='|'+_0xeeb06a[_0x38a1f3(0x24c)](()=>_0x38a1f3(0x1f9))[_0x38a1f3(0x197)]('|')+'|\x0a';const _0x37ff12=_0x746834[_0x38a1f3(0x221)][_0x38a1f3(0x1c9)]((_0x33fe55,_0xd3e5d6)=>!_0x746834[_0x38a1f3(0x22a)]||_0x746834[_0x38a1f3(0x22a)][_0xd3e5d6]!==_0x38a1f3(0x181));_0x37ff12[_0x38a1f3(0x18e)]===0x0?_0x272a11+=_0x38a1f3(0x280):_0x746834[_0x38a1f3(0x221)]['forEach']((_0x1e6869,_0x399fc4)=>{const _0x59d088=_0x38a1f3;if(_0x746834[_0x59d088(0x22a)]&&_0x746834[_0x59d088(0x22a)][_0x399fc4]===_0x59d088(0x181))return;if(Array['isArray'](_0x1e6869)){const _0x18eb2f=_0x1e6869['map'](_0x1955e8=>{const _0x7d9420=_0x59d088,_0x2cf2e3=_0x1955e8===null||_0x1955e8===undefined||_0x1955e8===''?'未知':String(_0x1955e8);return _0x2cf2e3[_0x7d9420(0x222)](/\|/g,'|');});_0x272a11+='|\x20'+_0x399fc4+'\x20|\x20'+_0x18eb2f[_0x59d088(0x197)](_0x59d088(0x19d))+_0x59d088(0x211);}});const _0x2de570=checkTableRules(_0x746834);_0x2de570&&(_0x272a11+=_0x2de570+'\x0a'),_0x272a11+='\x0a',_0x272a11+=_0x38a1f3(0x234)+(_0x746834[_0x38a1f3(0x242)]||'允许')+'\x0a',_0x272a11+=_0x38a1f3(0x189)+(_0x746834[_0x38a1f3(0x23c)]||'允许')+'\x0a',_0x272a11+=_0x38a1f3(0x277)+(_0x746834[_0x38a1f3(0x1e6)]||'允许')+'\x0a',_0x3376d8{const _0xcf040=_0x5971dd;_0x82afcd+='\x0a<'+_0x5e6d5d[_0xcf040(0x205)]+'>\x0a';const _0x4bd3c1='|\x20'+_0x5e6d5d['headers'][_0xcf040(0x197)](_0xcf040(0x19d))+'\x20|';_0x82afcd+=_0x4bd3c1+'\x0a';const _0x31757c='|'+_0x5e6d5d['headers'][_0xcf040(0x24c)](()=>_0xcf040(0x1f9))['join']('|')+'|';_0x82afcd+=_0x31757c+'\x0a';const _0x582e30=_0x5e6d5d[_0xcf040(0x221)][_0xcf040(0x1c9)]((_0x508bc2,_0x51f7fa)=>!_0x5e6d5d[_0xcf040(0x22a)]||_0x5e6d5d[_0xcf040(0x22a)][_0x51f7fa]!==_0xcf040(0x181));_0x582e30[_0xcf040(0x18e)]>0x0?_0x582e30[_0xcf040(0x243)](_0x4510a4=>{const _0x2cde8c=_0xcf040;if(Array[_0x2cde8c(0x25e)](_0x4510a4)){const _0x264dd6=_0x4510a4[_0x2cde8c(0x24c)](_0x2a98cd=>_0x2a98cd===null||_0x2a98cd===undefined||_0x2a98cd===''?'\x20':_0x2a98cd[_0x2cde8c(0x24a)]()),_0x4f40e3='|\x20'+_0x264dd6[_0x2cde8c(0x197)](_0x2cde8c(0x19d))+'\x20|';_0x82afcd+=_0x4f40e3+'\x0a';}}):_0x82afcd+=_0xcf040(0x280),_0x82afcd+='\x0a';}),_0x82afcd[_0x5971dd(0x213)]();}loadTables();export function getBatchFillerRuleTemplate(){const _0x3461c9=_0x16a5d7;return extension_settings[extensionName]?.[_0x3461c9(0x1ef)]??DEFAULT_AI_RULE_TEMPLATE;}export function saveBatchFillerRuleTemplate(_0x281979){extension_settings[extensionName]['batch_filler_rule_template']=_0x281979,saveSettingsDebounced();}export function getBatchFillerFlowTemplate(){const _0x208c95=_0x16a5d7;return extension_settings[extensionName]?.[_0x208c95(0x1fd)]??DEFAULT_AI_FLOW_TEMPLATE;}export function saveBatchFillerFlowTemplate(_0x16e0dd){const _0x9a9a96=_0x16a5d7;extension_settings[extensionName][_0x9a9a96(0x1fd)]=_0x16e0dd,saveSettingsDebounced();}export function getAiFlowTemplateForInjection(){const _0x330646=_0x16a5d7;return extension_settings[extensionName]?.[_0x330646(0x1a3)]??DEFAULT_AI_FLOW_TEMPLATE;}export async function updateTableFromText(_0x519f50){const _0x2dedc0=_0x16a5d7,_0x2828c8=extension_settings[extensionName];if(_0x2828c8[_0x2dedc0(0x1a7)]===![]){log('表格系统总开关已关闭,跳过\x20\x20标签处理。',_0x2dedc0(0x259));return;}if(!_0x519f50){log(_0x2dedc0(0x26d),_0x2dedc0(0x231));return;}const _0x22f75d=_0x519f50['match'](/([\s\S]*?)<\/Amily2Edit>/);if(!_0x22f75d||!_0x22f75d[0x1]){log(_0x2dedc0(0x27d),_0x2dedc0(0x231));return;}let _0x21d034=_0x22f75d[0x1][_0x2dedc0(0x222)](//g,'')[_0x2dedc0(0x213)]();if(!_0x21d034){log(_0x2dedc0(0x287),_0x2dedc0(0x259));return;}const _0x7102e0=_0x21d034[_0x2dedc0(0x264)]('\x0a')['filter'](_0x5a6571=>_0x5a6571[_0x2dedc0(0x213)]()!=='');log('准备执行从AI返回的\x20'+_0x7102e0[_0x2dedc0(0x18e)]+_0x2dedc0(0x230),_0x2dedc0(0x259));const _0x4d6a26={'insertRow':(_0x5e4e81,_0x463ff7)=>{const _0x39365a=_0x2dedc0;log('执行AI指令:\x20insertRow(tableIndex='+_0x5e4e81+_0x39365a(0x1a0)+JSON[_0x39365a(0x270)](_0x463ff7)+')',_0x39365a(0x259)),insertRow(_0x5e4e81,_0x463ff7);},'deleteRow':(_0x30dba3,_0xca2c30)=>{const _0x23aabe=_0x2dedc0;log(_0x23aabe(0x227)+_0x30dba3+_0x23aabe(0x263)+_0xca2c30+')',_0x23aabe(0x259)),deleteRow(_0x30dba3,_0xca2c30);},'updateRow':(_0x4a86bf,_0x31ccb2,_0x5742db)=>{const _0x5c5bb7=_0x2dedc0;log(_0x5c5bb7(0x1bc)+_0x4a86bf+_0x5c5bb7(0x263)+_0x31ccb2+_0x5c5bb7(0x1a0)+JSON[_0x5c5bb7(0x270)](_0x5742db)+')',_0x5c5bb7(0x259)),updateRow(_0x4a86bf,_0x31ccb2,_0x5742db);}};try{const _0x44c6fa=Object[_0x2dedc0(0x1e1)](async function(){})[_0x2dedc0(0x21c)],_0x55a36b=new _0x44c6fa('runner','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20const\x20{\x20insertRow,\x20deleteRow,\x20updateRow\x20}\x20=\x20runner;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+_0x21d034+_0x2dedc0(0x192));await _0x55a36b(_0x4d6a26),log(_0x2dedc0(0x1ff),_0x2dedc0(0x25d)),toastr[_0x2dedc0(0x25d)](_0x2dedc0(0x267),_0x2dedc0(0x19e)),document['dispatchEvent'](new CustomEvent('amily2-force-ui-reload'));}catch(_0x43a577){log('执行AI指令时发生错误:\x20'+_0x43a577[_0x2dedc0(0x21d)],'error'),toastr[_0x2dedc0(0x18a)](_0x2dedc0(0x233)+_0x43a577[_0x2dedc0(0x21d)],'执行失败');}}export function saveAiTemplate(_0x481054){extension_settings[extensionName]['amily2_ai_template']=_0x481054,saveSettingsDebounced();}export function getAiTemplate(){return getAiFlowTemplateForInjection();}function exportPresetBase(_0x52bcdd=![]){const _0x2a0be9=_0x16a5d7;if(!currentTablesState){log(_0x2a0be9(0x17d),_0x2a0be9(0x18a)),toastr[_0x2a0be9(0x18a)]('没有可导出的表格数据。');return;}let _0x5d3f24,_0x4e74af,_0x5baaea;_0x52bcdd?(_0x5d3f24=JSON[_0x2a0be9(0x26f)](JSON[_0x2a0be9(0x270)](currentTablesState)),_0x4e74af=_0x2a0be9(0x25f),_0x5baaea='完整备份'):(_0x5d3f24=currentTablesState['map'](_0x4cedbe=>({'name':_0x4cedbe['name'],'headers':_0x4cedbe[_0x2a0be9(0x208)],'columnWidths':_0x4cedbe[_0x2a0be9(0x224)]||[],'note':_0x4cedbe[_0x2a0be9(0x1f1)],'rule_add':_0x4cedbe[_0x2a0be9(0x242)],'rule_delete':_0x4cedbe[_0x2a0be9(0x23c)],'rule_update':_0x4cedbe[_0x2a0be9(0x1e6)],'charLimitRules':_0x4cedbe[_0x2a0be9(0x1de)]||{},'rowLimitRule':_0x4cedbe[_0x2a0be9(0x203)]||0x0,'rows':[],'rowStatuses':[]})),_0x4e74af=_0x2a0be9(0x25b),_0x5baaea='纯净预设');const _0x563b51={'version':_0x2a0be9(0x1e0),'batchFillerRuleTemplate':getBatchFillerRuleTemplate(),'batchFillerFlowTemplate':getBatchFillerFlowTemplate(),'tables':_0x5d3f24},_0x28ab56=new Blob([JSON[_0x2a0be9(0x270)](_0x563b51,null,0x2)],{'type':_0x2a0be9(0x1fa)}),_0x20c150=URL[_0x2a0be9(0x241)](_0x28ab56),_0x42a5ac=document[_0x2a0be9(0x258)]('a');_0x42a5ac[_0x2a0be9(0x1b4)]=_0x20c150,_0x42a5ac[_0x2a0be9(0x1dd)]=_0x2a0be9(0x1b9)+_0x5baaea+'-'+new Date()[_0x2a0be9(0x26a)]()[_0x2a0be9(0x187)](0x0,0xa)+_0x2a0be9(0x281),document[_0x2a0be9(0x1d6)]['appendChild'](_0x42a5ac),_0x42a5ac['click'](),document[_0x2a0be9(0x1d6)][_0x2a0be9(0x1ab)](_0x42a5ac),URL['revokeObjectURL'](_0x20c150),log('【'+_0x5baaea+_0x2a0be9(0x18c),_0x2a0be9(0x25d)),toastr[_0x2a0be9(0x25d)]('【'+_0x5baaea+_0x2a0be9(0x183),_0x2a0be9(0x20f));}export function exportPreset(){exportPresetBase(![]);}export function exportPresetFull(){exportPresetBase(!![]);}export function importPreset(_0x24b89e){const _0x582870=_0x16a5d7,_0x5a4edd=document[_0x582870(0x258)](_0x582870(0x225));_0x5a4edd['type']=_0x582870(0x1ee),_0x5a4edd[_0x582870(0x21e)]=_0x582870(0x281),_0x5a4edd[_0x582870(0x282)]=_0x490f0a=>{const _0x4ccf6a=_0x582870,_0x25bbeb=_0x490f0a[_0x4ccf6a(0x236)][_0x4ccf6a(0x1f2)][0x0];if(!_0x25bbeb)return;const _0x3cece2=new FileReader();_0x3cece2['onload']=_0x5a6916=>{const _0x11c4db=_0x4ccf6a;try{const _0x1ccda5=JSON[_0x11c4db(0x26f)](_0x5a6916[_0x11c4db(0x236)][_0x11c4db(0x19b)]);if(!_0x1ccda5[_0x11c4db(0x215)]||!Array[_0x11c4db(0x25e)](_0x1ccda5[_0x11c4db(0x23a)]))throw new Error(_0x11c4db(0x199));const _0x134202=window['confirm'](_0x11c4db(0x1e8));if(!_0x134202){log(_0x11c4db(0x226),_0x11c4db(0x259)),toastr['info'](_0x11c4db(0x1d0));return;}if(_0x1ccda5[_0x11c4db(0x215)]===_0x11c4db(0x1e0))saveBatchFillerRuleTemplate(_0x1ccda5['batchFillerRuleTemplate']||''),saveBatchFillerFlowTemplate(_0x1ccda5[_0x11c4db(0x285)]||''),saveAiTemplate(_0x1ccda5[_0x11c4db(0x28f)]||'');else{if(_0x1ccda5[_0x11c4db(0x284)]!==undefined&&_0x1ccda5[_0x11c4db(0x184)]!==undefined)saveBatchFillerRuleTemplate(_0x1ccda5[_0x11c4db(0x284)]||''),saveBatchFillerFlowTemplate(_0x1ccda5[_0x11c4db(0x184)]||''),saveAiTemplate(_0x1ccda5[_0x11c4db(0x184)]||'');else _0x1ccda5[_0x11c4db(0x1ed)]?(saveBatchFillerRuleTemplate(''),saveBatchFillerFlowTemplate(_0x1ccda5[_0x11c4db(0x1ed)]||''),saveAiTemplate(_0x1ccda5[_0x11c4db(0x1ed)]||'')):log(_0x11c4db(0x1bf),_0x11c4db(0x231));}const _0x435509=_0x1ccda5[_0x11c4db(0x23a)];_0x435509[_0x11c4db(0x243)](_0x2c2db0=>{const _0x4f44c9=_0x11c4db;if(_0x2c2db0['name']===undefined||_0x2c2db0[_0x4f44c9(0x208)]===undefined||_0x2c2db0[_0x4f44c9(0x221)]===undefined)throw new Error(_0x4f44c9(0x21a)+JSON[_0x4f44c9(0x270)](_0x2c2db0));if(_0x2c2db0['note']===undefined)_0x2c2db0[_0x4f44c9(0x1f1)]='无';if(_0x2c2db0[_0x4f44c9(0x242)]===undefined)_0x2c2db0[_0x4f44c9(0x242)]='允许';if(_0x2c2db0[_0x4f44c9(0x23c)]===undefined)_0x2c2db0[_0x4f44c9(0x23c)]='允许';if(_0x2c2db0[_0x4f44c9(0x1e6)]===undefined)_0x2c2db0[_0x4f44c9(0x1e6)]='允许';if(_0x2c2db0['charLimitRule']&&!_0x2c2db0[_0x4f44c9(0x1de)])_0x2c2db0[_0x4f44c9(0x1de)]={},_0x2c2db0['charLimitRule'][_0x4f44c9(0x27b)]!==-0x1&&_0x2c2db0['charLimitRule'][_0x4f44c9(0x272)]>0x0&&(_0x2c2db0[_0x4f44c9(0x1de)][_0x2c2db0[_0x4f44c9(0x1df)][_0x4f44c9(0x27b)]]=_0x2c2db0[_0x4f44c9(0x1df)][_0x4f44c9(0x272)]);else _0x2c2db0['charLimitRules']===undefined&&(_0x2c2db0[_0x4f44c9(0x1de)]={});delete _0x2c2db0['charLimitRule'],!_0x2c2db0[_0x4f44c9(0x22a)]&&(_0x2c2db0[_0x4f44c9(0x22a)]=Array(_0x2c2db0[_0x4f44c9(0x221)][_0x4f44c9(0x18e)])[_0x4f44c9(0x249)](_0x4f44c9(0x292))),_0x2c2db0[_0x4f44c9(0x203)]===undefined&&(_0x2c2db0[_0x4f44c9(0x203)]=0x0),_0x2c2db0[_0x4f44c9(0x224)]===undefined&&(_0x2c2db0['columnWidths']=[]);}),setMemoryState(_0x435509);const _0x4c5199=getContext();if(_0x4c5199[_0x11c4db(0x254)]&&_0x4c5199[_0x11c4db(0x254)][_0x11c4db(0x18e)]>0x0){const _0x4e8996=_0x4c5199[_0x11c4db(0x254)][_0x4c5199[_0x11c4db(0x254)][_0x11c4db(0x18e)]-0x1];saveStateToMessage(getMemoryState(),_0x4e8996)&&(saveChat(),log(_0x11c4db(0x1d5),_0x11c4db(0x25d)));}else saveChatDebounced();log(_0x11c4db(0x1fb),_0x11c4db(0x25d)),toastr[_0x11c4db(0x25d)]('预设已成功导入!',_0x11c4db(0x190)),typeof _0x24b89e===_0x11c4db(0x262)&&_0x24b89e();}catch(_0x1ed8e){log(_0x11c4db(0x21b)+_0x1ed8e['message'],_0x11c4db(0x18a)),toastr[_0x11c4db(0x18a)]('导入失败:'+_0x1ed8e['message'],'错误');}},_0x3cece2[_0x4ccf6a(0x1fe)](_0x25bbeb);},_0x5a4edd['click']();}export async function rollbackState(){const _0x470193=_0x16a5d7,_0x561437=getContext();if(!_0x561437||!_0x561437['chat']||_0x561437[_0x470193(0x254)][_0x470193(0x18e)]<0x2)return log(_0x470193(0x273),_0x470193(0x231)),toastr[_0x470193(0x1ba)](_0x470193(0x22e)),![];const _0x16daa2=_0x561437['chat'],_0x3555da=_0x16daa2[_0x470193(0x18e)]-0x1,_0x31f975=_0x16daa2[_0x3555da];log(_0x470193(0x1d3)+(_0x3555da-0x1)+_0x470193(0x247),_0x470193(0x259));const _0x3e5ac6=loadTables(_0x3555da);if(!_0x3e5ac6)return log('未能在上一楼找到可用的表格状态,无法回退。','error'),toastr[_0x470193(0x18a)](_0x470193(0x185)),![];setMemoryState(_0x3e5ac6);if(saveStateToMessage(_0x3e5ac6,_0x31f975))await saveChat(),log(_0x470193(0x1af),_0x470193(0x25d));else return log(_0x470193(0x23b),_0x470193(0x18a)),toastr['error'](_0x470193(0x1ce)),![];return renderTables(),updateOrInsertTableInChat(),log(_0x470193(0x251),_0x470193(0x259)),!![];}export async function rollbackAndRefill(){const _0x2033fa=_0x16a5d7,_0x47c80=extension_settings[extensionName];if(_0x47c80[_0x2033fa(0x1a7)]===![]){log(_0x2033fa(0x290),_0x2033fa(0x259)),toastr[_0x2033fa(0x259)](_0x2033fa(0x22b));return;}toastr[_0x2033fa(0x259)](_0x2033fa(0x28d));const _0x3de6f2=await rollbackState();if(!_0x3de6f2){toastr[_0x2033fa(0x18a)](_0x2033fa(0x22c));return;}toastr[_0x2033fa(0x25d)](_0x2033fa(0x22d));const _0x396739=getContext(),_0x24f132=_0x396739['chat'][_0x396739[_0x2033fa(0x254)][_0x2033fa(0x18e)]-0x1];try{await fillWithSecondaryApi(_0x24f132,!![]),log(_0x2033fa(0x1f8),_0x2033fa(0x25d));}catch(_0x378825){log('回退重填过程中发生错误:\x20'+_0x378825['message'],_0x2033fa(0x18a)),toastr[_0x2033fa(0x18a)](_0x2033fa(0x20e)+_0x378825[_0x2033fa(0x21d)]);}}export function updateColumnWidth(_0x107e7,_0xd5afbe,_0xce2b29){const _0x286709=_0x16a5d7;if(!currentTablesState||!currentTablesState[_0x107e7])return;const _0xfcb50c=currentTablesState[_0x107e7];!_0xfcb50c[_0x286709(0x224)]&&(_0xfcb50c[_0x286709(0x224)]=[]);while(_0xfcb50c['columnWidths'][_0x286709(0x18e)]<_0xfcb50c['headers'][_0x286709(0x18e)]){_0xfcb50c[_0x286709(0x224)][_0x286709(0x27f)](null);}_0xfcb50c[_0x286709(0x224)][_0xd5afbe]=_0xce2b29;const _0x5c9846=getContext();if(_0x5c9846[_0x286709(0x254)]&&_0x5c9846['chat'][_0x286709(0x18e)]>0x0){const _0x41c808=_0x5c9846[_0x286709(0x254)][_0x5c9846['chat'][_0x286709(0x18e)]-0x1];if(saveStateToMessage(currentTablesState,_0x41c808)){saveChat();return;}}saveChatDebounced();}export function isCurrentTablesEmpty(){const _0xb9931=_0x16a5d7,_0x55c880=getMemoryState();if(!_0x55c880||_0x55c880['length']===0x0)return!![];return _0x55c880[_0xb9931(0x202)](_0x7cc9c5=>!_0x7cc9c5[_0xb9931(0x221)]||_0x7cc9c5['rows']['length']===0x0);}export function clearGlobalPreset(){const _0x259147=_0x16a5d7;if(extension_settings[extensionName]&&extension_settings[extensionName][_0x259147(0x216)]){const _0x46262d=window[_0x259147(0x235)](_0x259147(0x1e4));_0x46262d?(delete extension_settings[extensionName][_0x259147(0x216)],saveSettingsDebounced(),log(_0x259147(0x252),'success'),toastr[_0x259147(0x25d)]('全局预设已清除,新聊天将使用默认模板。',_0x259147(0x27c))):(log(_0x259147(0x26b),_0x259147(0x259)),toastr[_0x259147(0x259)](_0x259147(0x26c)));}else log(_0x259147(0x25c),_0x259147(0x259)),toastr[_0x259147(0x259)](_0x259147(0x24b),'提示');}export function importGlobalPreset(_0x2da52c){const _0x409122=_0x16a5d7,_0x2f4810=document[_0x409122(0x258)]('input');_0x2f4810[_0x409122(0x1ac)]='file',_0x2f4810[_0x409122(0x21e)]='.json',_0x2f4810[_0x409122(0x282)]=_0x5da40d=>{const _0x48dcb7=_0x409122,_0x1abf1c=_0x5da40d[_0x48dcb7(0x236)][_0x48dcb7(0x1f2)][0x0];if(!_0x1abf1c)return;const _0x336ba7=new FileReader();_0x336ba7['onload']=_0x10326d=>{const _0x4bfadd=_0x48dcb7;try{const _0x3914d4=JSON[_0x4bfadd(0x26f)](_0x10326d['target'][_0x4bfadd(0x19b)]);if(!_0x3914d4['version']||!Array[_0x4bfadd(0x25e)](_0x3914d4[_0x4bfadd(0x23a)]))throw new Error(_0x4bfadd(0x199));const _0x1378b1=window[_0x4bfadd(0x235)]('【全局预设导入】\x0a\x0a这将把选定的预设设置为所有新聊天的默认表格。\x0a\x0a此操作将覆盖任何已存在的全局预设,是否确定?');if(!_0x1378b1){log(_0x4bfadd(0x240),'info'),toastr[_0x4bfadd(0x259)]('操作已取消。');return;}const _0x37e57f=_0x3914d4[_0x4bfadd(0x23a)][_0x4bfadd(0x24c)](_0x151a14=>({'name':_0x151a14[_0x4bfadd(0x205)],'headers':_0x151a14['headers'],'note':_0x151a14['note'],'rule_add':_0x151a14[_0x4bfadd(0x242)],'rule_delete':_0x151a14[_0x4bfadd(0x23c)],'rule_update':_0x151a14[_0x4bfadd(0x1e6)],'rows':[]}));!extension_settings[extensionName]&&(extension_settings[extensionName]={});extension_settings[extensionName]['global_table_preset']={'version':_0x3914d4[_0x4bfadd(0x215)],'tables':_0x37e57f,'batchFillerRuleTemplate':_0x3914d4[_0x4bfadd(0x200)],'batchFillerFlowTemplate':_0x3914d4[_0x4bfadd(0x285)]},saveSettingsDebounced();if(_0x3914d4[_0x4bfadd(0x215)]===_0x4bfadd(0x1e0))saveBatchFillerRuleTemplate(_0x3914d4[_0x4bfadd(0x200)]||''),saveBatchFillerFlowTemplate(_0x3914d4['batchFillerFlowTemplate']||''),saveAiTemplate(_0x3914d4[_0x4bfadd(0x28f)]||'');else{if(_0x3914d4[_0x4bfadd(0x284)]!==undefined&&_0x3914d4['aiFlowTemplate']!==undefined)saveBatchFillerRuleTemplate(_0x3914d4[_0x4bfadd(0x284)]||''),saveBatchFillerFlowTemplate(_0x3914d4['aiFlowTemplate']||''),saveAiTemplate(_0x3914d4['aiFlowTemplate']||'');else _0x3914d4['aiTemplate']&&(saveBatchFillerRuleTemplate(''),saveBatchFillerFlowTemplate(_0x3914d4['aiTemplate']||''),saveAiTemplate(_0x3914d4[_0x4bfadd(0x1ed)]||''));}log(_0x4bfadd(0x1ec),_0x4bfadd(0x25d)),toastr[_0x4bfadd(0x25d)](_0x4bfadd(0x246),_0x4bfadd(0x1f6)),typeof _0x2da52c==='function'&&_0x2da52c();}catch(_0x718264){log('导入全局预设失败:\x20'+_0x718264[_0x4bfadd(0x21d)],_0x4bfadd(0x18a)),toastr[_0x4bfadd(0x18a)](_0x4bfadd(0x1b1)+_0x718264[_0x4bfadd(0x21d)],'错误');}},_0x336ba7['readAsText'](_0x1abf1c);},_0x2f4810[_0x409122(0x1b7)]();} diff --git a/core/table-system/settings.js b/core/table-system/settings.js index 281f560..f707e44 100644 --- a/core/table-system/settings.js +++ b/core/table-system/settings.js @@ -33,8 +33,9 @@ const DEFAULT_AI_FLOW_TEMPLATE = `# dataTable 说明 【说明】: · [表格用途和规则的说明] <[tableName]内容> -rowIndex,[colIndex]:[colName],[colIndex]:[colName],... -[rowIndex],[单元格数据],[单元格数据],... +| rowIndex | [colIndex]:[colName] | [colIndex]:[colName] | ... | +|---|---|---|---| +| [rowIndex] | [单元格数据] | [单元格数据] | ... | ... 【增加】: · [插入新行的触发条件] @@ -46,9 +47,9 @@ rowIndex,[colIndex]:[colName],[colIndex]:[colName],... ### 格式解析: - \`* [tableIndex]:[tableName]\`: 表格的标题行,包含表格的索引(\`tableIndex\`)和名称(\`tableName\`)。 - \`【说明】\`: 提供了表格的详细用途和填写规则。 -- \`<[tableName]内容>\`: 包含了表格的实际数据。 - - 第一行是表头,定义了每一列的索引 (\`colIndex\`) 和名称 (\`colName\`)。 - - 后续每一行都是一条数据记录,以行索引 (\`rowIndex\`) 开头,后面跟着对应列的单元格数据。 +- \`<[tableName]内容>\`: 包含了使用 Markdown 格式的实际数据表格。 + - 表头行定义了每一列的索引 (\`colIndex\`) 和名称 (\`colName\`)。第一列始终是 \`rowIndex\`。 + - 后续每一行都是一条数据记录,第一列是该行的索引 (\`rowIndex\`),后面跟着对应列的单元格数据。 - \`【增加】\`, \`【删除】\`, \`【修改】\`: 分别描述了你应该在何种剧情下对表格进行增、删、改操作。 ### 示例: @@ -57,8 +58,9 @@ rowIndex,[colIndex]:[colName],[colIndex]:[colName],... 【说明】: (内容省略...) <时空栏内容> -rowIndex,0:日期,1:时段,2:时间,3:地点,4:此地角色 -0,2025-09-04,下午,18:40,办公室,艾克/克莱因 +| rowIndex | 0:日期 | 1:时段 | 2:时间 | 3:地点 | 4:此地角色 | +|---|---|---|---|---|---| +| 0 | 2025-09-04 | 下午 | 18:40 | 办公室 | 艾克/克莱因 | 【增加】: · 此表不存在任何一行时 【删除】: · 此表大于一行时应删除多余行 diff --git a/core/tavern-helper/main.js b/core/tavern-helper/main.js index a342b26..db1ea68 100644 --- a/core/tavern-helper/main.js +++ b/core/tavern-helper/main.js @@ -416,6 +416,9 @@ class AmilyHelper { existingEntry.position = positionMap[entryUpdate.position] ?? 4; } if (entryUpdate.depth !== undefined) existingEntry.depth = entryUpdate.depth; + if (entryUpdate.order !== undefined) existingEntry.order = entryUpdate.order; + if (entryUpdate.exclude_recursion !== undefined) existingEntry.excludeRecursion = entryUpdate.exclude_recursion; + if (entryUpdate.prevent_recursion !== undefined) existingEntry.preventRecursion = entryUpdate.prevent_recursion; } } await saveWorldInfo(bookName, bookData, true); diff --git a/manifest.json b/manifest.json index 967a268..c265cd2 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "name": "Amily2号聊天优化助手", "display_name": "Amily2号助手", - "version": "1.6.2", + "version": "1.6.3", "author": "Wx-2025", "description": "一个拥有独立UI的智能引擎,正文优化、自动总结、记忆表格、rag向量、隐藏楼层、剧情推进六大功能整合。", "minSillyTavernVersion": "1.10.0", @@ -33,5 +33,6 @@ + diff --git a/ui/page-window.js b/ui/page-window.js index 206a0b6..4dabebc 100644 --- a/ui/page-window.js +++ b/ui/page-window.js @@ -150,6 +150,7 @@ export function showSummaryModal(summaryText, callbacks) { const regenerateButton = $(''); regenerateButton.on('click', () => { if (onRegenerate) { + dialogElement[0].close(); onRegenerate(dialogElement); } }); diff --git a/ui/state.js b/ui/state.js index 71471a7..85e62fa 100644 --- a/ui/state.js +++ b/ui/state.js @@ -132,6 +132,7 @@ export function updateUI() { $(`input[name="amily2_icon_location"][value="${settings.iconLocation}"]`).prop("checked", true); $("#amily2_auto_hide_enabled").prop("checked", settings.autoHideEnabled); + $("#amily2_auto_hide_summarized_enabled").prop("checked", settings.autoHideSummarizedEnabled); $("#amily2_auto_hide_threshold").val(settings.autoHideThreshold); $("#amily2_auto_hide_threshold_value").text(settings.autoHideThreshold); $('#amily2_lore_activation_mode').val(settings.loreActivationMode);