d35c806d5b
- Added comprehensive comments and JSDoc-style documentation to NotificationProvider, ThemeProvider, UserProvider, and WebsiteThemeProvider for better clarity and maintainability. - Improved type definitions in index.ts for better code understanding and usage. - Introduced Docker support with Dockerfiles for various services including AI server, signaling server, and browser-use service. - Created a docker-compose.yml file to orchestrate multiple services including PostgreSQL, AI, scraper, and frontend. - Added a startup guide (startup.txt) for setting up the CRM environment on Ubuntu with Docker. - Included a .dockerignore file to exclude unnecessary files from Docker builds.
59 lines
2.3 KiB
JavaScript
59 lines
2.3 KiB
JavaScript
// ── Ollama Launcher ────────────────────────────────────────────────
|
|
// Checks if Ollama is already running. If not, finds the binary and
|
|
// starts it as a detached background process.
|
|
// Cross-platform: uses tasklist (Windows) or pgrep (Linux/Mac) to
|
|
// detect running process; uses where/which to find the binary.
|
|
|
|
import { execSync, spawn } from "node:child_process"
|
|
import { platform } from "node:os"
|
|
|
|
/** Check if Ollama is already running by querying the OS process list. */
|
|
function isRunning() {
|
|
try {
|
|
if (platform() === "win32") {
|
|
execSync('tasklist /FI "IMAGENAME eq ollama.exe" 2>nul | findstr ollama', { stdio: "pipe", timeout: 3000 })
|
|
} else {
|
|
execSync('pgrep -x ollama', { stdio: "pipe", timeout: 3000 })
|
|
}
|
|
return true
|
|
} catch {
|
|
return false
|
|
}
|
|
}
|
|
|
|
/** Locate the Ollama binary via PATH, then fall back to common install directories. */
|
|
function findOllama() {
|
|
if (platform() === "win32") {
|
|
// Try PATH first, then common install locations
|
|
try {
|
|
return execSync("where ollama", { encoding: "utf8", timeout: 3000 }).trim().split("\n")[0]
|
|
} catch {}
|
|
const local = `${process.env.LOCALAPPDATA}\\Programs\\Ollama\\ollama.exe`
|
|
const programFiles = `${process.env.PROGRAMFILES}\\Ollama\\ollama.exe`
|
|
if (local) try { execSync(`"${local}" --version`, { stdio: "ignore", timeout: 2000 }); return local } catch {}
|
|
if (programFiles) try { execSync(`"${programFiles}" --version`, { stdio: "ignore", timeout: 2000 }); return programFiles } catch {}
|
|
} else {
|
|
try { return execSync("which ollama", { encoding: "utf8", timeout: 3000 }).trim() } catch {}
|
|
}
|
|
return null
|
|
}
|
|
|
|
if (!isRunning()) {
|
|
const bin = findOllama()
|
|
if (!bin) {
|
|
console.error("Ollama not found. Install from https://ollama.com")
|
|
process.exit(1)
|
|
}
|
|
console.log("Starting Ollama...")
|
|
// Spawn detached so it outlives this script and the npm process
|
|
if (platform() === "win32") {
|
|
spawn(bin, ["serve"], { stdio: "ignore", detached: true, windowsHide: true }).unref()
|
|
} else {
|
|
spawn(bin, ["serve"], { stdio: "ignore", detached: true }).unref()
|
|
}
|
|
// Give it a moment to start listening before we return control
|
|
execSync("sleep 3", { stdio: "ignore", timeout: 5000 })
|
|
} else {
|
|
console.log("Ollama already running")
|
|
}
|