worker-cmd.js
1 #!/usr/bin/env node 2 'use strict' 3 4 const { spawn } = require('node:child_process') 5 6 const { 7 BROWSER_PROFILES_DIR, 8 DATA_DIR, 9 PKG_ROOT, 10 SWARMCLAW_HOME, 11 WORKSPACE_DIR, 12 locateStandaloneServer, 13 } = require('./server-cmd.js') 14 15 function printHelp() { 16 const help = ` 17 Usage: swarmclaw worker [options] 18 19 Starts a dedicated background worker process for SwarmClaw to process background 20 queues and tasks independently of the Next.js web application. 21 22 Options: 23 -h, --help Show this help message 24 `.trim() 25 console.log(help) 26 } 27 28 function main(args = process.argv.slice(3)) { 29 for (const arg of args) { 30 if (arg === '-h' || arg === '--help') { 31 printHelp() 32 process.exit(0) 33 } else { 34 console.error(`[swarmclaw] Unknown argument: ${arg}`) 35 printHelp() 36 process.exit(1) 37 } 38 } 39 40 process.env.SWARMCLAW_HOME = SWARMCLAW_HOME 41 process.env.DATA_DIR = DATA_DIR 42 process.env.WORKSPACE_DIR = WORKSPACE_DIR 43 process.env.BROWSER_PROFILES_DIR = BROWSER_PROFILES_DIR 44 process.env.SWARMCLAW_DAEMON_BACKGROUND_SERVICES = '1' 45 process.env.SWARMCLAW_WORKER_ONLY = '1' 46 47 console.log('[swarmclaw] Starting dedicated background worker...') 48 console.log(`[swarmclaw] Package root: ${PKG_ROOT}`) 49 console.log(`[swarmclaw] Home: ${SWARMCLAW_HOME}`) 50 console.log(`[swarmclaw] Data directory: ${DATA_DIR}`) 51 console.log(`[swarmclaw] Workspace directory: ${WORKSPACE_DIR}`) 52 console.log(`[swarmclaw] Browser profiles: ${BROWSER_PROFILES_DIR}`) 53 54 const standalone = locateStandaloneServer() 55 if (!standalone) { 56 console.error('[swarmclaw] Standalone server.js not found in the installed package. Try running: swarmclaw server --build') 57 process.exit(1) 58 } 59 const { root: runtimeRoot, serverJs } = standalone 60 61 const child = spawn(process.execPath, [serverJs], { 62 cwd: runtimeRoot, 63 env: process.env, 64 stdio: 'inherit', 65 }) 66 67 child.on('exit', (code) => { 68 process.exit(code || 0) 69 }) 70 71 for (const sig of ['SIGINT', 'SIGTERM']) { 72 process.on(sig, () => child.kill(sig)) 73 } 74 } 75 76 if (require.main === module) { 77 main() 78 } 79 80 module.exports = { main }