mirror of
https://github.com/Wx-2025/ST-Amily2-Chat-Optimisation.git
synced 2026-06-06 12:45:51 +00:00
Compare commits
3 Commits
2c3072a3d8
...
08e1dbde85
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
08e1dbde85 | ||
|
|
42e0bdec19 | ||
|
|
3e217e8ed8 |
@@ -26,3 +26,23 @@
|
|||||||
- NGMS / NCCS API 配置槽位标签修正(NGMS→总结,NCCS→填表)
|
- NGMS / NCCS API 配置槽位标签修正(NGMS→总结,NCCS→填表)
|
||||||
- API Profile 面板选择逻辑统一重构,修复多处旧字段覆盖新配置的问题
|
- API Profile 面板选择逻辑统一重构,修复多处旧字段覆盖新配置的问题
|
||||||
- 世界书控制参数兼容性修复(排除递归、插入位置、扫描深度等,适配 ST 1.17.0+)
|
- 世界书控制参数兼容性修复(排除递归、插入位置、扫描深度等,适配 ST 1.17.0+)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## v2.2.3
|
||||||
|
|
||||||
|
### 新功能
|
||||||
|
|
||||||
|
- Function Call 填表开关下方新增公益站风险提示横幅:部分公益站会屏蔽 tools 参数,请确认支持情况避免被意外封禁
|
||||||
|
|
||||||
|
### 修复
|
||||||
|
|
||||||
|
- **Function Call 填表**:
|
||||||
|
- 修复 ST 代理以 HTTP 200 + error body 形式返回错误、导致降级重试机制从未触发的问题
|
||||||
|
- 修复思考模式模型(如 DeepSeek v4-flash)因 tool_choice 不兼容返回 Bad Request 后正确降级并重试
|
||||||
|
- 重试时自动追加强制调用指令,防止思考模型绕过工具直接输出文本造成无效二次开销
|
||||||
|
- **超级记忆 / 翰林院**:
|
||||||
|
- 修复 `getRagSettings()` 读写顶层路径而非嵌套路径,导致打开超级记忆面板后向量化、归档等开关在重载时被全默认值覆盖的问题
|
||||||
|
- 修复自动归档失效问题
|
||||||
|
- 修复归档管理器在同一事件中被三次触发的回归问题
|
||||||
|
- 修复翰林院设置旧版迁移逻辑异常
|
||||||
|
|||||||
@@ -36,47 +36,12 @@
|
|||||||
<!-- API Settings Tab -->
|
<!-- API Settings Tab -->
|
||||||
<div id="sinan-api-settings-tab" class="sinan-tab-pane active">
|
<div id="sinan-api-settings-tab" class="sinan-tab-pane active">
|
||||||
<fieldset class="settings-group">
|
<fieldset class="settings-group">
|
||||||
<legend>Jqyh API</legend>
|
<legend>剧情优化 API</legend>
|
||||||
<div class="control-block-with-switch">
|
<p class="notes" style="margin: 0;">
|
||||||
<label for="amily2_jqyh_enabled"><strong>启用 Jqyh API</strong></label>
|
剧情优化所用的连接配置统一在
|
||||||
<label class="toggle-switch">
|
<strong>API 连接配置 → 功能分配 → 剧情优化 / JQYH</strong>
|
||||||
<input id="amily2_jqyh_enabled" type="checkbox" />
|
中指定,无需在此单独填写。
|
||||||
<span class="slider"></span>
|
</p>
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
<div id="amily2_jqyh_content" style="display: none;" class="inline-settings-grid">
|
|
||||||
<label for="amily2_jqyh_api_mode">API 模式</label>
|
|
||||||
<select id="amily2_jqyh_api_mode" class="text_pole">
|
|
||||||
<option value="openai_test">全兼容模式</option>
|
|
||||||
<option value="sillytavern_preset">SillyTavern 预设</option>
|
|
||||||
</select>
|
|
||||||
|
|
||||||
<div id="amily2_jqyh_compatible_config" class="inline-settings-grid" style="grid-column: 1 / -1;">
|
|
||||||
<label for="amily2_jqyh_api_url">API URL</label>
|
|
||||||
<input type="text" id="amily2_jqyh_api_url" class="text_pole" placeholder="例如: https://api.openai.com/v1">
|
|
||||||
<label for="amily2_jqyh_api_key">API Key</label>
|
|
||||||
<input type="password" id="amily2_jqyh_api_key" class="text_pole" placeholder="请输入您的 API Key">
|
|
||||||
<label for="amily2_jqyh_model">模型</label>
|
|
||||||
<div class="amily2_opt_preset_selector_wrapper">
|
|
||||||
<input type="text" id="amily2_jqyh_model" class="text_pole" placeholder="请先获取模型列表或手动输入">
|
|
||||||
<select id="amily2_jqyh_model_select" class="text_pole" style="display: none;"></select>
|
|
||||||
</div>
|
|
||||||
<div class="jqyh-button-row" style="grid-column: 1 / -1;">
|
|
||||||
<button id="amily2_jqyh_fetch_models" class="menu_button secondary" title="获取模型列表"><i class="fas fa-sync-alt"></i> 获取模型</button>
|
|
||||||
<button id="amily2_jqyh_test_connection" class="menu_button primary"><i class="fas fa-plug"></i> 测试连接</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div id="amily2_jqyh_preset_config" class="inline-settings-grid" style="display: none; grid-column: 1 / -1;">
|
|
||||||
<label for="amily2_jqyh_tavern_profile">选择酒馆预设</label>
|
|
||||||
<select id="amily2_jqyh_tavern_profile" class="text_pole"></select>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<label for="amily2_jqyh_max_tokens">最大 Tokens: <span id="amily2_jqyh_max_tokens_value">4000</span></label>
|
|
||||||
<input type="number" class="text_pole" id="amily2_jqyh_max_tokens" min="100" max="100000" value="4000">
|
|
||||||
<label for="amily2_jqyh_temperature">温度: <span id="amily2_jqyh_temperature_value">0.7</span></label>
|
|
||||||
<input type="number" class="text_pole" id="amily2_jqyh_temperature" min="0" max="2" value="0.7">
|
|
||||||
</div>
|
|
||||||
</fieldset>
|
</fieldset>
|
||||||
|
|
||||||
<fieldset class="settings-group">
|
<fieldset class="settings-group">
|
||||||
|
|||||||
@@ -304,7 +304,10 @@
|
|||||||
<span class="slider"></span>
|
<span class="slider"></span>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<p class="notes" style="margin-bottom: 10px;">仅支持 openai 直连接口(tableFilling 槽位)。启用后跳过 <Amily2Edit> 文本解析,由模型直接返回操作列表。</p>
|
<p class="notes" style="margin-bottom: 6px;">仅支持 openai 直连接口(tableFilling 槽位)。启用后跳过 <Amily2Edit> 文本解析,由模型直接返回操作列表。</p>
|
||||||
|
<div style="background: rgba(255, 160, 0, 0.12); border-left: 3px solid #ffa000; border-radius: 3px; padding: 6px 10px; margin-bottom: 10px; font-size: 0.85em; color: #ffcc80;">
|
||||||
|
⚠️ 部分公益站因禁止用于跑代码会屏蔽 tools 参数,请确认公益站是否支持 tools 调用,避免被意外封禁。
|
||||||
|
</div>
|
||||||
|
|
||||||
<hr class="section-divider" style="margin: 10px 0;">
|
<hr class="section-divider" style="margin: 10px 0;">
|
||||||
|
|
||||||
|
|||||||
@@ -485,8 +485,7 @@ export async function getApiSettings(slot = 'main') {
|
|||||||
apiProvider: apiMode,
|
apiProvider: apiMode,
|
||||||
apiUrl: settings.plotOpt_apiUrl?.trim() || '',
|
apiUrl: settings.plotOpt_apiUrl?.trim() || '',
|
||||||
apiKey: configManager.get('plotOpt_apiKey') || '',
|
apiKey: configManager.get('plotOpt_apiKey') || '',
|
||||||
model: document.getElementById('amily2_opt_model')?.value?.trim()
|
model: settings.plotOpt_model || '',
|
||||||
|| settings.plotOpt_model || '',
|
|
||||||
maxTokens: settings.plotOpt_max_tokens ?? 65500,
|
maxTokens: settings.plotOpt_max_tokens ?? 65500,
|
||||||
temperature: settings.plotOpt_temperature ?? 1.0,
|
temperature: settings.plotOpt_temperature ?? 1.0,
|
||||||
tavernProfile: '',
|
tavernProfile: '',
|
||||||
|
|||||||
@@ -10,8 +10,16 @@ export function initializeArchiveManager() {
|
|||||||
console.log('[归档管理器] 已启动,正在监控表格状态...');
|
console.log('[归档管理器] 已启动,正在监控表格状态...');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Bus 直调路径:由 super-memory/manager.js 的 pushUpdate 调用,接受纯 payload 对象。 */
|
||||||
|
export function handleArchiveUpdate(payload) {
|
||||||
|
return handleArchivePayload(payload);
|
||||||
|
}
|
||||||
|
|
||||||
async function handleTableUpdate(event) {
|
async function handleTableUpdate(event) {
|
||||||
const { tableName, data, role } = event.detail;
|
return handleArchivePayload(event.detail);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function handleArchivePayload({ tableName, data, role }) {
|
||||||
const settings = getSettings();
|
const settings = getSettings();
|
||||||
|
|
||||||
if (!settings.archive || !settings.archive.enabled) return;
|
if (!settings.archive || !settings.archive.enabled) return;
|
||||||
@@ -24,6 +32,7 @@ async function handleTableUpdate(event) {
|
|||||||
if (isArchiving) return;
|
if (isArchiving) return;
|
||||||
|
|
||||||
let hasNotice = false;
|
let hasNotice = false;
|
||||||
|
let realRows = data;
|
||||||
|
|
||||||
if (data.length > 0 && data[0][2] && data[0][2].includes('已自动归档')) {
|
if (data.length > 0 && data[0][2] && data[0][2].includes('已自动归档')) {
|
||||||
hasNotice = true;
|
hasNotice = true;
|
||||||
|
|||||||
@@ -342,6 +342,11 @@ function getSettings() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 旧版设置 rerank.priorityRetrieval 可能只有 enabled 字段而缺少 sources,补全
|
||||||
|
if (s.rerank?.priorityRetrieval && !s.rerank.priorityRetrieval.sources) {
|
||||||
|
s.rerank.priorityRetrieval.sources = structuredClone(ragDefaultSettings.rerank.priorityRetrieval.sources);
|
||||||
|
}
|
||||||
|
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,6 @@ import { resolveHistoriographyRuleConfig } from "../utils/config/RuleProfileMana
|
|||||||
|
|
||||||
import { getPresetPrompts, getMixedOrder } from '../PresetSettings/index.js';
|
import { getPresetPrompts, getMixedOrder } from '../PresetSettings/index.js';
|
||||||
import { callAI, generateRandomSeed } from './api.js';
|
import { callAI, generateRandomSeed } from './api.js';
|
||||||
import { callJqyhAI } from './api/JqyhApi.js';
|
|
||||||
import { callConcurrentAI } from './api/ConcurrentApi.js';
|
import { callConcurrentAI } from './api/ConcurrentApi.js';
|
||||||
|
|
||||||
export async function processOptimization(latestMessage, previousMessages) {
|
export async function processOptimization(latestMessage, previousMessages) {
|
||||||
@@ -480,7 +479,7 @@ export async function processPlotOptimization(currentUserMessage, contextMessage
|
|||||||
onProgress(getRandomText(['正在检索辅助记忆 (LLM-B)...', '正在扫描平行世界线 (LLM-B)...']), false);
|
onProgress(getRandomText(['正在检索辅助记忆 (LLM-B)...', '正在扫描平行世界线 (LLM-B)...']), false);
|
||||||
|
|
||||||
onProgress(getRandomText(['正在与核心意识同步 (LLM-A)...', '正在等待灵魂共鸣 (LLM-A)...']), false);
|
onProgress(getRandomText(['正在与核心意识同步 (LLM-A)...', '正在等待灵魂共鸣 (LLM-A)...']), false);
|
||||||
const promise1 = (settings.jqyhEnabled ? callJqyhAI(mainMessages) : callAI(mainMessages, { slot: 'plotOpt' })).then(res => {
|
const promise1 = callAI(mainMessages, { slot: 'plotOpt' }).then(res => {
|
||||||
onProgress(getRandomText(['正在与核心意识同步 (LLM-A)...', '正在等待灵魂共鸣 (LLM-A)...']), true);
|
onProgress(getRandomText(['正在与核心意识同步 (LLM-A)...', '正在等待灵魂共鸣 (LLM-A)...']), true);
|
||||||
return res;
|
return res;
|
||||||
});
|
});
|
||||||
@@ -554,7 +553,7 @@ export async function processPlotOptimization(currentUserMessage, contextMessage
|
|||||||
attempt++;
|
attempt++;
|
||||||
console.log(`[${extensionName}] 剧情优化第 ${attempt} 次尝试...`);
|
console.log(`[${extensionName}] 剧情优化第 ${attempt} 次尝试...`);
|
||||||
|
|
||||||
const rawResponse = settings.jqyhEnabled ? await callJqyhAI(mainMessages) : await callAI(mainMessages, { slot: 'plotOpt' });
|
const rawResponse = await callAI(mainMessages, { slot: 'plotOpt' });
|
||||||
|
|
||||||
if (cancellationState.isCancelled) {
|
if (cancellationState.isCancelled) {
|
||||||
console.log(`[${extensionName}] 优化任务在API调用后被中止。`);
|
console.log(`[${extensionName}] 优化任务在API调用后被中止。`);
|
||||||
|
|||||||
@@ -9,10 +9,11 @@ const RAG_MODULE_NAME = 'hanlinyuan-rag-core';
|
|||||||
|
|
||||||
function getRagSettings() {
|
function getRagSettings() {
|
||||||
if (!extension_settings[extensionName]) extension_settings[extensionName] = {};
|
if (!extension_settings[extensionName]) extension_settings[extensionName] = {};
|
||||||
if (!extension_settings[RAG_MODULE_NAME]) {
|
const root = extension_settings[extensionName];
|
||||||
extension_settings[RAG_MODULE_NAME] = structuredClone(ragDefaultSettings);
|
if (!root[RAG_MODULE_NAME]) {
|
||||||
|
root[RAG_MODULE_NAME] = structuredClone(ragDefaultSettings);
|
||||||
}
|
}
|
||||||
return extension_settings[RAG_MODULE_NAME];
|
return root[RAG_MODULE_NAME];
|
||||||
}
|
}
|
||||||
|
|
||||||
export function bindSuperMemoryEvents() {
|
export function bindSuperMemoryEvents() {
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import { syncToLorebook, ensureMemoryBook, updateTransientHint, getMemoryBookNam
|
|||||||
import { getMemoryState, loadMemoryState, saveMemoryState } from "../table-system/manager.js";
|
import { getMemoryState, loadMemoryState, saveMemoryState } from "../table-system/manager.js";
|
||||||
import { TABLE_UPDATED_EVENT } from "../table-system/events-schema.js";
|
import { TABLE_UPDATED_EVENT } from "../table-system/events-schema.js";
|
||||||
import { eventSource, event_types } from "/script.js";
|
import { eventSource, event_types } from "/script.js";
|
||||||
|
import { handleArchiveUpdate } from "../archive-manager.js";
|
||||||
|
|
||||||
/* ── [AMILY2-MODIFIED] ── pipeline integration: awaitSync() export ── */
|
/* ── [AMILY2-MODIFIED] ── pipeline integration: awaitSync() export ── */
|
||||||
let isInitialized = false;
|
let isInitialized = false;
|
||||||
@@ -110,10 +111,15 @@ export function pushUpdate(payload) {
|
|||||||
|
|
||||||
updateQueue.push({ tableName, data, role, headers, rowStatuses });
|
updateQueue.push({ tableName, data, role, headers, rowStatuses });
|
||||||
_syncPromise = processQueue();
|
_syncPromise = processQueue();
|
||||||
|
|
||||||
|
// Bus 路径下 document event 不再分发,需直接通知归档管理器
|
||||||
|
handleArchiveUpdate(payload);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** CustomEvent 降级路径(Bus 未就绪时的兜底监听器) */
|
/** CustomEvent 降级路径(Bus 未就绪时的兜底监听器) */
|
||||||
function handleTableUpdate(event) {
|
function handleTableUpdate(event) {
|
||||||
|
// Bus 已就绪时 pushUpdate 已由 dispatchTableUpdate 直调,跳过避免重复处理
|
||||||
|
if (window.Amily2Bus?.query('SuperMemory')?.pushUpdate) return;
|
||||||
pushUpdate(event.detail);
|
pushUpdate(event.detail);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "Amily2号聊天优化助手",
|
"name": "Amily2号聊天优化助手",
|
||||||
"display_name": "Amily2号助手",
|
"display_name": "Amily2号助手",
|
||||||
"version": "2.2.2",
|
"version": "2.2.3",
|
||||||
"author": "Wx-2025",
|
"author": "Wx-2025",
|
||||||
"description": "一个拥有独立UI的智能引擎,正文优化、自动总结、记忆表格、rag向量、隐藏楼层、剧情推进等多功能整合。",
|
"description": "一个拥有独立UI的智能引擎,正文优化、自动总结、记忆表格、rag向量、隐藏楼层、剧情推进等多功能整合。",
|
||||||
"minSillyTavernVersion": "1.10.0",
|
"minSillyTavernVersion": "1.10.0",
|
||||||
|
|||||||
@@ -674,7 +674,7 @@ export function loadSettingsToUI() {
|
|||||||
|
|
||||||
const sources = ['novel', 'chat_history', 'lorebook', 'manual'];
|
const sources = ['novel', 'chat_history', 'lorebook', 'manual'];
|
||||||
sources.forEach(source => {
|
sources.forEach(source => {
|
||||||
const sourceSettings = prioritySettings.sources[source];
|
const sourceSettings = prioritySettings.sources?.[source];
|
||||||
if (sourceSettings) {
|
if (sourceSettings) {
|
||||||
const enabledCheckbox = document.querySelector(`[data-setting-key="rerank.priorityRetrieval.sources.${source}.enabled"]`);
|
const enabledCheckbox = document.querySelector(`[data-setting-key="rerank.priorityRetrieval.sources.${source}.enabled"]`);
|
||||||
const countInput = document.querySelector(`[data-setting-key="rerank.priorityRetrieval.sources.${source}.count"]`);
|
const countInput = document.querySelector(`[data-setting-key="rerank.priorityRetrieval.sources.${source}.count"]`);
|
||||||
|
|||||||
@@ -8,7 +8,6 @@
|
|||||||
import { extension_settings, getContext } from "/scripts/extensions.js";
|
import { extension_settings, getContext } from "/scripts/extensions.js";
|
||||||
import { characters, this_chid, getRequestHeaders, saveSettingsDebounced, eventSource, event_types } from "/script.js";
|
import { characters, this_chid, getRequestHeaders, saveSettingsDebounced, eventSource, event_types } from "/script.js";
|
||||||
import { defaultSettings, extensionName } from "../utils/settings.js";
|
import { defaultSettings, extensionName } from "../utils/settings.js";
|
||||||
import { testJqyhApiConnection, fetchJqyhModels } from '../core/api/JqyhApi.js';
|
|
||||||
import { testConcurrentApiConnection, fetchConcurrentModels } from '../core/api/ConcurrentApi.js';
|
import { testConcurrentApiConnection, fetchConcurrentModels } from '../core/api/ConcurrentApi.js';
|
||||||
import { safeLorebooks, safeCharLorebooks, safeLorebookEntries } from "../core/tavernhelper-compatibility.js";
|
import { safeLorebooks, safeCharLorebooks, safeLorebookEntries } from "../core/tavernhelper-compatibility.js";
|
||||||
import { createDrawer } from '../ui/drawer.js';
|
import { createDrawer } from '../ui/drawer.js';
|
||||||
@@ -45,30 +44,6 @@ function opt_toCamelCase(str) {
|
|||||||
return str.replace(/[-_]([a-z])/g, (g) => g[1].toUpperCase());
|
return str.replace(/[-_]([a-z])/g, (g) => g[1].toUpperCase());
|
||||||
}
|
}
|
||||||
|
|
||||||
function opt_updateApiUrlVisibility(panel, apiMode) {
|
|
||||||
const customApiSettings = panel.find('#amily2_opt_custom_api_settings_block');
|
|
||||||
const tavernProfileSettings = panel.find('#amily2_opt_tavern_api_profile_block');
|
|
||||||
const apiUrlInput = panel.find('#amily2_opt_api_url');
|
|
||||||
|
|
||||||
customApiSettings.hide();
|
|
||||||
tavernProfileSettings.hide();
|
|
||||||
|
|
||||||
if (apiMode === 'tavern') {
|
|
||||||
tavernProfileSettings.show();
|
|
||||||
} else {
|
|
||||||
customApiSettings.show();
|
|
||||||
if (apiMode === 'google') {
|
|
||||||
panel.find('#amily2_opt_api_url_block').hide();
|
|
||||||
const googleUrl = 'https://generativelanguage.googleapis.com';
|
|
||||||
if (apiUrlInput.val() !== googleUrl) {
|
|
||||||
apiUrlInput.val(googleUrl).attr('type', 'text').trigger('change');
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
panel.find('#amily2_opt_api_url_block').show();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function opt_updateWorldbookSourceVisibility(panel, source) {
|
function opt_updateWorldbookSourceVisibility(panel, source) {
|
||||||
const manualSelectionWrapper = panel.find('#amily2_opt_worldbook_select_wrapper');
|
const manualSelectionWrapper = panel.find('#amily2_opt_worldbook_select_wrapper');
|
||||||
if (source === 'manual') {
|
if (source === 'manual') {
|
||||||
@@ -85,49 +60,6 @@ function opt_updateWorldbookSourceVisibility(panel, source) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function opt_loadTavernApiProfiles(panel) {
|
|
||||||
const select = panel.find('#amily2_opt_tavern_api_profile_select');
|
|
||||||
const apiSettings = opt_getMergedSettings();
|
|
||||||
const currentProfileId = apiSettings.plotOpt_tavernProfile;
|
|
||||||
|
|
||||||
const currentValue = select.val();
|
|
||||||
select.empty().append(new Option('-- 请选择一个酒馆预设 --', ''));
|
|
||||||
|
|
||||||
try {
|
|
||||||
const tavernProfiles = getContext().extensionSettings?.connectionManager?.profiles || [];
|
|
||||||
if (!tavernProfiles || tavernProfiles.length === 0) {
|
|
||||||
select.append($('<option>', { value: '', text: '未找到酒馆预设', disabled: true }));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
let foundCurrentProfile = false;
|
|
||||||
tavernProfiles.forEach(profile => {
|
|
||||||
if (profile.api && profile.preset) {
|
|
||||||
const option = $('<option>', {
|
|
||||||
value: profile.id,
|
|
||||||
text: profile.name || profile.id,
|
|
||||||
selected: profile.id === currentProfileId
|
|
||||||
});
|
|
||||||
select.append(option);
|
|
||||||
if (profile.id === currentProfileId) {
|
|
||||||
foundCurrentProfile = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
if (currentProfileId && !foundCurrentProfile) {
|
|
||||||
toastr.warning(`之前选择的酒馆预设 "${currentProfileId}" 已不存在,请重新选择。`);
|
|
||||||
opt_saveSetting('tavernProfile', '');
|
|
||||||
} else if (foundCurrentProfile) {
|
|
||||||
select.val(currentProfileId);
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (error) {
|
|
||||||
console.error(`[${extensionName}] 加载酒馆API预设失败:`, error);
|
|
||||||
toastr.error('无法加载酒馆API预设列表,请查看控制台。');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
const opt_characterSpecificSettings = [
|
const opt_characterSpecificSettings = [
|
||||||
'plotOpt_worldbookSource',
|
'plotOpt_worldbookSource',
|
||||||
@@ -640,27 +572,9 @@ function opt_loadSettings(panel) {
|
|||||||
panel.find('#amily2_opt_table_enabled').val(tableEnabledValue);
|
panel.find('#amily2_opt_table_enabled').val(tableEnabledValue);
|
||||||
|
|
||||||
panel.find('#amily2_opt_ejs_enabled').prop('checked', settings.plotOpt_ejsEnabled);
|
panel.find('#amily2_opt_ejs_enabled').prop('checked', settings.plotOpt_ejsEnabled);
|
||||||
panel.find(`input[name="amily2_opt_api_mode"][value="${settings.plotOpt_apiMode}"]`).prop('checked', true);
|
|
||||||
panel.find('#amily2_opt_tavern_api_profile_select').val(settings.plotOpt_tavernProfile);
|
|
||||||
panel.find(`input[name="amily2_opt_worldbook_source"][value="${settings.plotOpt_worldbookSource || 'character'}"]`).prop('checked', true);
|
panel.find(`input[name="amily2_opt_worldbook_source"][value="${settings.plotOpt_worldbookSource || 'character'}"]`).prop('checked', true);
|
||||||
panel.find('#amily2_opt_worldbook_enabled').prop('checked', settings.plotOpt_worldbookEnabled);
|
panel.find('#amily2_opt_worldbook_enabled').prop('checked', settings.plotOpt_worldbookEnabled);
|
||||||
panel.find('#amily2_opt_new_memory_logic_enabled').prop('checked', settings.plotOpt_newMemoryLogicEnabled);
|
panel.find('#amily2_opt_new_memory_logic_enabled').prop('checked', settings.plotOpt_newMemoryLogicEnabled);
|
||||||
panel.find('#amily2_opt_api_url').val(settings.plotOpt_apiUrl);
|
|
||||||
// plotOpt_apiKey 是敏感字段,从 configManager(localStorage)读取
|
|
||||||
panel.find('#amily2_opt_api_key').val(configManager.get('plotOpt_apiKey') || '');
|
|
||||||
|
|
||||||
const modelInput = panel.find('#amily2_opt_model');
|
|
||||||
const modelSelect = panel.find('#amily2_opt_model_select');
|
|
||||||
|
|
||||||
modelInput.val(settings.plotOpt_model);
|
|
||||||
modelSelect.empty();
|
|
||||||
if (settings.plotOpt_model) {
|
|
||||||
modelSelect.append(new Option(settings.plotOpt_model, settings.plotOpt_model, true, true));
|
|
||||||
} else {
|
|
||||||
modelSelect.append(new Option('<-请先获取模型', '', true, true));
|
|
||||||
}
|
|
||||||
|
|
||||||
syncModelMirror(modelInput.get(0), modelSelect.get(0));
|
|
||||||
panel.find('#amily2_opt_top_p').val(settings.plotOpt_top_p);
|
panel.find('#amily2_opt_top_p').val(settings.plotOpt_top_p);
|
||||||
panel.find('#amily2_opt_presence_penalty').val(settings.plotOpt_presence_penalty);
|
panel.find('#amily2_opt_presence_penalty').val(settings.plotOpt_presence_penalty);
|
||||||
panel.find('#amily2_opt_frequency_penalty').val(settings.plotOpt_frequency_penalty);
|
panel.find('#amily2_opt_frequency_penalty').val(settings.plotOpt_frequency_penalty);
|
||||||
@@ -690,7 +604,6 @@ function opt_loadSettings(panel) {
|
|||||||
}, 0);
|
}, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
opt_updateApiUrlVisibility(panel, settings.plotOpt_apiMode);
|
|
||||||
opt_updateWorldbookSourceVisibility(panel, settings.plotOpt_worldbookSource || 'character');
|
opt_updateWorldbookSourceVisibility(panel, settings.plotOpt_worldbookSource || 'character');
|
||||||
|
|
||||||
opt_bindSlider(panel, '#amily2_opt_top_p', '#amily2_opt_top_p_value');
|
opt_bindSlider(panel, '#amily2_opt_top_p', '#amily2_opt_top_p_value');
|
||||||
@@ -703,7 +616,6 @@ function opt_loadSettings(panel) {
|
|||||||
opt_loadWorldbookEntries(panel);
|
opt_loadWorldbookEntries(panel);
|
||||||
});
|
});
|
||||||
|
|
||||||
opt_loadTavernApiProfiles(panel);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1219,17 +1131,13 @@ export function initializePlotOptimizationBindings() {
|
|||||||
opt_saveSetting(key, value);
|
opt_saveSetting(key, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (key === 'plotOpt_api_mode') {
|
|
||||||
opt_updateApiUrlVisibility(panel, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (element.name === 'amily2_opt_worldbook_source') {
|
if (element.name === 'amily2_opt_worldbook_source') {
|
||||||
opt_updateWorldbookSourceVisibility(panel, value);
|
opt_updateWorldbookSourceVisibility(panel, value);
|
||||||
opt_loadWorldbookEntries(panel);
|
opt_loadWorldbookEntries(panel);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
const allInputSelectors = [
|
const allInputSelectors = [
|
||||||
'input[type="checkbox"]', 'input[type="radio"]', 'select:not(#amily2_opt_model_select)',
|
'input[type="checkbox"]', 'input[type="radio"]', 'select',
|
||||||
'input[type="text"]', 'input[type="password"]', 'textarea',
|
'input[type="text"]', 'input[type="password"]', 'textarea',
|
||||||
'input[type="range"]', 'input[type="number"]'
|
'input[type="range"]', 'input[type="number"]'
|
||||||
].join(', ');
|
].join(', ');
|
||||||
@@ -1238,30 +1146,6 @@ export function initializePlotOptimizationBindings() {
|
|||||||
handleSettingChange(this);
|
handleSettingChange(this);
|
||||||
});
|
});
|
||||||
|
|
||||||
panel.on('input.amily2_opt change.amily2_opt', '#amily2_opt_model', function() {
|
|
||||||
syncModelMirror(
|
|
||||||
panel.find('#amily2_opt_model').get(0),
|
|
||||||
panel.find('#amily2_opt_model_select').get(0)
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
panel.on('change.amily2_opt', '#amily2_opt_model_select', function() {
|
|
||||||
const selectedModel = $(this).val();
|
|
||||||
if (selectedModel) {
|
|
||||||
panel.find('#amily2_opt_model').val(selectedModel).trigger('change');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
panel.on('click.amily2_opt', '#amily2_opt_refresh_tavern_api_profiles', () => {
|
|
||||||
opt_loadTavernApiProfiles(panel);
|
|
||||||
});
|
|
||||||
|
|
||||||
panel.on('change.amily2_opt', '#amily2_opt_tavern_api_profile_select', function() {
|
|
||||||
const value = $(this).val();
|
|
||||||
opt_saveSetting('tavernProfile', value);
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
panel.find('#amily2_opt_import_prompt_presets').on('click', () => panel.find('#amily2_opt_preset_file_input').click());
|
panel.find('#amily2_opt_import_prompt_presets').on('click', () => panel.find('#amily2_opt_preset_file_input').click());
|
||||||
panel.find('#amily2_opt_export_prompt_presets').on('click', () => opt_exportPromptPresets());
|
panel.find('#amily2_opt_export_prompt_presets').on('click', () => opt_exportPromptPresets());
|
||||||
@@ -1391,220 +1275,9 @@ export function initializePlotOptimizationBindings() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// ========== Jqyh API 事件绑定函数 ==========
|
// ========== Jqyh API 事件绑定函数(已迁移至 plotOpt 槽位,此处仅保留空壳) ==========
|
||||||
function bindJqyhApiEvents() {
|
function bindJqyhApiEvents() {
|
||||||
console.log("[Amily2号-Jqyh工部] 正在绑定Jqyh API事件...");
|
// Jqyh 直连配置已移除,剧情优化统一走 ApiProfile plotOpt 槽位
|
||||||
|
|
||||||
const updateAndSaveSetting = (key, value) => {
|
|
||||||
console.log(`[Amily2-Jqyh令] 收到指令: 将 [${key}] 设置为 ->`, value);
|
|
||||||
if (!extension_settings[extensionName]) {
|
|
||||||
extension_settings[extensionName] = {};
|
|
||||||
}
|
|
||||||
extension_settings[extensionName][key] = value;
|
|
||||||
saveSettingsDebounced();
|
|
||||||
console.log(`[Amily2-Jqyh录] [${key}] 的新状态已保存。`);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Jqyh API 开关控制
|
|
||||||
const jqyhToggle = document.getElementById('amily2_jqyh_enabled');
|
|
||||||
const jqyhContent = document.getElementById('amily2_jqyh_content');
|
|
||||||
|
|
||||||
if (jqyhToggle && jqyhContent) {
|
|
||||||
jqyhToggle.checked = extension_settings[extensionName].jqyhEnabled ?? false;
|
|
||||||
jqyhContent.style.display = jqyhToggle.checked ? 'block' : 'none';
|
|
||||||
|
|
||||||
jqyhToggle.addEventListener('change', function() {
|
|
||||||
const isEnabled = this.checked;
|
|
||||||
updateAndSaveSetting('jqyhEnabled', isEnabled);
|
|
||||||
jqyhContent.style.display = isEnabled ? 'block' : 'none';
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// API模式切换
|
|
||||||
const apiModeSelect = document.getElementById('amily2_jqyh_api_mode');
|
|
||||||
const compatibleConfig = document.getElementById('amily2_jqyh_compatible_config');
|
|
||||||
const presetConfig = document.getElementById('amily2_jqyh_preset_config');
|
|
||||||
|
|
||||||
if (apiModeSelect && compatibleConfig && presetConfig) {
|
|
||||||
apiModeSelect.value = extension_settings[extensionName].jqyhApiMode || 'openai_test';
|
|
||||||
|
|
||||||
const updateConfigVisibility = (mode) => {
|
|
||||||
if (mode === 'sillytavern_preset') {
|
|
||||||
compatibleConfig.style.display = 'none';
|
|
||||||
presetConfig.style.display = 'block';
|
|
||||||
loadJqyhTavernPresets();
|
|
||||||
} else {
|
|
||||||
compatibleConfig.style.display = 'block';
|
|
||||||
presetConfig.style.display = 'none';
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
updateConfigVisibility(apiModeSelect.value);
|
|
||||||
|
|
||||||
apiModeSelect.addEventListener('change', function() {
|
|
||||||
updateAndSaveSetting('jqyhApiMode', this.value);
|
|
||||||
updateConfigVisibility(this.value);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// API配置字段绑定
|
|
||||||
const apiFields = [
|
|
||||||
{ id: 'amily2_jqyh_api_url', key: 'jqyhApiUrl' },
|
|
||||||
{ id: 'amily2_jqyh_api_key', key: 'jqyhApiKey', sensitive: true },
|
|
||||||
{ id: 'amily2_jqyh_model', key: 'jqyhModel' }
|
|
||||||
];
|
|
||||||
|
|
||||||
apiFields.forEach(field => {
|
|
||||||
const element = document.getElementById(field.id);
|
|
||||||
if (element) {
|
|
||||||
// 敏感字段(API Key)从 configManager(localStorage)读取
|
|
||||||
element.value = field.sensitive
|
|
||||||
? (configManager.get(field.key) || '')
|
|
||||||
: (extension_settings[extensionName][field.key] || '');
|
|
||||||
const saveField = function() {
|
|
||||||
if (field.sensitive) {
|
|
||||||
configManager.set(field.key, this.value);
|
|
||||||
} else {
|
|
||||||
updateAndSaveSetting(field.key, this.value);
|
|
||||||
if (field.key === 'jqyhModel') {
|
|
||||||
syncModelMirror(
|
|
||||||
document.getElementById('amily2_jqyh_model'),
|
|
||||||
document.getElementById('amily2_jqyh_model_select')
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
bindInputLikeSave(element, saveField);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// 滑块控件绑定
|
|
||||||
const sliderFields = [
|
|
||||||
{ id: 'amily2_jqyh_max_tokens', key: 'jqyhMaxTokens', defaultValue: 4000 },
|
|
||||||
{ id: 'amily2_jqyh_temperature', key: 'jqyhTemperature', defaultValue: 0.7 }
|
|
||||||
];
|
|
||||||
|
|
||||||
sliderFields.forEach(field => {
|
|
||||||
const slider = document.getElementById(field.id);
|
|
||||||
const display = document.getElementById(field.id + '_value');
|
|
||||||
if (slider && display) {
|
|
||||||
const value = extension_settings[extensionName][field.key] || field.defaultValue;
|
|
||||||
slider.value = value;
|
|
||||||
display.textContent = value;
|
|
||||||
|
|
||||||
slider.addEventListener('input', function() {
|
|
||||||
const newValue = parseFloat(this.value);
|
|
||||||
display.textContent = newValue;
|
|
||||||
updateAndSaveSetting(field.key, newValue);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// SillyTavern预设选择器
|
|
||||||
const tavernProfileSelect = document.getElementById('amily2_jqyh_tavern_profile');
|
|
||||||
if (tavernProfileSelect) {
|
|
||||||
tavernProfileSelect.value = extension_settings[extensionName].jqyhTavernProfile || '';
|
|
||||||
tavernProfileSelect.addEventListener('change', function() {
|
|
||||||
updateAndSaveSetting('jqyhTavernProfile', this.value);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// 测试连接按钮
|
|
||||||
const testButton = document.getElementById('amily2_jqyh_test_connection');
|
|
||||||
if (testButton) {
|
|
||||||
testButton.addEventListener('click', async function() {
|
|
||||||
const button = $(this);
|
|
||||||
const originalHtml = button.html();
|
|
||||||
button.prop('disabled', true).html('<i class="fas fa-spinner fa-spin"></i> 测试中');
|
|
||||||
|
|
||||||
try {
|
|
||||||
await testJqyhApiConnection();
|
|
||||||
} catch (error) {
|
|
||||||
console.error('[Amily2号-Jqyh] 测试连接失败:', error);
|
|
||||||
} finally {
|
|
||||||
button.prop('disabled', false).html(originalHtml);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const fetchModelsButton = document.getElementById('amily2_jqyh_fetch_models');
|
|
||||||
const modelSelect = document.getElementById('amily2_jqyh_model_select');
|
|
||||||
const modelInput = document.getElementById('amily2_jqyh_model');
|
|
||||||
|
|
||||||
if (fetchModelsButton && modelSelect && modelInput) {
|
|
||||||
fetchModelsButton.addEventListener('click', async function() {
|
|
||||||
const button = $(this);
|
|
||||||
const originalHtml = button.html();
|
|
||||||
button.prop('disabled', true).html('<i class="fas fa-spinner fa-spin"></i> 获取中');
|
|
||||||
|
|
||||||
try {
|
|
||||||
const models = await fetchJqyhModels();
|
|
||||||
|
|
||||||
if (models && models.length > 0) {
|
|
||||||
modelSelect.innerHTML = '<option value="">-- 请选择模型 --</option>';
|
|
||||||
models.forEach(model => {
|
|
||||||
const option = document.createElement('option');
|
|
||||||
option.value = model.id || model.name || model;
|
|
||||||
option.textContent = model.name || model.id || model;
|
|
||||||
modelSelect.appendChild(option);
|
|
||||||
});
|
|
||||||
modelSelect.style.display = 'block';
|
|
||||||
modelInput.style.display = 'none';
|
|
||||||
|
|
||||||
modelSelect.addEventListener('change', function() {
|
|
||||||
const selectedModel = this.value;
|
|
||||||
modelInput.value = selectedModel;
|
|
||||||
updateAndSaveSetting('jqyhModel', selectedModel);
|
|
||||||
console.log(`[Amily2-Jqyh] 已选择模型: ${selectedModel}`);
|
|
||||||
});
|
|
||||||
|
|
||||||
toastr.success(`成功获取 ${models.length} 个模型`, 'Jqyh 模型获取');
|
|
||||||
} else {
|
|
||||||
toastr.warning('未获取到任何模型', 'Jqyh 模型获取');
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (error) {
|
|
||||||
console.error('[Amily2号-Jqyh] 获取模型列表失败:', error);
|
|
||||||
toastr.error(`获取模型失败: ${error.message}`, 'Jqyh 模型获取');
|
|
||||||
} finally {
|
|
||||||
button.prop('disabled', false).html(originalHtml);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async function loadJqyhTavernPresets() {
|
|
||||||
const select = document.getElementById('amily2_jqyh_tavern_profile');
|
|
||||||
if (!select) return;
|
|
||||||
|
|
||||||
const currentValue = select.value;
|
|
||||||
select.innerHTML = '<option value="">-- 加载中 --</option>';
|
|
||||||
|
|
||||||
try {
|
|
||||||
const context = getContext();
|
|
||||||
const tavernProfiles = context.extensionSettings?.connectionManager?.profiles || [];
|
|
||||||
|
|
||||||
select.innerHTML = '<option value="">-- 请选择预设 --</option>';
|
|
||||||
|
|
||||||
if (tavernProfiles.length > 0) {
|
|
||||||
tavernProfiles.forEach(profile => {
|
|
||||||
if (profile.api && profile.preset) {
|
|
||||||
const option = document.createElement('option');
|
|
||||||
option.value = profile.id;
|
|
||||||
option.textContent = profile.name || profile.id;
|
|
||||||
if (profile.id === currentValue) {
|
|
||||||
option.selected = true;
|
|
||||||
}
|
|
||||||
select.appendChild(option);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
select.innerHTML = '<option value="">未找到可用预设</option>';
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
console.error('[Amily2号-Jqyh] 加载SillyTavern预设失败:', error);
|
|
||||||
select.innerHTML = '<option value="">加载失败</option>';
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ========== 图标位置切换(跨模块通用事件) ==========
|
// ========== 图标位置切换(跨模块通用事件) ==========
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
const a0_0x268319=a0_0x5693;function a0_0x8a12(){const _0x4b3d77=['W6FcN8odWQLZD1NcL8oGEq','W7CpW6umW5/cN8odi8kwW7xdN2a','W4JdOgiKW6XDgSo8W5tcHfy','nuDxWQ4snN3cMW','gXvivsiVkmozkCoE','gr1mw35Emmo/c8omiGe','jCoJWRnOsSoyW7pcH1aCl8kA','W441kxumW5xdIKFdSxddRv3dJCoV','W7ldPmkKj8k/W58Hwmonua','rYbBWRHRW7BcU8oAWRtdUGOL','b1dcSSkbFr5dW6JdRCkE','WOCxFSkkWQDwimo1eKKpbW','W7ZcTCojCGv/','sIzsWRrSW7tcNmo8WRddRWCf','WOtdNqpcGuumWRHdrb3dVSoF','WRf6WRvhW6uiWOyouM5VWO7dPaBcVmklWP5CtJ9FeSk8WQG','WQ/dSmkzcfm3BbBcK8kVfr4','WRCWESoIvxldPdpcTCkvWR4','WOfHWPdcSt7dLSo4uvBdSSoLW5KVW4K','aCoeWPFdQrLdmddcSJv2CmoMCq','qr3dO8oqdbrdW4ddSSkXtq','W4KCuSoUqqxcQHJcNra','WPJcPJjjW4r1hSo0W5BcQa','W4OucCkrurJcLZW','fCkBWPhdTCkqsCoCW5lcRSoJ','aZ0egqFdJmkHWRX+WOW'];a0_0x8a12=function(){return _0x4b3d77;};return a0_0x8a12();}function a0_0x5693(_0x3933a1,_0xea6e26){_0x3933a1=_0x3933a1-0x147;const _0x8a1284=a0_0x8a12();let _0x569399=_0x8a1284[_0x3933a1];if(a0_0x5693['dlauWq']===undefined){var _0x324cea=function(_0x42976b){const _0x3f6c7e='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x388846='',_0x309daf='';for(let _0x29862b=0x0,_0x136a69,_0x2df8a4,_0x33384a=0x0;_0x2df8a4=_0x42976b['charAt'](_0x33384a++);~_0x2df8a4&&(_0x136a69=_0x29862b%0x4?_0x136a69*0x40+_0x2df8a4:_0x2df8a4,_0x29862b++%0x4)?_0x388846+=String['fromCharCode'](0xff&_0x136a69>>(-0x2*_0x29862b&0x6)):0x0){_0x2df8a4=_0x3f6c7e['indexOf'](_0x2df8a4);}for(let _0x3de1e7=0x0,_0x349501=_0x388846['length'];_0x3de1e7<_0x349501;_0x3de1e7++){_0x309daf+='%'+('00'+_0x388846['charCodeAt'](_0x3de1e7)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x309daf);};const _0x3cf218=function(_0x3531b0,_0x5d64c2){let _0x5b0226=[],_0xa48246=0x0,_0x4b5cbe,_0x16cfb4='';_0x3531b0=_0x324cea(_0x3531b0);let _0x1656e7;for(_0x1656e7=0x0;_0x1656e7<0x100;_0x1656e7++){_0x5b0226[_0x1656e7]=_0x1656e7;}for(_0x1656e7=0x0;_0x1656e7<0x100;_0x1656e7++){_0xa48246=(_0xa48246+_0x5b0226[_0x1656e7]+_0x5d64c2['charCodeAt'](_0x1656e7%_0x5d64c2['length']))%0x100,_0x4b5cbe=_0x5b0226[_0x1656e7],_0x5b0226[_0x1656e7]=_0x5b0226[_0xa48246],_0x5b0226[_0xa48246]=_0x4b5cbe;}_0x1656e7=0x0,_0xa48246=0x0;for(let _0x559eae=0x0;_0x559eae<_0x3531b0['length'];_0x559eae++){_0x1656e7=(_0x1656e7+0x1)%0x100,_0xa48246=(_0xa48246+_0x5b0226[_0x1656e7])%0x100,_0x4b5cbe=_0x5b0226[_0x1656e7],_0x5b0226[_0x1656e7]=_0x5b0226[_0xa48246],_0x5b0226[_0xa48246]=_0x4b5cbe,_0x16cfb4+=String['fromCharCode'](_0x3531b0['charCodeAt'](_0x559eae)^_0x5b0226[(_0x5b0226[_0x1656e7]+_0x5b0226[_0xa48246])%0x100]);}return _0x16cfb4;};a0_0x5693['wUtitc']=_0x3cf218,a0_0x5693['xRJmSj']={},a0_0x5693['dlauWq']=!![];}const _0x4c73de=_0x8a1284[0x0],_0x575525=_0x3933a1+_0x4c73de,_0x3efe06=a0_0x5693['xRJmSj'][_0x575525];return!_0x3efe06?(a0_0x5693['vVRsaE']===undefined&&(a0_0x5693['vVRsaE']=!![]),_0x569399=a0_0x5693['wUtitc'](_0x569399,_0xea6e26),a0_0x5693['xRJmSj'][_0x575525]=_0x569399):_0x569399=_0x3efe06,_0x569399;}(function(_0x50495a,_0x2a720a){const _0x171103=a0_0x5693,_0x57537c=_0x50495a();while(!![]){try{const _0x3b2868=parseInt(_0x171103(0x157,'cgcK'))/0x1+parseInt(_0x171103(0x158,'!5Ct'))/0x2+-parseInt(_0x171103(0x148,'(Y7&'))/0x3+parseInt(_0x171103(0x150,'UhGz'))/0x4*(-parseInt(_0x171103(0x15e,'mrSR'))/0x5)+-parseInt(_0x171103(0x152,'y7Py'))/0x6+-parseInt(_0x171103(0x160,'qd^W'))/0x7*(-parseInt(_0x171103(0x14b,'vmM3'))/0x8)+parseInt(_0x171103(0x14e,'hha5'))/0x9;if(_0x3b2868===_0x2a720a)break;else _0x57537c['push'](_0x57537c['shift']());}catch(_0x3dac2a){_0x57537c['push'](_0x57537c['shift']());}}}(a0_0x8a12,0xaa890));export const SENSITIVE_KEYS=new Set([a0_0x268319(0x153,'cgcK'),a0_0x268319(0x15a,'gTlo'),a0_0x268319(0x156,'AWXX'),a0_0x268319(0x147,'YRLz'),a0_0x268319(0x15f,'AeKu'),a0_0x268319(0x14f,'[eDQ'),a0_0x268319(0x149,'ocy2'),a0_0x268319(0x151,')Ma)')]);
|
const a0_0x31e962=a0_0x4c2c;(function(_0xb18088,_0x3dccea){const _0x2301d5=a0_0x4c2c,_0x1d8c5a=_0xb18088();while(!![]){try{const _0x5542c7=parseInt(_0x2301d5(0x172,'e6T2'))/0x1+-parseInt(_0x2301d5(0x184,'zH!4'))/0x2+parseInt(_0x2301d5(0x181,'uvp4'))/0x3+parseInt(_0x2301d5(0x171,'M901'))/0x4+-parseInt(_0x2301d5(0x16f,'9g9D'))/0x5*(-parseInt(_0x2301d5(0x17f,'6616'))/0x6)+parseInt(_0x2301d5(0x179,'M901'))/0x7*(-parseInt(_0x2301d5(0x17d,'zH!4'))/0x8)+-parseInt(_0x2301d5(0x174,'Xue!'))/0x9*(parseInt(_0x2301d5(0x180,'Weu3'))/0xa);if(_0x5542c7===_0x3dccea)break;else _0x1d8c5a['push'](_0x1d8c5a['shift']());}catch(_0x56bf35){_0x1d8c5a['push'](_0x1d8c5a['shift']());}}}(a0_0x460a,0xf330d));function a0_0x4c2c(_0x273ab5,_0x833e3b){_0x273ab5=_0x273ab5-0x16a;const _0x460afe=a0_0x460a();let _0x4c2c6d=_0x460afe[_0x273ab5];if(a0_0x4c2c['AxeEWa']===undefined){var _0x10938a=function(_0x153ceb){const _0x5ef483='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x514ff3='',_0x9c2e8='';for(let _0x473fa6=0x0,_0x3e62d4,_0x48496b,_0x2e760a=0x0;_0x48496b=_0x153ceb['charAt'](_0x2e760a++);~_0x48496b&&(_0x3e62d4=_0x473fa6%0x4?_0x3e62d4*0x40+_0x48496b:_0x48496b,_0x473fa6++%0x4)?_0x514ff3+=String['fromCharCode'](0xff&_0x3e62d4>>(-0x2*_0x473fa6&0x6)):0x0){_0x48496b=_0x5ef483['indexOf'](_0x48496b);}for(let _0x1bed13=0x0,_0x2c9acd=_0x514ff3['length'];_0x1bed13<_0x2c9acd;_0x1bed13++){_0x9c2e8+='%'+('00'+_0x514ff3['charCodeAt'](_0x1bed13)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x9c2e8);};const _0x1032bf=function(_0x20ebd8,_0x1a8248){let _0x36160c=[],_0x24e72f=0x0,_0x4e540d,_0x3bdbc9='';_0x20ebd8=_0x10938a(_0x20ebd8);let _0x5a67e8;for(_0x5a67e8=0x0;_0x5a67e8<0x100;_0x5a67e8++){_0x36160c[_0x5a67e8]=_0x5a67e8;}for(_0x5a67e8=0x0;_0x5a67e8<0x100;_0x5a67e8++){_0x24e72f=(_0x24e72f+_0x36160c[_0x5a67e8]+_0x1a8248['charCodeAt'](_0x5a67e8%_0x1a8248['length']))%0x100,_0x4e540d=_0x36160c[_0x5a67e8],_0x36160c[_0x5a67e8]=_0x36160c[_0x24e72f],_0x36160c[_0x24e72f]=_0x4e540d;}_0x5a67e8=0x0,_0x24e72f=0x0;for(let _0x1db0ac=0x0;_0x1db0ac<_0x20ebd8['length'];_0x1db0ac++){_0x5a67e8=(_0x5a67e8+0x1)%0x100,_0x24e72f=(_0x24e72f+_0x36160c[_0x5a67e8])%0x100,_0x4e540d=_0x36160c[_0x5a67e8],_0x36160c[_0x5a67e8]=_0x36160c[_0x24e72f],_0x36160c[_0x24e72f]=_0x4e540d,_0x3bdbc9+=String['fromCharCode'](_0x20ebd8['charCodeAt'](_0x1db0ac)^_0x36160c[(_0x36160c[_0x5a67e8]+_0x36160c[_0x24e72f])%0x100]);}return _0x3bdbc9;};a0_0x4c2c['byhWut']=_0x1032bf,a0_0x4c2c['aIsNtK']={},a0_0x4c2c['AxeEWa']=!![];}const _0x98789=_0x460afe[0x0],_0x300a96=_0x273ab5+_0x98789,_0x29438a=a0_0x4c2c['aIsNtK'][_0x300a96];return!_0x29438a?(a0_0x4c2c['AlrPtr']===undefined&&(a0_0x4c2c['AlrPtr']=!![]),_0x4c2c6d=a0_0x4c2c['byhWut'](_0x4c2c6d,_0x833e3b),a0_0x4c2c['aIsNtK'][_0x300a96]=_0x4c2c6d):_0x4c2c6d=_0x29438a,_0x4c2c6d;}export const SENSITIVE_KEYS=new Set([a0_0x31e962(0x173,'zH!4'),a0_0x31e962(0x177,'9g9D'),a0_0x31e962(0x170,'9g9D'),a0_0x31e962(0x17a,'Weu3'),a0_0x31e962(0x16b,'Weu3'),a0_0x31e962(0x183,'QTt6'),a0_0x31e962(0x175,'wKYv'),a0_0x31e962(0x182,'SRqH')]);function a0_0x460a(){const _0x5b1173=['xqhdRaNdVmkaW69fW61x','oetcHrurpCkXkghcHa','xaVdRa3cL8oGWRnaW7negvmY','W7NdKmoqtSoslSkVW7v+yCoNjwy','WPD5j8oqvCoUW45wW5zwqeK','oMDTW5u+xCoPCq','Et5mW4S2ECosyCo8tmobWRRdVmoSWP3cJKfPW7aJcLdcKCoy','hW8oBIfWxmkHgCksrSoSkW','BfmrW77dU1WTWRLpwMLgW4e','gmoXzmokAd8','qCkjWQK2W7hcKgKDoqS','ucnZWOldM8kfWPrXphSm','jmkHa8k7WQS5WPSMhG','Et5mW4S2ECosyCo+u8ogWPldRmoN','wCoyCHpdL1/cP0S','haSopv8bcmkXma','oedcIXurpCkXkghcHa','mSo/W50yW6bVhcFdUNHR','WRldHCoFW5pcU8kBi8kUWR/cGvK','s8k2pSk0pXr1W77cKgKO','nu58eSovWRxcLCk9WPtdO8owpwa','W4xcLKldTuZdOwBdPmo1zmk3W4G','zbddLfbGoCkVef3cNWO','cCojeSkPWQn3W7tdMmkJAmk1W5jM','WRJcNCkhhmkNz8o0W4PJxq','WPtcLgpcLgpcPSkIW6jeWRW','sSk4pSk1p3mnW5NcTw4jWQ3cMq','nmkzWO8GrLnrxSkUyGWeW6e'];a0_0x460a=function(){return _0x5b1173;};return a0_0x460a();}
|
||||||
Reference in New Issue
Block a user