chore: harden lightrag knowledge rag runtime

This commit is contained in:
lix-2026
2026-06-09 22:12:09 +08:00
parent 922965d30f
commit f698aad964
22 changed files with 899 additions and 101 deletions
@@ -41,6 +41,8 @@ export function createSidebarPageAiRenderRuntime(context) {
pageAiSessionAgentFilterValue,
pageAiSessionPreviewText,
pageAiSessionStorageLabel,
pageAiSessionSelected,
pageAiSelectedSessionCount,
pageAiSkillEnabled,
pageAiSkillGroupCollapsed,
pageAiSkillListEntries,
@@ -601,6 +603,15 @@ export function createSidebarPageAiRenderRuntime(context) {
sessionError.textContent = pageUiState.pageAiSessionError || '';
sessionError.hidden = !pageUiState.pageAiSessionError;
}
var selectedSessionCount = pageAiSelectedSessionCount();
var selectedSessionToolbar = drawer.querySelector('[data-page-ai-history-selection-toolbar]');
if (selectedSessionToolbar instanceof HTMLElement) {
selectedSessionToolbar.hidden = selectedSessionCount <= 0;
}
var selectedSessionCountNode = drawer.querySelector('[data-page-ai-history-selection-count]');
if (selectedSessionCountNode instanceof HTMLElement) {
selectedSessionCountNode.textContent = '已选 ' + String(selectedSessionCount) + ' 个';
}
var sessionSearch = drawer.querySelector('[data-page-ai-session-search]');
if (sessionSearch instanceof HTMLInputElement && documentRef.activeElement !== sessionSearch) {
sessionSearch.value = pageUiState.pageAiSessionSearchQuery || '';
@@ -1009,6 +1020,11 @@ export function createSidebarPageAiRenderRuntime(context) {
'<section class="wolai-page-ai-panel-section" data-page-ai-panel="history" hidden>' +
'<div class="wolai-page-ai-settings-head">' +
'<button type="button" class="wolai-page-ai-back" data-page-ai-tab="chat">← 聊天</button>' +
'<div class="wolai-page-ai-history-selection" data-page-ai-history-selection-toolbar hidden>' +
'<span data-page-ai-history-selection-count>已选 0 个</span>' +
'<button type="button" class="wolai-page-ai-ghost" data-page-ai-session-clear-selection>取消</button>' +
'<button type="button" class="wolai-page-ai-ghost wolai-page-ai-ghost--danger" data-page-ai-session-delete-selected>删除</button>' +
'</div>' +
'</div>' +
'<label class="wolai-page-ai-skill-search">' +
'<span>搜索会话</span>' +
@@ -1293,6 +1309,20 @@ export function createSidebarPageAiRenderRuntime(context) {
}).join('');
}
function pageAiHistoryTextKey(value) {
return String(value || '')
.replace(/\s+/g, ' ')
.replace(/[.…]+$/g, '')
.trim();
}
function pageAiHistoryPreviewIsDuplicate(title, preview) {
var titleKey = pageAiHistoryTextKey(title);
var previewKey = pageAiHistoryTextKey(preview);
if (!titleKey || !previewKey) return false;
return titleKey === previewKey || previewKey.indexOf(titleKey) === 0 || titleKey.indexOf(previewKey) === 0;
}
function renderPageAiConversation() {
var drawer = ensurePageAiDrawer();
renderPageAiSuggestions();
@@ -1308,22 +1338,28 @@ export function createSidebarPageAiRenderRuntime(context) {
return;
}
conversation.innerHTML = historyRows.map(function(session) {
var title = String(session.title || '新会话').trim() || '新会话';
var preview = pageAiSessionPreviewText(session);
var previewHtml = pageAiHistoryPreviewIsDuplicate(title, preview) ? '' : '<span>' + escapeHtml(preview) + '</span>';
var active = session.id === pageUiState.pageAiActiveSessionId;
var selected = pageAiSessionSelected(session.id);
var usage = pageAiUsageSummary(session.usage);
var agentLabel = pageAiSessionAgentLabel(session);
var meta = [agentLabel, pageAiSessionStorageLabel(session), session.permissionLevel, session.shareId, session.status, usage].filter(Boolean).join(' · ');
return '' +
'<div class="wolai-page-ai-message wolai-page-ai-message--history' + (active ? ' is-active' : '') + '" data-page-ai-session-row="' + escapeHtml(session.id) + '" data-page-ai-session-agent="' + escapeHtml(pageAiSessionAgentFilterValue(session)) + '">' +
'<button type="button" class="wolai-page-ai-message-text" data-page-ai-session="' + escapeHtml(session.id) + '">' +
'<strong>' + escapeHtml(session.title || '新会话') + '</strong><br />' +
'<span>' + escapeHtml(preview) + '</span>' +
(meta ? '<br /><span class="wolai-page-ai-tool-meta">' + escapeHtml(meta) + '</span>' : '') +
'<div class="wolai-page-ai-message wolai-page-ai-message--history' + (active ? ' is-active' : '') + (selected ? ' is-selected' : '') + '" data-page-ai-session-row="' + escapeHtml(session.id) + '" data-page-ai-session-agent="' + escapeHtml(pageAiSessionAgentFilterValue(session)) + '">' +
'<button type="button" class="wolai-page-ai-session-check" data-page-ai-session-select="' + escapeHtml(session.id) + '" aria-checked="' + (selected ? 'true' : 'false') + '" aria-label="选择会话 ' + escapeHtml(session.title || session.id) + '">' +
'<span>' + (selected ? '✓' : '') + '</span>' +
'</button>' +
'<div class="wolai-page-ai-message-actions">' +
'<button type="button" class="wolai-page-ai-message-text wolai-page-ai-history-main" data-page-ai-session="' + escapeHtml(session.id) + '">' +
'<strong>' + escapeHtml(title) + '</strong>' +
previewHtml +
(meta ? '<span class="wolai-page-ai-tool-meta">' + escapeHtml(meta) + '</span>' : '') +
'</button>' +
'<div class="wolai-page-ai-message-actions wolai-page-ai-history-actions">' +
'<button type="button" class="wolai-page-ai-ghost" data-page-ai-session-resume="' + escapeHtml(session.id) + '">恢复</button>' +
'<button type="button" class="wolai-page-ai-ghost" data-page-ai-session-rename="' + escapeHtml(session.id) + '">重命名</button>' +
'<button type="button" class="wolai-page-ai-ghost" data-page-ai-session-delete="' + escapeHtml(session.id) + '">删除</button>' +
'<button type="button" class="wolai-page-ai-ghost wolai-page-ai-ghost--danger" data-page-ai-session-delete="' + escapeHtml(session.id) + '">删除</button>' +
'</div>' +
'</div>';
}).join('');