import type { CreateWorktreeResult, WorktreeDefaultTabsLaunch, WorktreeSetupLaunch, WorktreeStartupLaunch } from './types' import type { SshConnectionState } from './ssh-types' export type RuntimeClientEvent = | { type: 'reposChanged' } | { type: 'worktreesChanged'; repoId: string } // Why: SSH connections live on the runtime host; paired clients have no IPC // channel for ssh:state-changed, so without this event their reconnect // overlays never learn the host connected (STA-1468). | { type: 'sshStateChanged'; targetId: string; state: SshConnectionState } | { type: 'worktreeTerminalSleepState' worktreeId: string generation: number phase: 'started' | 'committed' | 'cancelled' | 'woken' ptyIds: string[] terminalHandles: string[] } | { type: 'linearLinkedIssueUpdated' worktreeId: string identifier: string workspaceId: string } | { type: 'activateWorktree' repoId: string worktreeId: string setup?: WorktreeSetupLaunch startup?: WorktreeStartupLaunch defaultTabs?: WorktreeDefaultTabsLaunch } export type RuntimeClientEventStreamMessage = | ({ type: 'ready'; subscriptionId: string } & { snapshot?: { // Reserved for future hydration. Current clients refresh through the // existing repo/worktree RPCs after receiving server events. repos?: unknown[] } }) | RuntimeClientEvent | { type: 'end' } export type RuntimeActivateWorktreeEvent = Extract export function toRuntimeActivateWorktreeEvent( repoId: string, worktreeId: string, setup?: CreateWorktreeResult['setup'], startup?: WorktreeStartupLaunch, defaultTabs?: CreateWorktreeResult['defaultTabs'] ): RuntimeActivateWorktreeEvent { return { type: 'activateWorktree', repoId, worktreeId, ...(setup ? { setup } : {}), ...(startup ? { startup } : {}), ...(defaultTabs ? { defaultTabs } : {}) } }