@opengeni/react 0.40.0 → 0.42.1

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.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/hooks/use-transcription.ts","../src/hooks/use-voice-input.ts","../src/workstream-control-event.ts","../src/commands/registry.ts","../src/hooks/use-slash-commands.ts","../src/components/command-palette.tsx","../src/components/model-picker.tsx","../src/components/composer.tsx","../src/components/composer-transcription-control.tsx"],"sourcesContent":["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 { ClientVoiceInputConfig, OpenGeniClient } from \"@opengeni/sdk\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { appendFinalTranscript } from \"./use-transcription\";\n\nexport type VoiceInputStatus =\n | \"idle\"\n | \"requesting-permission\"\n | \"recording\"\n | \"transcribing\"\n | \"error\";\n\nexport type UseVoiceInputOptions = {\n client: Pick<OpenGeniClient, \"transcribeAudio\"> | null;\n workspaceId: string;\n capability: ClientVoiceInputConfig | null;\n enabled: boolean;\n value: string;\n setValue: (value: string) => void;\n focusInput: () => void;\n disabled?: boolean | undefined;\n};\n\nexport type UseVoiceInputResult = {\n status: VoiceInputStatus;\n error: string | null;\n available: boolean;\n /** Live mic stream while recording; null once stopped/cancelled. */\n stream: MediaStream | null;\n start: () => Promise<boolean>;\n /** Stop capture and immediately upload/transcribe into the draft (no Send). */\n stop: () => void;\n /** Discard the in-flight recording or transcription; Escape also cancels. */\n cancel: () => void;\n};\n\nconst MIME_PREFERENCES = [\"audio/webm;codecs=opus\", \"audio/mp4\", \"audio/ogg;codecs=opus\"];\n\nexport function useVoiceInput({\n client,\n workspaceId,\n capability,\n enabled,\n value,\n setValue,\n focusInput,\n disabled = false,\n}: UseVoiceInputOptions): UseVoiceInputResult {\n const [status, setStatus] = useState<VoiceInputStatus>(\"idle\");\n const [error, setError] = useState<string | null>(null);\n const [stream, setStream] = useState<MediaStream | null>(null);\n const generationRef = useRef(0);\n const recorderRef = useRef<MediaRecorder | null>(null);\n const streamRef = useRef<MediaStream | null>(null);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const controllerRef = useRef<AbortController | null>(null);\n const valueRef = useRef(value);\n valueRef.current = value;\n\n const clearRuntime = useCallback(() => {\n if (timerRef.current) clearTimeout(timerRef.current);\n timerRef.current = null;\n streamRef.current?.getTracks().forEach((track) => track.stop());\n streamRef.current = null;\n recorderRef.current = null;\n setStream(null);\n }, []);\n\n const cancel = useCallback(() => {\n generationRef.current += 1;\n controllerRef.current?.abort();\n controllerRef.current = null;\n const recorder = recorderRef.current;\n clearRuntime();\n if (recorder && recorder.state !== \"inactive\") recorder.stop();\n setStatus(\"idle\");\n setError(null);\n focusInput();\n }, [clearRuntime, focusInput]);\n\n const stop = () => {\n const recorder = recorderRef.current;\n if (!recorder || recorder.state === \"inactive\") return;\n if (timerRef.current) clearTimeout(timerRef.current);\n timerRef.current = null;\n setStatus(\"transcribing\");\n recorder.stop();\n };\n\n const start = async (): Promise<boolean> => {\n if (\n disabled ||\n !client ||\n !enabled ||\n !capability?.available ||\n status === \"requesting-permission\" ||\n status === \"recording\" ||\n status === \"transcribing\" ||\n !navigator.mediaDevices?.getUserMedia ||\n typeof MediaRecorder === \"undefined\"\n ) {\n return false;\n }\n const voiceClient = client;\n const generation = ++generationRef.current;\n setStatus(\"requesting-permission\");\n setError(null);\n try {\n const mediaStream = await navigator.mediaDevices.getUserMedia({ audio: true });\n if (generation !== generationRef.current) {\n mediaStream.getTracks().forEach((track) => track.stop());\n return false;\n }\n const mimeType = chooseMimeType(capability.acceptedMimeTypes);\n const recorder = new MediaRecorder(mediaStream, mimeType ? { mimeType } : undefined);\n const chunks: BlobPart[] = [];\n const startedAt = Date.now();\n streamRef.current = mediaStream;\n recorderRef.current = recorder;\n setStream(mediaStream);\n recorder.ondataavailable = (event) => {\n if (event.data.size > 0) chunks.push(event.data);\n };\n recorder.onstop = () => {\n clearRuntime();\n if (generation !== generationRef.current) return;\n const audio = new Blob(chunks, { type: recorder.mimeType || mimeType || \"audio/webm\" });\n if (audio.size === 0) {\n setStatus(\"error\");\n setError(\"invalid_audio\");\n return;\n }\n const controller = new AbortController();\n controllerRef.current = controller;\n void voiceClient\n .transcribeAudio(workspaceId, {\n audio,\n mimeType: audio.type,\n durationSeconds: Math.max(0, (Date.now() - startedAt) / 1000),\n signal: controller.signal,\n })\n .then((response) => {\n if (generation !== generationRef.current || controller.signal.aborted) return;\n const next = appendFinalTranscript(valueRef.current, response.text);\n if (next !== valueRef.current) {\n valueRef.current = next;\n setValue(next);\n }\n setStatus(\"idle\");\n focusInput();\n })\n .catch((reason: unknown) => {\n if (generation !== generationRef.current || controller.signal.aborted) return;\n setStatus(\"error\");\n setError(errorCode(reason));\n })\n .finally(() => {\n if (controllerRef.current === controller) controllerRef.current = null;\n });\n };\n recorder.start();\n setStatus(\"recording\");\n timerRef.current = setTimeout(\n () => stop(),\n Math.min(capability.maxDurationSeconds, 60) * 1000,\n );\n return true;\n } catch (reason) {\n if (generation !== generationRef.current) return false;\n clearRuntime();\n setStatus(\"error\");\n setError(errorCode(reason));\n return false;\n }\n };\n\n useEffect(() => {\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\" && status !== \"idle\") {\n event.preventDefault();\n cancel();\n }\n };\n document.addEventListener(\"keydown\", onKeyDown);\n return () => document.removeEventListener(\"keydown\", onKeyDown);\n }, [cancel, status]);\n\n useEffect(\n () => () => {\n generationRef.current += 1;\n controllerRef.current?.abort();\n const recorder = recorderRef.current;\n clearRuntime();\n if (recorder && recorder.state !== \"inactive\") recorder.stop();\n },\n [clearRuntime],\n );\n\n return {\n status,\n error,\n available: Boolean(capability?.available && enabled && !disabled),\n stream,\n start,\n stop,\n cancel,\n };\n}\n\nfunction chooseMimeType(accepted: string[]): string | undefined {\n const normalized = accepted.map((value) => value.trim().toLowerCase());\n return MIME_PREFERENCES.find((mimeType) => {\n const bare = mimeType.split(\";\")[0] ?? mimeType;\n const allowed =\n normalized.includes(mimeType) ||\n normalized.includes(bare) ||\n normalized.some((candidate) => candidate.split(\";\")[0] === bare);\n return (\n allowed &&\n (typeof MediaRecorder.isTypeSupported !== \"function\" ||\n MediaRecorder.isTypeSupported(mimeType))\n );\n });\n}\n\nfunction errorCode(error: unknown): string {\n if (error && typeof error === \"object\" && \"code\" in error && typeof error.code === \"string\") {\n return error.code;\n }\n if (error instanceof DOMException && error.name === \"NotAllowedError\") return \"permission_denied\";\n if (error instanceof DOMException && error.name === \"NotSupportedError\") return \"not_supported\";\n return \"unknown\";\n}\n","/**\n * Document event hosts dispatch to open the workstream Pause/Resume surface.\n * Kept in a leaf module so session chrome can import the name without pulling\n * the ChatComposer / Radix tooltip graph into the app shell.\n */\nexport const OPEN_WORKSTREAM_CONTROL_EVENT = \"opengeni:open-workstream-control\";\n","import type { Permission } from \"@opengeni/sdk\";\nimport type { CommandContext, SlashArg, SlashCommand } from \"./types\";\n\n/**\n * Parse a composer value into a command name + the rest. A command is\n * recognized ONLY when the value's first character is \"/\" (the start token);\n * anything else is plain chat and returns null.\n *\n * \"/cl\" -> { name: \"cl\", rest: \"\", hasTrailingSpace: false }\n * \"/goal \" -> { name: \"goal\", rest: \"\", hasTrailingSpace: true }\n * \"/goal pause\"-> { name: \"goal\", rest: \"pause\", hasTrailingSpace: false }\n */\nexport type ParsedCommandLine = {\n name: string;\n rest: string;\n /** True when the name token is closed by a space — arg-hint mode. */\n hasTrailingSpace: boolean;\n args: string[];\n};\n\nexport function parseCommandLine(value: string): ParsedCommandLine | null {\n if (value[0] !== \"/\") {\n return null;\n }\n const body = value.slice(1);\n const firstSpace = body.indexOf(\" \");\n if (firstSpace === -1) {\n return { name: body, rest: \"\", hasTrailingSpace: false, args: [] };\n }\n const name = body.slice(0, firstSpace);\n const rest = body.slice(firstSpace + 1);\n return {\n name,\n rest,\n hasTrailingSpace: true,\n args: rest.split(/\\s+/).filter((token) => token.length > 0),\n };\n}\n\nconst PERMISSION_SUPERUSER: Permission = \"workspace:admin\";\n\n/** Whether the operator's permission set satisfies a command's gate. */\nexport function hasPermission(\n required: Permission | undefined,\n permissions: Permission[],\n): boolean {\n if (!required) {\n return true;\n }\n return permissions.includes(required) || permissions.includes(PERMISSION_SUPERUSER);\n}\n\n/** Match a command (by name or alias) against the value. */\nexport function matchCommand(\n commands: readonly SlashCommand[],\n value: string,\n): SlashCommand | null {\n const parsed = parseCommandLine(value);\n if (!parsed) {\n return null;\n }\n const token = parsed.name.toLowerCase();\n return (\n commands.find((command) => command.name === token || command.aliases?.includes(token)) ?? null\n );\n}\n\ntype FilterCtx = Pick<CommandContext, \"sessionId\" | \"status\" | \"permissions\">;\n\n/**\n * The commands visible for the current token + context. Permission-absent and\n * `available()===false` commands are dropped entirely (a gated command is never\n * shown, not shown-disabled). Filtering is a prefix match on name/alias.\n */\nexport function filterCommands(\n commands: readonly SlashCommand[],\n token: string,\n ctx: FilterCtx,\n): SlashCommand[] {\n const needle = token.toLowerCase();\n return commands.filter((command) => {\n if (!hasPermission(command.permission, ctx.permissions)) {\n return false;\n }\n if (command.available && !command.available(ctx)) {\n return false;\n }\n if (needle.length === 0) {\n return true;\n }\n return (\n command.name.startsWith(needle) ||\n (command.aliases?.some((alias) => alias.startsWith(needle)) ?? false)\n );\n });\n}\n\n/** Render a command's arg hint for the palette footer / help, e.g. \"<pause|resume>\". */\nexport function argHint(args: readonly SlashArg[] | undefined): string {\n if (!args || args.length === 0) {\n return \"\";\n }\n return args\n .map((arg) => {\n const label = arg.oneOf ? arg.oneOf.join(\"|\") : arg.name;\n return arg.required ? `<${label}>` : `[${label}]`;\n })\n .join(\" \");\n}\n\n/** The first required arg that has not yet been supplied, if any. */\nexport function firstMissingRequiredArg(command: SlashCommand, args: string[]): SlashArg | null {\n const required = (command.args ?? []).filter((arg) => arg.required);\n for (let i = 0; i < required.length; i += 1) {\n const value = args[i];\n if (value === undefined || value.length === 0) {\n return required[i] ?? null;\n }\n }\n return null;\n}\n\nfunction requireSession(ctx: CommandContext): string {\n if (!ctx.sessionId) {\n throw new Error(\"No active session yet — start a session first.\");\n }\n return ctx.sessionId;\n}\n\nconst hasSession = (ctx: FilterCtx): boolean => ctx.sessionId !== null;\n\n/**\n * The default command set. Adding a command is one object literal here; the\n * palette list, filter, arg-hint footer, and /help all render from this array.\n * Apps concat their own commands via the ChatComposer `commands` prop.\n */\nexport const defaultCommands: readonly SlashCommand[] = [\n {\n name: \"help\",\n aliases: [\"?\"],\n description: \"Show available commands.\",\n run: (_args, ctx) => {\n ctx.openHelp();\n return { status: \"ok\" };\n },\n },\n {\n name: \"clear-view\",\n description: \"Clear the local timeline view (this device only; no server change).\",\n run: (_args, ctx) => {\n // clearView() reports whether the host actually wired a view-reset. If it\n // didn't (the console surface has no resettable local timeline), reporting\n // \"Local view cleared.\" would be a false success — return an honest error\n // instead so the operator isn't told something happened when nothing did.\n const cleared = ctx.clearView();\n if (!cleared) {\n return {\n status: \"error\",\n message: \"This view can't be cleared here (no local timeline to reset).\",\n };\n }\n return { status: \"ok\", message: \"Local view cleared.\" };\n },\n },\n {\n name: \"goal\",\n description: \"Pause or resume the session's goal loop.\",\n permission: \"sessions:control\",\n available: hasSession,\n args: [\n { name: \"action\", required: true, oneOf: [\"pause\", \"resume\"], description: \"pause | resume\" },\n ],\n run: async (args, ctx) => {\n const sessionId = requireSession(ctx);\n const action = args[0];\n if (action !== \"pause\" && action !== \"resume\") {\n return { status: \"error\", message: \"Usage: /goal pause | /goal resume\" };\n }\n try {\n await ctx.client.updateGoal(ctx.workspaceId, sessionId, {\n status: action === \"pause\" ? \"paused\" : \"active\",\n });\n return { status: \"ok\", message: action === \"pause\" ? \"Goal paused.\" : \"Goal resumed.\" };\n } catch (cause) {\n return { status: \"error\", message: goalErrorMessage(cause, action) };\n }\n },\n },\n {\n name: \"compact\",\n description: \"Compact the conversation context now.\",\n permission: \"sessions:control\",\n available: hasSession,\n run: async (_args, ctx) => {\n const sessionId = requireSession(ctx);\n try {\n const result = await ctx.client.compactSessionContext(ctx.workspaceId, sessionId);\n return { status: \"ok\", message: result.message };\n } catch (cause) {\n return { status: \"error\", message: errorMessage(cause) ?? \"Could not compact context.\" };\n }\n },\n },\n {\n name: \"clear\",\n description: \"Clear the conversation context (destructive; audit-preserved).\",\n permission: \"sessions:control\",\n danger: true,\n available: hasSession,\n run: async (_args, ctx) => {\n const sessionId = requireSession(ctx);\n const confirmed = await ctx.confirm();\n if (!confirmed) {\n // Canceled: no error, but keep the \"/clear\" draft so the operator who\n // backed out doesn't silently lose what they typed.\n return { status: \"ok\", keepDraft: true };\n }\n try {\n await ctx.client.clearSessionContext(ctx.workspaceId, sessionId);\n return { status: \"ok\", message: \"Context cleared.\" };\n } catch (cause) {\n return { status: \"error\", message: clearErrorMessage(cause) };\n }\n },\n },\n];\n\nfunction errorMessage(cause: unknown): string | undefined {\n if (\n cause &&\n typeof cause === \"object\" &&\n \"message\" in cause &&\n typeof (cause as { message?: unknown }).message === \"string\"\n ) {\n return (cause as { message: string }).message;\n }\n return undefined;\n}\n\nfunction statusCode(cause: unknown): number | undefined {\n if (\n cause &&\n typeof cause === \"object\" &&\n \"status\" in cause &&\n typeof (cause as { status?: unknown }).status === \"number\"\n ) {\n return (cause as { status: number }).status;\n }\n return undefined;\n}\n\nfunction goalErrorMessage(cause: unknown, action: \"pause\" | \"resume\"): string {\n const code = statusCode(cause);\n if (code === 404) {\n return \"This session has no goal to control.\";\n }\n if (code === 409) {\n return action === \"resume\"\n ? \"Only a paused goal can be resumed.\"\n : \"Goal is already in a terminal state.\";\n }\n return errorMessage(cause) ?? `Could not ${action} the goal.`;\n}\n\nfunction clearErrorMessage(cause: unknown): string {\n if (statusCode(cause) === 409) {\n return \"Pause the session and wait for the current inference to settle, then clear context.\";\n }\n return errorMessage(cause) ?? \"Could not clear context.\";\n}\n","import type { KeyboardEvent } from \"react\";\nimport { useCallback, useMemo, useRef, useState } from \"react\";\nimport {\n argHint,\n filterCommands,\n firstMissingRequiredArg,\n matchCommand,\n parseCommandLine,\n} from \"../commands/registry\";\nimport type { CommandContext, SlashCommand } from \"../commands/types\";\n\n/**\n * Context the composer supplies for command execution and visibility. The\n * composer owns the UI affordances (notice/openHelp/clearView/confirm), so they\n * are NOT part of this slice — the hook closes over them via `handlers`.\n */\nexport type SlashCommandContext = Pick<\n CommandContext,\n \"client\" | \"workspaceId\" | \"sessionId\" | \"status\" | \"permissions\"\n>;\n\n/**\n * UI affordances the composer supplies. `confirm` differs from the registry-\n * facing {@link CommandContext.confirm} (which takes no args): the composer's\n * confirm receives the command being run so the confirm bar renders from that\n * exact command's identity. The hook bridges the two in {@link buildContext}.\n */\nexport type SlashCommandHandlers = Pick<CommandContext, \"notice\" | \"openHelp\" | \"clearView\"> & {\n confirm: (command: SlashCommand) => Promise<boolean>;\n};\n\nexport type ConfirmState = {\n command: SlashCommand;\n /** Resolve the pending confirm() promise. */\n resolve: (confirmed: boolean) => void;\n} | null;\n\nexport type UseSlashCommandsOptions = {\n commands: readonly SlashCommand[];\n context: SlashCommandContext | undefined;\n handlers: SlashCommandHandlers;\n /** The current composer draft. */\n value: string;\n /** Replace the composer draft (autocomplete writes through this). */\n setValue: (value: string) => void;\n};\n\nexport type UseSlashCommandsResult = {\n /** Whether the palette is open (a command token is being typed). */\n open: boolean;\n /**\n * Whether the draft is a slash-command attempt (matches a registered command)\n * — true even after Escape dismisses the popover. The composer blocks its send\n * path while this holds so a command can't be delivered to the agent as chat.\n */\n isCommandDraft: boolean;\n /** Commands shown for the current token + context, in display order. */\n items: SlashCommand[];\n /** Index into `items` of the highlighted row. */\n highlight: number;\n setHighlight: (index: number) => void;\n /** The matched command once the name is closed by a space (arg-hint mode). */\n activeCommand: SlashCommand | null;\n /** The arg hint string for the active command (footer), or \"\". */\n activeArgHint: string;\n /**\n * Key handler for the textarea. Returns true when it consumed the event\n * (the composer must then NOT run its send path). Only consumes while open.\n */\n onKeyDown: (event: KeyboardEvent<HTMLTextAreaElement>) => boolean;\n /** Run the highlighted command (or the active command in arg-hint mode). */\n runHighlighted: () => Promise<void>;\n /**\n * Run the command at an explicitly chosen index (a pointer click on a row).\n * Bypasses the exact-match token heuristic that runHighlighted uses for\n * keyboard Enter, so an explicit click always runs the clicked command.\n */\n runAt: (index: number) => Promise<void>;\n /** Autocomplete the highlighted command name + a trailing space. */\n autocompleteHighlighted: () => void;\n};\n\nexport function useSlashCommands(options: UseSlashCommandsOptions): UseSlashCommandsResult {\n const { commands, context, handlers, value, setValue } = options;\n const [highlight, setHighlight] = useState(0);\n // Escape closes the palette but keeps the draft. We remember the dismissed\n // value; any further edit (value !== dismissed) re-opens the palette.\n const [dismissedValue, setDismissedValue] = useState<string | null>(null);\n const dismissed = dismissedValue !== null && dismissedValue === value;\n\n // Whether the operator has explicitly arrow-navigated the highlight for the\n // CURRENT draft. When they have, Enter is an explicit choice of the\n // highlighted row — the exact-match token override must NOT hijack it (else\n // ArrowDown to /clear-view + Enter would still fire the destructive /clear,\n // since \"clear\" exact-matches the token). Reset whenever the draft changes.\n const navigatedRef = useRef(false);\n const navTokenRef = useRef(value);\n if (navTokenRef.current !== value) {\n navTokenRef.current = value;\n navigatedRef.current = false;\n }\n\n const parsed = useMemo(() => parseCommandLine(value), [value]);\n const filterCtx = useMemo(\n () => ({\n sessionId: context?.sessionId ?? null,\n status: context?.status ?? null,\n permissions: context?.permissions ?? [],\n }),\n [context?.sessionId, context?.status, context?.permissions],\n );\n\n // In arg-hint mode (\"/name \"), the list collapses to the matched command so\n // the palette shows just its arg hint; while typing the name it filters.\n const activeCommand = useMemo(() => {\n if (!parsed || !parsed.hasTrailingSpace) {\n return null;\n }\n return matchCommand(commands, value);\n }, [commands, value, parsed]);\n\n const items = useMemo(() => {\n if (!parsed) {\n return [];\n }\n if (activeCommand) {\n return [activeCommand];\n }\n return filterCommands(commands, parsed.name, filterCtx);\n }, [commands, parsed, activeCommand, filterCtx]);\n\n const open = parsed !== null && items.length > 0 && !dismissed;\n\n // Whether the current draft is a slash-command ATTEMPT that should be run via\n // the palette, never delivered to the agent as plain chat. True even when the\n // palette is dismissed (Escape) — the draft still starts with \"/\" and matches\n // a command, so the composer must block its send path (button + Enter) to keep\n // commands from leaking into the conversation as messages the model reads.\n const isCommandDraft = parsed !== null && items.length > 0;\n\n // Keep highlight in range as items change.\n const clampedHighlight = items.length === 0 ? 0 : Math.min(highlight, items.length - 1);\n\n const activeArgHint = activeCommand ? argHint(activeCommand.args) : \"\";\n\n // Build the context for a SPECIFIC command. The danger confirm() is bound to\n // that command so the confirm bar names the command actually about to run —\n // not whatever near-match happens to sit highlighted in the palette (e.g.\n // typing \"/clear\"+Enter runs the destructive `clear`, but `clear-view` sorts\n // first and would otherwise mislabel the bar as a harmless local-view reset).\n const buildContext = useCallback(\n (command: SlashCommand): CommandContext | null => {\n if (!context) {\n return null;\n }\n return { ...context, ...handlers, confirm: () => handlers.confirm(command) };\n },\n [context, handlers],\n );\n\n const execute = useCallback(\n async (command: SlashCommand, args: string[]): Promise<void> => {\n const ctx = buildContext(command);\n if (!ctx) {\n return;\n }\n try {\n const result = await command.run(args, ctx);\n if (result.message) {\n ctx.notice({ tone: result.status === \"ok\" ? \"ok\" : \"error\", message: result.message });\n }\n if (result.status === \"ok\" && !result.keepDraft) {\n setValue(\"\");\n }\n } catch (cause) {\n ctx.notice({ tone: \"error\", message: errorMessage(cause) });\n }\n },\n [buildContext, setValue],\n );\n\n const autocomplete = useCallback(\n (command: SlashCommand) => {\n setValue(`/${command.name} `);\n setHighlight(0);\n },\n [setValue],\n );\n\n const autocompleteHighlighted = useCallback(() => {\n const command = items[clampedHighlight];\n if (command) {\n autocomplete(command);\n }\n }, [items, clampedHighlight, autocomplete]);\n\n // Pointer and keyboard activation share this synchronous fence. React state\n // cannot disable a command row before a second same-tick activation arrives.\n const runningRef = useRef(false);\n\n // Resolve a SPECIFIC, already-chosen command against the current draft, then\n // either autocomplete (name-only / required arg missing) or execute. This is\n // the shared core for both Enter (which first resolves WHICH command via the\n // exact-match heuristic) and a pointer click (which has ALREADY chosen the\n // command — the clicked row — and must not re-resolve to a near-match).\n const runResolved = useCallback(\n async (command: SlashCommand, executionOptions?: { explicit?: boolean }): Promise<void> => {\n if (!parsed || runningRef.current) {\n return;\n }\n runningRef.current = true;\n try {\n const explicit = executionOptions?.explicit ?? false;\n // Token-vs-command equality is case-insensitive (matching the registry's\n // matchCommand/filterCommands), so a fully-typed \"/Clear\" counts as having\n // named `clear` and runs rather than autocompleting.\n const nameMatchesToken =\n command.name === parsed.name.toLowerCase() ||\n (command.aliases?.includes(parsed.name.toLowerCase()) ?? false);\n // A name-only token whose name doesn't yet equal the resolved command (e.g.\n // \"/cl\" -> clear) first autocompletes so the operator sees the full name.\n // An EXPLICIT pointer click skips this: the operator already chose the row,\n // so clicking \"/clear-view\" (while the token is \"clear\") runs it outright\n // rather than merely filling the name and waiting for a second Enter.\n if (!explicit && !activeCommand && !nameMatchesToken && !parsed.hasTrailingSpace) {\n autocomplete(command);\n return;\n }\n // When the click resolves a different command than the typed token, the\n // typed token's tail isn't this command's args — run with no positional\n // args and let the required-arg guard below prompt for them via autocomplete.\n const args = nameMatchesToken || parsed.hasTrailingSpace ? parsed.args : [];\n const missing = firstMissingRequiredArg(command, args);\n if (missing) {\n // A required arg is absent: keep the palette open at the arg hint rather\n // than firing a half-formed command.\n if (!parsed.hasTrailingSpace) {\n autocomplete(command);\n }\n return;\n }\n await execute(command, args);\n } finally {\n runningRef.current = false;\n }\n },\n [parsed, activeCommand, autocomplete, execute],\n );\n\n const runHighlighted = useCallback(async (): Promise<void> => {\n if (!parsed) {\n return;\n }\n // If the operator has arrow-navigated, Enter is an explicit choice of the\n // highlighted row — run it directly, exactly like a click. This makes\n // /clear-view reachable via ArrowDown+Enter even when \"/clear\" is fully\n // typed (otherwise the exact-match override below would hijack it).\n if (navigatedRef.current && !activeCommand) {\n const highlighted = items[clampedHighlight];\n if (highlighted) {\n await runResolved(highlighted, { explicit: true });\n }\n return;\n }\n // Otherwise (no explicit navigation): when the typed token is an exact\n // command name (e.g. \"/clear\" while the longer \"/clear-view\" sits first in\n // the filtered list), Enter should run THAT command, not autocomplete the\n // highlighted near-match. Exact match wins over the highlight; otherwise use\n // the highlighted row. A pointer click goes through runAt, never here.\n // Compare case-insensitively, matching filterCommands/matchCommand, so a\n // fully-typed \"/Clear\" still resolves to the exact (destructive) clear\n // rather than the highlighted prefix near-match.\n const token = parsed.name.toLowerCase();\n const exact = items.find((item) => item.name === token || item.aliases?.includes(token));\n const command = activeCommand ?? exact ?? items[clampedHighlight];\n if (!command) {\n return;\n }\n await runResolved(command);\n }, [parsed, activeCommand, items, clampedHighlight, runResolved]);\n\n // Run the command at an EXPLICITLY chosen index (a pointer click on a palette\n // row). Unlike runHighlighted this does NOT apply the exact-match override:\n // clicking the harmless `/clear-view` row while the draft is \"/clear\" must run\n // clear-view, never the destructive `/clear` that exact-matches the token. The\n // operator's pointer is the selection; token-resolution heuristics don't apply.\n const runAt = useCallback(\n async (index: number): Promise<void> => {\n const command = items[index];\n if (!command) {\n return;\n }\n await runResolved(command, { explicit: true });\n },\n [items, runResolved],\n );\n\n const onKeyDown = useCallback(\n (event: KeyboardEvent<HTMLTextAreaElement>): boolean => {\n if (!open) {\n return false;\n }\n switch (event.key) {\n case \"ArrowDown\": {\n event.preventDefault();\n navigatedRef.current = true;\n setHighlight((current) =>\n items.length === 0 ? 0 : (Math.min(current, items.length - 1) + 1) % items.length,\n );\n return true;\n }\n case \"ArrowUp\": {\n event.preventDefault();\n navigatedRef.current = true;\n setHighlight((current) => {\n const base = Math.min(current, items.length - 1);\n return items.length === 0 ? 0 : (base - 1 + items.length) % items.length;\n });\n return true;\n }\n case \"Tab\": {\n event.preventDefault();\n autocompleteHighlighted();\n return true;\n }\n case \"Enter\": {\n if (event.shiftKey || event.nativeEvent?.isComposing) {\n return false;\n }\n event.preventDefault();\n void runHighlighted();\n return true;\n }\n case \"Escape\": {\n event.preventDefault();\n // Close the palette but keep the draft intact. Remember the dismissed\n // value; the next edit re-opens (value !== dismissedValue).\n setDismissedValue(value);\n return true;\n }\n default:\n return false;\n }\n },\n [open, items, autocompleteHighlighted, runHighlighted, value],\n );\n\n return {\n open,\n isCommandDraft,\n items,\n highlight: clampedHighlight,\n setHighlight,\n activeCommand,\n activeArgHint,\n onKeyDown,\n runHighlighted,\n runAt,\n autocompleteHighlighted,\n };\n}\n\nfunction errorMessage(cause: unknown): string {\n if (cause instanceof Error) {\n return cause.message;\n }\n return String(cause);\n}\n","import { AnimatePresence, motion } from \"motion/react\";\nimport { argHint } from \"../commands/registry\";\nimport type { SlashCommand } from \"../commands/types\";\nimport { cn } from \"../lib/cn\";\n\nexport type CommandPaletteProps = {\n open: boolean;\n items: SlashCommand[];\n highlight: number;\n /** Hover/click selects a row. */\n onHighlight: (index: number) => void;\n /** Click runs the row (same path as Enter). */\n onRun: (index: number) => void;\n /** Footer arg hint shown in arg-hint mode (e.g. \"<pause|resume>\"). */\n argHintText: string;\n /** id used for aria-activedescendant wiring from the textarea. */\n listboxId: string;\n /** Accessible list label. Defaults to \"Slash commands\". */\n label?: string | undefined;\n /** Badge shown for destructive commands. Defaults to \"danger\". */\n dangerLabel?: string | undefined;\n};\n\n/**\n * The slash-command palette: a popover anchored above the textarea, rendered\n * entirely from the filtered registry. Dark-first, Linear/Vercel-calm, using\n * the opengeni#46 design tokens. Full keyboard nav lives in useSlashCommands;\n * this component is presentational + aria.\n */\nexport function CommandPalette({\n open,\n items,\n highlight,\n onHighlight,\n onRun,\n argHintText,\n listboxId,\n label = \"Slash commands\",\n dangerLabel = \"danger\",\n}: CommandPaletteProps) {\n return (\n <AnimatePresence>\n {open ? (\n <motion.div\n initial={{ opacity: 0, y: 6, scale: 0.99 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: 6, scale: 0.99 }}\n transition={{ duration: 0.13, ease: \"easeOut\" }}\n className={cn(\n \"absolute bottom-full left-0 right-0 z-20 mb-2 overflow-hidden\",\n \"rounded-og-lg border border-og-border bg-og-surface-2 shadow-og-sm\",\n )}\n >\n <ul\n id={listboxId}\n role=\"listbox\"\n aria-label={label}\n className=\"max-h-72 overflow-y-auto py-1\"\n >\n {items.map((command, index) => {\n const selected = index === highlight;\n const hint = argHint(command.args);\n return (\n <li\n key={command.name}\n id={`${listboxId}-option-${index}`}\n role=\"option\"\n aria-selected={selected}\n onMouseEnter={() => onHighlight(index)}\n onMouseDown={(event) => {\n // Keep textarea focus; run on click.\n event.preventDefault();\n onRun(index);\n }}\n className={cn(\n \"mx-1 flex cursor-pointer items-center gap-2 rounded-og-md px-2.5 py-1.5\",\n \"transition-colors duration-100\",\n selected\n ? \"bg-og-accent/15 text-og-fg\"\n : \"text-og-fg-muted hover:bg-og-surface-3\",\n )}\n >\n <span className=\"flex min-w-0 items-baseline gap-1.5\">\n <span\n className={cn(\n \"font-mono text-[13px]\",\n selected ? \"text-og-accent\" : \"text-og-fg\",\n )}\n >\n /{command.name}\n </span>\n {hint ? (\n <span className=\"truncate font-mono text-[11px] text-og-fg-subtle\">\n {hint}\n </span>\n ) : null}\n </span>\n <span className=\"ml-auto flex items-center gap-1.5\">\n {command.danger ? (\n <span className=\"rounded-og-xs bg-og-status-failed/15 px-1 text-[10px] uppercase tracking-wide text-og-status-failed\">\n {dangerLabel}\n </span>\n ) : null}\n <span className=\"truncate text-[12px] text-og-fg-subtle max-sm:hidden\">\n {command.description}\n </span>\n </span>\n </li>\n );\n })}\n </ul>\n {argHintText ? (\n <div className=\"border-t border-og-border px-3 py-1.5 font-mono text-[11px] text-og-fg-subtle\">\n {argHintText}\n </div>\n ) : null}\n </motion.div>\n ) : null}\n </AnimatePresence>\n );\n}\n","import type { ClientModel } from \"@opengeni/sdk\";\nimport { ChevronDownIcon } from \"lucide-react\";\nimport { useId, useMemo } from \"react\";\nimport { groupPickerRowsByBillingClass, type PickerModelRow } from \"../model-policy\";\nimport { cn } from \"../lib/cn\";\n\nexport type ModelPickerProps = {\n /** Legacy host config models grouped by provider. */\n models?: ClientModel[] | undefined;\n /** Catalog-backed rows grouped by billing class. Preferred when available. */\n rows?: PickerModelRow[] | undefined;\n value?: string | undefined;\n onChange: (modelId: string) => void;\n disabled?: boolean | undefined;\n className?: string | undefined;\n label?: string | undefined;\n /**\n * When true (remote compaction v2), non-Codex models remain listed but are\n * disabled. Same picker chrome — only selectability changes.\n */\n codexOnly?: boolean | undefined;\n};\n\nconst EMPTY_CLIENT_MODELS: ClientModel[] = [];\n\nfunction isCodexClientModel(model: ClientModel): boolean {\n return model.id.startsWith(\"codex/\") || model.source === \"codex\";\n}\n\nfunction isCodexPickerRow(row: PickerModelRow): boolean {\n return row.id.startsWith(\"codex/\") || row.catalog.source === \"codex\";\n}\n\nfunction applyCodexOnlyRows(rows: PickerModelRow[], codexOnly: boolean): PickerModelRow[] {\n if (!codexOnly) return rows;\n return rows.map((row) => {\n if (isCodexPickerRow(row)) return row;\n return {\n ...row,\n selectable: false,\n unavailableReason: row.unavailableReason ?? \"Codex-only session\",\n };\n });\n}\n\nfunction providerGroups(models: ClientModel[], codexOnly: boolean) {\n const byProvider = new Map<\n string,\n { label: string; models: Array<ClientModel & { optionDisabled: boolean }> }\n >();\n for (const model of models) {\n let group = byProvider.get(model.provider);\n if (!group) {\n group = { label: model.providerLabel, models: [] };\n byProvider.set(model.provider, group);\n }\n group.models.push({\n ...model,\n optionDisabled: codexOnly && !isCodexClientModel(model),\n });\n }\n return [...byProvider.values()];\n}\n\nexport function ModelPicker({\n models = EMPTY_CLIENT_MODELS,\n rows,\n value,\n onChange,\n disabled,\n className,\n label = \"Model\",\n codexOnly = false,\n}: ModelPickerProps) {\n const selectId = useId();\n const effectiveRows = useMemo(\n () => (rows && rows.length > 0 ? applyCodexOnlyRows(rows, codexOnly) : []),\n [rows, codexOnly],\n );\n const billingGroups = useMemo(\n () => (effectiveRows.length > 0 ? groupPickerRowsByBillingClass(effectiveRows) : []),\n [effectiveRows],\n );\n const providerGroupList = useMemo(() => providerGroups(models, codexOnly), [models, codexOnly]);\n const useBillingGroups = Boolean(effectiveRows.length);\n\n if (models.length === 0 && effectiveRows.length === 0) {\n return null;\n }\n\n return (\n <span className={cn(\"relative inline-flex items-center\", className)}>\n <label htmlFor={selectId} className=\"sr-only\">\n {label}\n </label>\n <select\n id={selectId}\n value={value ?? \"\"}\n onChange={(event) => onChange(event.target.value)}\n disabled={disabled === true}\n aria-label={label}\n className={cn(\n \"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 {useBillingGroups\n ? billingGroups.map((group) => (\n <optgroup key={group.billingClass} label={group.label}>\n {group.rows.map((row) => (\n <option key={row.id} value={row.id} disabled={!row.selectable}>\n {row.unavailableReason ? `${row.label} (${row.unavailableReason})` : row.label}\n </option>\n ))}\n </optgroup>\n ))\n : providerGroupList.map((group) => (\n <optgroup key={group.label} label={group.label}>\n {group.models.map((model) => (\n <option key={model.id} value={model.id} disabled={model.optionDisabled}>\n {model.label}\n </option>\n ))}\n </optgroup>\n ))}\n </select>\n <ChevronDownIcon\n aria-hidden\n className=\"pointer-events-none absolute right-1.5 size-3.5 text-og-fg-subtle\"\n />\n </span>\n );\n}\n","import type { ClientModel, EffectiveSessionControl } from \"@opengeni/sdk\";\nimport {\n ArrowUpIcon,\n ChevronDownIcon,\n FileIcon,\n ImageIcon,\n LoaderCircleIcon,\n PaperclipIcon,\n PauseIcon,\n PlayIcon,\n RotateCwIcon,\n XIcon,\n} from \"lucide-react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport {\n cloneElement,\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type ButtonHTMLAttributes,\n type ChangeEvent,\n type ClipboardEvent,\n type ComponentPropsWithoutRef,\n type DragEvent,\n type KeyboardEvent,\n type ReactElement,\n type ReactNode,\n type Ref,\n type RefObject,\n} from \"react\";\nimport { argHint, defaultCommands } from \"../commands/registry\";\nimport type { Notice, SlashCommand } from \"../commands/types\";\nimport type { ComposerState } from \"../hooks/use-composer\";\nimport { shouldSteerOnKey, shouldSubmitOnKey } from \"../hooks/use-composer\";\nimport type { UseFileAttachmentsResult } from \"../hooks/use-file-attachments\";\nimport {\n useSlashCommands,\n type ConfirmState,\n type SlashCommandContext,\n} from \"../hooks/use-slash-commands\";\nimport { cn } from \"../lib/cn\";\nimport { composerSubmissionErrorMessage, formatBytes, formatRelativeTime } from \"../lib/format\";\nimport type { PickerModelRow } from \"../model-policy\";\nimport { OPEN_WORKSTREAM_CONTROL_EVENT } from \"../workstream-control-event\";\nimport { CommandPalette as CommandPaletteView } from \"./command-palette\";\nimport { ModelPicker as ModelPickerView } from \"./model-picker\";\nimport { TooltipProvider } from \"./tooltip\";\n\nexport { OPEN_WORKSTREAM_CONTROL_EVENT };\n\nfunction ComposerTip({\n tip,\n children,\n}: {\n tip: string;\n children: ReactElement<{ title?: string }>;\n}) {\n if (!tip) return children;\n return cloneElement(children, { title: tip });\n}\n\nexport type ComposerDelivery = Pick<\n ComposerState,\n \"value\" | \"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 // Kept for embedder message overrides / back-compat. Routine autosave is\n // silent — only draft conflicts surface under the composer.\n savingDraft: \"Saving draft…\",\n formatBytes,\n formatRelativeTime,\n};\n\nexport type ComposerSubmitMode = \"queue\" | \"steer\";\nexport type ComposerSubmitBlocker =\n | \"disabled\"\n | \"attachment\"\n | \"sending\"\n | \"command\"\n | \"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 * Autosize a composer textarea up to `maxPx` without the classic height→0\n * measure collapse (that flash expands the timeline flex sibling and yanks\n * tip-follow while a stream is pinned).\n */\nexport function applyComposerTextareaHeight(\n textarea: HTMLTextAreaElement,\n maxPx: number = 220,\n): void {\n // Grow path: content already overflows — raise height, no measure collapse.\n if (textarea.scrollHeight > textarea.clientHeight + 1) {\n textarea.style.height = `${Math.min(textarea.scrollHeight, maxPx)}px`;\n return;\n }\n // Shrink / steady: `auto` measures natural height without flashing empty.\n const before = textarea.offsetHeight;\n textarea.style.height = \"auto\";\n const nextPx = Math.min(textarea.scrollHeight, maxPx);\n if (Math.abs(nextPx - before) < 1) {\n textarea.style.height = `${before}px`;\n return;\n }\n textarea.style.height = `${nextPx}px`;\n}\n\n/**\n * Headless interaction layer for a chat composer. It is the single owner of\n * delivery guards, keyboard routing, command interception, drag/drop, focus,\n * confirmation, and feedback state used by both the preset and primitives.\n */\nexport function useChatComposerController({\n delivery,\n draft,\n control,\n effectiveControl,\n queuedAheadCount = 0,\n canControlWorkspace = false,\n controlLinks,\n disabled = false,\n attachments,\n commands = defaultCommands,\n commandContext,\n onClearView,\n onPaste,\n messages: messageOverrides,\n}: UseChatComposerControllerOptions) {\n const messages = useMemo(\n () => ({ ...defaultChatComposerMessages, ...messageOverrides }),\n [messageOverrides],\n );\n const id = useId();\n const rootRef = useRef<HTMLDivElement | null>(null);\n const textareaRef = useRef<HTMLTextAreaElement | null>(null);\n const pauseButtonRef = useRef<HTMLButtonElement | null>(null);\n const fileInputRef = useRef<HTMLInputElement | null>(null);\n const listboxId = useId();\n const paused = effectiveControl?.state === \"paused\";\n const [controlDetailsOpen, setControlDetailsOpen] = useState(false);\n const [paletteMounted, setPaletteMounted] = useState(false);\n const [submitting, setSubmitting] = useState(false);\n const submittingRef = useRef(false);\n const controlOperationRef = useRef(false);\n const 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 blockedByAttachment = attachments?.hasUnresolved === true;\n const hasReadyAttachment = (attachments?.readyResources.length ?? 0) > 0;\n\n const [dragging, setDragging] = useState(false);\n const dragCarriesFiles = (event: { dataTransfer: DataTransfer | null }): boolean =>\n event.dataTransfer !== null && [...event.dataTransfer.types].includes(\"Files\");\n const handleDragOver = useCallback(\n (event: DragEvent<HTMLDivElement>) => {\n if (!attachments || !dragCarriesFiles(event)) return;\n event.preventDefault();\n setDragging(true);\n },\n [attachments],\n );\n const handleDragLeave = useCallback(\n (event: DragEvent<HTMLDivElement>) => {\n if (!attachments) return;\n if (event.currentTarget.contains(event.relatedTarget as Node | null)) return;\n setDragging(false);\n },\n [attachments],\n );\n const handleDrop = useCallback(\n (event: DragEvent<HTMLDivElement>) => {\n if (!attachments || !dragCarriesFiles(event)) return;\n event.preventDefault();\n setDragging(false);\n if (event.dataTransfer.files.length > 0) attachments.addFiles(event.dataTransfer.files);\n },\n [attachments],\n );\n\n const [notice, setNotice] = useState<Notice | null>(null);\n const [helpOpen, setHelpOpen] = useState(false);\n const [confirmState, setConfirmState] = useState<ConfirmState>(null);\n const pendingConfirm = useRef<((confirmed: boolean) => void) | null>(null);\n\n const settleConfirmation = useCallback((confirmed: boolean) => {\n const resolve = pendingConfirm.current;\n pendingConfirm.current = null;\n setConfirmState(null);\n resolve?.(confirmed);\n }, []);\n\n useEffect(\n () => () => {\n pendingConfirm.current?.(false);\n pendingConfirm.current = null;\n },\n [],\n );\n\n // Autosize without collapsing the composer to 0 on every keystroke. The old\n // height→0→content pattern briefly expanded the timeline scroller and yanked\n // tip-follow while streams were live (pin/unpin flicker when typing fast).\n const resizeInputRafRef = useRef<number | null>(null);\n const resizeInput = useCallback(() => {\n if (resizeInputRafRef.current !== null) {\n return;\n }\n resizeInputRafRef.current = requestAnimationFrame(() => {\n resizeInputRafRef.current = null;\n const textarea = textareaRef.current;\n if (!textarea) {\n return;\n }\n applyComposerTextareaHeight(textarea, 220);\n });\n }, []);\n useEffect(() => resizeInput(), [delivery.value, resizeInput]);\n useEffect(\n () => () => {\n if (resizeInputRafRef.current !== null) {\n cancelAnimationFrame(resizeInputRafRef.current);\n resizeInputRafRef.current = null;\n }\n },\n [],\n );\n\n const handlers = useMemo(\n () => ({\n notice: (next: Notice) => {\n setNotice(next);\n delivery.clearError();\n },\n openHelp: () => setHelpOpen(true),\n clearView: () => {\n if (!onClearView) return false;\n onClearView();\n return true;\n },\n confirm: (command: SlashCommand) =>\n new Promise<boolean>((resolve) => {\n pendingConfirm.current?.(false);\n pendingConfirm.current = resolve;\n setConfirmState({ command, resolve: settleConfirmation });\n }),\n }),\n [delivery, onClearView, settleConfirmation],\n );\n\n const palette = useSlashCommands({\n commands,\n context: commandContext,\n handlers,\n value: 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 : blockedByAttachment\n ? \"attachment\"\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 || blockedByAttachment || delivery.sending || submittingRef.current)\n 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 blockedByAttachment,\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 : composerSubmissionErrorMessage(delivery.error) || messages.sendFailedError,\n }\n : null);\n useEffect(() => {\n if (notice?.tone !== \"ok\") return;\n const timer = window.setTimeout(\n () => setNotice((current) => (current === notice ? null : current)),\n 2400,\n );\n return () => window.clearTimeout(timer);\n }, [notice]);\n\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 // Provider stays on Root so optional Radix tip surfaces (voice input) work.\n // Ordinary composer actions use native `title` via ComposerTip to avoid\n // pulling Popper into every tip hotspot.\n return (\n <ComposerContext.Provider value={controller}>\n <TooltipProvider delayDuration={300}>\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 </TooltipProvider>\n </ComposerContext.Provider>\n );\n});\n\nexport type ComposerFrameProps = ComponentPropsWithoutRef<\"div\">;\n\nexport const Frame = forwardRef<HTMLDivElement, ComposerFrameProps>(function ComposerFrame(\n { className, ...props },\n ref,\n) {\n return <div {...props} ref={ref} className={cn(\"relative\", className)} />;\n});\n\nexport type ComposerCommandPaletteProps = { className?: string | undefined };\n\nexport function CommandPalette({ className }: ComposerCommandPaletteProps) {\n const controller = useComposerController();\n const setPaletteMounted = controller.setPaletteMounted;\n useEffect(() => {\n setPaletteMounted(true);\n return () => setPaletteMounted(false);\n }, [setPaletteMounted]);\n if (!controller.paletteEnabled) return null;\n return (\n <div className={className}>\n <CommandPaletteView\n open={controller.palette.open && controller.confirmState === null}\n items={controller.palette.items}\n highlight={controller.palette.highlight}\n onHighlight={controller.palette.setHighlight}\n onRun={(index) => {\n controller.palette.setHighlight(index);\n void controller.palette.runAt(index);\n }}\n argHintText={controller.palette.activeArgHint}\n listboxId={controller.listboxId}\n label={controller.messages.slashCommandsLabel}\n dangerLabel={controller.messages.danger}\n />\n </div>\n );\n}\n\ntype OwnedSurfaceProps = \"onDragOver\" | \"onDragLeave\" | \"onDrop\";\nexport type ComposerSurfaceProps = Omit<ComponentPropsWithoutRef<\"div\">, OwnedSurfaceProps>;\n\nexport const Surface = forwardRef<HTMLDivElement, ComposerSurfaceProps>(function ComposerSurface(\n { className, children, ...props },\n ref,\n) {\n const controller = useComposerController();\n return (\n <div\n {...props}\n ref={ref}\n onDragOver={controller.attachments ? controller.handleDragOver : undefined}\n onDragLeave={controller.attachments ? controller.handleDragLeave : undefined}\n onDrop={controller.attachments ? controller.handleDrop : undefined}\n className={cn(\n \"relative rounded-og-lg border border-og-border/90 bg-og-surface-1 shadow-og-sm\",\n \"transition-[border-color,box-shadow] duration-200 ease-og-out\",\n \"focus-within:border-og-accent/50 focus-within:shadow-og-glow\",\n controller.dragging && \"border-dashed border-og-accent\",\n className,\n )}\n >\n {controller.dragging ? (\n <div\n aria-hidden\n className={cn(\n \"pointer-events-none absolute inset-0 z-10 flex items-center justify-center\",\n \"rounded-og-lg bg-og-surface-1/85 text-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, autoFocus = false, ...props },\n forwardedRef,\n) {\n const controller = useComposerController();\n const autoFocusedRef = useRef(false);\n const paletteOpen =\n controller.paletteEnabled && controller.paletteMounted && controller.palette.open;\n\n // Native autoFocus loses when the textarea mounts disabled (create-session draft\n // hydrate). Retry once the controller becomes interactive.\n useEffect(() => {\n if (!autoFocus || controller.disabled || autoFocusedRef.current) return;\n const frame = window.requestAnimationFrame(() => {\n const textarea = controller.textareaRef.current;\n if (!textarea || textarea.disabled) return;\n autoFocusedRef.current = true;\n textarea.focus();\n });\n return () => window.cancelAnimationFrame(frame);\n }, [autoFocus, controller.disabled, controller.textareaRef]);\n\n return (\n <textarea\n {...props}\n ref={mergeRefs(controller.textareaRef, forwardedRef)}\n rows={rows}\n value={controller.value}\n onChange={(event) => controller.setValue(event.target.value)}\n onKeyDown={controller.handleKeyDown}\n onPaste={controller.handlePaste}\n placeholder={\n controller.paused && !controller.disabled\n ? controller.messages.pausedPlaceholder\n : (placeholder ?? controller.messages.messagePlaceholder)\n }\n disabled={controller.disabled}\n autoFocus={autoFocus && !controller.disabled}\n aria-label={ariaLabel ?? controller.messages.inputLabel}\n aria-keyshortcuts=\"Enter Meta+Enter Control+Enter Shift+Enter\"\n aria-autocomplete={\n controller.paletteEnabled && controller.paletteMounted ? \"list\" : undefined\n }\n aria-controls={paletteOpen ? controller.listboxId : undefined}\n aria-activedescendant={\n paletteOpen ? `${controller.listboxId}-option-${controller.palette.highlight}` : undefined\n }\n className={cn(\n \"block w-full resize-none bg-transparent px-3.5 pt-3 pb-1 text-base leading-6 md:px-4 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(\n \"flex items-end gap-1.5 px-2 pb-2 pt-0.5 sm:px-2.5 sm:pb-2.5\",\n \"max-sm:items-center max-sm:gap-1\",\n className,\n )}\n />\n );\n});\n\nexport type ComposerControlsProps = ComponentPropsWithoutRef<\"span\">;\n\nexport const Controls = forwardRef<HTMLSpanElement, ComposerControlsProps>(\n function ComposerControls({ className, ...props }, ref) {\n return (\n <span\n {...props}\n ref={ref}\n className={cn(\n \"flex min-w-0 flex-1 flex-wrap items-center gap-1.5\",\n \"max-sm:flex-nowrap max-sm:gap-1\",\n className,\n )}\n />\n );\n },\n);\n\nexport type ComposerHintProps = ComponentPropsWithoutRef<\"span\">;\n\nexport const Hint = forwardRef<HTMLSpanElement, ComposerHintProps>(function ComposerHint(\n { className, children, ...props },\n ref,\n) {\n const controller = useComposerController();\n return (\n <span\n {...props}\n ref={ref}\n className={cn(\"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 const tip = title ?? controller.messages.attachFiles;\n return (\n <>\n <input\n ref={controller.fileInputRef}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n data-og-composer-attach\n className=\"hidden\"\n onChange={controller.handleFileChange}\n />\n <ComposerTip tip={tip}>\n <button\n {...props}\n ref={ref}\n type=\"button\"\n disabled={controller.disabled}\n onClick={() => controller.fileInputRef.current?.click()}\n aria-label={ariaLabel ?? tip}\n className={cn(\n \"inline-flex size-8 items-center justify-center rounded-og-md\",\n \"text-og-fg-muted transition-colors duration-150 hover:bg-og-surface-2 hover:text-og-fg\",\n \"disabled:cursor-not-allowed disabled:opacity-50 pointer-coarse:size-9\",\n className,\n )}\n >\n {children ?? <PaperclipIcon className=\"size-4\" />}\n </button>\n </ComposerTip>\n </>\n );\n },\n);\n\nexport type ComposerModelPickerProps = {\n models?: ClientModel[] | undefined;\n /** Catalog-backed rows preferred over legacy provider-grouped models. */\n rows?: PickerModelRow[] | undefined;\n value?: string | undefined;\n onChange?: ((modelId: string) => void) | undefined;\n label?: string | undefined;\n className?: string | undefined;\n /** Filter to Codex models for remote_v2-locked sessions. */\n codexOnly?: boolean | undefined;\n};\n\nexport function ModelPicker({\n models,\n rows,\n value,\n onChange,\n label,\n className,\n codexOnly,\n}: ComposerModelPickerProps) {\n const controller = useComposerController();\n return (\n <ModelPickerView\n models={models}\n rows={rows}\n value={value}\n onChange={(modelId) => onChange?.(modelId)}\n disabled={controller.disabled}\n label={label ?? controller.messages.modelLabel}\n className={className}\n codexOnly={codexOnly}\n />\n );\n}\n\nexport type ComposerPauseButtonProps = Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n OwnedButtonProps\n>;\n\nexport const PauseButton = forwardRef<HTMLButtonElement, ComposerPauseButtonProps>(\n function ComposerPauseButton(\n { className, \"aria-label\": ariaLabel, title, children, ...props },\n ref,\n ) {\n const controller = useComposerController();\n if (!controller.effectiveControl || controller.paused || !controller.hasControl) return null;\n const busy = controller.pausing || controller.resuming;\n const tip = title ?? controller.messages.pauseTitle;\n return (\n <ComposerTip tip={tip}>\n <button\n {...props}\n ref={mergeRefs(controller.pauseButtonRef, ref)}\n type=\"button\"\n onClick={() => void controller.pause()}\n disabled={busy}\n aria-label={ariaLabel ?? controller.messages.pauseAriaLabel}\n className={cn(\n \"inline-flex size-8 items-center justify-center rounded-og-md border border-og-border pointer-coarse:size-9\",\n \"bg-og-surface-2 text-og-fg-muted transition-colors duration-150\",\n \"hover:border-og-status-waiting/50 hover:text-og-status-waiting\",\n \"disabled:opacity-50\",\n className,\n )}\n >\n {children ??\n (busy ? (\n <LoaderCircleIcon className=\"size-3.5 animate-og-spin\" />\n ) : (\n <PauseIcon className=\"size-3.5 fill-current\" />\n ))}\n </button>\n </ComposerTip>\n );\n },\n);\n\nexport type ComposerSendButtonProps = Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n OwnedButtonProps\n>;\n\nexport const SendButton = forwardRef<HTMLButtonElement, ComposerSendButtonProps>(\n function ComposerSendButton(\n { className, \"aria-label\": ariaLabel, title, children, ...props },\n ref,\n ) {\n const controller = useComposerController();\n const tip =\n title ??\n (controller.paused ? controller.messages.sendAndResumeTitle : controller.messages.sendTitle);\n return (\n <ComposerTip tip={tip}>\n <button\n {...props}\n ref={ref}\n type=\"button\"\n onClick={() => void controller.submit(\"queue\")}\n disabled={!controller.canSubmit}\n data-og-tip={tip}\n aria-label={\n ariaLabel ??\n (controller.paused\n ? controller.messages.sendAndResumeAriaLabel\n : controller.messages.sendMessageAriaLabel)\n }\n className={cn(\n \"inline-flex size-8 items-center justify-center rounded-og-md pointer-coarse:size-9\",\n \"bg-og-accent text-og-accent-fg shadow-og-sm\",\n \"transition-[background-color,transform,opacity] duration-150 ease-og-spring\",\n \"hover:bg-og-accent-strong active:scale-95\",\n \"disabled:cursor-not-allowed disabled:bg-og-surface-3 disabled:text-og-fg-subtle disabled:shadow-none\",\n className,\n )}\n >\n {children ??\n (controller.sending ? (\n <LoaderCircleIcon className=\"size-4 animate-og-spin\" />\n ) : (\n <ArrowUpIcon className=\"size-4\" />\n ))}\n </button>\n </ComposerTip>\n );\n },\n);\n\nexport function Help() {\n const controller = useComposerController();\n return (\n <AnimatePresence>\n {controller.helpOpen ? (\n <HelpPanel\n commands={controller.helpCommands}\n messages={controller.messages}\n onClose={() => controller.setHelpOpen(false)}\n />\n ) : null}\n </AnimatePresence>\n );\n}\n\nexport function Status() {\n const controller = useComposerController();\n return (\n <>\n <AnimatePresence>\n {controller.activeNotice ? (\n <motion.p\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: \"auto\" }}\n exit={{ opacity: 0, height: 0 }}\n className={cn(\n \"overflow-hidden px-1 pt-1.5 text-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 ) : null}\n </>\n );\n}\n\nfunction ComposerAnnouncements() {\n const controller = useComposerController();\n return (\n <div className=\"sr-only\">\n {controller.activeNotice ? (\n <p role={controller.activeNotice.tone === \"error\" ? \"alert\" : \"status\"}>\n {controller.activeNotice.message}\n </p>\n ) : null}\n {controller.draftConflict ? <p role=\"alert\">{controller.messages.draftConflict}</p> : null}\n </div>\n );\n}\n\nfunction mergeRefs<T>(...refs: Array<Ref<T> | undefined>): (node: T | null) => void {\n return (node) => {\n for (const ref of refs) {\n if (typeof ref === \"function\") ref(node);\n else if (ref) ref.current = node;\n }\n };\n}\n\nfunction WorkstreamPausedStrip({\n control,\n queuedAheadCount,\n open,\n busy,\n sending,\n canControlWorkspace,\n controlLinks,\n messages,\n onOpenChange,\n onResume,\n onResumeOption,\n}: {\n control: EffectiveSessionControl;\n queuedAheadCount: number;\n open: boolean;\n busy: boolean;\n sending: boolean;\n canControlWorkspace: boolean;\n controlLinks: ComposerControlLinks | undefined;\n messages: ChatComposerMessages;\n onOpenChange: (open: boolean) => void;\n onResume: () => void;\n onResumeOption: (option: EffectiveSessionControl[\"resumeOptions\"][number]) => void;\n}) {\n const blocker = control.primaryBlocker;\n const cause =\n blocker?.kind === \"workspace\"\n ? messages.workspacePaused\n : control.directState === \"paused\"\n ? messages.pausedHere\n : messages.pausedBy(blocker?.displayName ?? messages.parentBlocker);\n const primary = control.resumeOptions.find((option) => option.scope === \"selected\");\n const broaderOptions = control.resumeOptions.filter(\n (option) =>\n option !== primary &&\n option.scope !== \"selected\" &&\n (option.scope !== \"workspace\" || canControlWorkspace),\n );\n return (\n <div className=\"border-b border-og-status-waiting/25 bg-og-status-waiting/[0.07]\">\n <div className=\"flex min-w-0 items-center gap-2 px-3 py-2\">\n <PauseIcon className=\"size-3.5 shrink-0 text-og-status-waiting\" />\n <button\n type=\"button\"\n className=\"min-w-0 flex-1 text-left\"\n onClick={() => onOpenChange(!open)}\n aria-expanded={open}\n >\n <span className=\"block truncate text-og-xs font-medium text-og-fg\">{cause}</span>\n <span className=\"block truncate text-[11px] text-og-fg-muted\">\n {queuedAheadCount > 0\n ? messages.queuedAhead(queuedAheadCount)\n : sending\n ? messages.resumingAndSending\n : messages.nextMessageResumes}\n </span>\n </button>\n <button\n type=\"button\"\n aria-label={messages.resumeThisWorkstream}\n className=\"inline-flex min-h-8 shrink-0 items-center gap-1.5 rounded-og-md border border-og-status-waiting/35 bg-og-surface-1 px-2.5 text-og-xs font-medium text-og-fg hover:bg-og-surface-2 pointer-coarse:min-h-11\"\n disabled={busy}\n onClick={onResume}\n >\n {busy ? (\n <LoaderCircleIcon className=\"size-3.5 animate-og-spin\" />\n ) : (\n <PlayIcon className=\"size-3.5 fill-current\" />\n )}\n <span className=\"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 <ComposerTip\n key={`${option.scope}-${option.targetId ?? \"selected\"}`}\n tip={option.impactCopy}\n >\n <button\n type=\"button\"\n disabled={busy}\n onClick={() => onResumeOption(option)}\n className=\"rounded-og-md border border-og-border bg-og-surface-1 px-2 py-1 text-og-xs text-og-fg-muted hover:bg-og-surface-2 hover:text-og-fg pointer-coarse:min-h-10\"\n >\n <span className=\"block font-medium\">\n {option.scope === \"workspace\"\n ? messages.resumeWorkspace\n : messages.resumeFromSession}\n </span>\n <span className=\"block text-[10px] text-og-fg-subtle\">\n {option.selectedStateAfter === \"active\"\n ? messages.sessionCanRun\n : messages.stillPausedBy(\n option.remainingPrimaryBlocker?.displayName ?? messages.narrowerPause,\n )}\n </span>\n </button>\n </ComposerTip>\n ))}\n </div>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction blockerHref(\n blocker: EffectiveSessionControl[\"blockers\"][number],\n links: ComposerControlLinks | undefined,\n): string | undefined {\n if (blocker.kind === \"workspace\") return links?.workspaceHref;\n return blocker.sessionId ? links?.sessionHref?.(blocker.sessionId) : undefined;\n}\n\nfunction RestoredResourceChips({\n resources,\n messages,\n onRemove,\n}: {\n resources: ComposerState[\"restoredResources\"];\n messages: ChatComposerMessages;\n onRemove: (index: number) => void;\n}) {\n return (\n <div\n className=\"flex flex-wrap gap-1.5 border-b border-og-border px-3 py-2\"\n aria-label={messages.restoredResourcesLabel}\n >\n {resources.map((resource, index) => (\n <span\n key={`${resource.kind}-${resource.kind === \"file\" ? resource.fileId : resource.uri}`}\n className=\"inline-flex min-w-0 max-w-full items-center gap-1.5 rounded-og-md border border-og-border bg-og-surface-2 px-2 py-1 text-og-xs text-og-fg-muted\"\n >\n <FileIcon className=\"size-3 shrink-0\" />\n <span className=\"truncate\">\n {resource.kind === \"file\" ? messages.restoredFile(resource.fileId) : resource.uri}\n </span>\n <button\n type=\"button\"\n className=\"shrink-0 hover:text-og-fg\"\n onClick={() => onRemove(index)}\n aria-label={messages.removeRestoredResource(index)}\n >\n <XIcon className=\"size-3\" />\n </button>\n </span>\n ))}\n </div>\n );\n}\n\nfunction ConfirmBar({\n command,\n messages,\n onCancel,\n onConfirm,\n returnFocusRef,\n}: {\n command: SlashCommand;\n messages: ChatComposerMessages;\n onCancel: () => void;\n onConfirm: () => void;\n returnFocusRef?: RefObject<HTMLTextAreaElement | null> | undefined;\n}) {\n const confirmRef = useRef<HTMLButtonElement | null>(null);\n const descriptionId = useId();\n useEffect(() => {\n const returnTo = returnFocusRef?.current ?? null;\n confirmRef.current?.focus();\n return () => returnTo?.focus();\n }, [returnFocusRef]);\n return (\n <div\n role=\"alertdialog\"\n aria-label={messages.confirmCommand(command.name)}\n aria-describedby={descriptionId}\n data-testid=\"danger-confirm\"\n onKeyDown={(event) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n event.stopPropagation();\n onCancel();\n }\n }}\n className=\"flex items-end justify-between gap-2 px-2.5 pb-2.5 pt-1\"\n >\n <span id={descriptionId} className=\"min-w-0 flex-1 px-1.5 text-og-sm text-og-status-failed\">\n {messages.confirmDescription(command)}\n </span>\n <span className=\"flex shrink-0 items-center gap-1.5\">\n <button\n type=\"button\"\n onClick={onCancel}\n className=\"rounded-og-md border border-og-border bg-og-surface-2 px-2.5 py-1 text-og-sm text-og-fg-muted hover:bg-og-surface-3 pointer-coarse:min-h-11\"\n >\n {messages.cancel}\n </button>\n <button\n ref={confirmRef}\n type=\"button\"\n onClick={onConfirm}\n className=\"rounded-og-md border border-og-status-failed/50 bg-og-status-failed/15 px-2.5 py-1 text-og-sm text-og-status-failed hover:bg-og-status-failed/25 pointer-coarse:min-h-11\"\n >\n {messages.runCommand(command.name)}\n </button>\n </span>\n </div>\n );\n}\n\nfunction AttachmentChips({\n attachments,\n messages,\n onRemove,\n onRetry,\n}: {\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 {failed ? (\n <ComposerTip tip={statusText}>\n <div className=\"truncate text-og-xs text-og-status-failed\">{statusText}</div>\n </ComposerTip>\n ) : (\n <div className=\"truncate text-og-xs text-og-fg-subtle\">{statusText}</div>\n )}\n </div>\n {attachment.status === \"uploading\" ? (\n <LoaderCircleIcon className=\"size-3.5 shrink-0 animate-og-spin\" />\n ) : null}\n {failed && onRetry ? (\n <ComposerTip tip={messages.retryUpload}>\n <button\n type=\"button\"\n onClick={() => onRetry(attachment.id)}\n className=\"shrink-0 rounded-og-xs p-1 text-og-fg-muted hover:bg-og-surface-1 hover:text-og-fg pointer-coarse:size-10\"\n aria-label={messages.retryAttachment(attachment.name)}\n >\n <RotateCwIcon className=\"size-3.5\" />\n </button>\n </ComposerTip>\n ) : null}\n <button\n type=\"button\"\n onClick={() => onRemove(attachment.id)}\n className=\"shrink-0 rounded-og-xs p-1 text-og-fg-muted hover:bg-og-surface-1 hover:text-og-fg pointer-coarse:size-10\"\n aria-label={messages.removeAttachment(attachment.name)}\n >\n <XIcon className=\"size-3.5\" />\n </button>\n </div>\n );\n })}\n </div>\n );\n}\n\nfunction HelpPanel({\n commands,\n messages,\n onClose,\n}: {\n commands: readonly SlashCommand[];\n messages: ChatComposerMessages;\n onClose: () => void;\n}) {\n return (\n <motion.div\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: \"auto\" }}\n exit={{ opacity: 0, height: 0 }}\n className=\"mt-2 overflow-hidden rounded-og-lg border border-og-border bg-og-surface-2\"\n >\n <div className=\"flex items-center justify-between border-b border-og-border px-3 py-1.5\">\n <span className=\"text-og-sm font-medium text-og-fg\">{messages.commands}</span>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"text-og-xs text-og-fg-subtle hover:text-og-fg\"\n >\n {messages.close}\n </button>\n </div>\n <ul className=\"py-1\">\n {commands.map((command) => {\n const hint = argHint(command.args);\n return (\n <li key={command.name} className=\"flex items-baseline gap-2 px-3 py-1\">\n <span className=\"font-mono text-og-sm text-og-accent\">\n /{command.name}\n {hint ? <span className=\"ml-1 text-og-fg-subtle\">{hint}</span> : null}\n </span>\n <span className=\"text-og-sm text-og-fg-muted\">{command.description}</span>\n {command.danger ? (\n <span className=\"ml-auto rounded-og-xs bg-og-status-failed/15 px-1 text-og-xs uppercase tracking-wide text-og-status-failed\">\n {messages.danger}\n </span>\n ) : null}\n </li>\n );\n })}\n </ul>\n </motion.div>\n );\n}\n","import type {\n ClientVoiceInputConfig,\n OpenGeniClient,\n TranscriptionAdapter,\n WorkspaceTranscriptionPolicy,\n} from \"@opengeni/sdk\";\nimport { LoaderCircleIcon, MicIcon, SquareIcon, XIcon } from \"lucide-react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { useEffect, useState, type MouseEvent, type ReactElement } from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { useVoiceInput } from \"../hooks/use-voice-input\";\nimport { useChatComposer } from \"./composer\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"./tooltip\";\n\nfunction Tip({ tip, children }: { tip: string; children: ReactElement }) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>{children}</TooltipTrigger>\n <TooltipContent side=\"top\">{tip}</TooltipContent>\n </Tooltip>\n );\n}\n\nexport type ComposerTranscriptionMessages = {\n start: string;\n stop: string;\n cancel: string;\n retry: string;\n requestingPermission: string;\n recording: string;\n transcribing: string;\n unavailableDisabled: string;\n unavailable: string;\n errorPermissionDenied: string;\n errorNotSupported: string;\n errorUnavailable: string;\n errorTooLarge: string;\n errorInvalidAudio: string;\n errorUnknown: string;\n};\n\nconst defaultMessages: ComposerTranscriptionMessages = {\n start: \"Start voice input\",\n stop: \"Stop and transcribe\",\n cancel: \"Cancel recording\",\n retry: \"Retry voice input\",\n requestingPermission: \"Requesting microphone…\",\n recording: \"Recording. Press Escape to cancel.\",\n transcribing: \"Transcribing…\",\n unavailableDisabled: \"Voice input is unavailable while the composer is disabled.\",\n unavailable: \"Voice input is unavailable for this workspace.\",\n errorPermissionDenied: \"Microphone permission was denied. Your draft was not changed.\",\n errorNotSupported: \"Voice input is not supported on this device.\",\n errorUnavailable: \"Voice input is not configured.\",\n errorTooLarge: \"Recording is too large. Try a shorter message.\",\n errorInvalidAudio: \"The recording could not be read. Try again.\",\n errorUnknown: \"Voice input could not start. Try again.\",\n};\n\nexport type ComposerTranscriptionControlProps = {\n client?: Pick<OpenGeniClient, \"transcribeAudio\"> | null | undefined;\n workspaceId?: string | undefined;\n capability?: ClientVoiceInputConfig | null | undefined;\n workspaceEnabled?: boolean | undefined;\n /** @deprecated Native MediaRecorder input no longer uses host adapters. */\n adapter?: TranscriptionAdapter | null | undefined;\n /** @deprecated Native MediaRecorder input no longer uses host policies. */\n policy?: WorkspaceTranscriptionPolicy | undefined;\n /** @deprecated Native input uses the server capability duration limit. */\n lifecycleTimeouts?: unknown;\n /** @deprecated Native input does not expose provider diagnostics. */\n onDiagnostic?: unknown;\n messages?: Partial<ComposerTranscriptionMessages> | undefined;\n className?: string | undefined;\n};\n\nconst WAVEFORM_BARS = 18;\nconst WAVEFORM_BAR_KEYS = Array.from(\n { length: WAVEFORM_BARS },\n (_, index) => `voice-waveform-bar-${index + 1}`,\n);\n\n/** One provider-neutral microphone control for the nearest editable composer. */\nexport function ComposerTranscriptionControl({\n client = null,\n workspaceId = \"\",\n capability = null,\n workspaceEnabled = false,\n messages: overrides,\n className,\n}: ComposerTranscriptionControlProps) {\n const composer = useChatComposer();\n const messages = { ...defaultMessages, ...overrides };\n const transcription = useVoiceInput({\n client,\n workspaceId,\n capability,\n enabled: workspaceEnabled,\n value: composer.value,\n setValue: composer.setValue,\n focusInput: composer.focusInput,\n disabled: composer.disabled,\n });\n const { status } = transcription;\n const active =\n status === \"requesting-permission\" || status === \"recording\" || status === \"transcribing\";\n const unavailableMessage = composer.disabled\n ? messages.unavailableDisabled\n : !capability?.available || !workspaceEnabled\n ? messages.unavailable\n : null;\n const idleLabel = unavailableMessage ?? (status === \"error\" ? messages.retry : messages.start);\n const errorMessage = transcription.error\n ? transcriptionErrorMessage(transcription.error, messages)\n : null;\n const announcement =\n status === \"requesting-permission\"\n ? messages.requestingPermission\n : status === \"recording\"\n ? messages.recording\n : status === \"transcribing\"\n ? messages.transcribing\n : status === \"error\"\n ? (errorMessage ?? messages.errorUnknown)\n : unavailableMessage;\n\n function start(event: MouseEvent<HTMLButtonElement>) {\n if (unavailableMessage) {\n event.preventDefault();\n return;\n }\n void transcription.start();\n }\n\n return (\n <span\n className={cn(\"inline-flex min-w-0 items-center gap-1.5\", className)}\n data-transcription-status={status}\n >\n <AnimatePresence mode=\"popLayout\" initial={false}>\n {active ? (\n <motion.span\n key={status === \"transcribing\" ? \"transcribing\" : \"capture\"}\n initial={{ opacity: 0, scale: 0.96 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.96 }}\n transition={{ duration: 0.16, ease: [0.22, 1, 0.36, 1] }}\n className={cn(\n \"inline-flex h-8 items-center gap-1 rounded-og-md border border-og-border/80\",\n \"bg-og-surface-2/70 pl-2 pr-1 pointer-coarse:h-9\",\n )}\n >\n {status === \"requesting-permission\" ? (\n <LoaderCircleIcon\n className=\"size-3.5 shrink-0 text-og-fg-muted animate-og-spin motion-reduce:animate-none\"\n aria-hidden\n />\n ) : (\n <span className=\"flex items-center gap-1.5\">\n {status === \"recording\" ? (\n <span\n aria-hidden\n className=\"size-1.5 shrink-0 rounded-full bg-og-status-failed animate-og-pulse motion-reduce:animate-none\"\n />\n ) : null}\n <VoiceWaveform\n stream={status === \"recording\" ? transcription.stream : null}\n mode={status === \"transcribing\" ? \"transcribing\" : \"recording\"}\n />\n </span>\n )}\n {status === \"recording\" ? (\n <>\n <Tip tip={messages.cancel}>\n <button\n type=\"button\"\n onClick={() => transcription.cancel()}\n aria-label={messages.cancel}\n aria-keyshortcuts=\"Escape\"\n className={cn(\n \"inline-flex size-7 shrink-0 items-center justify-center rounded-og-sm\",\n \"text-og-fg-muted transition-colors duration-150 motion-reduce:transition-none\",\n \"hover:bg-og-surface-3 hover:text-og-fg pointer-coarse:size-9\",\n )}\n >\n <XIcon className=\"size-3.5\" />\n </button>\n </Tip>\n <Tip tip={messages.stop}>\n <button\n type=\"button\"\n onClick={() => transcription.stop()}\n aria-label={messages.stop}\n className={cn(\n \"inline-flex size-7 shrink-0 items-center justify-center rounded-og-sm\",\n \"bg-og-fg text-og-bg transition-colors duration-150 motion-reduce:transition-none\",\n \"hover:bg-og-fg-muted pointer-coarse:size-9\",\n )}\n >\n <SquareIcon className=\"size-2.5 fill-current\" />\n </button>\n </Tip>\n </>\n ) : status === \"transcribing\" ? (\n <span className=\"og-shimmer-text px-1.5 text-og-xs font-medium whitespace-nowrap\">\n {messages.transcribing}\n </span>\n ) : (\n <span className=\"px-1.5 text-og-xs text-og-fg-muted whitespace-nowrap\">\n {messages.requestingPermission}\n </span>\n )}\n </motion.span>\n ) : (\n <Tip key=\"idle\" tip={idleLabel}>\n <motion.button\n type=\"button\"\n initial={{ opacity: 0, scale: 0.96 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.96 }}\n transition={{ duration: 0.14, ease: [0.22, 1, 0.36, 1] }}\n onClick={start}\n aria-label={idleLabel}\n aria-pressed={false}\n aria-disabled={unavailableMessage !== null}\n className={cn(\n \"inline-flex size-8 shrink-0 items-center justify-center rounded-og-md pointer-coarse:size-9\",\n \"text-og-fg-muted transition-colors duration-150 motion-reduce:transition-none\",\n unavailableMessage\n ? \"cursor-not-allowed opacity-45\"\n : \"hover:bg-og-surface-2 hover:text-og-fg\",\n )}\n >\n <MicIcon className=\"size-4\" />\n </motion.button>\n </Tip>\n )}\n </AnimatePresence>\n {status === \"error\" && errorMessage ? (\n <Tip tip={errorMessage}>\n <span\n aria-hidden=\"true\"\n className=\"max-w-40 truncate text-og-xs text-og-status-failed max-sm:max-w-24\"\n >\n {errorMessage}\n </span>\n </Tip>\n ) : null}\n <span className=\"sr-only\" role={status === \"error\" ? \"alert\" : \"status\"} aria-live=\"polite\">\n {announcement}\n </span>\n </span>\n );\n}\n\nfunction VoiceWaveform({\n stream,\n mode,\n}: {\n stream: MediaStream | null;\n mode: \"recording\" | \"transcribing\";\n}) {\n const [levels, setLevels] = useState<number[]>(() => restingLevels(WAVEFORM_BARS));\n const [live, setLive] = useState(false);\n\n useEffect(() => {\n if (!stream || mode !== \"recording\") {\n setLive(false);\n setLevels(restingLevels(WAVEFORM_BARS));\n return;\n }\n\n const AudioCtx =\n window.AudioContext ??\n (window as unknown as { webkitAudioContext?: typeof AudioContext }).webkitAudioContext;\n if (!AudioCtx) return;\n\n let cancelled = false;\n let frame = 0;\n let context: AudioContext | null = null;\n\n try {\n context = new AudioCtx();\n const source = context.createMediaStreamSource(stream);\n const analyser = context.createAnalyser();\n analyser.fftSize = 64;\n analyser.smoothingTimeConstant = 0.8;\n source.connect(analyser);\n const bins = new Uint8Array(analyser.frequencyBinCount);\n\n const tick = () => {\n if (cancelled) return;\n analyser.getByteFrequencyData(bins);\n const next = new Array<number>(WAVEFORM_BARS);\n const usable = Math.max(8, Math.floor(bins.length * 0.65));\n for (let i = 0; i < WAVEFORM_BARS; i++) {\n const start = Math.floor((i / WAVEFORM_BARS) * usable);\n const end = Math.max(start + 1, Math.floor(((i + 1) / WAVEFORM_BARS) * usable));\n let sum = 0;\n for (let j = start; j < end; j++) sum += bins[j] ?? 0;\n const avg = sum / (end - start) / 255;\n next[i] = Math.min(1, 0.14 + avg * 1.65);\n }\n setLevels(next);\n setLive(true);\n frame = requestAnimationFrame(tick);\n };\n\n void context.resume().then(() => {\n if (!cancelled) frame = requestAnimationFrame(tick);\n });\n } catch {\n setLive(false);\n }\n\n return () => {\n cancelled = true;\n cancelAnimationFrame(frame);\n void context?.close();\n };\n }, [stream, mode]);\n\n return (\n <span\n aria-hidden\n data-voice-waveform={live ? \"live\" : \"fallback\"}\n className=\"flex h-4 w-[3.75rem] items-center justify-center gap-px\"\n >\n {WAVEFORM_BAR_KEYS.map((key, index) => {\n const level = levels[index] ?? 0;\n return (\n <span\n key={key}\n className={cn(\n \"w-0.5 rounded-full bg-og-fg-muted/90 origin-center\",\n !live && \"animate-og-waveform motion-reduce:animate-none\",\n mode === \"transcribing\" && \"opacity-45\",\n )}\n style={{\n height: live ? `${Math.max(3, Math.round(level * 14))}px` : \"14px\",\n animationDelay: live ? undefined : `${(index % 9) * 0.07}s`,\n opacity: live ? 0.55 + level * 0.45 : undefined,\n }}\n />\n );\n })}\n </span>\n );\n}\n\nfunction restingLevels(count: number): number[] {\n return Array.from({ length: count }, (_, index) => 0.22 + ((index * 17) % 5) * 0.06);\n}\n\nfunction transcriptionErrorMessage(code: string, messages: ComposerTranscriptionMessages): string {\n switch (code) {\n case \"permission_denied\":\n return messages.errorPermissionDenied;\n case \"not_supported\":\n return messages.errorNotSupported;\n case \"unavailable\":\n return messages.errorUnavailable;\n case \"too_large\":\n return messages.errorTooLarge;\n case \"invalid_audio\":\n return messages.errorInvalidAudio;\n case \"unknown\":\n return messages.errorUnknown;\n default:\n return messages.errorUnknown;\n }\n}\n"],"mappings":"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","names":["useCallback","useEffect","useRef","useState","useState","useRef","useCallback","useEffect","useCallback","useMemo","useRef","useState","useState","useRef","useMemo","useCallback","errorMessage","useMemo","jsx","jsxs","useMemo","ChevronDownIcon","AnimatePresence","motion","useCallback","useEffect","useId","useMemo","useRef","useState","jsx","jsxs","useMemo","useId","useRef","useState","useEffect","isRecord","useCallback","jsx","jsxs","CommandPalette","ModelPicker","AnimatePresence","motion","ChevronDownIcon","LoaderCircleIcon","XIcon","AnimatePresence","motion","useEffect","useState","Fragment","jsx","jsxs","errorMessage","AnimatePresence","motion","LoaderCircleIcon","XIcon","useState","useEffect"]}