/ bin / worker-cmd.js
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 }