Use isolated document extraction in shared indexing and desktop reconciliation

This commit is contained in:
karl committed 2026-10-13 15:17:42 +02:00
1 parent 844fdbf89f
commit ab31870260
8 files changed
+378 -23

No files matched your search

+15 -1
View File
@@ -45,6 +45,7 @@ struct AppState {
semantic: Arc<SemanticState>,
watching: Arc<watching::WatchService>,
index_options: searchi_core::IndexOptions,
document_worker: PathBuf,
previews: Arc<media_preview::PreviewRegistry>,
}
@@ -446,6 +447,7 @@ async fn index_folder(root: String, state: State<'_, AppState>) -> Result<IndexR
let lexical = state.lexical.clone();
let watching = state.watching.clone();
let options = state.index_options.clone();
let document_worker = state.document_worker.clone();
tauri::async_runtime::spawn_blocking(move || {
let _guard = guard;
settings
@@ -454,6 +456,7 @@ async fn index_folder(root: String, state: State<'_, AppState>) -> Result<IndexR
.add_root(std::path::Path::new(&root))?;
watching.add_root(std::fs::canonicalize(&root).map_err(|error| error.to_string())?)?;
let mut index = SearchIndex::open(database).map_err(|error| error.to_string())?;
index.set_document_worker(document_worker);
let report = index
.index_folder_with_options(root, &options)
.map_err(|error| error.to_string())?;
@@ -476,6 +479,7 @@ fn start_folder_watching(
indexing: Arc<AtomicBool>,
roots: Vec<PathBuf>,
options: searchi_core::IndexOptions,
document_worker: PathBuf,
) -> Result<watching::WatchService, String> {
watching::WatchService::start(roots, options.excluded_paths.clone(), move |request| {
if indexing
@@ -488,6 +492,7 @@ fn start_folder_watching(
let _ = app.emit("folder-indexing-changed", ());
let result = (|| -> Result<bool, String> {
let mut index = SearchIndex::open(&database).map_err(|error| error.to_string())?;
index.set_document_worker(document_worker.clone());
let report = match request.paths {
Some(paths) => index.index_paths_cancellable(
&request.root,
@@ -566,6 +571,14 @@ fn main() {
)?;
std::fs::create_dir_all(&directory)?;
let database = directory.join("searchi.sqlite");
// Bundle resources live outside the executable directory on macOS.
let document_worker = std::env::var_os("SEARCHI_EXTRACT_WORKER")
.map(PathBuf::from)
.unwrap_or(app.path().resource_dir()?.join(if cfg!(windows) {
"searchi-extract-worker.exe"
} else {
"searchi-extract-worker"
}));
let lexical = Arc::new(Mutex::new(SearchIndex::open(&database)?));
let warm_database = database.clone();
let warm_target = lexical.clone();
@@ -632,7 +645,7 @@ fn main() {
let indexing = Arc::new(AtomicBool::new(false));
let watching = Arc::new(start_folder_watching(
app.handle().clone(), database.clone(), lexical.clone(), indexing.clone(),
settings.value.roots.clone(), index_options.clone(),
settings.value.roots.clone(), index_options.clone(), document_worker.clone(),
).map_err(std::io::Error::other)?);
let semantic = Arc::new(
SemanticState::new(model_directory, worker, media_tools)
@@ -666,6 +679,7 @@ fn main() {
semantic,
watching,
index_options,
document_worker,
previews: previews.clone(),
});
Ok(())