diff --git a/PresetSettings/prese-settings.html b/PresetSettings/prese-settings.html index a76f4de..541e9ca 100644 --- a/PresetSettings/prese-settings.html +++ b/PresetSettings/prese-settings.html @@ -10,7 +10,7 @@ overflow-y: auto; border: 1px solid #444; border-radius: 6px; - padding: 12px 12px 100px 12px; + padding: 12px 12px 150px 12px; background: #2a2a2a; } diff --git a/PresetSettings/prese_state.js b/PresetSettings/prese_state.js index 30ec597..9993522 100644 --- a/PresetSettings/prese_state.js +++ b/PresetSettings/prese_state.js @@ -202,7 +202,15 @@ export function loadActivePreset() { localStorage.setItem(SETTINGS_KEY, JSON.stringify(presetManager)); toastr.info("Amily2 提示词预设已自动更新以支持最新功能。"); } + const novelProcessorOrder = currentMixedOrder.novel_processor || []; + const hasChapterContent = novelProcessorOrder.some(item => item.type === 'conditional' && item.id === 'chapterContent'); + if (!hasChapterContent) { + console.log("Amily2: 检测到 novel_processor 缺少 chapterContent 条件块,正在执行迁移..."); + currentPresets.novel_processor = JSON.parse(JSON.stringify(defaultPrompts.novel_processor)); + currentMixedOrder.novel_processor = JSON.parse(JSON.stringify(defaultMixedOrder.novel_processor)); + isMigrated = true; + } } else { const firstPresetName = Object.keys(presetManager.presets)[0]; if (firstPresetName) { diff --git a/glossary/GT_bindings.js b/glossary/GT_bindings.js index 901efd2..a14f70d 100644 --- a/glossary/GT_bindings.js +++ b/glossary/GT_bindings.js @@ -1,7 +1,7 @@ import { extension_settings, getContext } from "/scripts/extensions.js"; import { saveSettingsDebounced, eventSource, event_types } from "/script.js"; -import { world_names } from "/scripts/world-info.js"; import { extensionName } from "../utils/settings.js"; +import { safeLorebooks } from '../core/tavernhelper-compatibility.js'; import { testSybdApiConnection, fetchSybdModels } from '../core/api/SybdApi.js'; import { handleFileUpload, processNovel } from './index.js'; import { SETTINGS_KEY as PRESET_SETTINGS_KEY } from '../PresetSettings/config.js'; @@ -542,29 +542,11 @@ function bindNovelProcessEvents() { } } -function isTavernHelperAvailable() { - return typeof window.TavernHelper !== 'undefined' && - window.TavernHelper !== null && - typeof window.TavernHelper.getLorebooks === 'function'; -} - -async function safeLorebooks() { - try { - if (isTavernHelperAvailable()) { - return await window.TavernHelper.getLorebooks(); - } - return [...world_names]; - } catch (error) { - console.error('[Amily2-兼容性] 获取世界书列表失败:', error); - return [...world_names]; - } -} async function loadWorldBooks() { const select = document.getElementById('novel-world-book-select'); if (!select) return; - const { extension_settings } = window; const savedBook = extension_settings[extensionName]?.selectedWorldBook; moduleState.selectedWorldBook = savedBook || ''; diff --git a/glossary/executor.js b/glossary/executor.js index 0288fd9..b4d2b22 100644 --- a/glossary/executor.js +++ b/glossary/executor.js @@ -2,8 +2,7 @@ import { callSybdAI } from '../core/api/SybdApi.js'; import { extensionName } from '../utils/settings.js'; import { getPresetPrompts, getMixedOrder } from '../PresetSettings/index.js'; import { generateRandomSeed } from '../core/api.js'; - -const { TavernHelper } = window; +import { safeLorebookEntries, safeUpdateLorebookEntries, compatibleWriteToLorebook } from '../core/tavernhelper-compatibility.js'; function buildContextFromEntries(entries) { if (!entries || entries.length === 0) { @@ -11,10 +10,10 @@ function buildContextFromEntries(entries) { } const mappedContent = entries.map(entry => { - if (!Array.isArray(entry.keyword) || entry.keyword.length < 2) { + if (!Array.isArray(entry.keys) || entry.keys.length < 2) { return null; } - const name = entry.keyword[1]; + const name = entry.keys[1]; return `[--START_TABLE--]\n[name]:${name}\n${entry.content}\n[--END_TABLE--]`; }).filter(Boolean).join('\n\n'); @@ -54,7 +53,7 @@ export async function executeNovelProcessing(processingState, updateStatusCallba throw new Error('请先在设置中选择一个目标世界书。'); } - const allEntries = (await TavernHelper.getLorebookEntries(bookName)) || []; + const allEntries = (await safeLorebookEntries(bookName)) || []; const managedEntries = allEntries.filter(e => e.comment?.startsWith('[Amily2小说处理]') || e.comment?.startsWith('[Amily2-Glossary]')); const localManagedEntries = [...managedEntries]; @@ -132,7 +131,7 @@ export async function executeNovelProcessing(processingState, updateStatusCallba keys = [`小说处理`, title, `第${nextPart}部分`]; const newEntryData = { keys, content, comment, enabled: true, order: 100, position: 'before_char' }; entriesToCreate.push(newEntryData); - localManagedEntries.push({ uid: -1, ...newEntryData, keyword: keys }); + localManagedEntries.push({ uid: -1, ...newEntryData, keys: keys }); nextPart++; continue; } @@ -150,19 +149,26 @@ export async function executeNovelProcessing(processingState, updateStatusCallba if (existingEntry) { entriesToUpdate.push({ uid: existingEntry.uid, ...loreData }); - Object.assign(existingEntry, { ...loreData, keyword: keys }); + Object.assign(existingEntry, { ...loreData, keys: keys }); } else { entriesToCreate.push(loreData); - localManagedEntries.push({ uid: -1, ...loreData, keyword: keys }); + localManagedEntries.push({ uid: -1, ...loreData, keys: keys }); } } if (entriesToUpdate.length > 0) { - await TavernHelper.setLorebookEntries(bookName, entriesToUpdate); + await safeUpdateLorebookEntries(bookName, entriesToUpdate); updateStatusCallback(`更新了 ${entriesToUpdate.length} 个世界书条目。`, 'info'); } if (entriesToCreate.length > 0) { - await TavernHelper.createLorebookEntries(bookName, entriesToCreate); + for (const entry of entriesToCreate) { + await compatibleWriteToLorebook(bookName, entry.comment, () => entry.content, { + keys: entry.keys, + isConstant: false, + insertion_position: 'before_char', + depth: 100, + }); + } updateStatusCallback(`创建了 ${entriesToCreate.length} 个新世界书条目。`, 'success'); }