7dd2b2dc77
Adds a first-run Desktop choice between installing Hermes locally and connecting to an existing remote Hermes gateway. The choice appears after backend resolution but before ensureRuntime(), so selecting remote cannot accidentally trigger local bootstrap. New modules: - first-run-setup-gate: concurrent first-run decision gate and reset semantics - primary-backend-startup: Electron-free orchestration seam (saved remote resolution, gate decision, remote re-resolution, local continuation) - primary-connection-rehome: prevents dual-owner race where both cold boot() and renderer softSwitch() could connect simultaneously - first-run-remote-form: extracted remote form with stale-result guards Reuses existing connection-config IPC, encrypted token storage, OAuth session partition, and primary backend resolution. Fixes #38602 Fixes #36970
36 lines
1.1 KiB
TypeScript
36 lines
1.1 KiB
TypeScript
export interface PrimaryConnectionRehomeOptions {
|
|
clearLocalBootstrapFailure: () => void
|
|
mode: string
|
|
notifyConnectionApplied: () => void
|
|
resumeFirstRunRemote: () => boolean
|
|
teardownPrimaryBackend: (options: { soft: boolean }) => Promise<void>
|
|
}
|
|
|
|
// Production seam shared by the connection-config IPC handler and the
|
|
// first-run integration test. A remote apply that resumes the active setup
|
|
// gate must keep that connection attempt alive; ordinary mode changes tear the
|
|
// current backend down before the renderer is told to reconnect.
|
|
export async function rehomePrimaryConnection({
|
|
clearLocalBootstrapFailure,
|
|
mode,
|
|
notifyConnectionApplied,
|
|
resumeFirstRunRemote,
|
|
teardownPrimaryBackend
|
|
}: PrimaryConnectionRehomeOptions): Promise<{ resumedFirstRunRemote: boolean }> {
|
|
let resumedFirstRunRemote = false
|
|
|
|
if (mode === 'remote') {
|
|
resumedFirstRunRemote = resumeFirstRunRemote()
|
|
clearLocalBootstrapFailure()
|
|
}
|
|
|
|
if (resumedFirstRunRemote) {
|
|
return { resumedFirstRunRemote: true }
|
|
}
|
|
|
|
await teardownPrimaryBackend({ soft: true })
|
|
notifyConnectionApplied()
|
|
|
|
return { resumedFirstRunRemote: false }
|
|
}
|