@opengeni/react 0.13.0 → 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +129 -23
- package/dist/chunk-6BXBGJ3B.js +1956 -0
- package/dist/chunk-6BXBGJ3B.js.map +1 -0
- package/dist/chunk-6UT5OC3P.js +2133 -0
- package/dist/chunk-6UT5OC3P.js.map +1 -0
- package/dist/chunk-EBTT3MYN.js +92 -0
- package/dist/chunk-EBTT3MYN.js.map +1 -0
- package/dist/chunk-HHFA4AFX.js +425 -0
- package/dist/chunk-HHFA4AFX.js.map +1 -0
- package/dist/chunk-LAZ2A743.js +2393 -0
- package/dist/chunk-LAZ2A743.js.map +1 -0
- package/dist/chunk-MRSECXRP.js +563 -0
- package/dist/chunk-MRSECXRP.js.map +1 -0
- package/dist/chunk-TK7G6XLT.js +18 -0
- package/dist/chunk-TK7G6XLT.js.map +1 -0
- package/dist/composer-DvUaa5ki.d.ts +585 -0
- package/dist/composer.d.ts +6 -0
- package/dist/composer.js +56 -0
- package/dist/composer.js.map +1 -0
- package/dist/index.d.ts +642 -1080
- package/dist/index.js +7672 -8005
- package/dist/index.js.map +1 -1
- package/dist/machines.d.ts +412 -3
- package/dist/machines.js +25 -1
- package/dist/noto-sans-arabic-loader-IA2T4X2A.js +21 -0
- package/dist/noto-sans-arabic-loader-IA2T4X2A.js.map +1 -0
- package/dist/noto-sans-jp-loader.generated-HFGLYBR3.js +292 -0
- package/dist/noto-sans-jp-loader.generated-HFGLYBR3.js.map +1 -0
- package/dist/queue-surface-implementation-NQMV2ML3.js +890 -0
- package/dist/queue-surface-implementation-NQMV2ML3.js.map +1 -0
- package/dist/session-Gd4iVPYw.d.ts +425 -0
- package/dist/session-context-DIFFlXKc.d.ts +52 -0
- package/dist/session.d.ts +4 -0
- package/dist/session.js +50 -0
- package/dist/session.js.map +1 -0
- package/dist/use-composer-BCfm4mzX.d.ts +112 -0
- package/package.json +23 -4
- package/src/approvals.ts +5 -3
- package/src/client.ts +50 -1
- package/src/components/approval-surface.tsx +198 -0
- package/src/components/chat-composer.tsx +104 -751
- package/src/components/code-editor.tsx +104 -26
- package/src/components/command-palette.tsx +8 -2
- package/src/components/composer-transcription-control.tsx +211 -0
- package/src/components/composer.tsx +1536 -0
- package/src/components/desktop-viewer.tsx +3 -3
- package/src/components/enrollment-consent.tsx +2 -2
- package/src/components/file-browser.tsx +367 -29
- package/src/components/human-input-form.tsx +417 -0
- package/src/components/machine-card.tsx +82 -16
- package/src/components/machine-health-pill.tsx +68 -0
- package/src/components/machine-metrics.tsx +10 -24
- package/src/components/machines/health.ts +146 -0
- package/src/components/machines/machine-detail.tsx +220 -0
- package/src/components/machines/metric-history-chart.tsx +298 -0
- package/src/components/machines/metric-sparkline.tsx +76 -0
- package/src/components/machines/series.ts +113 -0
- package/src/components/machines-dashboard.tsx +16 -4
- package/src/components/message-timeline.tsx +15 -7
- package/src/components/model-picker.tsx +12 -3
- package/src/components/pierre-diff.tsx +32 -6
- package/src/components/queue-surface-implementation.tsx +1041 -0
- package/src/components/queue-surface-state.tsx +94 -0
- package/src/components/queue-surface.tsx +60 -0
- package/src/components/sandbox-files.tsx +230 -21
- package/src/components/sandbox-terminal.tsx +8 -2
- package/src/components/sandbox-workspace.tsx +489 -135
- package/src/components/session-status.tsx +0 -6
- package/src/components/workbench-changes.tsx +145 -50
- package/src/components/workspace-dock.tsx +329 -68
- package/src/composer.ts +60 -0
- package/src/hooks/internal.ts +115 -34
- package/src/hooks/use-composer.ts +635 -74
- package/src/hooks/use-human-input.ts +131 -0
- package/src/hooks/use-machine-chip.ts +2 -2
- package/src/hooks/use-machines.ts +27 -11
- package/src/hooks/use-sandbox-files.ts +310 -62
- package/src/hooks/use-sandbox-git.ts +154 -40
- package/src/hooks/use-sandbox-terminal.ts +28 -6
- package/src/hooks/use-session-capabilities.ts +38 -9
- package/src/hooks/use-session-control.ts +43 -15
- package/src/hooks/use-session-events.ts +523 -48
- package/src/hooks/use-session-lineage.ts +15 -6
- package/src/hooks/use-session.ts +10 -2
- package/src/hooks/use-slash-commands.ts +38 -38
- package/src/hooks/use-transcription.ts +757 -0
- package/src/hooks/use-turn-queue.ts +273 -77
- package/src/hooks/use-windowed-sections.ts +2 -2
- package/src/hooks/use-workspace-capture.ts +146 -40
- package/src/hooks/use-workspace-edit.ts +50 -14
- package/src/hooks/use-workspace-sessions.ts +3 -0
- package/src/human-input.ts +72 -0
- package/src/index.ts +88 -12
- package/src/lib/noto-sans-arabic-loader.ts +21 -0
- package/src/lib/noto-sans-jp-loader.generated.ts +295 -0
- package/src/lib/use-portal-token-style.ts +51 -0
- package/src/lib/use-unicode-fonts.ts +57 -0
- package/src/machines.ts +16 -0
- package/src/provider.tsx +163 -41
- package/src/session-context.ts +135 -0
- package/src/session.ts +79 -0
- package/src/timeline/parsers.ts +78 -6
- package/src/timeline/projection.ts +36 -6
- package/src/timeline/tool-renderers.tsx +41 -0
- package/src/timeline/turn-summary.tsx +2 -2
- package/src/timeline/types.ts +16 -8
- package/styles/index.css +78 -0
- package/styles/index.d.ts +2 -0
- package/styles/tokens.css +11 -6
- package/styles/tokens.d.ts +2 -0
- package/dist/chunk-NFYVQWIB.js +0 -1377
- package/dist/chunk-NFYVQWIB.js.map +0 -1
- package/dist/machines-CnlMb7E-.d.ts +0 -329
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../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/hooks/use-transcription.ts","../src/components/composer-transcription-control.tsx"],"sourcesContent":["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=\"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 { cn } from \"../lib/cn\";\n\nexport type ModelPickerProps = {\n /** The host-exposed models to choose from (typically {@link useAvailableModels}). */\n models: ClientModel[];\n /** Controlled selection — the model id, or undefined for \"nothing chosen yet\". */\n value?: string | undefined;\n /** Called with the chosen model id when the operator picks a row. */\n onChange: (modelId: string) => void;\n disabled?: boolean | undefined;\n className?: string | undefined;\n /** Visible-to-assistive-technology label. Defaults to \"Model\". */\n label?: string | undefined;\n};\n\n/**\n * The model picker — a compact dropdown for the composer footer, grouping the\n * host-exposed models by `providerLabel` (so \"OpenAI\" and \"Fireworks AI\" head\n * their own sections) and showing each model's display `label`. A native\n * `<select>` keeps it keyboard- and screen-reader-accessible for free and\n * themes via the package's og-* tokens; the chevron is a decorative overlay.\n *\n * Controlled: the host owns `value`/`onChange` and threads the selection into\n * the send path. Renders nothing when no models are exposed, so a single-model\n * deployment shows no chrome.\n */\nexport function ModelPicker({\n models,\n value,\n onChange,\n disabled,\n className,\n label = \"Model\",\n}: ModelPickerProps) {\n const selectId = useId();\n // Group by provider, preserving first-seen order for both the providers and\n // the models within each — the server already orders the list (default model\n // and built-in provider first), so we must not re-sort it.\n const groups = useMemo(() => {\n const byProvider = new Map<string, { label: string; models: ClientModel[] }>();\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(model);\n }\n return [...byProvider.values()];\n }, [models]);\n\n if (models.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 // Sized like the other footer controls; the chevron overlay needs the\n // right padding so the value never collides with it.\n \"h-8 max-w-[180px] cursor-pointer appearance-none truncate rounded-og-md bg-transparent\",\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-none focus-visible:outline-none\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n )}\n >\n {groups.map((group) => (\n <optgroup key={group.label} label={group.label}>\n {group.models.map((model) => (\n <option key={model.id} value={model.id}>\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 createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useId,\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 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 { formatBytes, formatRelativeTime } from \"../lib/format\";\nimport { CommandPalette as CommandPaletteView } from \"./command-palette\";\nimport { ModelPicker as ModelPickerView } from \"./model-picker\";\n\nexport const OPEN_WORKSTREAM_CONTROL_EVENT = \"opengeni:open-workstream-control\";\n\nexport type ComposerDelivery = Pick<\n ComposerState,\n \"value\" | \"setValue\" | \"send\" | \"steer\" | \"sending\" | \"canSend\" | \"error\" | \"clearError\"\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 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 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: \"Sending will resume this workstream…\",\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: \"Send and resume\",\n sendTitle: \"Queue message (Enter); steer with Cmd/Ctrl+Enter\",\n sendAndResumeTitle: \"Send & resume (Enter); Steer & resume with Cmd/Ctrl+Enter\",\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 `Send & resume queues behind ${count} waiting prompt${count === 1 ? \"\" : \"s\"}.`,\n resumingAndSending: \"Resuming and sending…\",\n nextMessageResumes: \"Your next message resumes this workstream automatically.\",\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 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 savingDraft: \"Saving draft…\",\n formatBytes,\n formatRelativeTime,\n};\n\nexport type ComposerSubmitMode = \"queue\" | \"steer\";\nexport type ComposerSubmitBlocker =\n | \"disabled\"\n | \"uploading\"\n | \"sending\"\n | \"command\"\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 * 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 mountedRef = useRef(true);\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 blockedByUpload = attachments?.uploading === 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 const resizeInput = useCallback(() => {\n const textarea = textareaRef.current;\n if (!textarea) return;\n textarea.style.height = \"0px\";\n textarea.style.height = `${Math.min(textarea.scrollHeight, 220)}px`;\n }, []);\n useEffect(() => resizeInput(), [delivery.value, resizeInput]);\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: delivery.value,\n setValue: delivery.setValue,\n });\n const paletteEnabled = commandContext !== undefined;\n const commandDraftBlocked = paletteEnabled && palette.isCommandDraft;\n\n const submitBlocker: ComposerSubmitBlocker = disabled\n ? \"disabled\"\n : blockedByUpload\n ? \"uploading\"\n : delivery.sending || submitting\n ? \"sending\"\n : commandDraftBlocked\n ? \"command\"\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 || blockedByUpload || delivery.sending || submittingRef.current) return false;\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 blockedByUpload,\n commandDraftBlocked,\n delivery,\n disabled,\n hasReadyAttachment,\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 : delivery.error.message || 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\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: delivery.setValue,\n value: delivery.value,\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\nexport const Root = forwardRef<HTMLDivElement, ComposerRootProps>(function ComposerRoot(\n { controller, children, className, style, ...props },\n forwardedRef,\n) {\n return (\n <ComposerContext.Provider value={controller}>\n <div\n {...props}\n ref={mergeRefs(controller.rootRef, forwardedRef)}\n data-og-composer-id={controller.id}\n className={cn(\"og-root\", className)}\n style={{ paddingBottom: \"env(safe-area-inset-bottom)\", ...style }}\n >\n {children}\n <ComposerAnnouncements />\n </div>\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 bg-og-surface-1 shadow-og-sm\",\n \"transition-[border-color,box-shadow] duration-200\",\n \"focus-within:border-og-accent/60 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-sm 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 />\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, ...props },\n forwardedRef,\n) {\n const controller = useComposerController();\n const paletteOpen =\n controller.paletteEnabled && controller.paletteMounted && controller.palette.open;\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 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 \"block w-full resize-none bg-transparent px-4 pt-3.5 pb-1 text-base leading-6 md:text-og-md\",\n \"text-og-fg placeholder:text-og-fg-subtle focus:outline-none focus-visible:outline-none\",\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(\"flex items-end gap-2 px-2.5 pb-2.5 pt-1\", className)}\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(\"flex min-w-0 flex-1 flex-wrap items-center gap-1.5\", className)}\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(\"min-w-0 flex-1 px-1.5 text-og-xs text-og-fg-subtle max-sm:hidden\", className)}\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(\"ml-auto flex shrink-0 items-center gap-1.5\", className)}\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 return (\n <>\n <input\n ref={controller.fileInputRef}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n className=\"hidden\"\n onChange={controller.handleFileChange}\n />\n <button\n {...props}\n ref={ref}\n type=\"button\"\n disabled={controller.disabled}\n onClick={() => controller.fileInputRef.current?.click()}\n aria-label={ariaLabel ?? controller.messages.attachFiles}\n title={title ?? controller.messages.attachFiles}\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 </>\n );\n },\n);\n\nexport type ComposerModelPickerProps = {\n models: ClientModel[];\n value?: string | undefined;\n onChange?: ((modelId: string) => void) | undefined;\n label?: string | undefined;\n className?: string | undefined;\n};\n\nexport function ModelPicker({\n models,\n value,\n onChange,\n label,\n className,\n}: ComposerModelPickerProps) {\n const controller = useComposerController();\n return (\n <ModelPickerView\n models={models}\n value={value}\n onChange={(modelId) => onChange?.(modelId)}\n disabled={controller.disabled}\n label={label ?? controller.messages.modelLabel}\n className={className}\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 return (\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 title={title ?? controller.messages.pauseTitle}\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 );\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 return (\n <button\n {...props}\n ref={ref}\n type=\"button\"\n onClick={() => void controller.submit(\"queue\")}\n disabled={!controller.canSubmit}\n aria-label={\n ariaLabel ??\n (controller.paused\n ? controller.messages.sendAndResumeAriaLabel\n : controller.messages.sendMessageAriaLabel)\n }\n title={\n title ??\n (controller.paused\n ? controller.messages.sendAndResumeTitle\n : controller.messages.sendTitle)\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 );\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-xs\",\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 ) : controller.draftSaving ? (\n <p className=\"px-1 pt-1 text-og-xs text-og-fg-subtle\">{controller.messages.savingDraft}</p>\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 ? (\n <p role=\"alert\">{controller.messages.draftConflict}</p>\n ) : controller.draftSaving ? (\n <p role=\"status\">{controller.messages.savingDraft}</p>\n ) : 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=\"hidden min-[400px]:inline\">{messages.resumeThisWorkstream}</span>\n <span className=\"min-[400px]:hidden\">{messages.resumeShort}</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-none 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 <button\n key={`${option.scope}-${option.targetId ?? \"selected\"}`}\n type=\"button\"\n disabled={busy}\n title={option.impactCopy}\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 ))}\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}: {\n attachments: UseFileAttachmentsResult[\"attachments\"];\n messages: ChatComposerMessages;\n onRemove: (id: string) => void;\n onRetry?: ((id: string) => void) | undefined;\n}) {\n return (\n <div className=\"flex flex-wrap gap-2 border-b border-og-border px-3 py-2\">\n {attachments.map((attachment) => {\n const failed = attachment.status === \"failed\";\n const statusText =\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 max-w-[240px] items-center gap-2 rounded-og-md border px-2 py-1.5 text-og-sm\",\n failed\n ? \"border-og-status-failed/40 bg-og-status-failed/10\"\n : \"border-og-border bg-og-surface-2\",\n )}\n >\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 <div\n className={cn(\n \"truncate text-og-xs\",\n failed ? \"text-og-status-failed\" : \"text-og-fg-subtle\",\n )}\n title={failed ? statusText : undefined}\n >\n {statusText}\n </div>\n </div>\n {attachment.status === \"uploading\" ? (\n <LoaderCircleIcon className=\"size-3.5 shrink-0 animate-og-spin\" />\n ) : null}\n {failed && onRetry ? (\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 title={messages.retryUpload}\n >\n <RotateCwIcon className=\"size-3.5\" />\n </button>\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","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 bounded, redacted diagnostics; this detail is never rendered by the hook. */\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(sanitizeTranscriptionDiagnostic(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 sanitizeTranscriptionDiagnostic(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 const detail = rawDetail\n .replace(/[\\u0000-\\u001f\\u007f]+/gu, \" \")\n .replace(/\\bBearer\\s+[A-Za-z0-9._~+/=-]+/giu, \"Bearer [REDACTED]\")\n .replace(/\\bsk-[A-Za-z0-9_-]{4,}\\b/gu, \"[REDACTED]\")\n .replace(\n /\\b(api[-_ ]?key|authorization|access[-_ ]?token|refresh[-_ ]?token|token|secret)\\b\\s*[:=]\\s*[^\\s,;]+/giu,\n \"$1=[REDACTED]\",\n )\n .trim()\n .slice(0, 512);\n return {\n operation,\n code: normalizeTranscriptionErrorCode(source.code),\n detail: detail || \"No diagnostic detail.\",\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 type {\n TranscriptionAdapter,\n TranscriptionDiagnostic,\n TranscriptionErrorCode,\n TranscriptionTargetSelection,\n WorkspaceTranscriptionPolicy,\n} from \"@opengeni/sdk\";\nimport { LoaderCircleIcon, MicIcon, RotateCwIcon, SquareIcon } from \"lucide-react\";\nimport { type MouseEvent } from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { useTranscription, type TranscriptionLifecycleTimeouts } from \"../hooks/use-transcription\";\nimport { useChatComposer } from \"./composer\";\n\nexport type ComposerTranscriptionMessages = {\n start: string;\n stop: string;\n retry: string;\n requestingPermission: string;\n listening: string;\n reconnecting: string;\n cancelling: string;\n unavailableDisabled: string;\n unavailableAdapter: string;\n unavailablePolicy: string;\n errorPermissionDenied: string;\n errorNotSupported: string;\n errorNetwork: string;\n errorProvider: string;\n errorPolicyBlocked: string;\n errorTimeout: string;\n errorCancelled: string;\n errorUnknown: string;\n};\n\nconst defaultMessages: ComposerTranscriptionMessages = {\n start: \"Start voice input\",\n stop: \"Stop voice input\",\n retry: \"Retry voice input\",\n requestingPermission: \"Requesting microphone permission…\",\n listening: \"Listening… Press Escape to cancel.\",\n reconnecting: \"Reconnecting voice input…\",\n cancelling: \"Cancelling voice input…\",\n unavailableDisabled: \"Voice input is unavailable while the composer is disabled.\",\n unavailableAdapter: \"Voice input needs an approved transcription adapter.\",\n unavailablePolicy: \"Enable and accept transcription in Workspace settings.\",\n errorPermissionDenied: \"Microphone permission was denied. Your draft was not changed.\",\n errorNotSupported: \"Voice input is not supported on this device.\",\n errorNetwork: \"Voice input lost its network connection.\",\n errorProvider: \"The transcription service could not continue.\",\n errorPolicyBlocked: \"Workspace policy does not authorize voice input.\",\n errorTimeout: \"Voice input took too long to start. Try again.\",\n errorCancelled: \"Voice input was cancelled.\",\n errorUnknown: \"Voice input could not start. Try again.\",\n};\n\nexport type ComposerTranscriptionControlProps = {\n adapter: TranscriptionAdapter | null;\n policy: WorkspaceTranscriptionPolicy;\n selection?: TranscriptionTargetSelection | undefined;\n messages?: Partial<ComposerTranscriptionMessages> | undefined;\n className?: string | undefined;\n lifecycleTimeouts?: Partial<TranscriptionLifecycleTimeouts> | undefined;\n onDiagnostic?: ((diagnostic: TranscriptionDiagnostic) => void) | undefined;\n};\n\n/** One provider-neutral microphone control for the nearest editable composer. */\nexport function ComposerTranscriptionControl({\n adapter,\n policy,\n selection,\n messages: overrides,\n className,\n lifecycleTimeouts,\n onDiagnostic,\n}: ComposerTranscriptionControlProps) {\n const composer = useChatComposer();\n const messages = { ...defaultMessages, ...overrides };\n const transcription = useTranscription({\n adapter,\n policy,\n ...(selection ? { selection } : {}),\n value: composer.value,\n setValue: composer.setValue,\n focusInput: composer.focusInput,\n disabled: composer.disabled,\n lifecycleTimeouts,\n onDiagnostic,\n });\n const status = transcription.state.status;\n const active =\n status === \"requesting-permission\" ||\n status === \"listening\" ||\n status === \"reconnecting\" ||\n status === \"cancelling\";\n const unavailableMessage =\n transcription.unavailableReason === \"composer_disabled\"\n ? messages.unavailableDisabled\n : transcription.unavailableReason === \"adapter_missing\"\n ? messages.unavailableAdapter\n : transcription.unavailableReason\n ? messages.unavailablePolicy\n : null;\n const label = unavailableMessage\n ? unavailableMessage\n : status === \"error\"\n ? messages.retry\n : active\n ? messages.stop\n : messages.start;\n const errorMessage = transcription.state.error\n ? transcriptionErrorMessage(transcription.state.error.code, messages)\n : null;\n const announcement =\n transcription.state.partial ||\n (status === \"requesting-permission\"\n ? messages.requestingPermission\n : status === \"listening\"\n ? messages.listening\n : status === \"reconnecting\"\n ? (errorMessage ?? messages.reconnecting)\n : status === \"cancelling\"\n ? messages.cancelling\n : status === \"error\"\n ? (errorMessage ?? messages.errorUnknown)\n : unavailableMessage);\n\n function activate(event: MouseEvent<HTMLButtonElement>) {\n if (unavailableMessage || status === \"cancelling\") {\n event.preventDefault();\n return;\n }\n if (active) void transcription.cancel();\n else void transcription.start();\n }\n\n return (\n <span\n className={cn(\"inline-flex min-w-0 items-center gap-1.5\", className)}\n data-transcription-status={status}\n >\n <button\n type=\"button\"\n onClick={activate}\n aria-label={label}\n aria-pressed={active}\n aria-disabled={unavailableMessage !== null || status === \"cancelling\"}\n aria-keyshortcuts={active ? \"Escape\" : undefined}\n title={label}\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 : status === \"cancelling\"\n ? \"cursor-not-allowed\"\n : \"hover:bg-og-surface-2 hover:text-og-fg\",\n status === \"listening\" && \"bg-og-status-failed/10 text-og-status-failed\",\n )}\n >\n {status === \"requesting-permission\" || status === \"cancelling\" ? (\n <LoaderCircleIcon className=\"size-4 animate-og-spin motion-reduce:animate-none\" />\n ) : status === \"reconnecting\" ? (\n <RotateCwIcon className=\"size-4 animate-og-spin motion-reduce:animate-none\" />\n ) : active ? (\n <SquareIcon className=\"size-3.5 fill-current\" />\n ) : (\n <MicIcon className=\"size-4\" />\n )}\n </button>\n {announcement && (active || status === \"error\") ? (\n <span\n aria-hidden=\"true\"\n title={announcement}\n className={cn(\n \"max-w-48 truncate text-og-xs text-og-fg-muted max-sm:max-w-28\",\n status === \"error\" && \"text-og-status-failed\",\n )}\n >\n {announcement}\n </span>\n ) : null}\n <span className=\"sr-only\" role={status === \"error\" ? \"alert\" : \"status\"} aria-live=\"polite\">\n {announcement}\n </span>\n </span>\n );\n}\n\nfunction transcriptionErrorMessage(\n code: TranscriptionErrorCode,\n messages: ComposerTranscriptionMessages,\n): string {\n switch (code) {\n case \"permission_denied\":\n return messages.errorPermissionDenied;\n case \"not_supported\":\n return messages.errorNotSupported;\n case \"network\":\n return messages.errorNetwork;\n case \"provider\":\n return messages.errorProvider;\n case \"policy_blocked\":\n return messages.errorPolicyBlocked;\n case \"timeout\":\n return messages.errorTimeout;\n case \"cancelled\":\n return messages.errorCancelled;\n case \"unknown\":\n return messages.errorUnknown;\n }\n}\n"],"mappings":"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","names":["errorMessage","useMemo","jsx","jsxs","useMemo","ChevronDownIcon","AnimatePresence","motion","useCallback","useId","useMemo","useRef","useState","jsx","jsxs","useMemo","useId","useRef","useState","useCallback","CommandPalette","ModelPicker","AnimatePresence","motion","ChevronDownIcon","useCallback","useEffect","useMemo","useRef","useState","isRecord","LoaderCircleIcon","RotateCwIcon","jsx","jsxs","errorMessage","LoaderCircleIcon","RotateCwIcon"]}
|