/** * The chat column's view state, as the page passes it down. * * It is deliberately a plain shape: the page derives it from the URL (see * `pages/workspace/model/chat-location`) and hands back a patcher, so the * feature never imports react-router and never learns what a query string is. * That is also what keeps every panel, thread and jump deep-linkable. */ export type ChatPanelKind = 'thread' | 'pins' | 'threads' | 'members' | null export interface ChatViewState { /** Which right-hand column is open; `null` leaves just the transcript. */ panel: ChatPanelKind /** Set with `panel: 'thread'`; the thread's own id. */ threadId?: string /** One-shot targets: the view consumes them and clears the URL entry. */ replyToId?: string editId?: string jumpId?: string } /** Defaults are omitted from the URL, so a plain room reads `/app/x/chat/`. */ export const CHAT_VIEW_DEFAULTS: ChatViewState = { panel: null }