@opengeni/react 6.1.0-canary.2 → 6.1.0-canary.4

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 (48) hide show
  1. package/README.md +5 -0
  2. package/dist/{browser-viewer-NTD6UIPR.js → browser-viewer-LGH4IP47.js} +3 -3
  3. package/dist/chunk-AWEBVNVX.js +1398 -0
  4. package/dist/chunk-AWEBVNVX.js.map +1 -0
  5. package/dist/{chunk-NYESIADM.js → chunk-B7TTSUEW.js} +3 -1
  6. package/dist/chunk-B7TTSUEW.js.map +1 -0
  7. package/dist/{chunk-UWVY3OXF.js → chunk-BC7BFCMN.js} +277 -455
  8. package/dist/chunk-BC7BFCMN.js.map +1 -0
  9. package/dist/chunk-BRM6FVZA.js +302 -0
  10. package/dist/chunk-BRM6FVZA.js.map +1 -0
  11. package/dist/{chunk-KZ4QDBGM.js → chunk-GHSSI2BK.js} +925 -1265
  12. package/dist/chunk-GHSSI2BK.js.map +1 -0
  13. package/dist/{chunk-NLTS7JHI.js → chunk-JPHDWKZE.js} +5 -5
  14. package/dist/{chunk-L5VJYZIW.js → chunk-O53CQZ6T.js} +7 -7
  15. package/dist/{chunk-24M4YBCL.js → chunk-PNAVEK2U.js} +4 -4
  16. package/dist/components/preview-loading.d.ts +2 -0
  17. package/dist/composer.js +4 -4
  18. package/dist/connect-setup.d.ts +2 -0
  19. package/dist/connect.js +19 -8
  20. package/dist/connect.js.map +1 -1
  21. package/dist/index.js +27 -27
  22. package/dist/interaction.js +2 -2
  23. package/dist/machines.js +2 -2
  24. package/dist/plugin-discovery.d.ts +2 -0
  25. package/dist/realtime.js +20 -20
  26. package/dist/realtime.js.map +1 -1
  27. package/dist/session-ui.js +7 -7
  28. package/dist/session.js +3 -3
  29. package/package.json +3 -3
  30. package/src/components/markdown.tsx +13 -21
  31. package/src/components/preview-loading.tsx +154 -0
  32. package/src/connect-setup.tsx +17 -5
  33. package/src/hooks/use-composer.ts +6 -0
  34. package/src/plugin-discovery.tsx +10 -6
  35. package/src/realtime/realtime-control.tsx +6 -8
  36. package/styles/compiled.css +48 -8
  37. package/styles/index.css +45 -0
  38. package/dist/chunk-G5JFM6ZE.js +0 -911
  39. package/dist/chunk-G5JFM6ZE.js.map +0 -1
  40. package/dist/chunk-HQV2I5HV.js +0 -124
  41. package/dist/chunk-HQV2I5HV.js.map +0 -1
  42. package/dist/chunk-KZ4QDBGM.js.map +0 -1
  43. package/dist/chunk-NYESIADM.js.map +0 -1
  44. package/dist/chunk-UWVY3OXF.js.map +0 -1
  45. /package/dist/{browser-viewer-NTD6UIPR.js.map → browser-viewer-LGH4IP47.js.map} +0 -0
  46. /package/dist/{chunk-NLTS7JHI.js.map → chunk-JPHDWKZE.js.map} +0 -0
  47. /package/dist/{chunk-L5VJYZIW.js.map → chunk-O53CQZ6T.js.map} +0 -0
  48. /package/dist/{chunk-24M4YBCL.js.map → chunk-PNAVEK2U.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/timeline/screenshot-lightbox.tsx","../src/workstream-control-event.ts","../src/commands/registry.ts","../src/hooks/use-slash-commands.ts","../src/components/command-palette.tsx","../src/components/model-picker.tsx","../src/components/composer.tsx","../src/voice-recording-store.ts","../src/hooks/use-transcription.ts","../src/hooks/use-voice-input.ts","../src/voice-recording-owner.ts","../src/components/composer-transcription-control.tsx"],"sourcesContent":["import { DownloadIcon, XIcon } from \"lucide-react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n type ReactNode,\n} from \"react\";\nimport { Dialog } from \"radix-ui\";\nimport { cn } from \"../lib/cn\";\nimport { usePortalTokenStyle } from \"../lib/use-portal-token-style\";\n\n/* ----------------------------------------------------------------------------\n Screenshot lightbox\n\n A single, app-level lightbox the computer_call / view_image renderers open by\n `src`. Built on Radix Dialog so it is focus-trapped, ESC-closable, and\n scroll-locked — fixing the v1 mockup's broken expand (an absolutely-positioned\n <img> that overflowed its row). The image is centered, constrained to the\n viewport (`max-w/max-h` + `object-contain`), and sits on a dimmed backdrop.\n\n Consumers render `<LightboxProvider>` once near the timeline; renderers call\n `useLightbox().open(src)`.\n -------------------------------------------------------------------------- */\n\ntype LightboxController = {\n open: (\n src: string,\n caption?: string,\n source?: HTMLElement | null,\n label?: string,\n downloadFilename?: string,\n controlLabels?: LightboxControlLabels,\n releaseSource?: () => void,\n ) => void;\n};\n\nexport type LightboxControlLabels = {\n download?: string | undefined;\n close?: string | undefined;\n};\n\nconst LightboxContext = createContext<LightboxController | null>(null);\n\n/** Open the app-level screenshot lightbox. No-op outside a `LightboxProvider`. */\nexport function useLightbox(): LightboxController {\n return useContext(LightboxContext) ?? NOOP;\n}\n\n/**\n * The lightbox controller when one is mounted, or `null` outside a\n * `LightboxProvider`. Lets a media primitive degrade to a non-interactive image\n * (rather than a dead \"Expand\" button that announces an action it cannot do).\n */\nexport function useLightboxOptional(): LightboxController | null {\n return useContext(LightboxContext);\n}\n\nconst NOOP: LightboxController = { open: () => {} };\n\n/** @internal Owns one optional retained lightbox source and releases it exactly once. */\nexport function createLightboxSourceOwner() {\n let releaseCurrent: (() => void) | null = null;\n return {\n replace(release?: (() => void) | undefined) {\n const previous = releaseCurrent;\n releaseCurrent = release ?? null;\n previous?.();\n },\n release() {\n const release = releaseCurrent;\n releaseCurrent = null;\n release?.();\n },\n };\n}\n\n/**\n * The app-level screenshot lightbox. Render once near the timeline; renderers\n * call `useLightbox().open(src)`.\n *\n * Idempotent by design: when an ancestor `LightboxProvider` already exists (e.g.\n * a `MessageTimeline` mounted inside an app that already wraps its shell), this\n * one becomes a pass-through and does NOT mount a second focus-trapping Dialog.\n * That keeps `MessageTimeline` self-sufficient (it owns its own provider) while\n * composing cleanly when nested.\n */\nexport function LightboxProvider({ children }: { children: ReactNode }) {\n const ancestor = useContext(LightboxContext);\n if (ancestor) {\n return <>{children}</>;\n }\n return <LightboxRoot>{children}</LightboxRoot>;\n}\n\nfunction LightboxRoot({ children }: { children: ReactNode }) {\n const [state, setState] = useState<{\n src: string;\n caption?: string;\n label: string;\n downloadFilename?: string;\n controlLabels?: LightboxControlLabels;\n } | null>(null);\n const [tokenSource, setTokenSource] = useState<HTMLElement | null>(null);\n const sourceOwner = useMemo(() => createLightboxSourceOwner(), []);\n const portalStyle = usePortalTokenStyle(tokenSource);\n\n const releaseCurrentSource = useCallback(() => {\n sourceOwner.release();\n }, [sourceOwner]);\n\n useEffect(() => releaseCurrentSource, [releaseCurrentSource]);\n\n const open = useCallback(\n (\n src: string,\n caption?: string,\n source?: HTMLElement | null,\n label = \"Screenshot\",\n downloadFilename?: string,\n controlLabels?: LightboxControlLabels,\n releaseSource?: () => void,\n ) => {\n sourceOwner.replace(releaseSource);\n setTokenSource(source ?? null);\n setState({\n src,\n label,\n ...(caption ? { caption } : {}),\n ...(downloadFilename ? { downloadFilename } : {}),\n ...(controlLabels ? { controlLabels } : {}),\n });\n },\n [sourceOwner],\n );\n\n const close = useCallback(() => {\n releaseCurrentSource();\n setState(null);\n setTokenSource(null);\n }, [releaseCurrentSource]);\n\n const controller = useMemo<LightboxController>(() => ({ open }), [open]);\n\n return (\n <LightboxContext.Provider value={controller}>\n {children}\n <Dialog.Root open={state !== null} onOpenChange={(next) => !next && close()}>\n <AnimatePresence>\n {state !== null ? (\n <Dialog.Portal forceMount>\n <Dialog.Overlay asChild forceMount>\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.15 }}\n className=\"og-root fixed inset-0 z-50 bg-black/90 backdrop-blur-md\"\n style={portalStyle}\n />\n </Dialog.Overlay>\n <Dialog.Content\n asChild\n forceMount\n aria-label={state.label}\n onOpenAutoFocus={(event) => event.preventDefault()}\n >\n <motion.div\n initial={{ opacity: 0, scale: 0.98 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.98 }}\n transition={{ duration: 0.18, ease: [0.16, 1, 0.3, 1] }}\n // Content is a full-inset centering wrapper layered above the\n // Overlay, so Radix's own click-outside (which fires on the\n // Overlay) can never see a backdrop click — every click lands on\n // Content. We make Content's own backdrop dismiss: a click whose\n // target is the wrapper itself (not the figure) closes it, so the\n // figcaption's \"click outside to close\" affordance is real.\n onClick={(event) => {\n if (event.target === event.currentTarget) {\n close();\n }\n }}\n className=\"og-root fixed inset-0 z-50 flex items-center justify-center p-6 sm:p-12\"\n style={portalStyle}\n >\n <Dialog.Title className=\"sr-only\">{state.label}</Dialog.Title>\n <Dialog.Description className=\"sr-only\">\n {state.caption ?? `Expanded ${state.label.toLowerCase()}`}\n </Dialog.Description>\n {/* The figure is one self-contained object: image, caption, and\n its own close control. The close button anchors to a wrapper\n sized to the IMAGE (w-fit), so it hugs the real top-right\n corner regardless of aspect ratio — never floating into the\n empty space of a wide figure column. */}\n <figure className=\"m-0 flex max-h-full max-w-5xl flex-col items-center gap-3\">\n <div className=\"relative flex min-h-0 w-fit max-w-full\">\n {/* A plain <img>: this SDK is framework-agnostic, with no host Image component. */}\n <img\n src={state.src}\n alt={state.caption ?? state.label}\n className=\"min-h-0 max-h-[82vh] w-auto max-w-full rounded-og-md border border-white/10 object-contain shadow-og-lg\"\n />\n <ScreenshotLightboxControls\n src={state.src}\n downloadFilename={state.downloadFilename}\n controlLabels={state.controlLabels}\n />\n </div>\n {state.caption ? (\n <figcaption className=\"max-w-2xl text-center font-og-mono text-og-xs text-white/55\">\n {state.caption}\n </figcaption>\n ) : (\n <figcaption className=\"font-og-mono text-og-xs uppercase tracking-[0.1em] text-white/35\">\n Esc or click outside to close\n </figcaption>\n )}\n </figure>\n </motion.div>\n </Dialog.Content>\n </Dialog.Portal>\n ) : null}\n </AnimatePresence>\n </Dialog.Root>\n </LightboxContext.Provider>\n );\n}\n\n/** @internal Exact controls rendered by an open screenshot lightbox. */\nexport function ScreenshotLightboxControls({\n src,\n downloadFilename,\n controlLabels,\n}: {\n src: string;\n downloadFilename?: string | undefined;\n controlLabels?: LightboxControlLabels | undefined;\n}) {\n return (\n <div className=\"absolute -right-3 -top-3 flex items-center gap-2\">\n {downloadFilename ? (\n <a\n href={src}\n download={downloadFilename}\n className={cn(\n \"inline-flex size-9 items-center justify-center rounded-full\",\n \"border border-white/15 bg-black/60 text-white/70 backdrop-blur\",\n \"transition-colors hover:border-white/30 hover:text-white\",\n )}\n aria-label={controlLabels?.download ?? `Download ${downloadFilename}`}\n >\n <DownloadIcon className=\"size-4\" />\n </a>\n ) : null}\n <Dialog.Close\n className={cn(\n \"inline-flex size-9 items-center justify-center rounded-full\",\n \"border border-white/15 bg-black/60 text-white/70 backdrop-blur\",\n \"transition-colors hover:border-white/30 hover:text-white\",\n )}\n aria-label={controlLabels?.close ?? \"Close\"}\n >\n <XIcon className=\"size-4\" />\n </Dialog.Close>\n </div>\n );\n}\n","/**\n * Document event hosts dispatch to open the workstream Pause/Resume surface.\n * Kept in a leaf module so session chrome can import the name without pulling\n * the ChatComposer / Radix tooltip graph into the app shell.\n */\nexport const OPEN_WORKSTREAM_CONTROL_EVENT = \"opengeni:open-workstream-control\";\n","import type { Permission } from \"@opengeni/sdk\";\nimport type { CommandContext, SlashArg, SlashCommand } from \"./types\";\n\n/**\n * Parse a composer value into a command name + the rest. A command is\n * recognized ONLY when the value's first character is \"/\" (the start token);\n * anything else is plain chat and returns null.\n *\n * \"/cl\" -> { name: \"cl\", rest: \"\", hasTrailingSpace: false }\n * \"/goal \" -> { name: \"goal\", rest: \"\", hasTrailingSpace: true }\n * \"/goal pause\"-> { name: \"goal\", rest: \"pause\", hasTrailingSpace: false }\n */\nexport type ParsedCommandLine = {\n name: string;\n rest: string;\n /** True when the name token is closed by a space — arg-hint mode. */\n hasTrailingSpace: boolean;\n args: string[];\n};\n\nexport function parseCommandLine(value: string): ParsedCommandLine | null {\n if (value[0] !== \"/\") {\n return null;\n }\n const body = value.slice(1);\n const firstSpace = body.indexOf(\" \");\n if (firstSpace === -1) {\n return { name: body, rest: \"\", hasTrailingSpace: false, args: [] };\n }\n const name = body.slice(0, firstSpace);\n const rest = body.slice(firstSpace + 1);\n return {\n name,\n rest,\n hasTrailingSpace: true,\n args: rest.split(/\\s+/).filter((token) => token.length > 0),\n };\n}\n\nconst PERMISSION_SUPERUSER: Permission = \"workspace:admin\";\n\n/** Whether the operator's permission set satisfies a command's gate. */\nexport function hasPermission(\n required: Permission | undefined,\n permissions: Permission[],\n): boolean {\n if (!required) {\n return true;\n }\n return permissions.includes(required) || permissions.includes(PERMISSION_SUPERUSER);\n}\n\n/** Match a command (by name or alias) against the value. */\nexport function matchCommand(\n commands: readonly SlashCommand[],\n value: string,\n): SlashCommand | null {\n const parsed = parseCommandLine(value);\n if (!parsed) {\n return null;\n }\n const token = parsed.name.toLowerCase();\n return (\n commands.find((command) => command.name === token || command.aliases?.includes(token)) ?? null\n );\n}\n\ntype FilterCtx = Pick<CommandContext, \"sessionId\" | \"status\" | \"permissions\">;\n\n/**\n * The commands visible for the current token + context. Permission-absent and\n * `available()===false` commands are dropped entirely (a gated command is never\n * shown, not shown-disabled). Filtering is a prefix match on name/alias.\n */\nexport function filterCommands(\n commands: readonly SlashCommand[],\n token: string,\n ctx: FilterCtx,\n): SlashCommand[] {\n const needle = token.toLowerCase();\n return commands.filter((command) => {\n if (!hasPermission(command.permission, ctx.permissions)) {\n return false;\n }\n if (command.available && !command.available(ctx)) {\n return false;\n }\n if (needle.length === 0) {\n return true;\n }\n return (\n command.name.startsWith(needle) ||\n (command.aliases?.some((alias) => alias.startsWith(needle)) ?? false)\n );\n });\n}\n\n/** Render a command's arg hint for the palette footer / help, e.g. \"<pause|resume>\". */\nexport function argHint(args: readonly SlashArg[] | undefined): string {\n if (!args || args.length === 0) {\n return \"\";\n }\n return args\n .map((arg) => {\n const label = arg.oneOf ? arg.oneOf.join(\"|\") : arg.name;\n return arg.required ? `<${label}>` : `[${label}]`;\n })\n .join(\" \");\n}\n\n/** The first required arg that has not yet been supplied, if any. */\nexport function firstMissingRequiredArg(command: SlashCommand, args: string[]): SlashArg | null {\n const required = (command.args ?? []).filter((arg) => arg.required);\n for (let i = 0; i < required.length; i += 1) {\n const value = args[i];\n if (value === undefined || value.length === 0) {\n return required[i] ?? null;\n }\n }\n return null;\n}\n\nfunction requireSession(ctx: CommandContext): string {\n if (!ctx.sessionId) {\n throw new Error(\"No active session yet — start a session first.\");\n }\n return ctx.sessionId;\n}\n\nconst hasSession = (ctx: FilterCtx): boolean => ctx.sessionId !== null;\n\n/**\n * The default command set. Adding a command is one object literal here; the\n * palette list, filter, arg-hint footer, and /help all render from this array.\n * Apps concat their own commands via the ChatComposer `commands` prop.\n */\nexport const defaultCommands: readonly SlashCommand[] = [\n {\n name: \"help\",\n aliases: [\"?\"],\n description: \"Show available commands.\",\n run: (_args, ctx) => {\n ctx.openHelp();\n return { status: \"ok\" };\n },\n },\n {\n name: \"clear-view\",\n description: \"Clear the local timeline view (this device only; no server change).\",\n run: (_args, ctx) => {\n // clearView() reports whether the host actually wired a view-reset. If it\n // didn't (the console surface has no resettable local timeline), reporting\n // \"Local view cleared.\" would be a false success — return an honest error\n // instead so the operator isn't told something happened when nothing did.\n const cleared = ctx.clearView();\n if (!cleared) {\n return {\n status: \"error\",\n message: \"This view can't be cleared here (no local timeline to reset).\",\n };\n }\n return { status: \"ok\", message: \"Local view cleared.\" };\n },\n },\n {\n name: \"goal\",\n description: \"Pause or resume the session's goal loop.\",\n permission: \"sessions:control\",\n available: hasSession,\n args: [\n { name: \"action\", required: true, oneOf: [\"pause\", \"resume\"], description: \"pause | resume\" },\n ],\n run: async (args, ctx) => {\n const sessionId = requireSession(ctx);\n const action = args[0];\n if (action !== \"pause\" && action !== \"resume\") {\n return { status: \"error\", message: \"Usage: /goal pause | /goal resume\" };\n }\n try {\n await ctx.client.updateGoal(ctx.workspaceId, sessionId, {\n status: action === \"pause\" ? \"paused\" : \"active\",\n });\n return { status: \"ok\", message: action === \"pause\" ? \"Goal paused.\" : \"Goal resumed.\" };\n } catch (cause) {\n return { status: \"error\", message: goalErrorMessage(cause, action) };\n }\n },\n },\n {\n name: \"compact\",\n description: \"Compact the conversation context now.\",\n permission: \"sessions:control\",\n available: hasSession,\n run: async (_args, ctx) => {\n const sessionId = requireSession(ctx);\n try {\n const result = await ctx.client.compactSessionContext(ctx.workspaceId, sessionId);\n return { status: \"ok\", message: result.message };\n } catch (cause) {\n return { status: \"error\", message: errorMessage(cause) ?? \"Could not compact context.\" };\n }\n },\n },\n {\n name: \"clear\",\n description: \"Clear the conversation context (destructive; audit-preserved).\",\n permission: \"sessions:control\",\n danger: true,\n available: hasSession,\n run: async (_args, ctx) => {\n const sessionId = requireSession(ctx);\n const confirmed = await ctx.confirm();\n if (!confirmed) {\n // Canceled: no error, but keep the \"/clear\" draft so the operator who\n // backed out doesn't silently lose what they typed.\n return { status: \"ok\", keepDraft: true };\n }\n try {\n await ctx.client.clearSessionContext(ctx.workspaceId, sessionId);\n return { status: \"ok\", message: \"Context cleared.\" };\n } catch (cause) {\n return { status: \"error\", message: clearErrorMessage(cause) };\n }\n },\n },\n];\n\nfunction errorMessage(cause: unknown): string | undefined {\n if (\n cause &&\n typeof cause === \"object\" &&\n \"message\" in cause &&\n typeof (cause as { message?: unknown }).message === \"string\"\n ) {\n return (cause as { message: string }).message;\n }\n return undefined;\n}\n\nfunction statusCode(cause: unknown): number | undefined {\n if (\n cause &&\n typeof cause === \"object\" &&\n \"status\" in cause &&\n typeof (cause as { status?: unknown }).status === \"number\"\n ) {\n return (cause as { status: number }).status;\n }\n return undefined;\n}\n\nfunction goalErrorMessage(cause: unknown, action: \"pause\" | \"resume\"): string {\n const code = statusCode(cause);\n if (code === 404) {\n return \"This session has no goal to control.\";\n }\n if (code === 409) {\n return action === \"resume\"\n ? \"Only a paused goal can be resumed.\"\n : \"Goal is already in a terminal state.\";\n }\n return errorMessage(cause) ?? `Could not ${action} the goal.`;\n}\n\nfunction clearErrorMessage(cause: unknown): string {\n if (statusCode(cause) === 409) {\n return \"Pause the session and wait for the current inference to settle, then clear context.\";\n }\n return errorMessage(cause) ?? \"Could not clear context.\";\n}\n","import type { KeyboardEvent } from \"react\";\nimport { useCallback, useMemo, useRef, useState } from \"react\";\nimport {\n argHint,\n filterCommands,\n firstMissingRequiredArg,\n matchCommand,\n parseCommandLine,\n} from \"../commands/registry\";\nimport type { CommandContext, SlashCommand } from \"../commands/types\";\n\n/**\n * Context the composer supplies for command execution and visibility. The\n * composer owns the UI affordances (notice/openHelp/clearView/confirm), so they\n * are NOT part of this slice — the hook closes over them via `handlers`.\n */\nexport type SlashCommandContext = Pick<\n CommandContext,\n \"client\" | \"workspaceId\" | \"sessionId\" | \"status\" | \"permissions\"\n>;\n\n/**\n * UI affordances the composer supplies. `confirm` differs from the registry-\n * facing {@link CommandContext.confirm} (which takes no args): the composer's\n * confirm receives the command being run so the confirm bar renders from that\n * exact command's identity. The hook bridges the two in {@link buildContext}.\n */\nexport type SlashCommandHandlers = Pick<CommandContext, \"notice\" | \"openHelp\" | \"clearView\"> & {\n confirm: (command: SlashCommand) => Promise<boolean>;\n};\n\nexport type ConfirmState = {\n command: SlashCommand;\n /** Resolve the pending confirm() promise. */\n resolve: (confirmed: boolean) => void;\n} | null;\n\nexport type UseSlashCommandsOptions = {\n commands: readonly SlashCommand[];\n context: SlashCommandContext | undefined;\n handlers: SlashCommandHandlers;\n /** The current composer draft. */\n value: string;\n /** Replace the composer draft (autocomplete writes through this). */\n setValue: (value: string) => void;\n};\n\nexport type UseSlashCommandsResult = {\n /** Whether the palette is open (a command token is being typed). */\n open: boolean;\n /**\n * Whether the draft is a slash-command attempt (matches a registered command)\n * — true even after Escape dismisses the popover. The composer blocks its send\n * path while this holds so a command can't be delivered to the agent as chat.\n */\n isCommandDraft: boolean;\n /** Commands shown for the current token + context, in display order. */\n items: SlashCommand[];\n /** Index into `items` of the highlighted row. */\n highlight: number;\n setHighlight: (index: number) => void;\n /** The matched command once the name is closed by a space (arg-hint mode). */\n activeCommand: SlashCommand | null;\n /** The arg hint string for the active command (footer), or \"\". */\n activeArgHint: string;\n /**\n * Key handler for the textarea. Returns true when it consumed the event\n * (the composer must then NOT run its send path). Only consumes while open.\n */\n onKeyDown: (event: KeyboardEvent<HTMLTextAreaElement>) => boolean;\n /** Run the highlighted command (or the active command in arg-hint mode). */\n runHighlighted: () => Promise<void>;\n /**\n * Run the command at an explicitly chosen index (a pointer click on a row).\n * Bypasses the exact-match token heuristic that runHighlighted uses for\n * keyboard Enter, so an explicit click always runs the clicked command.\n */\n runAt: (index: number) => Promise<void>;\n /** Autocomplete the highlighted command name + a trailing space. */\n autocompleteHighlighted: () => void;\n};\n\nexport function useSlashCommands(options: UseSlashCommandsOptions): UseSlashCommandsResult {\n const { commands, context, handlers, value, setValue } = options;\n const [highlight, setHighlight] = useState(0);\n // Escape closes the palette but keeps the draft. We remember the dismissed\n // value; any further edit (value !== dismissed) re-opens the palette.\n const [dismissedValue, setDismissedValue] = useState<string | null>(null);\n const dismissed = dismissedValue !== null && dismissedValue === value;\n\n // Whether the operator has explicitly arrow-navigated the highlight for the\n // CURRENT draft. When they have, Enter is an explicit choice of the\n // highlighted row — the exact-match token override must NOT hijack it (else\n // ArrowDown to /clear-view + Enter would still fire the destructive /clear,\n // since \"clear\" exact-matches the token). Reset whenever the draft changes.\n const navigatedRef = useRef(false);\n const navTokenRef = useRef(value);\n if (navTokenRef.current !== value) {\n navTokenRef.current = value;\n navigatedRef.current = false;\n }\n\n const parsed = useMemo(() => parseCommandLine(value), [value]);\n const filterCtx = useMemo(\n () => ({\n sessionId: context?.sessionId ?? null,\n status: context?.status ?? null,\n permissions: context?.permissions ?? [],\n }),\n [context?.sessionId, context?.status, context?.permissions],\n );\n\n // In arg-hint mode (\"/name \"), the list collapses to the matched command so\n // the palette shows just its arg hint; while typing the name it filters.\n const activeCommand = useMemo(() => {\n if (!parsed || !parsed.hasTrailingSpace) {\n return null;\n }\n return matchCommand(commands, value);\n }, [commands, value, parsed]);\n\n const items = useMemo(() => {\n if (!parsed) {\n return [];\n }\n if (activeCommand) {\n return [activeCommand];\n }\n return filterCommands(commands, parsed.name, filterCtx);\n }, [commands, parsed, activeCommand, filterCtx]);\n\n const open = parsed !== null && items.length > 0 && !dismissed;\n\n // Whether the current draft is a slash-command ATTEMPT that should be run via\n // the palette, never delivered to the agent as plain chat. True even when the\n // palette is dismissed (Escape) — the draft still starts with \"/\" and matches\n // a command, so the composer must block its send path (button + Enter) to keep\n // commands from leaking into the conversation as messages the model reads.\n const isCommandDraft = parsed !== null && items.length > 0;\n\n // Keep highlight in range as items change.\n const clampedHighlight = items.length === 0 ? 0 : Math.min(highlight, items.length - 1);\n\n const activeArgHint = activeCommand ? argHint(activeCommand.args) : \"\";\n\n // Build the context for a SPECIFIC command. The danger confirm() is bound to\n // that command so the confirm bar names the command actually about to run —\n // not whatever near-match happens to sit highlighted in the palette (e.g.\n // typing \"/clear\"+Enter runs the destructive `clear`, but `clear-view` sorts\n // first and would otherwise mislabel the bar as a harmless local-view reset).\n const buildContext = useCallback(\n (command: SlashCommand): CommandContext | null => {\n if (!context) {\n return null;\n }\n return { ...context, ...handlers, confirm: () => handlers.confirm(command) };\n },\n [context, handlers],\n );\n\n const execute = useCallback(\n async (command: SlashCommand, args: string[]): Promise<void> => {\n const ctx = buildContext(command);\n if (!ctx) {\n return;\n }\n try {\n const result = await command.run(args, ctx);\n if (result.message) {\n ctx.notice({ tone: result.status === \"ok\" ? \"ok\" : \"error\", message: result.message });\n }\n if (result.status === \"ok\" && !result.keepDraft) {\n setValue(\"\");\n }\n } catch (cause) {\n ctx.notice({ tone: \"error\", message: errorMessage(cause) });\n }\n },\n [buildContext, setValue],\n );\n\n const autocomplete = useCallback(\n (command: SlashCommand) => {\n setValue(`/${command.name} `);\n setHighlight(0);\n },\n [setValue],\n );\n\n const autocompleteHighlighted = useCallback(() => {\n const command = items[clampedHighlight];\n if (command) {\n autocomplete(command);\n }\n }, [items, clampedHighlight, autocomplete]);\n\n // Pointer and keyboard activation share this synchronous fence. React state\n // cannot disable a command row before a second same-tick activation arrives.\n const runningRef = useRef(false);\n\n // Resolve a SPECIFIC, already-chosen command against the current draft, then\n // either autocomplete (name-only / required arg missing) or execute. This is\n // the shared core for both Enter (which first resolves WHICH command via the\n // exact-match heuristic) and a pointer click (which has ALREADY chosen the\n // command — the clicked row — and must not re-resolve to a near-match).\n const runResolved = useCallback(\n async (command: SlashCommand, executionOptions?: { explicit?: boolean }): Promise<void> => {\n if (!parsed || runningRef.current) {\n return;\n }\n runningRef.current = true;\n try {\n const explicit = executionOptions?.explicit ?? false;\n // Token-vs-command equality is case-insensitive (matching the registry's\n // matchCommand/filterCommands), so a fully-typed \"/Clear\" counts as having\n // named `clear` and runs rather than autocompleting.\n const nameMatchesToken =\n command.name === parsed.name.toLowerCase() ||\n (command.aliases?.includes(parsed.name.toLowerCase()) ?? false);\n // A name-only token whose name doesn't yet equal the resolved command (e.g.\n // \"/cl\" -> clear) first autocompletes so the operator sees the full name.\n // An EXPLICIT pointer click skips this: the operator already chose the row,\n // so clicking \"/clear-view\" (while the token is \"clear\") runs it outright\n // rather than merely filling the name and waiting for a second Enter.\n if (!explicit && !activeCommand && !nameMatchesToken && !parsed.hasTrailingSpace) {\n autocomplete(command);\n return;\n }\n // When the click resolves a different command than the typed token, the\n // typed token's tail isn't this command's args — run with no positional\n // args and let the required-arg guard below prompt for them via autocomplete.\n const args = nameMatchesToken || parsed.hasTrailingSpace ? parsed.args : [];\n const missing = firstMissingRequiredArg(command, args);\n if (missing) {\n // A required arg is absent: keep the palette open at the arg hint rather\n // than firing a half-formed command.\n if (!parsed.hasTrailingSpace) {\n autocomplete(command);\n }\n return;\n }\n await execute(command, args);\n } finally {\n runningRef.current = false;\n }\n },\n [parsed, activeCommand, autocomplete, execute],\n );\n\n const runHighlighted = useCallback(async (): Promise<void> => {\n if (!parsed) {\n return;\n }\n // If the operator has arrow-navigated, Enter is an explicit choice of the\n // highlighted row — run it directly, exactly like a click. This makes\n // /clear-view reachable via ArrowDown+Enter even when \"/clear\" is fully\n // typed (otherwise the exact-match override below would hijack it).\n if (navigatedRef.current && !activeCommand) {\n const highlighted = items[clampedHighlight];\n if (highlighted) {\n await runResolved(highlighted, { explicit: true });\n }\n return;\n }\n // Otherwise (no explicit navigation): when the typed token is an exact\n // command name (e.g. \"/clear\" while the longer \"/clear-view\" sits first in\n // the filtered list), Enter should run THAT command, not autocomplete the\n // highlighted near-match. Exact match wins over the highlight; otherwise use\n // the highlighted row. A pointer click goes through runAt, never here.\n // Compare case-insensitively, matching filterCommands/matchCommand, so a\n // fully-typed \"/Clear\" still resolves to the exact (destructive) clear\n // rather than the highlighted prefix near-match.\n const token = parsed.name.toLowerCase();\n const exact = items.find((item) => item.name === token || item.aliases?.includes(token));\n const command = activeCommand ?? exact ?? items[clampedHighlight];\n if (!command) {\n return;\n }\n await runResolved(command);\n }, [parsed, activeCommand, items, clampedHighlight, runResolved]);\n\n // Run the command at an EXPLICITLY chosen index (a pointer click on a palette\n // row). Unlike runHighlighted this does NOT apply the exact-match override:\n // clicking the harmless `/clear-view` row while the draft is \"/clear\" must run\n // clear-view, never the destructive `/clear` that exact-matches the token. The\n // operator's pointer is the selection; token-resolution heuristics don't apply.\n const runAt = useCallback(\n async (index: number): Promise<void> => {\n const command = items[index];\n if (!command) {\n return;\n }\n await runResolved(command, { explicit: true });\n },\n [items, runResolved],\n );\n\n const onKeyDown = useCallback(\n (event: KeyboardEvent<HTMLTextAreaElement>): boolean => {\n if (!open) {\n return false;\n }\n switch (event.key) {\n case \"ArrowDown\": {\n event.preventDefault();\n navigatedRef.current = true;\n setHighlight((current) =>\n items.length === 0 ? 0 : (Math.min(current, items.length - 1) + 1) % items.length,\n );\n return true;\n }\n case \"ArrowUp\": {\n event.preventDefault();\n navigatedRef.current = true;\n setHighlight((current) => {\n const base = Math.min(current, items.length - 1);\n return items.length === 0 ? 0 : (base - 1 + items.length) % items.length;\n });\n return true;\n }\n case \"Tab\": {\n event.preventDefault();\n autocompleteHighlighted();\n return true;\n }\n case \"Enter\": {\n if (event.shiftKey || event.nativeEvent?.isComposing) {\n return false;\n }\n event.preventDefault();\n void runHighlighted();\n return true;\n }\n case \"Escape\": {\n event.preventDefault();\n // Close the palette but keep the draft intact. Remember the dismissed\n // value; the next edit re-opens (value !== dismissedValue).\n setDismissedValue(value);\n return true;\n }\n default:\n return false;\n }\n },\n [open, items, autocompleteHighlighted, runHighlighted, value],\n );\n\n return {\n open,\n isCommandDraft,\n items,\n highlight: clampedHighlight,\n setHighlight,\n activeCommand,\n activeArgHint,\n onKeyDown,\n runHighlighted,\n runAt,\n autocompleteHighlighted,\n };\n}\n\nfunction errorMessage(cause: unknown): string {\n if (cause instanceof Error) {\n return cause.message;\n }\n return String(cause);\n}\n","import { AnimatePresence, motion } from \"motion/react\";\nimport { argHint } from \"../commands/registry\";\nimport type { SlashCommand } from \"../commands/types\";\nimport { cn } from \"../lib/cn\";\n\nexport type CommandPaletteProps = {\n open: boolean;\n items: SlashCommand[];\n highlight: number;\n /** Hover/click selects a row. */\n onHighlight: (index: number) => void;\n /** Click runs the row (same path as Enter). */\n onRun: (index: number) => void;\n /** Footer arg hint shown in arg-hint mode (e.g. \"<pause|resume>\"). */\n argHintText: string;\n /** id used for aria-activedescendant wiring from the textarea. */\n listboxId: string;\n /** Accessible list label. Defaults to \"Slash commands\". */\n label?: string | undefined;\n /** Badge shown for destructive commands. Defaults to \"danger\". */\n dangerLabel?: string | undefined;\n};\n\n/**\n * The slash-command palette: a popover anchored above the textarea, rendered\n * entirely from the filtered registry. Dark-first, Linear/Vercel-calm, using\n * the opengeni#46 design tokens. Full keyboard nav lives in useSlashCommands;\n * this component is presentational + aria.\n */\nexport function CommandPalette({\n open,\n items,\n highlight,\n onHighlight,\n onRun,\n argHintText,\n listboxId,\n label = \"Slash commands\",\n dangerLabel = \"danger\",\n}: CommandPaletteProps) {\n return (\n <AnimatePresence>\n {open ? (\n <motion.div\n initial={{ opacity: 0, y: 6, scale: 0.99 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: 6, scale: 0.99 }}\n transition={{ duration: 0.13, ease: \"easeOut\" }}\n className={cn(\n \"absolute bottom-full left-0 right-0 z-20 mb-2 overflow-hidden\",\n \"rounded-og-lg border border-og-border bg-og-surface-2 shadow-og-sm\",\n )}\n >\n <ul\n id={listboxId}\n role=\"listbox\"\n aria-label={label}\n className=\"max-h-72 overflow-y-auto py-1\"\n >\n {items.map((command, index) => {\n const selected = index === highlight;\n const hint = argHint(command.args);\n return (\n <li\n key={command.name}\n id={`${listboxId}-option-${index}`}\n role=\"option\"\n aria-selected={selected}\n onMouseEnter={() => onHighlight(index)}\n onMouseDown={(event) => {\n // Keep textarea focus; run on click.\n event.preventDefault();\n onRun(index);\n }}\n className={cn(\n \"mx-1 flex cursor-pointer items-center gap-2 rounded-og-md px-2.5 py-1.5\",\n \"transition-colors duration-100\",\n selected\n ? \"bg-og-accent/15 text-og-fg\"\n : \"text-og-fg-muted hover:bg-og-surface-3\",\n )}\n >\n <span className=\"flex min-w-0 items-baseline gap-1.5\">\n <span\n className={cn(\n \"font-mono text-[13px]\",\n selected ? \"text-og-accent\" : \"text-og-fg\",\n )}\n >\n /{command.name}\n </span>\n {hint ? (\n <span className=\"truncate font-mono text-[11px] text-og-fg-subtle\">\n {hint}\n </span>\n ) : null}\n </span>\n <span className=\"ml-auto flex items-center gap-1.5\">\n {command.danger ? (\n <span className=\"rounded-og-xs bg-og-status-failed/15 px-1 text-[10px] uppercase tracking-wide text-og-status-failed\">\n {dangerLabel}\n </span>\n ) : null}\n <span className=\"og-command-description truncate text-[12px] text-og-fg-subtle max-sm:hidden\">\n {command.description}\n </span>\n </span>\n </li>\n );\n })}\n </ul>\n {argHintText ? (\n <div className=\"border-t border-og-border px-3 py-1.5 font-mono text-[11px] text-og-fg-subtle\">\n {argHintText}\n </div>\n ) : null}\n </motion.div>\n ) : null}\n </AnimatePresence>\n );\n}\n","import type { ClientModel } from \"@opengeni/sdk\";\nimport { ChevronDownIcon } from \"lucide-react\";\nimport { useId, useMemo } from \"react\";\nimport { groupPickerRowsByBillingClass, type PickerModelRow } from \"../model-policy\";\nimport { cn } from \"../lib/cn\";\n\nexport type ModelPickerProps = {\n /** Legacy host config models grouped by provider. */\n models?: ClientModel[] | undefined;\n /** Catalog-backed rows grouped by billing class. Preferred when available. */\n rows?: PickerModelRow[] | undefined;\n value?: string | undefined;\n onChange: (modelId: string) => void;\n disabled?: boolean | undefined;\n className?: string | undefined;\n label?: string | undefined;\n /**\n * When true (remote compaction v2), non-Codex models remain listed but are\n * disabled. Same picker chrome — only selectability changes.\n */\n codexOnly?: boolean | undefined;\n};\n\nconst EMPTY_CLIENT_MODELS: ClientModel[] = [];\n\nfunction isCodexClientModel(model: ClientModel): boolean {\n return model.id.startsWith(\"codex/\") || model.source === \"codex\";\n}\n\nfunction isCodexPickerRow(row: PickerModelRow): boolean {\n return row.id.startsWith(\"codex/\") || row.catalog.source === \"codex\";\n}\n\nfunction applyCodexOnlyRows(rows: PickerModelRow[], codexOnly: boolean): PickerModelRow[] {\n if (!codexOnly) return rows;\n return rows.map((row) => {\n if (isCodexPickerRow(row)) return row;\n return {\n ...row,\n selectable: false,\n unavailableReason: row.unavailableReason ?? \"Codex-only session\",\n };\n });\n}\n\nfunction providerGroups(models: ClientModel[], codexOnly: boolean) {\n const byProvider = new Map<\n string,\n { label: string; models: Array<ClientModel & { optionDisabled: boolean }> }\n >();\n for (const model of models) {\n let group = byProvider.get(model.provider);\n if (!group) {\n group = { label: model.providerLabel, models: [] };\n byProvider.set(model.provider, group);\n }\n group.models.push({\n ...model,\n optionDisabled: codexOnly && !isCodexClientModel(model),\n });\n }\n const groups = [...byProvider.values()];\n if (codexOnly) {\n const codexIndex = groups.findIndex((group) =>\n group.models.some((model) => !model.optionDisabled && isCodexClientModel(model)),\n );\n if (codexIndex > 0) groups.unshift(...groups.splice(codexIndex, 1));\n }\n return groups;\n}\n\nexport function ModelPicker({\n models = EMPTY_CLIENT_MODELS,\n rows,\n value,\n onChange,\n disabled,\n className,\n label = \"Model\",\n codexOnly = false,\n}: ModelPickerProps) {\n const selectId = useId();\n const effectiveRows = useMemo(\n () => (rows && rows.length > 0 ? applyCodexOnlyRows(rows, codexOnly) : []),\n [rows, codexOnly],\n );\n const billingGroups = useMemo(\n () =>\n effectiveRows.length > 0 ? groupPickerRowsByBillingClass(effectiveRows, { codexOnly }) : [],\n [effectiveRows, codexOnly],\n );\n const providerGroupList = useMemo(() => providerGroups(models, codexOnly), [models, codexOnly]);\n const useBillingGroups = Boolean(effectiveRows.length);\n\n if (models.length === 0 && effectiveRows.length === 0) {\n return null;\n }\n\n return (\n <span className={cn(\"relative inline-flex items-center\", className)}>\n <label htmlFor={selectId} className=\"sr-only\">\n {label}\n </label>\n <select\n id={selectId}\n value={value ?? \"\"}\n onChange={(event) => onChange(event.target.value)}\n disabled={disabled === true}\n aria-label={label}\n className={cn(\n \"og-model-picker-native h-8 max-w-[180px] cursor-pointer appearance-none truncate rounded-og-md bg-transparent pointer-coarse:h-11\",\n \"py-0 pl-2 pr-6 text-[13px] text-og-fg-muted\",\n \"transition-colors duration-150 hover:bg-og-surface-2 hover:text-og-fg\",\n \"focus:outline-hidden focus-visible:outline-hidden\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n )}\n >\n {useBillingGroups\n ? billingGroups.map((group) => (\n <optgroup key={group.billingClass} label={group.label}>\n {group.rows.map((row) => (\n <option key={row.id} value={row.id} disabled={!row.selectable}>\n {row.unavailableReason ? `${row.label} (${row.unavailableReason})` : row.label}\n </option>\n ))}\n </optgroup>\n ))\n : providerGroupList.map((group) => (\n <optgroup key={group.label} label={group.label}>\n {group.models.map((model) => (\n <option key={model.id} value={model.id} disabled={model.optionDisabled}>\n {model.label}\n </option>\n ))}\n </optgroup>\n ))}\n </select>\n <ChevronDownIcon\n aria-hidden\n className=\"pointer-events-none absolute right-1.5 size-3.5 text-og-fg-subtle\"\n />\n </span>\n );\n}\n","import type { ClientModel, EffectiveSessionControl } from \"@opengeni/sdk\";\nimport {\n ArrowUpIcon,\n ChevronDownIcon,\n FileIcon,\n ImageIcon,\n LoaderCircleIcon,\n PaperclipIcon,\n PauseIcon,\n PlayIcon,\n RotateCwIcon,\n XIcon,\n} from \"lucide-react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport {\n cloneElement,\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useId,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type ButtonHTMLAttributes,\n type ChangeEvent,\n type ClipboardEvent,\n type ComponentPropsWithoutRef,\n type DragEvent,\n type KeyboardEvent,\n type ReactElement,\n type ReactNode,\n type Ref,\n type RefObject,\n} from \"react\";\nimport { argHint, defaultCommands } from \"../commands/registry\";\nimport type { Notice, SlashCommand } from \"../commands/types\";\nimport type { ComposerState } from \"../hooks/use-composer\";\nimport { shouldSteerOnKey, shouldSubmitOnKey } from \"../hooks/use-composer\";\nimport type { UseFileAttachmentsResult } from \"../hooks/use-file-attachments\";\nimport {\n useSlashCommands,\n type ConfirmState,\n type SlashCommandContext,\n} from \"../hooks/use-slash-commands\";\nimport { cn } from \"../lib/cn\";\nimport {\n ComposerResponsiveContext,\n type ResponsiveBasis,\n} from \"../lib/composer-responsive-context\";\nimport { composerSubmissionErrorMessage, formatBytes, formatRelativeTime } from \"../lib/format\";\nimport type { PickerModelRow } from \"../model-policy\";\nimport { useLightboxOptional } from \"../timeline/screenshot-lightbox\";\nimport { OPEN_WORKSTREAM_CONTROL_EVENT } from \"../workstream-control-event\";\nimport { CommandPalette as CommandPaletteView } from \"./command-palette\";\nimport { ModelPicker as ModelPickerView } from \"./model-picker\";\nimport { TooltipProvider } from \"./tooltip\";\n\nexport { OPEN_WORKSTREAM_CONTROL_EVENT };\nexport type { ResponsiveBasis } from \"../lib/composer-responsive-context\";\n\nfunction ComposerTip({\n tip,\n children,\n}: {\n tip: string;\n children: ReactElement<{ title?: string }>;\n}) {\n if (!tip) return children;\n return cloneElement(children, { title: tip });\n}\n\nexport type ComposerDelivery = Pick<\n ComposerState,\n | \"value\"\n | \"setValue\"\n | \"send\"\n | \"steer\"\n | \"sending\"\n | \"canSend\"\n | \"error\"\n | \"clearError\"\n | \"annotations\"\n | \"requestAnnotationReview\"\n>;\n\nexport type ComposerDraftState = Pick<\n ComposerState,\n | \"draftConflict\"\n | \"draftSaving\"\n | \"resolveDraftConflict\"\n | \"restoredResources\"\n | \"removeRestoredResource\"\n>;\n\nexport type ComposerControlState = Pick<\n ComposerState,\n \"pause\" | \"pausing\" | \"resume\" | \"resumeScope\" | \"resuming\"\n>;\n\nexport type ComposerControlLinks = {\n workspaceHref?: string | undefined;\n sessionHref?: ((sessionId: string) => string) | undefined;\n};\n\nexport type ChatComposerMessages = {\n messagePlaceholder: string;\n pausedPlaceholder: string;\n inputLabel: string;\n keyboardHint: string;\n slashCommandBlocked: string;\n controlChangedError: string;\n sendFailedError: string;\n dropFiles: string;\n attachFiles: string;\n pauseAriaLabel: string;\n pauseTitle: string;\n sendMessageAriaLabel: string;\n sendAndResumeAriaLabel: string;\n sendTitle: string;\n sendAndResumeTitle: string;\n annotationNotesRequired: string;\n workspacePaused: string;\n pausedHere: string;\n parentBlocker: string;\n narrowerPause: string;\n pausedBy: (displayName: string) => string;\n queuedAhead: (count: number) => string;\n resumingAndSending: string;\n nextMessageResumes: string;\n resumeThisWorkstream: string;\n resumeShort: string;\n hidePauseDetails: string;\n showPauseDetails: string;\n pauseReasonsLabel: string;\n pausedByLabel: string;\n alsoPausedByLabel: string;\n resumeWorkspace: string;\n resumeFromSession: string;\n sessionCanRun: string;\n stillPausedBy: (displayName: string) => string;\n restoredResourcesLabel: string;\n restoredFile: (fileId: string) => string;\n removeRestoredResource: (index: number) => string;\n uploading: string;\n uploadFailed: string;\n previewAttachment: (name: string) => string;\n previewUnavailable?: string | undefined;\n attachmentPreviewLabel: string;\n downloadAttachment: (name: string) => string;\n closeAttachmentPreview: string;\n retryAttachment: (name: string) => string;\n retryUpload: string;\n removeAttachment: (name: string) => string;\n confirmCommand: (name: string) => string;\n confirmDescription: (command: SlashCommand) => string;\n cancel: string;\n runCommand: (name: string) => string;\n commands: string;\n slashCommandsLabel: string;\n modelLabel: string;\n close: string;\n danger: string;\n draftConflict: string;\n useOtherDraft: string;\n keepMine: string;\n savingDraft: string;\n formatBytes: (bytes: number) => string;\n formatRelativeTime: (changedAt: string) => string;\n};\n\nexport const defaultChatComposerMessages: ChatComposerMessages = {\n messagePlaceholder: \"Message the agent…\",\n pausedPlaceholder: \"Message the agent — it will wait in the queue…\",\n inputLabel: \"Message the agent\",\n keyboardHint: \"Enter to queue · Cmd/Ctrl+Enter to steer · Shift+Enter for a new line\",\n slashCommandBlocked:\n \"That's a slash command — press Enter in the command list to run it, or edit the line to send a message.\",\n controlChangedError:\n \"This workstream was paused while you were sending. Nothing was sent, and your draft is still here.\",\n sendFailedError: \"Sending failed — your draft is still here. Try again.\",\n dropFiles: \"Drop files to attach\",\n attachFiles: \"Attach files\",\n pauseAriaLabel: \"Pause this workstream\",\n pauseTitle: \"Pause this workstream; queued prompts and approvals are preserved\",\n sendMessageAriaLabel: \"Send message\",\n sendAndResumeAriaLabel: \"Add message to queue\",\n sendTitle: \"Queue message (Enter); steer with Cmd/Ctrl+Enter\",\n sendAndResumeTitle: \"Add to queue (Enter); steer now with Cmd/Ctrl+Enter\",\n annotationNotesRequired: \"Add a note to each quote before sending.\",\n workspacePaused: \"Workspace paused\",\n pausedHere: \"Paused here\",\n parentBlocker: \"parent\",\n narrowerPause: \"a narrower pause\",\n pausedBy: (displayName) => `Paused by ${displayName}`,\n queuedAhead: (count) =>\n `${count} waiting prompt${count === 1 ? \"\" : \"s\"}; your message joins the queue.`,\n resumingAndSending: \"Sending…\",\n nextMessageResumes: \"Messages wait in the queue until you resume.\",\n resumeThisWorkstream: \"Resume this workstream\",\n resumeShort: \"Resume\",\n hidePauseDetails: \"Hide pause details\",\n showPauseDetails: \"Show pause details\",\n pauseReasonsLabel: \"Reasons this workstream is paused\",\n pausedByLabel: \"Paused by \",\n alsoPausedByLabel: \"Also paused by \",\n resumeWorkspace: \"Resume workspace\",\n resumeFromSession: \"Resume from this session\",\n sessionCanRun: \"This session will be able to run\",\n stillPausedBy: (displayName) => `Still paused by ${displayName}`,\n restoredResourcesLabel: \"Restored prompt resources\",\n restoredFile: (fileId) => `File ${fileId.slice(0, 8)}`,\n removeRestoredResource: (index) => `Remove restored resource ${index + 1}`,\n uploading: \"Uploading\",\n uploadFailed: \"Upload failed\",\n previewAttachment: (name) => `Preview ${name}`,\n previewUnavailable: \"Preview unavailable\",\n attachmentPreviewLabel: \"Attachment preview\",\n downloadAttachment: (name) => `Download ${name}`,\n closeAttachmentPreview: \"Close\",\n retryAttachment: (name) => `Retry ${name}`,\n retryUpload: \"Retry upload\",\n removeAttachment: (name) => `Remove ${name}`,\n confirmCommand: (name) => `Confirm /${name}`,\n confirmDescription: (command) => `Run /${command.name}? ${command.description}`,\n cancel: \"Cancel\",\n runCommand: (name) => `Run /${name}`,\n commands: \"Commands\",\n slashCommandsLabel: \"Slash commands\",\n modelLabel: \"Model\",\n close: \"Close\",\n danger: \"danger\",\n draftConflict: \"This draft changed in another tab. Your local draft is still here.\",\n useOtherDraft: \"Use other draft\",\n keepMine: \"Keep mine\",\n // Kept for embedder message overrides / back-compat. Routine autosave is\n // silent — only draft conflicts surface under the composer.\n savingDraft: \"Saving draft…\",\n formatBytes,\n formatRelativeTime,\n};\n\nexport type ComposerSubmitMode = \"queue\" | \"steer\";\nexport type ComposerSubmitBlocker =\n | \"disabled\"\n | \"attachment\"\n | \"sending\"\n | \"command\"\n | \"annotations\"\n | \"empty\"\n | null;\n\nexport type UseChatComposerControllerOptions = {\n delivery: ComposerDelivery;\n draft?: ComposerDraftState | undefined;\n control?: ComposerControlState | undefined;\n effectiveControl?: EffectiveSessionControl | null | undefined;\n queuedAheadCount?: number | undefined;\n canControlWorkspace?: boolean | undefined;\n controlLinks?: ComposerControlLinks | undefined;\n disabled?: boolean | undefined;\n attachments?: UseFileAttachmentsResult | undefined;\n commands?: readonly SlashCommand[] | undefined;\n commandContext?: SlashCommandContext | undefined;\n onClearView?: (() => void) | undefined;\n onPaste?: ((event: ClipboardEvent<HTMLTextAreaElement>) => void) | undefined;\n messages?: Partial<ChatComposerMessages> | undefined;\n};\n\n/**\n * Off-document mirror for shrink/steady measure. Measuring with\n * `height: auto` on the live `rows={1}` textarea collapses it for a layout\n * frame, expands the flex timeline sibling, and yanks tip-follow — the\n * multi-line typing flicker that stops only once the box is capped.\n */\nlet composerHeightMirror: HTMLTextAreaElement | null = null;\n\nfunction measureComposerContentHeight(textarea: HTMLTextAreaElement): number {\n if (typeof document === \"undefined\") {\n return textarea.scrollHeight;\n }\n const width = textarea.clientWidth;\n if (width <= 0) {\n return textarea.offsetHeight;\n }\n\n let mirror = composerHeightMirror;\n if (!mirror) {\n mirror = document.createElement(\"textarea\");\n mirror.setAttribute(\"aria-hidden\", \"true\");\n mirror.tabIndex = -1;\n mirror.rows = 1;\n mirror.style.cssText =\n \"position:fixed;top:0;left:-100000px;visibility:hidden;pointer-events:none;height:auto;min-height:0;max-height:none;overflow:hidden;z-index:-1;\";\n composerHeightMirror = mirror;\n }\n\n const style = getComputedStyle(textarea);\n mirror.style.width = `${width}px`;\n mirror.style.boxSizing = style.boxSizing;\n mirror.style.font = style.font;\n mirror.style.fontSize = style.fontSize;\n mirror.style.fontFamily = style.fontFamily;\n mirror.style.fontWeight = style.fontWeight;\n mirror.style.fontStyle = style.fontStyle;\n mirror.style.letterSpacing = style.letterSpacing;\n mirror.style.lineHeight = style.lineHeight;\n mirror.style.textTransform = style.textTransform;\n mirror.style.paddingTop = style.paddingTop;\n mirror.style.paddingRight = style.paddingRight;\n mirror.style.paddingBottom = style.paddingBottom;\n mirror.style.paddingLeft = style.paddingLeft;\n mirror.style.borderTopWidth = style.borderTopWidth;\n mirror.style.borderRightWidth = style.borderRightWidth;\n mirror.style.borderBottomWidth = style.borderBottomWidth;\n mirror.style.borderLeftWidth = style.borderLeftWidth;\n mirror.style.borderStyle = style.borderStyle;\n mirror.style.whiteSpace = style.whiteSpace;\n mirror.style.wordBreak = style.wordBreak;\n mirror.style.overflowWrap = style.overflowWrap;\n mirror.value = textarea.value;\n\n if (!mirror.isConnected) {\n document.documentElement.appendChild(mirror);\n }\n return mirror.scrollHeight;\n}\n\n/**\n * Autosize a composer textarea up to `maxPx`. Never writes intermediate\n * `height: auto` / `0` on the live element — only the final pixel height.\n *\n * `measure` is injectable for unit tests; production always uses the off-DOM\n * mirror so shrink/steady never collapses the laid-out box.\n */\nexport function applyComposerTextareaHeight(\n textarea: HTMLTextAreaElement,\n maxPx: number = 220,\n measure: (el: HTMLTextAreaElement) => number = measureComposerContentHeight,\n): void {\n const before = textarea.offsetHeight;\n // Overflow: content taller than the box — scrollHeight is the needed size.\n // Fit/shrink: content fits (or box is oversized) — measure off-DOM.\n const nextPx = Math.min(\n textarea.scrollHeight > textarea.clientHeight + 1 ? textarea.scrollHeight : measure(textarea),\n maxPx,\n );\n if (Math.abs(nextPx - before) < 1) {\n return;\n }\n textarea.style.height = `${nextPx}px`;\n}\n\n/**\n * Headless interaction layer for a chat composer. It is the single owner of\n * delivery guards, keyboard routing, command interception, drag/drop, focus,\n * confirmation, and feedback state used by both the preset and primitives.\n */\nexport function useChatComposerController({\n delivery,\n draft,\n control,\n effectiveControl,\n queuedAheadCount = 0,\n canControlWorkspace = false,\n controlLinks,\n disabled = false,\n attachments,\n commands = defaultCommands,\n commandContext,\n onClearView,\n onPaste,\n messages: messageOverrides,\n}: UseChatComposerControllerOptions) {\n const messages = useMemo(\n () => ({ ...defaultChatComposerMessages, ...messageOverrides }),\n [messageOverrides],\n );\n const id = useId();\n const rootRef = useRef<HTMLDivElement | null>(null);\n const textareaRef = useRef<HTMLTextAreaElement | null>(null);\n const pauseButtonRef = useRef<HTMLButtonElement | null>(null);\n const fileInputRef = useRef<HTMLInputElement | null>(null);\n const listboxId = useId();\n const paused = effectiveControl?.state === \"paused\";\n const [controlDetailsOpen, setControlDetailsOpen] = useState(false);\n const [paletteMounted, setPaletteMounted] = useState(false);\n const [submitting, setSubmitting] = useState(false);\n const submittingRef = useRef(false);\n const controlOperationRef = useRef(false);\n const deliveryValue = delivery.value;\n const setDeliveryValue = delivery.setValue;\n const mountedRef = useRef(true);\n const deliveredValueRef = useRef(deliveryValue);\n const liveValueRef = useRef(deliveryValue);\n const [renderedValue, setRenderedValue] = useState(deliveryValue);\n const deliveryChanged = deliveryValue !== deliveredValueRef.current;\n if (deliveryChanged) {\n deliveredValueRef.current = deliveryValue;\n liveValueRef.current = deliveryValue;\n }\n const setComposerValue = useCallback(\n (next: string) => {\n liveValueRef.current = next;\n setRenderedValue(next);\n setDeliveryValue(next);\n },\n [setDeliveryValue],\n );\n const visibleValue = deliveryChanged ? deliveryValue : renderedValue;\n\n useLayoutEffect(() => {\n if (renderedValue !== liveValueRef.current) {\n setRenderedValue(liveValueRef.current);\n }\n }, [deliveryValue, renderedValue]);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n useEffect(() => {\n const openControl = (event: Event) => {\n const requestedId =\n event instanceof CustomEvent &&\n isRecord(event.detail) &&\n typeof event.detail.composerId === \"string\"\n ? event.detail.composerId\n : null;\n if (requestedId && requestedId !== id) return;\n if (!requestedId) {\n const roots = document.querySelectorAll(\"[data-og-composer-id]\");\n if (roots.length > 1 && !rootRef.current?.contains(document.activeElement)) return;\n }\n textareaRef.current?.scrollIntoView({ block: \"end\", behavior: \"smooth\" });\n if (paused) {\n setControlDetailsOpen(true);\n return;\n }\n window.requestAnimationFrame(() => pauseButtonRef.current?.focus());\n };\n document.addEventListener(OPEN_WORKSTREAM_CONTROL_EVENT, openControl);\n return () => document.removeEventListener(OPEN_WORKSTREAM_CONTROL_EVENT, openControl);\n }, [id, paused]);\n\n const blockedByAttachment = attachments?.hasUnresolved === true;\n const hasReadyAttachment = (attachments?.readyResources.length ?? 0) > 0;\n\n const [dragging, setDragging] = useState(false);\n const dragCarriesFiles = (event: { dataTransfer: DataTransfer | null }): boolean =>\n event.dataTransfer !== null && [...event.dataTransfer.types].includes(\"Files\");\n const handleDragOver = useCallback(\n (event: DragEvent<HTMLDivElement>) => {\n if (!attachments || !dragCarriesFiles(event)) return;\n event.preventDefault();\n setDragging(true);\n },\n [attachments],\n );\n const handleDragLeave = useCallback(\n (event: DragEvent<HTMLDivElement>) => {\n if (!attachments) return;\n if (event.currentTarget.contains(event.relatedTarget as Node | null)) return;\n setDragging(false);\n },\n [attachments],\n );\n const handleDrop = useCallback(\n (event: DragEvent<HTMLDivElement>) => {\n if (!attachments || !dragCarriesFiles(event)) return;\n event.preventDefault();\n setDragging(false);\n if (event.dataTransfer.files.length > 0) attachments.addFiles(event.dataTransfer.files);\n },\n [attachments],\n );\n\n const [notice, setNotice] = useState<Notice | null>(null);\n const [helpOpen, setHelpOpen] = useState(false);\n const [confirmState, setConfirmState] = useState<ConfirmState>(null);\n const pendingConfirm = useRef<((confirmed: boolean) => void) | null>(null);\n\n const settleConfirmation = useCallback((confirmed: boolean) => {\n const resolve = pendingConfirm.current;\n pendingConfirm.current = null;\n setConfirmState(null);\n resolve?.(confirmed);\n }, []);\n\n useEffect(\n () => () => {\n pendingConfirm.current?.(false);\n pendingConfirm.current = null;\n },\n [],\n );\n\n // Autosize without collapsing the composer to 0 on every keystroke. The old\n // height→0→content pattern briefly expanded the timeline scroller and yanked\n // tip-follow while streams were live (pin/unpin flicker when typing fast).\n const resizeInputRafRef = useRef<number | null>(null);\n const resizeInput = useCallback(() => {\n if (resizeInputRafRef.current !== null) {\n return;\n }\n resizeInputRafRef.current = requestAnimationFrame(() => {\n resizeInputRafRef.current = null;\n const textarea = textareaRef.current;\n if (!textarea) {\n return;\n }\n applyComposerTextareaHeight(textarea, 220);\n });\n }, []);\n useEffect(() => resizeInput(), [resizeInput, visibleValue]);\n useEffect(\n () => () => {\n if (resizeInputRafRef.current !== null) {\n cancelAnimationFrame(resizeInputRafRef.current);\n resizeInputRafRef.current = null;\n }\n },\n [],\n );\n\n const handlers = useMemo(\n () => ({\n notice: (next: Notice) => {\n setNotice(next);\n delivery.clearError();\n },\n openHelp: () => setHelpOpen(true),\n clearView: () => {\n if (!onClearView) return false;\n onClearView();\n return true;\n },\n confirm: (command: SlashCommand) =>\n new Promise<boolean>((resolve) => {\n pendingConfirm.current?.(false);\n pendingConfirm.current = resolve;\n setConfirmState({ command, resolve: settleConfirmation });\n }),\n }),\n [delivery, onClearView, settleConfirmation],\n );\n\n const palette = useSlashCommands({\n commands,\n context: commandContext,\n handlers,\n value: visibleValue,\n setValue: setComposerValue,\n });\n const paletteEnabled = commandContext !== undefined;\n const commandDraftBlocked = paletteEnabled && palette.isCommandDraft;\n const annotationsIncomplete = (delivery.annotations ?? []).some(\n (annotation) => annotation.note.trim().length === 0,\n );\n\n const submitBlocker: ComposerSubmitBlocker = disabled\n ? \"disabled\"\n : blockedByAttachment\n ? \"attachment\"\n : delivery.sending || submitting\n ? \"sending\"\n : commandDraftBlocked\n ? \"command\"\n : annotationsIncomplete\n ? \"annotations\"\n : delivery.canSend || hasReadyAttachment\n ? null\n : \"empty\";\n const canSubmit = submitBlocker === null;\n\n const submit = useCallback(\n async (mode: ComposerSubmitMode): Promise<boolean> => {\n if (commandDraftBlocked) {\n setNotice({ tone: \"error\", message: messages.slashCommandBlocked });\n delivery.clearError();\n return false;\n }\n if (disabled || blockedByAttachment || delivery.sending || submittingRef.current)\n return false;\n if (annotationsIncomplete) {\n setNotice({ tone: \"error\", message: messages.annotationNotesRequired });\n delivery.clearError();\n delivery.requestAnnotationReview?.();\n return false;\n }\n if (!delivery.canSend && !hasReadyAttachment) return false;\n submittingRef.current = true;\n setSubmitting(true);\n try {\n return mode === \"steer\" ? await delivery.steer() : await delivery.send();\n } finally {\n submittingRef.current = false;\n if (mountedRef.current) setSubmitting(false);\n }\n },\n [\n annotationsIncomplete,\n blockedByAttachment,\n commandDraftBlocked,\n delivery,\n disabled,\n hasReadyAttachment,\n messages.annotationNotesRequired,\n messages.slashCommandBlocked,\n ],\n );\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLTextAreaElement>) => {\n if (paletteEnabled && paletteMounted && palette.onKeyDown(event)) return;\n if (!shouldSubmitOnKey(event)) return;\n event.preventDefault();\n void submit(shouldSteerOnKey(event) ? \"steer\" : \"queue\");\n },\n [palette, paletteEnabled, paletteMounted, submit],\n );\n const handlePaste = useCallback(\n (event: ClipboardEvent<HTMLTextAreaElement>) => {\n onPaste?.(event);\n attachments?.addFromPaste(event);\n },\n [attachments, onPaste],\n );\n const handleFileChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n if (event.target.files) attachments?.addFiles(event.target.files);\n event.target.value = \"\";\n },\n [attachments],\n );\n\n const helpCommands = useMemo(\n () =>\n commands.filter((command) => {\n if (command.permission && commandContext) {\n const permissions = commandContext.permissions;\n return (\n permissions.includes(command.permission) || permissions.includes(\"workspace:admin\")\n );\n }\n return true;\n }),\n [commandContext, commands],\n );\n const activeNotice =\n notice ??\n (delivery.error\n ? {\n tone: \"error\" as const,\n message: /control changed|paused while/i.test(delivery.error.message)\n ? messages.controlChangedError\n : composerSubmissionErrorMessage(delivery.error) || messages.sendFailedError,\n }\n : null);\n useEffect(() => {\n if (notice?.tone !== \"ok\") return;\n const timer = window.setTimeout(\n () => setNotice((current) => (current === notice ? null : current)),\n 2400,\n );\n return () => window.clearTimeout(timer);\n }, [notice]);\n useEffect(() => {\n if (annotationsIncomplete) return;\n setNotice((current) =>\n current?.message === messages.annotationNotesRequired ? null : current,\n );\n }, [annotationsIncomplete, messages.annotationNotesRequired]);\n\n const runControlOperation = useCallback(async (operation: () => Promise<void>) => {\n if (controlOperationRef.current) return false;\n controlOperationRef.current = true;\n try {\n await operation();\n return true;\n } finally {\n controlOperationRef.current = false;\n }\n }, []);\n\n const pause = useCallback(\n async (reason?: string): Promise<boolean> => {\n if (!control || control.pausing || control.resuming) return false;\n return await runControlOperation(() => control.pause(reason));\n },\n [control, runControlOperation],\n );\n const resume = useCallback(\n async (reason?: string): Promise<boolean> => {\n if (!control || control.pausing || control.resuming) return false;\n return await runControlOperation(() => control.resume(reason));\n },\n [control, runControlOperation],\n );\n const resumeScope = useCallback(\n async (option: EffectiveSessionControl[\"resumeOptions\"][number]): Promise<boolean> => {\n if (!control || control.pausing || control.resuming) return false;\n return await runControlOperation(() => control.resumeScope(option));\n },\n [control, runControlOperation],\n );\n\n return {\n id,\n rootRef,\n textareaRef,\n pauseButtonRef,\n fileInputRef,\n listboxId,\n effectiveControl,\n queuedAheadCount,\n canControlWorkspace,\n controlLinks,\n disabled,\n attachments,\n messages,\n sending: delivery.sending || submitting,\n error: delivery.error,\n clearError: delivery.clearError,\n hasDraftState: draft !== undefined,\n draftConflict: draft?.draftConflict ?? null,\n draftSaving: draft?.draftSaving ?? false,\n restoredResources: draft?.restoredResources ?? [],\n removeRestoredResource: draft?.removeRestoredResource,\n resolveDraftConflict: draft?.resolveDraftConflict,\n hasControl: control !== undefined,\n pausing: control?.pausing ?? false,\n resuming: control?.resuming ?? false,\n pause,\n resume,\n resumeScope,\n paused,\n controlDetailsOpen,\n setControlDetailsOpen,\n paletteMounted,\n setPaletteMounted,\n dragging,\n handleDragOver,\n handleDragLeave,\n handleDrop,\n palette,\n paletteEnabled,\n commandDraftBlocked,\n confirmState,\n settleConfirmation,\n helpOpen,\n setHelpOpen,\n helpCommands,\n activeNotice,\n canSubmit,\n submitBlocker,\n submit,\n handleKeyDown,\n handlePaste,\n handleFileChange,\n focusInput: () => textareaRef.current?.focus(),\n setValue: setComposerValue,\n value: visibleValue,\n };\n}\n\nexport type ChatComposerController = ReturnType<typeof useChatComposerController>;\n\nconst ComposerContext = createContext<ChatComposerController | null>(null);\n\nfunction useComposerController(): ChatComposerController {\n const controller = useContext(ComposerContext);\n if (!controller) throw new Error(\"useChatComposer must be used inside <Composer.Root>\");\n return controller;\n}\n\nexport type ChatComposerContextValue = Pick<\n ChatComposerController,\n | \"id\"\n | \"value\"\n | \"setValue\"\n | \"focusInput\"\n | \"submit\"\n | \"canSubmit\"\n | \"submitBlocker\"\n | \"disabled\"\n | \"sending\"\n | \"error\"\n | \"clearError\"\n | \"attachments\"\n | \"messages\"\n | \"effectiveControl\"\n | \"paused\"\n | \"hasControl\"\n | \"pausing\"\n | \"resuming\"\n | \"pause\"\n | \"resume\"\n | \"resumeScope\"\n>;\n\n/** Read the nearest compound composer's safe accessory-facing state and actions. */\nexport function useChatComposer(): ChatComposerContextValue {\n return useComposerController();\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nexport type ComposerRootProps = Omit<ComponentPropsWithoutRef<\"div\">, \"children\"> & {\n controller: ChatComposerController;\n children: ReactNode;\n /**\n * Measurement surface for responsive composer chrome. `viewport` preserves\n * the existing breakpoint behavior; `container` responds to this root's\n * inline size and also bounds composer-owned portalled menus to it.\n */\n responsiveBasis?: ResponsiveBasis | undefined;\n};\n\nexport const Root = forwardRef<HTMLDivElement, ComposerRootProps>(function ComposerRoot(\n { controller, children, className, style, responsiveBasis = \"viewport\", ...props },\n forwardedRef,\n) {\n const responsiveRootRef = useRef<HTMLDivElement | null>(null);\n const responsiveContext = useMemo(\n () => ({ responsiveBasis, rootRef: responsiveRootRef }),\n [responsiveBasis],\n );\n // Provider stays on Root so optional Radix tip surfaces (voice input) work.\n // Ordinary composer actions use native `title` via ComposerTip to avoid\n // pulling Popper into every tip hotspot.\n return (\n <ComposerContext.Provider value={controller}>\n <ComposerResponsiveContext.Provider value={responsiveContext}>\n <TooltipProvider delayDuration={300}>\n <div\n {...props}\n ref={mergeRefs(controller.rootRef, responsiveRootRef, forwardedRef)}\n data-og-composer-id={controller.id}\n data-og-responsive-basis={responsiveBasis}\n className={cn(\"og-root og-composer\", className)}\n style={{ paddingBottom: \"env(safe-area-inset-bottom)\", ...style }}\n >\n {children}\n <ComposerAnnouncements />\n </div>\n </TooltipProvider>\n </ComposerResponsiveContext.Provider>\n </ComposerContext.Provider>\n );\n});\n\nexport type ComposerFrameProps = ComponentPropsWithoutRef<\"div\">;\n\nexport const Frame = forwardRef<HTMLDivElement, ComposerFrameProps>(function ComposerFrame(\n { className, ...props },\n ref,\n) {\n return <div {...props} ref={ref} className={cn(\"relative\", className)} />;\n});\n\nexport type ComposerCommandPaletteProps = { className?: string | undefined };\n\nexport function CommandPalette({ className }: ComposerCommandPaletteProps) {\n const controller = useComposerController();\n const setPaletteMounted = controller.setPaletteMounted;\n useEffect(() => {\n setPaletteMounted(true);\n return () => setPaletteMounted(false);\n }, [setPaletteMounted]);\n if (!controller.paletteEnabled) return null;\n return (\n <div className={className}>\n <CommandPaletteView\n open={controller.palette.open && controller.confirmState === null}\n items={controller.palette.items}\n highlight={controller.palette.highlight}\n onHighlight={controller.palette.setHighlight}\n onRun={(index) => {\n controller.palette.setHighlight(index);\n void controller.palette.runAt(index);\n }}\n argHintText={controller.palette.activeArgHint}\n listboxId={controller.listboxId}\n label={controller.messages.slashCommandsLabel}\n dangerLabel={controller.messages.danger}\n />\n </div>\n );\n}\n\ntype OwnedSurfaceProps = \"onDragOver\" | \"onDragLeave\" | \"onDrop\";\nexport type ComposerSurfaceProps = Omit<ComponentPropsWithoutRef<\"div\">, OwnedSurfaceProps>;\n\nexport const Surface = forwardRef<HTMLDivElement, ComposerSurfaceProps>(function ComposerSurface(\n { className, children, ...props },\n ref,\n) {\n const controller = useComposerController();\n return (\n <div\n {...props}\n ref={ref}\n onDragOver={controller.attachments ? controller.handleDragOver : undefined}\n onDragLeave={controller.attachments ? controller.handleDragLeave : undefined}\n onDrop={controller.attachments ? controller.handleDrop : undefined}\n className={cn(\n \"relative rounded-og-lg border border-og-border/90 bg-og-surface-1 shadow-og-sm\",\n \"transition-[border-color,box-shadow] duration-200 ease-og-out\",\n \"focus-within:border-og-accent/50 focus-within:shadow-og-glow\",\n controller.dragging && \"border-dashed border-og-accent\",\n className,\n )}\n >\n {controller.dragging ? (\n <div\n aria-hidden\n className={cn(\n \"pointer-events-none absolute inset-0 z-10 flex items-center justify-center\",\n \"rounded-og-lg bg-og-surface-1/85 text-og-menu font-medium text-og-accent backdrop-blur-[1px]\",\n )}\n >\n <span className=\"inline-flex items-center gap-2\">\n <PaperclipIcon className=\"size-4\" />\n {controller.messages.dropFiles}\n </span>\n </div>\n ) : null}\n {children}\n </div>\n );\n});\n\nexport function PausedState() {\n const controller = useComposerController();\n if (!controller.paused || !controller.effectiveControl || !controller.hasControl) return null;\n return (\n <WorkstreamPausedStrip\n control={controller.effectiveControl}\n queuedAheadCount={controller.queuedAheadCount}\n open={controller.controlDetailsOpen}\n busy={controller.resuming}\n sending={controller.sending}\n canControlWorkspace={controller.canControlWorkspace}\n controlLinks={controller.controlLinks}\n messages={controller.messages}\n onOpenChange={controller.setControlDetailsOpen}\n onResume={() => void controller.resume()}\n onResumeOption={(option) => void controller.resumeScope(option)}\n />\n );\n}\n\nexport function RestoredResources() {\n const controller = useComposerController();\n if (controller.restoredResources.length === 0 || !controller.removeRestoredResource) return null;\n return (\n <RestoredResourceChips\n resources={controller.restoredResources}\n messages={controller.messages}\n onRemove={controller.removeRestoredResource}\n />\n );\n}\n\nexport function Attachments() {\n const controller = useComposerController();\n if (!controller.attachments || controller.attachments.attachments.length === 0) return null;\n return (\n <AttachmentChips\n attachments={controller.attachments.attachments}\n messages={controller.messages}\n onRemove={controller.attachments.remove}\n onRetry={controller.attachments.retry}\n onRetainPreview={controller.attachments.retainPreview}\n onLoadPreview={controller.attachments.loadPreview}\n />\n );\n}\n\ntype OwnedInputProps =\n | \"value\"\n | \"defaultValue\"\n | \"onChange\"\n | \"onKeyDown\"\n | \"onPaste\"\n | \"disabled\"\n | \"aria-autocomplete\"\n | \"aria-controls\"\n | \"aria-activedescendant\"\n | \"aria-keyshortcuts\";\nexport type ComposerInputProps = Omit<ComponentPropsWithoutRef<\"textarea\">, OwnedInputProps>;\n\nexport const Input = forwardRef<HTMLTextAreaElement, ComposerInputProps>(function ComposerInput(\n { rows = 1, placeholder, className, \"aria-label\": ariaLabel, autoFocus = false, ...props },\n forwardedRef,\n) {\n const controller = useComposerController();\n const autoFocusedRef = useRef(false);\n const paletteOpen =\n controller.paletteEnabled && controller.paletteMounted && controller.palette.open;\n\n // Native autoFocus loses when the textarea mounts disabled (create-session draft\n // hydrate). Retry once the controller becomes interactive.\n useEffect(() => {\n if (!autoFocus || controller.disabled || autoFocusedRef.current) return;\n const frame = window.requestAnimationFrame(() => {\n const textarea = controller.textareaRef.current;\n if (!textarea || textarea.disabled) return;\n autoFocusedRef.current = true;\n textarea.focus();\n });\n return () => window.cancelAnimationFrame(frame);\n }, [autoFocus, controller.disabled, controller.textareaRef]);\n\n return (\n <textarea\n {...props}\n ref={mergeRefs(controller.textareaRef, forwardedRef)}\n rows={rows}\n value={controller.value}\n onChange={(event) => controller.setValue(event.target.value)}\n onKeyDown={controller.handleKeyDown}\n onPaste={controller.handlePaste}\n placeholder={\n controller.paused && !controller.disabled\n ? controller.messages.pausedPlaceholder\n : (placeholder ?? controller.messages.messagePlaceholder)\n }\n disabled={controller.disabled}\n autoFocus={autoFocus && !controller.disabled}\n aria-label={ariaLabel ?? controller.messages.inputLabel}\n aria-keyshortcuts=\"Enter Meta+Enter Control+Enter Shift+Enter\"\n aria-autocomplete={\n controller.paletteEnabled && controller.paletteMounted ? \"list\" : undefined\n }\n aria-controls={paletteOpen ? controller.listboxId : undefined}\n aria-activedescendant={\n paletteOpen ? `${controller.listboxId}-option-${controller.palette.highlight}` : undefined\n }\n className={cn(\n \"og-composer-input block w-full resize-none bg-transparent px-3.5 pt-3 pb-1 text-og-composer md:px-4 md:text-og-composer-wide pointer-coarse:min-h-11\",\n \"text-og-fg placeholder:text-og-fg-subtle focus:outline-hidden focus-visible:outline-hidden\",\n \"disabled:cursor-not-allowed disabled:opacity-60\",\n className,\n )}\n />\n );\n});\n\nexport function Confirmation() {\n const controller = useComposerController();\n const command = controller.confirmState?.command;\n if (!command || !controller.confirmState) return null;\n return (\n <ConfirmBar\n command={command}\n messages={controller.messages}\n onCancel={() => controller.settleConfirmation(false)}\n onConfirm={() => controller.settleConfirmation(true)}\n returnFocusRef={controller.textareaRef}\n />\n );\n}\n\nexport type ComposerFooterProps = ComponentPropsWithoutRef<\"div\">;\n\nexport const Footer = forwardRef<HTMLDivElement, ComposerFooterProps>(function ComposerFooter(\n { className, ...props },\n ref,\n) {\n return (\n <div\n {...props}\n ref={ref}\n className={cn(\n \"og-composer-footer flex items-end gap-1.5 px-2 pb-2 pt-0.5 sm:px-2.5 sm:pb-2.5\",\n // Mobile: one control row — never wrap into a second toolbar line.\n \"max-sm:flex-nowrap max-sm:items-center max-sm:gap-1\",\n className,\n )}\n />\n );\n});\n\nexport type ComposerControlsProps = ComponentPropsWithoutRef<\"span\">;\n\nexport const Controls = forwardRef<HTMLSpanElement, ComposerControlsProps>(\n function ComposerControls({ className, ...props }, ref) {\n return (\n <span\n {...props}\n ref={ref}\n className={cn(\n \"og-composer-controls flex min-w-0 flex-1 flex-wrap items-center gap-1.5\",\n \"max-sm:flex-nowrap max-sm:gap-1\",\n className,\n )}\n />\n );\n },\n);\n\nexport type ComposerHintProps = ComponentPropsWithoutRef<\"span\">;\n\nexport const Hint = forwardRef<HTMLSpanElement, ComposerHintProps>(function ComposerHint(\n { className, children, ...props },\n ref,\n) {\n const controller = useComposerController();\n return (\n <span\n {...props}\n ref={ref}\n className={cn(\n \"og-composer-hint min-w-0 flex-1 px-1.5 text-og-xs text-og-fg-subtle max-sm:hidden\",\n className,\n )}\n >\n {children ?? controller.messages.keyboardHint}\n </span>\n );\n});\n\nexport type ComposerActionsProps = ComponentPropsWithoutRef<\"span\">;\n\nexport const Actions = forwardRef<HTMLSpanElement, ComposerActionsProps>(function ComposerActions(\n { className, ...props },\n ref,\n) {\n return (\n <span\n {...props}\n ref={ref}\n className={cn(\n \"og-composer-actions ml-auto flex shrink-0 items-center gap-1.5\",\n \"max-sm:flex-nowrap max-sm:gap-1\",\n className,\n )}\n />\n );\n});\n\ntype OwnedButtonProps = \"type\" | \"onClick\" | \"disabled\";\nexport type ComposerAttachButtonProps = Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n OwnedButtonProps\n> & {\n accept?: string | undefined;\n multiple?: boolean | undefined;\n};\n\nexport const AttachButton = forwardRef<HTMLButtonElement, ComposerAttachButtonProps>(\n function ComposerAttachButton(\n { accept, multiple = true, className, \"aria-label\": ariaLabel, title, children, ...props },\n ref,\n ) {\n const controller = useComposerController();\n if (!controller.attachments) return null;\n const tip = title ?? controller.messages.attachFiles;\n return (\n <>\n <input\n ref={controller.fileInputRef}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n data-og-composer-attach\n className=\"hidden\"\n onChange={controller.handleFileChange}\n />\n <ComposerTip tip={tip}>\n <button\n {...props}\n ref={ref}\n type=\"button\"\n disabled={controller.disabled}\n onClick={() => controller.fileInputRef.current?.click()}\n aria-label={ariaLabel ?? tip}\n className={cn(\n \"inline-flex size-8 items-center justify-center rounded-og-md\",\n \"text-og-fg-muted transition-colors duration-150 hover:bg-og-surface-2 hover:text-og-fg\",\n \"disabled:cursor-not-allowed disabled:opacity-50 pointer-coarse:size-11\",\n className,\n )}\n >\n {children ?? <PaperclipIcon className=\"size-4\" />}\n </button>\n </ComposerTip>\n </>\n );\n },\n);\n\nexport type ComposerModelPickerProps = {\n models?: ClientModel[] | undefined;\n /** Catalog-backed rows preferred over legacy provider-grouped models. */\n rows?: PickerModelRow[] | undefined;\n value?: string | undefined;\n onChange?: ((modelId: string) => void) | undefined;\n label?: string | undefined;\n className?: string | undefined;\n /** Filter to Codex models for remote_v2-locked sessions. */\n codexOnly?: boolean | undefined;\n};\n\nexport function ModelPicker({\n models,\n rows,\n value,\n onChange,\n label,\n className,\n codexOnly,\n}: ComposerModelPickerProps) {\n const controller = useComposerController();\n return (\n <ModelPickerView\n models={models}\n rows={rows}\n value={value}\n onChange={(modelId) => onChange?.(modelId)}\n disabled={controller.disabled}\n label={label ?? controller.messages.modelLabel}\n className={className}\n codexOnly={codexOnly}\n />\n );\n}\n\nexport type ComposerPauseButtonProps = Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n OwnedButtonProps\n>;\n\nexport const PauseButton = forwardRef<HTMLButtonElement, ComposerPauseButtonProps>(\n function ComposerPauseButton(\n { className, \"aria-label\": ariaLabel, title, children, ...props },\n ref,\n ) {\n const controller = useComposerController();\n if (!controller.effectiveControl || controller.paused || !controller.hasControl) return null;\n const busy = controller.pausing || controller.resuming;\n const tip = title ?? controller.messages.pauseTitle;\n return (\n <ComposerTip tip={tip}>\n <button\n {...props}\n ref={mergeRefs(controller.pauseButtonRef, ref)}\n type=\"button\"\n onClick={() => void controller.pause()}\n disabled={busy}\n aria-label={ariaLabel ?? controller.messages.pauseAriaLabel}\n className={cn(\n \"inline-flex size-8 items-center justify-center rounded-og-md border border-og-border pointer-coarse:size-11\",\n \"bg-og-surface-2 text-og-fg-muted transition-colors duration-150\",\n \"hover:border-og-status-waiting/50 hover:text-og-status-waiting\",\n \"disabled:opacity-50\",\n className,\n )}\n >\n {children ??\n (busy ? (\n <LoaderCircleIcon className=\"size-3.5 animate-og-spin\" />\n ) : (\n <PauseIcon className=\"size-3.5 fill-current\" />\n ))}\n </button>\n </ComposerTip>\n );\n },\n);\n\nexport type ComposerSendButtonProps = Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n OwnedButtonProps\n>;\n\nexport const SendButton = forwardRef<HTMLButtonElement, ComposerSendButtonProps>(\n function ComposerSendButton(\n { className, \"aria-label\": ariaLabel, title, children, ...props },\n ref,\n ) {\n const controller = useComposerController();\n const tip =\n title ??\n (controller.submitBlocker === \"annotations\"\n ? controller.messages.annotationNotesRequired\n : controller.paused\n ? controller.messages.sendAndResumeTitle\n : controller.messages.sendTitle);\n return (\n <ComposerTip tip={tip}>\n <button\n {...props}\n ref={ref}\n type=\"button\"\n onClick={() => void controller.submit(\"queue\")}\n disabled={!controller.canSubmit}\n data-og-tip={tip}\n aria-label={\n ariaLabel ??\n (controller.paused\n ? controller.messages.sendAndResumeAriaLabel\n : controller.messages.sendMessageAriaLabel)\n }\n className={cn(\n \"inline-flex size-8 items-center justify-center rounded-og-md pointer-coarse:size-11\",\n \"bg-og-accent text-og-accent-fg shadow-og-sm\",\n \"transition-[background-color,transform,opacity] duration-150 ease-og-spring\",\n \"hover:bg-og-accent-strong active:scale-95\",\n \"disabled:cursor-not-allowed disabled:bg-og-surface-3 disabled:text-og-fg-subtle disabled:shadow-none\",\n className,\n )}\n >\n {children ??\n (controller.sending ? (\n <LoaderCircleIcon className=\"size-4 animate-og-spin\" />\n ) : (\n <ArrowUpIcon className=\"size-4\" />\n ))}\n </button>\n </ComposerTip>\n );\n },\n);\n\nexport function Help() {\n const controller = useComposerController();\n return (\n <AnimatePresence>\n {controller.helpOpen ? (\n <HelpPanel\n commands={controller.helpCommands}\n messages={controller.messages}\n onClose={() => controller.setHelpOpen(false)}\n />\n ) : null}\n </AnimatePresence>\n );\n}\n\nexport function Status() {\n const controller = useComposerController();\n return (\n <>\n <AnimatePresence>\n {controller.activeNotice ? (\n <motion.p\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: \"auto\" }}\n exit={{ opacity: 0, height: 0 }}\n className={cn(\n \"overflow-hidden px-1 pt-1.5 text-og-control\",\n controller.activeNotice.tone === \"ok\" ? \"text-og-fg-muted\" : \"text-og-status-failed\",\n )}\n >\n {controller.activeNotice.message}\n </motion.p>\n ) : null}\n </AnimatePresence>\n {controller.draftConflict ? (\n <div className=\"mt-1.5 flex flex-wrap items-center gap-2 px-1 text-og-xs text-og-status-failed\">\n <span className=\"min-w-0 flex-1\">{controller.messages.draftConflict}</span>\n <button\n type=\"button\"\n className=\"underline underline-offset-2\"\n onClick={() => void controller.resolveDraftConflict?.(\"use_remote\")}\n >\n {controller.messages.useOtherDraft}\n </button>\n <button\n type=\"button\"\n className=\"font-medium underline underline-offset-2\"\n onClick={() => void controller.resolveDraftConflict?.(\"keep_mine\")}\n >\n {controller.messages.keepMine}\n </button>\n </div>\n ) : null}\n </>\n );\n}\n\nfunction ComposerAnnouncements() {\n const controller = useComposerController();\n return (\n <div className=\"sr-only\">\n {controller.activeNotice ? (\n <p role={controller.activeNotice.tone === \"error\" ? \"alert\" : \"status\"}>\n {controller.activeNotice.message}\n </p>\n ) : null}\n {controller.draftConflict ? <p role=\"alert\">{controller.messages.draftConflict}</p> : null}\n </div>\n );\n}\n\nfunction mergeRefs<T>(...refs: Array<Ref<T> | undefined>): (node: T | null) => void {\n return (node) => {\n for (const ref of refs) {\n if (typeof ref === \"function\") ref(node);\n else if (ref) ref.current = node;\n }\n };\n}\n\nfunction WorkstreamPausedStrip({\n control,\n queuedAheadCount,\n open,\n busy,\n sending,\n canControlWorkspace,\n controlLinks,\n messages,\n onOpenChange,\n onResume,\n onResumeOption,\n}: {\n control: EffectiveSessionControl;\n queuedAheadCount: number;\n open: boolean;\n busy: boolean;\n sending: boolean;\n canControlWorkspace: boolean;\n controlLinks: ComposerControlLinks | undefined;\n messages: ChatComposerMessages;\n onOpenChange: (open: boolean) => void;\n onResume: () => void;\n onResumeOption: (option: EffectiveSessionControl[\"resumeOptions\"][number]) => void;\n}) {\n const blocker = control.primaryBlocker;\n const cause =\n blocker?.kind === \"workspace\"\n ? messages.workspacePaused\n : control.directState === \"paused\"\n ? messages.pausedHere\n : messages.pausedBy(blocker?.displayName ?? messages.parentBlocker);\n const primary = control.resumeOptions.find((option) => option.scope === \"selected\");\n const broaderOptions = control.resumeOptions.filter(\n (option) =>\n option !== primary &&\n option.scope !== \"selected\" &&\n (option.scope !== \"workspace\" || canControlWorkspace),\n );\n return (\n <div className=\"border-b border-og-status-waiting/25 bg-og-status-waiting/[0.07]\">\n <div className=\"flex min-w-0 items-center gap-2 px-3 py-2\">\n <PauseIcon className=\"size-3.5 shrink-0 text-og-status-waiting\" />\n <button\n type=\"button\"\n className=\"min-w-0 flex-1 text-left\"\n onClick={() => onOpenChange(!open)}\n aria-expanded={open}\n >\n <span className=\"block truncate text-og-xs font-medium text-og-fg\">{cause}</span>\n <span className=\"block truncate text-[11px] text-og-fg-muted\">\n {queuedAheadCount > 0\n ? messages.queuedAhead(queuedAheadCount)\n : sending\n ? messages.resumingAndSending\n : messages.nextMessageResumes}\n </span>\n </button>\n <button\n type=\"button\"\n aria-label={messages.resumeThisWorkstream}\n className=\"inline-flex min-h-8 shrink-0 items-center gap-1.5 rounded-og-md border border-og-status-waiting/35 bg-og-surface-1 px-2.5 text-og-xs font-medium text-og-fg hover:bg-og-surface-2 pointer-coarse:min-h-11\"\n disabled={busy}\n onClick={onResume}\n >\n {busy ? (\n <LoaderCircleIcon className=\"size-3.5 animate-og-spin\" />\n ) : (\n <PlayIcon className=\"size-3.5 fill-current\" />\n )}\n <span className=\"og-composer-resume-label-long hidden min-[400px]:inline\">\n {messages.resumeThisWorkstream}\n </span>\n <span className=\"og-composer-resume-label-short min-[400px]:hidden\">\n {messages.resumeShort}\n </span>\n </button>\n <button\n type=\"button\"\n className=\"inline-flex size-8 shrink-0 items-center justify-center rounded-og-md text-og-fg-muted hover:bg-og-surface-2 pointer-coarse:size-11\"\n onClick={() => onOpenChange(!open)}\n aria-label={open ? messages.hidePauseDetails : messages.showPauseDetails}\n >\n <ChevronDownIcon className={cn(\"size-3.5 transition-transform\", open && \"rotate-180\")} />\n </button>\n </div>\n {open ? (\n <div className=\"border-t border-og-status-waiting/20 px-3 pb-3 pt-2\">\n <ul className=\"grid gap-2\" aria-label={messages.pauseReasonsLabel}>\n {control.blockers.map((entry, index) => (\n <li\n key={`${entry.kind}-${entry.sessionId ?? \"workspace\"}-${entry.revision}`}\n className=\"text-og-xs\"\n >\n <span className=\"font-medium text-og-fg\">\n {index === 0 ? messages.pausedByLabel : messages.alsoPausedByLabel}\n </span>\n {blockerHref(entry, controlLinks) ? (\n <a\n href={blockerHref(entry, controlLinks)}\n className=\"font-medium text-og-fg underline decoration-og-border-strong underline-offset-2 hover:text-og-accent focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-og-ring/40\"\n >\n {entry.displayName}\n </a>\n ) : (\n <span className=\"font-medium text-og-fg\">{entry.displayName}</span>\n )}\n {entry.reason ? <span className=\"text-og-fg-muted\"> · {entry.reason}</span> : null}\n {entry.actor ? <span className=\"text-og-fg-subtle\"> · {entry.actor}</span> : null}\n {entry.changedAt ? (\n <span className=\"text-og-fg-subtle\">\n {\" \"}\n · {messages.formatRelativeTime(entry.changedAt)}\n </span>\n ) : null}\n </li>\n ))}\n </ul>\n {broaderOptions.length > 0 ? (\n <div className=\"mt-2 flex flex-wrap gap-1.5\">\n {broaderOptions.map((option) => (\n <ComposerTip\n key={`${option.scope}-${option.targetId ?? \"selected\"}`}\n tip={option.impactCopy}\n >\n <button\n type=\"button\"\n disabled={busy}\n onClick={() => onResumeOption(option)}\n className=\"rounded-og-md border border-og-border bg-og-surface-1 px-2 py-1 text-og-xs text-og-fg-muted hover:bg-og-surface-2 hover:text-og-fg pointer-coarse:min-h-10\"\n >\n <span className=\"block font-medium\">\n {option.scope === \"workspace\"\n ? messages.resumeWorkspace\n : messages.resumeFromSession}\n </span>\n <span className=\"block text-[10px] text-og-fg-subtle\">\n {option.selectedStateAfter === \"active\"\n ? messages.sessionCanRun\n : messages.stillPausedBy(\n option.remainingPrimaryBlocker?.displayName ?? messages.narrowerPause,\n )}\n </span>\n </button>\n </ComposerTip>\n ))}\n </div>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction blockerHref(\n blocker: EffectiveSessionControl[\"blockers\"][number],\n links: ComposerControlLinks | undefined,\n): string | undefined {\n if (blocker.kind === \"workspace\") return links?.workspaceHref;\n return blocker.sessionId ? links?.sessionHref?.(blocker.sessionId) : undefined;\n}\n\nfunction RestoredResourceChips({\n resources,\n messages,\n onRemove,\n}: {\n resources: ComposerState[\"restoredResources\"];\n messages: ChatComposerMessages;\n onRemove: (index: number) => void;\n}) {\n return (\n <div\n className=\"flex flex-wrap gap-1.5 border-b border-og-border px-3 py-2\"\n aria-label={messages.restoredResourcesLabel}\n >\n {resources.map((resource, index) => (\n <span\n key={`${resource.kind}-${resource.kind === \"file\" ? resource.fileId : resource.uri}`}\n className=\"inline-flex min-w-0 max-w-full items-center gap-1.5 rounded-og-md border border-og-border bg-og-surface-2 px-2 py-1 text-og-xs text-og-fg-muted\"\n >\n <FileIcon className=\"size-3 shrink-0\" />\n <span className=\"truncate\">\n {resource.kind === \"file\" ? messages.restoredFile(resource.fileId) : resource.uri}\n </span>\n <button\n type=\"button\"\n className=\"shrink-0 hover:text-og-fg\"\n onClick={() => onRemove(index)}\n aria-label={messages.removeRestoredResource(index)}\n >\n <XIcon className=\"size-3\" />\n </button>\n </span>\n ))}\n </div>\n );\n}\n\nfunction ConfirmBar({\n command,\n messages,\n onCancel,\n onConfirm,\n returnFocusRef,\n}: {\n command: SlashCommand;\n messages: ChatComposerMessages;\n onCancel: () => void;\n onConfirm: () => void;\n returnFocusRef?: RefObject<HTMLTextAreaElement | null> | undefined;\n}) {\n const confirmRef = useRef<HTMLButtonElement | null>(null);\n const descriptionId = useId();\n useEffect(() => {\n const returnTo = returnFocusRef?.current ?? null;\n confirmRef.current?.focus();\n return () => returnTo?.focus();\n }, [returnFocusRef]);\n return (\n <div\n role=\"alertdialog\"\n aria-label={messages.confirmCommand(command.name)}\n aria-describedby={descriptionId}\n data-testid=\"danger-confirm\"\n onKeyDown={(event) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n event.stopPropagation();\n onCancel();\n }\n }}\n className=\"flex items-end justify-between gap-2 px-2.5 pb-2.5 pt-1\"\n >\n <span id={descriptionId} className=\"min-w-0 flex-1 px-1.5 text-og-sm text-og-status-failed\">\n {messages.confirmDescription(command)}\n </span>\n <span className=\"flex shrink-0 items-center gap-1.5\">\n <button\n type=\"button\"\n onClick={onCancel}\n className=\"rounded-og-md border border-og-border bg-og-surface-2 px-2.5 py-1 text-og-sm text-og-fg-muted hover:bg-og-surface-3 pointer-coarse:min-h-11\"\n >\n {messages.cancel}\n </button>\n <button\n ref={confirmRef}\n type=\"button\"\n onClick={onConfirm}\n className=\"rounded-og-md border border-og-status-failed/50 bg-og-status-failed/15 px-2.5 py-1 text-og-sm text-og-status-failed hover:bg-og-status-failed/25 pointer-coarse:min-h-11\"\n >\n {messages.runCommand(command.name)}\n </button>\n </span>\n </div>\n );\n}\n\nfunction AttachmentChips({\n attachments,\n messages,\n onRemove,\n onRetry,\n onRetainPreview,\n onLoadPreview,\n}: {\n attachments: UseFileAttachmentsResult[\"attachments\"];\n messages: ChatComposerMessages;\n onRemove: (id: string) => void;\n onRetry?: ((id: string) => void) | undefined;\n onRetainPreview: UseFileAttachmentsResult[\"retainPreview\"];\n onLoadPreview: UseFileAttachmentsResult[\"loadPreview\"];\n}) {\n const lightbox = useLightboxOptional();\n const previewRequest = useRef<AbortController | null>(null);\n const [previewLoadingId, setPreviewLoadingId] = useState<string | null>(null);\n const [previewErrorId, setPreviewErrorId] = useState<string | null>(null);\n\n useEffect(() => () => previewRequest.current?.abort(), [onLoadPreview]);\n\n async function openPreview(\n attachment: UseFileAttachmentsResult[\"attachments\"][number],\n source: HTMLButtonElement,\n canLoadPreview: boolean,\n ) {\n previewRequest.current?.abort();\n const attachmentId = attachment.id;\n const releaseSource = onRetainPreview(attachmentId);\n let src = attachment.previewUrl;\n if (!releaseSource && canLoadPreview) {\n const controller = new AbortController();\n previewRequest.current = controller;\n setPreviewLoadingId(attachmentId);\n setPreviewErrorId(null);\n try {\n src = await onLoadPreview!(attachmentId, controller.signal);\n if (controller.signal.aborted) return;\n if (!src) {\n setPreviewErrorId(attachmentId);\n return;\n }\n } catch {\n if (!controller.signal.aborted) setPreviewErrorId(attachmentId);\n return;\n } finally {\n if (previewRequest.current === controller) {\n setPreviewLoadingId(null);\n }\n }\n }\n lightbox!.open(\n src!,\n attachment.name,\n source,\n messages.attachmentPreviewLabel,\n attachment.name,\n {\n download: messages.downloadAttachment(attachment.name),\n close: messages.closeAttachmentPreview,\n },\n releaseSource,\n );\n }\n\n return (\n <div className=\"flex flex-wrap gap-2 px-3 py-2\">\n {attachments.map((attachment) => {\n const failed = attachment.status === \"failed\";\n const secureContextRequired = attachment.errorCode === \"secure_context_required\";\n const previewFailed = previewErrorId === attachment.id;\n const previewLoading = previewLoadingId === attachment.id;\n const canLoadPreview = Boolean(\n lightbox &&\n onLoadPreview &&\n attachment.status === \"ready\" &&\n attachment.file &&\n attachment.contentType.startsWith(\"image/\"),\n );\n const statusText = previewFailed\n ? (messages.previewUnavailable ?? \"Preview unavailable\")\n : attachment.status === \"uploading\"\n ? messages.uploading\n : failed\n ? attachment.error || messages.uploadFailed\n : messages.formatBytes(attachment.sizeBytes);\n return (\n <div\n key={attachment.id}\n className={cn(\n \"flex min-w-0 items-center gap-2 rounded-og-md border px-2 py-1.5 text-og-sm\",\n failed\n ? cn(\n \"border-og-status-failed/40 bg-og-status-failed/10\",\n secureContextRequired\n ? \"max-w-full items-start sm:max-w-[32rem]\"\n : \"max-w-[240px]\",\n )\n : \"max-w-[240px] border-og-border bg-og-surface-2\",\n )}\n >\n {lightbox && (attachment.previewUrl || canLoadPreview) ? (\n <button\n type=\"button\"\n className={cn(\n \"size-8 shrink-0 overflow-hidden rounded outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent\",\n !attachment.previewUrl && \"flex items-center justify-center disabled:cursor-wait\",\n )}\n aria-label={messages.previewAttachment(attachment.name)}\n aria-busy={previewLoading || undefined}\n disabled={previewLoading}\n onClick={(event) =>\n void openPreview(attachment, event.currentTarget, canLoadPreview)\n }\n >\n {attachment.previewUrl ? (\n <img\n src={attachment.previewUrl}\n alt=\"\"\n className=\"h-full w-full object-cover transition-opacity hover:opacity-80\"\n />\n ) : previewLoading ? (\n <LoaderCircleIcon className=\"size-4 animate-og-spin text-og-fg-muted\" />\n ) : (\n <ImageIcon className=\"size-4 text-og-fg-muted\" />\n )}\n </button>\n ) : attachment.previewUrl ? (\n <img\n src={attachment.previewUrl}\n alt=\"\"\n className=\"size-8 shrink-0 rounded object-cover\"\n />\n ) : attachment.contentType.startsWith(\"image/\") ? (\n <ImageIcon className=\"size-4 shrink-0 text-og-fg-muted\" />\n ) : (\n <FileIcon className=\"size-4 shrink-0 text-og-fg-muted\" />\n )}\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate font-medium text-og-fg\">{attachment.name}</div>\n {secureContextRequired ? (\n <div className=\"break-words text-og-xs leading-4 text-og-status-failed\">\n {statusText}\n </div>\n ) : failed || previewFailed ? (\n <ComposerTip tip={statusText}>\n <div className=\"truncate text-og-xs text-og-status-failed\">{statusText}</div>\n </ComposerTip>\n ) : (\n <div className=\"truncate text-og-xs text-og-fg-subtle\">{statusText}</div>\n )}\n </div>\n {attachment.status === \"uploading\" ? (\n <LoaderCircleIcon className=\"size-3.5 shrink-0 animate-og-spin\" />\n ) : null}\n {failed && !secureContextRequired && onRetry ? (\n <ComposerTip tip={messages.retryUpload}>\n <button\n type=\"button\"\n onClick={() => onRetry(attachment.id)}\n className=\"shrink-0 rounded-og-xs p-1 text-og-fg-muted hover:bg-og-surface-1 hover:text-og-fg pointer-coarse:size-10\"\n aria-label={messages.retryAttachment(attachment.name)}\n >\n <RotateCwIcon className=\"size-3.5\" />\n </button>\n </ComposerTip>\n ) : null}\n <button\n type=\"button\"\n onClick={() => onRemove(attachment.id)}\n className=\"shrink-0 rounded-og-xs p-1 text-og-fg-muted hover:bg-og-surface-1 hover:text-og-fg pointer-coarse:size-10\"\n aria-label={messages.removeAttachment(attachment.name)}\n >\n <XIcon className=\"size-3.5\" />\n </button>\n </div>\n );\n })}\n </div>\n );\n}\n\nfunction HelpPanel({\n commands,\n messages,\n onClose,\n}: {\n commands: readonly SlashCommand[];\n messages: ChatComposerMessages;\n onClose: () => void;\n}) {\n return (\n <motion.div\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: \"auto\" }}\n exit={{ opacity: 0, height: 0 }}\n className=\"mt-2 overflow-hidden rounded-og-lg border border-og-border bg-og-surface-2\"\n >\n <div className=\"flex items-center justify-between border-b border-og-border px-3 py-1.5\">\n <span className=\"text-og-sm font-medium text-og-fg\">{messages.commands}</span>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"text-og-xs text-og-fg-subtle hover:text-og-fg\"\n >\n {messages.close}\n </button>\n </div>\n <ul className=\"py-1\">\n {commands.map((command) => {\n const hint = argHint(command.args);\n return (\n <li key={command.name} className=\"flex items-baseline gap-2 px-3 py-1\">\n <span className=\"font-mono text-og-sm text-og-accent\">\n /{command.name}\n {hint ? <span className=\"ml-1 text-og-fg-subtle\">{hint}</span> : null}\n </span>\n <span className=\"text-og-sm text-og-fg-muted\">{command.description}</span>\n {command.danger ? (\n <span className=\"ml-auto rounded-og-xs bg-og-status-failed/15 px-1 text-og-xs uppercase tracking-wide text-og-status-failed\">\n {messages.danger}\n </span>\n ) : null}\n </li>\n );\n })}\n </ul>\n </motion.div>\n );\n}\n","const DEFAULT_DATABASE_NAME = \"opengeni-voice-recordings-v1\";\nconst DATABASE_VERSION = 1;\nconst MANIFEST_STORE = \"recordings\";\nconst CHUNK_STORE = \"chunks\";\nconst CHUNKS_BY_RECORDING = \"by-recording\";\n\nexport type VoiceRecordingCaptureState = \"capturing\" | \"stopped\" | \"discarded\";\nexport type VoiceRecordingUploadState = \"pending\" | \"syncing\" | \"retrying\" | \"complete\";\nexport type VoiceRecordingTranscriptionState = \"pending\" | \"transcribing\" | \"retrying\" | \"complete\";\nexport type VoiceRecordingFinalizationState = \"pending\" | \"transcript-ready\" | \"handed-off\";\nexport type VoiceRecordingChunkUploadState = \"pending\" | \"syncing\" | \"complete\";\nexport type VoiceRecordingRecoveryMode = \"automatic\" | \"manual\";\nexport type VoiceRecordingHandoffMode = \"append\" | \"explicit\";\n\nexport type VoiceRecordingManifest = {\n version: 1;\n recordingId: string;\n workspaceId: string;\n createdAt: string;\n updatedAt: string;\n mimeType: string;\n codec: string | null;\n captureState: VoiceRecordingCaptureState;\n uploadState: VoiceRecordingUploadState;\n transcriptionState: VoiceRecordingTranscriptionState;\n finalizationState: VoiceRecordingFinalizationState;\n /** Whether safe server reconciliation should continue without another user action. */\n recoveryMode: VoiceRecordingRecoveryMode;\n /** Delayed/recovered results require explicit insertion instead of mutating an uncertain draft. */\n handoffMode: VoiceRecordingHandoffMode;\n /** Tab/process lease. A different owner may take over only after this heartbeat is stale. */\n ownerId: string | null;\n ownerHeartbeatAt: string | null;\n /** Authoritative provider result, persisted before any composer draft mutation. */\n transcriptText: string | null;\n nextChunkNumber: number;\n chunkCount: number;\n totalBytes: number;\n totalDurationMilliseconds: number;\n};\n\nexport type VoiceRecordingChunk = {\n recordingId: string;\n chunkNumber: number;\n capturedAt: string;\n startMilliseconds: number;\n durationMilliseconds: number;\n mimeType: string;\n codec: string | null;\n byteLength: number;\n sha256: string;\n uploadState: VoiceRecordingChunkUploadState;\n audio: Blob;\n};\n\nexport type PersistVoiceRecordingChunkInput = {\n recordingId: string;\n ownerId?: string | undefined;\n chunkNumber: number;\n capturedAt: string;\n startMilliseconds: number;\n durationMilliseconds: number;\n mimeType: string;\n audio: Blob;\n};\n\nexport type PersistVoiceRecordingChunkResult = {\n manifest: VoiceRecordingManifest;\n chunk: VoiceRecordingChunk;\n deduplicated: boolean;\n};\n\nexport interface VoiceRecordingStore {\n createManifest(manifest: VoiceRecordingManifest): Promise<void>;\n getManifest(recordingId: string): Promise<VoiceRecordingManifest | null>;\n listRecoverableManifests(\n workspaceId: string,\n ownership?: { ownerId: string; staleBefore: string },\n ): Promise<VoiceRecordingManifest[]>;\n claimManifest(\n recordingId: string,\n ownerId: string,\n claimedAt: string,\n staleBefore: string,\n ): Promise<VoiceRecordingManifest>;\n listChunks(recordingId: string): Promise<VoiceRecordingChunk[]>;\n persistChunk(input: PersistVoiceRecordingChunkInput): Promise<PersistVoiceRecordingChunkResult>;\n updateManifest(\n recordingId: string,\n update: Partial<\n Pick<\n VoiceRecordingManifest,\n | \"captureState\"\n | \"uploadState\"\n | \"transcriptionState\"\n | \"finalizationState\"\n | \"ownerId\"\n | \"ownerHeartbeatAt\"\n | \"transcriptText\"\n | \"recoveryMode\"\n | \"handoffMode\"\n >\n >,\n updatedAt: string,\n ownerId?: string | undefined,\n ): Promise<VoiceRecordingManifest>;\n discard(recordingId: string, ownerId?: string | undefined): Promise<void>;\n cleanupHandedOffManifests(ownership: { ownerId: string; staleBefore: string }): Promise<number>;\n close(): Promise<void>;\n}\n\nexport class VoiceRecordingStorageUnavailableError extends Error {\n constructor() {\n super(\"Durable voice recording storage is unavailable.\");\n this.name = \"VoiceRecordingStorageUnavailableError\";\n }\n}\n\nexport class VoiceRecordingNotFoundError extends Error {\n constructor(recordingId: string) {\n super(`Voice recording ${recordingId} was not found.`);\n this.name = \"VoiceRecordingNotFoundError\";\n }\n}\n\nexport class VoiceRecordingChunkConflictError extends Error {\n constructor(recordingId: string, chunkNumber: number) {\n super(`Voice recording ${recordingId} chunk ${chunkNumber} conflicts with persisted audio.`);\n this.name = \"VoiceRecordingChunkConflictError\";\n }\n}\n\nexport class VoiceRecordingChunkSequenceError extends Error {\n constructor(expected: number, received: number) {\n super(`Expected voice recording chunk ${expected}, received ${received}.`);\n this.name = \"VoiceRecordingChunkSequenceError\";\n }\n}\n\nexport class VoiceRecordingOwnedError extends Error {\n constructor(recordingId: string) {\n super(`Voice recording ${recordingId} is active in another browser tab.`);\n this.name = \"VoiceRecordingOwnedError\";\n }\n}\n\nexport function createVoiceRecordingManifest(input: {\n recordingId: string;\n workspaceId: string;\n mimeType: string;\n createdAt: string;\n ownerId?: string | null | undefined;\n}): VoiceRecordingManifest {\n return {\n version: 1,\n recordingId: input.recordingId,\n workspaceId: input.workspaceId,\n createdAt: input.createdAt,\n updatedAt: input.createdAt,\n mimeType: input.mimeType,\n codec: codecForMimeType(input.mimeType),\n captureState: \"capturing\",\n uploadState: \"pending\",\n transcriptionState: \"pending\",\n finalizationState: \"pending\",\n recoveryMode: \"automatic\",\n handoffMode: \"append\",\n ownerId: input.ownerId ?? null,\n ownerHeartbeatAt: input.ownerId ? input.createdAt : null,\n transcriptText: null,\n nextChunkNumber: 0,\n chunkCount: 0,\n totalBytes: 0,\n totalDurationMilliseconds: 0,\n };\n}\n\nexport async function prepareVoiceRecordingChunk(\n input: PersistVoiceRecordingChunkInput,\n): Promise<VoiceRecordingChunk> {\n if (!Number.isSafeInteger(input.chunkNumber) || input.chunkNumber < 0) {\n throw new VoiceRecordingChunkSequenceError(0, input.chunkNumber);\n }\n if (!Number.isFinite(input.startMilliseconds) || input.startMilliseconds < 0) {\n throw new RangeError(\"Voice recording chunk start must be non-negative.\");\n }\n if (!Number.isFinite(input.durationMilliseconds) || input.durationMilliseconds < 0) {\n throw new RangeError(\"Voice recording chunk duration must be non-negative.\");\n }\n const bytes = new Uint8Array(await input.audio.arrayBuffer());\n if (bytes.byteLength === 0) throw new RangeError(\"Voice recording chunks cannot be empty.\");\n return {\n recordingId: input.recordingId,\n chunkNumber: input.chunkNumber,\n capturedAt: input.capturedAt,\n startMilliseconds: Math.round(input.startMilliseconds),\n durationMilliseconds: Math.round(input.durationMilliseconds),\n mimeType: input.mimeType,\n codec: codecForMimeType(input.mimeType),\n byteLength: bytes.byteLength,\n sha256: await sha256Hex(bytes),\n uploadState: \"pending\",\n audio: input.audio,\n };\n}\n\nexport function planVoiceRecordingChunkCommit(input: {\n manifest: VoiceRecordingManifest;\n chunk: VoiceRecordingChunk;\n existingChunk: VoiceRecordingChunk | null;\n}): PersistVoiceRecordingChunkResult {\n const { manifest, chunk, existingChunk } = input;\n if (manifest.recordingId !== chunk.recordingId) {\n throw new VoiceRecordingChunkConflictError(chunk.recordingId, chunk.chunkNumber);\n }\n if (existingChunk) {\n if (\n existingChunk.sha256 !== chunk.sha256 ||\n existingChunk.byteLength !== chunk.byteLength ||\n existingChunk.mimeType !== chunk.mimeType\n ) {\n throw new VoiceRecordingChunkConflictError(chunk.recordingId, chunk.chunkNumber);\n }\n return { manifest, chunk: existingChunk, deduplicated: true };\n }\n if (chunk.chunkNumber !== manifest.nextChunkNumber) {\n throw new VoiceRecordingChunkSequenceError(manifest.nextChunkNumber, chunk.chunkNumber);\n }\n const updatedManifest: VoiceRecordingManifest = {\n ...manifest,\n updatedAt: chunk.capturedAt,\n ownerHeartbeatAt: manifest.ownerId ? chunk.capturedAt : manifest.ownerHeartbeatAt,\n nextChunkNumber: manifest.nextChunkNumber + 1,\n chunkCount: manifest.chunkCount + 1,\n totalBytes: manifest.totalBytes + chunk.byteLength,\n totalDurationMilliseconds: Math.max(\n manifest.totalDurationMilliseconds,\n chunk.startMilliseconds + chunk.durationMilliseconds,\n ),\n };\n return { manifest: updatedManifest, chunk, deduplicated: false };\n}\n\nexport class IndexedDbVoiceRecordingStore implements VoiceRecordingStore {\n private readonly database: Promise<IDBDatabase>;\n\n constructor(options?: { indexedDB?: IDBFactory | null; databaseName?: string }) {\n const factory = options && \"indexedDB\" in options ? options.indexedDB : globalThis.indexedDB;\n if (!factory) throw new VoiceRecordingStorageUnavailableError();\n this.database = openDatabase(factory, options?.databaseName ?? DEFAULT_DATABASE_NAME);\n }\n\n async createManifest(manifest: VoiceRecordingManifest): Promise<void> {\n const database = await this.database;\n const transaction = database.transaction(MANIFEST_STORE, \"readwrite\");\n transaction.objectStore(MANIFEST_STORE).add(manifest);\n await transactionComplete(transaction);\n }\n\n async getManifest(recordingId: string): Promise<VoiceRecordingManifest | null> {\n const database = await this.database;\n const transaction = database.transaction(MANIFEST_STORE, \"readonly\");\n const manifest = await requestResult<VoiceRecordingManifest | undefined>(\n transaction.objectStore(MANIFEST_STORE).get(recordingId),\n );\n await transactionComplete(transaction);\n return manifest ? normalizeManifest(manifest) : null;\n }\n\n async listRecoverableManifests(\n workspaceId: string,\n ownership?: { ownerId: string; staleBefore: string },\n ): Promise<VoiceRecordingManifest[]> {\n const database = await this.database;\n const transaction = database.transaction(MANIFEST_STORE, \"readonly\");\n const manifests = await requestResult<VoiceRecordingManifest[]>(\n transaction.objectStore(MANIFEST_STORE).getAll(),\n );\n await transactionComplete(transaction);\n return manifests\n .map(normalizeManifest)\n .filter(\n (manifest) =>\n manifest.workspaceId === workspaceId &&\n manifest.captureState !== \"discarded\" &&\n manifest.finalizationState !== \"handed-off\" &&\n manifestAvailableToOwner(manifest, ownership),\n )\n .sort((left, right) => left.createdAt.localeCompare(right.createdAt));\n }\n\n async claimManifest(\n recordingId: string,\n ownerId: string,\n claimedAt: string,\n staleBefore: string,\n ): Promise<VoiceRecordingManifest> {\n const database = await this.database;\n const transaction = database.transaction(MANIFEST_STORE, \"readwrite\");\n const manifests = transaction.objectStore(MANIFEST_STORE);\n const stored = await requestResult<VoiceRecordingManifest | undefined>(\n manifests.get(recordingId),\n );\n if (!stored) {\n transaction.abort();\n throw new VoiceRecordingNotFoundError(recordingId);\n }\n const manifest = normalizeManifest(stored);\n if (\n manifest.finalizationState === \"handed-off\" ||\n !manifestAvailableToOwner(manifest, { ownerId, staleBefore })\n ) {\n transaction.abort();\n throw new VoiceRecordingOwnedError(recordingId);\n }\n const updated: VoiceRecordingManifest = {\n ...manifest,\n captureState: manifest.captureState === \"capturing\" ? \"stopped\" : manifest.captureState,\n handoffMode: \"explicit\",\n ownerId,\n ownerHeartbeatAt: claimedAt,\n updatedAt: claimedAt,\n };\n manifests.put(updated);\n await transactionComplete(transaction);\n return updated;\n }\n\n async listChunks(recordingId: string): Promise<VoiceRecordingChunk[]> {\n const database = await this.database;\n const transaction = database.transaction(CHUNK_STORE, \"readonly\");\n const chunks = await requestResult<VoiceRecordingChunk[]>(\n transaction.objectStore(CHUNK_STORE).index(CHUNKS_BY_RECORDING).getAll(recordingId),\n );\n await transactionComplete(transaction);\n return chunks.sort((left, right) => left.chunkNumber - right.chunkNumber);\n }\n\n async persistChunk(\n input: PersistVoiceRecordingChunkInput,\n ): Promise<PersistVoiceRecordingChunkResult> {\n const chunk = await prepareVoiceRecordingChunk(input);\n const database = await this.database;\n const transaction = database.transaction([MANIFEST_STORE, CHUNK_STORE], \"readwrite\");\n const manifests = transaction.objectStore(MANIFEST_STORE);\n const chunks = transaction.objectStore(CHUNK_STORE);\n const [manifest, existingChunk] = await Promise.all([\n requestResult<VoiceRecordingManifest | undefined>(manifests.get(input.recordingId)),\n requestResult<VoiceRecordingChunk | undefined>(\n chunks.get([input.recordingId, input.chunkNumber]),\n ),\n ]);\n if (!manifest) {\n transaction.abort();\n throw new VoiceRecordingNotFoundError(input.recordingId);\n }\n const normalizedManifest = normalizeManifest(manifest);\n assertManifestOwnership(normalizedManifest, input.ownerId);\n const result = planVoiceRecordingChunkCommit({\n manifest: normalizedManifest,\n chunk,\n existingChunk: existingChunk ?? null,\n });\n if (!result.deduplicated) {\n chunks.add(result.chunk);\n manifests.put(result.manifest);\n }\n await transactionComplete(transaction);\n return result;\n }\n\n async updateManifest(\n recordingId: string,\n update: Partial<\n Pick<\n VoiceRecordingManifest,\n | \"captureState\"\n | \"uploadState\"\n | \"transcriptionState\"\n | \"finalizationState\"\n | \"ownerId\"\n | \"ownerHeartbeatAt\"\n | \"transcriptText\"\n | \"recoveryMode\"\n | \"handoffMode\"\n >\n >,\n updatedAt: string,\n ownerId?: string | undefined,\n ): Promise<VoiceRecordingManifest> {\n const database = await this.database;\n const transaction = database.transaction(MANIFEST_STORE, \"readwrite\");\n const manifests = transaction.objectStore(MANIFEST_STORE);\n const manifest = await requestResult<VoiceRecordingManifest | undefined>(\n manifests.get(recordingId),\n );\n if (!manifest) {\n transaction.abort();\n throw new VoiceRecordingNotFoundError(recordingId);\n }\n const normalizedManifest = normalizeManifest(manifest);\n assertManifestOwnership(normalizedManifest, ownerId);\n const updated = { ...normalizedManifest, ...update, updatedAt };\n manifests.put(updated);\n await transactionComplete(transaction);\n return updated;\n }\n\n async discard(recordingId: string, ownerId?: string | undefined): Promise<void> {\n const database = await this.database;\n const transaction = database.transaction([MANIFEST_STORE, CHUNK_STORE], \"readwrite\");\n const manifests = transaction.objectStore(MANIFEST_STORE);\n const stored = await requestResult<VoiceRecordingManifest | undefined>(\n manifests.get(recordingId),\n );\n if (!stored) {\n transaction.abort();\n throw new VoiceRecordingNotFoundError(recordingId);\n }\n assertManifestOwnership(normalizeManifest(stored), ownerId);\n const chunks = transaction.objectStore(CHUNK_STORE);\n const chunkKeys = await requestResult<IDBValidKey[]>(\n chunks.index(CHUNKS_BY_RECORDING).getAllKeys(recordingId),\n );\n for (const key of chunkKeys) chunks.delete(key);\n manifests.delete(recordingId);\n await transactionComplete(transaction);\n }\n\n async cleanupHandedOffManifests(ownership: {\n ownerId: string;\n staleBefore: string;\n }): Promise<number> {\n const database = await this.database;\n const transaction = database.transaction([MANIFEST_STORE, CHUNK_STORE], \"readwrite\");\n const manifests = transaction.objectStore(MANIFEST_STORE);\n const chunks = transaction.objectStore(CHUNK_STORE);\n const handedOff = (await requestResult<VoiceRecordingManifest[]>(manifests.getAll()))\n .map(normalizeManifest)\n .filter(\n (manifest) =>\n manifest.finalizationState === \"handed-off\" &&\n manifestAvailableToOwner(manifest, ownership),\n );\n const chunkKeys = await Promise.all(\n handedOff.map((manifest) =>\n requestResult<IDBValidKey[]>(\n chunks.index(CHUNKS_BY_RECORDING).getAllKeys(manifest.recordingId),\n ),\n ),\n );\n handedOff.forEach((manifest, index) => {\n for (const key of chunkKeys[index] ?? []) chunks.delete(key);\n manifests.delete(manifest.recordingId);\n });\n await transactionComplete(transaction);\n return handedOff.length;\n }\n\n async close(): Promise<void> {\n (await this.database).close();\n }\n}\n\nfunction normalizeManifest(manifest: VoiceRecordingManifest): VoiceRecordingManifest {\n return {\n ...manifest,\n ownerId: manifest.ownerId ?? null,\n ownerHeartbeatAt: manifest.ownerHeartbeatAt ?? null,\n transcriptText: manifest.transcriptText ?? null,\n recoveryMode: manifest.recoveryMode ?? \"manual\",\n handoffMode: manifest.handoffMode ?? \"explicit\",\n };\n}\n\nfunction manifestAvailableToOwner(\n manifest: VoiceRecordingManifest,\n ownership?: { ownerId: string; staleBefore: string },\n): boolean {\n if (!manifest.ownerId) return true;\n if (!ownership) return false;\n if (manifest.ownerId === ownership.ownerId) return true;\n return !manifest.ownerHeartbeatAt || manifest.ownerHeartbeatAt <= ownership.staleBefore;\n}\n\nfunction assertManifestOwnership(\n manifest: VoiceRecordingManifest,\n ownerId: string | undefined,\n): void {\n if (manifest.ownerId !== (ownerId ?? null)) {\n throw new VoiceRecordingOwnedError(manifest.recordingId);\n }\n}\n\nfunction codecForMimeType(mimeType: string): string | null {\n const match = /(?:^|;)\\s*codecs?\\s*=\\s*\"?([^;\"]+)/iu.exec(mimeType);\n return match?.[1]?.trim().toLowerCase() ?? null;\n}\n\nasync function sha256Hex(bytes: Uint8Array): Promise<string> {\n const digest = await crypto.subtle.digest(\"SHA-256\", Uint8Array.from(bytes).buffer);\n return Array.from(new Uint8Array(digest), (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\nfunction openDatabase(factory: IDBFactory, name: string): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const request = factory.open(name, DATABASE_VERSION);\n request.onupgradeneeded = () => {\n const database = request.result;\n if (!database.objectStoreNames.contains(MANIFEST_STORE)) {\n database.createObjectStore(MANIFEST_STORE, { keyPath: \"recordingId\" });\n }\n if (!database.objectStoreNames.contains(CHUNK_STORE)) {\n const chunks = database.createObjectStore(CHUNK_STORE, {\n keyPath: [\"recordingId\", \"chunkNumber\"],\n });\n chunks.createIndex(CHUNKS_BY_RECORDING, \"recordingId\", { unique: false });\n }\n };\n request.onsuccess = () => {\n const database = request.result;\n database.onversionchange = () => database.close();\n resolve(database);\n };\n request.onerror = () => reject(request.error ?? new Error(\"Failed to open voice storage.\"));\n request.onblocked = () => reject(new Error(\"Voice recording storage upgrade is blocked.\"));\n });\n}\n\nfunction requestResult<T>(request: IDBRequest<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error ?? new Error(\"Voice recording storage failed.\"));\n });\n}\n\nfunction transactionComplete(transaction: IDBTransaction): Promise<void> {\n return new Promise((resolve, reject) => {\n transaction.oncomplete = () => resolve();\n transaction.onabort = () => reject(transaction.error ?? new Error(\"Voice storage aborted.\"));\n transaction.onerror = () => reject(transaction.error ?? new Error(\"Voice storage failed.\"));\n });\n}\n","import {\n authorizeTranscriptionAdapter,\n createTranscriptionSessionRequest,\n type TranscriptionAdapter,\n type TranscriptionDiagnostic,\n type TranscriptionErrorCode,\n type TranscriptionEvent,\n type TranscriptionLifecycleStatus,\n type TranscriptionPolicyBlockReason,\n type TranscriptionSession,\n type TranscriptionTargetSelection,\n type WorkspaceTranscriptionPolicy,\n} from \"@opengeni/sdk\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nexport type TranscriptionControlState = {\n status: TranscriptionLifecycleStatus;\n generation: number;\n localSessionId: string | null;\n providerSessionId: string | null;\n lastSequence: number;\n partial: string;\n error: { code: TranscriptionErrorCode; recoverable: boolean } | null;\n acceptedFinalIds: string[];\n audioMilliseconds: number;\n costUsd: number | null;\n};\n\nexport const INITIAL_TRANSCRIPTION_CONTROL_STATE: TranscriptionControlState = {\n status: \"idle\",\n generation: 0,\n localSessionId: null,\n providerSessionId: null,\n lastSequence: 0,\n partial: \"\",\n error: null,\n acceptedFinalIds: [],\n audioMilliseconds: 0,\n costUsd: null,\n};\n\nexport type TranscriptionControlAction =\n | { type: \"start\"; generation: number; localSessionId: string }\n | { type: \"event\"; generation: number; event: TranscriptionEvent }\n | {\n type: \"start.failed\";\n generation: number;\n code: TranscriptionErrorCode;\n }\n | { type: \"cancel\"; generation: number }\n | { type: \"cancel.settled\"; generation: number }\n | { type: \"reset\" };\n\nexport type TranscriptionControlTransition = {\n state: TranscriptionControlState;\n /** A newly accepted final to append to the current editable draft once. */\n commit: string | null;\n};\n\nexport function transitionTranscriptionControl(\n state: TranscriptionControlState,\n action: TranscriptionControlAction,\n): TranscriptionControlTransition {\n if (action.type === \"reset\") {\n return {\n state: { ...INITIAL_TRANSCRIPTION_CONTROL_STATE, generation: state.generation },\n commit: null,\n };\n }\n if (action.type === \"start\") {\n if (action.generation <= state.generation) return { state, commit: null };\n return {\n state: {\n ...INITIAL_TRANSCRIPTION_CONTROL_STATE,\n status: \"requesting-permission\",\n generation: action.generation,\n localSessionId: action.localSessionId,\n },\n commit: null,\n };\n }\n if (action.generation !== state.generation) return { state, commit: null };\n if (action.type === \"start.failed\") {\n if (state.status === \"closed\" || state.status === \"error\") return { state, commit: null };\n return {\n state: {\n ...state,\n status: \"error\",\n partial: \"\",\n error: { code: normalizeTranscriptionErrorCode(action.code), recoverable: false },\n },\n commit: null,\n };\n }\n if (action.type === \"cancel\") {\n if (!isActiveTranscriptionStatus(state.status)) return { state, commit: null };\n return {\n state: { ...state, status: \"cancelling\", partial: \"\", error: null },\n commit: null,\n };\n }\n if (action.type === \"cancel.settled\") {\n if (state.status !== \"cancelling\") return { state, commit: null };\n return { state: { ...state, status: \"closed\", partial: \"\" }, commit: null };\n }\n\n const event = action.event;\n if (event.localSessionId !== state.localSessionId) return { state, commit: null };\n if (!Number.isSafeInteger(event.sequence) || event.sequence <= state.lastSequence) {\n return { state, commit: null };\n }\n // Closed and failed generations are terminal local privacy fences. Adapters\n // may still deliver callbacks while remote cleanup settles; none can revive\n // the session or mutate the draft.\n if (state.status === \"closed\" || state.status === \"error\") return { state, commit: null };\n // Once cancellation begins, late partial/final/usage callbacks are fenced.\n if (state.status === \"cancelling\" && event.type !== \"session.closed\") {\n return { state: { ...state, lastSequence: event.sequence }, commit: null };\n }\n\n const sequenced = { ...state, lastSequence: event.sequence };\n switch (event.type) {\n case \"permission.requested\":\n return {\n state: { ...sequenced, status: \"requesting-permission\", partial: \"\", error: null },\n commit: null,\n };\n case \"session.opened\":\n return {\n state: {\n ...sequenced,\n status: \"listening\",\n providerSessionId: event.providerSessionId,\n error: null,\n },\n commit: null,\n };\n case \"transcript.partial\":\n return {\n state: { ...sequenced, status: \"listening\", partial: event.text, error: null },\n commit: null,\n };\n case \"transcript.final\": {\n const text = event.text.trim();\n const duplicate = state.acceptedFinalIds.includes(event.providerAcceptanceId);\n const acceptedFinalIds =\n duplicate || text.length === 0\n ? state.acceptedFinalIds\n : [...state.acceptedFinalIds, event.providerAcceptanceId];\n return {\n state: {\n ...sequenced,\n status: \"listening\",\n partial: \"\",\n error: null,\n acceptedFinalIds,\n },\n commit: duplicate || text.length === 0 ? null : text,\n };\n }\n case \"usage\":\n return {\n state: {\n ...sequenced,\n audioMilliseconds: Math.max(state.audioMilliseconds, event.audioMilliseconds),\n costUsd: event.costUsd,\n },\n commit: null,\n };\n case \"session.reconnecting\":\n return {\n state: { ...sequenced, status: \"reconnecting\", partial: \"\", error: null },\n commit: null,\n };\n case \"session.error\":\n return {\n state: {\n ...sequenced,\n status: event.recoverable ? \"reconnecting\" : \"error\",\n partial: \"\",\n error: {\n code: normalizeTranscriptionErrorCode(event.code),\n recoverable: event.recoverable,\n },\n },\n commit: null,\n };\n case \"session.closed\":\n return {\n state: {\n ...sequenced,\n status: event.reason === \"error\" ? \"error\" : \"closed\",\n partial: \"\",\n },\n commit: null,\n };\n }\n}\n\nexport function appendFinalTranscript(draft: string, transcript: string): string {\n const final = transcript.trim();\n if (!final) return draft;\n if (!draft) return final;\n return /\\s$/u.test(draft) ? `${draft}${final}` : `${draft} ${final}`;\n}\n\nexport type UseTranscriptionOptions = {\n adapter: TranscriptionAdapter | null;\n policy: WorkspaceTranscriptionPolicy;\n selection?: TranscriptionTargetSelection | undefined;\n value: string;\n setValue: (value: string) => void;\n focusInput: () => void;\n disabled?: boolean | undefined;\n createLocalSessionId?: (() => string) | undefined;\n lifecycleTimeouts?: Partial<TranscriptionLifecycleTimeouts> | undefined;\n /** Receives the exact diagnostic emitted by the transcription transport. */\n onDiagnostic?: ((diagnostic: TranscriptionDiagnostic) => void) | undefined;\n};\n\nexport type TranscriptionLifecycleTimeouts = {\n startMs: number;\n cleanupMs: number;\n};\n\nconst DEFAULT_TRANSCRIPTION_LIFECYCLE_TIMEOUTS: TranscriptionLifecycleTimeouts = {\n startMs: 15_000,\n cleanupMs: 2_000,\n};\n\nexport type UseTranscriptionResult = {\n state: TranscriptionControlState;\n available: boolean;\n unavailableReason:\n | TranscriptionPolicyBlockReason\n | \"adapter_missing\"\n | \"composer_disabled\"\n | null;\n start: () => Promise<boolean>;\n cancel: () => Promise<boolean>;\n reset: () => void;\n};\n\nexport function useTranscription({\n adapter,\n policy,\n selection = { kind: \"primary\" },\n value,\n setValue,\n focusInput,\n disabled = false,\n createLocalSessionId = defaultLocalSessionId,\n lifecycleTimeouts,\n onDiagnostic,\n}: UseTranscriptionOptions): UseTranscriptionResult {\n const [state, setState] = useState(INITIAL_TRANSCRIPTION_CONTROL_STATE);\n const stateRef = useRef(state);\n const valueRef = useRef(value);\n const sessionRef = useRef<{ generation: number; session: TranscriptionSession } | null>(null);\n const pendingStartRef = useRef<{\n generation: number;\n controller: AbortController;\n } | null>(null);\n const activePolicyRef = useRef<{ generation: number; revision: string } | null>(null);\n valueRef.current = value;\n\n const startTimeoutMs = normalizeTimeout(\n lifecycleTimeouts?.startMs,\n DEFAULT_TRANSCRIPTION_LIFECYCLE_TIMEOUTS.startMs,\n );\n const cleanupTimeoutMs = normalizeTimeout(\n lifecycleTimeouts?.cleanupMs,\n DEFAULT_TRANSCRIPTION_LIFECYCLE_TIMEOUTS.cleanupMs,\n );\n\n const reportDiagnostic = useCallback(\n (diagnostic: unknown) => {\n if (!onDiagnostic) return;\n try {\n onDiagnostic(normalizeTranscriptionDiagnostic(diagnostic));\n } catch {\n // Observability must never break the local privacy or UI lifecycle.\n }\n },\n [onDiagnostic],\n );\n const cleanupRuntimeRef = useRef({ cleanupTimeoutMs, reportDiagnostic });\n\n useEffect(() => {\n cleanupRuntimeRef.current = { cleanupTimeoutMs, reportDiagnostic };\n }, [cleanupTimeoutMs, reportDiagnostic]);\n\n const policyRevision = useMemo(\n () => transcriptionPolicyRevision(policy, selection),\n [policy, selection],\n );\n const authorization = useMemo(\n () => (adapter ? authorizeTranscriptionAdapter(policy, adapter.descriptor, selection) : null),\n [adapter, policy, selection],\n );\n const unavailableReason = disabled\n ? (\"composer_disabled\" as const)\n : !policy.enabled\n ? (\"disabled\" as const)\n : !policy.acceptanceId\n ? (\"unaccepted\" as const)\n : !policy.primary\n ? (\"target_missing\" as const)\n : !adapter\n ? (\"adapter_missing\" as const)\n : authorization?.authorized\n ? null\n : (authorization?.reason ?? \"unaccepted\");\n\n const apply = useCallback(\n (action: TranscriptionControlAction) => {\n const transition = transitionTranscriptionControl(stateRef.current, action);\n if (transition.state !== stateRef.current) {\n stateRef.current = transition.state;\n setState(transition.state);\n }\n if (transition.commit !== null) {\n const next = appendFinalTranscript(valueRef.current, transition.commit);\n valueRef.current = next;\n setValue(next);\n focusInput();\n }\n return transition.state;\n },\n [focusInput, setValue],\n );\n\n const releaseTerminalSession = useCallback(\n (generation: number) => {\n const active = sessionRef.current;\n if (!active || active.generation !== generation) return;\n sessionRef.current = null;\n if (activePolicyRef.current?.generation === generation) activePolicyRef.current = null;\n detachSessionCleanup(active.session, {\n cleanupTimeoutMs,\n reportDiagnostic,\n });\n },\n [cleanupTimeoutMs, reportDiagnostic],\n );\n\n const start = useCallback(async (): Promise<boolean> => {\n if (\n !adapter ||\n unavailableReason !== null ||\n isActiveTranscriptionStatus(stateRef.current.status)\n ) {\n return false;\n }\n const generation = stateRef.current.generation + 1;\n const localSessionId = createLocalSessionId();\n apply({ type: \"start\", generation, localSessionId });\n const request = createTranscriptionSessionRequest({\n policy,\n adapter,\n localSessionId,\n selection,\n sequenceFloor: 0,\n });\n if (!request) {\n apply({\n type: \"start.failed\",\n generation,\n code: \"policy_blocked\",\n });\n return false;\n }\n activePolicyRef.current = { generation, revision: policyRevision };\n const controller = new AbortController();\n pendingStartRef.current = { generation, controller };\n let boundarySettled = false;\n let accepted = false;\n const observedStart = Promise.resolve()\n .then(() =>\n adapter.start(\n request,\n (event) => {\n apply({ type: \"event\", generation, event });\n if (event.type === \"session.error\" && !event.recoverable) {\n releaseTerminalSession(generation);\n } else if (event.type === \"session.closed\") {\n releaseTerminalSession(generation);\n }\n },\n {\n signal: controller.signal,\n reportDiagnostic,\n },\n ),\n )\n .then(\n (session) => {\n if (boundarySettled && !accepted) {\n detachSessionCleanup(session, {\n cancelReason: \"stale-generation\",\n cleanupTimeoutMs,\n reportDiagnostic,\n });\n }\n return { kind: \"session\" as const, session };\n },\n (error: unknown) => {\n if (boundarySettled) {\n reportDiagnostic({\n operation: \"start\",\n code: classifyStartError(error),\n detail: diagnosticDetail(error),\n });\n }\n return { kind: \"error\" as const, error };\n },\n );\n\n let abortListener: (() => void) | null = null;\n const aborted = new Promise<{ kind: \"aborted\" }>((resolve) => {\n if (controller.signal.aborted) {\n resolve({ kind: \"aborted\" });\n return;\n }\n abortListener = () => resolve({ kind: \"aborted\" });\n controller.signal.addEventListener(\"abort\", abortListener, { once: true });\n });\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n const timedOut = new Promise<{ kind: \"timeout\" }>((resolve) => {\n timeoutId = setTimeout(() => resolve({ kind: \"timeout\" }), startTimeoutMs);\n });\n const outcome = await Promise.race([observedStart, aborted, timedOut]);\n boundarySettled = true;\n if (timeoutId !== null) clearTimeout(timeoutId);\n if (abortListener) controller.signal.removeEventListener(\"abort\", abortListener);\n if (pendingStartRef.current?.generation === generation) pendingStartRef.current = null;\n\n if (outcome.kind === \"aborted\") return false;\n\n if (outcome.kind === \"timeout\") {\n controller.abort(\"transcription-start-timeout\");\n if (activePolicyRef.current?.generation === generation) activePolicyRef.current = null;\n reportDiagnostic({\n operation: \"start\",\n code: \"timeout\",\n detail: `Transcription adapter start exceeded ${startTimeoutMs}ms.`,\n });\n apply({ type: \"start.failed\", generation, code: \"timeout\" });\n return false;\n }\n\n if (outcome.kind === \"error\") {\n if (activePolicyRef.current?.generation === generation) activePolicyRef.current = null;\n const code = classifyStartError(outcome.error);\n reportDiagnostic({\n operation: \"start\",\n code,\n detail: diagnosticDetail(outcome.error),\n });\n if (!controller.signal.aborted) {\n apply({ type: \"start.failed\", generation, code });\n }\n return false;\n }\n\n const current = stateRef.current;\n if (\n current.generation !== generation ||\n current.localSessionId !== localSessionId ||\n current.status === \"cancelling\" ||\n !isActiveTranscriptionStatus(current.status)\n ) {\n if (activePolicyRef.current?.generation === generation) activePolicyRef.current = null;\n detachSessionCleanup(outcome.session, {\n ...(current.status === \"error\" ? {} : { cancelReason: \"stale-generation\" }),\n cleanupTimeoutMs,\n reportDiagnostic,\n });\n return false;\n }\n accepted = true;\n sessionRef.current = { generation, session: outcome.session };\n return true;\n }, [\n adapter,\n apply,\n createLocalSessionId,\n cleanupTimeoutMs,\n policy,\n policyRevision,\n releaseTerminalSession,\n reportDiagnostic,\n selection,\n startTimeoutMs,\n unavailableReason,\n ]);\n\n const cancel = useCallback(async (): Promise<boolean> => {\n const current = stateRef.current;\n if (!isActiveTranscriptionStatus(current.status)) return false;\n const generation = current.generation;\n apply({ type: \"cancel\", generation });\n const pending = pendingStartRef.current;\n if (pending?.generation === generation) {\n pendingStartRef.current = null;\n pending.controller.abort(\"transcription-locally-cancelled\");\n }\n const active = sessionRef.current;\n sessionRef.current = null;\n if (activePolicyRef.current?.generation === generation) activePolicyRef.current = null;\n apply({ type: \"cancel.settled\", generation });\n focusInput();\n if (active?.generation === generation) {\n detachSessionCleanup(active.session, {\n cancelReason: \"user-cancelled\",\n cleanupTimeoutMs,\n reportDiagnostic,\n });\n }\n return true;\n }, [apply, cleanupTimeoutMs, focusInput, reportDiagnostic]);\n\n const reset = useCallback(() => apply({ type: \"reset\" }), [apply]);\n\n useEffect(() => {\n if (!isActiveTranscriptionStatus(state.status)) return;\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\") return;\n event.preventDefault();\n void cancel();\n };\n document.addEventListener(\"keydown\", onKeyDown);\n return () => document.removeEventListener(\"keydown\", onKeyDown);\n }, [cancel, state.status]);\n\n useEffect(() => {\n if (!isActiveTranscriptionStatus(state.status)) return;\n const activePolicy = activePolicyRef.current;\n if (\n unavailableReason === null &&\n activePolicy?.generation === state.generation &&\n activePolicy.revision === policyRevision\n ) {\n return;\n }\n void cancel();\n }, [cancel, policyRevision, state.generation, state.status, unavailableReason]);\n\n useEffect(\n () => () => {\n const pending = pendingStartRef.current;\n pendingStartRef.current = null;\n pending?.controller.abort(\"transcription-component-unmounted\");\n const active = sessionRef.current;\n sessionRef.current = null;\n activePolicyRef.current = null;\n stateRef.current = {\n ...stateRef.current,\n generation: stateRef.current.generation + 1,\n status: \"closed\",\n partial: \"\",\n };\n if (active) {\n const runtime = cleanupRuntimeRef.current;\n detachSessionCleanup(active.session, {\n cancelReason: \"component-unmounted\",\n cleanupTimeoutMs: runtime.cleanupTimeoutMs,\n reportDiagnostic: runtime.reportDiagnostic,\n });\n }\n },\n [],\n );\n\n return {\n state,\n available: unavailableReason === null,\n unavailableReason,\n start,\n cancel,\n reset,\n };\n}\n\nfunction isActiveTranscriptionStatus(status: TranscriptionLifecycleStatus): boolean {\n return (\n status === \"requesting-permission\" ||\n status === \"listening\" ||\n status === \"reconnecting\" ||\n status === \"cancelling\"\n );\n}\n\nfunction defaultLocalSessionId(): string {\n return globalThis.crypto.randomUUID();\n}\n\nfunction classifyStartError(error: unknown): TranscriptionErrorCode {\n if (isRecord(error)) {\n const normalized = normalizeTranscriptionErrorCode(error.code);\n if (normalized !== \"unknown\") return normalized;\n }\n if (typeof DOMException !== \"undefined\" && error instanceof DOMException) {\n if (error.name === \"NotAllowedError\") return \"permission_denied\";\n if (error.name === \"NotSupportedError\") return \"not_supported\";\n if (error.name === \"TimeoutError\") return \"timeout\";\n if (error.name === \"AbortError\") return \"cancelled\";\n }\n return \"unknown\";\n}\n\nexport function normalizeTranscriptionErrorCode(code: unknown): TranscriptionErrorCode {\n switch (code) {\n case \"permission_denied\":\n case \"not_supported\":\n case \"network\":\n case \"provider\":\n case \"policy_blocked\":\n case \"timeout\":\n case \"cancelled\":\n case \"unknown\":\n return code;\n default:\n return \"unknown\";\n }\n}\n\nexport function normalizeTranscriptionDiagnostic(diagnostic: unknown): TranscriptionDiagnostic {\n const source = isRecord(diagnostic) ? diagnostic : {};\n const operation =\n source.operation === \"start\" ||\n source.operation === \"session\" ||\n source.operation === \"cancel\" ||\n source.operation === \"close\"\n ? source.operation\n : \"session\";\n const rawDetail = typeof source.detail === \"string\" ? source.detail : \"No diagnostic detail.\";\n return {\n operation,\n code: normalizeTranscriptionErrorCode(source.code),\n detail: rawDetail,\n };\n}\n\nfunction detachSessionCleanup(\n session: TranscriptionSession,\n options: {\n cancelReason?: string | undefined;\n cleanupTimeoutMs: number;\n reportDiagnostic: (diagnostic: unknown) => void;\n },\n): void {\n if (options.cancelReason) {\n void runBoundedCleanup(\n \"cancel\",\n () => session.cancel(options.cancelReason),\n options.cleanupTimeoutMs,\n options.reportDiagnostic,\n );\n }\n void runBoundedCleanup(\n \"close\",\n () => session.close(),\n options.cleanupTimeoutMs,\n options.reportDiagnostic,\n );\n}\n\nasync function runBoundedCleanup(\n operation: \"cancel\" | \"close\",\n invoke: () => Promise<void>,\n timeoutMs: number,\n reportDiagnostic: (diagnostic: unknown) => void,\n): Promise<void> {\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n const result = Promise.resolve()\n .then(invoke)\n .then(\n () => ({ kind: \"settled\" as const }),\n (error: unknown) => ({ kind: \"rejected\" as const, error }),\n );\n const timeout = new Promise<{ kind: \"timeout\" }>((resolve) => {\n timeoutId = setTimeout(() => resolve({ kind: \"timeout\" }), timeoutMs);\n });\n const outcome = await Promise.race([result, timeout]);\n if (timeoutId !== null) clearTimeout(timeoutId);\n if (outcome.kind === \"settled\") return;\n reportDiagnostic({\n operation,\n code: outcome.kind === \"timeout\" ? \"timeout\" : \"provider\",\n detail:\n outcome.kind === \"timeout\"\n ? `Transcription ${operation} exceeded ${timeoutMs}ms.`\n : diagnosticDetail(outcome.error),\n });\n}\n\nfunction diagnosticDetail(error: unknown): string {\n if (error instanceof Error) return error.message;\n return typeof error === \"string\" ? error : \"Unknown transcription adapter failure.\";\n}\n\nfunction normalizeTimeout(value: number | undefined, fallback: number): number {\n return typeof value === \"number\" && Number.isFinite(value) && value >= 1\n ? Math.min(Math.floor(value), 60_000)\n : fallback;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction transcriptionPolicyRevision(\n policy: WorkspaceTranscriptionPolicy,\n selection: TranscriptionTargetSelection,\n): string {\n const targetKey = (target: WorkspaceTranscriptionPolicy[\"primary\"]): string =>\n target\n ? [\n target.provider,\n target.model ?? \"\",\n target.credentialMode,\n target.credentialConnectionId ?? \"\",\n target.region ?? \"\",\n ].join(\"\\u0000\")\n : \"\";\n return [\n policy.enabled ? \"1\" : \"0\",\n policy.acceptanceId ?? \"\",\n targetKey(policy.primary),\n policy.language ?? \"\",\n policy.autoDetectLanguage ? \"1\" : \"0\",\n policy.diarization.enabled ? \"1\" : \"0\",\n policy.diarization.maxSpeakers?.toString() ?? \"\",\n policy.retention.mode,\n policy.retention.maxDays?.toString() ?? \"\",\n policy.privacy.allowProviderLogging ? \"1\" : \"0\",\n policy.privacy.allowProviderTraining ? \"1\" : \"0\",\n policy.fallback.mode,\n policy.fallback.targets.map(targetKey).join(\"\\u0001\"),\n policy.cost.currency,\n policy.cost.maxPerHour?.toString() ?? \"\",\n policy.cost.maxPerMonth?.toString() ?? \"\",\n selection.kind,\n selection.kind === \"fallback\" ? selection.index.toString() : \"\",\n ].join(\"\\u0002\");\n}\n","import { OpenGeniApiError, type ClientVoiceInputConfig, type OpenGeniClient } from \"@opengeni/sdk\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n IndexedDbVoiceRecordingStore,\n VoiceRecordingOwnedError,\n VoiceRecordingStorageUnavailableError,\n createVoiceRecordingManifest,\n type VoiceRecordingChunk,\n type VoiceRecordingManifest,\n type VoiceRecordingStore,\n} from \"../voice-recording-store\";\nimport {\n acquireDefaultVoiceRecordingOwnerLease,\n type VoiceRecordingOwnerLease,\n} from \"../voice-recording-owner\";\nimport { appendFinalTranscript } from \"./use-transcription\";\n\nexport type VoiceInputStatus =\n | \"idle\"\n | \"requesting-permission\"\n | \"recording\"\n | \"saving\"\n | \"transcribing\"\n | \"retrying\"\n | \"recovered\"\n | \"transcript-ready\"\n | \"error\";\n\nexport type UseVoiceInputOptions = {\n client: VoiceInputClient | null;\n workspaceId: string;\n capability: ClientVoiceInputConfig | null;\n enabled: boolean;\n value: string;\n setValue: (value: string) => void;\n focusInput: () => void;\n disabled?: boolean | undefined;\n /** Test/embed seam. Production defaults to the origin-scoped IndexedDB store. */\n createRecordingStore?: (() => VoiceRecordingStore) | undefined;\n createRecordingId?: (() => string) | undefined;\n createOwnerId?: (() => string) | undefined;\n now?: (() => Date) | undefined;\n /** Test/embed seam. Production uses bounded exponential recovery backoff. */\n automaticRetryDelayMilliseconds?: number | undefined;\n};\n\ntype ResumableVoiceInputClient = Pick<\n OpenGeniClient,\n | \"createTranscriptionRecording\"\n | \"getTranscriptionRecording\"\n | \"uploadTranscriptionRecordingChunk\"\n | \"finalizeTranscriptionRecording\"\n | \"processNextTranscriptionRecordingSegment\"\n | \"discardTranscriptionRecording\"\n>;\n\ntype VoiceInputClient = Pick<OpenGeniClient, \"transcribeAudio\"> &\n Partial<ResumableVoiceInputClient>;\n\nexport type UseVoiceInputResult = {\n status: VoiceInputStatus;\n error: string | null;\n available: boolean;\n /** Live mic stream while recording; null once stopped/cancelled. */\n stream: MediaStream | null;\n recordingId: string | null;\n durationSeconds: number;\n locallySaved: boolean;\n hasRecoverableRecording: boolean;\n savedTranscript: string | null;\n start: () => Promise<boolean>;\n /** Stop capture, durably settle the final chunk, then transcribe into the draft. */\n stop: () => void;\n /** Retry finalization/transcription from the already-persisted recording. */\n retry: () => void;\n /** Explicitly insert a durably saved transcript whose prior handoff may be uncertain. */\n insertSavedTranscript: () => Promise<void>;\n /** Cancel active work. A stopped/transcribing recording remains recoverable. */\n cancel: () => void;\n /** Intentionally delete the current durable recording. */\n discard: () => Promise<void>;\n};\n\nexport const VOICE_RECORDING_TIMESLICE_MILLISECONDS = 5_000;\nexport const VOICE_RECORDING_OWNER_HEARTBEAT_MILLISECONDS = 5_000;\nexport const VOICE_RECORDING_OWNER_STALE_MILLISECONDS = 30_000;\nexport const VOICE_RECORDING_CLIENT_MAX_DURATION_SECONDS = 600;\nexport const VOICE_RECORDING_RESUMABLE_CLIENT_MAX_DURATION_SECONDS = 8 * 60 * 60;\nexport const VOICE_RECORDING_RECOVERY_STATUS_POLL_MILLISECONDS = 2_000;\nexport const VOICE_RECORDING_RECOVERY_MAX_MUTATION_DELAY_MILLISECONDS = 30_000;\nconst TRANSCRIPTION_RECORDING_RECOVERY_RETRY_AFTER_MILLISECONDS = 5_000;\nconst MIME_PREFERENCES = [\"audio/webm;codecs=opus\", \"audio/mp4\", \"audio/ogg;codecs=opus\"];\nconst createDefaultVoiceRecordingId = () => crypto.randomUUID();\nconst currentDate = () => new Date();\n\nexport function transcriptionRecoveryMutationDelayMilliseconds(\n retryAfterMilliseconds: number | undefined,\n attempt: number,\n random: () => number = Math.random,\n): number {\n const hint =\n typeof retryAfterMilliseconds === \"number\" &&\n Number.isInteger(retryAfterMilliseconds) &&\n retryAfterMilliseconds > 0\n ? retryAfterMilliseconds\n : TRANSCRIPTION_RECORDING_RECOVERY_RETRY_AFTER_MILLISECONDS;\n const boundedHint = Math.max(\n 500,\n Math.min(hint, VOICE_RECORDING_RECOVERY_MAX_MUTATION_DELAY_MILLISECONDS),\n );\n const exponent = Math.max(0, Math.min(Math.floor(attempt), 6));\n const exponential = Math.min(\n VOICE_RECORDING_RECOVERY_MAX_MUTATION_DELAY_MILLISECONDS,\n boundedHint * 2 ** exponent,\n );\n const sampledJitter = random();\n const jitterRatio = Number.isFinite(sampledJitter) ? Math.max(0, Math.min(1, sampledJitter)) : 0;\n return Math.min(\n VOICE_RECORDING_RECOVERY_MAX_MUTATION_DELAY_MILLISECONDS,\n Math.ceil(exponential * (1 + jitterRatio * 0.2)),\n );\n}\n\nexport function useVoiceInput({\n client,\n workspaceId,\n capability,\n enabled,\n value,\n setValue,\n focusInput,\n disabled = false,\n createRecordingStore,\n createRecordingId = createDefaultVoiceRecordingId,\n createOwnerId,\n now = currentDate,\n automaticRetryDelayMilliseconds,\n}: UseVoiceInputOptions): UseVoiceInputResult {\n const [status, setStatus] = useState<VoiceInputStatus>(\"idle\");\n const [error, setError] = useState<string | null>(null);\n const [stream, setStream] = useState<MediaStream | null>(null);\n const [recordingId, setRecordingId] = useState<string | null>(null);\n const [durationSeconds, setDurationSeconds] = useState(0);\n const [locallySaved, setLocallySaved] = useState(false);\n const [storageAvailable, setStorageAvailable] = useState(\n () => Boolean(createRecordingStore) || typeof globalThis.indexedDB !== \"undefined\",\n );\n const createRecordingStoreRef = useRef(createRecordingStore);\n createRecordingStoreRef.current = createRecordingStore;\n const nowRef = useRef(now);\n nowRef.current = now;\n const readNow = useCallback(() => nowRef.current(), []);\n const generationRef = useRef(0);\n const workspaceIdRef = useRef(workspaceId);\n const ownerIdRef = useRef<string | null>(null);\n const ownerLeaseRef = useRef<VoiceRecordingOwnerLease | null>(null);\n const ownerIdPromiseRef = useRef<Promise<string> | null>(null);\n const createOwnerIdRef = useRef(createOwnerId);\n const recorderRef = useRef<MediaRecorder | null>(null);\n const streamRef = useRef<MediaStream | null>(null);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const automaticRetryTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const automaticRetryAttemptRef = useRef(0);\n const ownerHeartbeatTimerRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const controllerRef = useRef<AbortController | null>(null);\n const valueRef = useRef(value);\n const storeRef = useRef<VoiceRecordingStore | null>(null);\n const storePromiseRef = useRef<Promise<VoiceRecordingStore> | null>(null);\n const ownsStoreRef = useRef(false);\n const manifestRef = useRef<VoiceRecordingManifest | null>(null);\n const persistenceQueueRef = useRef<Promise<void>>(Promise.resolve());\n const persistenceErrorRef = useRef<unknown>(null);\n const captureLimitErrorRef = useRef<string | null>(null);\n const captureSettledRef = useRef<Promise<void>>(Promise.resolve());\n const resolveCaptureSettledRef = useRef<(() => void) | null>(null);\n const statusRef = useRef(status);\n valueRef.current = value;\n statusRef.current = status;\n workspaceIdRef.current = workspaceId;\n\n const ensureOwnerId = useCallback(async (): Promise<string> => {\n if (ownerIdRef.current) return ownerIdRef.current;\n ownerIdPromiseRef.current ??= (async () => {\n const injectedOwnerId = createOwnerIdRef.current?.();\n if (injectedOwnerId) {\n ownerIdRef.current = injectedOwnerId;\n return injectedOwnerId;\n }\n const lease = await acquireDefaultVoiceRecordingOwnerLease();\n ownerLeaseRef.current = lease;\n ownerIdRef.current = lease.ownerId;\n return lease.ownerId;\n })();\n return await ownerIdPromiseRef.current;\n }, []);\n\n const stopOwnerHeartbeat = useCallback(() => {\n if (ownerHeartbeatTimerRef.current) clearInterval(ownerHeartbeatTimerRef.current);\n ownerHeartbeatTimerRef.current = null;\n }, []);\n\n const clearCaptureRuntime = useCallback((expectedStream?: MediaStream) => {\n const captureStream = expectedStream ?? streamRef.current;\n captureStream?.getTracks().forEach((track) => track.stop());\n if (expectedStream && streamRef.current !== expectedStream) return;\n if (timerRef.current) clearTimeout(timerRef.current);\n timerRef.current = null;\n streamRef.current = null;\n recorderRef.current = null;\n setStream(null);\n }, []);\n\n const clearVisibleRecording = useCallback(() => {\n stopOwnerHeartbeat();\n manifestRef.current = null;\n setRecordingId(null);\n setDurationSeconds(0);\n setLocallySaved(false);\n automaticRetryAttemptRef.current = 0;\n }, [stopOwnerHeartbeat]);\n\n const ensureStore = useCallback(async (): Promise<VoiceRecordingStore> => {\n if (storeRef.current) return storeRef.current;\n if (!storePromiseRef.current) {\n storePromiseRef.current = Promise.resolve().then(() => {\n const factory = createRecordingStoreRef.current;\n const store = factory?.() ?? new IndexedDbVoiceRecordingStore();\n ownsStoreRef.current = factory === undefined;\n storeRef.current = store;\n setStorageAvailable(true);\n return store;\n });\n }\n try {\n return await storePromiseRef.current;\n } catch (reason) {\n storePromiseRef.current = null;\n if (reason instanceof VoiceRecordingStorageUnavailableError) setStorageAvailable(false);\n throw reason;\n }\n }, []);\n\n const rememberManifest = useCallback((manifest: VoiceRecordingManifest) => {\n manifestRef.current = manifest;\n setRecordingId(manifest.recordingId);\n setDurationSeconds(manifest.totalDurationMilliseconds / 1_000);\n setLocallySaved(manifest.chunkCount > 0);\n }, []);\n\n const beginOwnerHeartbeat = useCallback(\n (manifest: VoiceRecordingManifest) => {\n stopOwnerHeartbeat();\n ownerHeartbeatTimerRef.current = setInterval(() => {\n if (\n manifestRef.current?.recordingId !== manifest.recordingId ||\n manifestRef.current.ownerId !== ownerIdRef.current\n ) {\n stopOwnerHeartbeat();\n return;\n }\n const updatedAt = readNow().toISOString();\n void ensureStore()\n .then((store) =>\n store.updateManifest(\n manifest.recordingId,\n { ownerHeartbeatAt: updatedAt },\n updatedAt,\n ownerIdRef.current ?? undefined,\n ),\n )\n .then((updated) => {\n if (manifestRef.current?.recordingId === updated.recordingId) {\n manifestRef.current = updated;\n }\n })\n .catch(() => undefined);\n }, VOICE_RECORDING_OWNER_HEARTBEAT_MILLISECONDS);\n },\n [ensureStore, readNow, stopOwnerHeartbeat],\n );\n\n const preserveForRetry = useCallback(\n async (manifest: VoiceRecordingManifest, code: string | null, generation: number) => {\n if (generation !== generationRef.current) return;\n rememberManifest(manifest);\n const transcriptReady =\n manifest.finalizationState === \"transcript-ready\" && manifest.transcriptText !== null;\n setStatus(transcriptReady ? \"transcript-ready\" : code ? \"error\" : \"recovered\");\n setError(transcriptReady ? \"handoff_uncertain\" : code);\n focusInput();\n },\n [focusInput, rememberManifest],\n );\n\n const updateManifestBestEffort = useCallback(\n async (\n manifest: VoiceRecordingManifest,\n update: Parameters<VoiceRecordingStore[\"updateManifest\"]>[1],\n ): Promise<VoiceRecordingManifest> => {\n try {\n return await (\n await ensureStore()\n ).updateManifest(\n manifest.recordingId,\n update,\n readNow().toISOString(),\n ownerIdRef.current ?? undefined,\n );\n } catch {\n return manifest;\n }\n },\n [ensureStore, readNow],\n );\n\n const loadNextRecoverable = useCallback(\n async (generation: number): Promise<void> => {\n const active = () =>\n generation === generationRef.current && workspaceIdRef.current === workspaceId;\n const [store, ownerId] = await Promise.all([ensureStore(), ensureOwnerId()]);\n if (!active()) return;\n const staleBefore = new Date(\n readNow().getTime() - VOICE_RECORDING_OWNER_STALE_MILLISECONDS,\n ).toISOString();\n await store.cleanupHandedOffManifests({ ownerId, staleBefore }).catch(() => undefined);\n if (!active()) return;\n const manifests = await store.listRecoverableManifests(workspaceId, {\n ownerId,\n staleBefore,\n });\n if (!active()) return;\n for (const candidate of manifests) {\n try {\n const claimedAt = readNow().toISOString();\n const claimed = await store.claimManifest(\n candidate.recordingId,\n ownerId,\n claimedAt,\n staleBefore,\n );\n if (!active()) {\n await store\n .updateManifest(\n claimed.recordingId,\n { ownerId: null, ownerHeartbeatAt: null },\n readNow().toISOString(),\n ownerId,\n )\n .catch(() => undefined);\n return;\n }\n rememberManifest(claimed);\n beginOwnerHeartbeat(claimed);\n setStatus(\n claimed.finalizationState === \"transcript-ready\" && claimed.transcriptText !== null\n ? \"transcript-ready\"\n : claimed.recoveryMode === \"automatic\"\n ? \"retrying\"\n : \"recovered\",\n );\n setError(null);\n return;\n } catch (reason) {\n if (reason instanceof VoiceRecordingOwnedError) continue;\n throw reason;\n }\n }\n if (active() && !manifestRef.current) {\n setStatus(\"idle\");\n setError(null);\n }\n },\n [beginOwnerHeartbeat, ensureOwnerId, ensureStore, readNow, rememberManifest, workspaceId],\n );\n\n const finalizePersistedRecording = useCallback(\n async (generation: number): Promise<void> => {\n const manifest = manifestRef.current;\n const resumable =\n capability?.resumable && isResumableVoiceInputClient(client) ? capability.resumable : null;\n const maxSizeBytes = resumable?.maxSizeBytes ?? capability?.maxSizeBytes;\n if (\n !manifest ||\n !client ||\n !capability ||\n !maxSizeBytes ||\n manifest.workspaceId !== workspaceId\n )\n return;\n const controller = new AbortController();\n controllerRef.current?.abort();\n controllerRef.current = controller;\n const active = () =>\n generation === generationRef.current &&\n workspaceIdRef.current === workspaceId &&\n !controller.signal.aborted &&\n manifestRef.current?.recordingId === manifest.recordingId &&\n manifestRef.current.workspaceId === workspaceId;\n let transcribing = manifest;\n try {\n const store = await ensureStore();\n if (!active()) return;\n transcribing = await store.updateManifest(\n manifest.recordingId,\n {\n captureState: \"stopped\",\n uploadState: \"syncing\",\n transcriptionState: \"transcribing\",\n ownerHeartbeatAt: readNow().toISOString(),\n },\n readNow().toISOString(),\n ownerIdRef.current ?? undefined,\n );\n if (!active()) return;\n rememberManifest(transcribing);\n setStatus(\"transcribing\");\n setError(null);\n if (transcribing.totalBytes > maxSizeBytes) {\n throw { code: \"too_large\" };\n }\n const chunks = await store.listChunks(transcribing.recordingId);\n if (!active()) return;\n if (chunks.length === 0) {\n const retained = await store.updateManifest(\n transcribing.recordingId,\n {\n uploadState: \"retrying\",\n transcriptionState: \"retrying\",\n recoveryMode: \"manual\",\n handoffMode: \"explicit\",\n },\n readNow().toISOString(),\n ownerIdRef.current ?? undefined,\n );\n if (!active()) return;\n await preserveForRetry(retained, \"invalid_audio\", generation);\n return;\n }\n const response = await transcribePersistedRecording({\n client,\n workspaceId,\n capability,\n manifest: transcribing,\n chunks,\n signal: controller.signal,\n });\n if (!active()) return;\n const ready = await store.updateManifest(\n transcribing.recordingId,\n {\n uploadState: \"complete\",\n transcriptionState: \"complete\",\n finalizationState: \"transcript-ready\",\n transcriptText: response.text,\n ownerHeartbeatAt: readNow().toISOString(),\n },\n readNow().toISOString(),\n ownerIdRef.current ?? undefined,\n );\n if (!active()) return;\n rememberManifest(ready);\n\n automaticRetryAttemptRef.current = 0;\n if (ready.handoffMode === \"explicit\") {\n setStatus(\"transcript-ready\");\n setError(\"handoff_uncertain\");\n focusInput();\n return;\n }\n\n const next = appendFinalTranscript(valueRef.current, response.text);\n if (next !== valueRef.current) {\n valueRef.current = next;\n setValue(next);\n }\n\n let handedOff: VoiceRecordingManifest;\n try {\n handedOff = await store.updateManifest(\n ready.recordingId,\n { finalizationState: \"handed-off\" },\n readNow().toISOString(),\n ownerIdRef.current ?? undefined,\n );\n } catch {\n if (!active()) return;\n rememberManifest(ready);\n setStatus(\"transcript-ready\");\n setError(\"handoff_uncertain\");\n focusInput();\n return;\n }\n if (!active()) return;\n rememberManifest(handedOff);\n if (resumable && isResumableVoiceInputClient(client)) {\n await client\n .discardTranscriptionRecording(workspaceId, handedOff.recordingId, {\n signal: controller.signal,\n })\n .catch(() => undefined);\n }\n if (!active()) return;\n await store\n .discard(handedOff.recordingId, ownerIdRef.current ?? undefined)\n .catch(() => undefined);\n if (!active()) return;\n clearVisibleRecording();\n setStatus(\"idle\");\n setError(null);\n focusInput();\n await loadNextRecoverable(generation);\n } catch (reason) {\n if (!active()) return;\n const code = controller.signal.aborted ? null : errorCode(reason);\n const retryable = !controller.signal.aborted && isRetryableVoiceInputError(reason);\n const retained = await updateManifestBestEffort(transcribing, {\n uploadState: \"retrying\",\n transcriptionState: \"retrying\",\n recoveryMode: retryable ? \"automatic\" : \"manual\",\n handoffMode: \"explicit\",\n });\n if (!active()) return;\n if (retryable) {\n rememberManifest(retained);\n setStatus(\"retrying\");\n setError(code);\n } else {\n await preserveForRetry(retained, code, generation);\n }\n } finally {\n if (controllerRef.current === controller) controllerRef.current = null;\n }\n },\n [\n capability,\n clearVisibleRecording,\n client,\n ensureStore,\n focusInput,\n loadNextRecoverable,\n readNow,\n preserveForRetry,\n rememberManifest,\n setValue,\n updateManifestBestEffort,\n workspaceId,\n ],\n );\n // Live session renders must not postpone a durable retry deadline. Execute the\n // latest finalizer without making its callback identity part of the timer key.\n const finalizePersistedRecordingRef = useRef(finalizePersistedRecording);\n finalizePersistedRecordingRef.current = finalizePersistedRecording;\n const clientAvailable = client !== null && client !== undefined;\n\n useEffect(() => {\n if (\n status !== \"retrying\" ||\n !manifestRef.current ||\n manifestRef.current.recoveryMode !== \"automatic\" ||\n manifestRef.current.workspaceId !== workspaceId ||\n !clientAvailable ||\n disabled ||\n !enabled\n ) {\n return;\n }\n const generation = generationRef.current;\n let started = false;\n const run = () => {\n if (\n started ||\n generation !== generationRef.current ||\n statusRef.current !== \"retrying\" ||\n workspaceIdRef.current !== workspaceId\n ) {\n return;\n }\n started = true;\n if (automaticRetryTimerRef.current) clearTimeout(automaticRetryTimerRef.current);\n automaticRetryTimerRef.current = null;\n automaticRetryAttemptRef.current += 1;\n void finalizePersistedRecordingRef.current(generation);\n };\n const onOnline = () => run();\n globalThis.addEventListener?.(\"online\", onOnline);\n if (typeof navigator !== \"undefined\" && navigator.onLine === false) {\n return () => globalThis.removeEventListener?.(\"online\", onOnline);\n }\n const delay = Math.max(\n 0,\n automaticRetryDelayMilliseconds ??\n transcriptionRecoveryMutationDelayMilliseconds(\n TRANSCRIPTION_RECORDING_RECOVERY_RETRY_AFTER_MILLISECONDS,\n automaticRetryAttemptRef.current,\n ),\n );\n automaticRetryTimerRef.current = setTimeout(run, delay);\n return () => {\n globalThis.removeEventListener?.(\"online\", onOnline);\n if (automaticRetryTimerRef.current) clearTimeout(automaticRetryTimerRef.current);\n automaticRetryTimerRef.current = null;\n };\n }, [automaticRetryDelayMilliseconds, clientAvailable, disabled, enabled, status, workspaceId]);\n\n const stop = useCallback(() => {\n const recorder = recorderRef.current;\n if (!recorder || recorder.state === \"inactive\") return;\n if (timerRef.current) clearTimeout(timerRef.current);\n timerRef.current = null;\n setStatus(\"saving\");\n recorder.stop();\n }, []);\n\n const start = useCallback(async (): Promise<boolean> => {\n if (\n disabled ||\n !client ||\n !enabled ||\n !capability?.available ||\n manifestRef.current !== null ||\n status === \"requesting-permission\" ||\n status === \"recording\" ||\n status === \"saving\" ||\n status === \"transcribing\" ||\n status === \"retrying\" ||\n !navigator.mediaDevices?.getUserMedia ||\n typeof MediaRecorder === \"undefined\"\n ) {\n return false;\n }\n const prerequisiteGeneration = generationRef.current;\n let store: VoiceRecordingStore;\n let ownerId: string;\n try {\n [store, ownerId] = await Promise.all([ensureStore(), ensureOwnerId()]);\n } catch (reason) {\n setStatus(\"error\");\n setError(\n reason instanceof VoiceRecordingStorageUnavailableError\n ? \"storage_unavailable\"\n : errorCode(reason),\n );\n return false;\n }\n if (\n prerequisiteGeneration !== generationRef.current ||\n workspaceIdRef.current !== workspaceId ||\n ownerIdRef.current !== ownerId ||\n manifestRef.current !== null ||\n statusRef.current === \"requesting-permission\" ||\n statusRef.current === \"recording\" ||\n statusRef.current === \"saving\" ||\n statusRef.current === \"transcribing\"\n ) {\n return false;\n }\n const generation = ++generationRef.current;\n const startAttemptIsCurrent = () =>\n generation === generationRef.current &&\n workspaceIdRef.current === workspaceId &&\n ownerIdRef.current === ownerId;\n let attemptStream: MediaStream | null = null;\n let attemptRecorder: MediaRecorder | null = null;\n let attemptPersistenceQueue = Promise.resolve();\n let attemptPersistenceError: unknown = null;\n let attemptCaptureLimitError: string | null = null;\n const attemptCaptureSettlement: { resolve: (() => void) | null } = { resolve: null };\n const attemptManifest: { current: VoiceRecordingManifest | null } = { current: null };\n let attemptNextChunkNumber = 0;\n let attemptLastChunkEndMilliseconds = 0;\n let attemptRecordingStartedAt = 0;\n const attemptOwnsSharedCapture = () =>\n startAttemptIsCurrent() &&\n attemptStream !== null &&\n streamRef.current === attemptStream &&\n attemptRecorder !== null &&\n recorderRef.current === attemptRecorder &&\n attemptManifest.current !== null &&\n manifestRef.current?.recordingId === attemptManifest.current.recordingId &&\n manifestRef.current.workspaceId === workspaceId &&\n manifestRef.current.ownerId === ownerId;\n setStatus(\"requesting-permission\");\n setError(null);\n let acquiredStream: MediaStream | null = null;\n let recorderStarted = false;\n try {\n const mediaStream = await navigator.mediaDevices.getUserMedia({ audio: true });\n acquiredStream = mediaStream;\n attemptStream = mediaStream;\n if (!startAttemptIsCurrent()) {\n mediaStream.getTracks().forEach((track) => track.stop());\n return false;\n }\n streamRef.current = mediaStream;\n setStream(mediaStream);\n const mimeType = chooseMimeType(capability.acceptedMimeTypes);\n const recorder = new MediaRecorder(mediaStream, mimeType ? { mimeType } : undefined);\n attemptRecorder = recorder;\n const createdAt = readNow();\n const manifest = createVoiceRecordingManifest({\n recordingId: createRecordingId(),\n workspaceId,\n mimeType: recorder.mimeType || mimeType || \"audio/webm\",\n createdAt: createdAt.toISOString(),\n ownerId,\n });\n attemptManifest.current = manifest;\n await store.createManifest(manifest);\n if (!startAttemptIsCurrent()) {\n await store.discard(manifest.recordingId, ownerId);\n clearCaptureRuntime(mediaStream);\n return false;\n }\n rememberManifest(manifest);\n beginOwnerHeartbeat(manifest);\n persistenceQueueRef.current = attemptPersistenceQueue;\n persistenceErrorRef.current = null;\n captureLimitErrorRef.current = null;\n recorderRef.current = recorder;\n recorder.ondataavailable = (event) => {\n if (event.data.size === 0 || attemptPersistenceError || attemptCaptureLimitError) {\n return;\n }\n const chunkNumber = attemptNextChunkNumber++;\n const elapsed = Math.max(0, readNow().getTime() - attemptRecordingStartedAt);\n const eventTimecode = Number.isFinite(event.timecode) ? Math.max(0, event.timecode) : 0;\n const endMilliseconds = Math.max(attemptLastChunkEndMilliseconds, eventTimecode, elapsed);\n const startMilliseconds = attemptLastChunkEndMilliseconds;\n const durationMilliseconds = Math.max(0, endMilliseconds - startMilliseconds);\n attemptLastChunkEndMilliseconds = endMilliseconds;\n attemptPersistenceQueue = attemptPersistenceQueue\n .then(async () => {\n const result = await store.persistChunk({\n recordingId: manifest.recordingId,\n ownerId,\n chunkNumber,\n capturedAt: readNow().toISOString(),\n startMilliseconds,\n durationMilliseconds,\n mimeType: manifest.mimeType,\n audio: event.data,\n });\n if (!startAttemptIsCurrent()) return;\n rememberManifest(result.manifest);\n const maxSizeBytes =\n capability.resumable && isResumableVoiceInputClient(client)\n ? capability.resumable.maxSizeBytes\n : capability.maxSizeBytes;\n if (result.manifest.totalBytes > maxSizeBytes) {\n attemptCaptureLimitError = \"too_large\";\n if (attemptOwnsSharedCapture()) captureLimitErrorRef.current = \"too_large\";\n if (recorder.state !== \"inactive\") recorder.stop();\n }\n })\n .catch((reason: unknown) => {\n attemptPersistenceError = reason;\n if (attemptOwnsSharedCapture()) persistenceErrorRef.current = reason;\n if (recorder.state !== \"inactive\") recorder.stop();\n });\n if (attemptOwnsSharedCapture()) {\n persistenceQueueRef.current = attemptPersistenceQueue;\n }\n };\n recorder.onstop = () => {\n if (attemptOwnsSharedCapture()) {\n clearCaptureRuntime(mediaStream);\n } else {\n mediaStream.getTracks().forEach((track) => track.stop());\n }\n void attemptPersistenceQueue\n .catch((reason: unknown) => {\n attemptPersistenceError = reason;\n })\n .then(async () => {\n const resolveSettled = attemptCaptureSettlement.resolve;\n attemptCaptureSettlement.resolve = null;\n resolveSettled?.();\n if (resolveCaptureSettledRef.current === resolveSettled) {\n resolveCaptureSettledRef.current = null;\n }\n const stoppedCaptureIsCurrent = () =>\n generation === generationRef.current &&\n workspaceIdRef.current === workspaceId &&\n ownerIdRef.current === ownerId &&\n manifestRef.current?.recordingId === manifest.recordingId &&\n manifestRef.current.workspaceId === workspaceId &&\n manifestRef.current.ownerId === ownerId;\n if (!stoppedCaptureIsCurrent()) return;\n const current = manifestRef.current;\n if (!current) return;\n const stopped = await updateManifestBestEffort(current, { captureState: \"stopped\" });\n if (\n !stoppedCaptureIsCurrent() ||\n stopped.recordingId !== manifest.recordingId ||\n stopped.workspaceId !== workspaceId ||\n stopped.ownerId !== ownerId\n ) {\n return;\n }\n rememberManifest(stopped);\n if (attemptPersistenceError) {\n const retained = await updateManifestBestEffort(stopped, {\n recoveryMode: \"manual\",\n handoffMode: \"explicit\",\n });\n await preserveForRetry(retained, \"storage_unavailable\", generation);\n return;\n }\n if (attemptCaptureLimitError) {\n const retained = await updateManifestBestEffort(stopped, {\n recoveryMode: \"manual\",\n handoffMode: \"explicit\",\n });\n await preserveForRetry(retained, attemptCaptureLimitError, generation);\n return;\n }\n await finalizePersistedRecording(generation);\n });\n };\n captureSettledRef.current = new Promise<void>((resolve) => {\n attemptCaptureSettlement.resolve = resolve;\n resolveCaptureSettledRef.current = resolve;\n });\n attemptRecordingStartedAt = readNow().getTime();\n recorder.start(VOICE_RECORDING_TIMESLICE_MILLISECONDS);\n recorderStarted = true;\n setStatus(\"recording\");\n timerRef.current = setTimeout(\n stop,\n Math.min(\n capability.resumable && isResumableVoiceInputClient(client)\n ? capability.resumable.maxDurationSeconds\n : capability.maxDurationSeconds,\n capability.resumable && isResumableVoiceInputClient(client)\n ? VOICE_RECORDING_RESUMABLE_CLIENT_MAX_DURATION_SECONDS\n : VOICE_RECORDING_CLIENT_MAX_DURATION_SECONDS,\n ) * 1_000,\n );\n return true;\n } catch (reason) {\n const resolveSettled = attemptCaptureSettlement.resolve;\n attemptCaptureSettlement.resolve = null;\n resolveSettled?.();\n if (resolveCaptureSettledRef.current === resolveSettled) {\n resolveCaptureSettledRef.current = null;\n }\n if (acquiredStream) {\n if (startAttemptIsCurrent() && streamRef.current === acquiredStream) {\n clearCaptureRuntime(acquiredStream);\n } else {\n acquiredStream.getTracks().forEach((track) => track.stop());\n }\n }\n const failedManifest = attemptManifest.current;\n if (failedManifest && !recorderStarted) {\n const discarded = await store\n .discard(failedManifest.recordingId, ownerId)\n .then(() => true)\n .catch(() => false);\n if (!discarded) {\n await store\n .updateManifest(\n failedManifest.recordingId,\n { captureState: \"stopped\", ownerId: null, ownerHeartbeatAt: null },\n readNow().toISOString(),\n ownerId,\n )\n .catch(() => undefined);\n }\n }\n if (generation !== generationRef.current) return false;\n const visibleManifest = manifestRef.current as VoiceRecordingManifest | null;\n if (failedManifest && visibleManifest?.recordingId === failedManifest.recordingId) {\n clearVisibleRecording();\n }\n setStatus(\"error\");\n setError(\n reason instanceof VoiceRecordingStorageUnavailableError\n ? \"storage_unavailable\"\n : errorCode(reason),\n );\n return false;\n }\n }, [\n capability,\n beginOwnerHeartbeat,\n clearCaptureRuntime,\n clearVisibleRecording,\n client,\n createRecordingId,\n disabled,\n enabled,\n ensureOwnerId,\n ensureStore,\n finalizePersistedRecording,\n readNow,\n preserveForRetry,\n rememberManifest,\n status,\n stop,\n updateManifestBestEffort,\n workspaceId,\n ]);\n\n const retry = useCallback(() => {\n if (\n !manifestRef.current ||\n manifestRef.current.finalizationState === \"transcript-ready\" ||\n manifestRef.current.workspaceId !== workspaceId ||\n !client ||\n disabled ||\n !enabled ||\n status === \"saving\" ||\n status === \"transcribing\"\n ) {\n return;\n }\n const generation = ++generationRef.current;\n controllerRef.current?.abort();\n if (automaticRetryTimerRef.current) clearTimeout(automaticRetryTimerRef.current);\n automaticRetryTimerRef.current = null;\n automaticRetryAttemptRef.current = 0;\n setError(null);\n const manifest = manifestRef.current;\n void updateManifestBestEffort(manifest, {\n recoveryMode: \"automatic\",\n handoffMode: \"append\",\n }).then((retained) => {\n if (generation !== generationRef.current) return;\n rememberManifest(retained);\n void finalizePersistedRecording(generation);\n });\n }, [\n client,\n disabled,\n enabled,\n finalizePersistedRecording,\n rememberManifest,\n status,\n updateManifestBestEffort,\n workspaceId,\n ]);\n\n const insertSavedTranscript = useCallback(async (): Promise<void> => {\n const manifest = manifestRef.current;\n if (\n !manifest ||\n manifest.workspaceId !== workspaceId ||\n manifest.finalizationState !== \"transcript-ready\" ||\n manifest.transcriptText === null\n ) {\n return;\n }\n const generation = ++generationRef.current;\n controllerRef.current?.abort();\n controllerRef.current = null;\n const store = await ensureStore();\n if (generation !== generationRef.current) return;\n const next = appendFinalTranscript(valueRef.current, manifest.transcriptText);\n if (next !== valueRef.current) {\n valueRef.current = next;\n setValue(next);\n }\n let handedOff: VoiceRecordingManifest;\n try {\n handedOff = await store.updateManifest(\n manifest.recordingId,\n { finalizationState: \"handed-off\" },\n readNow().toISOString(),\n ownerIdRef.current ?? undefined,\n );\n } catch {\n if (generation !== generationRef.current) return;\n rememberManifest(manifest);\n setStatus(\"transcript-ready\");\n setError(\"handoff_uncertain\");\n focusInput();\n return;\n }\n if (generation !== generationRef.current) return;\n if (capability?.resumable && isResumableVoiceInputClient(client)) {\n await client\n .discardTranscriptionRecording(workspaceId, handedOff.recordingId)\n .catch(() => undefined);\n }\n if (generation !== generationRef.current) return;\n await store\n .discard(handedOff.recordingId, ownerIdRef.current ?? undefined)\n .catch(() => undefined);\n if (generation !== generationRef.current) return;\n clearVisibleRecording();\n setStatus(\"idle\");\n setError(null);\n focusInput();\n await loadNextRecoverable(generation);\n }, [\n clearVisibleRecording,\n capability?.resumable,\n client,\n ensureStore,\n focusInput,\n loadNextRecoverable,\n readNow,\n rememberManifest,\n setValue,\n workspaceId,\n ]);\n\n const discard = useCallback(async (): Promise<void> => {\n const manifest = manifestRef.current;\n const generation = ++generationRef.current;\n controllerRef.current?.abort();\n controllerRef.current = null;\n const recorder = recorderRef.current;\n let captureSettled = persistenceQueueRef.current;\n if (recorder && recorder.state !== \"inactive\") {\n captureSettled = captureSettledRef.current;\n recorder.stop();\n }\n clearCaptureRuntime();\n await captureSettled.catch(() => undefined);\n if (generation !== generationRef.current) return;\n if (manifest) {\n if (capability?.resumable && isResumableVoiceInputClient(client)) {\n await client\n .discardTranscriptionRecording(workspaceId, manifest.recordingId)\n .catch(() => undefined);\n }\n if (generation !== generationRef.current) return;\n try {\n await (await ensureStore()).discard(manifest.recordingId, ownerIdRef.current ?? undefined);\n } catch {\n if (generation !== generationRef.current) return;\n rememberManifest(manifest);\n setStatus(\"error\");\n setError(\"storage_unavailable\");\n focusInput();\n return;\n }\n }\n clearVisibleRecording();\n persistenceErrorRef.current = null;\n captureLimitErrorRef.current = null;\n setStatus(\"idle\");\n setError(null);\n focusInput();\n await loadNextRecoverable(generation);\n }, [\n clearCaptureRuntime,\n clearVisibleRecording,\n capability?.resumable,\n client,\n ensureStore,\n focusInput,\n loadNextRecoverable,\n rememberManifest,\n workspaceId,\n ]);\n\n const cancel = useCallback(() => {\n if (status === \"recording\" || status === \"requesting-permission\") {\n void discard();\n return;\n }\n if (status === \"saving\" || status === \"transcribing\" || status === \"retrying\") {\n const generation = ++generationRef.current;\n controllerRef.current?.abort();\n controllerRef.current = null;\n if (automaticRetryTimerRef.current) clearTimeout(automaticRetryTimerRef.current);\n automaticRetryTimerRef.current = null;\n const captureSettled = status === \"saving\" ? captureSettledRef.current : Promise.resolve();\n void captureSettled.then(async () => {\n const manifest = manifestRef.current;\n if (!manifest) return;\n const retained = await updateManifestBestEffort(manifest, {\n captureState: \"stopped\",\n uploadState: \"retrying\",\n transcriptionState: \"retrying\",\n recoveryMode: \"manual\",\n handoffMode: \"explicit\",\n });\n await preserveForRetry(retained, null, generation);\n });\n }\n }, [discard, preserveForRetry, status, updateManifestBestEffort]);\n\n useEffect(() => {\n const current = manifestRef.current;\n const generation = ++generationRef.current;\n if (current && current.workspaceId !== workspaceId) {\n controllerRef.current?.abort();\n controllerRef.current = null;\n const recorder = recorderRef.current;\n let captureSettled = persistenceQueueRef.current;\n if (recorder && recorder.state !== \"inactive\") {\n captureSettled = captureSettledRef.current;\n recorder.stop();\n }\n clearCaptureRuntime();\n clearVisibleRecording();\n setStatus(\"idle\");\n setError(null);\n void captureSettled\n .catch(() => undefined)\n .then(async () => {\n const store = await ensureStore();\n const wasProcessing =\n current.uploadState === \"syncing\" || current.transcriptionState === \"transcribing\";\n await store.updateManifest(\n current.recordingId,\n {\n ...(current.captureState === \"capturing\" ? { captureState: \"stopped\" as const } : {}),\n ...(wasProcessing\n ? {\n uploadState: \"retrying\" as const,\n transcriptionState: \"retrying\" as const,\n recoveryMode: \"automatic\" as const,\n handoffMode: \"explicit\" as const,\n }\n : {}),\n ownerId: null,\n ownerHeartbeatAt: null,\n },\n readNow().toISOString(),\n ownerIdRef.current ?? undefined,\n );\n })\n .catch(() => undefined);\n }\n if (!manifestRef.current) {\n void loadNextRecoverable(generation).catch((reason: unknown) => {\n if (reason instanceof VoiceRecordingStorageUnavailableError) setStorageAvailable(false);\n });\n }\n }, [\n clearCaptureRuntime,\n clearVisibleRecording,\n ensureStore,\n loadNextRecoverable,\n readNow,\n workspaceId,\n ]);\n\n useEffect(() => {\n const onKeyDown = (event: KeyboardEvent) => {\n if (\n event.key === \"Escape\" &&\n (status === \"requesting-permission\" ||\n status === \"recording\" ||\n status === \"saving\" ||\n status === \"transcribing\" ||\n status === \"retrying\")\n ) {\n event.preventDefault();\n cancel();\n }\n };\n document.addEventListener(\"keydown\", onKeyDown);\n return () => document.removeEventListener(\"keydown\", onKeyDown);\n }, [cancel, status]);\n\n useEffect(\n () => () => {\n generationRef.current += 1;\n controllerRef.current?.abort();\n controllerRef.current = null;\n if (automaticRetryTimerRef.current) clearTimeout(automaticRetryTimerRef.current);\n automaticRetryTimerRef.current = null;\n const manifest = manifestRef.current;\n const ownerReady = ownerIdPromiseRef.current;\n stopOwnerHeartbeat();\n const recorder = recorderRef.current;\n let captureSettled = persistenceQueueRef.current;\n if (recorder && recorder.state !== \"inactive\") {\n captureSettled = captureSettledRef.current;\n recorder.stop();\n }\n clearCaptureRuntime();\n void captureSettled\n .catch(() => undefined)\n .then(async () => {\n const ownerId =\n ownerIdRef.current ?? (ownerReady ? await ownerReady.catch(() => null) : null);\n const store = storeRef.current;\n if (store && manifest && ownerId) {\n const wasProcessing =\n statusRef.current === \"saving\" ||\n statusRef.current === \"transcribing\" ||\n statusRef.current === \"retrying\";\n await store\n .updateManifest(\n manifest.recordingId,\n {\n ...(manifest.captureState === \"capturing\"\n ? { captureState: \"stopped\" as const }\n : {}),\n ...(wasProcessing\n ? {\n uploadState: \"retrying\" as const,\n transcriptionState: \"retrying\" as const,\n recoveryMode: \"automatic\" as const,\n handoffMode: \"explicit\" as const,\n }\n : {}),\n ownerId: null,\n ownerHeartbeatAt: null,\n },\n readNow().toISOString(),\n ownerId,\n )\n .catch(() => undefined);\n }\n if (ownsStoreRef.current) await store?.close();\n })\n .catch(() => undefined)\n .finally(() => {\n ownerLeaseRef.current?.release();\n ownerLeaseRef.current = null;\n });\n },\n [clearCaptureRuntime, readNow, stopOwnerHeartbeat],\n );\n\n return {\n status,\n error,\n available: Boolean(capability?.available && enabled && !disabled && storageAvailable),\n stream,\n recordingId,\n durationSeconds,\n locallySaved,\n hasRecoverableRecording: manifestRef.current !== null && status !== \"recording\",\n savedTranscript:\n manifestRef.current?.finalizationState === \"transcript-ready\"\n ? manifestRef.current.transcriptText\n : null,\n start,\n stop,\n retry,\n insertSavedTranscript,\n cancel,\n discard,\n };\n}\n\nasync function transcribePersistedRecording(input: {\n client: VoiceInputClient;\n workspaceId: string;\n capability: ClientVoiceInputConfig;\n manifest: VoiceRecordingManifest;\n chunks: VoiceRecordingChunk[];\n signal: AbortSignal;\n}): Promise<{ text: string; languages: string[] }> {\n const client = input.client;\n const resumable = input.capability.resumable;\n const ordered = [...input.chunks].sort((left, right) => left.chunkNumber - right.chunkNumber);\n if (!resumable || !isResumableVoiceInputClient(client)) {\n const audio = new Blob(\n ordered.map((chunk) => chunk.audio),\n { type: input.manifest.mimeType },\n );\n if (audio.size > input.capability.maxSizeBytes) throw { code: \"too_large\" };\n return await client.transcribeAudio(input.workspaceId, {\n audio,\n mimeType: audio.type,\n durationSeconds: input.manifest.totalDurationMilliseconds / 1_000,\n signal: input.signal,\n });\n }\n\n if (\n input.manifest.totalBytes > resumable.maxSizeBytes ||\n input.manifest.totalDurationMilliseconds > resumable.maxDurationSeconds * 1_000\n ) {\n throw { code: \"too_large\" };\n }\n if (\n ordered.some((chunk, index) => chunk.chunkNumber !== index) ||\n ordered.length !== input.manifest.chunkCount\n ) {\n throw { code: \"invalid_audio\" };\n }\n\n const finalizeInput = {\n chunkCount: input.manifest.chunkCount,\n totalBytes: input.manifest.totalBytes,\n totalDurationMilliseconds: input.manifest.totalDurationMilliseconds,\n signal: input.signal,\n };\n\n let remote = await client.createTranscriptionRecording(input.workspaceId, {\n recordingId: input.manifest.recordingId,\n mimeType: input.manifest.mimeType,\n signal: input.signal,\n });\n for (const chunk of ordered) {\n if (chunk.chunkNumber < remote.recording.nextChunkNumber) continue;\n if (chunk.chunkNumber !== remote.recording.nextChunkNumber) {\n throw { code: \"invalid_audio\" };\n }\n if (chunk.byteLength > resumable.maxChunkSizeBytes) throw { code: \"too_large\" };\n const uploaded = await client.uploadTranscriptionRecordingChunk(\n input.workspaceId,\n input.manifest.recordingId,\n chunk.chunkNumber,\n {\n audio: chunk.audio,\n mimeType: input.manifest.mimeType,\n sha256: chunk.sha256,\n startMilliseconds: chunk.startMilliseconds,\n durationMilliseconds: chunk.durationMilliseconds,\n signal: input.signal,\n },\n );\n remote = { recording: uploaded.recording, segments: remote.segments };\n }\n if (remote.recording.nextChunkNumber !== ordered.length) {\n throw { code: \"invalid_audio\" };\n }\n\n remote = await client.finalizeTranscriptionRecording(\n input.workspaceId,\n input.manifest.recordingId,\n finalizeInput,\n );\n\n let recoveryMutationAttempt = 0;\n let recoveryMutationDueAt = 0;\n const scheduleRecoveryMutation = (response: typeof remote): void => {\n if (response.recording.state !== \"segmenting\" && response.recording.state !== \"transcribing\") {\n return;\n }\n recoveryMutationDueAt =\n Date.now() +\n transcriptionRecoveryMutationDelayMilliseconds(\n response.retryAfterMilliseconds,\n recoveryMutationAttempt,\n );\n recoveryMutationAttempt += 1;\n };\n scheduleRecoveryMutation(remote);\n\n for (;;) {\n if (input.signal.aborted) throw new DOMException(\"Aborted\", \"AbortError\");\n switch (remote.recording.state) {\n case \"complete\":\n if (remote.recording.transcriptText === null) throw { code: \"invalid_audio\" };\n return {\n text: remote.recording.transcriptText,\n languages: remote.recording.languages,\n };\n case \"ready\":\n remote = await client.processNextTranscriptionRecordingSegment(\n input.workspaceId,\n input.manifest.recordingId,\n { signal: input.signal },\n );\n scheduleRecoveryMutation(remote);\n break;\n case \"failed\": {\n if (!remote.recording.retryable) {\n throw { code: remote.recording.errorCode ?? \"unknown\", retryable: false };\n }\n const retried =\n remote.recording.segmentCount === 0\n ? await client.finalizeTranscriptionRecording(\n input.workspaceId,\n input.manifest.recordingId,\n finalizeInput,\n )\n : await client.processNextTranscriptionRecordingSegment(\n input.workspaceId,\n input.manifest.recordingId,\n { signal: input.signal },\n );\n if (retried.recording.state === \"failed\") {\n throw {\n code: retried.recording.errorCode ?? \"unknown\",\n retryable: retried.recording.retryable,\n };\n }\n remote = retried;\n scheduleRecoveryMutation(remote);\n break;\n }\n case \"discarded\":\n throw { code: \"invalid_audio\" };\n case \"uploading\":\n remote = await client.finalizeTranscriptionRecording(\n input.workspaceId,\n input.manifest.recordingId,\n finalizeInput,\n );\n scheduleRecoveryMutation(remote);\n break;\n case \"segmenting\":\n case \"transcribing\":\n if (Date.now() < recoveryMutationDueAt) {\n await abortableDelay(\n Math.min(\n recoveryMutationDueAt - Date.now(),\n VOICE_RECORDING_RECOVERY_STATUS_POLL_MILLISECONDS,\n ),\n input.signal,\n );\n remote = await client.getTranscriptionRecording(\n input.workspaceId,\n input.manifest.recordingId,\n { signal: input.signal },\n );\n break;\n }\n if (remote.recording.state === \"segmenting\") {\n // Re-enter the server-authoritative assembly claim only when its\n // durable recovery schedule is due.\n remote = await client.finalizeTranscriptionRecording(\n input.workspaceId,\n input.manifest.recordingId,\n finalizeInput,\n );\n } else {\n // Re-enter the server-authoritative segment claim only when its\n // durable recovery schedule is due.\n remote = await client.processNextTranscriptionRecordingSegment(\n input.workspaceId,\n input.manifest.recordingId,\n { signal: input.signal },\n );\n }\n scheduleRecoveryMutation(remote);\n break;\n }\n }\n}\n\nfunction isResumableVoiceInputClient(\n client: VoiceInputClient | null,\n): client is VoiceInputClient & ResumableVoiceInputClient {\n return Boolean(\n client &&\n client.createTranscriptionRecording &&\n client.getTranscriptionRecording &&\n client.uploadTranscriptionRecordingChunk &&\n client.finalizeTranscriptionRecording &&\n client.processNextTranscriptionRecordingSegment &&\n client.discardTranscriptionRecording,\n );\n}\n\nasync function abortableDelay(milliseconds: number, signal: AbortSignal): Promise<void> {\n if (signal.aborted) throw new DOMException(\"Aborted\", \"AbortError\");\n await new Promise<void>((resolve, reject) => {\n const timer = setTimeout(() => {\n signal.removeEventListener(\"abort\", onAbort);\n resolve();\n }, milliseconds);\n const onAbort = () => {\n clearTimeout(timer);\n signal.removeEventListener(\"abort\", onAbort);\n reject(new DOMException(\"Aborted\", \"AbortError\"));\n };\n signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\nfunction chooseMimeType(accepted: string[]): string | undefined {\n const normalized = accepted.map((value) => value.trim().toLowerCase());\n return MIME_PREFERENCES.find((mimeType) => {\n const bare = mimeType.split(\";\")[0] ?? mimeType;\n const allowed =\n normalized.includes(mimeType) ||\n normalized.includes(bare) ||\n normalized.some((candidate) => candidate.split(\";\")[0] === bare);\n return (\n allowed &&\n (typeof MediaRecorder.isTypeSupported !== \"function\" ||\n MediaRecorder.isTypeSupported(mimeType))\n );\n });\n}\n\nfunction errorCode(error: unknown): string {\n if (error instanceof OpenGeniApiError && typeof error.details?.transcriptionCode === \"string\") {\n return error.details.transcriptionCode;\n }\n if (error && typeof error === \"object\" && \"code\" in error && typeof error.code === \"string\") {\n return error.code;\n }\n if (error instanceof DOMException && error.name === \"NotAllowedError\") return \"permission_denied\";\n if (error instanceof DOMException && error.name === \"NotSupportedError\") return \"not_supported\";\n return \"unknown\";\n}\n\nfunction isRetryableVoiceInputError(error: unknown): boolean {\n if (error instanceof OpenGeniApiError) {\n return error.retryable && error.status !== 409;\n }\n if (error instanceof TypeError) return true;\n if (error && typeof error === \"object\" && \"retryable\" in error) {\n return error.retryable === true;\n }\n return false;\n}\n","export const VOICE_RECORDING_OWNER_SESSION_KEY = \"opengeni.voice-recording-owner.v1\";\n\nconst VOICE_RECORDING_OWNER_LOCK_PREFIX = \"opengeni.voice-recording-owner:\";\nconst VOICE_RECORDING_OWNER_CHANNEL = \"opengeni.voice-recording-owner.v1\";\nconst OWNER_LOCK_RELOAD_GRACE_MILLISECONDS = 250;\nconst OWNER_LOCK_RELOAD_NAVIGATION_MILLISECONDS = 5_000;\nconst OWNER_BROADCAST_PROBE_MILLISECONDS = 100;\nconst OWNER_BROADCAST_RELOAD_ATTEMPTS = 10;\n\nexport type VoiceRecordingOwnerLease = {\n ownerId: string;\n release: () => void;\n};\n\ntype UnderlyingOwnerLease = VoiceRecordingOwnerLease;\n\ntype OwnerProbeMessage = {\n type: \"voice-recording-owner.probe\";\n ownerId: string;\n instanceId: string;\n};\n\ntype OwnerOccupiedMessage = {\n type: \"voice-recording-owner.occupied\";\n ownerId: string;\n targetInstanceId: string;\n};\n\nlet sharedLeasePromise: Promise<UnderlyingOwnerLease> | null = null;\nlet sharedLeaseConsumers = 0;\n\n/**\n * Acquire one document-scoped owner identity shared by every voice hook in the\n * current document. The session-stored candidate survives reload, while the\n * held lock/handshake prevents opener-created or duplicated tabs from reusing\n * that identity concurrently.\n */\nexport async function acquireDefaultVoiceRecordingOwnerLease(): Promise<VoiceRecordingOwnerLease> {\n sharedLeaseConsumers += 1;\n sharedLeasePromise ??= createUnderlyingOwnerLease();\n let underlying: UnderlyingOwnerLease;\n try {\n underlying = await sharedLeasePromise;\n } catch (error) {\n sharedLeaseConsumers -= 1;\n if (sharedLeaseConsumers === 0) sharedLeasePromise = null;\n throw error;\n }\n\n let released = false;\n return {\n ownerId: underlying.ownerId,\n release: () => {\n if (released) return;\n released = true;\n sharedLeaseConsumers = Math.max(0, sharedLeaseConsumers - 1);\n if (sharedLeaseConsumers === 0) {\n sharedLeasePromise = null;\n underlying.release();\n }\n },\n };\n}\n\nasync function createUnderlyingOwnerLease(): Promise<UnderlyingOwnerLease> {\n const candidate = readSessionOwnerId() ?? crypto.randomUUID();\n const reloadNavigation = isReloadNavigation();\n\n if (hasWebLocks()) {\n const retained = await tryAcquireWebLock(\n candidate,\n reloadNavigation\n ? OWNER_LOCK_RELOAD_NAVIGATION_MILLISECONDS\n : OWNER_LOCK_RELOAD_GRACE_MILLISECONDS,\n );\n if (retained) {\n writeSessionOwnerId(candidate);\n return retained;\n }\n\n const rotated = crypto.randomUUID();\n writeSessionOwnerId(rotated);\n const acquired = await tryAcquireWebLock(rotated, OWNER_LOCK_RELOAD_GRACE_MILLISECONDS);\n if (acquired) return acquired;\n }\n\n const broadcastLease = await tryAcquireBroadcastLease(\n readSessionOwnerId() ?? candidate,\n reloadNavigation ? OWNER_BROADCAST_RELOAD_ATTEMPTS : 0,\n );\n if (broadcastLease) return broadcastLease;\n\n // Without a cross-document coordination primitive, prefer a fresh\n // per-document identity over copied session state. Recovery then waits only\n // for the ordinary stale-owner timeout instead of risking cross-tab access.\n const ownerId = crypto.randomUUID();\n writeSessionOwnerId(ownerId);\n return { ownerId, release: () => undefined };\n}\n\nfunction hasWebLocks(): boolean {\n return (\n typeof navigator !== \"undefined\" &&\n navigator.locks !== null &&\n navigator.locks !== undefined &&\n typeof navigator.locks.request === \"function\"\n );\n}\n\nasync function tryAcquireWebLock(\n ownerId: string,\n waitMilliseconds: number,\n): Promise<UnderlyingOwnerLease | null> {\n if (!hasWebLocks()) return null;\n\n return await new Promise<UnderlyingOwnerLease | null>((resolve) => {\n const controller = new AbortController();\n let settled = false;\n const settle = (lease: UnderlyingOwnerLease | null) => {\n if (settled) return;\n settled = true;\n resolve(lease);\n };\n const timeout = setTimeout(() => controller.abort(), waitMilliseconds);\n\n void navigator.locks\n .request(\n `${VOICE_RECORDING_OWNER_LOCK_PREFIX}${ownerId}`,\n { mode: \"exclusive\", signal: controller.signal },\n async () => {\n clearTimeout(timeout);\n let releaseLock: (() => void) | null = null;\n const held = new Promise<void>((release) => {\n releaseLock = release;\n });\n settle({\n ownerId,\n release: () => releaseLock?.(),\n });\n await held;\n },\n )\n .catch(() => {\n clearTimeout(timeout);\n settle(null);\n });\n });\n}\n\nasync function tryAcquireBroadcastLease(\n initialOwnerId: string,\n retainCandidateAttempts: number,\n): Promise<UnderlyingOwnerLease | null> {\n const BroadcastChannelConstructor =\n typeof window !== \"undefined\" ? window.BroadcastChannel : undefined;\n if (!BroadcastChannelConstructor) return null;\n\n let ownerId = initialOwnerId;\n for (let attempt = 0; attempt < retainCandidateAttempts + 3; attempt += 1) {\n const channel = new BroadcastChannelConstructor(VOICE_RECORDING_OWNER_CHANNEL);\n const instanceId = crypto.randomUUID();\n let occupied = false;\n const onMessage = (event: MessageEvent<unknown>) => {\n const message = ownerCoordinationMessage(event.data);\n if (!message || message.ownerId !== ownerId) return;\n if (message.type === \"voice-recording-owner.probe\") {\n if (message.instanceId === instanceId) return;\n channel.postMessage({\n type: \"voice-recording-owner.occupied\",\n ownerId,\n targetInstanceId: message.instanceId,\n } satisfies OwnerOccupiedMessage);\n return;\n }\n if (message.targetInstanceId === instanceId) occupied = true;\n };\n channel.addEventListener(\"message\", onMessage);\n channel.postMessage({\n type: \"voice-recording-owner.probe\",\n ownerId,\n instanceId,\n } satisfies OwnerProbeMessage);\n await delay(OWNER_BROADCAST_PROBE_MILLISECONDS);\n if (!occupied) {\n writeSessionOwnerId(ownerId);\n return {\n ownerId,\n release: () => {\n channel.removeEventListener(\"message\", onMessage);\n channel.close();\n },\n };\n }\n channel.removeEventListener(\"message\", onMessage);\n channel.close();\n if (attempt < retainCandidateAttempts) continue;\n ownerId = crypto.randomUUID();\n writeSessionOwnerId(ownerId);\n }\n return null;\n}\n\nfunction isReloadNavigation(): boolean {\n if (typeof performance === \"undefined\") return false;\n return performance.getEntriesByType(\"navigation\").some((entry) => {\n return \"type\" in entry && entry.type === \"reload\";\n });\n}\n\nfunction ownerCoordinationMessage(value: unknown): OwnerProbeMessage | OwnerOccupiedMessage | null {\n if (!value || typeof value !== \"object\") return null;\n const candidate = value as Record<string, unknown>;\n if (\n candidate.type === \"voice-recording-owner.probe\" &&\n typeof candidate.ownerId === \"string\" &&\n typeof candidate.instanceId === \"string\"\n ) {\n return candidate as OwnerProbeMessage;\n }\n if (\n candidate.type === \"voice-recording-owner.occupied\" &&\n typeof candidate.ownerId === \"string\" &&\n typeof candidate.targetInstanceId === \"string\"\n ) {\n return candidate as OwnerOccupiedMessage;\n }\n return null;\n}\n\nfunction readSessionOwnerId(): string | null {\n try {\n return typeof window === \"undefined\"\n ? null\n : window.sessionStorage.getItem(VOICE_RECORDING_OWNER_SESSION_KEY);\n } catch {\n return null;\n }\n}\n\nfunction writeSessionOwnerId(ownerId: string): void {\n try {\n window.sessionStorage.setItem(VOICE_RECORDING_OWNER_SESSION_KEY, ownerId);\n } catch {\n // Private/embedded contexts may deny session storage. The held lock or\n // broadcast lease still keeps the in-memory identity document-scoped.\n }\n}\n\nfunction delay(milliseconds: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, milliseconds));\n}\n","import type {\n ClientVoiceInputConfig,\n OpenGeniClient,\n TranscriptionAdapter,\n WorkspaceTranscriptionPolicy,\n} from \"@opengeni/sdk\";\nimport {\n ClipboardPasteIcon,\n LoaderCircleIcon,\n MicIcon,\n RefreshCwIcon,\n SquareIcon,\n Trash2Icon,\n XIcon,\n} from \"lucide-react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { useEffect, useState, type MouseEvent, type ReactElement } from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { useVoiceInput } from \"../hooks/use-voice-input\";\nimport type { VoiceRecordingStore } from \"../voice-recording-store\";\nimport { useChatComposer } from \"./composer\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"./tooltip\";\n\nfunction Tip({ tip, children }: { tip: string; children: ReactElement }) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>{children}</TooltipTrigger>\n <TooltipContent side=\"top\">{tip}</TooltipContent>\n </Tooltip>\n );\n}\n\nexport type ComposerTranscriptionMessages = {\n start: string;\n stop: string;\n cancel: string;\n retry: string;\n pauseRetrying: string;\n requestingPermission: string;\n recording: string;\n saving: string;\n transcribing: string;\n retrying: string;\n recovered: string;\n recoveredTranscript: string;\n insertRecoveredTranscript: string;\n discardRecovered: string;\n unavailableDisabled: string;\n unavailable: string;\n errorPermissionDenied: string;\n errorNotSupported: string;\n errorUnavailable: string;\n errorTooLarge: string;\n errorInvalidAudio: string;\n errorStorageUnavailable: string;\n errorRetryable: string;\n errorHandoffUncertain: string;\n errorUnknown: string;\n};\n\nconst defaultMessages: ComposerTranscriptionMessages = {\n start: \"Start voice input\",\n stop: \"Stop and transcribe\",\n cancel: \"Cancel recording\",\n retry: \"Retry voice input\",\n pauseRetrying: \"Pause automatic retry\",\n requestingPermission: \"Requesting microphone…\",\n recording: \"Recording. Press Escape to cancel.\",\n saving: \"Saving audio locally…\",\n transcribing: \"Transcribing…\",\n retrying: \"Recording saved. Retrying automatically…\",\n recovered: \"Recording recovered and saved locally.\",\n recoveredTranscript: \"Transcript saved locally. Check your draft before inserting.\",\n insertRecoveredTranscript: \"Insert saved transcript\",\n discardRecovered: \"Discard saved recording\",\n unavailableDisabled: \"Voice input is unavailable while the composer is disabled.\",\n unavailable: \"Voice input is unavailable for this workspace.\",\n errorPermissionDenied: \"Microphone permission was denied. Your draft was not changed.\",\n errorNotSupported: \"Voice input is not supported on this device.\",\n errorUnavailable: \"Voice input is not configured.\",\n errorTooLarge: \"Recording is too large. Try a shorter message.\",\n errorInvalidAudio: \"The recording could not be read. Try again.\",\n errorStorageUnavailable: \"Voice input stopped because audio could not be saved safely.\",\n errorRetryable: \"Recording is saved locally. Retry transcription when ready.\",\n errorHandoffUncertain: \"Transcript is saved. Check your draft before inserting it again.\",\n errorUnknown: \"Voice input could not start. Try again.\",\n};\n\nexport type ComposerTranscriptionControlProps = {\n client?: Pick<OpenGeniClient, \"transcribeAudio\"> | null | undefined;\n workspaceId?: string | undefined;\n capability?: ClientVoiceInputConfig | null | undefined;\n workspaceEnabled?: boolean | undefined;\n /** @deprecated Native MediaRecorder input no longer uses host adapters. */\n adapter?: TranscriptionAdapter | null | undefined;\n /** @deprecated Native MediaRecorder input no longer uses host policies. */\n policy?: WorkspaceTranscriptionPolicy | undefined;\n /** @deprecated Native input uses the server capability duration limit. */\n lifecycleTimeouts?: unknown;\n /** @deprecated Native input does not expose provider diagnostics. */\n onDiagnostic?: unknown;\n messages?: Partial<ComposerTranscriptionMessages> | undefined;\n className?: string | undefined;\n /** Test/embed seam. Production defaults to origin-scoped IndexedDB. */\n createRecordingStore?: (() => VoiceRecordingStore) | undefined;\n /** Test/embed seam. Production acquires a coordinated browser-document owner lease. */\n createOwnerId?: (() => string) | undefined;\n /** Hide while realtime voice owns the mic — collapses with a layout-friendly exit. */\n suppressed?: boolean | undefined;\n};\n\nconst WAVEFORM_BARS = 18;\nconst WAVEFORM_BAR_KEYS = Array.from(\n { length: WAVEFORM_BARS },\n (_, index) => `voice-waveform-bar-${index + 1}`,\n);\n\n/** One provider-neutral microphone control for the nearest editable composer. */\nexport function ComposerTranscriptionControl({\n client = null,\n workspaceId = \"\",\n capability = null,\n workspaceEnabled = false,\n messages: overrides,\n className,\n createRecordingStore,\n createOwnerId,\n suppressed = false,\n}: ComposerTranscriptionControlProps) {\n const composer = useChatComposer();\n const messages = { ...defaultMessages, ...overrides };\n const transcription = useVoiceInput({\n client,\n workspaceId,\n capability,\n enabled: workspaceEnabled && !suppressed,\n value: composer.value,\n setValue: composer.setValue,\n focusInput: composer.focusInput,\n disabled: composer.disabled,\n createRecordingStore,\n createOwnerId,\n });\n const { status } = transcription;\n const retrying = status === \"retrying\";\n const capturing = status === \"requesting-permission\" || status === \"recording\";\n\n const cancelTranscription = transcription.cancel;\n useEffect(() => {\n if (!suppressed) return;\n if (status === \"recording\" || status === \"requesting-permission\") {\n cancelTranscription();\n }\n }, [cancelTranscription, status, suppressed]);\n const active = capturing || status === \"saving\" || status === \"transcribing\";\n const recoverable =\n transcription.hasRecoverableRecording &&\n (retrying || status === \"recovered\" || status === \"transcript-ready\" || status === \"error\");\n const savedTranscript = status === \"transcript-ready\" && transcription.savedTranscript !== null;\n const unavailableMessage = composer.disabled\n ? messages.unavailableDisabled\n : !capability?.available || !workspaceEnabled\n ? messages.unavailable\n : !transcription.available\n ? messages.errorStorageUnavailable\n : null;\n const idleLabel = unavailableMessage ?? (status === \"error\" ? messages.retry : messages.start);\n const errorMessage = transcription.error\n ? transcriptionErrorMessage(transcription.error, messages)\n : null;\n const announcement =\n status === \"requesting-permission\"\n ? messages.requestingPermission\n : status === \"recording\"\n ? messages.recording\n : status === \"saving\"\n ? messages.saving\n : status === \"transcribing\"\n ? messages.transcribing\n : retrying\n ? messages.retrying\n : status === \"recovered\"\n ? messages.recovered\n : status === \"transcript-ready\"\n ? messages.recoveredTranscript\n : status === \"error\"\n ? (errorMessage ?? messages.errorUnknown)\n : unavailableMessage;\n\n function start(event: MouseEvent<HTMLButtonElement>) {\n if (unavailableMessage) {\n event.preventDefault();\n return;\n }\n void transcription.start();\n }\n\n return (\n <AnimatePresence initial={false}>\n {suppressed ? null : (\n <motion.span\n key=\"composer-dictate\"\n initial={{ opacity: 0, width: 0 }}\n animate={{ opacity: 1, width: \"auto\" }}\n exit={{ opacity: 0, width: 0 }}\n transition={{ duration: 0.36, ease: [0.22, 1, 0.36, 1] }}\n className={cn(\n \"inline-flex min-w-0 overflow-hidden\",\n // Mobile capture mode reserves the footer for this control. Keep the\n // shell itself from shrinking and clipping its trailing actions.\n capturing && \"shrink-0\",\n className,\n )}\n data-transcription-status={status}\n data-transcription-capturing={capturing ? \"\" : undefined}\n >\n <span className=\"inline-flex min-w-0 items-center gap-1.5\">\n <AnimatePresence mode=\"popLayout\" initial={false}>\n {recoverable ? (\n <motion.span\n key=\"recovered\"\n initial={{ opacity: 0, scale: 0.96 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.96 }}\n transition={{ duration: 0.16, ease: [0.22, 1, 0.36, 1] }}\n className={cn(\n \"inline-flex h-8 min-w-0 items-center gap-1 rounded-og-md border border-og-border/80\",\n \"bg-og-surface-2/70 pl-2 pr-1 pointer-coarse:h-11\",\n )}\n >\n <span className=\"og-transcription-recovered-label max-w-44 truncate text-og-xs text-og-fg-muted max-sm:max-w-28\">\n {savedTranscript\n ? (errorMessage ?? messages.recoveredTranscript)\n : retrying\n ? messages.retrying\n : status === \"error\"\n ? (errorMessage ?? messages.errorRetryable)\n : messages.recovered}\n </span>\n <Tip\n tip={\n savedTranscript\n ? messages.insertRecoveredTranscript\n : retrying\n ? messages.pauseRetrying\n : messages.retry\n }\n >\n <button\n type=\"button\"\n onClick={() =>\n savedTranscript\n ? void transcription.insertSavedTranscript()\n : retrying\n ? transcription.cancel()\n : transcription.retry()\n }\n aria-label={\n savedTranscript\n ? messages.insertRecoveredTranscript\n : retrying\n ? messages.pauseRetrying\n : messages.retry\n }\n className={cn(\n \"inline-flex size-7 shrink-0 items-center justify-center rounded-og-sm\",\n \"bg-og-fg text-og-bg transition-colors duration-150 motion-reduce:transition-none\",\n \"hover:bg-og-fg-muted pointer-coarse:size-11\",\n )}\n >\n {savedTranscript ? (\n <ClipboardPasteIcon className=\"size-3.5\" />\n ) : retrying ? (\n <SquareIcon className=\"size-3.5\" />\n ) : (\n <RefreshCwIcon className=\"size-3.5\" />\n )}\n </button>\n </Tip>\n <Tip tip={messages.discardRecovered}>\n <button\n type=\"button\"\n onClick={() => void transcription.discard()}\n aria-label={messages.discardRecovered}\n className={cn(\n \"inline-flex size-7 shrink-0 items-center justify-center rounded-og-sm\",\n \"text-og-fg-muted transition-colors duration-150 motion-reduce:transition-none\",\n \"hover:bg-og-surface-3 hover:text-og-status-failed pointer-coarse:size-11\",\n )}\n >\n <Trash2Icon className=\"size-3.5\" />\n </button>\n </Tip>\n </motion.span>\n ) : active ? (\n <motion.span\n key={status === \"transcribing\" || status === \"saving\" ? \"processing\" : \"capture\"}\n initial={{ opacity: 0, scale: 0.96 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.96 }}\n transition={{ duration: 0.16, ease: [0.22, 1, 0.36, 1] }}\n className={cn(\n \"inline-flex h-8 items-center gap-1 rounded-og-md border border-og-border/80\",\n \"bg-og-surface-2/70 pl-2 pr-1 pointer-coarse:h-11\",\n )}\n >\n {status === \"requesting-permission\" ? (\n <LoaderCircleIcon\n className=\"size-3.5 shrink-0 text-og-fg-muted animate-og-spin motion-reduce:animate-none\"\n aria-hidden\n />\n ) : (\n <span className=\"flex items-center gap-1.5\">\n {status === \"recording\" ? (\n <span\n aria-hidden\n className=\"size-1.5 shrink-0 rounded-full bg-og-status-failed animate-og-pulse motion-reduce:animate-none\"\n />\n ) : null}\n <VoiceWaveform\n stream={status === \"recording\" ? transcription.stream : null}\n mode={status === \"recording\" ? \"recording\" : \"transcribing\"}\n />\n </span>\n )}\n {status === \"recording\" ? (\n <>\n <Tip tip={messages.cancel}>\n <button\n type=\"button\"\n onClick={() => transcription.cancel()}\n aria-label={messages.cancel}\n aria-keyshortcuts=\"Escape\"\n className={cn(\n \"inline-flex size-7 shrink-0 items-center justify-center rounded-og-sm\",\n \"text-og-fg-muted transition-colors duration-150 motion-reduce:transition-none\",\n \"hover:bg-og-surface-3 hover:text-og-fg pointer-coarse:size-11\",\n )}\n >\n <XIcon className=\"size-3.5\" />\n </button>\n </Tip>\n <Tip tip={messages.stop}>\n <button\n type=\"button\"\n onClick={() => transcription.stop()}\n aria-label={messages.stop}\n className={cn(\n \"inline-flex size-7 shrink-0 items-center justify-center rounded-og-sm\",\n \"bg-og-fg text-og-bg transition-colors duration-150 motion-reduce:transition-none\",\n \"hover:bg-og-fg-muted pointer-coarse:size-11\",\n )}\n >\n <SquareIcon className=\"size-2.5 fill-current\" />\n </button>\n </Tip>\n </>\n ) : status === \"transcribing\" || status === \"saving\" ? (\n <span className=\"og-shimmer-text px-1.5 text-og-xs font-medium whitespace-nowrap\">\n {status === \"saving\" ? messages.saving : messages.transcribing}\n </span>\n ) : (\n <span className=\"px-1.5 text-og-xs text-og-fg-muted whitespace-nowrap\">\n {messages.requestingPermission}\n </span>\n )}\n </motion.span>\n ) : (\n <Tip key=\"idle\" tip={idleLabel}>\n <motion.button\n type=\"button\"\n data-og-composer-dictate\n initial={{ opacity: 0, scale: 0.96 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.96 }}\n transition={{ duration: 0.14, ease: [0.22, 1, 0.36, 1] }}\n onClick={start}\n aria-label={idleLabel}\n aria-pressed={false}\n aria-disabled={unavailableMessage !== null}\n className={cn(\n \"inline-flex size-8 shrink-0 items-center justify-center rounded-og-md pointer-coarse:size-11\",\n \"text-og-fg-muted transition-colors duration-150 motion-reduce:transition-none\",\n unavailableMessage\n ? \"cursor-not-allowed opacity-45\"\n : \"hover:bg-og-surface-2 hover:text-og-fg\",\n )}\n >\n <MicIcon className=\"size-4\" />\n </motion.button>\n </Tip>\n )}\n </AnimatePresence>\n {status === \"error\" && errorMessage && !recoverable ? (\n <Tip tip={errorMessage}>\n <span\n aria-hidden=\"true\"\n className=\"og-transcription-error-label max-w-40 truncate text-og-xs text-og-status-failed max-sm:max-w-24\"\n >\n {errorMessage}\n </span>\n </Tip>\n ) : null}\n <span\n className=\"sr-only\"\n role={status === \"error\" ? \"alert\" : \"status\"}\n aria-live=\"polite\"\n >\n {announcement}\n </span>\n </span>\n </motion.span>\n )}\n </AnimatePresence>\n );\n}\n\nfunction VoiceWaveform({\n stream,\n mode,\n}: {\n stream: MediaStream | null;\n mode: \"recording\" | \"transcribing\";\n}) {\n const [levels, setLevels] = useState<number[]>(() => restingLevels(WAVEFORM_BARS));\n const [live, setLive] = useState(false);\n\n useEffect(() => {\n if (!stream || mode !== \"recording\") {\n setLive(false);\n setLevels(restingLevels(WAVEFORM_BARS));\n return;\n }\n\n const AudioCtx =\n window.AudioContext ??\n (window as unknown as { webkitAudioContext?: typeof AudioContext }).webkitAudioContext;\n if (!AudioCtx) return;\n\n let cancelled = false;\n let frame = 0;\n let context: AudioContext | null = null;\n\n try {\n context = new AudioCtx();\n const source = context.createMediaStreamSource(stream);\n const analyser = context.createAnalyser();\n analyser.fftSize = 64;\n analyser.smoothingTimeConstant = 0.8;\n source.connect(analyser);\n const bins = new Uint8Array(analyser.frequencyBinCount);\n\n const tick = () => {\n if (cancelled) return;\n analyser.getByteFrequencyData(bins);\n const next = new Array<number>(WAVEFORM_BARS);\n const usable = Math.max(8, Math.floor(bins.length * 0.65));\n for (let i = 0; i < WAVEFORM_BARS; i++) {\n const start = Math.floor((i / WAVEFORM_BARS) * usable);\n const end = Math.max(start + 1, Math.floor(((i + 1) / WAVEFORM_BARS) * usable));\n let sum = 0;\n for (let j = start; j < end; j++) sum += bins[j] ?? 0;\n const avg = sum / (end - start) / 255;\n next[i] = Math.min(1, 0.14 + avg * 1.65);\n }\n setLevels(next);\n setLive(true);\n frame = requestAnimationFrame(tick);\n };\n\n void context.resume().then(() => {\n if (!cancelled) frame = requestAnimationFrame(tick);\n });\n } catch {\n setLive(false);\n }\n\n return () => {\n cancelled = true;\n cancelAnimationFrame(frame);\n void context?.close();\n };\n }, [stream, mode]);\n\n return (\n <span\n aria-hidden\n data-voice-waveform={live ? \"live\" : \"fallback\"}\n className=\"flex h-4 w-[3.75rem] items-center justify-center gap-px\"\n >\n {WAVEFORM_BAR_KEYS.map((key, index) => {\n const level = levels[index] ?? 0;\n return (\n <span\n key={key}\n className={cn(\n \"w-0.5 rounded-full bg-og-fg-muted/90 origin-center\",\n !live && \"animate-og-waveform motion-reduce:animate-none\",\n mode === \"transcribing\" && \"opacity-45\",\n )}\n style={{\n height: live ? `${Math.max(3, Math.round(level * 14))}px` : \"14px\",\n animationDelay: live ? undefined : `${(index % 9) * 0.07}s`,\n opacity: live ? 0.55 + level * 0.45 : undefined,\n }}\n />\n );\n })}\n </span>\n );\n}\n\nfunction restingLevels(count: number): number[] {\n return Array.from({ length: count }, (_, index) => 0.22 + ((index * 17) % 5) * 0.06);\n}\n\nfunction transcriptionErrorMessage(code: string, messages: ComposerTranscriptionMessages): string {\n switch (code) {\n case \"permission_denied\":\n return messages.errorPermissionDenied;\n case \"not_supported\":\n return messages.errorNotSupported;\n case \"unavailable\":\n return messages.errorUnavailable;\n case \"too_large\":\n return messages.errorTooLarge;\n case \"invalid_audio\":\n return messages.errorInvalidAudio;\n case \"storage_unavailable\":\n return messages.errorStorageUnavailable;\n case \"network\":\n case \"provider\":\n case \"timeout\":\n return messages.errorRetryable;\n case \"handoff_uncertain\":\n return messages.errorHandoffUncertain;\n case \"unknown\":\n return messages.errorUnknown;\n default:\n return messages.errorUnknown;\n }\n}\n"],"mappings":"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","names":["useCallback","useMemo","useState","useState","useMemo","useCallback","errorMessage","AnimatePresence","motion","jsx","jsxs","AnimatePresence","motion","useMemo","jsx","jsxs","useMemo","ChevronDownIcon","XIcon","AnimatePresence","motion","createContext","useCallback","useContext","useEffect","useId","useMemo","useRef","useState","Fragment","jsx","jsxs","useMemo","useId","useRef","useState","useCallback","useEffect","createContext","useContext","jsx","jsxs","CommandPalette","Fragment","ModelPicker","AnimatePresence","motion","ChevronDownIcon","XIcon","useCallback","useEffect","useMemo","useRef","useState","isRecord","useCallback","useEffect","useRef","useState","useState","useRef","useCallback","useEffect","delay","LoaderCircleIcon","XIcon","AnimatePresence","motion","useEffect","useState","Fragment","jsx","jsxs","useEffect","errorMessage","AnimatePresence","motion","LoaderCircleIcon","XIcon","useState"]}