diff --git a/package.json b/package.json index a3fc253..b76a57e 100644 --- a/package.json +++ b/package.json @@ -27,11 +27,10 @@ "scripts": { "test": "bun test test/**/*.test.js", "setup": "node scripts/init-env.js && pwsh -File scripts/setup-llama-server-vulkan.ps1 && pwsh -File scripts/setup-model.ps1", - "dev": "tauri dev --config src/backend/tauri.conf.json", - "build": "tauri build --config src/backend/tauri.conf.json", + "dev": "node scripts/prepare-resources.cjs && tauri dev --config src/backend/tauri.conf.json", + "build": "node scripts/prepare-resources.cjs && tauri build --config src/backend/tauri.conf.json", "tauri": "tauri", "release": "node scripts/release.js", - "mcp:install": "node scripts/install-mcp.js", "test:watch": "bun test --watch test/**/*.test.js" }, "devDependencies": { diff --git a/scripts/prepare-resources.cjs b/scripts/prepare-resources.cjs new file mode 100644 index 0000000..1e7924a --- /dev/null +++ b/scripts/prepare-resources.cjs @@ -0,0 +1,51 @@ +const fs = require('fs'); +const path = require('path'); + +const projectRoot = path.resolve(__dirname, '..'); +const targetDir = path.resolve(projectRoot, 'src/backend/bundled_resources'); + +function copyRecursiveSync(src, dest) { + const stats = fs.statSync(src); + if (stats.isDirectory()) { + if (!fs.existsSync(dest)) { + fs.mkdirSync(dest, { recursive: true }); + } + fs.readdirSync(src).forEach(childItemName => { + copyRecursiveSync(path.join(src, childItemName), path.join(dest, childItemName)); + }); + } else { + fs.copyFileSync(src, dest); + } +} + +// Ensure target directory exists +if (fs.existsSync(targetDir)) { + fs.rmSync(targetDir, { recursive: true, force: true }); +} +fs.mkdirSync(targetDir, { recursive: true }); + +// 1. Copy DLLs from bin/ to targetDir (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(targetDir, file); + console.log(`Copying ${src} to ${dest}`); + fs.copyFileSync(src, dest); + } + }); +} + +// 2. Copy everything from resources/ to targetDir (preserving structure) +const resDir = path.join(projectRoot, 'resources'); +if (fs.existsSync(resDir)) { + fs.readdirSync(resDir).forEach(child => { + const src = path.join(resDir, child); + const dest = path.join(targetDir, child); + console.log(`Copying ${src} to ${dest}`); + copyRecursiveSync(src, dest); + }); +} + +console.log('Resource preparation complete.'); diff --git a/src/backend/src/lib.rs b/src/backend/src/lib.rs index 246a901..f1e09de 100644 --- a/src/backend/src/lib.rs +++ b/src/backend/src/lib.rs @@ -208,19 +208,13 @@ exe_dir.display().to_string(), ]; - // Also include potential nested bin folders - path_candidates.push(res_dir.join("bin").display().to_string()); - path_candidates.push(exe_dir.join("bin").display().to_string()); - // Also include parent (one level up from resources/exe dir) - if let Some(parent) = res_dir.parent() { - path_candidates.push(parent.display().to_string()); - } - if let Some(parent) = exe_dir.parent() { - path_candidates.push(parent.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()); - let new_path = format!("{};{}", path_candidates.join(";"), old_path); - log::info!("Diagnostic: New Sidecar PATH: {}", new_path); + // Normalize paths to remove UNC prefix (\\?\) which can break some programs on Windows + let new_path = format!("{};{}", path_candidates.join(";"), old_path).replace("\\\\?\\", ""); + log::info!("Diagnostic: New Sidecar PATH (normalized): {}", new_path); let mut sidecar_cmd = sidecar.args(args).env("PATH", new_path); diff --git a/src/backend/tauri.conf.json b/src/backend/tauri.conf.json index b65e60e..ce0fd96 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/*", "../../bin/*.dll"], + "resources": ["bundled_resources/*"], "icon": [ "../../resources/icons/32x32.png", "../../resources/icons/128x128.png",