diff --git a/.gitignore b/.gitignore index b459a30..8c9c20f 100644 --- a/.gitignore +++ b/.gitignore @@ -54,3 +54,7 @@ # Compilation Artifacts src/backend/build_error*.txt src/backend/test_errors.txt +src/backend/bundled_resources +\ + +src/backend/build_assets/ diff --git a/scripts/prepare-resources.cjs b/scripts/prepare-resources.cjs index 9450019..5208352 100644 --- a/scripts/prepare-resources.cjs +++ b/scripts/prepare-resources.cjs @@ -3,7 +3,7 @@ const projectRoot = path.resolve(__dirname, '..'); const backendDir = path.resolve(projectRoot, 'src/backend'); -const resTargetDir = path.resolve(backendDir, 'resources'); +const buildAssetsDir = path.resolve(backendDir, 'build_assets'); function copyRecursiveSync(src, dest) { const stats = fs.statSync(src); @@ -19,52 +19,53 @@ } } -// Clean and recreate target directories -if (fs.existsSync(resTargetDir)) { - fs.rmSync(resTargetDir, { recursive: true, force: true }); +// Clean and recreate build_assets +console.log('Cleaning build_assets directory...'); +if (fs.existsSync(buildAssetsDir)) { + fs.rmSync(buildAssetsDir, { recursive: true, force: true }); } -fs.mkdirSync(resTargetDir, { recursive: true }); +fs.mkdirSync(buildAssetsDir, { recursive: true }); -// 1. Copy DLLs from bin/ to backend/ (flat) - These go to the APP ROOT in MSI +// 1. Copy DLLs from bin/ to build_assets/ (flat) const binDir = path.join(projectRoot, 'bin'); if (fs.existsSync(binDir)) { fs.readdirSync(binDir).forEach(file => { if (file.endsWith('.dll')) { const src = path.join(binDir, file); - const dest = path.join(backendDir, file); - console.log(`Copying ${src} to ${dest}`); + const dest = path.join(buildAssetsDir, file); + console.log(`[DLL] Copying ${file} to build_assets/`); fs.copyFileSync(src, dest); } }); } -// 2. Copy critical JSON files from root to resources/ +// 2. Copy critical JSON files to build_assets/ ['mcp.json', 'config.json'].forEach(file => { const src = path.join(projectRoot, file); if (fs.existsSync(src)) { - const dest = path.join(resTargetDir, file); - console.log(`Copying ${src} to ${dest}`); + const dest = path.join(buildAssetsDir, file); + console.log(`[JSON] Copying ${file} to build_assets/`); fs.copyFileSync(src, dest); } }); -// 3. Copy models/ to resources/models/ +// 3. Copy models/ to build_assets/models/ const modelsDir = path.join(projectRoot, 'models'); if (fs.existsSync(modelsDir)) { - const dest = path.join(resTargetDir, 'models'); - console.log(`Copying ${modelsDir} to ${dest}`); + const dest = path.join(buildAssetsDir, 'models'); + console.log(`[Models] Copying folder to build_assets/models/`); copyRecursiveSync(modelsDir, dest); } -// 4. Copy everything from resources/ to backend/resources/ (preserving structure) +// 4. Copy everything from resources/ to build_assets/ const resSrcDir = path.join(projectRoot, 'resources'); if (fs.existsSync(resSrcDir)) { fs.readdirSync(resSrcDir).forEach(child => { const src = path.join(resSrcDir, child); - const dest = path.join(resTargetDir, child); - console.log(`Copying ${src} to ${dest}`); + const dest = path.join(buildAssetsDir, child); + console.log(`[Resource] Copying ${child} to build_assets/`); copyRecursiveSync(src, dest); }); } -console.log('Resource preparation complete.'); +console.log('Resource preparation complete (build_assets isolated).'); diff --git a/src/backend/src/lib.rs b/src/backend/src/lib.rs index 52faa23..7614a82 100644 --- a/src/backend/src/lib.rs +++ b/src/backend/src/lib.rs @@ -27,18 +27,15 @@ fn get_mcp_info(app_handle: tauri::AppHandle) -> Result { let mut candidates = vec![PathBuf::from("mcp.json")]; - // Add resource dir candidates if let Ok(res_dir) = app_handle.path().resource_dir() { - candidates.push(res_dir.join("mcp.json")); - candidates.push(res_dir.join("resources").join("mcp.json")); + candidates.push(res_dir.join("build_assets").join("mcp.json")); } if let Ok(exe_path) = env::current_exe() { if let Some(exe_dir) = exe_path.parent() { let mut p = exe_dir.to_path_buf(); for _ in 0..5 { - candidates.push(p.join("mcp.json")); - candidates.push(p.join("resources").join("mcp.json")); + candidates.push(p.join("build_assets").join("mcp.json")); if !p.pop() { break; } } } @@ -86,8 +83,7 @@ } if let Ok(cwd) = env::current_dir() { config_paths.push(cwd.join("config.json")); } if let Ok(res_dir) = app_handle.path().resource_dir() { - config_paths.push(res_dir.join("config.json")); - config_paths.push(res_dir.join("resources").join("config.json")); + config_paths.push(res_dir.join("build_assets").join("config.json")); } for path in config_paths { @@ -146,9 +142,7 @@ if !cfg!(debug_assertions) { if let Ok(res_dir) = app_handle.path().resource_dir() { - candidates.push(res_dir.join("vec0.dll")); - // Also look in resources root in case it's placed there by bundle.resources - candidates.push(res_dir.join("bin").join("vec0.dll")); + candidates.push(res_dir.join("build_assets").join("vec0.dll")); } } @@ -192,14 +186,17 @@ .map(|p| p.parent().map(|parent| parent.to_path_buf()).unwrap_or_default()) .unwrap_or_default(); - // Preference: res_dir > exe_dir - let base_dir = if res_dir.exists() { res_dir.clone() } else { exe_dir.clone() }; + // Preference: build_assets Dir in resDir + let build_assets_dir = res_dir.join("build_assets"); + let base_dir = if build_assets_dir.exists() { build_assets_dir } else { exe_dir.join("build_assets") }; - // Model path could be in models/ or resources/models/ + // Model path should be in build_assets/models/ let mut model_path = base_dir.join("models").join("embeddinggemma-300m-q4_0.gguf"); if !model_path.exists() { - model_path = base_dir.join("resources").join("models").join("embeddinggemma-300m-q4_0.gguf"); + // Fallback or absolute path search if needed + model_path = base_dir.join("models").join("embeddinggemma-300m-q4_0.gguf"); } + log::info!("Using base_dir for sidecar: {:?}", base_dir); log::info!("Using model path for sidecar: {:?}", model_path); // Prepare arguments @@ -229,13 +226,8 @@ // Comprehensive PATH candidates let old_path = std::env::var("PATH").unwrap_or_default(); let mut path_candidates = vec![ - res_dir.display().to_string(), - exe_dir.display().to_string(), + base_dir.display().to_string(), ]; - - // Also include potential nested bin/resources folders - path_candidates.push(res_dir.join("resources").display().to_string()); - path_candidates.push(exe_dir.join("resources").display().to_string()); // Normalize paths to remove UNC prefix (\\?\) which can break some programs on Windows let new_path = format!("{};{}", path_candidates.join(";"), old_path).replace("\\\\?\\", ""); @@ -243,14 +235,10 @@ let mut sidecar_cmd = sidecar.args(args).env("PATH", new_path); - // Set current directory to the resource folder (where DLLs should be) - // Preference: res_dir > exe_dir - if res_dir.exists() { - log::info!("Setting sidecar current_dir to: {:?}", res_dir); - sidecar_cmd = sidecar_cmd.current_dir(&res_dir); - } else if exe_dir.exists() { - log::info!("Setting sidecar current_dir to: {:?}", exe_dir); - sidecar_cmd = sidecar_cmd.current_dir(&exe_dir); + // Set current directory to the base_dir (where DLLs are) + if base_dir.exists() { + log::info!("Setting sidecar current_dir to: {:?}", base_dir); + sidecar_cmd = sidecar_cmd.current_dir(&base_dir); } let (mut rx, _child) = match sidecar_cmd.spawn() { diff --git a/src/backend/tauri.conf.json b/src/backend/tauri.conf.json index be1ced2..ed493b9 100644 --- a/src/backend/tauri.conf.json +++ b/src/backend/tauri.conf.json @@ -28,7 +28,7 @@ "active": true, "targets": "all", "externalBin": ["../../bin/llama-server"], - "resources": ["resources/**/*", "*.dll"], + "resources": ["build_assets/**/*"], "icon": [ "../../resources/icons/32x32.png", "../../resources/icons/128x128.png",