chore: harden lightrag knowledge rag runtime
This commit is contained in:
@@ -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
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user