diff --git a/rust/crates/mnote-web/browser/sidebar-page-settings-runtime.js b/rust/crates/mnote-web/browser/sidebar-page-settings-runtime.js
index 649dbfc1..b6fa6927 100644
--- a/rust/crates/mnote-web/browser/sidebar-page-settings-runtime.js
+++ b/rust/crates/mnote-web/browser/sidebar-page-settings-runtime.js
@@ -670,7 +670,7 @@ export function createSidebarPageSettingsRuntime(context) {
'' +
'
' +
'' +
- '' +
+ '' +
'' +
'' +
'
' +
@@ -1058,6 +1058,17 @@ export function createSidebarPageSettingsRuntime(context) {
});
}
+ function knowledgeRagIndexedRootValues() {
+ var status = currentKnowledgeRagSummary().status || {};
+ var registry = status.registry && typeof status.registry === 'object' ? status.registry : {};
+ var roots = Array.isArray(registry.indexedRoots) ? registry.indexedRoots : [];
+ return roots.map(function(root) {
+ return String(root && (root.rootRelativePath || root.root_relative_path) || '').trim();
+ }).filter(Boolean).filter(function(value, index, list) {
+ return list.indexOf(value) === index;
+ });
+ }
+
function knowledgeRagCurrentFilter() {
return pageUiState.knowledgeRagSourceFilter || 'attention';
}
@@ -1503,11 +1514,12 @@ export function createSidebarPageSettingsRuntime(context) {
async function ingestKnowledgeRagSources() {
if (!knowledgeRagIsAvailable()) return;
var sources = knowledgeRagSourceInputValues();
+ if (!sources.length) sources = knowledgeRagIndexedRootValues();
if (!sources.length) {
pageUiState.knowledgeRagSummary = Object.assign({}, currentKnowledgeRagSummary(), {
scopeKey: knowledgeRagScopeKey(),
loading: false,
- error: '请先填写要索引的资料路径'
+ error: '请先填写要索引的资料路径,或保留至少一个已保存的索引范围'
});
renderKnowledgeRagSettings();
return;
diff --git a/rust/crates/mnote-web/browser/sidebar-tree-runtime.js b/rust/crates/mnote-web/browser/sidebar-tree-runtime.js
index 4efabc66..a0037954 100644
--- a/rust/crates/mnote-web/browser/sidebar-tree-runtime.js
+++ b/rust/crates/mnote-web/browser/sidebar-tree-runtime.js
@@ -2135,12 +2135,12 @@ import { createSidebarPageSettingsRuntime } from './sidebar-page-settings-runtim
'' +
'仅匹配标题' +
'精确匹配' +
- '资料库模式' +
+ '资料库模式' +
'按编辑时间' +
'按创建时间' +
'
' +
'' +
- '全盘资料库' +
+ '全盘资料库' +
'页面内搜索' +
'折叠同来源' +
'
' +
@@ -2152,7 +2152,9 @@ import { createSidebarPageSettingsRuntime } from './sidebar-page-settings-runtim
document.body.appendChild(overlay);
var input = overlay.querySelector('[data-testid="wolai-search-input"]');
var closeButton = overlay.querySelector('[data-testid="wolai-search-close"]');
- applySearchSwitchState(overlay, { collapseSource: readSearchCollapseSourcesDefault() });
+ applySearchSwitchState(overlay, { knowledge: true, collapseSource: readSearchCollapseSourcesDefault() });
+ var initialKnowledgeModeSelect = overlay.querySelector('[data-search-knowledge-mode]');
+ if (initialKnowledgeModeSelect && 'value' in initialKnowledgeModeSelect) initialKnowledgeModeSelect.value = 'exact';
if (input) input.addEventListener('input', function() {
searchUiState.hasRendered = false;
scheduleSearchResultsRender();
@@ -2194,7 +2196,7 @@ import { createSidebarPageSettingsRuntime } from './sidebar-page-settings-runtim
metaHtml: '',
resultsHtml: '',
items: [],
- knowledgeMode: 'mix',
+ knowledgeMode: 'exact',
sourceCollapsed: {},
scrollTop: 0,
signature: '',
@@ -2345,7 +2347,7 @@ import { createSidebarPageSettingsRuntime } from './sidebar-page-settings-runtim
if (input && 'value' in input) input.value = searchUiState.query || '';
applySearchSwitchState(overlay, searchUiState.switches);
var knowledgeModeSelect = overlay.querySelector('[data-search-knowledge-mode]');
- if (knowledgeModeSelect && 'value' in knowledgeModeSelect) knowledgeModeSelect.value = searchUiState.knowledgeMode || 'mix';
+ if (knowledgeModeSelect && 'value' in knowledgeModeSelect) knowledgeModeSelect.value = searchUiState.knowledgeMode || 'exact';
if (options instanceof HTMLElement) options.hidden = !searchText(searchUiState.query);
if (meta && searchUiState.metaHtml) meta.innerHTML = searchUiState.metaHtml;
if (results && searchUiState.resultsHtml) {
diff --git a/rust/crates/mnote-web/src/routes/knowledge_rag.rs b/rust/crates/mnote-web/src/routes/knowledge_rag.rs
index 468c0955..5e77268c 100644
--- a/rust/crates/mnote-web/src/routes/knowledge_rag.rs
+++ b/rust/crates/mnote-web/src/routes/knowledge_rag.rs
@@ -369,7 +369,27 @@ pub async fn ingest(
let mut expanded_count = 0usize;
let mut seen_sources = BTreeSet::::new();
let force = body.force.unwrap_or(false);
- for source in body.sources {
+ let mut requested_sources = body.sources;
+ if requested_sources.is_empty() {
+ requested_sources = registry
+ .indexed_roots
+ .iter()
+ .map(|root| KnowledgeRagSourceInput {
+ source_path: Some(root.root_relative_path.clone()),
+ path: None,
+ parser_hint: None,
+ })
+ .collect();
+ }
+ if requested_sources.is_empty() {
+ return Err(WebError::bad_request_code(
+ "knowledge_rag_source_required",
+ "资料库索引缺少 sourcePath,且没有可重建的已保存索引范围",
+ )
+ .with_context(&context));
+ }
+
+ for source in requested_sources {
let source_path = source.source_path.or(source.path).ok_or_else(|| {
WebError::bad_request_code("knowledge_rag_source_required", "资料库索引缺少 sourcePath")
.with_context(&context)
@@ -1087,7 +1107,8 @@ fn normalize_knowledge_rag_search_mode(mode: Option<&str>) -> String {
Some("hybrid") => "hybrid".into(),
Some("naive" | "vector") => "naive".into(),
Some("mix" | "mixed") => "mix".into(),
- _ => "mix".into(),
+ Some(_) => "mix".into(),
+ None => "exact".into(),
}
}
@@ -4718,7 +4739,7 @@ mod tests {
normalize_knowledge_rag_search_mode(Some("hybrid")),
"hybrid"
);
- assert_eq!(normalize_knowledge_rag_search_mode(None), "mix");
+ assert_eq!(normalize_knowledge_rag_search_mode(None), "exact");
}
#[test]
diff --git a/rust/crates/mnote-web/src/ssr/pages/layout.rs b/rust/crates/mnote-web/src/ssr/pages/layout.rs
index 335d018b..c2fe9efb 100644
--- a/rust/crates/mnote-web/src/ssr/pages/layout.rs
+++ b/rust/crates/mnote-web/src/ssr/pages/layout.rs
@@ -568,6 +568,11 @@ mod tests {
assert!(SIDEBAR_TREE_RUNTIME_JS.contains("pruneKnowledgeRagRegistry"));
assert!(SIDEBAR_TREE_RUNTIME_JS.contains("setKnowledgeRagSourceFilter"));
assert!(SIDEBAR_TREE_RUNTIME_JS.contains("mnote:knowledge-rag-source-updated"));
+ assert!(
+ SIDEBAR_TREE_RUNTIME_JS.contains(r#""#)
+ );
+ assert!(SIDEBAR_TREE_RUNTIME_JS
+ .contains(r#"data-search-switch="knowledge" role="switch" aria-checked="true""#));
assert!(SIDEBAR_FILETREE_COMMAND_RUNTIME_JS.contains("knowledgeRagSourceRelativePath"));
assert!(SIDEBAR_FILETREE_COMMAND_RUNTIME_JS.contains("supportsKnowledgeRagSource"));
assert!(!SIDEBAR_FILETREE_COMMAND_RUNTIME_JS.contains("runLocalOcr"));