import { build } from 'esbuild' import { execFileSync } from 'node:child_process' import { buildRunner } from './build-runner.mjs' import { cp, mkdir, rm, readdir, readFile, writeFile } from 'node:fs/promises' import { resolve } from 'node:path' const root = resolve(import.meta.dirname, '..'), out = resolve(root, '.desktop-build') await rm(out, { recursive: true, force: true }) await mkdir(out, { recursive: true }) await build({ entryPoints: [resolve(root, 'src/server/index.ts')], outfile: resolve(out, 'server.mjs'), bundle: true, platform: 'node', format: 'esm', target: 'node24', external: ['vite'], banner: { js: "import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);" }, define: { 'process.env.NODE_ENV': '"production"' }, sourcemap: true, }) await buildRunner(out) const swiftTarget=process.arch==='arm64'?'arm64-apple-macosx12.0':'x86_64-apple-macosx12.0' execFileSync('xcrun',['swiftc','-O','-target',swiftTarget,resolve(root,'desktop/keychain-helper.swift'),'-o',resolve(out,'keychain-helper')],{stdio:'inherit'}) execFileSync('xcrun',['swiftc','-O','-target',swiftTarget,'-D','DEVELOPMENT_HELPER',resolve(root,'desktop/keychain-helper.swift'),'-o',resolve(out,'keychain-helper-dev')],{stdio:'inherit'}) await cp(resolve(root, 'dist'), resolve(out, 'ui'), { recursive: true }) await cp(resolve(root, 'release.json'), resolve(out, 'release.json')) await cp(resolve(root, 'public/icons/icon-512.png'), resolve(root, 'desktop/icon.png')) const shell = resolve(out, 'shell') await mkdir(shell) for (const file of await readdir(resolve(root, 'desktop'))) { if (file.endsWith('.test.mjs') || !/\.(mjs|cjs|html|css|png)$/.test(file)) continue await cp(resolve(root, 'desktop', file), resolve(shell, file)) } let commit='source-archive',dirty=false try{commit=execFileSync('git',['rev-parse','HEAD'],{cwd:root,encoding:'utf8'}).trim();dirty=!!execFileSync('git',['status','--porcelain'],{cwd:root,encoding:'utf8'}).trim()}catch{} await writeFile(resolve(out,'build-info.json'),JSON.stringify({commit,dirty,builtAt:new Date().toISOString()},null,2)+'\n') const manifest = JSON.parse(await readFile(resolve(root, 'release.json'), 'utf8')) await writeFile(resolve(shell, 'package.json'), JSON.stringify({ name: 'hermes-yaoyao-desktop', version: manifest.webVersion, productName: '夭夭', description: '夭夭:本地服务、多 Agent 团队与电脑工作空间', author: 'YaoYao contributors', license: 'BSL-1.1', main: 'main.mjs', type: 'module' }, null, 2)) console.log('桌面服务和界面已打包到 .desktop-build')