@marktiderman/genesis-chat 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +163 -2
- package/dist/chunk-27UTR5FW.js +322 -0
- package/dist/chunk-27UTR5FW.js.map +1 -0
- package/dist/chunk-JQXZUEEL.js +525 -0
- package/dist/chunk-JQXZUEEL.js.map +1 -0
- package/dist/chunk-SAY24E6V.js +309 -0
- package/dist/chunk-SAY24E6V.js.map +1 -0
- package/dist/client-BtdALFCx.d.ts +349 -0
- package/dist/index.d.ts +185 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/native.d.ts +2 -0
- package/dist/native.js +3 -0
- package/dist/native.js.map +1 -0
- package/dist/react.d.ts +137 -0
- package/dist/react.js +5 -0
- package/dist/react.js.map +1 -0
- package/dist/server.d.ts +311 -0
- package/dist/server.js +562 -0
- package/dist/server.js.map +1 -0
- package/dist/web.d.ts +387 -0
- package/dist/web.js +2405 -0
- package/dist/web.js.map +1 -0
- package/migrations/0001_genesis_chat.sql +1836 -0
- package/migrations/tests/0001_genesis_chat.test.sql +254 -0
- package/package.json +144 -3
package/dist/web.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/web/format.ts","../src/web/inbox.tsx","../src/web/markdown.tsx","../src/web/voice-note.tsx","../src/web/attachments.tsx","../src/web/thread-context.ts","../src/web/bubble.tsx","../src/web/use-voice-recorder.ts","../src/web/composer.tsx","../src/web/thread.tsx","../src/web/panel.tsx","../src/web/memory-client.ts"],"names":["jsx","cn","jsxs","useRef","Button","attachment","Fragment","useState","startsGroup","UserAvatar","MessageSquare","useEffect","Pin","useCallback","Skeleton","Lock","FileText","Trash2","Tooltip","Paperclip","Textarea","DefaultEmpty","EmptyState","toast","body","renderSlot","Spinner","Dialog","DialogContent","DialogTitle","DialogDescription","m"],"mappings":"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","file":"web.js","sourcesContent":["/**\n * @feat:chat\n * Small formatting helpers for the web renderers: times, sizes, and the\n * one-line description of a message a screen reader hears.\n */\nimport { previewText } from \"../core/thread\";\nimport type { ChatMessage } from \"../core/types\";\n\n/** A person as the app names them. The package knows no people tables: the app supplies this. */\nexport interface ChatUser {\n name: string;\n avatarUrl?: string | null;\n}\n\nexport type ResolveUser = (userId: string) => ChatUser;\n\n/** 10:42 (in the reader's locale). */\nexport function clockTime(iso: string, locale?: string): string {\n return new Date(iso).toLocaleTimeString(locale, { hour: \"numeric\", minute: \"2-digit\" });\n}\n\n/** The inbox's time: \"now\", \"5m\", \"10:42\" today, \"Yesterday\", \"Mon\", or \"12 Mar\". */\nexport function relativeTime(iso: string | null | undefined, now = new Date(), locale?: string): string {\n if (!iso) return \"\";\n const d = new Date(iso);\n const diff = now.getTime() - d.getTime();\n if (diff < 60_000) return \"now\";\n if (diff < 3_600_000) return `${Math.floor(diff / 60_000)}m`;\n const startOf = (x: Date) => new Date(x.getFullYear(), x.getMonth(), x.getDate()).getTime();\n const days = Math.round((startOf(now) - startOf(d)) / 86_400_000);\n if (days === 0) return clockTime(iso, locale);\n if (days === 1) return \"Yesterday\";\n if (days > 1 && days < 7) return d.toLocaleDateString(locale, { weekday: \"short\" });\n return d.toLocaleDateString(locale, {\n day: \"numeric\",\n month: \"short\",\n year: d.getFullYear() === now.getFullYear() ? undefined : \"numeric\",\n });\n}\n\n/** 12 KB, 3.4 MB. */\nexport function formatBytes(bytes: number | null | undefined): string {\n if (bytes == null || !Number.isFinite(bytes)) return \"\";\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${Math.round(bytes / 1024)} KB`;\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / 1024 / 1024).toFixed(1)} MB`;\n return `${(bytes / 1024 / 1024 / 1024).toFixed(1)} GB`;\n}\n\n/** What a screen reader hears for one bubble: \"Sam, 10:42: See you then\". */\nexport function messageLabel(message: Pick<ChatMessage, \"body\" | \"createdAt\" | \"deletedAt\" | \"attachments\" | \"editedAt\" | \"visibility\">, sender: string, locale?: string): string {\n const what = previewText(message.body, message.attachments[0]?.kind ?? null, Boolean(message.deletedAt)) || \"Message\";\n const extra = [message.visibility === \"observers\" ? \"internal note\" : null, message.editedAt && !message.deletedAt ? \"edited\" : null].filter(Boolean);\n return `${sender}, ${clockTime(message.createdAt, locale)}: ${what}${extra.length ? ` (${extra.join(\", \")})` : \"\"}`;\n}\n","/**\n * @feat:chat\n * The inbox: your conversations, newest first, each a button with an avatar,\n * the title (the other person's name in a two-person conversation), a one-line\n * preview, the time, an unread count, an @ when you were mentioned, and muted\n * and pinned marks. Arrow keys move between rows.\n */\nimport { useRef, type KeyboardEvent } from \"react\";\nimport { AtSign, BellOff, MessageSquare, Pin } from \"lucide-react\";\nimport { Badge, Button, EmptyState, Skeleton, UserAvatar, cn } from \"@marktiderman/genesis-ui\";\nimport { renderSlot, type SlotOverride } from \"@marktiderman/genesis-core/slots\";\nimport { previewText } from \"../core/thread\";\nimport type { ChatInboxItem } from \"../core/types\";\nimport { useChat, useInbox } from \"../react/index\";\nimport { relativeTime, type ResolveUser } from \"./format\";\n\nexport interface ChatInboxEmptyProps {\n archived: boolean;\n}\n\nexport interface ChatInboxProps {\n /** Names people (the app knows them; the package doesn't). */\n resolveUser: ResolveUser;\n /** Called with a conversation's id when its row is chosen. */\n onSelect: (conversationId: string) => void;\n /** The open conversation, marked as current. */\n selectedId?: string | null;\n /** Only this kind of conversation. */\n kind?: string;\n /** The archived conversations instead. */\n archived?: boolean;\n /** A conversation's title when it has none and isn't two-person. */\n fallbackTitle?: (item: ChatInboxItem) => string;\n /** Replace or eject (`null`) the empty state. */\n slots?: { empty?: SlotOverride<ChatInboxEmptyProps> };\n \"aria-label\"?: string;\n className?: string;\n}\n\nfunction DefaultEmpty({ archived }: ChatInboxEmptyProps) {\n return (\n <EmptyState\n icon={MessageSquare}\n title={archived ? \"No archived conversations\" : \"No conversations yet\"}\n description={archived ? undefined : \"When someone messages you, it shows up here.\"}\n />\n );\n}\n\n/** The title an inbox row shows. */\nexport function inboxTitle(item: ChatInboxItem, resolveUser: ResolveUser, fallback?: (item: ChatInboxItem) => string): string {\n if (item.title) return item.title;\n if (item.otherUserId) return resolveUser(item.otherUserId).name;\n return fallback?.(item) ?? \"Conversation\";\n}\n\nexport function ChatInbox({ resolveUser, onSelect, selectedId, kind, archived = false, fallbackTitle, slots, className, ...rest }: ChatInboxProps) {\n const { userId: me } = useChat();\n const { items, isLoading, error, refetch } = useInbox({ kind, archived });\n const list = useRef<HTMLUListElement>(null);\n\n // Rows are native buttons (Tab reaches each); the arrows are added here\n // because no Radix primitive is a list of buttons with vertical roving focus.\n const onKeyDown = (e: KeyboardEvent<HTMLUListElement>) => {\n const buttons = Array.from(list.current?.querySelectorAll<HTMLButtonElement>(\"button[data-inbox-row]\") ?? []);\n const at = buttons.indexOf(document.activeElement as HTMLButtonElement);\n const to =\n e.key === \"ArrowDown\" ? Math.min(buttons.length - 1, at + 1) : e.key === \"ArrowUp\" ? Math.max(0, at - 1) : e.key === \"Home\" ? 0 : e.key === \"End\" ? buttons.length - 1 : -2;\n if (to === -2 || buttons.length === 0) return;\n e.preventDefault();\n buttons[to < 0 ? 0 : to]?.focus();\n };\n\n if (isLoading) {\n return (\n <div className={cn(\"flex flex-col\", className)} aria-busy aria-label=\"Loading conversations\" data-testid=\"genesis-chat-inbox-loading\">\n {Array.from({ length: 6 }, (_, i) => (\n <div key={i} className=\"flex items-center gap-3 px-3 py-3\">\n <Skeleton className=\"size-10 shrink-0 rounded-full\" />\n <div className=\"flex-1 space-y-2\">\n <Skeleton className=\"h-3.5 w-2/5\" />\n <Skeleton className=\"h-3 w-4/5\" />\n </div>\n </div>\n ))}\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={className}>\n <EmptyState\n icon={MessageSquare}\n title=\"Couldn't load your conversations\"\n description=\"Check your connection and try again.\"\n action={\n <Button type=\"button\" variant=\"outline\" onClick={() => void refetch()}>\n Try again\n </Button>\n }\n />\n </div>\n );\n }\n\n if (items.length === 0) {\n return <div className={className}>{renderSlot(DefaultEmpty, slots?.empty, { archived })}</div>;\n }\n\n return (\n <nav aria-label={rest[\"aria-label\"] ?? \"Conversations\"} className={cn(\"min-h-0\", className)} data-testid=\"genesis-chat-inbox\">\n <ul ref={list} className=\"flex flex-col\" onKeyDown={onKeyDown}>\n {items.map((item) => (\n <li key={item.conversationId}>\n <InboxRow item={item} me={me} resolveUser={resolveUser} fallbackTitle={fallbackTitle} selected={item.conversationId === selectedId} onSelect={onSelect} />\n </li>\n ))}\n </ul>\n </nav>\n );\n}\n\ninterface InboxRowProps {\n item: ChatInboxItem;\n me: string;\n resolveUser: ResolveUser;\n fallbackTitle?: (item: ChatInboxItem) => string;\n selected: boolean;\n onSelect: (id: string) => void;\n}\n\nfunction InboxRow({ item, me, resolveUser, fallbackTitle, selected, onSelect }: InboxRowProps) {\n const title = inboxTitle(item, resolveUser, fallbackTitle);\n const other = item.otherUserId ? resolveUser(item.otherUserId) : null;\n const last = item.lastMessage;\n const unread = item.unread > 0;\n let preview = last ? previewText(last.body, last.attachment, last.deleted) : \"\";\n if (last && last.kind !== \"system\" && !last.deleted && last.senderId) {\n if (last.senderId === me) preview = `You: ${preview}`;\n else if (!item.otherUserId && item.memberCount > 2) preview = `${resolveUser(last.senderId).name}: ${preview}`;\n }\n const time = relativeTime(item.lastMessageAt ?? last?.createdAt);\n const count = item.unread >= 99 ? \"99+\" : String(item.unread);\n const label = [\n title,\n unread ? `${count} unread` : null,\n item.mentioned ? \"you were mentioned\" : null,\n item.muted ? \"muted\" : null,\n item.pinned ? \"pinned\" : null,\n preview || null,\n time || null,\n ]\n .filter(Boolean)\n .join(\", \");\n\n return (\n <button\n type=\"button\"\n data-inbox-row\n aria-current={selected ? \"true\" : undefined}\n aria-label={label}\n onClick={() => onSelect(item.conversationId)}\n className={cn(\n \"flex w-full items-center gap-3 px-3 py-2.5 text-left transition-colors hover:bg-accent focus-visible:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring\",\n selected && \"bg-accent\",\n )}\n data-testid={`genesis-chat-inbox-row-${item.conversationId}`}\n >\n <UserAvatar name={title} src={other?.avatarUrl} className=\"shrink-0\" />\n <span className=\"flex min-w-0 flex-1 flex-col gap-0.5\" aria-hidden>\n <span className=\"flex items-center gap-2\">\n <span className={cn(\"min-w-0 flex-1 truncate text-sm\", unread ? \"font-semibold text-foreground\" : \"font-medium text-foreground\")}>{title}</span>\n <span className={cn(\"shrink-0 text-xs tabular-nums\", unread && !item.muted ? \"font-medium text-primary\" : \"text-muted-foreground\")}>{time}</span>\n </span>\n <span className=\"flex items-center gap-1.5\">\n <span className={cn(\"min-w-0 flex-1 truncate text-sm\", unread ? \"text-foreground\" : \"text-muted-foreground\")}>{preview || \" \"}</span>\n {item.pinned ? <Pin className=\"size-3.5 shrink-0 text-muted-foreground\" /> : null}\n {item.muted ? <BellOff className=\"size-3.5 shrink-0 text-muted-foreground\" /> : null}\n {item.mentioned ? (\n <span className=\"flex size-5 shrink-0 items-center justify-center rounded-full bg-primary text-primary-foreground\">\n <AtSign className=\"size-3\" />\n </span>\n ) : null}\n {unread ? (\n <Badge variant={item.muted ? \"muted\" : \"default\"} className=\"h-5 min-w-5 shrink-0 justify-center rounded-full px-1.5 text-[11px] tabular-nums\">\n {count}\n </Badge>\n ) : null}\n </span>\n </span>\n </button>\n );\n}\n\n","/**\n * @feat:chat\n * The safe inline markdown a message body is written in: **bold**, *italic*\n * (or _italic_), `code`, [links](https://…), bare https links, line breaks and\n * mentions written `@[Name](user:<uuid>)`. A small tokenizer turns the text\n * into nodes and the nodes into React elements, so every character of the\n * body reaches the page as text: no HTML is ever parsed, and nothing uses\n * dangerouslySetInnerHTML. Links open only for http and https.\n */\nimport { Fragment, type ReactNode } from \"react\";\nimport { cn } from \"@marktiderman/genesis-ui\";\n\nexport type MarkdownNode =\n | { type: \"text\"; text: string }\n | { type: \"bold\"; children: MarkdownNode[] }\n | { type: \"italic\"; children: MarkdownNode[] }\n | { type: \"code\"; text: string }\n | { type: \"link\"; href: string; children: MarkdownNode[] }\n | { type: \"mention\"; name: string; userId: string }\n | { type: \"break\" };\n\n/** True for an absolute http or https URL; everything else (javascript:, data:, relative) is refused. */\nexport function isSafeHref(href: string): boolean {\n try {\n const url = new URL(href);\n return url.protocol === \"http:\" || url.protocol === \"https:\";\n } catch {\n return false;\n }\n}\n\nconst MENTION = /^@\\[([^\\]\\n]{1,80})\\]\\(user:([0-9a-f-]{36})\\)/i;\nconst LINK = /^\\[([^\\]\\n]{1,300})\\]\\(((?:[^()\\s]|\\([^()\\s]*\\)){1,2000})\\)/;\nconst BARE_URL = /^https?:\\/\\/[^\\s<>\"]+/i;\nconst TRAILING_PUNCTUATION = /[.,;:!?)\\]'\"]+$/;\n\n/** Parses one message body into inline nodes. Never throws. */\nexport function parseMarkdown(text: string): MarkdownNode[] {\n const out: MarkdownNode[] = [];\n const lines = text.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\");\n lines.forEach((line, i) => {\n if (i > 0) out.push({ type: \"break\" });\n out.push(...parseInline(line, 0));\n });\n return mergeText(out);\n}\n\nfunction parseInline(src: string, depth: number): MarkdownNode[] {\n const out: MarkdownNode[] = [];\n let text = \"\";\n const flush = () => {\n if (text) out.push({ type: \"text\", text });\n text = \"\";\n };\n let i = 0;\n while (i < src.length) {\n const ch = src[i]!;\n const rest = src.slice(i);\n const prev = i > 0 ? src[i - 1]! : \"\";\n\n if (ch === \"\\\\\" && i + 1 < src.length && /[*_`[\\]@\\\\]/.test(src[i + 1]!)) {\n text += src[i + 1];\n i += 2;\n continue;\n }\n\n if (ch === \"`\") {\n const end = src.indexOf(\"`\", i + 1);\n if (end > i + 1) {\n flush();\n out.push({ type: \"code\", text: src.slice(i + 1, end) });\n i = end + 1;\n continue;\n }\n }\n\n if (ch === \"@\") {\n const m = MENTION.exec(rest);\n if (m) {\n flush();\n out.push({ type: \"mention\", name: m[1]!, userId: m[2]!.toLowerCase() });\n i += m[0].length;\n continue;\n }\n }\n\n if (ch === \"[\") {\n const m = LINK.exec(rest);\n if (m) {\n flush();\n const label = depth < 3 ? parseInline(m[1]!, depth + 1) : [{ type: \"text\" as const, text: m[1]! }];\n if (isSafeHref(m[2]!)) out.push({ type: \"link\", href: m[2]!, children: label });\n // A link we won't open keeps its words and drops the target.\n else out.push(...label);\n i += m[0].length;\n continue;\n }\n }\n\n if ((ch === \"h\" || ch === \"H\") && !/[\\w/]/.test(prev)) {\n const m = BARE_URL.exec(rest);\n if (m) {\n const url = m[0].replace(TRAILING_PUNCTUATION, \"\");\n if (isSafeHref(url)) {\n flush();\n out.push({ type: \"link\", href: url, children: [{ type: \"text\", text: url }] });\n i += url.length;\n continue;\n }\n }\n }\n\n if ((ch === \"*\" || ch === \"_\") && depth < 3) {\n const double = src[i + 1] === ch;\n const marker = double ? ch + ch : ch;\n // `_` only opens at a word edge, so snake_case stays as written.\n const opens = ch === \"*\" || !/\\w/.test(prev);\n const after = src[i + marker.length];\n if (opens && after && after !== \" \" && after !== ch) {\n const end = findClose(src, i + marker.length, marker);\n if (end > 0) {\n flush();\n const inner = parseInline(src.slice(i + marker.length, end), depth + 1);\n out.push(double ? { type: \"bold\", children: inner } : { type: \"italic\", children: inner });\n i = end + marker.length;\n continue;\n }\n }\n }\n\n text += ch;\n i += 1;\n }\n flush();\n return out;\n}\n\n/** Where `marker` closes: not after a space, and (for `_`) at a word edge. */\nfunction findClose(src: string, from: number, marker: string): number {\n let j = from;\n while (j < src.length) {\n const k = src.indexOf(marker, j);\n if (k < 0) return -1;\n const before = src[k - 1]!;\n const next = src[k + marker.length];\n const doubled = marker.length === 1 && next === marker;\n const edge = marker[0] !== \"_\" || !next || !/\\w/.test(next);\n if (k > from && before !== \" \" && !doubled && edge) return k;\n j = k + (doubled ? 2 : 1);\n }\n return -1;\n}\n\nfunction mergeText(nodes: MarkdownNode[]): MarkdownNode[] {\n const out: MarkdownNode[] = [];\n for (const n of nodes) {\n const last = out[out.length - 1];\n if (n.type === \"text\" && last?.type === \"text\") last.text += n.text;\n else out.push(n);\n }\n return out;\n}\n\nexport interface ChatMarkdownProps {\n /** The message body. */\n text: string;\n /** Draws a mention; a highlighted chip by default. */\n renderMention?: (mention: { name: string; userId: string }) => ReactNode;\n /** Mentions of this user are drawn stronger. */\n me?: string;\n /** Bubble colours: on `primary`, links and chips use the primary foreground. */\n tone?: \"default\" | \"primary\";\n className?: string;\n}\n\n/** Renders a message body's inline markdown as React elements. */\nexport function ChatMarkdown({ text, renderMention, me, tone = \"default\", className }: ChatMarkdownProps) {\n const nodes = parseMarkdown(text);\n return <span className={cn(\"whitespace-pre-wrap break-words [overflow-wrap:anywhere]\", className)}>{renderNodes(nodes, { renderMention, me, tone })}</span>;\n}\n\ninterface RenderOptions {\n renderMention?: ChatMarkdownProps[\"renderMention\"];\n me?: string;\n tone: \"default\" | \"primary\";\n}\n\nfunction renderNodes(nodes: MarkdownNode[], opts: RenderOptions): ReactNode[] {\n return nodes.map((n, i) => {\n switch (n.type) {\n case \"text\":\n return <Fragment key={i}>{n.text}</Fragment>;\n case \"break\":\n return <br key={i} />;\n case \"bold\":\n return <strong key={i} className=\"font-semibold\">{renderNodes(n.children, opts)}</strong>;\n case \"italic\":\n return <em key={i}>{renderNodes(n.children, opts)}</em>;\n case \"code\":\n return (\n <code\n key={i}\n className={cn(\n \"rounded px-1 py-0.5 font-mono text-[0.85em]\",\n opts.tone === \"primary\" ? \"bg-primary-foreground/15\" : \"bg-background/70\",\n )}\n >\n {n.text}\n </code>\n );\n case \"link\":\n return (\n <a\n key={i}\n href={n.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\"underline underline-offset-2\", opts.tone === \"primary\" ? \"text-primary-foreground\" : \"text-primary\")}\n >\n {renderNodes(n.children, opts)}\n </a>\n );\n case \"mention\": {\n if (opts.renderMention) return <Fragment key={i}>{opts.renderMention(n)}</Fragment>;\n const mine = opts.me && n.userId === opts.me.toLowerCase();\n return (\n <span\n key={i}\n data-mention={n.userId}\n className={cn(\n \"rounded px-1 font-medium\",\n opts.tone === \"primary\"\n ? \"bg-primary-foreground/20 text-primary-foreground\"\n : mine\n ? \"bg-primary/20 text-primary\"\n : \"bg-primary/10 text-primary\",\n )}\n >\n @{n.name}\n </span>\n );\n }\n }\n });\n}\n","/**\n * @feat:chat\n * A voice note: play and pause, a waveform that fills as it plays and seeks\n * where you click, the time, a 1× / 1.5× / 2× speed toggle, and the\n * transcript when there is one. Only one voice note plays at a time.\n */\nimport { useEffect, useRef, useState, type KeyboardEvent, type MouseEvent } from \"react\";\nimport { Pause, Play } from \"lucide-react\";\nimport { Button, Collapsible, CollapsibleContent, CollapsibleTrigger, cn } from \"@marktiderman/genesis-ui\";\nimport { formatDuration, nextPlaybackRate } from \"../core/media\";\n\n/** The one playing now, paused when another starts. */\nlet playing: HTMLAudioElement | null = null;\n\nexport interface VoiceNoteProps {\n /** The audio's (signed) URL; while it loads the waveform still draws. */\n src: string | null | undefined;\n durationMs?: number | null;\n /** Peaks 0–100. */\n waveform?: number[] | null;\n transcript?: string | null;\n transcriptStatus?: \"pending\" | \"ready\" | \"failed\" | \"off\" | null;\n /** On the primary (own) bubble. */\n tone?: \"default\" | \"primary\";\n className?: string;\n}\n\nconst BARS = 48;\n\nfunction resample(peaks: number[] | null | undefined, n = BARS): number[] {\n if (!peaks || peaks.length === 0) return new Array(n).fill(12);\n if (peaks.length === n) return peaks;\n return Array.from({ length: n }, (_, i) => peaks[Math.min(peaks.length - 1, Math.floor((i / n) * peaks.length))] ?? 0);\n}\n\nexport function VoiceNote({ src, durationMs, waveform, transcript, transcriptStatus, tone = \"default\", className }: VoiceNoteProps) {\n const audio = useRef<HTMLAudioElement | null>(null);\n const [isPlaying, setPlaying] = useState(false);\n const [current, setCurrent] = useState(0);\n const [duration, setDuration] = useState((durationMs ?? 0) / 1000);\n const [rate, setRate] = useState(1);\n const bars = resample(waveform);\n const progress = duration > 0 ? Math.min(1, current / duration) : 0;\n\n useEffect(() => {\n const el = audio.current;\n if (!el) return;\n const onPlay = () => {\n if (playing && playing !== el) playing.pause();\n playing = el;\n setPlaying(true);\n };\n const onPause = () => {\n if (playing === el) playing = null;\n setPlaying(false);\n };\n const onTime = () => setCurrent(el.currentTime);\n const onMeta = () => {\n if (Number.isFinite(el.duration) && el.duration > 0) setDuration(el.duration);\n };\n const onEnded = () => {\n setPlaying(false);\n setCurrent(0);\n };\n el.addEventListener(\"play\", onPlay);\n el.addEventListener(\"pause\", onPause);\n el.addEventListener(\"timeupdate\", onTime);\n el.addEventListener(\"loadedmetadata\", onMeta);\n el.addEventListener(\"durationchange\", onMeta);\n el.addEventListener(\"ended\", onEnded);\n return () => {\n el.removeEventListener(\"play\", onPlay);\n el.removeEventListener(\"pause\", onPause);\n el.removeEventListener(\"timeupdate\", onTime);\n el.removeEventListener(\"loadedmetadata\", onMeta);\n el.removeEventListener(\"durationchange\", onMeta);\n el.removeEventListener(\"ended\", onEnded);\n if (playing === el) playing = null;\n };\n }, []);\n\n useEffect(() => {\n if (audio.current) audio.current.playbackRate = rate;\n }, [rate]);\n\n const toggle = () => {\n const el = audio.current;\n if (!el || !src) return;\n if (el.paused) {\n el.playbackRate = rate;\n void Promise.resolve(el.play?.()).catch(() => setPlaying(false));\n } else el.pause();\n };\n\n const seekTo = (fraction: number) => {\n const el = audio.current;\n const f = Math.max(0, Math.min(1, fraction));\n if (el && duration > 0) {\n el.currentTime = f * duration;\n setCurrent(f * duration);\n }\n };\n\n const onBarsClick = (e: MouseEvent<HTMLDivElement>) => {\n const box = e.currentTarget.getBoundingClientRect();\n if (box.width > 0) seekTo((e.clientX - box.left) / box.width);\n };\n\n // The waveform is a slider drawn as bars: Radix Slider draws a track and a\n // thumb, not a waveform, so the role and keys are written here (arrows ±5 s,\n // Home/End), on one focusable element.\n const onBarsKey = (e: KeyboardEvent<HTMLDivElement>) => {\n if (duration <= 0) return;\n const step = 5 / duration;\n const keys: Record<string, number> = { ArrowRight: progress + step, ArrowUp: progress + step, ArrowLeft: progress - step, ArrowDown: progress - step, Home: 0, End: 1 };\n if (e.key in keys) {\n e.preventDefault();\n seekTo(keys[e.key]!);\n }\n };\n\n const shown = isPlaying || current > 0 ? current * 1000 : duration * 1000;\n const primary = tone === \"primary\";\n\n return (\n <div className={cn(\"flex min-w-[220px] max-w-full flex-col gap-1\", className)} data-testid=\"genesis-chat-voice\">\n <div className=\"flex items-center gap-2\">\n <Button\n type=\"button\"\n size=\"icon\"\n variant={primary ? \"secondary\" : \"default\"}\n className=\"h-9 w-9 shrink-0 rounded-full\"\n onClick={toggle}\n disabled={!src}\n aria-label={isPlaying ? \"Pause voice message\" : \"Play voice message\"}\n data-testid=\"genesis-chat-voice-play\"\n >\n {isPlaying ? <Pause /> : <Play />}\n </Button>\n <div\n role=\"slider\"\n tabIndex={0}\n aria-label=\"Position\"\n aria-valuemin={0}\n aria-valuemax={Math.round(duration)}\n aria-valuenow={Math.round(current)}\n aria-valuetext={`${formatDuration(current * 1000)} of ${formatDuration(duration * 1000)}`}\n className=\"flex h-8 flex-1 cursor-pointer items-center gap-[2px] rounded-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n onClick={onBarsClick}\n onKeyDown={onBarsKey}\n >\n {bars.map((peak, i) => (\n <span\n key={i}\n aria-hidden\n className={cn(\n \"w-[3px] flex-1 rounded-full transition-colors\",\n (i + 0.5) / bars.length <= progress\n ? primary\n ? \"bg-primary-foreground\"\n : \"bg-primary\"\n : primary\n ? \"bg-primary-foreground/40\"\n : \"bg-muted-foreground/40\",\n )}\n style={{ height: `${Math.max(12, peak)}%` }}\n />\n ))}\n </div>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n className={cn(\"h-7 shrink-0 rounded-full px-2 text-xs tabular-nums\", primary && \"text-primary-foreground hover:bg-primary-foreground/15 hover:text-primary-foreground\")}\n onClick={() => setRate((r) => nextPlaybackRate(r))}\n aria-label={`Playback speed ${rate}×`}\n data-testid=\"genesis-chat-voice-rate\"\n >\n {rate}×\n </Button>\n </div>\n <div className={cn(\"pl-11 text-xs tabular-nums\", primary ? \"text-primary-foreground/80\" : \"text-muted-foreground\")}>{formatDuration(shown)}</div>\n {transcriptStatus === \"pending\" ? (\n <div className={cn(\"pl-11 text-xs italic\", primary ? \"text-primary-foreground/80\" : \"text-muted-foreground\")}>Transcribing…</div>\n ) : transcript ? (\n <Collapsible className=\"pl-11\">\n <CollapsibleTrigger className={cn(\"text-xs font-medium underline-offset-2 hover:underline\", primary ? \"text-primary-foreground\" : \"text-primary\")}>\n Transcript\n </CollapsibleTrigger>\n <CollapsibleContent className=\"pt-1 text-sm\">{transcript}</CollapsibleContent>\n </Collapsible>\n ) : null}\n {/* eslint-disable-next-line jsx-a11y/media-has-caption -- the transcript above is the caption */}\n <audio ref={audio} src={src ?? undefined} preload=\"metadata\" className=\"hidden\" />\n </div>\n );\n}\n","/**\n * @feat:chat\n * What a message carries: photos in a grid of up to four with a lightbox,\n * voice notes, videos, files as a chip, links, and the app's own kinds (a\n * form, a lesson) through the `attachment` slot, a generic card by default.\n * Pending uploads draw from their local previews with a spinner.\n */\nimport { useCallback, useState, type ComponentType, type KeyboardEvent } from \"react\";\nimport { ChevronLeft, ChevronRight, Download, FileText, Link2, Paperclip } from \"lucide-react\";\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogTitle,\n Spinner,\n VisuallyHidden,\n cn,\n} from \"@marktiderman/genesis-ui\";\nimport type { ChatAttachment, ChatMessage } from \"../core/types\";\nimport { formatBytes } from \"./format\";\nimport { isSafeHref } from \"./markdown\";\nimport { VoiceNote } from \"./voice-note\";\n\n/** One attachment as the renderers draw it, sent or still uploading. */\nexport interface AttachmentView {\n key: string;\n kind: string;\n /** Signed URL, or the local preview while uploading. */\n url: string | null;\n posterUrl: string | null;\n name: string | null;\n mime: string | null;\n bytes: number | null;\n width: number | null;\n height: number | null;\n durationMs: number | null;\n waveform: number[] | null;\n transcript: string | null;\n transcriptStatus: ChatAttachment[\"transcriptStatus\"];\n /** Still uploading (or the server says it is still processing). */\n pending: boolean;\n /** The stored attachment; absent while it uploads. */\n attachment?: ChatAttachment;\n}\n\n/** Props the `attachment` slot receives, for kinds the package doesn't draw (form, lesson…). */\nexport interface ChatAttachmentSlotProps {\n attachment: ChatAttachment;\n message: ChatMessage;\n /** Its signed URL when it has a file. */\n url: string | null;\n mine: boolean;\n}\n\nexport const BUILT_IN_KINDS = new Set([\"image\", \"voice\", \"video\", \"file\", \"link\"]);\n\nexport function toAttachmentView(a: ChatAttachment, urls: Record<string, string>): AttachmentView {\n return {\n key: a.id,\n kind: a.kind,\n url: (a.path ? urls[a.path] : null) ?? (a.provider === \"external\" ? a.url : null) ?? (a.kind === \"link\" ? a.url : null),\n posterUrl: a.posterPath ? (urls[a.posterPath] ?? null) : null,\n name: a.name,\n mime: a.mime,\n bytes: a.bytes,\n width: a.width,\n height: a.height,\n durationMs: a.durationMs,\n waveform: a.waveform,\n transcript: a.transcript,\n transcriptStatus: a.transcriptStatus,\n pending: a.status === \"pending\",\n attachment: a,\n };\n}\n\n/** Generic card for an app's own kind, when no `attachment` slot is given. */\nexport function GenericAttachment({ attachment, url }: ChatAttachmentSlotProps) {\n const label = attachment.name ?? attachment.kind.charAt(0).toUpperCase() + attachment.kind.slice(1);\n const body = (\n <>\n <Paperclip className=\"size-4 shrink-0 text-muted-foreground\" aria-hidden />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-sm font-medium\">{label}</span>\n <span className=\"block text-xs capitalize text-muted-foreground\">{attachment.kind}</span>\n </span>\n </>\n );\n return url && isSafeHref(url) ? (\n <a href={url} target=\"_blank\" rel=\"noopener noreferrer\" className=\"flex items-center gap-2 rounded-lg border bg-background p-2 text-foreground hover:bg-accent\">\n {body}\n </a>\n ) : (\n <div className=\"flex items-center gap-2 rounded-lg border bg-background p-2 text-foreground\">{body}</div>\n );\n}\n\nfunction Uploading({ className }: { className?: string }) {\n return (\n <span className={cn(\"absolute inset-0 flex items-center justify-center bg-background/40\", className)} aria-label=\"Uploading\" role=\"status\">\n <Spinner size=\"sm\" className=\"text-foreground\" />\n </span>\n );\n}\n\nexport interface ImageGridProps {\n images: AttachmentView[];\n className?: string;\n}\n\n/** Up to four photos in a grid (a \"+N\" on the fourth for more), opening a lightbox. */\nexport function ImageGrid({ images, className }: ImageGridProps) {\n const [open, setOpen] = useState<number | null>(null);\n const shown = images.slice(0, 4);\n const more = images.length - shown.length;\n const cols = shown.length === 1 ? \"grid-cols-1\" : \"grid-cols-2\";\n return (\n <>\n <div className={cn(\"grid w-[min(18rem,100%)] gap-1 overflow-hidden rounded-xl\", cols, className)} data-testid=\"genesis-chat-images\">\n {shown.map((img, i) => {\n const tall = shown.length === 3 && i === 0;\n return (\n <button\n key={img.key}\n type=\"button\"\n className={cn(\n \"relative block overflow-hidden bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n shown.length === 1 ? \"max-h-80\" : \"aspect-square\",\n tall && \"row-span-2 aspect-auto\",\n )}\n onClick={() => setOpen(i)}\n aria-label={`Open photo${img.name ? ` ${img.name}` : \"\"}`}\n >\n {img.url ? (\n <img\n src={img.url}\n alt={img.name ?? \"Photo\"}\n loading=\"lazy\"\n className={cn(\"h-full w-full object-cover\", img.pending && \"opacity-70\")}\n width={img.width ?? undefined}\n height={img.height ?? undefined}\n />\n ) : (\n <span className=\"block h-full min-h-24 w-full animate-pulse bg-muted\" />\n )}\n {img.pending ? <Uploading /> : null}\n {more > 0 && i === shown.length - 1 ? (\n <span className=\"absolute inset-0 flex items-center justify-center bg-foreground/50 text-xl font-semibold text-background\">+{more}</span>\n ) : null}\n </button>\n );\n })}\n </div>\n <Lightbox images={images} index={open} onIndexChange={setOpen} />\n </>\n );\n}\n\nexport interface LightboxProps {\n images: AttachmentView[];\n /** The photo shown; null closes it. */\n index: number | null;\n onIndexChange: (index: number | null) => void;\n}\n\n/** A photo full size, with the previous and next ones on the arrow keys. */\nexport function Lightbox({ images, index, onIndexChange }: LightboxProps) {\n const img = index === null ? null : images[index];\n const go = useCallback(\n (delta: number) => {\n if (index === null || images.length < 2) return;\n onIndexChange((index + delta + images.length) % images.length);\n },\n [images.length, index, onIndexChange],\n );\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"ArrowRight\") {\n e.preventDefault();\n go(1);\n } else if (e.key === \"ArrowLeft\") {\n e.preventDefault();\n go(-1);\n }\n };\n return (\n <Dialog open={img != null} onOpenChange={(o) => !o && onIndexChange(null)}>\n <DialogContent className=\"max-w-[min(64rem,95vw)] border-0 bg-background p-2\" onKeyDown={onKey} data-testid=\"genesis-chat-lightbox\">\n <VisuallyHidden>\n <DialogTitle>{img?.name ?? \"Photo\"}</DialogTitle>\n <DialogDescription>\n Photo {index === null ? 0 : index + 1} of {images.length}. Use the arrow keys for the others.\n </DialogDescription>\n </VisuallyHidden>\n {img?.url ? <img src={img.url} alt={img.name ?? \"Photo\"} className=\"mx-auto max-h-[80vh] w-auto rounded-md object-contain\" /> : null}\n {images.length > 1 ? (\n <div className=\"flex items-center justify-between gap-2\">\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" onClick={() => go(-1)} aria-label=\"Previous photo\">\n <ChevronLeft />\n </Button>\n <span className=\"text-sm tabular-nums text-muted-foreground\">\n {(index ?? 0) + 1} / {images.length}\n </span>\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" onClick={() => go(1)} aria-label=\"Next photo\">\n <ChevronRight />\n </Button>\n </div>\n ) : null}\n </DialogContent>\n </Dialog>\n );\n}\n\nexport function VideoAttachment({ view }: { view: AttachmentView }) {\n return (\n <div className=\"relative w-[min(20rem,100%)] overflow-hidden rounded-xl bg-muted\" data-testid=\"genesis-chat-video\">\n {view.url ? (\n // eslint-disable-next-line jsx-a11y/media-has-caption -- transcripts are offered beside voice; video captions are the provider's\n <video controls playsInline preload=\"metadata\" poster={view.posterUrl ?? undefined} src={view.url} className=\"block max-h-80 w-full\" aria-label={view.name ?? \"Video\"} />\n ) : (\n <span className=\"block aspect-video w-full animate-pulse bg-muted\" />\n )}\n {view.pending ? <Uploading /> : null}\n </div>\n );\n}\n\nexport function FileChip({ view, tone = \"default\" }: { view: AttachmentView; tone?: \"default\" | \"primary\" }) {\n const primary = tone === \"primary\";\n const ext = (view.name?.split(\".\").pop() ?? \"\").toUpperCase();\n return (\n <div\n className={cn(\"flex w-[min(18rem,100%)] items-center gap-2 rounded-lg p-2\", primary ? \"bg-primary-foreground/15\" : \"border bg-background\")}\n data-testid=\"genesis-chat-file\"\n >\n <span className={cn(\"relative flex size-9 shrink-0 items-center justify-center rounded-md\", primary ? \"bg-primary-foreground/20\" : \"bg-muted\")}>\n {view.pending ? <Spinner size=\"sm\" className={primary ? \"text-primary-foreground\" : undefined} /> : <FileText className=\"size-4\" aria-hidden />}\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-sm font-medium\">{view.name ?? \"File\"}</span>\n <span className={cn(\"block text-xs\", primary ? \"text-primary-foreground/80\" : \"text-muted-foreground\")}>\n {[ext, formatBytes(view.bytes)].filter(Boolean).join(\" · \")}\n {view.pending ? \" · Uploading…\" : \"\"}\n </span>\n </span>\n {view.url && !view.pending ? (\n <Button\n asChild\n size=\"icon\"\n variant=\"ghost\"\n className={cn(\"size-8 shrink-0\", primary && \"text-primary-foreground hover:bg-primary-foreground/15 hover:text-primary-foreground\")}\n >\n <a href={view.url} download={view.name ?? true} target=\"_blank\" rel=\"noopener noreferrer\" aria-label={`Download ${view.name ?? \"file\"}`}>\n <Download />\n </a>\n </Button>\n ) : null}\n </div>\n );\n}\n\nfunction LinkAttachment({ view, tone }: { view: AttachmentView; tone: \"default\" | \"primary\" }) {\n if (!view.url || !isSafeHref(view.url)) return null;\n let host = view.url;\n try {\n host = new URL(view.url).host;\n } catch {\n // shown as written\n }\n return (\n <a\n href={view.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\"flex w-[min(18rem,100%)] items-center gap-2 rounded-lg p-2\", tone === \"primary\" ? \"bg-primary-foreground/15\" : \"border bg-background hover:bg-accent\")}\n >\n <Link2 className=\"size-4 shrink-0\" aria-hidden />\n <span className=\"min-w-0\">\n <span className=\"block truncate text-sm font-medium\">{view.name ?? host}</span>\n <span className=\"block truncate text-xs opacity-80\">{host}</span>\n </span>\n </a>\n );\n}\n\nexport interface MessageAttachmentsProps {\n views: AttachmentView[];\n message?: ChatMessage;\n mine: boolean;\n tone: \"default\" | \"primary\";\n /** For kinds the package doesn't draw; a generic card by default. */\n slot?: ComponentType<ChatAttachmentSlotProps> | null;\n}\n\n/** Every attachment of one message, photos grouped into one grid. */\nexport function MessageAttachments({ views, message, mine, tone, slot }: MessageAttachmentsProps) {\n if (views.length === 0) return null;\n const images = views.filter((v) => v.kind === \"image\");\n const others = views.filter((v) => v.kind !== \"image\");\n const Custom = slot === undefined ? GenericAttachment : slot;\n return (\n <div className=\"flex flex-col gap-1.5\">\n {images.length ? <ImageGrid images={images} /> : null}\n {others.map((v) => {\n switch (v.kind) {\n case \"voice\":\n return (\n <VoiceNote\n key={v.key}\n src={v.url}\n durationMs={v.durationMs}\n waveform={v.waveform}\n transcript={v.transcript}\n transcriptStatus={v.transcriptStatus}\n tone={tone}\n />\n );\n case \"video\":\n return <VideoAttachment key={v.key} view={v} />;\n case \"file\":\n return <FileChip key={v.key} view={v} tone={tone} />;\n case \"link\":\n return <LinkAttachment key={v.key} view={v} tone={tone} />;\n default:\n if (!v.attachment || !message) return <FileChip key={v.key} view={v} tone={tone} />;\n return Custom ? <Custom key={v.key} attachment={v.attachment} message={message} url={v.url} mine={mine} /> : null;\n }\n })}\n </div>\n );\n}\n","/**\n * @feat:chat\n * What every bubble of one thread shares: who you are, how people are named,\n * your role, signed file URLs, and the actions, so a row needs only its item.\n */\nimport { createContext, useContext, type ComponentType } from \"react\";\nimport type { ChatMessage, ChatRole } from \"../core/types\";\nimport type { ChatAttachmentSlotProps } from \"./attachments\";\nimport type { ResolveUser } from \"./format\";\n\nexport interface ThreadContextValue {\n me: string;\n resolveUser: ResolveUser;\n role: ChatRole | null;\n /** More than two people: names and avatars show on others' messages. */\n isGroup: boolean;\n /** Owner or admin: may delete anyone's message. */\n canModerate: boolean;\n canPin: boolean;\n canPost: boolean;\n pins: Set<string>;\n urls: Record<string, string>;\n byId: Map<string, ChatMessage>;\n quickReactions: readonly string[];\n attachmentSlot?: ComponentType<ChatAttachmentSlotProps> | null;\n highlightedId: string | null;\n editingId: string | null;\n reply(m: ChatMessage): void;\n focusComposer(): void;\n startEdit(id: string | null): void;\n saveEdit(m: ChatMessage, body: string): Promise<void>;\n askDelete(m: ChatMessage): void;\n askReport(m: ChatMessage): void;\n react(m: ChatMessage, emoji: string, on: boolean): void;\n pin(m: ChatMessage, on: boolean): void;\n save(m: ChatMessage): void;\n copy(m: ChatMessage): void;\n jumpTo(messageId: string): void;\n retry(clientId: string): void;\n discard(clientId: string): void;\n openThread?: (m: ChatMessage) => void;\n}\n\nexport const ThreadContext = createContext<ThreadContextValue | null>(null);\n\nexport function useThreadContext(): ThreadContextValue {\n const ctx = useContext(ThreadContext);\n if (!ctx) throw new Error(\"Chat bubbles render inside <ChatThread>.\");\n return ctx;\n}\n\n/** The six quick reactions. */\nexport const QUICK_REACTIONS = [\"👍\", \"❤️\", \"😂\", \"😮\", \"😢\", \"🙏\"] as const;\n","/**\n * @feat:chat\n * One row of a thread: a system line, or a bubble (yours on the right in the\n * primary colour, theirs on the left), with its reply quote, body, attachments,\n * time and edited marker, reactions, and actions on hover, right-click or\n * long-press. Pending messages show \"Sending…\"; failed ones offer Retry and\n * Delete.\n */\nimport { useEffect, useRef, useState, type ComponentType, type MutableRefObject, type ReactNode } from \"react\";\nimport {\n AlertCircle,\n Ban,\n Bookmark,\n Clock,\n Copy,\n Flag,\n Lock,\n MessageSquare,\n MoreHorizontal,\n Pencil,\n Pin,\n PinOff,\n Reply,\n SmilePlus,\n Trash2,\n} from \"lucide-react\";\nimport {\n Button,\n ContextMenu,\n ContextMenuContent,\n ContextMenuItem,\n ContextMenuSeparator,\n ContextMenuTrigger,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n Popover,\n PopoverContent,\n PopoverTrigger,\n Textarea,\n Tooltip,\n UserAvatar,\n cn,\n} from \"@marktiderman/genesis-ui\";\nimport { attachmentKindFor } from \"../core/media\";\nimport type { QueuedMessage } from \"../core/outbox\";\nimport { previewText, summarizeReactions, type ThreadItem } from \"../core/thread\";\nimport type { ChatMessage, PendingMessage } from \"../core/types\";\nimport { MessageAttachments, toAttachmentView, type AttachmentView } from \"./attachments\";\nimport { clockTime, messageLabel } from \"./format\";\nimport { ChatMarkdown } from \"./markdown\";\nimport { useThreadContext } from \"./thread-context\";\n\nexport interface MessageRowProps {\n item: ThreadItem;\n /** First of a run from one sender: the name and avatar show (others' messages, in groups). */\n startsGroup: boolean;\n className?: string;\n}\n\n/** The pending message as a message, so one bubble draws both. */\nfunction pendingAsMessage(p: PendingMessage): ChatMessage {\n return {\n id: `pending:${p.clientId}`,\n conversationId: p.input.conversationId,\n seq: Number.MAX_SAFE_INTEGER,\n clientId: p.clientId,\n senderId: p.senderId,\n senderRole: \"member\",\n kind: \"text\",\n body: p.input.body ?? \"\",\n mentions: p.input.mentions ?? [],\n replyToId: p.input.replyToId ?? null,\n threadRootId: p.input.threadRootId ?? null,\n threadCount: 0,\n threadLastAt: null,\n topic: p.input.topic ?? null,\n visibility: p.input.visibility ?? \"everyone\",\n silent: Boolean(p.input.silent),\n meta: {},\n createdAt: p.createdAt,\n editedAt: null,\n deletedAt: null,\n attachments: [],\n reactions: [],\n };\n}\n\nfunction pendingViews(p: PendingMessage): AttachmentView[] {\n const files = (p as Partial<QueuedMessage>).files ?? [];\n return files.map((f, i) => ({\n key: `${p.clientId}:${i}`,\n kind: f.meta?.kind ?? attachmentKindFor(f.contentType),\n url: p.previews?.[i] ?? f.previewUrl ?? null,\n posterUrl: null,\n name: f.meta?.name ?? f.name,\n mime: f.contentType,\n bytes: f.meta?.bytes ?? (typeof Blob !== \"undefined\" && f.data instanceof Blob ? f.data.size : null),\n width: f.meta?.width ?? null,\n height: f.meta?.height ?? null,\n durationMs: f.meta?.durationMs ?? null,\n waveform: f.meta?.waveform ?? null,\n transcript: null,\n transcriptStatus: null,\n pending: p.status === \"sending\",\n }));\n}\n\n/** A menu gives focus back to what opened it, unless the action put it somewhere (the composer, the edit box). */\nfunction returnFocus(e: Event, keepFocus: MutableRefObject<(() => void) | null>) {\n const next = keepFocus.current;\n if (next) {\n e.preventDefault();\n keepFocus.current = null;\n next();\n }\n}\n\n/** Plain text for the clipboard: mentions as @Name. */\nexport function plainText(body: string): string {\n return body.replace(/@\\[([^\\]]+)\\]\\(user:[0-9a-f-]{36}\\)/gi, \"@$1\");\n}\n\nexport function MessageRow({ item, startsGroup, className }: MessageRowProps) {\n const ctx = useThreadContext();\n const keepFocus = useRef<(() => void) | null>(null);\n const pending = item.type === \"pending\" ? item.pending : null;\n const message = item.type === \"message\" ? item.message : pendingAsMessage(item.pending);\n\n if (message.kind === \"system\") {\n return (\n <div className={cn(\"flex justify-center px-4 py-1\", className)} role=\"note\" data-testid=\"genesis-chat-system\">\n <span className=\"max-w-[85%] rounded-full bg-muted px-3 py-1 text-center text-xs text-muted-foreground\">\n <ChatMarkdown text={message.body} me={ctx.me} />\n </span>\n </div>\n );\n }\n\n const mine = message.senderId === ctx.me;\n const sender = message.senderId ? ctx.resolveUser(message.senderId) : { name: \"Someone\" };\n const deleted = Boolean(message.deletedAt);\n const note = message.visibility === \"observers\";\n const showHeader = ctx.isGroup && !mine && startsGroup;\n const tone: \"default\" | \"primary\" = mine && !note && !deleted ? \"primary\" : \"default\";\n const views = pending ? pendingViews(pending) : message.attachments.map((a) => toAttachmentView(a, ctx.urls));\n const editing = ctx.editingId === message.id;\n const reactions = pending ? [] : summarizeReactions(message, ctx.me);\n const highlighted = ctx.highlightedId === message.id;\n const actionable = !pending && !deleted;\n\n const bubble = (\n <div\n className={cn(\n \"relative min-w-0 max-w-full rounded-2xl px-3 py-2 text-sm leading-relaxed shadow-sm transition-shadow\",\n tone === \"primary\" ? \"bg-primary text-primary-foreground\" : \"bg-muted text-foreground\",\n mine ? (startsGroup ? \"rounded-tr-md\" : \"\") : startsGroup ? \"rounded-tl-md\" : \"\",\n note && \"border border-warning/50 bg-warning/15 text-foreground\",\n deleted && \"border border-dashed bg-transparent text-muted-foreground shadow-none\",\n highlighted && \"ring-2 ring-ring ring-offset-2 ring-offset-background\",\n pending?.status === \"failed\" && \"opacity-80\",\n )}\n data-testid={deleted ? \"genesis-chat-deleted\" : note ? \"genesis-chat-note\" : mine ? \"genesis-chat-mine\" : \"genesis-chat-theirs\"}\n >\n {note ? (\n <div className=\"mb-1 flex items-center gap-1 text-xs font-semibold text-foreground/80\">\n <Lock className=\"size-3\" aria-hidden /> Internal note\n </div>\n ) : null}\n {deleted ? (\n <span className=\"flex items-center gap-1.5 italic\">\n <Ban className=\"size-3.5\" aria-hidden /> Message deleted\n </span>\n ) : editing ? (\n <EditBox message={message} />\n ) : (\n <>\n {message.replyToId ? <ReplyQuote id={message.replyToId} tone={tone} /> : null}\n {views.length ? (\n <div className={cn(message.body ? \"mb-1.5\" : \"\")}>\n <MessageAttachments views={views} message={pending ? undefined : message} mine={mine} tone={tone} slot={ctx.attachmentSlot} />\n </div>\n ) : null}\n {message.body ? <ChatMarkdown text={message.body} me={ctx.me} tone={tone} /> : null}\n <Meta message={message} pending={pending} tone={tone} />\n </>\n )}\n </div>\n );\n\n return (\n <article\n id={`genesis-chat-msg-${message.id}`}\n data-message-id={pending ? undefined : message.id}\n aria-label={messageLabel(message, mine ? \"You\" : sender.name)}\n className={cn(\"group/msg flex gap-2 px-3\", mine ? \"flex-row-reverse\" : \"flex-row\", startsGroup ? \"mt-2\" : \"mt-0.5\", className)}\n data-testid={pending ? `genesis-chat-pending-${pending.status}` : \"genesis-chat-message\"}\n >\n {ctx.isGroup && !mine ? (\n showHeader ? (\n <UserAvatar name={sender.name} src={sender.avatarUrl} size=\"sm\" className=\"mt-5\" />\n ) : (\n <span className=\"w-8 shrink-0\" aria-hidden />\n )\n ) : null}\n <div className={cn(\"flex min-w-0 max-w-[min(78%,36rem)] flex-col\", mine ? \"items-end\" : \"items-start\")}>\n {showHeader ? <span className=\"mb-0.5 px-3 text-xs font-medium text-muted-foreground\">{sender.name}</span> : null}\n <div className={cn(\"flex max-w-full items-center gap-1\", mine ? \"flex-row-reverse\" : \"flex-row\")}>\n {actionable ? (\n <ContextMenu>\n <ContextMenuTrigger asChild>{bubble}</ContextMenuTrigger>\n <ContextMenuContent className=\"w-56\" onCloseAutoFocus={(e) => returnFocus(e, keepFocus)}>\n <ActionItems message={message} mine={mine} keepFocus={keepFocus} Item={ContextMenuItem} Separator={ContextMenuSeparator} />\n </ContextMenuContent>\n </ContextMenu>\n ) : (\n bubble\n )}\n {actionable && !editing ? <HoverBar message={message} mine={mine} /> : null}\n </div>\n {reactions.length ? (\n <div className={cn(\"-mt-1 flex flex-wrap gap-1 px-2\", mine ? \"justify-end\" : \"justify-start\")} data-testid=\"genesis-chat-reactions\">\n {reactions.map((r) => (\n <Tooltip key={r.emoji} content={r.userIds.map((u) => (u === ctx.me ? \"You\" : ctx.resolveUser(u).name)).join(\", \")}>\n <button\n type=\"button\"\n aria-pressed={r.mine}\n aria-label={`${r.emoji} ${r.count}${r.mine ? \", including you\" : \"\"}. ${r.mine ? \"Remove\" : \"Add\"} your reaction`}\n onClick={() => ctx.react(message, r.emoji, !r.mine)}\n disabled={!ctx.canPost}\n className={cn(\n \"inline-flex h-6 items-center gap-1 rounded-full border bg-background px-2 text-xs shadow-sm transition-colors hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none\",\n r.mine && \"border-primary bg-primary/10 text-primary\",\n )}\n data-testid={`genesis-chat-reaction-${r.emoji}`}\n >\n <span aria-hidden>{r.emoji}</span>\n <span className=\"tabular-nums\" aria-hidden>\n {r.count}\n </span>\n </button>\n </Tooltip>\n ))}\n </div>\n ) : null}\n {!pending && message.threadCount > 0 && ctx.openThread ? (\n <Button type=\"button\" variant=\"link\" size=\"sm\" className=\"h-6 px-2 text-xs\" onClick={() => ctx.openThread?.(message)}>\n <MessageSquare className=\"size-3\" aria-hidden />\n {message.threadCount === 1 ? \"1 reply\" : `${message.threadCount} replies`}\n </Button>\n ) : null}\n {pending?.status === \"failed\" ? (\n <div className=\"mt-1 flex items-center gap-1 text-xs text-destructive\" role=\"alert\">\n <AlertCircle className=\"size-3.5\" aria-hidden />\n <span>Not sent{pending.error && pending.error !== \"Not sent\" ? `: ${pending.error}` : \"\"}</span>\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" className=\"h-6 px-2 text-xs\" onClick={() => ctx.retry(pending.clientId)} data-testid=\"genesis-chat-retry\">\n Retry\n </Button>\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" className=\"h-6 px-2 text-xs text-destructive hover:text-destructive\" onClick={() => ctx.discard(pending.clientId)} data-testid=\"genesis-chat-discard\">\n Delete\n </Button>\n </div>\n ) : null}\n </div>\n </article>\n );\n}\n\nfunction Meta({ message, pending, tone }: { message: ChatMessage; pending: PendingMessage | null; tone: \"default\" | \"primary\" }) {\n const muted = tone === \"primary\" ? \"text-primary-foreground/75\" : \"text-muted-foreground\";\n return (\n <span className={cn(\"float-right ml-3 mt-1 flex translate-y-1 items-center gap-1 text-[11px] leading-none\", muted)}>\n {message.editedAt ? <span>edited</span> : null}\n {pending?.status === \"sending\" ? (\n <>\n <Clock className=\"size-3\" aria-hidden />\n <span>Sending…</span>\n </>\n ) : pending?.status === \"failed\" ? (\n <AlertCircle className=\"size-3\" aria-label=\"Not sent\" />\n ) : (\n <time dateTime={message.createdAt}>{clockTime(message.createdAt)}</time>\n )}\n </span>\n );\n}\n\nfunction ReplyQuote({ id, tone }: { id: string; tone: \"default\" | \"primary\" }) {\n const ctx = useThreadContext();\n const original = ctx.byId.get(id);\n const who = original?.senderId ? (original.senderId === ctx.me ? \"You\" : ctx.resolveUser(original.senderId).name) : null;\n const text = original ? previewText(original.body, original.attachments[0]?.kind ?? null, Boolean(original.deletedAt)) : \"Earlier message\";\n return (\n <button\n type=\"button\"\n onClick={() => ctx.jumpTo(id)}\n className={cn(\n \"mb-1.5 block w-full min-w-0 rounded-md border-l-4 px-2 py-1 text-left text-xs focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n tone === \"primary\" ? \"border-primary-foreground/60 bg-primary-foreground/15\" : \"border-primary bg-background/60\",\n )}\n aria-label={`Replying to ${who ?? \"a message\"}: ${text}. Show it`}\n data-testid=\"genesis-chat-reply-quote\"\n >\n {who ? <span className=\"block font-semibold\">{who}</span> : null}\n <span className=\"line-clamp-2 opacity-80\">{text}</span>\n </button>\n );\n}\n\nfunction EditBox({ message }: { message: ChatMessage }) {\n const ctx = useThreadContext();\n const [value, setValue] = useState(message.body);\n const [busy, setBusy] = useState(false);\n const ref = useRef<HTMLTextAreaElement>(null);\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n el.focus();\n el.setSelectionRange(el.value.length, el.value.length);\n }, []);\n const save = async () => {\n const body = value.trim();\n if (!body || body === message.body) return ctx.startEdit(null);\n setBusy(true);\n try {\n await ctx.saveEdit(message, body);\n ctx.startEdit(null);\n } finally {\n setBusy(false);\n }\n };\n return (\n <div className=\"flex min-w-[16rem] flex-col gap-2\">\n <Textarea\n ref={ref}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Escape\") {\n e.preventDefault();\n ctx.startEdit(null);\n } else if (e.key === \"Enter\" && !e.shiftKey && !e.nativeEvent.isComposing) {\n e.preventDefault();\n void save();\n }\n }}\n id={`genesis-chat-edit-${message.id}`}\n aria-label=\"Edit message\"\n className=\"min-h-[60px] resize-none bg-background text-foreground\"\n />\n <div className=\"flex justify-end gap-2\">\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" onClick={() => ctx.startEdit(null)} className={cn(\"h-7\", \"text-current\")}>\n Cancel\n </Button>\n <Button type=\"button\" size=\"sm\" variant=\"secondary\" onClick={() => void save()} loading={busy} className=\"h-7\">\n Save\n </Button>\n </div>\n </div>\n );\n}\n\ntype ItemComponent = ComponentType<{ onSelect?: (e: Event) => void; className?: string; children?: ReactNode; \"data-testid\"?: string; \"aria-label\"?: string }>;\n\ninterface ActionItemsProps {\n message: ChatMessage;\n /** Set when the picked action moves focus itself (Reply, Edit), so the menu doesn't take it back. */\n keepFocus: MutableRefObject<(() => void) | null>;\n mine: boolean;\n Item: ItemComponent;\n Separator: ComponentType<{ className?: string }>;\n}\n\n/** The actions menu, the same in the right-click menu and the \"More\" menu. */\nfunction ActionItems({ message, mine, keepFocus, Item, Separator }: ActionItemsProps) {\n const ctx = useThreadContext();\n const pinned = ctx.pins.has(message.id);\n const canDelete = mine || ctx.canModerate;\n const canEdit = mine && message.kind === \"text\" && message.body.length > 0;\n return (\n <>\n {ctx.canPost ? (\n <>\n <div className=\"flex justify-between gap-0.5 px-1 py-1\" role=\"group\" aria-label=\"React\">\n {ctx.quickReactions.map((emoji) => {\n const on = message.reactions.some((r) => r.emoji === emoji && r.userId === ctx.me);\n return (\n <Item\n key={emoji}\n className={cn(\"justify-center rounded-full px-2 text-lg\", on && \"bg-primary/10\")}\n onSelect={() => ctx.react(message, emoji, !on)}\n aria-label={`${on ? \"Remove\" : \"React with\"} ${emoji}`}\n >\n {emoji}\n </Item>\n );\n })}\n </div>\n <Separator />\n <Item className=\"gap-2\" onSelect={() => { keepFocus.current = ctx.focusComposer; ctx.reply(message); }}>\n <Reply className=\"size-4\" aria-hidden /> Reply\n </Item>\n </>\n ) : null}\n {message.body ? (\n <Item className=\"gap-2\" onSelect={() => ctx.copy(message)}>\n <Copy className=\"size-4\" aria-hidden /> Copy text\n </Item>\n ) : null}\n {canEdit && ctx.canPost ? (\n <Item className=\"gap-2\" onSelect={() => { keepFocus.current = () => document.getElementById(`genesis-chat-edit-${message.id}`)?.focus(); ctx.startEdit(message.id); }}>\n <Pencil className=\"size-4\" aria-hidden /> Edit\n </Item>\n ) : null}\n {ctx.canPin ? (\n <Item className=\"gap-2\" onSelect={() => ctx.pin(message, !pinned)}>\n {pinned ? <PinOff className=\"size-4\" aria-hidden /> : <Pin className=\"size-4\" aria-hidden />} {pinned ? \"Unpin\" : \"Pin\"}\n </Item>\n ) : null}\n <Item className=\"gap-2\" onSelect={() => ctx.save(message)}>\n <Bookmark className=\"size-4\" aria-hidden /> Save\n </Item>\n {!mine && message.senderId ? (\n <Item className=\"gap-2\" onSelect={() => ctx.askReport(message)}>\n <Flag className=\"size-4\" aria-hidden /> Report\n </Item>\n ) : null}\n {canDelete ? (\n <>\n <Separator />\n <Item onSelect={() => ctx.askDelete(message)} className=\"gap-2 text-destructive focus:text-destructive\">\n <Trash2 className=\"size-4\" aria-hidden /> Delete\n </Item>\n </>\n ) : null}\n </>\n );\n}\n\n/** Desktop: a small bar beside the bubble on hover or focus (React, Reply, More). Touch uses long-press. */\nfunction HoverBar({ message, mine }: { message: ChatMessage; mine: boolean }) {\n const ctx = useThreadContext();\n const keepFocus = useRef<(() => void) | null>(null);\n const [open, setOpen] = useState<\"react\" | \"more\" | null>(null);\n return (\n <div\n className={cn(\n \"flex shrink-0 items-center gap-0.5 opacity-0 transition-opacity focus-within:opacity-100 group-hover/msg:opacity-100 [@media(hover:none)]:hidden\",\n open && \"opacity-100\",\n mine ? \"flex-row-reverse\" : \"flex-row\",\n )}\n >\n {ctx.canPost ? (\n <Popover open={open === \"react\"} onOpenChange={(o) => setOpen(o ? \"react\" : null)}>\n <PopoverTrigger asChild>\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" className=\"size-7 rounded-full text-muted-foreground\" aria-label=\"React\">\n <SmilePlus />\n </Button>\n </PopoverTrigger>\n <PopoverContent side=\"top\" align={mine ? \"end\" : \"start\"} className=\"flex w-auto gap-0.5 rounded-full p-1\">\n {ctx.quickReactions.map((emoji) => {\n const on = message.reactions.some((r) => r.emoji === emoji && r.userId === ctx.me);\n return (\n <button\n key={emoji}\n type=\"button\"\n className={cn(\"flex size-9 items-center justify-center rounded-full text-xl transition-transform hover:scale-125 hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\", on && \"bg-primary/10\")}\n aria-label={`${on ? \"Remove\" : \"React with\"} ${emoji}`}\n aria-pressed={on}\n onClick={() => {\n ctx.react(message, emoji, !on);\n setOpen(null);\n }}\n >\n {emoji}\n </button>\n );\n })}\n </PopoverContent>\n </Popover>\n ) : null}\n {ctx.canPost ? (\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" className=\"size-7 rounded-full text-muted-foreground\" aria-label=\"Reply\" onClick={() => ctx.reply(message)}>\n <Reply />\n </Button>\n ) : null}\n <DropdownMenu open={open === \"more\"} onOpenChange={(o) => setOpen(o ? \"more\" : null)}>\n <DropdownMenuTrigger asChild>\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" className=\"size-7 rounded-full text-muted-foreground\" aria-label=\"More actions\" data-testid=\"genesis-chat-more\">\n <MoreHorizontal />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align={mine ? \"end\" : \"start\"} className=\"w-56\" onCloseAutoFocus={(e) => returnFocus(e, keepFocus)}>\n <ActionItems message={message} mine={mine} keepFocus={keepFocus} Item={DropdownMenuItem} Separator={DropdownMenuSeparator} />\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n );\n}\n\n","/**\n * @feat:chat\n * Voice notes on the web: MediaRecorder (Opus in WebM, else MP4/AAC for\n * Safari), with an AnalyserNode read every 100 ms for a live level meter and,\n * at the end, the waveform the bubble draws before the audio loads.\n */\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { CHAT_LIMITS, fileExtension, waveformPeaks } from \"../core/media\";\nimport type { LocalFile } from \"../core/outbox\";\n\nexport type VoiceRecorderState = \"idle\" | \"requesting\" | \"recording\" | \"denied\" | \"unsupported\" | \"error\";\n\nexport interface VoiceRecording {\n blob: Blob;\n /** The container's type without codec parameters, e.g. `audio/webm`. */\n contentType: string;\n name: string;\n durationMs: number;\n /** 48 peaks, 0–100. */\n waveform: number[];\n}\n\nexport interface UseVoiceRecorderOptions {\n /** The longest recording; it stops itself there (`recordingLimitMs(role)`). Default five minutes. */\n maxMs?: number;\n /** Called about every 100 ms while recording (e.g. to tell the others). */\n onTick?: () => void;\n /** Called with the recording when it stopped itself at `maxMs`. */\n onLimit?: (recording: VoiceRecording) => void;\n}\n\nconst SAMPLE_MS = 100;\nconst METER_BARS = 32;\n\n/** The type to record in: Opus in WebM where the browser has it, else MP4 (Safari). */\nexport function pickVoiceMimeType(): string | null {\n if (typeof MediaRecorder === \"undefined\") return null;\n for (const type of [\"audio/webm;codecs=opus\", \"audio/mp4\", \"audio/webm\"]) {\n try {\n if (MediaRecorder.isTypeSupported(type)) return type;\n } catch {\n // Older browsers throw on unknown types.\n }\n }\n return \"\";\n}\n\n/** A recording as a file the outbox sends: a voice attachment with its duration and waveform. */\nexport function voiceFile(recording: VoiceRecording): LocalFile {\n return {\n data: recording.blob,\n name: recording.name,\n contentType: recording.contentType,\n previewUrl: typeof URL !== \"undefined\" && URL.createObjectURL ? URL.createObjectURL(recording.blob) : undefined,\n meta: { kind: \"voice\", durationMs: recording.durationMs, waveform: recording.waveform, bytes: recording.blob.size },\n };\n}\n\nexport function useVoiceRecorder(options: UseVoiceRecorderOptions = {}) {\n const maxMs = options.maxMs ?? CHAT_LIMITS.recordingMs;\n const [state, setState] = useState<VoiceRecorderState>(\"idle\");\n const [elapsedMs, setElapsedMs] = useState(0);\n const [levels, setLevels] = useState<number[]>([]);\n const [error, setError] = useState<string | null>(null);\n\n const opts = useRef(options);\n opts.current = options;\n const session = useRef<{\n recorder: MediaRecorder;\n stream: MediaStream;\n context: AudioContext | null;\n timer: ReturnType<typeof setInterval>;\n chunks: Blob[];\n samples: number[];\n startedAt: number;\n mimeType: string;\n discard: boolean;\n done: Promise<VoiceRecording | null>;\n } | null>(null);\n\n const cleanup = useCallback(() => {\n const s = session.current;\n if (!s) return;\n clearInterval(s.timer);\n for (const t of s.stream.getTracks()) t.stop();\n void s.context?.close().catch(() => undefined);\n session.current = null;\n }, []);\n\n const stop = useCallback(async (): Promise<VoiceRecording | null> => {\n const s = session.current;\n if (!s) return null;\n if (s.recorder.state !== \"inactive\") s.recorder.stop();\n return s.done;\n }, []);\n\n // Cancel while the browser still asks for the microphone: the answer is dropped.\n const abandoned = useRef(false);\n\n const cancel = useCallback(() => {\n const s = session.current;\n if (!s) {\n abandoned.current = true;\n setState((st) => (st === \"requesting\" ? \"idle\" : st));\n return;\n }\n s.discard = true;\n if (s.recorder.state !== \"inactive\") s.recorder.stop();\n else cleanup();\n }, [cleanup]);\n\n const start = useCallback(async () => {\n if (session.current) return;\n const mimeType = pickVoiceMimeType();\n if (mimeType === null || typeof navigator === \"undefined\" || !navigator.mediaDevices?.getUserMedia) {\n setState(\"unsupported\");\n setError(\"This browser can't record voice messages.\");\n return;\n }\n setState(\"requesting\");\n setError(null);\n abandoned.current = false;\n let stream: MediaStream;\n try {\n stream = await navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true, noiseSuppression: true } });\n } catch (e) {\n const name = (e as { name?: string })?.name;\n if (name === \"NotAllowedError\" || name === \"SecurityError\") {\n setState(\"denied\");\n setError(\"Microphone access is blocked. Allow it for this site in your browser's settings to record voice messages.\");\n } else if (name === \"NotFoundError\") {\n setState(\"error\");\n setError(\"No microphone was found.\");\n } else {\n setState(\"error\");\n setError(\"The microphone couldn't be started.\");\n }\n return;\n }\n if (abandoned.current) {\n for (const t of stream.getTracks()) t.stop();\n return;\n }\n\n let recorder: MediaRecorder;\n try {\n recorder = new MediaRecorder(stream, mimeType ? { mimeType } : undefined);\n } catch {\n for (const t of stream.getTracks()) t.stop();\n setState(\"unsupported\");\n setError(\"This browser can't record voice messages.\");\n return;\n }\n\n let context: AudioContext | null = null;\n let analyser: AnalyserNode | null = null;\n try {\n const Ctx = window.AudioContext ?? (window as unknown as { webkitAudioContext?: typeof AudioContext }).webkitAudioContext;\n if (Ctx) {\n context = new Ctx();\n analyser = context.createAnalyser();\n analyser.fftSize = 1024;\n context.createMediaStreamSource(stream).connect(analyser);\n }\n } catch {\n context = null;\n analyser = null;\n }\n const buffer = analyser ? new Float32Array(analyser.fftSize) : null;\n\n const chunks: Blob[] = [];\n const samples: number[] = [];\n const startedAt = Date.now();\n let resolveDone!: (r: VoiceRecording | null) => void;\n const done = new Promise<VoiceRecording | null>((r) => (resolveDone = r));\n\n const timer = setInterval(() => {\n const s = session.current;\n if (!s) return;\n let level = 0;\n if (analyser && buffer) {\n analyser.getFloatTimeDomainData(buffer);\n for (let i = 0; i < buffer.length; i++) level = Math.max(level, Math.abs(buffer[i]!));\n }\n s.samples.push(level);\n setLevels((prev) => [...prev, level].slice(-METER_BARS));\n const elapsed = Date.now() - s.startedAt;\n setElapsedMs(elapsed);\n opts.current.onTick?.();\n if (elapsed >= maxMs && s.recorder.state === \"recording\") {\n void stop().then((r) => r && opts.current.onLimit?.(r));\n }\n }, SAMPLE_MS);\n\n recorder.ondataavailable = (e) => {\n if (e.data && e.data.size > 0) chunks.push(e.data);\n };\n recorder.onstop = () => {\n const s = session.current;\n const discard = s?.discard ?? true;\n const durationMs = Math.min(maxMs, Date.now() - startedAt);\n const contentType = (recorder.mimeType || mimeType || \"audio/webm\").split(\";\")[0]!.trim();\n cleanup();\n setState(\"idle\");\n setElapsedMs(0);\n setLevels([]);\n if (discard || chunks.length === 0) {\n resolveDone(null);\n return;\n }\n const blob = new Blob(chunks, { type: contentType });\n const ext = fileExtension(\"\", contentType) || \"webm\";\n resolveDone({\n blob,\n contentType,\n name: `voice-${new Date(startedAt).toISOString().replace(/[:.]/g, \"-\")}.${ext}`,\n durationMs,\n waveform: waveformPeaks(samples, 48),\n });\n };\n\n session.current = { recorder, stream, context, timer, chunks, samples, startedAt, mimeType: mimeType ?? \"\", discard: false, done };\n recorder.start(250);\n setElapsedMs(0);\n setLevels([]);\n setState(\"recording\");\n }, [cleanup, maxMs, stop]);\n\n // Leaving the screen mid-recording throws the recording away.\n useEffect(() => () => {\n const s = session.current;\n if (s) {\n s.discard = true;\n try {\n if (s.recorder.state !== \"inactive\") s.recorder.stop();\n } catch {\n // already stopped\n }\n clearInterval(s.timer);\n for (const t of s.stream.getTracks()) t.stop();\n void s.context?.close().catch(() => undefined);\n session.current = null;\n }\n }, []);\n\n return {\n state,\n recording: state === \"recording\",\n elapsedMs,\n maxMs,\n /** The latest levels, 0–1, newest last: a live meter. */\n levels,\n error,\n clearError: () => {\n setError(null);\n setState((s) => (s === \"denied\" || s === \"error\" || s === \"unsupported\" ? \"idle\" : s));\n },\n start,\n stop,\n cancel,\n };\n}\n\nexport type VoiceRecorder = ReturnType<typeof useVoiceRecorder>;\n","/**\n * @feat:chat\n * The composer: a growing text box (Enter sends, Shift+Enter is a new line;\n * on touch screens Enter is a new line), photos and files from a picker, a\n * paste or a drop, with previews to remove before sending, a reply banner,\n * internal notes for observers, and voice notes recorded in place. Where you\n * may not post it says why instead.\n */\nimport {\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n type ChangeEvent,\n type ClipboardEvent,\n type KeyboardEvent,\n type ReactNode,\n type Ref,\n} from \"react\";\nimport { FileText, Lock, Mic, Paperclip, SendHorizontal, Trash2, X } from \"lucide-react\";\nimport { Alert, AlertDescription, Button, Skeleton, Textarea, Toggle, Tooltip, cn, toast } from \"@marktiderman/genesis-ui\";\nimport { CHAT_LIMITS, attachmentKindFor, fileExtension, formatDuration, isAllowedExtension, randomId, recordingLimitMs } from \"../core/media\";\nimport type { LocalFile } from \"../core/outbox\";\nimport { parseMentions, previewText } from \"../core/thread\";\nimport type { ChatMessage } from \"../core/types\";\nimport { useChat, type ConversationState } from \"../react/index\";\nimport type { ResolveUser } from \"./format\";\nimport { useVoiceRecorder, voiceFile } from \"./use-voice-recorder\";\n\nexport interface ChatComposerHandle {\n /** Adds files as if picked (a drop on the thread, say). Refused ones get a toast. */\n addFiles(files: File[] | FileList): void;\n /** Puts text at the cursor. */\n insertText(text: string): void;\n focus(): void;\n}\n\nexport interface ChatComposerProps {\n /** From `useConversation`: how to send, and whether you may. */\n conversation: Pick<ConversationState, \"send\" | \"signalTyping\" | \"signalRecording\" | \"role\" | \"canPost\" | \"accessLoading\" | \"conversation\">;\n /** The message being replied to; a banner shows above the box. */\n replyTo?: ChatMessage | null;\n onCancelReply?: () => void;\n /** Names the replied-to person. */\n resolveUser?: ResolveUser;\n placeholder?: string;\n /** Extra controls beside the attach button (the `composerAccessory` slot of ChatThread). */\n accessory?: ReactNode;\n /** Called after a message is queued. */\n onSent?: () => void;\n autoFocus?: boolean;\n className?: string;\n ref?: Ref<ChatComposerHandle>;\n}\n\ninterface Draft {\n id: string;\n file: File;\n previewUrl: string | null;\n kind: string;\n}\n\nconst isTouch = () => typeof window !== \"undefined\" && typeof window.matchMedia === \"function\" && window.matchMedia(\"(pointer: coarse)\").matches;\nconst objectUrl = (f: Blob) => (typeof URL !== \"undefined\" && typeof URL.createObjectURL === \"function\" ? URL.createObjectURL(f) : null);\nconst revoke = (u: string | null) => {\n if (u && typeof URL !== \"undefined\" && typeof URL.revokeObjectURL === \"function\") URL.revokeObjectURL(u);\n};\nconst MAX_HEIGHT = 160;\n\nexport function ChatComposer({\n conversation: state,\n replyTo,\n onCancelReply,\n resolveUser,\n placeholder = \"Message\",\n accessory,\n onSent,\n autoFocus,\n className,\n ref,\n}: ChatComposerProps) {\n const { userId: me } = useChat();\n const [text, setText] = useState(\"\");\n const [drafts, setDrafts] = useState<Draft[]>([]);\n const [internal, setInternal] = useState(false);\n const textarea = useRef<HTMLTextAreaElement>(null);\n const picker = useRef<HTMLInputElement>(null);\n const draftsRef = useRef(drafts);\n draftsRef.current = drafts;\n\n const recorder = useVoiceRecorder({\n maxMs: recordingLimitMs(state.role),\n onTick: state.signalRecording,\n onLimit: (rec) => {\n void sendVoice(rec);\n toast.info(`Voice messages stop at ${formatDuration(recordingLimitMs(state.role))}. Sent.`);\n },\n });\n\n // Previews not sent are freed when the composer goes.\n useEffect(() => () => draftsRef.current.forEach((d) => revoke(d.previewUrl)), []);\n\n const autosize = useCallback(() => {\n const el = textarea.current;\n if (!el) return;\n el.style.height = \"auto\";\n el.style.height = `${Math.min(el.scrollHeight, MAX_HEIGHT)}px`;\n }, []);\n useEffect(autosize, [text, autosize]);\n\n useEffect(() => {\n if (replyTo) textarea.current?.focus();\n }, [replyTo]);\n\n const addFiles = useCallback((list: File[] | FileList) => {\n const files = Array.from(list);\n if (files.length === 0) return;\n const next: Draft[] = [];\n let room = CHAT_LIMITS.attachmentsPerMessage - draftsRef.current.length;\n for (const file of files) {\n const ext = fileExtension(file.name, file.type);\n if (!isAllowedExtension(ext)) {\n toast.error(`${file.name} can't be sent`, { description: \"Photos, videos, audio, PDFs and office documents can.\" });\n continue;\n }\n const type = file.type || \"application/octet-stream\";\n const kind = attachmentKindFor(type);\n const limit = kind === \"video\" ? CHAT_LIMITS.videoBytes : CHAT_LIMITS.fileBytes;\n if (file.size > limit) {\n toast.error(`${file.name} is too big`, { description: `The limit is ${Math.round(limit / 1024 / 1024)} MB.` });\n continue;\n }\n if (room <= 0) {\n toast.error(`Up to ${CHAT_LIMITS.attachmentsPerMessage} files per message`);\n break;\n }\n room -= 1;\n next.push({ id: randomId(), file, kind, previewUrl: kind === \"image\" || kind === \"video\" ? objectUrl(file) : null });\n }\n if (next.length) setDrafts((d) => [...d, ...next]);\n }, []);\n\n const insertText = useCallback((value: string) => {\n const el = textarea.current;\n setText((t) => {\n if (!el) return t + value;\n const start = el.selectionStart ?? t.length;\n const end = el.selectionEnd ?? t.length;\n return t.slice(0, start) + value + t.slice(end);\n });\n el?.focus();\n }, []);\n\n useImperativeHandle(ref, () => ({ addFiles, insertText, focus: () => textarea.current?.focus() }), [addFiles, insertText]);\n\n const removeDraft = (id: string) =>\n setDrafts((d) => {\n const gone = d.find((x) => x.id === id);\n revoke(gone?.previewUrl ?? null);\n return d.filter((x) => x.id !== id);\n });\n\n const common = () => ({\n replyToId: replyTo?.id ?? null,\n visibility: internal ? (\"observers\" as const) : (\"everyone\" as const),\n });\n\n const submit = () => {\n const body = text.trim();\n if (!body && drafts.length === 0) return;\n if (body.length > CHAT_LIMITS.bodyChars) {\n toast.error(`Messages can be up to ${CHAT_LIMITS.bodyChars.toLocaleString()} characters`);\n return;\n }\n const files: LocalFile[] = drafts.map((d) => ({\n data: d.file,\n name: d.file.name,\n contentType: d.file.type || \"application/octet-stream\",\n previewUrl: d.previewUrl ?? undefined,\n meta: { kind: d.kind, bytes: d.file.size, name: d.file.name },\n }));\n void state.send({ body, mentions: parseMentions(body), ...common() }, files);\n setText(\"\");\n setDrafts([]);\n onCancelReply?.();\n onSent?.();\n textarea.current?.focus();\n };\n\n async function sendVoice(rec: Awaited<ReturnType<typeof recorder.stop>>) {\n if (!rec) return;\n if (rec.durationMs < 700) {\n toast.info(\"Hold on a little longer to record a voice message\");\n return;\n }\n await state.send({ body: \"\", ...common() }, [voiceFile(rec)]);\n onCancelReply?.();\n onSent?.();\n }\n\n const onKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === \"Enter\" && !e.shiftKey && !e.nativeEvent.isComposing && !isTouch()) {\n e.preventDefault();\n submit();\n } else if (e.key === \"Escape\" && replyTo) {\n onCancelReply?.();\n }\n };\n\n const onChange = (e: ChangeEvent<HTMLTextAreaElement>) => {\n setText(e.target.value);\n if (e.target.value) state.signalTyping();\n };\n\n const onPaste = (e: ClipboardEvent<HTMLTextAreaElement>) => {\n const files = Array.from(e.clipboardData?.files ?? []);\n if (files.length) {\n e.preventDefault();\n addFiles(files);\n }\n };\n\n // Loading who you are in this conversation.\n if (state.accessLoading) {\n return (\n <div className={cn(\"border-t p-3\", className)} aria-busy>\n <Skeleton className=\"h-10 w-full rounded-2xl\" />\n </div>\n );\n }\n\n if (!state.canPost) {\n const adminsOnly = state.conversation?.settings?.who_posts === \"admins\";\n return (\n <div className={cn(\"border-t p-3 text-center text-sm text-muted-foreground\", className)} role=\"status\" data-testid=\"genesis-chat-cannot-post\">\n <Lock className=\"mr-1 inline size-3.5 align-[-2px]\" aria-hidden />\n {adminsOnly ? \"Only admins can post here\" : \"You can't post in this conversation\"}\n </div>\n );\n }\n\n const hasContent = text.trim().length > 0 || drafts.length > 0;\n const replyName = replyTo?.senderId ? (replyTo.senderId === me ? \"yourself\" : (resolveUser?.(replyTo.senderId).name ?? \"message\")) : \"message\";\n\n return (\n <div className={cn(\"border-t bg-background\", className)} data-testid=\"genesis-chat-composer\">\n {recorder.error ? (\n <Alert variant=\"destructive\" className=\"m-2 w-auto\" data-testid=\"genesis-chat-mic-error\">\n <Mic className=\"size-4\" aria-hidden />\n <AlertDescription className=\"flex items-start justify-between gap-2\">\n <span>{recorder.error}</span>\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" className=\"size-6 shrink-0\" onClick={recorder.clearError} aria-label=\"Dismiss\">\n <X />\n </Button>\n </AlertDescription>\n </Alert>\n ) : null}\n {replyTo ? (\n <div className=\"flex items-center gap-2 border-b px-3 py-2\" data-testid=\"genesis-chat-reply-banner\">\n <div className=\"min-w-0 flex-1 border-l-4 border-primary pl-2\">\n <div className=\"text-xs font-semibold text-primary\">Replying to {replyName}</div>\n <div className=\"truncate text-xs text-muted-foreground\">{previewText(replyTo.body, replyTo.attachments[0]?.kind ?? null, Boolean(replyTo.deletedAt))}</div>\n </div>\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" className=\"size-7 shrink-0\" onClick={onCancelReply} aria-label=\"Cancel reply\">\n <X />\n </Button>\n </div>\n ) : null}\n {drafts.length ? (\n <ul className=\"flex gap-2 overflow-x-auto px-3 pt-3\" aria-label=\"Attachments to send\">\n {drafts.map((d) => (\n <li key={d.id} className=\"relative shrink-0\">\n {d.kind === \"image\" && d.previewUrl ? (\n <img src={d.previewUrl} alt={d.file.name} className=\"size-16 rounded-lg border object-cover\" />\n ) : d.kind === \"video\" && d.previewUrl ? (\n <video src={d.previewUrl} muted playsInline preload=\"metadata\" className=\"size-16 rounded-lg border object-cover\" aria-label={d.file.name} />\n ) : (\n <span className=\"flex h-16 w-40 items-center gap-2 rounded-lg border bg-muted px-2 text-xs\">\n <FileText className=\"size-4 shrink-0\" aria-hidden />\n <span className=\"line-clamp-2 break-all\">{d.file.name}</span>\n </span>\n )}\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"secondary\"\n className=\"absolute -right-1.5 -top-1.5 size-5 rounded-full border shadow-sm [&_svg]:size-3\"\n onClick={() => removeDraft(d.id)}\n aria-label={`Remove ${d.file.name}`}\n >\n <X />\n </Button>\n </li>\n ))}\n </ul>\n ) : null}\n\n {recorder.recording || recorder.state === \"requesting\" ? (\n <div className=\"flex items-center gap-2 p-2\" data-testid=\"genesis-chat-recording\">\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" className=\"shrink-0 rounded-full text-destructive hover:text-destructive\" onClick={recorder.cancel} aria-label=\"Cancel recording\">\n <Trash2 />\n </Button>\n <span className=\"size-2.5 shrink-0 animate-pulse rounded-full bg-destructive\" aria-hidden />\n <span className=\"w-24 shrink-0 text-sm tabular-nums\" role=\"timer\" aria-live=\"off\">\n {formatDuration(recorder.elapsedMs)}\n <span className=\"text-muted-foreground\"> / {formatDuration(recorder.maxMs)}</span>\n </span>\n <span className=\"flex h-8 flex-1 items-center justify-end gap-[2px] overflow-hidden\" aria-hidden>\n {recorder.levels.map((l, i) => (\n <span key={i} className=\"w-[3px] shrink-0 rounded-full bg-primary\" style={{ height: `${Math.max(10, Math.min(100, l * 140))}%` }} />\n ))}\n </span>\n <span className=\"sr-only\" role=\"status\">\n {recorder.state === \"requesting\" ? \"Asking for the microphone\" : \"Recording a voice message\"}\n </span>\n <Button\n type=\"button\"\n size=\"icon\"\n className=\"shrink-0 rounded-full\"\n disabled={!recorder.recording}\n onClick={() => void recorder.stop().then(sendVoice)}\n aria-label=\"Send voice message\"\n data-testid=\"genesis-chat-voice-send\"\n >\n <SendHorizontal />\n </Button>\n </div>\n ) : (\n <div className=\"flex items-end gap-1 p-2\">\n <input\n ref={picker}\n type=\"file\"\n multiple\n className=\"hidden\"\n tabIndex={-1}\n aria-hidden\n accept=\"image/*,video/*,audio/*,.pdf,.txt,.csv,.docx,.xlsx,.pptx,.heic,.heif\"\n onChange={(e) => {\n if (e.target.files) addFiles(e.target.files);\n e.target.value = \"\";\n }}\n data-testid=\"genesis-chat-file-input\"\n />\n <Tooltip content=\"Attach photos or files\">\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" className=\"shrink-0 rounded-full text-muted-foreground\" onClick={() => picker.current?.click()} aria-label=\"Attach photos or files\">\n <Paperclip />\n </Button>\n </Tooltip>\n {accessory}\n {state.role === \"observer\" ? (\n <Tooltip content={internal ? \"Internal note: only observers see it\" : \"Write an internal note\"}>\n <Toggle\n pressed={internal}\n onPressedChange={setInternal}\n aria-label=\"Internal note\"\n size=\"sm\"\n className=\"h-10 shrink-0 rounded-full data-[state=on]:bg-warning/20\"\n >\n <Lock className=\"size-4\" />\n </Toggle>\n </Tooltip>\n ) : null}\n <Textarea\n ref={textarea}\n rows={1}\n value={text}\n onChange={onChange}\n onKeyDown={onKeyDown}\n onPaste={onPaste}\n placeholder={internal ? \"Internal note\" : placeholder}\n aria-label={internal ? \"Internal note\" : placeholder}\n autoFocus={autoFocus}\n maxLength={CHAT_LIMITS.bodyChars}\n enterKeyHint=\"send\"\n className={cn(\n \"max-h-40 min-h-10 flex-1 resize-none rounded-2xl py-2 leading-snug\",\n internal && \"border-warning/60 bg-warning/10\",\n )}\n data-testid=\"genesis-chat-input\"\n />\n {hasContent ? (\n <Button type=\"button\" size=\"icon\" className=\"shrink-0 rounded-full\" onClick={submit} aria-label=\"Send\" data-testid=\"genesis-chat-send\">\n <SendHorizontal />\n </Button>\n ) : (\n <Tooltip content=\"Record a voice message\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"shrink-0 rounded-full text-muted-foreground\"\n onClick={() => void recorder.start()}\n aria-label=\"Record a voice message\"\n data-testid=\"genesis-chat-mic\"\n >\n <Mic />\n </Button>\n </Tooltip>\n )}\n </div>\n )}\n </div>\n );\n}\n","/**\n * @feat:chat\n * One conversation, whole: a header, the messages (oldest at the top, kept at\n * the bottom as new ones arrive unless you scrolled up, then a \"New messages\"\n * pill; earlier ones load as you reach the top without moving what you were\n * reading), day dividers and the \"New\" line, who is typing, and the composer.\n * Files dropped anywhere on it attach. Screen readers hear incoming messages.\n */\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type ComponentType,\n type DragEvent,\n type ReactNode,\n} from \"react\";\nimport { ArrowDown, ArrowLeft, ImagePlus, MessageSquare, Pin } from \"lucide-react\";\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n EmptyState,\n Label,\n RadioGroup,\n RadioGroupItem,\n Skeleton,\n Spinner,\n Textarea,\n UserAvatar,\n cn,\n toast,\n} from \"@marktiderman/genesis-ui\";\nimport { renderSlot, type SlotOverride } from \"@marktiderman/genesis-core/slots\";\nimport { ChatError } from \"../core/client\";\nimport { activityLine, dayLabel, itemSender, itemTime, parseMentions, previewText, startsDay, startsGroup, type ThreadItem } from \"../core/thread\";\nimport type { ChatConversation, ChatMember, ChatMessage, ChatRole } from \"../core/types\";\nimport { useChat, useConversation, useFileUrls, useMessageActions, usePins } from \"../react/index\";\nimport type { ChatAttachmentSlotProps } from \"./attachments\";\nimport { MessageRow, plainText } from \"./bubble\";\nimport { ChatComposer, type ChatComposerHandle } from \"./composer\";\nimport type { ResolveUser } from \"./format\";\nimport { QUICK_REACTIONS, ThreadContext, type ThreadContextValue } from \"./thread-context\";\n\nexport interface ChatThreadHeaderProps {\n conversationId: string;\n conversation: ChatConversation | null;\n /** The title the thread worked out (the conversation's, or the other person's name). */\n title: string;\n /** How many people are in it, for a group. */\n subtitle: string | null;\n /** \"Sam is typing…\" while someone is. */\n activity: string | null;\n /** The other person in a two-person conversation. */\n otherUserId: string | null;\n members: ChatMember[];\n role: ChatRole | null;\n resolveUser: ResolveUser;\n onBack?: () => void;\n backClassName?: string;\n}\n\nexport interface ChatThreadEmptyProps {\n conversationId: string;\n canPost: boolean;\n}\n\nexport interface ChatComposerAccessoryProps {\n conversationId: string;\n insertText(text: string): void;\n addFiles(files: File[]): void;\n}\n\nexport interface ChatThreadSlots {\n /** The bar above the messages. */\n header?: SlotOverride<ChatThreadHeaderProps>;\n /** What a conversation with no messages shows. */\n empty?: SlotOverride<ChatThreadEmptyProps>;\n /** Draws the app's own attachment kinds (form, lesson…); a generic card by default, `null` hides them. */\n attachment?: ComponentType<ChatAttachmentSlotProps> | null;\n /** Extra controls in the composer, beside the attach button. */\n composerAccessory?: SlotOverride<ChatComposerAccessoryProps>;\n}\n\nexport interface ChatThreadProps {\n conversationId: string;\n /** Names people. Required: the package knows no people tables, the app does. */\n resolveUser: ResolveUser;\n /** The header's title; worked out from the conversation and its members by default. */\n title?: string;\n /** Shows a back button in the header. */\n onBack?: () => void;\n /** Classes for that back button (ChatPanel hides it on wide screens). */\n backClassName?: string;\n /** One thread's replies instead of the main timeline. */\n threadRootId?: string;\n /** One topic's messages. */\n topic?: string;\n /** Shown on messages that have replies, to open their thread. */\n onOpenThread?: (message: ChatMessage) => void;\n /** The quick reactions; 👍 ❤️ 😂 😮 😢 🙏 by default. */\n quickReactions?: readonly string[];\n placeholder?: string;\n slots?: ChatThreadSlots;\n className?: string;\n}\n\nconst REPORT_REASONS = [\n { value: \"spam\", label: \"Spam\" },\n { value: \"harassment\", label: \"Harassment or bullying\" },\n { value: \"safety\", label: \"Someone may be at risk\" },\n { value: \"other\", label: \"Something else\" },\n] as const;\n\ntype ReportReason = (typeof REPORT_REASONS)[number][\"value\"];\n\nconst itemKey = (item: ThreadItem) => (item.type === \"message\" ? item.message.clientId || item.message.id : item.pending.clientId);\n\nfunction errorText(e: unknown): string {\n if (e instanceof ChatError) {\n if (e.forbidden) return \"You can't do that here\";\n if (e.rateLimited) return \"Slow down a little and try again\";\n if (e.transient) return \"Check your connection and try again\";\n }\n return e instanceof Error ? e.message : \"Something went wrong\";\n}\n\nfunction DefaultHeader({ title, subtitle, otherUserId, resolveUser, onBack, backClassName }: ChatThreadHeaderProps) {\n const other = otherUserId ? resolveUser(otherUserId) : null;\n return (\n <header className=\"flex min-h-14 items-center gap-3 border-b px-3 py-2\" data-testid=\"genesis-chat-thread-header\">\n {onBack ? (\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" className={cn(\"-ml-1 shrink-0\", backClassName)} onClick={onBack} aria-label=\"Back to conversations\">\n <ArrowLeft />\n </Button>\n ) : null}\n <UserAvatar name={title} src={other?.avatarUrl} size=\"sm\" />\n <div className=\"min-w-0 flex-1\">\n <h2 className=\"truncate text-sm font-semibold leading-tight\">{title}</h2>\n {subtitle ? <p className=\"truncate text-xs text-muted-foreground\">{subtitle}</p> : null}\n </div>\n </header>\n );\n}\n\nfunction DefaultEmpty({ canPost }: ChatThreadEmptyProps) {\n return <EmptyState icon={MessageSquare} title=\"No messages yet\" description={canPost ? \"Say hello.\" : undefined} />;\n}\n\nexport function ChatThread({\n conversationId,\n resolveUser,\n title: titleProp,\n onBack,\n backClassName,\n threadRootId,\n topic,\n onOpenThread,\n quickReactions = QUICK_REACTIONS,\n placeholder,\n slots,\n className,\n}: ChatThreadProps) {\n const { userId: me } = useChat();\n const state = useConversation(conversationId, { threadRootId, topic });\n const actions = useMessageActions();\n const pinIds = usePins(conversationId);\n const { items, messages, members, role, canPost, conversation, activity } = state;\n\n const paths = useMemo(\n () => messages.flatMap((m) => m.attachments.flatMap((a) => [a.path, a.posterPath])).filter((p): p is string => Boolean(p)),\n [messages],\n );\n const urls = useFileUrls(paths);\n const byId = useMemo(() => new Map(messages.map((m) => [m.id, m])), [messages]);\n const pins = useMemo(() => new Set(pinIds), [pinIds]);\n\n const [replyTo, setReplyTo] = useState<ChatMessage | null>(null);\n const [editingId, setEditingId] = useState<string | null>(null);\n const [highlightedId, setHighlightedId] = useState<string | null>(null);\n const [confirmDelete, setConfirmDelete] = useState<ChatMessage | null>(null);\n const [reporting, setReporting] = useState<ChatMessage | null>(null);\n const [dragging, setDragging] = useState(false);\n const [newCount, setNewCount] = useState(0);\n const [announcement, setAnnouncement] = useState(\"\");\n const composer = useRef<ChatComposerHandle | null>(null);\n\n // A different conversation starts clean.\n useEffect(() => {\n setReplyTo(null);\n setEditingId(null);\n setNewCount(0);\n }, [conversationId]);\n\n const nameOf = useCallback((id: string) => (id === me ? \"You\" : resolveUser(id).name), [me, resolveUser]);\n const others = members.filter((m) => m.userId !== me);\n const otherUserId = members.length === 2 && others.length === 1 ? others[0]!.userId : null;\n const isGroup = members.length > 2 || role === \"observer\";\n const title =\n titleProp ??\n conversation?.title ??\n (otherUserId\n ? resolveUser(otherUserId).name\n : others.length\n ? others.length <= 3\n ? others.map((m) => resolveUser(m.userId).name).join(\", \")\n : `${others.slice(0, 2).map((m) => resolveUser(m.userId).name).join(\", \")} and ${others.length - 2} others`\n : \"Conversation\");\n // Someone who just posted has stopped typing, whatever their last signal said.\n const arrived = useRef(new Map<string, number>());\n const live = activityLine(\n activity.filter((a) => a.at > (arrived.current.get(a.userId) ?? 0)),\n (id) => resolveUser(id).name,\n );\n const subtitle = members.length > 2 ? `${members.length} members` : null;\n\n // ---- scrolling ------------------------------------------------------------\n const scroller = useRef<HTMLDivElement>(null);\n const content = useRef<HTMLDivElement>(null);\n const atBottom = useRef(true);\n const initialised = useRef<string | null>(null);\n const edges = useRef<{ first: string | null; last: string | null }>({ first: null, last: null });\n const anchor = useRef<{ height: number; top: number } | null>(null);\n\n const scrollToBottom = useCallback((smooth = false) => {\n const el = scroller.current;\n if (!el) return;\n if (smooth && typeof el.scrollTo === \"function\") el.scrollTo({ top: el.scrollHeight, behavior: \"smooth\" });\n else el.scrollTop = el.scrollHeight;\n atBottom.current = true;\n setNewCount(0);\n }, []);\n\n useLayoutEffect(() => {\n const el = scroller.current;\n if (!el || items.length === 0) return;\n const first = itemKey(items[0]!);\n const lastItem = items[items.length - 1]!;\n const last = itemKey(lastItem);\n const prev = edges.current;\n edges.current = { first, last };\n\n if (initialised.current !== conversationId) {\n initialised.current = conversationId;\n const unread = state.firstUnreadId ? document.getElementById(`genesis-chat-msg-${state.firstUnreadId}`) : null;\n if (unread && typeof unread.scrollIntoView === \"function\") unread.scrollIntoView({ block: \"center\" });\n else scrollToBottom();\n return;\n }\n if (anchor.current && first !== prev.first) {\n el.scrollTop = el.scrollHeight - anchor.current.height + anchor.current.top;\n anchor.current = null;\n }\n if (last !== prev.last) {\n const mine = itemSender(lastItem) === me;\n if (atBottom.current || mine) scrollToBottom();\n else setNewCount((n) => n + 1);\n if (!mine && lastItem.type === \"message\" && lastItem.message.kind !== \"system\") {\n const m = lastItem.message;\n if (m.senderId) arrived.current.set(m.senderId, Date.now());\n setAnnouncement(`${m.senderId ? resolveUser(m.senderId).name : \"Someone\"}: ${previewText(m.body, m.attachments[0]?.kind ?? null, Boolean(m.deletedAt))}`);\n }\n }\n }, [items, conversationId, me, resolveUser, scrollToBottom, state.firstUnreadId]);\n\n const hasItems = items.length > 0;\n // Photos and previews that load later grow the thread: stay at the bottom if you were there.\n useEffect(() => {\n const el = content.current;\n if (!el || typeof ResizeObserver === \"undefined\") return;\n const ro = new ResizeObserver(() => {\n if (atBottom.current && scroller.current) scroller.current.scrollTop = scroller.current.scrollHeight;\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, [hasItems]);\n\n const { hasEarlier, loadingEarlier, loadEarlier } = state;\n const loadOlder = useCallback(() => {\n const el = scroller.current;\n if (!el || !hasEarlier || loadingEarlier) return;\n anchor.current = { height: el.scrollHeight, top: el.scrollTop };\n void loadEarlier().catch((e) => toast.error(errorText(e)));\n }, [hasEarlier, loadingEarlier, loadEarlier]);\n\n const onScroll = () => {\n const el = scroller.current;\n if (!el) return;\n const bottom = el.scrollHeight - el.scrollTop - el.clientHeight < 80;\n atBottom.current = bottom;\n if (bottom && newCount) setNewCount(0);\n if (el.scrollTop < 200) loadOlder();\n };\n\n const jumpTo = useCallback((id: string) => {\n const el = document.getElementById(`genesis-chat-msg-${id}`);\n if (!el) {\n toast.info(\"That message is further up\", { description: \"Scroll up to load it.\" });\n return;\n }\n if (typeof el.scrollIntoView === \"function\") el.scrollIntoView({ block: \"center\", behavior: \"smooth\" });\n setHighlightedId(id);\n setTimeout(() => setHighlightedId((h) => (h === id ? null : h)), 1600);\n }, []);\n\n // ---- actions --------------------------------------------------------------\n const run = useCallback(async (p: Promise<unknown>, done?: string) => {\n try {\n await p;\n if (done) toast.success(done);\n } catch (e) {\n toast.error(errorText(e));\n }\n }, []);\n\n const ctx: ThreadContextValue = {\n me,\n resolveUser,\n role,\n isGroup,\n canModerate: role === \"owner\" || role === \"admin\",\n canPin: role === \"owner\" || role === \"admin\" || members.length === 2,\n canPost,\n pins,\n urls,\n byId,\n quickReactions,\n attachmentSlot: slots?.attachment,\n highlightedId,\n editingId,\n reply: (m) => {\n setReplyTo(m);\n composer.current?.focus();\n },\n focusComposer: () => composer.current?.focus(),\n startEdit: setEditingId,\n saveEdit: async (m, body) => {\n try {\n await actions.edit(m, body, parseMentions(body));\n } catch (e) {\n toast.error(errorText(e));\n throw e;\n }\n },\n askDelete: setConfirmDelete,\n askReport: setReporting,\n react: (m, emoji, on) => void run(actions.react(m, emoji, on)),\n pin: (m, on) => void run(actions.pin(m, on), on ? \"Pinned\" : \"Unpinned\"),\n save: (m) => void run(actions.save(m, true), \"Saved\"),\n copy: (m) => {\n const text = plainText(m.body);\n if (typeof navigator !== \"undefined\" && navigator.clipboard?.writeText) void run(navigator.clipboard.writeText(text), \"Copied\");\n else toast.error(\"Copying isn't available here\");\n },\n jumpTo,\n retry: (clientId) => void state.retry(clientId),\n discard: (clientId) => void state.discard(clientId),\n openThread: onOpenThread,\n };\n\n // ---- drag and drop --------------------------------------------------------\n const hasFiles = (e: DragEvent) => Array.from(e.dataTransfer?.types ?? []).includes(\"Files\");\n const dropProps = canPost\n ? {\n onDragOver: (e: DragEvent<HTMLDivElement>) => {\n if (!hasFiles(e)) return;\n e.preventDefault();\n if (!dragging) setDragging(true);\n },\n onDragLeave: (e: DragEvent<HTMLDivElement>) => {\n if (!e.currentTarget.contains(e.relatedTarget as Node | null)) setDragging(false);\n },\n onDrop: (e: DragEvent<HTMLDivElement>) => {\n if (!hasFiles(e)) return;\n e.preventDefault();\n setDragging(false);\n composer.current?.addFiles(e.dataTransfer.files);\n },\n }\n : {};\n\n // ---- render ---------------------------------------------------------------\n const pinnedMessage = pinIds.length ? byId.get(pinIds[pinIds.length - 1]!) : undefined;\n let body: ReactNode;\n if (state.isLoading) {\n body = (\n <div className=\"flex flex-col gap-3 p-4\" aria-busy aria-label=\"Loading messages\" data-testid=\"genesis-chat-thread-loading\">\n {[40, 60, 30, 50].map((w, i) => (\n <Skeleton key={i} className={cn(\"h-9 rounded-2xl\", i % 2 ? \"self-end\" : \"self-start\")} style={{ width: `${w}%` }} />\n ))}\n </div>\n );\n } else if (state.error && items.length === 0) {\n body = (\n <EmptyState\n icon={MessageSquare}\n title=\"Couldn't load this conversation\"\n description={errorText(state.error)}\n action={\n <Button type=\"button\" variant=\"outline\" onClick={() => void state.refetch()}>\n Try again\n </Button>\n }\n />\n );\n } else if (items.length === 0) {\n body = renderSlot(DefaultEmpty, slots?.empty, { conversationId, canPost });\n } else {\n body = (\n <div ref={content} className=\"flex min-h-full flex-col justify-end pb-2 pt-1\">\n {hasEarlier ? (\n <div className=\"flex justify-center py-2\">\n {loadingEarlier ? (\n <Spinner size=\"sm\" aria-label=\"Loading earlier messages\" />\n ) : (\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" className=\"h-7 text-xs text-muted-foreground\" onClick={loadOlder}>\n Load earlier messages\n </Button>\n )}\n </div>\n ) : null}\n {items.map((item, i) => {\n const id = item.type === \"message\" ? item.message.id : null;\n return (\n <div key={itemKey(item)}>\n {startsDay(items, i) ? (\n <div className=\"sticky top-1 z-10 flex justify-center py-2\" role=\"separator\" aria-label={dayLabel(itemTime(item))}>\n <span className=\"rounded-full border bg-background/95 px-3 py-0.5 text-xs font-medium text-muted-foreground shadow-sm\">{dayLabel(itemTime(item))}</span>\n </div>\n ) : null}\n {id && id === state.firstUnreadId ? (\n <div className=\"my-2 flex items-center gap-2 px-4\" role=\"separator\" aria-label=\"New messages\" data-testid=\"genesis-chat-new-line\">\n <span className=\"h-px flex-1 bg-primary/40\" />\n <span className=\"text-xs font-semibold text-primary\">New</span>\n <span className=\"h-px flex-1 bg-primary/40\" />\n </div>\n ) : null}\n <MessageRow item={item} startsGroup={startsGroup(items, i)} />\n </div>\n );\n })}\n </div>\n );\n }\n\n return (\n <ThreadContext.Provider value={ctx}>\n <section\n className={cn(\"relative flex h-full min-h-0 flex-col bg-background\", className)}\n aria-label={title}\n data-testid=\"genesis-chat-thread\"\n {...dropProps}\n >\n {renderSlot(DefaultHeader, slots?.header, {\n conversationId,\n conversation,\n title,\n subtitle,\n activity: live,\n otherUserId,\n members,\n role,\n resolveUser,\n onBack,\n backClassName,\n })}\n {pinnedMessage ? (\n <button\n type=\"button\"\n onClick={() => jumpTo(pinnedMessage.id)}\n className=\"flex items-center gap-2 border-b bg-muted/40 px-3 py-1.5 text-left text-xs hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring\"\n aria-label={`Pinned message: ${previewText(pinnedMessage.body, pinnedMessage.attachments[0]?.kind ?? null, Boolean(pinnedMessage.deletedAt))}. Show it`}\n >\n <Pin className=\"size-3.5 shrink-0 text-primary\" aria-hidden />\n <span className=\"truncate\">{previewText(pinnedMessage.body, pinnedMessage.attachments[0]?.kind ?? null, Boolean(pinnedMessage.deletedAt))}</span>\n {pinIds.length > 1 ? <span className=\"ml-auto shrink-0 text-muted-foreground\">+{pinIds.length - 1}</span> : null}\n </button>\n ) : null}\n\n <div className=\"relative min-h-0 flex-1\">\n {/* A plain scroller, not ScrollArea: the thread sets scrollTop to keep your place as earlier messages load, and needs the element that scrolls. */}\n <div ref={scroller} onScroll={onScroll} className=\"h-full overflow-y-auto overscroll-contain\" role=\"log\" aria-live=\"off\" aria-label=\"Messages\" data-testid=\"genesis-chat-scroller\">\n {body}\n </div>\n {newCount > 0 ? (\n <Button\n type=\"button\"\n size=\"sm\"\n className=\"absolute bottom-3 left-1/2 h-8 -translate-x-1/2 rounded-full shadow-md\"\n onClick={() => scrollToBottom(true)}\n data-testid=\"genesis-chat-new-pill\"\n >\n New messages <ArrowDown />\n </Button>\n ) : null}\n {dragging ? (\n <div className=\"pointer-events-none absolute inset-2 flex flex-col items-center justify-center gap-2 rounded-xl border-2 border-dashed border-primary bg-background/90 text-sm font-medium text-primary\">\n <ImagePlus className=\"size-6\" aria-hidden />\n Drop to attach\n </div>\n ) : null}\n </div>\n\n <div className=\"h-5 px-4 text-xs italic text-muted-foreground\" data-testid=\"genesis-chat-activity\">\n {live ? (\n <span className=\"inline-flex items-center gap-1.5\">\n <span className=\"inline-flex gap-0.5\" aria-hidden>\n <span className=\"size-1 animate-bounce rounded-full bg-muted-foreground [animation-delay:-0.3s]\" />\n <span className=\"size-1 animate-bounce rounded-full bg-muted-foreground [animation-delay:-0.15s]\" />\n <span className=\"size-1 animate-bounce rounded-full bg-muted-foreground\" />\n </span>\n {live}\n </span>\n ) : null}\n </div>\n <div className=\"sr-only\" aria-live=\"polite\" aria-atomic=\"true\" data-testid=\"genesis-chat-announcer\">\n {announcement}\n </div>\n\n <ChatComposer\n ref={composer}\n conversation={state}\n replyTo={replyTo}\n onCancelReply={() => setReplyTo(null)}\n resolveUser={resolveUser}\n placeholder={placeholder}\n accessory={renderSlot(EmptyAccessory, slots?.composerAccessory, {\n conversationId,\n insertText: (t) => composer.current?.insertText(t),\n addFiles: (f) => composer.current?.addFiles(f),\n })}\n />\n </section>\n\n <AlertDialog open={confirmDelete !== null} onOpenChange={(o) => !o && setConfirmDelete(null)}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Delete this message?</AlertDialogTitle>\n <AlertDialogDescription>\n {confirmDelete?.senderId === me ? \"It's deleted for everyone in the conversation.\" : \"It's deleted for everyone in the conversation, including the person who sent it.\"}\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancel</AlertDialogCancel>\n <AlertDialogAction\n className=\"bg-destructive text-destructive-foreground hover:bg-destructive/90\"\n onClick={() => {\n const m = confirmDelete;\n setConfirmDelete(null);\n if (m) void run(actions.remove(m));\n }}\n data-testid=\"genesis-chat-confirm-delete\"\n >\n Delete\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n\n <ReportDialog\n message={reporting}\n onClose={() => setReporting(null)}\n onSubmit={async (m, reason, note) => {\n await run(actions.report(m, reason, note || undefined), \"Reported. Thank you.\");\n setReporting(null);\n }}\n />\n </ThreadContext.Provider>\n );\n}\n\nfunction EmptyAccessory(_props: ChatComposerAccessoryProps) {\n return null;\n}\n\nfunction ReportDialog({\n message,\n onClose,\n onSubmit,\n}: {\n message: ChatMessage | null;\n onClose: () => void;\n onSubmit: (m: ChatMessage, reason: ReportReason, note: string) => Promise<void>;\n}) {\n const [reason, setReason] = useState<ReportReason>(\"spam\");\n const [note, setNote] = useState(\"\");\n const [busy, setBusy] = useState(false);\n useEffect(() => {\n if (message) {\n setReason(\"spam\");\n setNote(\"\");\n }\n }, [message]);\n return (\n <Dialog open={message !== null} onOpenChange={(o) => !o && onClose()}>\n <DialogContent className=\"sm:max-w-md\">\n <DialogHeader>\n <DialogTitle>Report this message</DialogTitle>\n <DialogDescription>The people who look after this conversation see your report and the messages around it.</DialogDescription>\n </DialogHeader>\n <RadioGroup value={reason} onValueChange={(v) => setReason(v as ReportReason)} aria-label=\"Reason\">\n {REPORT_REASONS.map((r) => (\n <div key={r.value} className=\"flex items-center gap-2\">\n <RadioGroupItem value={r.value} id={`genesis-chat-report-${r.value}`} />\n <Label htmlFor={`genesis-chat-report-${r.value}`}>{r.label}</Label>\n </div>\n ))}\n </RadioGroup>\n <Textarea value={note} onChange={(e) => setNote(e.target.value)} placeholder=\"Anything else? (optional)\" aria-label=\"Details\" maxLength={1000} />\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={onClose}>\n Cancel\n </Button>\n <Button\n type=\"button\"\n variant=\"destructive\"\n loading={busy}\n onClick={async () => {\n if (!message) return;\n setBusy(true);\n try {\n await onSubmit(message, reason, note.trim());\n } finally {\n setBusy(false);\n }\n }}\n >\n Report\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","/**\n * @feat:chat\n * Messages, whole: the inbox on the left and the open conversation on the\n * right (Genesis `Split`); on a narrow screen one at a time, with a back\n * button from the conversation to the inbox.\n */\nimport { useState, type ReactNode } from \"react\";\nimport { MessageSquare } from \"lucide-react\";\nimport { EmptyState, Split, cn } from \"@marktiderman/genesis-ui\";\nimport { renderSlot, type SlotOverride } from \"@marktiderman/genesis-core/slots\";\nimport { ChatInbox, type ChatInboxProps } from \"./inbox\";\nimport type { ResolveUser } from \"./format\";\nimport { ChatThread, type ChatThreadProps } from \"./thread\";\n\nexport interface ChatPanelNoSelectionProps {\n /** Words under the title; \"Pick one on the left to read and reply.\" by default. */\n hint?: string;\n}\n\nexport interface ChatPanelProps {\n resolveUser: ResolveUser;\n /** The open conversation (controlled). */\n selectedId?: string | null;\n /** The conversation open at first (uncontrolled). */\n defaultSelectedId?: string | null;\n /** Called when a conversation is opened, or with null on back. Put it in the URL to make it bookmarkable. */\n onSelectedChange?: (conversationId: string | null) => void;\n /** Above the inbox list: a title, a \"New message\" button. */\n inboxHeader?: ReactNode;\n inboxProps?: Partial<Omit<ChatInboxProps, \"resolveUser\" | \"onSelect\" | \"selectedId\">>;\n threadProps?: Partial<Omit<ChatThreadProps, \"conversationId\" | \"resolveUser\" | \"onBack\">>;\n /** What the right pane shows before a conversation is chosen. */\n slots?: { noSelection?: SlotOverride<ChatPanelNoSelectionProps> };\n className?: string;\n}\n\nfunction NoSelection({ hint }: ChatPanelNoSelectionProps) {\n return (\n <div className=\"flex h-full items-center justify-center\">\n <EmptyState icon={MessageSquare} title=\"Choose a conversation\" description={hint ?? \"Pick one on the left to read and reply.\"} />\n </div>\n );\n}\n\nexport function ChatPanel({\n resolveUser,\n selectedId: controlled,\n defaultSelectedId = null,\n onSelectedChange,\n inboxHeader,\n inboxProps,\n threadProps,\n slots,\n className,\n}: ChatPanelProps) {\n const [own, setOwn] = useState<string | null>(defaultSelectedId);\n const selected = controlled !== undefined ? controlled : own;\n const select = (id: string | null) => {\n if (controlled === undefined) setOwn(id);\n onSelectedChange?.(id);\n };\n\n return (\n <Split\n ratio=\"1/3\"\n at=\"md\"\n gap=\"none\"\n testID=\"genesis-chat-panel\"\n className={cn(\n \"h-full min-h-0 overflow-hidden rounded-lg border bg-background\",\n \"[&>[data-slot=split-start]]:min-h-0 [&>[data-slot=split-end]]:min-h-0 max-md:[&>[data-slot]]:flex-1\",\n selected ? \"max-md:[&>[data-slot=split-start]]:hidden\" : \"max-md:[&>[data-slot=split-end]]:hidden\",\n className,\n )}\n start={\n <div className=\"flex h-full min-h-0 flex-col md:border-r\">\n {inboxHeader ? <div className=\"shrink-0 border-b px-3 py-2\">{inboxHeader}</div> : null}\n <ChatInbox {...inboxProps} resolveUser={resolveUser} selectedId={selected} onSelect={select} className={cn(\"min-h-0 flex-1 overflow-y-auto\", inboxProps?.className)} />\n </div>\n }\n end={\n selected ? (\n <ChatThread key={selected} {...threadProps} conversationId={selected} resolveUser={resolveUser} onBack={() => select(null)} backClassName=\"md:hidden\" />\n ) : (\n renderSlot(NoSelection, slots?.noSelection, {})\n )\n }\n />\n );\n}\n","/**\n * @feat:chat\n * A chat client held in memory, for demos, stories and tests: the same shape\n * as `createChatClient`, with no Supabase behind it. It also plays the other\n * side (`receive`, `activity`) so a demo looks alive.\n */\nimport { ChatError, type ChatClient, type ChatSupabase, type ConversationChannel, type MessagePage } from \"../core/client\";\nimport type {\n ChatActivity,\n ChatAttachment,\n ChatConversation,\n ChatInboxItem,\n ChatMember,\n ChatMessage,\n ChatRole,\n ChatSignal,\n SendInput,\n} from \"../core/types\";\n\nexport interface MemoryConversationSeed {\n id: string;\n kind?: string;\n title?: string | null;\n settings?: ChatConversation[\"settings\"];\n members: { userId: string; role?: ChatRole; lastReadSeq?: number }[];\n /** Your role when you aren't a member (an observer). */\n myRole?: ChatRole | null;\n canPost?: boolean;\n muted?: boolean;\n pinned?: boolean;\n messages?: (Partial<Omit<ChatMessage, \"attachments\">> & { attachments?: Partial<ChatAttachment>[] })[];\n pins?: string[];\n}\n\nexport interface MemoryChatOptions {\n /** The signed-in user. */\n me: string;\n conversations: MemoryConversationSeed[];\n /** Signed URLs for attachment paths. */\n files?: Record<string, string>;\n /** Milliseconds each call waits, to show loading states. Default 0. */\n latencyMs?: number;\n}\n\ninterface Conv {\n conversation: ChatConversation;\n members: ChatMember[];\n myRole: ChatRole | null;\n canPost: boolean;\n muted: boolean;\n pinned: boolean;\n messages: ChatMessage[];\n pins: string[];\n}\n\nexport type MemoryChatClient = ChatClient & {\n /** Someone else posts (a demo's other side). */\n receive(conversationId: string, senderId: string, body: string, extra?: Partial<ChatMessage>): ChatMessage;\n /** Someone else starts typing or recording. */\n activity(conversationId: string, userId: string, activity: ChatActivity[\"activity\"]): void;\n /** The next `count` sends fail as if the connection dropped. */\n failNextSends(count?: number): void;\n /** The next send waits until the returned function is called (a test watching the sending state). */\n holdNextSend(): () => void;\n /** Every call made, for tests. */\n calls: { method: string; args: unknown[] }[];\n};\n\nlet counter = 0;\nconst uuid = () =>\n typeof crypto !== \"undefined\" && \"randomUUID\" in crypto ? crypto.randomUUID() : `00000000-0000-4000-8000-${String(++counter).padStart(12, \"0\")}`;\n\nfunction attachment(messageId: string, a: Partial<ChatAttachment>, i: number): ChatAttachment {\n return {\n id: a.id ?? uuid(),\n messageId,\n position: a.position ?? i,\n kind: a.kind ?? \"file\",\n ref: a.ref ?? {},\n provider: a.provider ?? \"storage\",\n path: a.path ?? null,\n providerId: a.providerId ?? null,\n playbackId: a.playbackId ?? null,\n url: a.url ?? null,\n status: a.status ?? \"ready\",\n name: a.name ?? null,\n mime: a.mime ?? null,\n bytes: a.bytes ?? null,\n width: a.width ?? null,\n height: a.height ?? null,\n durationMs: a.durationMs ?? null,\n waveform: a.waveform ?? null,\n posterPath: a.posterPath ?? null,\n thumbhash: a.thumbhash ?? null,\n transcript: a.transcript ?? null,\n transcriptStatus: a.transcriptStatus ?? null,\n };\n}\n\nexport function createMemoryChatClient(options: MemoryChatOptions): MemoryChatClient {\n const { me } = options;\n const files: Record<string, string> = { ...(options.files ?? {}) };\n const convs = new Map<string, Conv>();\n const convListeners = new Map<string, Set<{ onSignal: (s: ChatSignal) => void; onActivity?: (a: ChatActivity) => void }>>();\n const inboxListeners = new Set<(s: ChatSignal) => void>();\n const calls: { method: string; args: unknown[] }[] = [];\n let failing = 0;\n let held: Promise<void> | null = null;\n const wait = () => new Promise<void>((r) => setTimeout(r, options.latencyMs ?? 0));\n\n const makeMessage = (c: Conv, m: Partial<Omit<ChatMessage, \"attachments\">> & { attachments?: Partial<ChatAttachment>[] }): ChatMessage => {\n const id = m.id ?? uuid();\n const seq = ++c.conversation.lastSeq;\n const createdAt = m.createdAt ?? new Date().toISOString();\n c.conversation.lastMessageAt = createdAt;\n return {\n id,\n conversationId: c.conversation.id,\n seq,\n clientId: m.clientId ?? id,\n senderId: m.senderId ?? null,\n senderRole: m.senderRole ?? (m.kind === \"system\" ? \"system\" : \"member\"),\n kind: m.kind ?? \"text\",\n body: m.body ?? \"\",\n mentions: m.mentions ?? [],\n replyToId: m.replyToId ?? null,\n threadRootId: m.threadRootId ?? null,\n threadCount: m.threadCount ?? 0,\n threadLastAt: m.threadLastAt ?? null,\n topic: m.topic ?? null,\n visibility: m.visibility ?? \"everyone\",\n silent: m.silent ?? false,\n meta: m.meta ?? {},\n createdAt,\n editedAt: m.editedAt ?? null,\n deletedAt: m.deletedAt ?? null,\n attachments: (m.attachments ?? []).map((a, i) => attachment(id, a, i)),\n reactions: m.reactions ?? [],\n };\n };\n\n for (const seed of options.conversations) {\n const c: Conv = {\n conversation: {\n id: seed.id,\n kind: seed.kind ?? (seed.members.length === 2 ? \"direct\" : \"group\"),\n title: seed.title ?? null,\n subjectType: null,\n subjectId: null,\n settings: seed.settings ?? {},\n status: null,\n assigneeId: null,\n lastSeq: 0,\n lastMessageAt: null,\n createdAt: new Date().toISOString(),\n archivedAt: null,\n },\n members: seed.members.map((m) => ({\n conversationId: seed.id,\n userId: m.userId,\n role: m.role ?? \"member\",\n lastReadSeq: m.lastReadSeq ?? 0,\n joinedAt: new Date().toISOString(),\n })),\n myRole: seed.myRole !== undefined ? seed.myRole : (seed.members.find((m) => m.userId === me)?.role ?? \"member\"),\n canPost: seed.canPost ?? true,\n muted: seed.muted ?? false,\n pinned: seed.pinned ?? false,\n messages: [],\n pins: seed.pins ?? [],\n };\n for (const m of seed.messages ?? []) c.messages.push(makeMessage(c, m));\n convs.set(seed.id, c);\n }\n\n const get = (id: string) => {\n const c = convs.get(id);\n if (!c) throw new ChatError(\"Conversation not found\", \"42501\", \"conversation\");\n return c;\n };\n const findMessage = (id: string) => {\n for (const c of convs.values()) {\n const m = c.messages.find((x) => x.id === id);\n if (m) return { c, m };\n }\n throw new ChatError(\"Message not found\", \"42501\", \"message\");\n };\n const visible = (c: Conv, m: ChatMessage) => m.visibility !== \"observers\" || c.myRole === \"observer\";\n const clone = (m: ChatMessage): ChatMessage => ({ ...m, attachments: m.attachments.map((a) => ({ ...a })), reactions: [...m.reactions] });\n const emit = (conversationId: string, s: ChatSignal) => {\n for (const l of convListeners.get(conversationId) ?? []) l.onSignal(s);\n for (const l of inboxListeners) l({ type: \"inbox\", conversationId });\n };\n const log = (method: string, ...args: unknown[]) => calls.push({ method, args });\n\n function inboxItem(c: Conv): ChatInboxItem {\n const mine = c.members.find((m) => m.userId === me);\n const lastRead = mine?.lastReadSeq ?? 0;\n const seen = c.messages.filter((m) => visible(c, m));\n const last = seen[seen.length - 1];\n const others = c.members.filter((m) => m.userId !== me);\n const unreadList = seen.filter((m) => m.seq > lastRead && m.senderId !== me && !m.deletedAt);\n return {\n conversationId: c.conversation.id,\n kind: c.conversation.kind,\n title: c.conversation.title,\n subjectType: null,\n subjectId: null,\n status: null,\n role: c.myRole ?? \"member\",\n otherUserId: c.members.length === 2 && others.length === 1 ? others[0]!.userId : null,\n memberCount: c.members.length,\n lastSeq: c.conversation.lastSeq,\n lastReadSeq: lastRead,\n unread: Math.min(99, unreadList.length),\n mentioned: unreadList.some((m) => m.mentions.includes(me)),\n muted: c.muted,\n pinned: c.pinned,\n archived: false,\n lastMessageAt: c.conversation.lastMessageAt,\n lastMessage: last\n ? {\n id: last.id,\n seq: last.seq,\n senderId: last.senderId,\n kind: last.kind,\n body: last.body,\n deleted: Boolean(last.deletedAt),\n createdAt: last.createdAt,\n attachment: last.attachments[0]?.kind ?? null,\n }\n : null,\n };\n }\n\n const client: MemoryChatClient = {\n supabase: null as unknown as ChatSupabase,\n calls,\n\n async inbox(opts: { kind?: string; archived?: boolean; limit?: number; before?: string } = {}) {\n log(\"inbox\", opts);\n await wait();\n if (opts.archived) return [];\n return [...convs.values()]\n .filter((c) => !opts.kind || c.conversation.kind === opts.kind)\n .map(inboxItem)\n .sort((a, b) => Number(b.pinned) - Number(a.pinned) || (b.lastMessageAt ?? \"\").localeCompare(a.lastMessageAt ?? \"\"));\n },\n async observed() {\n return [];\n },\n async unreadTotal() {\n return [...convs.values()].reduce((n, c) => n + inboxItem(c).unread, 0);\n },\n async conversation(id: string) {\n await wait();\n return convs.has(id) ? { ...get(id).conversation } : null;\n },\n async kind(kind: string) {\n return { kind, label: kind, maxMembers: kind === \"direct\" ? 2 : null, whoPosts: \"members\" as const, membership: \"admins\" as const, threads: true, observersPost: false };\n },\n\n async myRole(id: string) {\n return convs.get(id)?.myRole ?? null;\n },\n async canPost(id: string) {\n return convs.get(id)?.canPost ?? false;\n },\n async members(id: string) {\n return get(id).members.map((m) => ({ ...m }));\n },\n async messages(id: string, opts: { beforeSeq?: number; afterSeq?: number; limit?: number; threadRootId?: string; topic?: string } = {}): Promise<MessagePage> {\n log(\"messages\", id, opts);\n await wait();\n const c = get(id);\n const limit = Math.min(Math.max(opts.limit ?? 50, 1), 200);\n let list = c.messages.filter((m) => visible(c, m) && (opts.threadRootId ? m.threadRootId === opts.threadRootId : m.threadRootId === null));\n if (opts.topic) list = list.filter((m) => m.topic === opts.topic);\n if (opts.afterSeq != null) return { messages: list.filter((m) => m.seq > opts.afterSeq!).slice(0, limit).map(clone), hasEarlier: false };\n if (opts.beforeSeq != null) list = list.filter((m) => m.seq < opts.beforeSeq!);\n const page = list.slice(-limit);\n return { messages: page.map(clone), hasEarlier: list.length > page.length };\n },\n async message(id: string) {\n try {\n const { c, m } = findMessage(id);\n return visible(c, m) ? clone(m) : null;\n } catch {\n return null;\n }\n },\n async startConversation(kind: string, memberIds: string[], opts: { title?: string } = {}) {\n const id = uuid();\n convs.set(id, {\n conversation: {\n id,\n kind,\n title: opts.title ?? null,\n subjectType: null,\n subjectId: null,\n settings: {},\n status: null,\n assigneeId: null,\n lastSeq: 0,\n lastMessageAt: null,\n createdAt: new Date().toISOString(),\n archivedAt: null,\n },\n members: [me, ...memberIds.filter((m) => m !== me)].map((userId) => ({ conversationId: id, userId, role: userId === me ? \"owner\" : \"member\", lastReadSeq: 0, joinedAt: new Date().toISOString() })),\n myRole: \"owner\",\n canPost: true,\n muted: false,\n pinned: false,\n messages: [],\n pins: [],\n });\n for (const l of inboxListeners) l({ type: \"inbox\", conversationId: id });\n return id;\n },\n async send(input: SendInput) {\n log(\"send\", input);\n await wait();\n if (held) {\n const hold = held;\n held = null;\n await hold;\n }\n if (failing > 0) {\n failing -= 1;\n throw new ChatError(\"Failed to fetch\", undefined, \"send_message\");\n }\n const c = get(input.conversationId);\n if (!c.canPost) throw new ChatError(\"You can't post here\", \"42501\", \"send_message\");\n const existing = c.messages.find((m) => m.clientId === input.clientId);\n if (existing) return clone(existing);\n const m = makeMessage(c, {\n clientId: input.clientId,\n senderId: me,\n senderRole: c.myRole ?? \"member\",\n body: input.body ?? \"\",\n mentions: input.mentions ?? [],\n replyToId: input.replyToId ?? null,\n threadRootId: input.threadRootId ?? null,\n topic: input.topic ?? null,\n visibility: input.visibility ?? \"everyone\",\n silent: input.silent ?? false,\n attachments: (input.attachments ?? []).map((a) => ({ ...a, durationMs: a.durationMs ?? null, transcriptStatus: a.kind === \"voice\" ? \"pending\" : null })) as Partial<ChatAttachment>[],\n });\n c.messages.push(m);\n const mine = c.members.find((x) => x.userId === me);\n if (mine) mine.lastReadSeq = m.seq;\n emit(c.conversation.id, { type: \"message\", conversationId: c.conversation.id, id: m.id, seq: m.seq, op: \"insert\" });\n return clone(m);\n },\n async edit(messageId: string, body: string, mentions: string[] = []) {\n log(\"edit\", messageId, body);\n const { c, m } = findMessage(messageId);\n if (m.senderId !== me) throw new ChatError(\"You can't edit this message\", \"42501\", \"edit_message\");\n Object.assign(m, { body, mentions, editedAt: new Date().toISOString() });\n emit(c.conversation.id, { type: \"message\", conversationId: c.conversation.id, id: m.id, op: \"update\" });\n return clone(m);\n },\n async remove(messageId: string) {\n log(\"remove\", messageId);\n const { c, m } = findMessage(messageId);\n Object.assign(m, { body: \"\", attachments: [], reactions: [], deletedAt: new Date().toISOString() });\n emit(c.conversation.id, { type: \"message\", conversationId: c.conversation.id, id: m.id, op: \"update\" });\n },\n async react(messageId: string, emoji: string, on = true) {\n log(\"react\", messageId, emoji, on);\n const { c, m } = findMessage(messageId);\n m.reactions = m.reactions.filter((r) => !(r.emoji === emoji && r.userId === me));\n if (on) m.reactions.push({ emoji, userId: me });\n emit(c.conversation.id, { type: \"reaction\", conversationId: c.conversation.id, messageId });\n },\n async markRead(conversationId: string, seq?: number) {\n const c = get(conversationId);\n const mine = c.members.find((x) => x.userId === me);\n if (mine) mine.lastReadSeq = Math.max(mine.lastReadSeq, seq ?? c.conversation.lastSeq);\n return mine?.lastReadSeq ?? 0;\n },\n async setMySettings(conversationId: string, s: { mutedUntil?: string | null; archived?: boolean; pinned?: boolean }) {\n const c = get(conversationId);\n if (s.mutedUntil !== undefined) c.muted = s.mutedUntil !== null;\n if (s.pinned !== undefined) c.pinned = s.pinned;\n },\n async updateConversation(conversationId: string, s: { title?: string; settings?: Record<string, unknown> }) {\n const c = get(conversationId);\n if (s.title !== undefined) c.conversation.title = s.title;\n if (s.settings) c.conversation.settings = { ...c.conversation.settings, ...s.settings };\n },\n async addMembers(conversationId: string, userIds: string[]) {\n const c = get(conversationId);\n for (const userId of userIds) if (!c.members.some((m) => m.userId === userId)) c.members.push({ conversationId, userId, role: \"member\", lastReadSeq: 0, joinedAt: new Date().toISOString() });\n },\n async removeMember(conversationId: string, userId?: string) {\n const c = get(conversationId);\n c.members = c.members.filter((m) => m.userId !== (userId ?? me));\n },\n async setStatus(conversationId: string, status: ChatConversation[\"status\"], assigneeId?: string | null) {\n const c = get(conversationId);\n c.conversation.status = status;\n c.conversation.assigneeId = assigneeId ?? null;\n },\n async pin(messageId: string, on = true) {\n log(\"pin\", messageId, on);\n const { c } = findMessage(messageId);\n c.pins = c.pins.filter((p) => p !== messageId);\n if (on) c.pins.push(messageId);\n emit(c.conversation.id, { type: \"conversation\", conversationId: c.conversation.id });\n },\n async pins(conversationId: string) {\n return [...(convs.get(conversationId)?.pins ?? [])];\n },\n async save(messageId: string, on = true, note?: string) {\n log(\"save\", messageId, on, note);\n },\n async report(messageId: string, reason: \"spam\" | \"harassment\" | \"safety\" | \"other\", note?: string) {\n log(\"report\", messageId, reason, note);\n return uuid();\n },\n async upload(conversationId: string, userId: string, file: Blob | ArrayBuffer, opts: { name: string; contentType: string; id?: string }) {\n log(\"upload\", conversationId, opts.name);\n await wait();\n const path = `${conversationId}/${userId}/${opts.id ?? uuid()}-${opts.name}`;\n const blob = file instanceof Blob ? file : new Blob([file], { type: opts.contentType });\n files[path] = typeof URL !== \"undefined\" && typeof URL.createObjectURL === \"function\" ? URL.createObjectURL(blob) : `memory://${path}`;\n return path;\n },\n async fileUrls(paths: string[]) {\n const out: Record<string, string> = {};\n for (const p of paths) if (files[p]) out[p] = files[p]!;\n return out;\n },\n subscribeInbox(_userId: string, onSignal: (s: ChatSignal) => void) {\n inboxListeners.add(onSignal);\n return { unsubscribe: () => void inboxListeners.delete(onSignal) };\n },\n subscribeConversation(\n conversationId: string,\n _me: string,\n handlers: { onSignal: (s: ChatSignal) => void; onActivity?: (a: ChatActivity) => void; onReconnect?: () => void },\n ): ConversationChannel {\n const set = convListeners.get(conversationId) ?? new Set();\n convListeners.set(conversationId, set);\n const entry = { onSignal: handlers.onSignal, onActivity: handlers.onActivity };\n set.add(entry);\n return {\n signal(activity) {\n log(\"signal\", conversationId, activity);\n },\n unsubscribe: () => void set.delete(entry),\n };\n },\n\n receive(conversationId: string, senderId: string, body: string, extra: Partial<ChatMessage> = {}) {\n const c = get(conversationId);\n const m = makeMessage(c, { senderId, body, ...extra } as Partial<ChatMessage>);\n c.messages.push(m);\n emit(conversationId, { type: \"message\", conversationId, id: m.id, seq: m.seq, op: \"insert\" });\n return clone(m);\n },\n activity(conversationId: string, userId: string, activity: ChatActivity[\"activity\"]) {\n for (const l of convListeners.get(conversationId) ?? []) l.onActivity?.({ userId, activity, at: Date.now() });\n },\n failNextSends(count = 1) {\n failing = count;\n },\n holdNextSend() {\n let release!: () => void;\n held = new Promise<void>((r) => (release = r));\n return () => release();\n },\n };\n return client;\n}\n"]}
|