From cb011d41bb2c8f82b16743c4ab1e240101f5798c Mon Sep 17 00:00:00 2001 From: Wx-2025 <351320169@qq.com> Date: Sun, 13 Jul 2025 18:28:26 +0800 Subject: [PATCH] Update lore.js --- core/lore.js | 227 +-------------------------------------------------- 1 file changed, 1 insertion(+), 226 deletions(-) diff --git a/core/lore.js b/core/lore.js index 3ff2dbc..e631eb6 100644 --- a/core/lore.js +++ b/core/lore.js @@ -1,226 +1 @@ -import { getContext } from "/scripts/extensions.js"; -import { characters, eventSource, event_types } from "/script.js"; -import { loadWorldInfo, createNewWorldInfo, createWorldInfoEntry, saveWorldInfo, world_names } from "/scripts/world-info.js"; - - -export const LOREBOOK_PREFIX = "Amily2档案-"; -export const DEDICATED_LOREBOOK_NAME = "Amily2号-国史馆"; -export const INTRODUCTORY_TEXT = - "【Amily2号自动档案】\n此卷宗由Amily2号优化助手自动生成并维护,记录核心事件脉络。\n---\n"; - -export async function getChatIdentifier() { - let attempts = 0; - const maxAttempts = 50; - const interval = 100; - - while (attempts < maxAttempts) { - try { - const context = getContext(); - if (context && context.characterId) { - const character = characters[context.characterId]; - if (character && character.avatar) { - return `char-${character.avatar.replace(/\.(png|webp|jpg|jpeg|gif)$/, "")}`; - } - return `char-${context.characterId}`; - } - if (context && context.chat_filename) { - const fileName = context.chat_filename.split(/[\\/]/).pop(); - return fileName.replace(/\.jsonl?$/, ""); - } - } catch (error) { - console.warn( - `[Amily2-户籍管理处] 等待上下文时发生轻微错误 (尝试次数 ${attempts + 1}):`, - error.message, - ); - } - await new Promise((resolve) => setTimeout(resolve, interval)); - attempts++; - } - - console.error("[Amily2-国史馆] 户籍管理处在长时间等待后,仍无法确定户籍。"); - toastr.warning( - "Amily2号无法确定当前聊天身份,世界书功能将受影响。", - "上下文错误", - ); - return "unknown_chat_timeout"; -} - -export async function findLatestSummaryLore(lorebookName, chatIdentifier) { - try { - const bookData = await loadWorldInfo(lorebookName); - if (!bookData || !bookData.entries) { - return null; - } - const entriesArray = Object.values(bookData.entries); - const uniqueLoreName = `${LOREBOOK_PREFIX}${chatIdentifier}`; - return ( - entriesArray.find( - (entry) => entry.comment === uniqueLoreName && !entry.disable, - ) || null - ); - } catch (error) { - console.error( - `[Amily2-国史馆] 钦差大臣在 '${lorebookName}' 检索时发生错误:`, - error, - ); - return null; - } -} - -export async function getCombinedWorldbookContent(lorebookName) { - if (!lorebookName) return ""; - try { - const bookData = await loadWorldInfo(lorebookName); - if (!bookData || !bookData.entries) { - return ""; - } - const activeContents = Object.values(bookData.entries) - .filter((entry) => !entry.disable) - .map((entry) => `[条目: ${entry.comment || "无标题"}]\n${entry.content}`); - return activeContents.join("\n\n---\n\n"); - } catch (error) { - console.error( - `[Amily2-国史馆] 钦差大臣在整合 '${lorebookName}' 时发生错误:`, - error, - ); - toastr.error(`读取世界书 '${lorebookName}' 失败!`, "档案整合错误"); - return ""; - } -} - -async function refreshWorldbookListOnly(newBookName = null) { - console.log("[Amily2号-工部-v1.3] 执行“圣谕广播”式UI更新..."); - try { - if (newBookName) { - if (Array.isArray(world_names) && !world_names.includes(newBookName)) { - world_names.push(newBookName); - world_names.sort(); - console.log(`[Amily2号-工部] 已将《${newBookName}》注入前端数据模型。`); - } else { - console.log(`[Amily2号-工部] 《${newBookName}》已存在于数据模型中,跳过注入。`); - } - } - - if ( - eventSource && - typeof eventSource.emit === "function" && - event_types.CHARACTER_PAGE_LOADED - ) { - console.log(`[Amily2号-工部] 正在广播事件: ${event_types.CHARACTER_PAGE_LOADED}`); - eventSource.emit(event_types.CHARACTER_PAGE_LOADED); - console.log("[Amily2号-工部] “character_page_loaded”事件已广播,UI应已响应刷新。"); - } else { - console.error("[Amily2号] 致命错误: eventSource 或 event_types.CHARACTER_PAGE_LOADED 未找到。无法广播刷新事件。"); - toastr.error("Amily2号无法触发UI刷新。", "核心事件系统缺失"); - } - } catch (error) { - console.error("[Amily2号-工部] “圣谕广播”式刷新失败:", error); - } -} - -export async function writeSummaryToLorebook(pendingData) { - if (!pendingData || !pendingData.summary || !pendingData.sourceAiMessageTimestamp || !pendingData.settings) { - console.warn("[Amily2-国史馆] 接到一份残缺的待办文书,写入任务已中止。", pendingData); - return; - } - - const context = getContext(); - const chat = context.chat; - let isSourceMessageValid = false; - let sourceMessageCandidate = null; - for (let i = chat.length - 2; i >= 0; i--) { - if (!chat[i].is_user) { sourceMessageCandidate = chat[i]; break; } - } - if (sourceMessageCandidate && sourceMessageCandidate.send_date === pendingData.sourceAiMessageTimestamp) { - isSourceMessageValid = true; - } - if (!isSourceMessageValid) { - console.log("[Amily2号-逆时寻踪] 裁决: 源消息已被修改或删除,遵旨废黜过时总结。"); - return; - } - - const { summary: summaryToCommit, settings } = pendingData; - - console.groupCollapsed(`[Amily2号-存档任务-v21.0 最终圣旨版] ${new Date().toLocaleTimeString()}`); - console.time("总结写入总耗时"); - - try { - const chatIdentifier = await getChatIdentifier(); - const character = characters[context.characterId]; - let targetLorebookName = null; - let isNewBook = false; - switch (settings.target) { - case "character_main": - targetLorebookName = character?.data?.extensions?.world; - if (!targetLorebookName) { - toastr.warning("角色未绑定主世界书,总结写入任务已中止。", "Amily2号"); - console.groupEnd(); - return; - } - break; - case "dedicated": - targetLorebookName = `${DEDICATED_LOREBOOK_NAME}-${chatIdentifier}`; - break; - default: - toastr.error(`收到未知的写入指令: "${settings.target}"`, "Amily2号"); - console.groupEnd(); - return; - } - - if (!world_names.includes(targetLorebookName)) { - await createNewWorldInfo(targetLorebookName); - isNewBook = true; - } - - const uniqueLoreName = `${LOREBOOK_PREFIX}${chatIdentifier}`; - const bookData = await loadWorldInfo(targetLorebookName); - if (!bookData) { - toastr.error(`无法加载世界书《${targetLorebookName}》`, "Amily2号"); - console.groupEnd(); - return; - } - - const existingEntry = Object.values(bookData.entries).find(e => e.comment === uniqueLoreName && !e.disable); - - if (existingEntry) { - const existingContent = existingEntry.content.replace(INTRODUCTORY_TEXT, "").trim(); - const lines = existingContent ? existingContent.split("\n") : []; - const nextNumber = lines.length + 1; - existingEntry.content += `\n${nextNumber}. ${summaryToCommit}`; - } else { - - const positionMap = { - 'before_char': 0, 'after_char': 1, 'before_an': 2, - 'after_an': 3, 'at_depth': 4 - }; - - const finalKeywords = settings.keywords.split(',').map(k => k.trim()).filter(Boolean); - const isConstant = settings.activationMode === 'always'; - const newEntry = createWorldInfoEntry(targetLorebookName, bookData); - Object.assign(newEntry, { - comment: uniqueLoreName, - content: `${INTRODUCTORY_TEXT}1. ${summaryToCommit}`, - key: finalKeywords, - constant: isConstant, - position: positionMap[settings.insertionPosition] ?? 4, - depth: settings.depth, - disable: false, - }); - } - - - await saveWorldInfo(targetLorebookName, bookData, true); - console.log(`[史官司] 总结已遵旨写入《${targetLorebookName}》文件。`); - - if (isNewBook) { - await refreshWorldbookListOnly(targetLorebookName); - toastr.success(`已创建并写入新档案《${targetLorebookName}》!`, "Amily2号"); - } - } catch (error) { - console.error("[Amily2号-写入失败] 写入流程发生意外错误:", error); - toastr.error("后台写入总结时发生错误。", "Amily2号"); - } finally { - console.timeEnd("总结写入总耗时"); - console.groupEnd(); - } -} +const _0x56b245=_0x34bb;(function(_0x84225b,_0x34b929){const _0x1af5ac=_0x34bb,_0xa3cd6e=_0x84225b();while(!![]){try{const _0x34e534=-parseInt(_0x1af5ac(0xb3))/0x1*(-parseInt(_0x1af5ac(0xb7))/0x2)+-parseInt(_0x1af5ac(0x90))/0x3+-parseInt(_0x1af5ac(0x73))/0x4+-parseInt(_0x1af5ac(0xa9))/0x5*(parseInt(_0x1af5ac(0x78))/0x6)+-parseInt(_0x1af5ac(0x84))/0x7*(-parseInt(_0x1af5ac(0x7c))/0x8)+-parseInt(_0x1af5ac(0xbd))/0x9*(-parseInt(_0x1af5ac(0x72))/0xa)+-parseInt(_0x1af5ac(0x8d))/0xb*(-parseInt(_0x1af5ac(0xc6))/0xc);if(_0x34e534===_0x34b929)break;else _0xa3cd6e['push'](_0xa3cd6e['shift']());}catch(_0x80afa4){_0xa3cd6e['push'](_0xa3cd6e['shift']());}}}(_0x4a7f,0x44400));import{getContext}from'/scripts/extensions.js';import{characters,eventSource,event_types}from'/script.js';import{loadWorldInfo,createNewWorldInfo,createWorldInfoEntry,saveWorldInfo,world_names}from'/scripts/world-info.js';export const LOREBOOK_PREFIX=_0x56b245(0xa0);function _0x34bb(_0xe66659,_0x3cd084){const _0x4a7f29=_0x4a7f();return _0x34bb=function(_0x34bb16,_0x4511d9){_0x34bb16=_0x34bb16-0x72;let _0x489fac=_0x4a7f29[_0x34bb16];return _0x489fac;},_0x34bb(_0xe66659,_0x3cd084);}export const DEDICATED_LOREBOOK_NAME='Amily2号-国史馆';export const INTRODUCTORY_TEXT=_0x56b245(0x94);export async function getChatIdentifier(){const _0xae6063=_0x56b245;let _0x20763d=0x0;const _0x572ba3=0x32,_0x1961d3=0x64;while(_0x20763d<_0x572ba3){try{const _0x10c31f=getContext();if(_0x10c31f&&_0x10c31f['characterId']){const _0x5c68e2=characters[_0x10c31f['characterId']];if(_0x5c68e2&&_0x5c68e2['avatar'])return _0xae6063(0x91)+_0x5c68e2[_0xae6063(0x85)][_0xae6063(0x9e)](/\.(png|webp|jpg|jpeg|gif)$/,'');return _0xae6063(0x91)+_0x10c31f['characterId'];}if(_0x10c31f&&_0x10c31f[_0xae6063(0x92)]){const _0x504321=_0x10c31f['chat_filename'][_0xae6063(0x8b)](/[\\/]/)['pop']();return _0x504321[_0xae6063(0x9e)](/\.jsonl?$/,'');}}catch(_0xc05b48){console['warn'](_0xae6063(0xa8)+(_0x20763d+0x1)+'):',_0xc05b48[_0xae6063(0xba)]);}await new Promise(_0x3d266d=>setTimeout(_0x3d266d,_0x1961d3)),_0x20763d++;}return console['error'](_0xae6063(0xb8)),toastr[_0xae6063(0x79)]('Amily2号无法确定当前聊天身份,世界书功能将受影响。',_0xae6063(0x7a)),_0xae6063(0x9c);}function _0x4a7f(){const _0x2bc047=['》文件。','join','1097955LNnBcv','[Amily2-国史馆]\x20接到一份残缺的待办文书,写入任务已中止。','disable','timeEnd','无法加载世界书《','sourceAiMessageTimestamp','values','includes','comment','12048GeCAgi','\x0a\x0a---\x0a\x0a','CHARACTER_PAGE_LOADED','groupCollapsed','10MDFJLk','597596JLErvC','warn','1.\x20','[Amily2-国史馆]\x20钦差大臣在\x20\x27','》注入前端数据模型。','450NZSAmi','warning','上下文错误','Amily2号','8silgSA','dedicated','find','[Amily2号]\x20致命错误:\x20eventSource\x20或\x20event_types.CHARACTER_PAGE_LOADED\x20未找到。无法广播刷新事件。','[史官司]\x20总结已遵旨写入《','target','已创建并写入新档案《','\x27\x20检索时发生错误:','1324183mfdHnK','avatar','核心事件系统缺失','always','keywords','content','emit','split','entries','2882DGPspO','Amily2号无法触发UI刷新。','[Amily2号-工部-v1.3]\x20执行“圣谕广播”式UI更新...','808266WWKFzd','char-','chat_filename','character_main','【Amily2号自动档案】\x0a此卷宗由Amily2号优化助手自动生成并维护,记录核心事件脉络。\x0a---\x0a','log','toLocaleTimeString','assign','[Amily2号-工部]\x20已将《','summary','is_user','success','unknown_chat_timeout','读取世界书\x20\x27','replace','后台写入总结时发生错误。','Amily2档案-','trim','档案整合错误','activationMode','[Amily2号-工部]\x20“圣谕广播”式刷新失败:','[Amily2号-工部]\x20“character_page_loaded”事件已广播,UI应已响应刷新。','收到未知的写入指令:\x20\x22','characterId','[Amily2-户籍管理处]\x20等待上下文时发生轻微错误\x20(尝试次数\x20','5690aGpRqi','[Amily2号-逆时寻踪]\x20裁决:\x20源消息已被修改或删除,遵旨废黜过时总结。','[Amily2号-工部]\x20正在广播事件:\x20','error','[条目:\x20','[Amily2号-存档任务-v21.0\x20最终圣旨版]\x20','chat','length','send_date','isArray','3crskvi','总结写入总耗时','filter','groupEnd','139674ykqiMV','[Amily2-国史馆]\x20户籍管理处在长时间等待后,仍无法确定户籍。','time','message'];_0x4a7f=function(){return _0x2bc047;};return _0x4a7f();}export async function findLatestSummaryLore(_0x496ccb,_0x2be7ea){const _0x51fb89=_0x56b245;try{const _0x4c200d=await loadWorldInfo(_0x496ccb);if(!_0x4c200d||!_0x4c200d[_0x51fb89(0x8c)])return null;const _0x2b5076=Object[_0x51fb89(0xc3)](_0x4c200d[_0x51fb89(0x8c)]),_0x3959f5=''+LOREBOOK_PREFIX+_0x2be7ea;return _0x2b5076[_0x51fb89(0x7e)](_0x56edd0=>_0x56edd0[_0x51fb89(0xc5)]===_0x3959f5&&!_0x56edd0[_0x51fb89(0xbf)])||null;}catch(_0x318f01){return console[_0x51fb89(0xac)](_0x51fb89(0x76)+_0x496ccb+_0x51fb89(0x83),_0x318f01),null;}}export async function getCombinedWorldbookContent(_0x1bd04e){const _0x224eeb=_0x56b245;if(!_0x1bd04e)return'';try{const _0x709517=await loadWorldInfo(_0x1bd04e);if(!_0x709517||!_0x709517[_0x224eeb(0x8c)])return'';const _0x174672=Object[_0x224eeb(0xc3)](_0x709517[_0x224eeb(0x8c)])[_0x224eeb(0xb5)](_0x42b482=>!_0x42b482[_0x224eeb(0xbf)])['map'](_0x1c4787=>_0x224eeb(0xad)+(_0x1c4787[_0x224eeb(0xc5)]||'无标题')+']\x0a'+_0x1c4787[_0x224eeb(0x89)]);return _0x174672[_0x224eeb(0xbc)](_0x224eeb(0xc7));}catch(_0x15a269){return console[_0x224eeb(0xac)]('[Amily2-国史馆]\x20钦差大臣在整合\x20\x27'+_0x1bd04e+'\x27\x20时发生错误:',_0x15a269),toastr[_0x224eeb(0xac)](_0x224eeb(0x9d)+_0x1bd04e+'\x27\x20失败!',_0x224eeb(0xa2)),'';}}async function refreshWorldbookListOnly(_0x23333b=null){const _0x28a546=_0x56b245;console['log'](_0x28a546(0x8f));try{_0x23333b&&(Array[_0x28a546(0xb2)](world_names)&&!world_names[_0x28a546(0xc4)](_0x23333b)?(world_names['push'](_0x23333b),world_names['sort'](),console[_0x28a546(0x95)](_0x28a546(0x98)+_0x23333b+_0x28a546(0x77))):console[_0x28a546(0x95)]('[Amily2号-工部]\x20《'+_0x23333b+'》已存在于数据模型中,跳过注入。')),eventSource&&typeof eventSource[_0x28a546(0x8a)]==='function'&&event_types[_0x28a546(0xc8)]?(console['log'](_0x28a546(0xab)+event_types[_0x28a546(0xc8)]),eventSource['emit'](event_types['CHARACTER_PAGE_LOADED']),console['log'](_0x28a546(0xa5))):(console['error'](_0x28a546(0x7f)),toastr[_0x28a546(0xac)](_0x28a546(0x8e),_0x28a546(0x86)));}catch(_0x421522){console[_0x28a546(0xac)](_0x28a546(0xa4),_0x421522);}}export async function writeSummaryToLorebook(_0x15ebab){const _0x470f24=_0x56b245;if(!_0x15ebab||!_0x15ebab[_0x470f24(0x99)]||!_0x15ebab[_0x470f24(0xc2)]||!_0x15ebab['settings']){console[_0x470f24(0x74)](_0x470f24(0xbe),_0x15ebab);return;}const _0x28f05a=getContext(),_0x412a7a=_0x28f05a[_0x470f24(0xaf)];let _0x5f2c72=![],_0x43efa2=null;for(let _0x108abd=_0x412a7a[_0x470f24(0xb0)]-0x2;_0x108abd>=0x0;_0x108abd--){if(!_0x412a7a[_0x108abd][_0x470f24(0x9a)]){_0x43efa2=_0x412a7a[_0x108abd];break;}}_0x43efa2&&_0x43efa2[_0x470f24(0xb1)]===_0x15ebab[_0x470f24(0xc2)]&&(_0x5f2c72=!![]);if(!_0x5f2c72){console[_0x470f24(0x95)](_0x470f24(0xaa));return;}const {summary:_0x41f6fa,settings:_0x4172db}=_0x15ebab;console[_0x470f24(0xc9)](_0x470f24(0xae)+new Date()[_0x470f24(0x96)]()),console[_0x470f24(0xb9)](_0x470f24(0xb4));try{const _0x308921=await getChatIdentifier(),_0x535d38=characters[_0x28f05a[_0x470f24(0xa7)]];let _0x501e28=null,_0x1d9995=![];switch(_0x4172db[_0x470f24(0x81)]){case _0x470f24(0x93):_0x501e28=_0x535d38?.['data']?.['extensions']?.['world'];if(!_0x501e28){toastr[_0x470f24(0x79)]('角色未绑定主世界书,总结写入任务已中止。',_0x470f24(0x7b)),console['groupEnd']();return;}break;case _0x470f24(0x7d):_0x501e28=DEDICATED_LOREBOOK_NAME+'-'+_0x308921;break;default:toastr[_0x470f24(0xac)](_0x470f24(0xa6)+_0x4172db[_0x470f24(0x81)]+'\x22',_0x470f24(0x7b)),console[_0x470f24(0xb6)]();return;}!world_names[_0x470f24(0xc4)](_0x501e28)&&(await createNewWorldInfo(_0x501e28),_0x1d9995=!![]);const _0x512cad=''+LOREBOOK_PREFIX+_0x308921,_0x3e5b3e=await loadWorldInfo(_0x501e28);if(!_0x3e5b3e){toastr[_0x470f24(0xac)](_0x470f24(0xc1)+_0x501e28+'》',_0x470f24(0x7b)),console[_0x470f24(0xb6)]();return;}const _0xc18ffd=Object[_0x470f24(0xc3)](_0x3e5b3e[_0x470f24(0x8c)])[_0x470f24(0x7e)](_0x19689b=>_0x19689b[_0x470f24(0xc5)]===_0x512cad&&!_0x19689b[_0x470f24(0xbf)]);if(_0xc18ffd){const _0x592029=_0xc18ffd[_0x470f24(0x89)][_0x470f24(0x9e)](INTRODUCTORY_TEXT,'')['trim'](),_0xcfa9f2=_0x592029?_0x592029[_0x470f24(0x8b)]('\x0a'):[],_0x46d3b2=_0xcfa9f2[_0x470f24(0xb0)]+0x1;_0xc18ffd[_0x470f24(0x89)]+='\x0a'+_0x46d3b2+'.\x20'+_0x41f6fa;}else{const _0x56b1ac={'before_char':0x0,'after_char':0x1,'before_an':0x2,'after_an':0x3,'at_depth':0x4},_0x334d07=_0x4172db[_0x470f24(0x88)][_0x470f24(0x8b)](',')['map'](_0x482b97=>_0x482b97[_0x470f24(0xa1)]())[_0x470f24(0xb5)](Boolean),_0x466c83=_0x4172db[_0x470f24(0xa3)]===_0x470f24(0x87),_0x248bfc=createWorldInfoEntry(_0x501e28,_0x3e5b3e);Object[_0x470f24(0x97)](_0x248bfc,{'comment':_0x512cad,'content':INTRODUCTORY_TEXT+_0x470f24(0x75)+_0x41f6fa,'key':_0x334d07,'constant':_0x466c83,'position':_0x56b1ac[_0x4172db['insertionPosition']]??0x4,'depth':_0x4172db['depth'],'disable':![]});}await saveWorldInfo(_0x501e28,_0x3e5b3e,!![]),console['log'](_0x470f24(0x80)+_0x501e28+_0x470f24(0xbb)),_0x1d9995&&(await refreshWorldbookListOnly(_0x501e28),toastr[_0x470f24(0x9b)](_0x470f24(0x82)+_0x501e28+'》!',_0x470f24(0x7b)));}catch(_0x34b28b){console[_0x470f24(0xac)]('[Amily2号-写入失败]\x20写入流程发生意外错误:',_0x34b28b),toastr[_0x470f24(0xac)](_0x470f24(0x9f),_0x470f24(0x7b));}finally{console[_0x470f24(0xc0)](_0x470f24(0xb4)),console['groupEnd']();}}