mirror of
https://github.com/simstudioai/sim.git
synced 2026-09-24 15:45:35 +08:00
* 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
87 lines
2.9 KiB
TypeScript
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)
|
|
})
|