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
@@ -519,6 +519,49 @@ export function createSidebarPageAiSessionRuntime(context) {
}) || null;
}
function pageAiSelectedSessionIds() {
if (!pageUiState.pageAiSelectedSessionIds || typeof pageUiState.pageAiSelectedSessionIds !== 'object') {
pageUiState.pageAiSelectedSessionIds = {};
}
return pageUiState.pageAiSelectedSessionIds;
}
function pageAiSessionSelected(sessionId) {
sessionId = String(sessionId || '').trim();
return Boolean(sessionId && pageAiSelectedSessionIds()[sessionId]);
}
function pageAiSelectedSessionList() {
var selected = pageAiSelectedSessionIds();
return Object.keys(selected).filter(function(sessionId) {
return selected[sessionId] === true;
});
}
function pageAiSelectedSessionCount() {
return pageAiSelectedSessionList().length;
}
function pageAiToggleSessionSelection(sessionId, selected) {
sessionId = String(sessionId || '').trim();
if (!sessionId) return;
var selectedMap = Object.assign({}, pageAiSelectedSessionIds());
if (selected === false) {
delete selectedMap[sessionId];
} else {
selectedMap[sessionId] = true;
}
pageUiState.pageAiSelectedSessionIds = selectedMap;
renderPageAiConversation();
renderPageAiControls();
}
function pageAiClearSessionSelection() {
pageUiState.pageAiSelectedSessionIds = {};
renderPageAiConversation();
renderPageAiControls();
}
function pageAiSyncCurrentSessionMessages() {
var session = pageAiCurrentSession();
if (!session) return;
@@ -585,30 +628,87 @@ export function createSidebarPageAiSessionRuntime(context) {
renderPageAiControls();
}
async function pageAiDeleteBackendSession(sessionId) {
var session = pageUiState.pageAiSessions.find(function(item) { return item.id === sessionId; });
if (!session) return;
if (!win.confirm('确定删除 AI 会话“' + (session.title || sessionId) + '”吗?')) return;
var response = await fetch('/api/hermes/client/sessions/' + encodeURIComponent(sessionId) + '?' + pageAiBackendSessionQuery({}), {
method: 'DELETE',
headers: { 'accept': 'application/json' }
function pageAiSessionRequiresBackendDelete(session) {
var id = String(session && session.id || '').trim();
var source = String(session && session.source || '').trim();
return Boolean(id && (
id.startsWith('mnote_')
|| source === 'acp'
|| String(session && session.persistence || '').trim()
|| String(session && (session.sessionStorage || session.session_storage) || '').trim()
));
}
function pageAiFindSessionById(sessionId) {
sessionId = String(sessionId || '').trim();
if (!sessionId) return null;
return pageAiNormalizeArray(pageUiState.pageAiSessions).find(function(item) {
return String(item && item.id || '').trim() === sessionId;
}) || pageAiNormalizeArray(pageUiState.pageAiSessionSearchResults).find(function(item) {
return String(item && item.id || '').trim() === sessionId;
}) || null;
}
function pageAiApplyDeletedSessionIds(sessionIds) {
var deleted = {};
pageAiNormalizeArray(sessionIds).forEach(function(sessionId) {
sessionId = String(sessionId || '').trim();
if (sessionId) deleted[sessionId] = true;
});
var payload = await response.json().catch(function(){ return null; });
if (!response.ok || !payload || payload.ok !== true) {
throw new Error(pageAiErrorMessage(payload, 'session_delete_failed_' + response.status));
}
pageUiState.pageAiSessions = pageUiState.pageAiSessions.filter(function(item) { return item.id !== sessionId; });
if (pageUiState.pageAiActiveSessionId === sessionId) {
pageUiState.pageAiSessions = pageAiNormalizeArray(pageUiState.pageAiSessions).filter(function(item) {
return !deleted[String(item && item.id || '').trim()];
});
pageUiState.pageAiSessionSearchResults = pageAiNormalizeArray(pageUiState.pageAiSessionSearchResults).filter(function(item) {
return !deleted[String(item && item.id || '').trim()];
});
var selected = Object.assign({}, pageAiSelectedSessionIds());
Object.keys(deleted).forEach(function(sessionId) { delete selected[sessionId]; });
pageUiState.pageAiSelectedSessionIds = selected;
if (deleted[pageUiState.pageAiActiveSessionId]) {
var next = pageUiState.pageAiSessions[0] || pageAiNewSession();
if (!pageUiState.pageAiSessions.length) pageUiState.pageAiSessions = [next];
pageUiState.pageAiActiveSessionId = next.id;
pageUiState.pageAiMessages = Array.isArray(next.messages) ? next.messages.slice() : [];
}
}
async function pageAiDeleteBackendSessions(sessionIds) {
var ids = pageAiNormalizeArray(sessionIds).map(function(sessionId) {
return String(sessionId || '').trim();
}).filter(Boolean);
if (!ids.length) return;
var sessions = ids.map(pageAiFindSessionById).filter(Boolean);
if (!sessions.length) return;
var confirmText = sessions.length === 1
? '确定删除 AI 会话“' + (sessions[0].title || sessions[0].id) + '”吗?'
: '确定删除选中的 ' + String(sessions.length) + ' 个 AI 会话吗?';
if (!win.confirm(confirmText)) return;
for (var index = 0; index < sessions.length; index += 1) {
var session = sessions[index];
if (!pageAiSessionRequiresBackendDelete(session)) continue;
var response = await fetch('/api/hermes/client/sessions/' + encodeURIComponent(session.id) + '?' + pageAiBackendSessionQuery({}), {
method: 'DELETE',
headers: { 'accept': 'application/json' }
});
var payload = await response.json().catch(function(){ return null; });
if (!response.ok || !payload || payload.ok !== true) {
throw new Error(pageAiErrorMessage(payload, 'session_delete_failed_' + response.status));
}
}
pageAiApplyDeletedSessionIds(sessions.map(function(session) { return session.id; }));
pageAiPersistSessions();
renderPageAiConversation();
renderPageAiControls();
}
async function pageAiDeleteBackendSession(sessionId) {
return pageAiDeleteBackendSessions([sessionId]);
}
async function pageAiDeleteSelectedBackendSessions() {
return pageAiDeleteBackendSessions(pageAiSelectedSessionList());
}
async function pageAiResumeBackendSession(sessionId) {
sessionId = String(sessionId || pageUiState.pageAiActiveSessionId || '').trim();
if (!sessionId) return;
@@ -676,11 +776,16 @@ export function createSidebarPageAiSessionRuntime(context) {
pageAiEnsureHermesSession,
pageAiRestoreHermesSession,
pageAiCurrentSession,
pageAiSessionSelected,
pageAiToggleSessionSelection,
pageAiClearSessionSelection,
pageAiSelectedSessionCount,
pageAiSyncCurrentSessionMessages,
pageAiSetActiveSession,
pageAiStartNewSession,
pageAiRenameBackendSession,
pageAiDeleteBackendSession,
pageAiDeleteSelectedBackendSessions,
pageAiResumeBackendSession,
pageAiCheckActiveRun
};