|
@@ -1,9 +1,9 @@
|
|
|
import { randomUUID } from "node:crypto"
|
|
import { randomUUID } from "node:crypto"
|
|
|
import { EventEmitter } from "node:events"
|
|
import { EventEmitter } from "node:events"
|
|
|
-import { existsSync } from "node:fs"
|
|
|
|
|
|
|
+import { existsSync, mkdirSync, rmSync } from "node:fs"
|
|
|
import * as http from "node:http"
|
|
import * as http from "node:http"
|
|
|
import { createServer } from "node:net"
|
|
import { createServer } from "node:net"
|
|
|
-import { homedir } from "node:os"
|
|
|
|
|
|
|
+import { homedir, tmpdir } from "node:os"
|
|
|
import { join } from "node:path"
|
|
import { join } from "node:path"
|
|
|
import { getCACertificates, setDefaultCACertificates } from "node:tls"
|
|
import { getCACertificates, setDefaultCACertificates } from "node:tls"
|
|
|
import type { Event } from "electron"
|
|
import type { Event } from "electron"
|
|
@@ -30,10 +30,17 @@ const APP_IDS: Record<string, string> = {
|
|
|
beta: "ai.opencode.desktop.beta",
|
|
beta: "ai.opencode.desktop.beta",
|
|
|
prod: "ai.opencode.desktop",
|
|
prod: "ai.opencode.desktop",
|
|
|
}
|
|
}
|
|
|
|
|
+const TEST_ONBOARDING = process.env.OPENCODE_TEST_ONBOARDING === "1"
|
|
|
const appId = app.isPackaged ? APP_IDS[CHANNEL] : "ai.opencode.desktop.dev"
|
|
const appId = app.isPackaged ? APP_IDS[CHANNEL] : "ai.opencode.desktop.dev"
|
|
|
|
|
+const onboardingTestRoot = setupOnboardingTestEnv()
|
|
|
app.setName(app.isPackaged ? APP_NAMES[CHANNEL] : "OpenCode Dev")
|
|
app.setName(app.isPackaged ? APP_NAMES[CHANNEL] : "OpenCode Dev")
|
|
|
app.setAppUserModelId(appId)
|
|
app.setAppUserModelId(appId)
|
|
|
-app.setPath("userData", join(app.getPath("appData"), appId))
|
|
|
|
|
|
|
+app.setPath(
|
|
|
|
|
+ "userData",
|
|
|
|
|
+ onboardingTestRoot ? join(onboardingTestRoot, "desktop") : join(app.getPath("appData"), appId),
|
|
|
|
|
+)
|
|
|
|
|
+if (onboardingTestRoot) app.setPath("sessionData", join(onboardingTestRoot, "session"))
|
|
|
|
|
+const logger = initLogging()
|
|
|
const { autoUpdater } = pkg
|
|
const { autoUpdater } = pkg
|
|
|
|
|
|
|
|
import type { InitStep, ServerReadyData, SqliteMigrationProgress, WslConfig } from "../preload/types"
|
|
import type { InitStep, ServerReadyData, SqliteMigrationProgress, WslConfig } from "../preload/types"
|
|
@@ -65,13 +72,29 @@ const loadingComplete = defer<void>()
|
|
|
const pendingDeepLinks: string[] = []
|
|
const pendingDeepLinks: string[] = []
|
|
|
|
|
|
|
|
const serverReady = defer<ServerReadyData>()
|
|
const serverReady = defer<ServerReadyData>()
|
|
|
-const logger = initLogging()
|
|
|
|
|
|
|
|
|
|
useSystemCertificates()
|
|
useSystemCertificates()
|
|
|
|
|
|
|
|
|
|
+function setupOnboardingTestEnv() {
|
|
|
|
|
+ if (!TEST_ONBOARDING) return
|
|
|
|
|
+
|
|
|
|
|
+ const root = join(tmpdir(), `opencode-onboarding-${randomUUID()}`)
|
|
|
|
|
+ rmSync(root, { recursive: true, force: true })
|
|
|
|
|
+ ;["data", "config", "cache", "state", "desktop", "session"].forEach((dir) =>
|
|
|
|
|
+ mkdirSync(join(root, dir), { recursive: true }),
|
|
|
|
|
+ )
|
|
|
|
|
+ process.env.OPENCODE_DB = ":memory:"
|
|
|
|
|
+ process.env.XDG_DATA_HOME = join(root, "data")
|
|
|
|
|
+ process.env.XDG_CONFIG_HOME = join(root, "config")
|
|
|
|
|
+ process.env.XDG_CACHE_HOME = join(root, "cache")
|
|
|
|
|
+ process.env.XDG_STATE_HOME = join(root, "state")
|
|
|
|
|
+ return root
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
logger.log("app starting", {
|
|
logger.log("app starting", {
|
|
|
version: app.getVersion(),
|
|
version: app.getVersion(),
|
|
|
packaged: app.isPackaged,
|
|
packaged: app.isPackaged,
|
|
|
|
|
+ onboardingTest: Boolean(onboardingTestRoot),
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
setupApp()
|
|
setupApp()
|
|
@@ -118,7 +141,7 @@ function setupApp() {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void app.whenReady().then(async () => {
|
|
void app.whenReady().then(async () => {
|
|
|
- migrate()
|
|
|
|
|
|
|
+ if (!TEST_ONBOARDING) migrate()
|
|
|
app.setAsDefaultProtocolClient("opencode")
|
|
app.setAsDefaultProtocolClient("opencode")
|
|
|
registerRendererProtocol()
|
|
registerRendererProtocol()
|
|
|
setDockIcon()
|
|
setDockIcon()
|
|
@@ -344,6 +367,8 @@ async function getSidecarPort() {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
function sqliteFileExists() {
|
|
function sqliteFileExists() {
|
|
|
|
|
+ if (process.env.OPENCODE_DB === ":memory:") return true
|
|
|
|
|
+
|
|
|
const xdg = process.env.XDG_DATA_HOME
|
|
const xdg = process.env.XDG_DATA_HOME
|
|
|
const base = xdg && xdg.length > 0 ? xdg : join(homedir(), ".local", "share")
|
|
const base = xdg && xdg.length > 0 ? xdg : join(homedir(), ".local", "share")
|
|
|
return existsSync(join(base, "opencode", "opencode.db"))
|
|
return existsSync(join(base, "opencode", "opencode.db"))
|