build-server.mjs 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import * as esbuild from 'esbuild'
  2. import { resolve, dirname } from 'path'
  3. import { fileURLToPath } from 'url'
  4. import { chmodSync, cpSync, existsSync, mkdirSync, readdirSync, readFileSync, rmSync } from 'fs'
  5. const rootDir = resolve(dirname(fileURLToPath(import.meta.url)), '..')
  6. const pkg = JSON.parse(readFileSync(resolve(rootDir, 'package.json'), 'utf-8'))
  7. const version = pkg.version
  8. const serverOutDir = resolve(rootDir, 'dist/server')
  9. rmSync(serverOutDir, { recursive: true, force: true })
  10. mkdirSync(serverOutDir, { recursive: true })
  11. await esbuild.build({
  12. entryPoints: [resolve(rootDir, 'packages/server/src/index.ts')],
  13. bundle: true,
  14. platform: 'node',
  15. target: 'node23',
  16. format: 'cjs',
  17. outfile: resolve(serverOutDir, 'index.js'),
  18. external: ['node-pty', 'node:sqlite', 'socket.io'],
  19. define: {
  20. __APP_VERSION__: JSON.stringify(version),
  21. },
  22. sourcemap: true,
  23. minify: true,
  24. treeShaking: true,
  25. logLevel: 'info',
  26. })
  27. const bridgeOutDir = resolve(serverOutDir, 'agent-bridge', 'python')
  28. const bridgeSrcDir = resolve(rootDir, 'packages/server/src/services/hermes/agent-bridge/python')
  29. mkdirSync(bridgeOutDir, { recursive: true })
  30. for (const fileName of readdirSync(bridgeSrcDir)) {
  31. if (fileName.endsWith('.py')) {
  32. cpSync(resolve(bridgeSrcDir, fileName), resolve(bridgeOutDir, fileName))
  33. }
  34. }
  35. chmodSync(resolve(bridgeOutDir, 'hermes_bridge.py'), 0o755)
  36. const serverAssetsSrcDir = resolve(rootDir, 'packages/server/src/assets')
  37. if (existsSync(serverAssetsSrcDir)) {
  38. cpSync(serverAssetsSrcDir, resolve(serverOutDir, 'assets'), { recursive: true })
  39. }
  40. cpSync(
  41. resolve(rootDir, 'docs/openapi.json'),
  42. resolve(serverOutDir, 'openapi.json'),
  43. )
  44. const skillsOutDir = resolve(rootDir, 'dist/skills')
  45. rmSync(skillsOutDir, { recursive: true, force: true })
  46. cpSync(
  47. resolve(rootDir, 'packages/skills'),
  48. skillsOutDir,
  49. { recursive: true },
  50. )
  51. const firmwareOutDir = resolve(rootDir, 'dist/mcu')
  52. const legacyFirmwareOutPath = resolve(firmwareOutDir, 'firmware.bin')
  53. for (const firmwareVersion of ['v1', 'v2']) {
  54. const firmwareBuildSrc = resolve(rootDir, `packages/esp32-c3/${firmwareVersion}/.pio/build/esp32-c3-devkitm-1/firmware.bin`)
  55. const firmwareReleaseSrc = resolve(rootDir, `packages/esp32-c3/release/${firmwareVersion}/firmware.bin`)
  56. const firmwareVersionedOutDir = resolve(firmwareOutDir, firmwareVersion)
  57. const firmwareOutPath = resolve(firmwareVersionedOutDir, 'firmware.bin')
  58. let firmwareSrc = ''
  59. let sourceLabel = ''
  60. if (existsSync(firmwareBuildSrc)) {
  61. mkdirSync(dirname(firmwareReleaseSrc), { recursive: true })
  62. cpSync(firmwareBuildSrc, firmwareReleaseSrc)
  63. firmwareSrc = firmwareBuildSrc
  64. sourceLabel = 'PlatformIO build output'
  65. } else if (existsSync(firmwareReleaseSrc)) {
  66. firmwareSrc = firmwareReleaseSrc
  67. sourceLabel = 'release artifact'
  68. }
  69. if (!firmwareSrc) {
  70. console.warn(`[build-server] ESP32-C3 ${firmwareVersion} firmware not found, skipped dist/mcu/${firmwareVersion}/firmware.bin`)
  71. continue
  72. }
  73. mkdirSync(firmwareVersionedOutDir, { recursive: true })
  74. cpSync(firmwareSrc, firmwareOutPath)
  75. if (firmwareVersion === 'v1') cpSync(firmwareSrc, legacyFirmwareOutPath)
  76. console.log(`[build-server] ESP32-C3 ${firmwareVersion} firmware copied from ${sourceLabel}`)
  77. }
粤ICP备19079148号