Improve local evidence search and AI capabilities

This commit is contained in:
lix-2026
2026-06-05 23:00:53 +08:00
parent a1dcfc9f76
commit 4dbd9a978b
52 changed files with 6415 additions and 527 deletions
@@ -740,8 +740,15 @@ export function createSidebarPageSettingsRuntime(context) {
var status = summary.status || {};
var settings = status.settings && typeof status.settings === 'object' ? status.settings : {};
var includePaths = Array.isArray(settings.includePaths) ? settings.includePaths : ['.'];
statusNode.textContent = '索引 ' + Number(status.documentCount || 0) + ' 个页面 / ' + Number(status.resourceCount || 0) + ' 个资源 / ' + Number(status.evidenceBlockCount || 0) + ' 个证据块' + (status.scheduledDue ? ',已到计划时间' : '');
var savedIncludePaths = Array.isArray(settings.includePaths) ? settings.includePaths : [];
var indexedPaths = Array.isArray(status.indexedPaths) ? status.indexedPaths : [];
var includePaths = savedIncludePaths.length ? savedIncludePaths : indexedPaths;
var hasIndexCache = status.indexExists === true || status.evidenceIndexExists === true;
if (!savedIncludePaths.length && !hasIndexCache) {
statusNode.textContent = '未设置索引范围';
} else {
statusNode.textContent = '索引 ' + Number(status.documentCount || 0) + ' 个页面 / ' + Number(status.resourceCount || 0) + ' 个资源 / ' + Number(status.evidenceBlockCount || 0) + ' 个证据块' + (status.scheduledDue ? ',已到计划时间' : '');
}
if (!(rangesNode instanceof HTMLElement) || !rangesNode.contains(document.activeElement)) {
renderLocalIndexRangeRows(popover, includePaths, localIndexStatusKind(status), false, status);
}
@@ -762,6 +769,9 @@ export function createSidebarPageSettingsRuntime(context) {
function localIndexStatusKind(status) {
if (!status || typeof status !== 'object') return 'fault';
var settings = status.settings && typeof status.settings === 'object' ? status.settings : {};
var includePaths = Array.isArray(settings.includePaths) ? settings.includePaths : [];
if (!includePaths.length && status.indexExists !== true && status.evidenceIndexExists !== true) return 'indexed';
if (status.indexExists !== true) return 'fault';
if (status.cacheMatchesSettings === true && status.scheduledDue !== true) return 'indexed';
return 'indexing';
@@ -774,10 +784,10 @@ export function createSidebarPageSettingsRuntime(context) {
}
function localIndexPathStatusKind(path, status, fallbackKind) {
if (fallbackKind === 'fault' || fallbackKind === 'indexing') return fallbackKind;
var indexedPaths = Array.isArray(status && status.indexedPaths) ? status.indexedPaths : [];
var normalizedPath = String(path || '').trim() || '.';
if (indexedPaths.indexOf(normalizedPath) >= 0 && status.cacheMatchesSettings === true) return 'indexed';
if (indexedPaths.indexOf(normalizedPath) >= 0 && status.indexExists === true) return 'indexed';
if (fallbackKind === 'fault' || fallbackKind === 'indexing') return fallbackKind;
if (status.indexExists === true) return 'indexing';
return 'fault';
}
@@ -789,13 +799,26 @@ export function createSidebarPageSettingsRuntime(context) {
return String(value || '').trim();
}) : [];
var paths = disabled ? rawPaths.filter(Boolean) : rawPaths;
if (!paths.length && !disabled) paths = ['.'];
var savedPaths = Array.isArray(status && status.settings && status.settings.includePaths)
? status.settings.includePaths.map(function(value) { return String(value || '').trim(); }).filter(Boolean)
: [];
var indexedPaths = Array.isArray(status && status.indexedPaths)
? status.indexedPaths.map(function(value) { return String(value || '').trim(); }).filter(Boolean)
: [];
rangesNode.innerHTML = paths.map(function(path, index) {
var isPersisted = savedPaths.indexOf(path) >= 0 || indexedPaths.indexOf(path) >= 0;
var inputDisabled = disabled || isPersisted;
var kind = localIndexPathStatusKind(path, status || {}, fallbackKind || 'fault');
var normalizedPath = String(path || '').trim() || '.';
var displayPath = inputDisabled && normalizedPath === '.' ? '工作区根目录(全部)' : path;
var rootScopeHint = normalizedPath === '.'
? '<span class="wolai-page-settings-index-root-hint">当前工作区全部</span>'
: '';
return '' +
'<div class="wolai-page-settings-index-range-row" data-local-index-range-row="true">' +
'<span class="wolai-page-settings-index-status-dot" data-index-status="' + kind + '" title="' + escapeHtml(localIndexStatusLabel(kind)) + '"></span>' +
'<input type="text" class="wolai-page-settings-index-path" data-local-index-range-input="true" value="' + escapeHtml(path) + '" spellcheck="false"' + (disabled ? ' disabled' : '') + ' />' +
'<input type="text" class="wolai-page-settings-index-path" data-local-index-range-input="true" data-local-index-value="' + escapeHtml(normalizedPath) + '" value="' + escapeHtml(displayPath) + '" spellcheck="false"' + (inputDisabled ? ' disabled' : '') + (isPersisted ? ' data-local-index-persisted="true" title="已保存的索引目录不能直接修改;删除后重新新增范围"' : '') + ' />' +
rootScopeHint +
'<button type="button" class="wolai-page-settings-index-remove" data-local-index-action="remove-path" data-local-index-path-index="' + String(index) + '"' + (disabled ? ' disabled' : '') + ' aria-label="删除索引范围">×</button>' +
'</div>';
}).join('');
@@ -860,16 +883,17 @@ export function createSidebarPageSettingsRuntime(context) {
function localIndexIncludePathsFromForm() {
var popover = ensureLocalIndexSettingsPopover();
var values = currentLocalIndexRangeValues(popover).map(function(value) {
return currentLocalIndexRangeValues(popover).map(function(value) {
return value.trim();
}).filter(Boolean);
return values.length ? values : ['.'];
}
function currentLocalIndexRangeValues(popover) {
var root = popover || ensureLocalIndexSettingsPopover();
return Array.from(root.querySelectorAll('[data-local-index-range-input]')).map(function(input) {
return input instanceof HTMLInputElement ? input.value : '';
if (!(input instanceof HTMLInputElement)) return '';
if (input.disabled && input.dataset.localIndexValue) return input.dataset.localIndexValue;
return input.value;
});
}
@@ -901,7 +925,6 @@ export function createSidebarPageSettingsRuntime(context) {
var summary = pageUiState.localIndexSummary || {};
var values = currentLocalIndexRangeValues(popover);
values.splice(Number(index || 0), 1);
if (!values.length) values = [''];
renderLocalIndexRangeRows(popover, values, localIndexStatusKind(summary.status || {}), false, summary.status || {});
}