start-dashboard.js 1.8 KB

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