Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions modules/story-summary/data/chat-toggle.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
export const STORY_SUMMARY_CHAT_ENABLED_KEY = "storySummaryEnabled";

export function getChatStorySummaryEnabled(chatMetadata, extensionId) {
if (!chatMetadata || typeof chatMetadata !== "object") return true;
const extensionMetadata = chatMetadata.extensions?.[extensionId];
return extensionMetadata?.[STORY_SUMMARY_CHAT_ENABLED_KEY] !== false;
}

export function setChatStorySummaryEnabled(chatMetadata, extensionId, enabled) {
if (!chatMetadata || typeof chatMetadata !== "object") {
throw new TypeError("chatMetadata must be an object");
}
chatMetadata.extensions ||= {};
chatMetadata.extensions[extensionId] ||= {};
chatMetadata.extensions[extensionId][STORY_SUMMARY_CHAT_ENABLED_KEY] = Boolean(enabled);
return chatMetadata.extensions[extensionId][STORY_SUMMARY_CHAT_ENABLED_KEY];
}

export function resolveStorySummaryEnabled(globalEnabled, chatEnabled) {
return Boolean(globalEnabled) && chatEnabled !== false;
}
35 changes: 35 additions & 0 deletions modules/story-summary/story-summary-ui.js
Original file line number Diff line number Diff line change
Expand Up @@ -341,6 +341,7 @@
let timelineHasRenderedEvents = false;
let currentTimelineChatId = '';
let settingsSaveTimeoutId = null;
let currentChatSummaryEnabled = true;
let panelConfigLoadedFromServer = false;
let settingsOpenedWithServerConfig = false;
const pendingConfigSaveRequests = new Map();
Expand Down Expand Up @@ -444,6 +445,27 @@
}
}

function syncCurrentChatSummaryControls(enabled = currentChatSummaryEnabled) {
currentChatSummaryEnabled = enabled !== false;
const toggle = $('current-chat-enabled');
if (toggle) {
toggle.checked = currentChatSummaryEnabled;
toggle.disabled = false;
}

const generateButton = $('btn-generate');
if (generateButton) {
generateButton.disabled = !currentChatSummaryEnabled;
generateButton.title = currentChatSummaryEnabled ? '' : '请先启用当前聊天的剧情总结';
}

for (const id of ['hide-summarized', 'keep-visible-count', 'use-vector-boundary']) {
const control = $(id);
if (control) control.disabled = !currentChatSummaryEnabled;
}
syncVectorBoundaryControl(config.vector?.enabled, currentChatSummaryEnabled && config.ui.hideSummarized);
}

function syncAutoSummaryControls() {
const en = $('trigger-enabled');
const timing = $('trigger-timing');
Expand Down Expand Up @@ -2248,6 +2270,10 @@
const btn = $('btn-generate');

switch (d.type) {
case 'CHAT_SUMMARY_STATE':
syncCurrentChatSummaryControls(d.state?.effectiveEnabled !== false);
break;

case 'GENERATION_STATE':
localGenerating = !!d.isGenerating;
btn.textContent = localGenerating ? '停止' : '总结';
Expand Down Expand Up @@ -2566,6 +2592,14 @@
e.target.value = val;
};

// Current chat switch (saved immediately in chat metadata)
$('current-chat-enabled').onchange = e => {
const enabled = e.target.checked;
e.target.disabled = true;
syncCurrentChatSummaryControls(enabled);
postMsg('SET_CURRENT_CHAT_ENABLED', { enabled });
};

// Main actions
$('btn-clear').onclick = async () => {
const action = await showCleanActionMenu();
Expand Down Expand Up @@ -2705,6 +2739,7 @@
renderFacts([]);

bindEvents();
syncCurrentChatSummaryControls(currentChatSummaryEnabled);

// === THEME SWITCHER ===
(function () {
Expand Down
4 changes: 4 additions & 0 deletions modules/story-summary/story-summary.html
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,10 @@ <h1 style="user-select: none;">剧情<span>总结</span></h1>

<!-- Controls -->
<div class="controls">
<label class="chk-label current-chat-toggle" title="只影响当前聊天;关闭后停止自动总结和长期记忆注入,但保留已有数据">
<input type="checkbox" id="current-chat-enabled" checked>
<span>当前聊天启用</span>
</label>
<label class="chk-label">
<input type="checkbox" id="hide-summarized">
<span>隐藏已总结 · <strong id="summarized-count">0</strong> 楼(保留<input type="number" id="keep-visible-count"
Expand Down
Loading