import type { ChildProcess } from 'child_process' import { z } from 'zod/v4' import { lazySchema } from '../utils/lazySchema.js' export const connectResponseSchema = lazySchema(() => z.object({ session_id: z.string(), ws_url: z.string(), work_dir: z.string().optional(), }), ) export type ServerConfig = { port: number host: string authToken: string unix?: string /** Idle timeout for detached sessions (ms). 0 = never expire. */ idleTimeoutMs?: number /** Maximum number of concurrent sessions. */ maxSessions?: number /** Default workspace directory for sessions that don't specify cwd. */ workspace?: string } export type SessionState = | 'starting' | 'running' | 'detached' | 'stopping' | 'stopped' export type SessionInfo = { id: string status: SessionState createdAt: number workDir: string process: ChildProcess | null sessionKey?: string } /** * Stable session key → session metadata. Persisted to ~/.claude/server-sessions.json * so sessions can be resumed across server restarts. */ export type SessionIndexEntry = { /** Server-assigned session ID (matches the subprocess's claude session). */ sessionId: string /** The claude transcript session ID for --resume. Same as sessionId for direct sessions. */ transcriptSessionId: string cwd: string permissionMode?: string createdAt: number lastActiveAt: number } export type SessionIndex = Record