export const SESSION_BROWSER_SCOPE = "current_project" as const export const SESSION_BROWSER_SORT_MODES = ["threaded", "recent", "relevance"] as const export type SessionBrowserSortMode = (typeof SESSION_BROWSER_SORT_MODES)[number] export const SESSION_BROWSER_NAME_FILTERS = ["all", "named"] as const export type SessionBrowserNameFilter = (typeof SESSION_BROWSER_NAME_FILTERS)[number] export const SESSION_MANAGE_ACTIONS = ["rename"] as const export type SessionManageAction = (typeof SESSION_MANAGE_ACTIONS)[number] export interface SessionBrowserQuery { query?: string sortMode?: SessionBrowserSortMode nameFilter?: SessionBrowserNameFilter } export interface ResolvedSessionBrowserQuery { query: string sortMode: SessionBrowserSortMode nameFilter: SessionBrowserNameFilter } export interface SessionBrowserProjectScope { scope: typeof SESSION_BROWSER_SCOPE cwd: string sessionsDir: string activeSessionPath: string | null } export interface SessionBrowserSession { id: string path: string cwd: string name?: string createdAt: string modifiedAt: string messageCount: number parentSessionPath?: string firstMessage: string isActive: boolean depth: number isLastInThread: boolean ancestorHasNextSibling: boolean[] } export interface SessionBrowserResponse { project: SessionBrowserProjectScope query: ResolvedSessionBrowserQuery totalSessions: number returnedSessions: number sessions: SessionBrowserSession[] } export interface RenameSessionRequest { action: "rename" sessionPath: string name: string } export type SessionManageRequest = RenameSessionRequest export type SessionManageErrorCode = "invalid_request" | "not_found" | "rename_failed" | "onboarding_locked" export interface SessionManageSuccessResponse { success: true action: "rename" scope: typeof SESSION_BROWSER_SCOPE sessionPath: string name: string isActiveSession: boolean mutation: "rpc" | "session_file" } export interface SessionManageErrorResponse { success: false action: "rename" scope: typeof SESSION_BROWSER_SCOPE sessionPath?: string name?: string isActiveSession?: boolean mutation?: "rpc" | "session_file" code: SessionManageErrorCode error: string } export type SessionManageResponse = SessionManageSuccessResponse | SessionManageErrorResponse export function isSessionBrowserSortMode(value: string | null | undefined): value is SessionBrowserSortMode { return SESSION_BROWSER_SORT_MODES.includes((value ?? "") as SessionBrowserSortMode) } export function isSessionBrowserNameFilter(value: string | null | undefined): value is SessionBrowserNameFilter { return SESSION_BROWSER_NAME_FILTERS.includes((value ?? "") as SessionBrowserNameFilter) } export function isSessionManageAction(value: string | null | undefined): value is SessionManageAction { return SESSION_MANAGE_ACTIONS.includes((value ?? "") as SessionManageAction) } export function normalizeSessionBrowserQuery(query?: SessionBrowserQuery): ResolvedSessionBrowserQuery { return { query: query?.query?.trim() ?? "", sortMode: query?.sortMode ?? "threaded", nameFilter: query?.nameFilter ?? "all", } }