@arbidocs/react 0.5.24 → 0.5.25

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.
Files changed (63) hide show
  1. package/dist/artifacts/index.cjs +9 -9
  2. package/dist/artifacts/index.js +3 -3
  3. package/dist/calls/livekit/index.cjs +48 -48
  4. package/dist/calls/livekit/index.js +3 -3
  5. package/dist/{chunk-4UDIA47U.cjs → chunk-2ERRXEOB.cjs} +15 -15
  6. package/dist/{chunk-4UDIA47U.cjs.map → chunk-2ERRXEOB.cjs.map} +1 -1
  7. package/dist/{chunk-LYGJVSNM.js → chunk-CIWI5UFT.js} +3 -3
  8. package/dist/{chunk-LYGJVSNM.js.map → chunk-CIWI5UFT.js.map} +1 -1
  9. package/dist/{chunk-KRAUMKBG.js → chunk-CMNZI4WQ.js} +5 -3
  10. package/dist/chunk-CMNZI4WQ.js.map +1 -0
  11. package/dist/{chunk-3WIBD44F.js → chunk-I4JYI6GY.js} +7 -4
  12. package/dist/chunk-I4JYI6GY.js.map +1 -0
  13. package/dist/{chunk-5YWIUUUT.cjs → chunk-KC474WVG.cjs} +12 -2
  14. package/dist/chunk-KC474WVG.cjs.map +1 -0
  15. package/dist/{chunk-2HVCNYFH.js → chunk-KOLCL4KV.js} +3 -3
  16. package/dist/{chunk-2HVCNYFH.js.map → chunk-KOLCL4KV.js.map} +1 -1
  17. package/dist/{chunk-I4WI3MNH.js → chunk-L2U4GOKU.js} +4 -4
  18. package/dist/{chunk-I4WI3MNH.js.map → chunk-L2U4GOKU.js.map} +1 -1
  19. package/dist/{chunk-KGCGA452.js → chunk-MB34NKBZ.js} +2 -2
  20. package/dist/{chunk-KGCGA452.js.map → chunk-MB34NKBZ.js.map} +1 -1
  21. package/dist/{chunk-FLAZSNC5.cjs → chunk-NV5G5RR5.cjs} +31 -31
  22. package/dist/{chunk-FLAZSNC5.cjs.map → chunk-NV5G5RR5.cjs.map} +1 -1
  23. package/dist/{chunk-CZP7FF3E.cjs → chunk-ONGNP4JM.cjs} +4 -4
  24. package/dist/{chunk-CZP7FF3E.cjs.map → chunk-ONGNP4JM.cjs.map} +1 -1
  25. package/dist/{chunk-TUKW4MCI.cjs → chunk-OQWNWK74.cjs} +20 -20
  26. package/dist/{chunk-TUKW4MCI.cjs.map → chunk-OQWNWK74.cjs.map} +1 -1
  27. package/dist/{chunk-YBIW7T66.cjs → chunk-TUPSNW3B.cjs} +7 -5
  28. package/dist/chunk-TUPSNW3B.cjs.map +1 -0
  29. package/dist/{chunk-MQ7LZWGP.js → chunk-VHGJG32Q.js} +3 -3
  30. package/dist/{chunk-MQ7LZWGP.js.map → chunk-VHGJG32Q.js.map} +1 -1
  31. package/dist/{chunk-NA3FJX37.js → chunk-Y3MTRA7D.js} +11 -3
  32. package/dist/chunk-Y3MTRA7D.js.map +1 -0
  33. package/dist/{chunk-QQ7SCJRY.cjs → chunk-YIUUTRMQ.cjs} +2 -2
  34. package/dist/{chunk-QQ7SCJRY.cjs.map → chunk-YIUUTRMQ.cjs.map} +1 -1
  35. package/dist/{chunk-7NHOKV7N.cjs → chunk-YMAZYYD5.cjs} +7 -3
  36. package/dist/chunk-YMAZYYD5.cjs.map +1 -0
  37. package/dist/document-tools/index.cjs +43 -43
  38. package/dist/document-tools/index.js +6 -6
  39. package/dist/index.cjs +959 -951
  40. package/dist/{index.d-BO71E6NO.d.cts → index.d-BLw5AN0H.d.cts} +2 -2
  41. package/dist/{index.d-BO71E6NO.d.ts → index.d-BLw5AN0H.d.ts} +2 -2
  42. package/dist/{index.d-DscWCwr2.d.cts → index.d-DklHLjcu.d.cts} +32 -3
  43. package/dist/{index.d-DscWCwr2.d.ts → index.d-DklHLjcu.d.ts} +32 -3
  44. package/dist/index.d.cts +10 -5
  45. package/dist/index.d.ts +10 -5
  46. package/dist/index.js +17 -17
  47. package/dist/shell/index.cjs +34 -34
  48. package/dist/shell/index.d.cts +1 -1
  49. package/dist/shell/index.d.ts +1 -1
  50. package/dist/shell/index.js +3 -3
  51. package/dist/ui/index.cjs +167 -159
  52. package/dist/ui/index.d.cts +1 -1
  53. package/dist/ui/index.d.ts +1 -1
  54. package/dist/ui/index.js +3 -3
  55. package/dist/viewers/index.cjs +2 -2
  56. package/dist/viewers/index.js +1 -1
  57. package/package.json +3 -3
  58. package/dist/chunk-3WIBD44F.js.map +0 -1
  59. package/dist/chunk-5YWIUUUT.cjs.map +0 -1
  60. package/dist/chunk-7NHOKV7N.cjs.map +0 -1
  61. package/dist/chunk-KRAUMKBG.js.map +0 -1
  62. package/dist/chunk-NA3FJX37.js.map +0 -1
  63. package/dist/chunk-YBIW7T66.cjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/documents/document-fields.ts","../src/ui/tooltip.tsx","../src/entities/EntityPill.tsx","../src/icons/colors.ts","../src/icons/AudIcon.tsx","../src/icons/DocIcon.tsx","../src/icons/EmlIcon.tsx","../src/icons/HtmlIcon.tsx","../src/icons/ImgIcon.tsx","../src/icons/PdfIcon.tsx","../src/icons/TxtIcon.tsx","../src/icons/VidIcon.tsx","../src/icons/XlsIcon.tsx","../src/entities/DocumentEntity.tsx","../src/ui/checkbox.tsx","../src/documents/DocumentCard.tsx","../src/ui/badge.tsx","../src/entities/tag-types.ts","../src/entities/TagEntity.tsx","../src/documents/media-error.ts","../src/documents/chunked-recorder.ts","../src/documents/useAudioRecorder.ts","../src/documents/format-elapsed.ts","../src/documents/MicWaveformIndicator.tsx","../src/documents/MicRecordingOverlay.tsx","../src/ui/IconToggle.tsx","../src/documents/InlineMicButton.tsx","../src/entities/registry.tsx","../src/ui/select.tsx","../src/ui/VisibilityToggle.tsx","../src/ui/VerifiedToggle.tsx","../src/lib/format-friendly-date.ts","../src/lib/markdown-to-text.ts","../src/ui/DictateContext.tsx","../src/ui/input.tsx","../src/ui/textarea.tsx","../src/ui/DebouncedInput.tsx","../src/ui/hover-card.tsx","../src/ui/card.tsx","../src/ui/label.tsx","../src/ui/separator.tsx","../src/ui/collapsible.tsx","../src/ui/progress.tsx","../src/ui/radio-group.tsx","../src/ui/switch.tsx","../src/ui/tabs.tsx","../src/ui/table.tsx","../src/ui/slider.tsx","../src/ui/toggle.tsx","../src/ui/toggle-group.tsx","../src/ui/popover.tsx","../src/ui/mark-menu.tsx","../src/ui/command.tsx","../src/ai/AiMarkdown.tsx","../src/ai/PassageCard.tsx","../src/icons/file-type.ts","../src/icons/GoogleIcon.tsx","../src/icons/OpenAIIcon.tsx","../src/icons/ClaudeIcon.tsx","../src/icons/GeminiIcon.tsx","../src/icons/FireworksIcon.tsx","../src/icons/ProviderIcon.tsx","../src/icons/arbi-mark.ts","../src/icons/ArbiIcon.tsx","../src/icons/ArbiBotHeadIcon.tsx","../src/entities/ThreadVisibilityIcon.tsx","../src/entities/tag-kinds.ts","../src/entities/ProjectEntity.tsx","../src/entities/VerifiedBadge.tsx","../src/entities/UserEntity.tsx","../src/entities/AgentMarkers.tsx","../src/entities/status.tsx","../src/entities/colors.ts","../src/entities/ShieldIcon.tsx","../src/entities/agent-avatar-colors.ts","../src/entities/media-type.ts","../src/entities/file-type.ts","../src/usermenu/UserMenu.tsx"],"names":["document","forwardRef","EntityPill","sizeClasses","Fragment","jsx","jsxs","React3","IMAGE_EXTENSIONS","VIDEO_EXTENSIONS","AUDIO_EXTENSIONS","EMAIL_EXTENSIONS","React","Icon","useRef","useState","useCallback","useEffect","mt","createPortal","FolderOpen","Eye","Hash","StickyNote","Search","NotebookPen","React6","Check","useMemo","COLORS","React7","React8","React9","cva","React10","Label","React11","Separator","React12","CollapsibleTrigger","CollapsibleContent","React13","React14","React15","React16","React17","React18","React19","React20","React21","useId","React22","CommandPrimitive","DOCX_EXTENSIONS","XLSX_EXTENSIONS","HTML_EXTENSIONS","TEXT_EXTENSIONS","MessageSquareLock","CreditCard","UserEntity","isAgent","Badge","NEUTRAL_GRAY","BASE_COLORS","getEntityColor","ChevronDown","LogOut"],"mappings":"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","file":"chunk-3WIBD44F.js","sourcesContent":["/**\n * A document's fields as the lists show them: the metadata the pipeline extracts (date, type,\n * author, abstract), whether it can join a conversation, and its folder path in canonical form\n * (the form folder filters and the explorer navigate by).\n */\n\n/** What these read of a document (a workspace document has them all). */\ninterface Doc {\n status?: string | null\n doc_metadata?: {\n doc_date?: string | null\n doc_nature?: string | null\n doc_author?: string | null\n doc_subject?: string | null\n } | null\n}\n\n/**\n * Statuses for which a document carries usable content and can be attached to a\n * conversation. A document with no status yet is treated as addable (optimistic).\n * Terminal-but-unusable states ('failed', 'skipped') and in-progress states\n * ('processing', 'queued') are NOT addable.\n */\nconst ADDABLE_STATUSES = new Set(['completed', 'empty', 'low-content'])\n\n/**\n * Whether a document can be added to a conversation. This is the single source\n * of truth shared by the add flow (`useAddToConversation`) and any UI that\n * counts/enables an \"Add\" affordance — so a badge never advertises a document\n * that the add flow will silently refuse (e.g. a 'skipped' document).\n */\nexport const isDocumentAddableToConversation = (document: Doc | null | undefined): boolean => {\n if (!document) return false\n if (!document.status) return true\n return ADDABLE_STATUSES.has(document.status.toLowerCase())\n}\n\n/**\n * Gets the date of a document from doc_metadata.\n * @param document Document to get date from\n * @returns Document date string or undefined\n */\nexport const getDocumentDate = (document: Doc | null | undefined): string | null | undefined => {\n if (!document) return undefined\n return document.doc_metadata?.doc_date\n}\n\n/**\n * Format a doc_date for display. Date-only values (\"YYYY-MM-DD\") are shown as-is;\n * full datetimes (e.g. emails, \"...T14:30:00Z\") are shown as \"YYYY-MM-DD HH:MM\"\n * in local time. Invalid/empty values return an empty string.\n */\nexport const formatDocDate = (value?: string | null): string => {\n if (!value) return ''\n if (value.includes('T')) {\n const d = new Date(value)\n if (!Number.isNaN(d.getTime())) {\n const pad = (n: number) => String(n).padStart(2, '0')\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}`\n }\n }\n return value\n}\n\n/**\n * Gets the document nature (type) from doc_metadata.\n * @param document Document to get nature from\n * @returns Document nature (e.g., email, contract, memorandum) or undefined\n */\nexport const getDocumentNature = (document: Doc | null | undefined): string | null | undefined => {\n if (!document) return undefined\n return document.doc_metadata?.doc_nature\n}\n\n/**\n * Gets the document author from doc_metadata.\n * @param document Document to get author from\n * @returns Document author or undefined\n */\nexport const getDocumentAuthor = (document: Doc | null | undefined): string | null | undefined => {\n if (!document) return undefined\n return document.doc_metadata?.doc_author\n}\n\n/**\n * Gets the document subject from doc_metadata.\n * @param document Document to get subject from\n * @returns Document subject or undefined\n */\nexport const getDocumentSubject = (document: Doc | null | undefined): string | null | undefined => {\n if (!document) return undefined\n return document.doc_metadata?.doc_subject\n}\n\n/**\n * Default metadata tags that are automatically applied to all documents during indexing.\n * These are generated by AI during document processing and cannot be disabled.\n * Keep in sync with backend DocTagLLMConfig.DEFAULT_METADATA_TAGS\n */\nexport const DEFAULT_METADATA_TAGS = [\n { name: 'doc_date', label: 'Date' },\n { name: 'doc_nature', label: 'Type' },\n { name: 'doc_author', label: 'Author' },\n { name: 'doc_subject', label: 'Abstract' },\n] as const\n\n/**\n * Canonicalizes a `Doc.folder` path: trims each segment and drops empty ones,\n * returning null for a blank path. Drive-synced folders use provider names\n * verbatim, which can carry stray whitespace (\"Google Drive (u)/Reports \");\n * the explorer navigates via trimmed segments, so folder filter IDs and\n * navigation keys must agree on this canonical form.\n */\nexport const canonicalFolderPath = (folder: string | null | undefined): string | null => {\n if (!folder) return null\n const segments = folder\n .split('/')\n .map((segment) => segment.trim())\n .filter(Boolean)\n return segments.length > 0 ? segments.join('/') : null\n}\n\n/** One row of a folder picker: the folder itself plus every ancestor above it. */\nexport interface FolderTreeNode {\n /** Canonical path — the same form folder filter IDs are built from. */\n path: string\n /** Last segment, for display. */\n label: string\n /** How far down the tree, for indentation. */\n depth: number\n /** Documents at or below this folder. */\n count: number\n}\n\n/**\n * Builds the folder rows a picker shows, from the documents themselves.\n *\n * Every path here is canonical, and that is the point: a folder filter ID is\n * `folder:${canonicalFolderPath(doc.folder)}`, and an ID outside that set is\n * dropped as invalid — so a picker that emitted the raw path (\" Reports / Q1 \",\n * or \"/Inbox\" with its phantom blank root) would send the view back to \"All\"\n * instead of into the folder the user clicked.\n */\nexport const buildFolderTree = (\n docs: { folder?: string | null }[]\n): { nodes: FolderTreeNode[]; unfiledCount: number } => {\n const counts = new Map<string, number>()\n let unfiledCount = 0\n\n for (const doc of docs) {\n const folder = canonicalFolderPath(doc.folder)\n if (!folder) {\n unfiledCount++\n continue\n }\n const parts = folder.split('/')\n for (let i = 1; i <= parts.length; i++) {\n const path = parts.slice(0, i).join('/')\n counts.set(path, (counts.get(path) ?? 0) + 1)\n }\n }\n\n const nodes = [...counts.keys()]\n .sort((a, b) => a.localeCompare(b))\n .map((path) => ({\n path,\n label: path.split('/').pop() ?? path,\n depth: path.split('/').length - 1,\n count: counts.get(path) ?? 0,\n }))\n\n return { nodes, unfiledCount }\n}\n\n/**\n * Formats a folder path for display: \"Reports/Q1/January\" → \"../../January\"\n * Shows depth via `../` prefixes and only the last segment name.\n * @param path Folder path string (slash-separated)\n * @returns Formatted display label\n */\nexport const formatFolderLabel = (path: string | null | undefined): string => {\n if (!path) return ''\n const parts = path.split('/')\n const name = parts[parts.length - 1] || path\n const depth = parts.length - 1\n if (depth === 0) return name\n return '../'.repeat(depth) + name\n}\n\n/**\n * Fallback labels for standard document columns when grid isn't ready yet.\n * These match the headerName values in createDocumentColumns.tsx.\n */\nexport const COLUMN_LABEL_FALLBACKS: Record<string, string> = {\n title: 'Document Name',\n doc_nature: 'Type',\n doc_author: 'Author',\n doc_subject: 'Abstract',\n doc_date: 'Date',\n n_pages: 'Pages',\n created_at: 'Uploaded',\n updated_at: 'Last modified',\n file_name: 'File name',\n file_size: 'Size',\n file_type: 'File type',\n shared: 'Shared',\n inConversation: 'In chat',\n created_by: 'By',\n sender: 'From',\n all_tags: 'Labels',\n doc_id: 'DocID',\n related: 'Related',\n}\n","import * as React from 'react'\nimport { createPortal } from 'react-dom'\n\nimport { cn } from '../lib/utils'\n\n/**\n * Minimal, dependency-free tooltip — a drop-in API replacement for a Radix\n * wrapper (same exports/props: Tooltip, TooltipTrigger, TooltipContent,\n * TooltipProvider). Promoted verbatim from the ARBI app.\n *\n * It attaches the trigger via a STABLE `useCallback` ref (never setStates,\n * identity never changes), so React 19 never detach/attach-thrashes.\n */\n\ntype Side = 'top' | 'bottom' | 'left' | 'right'\n\ninterface TooltipContextValue {\n open: boolean\n show: () => void\n hide: () => void\n setTrigger: (el: HTMLElement | null) => void\n /** A pointer click dismisses the tip and keeps it away until the pointer leaves. */\n suppress: () => void\n release: () => void\n triggerRef: React.MutableRefObject<HTMLElement | null>\n contentId: string\n}\n\nconst TooltipContext = React.createContext<TooltipContextValue | null>(null)\n\n/** App-wide tooltip defaults, set once by `TooltipProvider`. */\nconst DEFAULT_DELAY = 300\nconst TooltipConfigContext = React.createContext<{ delayDuration: number }>({\n delayDuration: DEFAULT_DELAY,\n})\n\ninterface TooltipProviderProps {\n children?: React.ReactNode\n /** Hover delay, in ms, inherited by every Tooltip below. Default 300. */\n delayDuration?: number\n skipDelayDuration?: number\n disableHoverableContent?: boolean\n}\n\n/**\n * Sets tooltip defaults for the whole tree. Mount it once, at the app root —\n * `AppShell` in @arbidocs/blocks does this so every app gets it for free.\n * Tooltips still render without it, at the default delay.\n */\nconst TooltipProvider = ({ children, delayDuration = DEFAULT_DELAY }: TooltipProviderProps) => {\n const value = React.useMemo(() => ({ delayDuration }), [delayDuration])\n return <TooltipConfigContext.Provider value={value}>{children}</TooltipConfigContext.Provider>\n}\n\ninterface TooltipProps {\n children: React.ReactNode\n /** Overrides the provider's delay for this one tooltip. */\n delayDuration?: number\n}\n\nfunction Tooltip({ children, delayDuration }: TooltipProps) {\n const config = React.useContext(TooltipConfigContext)\n const delay = delayDuration ?? config.delayDuration\n const [open, setOpen] = React.useState(false)\n const triggerRef = React.useRef<HTMLElement | null>(null)\n const timer = React.useRef<ReturnType<typeof setTimeout> | null>(null)\n const contentId = React.useId()\n\n const clearTimer = () => {\n if (timer.current) {\n clearTimeout(timer.current)\n timer.current = null\n }\n }\n\n const suppressed = React.useRef(false)\n\n const show = React.useCallback(() => {\n clearTimer()\n if (suppressed.current) return\n timer.current = setTimeout(() => setOpen(true), delay)\n }, [delay])\n\n const hide = React.useCallback(() => {\n clearTimer()\n setOpen(false)\n }, [])\n\n const suppress = React.useCallback(() => {\n suppressed.current = true\n clearTimer()\n setOpen(false)\n }, [])\n\n const release = React.useCallback(() => {\n suppressed.current = false\n }, [])\n\n const setTrigger = React.useCallback((el: HTMLElement | null) => {\n triggerRef.current = el\n }, [])\n\n React.useEffect(() => () => clearTimer(), [])\n\n const value = React.useMemo<TooltipContextValue>(\n () => ({ open, show, hide, suppress, release, setTrigger, triggerRef, contentId }),\n [open, show, hide, suppress, release, setTrigger, contentId]\n )\n\n return <TooltipContext.Provider value={value}>{children}</TooltipContext.Provider>\n}\n\n/**\n * Keyboard focus only: a tap focuses the control without `:focus-visible`, and a tooltip opened by\n * that tap would stay stuck on screen (touch has no pointer-leave). Falls back to true where the\n * selector is unsupported.\n */\nfunction isKeyboardFocus(target: EventTarget): boolean {\n try {\n return (target as Element).matches(':focus-visible')\n } catch {\n return true\n }\n}\n\n/**\n * True when the control already shows its own words (a labelled button): repeating them in a\n * tooltip is noise. Text hidden with `sr-only` and bare counts (\"12\", \"999+\") do not count.\n */\nfunction showsOwnText(el: Element | null): boolean {\n if (!el) return false\n const walker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT)\n let visible = ''\n for (let node = walker.nextNode(); node; node = walker.nextNode()) {\n if (node.parentElement?.closest('.sr-only')) continue\n visible += node.textContent ?? ''\n }\n return /\\p{L}{2,}/u.test(visible)\n}\n\ninterface TooltipTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n asChild?: boolean\n /** Allow explanatory tooltips on controls that already have a visible label. */\n showWithText?: boolean\n}\n\nfunction TooltipTrigger({\n asChild,\n showWithText = false,\n children,\n ...props\n}: TooltipTriggerProps) {\n const ctx = React.useContext(TooltipContext)\n if (!ctx) return <>{children}</>\n\n const triggerHandlers = {\n onPointerEnter: (e: React.PointerEvent) => {\n ;(props.onPointerEnter as ((e: React.PointerEvent) => void) | undefined)?.(e)\n // Touch has no hover: the tap itself is the action, and nothing would ever close the tip.\n if (e.pointerType === 'touch') return\n if (!showWithText && showsOwnText(e.currentTarget)) return\n ctx.show()\n },\n onPointerLeave: (e: React.PointerEvent) => {\n ;(props.onPointerLeave as ((e: React.PointerEvent) => void) | undefined)?.(e)\n ctx.release()\n ctx.hide()\n },\n onPointerDown: (e: React.PointerEvent) => {\n ;(props.onPointerDown as ((e: React.PointerEvent) => void) | undefined)?.(e)\n ;(asChild && React.isValidElement(children)\n ? ((children.props as Record<string, unknown>).onPointerDown as\n ((e: React.PointerEvent) => void) | undefined)\n : undefined)?.(e)\n ctx.suppress()\n },\n onFocus: (e: React.FocusEvent) => {\n ;(props.onFocus as ((e: React.FocusEvent) => void) | undefined)?.(e)\n if (isKeyboardFocus(e.target) && (showWithText || !showsOwnText(e.currentTarget))) ctx.show()\n },\n onBlur: (e: React.FocusEvent) => {\n ;(props.onBlur as ((e: React.FocusEvent) => void) | undefined)?.(e)\n ctx.hide()\n },\n 'aria-describedby': ctx.open ? ctx.contentId : undefined,\n 'data-state': ctx.open ? 'open' : 'closed',\n }\n\n if (asChild && React.isValidElement(children)) {\n const child = children as React.ReactElement<Record<string, unknown>>\n return React.cloneElement(child, {\n ...props,\n ...triggerHandlers,\n ref: ctx.setTrigger,\n })\n }\n\n return (\n <button\n type=\"button\"\n {...props}\n {...triggerHandlers}\n ref={ctx.setTrigger as unknown as React.Ref<HTMLButtonElement>}\n >\n {children}\n </button>\n )\n}\n\ninterface TooltipContentProps extends React.HTMLAttributes<HTMLDivElement> {\n side?: Side\n sideOffset?: number\n /** Minimum gap, in px, kept between the tip and the viewport edges. Default 8. */\n collisionPadding?: number\n}\n\nconst TRANSFORM_BY_SIDE: Record<Side, string> = {\n top: 'translate(-50%, -100%)',\n bottom: 'translate(-50%, 0)',\n left: 'translate(-100%, -50%)',\n right: 'translate(0, -50%)',\n}\n\nconst TooltipContent = React.forwardRef<HTMLDivElement, TooltipContentProps>(\n ({ className, side = 'top', sideOffset = 4, collisionPadding = 8, style, ...props }, ref) => {\n const ctx = React.useContext(TooltipContext)\n const innerRef = React.useRef<HTMLDivElement | null>(null)\n const [coords, setCoords] = React.useState<{\n top: number\n left: number\n transform: string\n } | null>(null)\n\n React.useLayoutEffect(() => {\n if (!ctx?.open || !ctx.triggerRef.current) {\n setCoords(null)\n return\n }\n const r = ctx.triggerRef.current.getBoundingClientRect()\n const c = innerRef.current?.getBoundingClientRect()\n const ch = c?.height ?? 0\n const cw = c?.width ?? 0\n const vh = window.innerHeight\n const vw = window.innerWidth\n\n let s: Side = side\n if (s === 'top' && r.top - sideOffset - ch < 0) s = 'bottom'\n else if (s === 'bottom' && r.bottom + sideOffset + ch > vh) s = 'top'\n else if (s === 'left' && r.left - sideOffset - cw < 0) s = 'right'\n else if (s === 'right' && r.right + sideOffset + cw > vw) s = 'left'\n\n // Keep the whole tip inside the viewport (8px padding): the anchor point is the centre of\n // the cross axis, so clamp it by half the tip's size.\n const PAD = collisionPadding\n const clamp = (value: number, half: number, max: number) =>\n Math.min(Math.max(value, PAD + half), Math.max(PAD + half, max - PAD - half))\n const rawTop =\n s === 'top'\n ? r.top - sideOffset\n : s === 'bottom'\n ? r.bottom + sideOffset\n : r.top + r.height / 2\n const rawLeft =\n s === 'left'\n ? r.left - sideOffset\n : s === 'right'\n ? r.right + sideOffset\n : r.left + r.width / 2\n setCoords({\n top: s === 'left' || s === 'right' ? clamp(rawTop, ch / 2, vh) : rawTop,\n left: s === 'top' || s === 'bottom' ? clamp(rawLeft, cw / 2, vw) : rawLeft,\n transform: TRANSFORM_BY_SIDE[s],\n })\n }, [ctx?.open, side, sideOffset, collisionPadding, ctx?.triggerRef])\n\n if (!ctx?.open) return null\n\n const setRefs = (node: HTMLDivElement | null) => {\n innerRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) (ref as React.MutableRefObject<HTMLDivElement | null>).current = node\n }\n\n return createPortal(\n <div\n ref={setRefs}\n id={ctx.contentId}\n role=\"tooltip\"\n className={cn(\n // The kit owns the tooltip's look: semantic tokens only, so it is\n // legible in every app without one of them defining a global class.\n // The `tooltip-content` hook is kept last-but-one so a host stylesheet\n // can still restyle every tooltip in one place (the ARBI app does, with\n // `!important` rules that win over these defaults).\n 'pointer-events-none w-max max-w-[300px] break-words rounded-md border border-border bg-popover px-3 py-2 text-sm font-normal text-popover-foreground shadow-lg',\n 'tooltip-content',\n className\n )}\n style={{\n position: 'fixed',\n top: coords?.top ?? -9999,\n left: coords?.left ?? -9999,\n transform: coords?.transform ?? TRANSFORM_BY_SIDE[side],\n opacity: coords ? undefined : 0,\n zIndex: 9999,\n ...style,\n }}\n {...props}\n />,\n document.body\n )\n }\n)\nTooltipContent.displayName = 'TooltipContent'\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n","/**\n * EntityPill Component\n *\n * Base component for pill-style entity displays. Provides consistent styling and\n * interaction patterns. At rest it is plain icon + text (no fill, no border); the\n * fill appears on hover, so a row of entities does not read as a row of buttons. Promoted verbatim from the ARBI app (import paths only\n * changed to resolve within the SDK).\n *\n * Pattern: [Icon] [Label] [Optional: secondary text] [MoreVertical when interactive]\n */\n\nimport React, { forwardRef } from 'react'\nimport { MoreVertical } from 'lucide-react'\nimport { cn } from '../lib/utils'\nimport { Tooltip, TooltipContent, TooltipTrigger } from '../ui/tooltip'\n\ninterface EntityPillProps {\n /** The icon element (Avatar, ShieldIcon, FileIcon, etc.) */\n icon: React.ReactNode\n /** Primary label text */\n label: string\n /** Optional secondary text (e.g., page notation \"p.1\") */\n secondaryText?: React.ReactNode\n\n // Styling\n /** Size variant: 'sm' for compact, 'base' for tab headers */\n size?: 'sm' | 'base'\n /** Shape variant: 'pill' for rounded-full, 'rounded' for rounded-md */\n shape?: 'pill' | 'rounded'\n /** Additional CSS classes */\n className?: string\n /** Max width for label truncation */\n labelMaxWidth?: string\n /** Extra classes on the label text (e.g. a heavier weight on a card face). */\n labelClassName?: string\n /** When true, the pill fills its container width (`flex w-full`) and the main\n * area flexes + truncates so the trailing control (⋯ menu) pins to the right\n * edge — used by the documents table's Document column. Default: shrink-to-fit. */\n fullWidth?: boolean\n /** When true, render the pill with the active/\"viewing\" highlight — a solid\n * dark-navy background with light text, applied LAST so it wins over both the\n * default background and the interactive hover. */\n highlight?: boolean\n\n // Behavior\n /** Click handler for main area (icon + label) - primary action */\n onClick?: (e: React.MouseEvent) => void\n /** Click handler for icon only — when set, only the icon is clickable (not the label) */\n onIconClick?: (e: React.MouseEvent) => void\n /** Click handler for MoreVertical - opens popover/menu. When provided, shows MoreVertical icon */\n onMoreClick?: (e: React.MouseEvent) => void\n /** Custom trailing element (e.g. a ⋯ dropdown menu). Rendered in the same\n * trailing zone as MoreVertical, but as-is — so it stays outside the pill's\n * primary click area. Takes precedence over `onMoreClick`. */\n moreContent?: React.ReactNode\n /** Link URL - makes the main area an anchor tag */\n href?: string\n /** Whether the pill is disabled */\n disabled?: boolean\n\n // Tooltip\n /** Tooltip for main area (describes primary action, e.g., \"View document\") */\n tooltipContent?: React.ReactNode\n /** Tooltip side placement */\n tooltipSide?: 'top' | 'bottom' | 'left' | 'right'\n\n /** Test ID for testing */\n 'data-testid'?: string\n}\n\nexport const EntityPill = forwardRef<HTMLElement, EntityPillProps>(function EntityPill(\n {\n icon,\n label,\n secondaryText,\n size = 'sm',\n shape = 'rounded',\n className,\n labelMaxWidth = 'max-w-[320px]',\n labelClassName,\n fullWidth = false,\n highlight = false,\n onClick,\n onIconClick,\n onMoreClick,\n moreContent,\n href,\n disabled = false,\n tooltipContent,\n tooltipSide = 'bottom',\n 'data-testid': testId,\n },\n ref\n) {\n const shapeClass = shape === 'pill' ? 'rounded-full' : 'rounded-md'\n\n // Size-based classes\n const sizeClasses = size === 'base' ? 'gap-1.5 px-1.5 py-0.5' : 'gap-1 px-1'\n const textSizeClass = size === 'base' ? 'text-base' : 'text-sm'\n\n const baseClasses = cn(\n 'group/pill items-center',\n fullWidth ? 'flex w-full' : 'inline-flex',\n sizeClasses,\n shapeClass,\n 'border border-transparent',\n 'transition-colors',\n className\n )\n\n // Coarse pointers: an invisible 44px-tall hit area (the pill itself stays compact).\n const interactiveClasses =\n \"relative cursor-pointer hover:bg-muted pointer-coarse:after:absolute pointer-coarse:after:inset-x-0 pointer-coarse:after:-inset-y-3 pointer-coarse:after:content-['']\"\n const disabledClasses = 'cursor-default opacity-60'\n const highlightClasses =\n 'bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground'\n\n // Main content (icon + label + secondary text)\n const mainContent = (\n <>\n {onIconClick ? (\n <span\n role=\"button\"\n tabIndex={0}\n className=\"flex-shrink-0 cursor-pointer hover:opacity-70 transition-opacity\"\n onClick={(e) => {\n e.stopPropagation()\n onIconClick(e)\n }}\n >\n {icon}\n </span>\n ) : (\n icon\n )}\n <span\n className={cn(\n textSizeClass,\n 'font-medium truncate leading-tight min-w-0',\n labelMaxWidth,\n labelClassName\n )}\n >\n {label}\n </span>\n {secondaryText && (\n <span className=\"text-xs text-muted-foreground flex-shrink-0 leading-none\">\n {secondaryText}\n </span>\n )}\n </>\n )\n\n // Helper: wrap any content in a Tooltip (no asChild — TooltipTrigger renders its own button)\n const tooltipWrap = (\n content: React.ReactNode,\n tip: React.ReactNode,\n side: 'top' | 'bottom' | 'left' | 'right' = tooltipSide,\n triggerClassName?: string,\n triggerProps?: Record<string, unknown>\n ) => (\n <Tooltip>\n <TooltipTrigger\n onFocusCapture={(e) => e.stopPropagation()}\n className={triggerClassName}\n {...triggerProps}\n >\n {content}\n </TooltipTrigger>\n <TooltipContent side={side} className=\"p-2\">\n {tip}\n </TooltipContent>\n </Tooltip>\n )\n\n // With a separate \"more\" control the touch hit area must grow on the MAIN area only: an overlay on\n // the whole pill would sit above both inner buttons and swallow their taps.\n const mainAreaClass = cn('inline-flex items-center gap-1', fullWidth && 'min-w-0 flex-1')\n const mainAreaTouchClass = cn(\n mainAreaClass,\n (onClick || href) &&\n !disabled &&\n \"relative pointer-coarse:after:absolute pointer-coarse:after:inset-x-0 pointer-coarse:after:-inset-y-3 pointer-coarse:after:content-['']\"\n )\n\n if (onMoreClick || moreContent) {\n let mainArea: React.ReactNode\n if (tooltipContent) {\n mainArea = tooltipWrap(\n mainContent,\n tooltipContent,\n tooltipSide,\n cn(mainAreaTouchClass, disabled && 'opacity-60'),\n {\n type: 'button',\n onClick: href ? onClick : disabled ? undefined : onClick,\n disabled: disabled || undefined,\n }\n )\n } else if (href) {\n mainArea = (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={mainAreaTouchClass}\n onClick={onClick}\n >\n {mainContent}\n </a>\n )\n } else if (onClick) {\n mainArea = (\n <button\n type=\"button\"\n onClick={disabled ? undefined : onClick}\n disabled={disabled}\n className={cn(\n \"relative inline-flex items-center gap-1 pointer-coarse:after:absolute pointer-coarse:after:inset-x-0 pointer-coarse:after:-inset-y-3 pointer-coarse:after:content-['']\",\n disabled && 'opacity-60'\n )}\n >\n {mainContent}\n </button>\n )\n } else {\n mainArea = <span className={mainAreaTouchClass}>{mainContent}</span>\n }\n\n const moreArea = moreContent ? (\n <span className=\"flex-shrink-0 leading-none\">{moreContent}</span>\n ) : (\n tooltipWrap(\n <MoreVertical className=\"w-3.5 h-3.5\" />,\n 'Click for more',\n tooltipSide,\n 'flex-shrink-0 leading-none text-muted-foreground hover:text-foreground',\n {\n type: 'button',\n onClick: (e: React.MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation()\n onMoreClick?.(e)\n },\n }\n )\n )\n\n return (\n <span\n ref={ref as React.Ref<HTMLSpanElement>}\n className={cn(\n baseClasses,\n (onClick || href) && !disabled && 'cursor-pointer hover:bg-muted',\n highlight && highlightClasses\n )}\n data-testid={testId}\n >\n {mainArea}\n {moreArea}\n </span>\n )\n }\n\n if (tooltipContent) {\n if (href) {\n return tooltipWrap(\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={mainAreaClass}\n onClick={onClick}\n >\n {mainContent}\n </a>,\n tooltipContent,\n tooltipSide,\n cn(baseClasses, interactiveClasses),\n { 'data-testid': testId }\n )\n }\n\n return tooltipWrap(\n mainContent,\n tooltipContent,\n tooltipSide,\n cn(\n baseClasses,\n onClick && !disabled ? interactiveClasses : '',\n disabled ? disabledClasses : '',\n highlight && highlightClasses\n ),\n {\n type: 'button',\n ref: ref as React.Ref<HTMLButtonElement>,\n onClick: onClick && !disabled ? onClick : undefined,\n disabled: disabled || undefined,\n 'data-testid': testId,\n }\n )\n }\n\n if (href) {\n return (\n <a\n ref={ref as React.Ref<HTMLAnchorElement>}\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(baseClasses, interactiveClasses)}\n data-testid={testId}\n onClick={onClick}\n >\n {mainContent}\n </a>\n )\n }\n\n if (onClick) {\n return (\n <button\n ref={ref as React.Ref<HTMLButtonElement>}\n type=\"button\"\n onClick={disabled ? undefined : onClick}\n disabled={disabled}\n className={cn(\n baseClasses,\n disabled ? disabledClasses : interactiveClasses,\n highlight && highlightClasses\n )}\n data-testid={testId}\n >\n {mainContent}\n </button>\n )\n }\n\n return (\n <span\n ref={ref as React.Ref<HTMLSpanElement>}\n className={cn(baseClasses, highlight && highlightClasses)}\n data-testid={testId}\n >\n {mainContent}\n </span>\n )\n})\n","/**\n * File-type icon colors — the subset of the app's FILE_TYPE_COLORS used by the\n * promoted file-type icons. Kept self-contained so the SDK icons render with the\n * same palette as the ARBI app without depending on the app's style constants.\n */\n\nconst NEUTRAL_GRAY = '#64748b' // slate-500\n\nexport const FILE_TYPE_COLORS = {\n pdf: '#ef4444', // red\n doc: '#3b82f6', // blue (Word docs)\n docx: '#3b82f6', // blue\n html: '#0284c7', // sky-600 (web files)\n img: '#8b5cf6', // violet-500 (images)\n vid: '#10b981', // emerald-500 (video)\n aud: '#f59e0b', // amber-500 (audio)\n xls: '#16a34a', // green-600 (Excel)\n eml: '#0d9488', // teal-600 (email)\n txt: NEUTRAL_GRAY, // gray (plain text)\n generic: NEUTRAL_GRAY, // gray (unknown)\n white: '#ffffff', // for strokes/text on colored backgrounds\n}\n","/** Audio file icon (amber). Promoted from the ARBI app for SDK reuse. */\n\nimport React from 'react'\nimport { FILE_TYPE_COLORS } from './colors'\n\ninterface IconProps {\n size?: number\n className?: string\n}\n\nexport const AudIcon: React.FC<IconProps> = ({ size = 16, className = '' }) => {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path\n d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8l-6-6z\"\n fill={FILE_TYPE_COLORS.aud}\n stroke={FILE_TYPE_COLORS.aud}\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M14 2v6h6\"\n fill=\"none\"\n stroke={FILE_TYPE_COLORS.white}\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <text\n x=\"12\"\n y=\"16\"\n fontSize=\"6\"\n fill=\"white\"\n textAnchor=\"middle\"\n fontWeight=\"bold\"\n fontFamily=\"Arial, sans-serif\"\n >\n AUD\n </text>\n </svg>\n )\n}\n","/**\n * DOC Icon Component. Promoted from the ARBI app for SDK reuse.\n * For Word documents (.doc, .docx files) with blue styling.\n */\n\nimport React from 'react'\nimport { FILE_TYPE_COLORS } from './colors'\n\ninterface DocIconProps {\n size?: number\n className?: string\n}\n\nexport const DocIcon: React.FC<DocIconProps> = ({ size = 16, className = '' }) => {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path\n d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8l-6-6z\"\n fill={FILE_TYPE_COLORS.doc}\n stroke={FILE_TYPE_COLORS.doc}\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M14 2v6h6\"\n fill=\"none\"\n stroke={FILE_TYPE_COLORS.white}\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <text\n x=\"12\"\n y=\"16\"\n fontSize=\"6\"\n fill=\"white\"\n textAnchor=\"middle\"\n fontWeight=\"bold\"\n fontFamily=\"Arial, sans-serif\"\n >\n DOC\n </text>\n </svg>\n )\n}\n","/** Email file icon (teal). Promoted from the ARBI app for SDK reuse. */\n\nimport React from 'react'\nimport { FILE_TYPE_COLORS } from './colors'\n\ninterface IconProps {\n size?: number\n className?: string\n}\n\nexport const EmlIcon: React.FC<IconProps> = ({ size = 16, className = '' }) => {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path\n d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8l-6-6z\"\n fill={FILE_TYPE_COLORS.eml}\n stroke={FILE_TYPE_COLORS.eml}\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M14 2v6h6\"\n fill=\"none\"\n stroke={FILE_TYPE_COLORS.white}\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <rect\n x=\"7\"\n y=\"12\"\n width=\"10\"\n height=\"7\"\n rx=\"1\"\n fill=\"none\"\n stroke=\"white\"\n strokeWidth=\"1.2\"\n />\n <path d=\"M7 13l5 3 5-3\" fill=\"none\" stroke=\"white\" strokeWidth=\"1.2\" strokeLinejoin=\"round\" />\n </svg>\n )\n}\n","/**\n * HTML Icon Component. Promoted from the ARBI app for SDK reuse.\n * A proper HTML file icon with sky blue styling for web files.\n */\n\nimport React from 'react'\nimport { FILE_TYPE_COLORS } from './colors'\n\ninterface HtmlIconProps {\n size?: number\n className?: string\n}\n\nexport const HtmlIcon: React.FC<HtmlIconProps> = ({ size = 16, className = '' }) => {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path\n d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8l-6-6z\"\n fill={FILE_TYPE_COLORS.html}\n stroke={FILE_TYPE_COLORS.html}\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M14 2v6h6\"\n fill=\"none\"\n stroke={FILE_TYPE_COLORS.white}\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <text\n x=\"12\"\n y=\"16\"\n fontSize=\"5\"\n fill=\"white\"\n textAnchor=\"middle\"\n fontWeight=\"bold\"\n fontFamily=\"Arial, sans-serif\"\n >\n HTML\n </text>\n </svg>\n )\n}\n","/** Image file icon (violet). Promoted from the ARBI app for SDK reuse. */\n\nimport React from 'react'\nimport { FILE_TYPE_COLORS } from './colors'\n\ninterface IconProps {\n size?: number\n className?: string\n}\n\nexport const ImgIcon: React.FC<IconProps> = ({ size = 16, className = '' }) => {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path\n d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8l-6-6z\"\n fill={FILE_TYPE_COLORS.img}\n stroke={FILE_TYPE_COLORS.img}\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M14 2v6h6\"\n fill=\"none\"\n stroke={FILE_TYPE_COLORS.white}\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <text\n x=\"12\"\n y=\"16\"\n fontSize=\"6\"\n fill=\"white\"\n textAnchor=\"middle\"\n fontWeight=\"bold\"\n fontFamily=\"Arial, sans-serif\"\n >\n IMG\n </text>\n </svg>\n )\n}\n","/** PDF file icon (red). Promoted from the ARBI app for SDK reuse. */\n\nimport React from 'react'\nimport { FILE_TYPE_COLORS } from './colors'\n\ninterface IconProps {\n size?: number\n className?: string\n}\n\nexport const PdfIcon: React.FC<IconProps> = ({ size = 16, className = '' }) => {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path\n d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8l-6-6z\"\n fill={FILE_TYPE_COLORS.pdf}\n stroke={FILE_TYPE_COLORS.pdf}\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M14 2v6h6\"\n fill=\"none\"\n stroke={FILE_TYPE_COLORS.white}\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <text\n x=\"12\"\n y=\"16\"\n fontSize=\"6\"\n fill=\"white\"\n textAnchor=\"middle\"\n fontWeight=\"bold\"\n fontFamily=\"Arial, sans-serif\"\n >\n PDF\n </text>\n </svg>\n )\n}\n","/**\n * TXT Icon Component. Promoted from the ARBI app for SDK reuse.\n * For text files (.txt) with gray styling.\n */\n\nimport React from 'react'\nimport { FILE_TYPE_COLORS } from './colors'\n\ninterface TxtIconProps {\n size?: number\n className?: string\n}\n\nexport const TxtIcon: React.FC<TxtIconProps> = ({ size = 16, className = '' }) => {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path\n d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8l-6-6z\"\n fill={FILE_TYPE_COLORS.txt}\n stroke={FILE_TYPE_COLORS.txt}\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M14 2v6h6\"\n fill=\"none\"\n stroke={FILE_TYPE_COLORS.white}\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <text\n x=\"12\"\n y=\"16\"\n fontSize=\"6\"\n fill=\"white\"\n textAnchor=\"middle\"\n fontWeight=\"bold\"\n fontFamily=\"Arial, sans-serif\"\n >\n TXT\n </text>\n </svg>\n )\n}\n","/** Video file icon (emerald). Promoted from the ARBI app for SDK reuse. */\n\nimport React from 'react'\nimport { FILE_TYPE_COLORS } from './colors'\n\ninterface IconProps {\n size?: number\n className?: string\n}\n\nexport const VidIcon: React.FC<IconProps> = ({ size = 16, className = '' }) => {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path\n d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8l-6-6z\"\n fill={FILE_TYPE_COLORS.vid}\n stroke={FILE_TYPE_COLORS.vid}\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M14 2v6h6\"\n fill=\"none\"\n stroke={FILE_TYPE_COLORS.white}\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <text\n x=\"12\"\n y=\"16\"\n fontSize=\"6\"\n fill=\"white\"\n textAnchor=\"middle\"\n fontWeight=\"bold\"\n fontFamily=\"Arial, sans-serif\"\n >\n VID\n </text>\n </svg>\n )\n}\n","/**\n * XLS Icon Component. Promoted from the ARBI app for SDK reuse.\n * For Excel spreadsheets (.xls, .xlsx files) with green styling.\n */\n\nimport React from 'react'\nimport { FILE_TYPE_COLORS } from './colors'\n\ninterface XlsIconProps {\n size?: number\n className?: string\n}\n\nexport const XlsIcon: React.FC<XlsIconProps> = ({ size = 16, className = '' }) => {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path\n d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8l-6-6z\"\n fill={FILE_TYPE_COLORS.xls}\n stroke={FILE_TYPE_COLORS.xls}\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M14 2v6h6\"\n fill=\"none\"\n stroke={FILE_TYPE_COLORS.white}\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <text\n x=\"12\"\n y=\"16\"\n fontSize=\"6\"\n fill=\"white\"\n textAnchor=\"middle\"\n fontWeight=\"bold\"\n fontFamily=\"Arial, sans-serif\"\n >\n XLS\n </text>\n </svg>\n )\n}\n","/**\n * DocumentEntity Component\n *\n * Displays a document as a compact entity pill with file-type icon and name.\n * Promoted from the ARBI app and DECOUPLED from the app store/API: it renders\n * purely from the `doc` prop and optional `onClick`/`onIconClick` callbacks.\n */\n\nimport React from 'react'\nimport { Eye, FolderOpen } from 'lucide-react'\nimport { EntityPill } from './EntityPill'\nimport { AudIcon } from '../icons/AudIcon'\nimport { DocIcon } from '../icons/DocIcon'\nimport { EmlIcon } from '../icons/EmlIcon'\nimport { HtmlIcon } from '../icons/HtmlIcon'\nimport { ImgIcon } from '../icons/ImgIcon'\nimport { PdfIcon } from '../icons/PdfIcon'\nimport { TxtIcon } from '../icons/TxtIcon'\nimport { VidIcon } from '../icons/VidIcon'\nimport { XlsIcon } from '../icons/XlsIcon'\nimport { cn } from '../lib/utils'\n\n/** Minimal, decoupled document shape the pill needs. Structurally compatible\n * with the SDK's `DocResponse` (from `useDocuments`), but no dependency on it —\n * a consumer can pass any object with these fields. */\nexport interface DocumentLike {\n file_name?: string | null\n folder?: string | null\n doc_metadata?: { title?: string | null } | null\n}\n\n/** Title of a document: `doc_metadata.title`, falling back to `file_name`. */\nexport function getDocumentTitle(\n document: DocumentLike | null | undefined,\n defaultValue = ''\n): string {\n if (!document) return defaultValue\n return document.doc_metadata?.title || document.file_name || defaultValue\n}\n\nconst IMAGE_FILE_TYPES = new Set(['png', 'jpg', 'jpeg', 'gif', 'bmp', 'tiff', 'webp'])\n\n/**\n * Whether a document is an image (upload or AI-generated): pages and tokens are text-document\n * concepts, never meaningful for an image, whatever the stored value.\n */\nexport function isImageDocument(\n document: { file_type?: string | null } | null | undefined\n): boolean {\n return !!document?.file_type && IMAGE_FILE_TYPES.has(document.file_type.toLowerCase())\n}\n\n/** Hard cap on the pill's visible label. The full name still shows in the hover\n * tooltip; the pill stays compact so the trailing ⋮ menu never gets pushed. */\nconst MAX_LABEL_CHARS = 30\n\nfunction clampLabel(text: string): string {\n return text.length > MAX_LABEL_CHARS ? `${text.slice(0, MAX_LABEL_CHARS).trimEnd()}…` : text\n}\n\nconst IMAGE_EXTENSIONS = new Set(['jpg', 'jpeg', 'png', 'gif', 'bmp', 'tiff', 'tif', 'webp'])\nconst VIDEO_EXTENSIONS = new Set(['mp4', 'mpeg', 'mpg', 'webm', 'mov', 'avi', 'mkv'])\nconst AUDIO_EXTENSIONS = new Set(['mp3', 'wav', 'm4a', 'aac', 'ogg', 'flac'])\nconst EMAIL_EXTENSIONS = new Set(['eml', 'msg'])\nconst DOCX_EXTENSIONS = new Set(['doc', 'docx', 'odt', 'rtf'])\nconst XLSX_EXTENSIONS = new Set(['xls', 'xlsx', 'csv', 'ods'])\nconst HTML_EXTENSIONS = new Set(['html', 'htm', 'mhtml'])\nconst TEXT_EXTENSIONS = new Set([\n 'txt',\n 'text',\n 'md',\n 'markdown',\n 'log',\n 'json',\n 'xml',\n 'yaml',\n 'yml',\n])\n\n/**\n * The file-type glyph for a document, by extension.\n *\n * Exported because a document is recognisable by its icon before its name — any\n * surface that lists documents (the entity pill here, the workspace home's\n * Documents card) has to draw the same PDF/image/audio/video/email glyph, or\n * the same file looks like two different things in two places.\n */\nexport function getDocIcon(fileName?: string | null, iconSize = 14): React.ReactNode {\n const ext = fileName?.split('.').pop()?.toLowerCase()\n if (ext && VIDEO_EXTENSIONS.has(ext)) return <VidIcon size={iconSize} className=\"flex-shrink-0\" />\n if (ext && AUDIO_EXTENSIONS.has(ext)) return <AudIcon size={iconSize} className=\"flex-shrink-0\" />\n if (ext && IMAGE_EXTENSIONS.has(ext)) return <ImgIcon size={iconSize} className=\"flex-shrink-0\" />\n if (ext && EMAIL_EXTENSIONS.has(ext)) return <EmlIcon size={iconSize} className=\"flex-shrink-0\" />\n if (ext && DOCX_EXTENSIONS.has(ext)) return <DocIcon size={iconSize} className=\"flex-shrink-0\" />\n if (ext && XLSX_EXTENSIONS.has(ext)) return <XlsIcon size={iconSize} className=\"flex-shrink-0\" />\n if (ext && HTML_EXTENSIONS.has(ext)) return <HtmlIcon size={iconSize} className=\"flex-shrink-0\" />\n if (ext && TEXT_EXTENSIONS.has(ext)) return <TxtIcon size={iconSize} className=\"flex-shrink-0\" />\n // Unrecognised or missing extension (e.g. a display title): most uploads are PDFs.\n return <PdfIcon size={iconSize} className=\"flex-shrink-0\" />\n}\n\nexport interface DocumentEntityProps {\n doc: DocumentLike\n /** Override the default file-type icon */\n icon?: React.ReactNode\n /** Size variant — 'sm' (default) for inline/compact contexts, 'base' for a\n * larger pill (e.g. the documents grid's primary name column). */\n size?: 'sm' | 'base'\n /** Override default label max width */\n labelMaxWidth?: string\n /** Extra classes on the label text (e.g. a heavier weight on a card face). */\n labelClassName?: string\n /** Click handler for the whole pill */\n onClick?: (e: React.MouseEvent) => void\n /** Click handler for the icon only */\n onIconClick?: (e: React.MouseEvent) => void\n /** When true, the file-type icon is replaced by a pinned Eye — marks the\n * document that is currently open/being viewed. */\n viewing?: boolean\n /** Small overlay pinned to the icon's corner (e.g. an \"available offline\" pip). */\n iconBadge?: React.ReactNode\n /** Small content right after the name, inside the click area (e.g. a status glyph). */\n status?: React.ReactNode\n /** Trailing control rendered outside the click area (e.g. a ⋯ actions menu). */\n actions?: React.ReactNode\n /** When true, the pill fills the available width and the name truncates via\n * CSS so the trailing ⋯ menu pins to the right edge. */\n fullWidth?: boolean\n /** Render the WHOLE title (skip the 30-char `clampLabel` string cut) while\n * keeping the normal content-width layout — for callers that want the full\n * name to show/wrap (via a `labelClassName`) without `fullWidth`'s w-full.\n * `fullWidth` already implies this. */\n noClamp?: boolean\n /** Override the default folder/title hover tooltip. */\n tooltipContent?: React.ReactNode\n className?: string\n /** Forwarded to the pill so a surface can address this document's chip. */\n 'data-testid'?: string\n}\n\nexport function DocumentEntity({\n doc,\n icon,\n size = 'sm',\n labelMaxWidth,\n labelClassName,\n onClick,\n onIconClick,\n viewing,\n iconBadge,\n status,\n actions,\n tooltipContent,\n className,\n fullWidth,\n noClamp,\n 'data-testid': testId,\n}: DocumentEntityProps) {\n const title = getDocumentTitle(doc)\n const ext = doc.file_name?.split('.').pop()?.toLowerCase()\n const iconSize = size === 'base' ? 16 : 14\n const eyeSizeClass = size === 'base' ? 'h-4 w-4' : 'h-3.5 w-3.5'\n\n const baseIcon = icon ?? getDocIcon(doc.file_name, iconSize)\n const displayIcon =\n viewing || iconBadge ? (\n <span className=\"relative inline-flex flex-shrink-0 items-center justify-center\">\n {viewing ? <Eye className={cn('text-primary-foreground', eyeSizeClass)} /> : baseIcon}\n {iconBadge}\n </span>\n ) : (\n baseIcon\n )\n\n const defaultTooltip = (\n <div className=\"flex flex-col gap-1 text-xs max-w-[440px]\">\n {doc.folder && (\n // `flex-wrap` so a deep folder path wraps WITHIN the balloon instead of\n // spilling out of it (each path segment is atomic and wraps as a unit;\n // `min-w-0` + `break-all` lets a single over-long segment break too).\n <span className=\"flex flex-wrap items-center gap-0.5 text-muted-foreground\">\n <FolderOpen className=\"h-3 w-3 text-yellow-600 shrink-0\" />\n {doc.folder.split('/').map((part, i, arr) => (\n <span key={i} className=\"flex min-w-0 items-center gap-0.5\">\n {i > 0 && <span className=\"text-muted-foreground/50 mx-0.5\">/</span>}\n <span className={`break-all ${i < arr.length - 1 ? 'text-muted-foreground/70' : ''}`}>\n {part}\n </span>\n </span>\n ))}\n </span>\n )}\n <span className=\"font-medium break-words\">\n {title}\n {ext ? `.${ext}` : ''}\n </span>\n </div>\n )\n\n return (\n <EntityPill\n icon={displayIcon}\n size={size}\n label={fullWidth || noClamp ? title : clampLabel(title)}\n labelMaxWidth={labelMaxWidth ?? 'max-w-[140px]'}\n labelClassName={labelClassName}\n secondaryText={status}\n fullWidth={fullWidth}\n onClick={onClick}\n onIconClick={onIconClick}\n moreContent={actions}\n className={className}\n highlight={viewing}\n data-testid={testId}\n tooltipContent={tooltipContent ?? defaultTooltip}\n />\n )\n}\n","import * as React from 'react'\nimport * as CheckboxPrimitive from '@radix-ui/react-checkbox'\nimport { Check } from 'lucide-react'\n\nimport { cn } from '../lib/utils'\n\nconst Checkbox = React.forwardRef<\n React.ElementRef<typeof CheckboxPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <CheckboxPrimitive.Root\n ref={ref}\n className={cn(\n \"peer relative h-4 w-4 shrink-0 rounded-sm border border-muted-foreground/50 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground after:absolute after:left-1/2 after:top-1/2 after:hidden after:size-11 after:-translate-x-1/2 after:-translate-y-1/2 after:content-[''] pointer-coarse:after:block\",\n className\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator className={cn('flex items-center justify-center text-current')}>\n <Check className=\"h-4 w-4\" />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n))\nCheckbox.displayName = CheckboxPrimitive.Root.displayName\n\nexport { Checkbox }\n","/**\n * DocumentCard — the canonical document thumbnail tile.\n *\n * One tile, shared by every app: a full-bleed first-page thumbnail (falling back\n * to the file-type icon) with the selection checkbox, the actions menu, the\n * processing state and the document's name pill layered on top of it, rather\n * than a thumbnail box with a separate meta strip beneath.\n *\n * Presentational only — it takes a thumbnail, a status and callbacks, and knows\n * nothing about how documents are fetched.\n */\n\nimport React from 'react'\nimport { AlertTriangle, CheckCircle, FileX, SkipForward, XCircle } from 'lucide-react'\n\nimport { DocumentEntity, type DocumentLike } from '../entities/DocumentEntity'\nimport { Checkbox } from '../ui/checkbox'\nimport { PdfIcon } from '../icons/PdfIcon'\nimport { ImgIcon } from '../icons/ImgIcon'\nimport { VidIcon } from '../icons/VidIcon'\nimport { AudIcon } from '../icons/AudIcon'\nimport { EmlIcon } from '../icons/EmlIcon'\nimport { cn } from '../lib/utils'\n\n/** Statuses that mean work is still in flight — these get the progress overlay. */\nconst ACTIVE_STATUSES = new Set([\n 'queued',\n 'processing',\n 'parsing',\n 'encrypting',\n 'indexing',\n 'analysing',\n])\n\n/** Statuses the backend has settled on — these get a corner marker. */\nconst TERMINAL_STATUSES = new Set(['completed', 'failed', 'skipped', 'empty', 'low-content'])\n\nconst STATUS_LABEL: Record<string, string> = {\n queued: 'Queued',\n processing: 'Processing',\n parsing: 'Parsing',\n encrypting: 'Encrypting',\n indexing: 'Indexing',\n analysing: 'Analysing',\n}\n\nconst IMAGE_EXTENSIONS = new Set(['jpg', 'jpeg', 'png', 'gif', 'bmp', 'tiff', 'tif', 'webp'])\nconst VIDEO_EXTENSIONS = new Set(['mp4', 'mpeg', 'mpg', 'webm', 'mov', 'avi', 'mkv'])\nconst AUDIO_EXTENSIONS = new Set(['mp3', 'wav', 'm4a', 'aac', 'ogg', 'flac'])\nconst EMAIL_EXTENSIONS = new Set(['eml', 'msg'])\n\n/** Large file-type glyph shown when a document has no first-page thumbnail. */\nfunction fileIcon(fileName: string | null | undefined, size: number): React.ReactNode {\n const ext = fileName?.split('.').pop()?.toLowerCase()\n if (ext && VIDEO_EXTENSIONS.has(ext)) return <VidIcon size={size} />\n if (ext && AUDIO_EXTENSIONS.has(ext)) return <AudIcon size={size} />\n if (ext && IMAGE_EXTENSIONS.has(ext)) return <ImgIcon size={size} />\n if (ext && EMAIL_EXTENSIONS.has(ext)) return <EmlIcon size={size} />\n return <PdfIcon size={size} />\n}\n\n/**\n * Inline rename field, shown in place of the name pill. Enter or blur commits,\n * Escape cancels; guarded against the double commit an Enter-then-blur causes.\n */\nfunction RenameField({\n seed,\n onCommit,\n onCancel,\n testId,\n}: {\n seed: string\n onCommit: (value: string) => void\n onCancel: () => void\n testId?: string\n}) {\n const done = React.useRef(false)\n const commit = (value: string) => {\n if (done.current) return\n done.current = true\n const trimmed = value.trim()\n if (trimmed && trimmed !== seed) onCommit(trimmed)\n else onCancel()\n }\n return (\n <input\n autoFocus\n defaultValue={seed}\n data-testid={testId}\n onFocus={(e) => e.currentTarget.select()}\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault()\n commit(e.currentTarget.value)\n } else if (e.key === 'Escape') {\n e.preventDefault()\n done.current = true\n onCancel()\n }\n }}\n onBlur={(e) => commit(e.currentTarget.value)}\n className=\"w-full rounded border border-primary bg-background px-1 py-0.5 text-xs text-foreground outline-none\"\n />\n )\n}\n\n/** Corner marker for a settled status. Returns null for anything still in flight. */\nfunction StatusMarker({ status, testId }: { status: string; testId?: string }) {\n let icon: React.ReactNode = null\n let title = ''\n switch (status) {\n case 'completed':\n icon = <CheckCircle className=\"size-4 text-success\" strokeWidth={2.75} />\n title = 'Ready'\n break\n case 'failed':\n icon = <XCircle className=\"size-4 text-destructive\" strokeWidth={2.75} />\n title = 'Failed'\n break\n case 'skipped':\n icon = <SkipForward className=\"size-4 text-muted-foreground\" strokeWidth={2.75} />\n title = 'Skipped'\n break\n case 'empty':\n icon = <FileX className=\"size-4 text-warning\" strokeWidth={2.75} />\n title = 'Empty — no extractable content'\n break\n case 'low-content':\n icon = <AlertTriangle className=\"size-4 text-warning\" strokeWidth={2.75} />\n title = 'Low content — minimal extractable content'\n break\n default:\n return null\n }\n return (\n <span\n title={title}\n data-testid={testId}\n className=\"flex size-6 items-center justify-center rounded-full bg-background shadow-sm\"\n >\n {icon}\n </span>\n )\n}\n\nexport interface DocumentCardProps {\n /** The document — anything with a file name and optional metadata title. */\n doc: DocumentLike\n /** First-page thumbnail (data URI or URL). Falls back to the file-type icon. */\n thumbnailUrl?: string | null\n /** Processing status, e.g. `parsing` (overlay) or `completed` (corner marker). */\n status?: string | null\n /** Renders the selection checkbox. Omit `onToggleSelect` to hide it entirely. */\n selected?: boolean\n onToggleSelect?: () => void\n /** Pins the \"eye\" on the name pill — this is the document open in the viewer. */\n viewing?: boolean\n onOpen?: () => void\n /** Actions menu, pinned to the tile's top-right corner. */\n actions?: React.ReactNode\n /** Swaps the name pill for an inline rename field. */\n renaming?: boolean\n onCommitRename?: (name: string) => void\n onCancelRename?: () => void\n /** Replaces the pill's default hover tooltip (e.g. an AI summary + labels). */\n tooltipContent?: React.ReactNode\n /** Bottom-left marker slot (e.g. an \"available offline\" glyph). */\n marker?: React.ReactNode\n testId?: string\n className?: string\n}\n\nexport function DocumentCard({\n doc,\n thumbnailUrl,\n status,\n selected = false,\n onToggleSelect,\n viewing = false,\n onOpen,\n actions,\n renaming = false,\n onCommitRename,\n onCancelRename,\n tooltipContent,\n marker,\n testId = 'document-card',\n className,\n}: DocumentCardProps) {\n const normalised = (status ?? '').toLowerCase()\n const isProcessing = ACTIVE_STATUSES.has(normalised)\n const showStatusMarker = !isProcessing && TERMINAL_STATUSES.has(normalised)\n\n // A thumbnail only exists once a document is processed, so a processing tile\n // always shows the overlay. Portrait pages fill the tile (top-aligned) for\n // legibility; landscape ones are fit whole so nothing is cropped away.\n const [thumbFailed, setThumbFailed] = React.useState(false)\n const [thumbLandscape, setThumbLandscape] = React.useState(false)\n const showThumbnail = !!thumbnailUrl && !thumbFailed && !isProcessing\n\n return (\n <div\n data-testid={testId}\n className={cn(\n // Square corners and a portrait-page aspect (height = 1.3 × width), so a\n // cover-page thumbnail reads edge-to-edge.\n 'group relative aspect-[10/13] select-none overflow-hidden border bg-muted/20 transition',\n selected\n ? 'border-primary bg-primary/10'\n : 'border-border shadow-sm hover:border-border/80 hover:bg-muted/50',\n className\n )}\n >\n {/* Base layer: full-bleed thumbnail, else the centred file-type icon. */}\n {showThumbnail ? (\n <img\n src={thumbnailUrl}\n alt=\"\"\n loading=\"lazy\"\n draggable={false}\n onError={() => setThumbFailed(true)}\n onLoad={(e) =>\n setThumbLandscape(e.currentTarget.naturalWidth > e.currentTarget.naturalHeight)\n }\n className={cn(\n 'absolute inset-0 size-full bg-white',\n thumbLandscape ? 'object-contain' : 'object-cover object-top'\n )}\n />\n ) : (\n <div className=\"absolute inset-0 flex items-center justify-center text-muted-foreground\">\n {fileIcon(doc.file_name, 44)}\n </div>\n )}\n\n {/* In flight: an indeterminate bar and the stage name, over a scrim. */}\n {isProcessing && (\n <div\n data-testid={`${testId}-processing`}\n className=\"absolute inset-0 z-10 flex flex-col items-center justify-center gap-1.5 bg-background/80 px-3\"\n >\n <div className=\"h-1.5 w-full overflow-hidden rounded-sm bg-muted\">\n <div className=\"h-full w-1/3 animate-pulse rounded-sm bg-primary\" />\n </div>\n <span className=\"text-xs font-medium text-primary\">\n {STATUS_LABEL[normalised] ?? normalised}\n </span>\n </div>\n )}\n\n {/* Selection (top-left) — faded until the tile is hovered or selected. */}\n {onToggleSelect && (\n <Checkbox\n checked={selected}\n onCheckedChange={() => onToggleSelect()}\n onClick={(e) => e.stopPropagation()}\n aria-label={selected ? 'Deselect' : 'Select'}\n data-testid={`${testId}-select`}\n className={cn(\n 'absolute left-1.5 top-1.5 z-20 size-6 rounded-none border-muted-foreground/60 bg-background shadow-sm transition',\n selected ? 'opacity-100' : 'opacity-40 group-hover:opacity-100'\n )}\n />\n )}\n\n {/* Actions (top-right). */}\n {actions && <div className=\"absolute right-1.5 top-1.5 z-20\">{actions}</div>}\n\n {/* Bottom stack: a markers row above the document's name pill. */}\n <div className=\"absolute inset-x-1.5 bottom-1.5 z-20 flex flex-col gap-1\">\n {(marker || showStatusMarker) && (\n <div className=\"flex items-center\">\n {marker}\n {showStatusMarker && (\n <div className=\"ml-auto flex\">\n <StatusMarker status={normalised} testId={`${testId}-status`} />\n </div>\n )}\n </div>\n )}\n {renaming ? (\n <RenameField\n seed={doc.doc_metadata?.title || doc.file_name || ''}\n onCommit={(name) => onCommitRename?.(name)}\n onCancel={() => onCancelRename?.()}\n testId={`${testId}-rename-input`}\n />\n ) : (\n <DocumentEntity\n doc={doc}\n fullWidth\n viewing={viewing}\n tooltipContent={tooltipContent}\n labelClassName=\"font-semibold\"\n className=\"w-full min-w-0 max-w-full bg-background/90 backdrop-blur-sm\"\n onClick={(e) => {\n e.stopPropagation()\n onOpen?.()\n }}\n />\n )}\n </div>\n </div>\n )\n}\n","import * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\n\nimport { cn } from '../lib/utils'\n\nconst badgeVariants = cva(\n 'inline-flex items-center rounded-md border px-2.5 py-0.5 text-sm font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2',\n {\n variants: {\n variant: {\n default: 'border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80',\n accent: 'border-transparent bg-ai-accent-soft text-ai-accent',\n secondary:\n 'border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80',\n destructive:\n 'border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80',\n outline: 'text-foreground',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n }\n)\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>, VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, ...props }: BadgeProps) {\n return <div className={cn(badgeVariants({ variant }), className)} {...props} />\n}\n\nexport { Badge, badgeVariants }\n","/**\n * Tag-type presentation primitives — the brand-neutral icon and label maps that\n * back the shared `TagEntity` pill. Kept in their own module (not the component\n * file) so app-side wrappers can import them to build their own store-coupled\n * tooltip content without pulling in a component, and so the component file stays\n * fast-refresh friendly.\n */\n\nimport {\n SquareCheckBig,\n StickyNote,\n NotebookPen,\n List,\n Hash,\n Search,\n Folder,\n Calendar,\n Bot,\n} from 'lucide-react'\n\n/**\n * Human-readable tag type names. \"Annotation\" names the whole kind (every non-label field), so\n * each format is called by what it is: a checkbox tag is a label, a select one a choice.\n */\nexport const TAG_TYPE_LABELS: Record<string, string> = {\n checkbox: 'Label',\n select: 'Choice',\n number: 'Number',\n text: 'Text',\n folder: 'Folder',\n search: 'Saved Search',\n date: 'Date',\n assistant: 'AI Assistant',\n}\n\n/** Icon mapping for tag types. */\nexport const TAG_TYPE_ICONS: Record<string, typeof StickyNote> = {\n checkbox: SquareCheckBig,\n select: List,\n number: Hash,\n text: NotebookPen,\n folder: Folder,\n search: Search,\n date: Calendar,\n assistant: Bot,\n}\n\n/** Resolve the icon component for a tag type, with the `text` (NotebookPen) fallback.\n * Annotations share the NotebookPen mark used by the AI Annotate bulk action, so\n * the table column and the batch bar name the same thing the same way. */\nexport function getTagTypeIcon(type?: string | null): typeof StickyNote {\n return TAG_TYPE_ICONS[type ?? 'text'] || NotebookPen\n}\n\n/** Resolve the human-readable label for a tag type, falling back to the raw type. */\nexport function getTagTypeLabel(type?: string | null): string {\n const t = type ?? 'text'\n return TAG_TYPE_LABELS[t] || t\n}\n","/**\n * TagEntity Component\n *\n * Single source of truth for tag visual appearance, promoted from the ARBI app\n * and DECOUPLED from the app store/API. It renders purely from the `tag` prop —\n * the app-only bits (creator/updater lookup, visibility toggle, live doctag\n * count from the query cache) are dropped; pass `doctagCount`/`shared` if you\n * want them shown in the built-in tooltip, or inject a fully custom `tooltipContent`.\n */\n\nimport React from 'react'\nimport { EntityPill } from './EntityPill'\nimport { Badge } from '../ui/badge'\nimport { getTagTypeIcon, getTagTypeLabel } from './tag-types'\n\n/** Base color map — source of truth for entity colors, keyed by the 5th char of\n * an entity id (matches the app's BASE_COLORS). */\nconst BASE_COLORS: Record<string, string> = {\n '0': '#10b981',\n '1': '#3b82f6',\n '2': '#8b5cf6',\n '3': '#f43f5e',\n '4': '#f59e0b',\n '5': '#84cc16',\n '6': '#a855f7',\n '7': '#06b6d4',\n '8': '#f97316',\n '9': '#14b8a6',\n a: '#ef4444',\n b: '#6366f1',\n c: '#ec4899',\n d: '#22c55e',\n e: '#eab308',\n f: '#0ea5e9',\n}\n\n/** Solid entity color derived from an entity id (matches the app's\n * `getEntityColor(id, 'medium')`). */\nfunction getEntityColor(entityId: string): string {\n return BASE_COLORS[entityId[4]] || BASE_COLORS['0']\n}\n\n/** Minimal, decoupled tag shape the pill needs. */\nexport interface TagLike {\n external_id: string\n name: string\n /** Tag type discriminator — drives the icon and the tooltip's \"Type\" line. */\n tag_type?: { type: string } | null\n /** Optional explicit color; when omitted it's derived from `external_id`. */\n color?: string\n /** Optional document count shown in the tooltip. */\n doctag_count?: number | null\n /** Optional shared/private flag shown in the tooltip. */\n shared?: boolean | null\n}\n\nexport interface TagEntityProps {\n tag: TagLike\n size?: 'sm' | 'md' | 'lg'\n className?: string\n onClick?: (e: React.MouseEvent) => void\n /** Whether to show a tooltip (default: true) */\n showTooltip?: boolean\n /** Injected tooltip override. When provided (and `showTooltip` is not false) it\n * replaces the built-in tooltip — used by the monolith to render its rich,\n * store-coupled tooltip (fresh count, creator/updater, visibility toggle). */\n tooltipContent?: React.ReactNode\n}\n\nexport function TagEntity({\n tag,\n size = 'md',\n className = '',\n onClick,\n showTooltip = true,\n tooltipContent,\n}: TagEntityProps) {\n const tagType = tag.tag_type?.type ?? 'text'\n const iconSize = size === 'sm' ? 12 : size === 'md' ? 14 : 16\n const Icon = getTagTypeIcon(tagType)\n\n const sizeClasses = {\n sm: 'p-0.5',\n md: 'p-1',\n lg: 'p-1.5',\n }\n\n const tagColor = tag.color ?? getEntityColor(tag.external_id)\n\n const iconElement = (\n <span\n className={`inline-flex items-center justify-center rounded-md text-white flex-shrink-0 ${sizeClasses[size]}`}\n style={{ backgroundColor: tagColor }}\n >\n <Icon size={iconSize} className=\"flex-shrink-0\" />\n </span>\n )\n\n const pillSize = size === 'lg' ? 'base' : 'sm'\n\n const defaultTooltip = (\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex items-center gap-2\">\n <span\n className=\"inline-flex items-center justify-center rounded-md text-white p-1\"\n style={{ backgroundColor: tagColor }}\n >\n <Icon size={16} />\n </span>\n <span className=\"font-medium text-sm\">{tag.name}</span>\n </div>\n\n <div className=\"flex flex-col gap-1.5 text-sm\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-muted-foreground\">Type:</span>\n <span>{getTagTypeLabel(tagType)}</span>\n </div>\n\n {tag.doctag_count != null && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-muted-foreground\">Documents:</span>\n <Badge variant=\"secondary\" className=\"h-5 min-w-[20px] justify-center\">\n {tag.doctag_count ?? 0}\n </Badge>\n </div>\n )}\n\n {tag.shared != null && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-muted-foreground\">{tag.shared ? 'Shared' : 'Private'}</span>\n </div>\n )}\n </div>\n </div>\n )\n\n const resolvedTooltip = showTooltip ? (tooltipContent ?? defaultTooltip) : undefined\n\n return (\n <EntityPill\n icon={iconElement}\n label={tag.name}\n size={pillSize}\n shape=\"rounded\"\n labelMaxWidth=\"max-w-[180px]\"\n tooltipContent={resolvedTooltip}\n onClick={onClick}\n className={className}\n data-testid={`tag-entity-${tag.external_id}`}\n />\n )\n}\n","/**\n * Shared getUserMedia error classification — used by both `useAudioRecorder`\n * (microphone) and `useCameraStream` (camera), so \"permission denied\" /\n * \"device not found\" / \"not supported\" read as the same message shape\n * regardless of which device was requested, without duplicating the\n * DOMException-name matching in every recorder hook.\n */\nexport type MediaDeviceKind = 'microphone' | 'camera'\n\nexport function classifyMediaError(err: unknown, kind: MediaDeviceKind): string {\n const label = kind === 'camera' ? 'Camera' : 'Microphone'\n const name = err instanceof DOMException ? err.name : undefined\n if (name === 'NotAllowedError' || name === 'SecurityError') {\n return `${label} access is blocked. Allow ${kind} permission in your browser settings to use this feature.`\n }\n if (name === 'NotFoundError' || name === 'DevicesNotFoundError') {\n return `No ${kind} found on this device.`\n }\n if (!navigator.mediaDevices?.getUserMedia) {\n return `${kind === 'camera' ? 'Camera' : 'Voice'} input is not supported in this browser.`\n }\n return `Could not access the ${kind}. Please try again.`\n}\n","/**\n * Chunked MediaRecorder engine — records a stream in fixed-length parts for a\n * long-running recording that is uploaded as it goes (call recording).\n *\n * Two ways to cut the parts:\n * - `restart` (default): every `chunkMs` the recorder is stopped and a new\n * one started on the same stream, so EVERY part is a standalone file with\n * its own container header (playable, decodable and transcribable on its\n * own). The gap between two parts is the few ms between stop and start.\n * - `timeslice`: one recorder, `requestData()` every `chunkMs` — the parts\n * are consecutive byte ranges of ONE file (only the first carries the\n * header), so concatenating them in order gives the whole recording with\n * no gap. Used where the parts are only ever played back as one file.\n *\n * Framework-free (no React) so it can be driven by `useAudioRecorder`'s\n * chunk mode and directly by a host that records a composed stream.\n */\n\n/** One part of a chunked recording. */\nexport interface RecordedChunk {\n blob: Blob\n mimeType: string\n /** 0, 1, 2… in recording order (per recorder instance). */\n index: number\n /** Wall-clock start of the part, ms since epoch. */\n startedAt: number\n durationMs: number\n /** `restart`: always true. `timeslice`: only the first part starts a file. */\n standalone: boolean\n}\n\nexport interface ChunkedRecorderOptions {\n stream: MediaStream\n /** MediaRecorder MIME type (pick it with {@link pickRecorderMimeType}). */\n mimeType: string\n /** Part length, ms (~30 s for call recording). */\n chunkMs: number\n mode?: 'restart' | 'timeslice'\n audioBitsPerSecond?: number\n videoBitsPerSecond?: number\n onChunk(chunk: RecordedChunk): void\n /** Called when a MediaRecorder fails; the recorder stops. */\n onError?(error: unknown): void\n /** Wall clock (tests). */\n now?: () => number\n}\n\nexport interface ChunkedRecorder {\n readonly running: boolean\n start(): void\n /** Stop and flush the tail part; resolves once it was handed to `onChunk`. */\n stop(): Promise<void>\n}\n\n/** Audio MIME types in preference order: Opus/WebM, then AAC/MP4 (Safari). */\nexport const AUDIO_MIME_PREFERENCE = [\n 'audio/webm;codecs=opus',\n 'audio/ogg;codecs=opus',\n 'audio/mp4;codecs=mp4a.40.2',\n 'audio/mp4',\n] as const\n\n/** Video MIME types in preference order: AV1, VP9, VP8 (with Opus), then MP4. */\nexport const VIDEO_MIME_PREFERENCE = [\n 'video/webm;codecs=av01,opus',\n 'video/webm;codecs=av1,opus',\n 'video/webm;codecs=vp9,opus',\n 'video/webm;codecs=vp8,opus',\n 'video/webm',\n 'video/mp4',\n] as const\n\n/**\n * The first MIME type `isTypeSupported` accepts, or the last of the list (the\n * broadest container) when it accepts none.\n */\nexport function pickRecorderMimeType(\n kind: 'audio' | 'video',\n isTypeSupported: (type: string) => boolean = (t) =>\n typeof MediaRecorder !== 'undefined' && MediaRecorder.isTypeSupported(t)\n): string {\n const list: readonly string[] = kind === 'audio' ? AUDIO_MIME_PREFERENCE : VIDEO_MIME_PREFERENCE\n for (const type of list) {\n try {\n if (isTypeSupported(type)) return type\n } catch {\n // A browser that throws on an unknown type: try the next one.\n }\n }\n return list[list.length - 1]\n}\n\nexport function createChunkedRecorder(options: ChunkedRecorderOptions): ChunkedRecorder {\n const now = options.now ?? (() => Date.now())\n const mode = options.mode ?? 'restart'\n let running = false\n let index = 0\n let timer: ReturnType<typeof setInterval> | ReturnType<typeof setTimeout> | null = null\n let tail: Promise<void> = Promise.resolve()\n\n const recorderInit = (): MediaRecorderOptions => ({\n mimeType: options.mimeType,\n ...(options.audioBitsPerSecond ? { audioBitsPerSecond: options.audioBitsPerSecond } : {}),\n ...(options.videoBitsPerSecond ? { videoBitsPerSecond: options.videoBitsPerSecond } : {}),\n })\n\n const fail = (err: unknown) => {\n running = false\n if (timer !== null) clearTimeout(timer as ReturnType<typeof setTimeout>)\n timer = null\n options.onError?.(err)\n }\n\n /** `restart`: one recorder per part; resolves when that part was emitted. */\n const beginPart = ():\n { recorder: MediaRecorder; startedAt: number; chunks: Blob[] } | undefined => {\n let recorder: MediaRecorder\n try {\n recorder = new MediaRecorder(options.stream, recorderInit())\n } catch (err) {\n fail(err)\n return undefined\n }\n const chunks: Blob[] = []\n const part = { recorder, startedAt: now(), chunks }\n recorder.ondataavailable = (e) => {\n if (e.data.size > 0) chunks.push(e.data)\n }\n // Capture begins at the recorder's `start` event, which can come a second or more after\n // start() while the encoder spins up. Time the part from there: a part timed from start()\n // carries that latency as phantom silence at its start, and a transcript cut there splits a\n // sentence spoken across the part boundary.\n recorder.onstart = () => {\n part.startedAt = now()\n }\n try {\n recorder.start()\n } catch (err) {\n fail(err)\n return undefined\n }\n return part\n }\n\n const endPart = (part: { recorder: MediaRecorder; startedAt: number; chunks: Blob[] }) =>\n new Promise<void>((resolve) => {\n const { recorder, startedAt, chunks } = part\n const durationMs = Math.max(0, now() - startedAt)\n const partIndex = index++\n const emit = () => {\n if (chunks.length) {\n const type = recorder.mimeType || options.mimeType\n options.onChunk({\n blob: new Blob(chunks, { type }),\n mimeType: type,\n index: partIndex,\n startedAt,\n durationMs,\n standalone: true,\n })\n }\n resolve()\n }\n if (recorder.state === 'inactive') {\n emit()\n return\n }\n recorder.onstop = emit\n recorder.stop()\n })\n\n let open: { recorder: MediaRecorder; startedAt: number; chunks: Blob[] } | undefined\n\n const rotate = () => {\n if (!running || !open) return\n const finished = open\n // Start the next part before the previous one flushes: no gap but the start latency.\n open = beginPart()\n tail = tail.then(() => endPart(finished))\n if (running) timer = setTimeout(rotate, options.chunkMs)\n }\n\n // `timeslice`: one recorder; each dataavailable is a part.\n let sliceStartedAt = 0\n let sliceRecorder: MediaRecorder | null = null\n let stopResolve: (() => void) | null = null\n\n const startTimeslice = () => {\n let recorder: MediaRecorder\n try {\n recorder = new MediaRecorder(options.stream, recorderInit())\n } catch (err) {\n fail(err)\n return\n }\n sliceRecorder = recorder\n sliceStartedAt = now()\n recorder.ondataavailable = (e) => {\n const at = now()\n const startedAt = sliceStartedAt\n sliceStartedAt = at\n if (!e.data.size) return\n const type = recorder.mimeType || options.mimeType\n const partIndex = index++\n options.onChunk({\n blob: e.data,\n mimeType: type,\n index: partIndex,\n startedAt,\n durationMs: Math.max(0, at - startedAt),\n standalone: partIndex === 0,\n })\n }\n recorder.onstop = () => {\n stopResolve?.()\n stopResolve = null\n }\n try {\n recorder.start()\n } catch (err) {\n sliceRecorder = null\n fail(err)\n return\n }\n timer = setInterval(() => {\n if (recorder.state === 'recording') recorder.requestData()\n }, options.chunkMs)\n }\n\n return {\n get running() {\n return running\n },\n start() {\n if (running) return\n running = true\n index = 0\n if (mode === 'timeslice') {\n startTimeslice()\n return\n }\n open = beginPart()\n if (running) timer = setTimeout(rotate, options.chunkMs)\n },\n stop() {\n if (!running && !open && !sliceRecorder) return tail\n running = false\n if (timer !== null) {\n clearTimeout(timer as ReturnType<typeof setTimeout>)\n clearInterval(timer as ReturnType<typeof setInterval>)\n }\n timer = null\n if (mode === 'timeslice') {\n const recorder = sliceRecorder\n sliceRecorder = null\n if (!recorder || recorder.state === 'inactive') return tail\n tail = new Promise<void>((resolve) => {\n stopResolve = resolve\n // stop() fires a final dataavailable (the tail), then stop.\n recorder.stop()\n })\n return tail\n }\n const finished = open\n open = undefined\n if (finished) tail = tail.then(() => endPart(finished))\n return tail\n },\n }\n}\n","/**\n * useAudioRecorder\n *\n * Shared recording engine — getUserMedia capture, MediaRecorder lifecycle,\n * and an AnalyserNode-driven live level meter. Host apps layer their own\n * interaction model on top of the primitives here: a press-and-hold mic\n * calls start()/stop() on press/release and never pauses; a toggle-style\n * recorder exposes all of start/pause/resume/stop/reset as buttons.\n *\n * Two optional modes extend it (both used by live call transcription):\n * - `track`: record from a MediaStreamTrack the host already has (a call's\n * microphone track) instead of opening the microphone; the track stays the\n * host's and is never stopped here.\n * - `onSegment`: segmenting mode. Instead of one recording, the level meter\n * drives a voice-activity state machine (`audio-segmenter.ts`) and each\n * speech segment is recorded by its own MediaRecorder, so every emitted\n * blob is a standalone file. Too-short segments are dropped. `blob` stays\n * null and pause/resume do nothing in this mode. Stopping, unmounting or\n * hiding the page emits the open segment (if it held enough voice).\n * - `chunkMs` (with `onSegment`): chunk mode, used by call recording. No\n * voice detection: the recorder is restarted every `chunkMs`\n * (`chunked-recorder.ts`), so every part — silence included — is a\n * standalone file, emitted in order through `onSegment`. Stopping (or\n * unmounting) flushes the tail part: a recording never drops audio.\n *\n * REUSE-FIRST: no app coupling. Failures surface via the returned `error`\n * string rather than an app-specific toast/notification call — the host\n * decides how (or whether) to display it.\n */\n\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport { classifyMediaError } from './media-error'\nimport {\n createChunkedRecorder,\n pickRecorderMimeType,\n type ChunkedRecorder,\n} from './chunked-recorder'\nimport {\n DEFAULT_SEGMENTER_CONFIG,\n flushSegmenter,\n INITIAL_SEGMENTER_STATE,\n levelFromRms,\n stepSegmenter,\n type SegmenterConfig,\n type SegmenterEvent,\n type SegmenterState,\n} from './audio-segmenter'\n\n// How often the live level meter updates (ms). Fast enough to read as live,\n// slow enough not to spam React with a render per animation frame.\nconst LEVEL_UPDATE_INTERVAL_MS = 50\n\nexport type AudioRecorderState = 'idle' | 'recording' | 'paused' | 'stopped'\n\n/** One speech segment emitted in segmenting mode. */\nexport interface AudioSegment {\n /** A standalone recording (its own container header), ready to upload. */\n blob: Blob\n mimeType: string\n /** Wall-clock start of the segment, ms since epoch. */\n startedAt: number\n durationMs: number\n /** How much of it carried voice (chunk mode: the whole part). */\n voiceMs: number\n /** Chunk mode: the part's index in this recording run (0, 1, 2…). */\n index?: number\n}\n\nexport interface UseAudioRecorderOptions {\n /** Record from this track instead of opening the microphone (it is never stopped here). */\n track?: MediaStreamTrack | null\n /** Segmenting mode: called with each kept speech segment. */\n onSegment?: (segment: AudioSegment) => void\n /** Voice-activity tuning for segmenting mode. */\n segmenter?: Partial<SegmenterConfig>\n /** Chunk mode (with `onSegment`): a standalone part every `chunkMs`, no voice detection. */\n chunkMs?: number\n /** Chunk mode: the MediaRecorder MIME type (default: Opus/WebM, else AAC/MP4). */\n mimeType?: string\n /** Chunk mode: the encoder bitrate. */\n audioBitsPerSecond?: number\n}\n\nexport interface UseAudioRecorderResult {\n state: AudioRecorderState\n /** Live input level, 0-1. 0 while idle/paused/stopped. */\n level: number\n /** Total recorded duration so far (excludes time spent paused). Frozen at\n * its final value once stopped, until reset() clears it. */\n elapsedMs: number\n /** The finished recording. Only set once state === 'stopped'. */\n blob: Blob | null\n /** The MediaRecorder MIME type used (e.g. 'audio/webm'). Only set once\n * recording has started at least once. */\n mimeType: string | null\n /** A human-readable message from the last failed start() attempt. Cleared\n * at the start of every new attempt, so it always transitions through\n * `null` even if the next failure has the same message. */\n error: string | null\n start: () => Promise<void>\n pause: () => void\n resume: () => void\n stop: () => void\n /** Back to idle: clears blob/elapsedMs/mimeType, ready to record again. */\n reset: () => void\n}\n\nfunction pickSegmentMimeType(): string {\n if (MediaRecorder.isTypeSupported('audio/webm;codecs=opus')) return 'audio/webm;codecs=opus'\n return MediaRecorder.isTypeSupported('audio/webm') ? 'audio/webm' : 'audio/mp4'\n}\n\ninterface OpenSegment {\n recorder: MediaRecorder\n chunks: Blob[]\n /** Wall clock, ms since epoch. */\n startedAt: number\n}\n\nexport function useAudioRecorder(options: UseAudioRecorderOptions = {}): UseAudioRecorderResult {\n const optionsRef = useRef(options)\n optionsRef.current = options\n\n const [state, setState] = useState<AudioRecorderState>('idle')\n const [level, setLevel] = useState(0)\n const [elapsedMs, setElapsedMs] = useState(0)\n const [blob, setBlob] = useState<Blob | null>(null)\n const [mimeType, setMimeType] = useState<string | null>(null)\n const [error, setError] = useState<string | null>(null)\n\n const mediaRecorderRef = useRef<MediaRecorder | null>(null)\n const chunksRef = useRef<Blob[]>([])\n const streamRef = useRef<MediaStream | null>(null)\n // Only a stream this hook opened (getUserMedia) is stopped here; a host's track is left alone.\n const ownsStreamRef = useRef(false)\n const stateRef = useRef<AudioRecorderState>('idle')\n stateRef.current = state\n // Elapsed time is tracked as (time accumulated in prior recording segments)\n // + (time since the current segment started) — pause/resume closes one\n // segment and opens another, so a pause never counts toward the duration.\n const segmentStartRef = useRef(0)\n const accumulatedMsRef = useRef(0)\n const audioContextRef = useRef<AudioContext | null>(null)\n const analyserRef = useRef<AnalyserNode | null>(null)\n const levelRafRef = useRef<number | null>(null)\n const levelIntervalRef = useRef<ReturnType<typeof setInterval> | null>(null)\n\n // Segmenting mode: the voice-activity state and the recorder of the open segment.\n const segmentingRef = useRef(false)\n const segmenterStateRef = useRef<SegmenterState>(INITIAL_SEGMENTER_STATE)\n const openSegmentRef = useRef<OpenSegment | null>(null)\n const segmentMimeTypeRef = useRef<string | null>(null)\n // Chunk mode: the running chunked recorder.\n const chunkedRef = useRef<ChunkedRecorder | null>(null)\n\n const segmenterConfig = useCallback(\n (): SegmenterConfig => ({ ...DEFAULT_SEGMENTER_CONFIG, ...optionsRef.current.segmenter }),\n []\n )\n\n const beginSegment = useCallback(() => {\n const stream = streamRef.current\n const mt = segmentMimeTypeRef.current\n if (!stream || !mt) return\n const recorder = new MediaRecorder(stream, { mimeType: mt })\n const chunks: Blob[] = []\n recorder.ondataavailable = (e) => {\n if (e.data.size > 0) chunks.push(e.data)\n }\n recorder.start()\n openSegmentRef.current = { recorder, chunks, startedAt: Date.now() }\n }, [])\n\n /** Close the open segment's recorder; hand its file to `onSegment` when `keep`. */\n const endSegment = useCallback((keep: boolean, voiceMs: number) => {\n const open = openSegmentRef.current\n openSegmentRef.current = null\n if (!open) return\n const { recorder, chunks, startedAt } = open\n const durationMs = Date.now() - startedAt\n recorder.onstop = () => {\n const onSegment = optionsRef.current.onSegment\n if (!keep || !chunks.length || !onSegment) return\n const type = recorder.mimeType || segmentMimeTypeRef.current || 'audio/webm'\n onSegment({\n blob: new Blob(chunks, { type }),\n mimeType: type,\n startedAt,\n durationMs,\n voiceMs,\n })\n }\n if (recorder.state !== 'inactive') recorder.stop()\n }, [])\n\n const applySegmenterEvents = useCallback(\n (events: SegmenterEvent[]) => {\n for (const event of events) {\n if (event.type === 'start') beginSegment()\n else endSegment(event.keep, event.voiceMs)\n }\n },\n [beginSegment, endSegment]\n )\n\n /**\n * Segmenting mode: close what is being said now, emitting it through `onSegment` when it held\n * enough voice (stop, unmount, page hide) — the last line of a call is never silently dropped.\n */\n const flushOpenSegment = useCallback(() => {\n if (!segmentingRef.current) return\n const flushed = flushSegmenter(segmenterStateRef.current, performance.now(), segmenterConfig())\n segmenterStateRef.current = flushed.state\n applySegmenterEvents(flushed.events)\n endSegment(false, 0)\n }, [segmenterConfig, applySegmenterEvents, endSegment])\n\n const stopMeter = useCallback(() => {\n if (levelRafRef.current !== null) cancelAnimationFrame(levelRafRef.current)\n levelRafRef.current = null\n if (levelIntervalRef.current !== null) clearInterval(levelIntervalRef.current)\n levelIntervalRef.current = null\n analyserRef.current = null\n void audioContextRef.current?.close().catch(() => {})\n audioContextRef.current = null\n }, [])\n\n const startMeter = useCallback(\n (stream: MediaStream) => {\n const audioContext = new AudioContext()\n const source = audioContext.createMediaStreamSource(stream)\n const analyser = audioContext.createAnalyser()\n analyser.fftSize = 256\n source.connect(analyser)\n audioContextRef.current = audioContext\n analyserRef.current = analyser\n\n const data = new Uint8Array(analyser.frequencyBinCount)\n const segmenting = segmentingRef.current\n let lastUpdate = 0\n const tick = (t: number) => {\n const active = analyserRef.current\n if (!active) return\n if (t - lastUpdate >= LEVEL_UPDATE_INTERVAL_MS) {\n lastUpdate = t\n active.getByteTimeDomainData(data)\n let sumSquares = 0\n for (let i = 0; i < data.length; i++) {\n const centered = (data[i] - 128) / 128\n sumSquares += centered * centered\n }\n const rms = Math.sqrt(sumSquares / data.length)\n const nextLevel = levelFromRms(rms)\n setLevel(nextLevel)\n setElapsedMs(accumulatedMsRef.current + (t - segmentStartRef.current))\n if (segmenting) {\n const step = stepSegmenter(segmenterStateRef.current, nextLevel, t, segmenterConfig())\n segmenterStateRef.current = step.state\n applySegmenterEvents(step.events)\n }\n }\n if (!segmenting) levelRafRef.current = requestAnimationFrame(tick)\n }\n if (segmenting) {\n // A timer, not animation frames: frames stop in a background tab, and a\n // call keeps transcribing while its tab is hidden (an audible tab's\n // timers are not throttled).\n levelIntervalRef.current = setInterval(\n () => tick(performance.now()),\n LEVEL_UPDATE_INTERVAL_MS\n )\n } else {\n levelRafRef.current = requestAnimationFrame(tick)\n }\n },\n [segmenterConfig, applySegmenterEvents]\n )\n\n const stopTracks = useCallback(() => {\n if (ownsStreamRef.current) streamRef.current?.getTracks().forEach((t) => t.stop())\n streamRef.current = null\n ownsStreamRef.current = false\n }, [])\n\n useEffect(\n () => () => {\n // Unmounting emits the open segment (when it held enough voice: the host's handler outlives\n // it, e.g. a call's last line as the user hangs up), and a chunked recording flushes its\n // tail (the host's uploader outlives it).\n void chunkedRef.current?.stop()\n chunkedRef.current = null\n flushOpenSegment()\n endSegment(false, 0)\n segmentingRef.current = false\n segmenterStateRef.current = INITIAL_SEGMENTER_STATE\n stopTracks()\n stopMeter()\n },\n [flushOpenSegment, endSegment, stopTracks, stopMeter]\n )\n\n // Segmenting mode: the page going away (tab closed, reload) emits what was being said — best\n // effort, the host may still get to send it.\n useEffect(() => {\n const onPageHide = () => flushOpenSegment()\n window.addEventListener('pagehide', onPageHide)\n return () => window.removeEventListener('pagehide', onPageHide)\n }, [flushOpenSegment])\n\n const start = useCallback(async () => {\n if (stateRef.current === 'recording' || stateRef.current === 'paused') return\n setError(null)\n try {\n const { track, onSegment } = optionsRef.current\n // No await on the track path, so a host can start() and stop() within one effect cycle.\n const stream = track\n ? new MediaStream([track])\n : await navigator.mediaDevices.getUserMedia({ audio: true })\n streamRef.current = stream\n ownsStreamRef.current = !track\n const { chunkMs } = optionsRef.current\n if (onSegment && chunkMs) {\n const mt = optionsRef.current.mimeType ?? pickRecorderMimeType('audio')\n const chunked = createChunkedRecorder({\n stream,\n mimeType: mt,\n chunkMs,\n audioBitsPerSecond: optionsRef.current.audioBitsPerSecond,\n onChunk: (chunk) =>\n optionsRef.current.onSegment?.({\n blob: chunk.blob,\n mimeType: chunk.mimeType,\n startedAt: chunk.startedAt,\n durationMs: chunk.durationMs,\n voiceMs: chunk.durationMs,\n index: chunk.index,\n }),\n onError: (err) => setError(classifyMediaError(err, 'microphone')),\n })\n chunkedRef.current = chunked\n segmentingRef.current = false\n setMimeType(mt)\n setBlob(null)\n accumulatedMsRef.current = 0\n segmentStartRef.current = performance.now()\n chunked.start()\n stateRef.current = 'recording'\n setState('recording')\n return\n }\n if (onSegment) {\n const mt = pickSegmentMimeType()\n segmentMimeTypeRef.current = mt\n segmentingRef.current = true\n segmenterStateRef.current = INITIAL_SEGMENTER_STATE\n setMimeType(mt)\n setBlob(null)\n accumulatedMsRef.current = 0\n segmentStartRef.current = performance.now()\n stateRef.current = 'recording'\n setState('recording')\n startMeter(stream)\n return\n }\n segmentingRef.current = false\n const mt = MediaRecorder.isTypeSupported('audio/webm') ? 'audio/webm' : 'audio/mp4'\n const recorder = new MediaRecorder(stream, { mimeType: mt })\n chunksRef.current = []\n recorder.ondataavailable = (e) => {\n if (e.data.size > 0) chunksRef.current.push(e.data)\n }\n mediaRecorderRef.current = recorder\n setMimeType(mt)\n setBlob(null)\n accumulatedMsRef.current = 0\n segmentStartRef.current = performance.now()\n recorder.start()\n setState('recording')\n startMeter(stream)\n } catch (err) {\n segmentingRef.current = false\n stopTracks()\n setError(classifyMediaError(err, 'microphone'))\n }\n }, [startMeter, stopTracks])\n\n const pause = useCallback(() => {\n if (segmentingRef.current || chunkedRef.current) return\n const recorder = mediaRecorderRef.current\n if (!recorder || recorder.state !== 'recording') return\n recorder.pause()\n accumulatedMsRef.current += performance.now() - segmentStartRef.current\n stopMeter()\n setLevel(0)\n setState('paused')\n }, [stopMeter])\n\n const resume = useCallback(() => {\n if (segmentingRef.current || chunkedRef.current) return\n const recorder = mediaRecorderRef.current\n if (!recorder || recorder.state !== 'paused') return\n recorder.resume()\n segmentStartRef.current = performance.now()\n setState('recording')\n if (streamRef.current) startMeter(streamRef.current)\n }, [startMeter])\n\n const stop = useCallback(() => {\n const chunked = chunkedRef.current\n if (chunked) {\n // Flushes the tail part through onSegment.\n chunkedRef.current = null\n void chunked.stop()\n setElapsedMs(accumulatedMsRef.current + (performance.now() - segmentStartRef.current))\n stopTracks()\n stateRef.current = 'stopped'\n setState('stopped')\n return\n }\n if (segmentingRef.current) {\n // Emit what was being said when recording stopped (if it held enough voice).\n flushOpenSegment()\n segmentingRef.current = false\n stopMeter()\n stopTracks()\n setLevel(0)\n stateRef.current = 'stopped'\n setState('stopped')\n return\n }\n const recorder = mediaRecorderRef.current\n if (!recorder || recorder.state === 'inactive') return\n // Freeze the final duration before tearing the meter down — recording\n // won't include the time it takes MediaRecorder to flush+fire onstop.\n const finalElapsed =\n recorder.state === 'paused'\n ? accumulatedMsRef.current\n : accumulatedMsRef.current + (performance.now() - segmentStartRef.current)\n stopMeter()\n recorder.onstop = () => {\n stopTracks()\n const finalBlob = chunksRef.current.length\n ? new Blob(chunksRef.current, { type: recorder.mimeType })\n : null\n setBlob(finalBlob)\n setElapsedMs(finalElapsed)\n setLevel(0)\n setState('stopped')\n }\n recorder.stop()\n }, [stopMeter, stopTracks, flushOpenSegment])\n\n const reset = useCallback(() => {\n setState('idle')\n setBlob(null)\n setElapsedMs(0)\n setLevel(0)\n setMimeType(null)\n setError(null)\n }, [])\n\n return { state, level, elapsedMs, blob, mimeType, error, start, pause, resume, stop, reset }\n}\n","/** Formats a duration in milliseconds as \"mm:ss\", clamped to non-negative. */\nexport function formatElapsed(ms: number): string {\n const totalSeconds = Math.max(0, Math.floor(ms / 1000))\n const minutes = Math.floor(totalSeconds / 60)\n const seconds = totalSeconds % 60\n return `${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`\n}\n","/**\n * MicWaveformIndicator\n *\n * The REC-badge + timer + waveform visual — the reusable \"is it hearing me\"\n * piece shared by any press-and-hold or toggle-style audio recorder a host\n * app builds on `useAudioRecorder`. Purely presentational: no portal, no\n * card chrome, no caption — callers provide their own context around it.\n *\n * Styled like the REC-badge + timer + waveform convention every voice\n * recorder app uses (Voice Memos, WhatsApp, Slack huddles) — recognisable\n * at a glance as \"this bar height is how loud you are\", not just decoration.\n */\n\nimport { formatElapsed } from './format-elapsed'\n\n// A waveform silhouette (bell-shaped with a little natural asymmetry) rather\n// than a uniform bank of bars — reads as an actual audio waveform rather\n// than N identical dots. Every bar still scales with the same live `level`.\nconst BAR_WEIGHTS = [\n 0.25, 0.32, 0.48, 0.62, 0.82, 0.56, 0.92, 0.72, 1, 0.86, 0.62, 0.96, 0.76, 0.5, 0.84, 0.66, 0.42,\n 0.56, 0.36, 0.28, 0.22,\n]\nconst MIN_BAR_PX = 3\nconst MAX_BAR_PX = 40\n\nexport interface MicWaveformIndicatorProps {\n level: number\n elapsedMs: number\n /** Dims the REC badge and freezes the \"recording\" framing while paused,\n * without needing a separate visual language. */\n paused?: boolean\n}\n\nexport function MicWaveformIndicator({\n level,\n elapsedMs,\n paused = false,\n}: MicWaveformIndicatorProps) {\n return (\n <div className=\"flex flex-col items-center gap-3\" data-testid=\"mic-waveform-indicator\">\n <div className=\"flex items-center gap-2\">\n <span className=\"relative flex h-2 w-2\">\n {!paused && (\n <span className=\"absolute inline-flex h-full w-full animate-ping rounded-full bg-red-500 opacity-75\" />\n )}\n <span\n className={`relative inline-flex h-2 w-2 rounded-full ${paused ? 'bg-muted-foreground' : 'bg-red-500'}`}\n />\n </span>\n <span\n className={`text-xs font-semibold uppercase tracking-wide ${paused ? 'text-muted-foreground' : 'text-red-500'}`}\n >\n {paused ? 'Paused' : 'Rec'}\n </span>\n <span className=\"font-mono text-xs tabular-nums text-muted-foreground\">\n {formatElapsed(elapsedMs)}\n </span>\n </div>\n <div className=\"flex h-10 items-end gap-[3px]\" data-testid=\"mic-waveform-indicator-bars\">\n {BAR_WEIGHTS.map((weight, i) => (\n <span\n key={i}\n className=\"w-1 rounded-full bg-secondary transition-[height] duration-75 ease-out\"\n style={{\n height: Math.min(MAX_BAR_PX, Math.max(MIN_BAR_PX, level * weight * MAX_BAR_PX)),\n }}\n />\n ))}\n </div>\n </div>\n )\n}\n","/**\n * MicRecordingOverlay\n *\n * The big, unmissable \"is it hearing me\" feedback for an active recording —\n * a centered, portaled card with the REC-badge/timer/waveform visual\n * (MicWaveformIndicator). Shared by any recorder in the app that wants the\n * same prominent treatment while actively recording: the chat composer's\n * press-and-hold mic and the inline dictate button both use this, so\n * \"you are recording\" looks and feels identical everywhere it happens.\n *\n * Non-interactive (pointer-events disabled) so it never blocks a click\n * elsewhere; mounted via a portal so it renders above whatever field or\n * layout it was triggered from, regardless of overflow/z-index there.\n */\n\nimport { createPortal } from 'react-dom'\nimport { MicWaveformIndicator } from './MicWaveformIndicator'\n\nexport interface MicRecordingOverlayProps {\n level: number\n elapsedMs: number\n paused?: boolean\n /** Caption under the waveform — defaults to the press-and-hold framing. */\n caption?: string\n}\n\nexport function MicRecordingOverlay({\n level,\n elapsedMs,\n paused,\n caption = 'Keep button pressed while speaking',\n}: MicRecordingOverlayProps) {\n if (typeof document === 'undefined') return null\n return createPortal(\n <div\n aria-hidden\n className=\"pointer-events-none fixed inset-0 z-[2147483647] flex items-center justify-center\"\n data-testid=\"mic-recording-overlay\"\n >\n <div className=\"flex w-72 flex-col items-center gap-3 rounded-2xl bg-background/95 px-6 py-5 shadow-2xl ring-1 ring-border backdrop-blur-sm\">\n <MicWaveformIndicator level={level} elapsedMs={elapsedMs} paused={paused} />\n <p className=\"text-center text-sm font-medium text-muted-foreground\">{caption}</p>\n </div>\n </div>,\n document.body\n )\n}\n","/**\n * IconToggle Component\n *\n * Base visual toggle button - switch toggle with +/- on hover\n *\n * DO NOT use directly - use a purpose-named wrapper instead (e.g. a\n * ContactToggle, VisibilityToggle, InChatToggle) so each call site reads as\n * what it does, not as a generic switch.\n */\n\nimport { LucideIcon, Plus, Minus } from 'lucide-react'\nimport { Tooltip, TooltipContent, TooltipTrigger } from './tooltip'\n\ninterface ColorClasses {\n text: string\n bg: string\n}\n\nexport interface IconToggleProps {\n icon: LucideIcon\n isActive: boolean\n onToggle: (isActive: boolean) => void\n colors: ColorClasses\n inactiveColors?: ColorClasses\n fillWhenActive?: boolean\n disabled?: boolean\n /** Tooltip to show when disabled (e.g., \"You cannot unshare this resource\") */\n disabledTooltip?: string\n showLabel?: boolean\n label?: string\n tooltipActive?: string\n tooltipInactive?: string\n tooltipMixed?: string\n isMixed?: boolean\n /** Set to false to disable tooltip (useful when nested inside another tooltip) */\n showTooltip?: boolean\n 'data-testid'?: string\n}\n\nexport function IconToggle({\n icon: Icon,\n isActive,\n onToggle,\n colors,\n inactiveColors,\n fillWhenActive = false,\n disabled = false,\n disabledTooltip,\n showLabel = false,\n label,\n tooltipActive,\n tooltipInactive,\n tooltipMixed,\n isMixed = false,\n showTooltip = true,\n 'data-testid': dataTestId,\n}: IconToggleProps) {\n const handleClick = (e: React.MouseEvent) => {\n e.stopPropagation()\n onToggle(!isActive)\n }\n\n const { bg: bgColorClass } = colors\n\n const tooltipText = disabled\n ? disabledTooltip\n : isMixed\n ? tooltipMixed\n : isActive\n ? tooltipActive\n : tooltipInactive\n\n const { text: textColorClass } = colors\n\n const button = (\n <div className=\"inline-flex items-center gap-2\">\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={disabled}\n data-testid={dataTestId}\n aria-pressed={isMixed ? 'mixed' : isActive}\n aria-label={label ?? tooltipText}\n className={`\n group/toggle relative inline-flex items-center h-4 w-8 rounded-full\n pointer-coarse:after:absolute pointer-coarse:after:left-1/2 pointer-coarse:after:top-1/2 pointer-coarse:after:size-11 pointer-coarse:after:-translate-x-1/2 pointer-coarse:after:-translate-y-1/2 pointer-coarse:after:content-['']\n transition-colors cursor-pointer\n disabled:opacity-50 disabled:cursor-not-allowed\n ${isActive ? bgColorClass : isMixed ? 'bg-muted-foreground' : (inactiveColors?.bg ?? 'bg-muted')}\n `}\n >\n {/* Hover icon on the opposite side of thumb - hidden when disabled */}\n {isActive && !disabled && (\n <div className=\"absolute left-0 w-4 h-4 flex items-center justify-center\">\n <Minus className=\"w-2.5 h-2.5 text-white/70 hidden group-hover/toggle:block\" />\n </div>\n )}\n {!isActive && !disabled && (\n <div className=\"absolute right-0 w-4 h-4 flex items-center justify-center\">\n <Plus className=\"w-2.5 h-2.5 text-muted-foreground hidden group-hover/toggle:block\" />\n </div>\n )}\n {/* Sliding thumb */}\n <div\n className={`\n absolute h-4 w-4 rounded-full bg-white shadow-sm\n flex items-center justify-center\n transition-transform duration-200\n ${isActive ? 'translate-x-4' : 'translate-x-0'}\n `}\n >\n <Icon\n className={`w-2.5 h-2.5 ${isActive ? textColorClass : (inactiveColors?.text ?? 'text-muted-foreground')} ${isActive && fillWhenActive ? 'fill-current' : ''}`}\n />\n </div>\n </button>\n </div>\n )\n\n return (\n <div className=\"inline-flex items-center gap-2\">\n {showLabel && label && <span className=\"font-semibold text-sm text-primary\">{label}</span>}\n {tooltipText && showTooltip ? (\n <Tooltip>\n <TooltipTrigger asChild onFocusCapture={(e) => e.stopPropagation()}>\n {button}\n </TooltipTrigger>\n <TooltipContent>\n <p>{tooltipText}</p>\n </TooltipContent>\n </Tooltip>\n ) : (\n button\n )}\n </div>\n )\n}\n","/**\n * InlineMicButton\n *\n * A dictate-instead-of-type button meant to sit inside a text field's own\n * padding (a corner of an `<input>`/`<textarea>`), not a standalone feature\n * in its own right — no waveform, no timer, no card chrome. Only shows while\n * the host field is focused (or mid-recording/transcribing, so it never\n * vanishes out from under an active dictation) — otherwise the field stays\n * clean. Idle it's subtle (small, muted); once pressed it's the opposite —\n * a solid, unmissable recording indicator, because \"is this thing listening\"\n * is the one moment subtlety actively hurts. Built on the same\n * useAudioRecorder engine as VoiceNoteRecorder/MicButton.\n *\n * Two ways to use it, same as WhatsApp/Telegram voice messages:\n * - Press and hold, release to stop — quick dictation, thumb-friendly.\n * - A quick tap instead locks it into hands-free recording (no need to keep\n * the pointer down for a long note); tap again to stop. A tap is whatever\n * releases before HOLD_THRESHOLD_MS — past that it's a hold, and release\n * stops it immediately.\n *\n * REUSE-FIRST: props/callbacks in. The host supplies `transcribe` (its own\n * speech-to-text endpoint), `focused` (its own focus state), and\n * `onTranscript` (where the text goes — append, insert at cursor, whatever\n * fits the field).\n *\n * `preventDefault()` on pointerdown so pressing this button never steals\n * focus from the field it's embedded in — without that, a field that blurs\n * to collapse itself (e.g. an editor that exits edit mode on blur) would\n * close out from under a user mid-dictation, and `focused` would immediately\n * flip false and hide the button being pressed.\n */\n\nimport { useEffect, useRef, useState } from 'react'\nimport { Mic, Square, Loader2 } from 'lucide-react'\nimport { useAudioRecorder } from './useAudioRecorder'\nimport { MicRecordingOverlay } from './MicRecordingOverlay'\n\n// Below this, a press-release is a \"tap\" (locks into hands-free recording);\n// at or above it, release stops the recording immediately (press-and-hold).\nconst HOLD_THRESHOLD_MS = 350\n\nexport interface InlineMicButtonProps {\n /** Whether the host field currently has focus. The button renders only\n * while this is true, or while actively recording/transcribing. */\n focused: boolean\n /** Called with the transcribed text once recording stops and transcription\n * resolves. The host decides how to merge it into the field's value. */\n onTranscript: (text: string) => void\n /** Surfaces recorder or transcription failures — wire to the host's own\n * notification system. Without it, failures are silent. */\n onError?: (message: string) => void\n /** The host's own speech-to-text call. */\n transcribe: (blob: Blob) => Promise<string>\n className?: string\n}\n\nexport function InlineMicButton({\n focused,\n onTranscript,\n onError,\n transcribe,\n className,\n}: InlineMicButtonProps) {\n const recorder = useAudioRecorder()\n const [isTranscribing, setIsTranscribing] = useState(false)\n // True once a quick tap has left the recording running hands-free — the\n // next press (of any length) is the \"stop\" gesture rather than a new hold.\n const [latched, setLatched] = useState(false)\n const pressedAtRef = useRef(0)\n\n useEffect(() => {\n if (recorder.error) onError?.(recorder.error)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [recorder.error])\n\n useEffect(() => {\n if (recorder.state !== 'stopped' || !recorder.blob) return\n const blob = recorder.blob\n setIsTranscribing(true)\n transcribe(blob)\n .then((text) => {\n if (text.trim()) onTranscript(text.trim())\n })\n .catch((err) => {\n onError?.(err instanceof Error ? err.message : 'Could not transcribe audio.')\n })\n .finally(() => {\n setIsTranscribing(false)\n setLatched(false)\n recorder.reset()\n })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [recorder.state, recorder.blob])\n\n const isRecording = recorder.state === 'recording'\n const isBusy = isTranscribing\n\n if (!focused && !isRecording && !isBusy) return null\n\n const handlePointerDown = (e: React.PointerEvent) => {\n e.preventDefault()\n if (isRecording) return // latched (or otherwise already going) — let pointerup stop it\n pressedAtRef.current = Date.now()\n void recorder.start()\n }\n\n const handlePointerUp = () => {\n if (!isRecording) return\n if (latched) {\n recorder.stop()\n setLatched(false)\n return\n }\n const held = Date.now() - pressedAtRef.current\n if (held >= HOLD_THRESHOLD_MS) {\n recorder.stop()\n } else {\n setLatched(true)\n }\n }\n\n const handlePointerLeave = () => {\n // Dragged off mid-hold (not latched into hands-free) — stop, same as\n // releasing over the button. Latched recording stays running regardless\n // of where the pointer goes; that's the point of hands-free.\n if (isRecording && !latched) recorder.stop()\n }\n\n return (\n <>\n <button\n type=\"button\"\n onPointerDown={handlePointerDown}\n onPointerUp={handlePointerUp}\n onPointerLeave={handlePointerLeave}\n onPointerCancel={handlePointerLeave}\n disabled={isBusy}\n title={\n isRecording ? 'Release to stop, or tap again if hands-free' : 'Hold, or tap to dictate'\n }\n data-testid=\"inline-mic-button\"\n className={`inline-flex items-center justify-center rounded-full transition-colors disabled:pointer-events-none ${\n isRecording\n ? 'h-7 w-7 bg-red-500 text-white shadow-sm hover:bg-red-600'\n : isBusy\n ? 'h-6 w-6 text-muted-foreground'\n : 'h-6 w-6 text-muted-foreground/50 hover:bg-muted hover:text-muted-foreground'\n } ${className ?? ''}`}\n >\n {isBusy ? (\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : isRecording ? (\n <Square className=\"h-3 w-3 fill-current\" />\n ) : (\n <Mic className=\"h-3.5 w-3.5\" />\n )}\n </button>\n {/* Same big, unmissable \"is it hearing me\" feedback as the chat\n composer's mic — reused, not reimplemented, so every recording in\n the app looks and feels the same. */}\n {isRecording && (\n <MicRecordingOverlay\n level={recorder.level}\n elapsedMs={recorder.elapsedMs}\n caption={latched ? 'Tap the mic again to stop' : 'Release to stop, or keep holding'}\n />\n )}\n </>\n )\n}\n","/**\n * Entity registry — the single, canonical source of truth for entity icons and\n * display names across every ARBI app (monolith, clarum, any deployment).\n *\n * Centralises \"what glyph and what word represents a WORKSPACE / DOCUMENT / USER /\n * …\" so rebranding or re-skinning happens in ONE place. The monolith and other\n * deployments layer their own flourishes on top via {@link configureEntityRegistry}\n * (e.g. a custom workspace glyph, or brand names like \"MatterSpace\") without\n * forking this map.\n *\n * Deliberately dependency-light: lucide icon components + plain data. No store,\n * no app `@/` imports. Consumers render via {@link EntityIcon} or read\n * {@link getEntityIcon}/{@link getEntityLabel}.\n */\n\nimport React from 'react'\nimport {\n UserStar,\n Bell,\n Building2,\n Contact,\n Scale,\n Search,\n Tags,\n BookOpen,\n CaptionsOff,\n ChevronsDown,\n CircleUserRound,\n ClipboardList,\n Columns3Cog,\n Eye,\n EyeOff,\n FileQuestion,\n FolderOpen,\n FolderPlus,\n Hash,\n Info,\n LayoutGrid,\n LogOut,\n MessageSquare,\n MessageSquareLock,\n MessageSquareMore,\n MessageSquareOff,\n MessageSquarePlus,\n MessageSquareText,\n MessagesSquare,\n NotebookPen,\n NotebookText,\n CreditCard,\n Settings2,\n SquareM,\n SquarePlus,\n StickyNote,\n Upload,\n User,\n UserPlus,\n Users,\n Wrench,\n} from 'lucide-react'\n\n/** An icon component usable in the registry (lucide icons + custom SVG wrappers). */\nexport type EntityIconComponent = React.ComponentType<\n React.SVGAttributes<SVGElement> & { size?: number | string; className?: string }\n>\n\n/**\n * Entity Mappings — naming conventions + icons for every entity in the app.\n *\n * `WORKSPACE.ICONS.DEFAULT` is the generic `SquareM` here; the monolith injects a\n * rotated variant via {@link configureEntityRegistry}. The object is mutated in\n * place by that helper, so existing `ENTITY_MAPPINGS` references stay live.\n */\nexport const ENTITY_MAPPINGS = {\n PRODUCT: {\n NAMES: {\n SINGULAR: 'ARBI Docs',\n },\n ICONS: {\n DEFAULT: MessageSquareLock,\n },\n },\n SECTION: {\n NAMES: {\n SINGULAR: 'Section',\n },\n ICONS: {\n DEFAULT: ChevronsDown,\n },\n },\n WORKSPACE: {\n NAMES: {\n SINGULAR: 'Workspace',\n PLURAL: 'Workspaces',\n },\n ICONS: {\n DEFAULT: SquareM,\n NEW: SquarePlus,\n LIST: LayoutGrid,\n SETTINGS: Columns3Cog,\n },\n },\n CONVERSATION: {\n NAMES: {\n SINGULAR: 'Thread',\n PLURAL: 'Threads',\n NEW: 'New Thread',\n },\n ICONS: {\n DEFAULT: MessagesSquare,\n OFF: MessageSquareOff,\n ACTIVE: MessageSquareText,\n NEW: MessageSquarePlus,\n LIST: MessageSquareMore,\n },\n },\n DOCUMENT: {\n NAMES: {\n SINGULAR: 'File',\n PLURAL: 'Files',\n },\n ICONS: {\n DEFAULT: FolderOpen,\n OFF: CaptionsOff,\n },\n },\n VIEWER: {\n NAMES: {\n SINGULAR: 'Viewer',\n PLURAL: 'Viewers',\n },\n ICONS: {\n DEFAULT: Eye,\n OFF: EyeOff,\n },\n },\n TAG: {\n NAMES: {\n SINGULAR: 'Field',\n PLURAL: 'Fields',\n },\n ICONS: {\n DEFAULT: Hash,\n NEW: FolderPlus,\n },\n },\n ANNOTATION: {\n NAMES: {\n SINGULAR: 'Annotation',\n PLURAL: 'Annotations',\n },\n ICONS: {\n DEFAULT: StickyNote,\n NEW: StickyNote,\n },\n },\n // A tag of any kind — what the Tags page lists. TAG stays \"Field\": the Files page's custom\n // columns (labels and annotations as document fields) are named after it.\n ANY_TAG: {\n NAMES: {\n SINGULAR: 'Tag',\n PLURAL: 'Tags',\n },\n ICONS: {\n DEFAULT: Tags,\n },\n },\n // The kinds of TAG (a tag's `kind`): a label files things; an issue is a point in dispute; a\n // person and an organisation are entities the documents name; a saved search is a stored query.\n LABEL: {\n NAMES: {\n SINGULAR: 'Label',\n PLURAL: 'Labels',\n },\n ICONS: {\n DEFAULT: Tags,\n },\n },\n ISSUE: {\n NAMES: {\n SINGULAR: 'Issue',\n PLURAL: 'Issues',\n },\n ICONS: {\n DEFAULT: Scale,\n },\n },\n PERSON: {\n NAMES: {\n SINGULAR: 'Person',\n PLURAL: 'People',\n },\n ICONS: {\n DEFAULT: Contact,\n },\n },\n ORGANISATION: {\n NAMES: {\n SINGULAR: 'Organisation',\n PLURAL: 'Organisations',\n },\n ICONS: {\n DEFAULT: Building2,\n },\n },\n SAVED_SEARCH: {\n NAMES: {\n SINGULAR: 'Saved search',\n PLURAL: 'Saved searches',\n },\n ICONS: {\n DEFAULT: Search,\n },\n },\n // A statement the workspace knows — a date, a decision, a preference — written by hand or kept by\n // the assistant, optionally grounded in source passages (`facts`, fct-*). Distinct from\n // ANNOTATION, a value attached TO a document; a fact is workspace-scoped and stands alone.\n FACT: {\n NAMES: {\n SINGULAR: 'Fact',\n PLURAL: 'Facts',\n },\n ICONS: {\n DEFAULT: NotebookText,\n NEW: NotebookPen,\n },\n },\n USER: {\n NAMES: {\n SINGULAR: 'User',\n PLURAL: 'Users',\n },\n ICONS: {\n DEFAULT: User,\n NEW: UserPlus,\n SETTINGS: Settings2,\n },\n },\n WORKSPACEUSER: {\n NAMES: {\n SINGULAR: 'Member',\n PLURAL: 'Members',\n },\n ICONS: {\n DEFAULT: User,\n PLURAL: Users,\n NEW: UserPlus,\n SETTINGS: Settings2,\n },\n },\n CONTACT: {\n NAMES: {\n SINGULAR: 'Contact',\n PLURAL: 'Contacts',\n },\n ICONS: {\n // A starred person, not an address-book card: contacts here are the\n // people you talk to, and the star reads as \"your people\".\n DEFAULT: UserStar,\n NEW: UserPlus,\n },\n },\n TASK: {\n NAMES: {\n SINGULAR: 'Job',\n PLURAL: 'Jobs',\n },\n ICONS: {\n DEFAULT: ClipboardList,\n },\n },\n PROJECT: {\n NAMES: {\n SINGULAR: 'Project',\n PLURAL: 'Projects',\n },\n ICONS: {\n DEFAULT: CreditCard,\n },\n },\n SKILL: {\n NAMES: {\n SINGULAR: 'Skill',\n PLURAL: 'Skills',\n },\n ICONS: {\n DEFAULT: Wrench,\n },\n },\n ACCOUNT: {\n NAMES: {\n SINGULAR: 'Account',\n },\n ICONS: {\n DEFAULT: CircleUserRound,\n },\n },\n NOTIFICATIONS: {\n NAMES: {\n SINGULAR: 'Activity',\n PLURAL: 'Activities',\n },\n ICONS: {\n DEFAULT: Bell,\n },\n },\n MESSAGE: {\n NAMES: {\n SINGULAR: 'Message',\n PLURAL: 'Messages',\n },\n ICONS: {\n DEFAULT: MessageSquare,\n },\n },\n NOTIFICATION: {\n NAMES: {\n SINGULAR: 'Notification',\n PLURAL: 'Notifications',\n },\n ICONS: {\n DEFAULT: Bell,\n },\n },\n APP: {\n NAMES: {\n SINGULAR: 'Application',\n PLURAL: 'Applications',\n },\n ICONS: {\n DEFAULT: LayoutGrid,\n HOME: LayoutGrid,\n LOGOUT: LogOut,\n UPLOAD: Upload,\n },\n },\n HELP: {\n NAMES: {\n SINGULAR: 'Help',\n PLURAL: 'Help',\n },\n ICONS: {\n DEFAULT: MessageSquareLock,\n DOCS: BookOpen,\n FAQ: FileQuestion,\n ABOUT: Info,\n },\n },\n USERSHIELD: {\n NAMES: {\n SINGULAR: 'User Shield',\n PLURAL: 'User Shields',\n },\n ICONS: {\n DEFAULT: MessageSquareLock,\n },\n },\n}\n\n/** The set of registered entity types. */\nexport type EntityType = keyof typeof ENTITY_MAPPINGS\n\n/** Deployment override for a single entity: extra/replacement names and icons. */\nexport interface EntityRegistryOverride {\n NAMES?: Record<string, string>\n ICONS?: Record<string, EntityIconComponent>\n}\n\n/**\n * Layer deployment-specific names/icons onto the canonical registry — call once\n * at app startup. Merges in place (so live `ENTITY_MAPPINGS` refs pick it up) and\n * only touches the keys you pass, e.g.:\n *\n * ```ts\n * configureEntityRegistry({\n * WORKSPACE: { NAMES: { SINGULAR: 'MatterSpace' }, ICONS: { DEFAULT: RotatedSquareM } },\n * })\n * ```\n */\nexport function configureEntityRegistry(\n overrides: Partial<Record<EntityType, EntityRegistryOverride>>\n): void {\n for (const [type, def] of Object.entries(overrides)) {\n const target = ENTITY_MAPPINGS[type as EntityType] as {\n NAMES: Record<string, string>\n ICONS: Record<string, EntityIconComponent>\n }\n if (!target) continue\n if (def?.NAMES) Object.assign(target.NAMES, def.NAMES)\n if (def?.ICONS) Object.assign(target.ICONS, def.ICONS)\n }\n}\n\n/**\n * Resolve the icon component for an entity type + variant, falling back to the\n * type's DEFAULT icon for unknown variants.\n */\nexport const getEntityIcon = (\n entityType: EntityType,\n variant: string = 'DEFAULT'\n): EntityIconComponent | undefined => {\n const icons = ENTITY_MAPPINGS[entityType]?.ICONS as\n Record<string, EntityIconComponent> | undefined\n return icons?.[variant] || icons?.DEFAULT\n}\n\ninterface EntityNames {\n SINGULAR: string\n PLURAL?: string\n SHORT?: string\n NEW?: string\n}\n\n/**\n * Display label for an entity type. `SINGULAR` (default); `PLURAL`/`SHORT`/`NEW`\n * fall back to derivations of the singular when not explicitly configured.\n */\nexport const getEntityLabel = (\n entityType: EntityType,\n form: 'SINGULAR' | 'PLURAL' | 'SHORT' | 'NEW' = 'SINGULAR'\n): string => {\n const entityMapping = ENTITY_MAPPINGS[entityType]\n if (!entityMapping) return ''\n const names = entityMapping.NAMES as EntityNames\n const singularName = names.SINGULAR || ''\n\n if (form === 'NEW') return names.NEW !== undefined ? names.NEW : 'New ' + singularName\n if (form === 'SHORT')\n return names.SHORT !== undefined ? names.SHORT : singularName.substring(0, 3) + '.'\n if (form === 'PLURAL') return names.PLURAL !== undefined ? names.PLURAL : singularName + 's'\n return singularName\n}\n\ntype EntityIconProps = {\n entityType: EntityType\n variant?: string\n className?: string\n size?: number\n color?: string\n 'data-testid'?: string\n onClick?: () => void\n} & React.SVGAttributes<SVGElement>\n\n/**\n * Render an entity's icon — the recommended way to show entity glyphs so all\n * icon choices stay centralised.\n */\nexport const EntityIcon = ({ entityType, variant = 'DEFAULT', ...props }: EntityIconProps) => {\n const IconComponent = getEntityIcon(entityType, variant)\n return IconComponent ? React.createElement(IconComponent, props) : null\n}\n\n/** Centralised icons for private/shared visibility states. */\nexport const VISIBILITY_ICONS = {\n PRIVATE: MessageSquareLock,\n SHARED: Users,\n}\n\n/** Render the private/shared visibility glyph. */\nexport const VisibilityIcon = ({\n isShared,\n className,\n ...props\n}: {\n isShared: boolean\n className?: string\n size?: number\n color?: string\n 'data-testid'?: string\n onClick?: () => void\n} & React.SVGAttributes<SVGElement>) => {\n const IconComponent = isShared ? VISIBILITY_ICONS.SHARED : VISIBILITY_ICONS.PRIVATE\n return React.createElement(IconComponent, {\n ...props,\n className: [isShared ? 'text-secondary' : 'text-primary', className].filter(Boolean).join(' '),\n })\n}\n","'use client'\n\nimport * as React from 'react'\nimport * as SelectPrimitive from '@radix-ui/react-select'\nimport { Check, ChevronDown, ChevronUp } from 'lucide-react'\n\nimport { cn } from '../lib/utils'\nimport { getCollisionPadding } from '../lib/collision-padding'\nimport { usePortalContainer } from './portal-container'\n\nconst Select = SelectPrimitive.Root\n\nconst SelectGroup = SelectPrimitive.Group\n\nconst SelectValue = SelectPrimitive.Value\n\n/** Portals to the nearest PortalContainerProvider's container (a popped-out window), else `<body>`. */\nfunction SelectPortal({\n container,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Portal>) {\n const fallback = usePortalContainer()\n return <SelectPrimitive.Portal container={container ?? fallback} {...props} />\n}\n\nconst SelectTrigger = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n 'flex h-9 pointer-coarse:min-h-11 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm placeholder:text-muted-foreground/60 focus:outline-none focus-visible:border-ring/50 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1',\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDown className=\"h-4 w-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n))\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName\n\nconst SelectScrollUpButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollUpButton\n ref={ref}\n className={cn('flex cursor-default items-center justify-center py-1', className)}\n {...props}\n >\n <ChevronUp className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollUpButton>\n))\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName\n\nconst SelectScrollDownButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollDownButton\n ref={ref}\n className={cn('flex cursor-default items-center justify-center py-1', className)}\n {...props}\n >\n <ChevronDown className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollDownButton>\n))\nSelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName\n\nconst SelectContent = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = 'popper', ...props }, ref) => (\n <SelectPortal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n 'relative z-50 max-h-[min(24rem,var(--radix-select-content-available-height))] min-w-[8rem] max-w-[calc(100vw-1rem)] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n position === 'popper' &&\n 'data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1',\n className\n )}\n position={position}\n collisionPadding={getCollisionPadding()}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n 'p-1',\n position === 'popper' &&\n 'h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]'\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPortal>\n))\nSelectContent.displayName = SelectPrimitive.Content.displayName\n\nconst SelectLabel = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Label\n ref={ref}\n className={cn('py-1.5 pl-8 pr-2 text-sm font-semibold', className)}\n {...props}\n />\n))\nSelectLabel.displayName = SelectPrimitive.Label.displayName\n\nconst SelectItem = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 pointer-coarse:min-h-11 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n))\nSelectItem.displayName = SelectPrimitive.Item.displayName\n\nconst SelectSeparator = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator\n ref={ref}\n className={cn('-mx-1 my-1 h-px bg-muted', className)}\n {...props}\n />\n))\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName\n\nexport {\n Select,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectLabel,\n SelectItem,\n SelectSeparator,\n SelectScrollUpButton,\n SelectScrollDownButton,\n}\n","/**\n * VisibilityToggle Component\n *\n * Toggle for private/shared visibility state, the one control every shareable thing in the app uses\n * (documents, conversations, tags, facts, tasks). Supports single items and bulk operations. It takes\n * the items (with a shared field) and `onToggle` because the mutation differs by context. The name the\n * app gives a workspace (the entity registry's, or `workspaceLabel`) appears in its tooltips.\n */\n\nimport { useMemo } from 'react'\nimport { Share2 } from 'lucide-react'\nimport { getEntityLabel } from '../entities/registry'\nimport { IconToggle } from './IconToggle'\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from './select'\n\ninterface SharedItem {\n shared?: boolean | null\n is_shared?: boolean | null\n}\n\nexport interface VisibilityToggleProps {\n /** Explicit Me / Workspace selector for creation forms. */\n presentation?: 'toggle' | 'select'\n /** Single item or array of items with shared/is_shared field */\n items: SharedItem | SharedItem[]\n /** Called with true to share, false to unshare */\n onToggle: (shouldShare: boolean) => void\n disabled?: boolean\n /** Tooltip to show when disabled (e.g., \"You cannot unshare this resource\") */\n disabledTooltip?: string\n disablePrivate?: boolean\n showLabel?: boolean\n /** Set to false to disable tooltip (useful when nested inside another tooltip) */\n showTooltip?: boolean\n tooltipActive?: string\n tooltipInactive?: string\n tooltipMixed?: string\n /** The visible label (when `showLabel`); defaults to \"Visibility\". */\n label?: string\n /** What the app calls a workspace, for the default tooltips (default: the entity registry's). */\n workspaceLabel?: string\n 'data-testid'?: string\n}\n\nconst COLORS = {\n text: 'text-secondary',\n bg: 'bg-secondary',\n}\n\n// Helper to check if item is shared (supports both shared and is_shared fields)\nfunction isItemShared(item: SharedItem): boolean {\n return item.shared === true || item.is_shared === true\n}\n\nexport function VisibilityToggle({\n items,\n presentation = 'toggle',\n onToggle,\n disabled = false,\n disabledTooltip,\n disablePrivate = false,\n showLabel = true,\n showTooltip = true,\n tooltipActive,\n tooltipInactive,\n tooltipMixed,\n label = 'Visibility',\n workspaceLabel = getEntityLabel('WORKSPACE'),\n 'data-testid': dataTestId,\n}: VisibilityToggleProps) {\n // Normalize to array\n const itemsArray = useMemo(() => (Array.isArray(items) ? items : [items]), [items])\n\n // Calculate shared state\n const { isAllShared, isMixed } = useMemo(() => {\n if (itemsArray.length === 0) return { isAllShared: false, isMixed: false }\n\n const sharedCount = itemsArray.filter(isItemShared).length\n return {\n isAllShared: sharedCount === itemsArray.length,\n isMixed: sharedCount > 0 && sharedCount < itemsArray.length,\n }\n }, [itemsArray])\n\n const isSingle = itemsArray.length === 1\n\n // Default tooltips\n const defaultTooltipActive = `Hide${isSingle ? '' : ' all'} from ${workspaceLabel} members`\n const defaultTooltipInactive = `Make${isSingle ? '' : ' all'} visible to ${workspaceLabel} members`\n const defaultTooltipMixed = `Make all visible to ${workspaceLabel} members (some already shared)`\n\n const handleToggle = () => {\n // If all are shared, we want to unshare (unless disablePrivate)\n // If mixed or none shared, we want to share all\n const shouldShare = !isAllShared\n if (disablePrivate && !shouldShare) return\n onToggle(shouldShare)\n }\n\n if (presentation === 'select')\n return (\n <Select\n value={isMixed ? 'mixed' : isAllShared ? 'workspace' : 'me'}\n onValueChange={(value) => onToggle(value === 'workspace')}\n disabled={disabled || !itemsArray.length}\n >\n <SelectTrigger\n aria-label={label}\n data-testid={dataTestId}\n className=\"h-7 w-auto gap-1 border-0 bg-transparent px-1 text-xs font-normal text-muted-foreground shadow-none hover:bg-muted pointer-coarse:h-11\"\n >\n {showLabel && <span>{label}:</span>}\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"me\" disabled={disablePrivate}>\n Me\n </SelectItem>\n <SelectItem value=\"workspace\">Workspace</SelectItem>\n {isMixed && (\n <SelectItem value=\"mixed\" disabled>\n Mixed\n </SelectItem>\n )}\n </SelectContent>\n </Select>\n )\n\n return (\n <IconToggle\n icon={Share2}\n isActive={isAllShared}\n onToggle={handleToggle}\n colors={COLORS}\n inactiveColors={{ text: 'text-primary', bg: 'bg-primary/10' }}\n disabled={disabled || itemsArray.length === 0}\n disabledTooltip={disabledTooltip}\n showLabel={showLabel}\n showTooltip={showTooltip}\n label={label}\n isMixed={isMixed}\n tooltipActive={tooltipActive || defaultTooltipActive}\n tooltipInactive={tooltipInactive || defaultTooltipInactive}\n tooltipMixed={tooltipMixed || defaultTooltipMixed}\n data-testid={dataTestId}\n />\n )\n}\n","/**\n * VerifiedToggle Component\n *\n * Switch-style toggle for a fact's human-verified (`confirmed`) state — the\n * same IconToggle affordance the VisibilityToggle uses for sharing, so\n * \"Verified\" reads as a toggle in the facts table rather than a radio/checkbox.\n */\n\nimport { CheckCircle2 } from 'lucide-react'\nimport { IconToggle } from './IconToggle'\n\ninterface VerifiedToggleProps {\n verified: boolean\n /** Called with the desired next state (true = verify, false = unverify). */\n onToggle: (shouldVerify: boolean) => void\n disabled?: boolean\n showLabel?: boolean\n /** Set to false to disable the tooltip (e.g. when nested in another tooltip). */\n showTooltip?: boolean\n tooltipActive?: string\n tooltipInactive?: string\n 'data-testid'?: string\n}\n\nconst COLORS = {\n text: 'text-green-text',\n bg: 'bg-green-text',\n}\n\nexport function VerifiedToggle({\n verified,\n onToggle,\n disabled = false,\n showLabel = true,\n showTooltip = true,\n tooltipActive,\n tooltipInactive,\n 'data-testid': dataTestId,\n}: VerifiedToggleProps) {\n return (\n <IconToggle\n icon={CheckCircle2}\n isActive={verified}\n onToggle={onToggle}\n colors={COLORS}\n disabled={disabled}\n showLabel={showLabel}\n label=\"Verified\"\n showTooltip={showTooltip}\n tooltipActive={tooltipActive || 'Verified by a human — click to unverify'}\n tooltipInactive={tooltipInactive || 'Not verified — click to verify'}\n data-testid={dataTestId}\n />\n )\n}\n","/** A timestamp as people read it: \"Today, 14:05\", \"Yesterday\", \"Aug 18\" (with the year once it is not this one). */\n\n/**\n * Format a date string for friendly display with Today/Yesterday context\n */\nexport function formatFriendlyDate(dateString: string, includeTime: boolean = true): string {\n if (!dateString) return ''\n\n try {\n // If we already have a properly formatted timestamp (with \"Today\", etc.), just return it\n if (\n dateString.includes('Today') ||\n dateString.includes('Yesterday') ||\n /\\w+ \\d+, \\d+:\\d+:\\d+/.test(dateString)\n ) {\n return dateString\n }\n\n // For HH:MM or HH:MM:SS format strings, just return them as is - no formatting\n if (/^\\d{1,2}:\\d{2}(:\\d{2})?$/.test(dateString)) {\n return dateString\n }\n\n // Server sends ISO-8601 timestamps with Z suffix (e.g., '2023-04-30T15:30:45Z')\n // indicating they are in UTC time, which browser handles correctly\n // The Z suffix tells browsers to interpret the time as UTC and convert to local time\n const date = new Date(dateString)\n\n if (isNaN(date.getTime())) return dateString // Fallback if not valid date\n\n // Format the time part (no seconds)\n const timeOptions: Intl.DateTimeFormatOptions = { hour: '2-digit', minute: '2-digit' }\n const timeString = date.toLocaleTimeString([], timeOptions)\n\n // Get 'today' and 'yesterday' in the local timezone\n const now = new Date()\n const today = now.toDateString()\n const yesterday = new Date(now)\n yesterday.setDate(yesterday.getDate() - 1)\n\n // Compare date parts to categorize the timestamp\n if (date.toDateString() === today) {\n return includeTime ? `Today, ${timeString}` : 'today'\n } else if (date.toDateString() === yesterday.toDateString()) {\n return includeTime ? `Yesterday, ${timeString}` : 'yesterday'\n } else {\n // Format the date for older dates\n const dateOptions: Intl.DateTimeFormatOptions = {\n month: 'short',\n day: 'numeric',\n }\n\n // Add year if it's not the current year\n if (date.getFullYear() !== now.getFullYear()) {\n dateOptions.year = 'numeric'\n }\n\n const formattedDate = date.toLocaleDateString([], dateOptions)\n return includeTime ? `${formattedDate}, ${timeString}` : formattedDate\n }\n } catch {\n return dateString\n }\n}\n","/**\n * markdownToPlainText\n *\n * Cheap, dependency-free markdown → plain-text flattener for dense UI surfaces\n * (e.g. a single AG Grid cell) where we want a readable one-paragraph preview,\n * NOT rendered markdown. It strips the common markers our AI summaries emit\n * (bullets, headings, emphasis, inline code, links, blockquotes) and collapses\n * whitespace to a single line.\n *\n * Deliberately regex-based and O(n): it is safe to call per visible grid cell\n * (a valueFormatter) without the cost of a real markdown parser/renderer, so it\n * has no per-row-count impact on large tables. For full rich rendering use the\n * document viewer / review form, which render one document at a time.\n */\nexport function markdownToPlainText(input: string | null | undefined): string {\n if (!input) return ''\n return (\n input\n // Fenced code fences ``` → drop the fence lines, keep inner text\n .replace(/```[^\\n]*\\n?/g, '')\n // Images ![alt](url) → alt\n .replace(/!\\[([^\\]]*)\\]\\([^)]*\\)/g, '$1')\n // Links [text](url) → text\n .replace(/\\[([^\\]]+)\\]\\([^)]*\\)/g, '$1')\n // Leading block markers at the start of a line: headings, blockquotes,\n // list bullets (-, *, +) and ordered list numbers.\n .replace(/^[ \\t]*#{1,6}[ \\t]+/gm, '')\n .replace(/^[ \\t]*>[ \\t]?/gm, '')\n .replace(/^[ \\t]*([-*+]|\\d+[.)])[ \\t]+/gm, '')\n // Emphasis / bold markers **x** __x__ *x* _x_ → x\n .replace(/(\\*\\*|__)(.*?)\\1/g, '$2')\n .replace(/(\\*|_)(.*?)\\1/g, '$2')\n // Inline code `x` → x\n .replace(/`([^`]*)`/g, '$1')\n // Collapse all whitespace (incl. newlines) to single spaces\n .replace(/\\s+/g, ' ')\n .trim()\n )\n}\n\n// A GFM delimiter row such as |---|:---:| (it must contain a pipe, so a lone --- is a rule)\nconst TABLE_DELIMITER_ROW = /^\\s*\\|?\\s*:?-{3,}:?\\s*(\\|\\s*:?-{3,}:?\\s*)*\\|?\\s*$/\n\n/**\n * Split one pipe-table row into its cells. Escaped \\| stays a literal pipe.\n */\nfunction splitTableRow(line: string): string[] {\n return line\n .trim()\n .replace(/^\\|/, '')\n .replace(/(?<!\\\\)\\|$/, '')\n .split(/(?<!\\\\)\\|/)\n .map((cell) => cell.trim().replace(/\\\\\\|/g, '|'))\n}\n\n/**\n * Replace each GFM pipe table with one tab-separated line per row. Tabs paste into a\n * spreadsheet as columns and read as aligned text elsewhere, where the pipes and the\n * dashed separator row would not.\n */\nfunction flattenMarkdownTables(input: string): string {\n const lines = input.split('\\n')\n const out: string[] = []\n for (let i = 0; i < lines.length; i++) {\n const isTableStart =\n lines[i].includes('|') &&\n i + 1 < lines.length &&\n lines[i + 1].includes('|') &&\n TABLE_DELIMITER_ROW.test(lines[i + 1])\n if (!isTableStart) {\n out.push(lines[i])\n continue\n }\n out.push(splitTableRow(lines[i]).join('\\t'))\n i += 1 // skip the delimiter row\n while (i + 1 < lines.length && lines[i + 1].includes('|') && lines[i + 1].trim()) {\n i += 1\n out.push(splitTableRow(lines[i]).join('\\t'))\n }\n }\n return out.join('\\n')\n}\n\n/**\n * Line-preserving variant of markdownToPlainText for copying an answer as plain\n * text. Removes the same markup but keeps paragraph breaks and list lines, so a\n * pasted answer keeps its shape. Tables become tab-separated rows and horizontal\n * rules are dropped. List numbers and bullets stay because they are visible\n * content. Link URLs are kept in parentheses so nothing is lost.\n */\nexport function markdownToPlainTextBlocks(input: string | null | undefined): string {\n if (!input) return ''\n return (\n flattenMarkdownTables(input)\n .replace(/^[ \\t]*([-*_])([ \\t]*\\1){2,}[ \\t]*$/gm, '')\n .replace(/```[^\\n]*\\n?/g, '')\n .replace(/!\\[([^\\]]*)\\]\\([^)]*\\)/g, '$1')\n .replace(/\\[([^\\]]+)\\]\\(([^)\\s]+)\\)/g, '$1 ($2)')\n .replace(/^[ \\t]*#{1,6}[ \\t]+/gm, '')\n .replace(/^[ \\t]*>[ \\t]?/gm, '')\n // Emphasis only when the markers hug non-space text, so \"* bullet\" and\n // snake_case identifiers are left alone\n .replace(/(\\*\\*|__)(?=\\S)(.+?)(?<=\\S)\\1/g, '$2')\n .replace(/\\*(?=\\S)(.+?)(?<=\\S)\\*/g, '$1')\n .replace(/(^|[^\\w])_(?=\\S)(.+?)(?<=\\S)_(?!\\w)/g, '$1$2')\n .replace(/`([^`]*)`/g, '$1')\n .replace(/[ \\t]+\\n/g, '\\n')\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim()\n )\n}\n","/**\n * Dictation for every `Input`/`Textarea` with a `dictate` prop, instead of threading a\n * `transcribe` function through each field. A host gives it once, as the host configuration's\n * `dictate` (`<ArbiHost config={{ dictate: { transcribe, onError } }}>`); every `dictate`-enabled\n * field downstream then just works. Without it fields render without a mic button: dictation is a\n * progressive enhancement, never a hard requirement.\n */\n\nimport { useHostConfigRecord } from '../host/context'\n\nexport interface DictateContextValue {\n transcribe: (blob: Blob) => Promise<string>\n onError?: (message: string) => void\n}\n\nexport function useDictateContext(): DictateContextValue | null {\n return (useHostConfigRecord().dictate as DictateContextValue | undefined) ?? null\n}\n","import * as React from 'react'\nimport { cn } from '../lib/utils'\nimport { InlineMicButton } from '../documents/InlineMicButton'\nimport { useDictateContext } from './DictateContext'\n\nexport interface InputProps extends React.ComponentProps<'input'> {\n /** Adds a small dictate-instead-of-type button inside the field's right\n * edge (visible only while focused, or mid-recording) that appends\n * transcribed speech to the field's value. Uses the host configuration's `dictate`\n * (the host's transcribe endpoint) — with none, this is\n * a no-op (no button renders). Not meant for password/search/numeric/code\n * fields — opt in per field, not on by default. */\n dictate?: boolean\n}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, dictate, onFocus, onBlur, ...props }, forwardedRef) => {\n const dictateCtx = useDictateContext()\n const [focused, setFocused] = React.useState(false)\n const innerRef = React.useRef<HTMLInputElement>(null)\n React.useImperativeHandle(forwardedRef, () => innerRef.current as HTMLInputElement)\n\n const showDictate = dictate && !!dictateCtx && !props.disabled && !props.readOnly\n\n const input = (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(\n 'flex h-9 pointer-coarse:h-11 w-full rounded-md border border-input bg-background px-3 py-1 text-base shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground/60 focus-visible:outline-none focus-visible:border-ring/50 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm',\n showDictate && 'pr-9',\n className\n )}\n ref={innerRef}\n onFocus={(e) => {\n setFocused(true)\n onFocus?.(e)\n }}\n onBlur={(e) => {\n setFocused(false)\n onBlur?.(e)\n }}\n {...props}\n />\n )\n\n if (!showDictate) return input\n\n return (\n <div className=\"relative w-full\">\n {input}\n <InlineMicButton\n focused={focused}\n transcribe={dictateCtx.transcribe}\n onError={dictateCtx.onError}\n className=\"absolute right-1.5 top-1/2 -translate-y-1/2\"\n onTranscript={(text) => {\n const el = innerRef.current\n if (!el) return\n const next = el.value ? `${el.value} ${text}` : text\n const setter = Object.getOwnPropertyDescriptor(\n window.HTMLInputElement.prototype,\n 'value'\n )?.set\n setter?.call(el, next)\n el.dispatchEvent(new Event('input', { bubbles: true }))\n }}\n />\n </div>\n )\n }\n)\nInput.displayName = 'Input'\n\nexport { Input }\n","import * as React from 'react'\n\nimport { cn } from '../lib/utils'\nimport { InlineMicButton } from '../documents/InlineMicButton'\nimport { useDictateContext } from './DictateContext'\n\nexport interface TextareaProps extends React.ComponentProps<'textarea'> {\n /** Adds a small dictate-instead-of-type button inside the field's top-right\n * corner (visible only while focused, or mid-recording) that appends\n * transcribed speech to the field's value. Uses the host configuration's `dictate`\n * (the host's transcribe endpoint) — with none, this is\n * a no-op (no button renders). */\n dictate?: boolean\n}\n\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ className, dictate, onFocus, onBlur, ...props }, forwardedRef) => {\n const dictateCtx = useDictateContext()\n const [focused, setFocused] = React.useState(false)\n const innerRef = React.useRef<HTMLTextAreaElement>(null)\n React.useImperativeHandle(forwardedRef, () => innerRef.current as HTMLTextAreaElement)\n\n const showDictate = dictate && !!dictateCtx && !props.disabled && !props.readOnly\n\n const textarea = (\n <textarea\n className={cn(\n 'flex min-h-[60px] w-full rounded-md border border-input bg-background px-3 py-2 text-base shadow-sm placeholder:text-muted-foreground/60 focus-visible:outline-none focus-visible:border-ring/50 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm',\n showDictate && 'pr-9',\n className\n )}\n ref={innerRef}\n onFocus={(e) => {\n setFocused(true)\n onFocus?.(e)\n }}\n onBlur={(e) => {\n setFocused(false)\n onBlur?.(e)\n }}\n {...props}\n />\n )\n\n if (!showDictate) return textarea\n\n return (\n <div className=\"relative w-full\">\n {textarea}\n <InlineMicButton\n focused={focused}\n transcribe={dictateCtx.transcribe}\n onError={dictateCtx.onError}\n className=\"absolute right-1.5 top-1.5\"\n onTranscript={(text) => {\n const el = innerRef.current\n if (!el) return\n const next = el.value ? `${el.value} ${text}` : text\n const setter = Object.getOwnPropertyDescriptor(\n window.HTMLTextAreaElement.prototype,\n 'value'\n )?.set\n setter?.call(el, next)\n el.dispatchEvent(new Event('input', { bubbles: true }))\n }}\n />\n </div>\n )\n }\n)\nTextarea.displayName = 'Textarea'\n\nexport { Textarea }\n","/**\n * DebouncedInput Component\n *\n * A text input that debounces onChange calls to reduce API calls.\n * Supports both single-line Input and multi-line Textarea.\n * Reverts to prop value on blur if local value differs (handles validation failures).\n */\n\nimport { Input } from './input'\nimport { Textarea } from './textarea'\nimport { useState, useCallback, useEffect, useRef } from 'react'\n\nexport interface DebouncedInputProps {\n /** Current value */\n value: string\n /** Callback when value changes (debounced) */\n onChange: (value: string) => void\n /** Whether the input is disabled */\n disabled?: boolean\n /** Input type (text, number, etc.) */\n type?: string\n /** Whether to render as textarea */\n multiline?: boolean\n /** Additional CSS classes */\n className?: string\n /** Debounce delay in milliseconds */\n debounceMs?: number\n /** Placeholder text */\n placeholder?: string\n /** Auto-resize textarea to fit content (multiline only) */\n autoResize?: boolean\n /** Min height in pixels for auto-resize (default: 28, ~1 row) */\n minHeight?: number\n /** Max height in pixels for auto-resize (default: 72, ~3 rows) */\n maxHeight?: number\n}\n\nexport function DebouncedInput({\n value,\n onChange,\n disabled,\n type = 'text',\n multiline = false,\n className,\n debounceMs = 500,\n placeholder,\n autoResize = true,\n minHeight = 28,\n maxHeight = 72,\n}: DebouncedInputProps) {\n const [localValue, setLocalValue] = useState(value)\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined)\n const pendingRef = useRef<string | null>(null)\n const textareaRef = useRef<HTMLTextAreaElement>(null)\n\n // Auto-resize textarea based on content\n const adjustHeight = useCallback(() => {\n const textarea = textareaRef.current\n if (!textarea || !autoResize) return\n\n // Reset height to measure scrollHeight accurately\n textarea.style.height = 'auto'\n // Clamp between min and max\n const newHeight = Math.min(Math.max(textarea.scrollHeight, minHeight), maxHeight)\n textarea.style.height = `${newHeight}px`\n }, [autoResize, minHeight, maxHeight])\n\n // Sync from the prop (e.g. navigating between items) — but NEVER while the user\n // has an uncommitted edit. The documents list refetches in the background, and\n // an unguarded sync reset the box mid-word: typing \"2000-01-02\" landed as\n // \"2000-\", losing characters with no indication anything had happened.\n //\n // `pendingRef` is set on every keystroke and cleared when the edit commits, so\n // it is exactly \"the user is mid-edit\". Once committed, syncing resumes, which\n // keeps the revert-on-rejected-save behaviour intact.\n useEffect(() => {\n if (pendingRef.current !== null) return\n setLocalValue(value)\n }, [value])\n\n // Adjust height when value changes\n useEffect(() => {\n if (multiline) {\n adjustHeight()\n }\n }, [localValue, multiline, adjustHeight])\n\n // Timer + not-yet-committed value live in refs, NOT in a useMemo closure.\n // Callers pass an inline arrow for `onChange`, so a useMemo keyed on it was\n // rebuilt on every render and lost its `timeoutId`: clearTimeout() then cleared\n // nothing, and there was no way to flush a pending edit from anywhere else.\n // Hold the latest onChange without re-arming the timer every render.\n const onChangeRef = useRef(onChange)\n useEffect(() => {\n onChangeRef.current = onChange\n }, [onChange])\n\n /** Commit a queued edit immediately. Returns false when nothing was queued. */\n const flushPendingChange = useCallback(() => {\n if (pendingRef.current === null) return false\n const pending = pendingRef.current\n pendingRef.current = null\n clearTimeout(timeoutRef.current)\n onChangeRef.current(pending)\n return true\n }, [])\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n const newValue = e.target.value\n setLocalValue(newValue)\n pendingRef.current = newValue\n clearTimeout(timeoutRef.current)\n timeoutRef.current = setTimeout(() => {\n pendingRef.current = null\n onChangeRef.current(newValue)\n }, debounceMs)\n },\n [debounceMs]\n )\n\n // On unmount, COMMIT a queued edit rather than dropping it. A background\n // refetch (or navigating away) can replace this input while the debounce is\n // still armed; the timer and the pending value die with the old instance, and\n // the fresh one blurs with nothing queued — so the edit disappeared with no\n // request at all. Refs are read in cleanup, so this is safe: no state is set on\n // an unmounted component.\n useEffect(\n () => () => {\n const pending = pendingRef.current\n pendingRef.current = null\n clearTimeout(timeoutRef.current)\n if (pending !== null) onChangeRef.current(pending)\n },\n []\n )\n\n // Blur COMMITS a queued edit before any revert is considered. Reverting first\n // silently threw away anything typed inside the debounce window: tab away\n // quickly and the edit vanished with no request and no error.\n //\n // The revert still applies when nothing is queued, which is its actual purpose\n // — after a rejected save the prop still holds the last valid value, so\n // snapping back to it clears the invalid text left in the box.\n const handleBlur = useCallback(() => {\n // Commit first, then fall back to the prop. Both steps matter:\n // - flushing stops an edit typed inside the debounce window being discarded;\n // - snapping back to `value` handles a REJECTED save, where the parent never\n // changes the prop (e.g. a malformed date fails validation and no request\n // is sent). Without it the box keeps showing text that was never saved.\n // On a successful save the parent updates `value` from the response and the\n // sync effect brings the committed value straight back in.\n flushPendingChange()\n if (localValue !== value) {\n setLocalValue(value)\n }\n }, [flushPendingChange, localValue, value])\n\n if (multiline) {\n return (\n <Textarea\n ref={textareaRef}\n value={localValue}\n onChange={handleChange}\n onBlur={handleBlur}\n disabled={disabled}\n className={`resize-y ${className || ''}`}\n placeholder={placeholder}\n style={{ minHeight: `${minHeight}px` }}\n />\n )\n }\n\n return (\n <Input\n type={type}\n value={localValue}\n onChange={handleChange}\n onBlur={handleBlur}\n disabled={disabled}\n className={className}\n placeholder={placeholder}\n />\n )\n}\n","import * as React from 'react'\nimport * as HoverCardPrimitive from '@radix-ui/react-hover-card'\n\nimport { cn } from '../lib/utils'\nimport { getCollisionPadding } from '../lib/collision-padding'\nimport { usePortalContainer } from './portal-container'\n\nconst HoverCard = HoverCardPrimitive.Root\n\nconst HoverCardTrigger = HoverCardPrimitive.Trigger\n\n/** Portals to the nearest PortalContainerProvider's container (a popped-out window), else `<body>`. */\nfunction HoverCardPortal({\n container,\n ...props\n}: React.ComponentProps<typeof HoverCardPrimitive.Portal>) {\n const fallback = usePortalContainer()\n return <HoverCardPrimitive.Portal container={container ?? fallback} {...props} />\n}\n\nconst HoverCardContent = React.forwardRef<\n React.ElementRef<typeof HoverCardPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof HoverCardPrimitive.Content>\n>(({ className, align = 'center', sideOffset = 4, ...props }, ref) => (\n <HoverCardPortal>\n <HoverCardPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n collisionPadding={getCollisionPadding()}\n className={cn(\n 'z-50 w-64 max-w-[calc(100vw-1rem)] rounded-md border bg-popover p-4 text-popover-foreground shadow-lg outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-hover-card-content-transform-origin]',\n className\n )}\n {...props}\n />\n </HoverCardPortal>\n))\nHoverCardContent.displayName = HoverCardPrimitive.Content.displayName\n\nexport { HoverCard, HoverCardTrigger, HoverCardContent }\n","import * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\n\nimport { cn } from '../lib/utils'\n\n/**\n * Clean-ARBI design contract rule 3: borderless by default; shadows\n * only when an element needs to read as elevated/floating.\n *\n * - `flat` (default): just a rounded surface, no border, no shadow.\n * Separation comes from background + spacing.\n * - `outline`: adds a single border for surfaces that need a visible\n * edge (e.g. selectable list cards, embedded panels).\n * - `elevated`: border + a subtle shadow for cards that should lift.\n *\n * `min-w-0` lets a card be a grid/flex item narrower than its content (a truncated row inside\n * must not widen the track and push the page into horizontal scroll).\n *\n * Self-styled consumers that pass their own border/shadow classes keep\n * working unchanged on the default `flat` base.\n */\nconst cardVariants = cva('min-w-0 rounded-lg bg-card text-card-foreground', {\n variants: {\n variant: {\n flat: '',\n outline: 'border',\n elevated: 'border shadow-sm',\n },\n },\n defaultVariants: {\n variant: 'flat',\n },\n})\n\nexport interface CardProps\n extends React.HTMLAttributes<HTMLDivElement>, VariantProps<typeof cardVariants> {}\n\nconst Card = React.forwardRef<HTMLDivElement, CardProps>(\n ({ className, variant, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"card\"\n className={cn(cardVariants({ variant }), className)}\n {...props}\n />\n )\n)\nCard.displayName = 'Card'\n\nconst CardHeader = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"card-header\"\n className={cn('flex flex-col space-y-1.5 p-6', className)}\n {...props}\n />\n )\n)\nCardHeader.displayName = 'CardHeader'\n\nconst CardTitle = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"card-title\"\n className={cn('font-semibold leading-none tracking-tight', className)}\n {...props}\n />\n )\n)\nCardTitle.displayName = 'CardTitle'\n\nconst CardDescription = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"card-description\"\n className={cn('text-sm text-muted-foreground', className)}\n {...props}\n />\n )\n)\nCardDescription.displayName = 'CardDescription'\n\nconst CardContent = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} data-slot=\"card-content\" className={cn('p-6 pt-0', className)} {...props} />\n )\n)\nCardContent.displayName = 'CardContent'\n\nconst CardFooter = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"card-footer\"\n className={cn('flex items-center p-6 pt-0', className)}\n {...props}\n />\n )\n)\nCardFooter.displayName = 'CardFooter'\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent, cardVariants }\n","'use client'\n\nimport * as React from 'react'\n\ninterface LabelProps extends React.LabelHTMLAttributes<HTMLLabelElement> {\n className?: string\n}\n\nconst Label = React.forwardRef<HTMLLabelElement, LabelProps>(({ className, ...props }, ref) => (\n <label\n ref={ref}\n className={`text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70 ${className || ''}`}\n {...props}\n />\n))\n\nLabel.displayName = 'Label'\n\nexport { Label }\n","import * as React from 'react'\nimport * as SeparatorPrimitive from '@radix-ui/react-separator'\n\nimport { cn } from '../lib/utils'\n\nconst Separator = React.forwardRef<\n React.ElementRef<typeof SeparatorPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\n>(({ className, orientation = 'horizontal', decorative = true, ...props }, ref) => (\n <SeparatorPrimitive.Root\n ref={ref}\n decorative={decorative}\n orientation={orientation}\n className={cn(\n 'shrink-0 bg-border',\n orientation === 'horizontal' ? 'h-[1px] w-full' : 'h-full w-[1px]',\n className\n )}\n {...props}\n />\n))\nSeparator.displayName = SeparatorPrimitive.Root.displayName\n\nexport { Separator }\n","import * as CollapsiblePrimitive from '@radix-ui/react-collapsible'\n\nconst Collapsible = CollapsiblePrimitive.Root\n\nconst CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger\n\nconst CollapsibleContent = CollapsiblePrimitive.CollapsibleContent\n\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent }\n","import * as React from 'react'\nimport * as ProgressPrimitive from '@radix-ui/react-progress'\n\nimport { cn } from '../lib/utils'\n\nconst Progress = React.forwardRef<\n React.ElementRef<typeof ProgressPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof ProgressPrimitive.Root>\n>(({ className, value, ...props }, ref) => (\n <ProgressPrimitive.Root\n ref={ref}\n className={cn('relative h-2 w-full overflow-hidden rounded-full bg-primary/20', className)}\n {...props}\n >\n <ProgressPrimitive.Indicator\n className=\"h-full w-full flex-1 bg-primary transition-all\"\n style={{ transform: `translateX(-${100 - (value || 0)}%)` }}\n />\n </ProgressPrimitive.Root>\n))\nProgress.displayName = ProgressPrimitive.Root.displayName\n\nexport { Progress }\n","import * as React from 'react'\nimport * as RadioGroupPrimitive from '@radix-ui/react-radio-group'\nimport { Circle } from 'lucide-react'\n\nimport { cn } from '../lib/utils'\n\nconst RadioGroup = React.forwardRef<\n React.ElementRef<typeof RadioGroupPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Root>\n>(({ className, ...props }, ref) => {\n return <RadioGroupPrimitive.Root className={cn('grid gap-2', className)} {...props} ref={ref} />\n})\nRadioGroup.displayName = RadioGroupPrimitive.Root.displayName\n\nconst RadioGroupItem = React.forwardRef<\n React.ElementRef<typeof RadioGroupPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Item>\n>(({ className, ...props }, ref) => {\n return (\n <RadioGroupPrimitive.Item\n ref={ref}\n className={cn(\n \"relative aspect-square h-4 w-4 rounded-full border border-primary text-primary after:absolute after:left-1/2 after:top-1/2 after:hidden after:size-11 after:-translate-x-1/2 after:-translate-y-1/2 after:content-[''] pointer-coarse:after:block focus:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n {...props}\n >\n <RadioGroupPrimitive.Indicator className=\"flex items-center justify-center\">\n <Circle className=\"h-2.5 w-2.5 fill-current text-current\" />\n </RadioGroupPrimitive.Indicator>\n </RadioGroupPrimitive.Item>\n )\n})\nRadioGroupItem.displayName = RadioGroupPrimitive.Item.displayName\n\nexport { RadioGroup, RadioGroupItem }\n","import * as React from 'react'\nimport * as SwitchPrimitives from '@radix-ui/react-switch'\n\nimport { cn } from '../lib/utils'\n\nconst Switch = React.forwardRef<\n React.ElementRef<typeof SwitchPrimitives.Root>,\n React.ComponentPropsWithoutRef<typeof SwitchPrimitives.Root>\n>(({ className, ...props }, ref) => (\n <SwitchPrimitives.Root\n className={cn(\n \"peer relative inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input dark:data-[state=unchecked]:bg-muted-foreground/45 after:absolute after:left-1/2 after:top-1/2 after:hidden after:size-11 after:-translate-x-1/2 after:-translate-y-1/2 after:content-[''] pointer-coarse:after:block\",\n className\n )}\n {...props}\n ref={ref}\n >\n <SwitchPrimitives.Thumb\n className={cn(\n 'pointer-events-none block h-4 w-4 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0'\n )}\n />\n </SwitchPrimitives.Root>\n))\nSwitch.displayName = SwitchPrimitives.Root.displayName\n\nexport { Switch }\n","import * as React from 'react'\nimport * as TabsPrimitive from '@radix-ui/react-tabs'\n\nimport { cn } from '../lib/utils'\n\nconst Tabs = TabsPrimitive.Root\n\nconst TabsList = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.List\n ref={ref}\n className={cn(\n 'inline-flex h-9 pointer-coarse:h-auto items-center justify-center rounded-lg bg-muted p-1 text-muted-foreground',\n className\n )}\n {...props}\n />\n))\nTabsList.displayName = TabsPrimitive.List.displayName\n\nconst TabsTrigger = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Trigger\n ref={ref}\n className={cn(\n 'inline-flex items-center justify-center whitespace-nowrap rounded-md px-3 py-1 text-sm pointer-coarse:min-h-11 font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow',\n className\n )}\n {...props}\n />\n))\nTabsTrigger.displayName = TabsPrimitive.Trigger.displayName\n\nconst TabsContent = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Content\n ref={ref}\n className={cn(\n 'mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n className\n )}\n {...props}\n />\n))\nTabsContent.displayName = TabsPrimitive.Content.displayName\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent }\n","import * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nconst Table = React.forwardRef<HTMLTableElement, React.HTMLAttributes<HTMLTableElement>>(\n ({ className, ...props }, ref) => (\n <div className=\"relative w-full overflow-auto\">\n <table ref={ref} className={cn('w-full caption-bottom text-sm', className)} {...props} />\n </div>\n )\n)\nTable.displayName = 'Table'\n\nconst TableHeader = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <thead ref={ref} className={cn('[&_tr]:border-b', className)} {...props} />\n))\nTableHeader.displayName = 'TableHeader'\n\nconst TableBody = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tbody ref={ref} className={cn('[&_tr:last-child]:border-0', className)} {...props} />\n))\nTableBody.displayName = 'TableBody'\n\nconst TableFooter = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tfoot\n ref={ref}\n className={cn('border-t bg-muted/50 font-medium [&>tr]:last:border-b-0', className)}\n {...props}\n />\n))\nTableFooter.displayName = 'TableFooter'\n\nconst TableRow = React.forwardRef<HTMLTableRowElement, React.HTMLAttributes<HTMLTableRowElement>>(\n ({ className, ...props }, ref) => (\n <tr\n ref={ref}\n className={cn(\n 'border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted',\n className\n )}\n {...props}\n />\n )\n)\nTableRow.displayName = 'TableRow'\n\ninterface TableHeadProps extends React.ThHTMLAttributes<HTMLTableCellElement> {\n className?: string\n}\n\nconst TableHead = React.forwardRef<HTMLTableCellElement, TableHeadProps>(\n ({ className, ...props }, ref) => (\n <th\n ref={ref}\n className={cn(\n 'h-10 px-2 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]',\n className\n )}\n {...props}\n />\n )\n)\nTableHead.displayName = 'TableHead'\n\ninterface TableCellProps extends React.TdHTMLAttributes<HTMLTableCellElement> {\n className?: string\n}\n\nconst TableCell = React.forwardRef<HTMLTableCellElement, TableCellProps>(\n ({ className, ...props }, ref) => (\n <td\n ref={ref}\n className={cn(\n 'p-2 align-middle [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]',\n className\n )}\n {...props}\n />\n )\n)\nTableCell.displayName = 'TableCell'\n\nconst TableCaption = React.forwardRef<\n HTMLTableCaptionElement,\n React.HTMLAttributes<HTMLTableCaptionElement>\n>(({ className, ...props }, ref) => (\n <caption ref={ref} className={cn('mt-4 text-sm text-muted-foreground', className)} {...props} />\n))\nTableCaption.displayName = 'TableCaption'\n\nexport { Table, TableHeader, TableBody, TableFooter, TableHead, TableRow, TableCell, TableCaption }\n","import * as React from 'react'\nimport * as SliderPrimitive from '@radix-ui/react-slider'\n\nimport { cn } from '../lib/utils'\n\ninterface SliderProps extends React.ComponentPropsWithoutRef<typeof SliderPrimitive.Root> {\n rangeClassName?: string\n}\n\nconst Slider = React.forwardRef<React.ElementRef<typeof SliderPrimitive.Root>, SliderProps>(\n ({ className, rangeClassName, ...props }, ref) => (\n <SliderPrimitive.Root\n ref={ref}\n className={cn('relative flex w-full touch-none select-none items-center', className)}\n {...props}\n >\n <SliderPrimitive.Track className=\"relative h-1.5 w-full grow overflow-hidden rounded-full bg-primary/20\">\n <SliderPrimitive.Range className={cn('absolute h-full bg-primary', rangeClassName)} />\n </SliderPrimitive.Track>\n <SliderPrimitive.Thumb className=\"block h-4 w-4 rounded-full border border-primary/50 bg-background shadow transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50\" />\n </SliderPrimitive.Root>\n )\n)\nSlider.displayName = SliderPrimitive.Root.displayName\n\nexport { Slider }\n","'use client'\n\nimport * as React from 'react'\nimport * as TogglePrimitive from '@radix-ui/react-toggle'\nimport { cva, type VariantProps } from 'class-variance-authority'\n\nimport { cn } from '../lib/utils'\n\nconst toggleVariants = cva(\n 'inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium transition-colors hover:bg-muted hover:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0',\n {\n variants: {\n variant: {\n default: 'bg-transparent',\n outline:\n 'border border-input bg-transparent shadow-sm hover:bg-accent hover:text-accent-foreground',\n },\n size: {\n default: 'h-9 px-2 min-w-9 pointer-coarse:h-11 pointer-coarse:min-w-11',\n sm: 'h-8 px-1.5 min-w-8 pointer-coarse:h-11 pointer-coarse:min-w-11',\n lg: 'h-10 px-2.5 min-w-10 pointer-coarse:h-11 pointer-coarse:min-w-11',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n }\n)\n\nconst Toggle = React.forwardRef<\n React.ElementRef<typeof TogglePrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof TogglePrimitive.Root> & VariantProps<typeof toggleVariants>\n>(({ className, variant, size, ...props }, ref) => (\n <TogglePrimitive.Root\n ref={ref}\n className={cn(toggleVariants({ variant, size, className }))}\n {...props}\n />\n))\n\nToggle.displayName = TogglePrimitive.Root.displayName\n\nexport { Toggle, toggleVariants }\n","import * as React from 'react'\nimport * as ToggleGroupPrimitive from '@radix-ui/react-toggle-group'\nimport { type VariantProps } from 'class-variance-authority'\n\nimport { cn } from '../lib/utils'\nimport { toggleVariants } from './toggle'\n\nconst ToggleGroupContext = React.createContext<VariantProps<typeof toggleVariants>>({\n size: 'default',\n variant: 'default',\n})\n\nconst ToggleGroup = React.forwardRef<\n React.ElementRef<typeof ToggleGroupPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Root> &\n VariantProps<typeof toggleVariants>\n>(({ className, variant, size, children, ...props }, ref) => (\n <ToggleGroupPrimitive.Root\n ref={ref}\n className={cn('flex items-center justify-center gap-1', className)}\n {...props}\n >\n <ToggleGroupContext.Provider value={{ variant, size }}>{children}</ToggleGroupContext.Provider>\n </ToggleGroupPrimitive.Root>\n))\n\nToggleGroup.displayName = ToggleGroupPrimitive.Root.displayName\n\nconst ToggleGroupItem = React.forwardRef<\n React.ElementRef<typeof ToggleGroupPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Item> &\n VariantProps<typeof toggleVariants>\n>(({ className, children, variant, size, ...props }, ref) => {\n const context = React.useContext(ToggleGroupContext)\n\n return (\n <ToggleGroupPrimitive.Item\n ref={ref}\n className={cn(\n toggleVariants({\n variant: context.variant || variant,\n size: context.size || size,\n }),\n className\n )}\n {...props}\n >\n {children}\n </ToggleGroupPrimitive.Item>\n )\n})\n\nToggleGroupItem.displayName = ToggleGroupPrimitive.Item.displayName\n\nexport { ToggleGroup, ToggleGroupItem }\n","import * as React from 'react'\nimport * as PopoverPrimitive from '@radix-ui/react-popover'\n\nimport { cn } from '../lib/utils'\nimport { getCollisionPadding } from '../lib/collision-padding'\nimport { usePortalContainer } from './portal-container'\n\nconst Popover = PopoverPrimitive.Root\n\nconst PopoverTrigger = PopoverPrimitive.Trigger\n\nconst PopoverAnchor = PopoverPrimitive.Anchor\n\n/** Portals to the nearest PortalContainerProvider's container (a popped-out window), else `<body>`. */\nfunction PopoverPortal({\n container,\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Portal>) {\n const fallback = usePortalContainer()\n return <PopoverPrimitive.Portal container={container ?? fallback} {...props} />\n}\n\nconst PopoverContent = React.forwardRef<\n React.ElementRef<typeof PopoverPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content> & {\n container?: HTMLElement | null\n }\n>(({ className, align = 'center', sideOffset = 4, container, ...props }, ref) => (\n <PopoverPortal container={container ?? undefined}>\n <PopoverPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n collisionPadding={getCollisionPadding()}\n className={cn(\n 'z-50 w-72 max-w-[calc(100vw-1rem)] max-h-[var(--radix-popover-content-available-height)] overflow-y-auto overscroll-contain rounded-md border border-border bg-popover p-4 text-popover-foreground shadow-lg outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-popover-content-transform-origin]',\n className\n )}\n {...props}\n />\n </PopoverPortal>\n))\nPopoverContent.displayName = PopoverPrimitive.Content.displayName\n\n/** Closes the popover it is in (wrap an action that should close it with `asChild`). */\nconst PopoverClose = PopoverPrimitive.Close\n\nexport { Popover, PopoverTrigger, PopoverContent, PopoverAnchor, PopoverClose }\n","import {\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n type HTMLAttributes,\n type KeyboardEvent as ReactKeyboardEvent,\n type MouseEvent as ReactMouseEvent,\n type PointerEvent as ReactPointerEvent,\n type Ref,\n type ReactNode,\n} from 'react'\nimport { Popover, PopoverAnchor, PopoverContent } from './popover'\nimport { cn } from '../lib/utils'\n\n/** One row of a mark's menu. Give it `onSelect`, or an `href` for a real link row. */\nexport interface MarkMenuItem {\n id: string\n label: string\n /** Runs when the row is chosen; the menu closes afterwards. */\n onSelect?: () => void\n /** Renders the row as a link (no `onSelect` needed). */\n href?: string\n /** The headline action: listed first, set a little larger, and run by a plain mouse click. */\n primary?: boolean\n destructive?: boolean\n testId?: string\n}\n\nexport interface MarkMenuProps extends Omit<HTMLAttributes<HTMLElement>, 'children' | 'onClick'> {\n /** The element the mark itself is: a real link or an inline span. */\n as?: 'a' | 'span'\n href?: string\n /** Rows of the menu. The `primary` one (else the first) is the mark's default action. */\n items: MarkMenuItem[]\n /** Optional read-only content above the rows (a quoted passage, a note, a label name). */\n preview?: ReactNode\n /** Accessible name of the menu. */\n menuLabel: string\n /** A plain mouse click runs the primary row (default). Touch and keyboard always open the menu. */\n shouldClickRunPrimary?: boolean\n /** Hover delay before the menu opens (ms). */\n openDelay?: number\n closeDelay?: number\n testId?: string\n menuTestId?: string\n /** The mark element, for hosts that move focus back to it. */\n triggerRef?: Ref<HTMLElement>\n children: ReactNode\n}\n\nconst FINE_OPEN_DELAY = 350\nconst FINE_CLOSE_DELAY = 180\n\n// Marks getting focus back from a dismissal, so that focus does not reopen their menu.\nconst silentFocusMarks = new WeakSet<HTMLElement>()\n\n/**\n * Puts focus back on a mark after its menu or popover was dismissed. Unlike a Tab onto the mark,\n * this does not open the mark's menu: the user has just closed something and should not get\n * another popup over the text they were reading.\n */\nexport function returnFocusToMark(mark: HTMLElement): void {\n silentFocusMarks.add(mark)\n mark.focus({ preventScroll: true })\n silentFocusMarks.delete(mark)\n}\n\nfunction isFocusVisible(el: HTMLElement): boolean {\n try {\n return el.matches(':focus-visible')\n } catch {\n return true\n }\n}\n\ntype OpenMode = 'hover' | 'focus' | 'press' | 'key'\n\nfunction isCoarse(pointerType: string): boolean {\n if (pointerType === 'touch' || pointerType === 'pen') return true\n if (pointerType === 'mouse') return false\n return typeof window !== 'undefined' && !!window.matchMedia?.('(pointer: coarse)').matches\n}\n\n/**\n * The ONE contextual menu of every inline mark (link, bookmark, citation, label, note).\n *\n * The mark stays quiet text. A compact popover opens on hover (short delay) and on keyboard focus;\n * on touch a tap opens it instead of acting, so the primary row is one deliberate tap away. A\n * plain mouse click runs the primary action, so existing click behaviour is unchanged.\n * Keyboard: Enter/Space/ArrowDown open it and move into it, arrows move, Escape closes and\n * returns focus to the mark. Rows are 44px high on coarse pointers.\n */\nexport function MarkMenu({\n as = 'span',\n href,\n items,\n preview,\n menuLabel,\n shouldClickRunPrimary = true,\n openDelay = FINE_OPEN_DELAY,\n closeDelay = FINE_CLOSE_DELAY,\n testId,\n menuTestId,\n triggerRef: externalRef,\n className,\n children,\n onPointerDown,\n onPointerEnter,\n onPointerMove,\n onPointerLeave,\n onFocus,\n onBlur,\n onKeyDown,\n ...rest\n}: MarkMenuProps) {\n const [open, setOpen] = useState(false)\n const [side, setSide] = useState<'top' | 'bottom'>('bottom')\n const menuId = useId()\n const triggerRef = useRef<HTMLElement | null>(null)\n const contentRef = useRef<HTMLDivElement | null>(null)\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null)\n const mode = useRef<OpenMode>('hover')\n const lastPointer = useRef('mouse')\n const focusFirstOnOpen = useRef(false)\n // Set when the pointer enters a mark; the hover menu opens only once the pointer actually moves\n // over it (see handlePointerMove).\n const hoverArmed = useRef(false)\n\n const isEmpty = items.length === 0 && !preview\n const ordered = [...items].sort((a, b) => Number(!!b.primary) - Number(!!a.primary))\n const primary = ordered[0]\n\n const clearTimer = () => {\n if (timer.current) clearTimeout(timer.current)\n timer.current = null\n }\n useEffect(() => clearTimer, [])\n\n // Any press outside the mark and its menu closes it. This listens in the capture phase so it runs\n // before the press reaches anything else: Radix ignores outside presses while a modal layer is\n // open, and a press that opens one (a header menu, a dialog) would otherwise leave this menu stuck.\n useEffect(() => {\n if (!open) return\n const onDocumentPointerDown = (e: PointerEvent) => {\n const target = e.target as Node\n if (triggerRef.current?.contains(target) || contentRef.current?.contains(target)) return\n if (timer.current) clearTimeout(timer.current)\n setOpen(false)\n }\n document.addEventListener('pointerdown', onDocumentPointerDown, true)\n return () => document.removeEventListener('pointerdown', onDocumentPointerDown, true)\n }, [open])\n\n const rows = () =>\n Array.from(contentRef.current?.querySelectorAll<HTMLElement>('[role=\"menuitem\"]') ?? [])\n const firstItem = () => rows()[0]\n\n const openWith = (next: OpenMode, focusFirst = false) => {\n clearTimer()\n mode.current = next\n focusFirstOnOpen.current = focusFirst\n // Touch: the finger covers what is below the mark, so open above it.\n setSide(next === 'press' && isCoarse(lastPointer.current) ? 'top' : 'bottom')\n setOpen(true)\n if (focusFirst) {\n // Already open (hover/focus opened it): move focus in right away.\n requestAnimationFrame(() => firstItem()?.focus())\n }\n }\n\n const close = (returnFocus = false) => {\n clearTimer()\n setOpen(false)\n if (returnFocus && triggerRef.current) returnFocusToMark(triggerRef.current)\n }\n\n const schedule = (action: () => void, delay: number) => {\n clearTimer()\n timer.current = setTimeout(action, delay)\n }\n\n const handlePointerDown = (e: ReactPointerEvent<HTMLElement>) => {\n lastPointer.current = e.pointerType\n onPointerDown?.(e)\n }\n const handlePointerEnter = (e: ReactPointerEvent<HTMLElement>) => {\n onPointerEnter?.(e)\n if (isCoarse(e.pointerType) || isEmpty) return\n lastPointer.current = e.pointerType\n // Not scheduled yet: when a scroll slides a mark under a resting pointer, the browser fires\n // pointerenter with no pointer movement. Opening on that would pop menus up while reading.\n hoverArmed.current = true\n }\n const handlePointerMove = (e: ReactPointerEvent<HTMLElement>) => {\n onPointerMove?.(e)\n if (!hoverArmed.current) return\n hoverArmed.current = false\n if (isCoarse(e.pointerType)) return\n schedule(() => openWith('hover'), openDelay)\n }\n const handlePointerLeave = (e: ReactPointerEvent<HTMLElement>) => {\n onPointerLeave?.(e)\n hoverArmed.current = false\n if (isCoarse(e.pointerType)) return\n if (!open) return clearTimer()\n if (mode.current === 'hover') schedule(() => close(), closeDelay)\n }\n const handleFocus = (e: React.FocusEvent<HTMLElement>) => {\n onFocus?.(e)\n if (isEmpty || silentFocusMarks.has(e.currentTarget)) return\n // Only keyboard focus opens it; a pointer press focuses too and has its own path.\n if (isFocusVisible(e.currentTarget)) schedule(() => openWith('focus'), openDelay)\n }\n const handleBlur = (e: React.FocusEvent<HTMLElement>) => {\n onBlur?.(e)\n const next = e.relatedTarget as Node | null\n if (next && contentRef.current?.contains(next)) return\n if (mode.current === 'focus' || mode.current === 'key') schedule(() => close(), closeDelay)\n else clearTimer()\n }\n const handleKeyDown = (e: ReactKeyboardEvent<HTMLElement>) => {\n onKeyDown?.(e)\n lastPointer.current = 'keyboard'\n if (e.defaultPrevented || isEmpty) return\n if (e.key === 'Enter' || e.key === ' ' || e.key === 'ArrowDown') {\n e.preventDefault()\n openWith('key', true)\n } else if (e.key === 'Escape' && open) {\n e.preventDefault()\n e.stopPropagation()\n close(true)\n }\n }\n const handleClick = (e: ReactMouseEvent<HTMLElement>) => {\n if (isEmpty) return\n if (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) return\n // A keyboard-synthesised click is already handled in keydown (detail 0, no pointer).\n if (e.detail === 0 && lastPointer.current === 'keyboard') {\n e.preventDefault()\n return\n }\n if (isCoarse(lastPointer.current)) {\n // A tap shows the menu instead of acting or navigating.\n e.preventDefault()\n if (open) close()\n else openWith('press')\n return\n }\n if (shouldClickRunPrimary && primary?.onSelect) {\n e.preventDefault()\n close()\n primary.onSelect()\n }\n }\n\n const handleMenuKeyDown = (e: ReactKeyboardEvent<HTMLDivElement>) => {\n const list = rows()\n const index = list.indexOf(document.activeElement as HTMLElement)\n let target: HTMLElement | undefined\n if (e.key === 'ArrowDown') target = list[(index + 1) % list.length]\n else if (e.key === 'ArrowUp') target = list[(index - 1 + list.length) % list.length]\n else if (e.key === 'Home') target = list[0]\n else if (e.key === 'End') target = list[list.length - 1]\n else if (e.key === 'Escape') {\n e.preventDefault()\n e.stopPropagation()\n close(true)\n return\n } else if (e.key === 'Tab') {\n close()\n return\n }\n if (target) {\n e.preventDefault()\n target.focus()\n }\n }\n\n const choose = (item: MarkMenuItem) => {\n const wasKey = mode.current === 'key'\n close(wasKey)\n item.onSelect?.()\n }\n\n const setTriggerRef = useCallback(\n (el: HTMLElement | null) => {\n triggerRef.current = el\n if (typeof externalRef === 'function') externalRef(el)\n else if (externalRef) (externalRef as { current: HTMLElement | null }).current = el\n },\n [externalRef]\n )\n\n const triggerProps = {\n ref: setTriggerRef,\n className,\n 'data-testid': testId,\n 'data-slot': 'mark',\n 'aria-haspopup': 'true' as const,\n 'aria-expanded': open,\n 'aria-controls': open ? menuId : undefined,\n onPointerDown: handlePointerDown,\n onPointerEnter: handlePointerEnter,\n onPointerMove: handlePointerMove,\n onPointerLeave: handlePointerLeave,\n onFocus: handleFocus,\n onBlur: handleBlur,\n onKeyDown: handleKeyDown,\n onClick: handleClick,\n ...rest,\n }\n\n return (\n <Popover open={open && !isEmpty}>\n <PopoverAnchor asChild>\n {as === 'a' ? (\n <a href={href} {...triggerProps}>\n {children}\n </a>\n ) : (\n <span role=\"button\" tabIndex={0} {...triggerProps}>\n {children}\n </span>\n )}\n </PopoverAnchor>\n <PopoverContent\n ref={contentRef}\n id={menuId}\n side={side}\n align=\"start\"\n sideOffset={6}\n collisionPadding={8}\n // A plain group, not Radix's default dialog: the named role=\"menu\" inside is the semantic\n // surface, and a second dialog with a near-identical name collides with docked dialogs.\n role=\"group\"\n data-testid={menuTestId}\n data-slot=\"mark-menu\"\n className=\"w-auto min-w-[12rem] max-w-[min(22rem,calc(100vw-1rem))] p-1\"\n onOpenAutoFocus={(e) => {\n e.preventDefault()\n if (focusFirstOnOpen.current) firstItem()?.focus()\n }}\n onCloseAutoFocus={(e) => e.preventDefault()}\n onEscapeKeyDown={(e) => {\n e.preventDefault()\n close(true)\n }}\n onInteractOutside={(e) => {\n if (triggerRef.current?.contains(e.target as Node)) e.preventDefault()\n }}\n onPointerEnter={clearTimer}\n onPointerLeave={(e) => {\n if (!isCoarse(e.pointerType) && mode.current === 'hover')\n schedule(() => close(), closeDelay)\n }}\n >\n {preview && <div className=\"px-2 py-1.5 text-sm\">{preview}</div>}\n {ordered.length > 0 && (\n <div role=\"menu\" aria-label={menuLabel} onKeyDown={handleMenuKeyDown}>\n {ordered.map((item) => {\n const rowClass = cn(\n 'flex w-full cursor-pointer items-center rounded-sm px-2 py-1.5 text-left text-sm outline-none transition-colors hover:bg-accent focus-visible:bg-accent pointer-coarse:min-h-11 pointer-coarse:px-3',\n item.primary && 'font-medium pointer-coarse:text-base',\n item.destructive && 'text-destructive'\n )\n return item.href && !item.onSelect ? (\n <a\n key={item.id}\n role=\"menuitem\"\n tabIndex={-1}\n href={item.href}\n className={rowClass}\n data-testid={item.testId}\n onClick={() => close()}\n >\n {item.label}\n </a>\n ) : (\n <button\n key={item.id}\n type=\"button\"\n role=\"menuitem\"\n tabIndex={-1}\n className={rowClass}\n data-testid={item.testId}\n onClick={() => choose(item)}\n >\n {item.label}\n </button>\n )\n })}\n </div>\n )}\n </PopoverContent>\n </Popover>\n )\n}\n","'use client'\n\nimport * as React from 'react'\nimport { type DialogProps } from '@radix-ui/react-dialog'\nimport { Command as CommandPrimitive } from 'cmdk'\nimport { Search } from 'lucide-react'\n\nimport { cn } from '../lib/utils'\nimport { Dialog, DialogContent } from './dialog'\n\nconst Command = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive\n ref={ref}\n className={cn(\n 'flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground',\n className\n )}\n {...props}\n />\n))\nCommand.displayName = CommandPrimitive.displayName\n\nconst CommandDialog = ({ children, ...props }: DialogProps) => {\n return (\n <Dialog {...props}>\n <DialogContent className=\"overflow-hidden p-0\">\n <Command className=\"[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-group]]:px-2 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5\">\n {children}\n </Command>\n </DialogContent>\n </Dialog>\n )\n}\n\nconst CommandInput = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.Input>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Input>\n>(({ className, ...props }, ref) => (\n <div className=\"flex items-center border-b px-3\" data-cmdk-input-wrapper=\"\">\n <Search className=\"mr-2 h-4 w-4 shrink-0 opacity-50\" />\n <CommandPrimitive.Input\n ref={ref}\n className={cn(\n 'flex h-10 pointer-coarse:h-11 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50',\n className\n )}\n {...props}\n />\n </div>\n))\n\nCommandInput.displayName = CommandPrimitive.Input.displayName\n\nconst CommandList = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.List>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.List\n ref={ref}\n className={cn('max-h-[min(300px,50dvh)] overflow-y-auto overflow-x-hidden', className)}\n {...props}\n />\n))\n\nCommandList.displayName = CommandPrimitive.List.displayName\n\nconst CommandEmpty = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.Empty>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Empty>\n>((props, ref) => (\n <CommandPrimitive.Empty ref={ref} className=\"py-6 text-center text-sm\" {...props} />\n))\n\nCommandEmpty.displayName = CommandPrimitive.Empty.displayName\n\nconst CommandGroup = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.Group>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Group>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Group\n ref={ref}\n className={cn(\n 'overflow-hidden p-1 text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-sm [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground',\n className\n )}\n {...props}\n />\n))\n\nCommandGroup.displayName = CommandPrimitive.Group.displayName\n\nconst CommandSeparator = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Separator\n ref={ref}\n className={cn('-mx-1 h-px bg-border', className)}\n {...props}\n />\n))\nCommandSeparator.displayName = CommandPrimitive.Separator.displayName\n\nconst CommandItem = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Item>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex cursor-default gap-2 select-none items-center rounded-sm px-2 py-1.5 pointer-coarse:min-h-11 text-sm outline-none data-[disabled=true]:pointer-events-none data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0',\n className\n )}\n {...props}\n />\n))\n\nCommandItem.displayName = CommandPrimitive.Item.displayName\n\nconst CommandShortcut = ({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span\n className={cn('ml-auto text-sm tracking-widest text-muted-foreground', className)}\n {...props}\n />\n )\n}\nCommandShortcut.displayName = 'CommandShortcut'\n\nexport {\n Command,\n CommandDialog,\n CommandInput,\n CommandList,\n CommandEmpty,\n CommandGroup,\n CommandItem,\n CommandShortcut,\n CommandSeparator,\n}\n","import type { Components } from 'react-markdown'\nimport { MarkdownRenderer } from './MarkdownRenderer'\n\n/**\n * Renders agent output in the shared house style, layered with the AI-branded and\n * redline-specific overrides on top of the kit's {@link MarkdownRenderer}: accent\n * links and `<del>`/`<ins>`/`<mark>` as tracked-changes (deletions red-strike,\n * insertions accented). Everything else — headings, lists, GFM tables, fenced\n * code blocks, blockquotes, safe links — comes from the shared renderer, so AI\n * answers, chat messages and parsed documents all look identical.\n *\n * Token-neutral: shadcn semantic tokens plus the kit's `ai-accent` contract.\n */\nconst AI_COMPONENTS: Partial<Components> = {\n a: (p) => (\n <a\n className=\"text-ai-accent underline underline-offset-2\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n {...p}\n />\n ),\n // Redline marks: deletions in red strike, <ins>/<mark> additions accented.\n del: (p) => (\n <del className=\"rounded bg-destructive/10 text-destructive decoration-destructive/60\" {...p} />\n ),\n ins: (p) => (\n <ins className=\"rounded bg-ai-accent-soft px-0.5 text-ai-accent no-underline\" {...p} />\n ),\n mark: (p) => <mark className=\"rounded bg-ai-accent-soft px-0.5 text-ai-accent\" {...p} />,\n thead: (p) => <thead className=\"bg-secondary/60\" {...p} />,\n}\n\nexport function AiMarkdown({\n children,\n className,\n isStreaming,\n allowHtml,\n}: {\n children: string\n className?: string\n isStreaming?: boolean\n /** See {@link MarkdownRenderer}: false keeps inline HTML as text. */\n allowHtml?: boolean\n}) {\n return (\n <MarkdownRenderer\n className={className ?? 'text-sm'}\n components={AI_COMPONENTS}\n isStreaming={isStreaming}\n allowHtml={allowHtml}\n testId=\"ai-markdown\"\n >\n {children}\n </MarkdownRenderer>\n )\n}\n","/**\n * PassageCard — the card (\"bubble\") a single retrieved passage is rendered as.\n *\n * One presentation shared by every surface that lists retrieval hits: the\n * blocks search page (`SearchHit`) and the conversation search. Those had drifted into two different looks for the same object; this\n * is the single one.\n *\n * The card owns the chrome only — the rounded border, the AI-accent hover /\n * focus / selected states, the header row and the relevance dot. What goes in\n * the header and how the snippet itself is rendered stays with the caller,\n * because those genuinely differ: the block shows a plain-text excerpt in a\n * narrow sidebar, the monolith renders markdown with a show-more toggle.\n *\n * Theming is semantic tokens only (shadcn + the AI-accent contract).\n */\n\nimport React from 'react'\nimport { cn } from '../lib/utils'\n\n/** Relevance bands. Shared so a hit is coloured the same wherever it appears. */\nconst TIERS = [\n { min: 0.7, tone: 'bg-emerald-500', label: 'High relevance' },\n { min: 0.4, tone: 'bg-amber-500', label: 'Medium relevance' },\n { min: -Infinity, tone: 'bg-muted-foreground/40', label: 'Low relevance' },\n] as const\n\n/**\n * A dot conveying relevance — green (high) / amber (mid) / muted (low).\n *\n * The band is shown, the raw number is not: scores are not on a normalized 0-1\n * scale across search modes (BM25 keyword scores can exceed 1), so a printed\n * figure invites a comparison it cannot support. The value is kept in the\n * tooltip for anyone debugging a ranking.\n */\nexport function RelevanceDot({ score }: { score?: number | null }) {\n if (score == null) return null\n const tier = TIERS.find((t) => score >= t.min) ?? TIERS[TIERS.length - 1]\n return (\n <span\n role=\"img\"\n aria-label={tier.label}\n title={`${tier.label} (${score.toFixed(2)})`}\n className={cn('size-1.5 shrink-0 rounded-full', tier.tone)}\n data-testid=\"passage-relevance\"\n />\n )\n}\n\nexport interface PassageCardProps {\n /** Left of the header row — the source affordance (document pill, page label). */\n header: React.ReactNode\n /** Relevance score for the dot. Omit to hide it. */\n score?: number | null\n /** Extra affordance pinned right of the dot (e.g. a hover-revealed open icon). */\n headerRight?: React.ReactNode\n /** Marks the card as the currently open passage. */\n active?: boolean\n onClick?: (e: React.MouseEvent) => void\n /** Rendered under the snippet, outside the click target's typography. */\n footer?: React.ReactNode\n className?: string\n children: React.ReactNode\n 'data-testid'?: string\n}\n\nexport function PassageCard({\n header,\n score,\n headerRight,\n active,\n onClick,\n footer,\n className,\n children,\n 'data-testid': testId,\n}: PassageCardProps) {\n const body = (\n <>\n <div className=\"mb-1.5 flex items-center gap-2\">\n {header}\n {(score != null || headerRight) && (\n <div className=\"ml-auto flex shrink-0 items-center gap-2\">\n <RelevanceDot score={score} />\n {headerRight}\n </div>\n )}\n </div>\n {/* Query-term highlights are styled here rather than by each caller, so a\n * <mark> reads as an accent on the passage instead of browser yellow. */}\n <div className=\"[&_mark]:rounded-sm [&_mark]:bg-ai-accent/20 [&_mark]:px-0.5 [&_mark]:font-medium [&_mark]:text-foreground\">\n {children}\n </div>\n </>\n )\n\n return (\n <div\n className={cn(\n 'group rounded-lg border border-border bg-card p-3 text-left transition-colors',\n onClick && 'hover:border-ai-accent/40 focus-within:ring-2 focus-within:ring-ai-accent/40',\n active && 'border-ai-accent/60 ring-1 ring-ai-accent/30',\n className\n )}\n >\n {/* The footer sits OUTSIDE the click target on purpose. It holds the\n * caller's own controls (a show-more toggle), and a button nested inside a\n * role=\"button\" is both invalid and ambiguous to hit — the whole passage\n * would otherwise become that control's accessible name.\n *\n * `data-testid` rides on the click target rather than this shell, so\n * \"click the result row\" keeps working for every caller's tests. */}\n {onClick ? (\n <div\n role=\"button\"\n tabIndex={0}\n onClick={onClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onClick(e as unknown as React.MouseEvent)\n }\n }}\n aria-current={active || undefined}\n data-testid={testId}\n className=\"cursor-pointer focus:outline-none\"\n >\n {body}\n </div>\n ) : (\n <div aria-current={active || undefined} data-testid={testId}>\n {body}\n </div>\n )}\n {footer}\n </div>\n )\n}\n","/**\n * Maps a file name (by extension) to the matching branded file-type icon\n * component. Single source of truth so the document grid, navigator, and the\n * file-explorer view all show identical icons.\n *\n * The icon components share a `{ size?, className? }` signature, so callers can\n * render the returned component at any size.\n */\n\nimport { AudIcon } from './AudIcon'\nimport { DocIcon } from './DocIcon'\nimport { EmlIcon } from './EmlIcon'\nimport { HtmlIcon } from './HtmlIcon'\nimport { ImgIcon } from './ImgIcon'\nimport { PdfIcon } from './PdfIcon'\nimport { VidIcon } from './VidIcon'\nimport { XlsIcon } from './XlsIcon'\nimport type { ComponentType } from 'react'\nimport { FileText } from 'lucide-react'\n\nexport type FileTypeIcon = ComponentType<{ size?: number; className?: string }>\n\n/**\n * Neutral document icon for plain-text files and anything otherwise\n * unrecognised. Inherits `currentColor`, so callers can tint it (e.g.\n * `text-muted-foreground`); a friendlier explorer fallback than a \"?\" glyph.\n */\nconst TextIcon: FileTypeIcon = FileText\n\nconst IMAGE_EXTENSIONS = new Set(['jpg', 'jpeg', 'png', 'gif', 'bmp', 'tiff', 'tif', 'webp', 'svg'])\nconst VIDEO_EXTENSIONS = new Set(['mp4', 'mpeg', 'mpg', 'webm', 'mov', 'avi', 'mkv'])\nconst AUDIO_EXTENSIONS = new Set(['mp3', 'wav', 'm4a', 'aac', 'ogg', 'flac'])\nconst DOCX_EXTENSIONS = new Set(['doc', 'docx', 'odt', 'rtf'])\nconst XLSX_EXTENSIONS = new Set(['xls', 'xlsx', 'csv', 'ods'])\nconst EMAIL_EXTENSIONS = new Set(['eml', 'msg'])\nconst HTML_EXTENSIONS = new Set(['html', 'htm', 'mhtml'])\nconst PDF_EXTENSIONS = new Set(['pdf'])\nconst TEXT_EXTENSIONS = new Set([\n 'txt',\n 'text',\n 'md',\n 'markdown',\n 'log',\n 'json',\n 'xml',\n 'yaml',\n 'yml',\n])\n\n/** Lower-cased extension (without the dot), or '' when there is none. */\nexport function getFileExtension(fileName?: string | null): string {\n if (!fileName) return ''\n const dot = fileName.lastIndexOf('.')\n if (dot <= 0 || dot === fileName.length - 1) return ''\n return fileName.slice(dot + 1).toLowerCase()\n}\n\n/** Canonical extensions for the MIME types we expect from the backend. */\nconst MIME_TO_EXTENSION: Record<string, string> = {\n 'application/pdf': 'pdf',\n 'text/plain': 'txt',\n 'text/markdown': 'md',\n 'text/html': 'html',\n 'text/csv': 'csv',\n 'application/json': 'json',\n 'application/xml': 'xml',\n 'application/msword': 'doc',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'docx',\n 'application/rtf': 'rtf',\n 'application/vnd.oasis.opendocument.text': 'odt',\n 'application/vnd.ms-excel': 'xls',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'xlsx',\n 'application/vnd.oasis.opendocument.spreadsheet': 'ods',\n 'image/png': 'png',\n 'image/jpeg': 'jpg',\n 'image/gif': 'gif',\n 'image/webp': 'webp',\n 'image/svg+xml': 'svg',\n 'image/tiff': 'tiff',\n 'image/bmp': 'bmp',\n 'video/mp4': 'mp4',\n 'video/webm': 'webm',\n 'video/quicktime': 'mov',\n 'audio/mpeg': 'mp3',\n 'audio/wav': 'wav',\n 'audio/ogg': 'ogg',\n 'message/rfc822': 'eml',\n}\n\n/**\n * Best-effort file extension (no dot) for a MIME type, or '' when unknown.\n * Used to surface the real extension for documents stored with a display title\n * that has none.\n */\nexport function extensionFromMime(mime?: string | null): string {\n if (!mime) return ''\n return MIME_TO_EXTENSION[mime.toLowerCase()] ?? ''\n}\n\n/** Icon from a file extension, or null when the extension isn't recognised. */\nfunction iconFromExtension(ext: string): FileTypeIcon | null {\n if (VIDEO_EXTENSIONS.has(ext)) return VidIcon\n if (AUDIO_EXTENSIONS.has(ext)) return AudIcon\n if (IMAGE_EXTENSIONS.has(ext)) return ImgIcon\n if (DOCX_EXTENSIONS.has(ext)) return DocIcon\n if (XLSX_EXTENSIONS.has(ext)) return XlsIcon\n if (EMAIL_EXTENSIONS.has(ext)) return EmlIcon\n if (HTML_EXTENSIONS.has(ext)) return HtmlIcon\n if (PDF_EXTENSIONS.has(ext)) return PdfIcon\n if (TEXT_EXTENSIONS.has(ext)) return TextIcon\n return null\n}\n\n/**\n * Icon from a MIME type, or null when unrecognised. Used as a fallback for\n * documents whose stored `file_name` carries no extension (common when a\n * display title is used instead).\n */\nfunction iconFromMime(mime: string): FileTypeIcon | null {\n const m = mime.toLowerCase()\n if (m.startsWith('image/')) return ImgIcon\n if (m.startsWith('video/')) return VidIcon\n if (m.startsWith('audio/')) return AudIcon\n if (m === 'application/pdf') return PdfIcon\n if (m === 'text/html') return HtmlIcon\n if (m === 'message/rfc822' || m.includes('outlook')) return EmlIcon\n if (m.includes('word') || m === 'application/rtf' || m.includes('opendocument.text'))\n return DocIcon\n if (\n m.includes('sheet') ||\n m.includes('excel') ||\n m === 'text/csv' ||\n m.includes('opendocument.spreadsheet')\n )\n return XlsIcon\n if (m.startsWith('text/') || m === 'application/json' || m === 'application/xml') return TextIcon\n return null\n}\n\n/**\n * Returns the icon component for a document.\n *\n * Resolution order: file-name extension → MIME `file_type` → fallback. This\n * mirrors how documents are stored — many carry a display title without an\n * extension, so the MIME type is the reliable signal.\n *\n * @param fileName the document file name (uses its extension)\n * @param opts.mime the document `file_type` (MIME), used when the name has no\n * recognised extension\n * @param opts.defaultToPdf when true, an unresolved type falls back to the PDF\n * icon (preserves legacy grid/navigator behaviour). Defaults to the neutral\n * generic file icon.\n */\nexport function getFileTypeIcon(\n fileName?: string | null,\n opts?: { mime?: string | null; defaultToPdf?: boolean }\n): FileTypeIcon {\n return (\n iconFromExtension(getFileExtension(fileName)) ??\n (opts?.mime ? iconFromMime(opts.mime) : null) ??\n (opts?.defaultToPdf ? PdfIcon : TextIcon)\n )\n}\n","/**\n * Google Icon Component. Promoted from the ARBI app for SDK reuse.\n */\n\nimport React from 'react'\n\ninterface GoogleIconProps {\n size?: number\n className?: string\n 'aria-label'?: string\n 'aria-hidden'?: boolean\n}\n\nexport const GoogleIcon: React.FC<GoogleIconProps> = ({\n size = 20,\n className = '',\n 'aria-label': ariaLabel,\n 'aria-hidden': ariaHidden = true,\n}) => {\n return (\n <svg\n className={className}\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n aria-label={ariaLabel}\n aria-hidden={ariaHidden}\n >\n <path\n fill=\"#4285F4\"\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\"\n />\n <path\n fill=\"#34A853\"\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\"\n />\n <path\n fill=\"#FBBC05\"\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\"\n />\n <path\n fill=\"#EA4335\"\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"\n />\n </svg>\n )\n}\n","import React from 'react'\n\ninterface IconProps {\n size?: number\n className?: string\n 'aria-label'?: string\n 'aria-hidden'?: boolean\n}\n\nexport const OpenAIIcon: React.FC<IconProps> = ({\n size = 16,\n className = '',\n 'aria-label': ariaLabel = 'OpenAI',\n 'aria-hidden': ariaHidden = true,\n}) => (\n <svg\n className={className}\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n aria-label={ariaLabel}\n aria-hidden={ariaHidden}\n >\n <path\n fill=\"#10A37F\"\n d=\"M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z\"\n />\n </svg>\n)\n","import React from 'react'\n\ninterface IconProps {\n size?: number\n className?: string\n 'aria-label'?: string\n 'aria-hidden'?: boolean\n}\n\nexport const ClaudeIcon: React.FC<IconProps> = ({\n size = 16,\n className = '',\n 'aria-label': ariaLabel = 'Claude',\n 'aria-hidden': ariaHidden = true,\n}) => (\n <svg\n className={className}\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n aria-label={ariaLabel}\n aria-hidden={ariaHidden}\n >\n <path\n fill=\"#D97757\"\n d=\"m4.7144 15.9555 4.7174-2.6471.079-.2307-.079-.1275h-.2307l-.7893-.0486-2.6956-.0729-2.3375-.0971-2.2646-.1214-.5707-.1215-.5343-.7042.0546-.3522.4797-.3218.686.0608 1.5179.1032 2.2767.1578 1.6514.0972 2.4468.255h.3886l.0546-.1579-.1336-.0971-.1032-.0972L6.973 9.8356l-2.55-1.6879-1.3356-.9714-.7225-.4918-.3643-.4614-.1578-1.0078.6557-.7225.8803.0607.2246.0607.8925.686 1.9064 1.4754 2.4893 1.8336.3643.3035.1457-.1032.0182-.0728-.164-.2733-1.3539-2.4467-1.445-2.4893-.6435-1.032-.17-.6194c-.0607-.255-.1032-.4674-.1032-.7285L6.287.1335 6.6997 0l.9957.1336.419.3642.6192 1.4147 1.0018 2.2282 1.5543 3.0296.4553.8985.2429.8318.091.255h.1579v-.1457l.1275-1.706.2368-2.0947.2307-2.6957.0789-.7589.3764-.9107.7468-.4918.5828.2793.4797.686-.0668.4433-.2853 1.8517-.5586 2.9021-.3643 1.9429h.2125l.2429-.2429.9835-1.3053 1.6514-2.0643.7286-.8196.85-.9046.5464-.4311h1.0321l.759 1.1293-.34 1.1657-1.0625 1.3478-.8804 1.1414-1.2628 1.7-.7893 1.36.0729.1093.1882-.0183 2.8535-.607 1.5421-.2794 1.8396-.3157.8318.3886.091.3946-.3278.8075-1.967.4857-2.3072.4614-3.4364.8136-.0425.0304.0486.0607 1.5482.1457.6618.0364h1.621l3.0175.2247.7892.522.4736.6376-.079.4857-1.2142.6193-1.6393-.3886-3.825-.9107-1.3113-.3279h-.1822v.1093l1.0929 1.0686 2.0035 1.8092 2.5075 2.3314.1275.5768-.3218.4554-.34-.0486-2.2039-1.6575-.85-.7468-1.9246-1.621h-.1275v.17l.4432.6496 2.3436 3.5214.1214 1.0807-.17.3521-.6071.2125-.6679-.1214-1.3721-1.9246L14.38 17.959l-1.1414-1.9428-.1397.079-.674 7.2552-.3156.3703-.7286.2793-.6071-.4614-.3218-.7468.3218-1.4753.3886-1.9246.3157-1.53.2853-1.9004.17-.6314-.0121-.0425-.1397.0182-1.4328 1.9672-2.1796 2.9446-1.7243 1.8456-.4128.164-.7164-.3704.0667-.6618.4008-.5889 2.386-3.0357 1.4389-1.882.929-1.0868-.0062-.1579h-.0546l-6.3385 4.1164-1.1293.1457-.4857-.4554.0608-.7467.2307-.2429 1.9064-1.3114Z\"\n />\n </svg>\n)\n","import React from 'react'\n\ninterface IconProps {\n size?: number\n className?: string\n 'aria-label'?: string\n 'aria-hidden'?: boolean\n}\n\nexport const GeminiIcon: React.FC<IconProps> = ({\n size = 16,\n className = '',\n 'aria-label': ariaLabel = 'Gemini',\n 'aria-hidden': ariaHidden = true,\n}) => (\n <svg\n className={className}\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n aria-label={ariaLabel}\n aria-hidden={ariaHidden}\n >\n <defs>\n <linearGradient id=\"geminiGradient\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\">\n <stop offset=\"0%\" stopColor=\"#1BA1E3\" />\n <stop offset=\"25%\" stopColor=\"#5489D6\" />\n <stop offset=\"50%\" stopColor=\"#9B72CB\" />\n <stop offset=\"75%\" stopColor=\"#D96570\" />\n <stop offset=\"100%\" stopColor=\"#F49C46\" />\n </linearGradient>\n </defs>\n <path\n fill=\"url(#geminiGradient)\"\n d=\"M11.04 19.32Q12 21.51 12 24q0-2.49.93-4.68.96-2.19 2.58-3.81t3.81-2.55Q21.51 12 24 12q-2.49 0-4.68-.93a12.3 12.3 0 0 1-3.81-2.58 12.3 12.3 0 0 1-2.58-3.81Q12 2.49 12 0q0 2.49-.96 4.68-.93 2.19-2.55 3.81a12.3 12.3 0 0 1-3.81 2.58Q2.49 12 0 12q2.49 0 4.68.96 2.19.93 3.81 2.55t2.55 3.81\"\n />\n </svg>\n)\n","import React from 'react'\n\ninterface IconProps {\n size?: number\n className?: string\n 'aria-label'?: string\n 'aria-hidden'?: boolean\n}\n\n/** Fireworks AI brand mark — three-stroke burst in their signature purple\n * (#6720FF). Pulled from fireworks.ai/icon0.svg. */\nexport const FireworksIcon: React.FC<IconProps> = ({\n size = 16,\n className = '',\n 'aria-label': ariaLabel = 'Fireworks AI',\n 'aria-hidden': ariaHidden = true,\n}) => (\n <svg\n className={className}\n width={size}\n height={size}\n viewBox=\"-2 6 36 20\"\n preserveAspectRatio=\"xMidYMid meet\"\n fill=\"none\"\n style={{ minWidth: size, minHeight: size }}\n aria-label={ariaLabel}\n aria-hidden={ariaHidden}\n >\n <path\n fill=\"#6720FF\"\n d=\"M15.9851 19.1274C15.0969 19.1274 14.2999 18.6001 13.96 17.7838L9.86258 8H12.2608L15.9991 16.9499L19.7339 8H22.1321L18.0102 17.7873C17.6686 18.6001 16.8733 19.1274 15.9851 19.1274Z\"\n />\n <path\n fill=\"#6720FF\"\n d=\"M21.3316 23.8029C20.4469 23.8029 19.6533 23.2792 19.31 22.4698C18.9649 21.6535 19.1436 20.7215 19.7672 20.0891L27.2299 12.5302L28.1618 14.7287L21.3298 21.636L31.068 21.5817L32 23.7802L21.3333 23.8065L21.3298 23.8029H21.3316Z\"\n />\n <path\n fill=\"#6720FF\"\n d=\"M0 23.7766L0.931955 21.5781L10.6702 21.6324L3.83993 14.7234L4.77189 12.5249L12.2345 20.0838C12.8582 20.7145 13.0386 21.65 12.6918 22.4645C12.3484 23.2756 11.5513 23.7977 10.6702 23.7977L0.00350359 23.7731L0 23.7766Z\"\n />\n </svg>\n)\n","import { Crown } from 'lucide-react'\nimport { OpenAIIcon } from './OpenAIIcon'\nimport { ClaudeIcon } from './ClaudeIcon'\nimport { GeminiIcon } from './GeminiIcon'\nimport { GoogleIcon } from './GoogleIcon'\nimport { FireworksIcon } from './FireworksIcon'\n\n/** Pick the best brand mark for a model. We prefer the *product* logo\n * (ChatGPT swirl, Gemini sparkle, Claude burst) when the model_name\n * signals a known product line, falling back to the LiteLLM provider\n * string for everything else. Returns Crown as the universal fallback so\n * Premium-tier rows always render an icon. */\nexport function ProviderIcon({\n modelName,\n provider,\n size = 16,\n className = '',\n}: {\n modelName?: string\n provider?: string | null\n size?: number\n className?: string\n}) {\n const m = (modelName ?? '').toLowerCase()\n const p = (provider ?? '').toLowerCase()\n\n if (m.includes('gpt') || p === 'openai') {\n return <OpenAIIcon size={size} className={className} />\n }\n if (m.includes('claude') || p === 'anthropic') {\n return <ClaudeIcon size={size} className={className} />\n }\n if (m.includes('gemini') || p.startsWith('vertex_ai')) {\n return <GeminiIcon size={size} className={className} />\n }\n if (p === 'google') {\n return <GoogleIcon size={size} className={className} />\n }\n if (p === 'fireworks_ai') {\n return <FireworksIcon size={size} className={className} />\n }\n return (\n <Crown\n className={className}\n style={{ width: size, height: size, color: '#EAB308', fill: '#EAB308' }}\n />\n )\n}\n","/**\n * The ARBI mark (the same artwork as ARBI-frontend's `/favicon.svg`) as a data URI, so the kits\n * that show ARBI's own identity (the ARBI provider of the standard models, the assistant's avatar)\n * render it in any host, whatever that host serves at `/favicon.svg`.\n */\nexport const ARBI_MARK_SRC =\n 'data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%20width=%22500%22%20zoomAndPan=%22magnify%22%20viewBox=%220%200%20375%20374.999991%22%20height=%22500%22%20preserveAspectRatio=%22xMidYMid%20meet%22%20version=%221.0%22%3E%3Cdefs%3E%3Cg/%3E%3CclipPath%20id=%22413a615d81%22%3E%3Cpath%20d=%22M%20187.5%200%20C%2083.945312%200%200%2083.945312%200%20187.5%20C%200%20291.054688%2083.945312%20375%20187.5%20375%20C%20291.054688%20375%20375%20291.054688%20375%20187.5%20C%20375%2083.945312%20291.054688%200%20187.5%200%20Z%20M%20187.5%200%20%22%20clip-rule=%22nonzero%22/%3E%3C/clipPath%3E%3CclipPath%20id=%22b4114fb668%22%3E%3Cpath%20d=%22M%200%200%20L%20375%200%20L%20375%20375%20L%200%20375%20Z%20M%200%200%20%22%20clip-rule=%22nonzero%22/%3E%3C/clipPath%3E%3CclipPath%20id=%2202d2f74560%22%3E%3Cpath%20d=%22M%20187.5%200%20C%2083.945312%200%200%2083.945312%200%20187.5%20C%200%20291.054688%2083.945312%20375%20187.5%20375%20C%20291.054688%20375%20375%20291.054688%20375%20187.5%20C%20375%2083.945312%20291.054688%200%20187.5%200%20Z%20M%20187.5%200%20%22%20clip-rule=%22nonzero%22/%3E%3C/clipPath%3E%3CclipPath%20id=%2266f7fee432%22%3E%3Crect%20x=%220%22%20width=%22375%22%20y=%220%22%20height=%22375%22/%3E%3C/clipPath%3E%3CclipPath%20id=%2244a7358375%22%3E%3Cpath%20d=%22M%2066.527344%2066.527344%20L%20308.472656%2066.527344%20L%20308.472656%20308.472656%20L%2066.527344%20308.472656%20Z%20M%2066.527344%2066.527344%20%22%20clip-rule=%22nonzero%22/%3E%3C/clipPath%3E%3CclipPath%20id=%2206d1da3b78%22%3E%3Cpath%20d=%22M%20187.5%2066.527344%20C%20120.6875%2066.527344%2066.527344%20120.6875%2066.527344%20187.5%20C%2066.527344%20254.3125%20120.6875%20308.472656%20187.5%20308.472656%20C%20254.3125%20308.472656%20308.472656%20254.3125%20308.472656%20187.5%20C%20308.472656%20120.6875%20254.3125%2066.527344%20187.5%2066.527344%20Z%20M%20187.5%2066.527344%20%22%20clip-rule=%22nonzero%22/%3E%3C/clipPath%3E%3CclipPath%20id=%225f19be2713%22%3E%3Cpath%20d=%22M%200.527344%200.527344%20L%20242.472656%200.527344%20L%20242.472656%20242.472656%20L%200.527344%20242.472656%20Z%20M%200.527344%200.527344%20%22%20clip-rule=%22nonzero%22/%3E%3C/clipPath%3E%3CclipPath%20id=%22fde3ba0cc4%22%3E%3Cpath%20d=%22M%20121.5%200.527344%20C%2054.6875%200.527344%200.527344%2054.6875%200.527344%20121.5%20C%200.527344%20188.3125%2054.6875%20242.472656%20121.5%20242.472656%20C%20188.3125%20242.472656%20242.472656%20188.3125%20242.472656%20121.5%20C%20242.472656%2054.6875%20188.3125%200.527344%20121.5%200.527344%20Z%20M%20121.5%200.527344%20%22%20clip-rule=%22nonzero%22/%3E%3C/clipPath%3E%3CclipPath%20id=%2267bf874d33%22%3E%3Crect%20x=%220%22%20width=%22243%22%20y=%220%22%20height=%22243%22/%3E%3C/clipPath%3E%3CclipPath%20id=%2205f2bd6677%22%3E%3Cpath%20d=%22M%200%2098.171875%20L%20375%2098.171875%20L%20375%20375%20L%200%20375%20Z%20M%200%2098.171875%20%22%20clip-rule=%22nonzero%22/%3E%3C/clipPath%3E%3CclipPath%20id=%22a5274c9106%22%3E%3Cpath%20d=%22M%20187.5%2098.171875%20L%20404.023438%20508.144531%20L%20-29.023438%20508.144531%20Z%20M%20187.5%2098.171875%20%22%20clip-rule=%22nonzero%22/%3E%3C/clipPath%3E%3CclipPath%20id=%220f4217ffe3%22%3E%3Cpath%20d=%22M%200%200.171875%20L%20375%200.171875%20L%20375%20277%20L%200%20277%20Z%20M%200%200.171875%20%22%20clip-rule=%22nonzero%22/%3E%3C/clipPath%3E%3CclipPath%20id=%22ca1f5799a3%22%3E%3Cpath%20d=%22M%20187.5%200.171875%20L%20404.023438%20410.144531%20L%20-29.023438%20410.144531%20Z%20M%20187.5%200.171875%20%22%20clip-rule=%22nonzero%22/%3E%3C/clipPath%3E%3CclipPath%20id=%228bb016993a%22%3E%3Crect%20x=%220%22%20width=%22375%22%20y=%220%22%20height=%22277%22/%3E%3C/clipPath%3E%3CclipPath%20id=%2276af0040d9%22%3E%3Cpath%20d=%22M%200%20195.949219%20L%20375%20195.949219%20L%20375%20375%20L%200%20375%20Z%20M%200%20195.949219%20%22%20clip-rule=%22nonzero%22/%3E%3C/clipPath%3E%3CclipPath%20id=%221062f89594%22%3E%3Cpath%20d=%22M%200%200.949219%20L%20375%200.949219%20L%20375%20180%20L%200%20180%20Z%20M%200%200.949219%20%22%20clip-rule=%22nonzero%22/%3E%3C/clipPath%3E%3CclipPath%20id=%2217bc809498%22%3E%3Crect%20x=%220%22%20width=%22375%22%20y=%220%22%20height=%22180%22/%3E%3C/clipPath%3E%3CclipPath%20id=%22ad524f887e%22%3E%3Cpath%20d=%22M%202%2094%20L%20293%2094%20L%20293%20342%20L%202%20342%20Z%20M%202%2094%20%22%20clip-rule=%22nonzero%22/%3E%3C/clipPath%3E%3CclipPath%20id=%22ac73806eb1%22%3E%3Crect%20x=%220%22%20width=%22294%22%20y=%220%22%20height=%22342%22/%3E%3C/clipPath%3E%3C/defs%3E%3Crect%20x=%22-37.5%22%20width=%22450%22%20fill=%22%23ffffff%22%20y=%22-37.499999%22%20height=%22449.999989%22%20fill-opacity=%221%22/%3E%3Crect%20x=%22-37.5%22%20width=%22450%22%20fill=%22%23ffffff%22%20y=%22-37.499999%22%20height=%22449.999989%22%20fill-opacity=%221%22/%3E%3Cg%20clip-path=%22url(%23413a615d81)%22%3E%3Cg%20transform=%22matrix(1,%200,%200,%201,%200,%200)%22%3E%3Cg%20clip-path=%22url(%2366f7fee432)%22%3E%3Cg%20clip-path=%22url(%23b4114fb668)%22%3E%3Cg%20clip-path=%22url(%2302d2f74560)%22%3E%3Crect%20x=%22-82.5%22%20width=%22540%22%20fill=%22%2301adef%22%20height=%22539.999987%22%20y=%22-82.499998%22%20fill-opacity=%221%22/%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/g%3E%3Cg%20clip-path=%22url(%2344a7358375)%22%3E%3Cg%20clip-path=%22url(%2306d1da3b78)%22%3E%3Cg%20transform=%22matrix(1,%200,%200,%201,%2066,%2066)%22%3E%3Cg%20clip-path=%22url(%2367bf874d33)%22%3E%3Cg%20clip-path=%22url(%235f19be2713)%22%3E%3Cg%20clip-path=%22url(%23fde3ba0cc4)%22%3E%3Cpath%20fill=%22%23ffffff%22%20d=%22M%200.527344%200.527344%20L%20242.472656%200.527344%20L%20242.472656%20242.472656%20L%200.527344%20242.472656%20Z%20M%200.527344%200.527344%20%22%20fill-opacity=%221%22%20fill-rule=%22nonzero%22/%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/g%3E%3Cg%20clip-path=%22url(%2305f2bd6677)%22%3E%3Cg%20clip-path=%22url(%23a5274c9106)%22%3E%3Cg%20transform=%22matrix(1,%200,%200,%201,%200,%2098)%22%3E%3Cg%20clip-path=%22url(%238bb016993a)%22%3E%3Cg%20clip-path=%22url(%230f4217ffe3)%22%3E%3Cg%20clip-path=%22url(%23ca1f5799a3)%22%3E%3Cpath%20fill=%22%23ffffff%22%20d=%22M%20-29.023438%200.171875%20L%20403.371094%200.171875%20L%20403.371094%20410.144531%20L%20-29.023438%20410.144531%20Z%20M%20-29.023438%200.171875%20%22%20fill-opacity=%221%22%20fill-rule=%22nonzero%22/%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/g%3E%3Cg%20clip-path=%22url(%2376af0040d9)%22%3E%3Cg%20transform=%22matrix(1,%200,%200,%201,%200,%20195)%22%3E%3Cg%20clip-path=%22url(%2317bc809498)%22%3E%3Cg%20clip-path=%22url(%231062f89594)%22%3E%3Cpath%20fill=%22%23ffffff%22%20d=%22M%20-62.902344%200.949219%20L%20438.316406%200.949219%20L%20438.316406%20313.144531%20L%20-62.902344%20313.144531%20Z%20M%20-62.902344%200.949219%20%22%20fill-opacity=%221%22%20fill-rule=%22nonzero%22/%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/g%3E%3Cg%20transform=%22matrix(1,%200,%200,%201,%2040,%2033)%22%3E%3Cg%20clip-path=%22url(%23ac73806eb1)%22%3E%3Cg%20clip-path=%22url(%23ad524f887e)%22%3E%3Cg%20fill=%22%23202b61%22%20fill-opacity=%221%22%3E%3Cg%20transform=%22translate(7.369923,%20344.002374)%22%3E%3Cg%3E%3Cpath%20d=%22M%20192.15625%20-48.484375%20L%2086.640625%20-48.484375%20L%2067.03125%200%20L%20-4.984375%200%20L%20105.171875%20-249.5625%20L%20174.6875%20-249.5625%20L%20285.21875%200%20L%20211.765625%200%20Z%20M%20171.484375%20-100.53125%20L%20139.390625%20-180.390625%20L%20107.3125%20-100.53125%20Z%20M%20171.484375%20-100.53125%20%22/%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/g%3E%3Cpath%20stroke-linecap=%22butt%22%20transform=%22matrix(0.75,%200,%200,%200.75,%200.0000045,%20209.710181)%22%20fill=%22none%22%20stroke-linejoin=%22miter%22%20d=%22M%20-0.000006%2010.001009%20L%2088.703125%2010.001009%20%22%20stroke=%22%23202b61%22%20stroke-width=%2220%22%20stroke-opacity=%221%22%20stroke-miterlimit=%224%22/%3E%3Cpath%20stroke-linecap=%22butt%22%20transform=%22matrix(0.75,%200,%200,%200.75,%20308.473813,%20209.710181)%22%20fill=%22none%22%20stroke-linejoin=%22miter%22%20d=%22M%20-0.00154239%2010.001009%20L%2088.701588%2010.001009%20%22%20stroke=%22%23202b61%22%20stroke-width=%2220%22%20stroke-opacity=%221%22%20stroke-miterlimit=%224%22/%3E%3C/svg%3E'\n","/**\n * ARBI Icon Component. Promoted from the ARBI app for SDK reuse.\n * The ARBI mark, bundled (no host asset needed).\n */\n\nimport React from 'react'\nimport { ARBI_MARK_SRC } from './arbi-mark'\n\ninterface ArbiIconProps {\n size?: number\n className?: string\n 'aria-label'?: string\n 'aria-hidden'?: boolean\n}\n\nexport const ArbiIcon: React.FC<ArbiIconProps> = ({\n size = 20,\n className = '',\n 'aria-label': ariaLabel = 'ARBI Docs',\n 'aria-hidden': ariaHidden = false,\n}) => {\n return (\n <img\n src={ARBI_MARK_SRC}\n alt={ariaLabel}\n className={`rounded object-contain ${className}`}\n style={{ width: size, height: size }}\n aria-label={ariaLabel}\n aria-hidden={ariaHidden}\n />\n )\n}\n","import React, { useId } from 'react'\n\ninterface ArbiBotHeadIconProps {\n size?: number\n className?: string\n}\n\nexport const ArbiBotHeadIcon: React.FC<ArbiBotHeadIconProps> = ({ size = 24, className = '' }) => {\n const maskId = useId()\n\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"30 -5 190 190\"\n preserveAspectRatio=\"xMidYMid meet\"\n className={className}\n >\n <defs>\n <mask id={maskId}>\n <g transform=\"translate(0,250) scale(0.1,-0.1)\">\n <rect x=\"0\" y=\"0\" width=\"2500\" height=\"2500\" fill=\"white\" />\n <circle cx=\"855\" cy=\"1715\" r=\"190\" fill=\"black\" />\n <circle cx=\"855\" cy=\"1715\" r=\"50\" fill=\"white\" />\n <circle cx=\"1665\" cy=\"1700\" r=\"190\" fill=\"black\" />\n <circle cx=\"1665\" cy=\"1700\" r=\"50\" fill=\"white\" />\n </g>\n </mask>\n </defs>\n <g mask={`url(#${maskId})`}>\n <g\n transform=\"translate(0,250) scale(0.1,-0.1)\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n strokeWidth=\"100\"\n >\n <path d=\"M1038 2434 c-217 -39 -406 -154 -522 -318 -121 -170 -176 -376 -103 -384 l27 -3 0 -106 c0 -88 -3 -108 -17 -118 -15 -11 -16 -18 -5 -66 44 -188 209 -369 420 -459 l65 -28 -74 -7 c-283 -26 -444 -152 -535 -418 -70 -204 -73 -507 -5 -507 4 0 12 75 19 168 18 263 68 419 167 530 78 87 224 162 263 134 9 -6 43 -26 76 -43 224 -117 802 -95 948 38 38 34 165 -22 253 -111 117 -119 168 -268 187 -549 6 -92 15 -167 19 -167 89 0 53 415 -54 627 -88 173 -238 270 -458 295 l-99 11 75 32 c201 88 367 274 406 454 10 47 9 56 -5 66 -13 10 -16 32 -16 118 l0 106 28 3 c91 10 -12 297 -165 459 -202 214 -544 307 -895 243z m472 -84 c170 -43 323 -140 416 -264 47 -61 117 -197 128 -248 l6 -28 -65 0 c-64 0 -65 1 -78 33 -43 102 -109 136 -262 137 l-110 0 -38 -40 c-25 -27 -46 -40 -65 -41 -134 -5 -394 1 -410 10 -11 6 -30 24 -42 41 l-21 30 -112 0 c-156 -1 -219 -33 -262 -136 -14 -34 -14 -34 -80 -34 -76 0 -74 -7 -30 103 96 243 311 406 595 452 118 20 319 13 430 -15z m-561 -505 c97 -50 126 -174 61 -263 -118 -163 -380 -23 -309 165 35 93 162 143 248 98z m799 -15 c129 -96 69 -304 -92 -318 -189 -16 -265 218 -106 326 48 33 149 29 198 -8z m272 -389 c0 -23 -45 -110 -86 -168 -245 -343 -856 -408 -1231 -130 -90 67 -213 236 -213 294 0 11 132 13 765 13 457 0 765 -4 765 -9z\" />\n </g>\n <g transform=\"translate(0,250) scale(0.1,-0.1)\" fill=\"currentColor\" stroke=\"none\">\n <path d=\"M785 1777 c-60 -60 -59 -134 1 -186 92 -82 236 9 204 128 -25 93 -138 125 -205 58z m161 -29 c7 -22 -19 -52 -40 -45 -21 7 -30 35 -17 51 19 23 48 20 57 -6z\" />\n <path d=\"M1591 1803 c-128 -67 -85 -243 60 -243 83 0 141 99 105 178 -32 69 -103 97 -165 65z m127 -59 c4 -25 -19 -47 -41 -38 -22 8 -30 34 -16 51 17 20 53 12 57 -13z\" />\n <path d=\"M843 1347 c-9 -15 9 -63 41 -108 148 -202 565 -209 730 -12 37 44 60 103 47 116 -13 13 -810 17 -818 4z\" />\n </g>\n </g>\n </svg>\n )\n}\n","import { MessageSquareLock, MessageSquareShare, type LucideProps } from 'lucide-react'\nimport { cn } from '../lib/utils'\n\n/** Thread visibility uses both shape and color across entity labels and grids. */\nexport function ThreadVisibilityIcon({\n shared,\n className,\n ...props\n}: LucideProps & { shared: boolean }) {\n const Icon = shared ? MessageSquareShare : MessageSquareLock\n return <Icon {...props} className={cn(shared ? 'text-secondary' : 'text-primary', className)} />\n}\n","/**\n * What each tag kind is called, from the entity registry (so a deployment that renames an entity —\n * an issue to \"Point\", say — renames it everywhere): `tagKindTitle('person', { plural: true })` is\n * \"People\", `tagKindNouns('label').singular` is \"label\".\n */\n\nimport { getEntityLabel, type EntityType } from './registry'\n\n/** The entity-label registry entry that names each kind (the SDK's `TagKind`s). */\nconst KIND_ENTITY = {\n label: 'LABEL',\n annotation: 'ANNOTATION',\n search: 'SAVED_SEARCH',\n issue: 'ISSUE',\n person: 'PERSON',\n organisation: 'ORGANISATION',\n} as const satisfies Record<string, EntityType>\n\n/** What a tag is: a label, annotation, search, issue, person or organisation. */\ntype TagKind = keyof typeof KIND_ENTITY\n\n/** A kind's name as a heading or option (\"Label\", \"Organisation\", plural \"People\"). */\nexport function tagKindTitle(kind: TagKind, { plural = false } = {}): string {\n return getEntityLabel(KIND_ENTITY[kind], plural ? 'PLURAL' : 'SINGULAR')\n}\n\n/** Singular / plural nouns for a kind, for running text (\"New label\", \"2 annotations\"). */\nexport function tagKindNouns(kind: TagKind): { singular: string; plural: string } {\n return {\n singular: tagKindTitle(kind).toLowerCase(),\n plural: tagKindTitle(kind, { plural: true }).toLowerCase(),\n }\n}\n","/**\n * ProjectEntity Component\n *\n * Fully-rounded pill for a \"project\" (a.k.a. a \"matter\" in some consumer apps).\n * The viewer's relationship to the project drives a TINTED (soft-fill) colour\n * so the kinds read at a glance without shouting:\n * - your paid project → primary tint\n * - someone else's → secondary tint\n * - your free project → grey tint\n * \"Common\" keeps the neutral muted pill.\n *\n * Promoted from the ARBI app and DECOUPLED: no store/stripe deps. The icon\n * defaults to the `CreditCard` glyph and can be overridden via `icon`, and\n * the display text via `label` (falls back to `name`) so consumers can relabel\n * a \"project\" as a \"matter\", \"case\", etc.\n */\n\nimport React from 'react'\nimport { CreditCard } from 'lucide-react'\nimport { EntityPill } from './EntityPill'\nimport { cn } from '../lib/utils'\n\nexport type ProjectRelation = 'mine' | 'other' | 'common'\n\nexport interface ProjectEntityProps {\n name: string\n /** Display text override (defaults to `name`) — lets a consumer relabel. */\n label?: string\n /** Icon override (defaults to the CreditCard glyph). */\n icon?: React.ReactNode\n subscription?: string\n hasCollaborators?: boolean\n size?: 'sm' | 'base'\n className?: string\n onClick?: (e: React.MouseEvent) => void\n /** Viewer's relationship to the project — drives the inverted pill colour. */\n relation?: ProjectRelation\n /** Whether the given `subscription` should be treated as paid. When omitted,\n * it's inferred from the `subscription` value ('active' | 'past_due' | 'dev'). */\n isPaid?: boolean\n /** Hover tooltip. */\n tooltipContent?: React.ReactNode\n}\n\ntype PillVariant = 'mine-paid' | 'mine-free' | 'other' | 'common'\n\n// Colour lives in the text and icon only (paid / shared / free); there is no fill or\n// border at rest, so the label stays quiet. The hover fill comes from EntityPill.\nconst VARIANT_STYLES: Record<PillVariant, { pill: string; icon: string }> = {\n 'mine-paid': {\n pill: 'text-primary',\n icon: 'text-primary',\n },\n other: {\n pill: 'text-secondary',\n icon: 'text-secondary',\n },\n 'mine-free': {\n pill: 'text-muted-foreground',\n icon: 'text-muted-foreground',\n },\n common: {\n pill: '',\n icon: 'text-muted-foreground',\n },\n}\n\nfunction resolveVariant(\n relation: ProjectRelation | undefined,\n paid: boolean,\n hasCollaborators: boolean\n): PillVariant {\n if (relation === 'common') return 'common'\n if (relation === 'other') return 'other'\n if (relation === 'mine') return paid ? 'mine-paid' : 'mine-free'\n // Legacy, subscription-driven callers (no relation given).\n if (paid) return hasCollaborators ? 'other' : 'mine-paid'\n return 'mine-free'\n}\n\nexport function ProjectEntity({\n name,\n label,\n icon,\n subscription = 'none',\n hasCollaborators = false,\n size = 'sm',\n className,\n onClick,\n relation,\n isPaid,\n tooltipContent,\n}: ProjectEntityProps) {\n const paid =\n isPaid ?? (subscription === 'active' || subscription === 'past_due' || subscription === 'dev')\n const variant = resolveVariant(relation, paid, hasCollaborators)\n const { pill, icon: iconClass } = VARIANT_STYLES[variant]\n\n const iconSizeClass = size === 'base' ? 'h-4 w-4' : 'h-3.5 w-3.5'\n const iconNode = icon ?? <CreditCard className={cn(iconSizeClass, iconClass)} />\n\n return (\n <EntityPill\n icon={iconNode}\n label={label ?? name}\n size={size}\n shape=\"rounded\"\n className={cn(pill, className)}\n onClick={onClick}\n tooltipContent={tooltipContent}\n />\n )\n}\n","import { BadgeCheck } from 'lucide-react'\nimport { cn } from '../lib/utils'\n\nexport interface VerifiedBadgeProps {\n className?: string\n /** Accessible name and hover text; default \"Identity verified\". */\n label?: string\n}\n\n/** The verified tick: the user passed an ID check under the name shown. */\nexport function VerifiedBadge({ className, label = 'Identity verified' }: VerifiedBadgeProps) {\n return (\n <BadgeCheck\n role=\"img\"\n aria-label={label}\n data-testid=\"verified-badge\"\n className={cn('h-3.5 w-3.5 shrink-0 text-sky-500', className)}\n >\n <title>{label}</title>\n </BadgeCheck>\n )\n}\n","/**\n * UserEntity Component\n *\n * Single source of truth for the user pill/avatar visual, promoted from the ARBI\n * app and DECOUPLED from the app store/API. It renders purely from injected,\n * already-resolved props — the app-coupled bits (current user, WebSocket presence\n * status, shared-workspace / agent-owner lookups) are resolved by the app adapter\n * and passed in as `isMe` / `displayStatus` / `tooltipContent` / `onClick`.\n *\n * Variants:\n * - pill: Avatar + name in a rounded container (default)\n * - icon: Avatar circle with hover tooltip\n *\n * Status-dot colours use the semantic `--color-status-*` token contract (see the\n * consuming app's @theme); they are seeded to the app's prior palette so the dots\n * stay pixel-identical.\n */\n\nimport React, { memo } from 'react'\nimport { MessageCircleMore } from 'lucide-react'\nimport { Avatar, AvatarFallback, AvatarImage } from '../ui/avatar'\nimport { ArbiBotHeadIcon } from '../icons/ArbiBotHeadIcon'\nimport { VerifiedBadge } from './VerifiedBadge'\nimport { Tooltip, TooltipContent, TooltipTrigger } from '../ui/tooltip'\nimport { cn } from '../lib/utils'\n\n/** Presence display status - WebSocket states plus 'hidden' for when status is intentionally not shown */\nexport type PresenceDisplayStatus = 'connected' | 'connecting' | 'disconnected' | 'error' | 'hidden'\n\nexport interface UserEntityProps {\n size?: 'xs' | 'sm' | 'md' | 'lg'\n variant?: 'icon' | 'pill'\n className?: string\n /** When true (default), shows tooltip on hover */\n showTooltip?: boolean\n /** When true (default), clicking triggers the injected action. Set false to disable interaction. */\n interactive?: boolean\n /** When true, shows a blue unread indicator on the chat icon */\n hasUnreadMessages?: boolean\n\n /** Two-letter initials shown in the avatar fallback (resolved by the app). */\n initials?: string\n /** Display label — \"You\" for the current user, else the real name. */\n displayName?: string\n /** Avatar image URL, if any. */\n picture?: string | null\n /** Optional image treatment for platform logos inside the normal avatar. */\n avatarImageClassName?: string\n /** Avatar background colour class for non-agents (e.g. 'bg-blue-500'). */\n colorClass?: string\n /** Whether this user is an agent — drives the dashed ring + bot badge. */\n isAgent?: boolean\n /** Verified tick (passed an ID check under this name): a badge after the name in the pill. */\n isVerified?: boolean\n /** Inline border/text colour for agent avatars (from the app's agentAvatarColors). */\n agentStyle?: React.CSSProperties\n /**\n * Inline avatar colours for ANY user, not only agents — e.g. the deterministic\n * tint the DM rows derive from the user id. Takes precedence over\n * `agentStyle`, which predates it and is the same mechanism under a narrower\n * name.\n */\n avatarStyle?: React.CSSProperties\n /** Whether this pill represents the current user — hides the chat icon and drives\n * which action `onClick` performs. */\n isMe?: boolean\n /** Resolved presence dot state; undefined hides the dot. */\n displayStatus?: PresenceDisplayStatus\n /** Resolved click handler (open settings for me, DM for others). */\n onClick?: (e: React.MouseEvent) => void\n /** Injected rich tooltip content (built by the app adapter). */\n tooltipContent?: React.ReactNode\n /** Render the empty \"no user\" avatar. */\n empty?: boolean\n}\n\nconst sizeClasses = {\n xs: 'h-5 w-5',\n sm: 'h-6 w-6',\n md: 'h-8 w-8',\n lg: 'h-10 w-10',\n}\n\nconst textSizeClasses = {\n xs: 'text-xs',\n sm: 'text-xs',\n md: 'text-xs',\n lg: 'text-sm',\n}\n\n// Presence dot sizes proportional to avatar size (larger for better visibility)\nconst presenceDotClasses = {\n xs: 'w-2 h-2 border',\n sm: 'w-2.5 h-2.5 border',\n md: 'w-3 h-3 border-2',\n lg: 'w-3.5 h-3.5 border-2',\n}\n\n// Position the presence dot at edge of avatar\nconst presencePositionClasses = {\n xs: '-right-1 bottom-0',\n sm: '-right-1 bottom-0',\n md: '-right-1.5 -bottom-0.5',\n lg: '-right-1.5 -bottom-0.5',\n}\n\n// Presence colours — semantic status tokens seeded to the app's prior palette\n// (matches the sidebar's connection-status colours).\n/** Accessible name for each dot state — the same wording PresenceLabel prints. */\nconst PRESENCE_LABELS: Record<PresenceDisplayStatus, string> = {\n connected: 'Online',\n connecting: 'Connecting',\n disconnected: 'Offline',\n error: 'Connection problem',\n hidden: 'Status hidden',\n}\n\nconst presenceColorClasses: Record<PresenceDisplayStatus, string> = {\n connected: 'bg-status-online',\n connecting: 'bg-status-connecting',\n disconnected: 'bg-status-away',\n error: 'bg-status-busy',\n hidden: 'bg-status-offline',\n}\n\nexport const UserEntity = memo(function UserEntity({\n size = 'md',\n variant = 'pill',\n className,\n showTooltip = true,\n interactive = true,\n hasUnreadMessages = false,\n initials = '',\n displayName = '',\n picture,\n avatarImageClassName,\n colorClass = '',\n isAgent = false,\n isVerified = false,\n agentStyle,\n avatarStyle,\n isMe = false,\n displayStatus,\n onClick,\n tooltipContent,\n empty = false,\n}: UserEntityProps) {\n // Empty state - no user\n if (empty) {\n return (\n <Avatar\n className={cn(sizeClasses[size], 'border border-border', className)}\n data-testid=\"user-entity\"\n >\n <AvatarFallback className=\"bg-status-empty text-muted-foreground text-xs font-semibold\">\n ?\n </AvatarFallback>\n </Avatar>\n )\n }\n\n const agentBadge = isAgent ? (\n <ArbiBotHeadIcon className=\"w-3.5 h-3.5 text-muted-foreground\" />\n ) : undefined\n\n // Messaging another user: the pill avatar doubles as the affordance — on hover it\n // swaps to a chat icon (see pillAvatar below). `showUnread` recolours the single\n // bottom-right status dot instead of adding a second indicator.\n const canMessage = interactive && !isMe && !isAgent\n const showUnread = hasUnreadMessages && !isMe && !isAgent\n\n // One resolved inline style for the avatar surface. `agentStyle` was always\n // applied regardless of `isAgent`; `avatarStyle` is the same thing named for\n // what it does, so a non-agent tint no longer has to masquerade as one.\n const surfaceStyle = avatarStyle ?? agentStyle\n\n // Core avatar element - used in both icon and pill variants\n const avatarCore = (\n <Avatar\n className={cn(\n sizeClasses[size],\n isAgent ? 'rounded-full border-2 border-dashed' : 'border border-white'\n )}\n style={surfaceStyle}\n data-testid=\"user-entity\"\n >\n {picture && <AvatarImage src={picture} alt={initials} className={avatarImageClassName} />}\n <AvatarFallback\n className={cn(\n textSizeClasses[size],\n 'font-semibold leading-none',\n isAgent ? 'rounded-full bg-transparent' : `text-white ${colorClass}`\n )}\n style={surfaceStyle}\n >\n {initials}\n </AvatarFallback>\n </Avatar>\n )\n\n // Bottom-right avatar dot — ONE dot, ONE location: blue (#00adef) when there's an\n // unread message from this user, otherwise the presence colour (green/grey/…).\n const statusDot =\n showUnread || displayStatus ? (\n <span\n className={cn(\n 'absolute rounded-full border-white',\n presenceDotClasses[size],\n presencePositionClasses[size],\n !showUnread && displayStatus ? presenceColorClasses[displayStatus] : ''\n )}\n style={showUnread ? { backgroundColor: '#00adef' } : undefined}\n data-testid=\"user-entity-presence\"\n // Named, not just coloured: a colour is legible only to someone who\n // already knows the convention, and to nobody using a screen reader.\n role=\"img\"\n aria-label={showUnread ? 'Unread messages' : PRESENCE_LABELS[displayStatus!]}\n title={showUnread ? 'Unread messages' : PRESENCE_LABELS[displayStatus!]}\n />\n ) : null\n\n // Icon variant avatar (used in stacks/columns) — avatar + optional status dot.\n // Inline-block at avatar size so a parent ring stays circular.\n const avatarElement = statusDot ? (\n <div\n className={cn(\n 'relative inline-block',\n sizeClasses[size],\n variant === 'pill' ? '' : className\n )}\n >\n {avatarCore}\n {statusDot}\n </div>\n ) : (\n <div className={cn('inline-block', variant === 'pill' ? '' : className)}>{avatarCore}</div>\n )\n\n // Pill variant avatar — the avatar itself IS the message affordance: on hover it\n // swaps to a chat icon (for other users), with the status dot pinned bottom-right.\n const pillAvatar = (\n // shrink-0: when the pill is squeezed the NAME truncates away — the avatar\n // must never collapse under it and overflow onto neighbouring text.\n <span className={cn('relative inline-block shrink-0', sizeClasses[size])}>\n <span className={cn('block transition-opacity', canMessage && 'group-hover/pill:opacity-0')}>\n {avatarCore}\n </span>\n {canMessage && (\n <span\n aria-hidden\n className=\"absolute inset-0 flex items-center justify-center rounded-full bg-muted text-foreground opacity-0 transition-opacity group-hover/pill:opacity-100\"\n >\n <MessageCircleMore className={size === 'xs' ? 'h-3 w-3' : 'h-4 w-4'} />\n </span>\n )}\n {statusDot}\n </span>\n )\n\n const resolvedTooltip = showTooltip ? tooltipContent : undefined\n\n // Pill variant — clean, borderless avatar + name (no container chrome). The avatar\n // itself is the message affordance (hover → chat icon); unread + presence share one\n // bottom-right dot. Only the agent badge trails the name. Interactivity + tooltip\n // are layered with no resting background — a subtle hover fill signals the target.\n if (variant === 'pill') {\n const row = (\n <>\n {pillAvatar}\n {displayName && (\n <span className=\"min-w-0 max-w-[320px] truncate text-sm leading-tight\">\n {displayName}\n </span>\n )}\n {isVerified && !isAgent && <VerifiedBadge />}\n {agentBadge}\n </>\n )\n const rowClass = 'group/pill inline-flex min-w-0 items-center gap-2'\n const clickable = interactive && !!onClick\n const clickableClass =\n \"relative cursor-pointer rounded-md px-1 py-0.5 -mx-1 transition-colors hover:bg-muted/60 pointer-coarse:after:absolute pointer-coarse:after:inset-x-0 pointer-coarse:after:-inset-y-3 pointer-coarse:after:content-['']\"\n\n if (resolvedTooltip) {\n return (\n <Tooltip>\n <TooltipTrigger\n type=\"button\"\n onClick={clickable ? onClick : undefined}\n onFocusCapture={(e) => e.stopPropagation()}\n className={cn(rowClass, clickable && clickableClass, className)}\n data-testid=\"user-entity-pill\"\n >\n {row}\n </TooltipTrigger>\n <TooltipContent className=\"p-2\">{resolvedTooltip}</TooltipContent>\n </Tooltip>\n )\n }\n\n if (clickable) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={cn(rowClass, clickableClass, className)}\n data-testid=\"user-entity-pill\"\n >\n {row}\n </button>\n )\n }\n\n return (\n <span className={cn(rowClass, className)} data-testid=\"user-entity-pill\">\n {row}\n </span>\n )\n }\n\n // Icon variant - always non-interactive, just show avatar with optional tooltip\n // Note: avoid asChild here — Radix ref merging with Avatar's internal refs causes infinite loops\n if (showTooltip) {\n return (\n <Tooltip>\n <TooltipTrigger\n onFocusCapture={(e) => e.stopPropagation()}\n className=\"touch-hit inline-flex\"\n >\n {avatarElement}\n </TooltipTrigger>\n <TooltipContent className=\"p-2\">{tooltipContent}</TooltipContent>\n </Tooltip>\n )\n }\n\n return avatarElement\n})\n","/**\n * The two things you need to know about a correspondent before you write to\n * them: whether it is an agent, and whether it is here.\n *\n * Both live beside {@link UserEntity} rather than in any one feature, because\n * an agent has to look like an agent wherever it appears — a conversation row,\n * a thread header, a members table. Splitting the mark per surface is how you\n * end up with three of them.\n */\n\nimport { ArbiBotHeadIcon } from '../icons/ArbiBotHeadIcon'\nimport { cn } from '../lib/utils'\nimport type { PresenceDisplayStatus } from './UserEntity'\n\n/**\n * \"AGENT\" stamp for an `agt-` peer.\n *\n * `UserEntity` already marks agents with a dashed ring and a bot icon, but that\n * is a detail you have to know to read. An agent is a different KIND of\n * correspondent — it acts on someone's behalf, and what you send it may be\n * acted on rather than read — so it also gets a label you cannot miss.\n */\nexport function AgentBadge({ className }: { className?: string }) {\n return (\n <span\n data-testid=\"agent-badge\"\n className={cn(\n 'inline-flex shrink-0 items-center gap-1 rounded-full border border-ai-accent/50',\n 'bg-ai-accent-soft px-2 py-0.5 text-xs font-bold uppercase tracking-wider text-ai-accent',\n className\n )}\n >\n <ArbiBotHeadIcon size={14} className=\"text-ai-accent\" />\n Agent\n </span>\n )\n}\n\n/** Wording for each presence state — `hidden` deliberately says nothing. */\nconst PRESENCE_WORDS: Record<PresenceDisplayStatus, string | null> = {\n connected: 'Online',\n connecting: 'Connecting',\n disconnected: 'Offline',\n error: 'Connection problem',\n hidden: null,\n}\n\n/**\n * Presence in words rather than a coloured dot alone.\n *\n * `status` is *resolved* by the app, exactly as {@link UserEntity} expects it,\n * and `undefined` renders nothing at all. That default matters: a consumer that\n * has not wired a WebSocket provider has no presence information, and labelling\n * every one of its contacts \"Offline\" would be stating something we do not\n * know. Whether absence of a signal means offline is a claim only the app can\n * make, so the app makes it by resolving to `disconnected`.\n */\nexport function PresenceLabel({\n status,\n className,\n}: {\n status?: PresenceDisplayStatus\n className?: string\n}) {\n if (!status) return null\n const word = PRESENCE_WORDS[status]\n if (!word) return null\n\n const online = status === 'connected'\n return (\n <span\n data-testid=\"presence-label\"\n className={cn('inline-flex shrink-0 items-center gap-1 text-xs', className)}\n >\n <span\n className={cn(\n 'size-1.5 rounded-full',\n online ? 'bg-status-online' : 'bg-muted-foreground/50'\n )}\n aria-hidden=\"true\"\n />\n <span className={online ? 'font-medium text-status-online' : 'text-muted-foreground'}>\n {word}\n </span>\n </span>\n )\n}\n","/**\n * Status pill + RAG dot — the generic presentation, with the domain vocabulary\n * INJECTED (never baked in), mirroring the entity registry (`configureEntityRegistry`).\n *\n * A deployment registers its own status→variant vocabulary and, if its Badge has\n * a bespoke skin (brand variants), injects that Badge too — so each app keeps its\n * exact pill look while sharing one component:\n *\n * configureStatusRegistry(\n * { Active: 'success', Privileged: 'brass', … }, // this firm's vocabulary\n * { fallback: 'outline', Badge: FirmBadge }, // this firm's Badge skin\n * )\n */\nimport { type ComponentType, type ReactNode } from 'react'\nimport { Badge as DefaultBadge } from '../ui/badge'\nimport { cn } from '../lib/utils'\n\n/** A status variant is an opaque string — its valid values are defined by the\n * injected Badge (or the default Badge's variants). */\nexport type StatusVariant = string\n\n/** The shape a consumer's Badge must satisfy to be injected as the pill skin. */\nexport interface StatusBadgeProps {\n variant?: StatusVariant\n className?: string\n children?: ReactNode\n 'data-testid'?: string\n}\nexport type StatusBadgeComponent = ComponentType<StatusBadgeProps>\n\n/** The package Badge's own variant vocabulary. Kept as an explicit runtime list so\n * the default skin can narrow a free-form StatusVariant to a known Badge variant\n * with a type guard (no cast) — an unrecognised status just renders as `outline`. */\ntype PackageBadgeVariant = 'default' | 'accent' | 'secondary' | 'destructive' | 'outline'\nconst PACKAGE_BADGE_VARIANTS: readonly PackageBadgeVariant[] = [\n 'default',\n 'accent',\n 'secondary',\n 'destructive',\n 'outline',\n]\nfunction isPackageBadgeVariant(v: string | undefined): v is PackageBadgeVariant {\n return PACKAGE_BADGE_VARIANTS.some((known) => known === v)\n}\n\n/** Default skin: the package Badge. A firm that registers variants outside this set\n * injects its own Badge (see `configureStatusRegistry`); here unknown → `outline`. */\nfunction PackageStatusBadge({ variant, ...rest }: StatusBadgeProps) {\n return <DefaultBadge variant={isPackageBadgeVariant(variant) ? variant : 'outline'} {...rest} />\n}\n\nconst registry: {\n variants: Record<string, StatusVariant>\n fallback: StatusVariant\n Badge: StatusBadgeComponent\n} = {\n variants: {},\n fallback: 'outline',\n Badge: PackageStatusBadge,\n}\n\n/** Register a firm's status→variant vocabulary (merged in place), and optionally\n * its fallback variant + its own Badge skin. Mirrors `configureEntityRegistry`. */\nexport function configureStatusRegistry(\n map: Record<string, StatusVariant>,\n opts?: { fallback?: StatusVariant; Badge?: StatusBadgeComponent }\n): void {\n Object.assign(registry.variants, map)\n if (opts?.fallback) registry.fallback = opts.fallback\n if (opts?.Badge) registry.Badge = opts.Badge\n}\n\n/** Resolve a status string to its variant (falls back to the registered default). */\nexport function getStatusVariant(status: string): StatusVariant {\n return registry.variants[status] ?? registry.fallback\n}\n\nexport interface StatusPillProps {\n status: string\n label?: string\n /** Escape hatch: force a variant, skipping the registry. */\n variant?: StatusVariant\n className?: string\n testId?: string\n}\n\n/** A status chip whose look comes from the injected Badge + registered vocabulary. */\nexport function StatusPill({ status, label, variant, className, testId }: StatusPillProps) {\n const Badge = registry.Badge\n return (\n <Badge variant={variant ?? getStatusVariant(status)} className={className} data-testid={testId}>\n {label ?? status}\n </Badge>\n )\n}\n\n// ── RAG dot ──────────────────────────────────────────────────────────────────\n\nexport type Rag = 'red' | 'amber' | 'green'\n\nlet RAG_LABELS: Record<Rag, string> = { red: 'At risk', amber: 'Attention', green: 'On track' }\n\n/** Override the RAG label copy (defaults are seeded so consumers stay identical). */\nexport function configureRagLabels(labels: Partial<Record<Rag, string>>): void {\n RAG_LABELS = { ...RAG_LABELS, ...labels }\n}\n\n/** A small RAG dot + optional label for dense tables. Semantic tokens only. */\nexport function RagDot({\n rag,\n withLabel,\n className,\n}: {\n rag: Rag\n withLabel?: boolean\n className?: string\n}) {\n const color = rag === 'red' ? 'bg-destructive' : rag === 'amber' ? 'bg-warning' : 'bg-success'\n return (\n <span className={cn('inline-flex items-center gap-1.5', className)} data-testid={`rag-${rag}`}>\n <span className={cn('size-2 rounded-full', color)} />\n {withLabel && <span className=\"text-xs text-muted-foreground\">{RAG_LABELS[rag]}</span>}\n </span>\n )\n}\n","/**\n * Entity colour system — the single source of truth for deriving a stable colour\n * from an entity id (workspace/tag/doc badges) shared across every app.\n *\n * ONE base palette (16 colours, indexed by the hex char at position 5 of an\n * entity id) + three opacity constants that shift every variant globally. Pure,\n * framework-free: no React, no store, no app `@/` imports.\n */\n\n// Adjust these three constants to shift all entity colours at once.\nconst OPACITY_LIGHT = 0.15 // Light backgrounds (tags with dark text)\nconst OPACITY_MEDIUM = 1.0 // Medium backgrounds (workspace icons with white text)\nconst OPACITY_BORDER = 0.3 // Borders\n\n/** Semantic placeholder colour for empty/pending states (gray-400). */\nexport const PLACEHOLDER_COLOR = '#9ca3af'\n\n/** Neutral gray for generic/unknown file types (slate-500). */\nexport const NEUTRAL_GRAY = '#64748b'\n\n/** Base palette — source of truth for all entity colours (hex char 0–f). */\nexport const BASE_COLORS: Record<string, string> = {\n '0': '#10b981',\n '1': '#3b82f6',\n '2': '#8b5cf6',\n '3': '#f43f5e',\n '4': '#f59e0b',\n '5': '#84cc16',\n '6': '#a855f7',\n '7': '#06b6d4',\n '8': '#f97316',\n '9': '#14b8a6',\n a: '#ef4444',\n b: '#6366f1',\n c: '#ec4899',\n d: '#22c55e',\n e: '#eab308',\n f: '#0ea5e9',\n}\n\n/** Convert a `#rrggbb` hex colour to an `rgba(...)` string at the given opacity. */\nfunction hexToRgba(hex: string, opacity: number): string {\n const r = parseInt(hex.slice(1, 3), 16)\n const g = parseInt(hex.slice(3, 5), 16)\n const b = parseInt(hex.slice(5, 7), 16)\n return `rgba(${r}, ${g}, ${b}, ${opacity})`\n}\n\n/**\n * Deterministic colour for an entity id. The 5th char (index 4) of the id selects\n * a base colour; the variant picks the opacity treatment.\n */\nexport function getEntityColor(\n entityId: string,\n variant: 'light' | 'medium' | 'text' = 'medium'\n): string {\n const baseColor = BASE_COLORS[entityId[4]] || BASE_COLORS['0']\n switch (variant) {\n case 'light':\n return hexToRgba(baseColor, OPACITY_LIGHT)\n case 'medium':\n return hexToRgba(baseColor, OPACITY_MEDIUM)\n case 'text':\n return baseColor\n }\n}\n\n/** Full badge colour set for an entity id: light background + solid text + border. */\nexport function getEntityColorStyles(entityId: string): {\n backgroundColor: string\n color: string\n borderColor: string\n} {\n const baseColor = BASE_COLORS[entityId[4]] || BASE_COLORS['0']\n return {\n backgroundColor: getEntityColor(entityId, 'light'),\n color: baseColor,\n borderColor: hexToRgba(baseColor, OPACITY_BORDER),\n }\n}\n\n/**\n * Colour for a workspace id — the MEDIUM (solid) variant, for white text on top.\n * Returns the `--primary` token when colours are disabled or the id is invalid,\n * so callers always get a paintable value.\n */\nexport const getWorkspaceColor = (\n workspaceId: string | undefined | null,\n useWorkspaceColors?: boolean\n): string => {\n const shouldUseWorkspaceColors = useWorkspaceColors !== undefined ? useWorkspaceColors : true\n if (!shouldUseWorkspaceColors) return 'hsl(var(--primary))'\n const isValidId = workspaceId && workspaceId.startsWith('wrk-') && workspaceId.length >= 5\n if (!isValidId) return 'hsl(var(--primary))'\n return getEntityColor(workspaceId, 'medium')\n}\n","import React from 'react'\n\nexport type ShieldIconProps = {\n char?: string\n size?: number\n className?: string\n workspaceColor?: string\n isSelected?: boolean\n} & React.SVGAttributes<SVGElement>\n\nexport const ShieldIcon: React.FC<ShieldIconProps> = ({\n char,\n size = 24,\n className = '',\n workspaceColor,\n isSelected = false,\n ...props\n}) => {\n // workspaceColor is already a hex value from getWorkspaceColor()\n // which uses the central entity color system\n const fillColor =\n workspaceColor && workspaceColor !== 'hsl(var(--primary))' ? workspaceColor : 'transparent'\n const strokeColor = isSelected\n ? 'white'\n : workspaceColor && workspaceColor !== 'hsl(var(--primary))'\n ? workspaceColor\n : 'currentColor'\n\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill={fillColor}\n stroke={strokeColor}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={`lucide lucide-square ${className}`}\n {...props}\n >\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n {char && (\n <text\n x=\"12\"\n y=\"12.5\"\n textAnchor=\"middle\"\n fontSize=\"9\"\n fontFamily=\"sans-serif\"\n fontWeight=\"300\"\n dominantBaseline=\"middle\"\n stroke={workspaceColor ? 'white' : 'currentColor'}\n strokeWidth=\"0.8\"\n >\n {char.toUpperCase()}\n </text>\n )}\n </svg>\n )\n}\n","import type { CSSProperties } from 'react'\n\n/**\n * Map from Tailwind bg-color class to the actual CSS color value.\n * Used to style agent avatars as outlined (ring) shapes with matching border + text color.\n */\nconst BG_TO_COLOR: Record<string, string> = {\n 'bg-emerald-700': '#047857',\n 'bg-blue-700': '#1d4ed8',\n 'bg-purple-700': '#7e22ce',\n 'bg-amber-700': '#b45309',\n 'bg-rose-700': '#be123c',\n 'bg-red-700': '#b91c1c',\n 'bg-indigo-700': '#4338ca',\n 'bg-teal-700': '#0f766e',\n 'bg-cyan-700': '#0e7490',\n 'bg-sky-700': '#0369a1',\n 'bg-lime-700': '#4d7c0f',\n 'bg-orange-700': '#c2410c',\n 'bg-pink-700': '#be185d',\n 'bg-violet-700': '#6d28d9',\n 'bg-fuchsia-700': '#a21caf',\n 'bg-yellow-700': '#a16207',\n}\n\n/**\n * Returns inline styles for agent avatar border and text color,\n * matching the user's assigned bg color class.\n */\nexport function agentAvatarColors(bgColorClass: string): CSSProperties {\n const color = BG_TO_COLOR[bgColorClass] || '#047857'\n return { borderColor: color, color }\n}\n","/**\n * Document media-type helpers.\n *\n * Single source of truth for \"is this an image / video / audio file\", shared by\n * the viewer (which renders the original bytes for media but the generated PDF\n * for everything else) and the offline cache (which must fetch the same bytes\n * the viewer would). Keeps the extension lists from drifting between the two.\n */\n\n/** Lower-cased extension *including* the leading dot (e.g. '.pdf'), or '' when none. */\nfunction getDottedExtension(fileName: string | null | undefined): string {\n if (!fileName) return ''\n return fileName.substring(fileName.lastIndexOf('.')).toLowerCase()\n}\n\n// Extensions that cannot be previewed in the browser and have no PDF version: download only.\nconst DOWNLOAD_ONLY_EXTENSIONS = new Set([\n '.zip',\n '.rar',\n '.7z',\n '.tar',\n '.gz',\n '.exe',\n '.bin',\n '.dmg',\n '.iso',\n '.apk',\n '.msi',\n '.dll',\n '.so',\n '.psd',\n '.ai',\n '.sketch',\n])\n\nconst IMAGE_EXTENSIONS = new Set([\n '.jpg',\n '.jpeg',\n '.png',\n '.gif',\n '.bmp',\n '.tiff',\n '.tif',\n '.webp',\n])\n\nconst VIDEO_EXTENSIONS = new Set(['.mp4', '.mpeg', '.mpg', '.webm', '.mov', '.avi', '.mkv'])\n\nconst AUDIO_EXTENSIONS = new Set(['.mp3', '.wav', '.m4a', '.aac', '.ogg', '.flac'])\n\nexport function isImageFile(fileName: string | null | undefined): boolean {\n return IMAGE_EXTENSIONS.has(getDottedExtension(fileName))\n}\n\nexport function isVideoFile(fileName: string | null | undefined): boolean {\n return VIDEO_EXTENSIONS.has(getDottedExtension(fileName))\n}\n\nexport function isAudioFile(fileName: string | null | undefined): boolean {\n return AUDIO_EXTENSIONS.has(getDottedExtension(fileName))\n}\n\nexport function isMediaFile(fileName: string | null | undefined): boolean {\n return isImageFile(fileName) || isVideoFile(fileName) || isAudioFile(fileName)\n}\n\n/**\n * Whether the viewer renders the file's *original* bytes (true for media, which\n * we serve via `/download`) rather than the server-generated PDF preview (served\n * via `/view`). Drives both the viewer's endpoint choice and the offline cache.\n */\nexport function usesOriginalBytesForViewer(fileName: string | null | undefined): boolean {\n return isMediaFile(fileName)\n}\n\n/** Archives, executables and design files: no preview and no PDF version, only a download. */\nexport function isDownloadOnlyFile(fileName: string | null | undefined): boolean {\n return DOWNLOAD_ONLY_EXTENSIONS.has(getDottedExtension(fileName))\n}\n","/**\n * Friendly file-type label.\n *\n * `Doc.file_type` is populated from two unrelated upload paths in the\n * backend: sometimes it's a bare extension (``\"pdf\"``, ``\"docx\"``,\n * ``\"html\"``), sometimes it's a MIME type (``\"application/pdf\"``,\n * ``\"image/jpeg\"``). Showing the raw value as-is gives the grid a\n * mix of ``PDF`` and ``APPLICATION/PDF`` in the same column.\n *\n * This util normalises both shapes to a single short, capitalised\n * label. The classification is keyed off the MIME subtype (or the bare\n * extension) so adding a new entry only ever requires touching the\n * tables below.\n *\n * Falls back to the file name's extension when ``file_type`` is\n * missing or unrecognised, and finally to ``Other`` so the cell never\n * renders empty.\n */\n\n// Bare extension → friendly label. Lowercase keys, no leading dot.\nconst EXT_LABELS: Record<string, string> = {\n pdf: 'PDF',\n\n // Word / docs\n doc: 'Word',\n docx: 'Word',\n rtf: 'Word',\n odt: 'Word',\n\n // Spreadsheets\n xls: 'Excel',\n xlsx: 'Excel',\n ods: 'Excel',\n csv: 'CSV',\n tsv: 'CSV',\n\n // Slides\n ppt: 'PowerPoint',\n pptx: 'PowerPoint',\n odp: 'PowerPoint',\n\n // Plain text / markup\n txt: 'Text',\n log: 'Text',\n md: 'Markdown',\n markdown: 'Markdown',\n html: 'HTML',\n htm: 'HTML',\n xml: 'XML',\n json: 'JSON',\n yaml: 'YAML',\n yml: 'YAML',\n\n // Email\n eml: 'Email',\n msg: 'Email',\n mbox: 'Email',\n pst: 'Outlook',\n ost: 'Outlook',\n\n // Images\n jpg: 'Image',\n jpeg: 'Image',\n png: 'Image',\n gif: 'Image',\n bmp: 'Image',\n tif: 'Image',\n tiff: 'Image',\n webp: 'Image',\n svg: 'Image',\n heic: 'Image',\n heif: 'Image',\n\n // Audio\n mp3: 'Audio',\n wav: 'Audio',\n m4a: 'Audio',\n aac: 'Audio',\n ogg: 'Audio',\n flac: 'Audio',\n opus: 'Audio',\n\n // Video\n mp4: 'Video',\n webm: 'Video',\n mov: 'Video',\n avi: 'Video',\n mkv: 'Video',\n\n // Archives\n zip: 'Archive',\n tar: 'Archive',\n gz: 'Archive',\n rar: 'Archive',\n '7z': 'Archive',\n}\n\n// MIME subtype → friendly label. Keys are lowercase, no parameters\n// (i.e. anything after ``;`` is stripped before lookup). Used when\n// `file_type` looks like a MIME string (\"application/pdf\").\nconst MIME_SUBTYPE_LABELS: Record<string, string> = {\n // PDF\n pdf: 'PDF',\n 'x-pdf': 'PDF',\n\n // Word\n msword: 'Word',\n 'vnd.openxmlformats-officedocument.wordprocessingml.document': 'Word',\n 'vnd.oasis.opendocument.text': 'Word',\n rtf: 'Word',\n\n // Excel\n 'vnd.ms-excel': 'Excel',\n 'vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'Excel',\n 'vnd.oasis.opendocument.spreadsheet': 'Excel',\n csv: 'CSV',\n 'tab-separated-values': 'CSV',\n\n // PowerPoint\n 'vnd.ms-powerpoint': 'PowerPoint',\n 'vnd.openxmlformats-officedocument.presentationml.presentation': 'PowerPoint',\n 'vnd.oasis.opendocument.presentation': 'PowerPoint',\n\n // Plain text / markup\n plain: 'Text',\n html: 'HTML',\n xml: 'XML',\n json: 'JSON',\n markdown: 'Markdown',\n 'x-markdown': 'Markdown',\n yaml: 'YAML',\n 'x-yaml': 'YAML',\n\n // Email\n rfc822: 'Email',\n 'vnd.ms-outlook': 'Email',\n\n // Archives\n zip: 'Archive',\n 'x-zip-compressed': 'Archive',\n 'x-tar': 'Archive',\n gzip: 'Archive',\n 'x-7z-compressed': 'Archive',\n 'x-rar-compressed': 'Archive',\n}\n\n// Top-level MIME type → friendly label. Only used when neither the\n// extension table nor the subtype table matched, e.g. an unknown\n// image like ``image/avif``.\nconst MIME_TYPE_LABELS: Record<string, string> = {\n image: 'Image',\n audio: 'Audio',\n video: 'Video',\n text: 'Text',\n}\n\nfunction lookupExt(ext: string): string | undefined {\n return EXT_LABELS[ext.toLowerCase().replace(/^\\./, '')]\n}\n\nfunction lookupMime(mime: string): string | undefined {\n // Strip parameters: \"text/html; charset=utf-8\" → \"text/html\".\n const base = mime.toLowerCase().split(';')[0].trim()\n const slash = base.indexOf('/')\n if (slash <= 0) return undefined\n const top = base.slice(0, slash)\n const sub = base.slice(slash + 1)\n return MIME_SUBTYPE_LABELS[sub] ?? MIME_TYPE_LABELS[top]\n}\n\nfunction extFromFileName(fileName?: string | null): string | undefined {\n if (!fileName) return undefined\n const dot = fileName.lastIndexOf('.')\n if (dot <= 0 || dot === fileName.length - 1) return undefined\n return fileName.slice(dot + 1)\n}\n\n/**\n * Map a backend ``file_type`` value (extension OR MIME type) plus an\n * optional file name to a single short label suitable for a grid cell.\n *\n * Order:\n * 1. ``file_type`` looks like a MIME (\"a/b\") → MIME tables.\n * 2. ``file_type`` looks like a bare extension → extension table.\n * 3. ``file_name`` extension as a last-resort fallback.\n * 4. ``\"Other\"``.\n */\nexport function friendlyFileType(fileType?: string | null, fileName?: string | null): string {\n if (fileType) {\n const trimmed = fileType.trim()\n if (trimmed.includes('/')) {\n const fromMime = lookupMime(trimmed)\n if (fromMime) return fromMime\n } else {\n const fromExt = lookupExt(trimmed)\n if (fromExt) return fromExt\n }\n }\n\n const fnExt = extFromFileName(fileName)\n if (fnExt) {\n const fromExt = lookupExt(fnExt)\n if (fromExt) return fromExt\n }\n\n return 'Other'\n}\n","/**\n * UserMenu — the topbar account dropdown: an avatar (picture or initials) with a\n * chevron that opens a menu of account actions and a sign-out. Firm-agnostic —\n * the user, the menu items and logout are all supplied by the host; styling\n * tracks semantic tokens.\n */\nimport { Fragment, type ComponentType } from 'react'\nimport { ChevronDown, ChevronsUpDown, LogOut, X } from 'lucide-react'\nimport { Avatar, AvatarFallback, AvatarImage } from '../ui/avatar'\nimport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n} from '../ui/dropdown-menu'\nimport { cn } from '../lib/utils'\n\n/** Initials from a display name (falls back to \"?\"). */\nfunction nameInitials(name: string): string {\n const parts = name.trim().split(/\\s+/).filter(Boolean)\n if (!parts.length) return '?'\n return parts\n .slice(0, 2)\n .map((p) => p[0]?.toUpperCase() ?? '')\n .join('')\n}\n\nexport interface UserMenuItem {\n label: string\n icon?: ComponentType<{ className?: string }>\n onSelect: () => void\n testId?: string\n /** A count or short state on the right (e.g. the number of files processing). */\n badge?: string | number\n /** A small unread dot on the icon (e.g. new messages). */\n dot?: boolean\n /** Makes the row a labelled on/off switch (role menuitemcheckbox); selecting it flips the state. */\n checked?: boolean\n /** Draw a divider above this row to start a new group. */\n separatorBefore?: boolean\n}\n\n/** Connection/presence state shown as a dot on the avatar and a line under the\n * email — the account menu is where \"am I connected\" belongs. */\nexport interface UserMenuStatus {\n /** Short state word — \"Connected\", \"Working offline\". */\n label: string\n tone: 'online' | 'busy' | 'offline'\n /** Fine print under the label (e.g. the server domain). */\n detail?: string\n testId?: string\n}\n\nconst STATUS_DOT: Record<UserMenuStatus['tone'], string> = {\n online: 'bg-emerald-500',\n busy: 'bg-amber-500',\n offline: 'bg-destructive',\n}\n\nexport interface UserMenuProps {\n user: { name: string; email?: string | null; picture?: string | null }\n /** Optional connection status: avatar dot + a line in the dropdown header. */\n status?: UserMenuStatus\n /** Account actions above the sign-out divider (e.g. Settings). */\n items?: UserMenuItem[]\n onLogout: () => void\n logoutLabel?: string\n align?: 'start' | 'center' | 'end'\n /** Which side of the trigger the menu opens on (a footer trigger opens upward or sideways). */\n side?: 'top' | 'right' | 'bottom' | 'left'\n /**\n * `avatar` (default): avatar + chevron. `account`: a full-width account bar, avatar + display\n * name + chevron, for a sidebar footer.\n */\n variant?: 'avatar' | 'account'\n /** `avatar` only: draw the chevron (the icon-only rail hides it). */\n showChevron?: boolean\n classNames?: { trigger?: string; fallback?: string }\n testId?: string\n logoutTestId?: string\n}\n\nexport function UserMenu({\n user,\n status,\n items = [],\n onLogout,\n logoutLabel = 'Sign out',\n align = 'end',\n side = 'bottom',\n variant = 'avatar',\n showChevron = true,\n classNames,\n testId = 'user-menu',\n logoutTestId,\n}: UserMenuProps) {\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n className={cn(\n 'flex items-center gap-2 rounded-md transition-colors hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n variant === 'account'\n ? 'w-full min-w-0 p-1 text-left pointer-coarse:min-h-11'\n : 'px-1.5 py-1 pointer-coarse:min-h-11 pointer-coarse:min-w-11 pointer-coarse:justify-center',\n classNames?.trigger\n )}\n data-testid={testId}\n data-variant={variant}\n aria-label={variant === 'avatar' ? 'Account menu' : undefined}\n title={variant === 'avatar' ? user.name : undefined}\n >\n <span className=\"relative\">\n <Avatar className=\"size-8\">\n {user.picture ? <AvatarImage src={user.picture} alt={user.name} /> : null}\n <AvatarFallback\n className={cn('bg-primary text-primary-foreground', classNames?.fallback)}\n >\n {nameInitials(user.name)}\n </AvatarFallback>\n </Avatar>\n {status && (\n <span\n className={cn(\n 'absolute -bottom-0.5 -right-0.5 size-2.5 rounded-full border-2 border-background',\n STATUS_DOT[status.tone]\n )}\n title={status.detail ? `${status.label} · ${status.detail}` : status.label}\n data-testid={status.testId ? `${status.testId}-dot` : undefined}\n />\n )}\n </span>\n {variant === 'account' ? (\n <>\n <span className=\"min-w-0 flex-1 truncate text-sm font-medium text-foreground\">\n {user.name}\n </span>\n <ChevronsUpDown className=\"mr-1 size-4 shrink-0 text-muted-foreground\" />\n </>\n ) : (\n showChevron && <ChevronDown className=\"size-4 text-muted-foreground\" />\n )}\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align={align}\n side={side}\n sideOffset={8}\n collisionPadding={12}\n className=\"w-60 rounded-lg border-border/60 shadow-lg\"\n data-testid=\"user-menu-panel\"\n data-topbar-popover=\"\"\n >\n <DropdownMenuLabel className=\"relative pr-8 pointer-coarse:pr-12\">\n {/* Explicit close — on a phone (see blocks.css, which pins\n this panel full-width under the topbar) tap-outside is easy to\n miss since the panel covers most of the screen. Radix closes a\n DropdownMenu on any item select by default, so a plain item\n with no other effect doubles as a close button. */}\n <DropdownMenuItem\n className=\"absolute right-1 top-1 flex size-6 items-center justify-center rounded-md p-0 text-muted-foreground transition-colors hover:bg-accent hover:text-foreground focus:bg-accent pointer-coarse:right-0 pointer-coarse:top-0 pointer-coarse:size-11\"\n aria-label=\"Close account menu\"\n data-testid=\"user-menu-close\"\n >\n <X className=\"size-3.5\" />\n </DropdownMenuItem>\n <div className=\"truncate font-medium text-foreground\" title={user.name}>\n {user.name}\n </div>\n {user.email && (\n <div className=\"truncate text-xs font-normal text-muted-foreground\" title={user.email}>\n {user.email}\n </div>\n )}\n {status && (\n <div\n className=\"mt-1 text-xs font-normal text-muted-foreground\"\n data-testid={status.testId}\n >\n <span className=\"flex items-center gap-1.5\">\n <span className={cn('size-2 shrink-0 rounded-full', STATUS_DOT[status.tone])} />\n {status.label}\n </span>\n {status.detail && (\n <div className=\"mt-0.5 truncate pl-3.5 text-xs leading-tight text-muted-foreground/70\">\n {status.detail}\n </div>\n )}\n </div>\n )}\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n {items.map((item) => (\n <Fragment key={item.label}>\n {item.separatorBefore && <DropdownMenuSeparator />}\n <DropdownMenuItem\n onClick={item.onSelect}\n data-testid={item.testId}\n className=\"pointer-coarse:min-h-11\"\n {...(item.checked !== undefined\n ? { role: 'menuitemcheckbox', 'aria-checked': item.checked }\n : {})}\n >\n {item.icon && (\n <span className=\"relative flex shrink-0\">\n <item.icon className=\"size-4\" />\n {item.dot && (\n <span\n className=\"absolute -right-0.5 -top-0.5 size-2 rounded-full bg-primary ring-2 ring-popover\"\n aria-hidden\n />\n )}\n </span>\n )}\n <span className=\"min-w-0 flex-1 truncate\">{item.label}</span>\n {item.badge !== undefined && (\n <span className=\"rounded-full bg-muted px-1.5 text-xs font-medium tabular-nums text-muted-foreground\">\n {item.badge}\n </span>\n )}\n {item.checked !== undefined && (\n <span\n aria-hidden\n className={cn(\n 'flex h-4 w-7 shrink-0 items-center rounded-full p-0.5 transition-colors',\n item.checked ? 'bg-primary' : 'bg-border'\n )}\n >\n <span\n className={cn(\n 'size-3 rounded-full bg-background transition-transform',\n item.checked && 'translate-x-3'\n )}\n />\n </span>\n )}\n </DropdownMenuItem>\n </Fragment>\n ))}\n <DropdownMenuSeparator />\n <DropdownMenuItem\n onClick={onLogout}\n data-testid={logoutTestId ?? `${testId}-logout`}\n className=\"pointer-coarse:min-h-11\"\n >\n <LogOut className=\"size-4\" />\n {logoutLabel}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n"]}