Files
ST-Amily2-Chat-Optimisation/core/super-memory/bindings.js
Jenkins CI 2c3072a3d8 release: v2.2.2 [2026-05-27 11:10:55]
### 新功能
- **Function Call 填表模式**:在填表设置中新增独立开关,启用后支持通过 OpenAI 兼容接口(DeepSeek / OpenRouter / 各类中转等)直接返回结构化操作列表,绕过 `<Amily2Edit>` 文本解析路径,填表更稳定
  - 遇到不支持 `tool_choice` 的接口时自动降级重试
  - 对思考模型注入强制调用指令,防止绕过工具直接输出文本
  - 全部走 ST 后端代理,修复 CSP 拦截直连外部 URL 的问题
- **主界面新增提示词链编辑器入口**,同时调换了记忆管理与角色世界书的按钮位置
- **规则中心**新增"自动排除用户楼层"选项
### 修复
- 提示词链按钮点击无响应(改为事件委托方式绑定)
- 拖拽组件微抖误触发(加 5px 移动阈值过滤)
- 填表检查窗若干问题修复;翰林院(批量回填)修复;防抖逻辑落地
- 角色世界书入口添加使用警告弹窗(强制 10 秒倒计时),提示该功能长期未维护
- ApiProfile `fakeStream` 字段保存丢失问题
- 正文优化默认改为关闭状态
- NGMS / NCCS API 配置槽位标签修正(NGMS→总结,NCCS→填表)
- API Profile 面板选择逻辑统一重构,修复多处旧字段覆盖新配置的问题
- 世界书控制参数兼容性修复(排除递归、插入位置、扫描深度等,适配 ST 1.17.0+)
2026-05-27 11:10:55 +08:00

223 lines
9.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { extensionName } from "../../utils/settings.js";
import { extension_settings } from "/scripts/extensions.js";
import { saveSettingsDebounced } from "/script.js";
import { initializeSuperMemory, purgeSuperMemory } from "./manager.js";
import { defaultSettings as ragDefaultSettings } from "../rag-settings.js";
import { getMemoryState } from "../table-system/manager.js";
const RAG_MODULE_NAME = 'hanlinyuan-rag-core';
function getRagSettings() {
if (!extension_settings[extensionName]) extension_settings[extensionName] = {};
if (!extension_settings[RAG_MODULE_NAME]) {
extension_settings[RAG_MODULE_NAME] = structuredClone(ragDefaultSettings);
}
return extension_settings[RAG_MODULE_NAME];
}
export function bindSuperMemoryEvents() {
const panel = $('#amily2_super_memory_panel');
if (panel.length === 0) return;
panel.on('click', '.sm-nav-item', function() {
const tab = $(this).data('tab');
panel.find('.sm-nav-item').removeClass('active');
$(this).addClass('active');
panel.find('.sm-tab-pane').removeClass('active');
panel.find(`#sm-${tab}-tab`).addClass('active');
});
// 处理 Checkbox 变更
panel.on('change', 'input[type="checkbox"]', function() {
if ($(this).hasClass('sm-table-setting-check')) return; // Skip table settings checks here
if (!extension_settings[extensionName]) extension_settings[extensionName] = {};
const id = this.id;
// Super Memory 自身设置
if (id === 'sm-system-enabled') {
extension_settings[extensionName]['super_memory_enabled'] = this.checked;
saveSettingsDebounced();
return;
}
if (id === 'sm-bridge-enabled') {
extension_settings[extensionName]['superMemory_bridgeEnabled'] = this.checked;
saveSettingsDebounced();
return;
}
// RAG 设置 (归档 & 关联图谱)
const ragSettings = getRagSettings();
if (id === 'sm-archive-enabled') {
if (!ragSettings.archive) ragSettings.archive = {};
ragSettings.archive.enabled = this.checked;
}
else if (id === 'sm-relationship-graph-enabled') {
if (!ragSettings.relationshipGraph) ragSettings.relationshipGraph = {};
ragSettings.relationshipGraph.enabled = this.checked;
}
saveSettingsDebounced();
console.log(`[Amily2-SuperMemory] Checkbox updated: ${id} = ${this.checked}`);
});
// 处理 Input 变更 (归档阈值等)
panel.on('change', 'input[type="number"], input[type="text"]', function() {
if (!extension_settings[extensionName]) extension_settings[extensionName] = {};
const id = this.id;
// SuperMemory 自身设置
if (id === 'sm-min-trigger-floor') {
extension_settings[extensionName]['superMemory_minTriggerFloor'] = Math.max(0, parseInt(this.value, 10) || 0);
saveSettingsDebounced();
console.log(`[Amily2-SuperMemory] Input updated: ${id} = ${this.value}`);
return;
}
// RAG 归档设置
const ragSettings = getRagSettings();
if (!ragSettings.archive) ragSettings.archive = {};
if (id === 'sm-archive-threshold') {
ragSettings.archive.threshold = parseInt(this.value, 10);
}
else if (id === 'sm-archive-batch-size') {
ragSettings.archive.batchSize = parseInt(this.value, 10);
}
else if (id === 'sm-archive-target-table') {
ragSettings.archive.targetTable = this.value;
}
saveSettingsDebounced();
console.log(`[Amily2-SuperMemory] Input updated: ${id} = ${this.value}`);
});
// 绑定刷新表格列表按钮
panel.on('click', '#sm-refresh-table-list', function() {
renderTableSettingsList();
});
// 绑定表格专属配置的 Checkbox
panel.on('change', '.sm-table-setting-check', function() {
if (!extension_settings[extensionName]) extension_settings[extensionName] = {};
if (!extension_settings[extensionName].superMemory_tableSettings) {
extension_settings[extensionName].superMemory_tableSettings = {};
}
const tableName = $(this).data('table');
const type = $(this).data('type'); // 'sync' or 'constant'
const checked = this.checked;
if (!extension_settings[extensionName].superMemory_tableSettings[tableName]) {
extension_settings[extensionName].superMemory_tableSettings[tableName] = {};
}
extension_settings[extensionName].superMemory_tableSettings[tableName][type] = checked;
saveSettingsDebounced();
console.log(`[Amily2-SuperMemory] Table setting updated: ${tableName}.${type} = ${checked}`);
});
loadSuperMemorySettings();
console.log('[Amily2-SuperMemory] Events bound successfully.');
}
function renderTableSettingsList() {
const container = $('#sm-table-settings-list');
container.html('<div style="text-align: center; color: #888; padding: 20px;">正在加载...</div>');
const tables = getMemoryState();
if (!tables || tables.length === 0) {
container.html('<div style="text-align: center; color: #888; padding: 20px;">暂无表格数据。请先在聊天中使用表格功能。</div>');
return;
}
const settings = extension_settings[extensionName]?.superMemory_tableSettings || {};
let html = '';
tables.forEach(table => {
const tableName = table.name;
const tableConfig = settings[tableName] || {};
// Default values: Sync=True, Constant=True
const isSyncEnabled = tableConfig.sync !== false;
const isConstant = tableConfig.constant !== false;
html += `
<div class="sm-control-block" style="border-bottom: 1px solid rgba(255,255,255,0.1); padding-bottom: 10px; margin-bottom: 10px;">
<div style="font-weight: bold; margin-bottom: 5px; color: #e0e0e0;">${tableName}</div>
<div style="display: flex; justify-content: space-between;">
<div style="display: flex; align-items: center;">
<label class="sm-toggle-switch" style="transform: scale(0.8); margin-right: 5px;">
<input type="checkbox" class="sm-table-setting-check" data-table="${tableName}" data-type="sync" ${isSyncEnabled ? 'checked' : ''}>
<span class="sm-slider"></span>
</label>
<span style="font-size: 0.9em; color: #ccc;">写入世界书</span>
</div>
<div style="display: flex; align-items: center;">
<label class="sm-toggle-switch" style="transform: scale(0.8); margin-right: 5px;">
<input type="checkbox" class="sm-table-setting-check" data-table="${tableName}" data-type="constant" ${isConstant ? 'checked' : ''}>
<span class="sm-slider"></span>
</label>
<span style="font-size: 0.9em; color: #ccc;">索引绿灯(常驻)</span>
</div>
</div>
</div>
`;
});
container.html(html);
}
function loadSuperMemorySettings() {
const settings = extension_settings[extensionName] || {};
const ragSettings = getRagSettings();
// Super Memory 设置
$('#sm-system-enabled').prop('checked', settings.super_memory_enabled ?? false);
$('#sm-bridge-enabled').prop('checked', settings.superMemory_bridgeEnabled ?? false);
$('#sm-min-trigger-floor').val(settings.superMemory_minTriggerFloor ?? 0);
// 归档设置
if (ragSettings.archive) {
$('#sm-archive-enabled').prop('checked', ragSettings.archive.enabled ?? false);
$('#sm-archive-threshold').val(ragSettings.archive.threshold ?? 20);
$('#sm-archive-batch-size').val(ragSettings.archive.batchSize ?? 10);
$('#sm-archive-target-table').val(ragSettings.archive.targetTable ?? '总结表');
}
// 关联图谱设置
if (ragSettings.relationshipGraph) {
$('#sm-relationship-graph-enabled').prop('checked', ragSettings.relationshipGraph.enabled ?? false);
}
// 渲染表格列表
renderTableSettingsList();
}
window.sm_initializeSystem = async function() {
toastr.info('超级记忆系统正在初始化...');
$('#sm-system-status').text('初始化中...').css('color', 'yellow');
try {
await initializeSuperMemory();
toastr.success('超级记忆系统初始化完成。');
} catch (error) {
console.error(error);
toastr.error('初始化失败,请检查控制台。');
$('#sm-system-status').text('错误').css('color', 'red');
}
};
window.sm_purgeMemory = async function() {
if (confirm('您确定要清空所有由Amily2管理的超级记忆数据吗\n这将删除世界书中所有以表格世界书的条目。')) {
toastr.info('正在清空记忆...');
await purgeSuperMemory();
$('#sm-system-status').text('已清空').css('color', '#ffc107');
}
};