Files
sim/apps/desktop/scripts/build.ts
T
Siddharth Ganesan 5ab5f2c7ed feat(browser, terminal): implement browser driver, password manager, terminal features (#6196)
* icon styling

* feat(desktop): isolate chat browser and terminal sessions

* feat(desktop): uncap browser and terminal tabs

* feat(desktop): polish browser and terminal resources

* improvement desktop

* fixes

* updates

* fixes

* fix

* update tests
2026-08-03 16:00:04 -07:00

87 lines
2.9 KiB
TypeScript

import { cpSync, rmSync } from 'node:fs'
import { build } from 'esbuild'
import { identityForOrigin } from './channels'
const watch = process.argv.includes('--watch')
// Optional build-time default server origin (pre-release shares pointed at a
// non-prod environment): SIM_DESKTOP_DEFAULT_ORIGIN=https://www.dev.sim.ai.
// Baked into the bundle so it applies to fresh installs with no settings —
// unlike the SIM_DESKTOP_ORIGIN env var, which only affects terminal-launched
// processes. Official builds leave it unset (default https://www.sim.ai).
const bakedDefaultOrigin = process.env.SIM_DESKTOP_DEFAULT_ORIGIN ?? ''
if (
bakedDefaultOrigin &&
!/^https:\/\/[^\s/]+$/.test(bakedDefaultOrigin) &&
!/^http:\/\/(localhost|127\.0\.0\.1)(:\d+)?$/.test(bakedDefaultOrigin)
) {
console.error(
`SIM_DESKTOP_DEFAULT_ORIGIN must be a bare https origin or http://localhost (got "${bakedDefaultOrigin}")`
)
process.exit(1)
}
if (bakedDefaultOrigin) {
console.log(`• Baking default server origin: ${bakedDefaultOrigin}`)
}
const appIcon = identityForOrigin(bakedDefaultOrigin).icon
const generatedIcon = 'build/generated-icon.icon'
rmSync(generatedIcon, { force: true, recursive: true })
cpSync(appIcon, generatedIcon, { recursive: true })
console.log(`• Selecting desktop icon: ${appIcon}`)
const common = {
bundle: true,
platform: 'node' as const,
format: 'cjs' as const,
target: 'node22',
sourcemap: true,
// node-pty resolves a prebuilt .node binary at runtime, so it must stay
// external and be loaded from node_modules rather than inlined here.
external: ['electron', '@lydell/node-pty'],
tsconfig: 'tsconfig.json',
logLevel: 'info' as const,
define: {
'process.env.SIM_DESKTOP_DEFAULT_ORIGIN': JSON.stringify(bakedDefaultOrigin),
},
}
async function run(): Promise<void> {
if (watch) {
const { context } = await import('esbuild')
const mainCtx = await context({
...common,
entryPoints: ['src/main/index.ts'],
outfile: 'dist/main.cjs',
})
const preloadCtx = await context({
...common,
entryPoints: ['src/preload/index.ts'],
outfile: 'dist/preload.cjs',
})
// Separate from the main-window preload: this one is injected into
// untrusted pages in the built-in browser and must stay minimal.
const browserPreloadCtx = await context({
...common,
entryPoints: ['src/preload/browser/index.ts'],
outfile: 'dist/browser-preload.cjs',
})
await Promise.all([mainCtx.watch(), preloadCtx.watch(), browserPreloadCtx.watch()])
return
}
await Promise.all([
build({ ...common, entryPoints: ['src/main/index.ts'], outfile: 'dist/main.cjs' }),
build({ ...common, entryPoints: ['src/preload/index.ts'], outfile: 'dist/preload.cjs' }),
build({
...common,
entryPoints: ['src/preload/browser/index.ts'],
outfile: 'dist/browser-preload.cjs',
}),
])
}
run().catch((error) => {
console.error(error)
process.exit(1)
})