start-dashboard.js 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. const fs = require('fs');
  2. const path = require('path');
  3. const { spawn } = require('child_process');
  4. const { applyWorkspaceContext } = require('../mcp/src/core/runtime-context');
  5. const packageRoot = path.resolve(__dirname, '..');
  6. applyWorkspaceContext({ packageRoot });
  7. const { ensureRelayDaemon } = require('../mcp/src/core/relay-daemon');
  8. const { callbackRuntimeLauncher } = require('../mcp/src/core/runtime-launcher');
  9. const { startServer } = require('../mcp/src/dashboard/server');
  10. function ensureCallbackRuntime() {
  11. const statePath = path.join(packageRoot, 'outputs', 'runtime', 'qiwei-runtime.json');
  12. let state = {};
  13. try { state = JSON.parse(fs.readFileSync(statePath, 'utf8')); } catch {}
  14. const pid = Number(state.pid || 0);
  15. const alive = pid > 0
  16. ? (() => { try { process.kill(pid, 0); return true; } catch { return false; } })()
  17. : false;
  18. if (alive && ['starting', 'running'].includes(state.status)) {
  19. console.log(`[start-dashboard] callback runtime 已在运行 (pid=${pid})`);
  20. return;
  21. }
  22. const launcher = callbackRuntimeLauncher(['start', '--no-dashboard']);
  23. fs.mkdirSync(path.join(packageRoot, 'outputs', 'runtime'), { recursive: true });
  24. const outFd = fs.openSync(path.join(packageRoot, 'outputs', 'runtime', 'runtime.stdout.log'), 'a');
  25. const errFd = fs.openSync(path.join(packageRoot, 'outputs', 'runtime', 'runtime.stderr.log'), 'a');
  26. const child = spawn(launcher.command, launcher.args, {
  27. cwd: packageRoot,
  28. detached: true,
  29. stdio: ['ignore', outFd, errFd],
  30. windowsHide: true,
  31. });
  32. fs.closeSync(outFd);
  33. fs.closeSync(errFd);
  34. child.unref();
  35. console.log(`[start-dashboard] 已同步拉起 callback runtime (pid=${child.pid})`);
  36. }
  37. ensureCallbackRuntime();
  38. ensureRelayDaemon();
  39. startServer().catch(error => {
  40. console.error('启动 Dashboard 失败:', error);
  41. process.exit(1);
  42. });