Files
orca/src/preload/api/managed-orcad-api.ts
T
Neil 904b6f2b32 fix(ssh): flag a macOS host whose managed server outlived its launching SSH session (#29371)
* fix(ssh): flag a macOS host whose managed server outlived its launching SSH session

macOS Local Network privacy pins a nohup-launched orcad to the sshd-session
that started it; once that session ends, its terminals lose LAN access (#25934).
A macOS launch now records that session, a connect reports it when it proved
exited, and the host status offers a restart when no terminals are running.

* fix(ssh): retire the idle terminal daemon on a launch-session restart

* fix(ssh): keep the fence on an unsettled restart stop, and report a restart that can't hold its session

* fix(ssh): carry the launch session forward while the terminal daemon survives; never redial for the check

* chore(i18n): add the launch-session warning and restart strings to the English catalog
2026-10-15 23:14:45 -07:00

78 lines
4.1 KiB
TypeScript

/** Managed orcad servers over SSH; desktop-only, so web clients leave it undefined. */
import { ipcRenderer } from 'electron'
import type {
OrcadDeltaMovePreview,
OrcadDeltaMoveResult,
OrcadManagedCancelStopResult,
OrcadManagedConversionResult,
OrcadManagedDeployResult,
OrcadManagedForgetResult,
OrcadManagedPendingMigrationRow,
OrcadManagedRecoveryResult,
OrcadManagedRestartResult,
OrcadManagedRollbackResult,
OrcadManagedRuntimeStatus,
OrcadManagedStopResult
} from '../../shared/orcad-managed-runtime'
import type { PublicKnownRuntimeEnvironment } from '../../shared/runtime-environments'
import type {
RuntimeSshAccessLinkRequest,
RuntimeSshAccessUnlinkRequest
} from '../../shared/runtime-ssh-access'
export type ManagedOrcadPreloadApi = {
deploy: (args: {
name: string
sshTargetId: string
force?: boolean
}) => Promise<OrcadManagedDeployResult>
getStatus: (args: { selector: string }) => Promise<OrcadManagedRuntimeStatus>
update: (args: { selector: string; force?: boolean }) => Promise<OrcadManagedDeployResult>
rollback: (args: { selector: string }) => Promise<OrcadManagedRollbackResult>
recover: (args: {
selector: string
/** Restore the snapshot over state a rejected build changed; see ORCAD_RECOVERY_CHANGED_STATE_CODE. */
acceptChangedState?: boolean
}) => Promise<OrcadManagedRecoveryResult>
/** Restarts from this client's SSH session; refused while terminals run. */
restart: (args: { selector: string }) => Promise<OrcadManagedRestartResult>
stop: (args: { selector: string }) => Promise<OrcadManagedStopResult>
cancelStop: (args: { selector: string }) => Promise<OrcadManagedCancelStopResult>
forget: (args: { selector: string }) => Promise<OrcadManagedForgetResult>
linkSshAccess: (args: RuntimeSshAccessLinkRequest) => Promise<PublicKnownRuntimeEnvironment>
unlinkSshAccess: (args: RuntimeSshAccessUnlinkRequest) => Promise<PublicKnownRuntimeEnvironment>
convertSshHost: (args: {
sshTargetId: string
name: string
}) => Promise<OrcadManagedConversionResult>
listPendingMigrations: () => Promise<OrcadManagedPendingMigrationRow[]>
previewDeltaMove: (args: { sshTargetId: string }) => Promise<OrcadDeltaMovePreview>
moveDelta: (args: { sshTargetId: string }) => Promise<OrcadDeltaMoveResult>
keepServerVersion: (args: { sshTargetId: string }) => Promise<void>
/** "Move anyway": the next connect leaves what can't move on this desktop. */
allowMoveLeavingBehind: (args: { sshTargetId: string }) => Promise<void>
}
export const managedOrcadApi: ManagedOrcadPreloadApi = {
deploy: (args) => ipcRenderer.invoke('runtimeEnvironments:deployOrcad', args),
getStatus: (args) => ipcRenderer.invoke('runtimeEnvironments:getOrcadStatus', args),
update: (args) => ipcRenderer.invoke('runtimeEnvironments:updateOrcad', args),
rollback: (args) => ipcRenderer.invoke('runtimeEnvironments:rollbackOrcad', args),
recover: (args) => ipcRenderer.invoke('runtimeEnvironments:recoverOrcad', args),
restart: (args) => ipcRenderer.invoke('runtimeEnvironments:restartOrcad', args),
stop: (args) => ipcRenderer.invoke('runtimeEnvironments:stopOrcad', args),
cancelStop: (args) => ipcRenderer.invoke('runtimeEnvironments:cancelOrcadStop', args),
forget: (args) => ipcRenderer.invoke('runtimeEnvironments:forgetOrcad', args),
linkSshAccess: (args) => ipcRenderer.invoke('runtimeEnvironments:linkSshAccess', args),
unlinkSshAccess: (args) => ipcRenderer.invoke('runtimeEnvironments:unlinkSshAccess', args),
convertSshHost: (args) =>
ipcRenderer.invoke('runtimeEnvironments:convertSshHostToManagedOrcad', args),
listPendingMigrations: () => ipcRenderer.invoke('runtimeEnvironments:listPendingOrcadMigrations'),
previewDeltaMove: (args) => ipcRenderer.invoke('runtimeEnvironments:previewOrcadDeltaMove', args),
moveDelta: (args) => ipcRenderer.invoke('runtimeEnvironments:moveOrcadDelta', args),
keepServerVersion: (args) =>
ipcRenderer.invoke('runtimeEnvironments:keepOrcadServerVersion', args),
allowMoveLeavingBehind: (args) =>
ipcRenderer.invoke('runtimeEnvironments:allowOrcadMoveLeavingBehind', args)
}