@meridial/react 0.1.1 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@meridial/react",
3
- "version": "0.1.1",
3
+ "version": "0.1.5",
4
4
  "type": "module",
5
5
  "description": "React components for embedding the Meridial in-app assistant UI (Voicebox) and workflow recorder UI (Recorder).",
6
6
  "author": "Meridial",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/voicebox.tsx","../../../node_modules/.pnpm/@base-ui+react@1.2.0_@types+react@19.2.14_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/@base-ui/react/esm/toggle/Toggle.js","../../../node_modules/.pnpm/@base-ui+utils@0.2.5_@types+react@19.2.14_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/@base-ui/utils/esm/useControlled.js","../../../node_modules/.pnpm/@base-ui+utils@0.2.5_@types+react@19.2.14_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/@base-ui/utils/esm/useId.js","../../../node_modules/.pnpm/@base-ui+react@1.2.0_@types+react@19.2.14_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/@base-ui/react/esm/utils/useBaseUiId.js","../../../node_modules/.pnpm/@base-ui+react@1.2.0_@types+react@19.2.14_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/@base-ui/react/esm/toggle-group/ToggleGroupContext.js","../../../node_modules/.pnpm/@base-ui+react@1.2.0_@types+react@19.2.14_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/@base-ui/react/esm/composite/item/useCompositeItem.js","../../../node_modules/.pnpm/@base-ui+react@1.2.0_@types+react@19.2.14_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/@base-ui/react/esm/composite/list/useCompositeListItem.js","../../../node_modules/.pnpm/@base-ui+react@1.2.0_@types+react@19.2.14_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/@base-ui/react/esm/composite/list/CompositeListContext.js","../../../node_modules/.pnpm/@base-ui+react@1.2.0_@types+react@19.2.14_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/@base-ui/react/esm/composite/item/CompositeItem.js","../../../node_modules/.pnpm/@base-ui+react@1.2.0_@types+react@19.2.14_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/@base-ui/react/esm/utils/reason-parts.js","../../../node_modules/.pnpm/@base-ui+react@1.2.0_@types+react@19.2.14_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/@base-ui/react/esm/utils/createBaseUIEventDetails.js","../../ui/src/components/toggle.tsx","../src/lib/schema-serializer.ts","../src/hooks/use-tool-registration.ts","../src/components/agent-session-provider.tsx","../src/components/agent-audio-visualizer-bar.tsx","../src/hooks/use-agent-audio-visualizer-bar.ts","../src/components/agent-track-toggle.tsx","../src/components/agent-track-control.tsx","../src/components/agent-disconnect-button.tsx","../src/components/agent-transcript-panel.tsx","../src/hooks/use-input-controls.ts","../src/components/start-audio-button.tsx","../src/components/workflow-execution.tsx","../src/components/outcome-bar.tsx","../src/components/meridial-logo.tsx","../src/components/voicebox-menu.tsx"],"sourcesContent":["\"use client\"\n\nimport {\n useSession,\n useAgent,\n useSessionContext,\n useEnsureRoom,\n} from \"@livekit/components-react\"\nimport { AnimatePresence, motion } from \"motion/react\"\nimport { TokenSource, RpcError } from \"livekit-client\"\nimport { useDraggable } from \"@neodrag/react\"\nimport {\n useRef,\n useState,\n useMemo,\n useEffect,\n useCallback,\n type RefObject,\n} from \"react\"\nimport { ChatFeedback01Icon, Loading03Icon } from \"@hugeicons/core-free-icons\"\nimport { HugeiconsIcon } from \"@hugeicons/react\"\nimport { Separator } from \"@workspace/ui/components/separator\"\nimport { Toggle } from \"@workspace/ui/components/toggle\"\nimport { cn } from \"@workspace/ui/lib/utils\"\nimport type { VoiceboxTool } from \"./types/tools.js\"\nimport { apiWorkflowsResponseSchema } from \"./schemas.js\"\nimport type { ApiWorkflow, Workflow } from \"./schemas.js\"\nimport { STORAGE_KEYS } from \"./constants.js\"\nimport { serializeTools } from \"./lib/schema-serializer.js\"\nimport { useToolRegistration } from \"./hooks/use-tool-registration.js\"\nimport { DragHandle } from \"./components/drag-handle.js\"\nimport { AgentSessionProvider } from \"./components/agent-session-provider.js\"\nimport { AgentTrackControl } from \"./components/agent-track-control.js\"\nimport { AgentDisconnectButton } from \"./components/agent-disconnect-button.js\"\nimport { AgentTranscriptPanel } from \"./components/agent-transcript-panel.js\"\nimport { useInputControls } from \"./hooks/use-input-controls.js\"\nimport { AgentAudioVisualizerBar } from \"./components/agent-audio-visualizer-bar.js\"\nimport { StartAudioButton } from \"./components/start-audio-button.js\"\nimport { Button } from \"@workspace/ui/components/button\"\nimport { WorkflowExecution } from \"./components/workflow-execution.js\"\nimport { OutcomeBar } from \"./components/outcome-bar.js\"\nimport { MeridialLogo } from \"./components/meridial-logo.js\"\nimport {\n VoiceboxMenu,\n type TriggerPosition,\n} from \"./components/voicebox-menu.js\"\n\ninterface VoiceboxProps {\n firstMessage?: string\n instructions?: string\n baseUrl?: string\n publishableKey?: string\n identifier?: string | null\n attribute?: string\n tools?: VoiceboxTool[]\n triggerIcon?: React.ReactNode\n cursor?: React.ReactNode\n metadata?: Record<string, unknown>\n onError?: (error: string) => void\n}\n\ninterface VoiceboxContentProps {\n baseUrl: string\n publishableKey?: string\n attribute?: string\n tools?: VoiceboxTool[]\n cursor?: React.ReactNode\n initialWorkflow?: { id: string; workflow: Workflow } | null\n onDisconnect: () => void\n onError?: (error: string) => void\n}\n\ntype VoiceboxView = \"badge\" | \"menu\" | \"call\"\n\nconst BADGE_POSITION_CLASSES: Record<TriggerPosition, string> = {\n \"bottom-right\": \"right-6 bottom-6\",\n \"bottom-left\": \"left-6 bottom-6\",\n \"top-right\": \"right-6 top-6\",\n \"top-left\": \"left-6 top-6\",\n}\n\nfunction VoiceboxBadge({\n triggerIcon,\n onClick,\n}: {\n triggerIcon?: React.ReactNode\n onClick: () => void\n}) {\n return (\n <button\n data-meridial-ui\n onClick={onClick}\n aria-label=\"Open assistant menu\"\n className=\"group size-10 flex cursor-pointer items-center justify-center rounded-full border border-border bg-background shadow-lg transition-transform duration-200 ease-out hover:scale-110\"\n >\n {triggerIcon ?? <MeridialLogo className=\"size-6\" />}\n </button>\n )\n}\n\nfunction VoiceboxContent({\n baseUrl,\n publishableKey,\n attribute,\n tools,\n cursor,\n initialWorkflow,\n onDisconnect,\n onError,\n}: VoiceboxContentProps) {\n const [showTranscript, setShowTranscript] = useState(false)\n const [showOutcomeBar, setShowOutcomeBar] = useState(false)\n const [activeWorkflow, setActiveWorkflow] = useState<{\n id: string\n workflow: Workflow\n } | null>(initialWorkflow ?? null)\n\n const workflowsRef = useRef<ApiWorkflow[]>([])\n const room = useEnsureRoom()\n const autoStarted = useRef(false)\n const outcomeShown = useRef(false)\n const draggableRef = useRef<HTMLDivElement>(null)\n\n const triggerOutcomeBar = useCallback(() => {\n if (!outcomeShown.current) {\n outcomeShown.current = true\n setShowOutcomeBar(true)\n }\n }, [])\n\n const handleOutcomeSubmit = useCallback(\n async (outcome: \"POSITIVE\" | \"NEGATIVE\" | \"NEUTRAL\") => {\n setShowOutcomeBar(false)\n try {\n const sessionId = await room.getSid()\n await fetch(`${baseUrl}/api/outcome`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ publishableKey, sessionId, outcome }),\n })\n } catch {\n // silently ignore outcome submission errors\n }\n },\n [room, baseUrl, publishableKey]\n )\n\n useToolRegistration(tools, triggerOutcomeBar)\n useDraggable(draggableRef as RefObject<HTMLElement>)\n\n useEffect(() => {\n if (!publishableKey) return\n fetch(`${baseUrl}/api/workflows`, {\n headers: { Authorization: `Bearer ${publishableKey}` },\n })\n .then((r) => r.json())\n .then((data: { workflows?: ApiWorkflow[] }) => {\n if (data.workflows) workflowsRef.current = data.workflows\n })\n .catch((error) => {\n onError?.(\n error instanceof Error ? error.message : \"Workflows fetch failed\"\n )\n })\n }, [baseUrl, publishableKey])\n\n useEffect(() => {\n room.registerRpcMethod(\"workflow:execute\", async (rpcData) => {\n try {\n const { slug } = JSON.parse(rpcData.payload) as { slug: string }\n const apiWf = workflowsRef.current.find((w) => w.slug === slug)\n if (!apiWf) throw new Error(`Workflow '${slug}' not found`)\n\n const workflow: Workflow = {\n id: apiWf.id,\n name: apiWf.name,\n steps: apiWf.steps,\n configured: true,\n createdAt: new Date().toISOString(),\n }\n setActiveWorkflow({ id: apiWf.id, workflow })\n triggerOutcomeBar()\n return JSON.stringify({ success: true })\n } catch (error) {\n onError?.(\n error instanceof Error ? error.message : \"Workflow execution failed\"\n )\n throw new RpcError(\n 1,\n error instanceof Error ? error.message : \"Workflow execution failed\"\n )\n }\n })\n\n return () => {\n room.unregisterRpcMethod(\"workflow:execute\")\n }\n }, [room])\n\n const { state } = useAgent()\n const { start } = useSessionContext()\n\n // Auto-start the session when the conversation bar first appears\n useEffect(() => {\n if (!autoStarted.current) {\n autoStarted.current = true\n start()\n }\n }, [start])\n\n const isConnecting =\n state === \"connecting\" ||\n state === \"initializing\" ||\n state === \"pre-connect-buffering\"\n const isDisconnected = state === \"disconnected\" || state === \"failed\"\n\n const { microphoneTrack, microphoneToggle } = useInputControls()\n\n const handleDisconnect = () => {\n onDisconnect()\n }\n\n return (\n <>\n {activeWorkflow && (\n <WorkflowExecution\n workflow={activeWorkflow.workflow}\n attribute={attribute}\n cursor={cursor}\n onClose={() => {\n setActiveWorkflow(null)\n triggerOutcomeBar()\n }}\n onError={onError}\n />\n )}\n <motion.div\n initial={{ opacity: 0, y: 20 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.3, ease: \"easeOut\" }}\n className=\"fixed inset-x-0 bottom-8 z-50 flex justify-center\"\n >\n <div\n ref={draggableRef}\n data-meridial-ui\n className=\"w-96 items-stretch rounded border border-border bg-card shadow-md\"\n >\n <AnimatePresence initial={false}>\n {showTranscript && (\n <motion.div\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: \"auto\", opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n transition={{ duration: 0.24, ease: \"easeOut\" }}\n style={{ overflow: \"hidden\" }}\n >\n <AgentTranscriptPanel />\n </motion.div>\n )}\n </AnimatePresence>\n <AnimatePresence initial={false}>\n {showOutcomeBar && (\n <motion.div\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: \"auto\", opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n transition={{ duration: 0.24, ease: \"easeOut\" }}\n style={{ overflow: \"hidden\" }}\n >\n <OutcomeBar onSubmit={handleOutcomeSubmit} />\n </motion.div>\n )}\n </AnimatePresence>\n <div data-meridial-ui className=\"flex h-12 items-center\">\n <DragHandle className=\"px-2\" />\n <Separator orientation=\"vertical\" className=\"h-full\" />\n\n <div className=\"relative flex h-full flex-1 items-center justify-between px-2\">\n <div className=\"flex items-center gap-2\">\n <AgentTrackControl\n source=\"microphone\"\n pressed={microphoneToggle.enabled}\n pending={microphoneToggle.pending}\n disabled={microphoneToggle.pending}\n audioTrack={microphoneTrack}\n onPressedChange={microphoneToggle.toggle}\n />\n <Toggle\n disabled={isDisconnected || isConnecting}\n pressed={showTranscript}\n aria-label=\"Toggle transcript\"\n onPressedChange={setShowTranscript}\n className={cn(\n \"size-9 rounded-lg\",\n showTranscript\n ? \"bg-muted text-foreground\"\n : \"bg-transparent text-muted-foreground hover:text-foreground\"\n )}\n >\n <HugeiconsIcon icon={ChatFeedback01Icon} />\n </Toggle>\n <AgentAudioVisualizerBar\n barCount={12}\n state={state}\n audioTrack={microphoneTrack}\n className=\"mx-4\"\n />\n </div>\n\n {isConnecting ? (\n <Button variant=\"outline\">\n <span>Connecting</span>\n <HugeiconsIcon\n icon={Loading03Icon}\n className=\"animate-spin\"\n />\n </Button>\n ) : (\n <AgentDisconnectButton onClick={handleDisconnect} />\n )}\n <StartAudioButton label=\"Start Audio\" />\n </div>\n </div>\n </div>\n </motion.div>\n </>\n )\n}\n\nexport function Voicebox({\n baseUrl = \"\",\n publishableKey,\n identifier,\n attribute,\n tools,\n triggerIcon,\n cursor,\n firstMessage,\n instructions,\n metadata,\n onError,\n}: VoiceboxProps) {\n const [view, setView] = useState<VoiceboxView>(\"badge\")\n const [hidden, setHidden] = useState(false)\n const [badgePosition, setBadgePosition] = useState<TriggerPosition>(() => {\n if (typeof window === \"undefined\") return \"bottom-right\"\n return (\n (localStorage.getItem(STORAGE_KEYS.triggerPos) as TriggerPosition) ||\n \"bottom-right\"\n )\n })\n const [allWorkflows, setAllWorkflows] = useState<ApiWorkflow[]>([])\n const [initialWorkflow, setInitialWorkflow] = useState<{\n id: string\n workflow: Workflow\n } | null>(null)\n const [guideWorkflow, setGuideWorkflow] = useState<Workflow | null>(null)\n const [playingWorkflowId, setPlayingWorkflowId] = useState<string | null>(\n null\n )\n const [playingStepIndex, setPlayingStepIndex] = useState(0)\n\n // Check sessionStorage on mount for hide-until-next-visit\n useEffect(() => {\n if (sessionStorage.getItem(STORAGE_KEYS.hidden) === \"true\") {\n setHidden(true)\n }\n }, [])\n\n // Fetch all workflows\n useEffect(() => {\n if (!publishableKey) return\n fetch(`${baseUrl}/api/workflows`, {\n headers: { Authorization: `Bearer ${publishableKey}` },\n })\n .then((r) => r.json())\n .then((data) => {\n const parsed = apiWorkflowsResponseSchema.safeParse(data)\n if (parsed.success && parsed.data.workflows) {\n setAllWorkflows(parsed.data.workflows)\n }\n })\n .catch(() => {})\n }, [baseUrl, publishableKey])\n\n const serializedTools = useMemo(\n () => (tools && tools.length > 0 ? serializeTools(tools) : []),\n [tools]\n )\n\n const tokenSource = useMemo(\n () =>\n TokenSource.custom(async () => {\n const response = await fetch(`${baseUrl}/api/auth/livekit`, {\n method: \"POST\",\n body: JSON.stringify({\n publishableKey,\n identifier,\n firstMessage,\n instructions,\n tools: serializedTools,\n metadata,\n }),\n })\n if (!response.ok) {\n const body = await response.json().catch(() => ({}))\n onError?.(body.error ?? `Token request failed (${response.status})`)\n return null\n }\n return response.json()\n }),\n [\n baseUrl,\n publishableKey,\n identifier,\n firstMessage,\n instructions,\n serializedTools,\n metadata,\n onError,\n ]\n )\n\n const session = useSession(tokenSource)\n\n const handleDisconnect = () => {\n setView(\"badge\")\n setInitialWorkflow(null)\n }\n\n const handlePositionChange = (pos: TriggerPosition) => {\n setBadgePosition(pos)\n localStorage.setItem(STORAGE_KEYS.triggerPos, pos)\n }\n\n const handleHide = () => {\n sessionStorage.setItem(STORAGE_KEYS.hidden, \"true\")\n setHidden(true)\n setView(\"badge\")\n }\n\n const handleAskMeridial = () => {\n setInitialWorkflow(null)\n setView(\"call\")\n }\n\n const handlePlayGuide = (wf: ApiWorkflow) => {\n setGuideWorkflow({\n id: wf.id,\n name: wf.name,\n steps: wf.steps,\n configured: true,\n createdAt: new Date().toISOString(),\n })\n setPlayingWorkflowId(wf.id)\n setPlayingStepIndex(0)\n }\n\n const handleAbortGuide = () => {\n setGuideWorkflow(null)\n setPlayingWorkflowId(null)\n setPlayingStepIndex(0)\n }\n\n const handleBadgeClick = () => {\n setView((prev) => (prev === \"menu\" ? \"badge\" : \"menu\"))\n }\n\n if (hidden) return null\n\n return (\n <AgentSessionProvider session={session}>\n {guideWorkflow && (\n <WorkflowExecution\n workflow={guideWorkflow}\n attribute={attribute}\n cursor={cursor}\n onClose={() => {\n setGuideWorkflow(null)\n setPlayingWorkflowId(null)\n setPlayingStepIndex(0)\n }}\n onStepChange={(index) => setPlayingStepIndex(index)}\n onError={onError}\n />\n )}\n {view === \"call\" ? (\n <VoiceboxContent\n baseUrl={baseUrl}\n publishableKey={publishableKey}\n attribute={attribute}\n tools={tools}\n cursor={cursor}\n initialWorkflow={initialWorkflow}\n onDisconnect={handleDisconnect}\n onError={onError}\n />\n ) : (\n <div\n className={cn(\"fixed z-50\", BADGE_POSITION_CLASSES[badgePosition])}\n >\n <AnimatePresence>\n {view === \"menu\" && (\n <VoiceboxMenu\n workflows={allWorkflows}\n position={badgePosition}\n playingWorkflowId={playingWorkflowId}\n playingStepIndex={playingStepIndex}\n onPositionChange={handlePositionChange}\n onHide={handleHide}\n onAskMeridial={handleAskMeridial}\n onPlayGuide={handlePlayGuide}\n onAbortGuide={handleAbortGuide}\n />\n )}\n </AnimatePresence>\n <VoiceboxBadge triggerIcon={triggerIcon} onClick={handleBadgeClick} />\n </div>\n )}\n </AgentSessionProvider>\n )\n}\n\nexport type { VoiceboxTool }\n","'use client';\n\nimport * as React from 'react';\nimport { useStableCallback } from '@base-ui/utils/useStableCallback';\nimport { useControlled } from '@base-ui/utils/useControlled';\nimport { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';\nimport { error } from '@base-ui/utils/error';\nimport { useBaseUiId } from \"../utils/useBaseUiId.js\";\nimport { useRenderElement } from \"../utils/useRenderElement.js\";\nimport { useToggleGroupContext } from \"../toggle-group/ToggleGroupContext.js\";\nimport { useButton } from \"../use-button/useButton.js\";\nimport { CompositeItem } from \"../composite/item/CompositeItem.js\";\nimport { createChangeEventDetails } from \"../utils/createBaseUIEventDetails.js\";\nimport { REASONS } from \"../utils/reasons.js\";\n\n/**\n * A two-state button that can be on or off.\n * Renders a `<button>` element.\n *\n * Documentation: [Base UI Toggle](https://base-ui.com/react/components/toggle)\n */\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport const Toggle = /*#__PURE__*/React.forwardRef(function Toggle(componentProps, forwardedRef) {\n const {\n className,\n defaultPressed: defaultPressedProp = false,\n disabled: disabledProp = false,\n form,\n // never participates in form validation\n onPressedChange: onPressedChangeProp,\n pressed: pressedProp,\n render,\n type,\n // cannot change button type\n value: valueProp,\n nativeButton = true,\n ...elementProps\n } = componentProps;\n\n // `|| undefined` handles cases, where value is falsy (i.e. \"\")\n const value = useBaseUiId(valueProp || undefined);\n const groupContext = useToggleGroupContext();\n const groupValue = groupContext?.value ?? [];\n const defaultPressed = groupContext ? undefined : defaultPressedProp;\n const disabled = (disabledProp || groupContext?.disabled) ?? false;\n if (process.env.NODE_ENV !== 'production') {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useIsoLayoutEffect(() => {\n if (groupContext && valueProp === undefined && groupContext.isValueInitialized) {\n error('A `<Toggle>` component rendered in a `<ToggleGroup>` has no explicit `value` prop.', 'This will cause issues between the Toggle Group and Toggle values.', 'Provide the `<Toggle>` with a `value` prop matching the `<ToggleGroup>` values prop type.');\n }\n }, [groupContext, valueProp, groupContext?.isValueInitialized]);\n }\n const [pressed, setPressedState] = useControlled({\n controlled: groupContext ? value !== undefined && groupValue.indexOf(value) > -1 : pressedProp,\n default: defaultPressed,\n name: 'Toggle',\n state: 'pressed'\n });\n const onPressedChange = useStableCallback((nextPressed, eventDetails) => {\n if (value) {\n groupContext?.setGroupValue?.(value, nextPressed, eventDetails);\n }\n onPressedChangeProp?.(nextPressed, eventDetails);\n });\n const {\n getButtonProps,\n buttonRef\n } = useButton({\n disabled,\n native: nativeButton\n });\n const state = {\n disabled,\n pressed\n };\n const refs = [buttonRef, forwardedRef];\n const props = [{\n 'aria-pressed': pressed,\n onClick(event) {\n const nextPressed = !pressed;\n const details = createChangeEventDetails(REASONS.none, event.nativeEvent);\n onPressedChange(nextPressed, details);\n if (details.isCanceled) {\n return;\n }\n setPressedState(nextPressed);\n }\n }, elementProps, getButtonProps];\n const element = useRenderElement('button', componentProps, {\n enabled: !groupContext,\n state,\n ref: refs,\n props\n });\n if (groupContext) {\n return /*#__PURE__*/_jsx(CompositeItem, {\n tag: \"button\",\n render: render,\n className: className,\n state: state,\n refs: refs,\n props: props\n });\n }\n return element;\n});\nif (process.env.NODE_ENV !== \"production\") Toggle.displayName = \"Toggle\";","'use client';\n\n// TODO: uncomment once we enable eslint-plugin-react-compiler // eslint-disable-next-line react-compiler/react-compiler -- process.env never changes, dependency arrays are intentionally ignored\n/* eslint-disable react-hooks/rules-of-hooks, react-hooks/exhaustive-deps */\nimport * as React from 'react';\nexport function useControlled({\n controlled,\n default: defaultProp,\n name,\n state = 'value'\n}) {\n // isControlled is ignored in the hook dependency lists as it should never change.\n const {\n current: isControlled\n } = React.useRef(controlled !== undefined);\n const [valueState, setValue] = React.useState(defaultProp);\n const value = isControlled ? controlled : valueState;\n if (process.env.NODE_ENV !== 'production') {\n React.useEffect(() => {\n if (isControlled !== (controlled !== undefined)) {\n console.error([`Base UI: A component is changing the ${isControlled ? '' : 'un'}controlled ${state} state of ${name} to be ${isControlled ? 'un' : ''}controlled.`, 'Elements should not switch from uncontrolled to controlled (or vice versa).', `Decide between using a controlled or uncontrolled ${name} ` + 'element for the lifetime of the component.', \"The nature of the state is determined during the first render. It's considered controlled if the value is not `undefined`.\", 'More info: https://fb.me/react-controlled-components'].join('\\n'));\n }\n }, [state, name, controlled]);\n const {\n current: defaultValue\n } = React.useRef(defaultProp);\n React.useEffect(() => {\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is for more details.\n if (!isControlled && JSON.stringify(defaultValue) !== JSON.stringify(defaultProp)) {\n console.error([`Base UI: A component is changing the default ${state} state of an uncontrolled ${name} after being initialized. ` + `To suppress this warning opt to use a controlled ${name}.`].join('\\n'));\n }\n }, [JSON.stringify(defaultProp)]);\n }\n const setValueIfUncontrolled = React.useCallback(newValue => {\n if (!isControlled) {\n setValue(newValue);\n }\n }, []);\n return [value, setValueIfUncontrolled];\n}","'use client';\n\nimport * as React from 'react';\nimport { SafeReact } from \"./safeReact.js\";\nlet globalId = 0;\n\n// TODO React 17: Remove `useGlobalId` once React 17 support is removed\nfunction useGlobalId(idOverride, prefix = 'mui') {\n const [defaultId, setDefaultId] = React.useState(idOverride);\n const id = idOverride || defaultId;\n React.useEffect(() => {\n if (defaultId == null) {\n // Fallback to this default id when possible.\n // Use the incrementing value for client-side rendering only.\n // We can't use it server-side.\n // If you want to use random values please consider the Birthday Problem: https://en.wikipedia.org/wiki/Birthday_problem\n globalId += 1;\n setDefaultId(`${prefix}-${globalId}`);\n }\n }, [defaultId, prefix]);\n return id;\n}\nconst maybeReactUseId = SafeReact.useId;\n\n/**\n *\n * @example <div id={useId()} />\n * @param idOverride\n * @returns {string}\n */\nexport function useId(idOverride, prefix) {\n // React.useId() is only available from React 17.0.0.\n if (maybeReactUseId !== undefined) {\n const reactId = maybeReactUseId();\n return idOverride ?? (prefix ? `${prefix}-${reactId}` : reactId);\n }\n\n // TODO: uncomment once we enable eslint-plugin-react-compiler // eslint-disable-next-line react-compiler/react-compiler\n // eslint-disable-next-line react-hooks/rules-of-hooks -- `React.useId` is invariant at runtime.\n return useGlobalId(idOverride, prefix);\n}","'use client';\n\nimport { useId } from '@base-ui/utils/useId';\n\n/**\n * Wraps `useId` and prefixes generated `id`s with `base-ui-`\n * @param {string | undefined} idOverride overrides the generated id when provided\n * @returns {string | undefined}\n */\nexport function useBaseUiId(idOverride) {\n return useId(idOverride, 'base-ui');\n}","'use client';\n\nimport _formatErrorMessage from \"@base-ui/utils/formatErrorMessage\";\nimport * as React from 'react';\nexport const ToggleGroupContext = /*#__PURE__*/React.createContext(undefined);\nif (process.env.NODE_ENV !== \"production\") ToggleGroupContext.displayName = \"ToggleGroupContext\";\nexport function useToggleGroupContext(optional = true) {\n const context = React.useContext(ToggleGroupContext);\n if (context === undefined && !optional) {\n throw new Error(process.env.NODE_ENV !== \"production\" ? 'Base UI: ToggleGroupContext is missing. ToggleGroup parts must be placed within <ToggleGroup>.' : _formatErrorMessage(7));\n }\n return context;\n}","'use client';\n\nimport * as React from 'react';\nimport { useMergedRefs } from '@base-ui/utils/useMergedRefs';\nimport { useCompositeRootContext } from \"../root/CompositeRootContext.js\";\nimport { useCompositeListItem } from \"../list/useCompositeListItem.js\";\nexport function useCompositeItem(params = {}) {\n const {\n highlightItemOnHover,\n highlightedIndex,\n onHighlightedIndexChange\n } = useCompositeRootContext();\n const {\n ref,\n index\n } = useCompositeListItem(params);\n const isHighlighted = highlightedIndex === index;\n const itemRef = React.useRef(null);\n const mergedRef = useMergedRefs(ref, itemRef);\n const compositeProps = React.useMemo(() => ({\n tabIndex: isHighlighted ? 0 : -1,\n onFocus() {\n onHighlightedIndexChange(index);\n },\n onMouseMove() {\n const item = itemRef.current;\n if (!highlightItemOnHover || !item) {\n return;\n }\n const disabled = item.hasAttribute('disabled') || item.ariaDisabled === 'true';\n if (!isHighlighted && !disabled) {\n item.focus();\n }\n }\n }), [isHighlighted, onHighlightedIndexChange, index, highlightItemOnHover]);\n return {\n compositeProps,\n compositeRef: mergedRef,\n index\n };\n}","'use client';\n\nimport * as React from 'react';\nimport { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';\nimport { useCompositeListContext } from \"./CompositeListContext.js\";\nexport let IndexGuessBehavior = /*#__PURE__*/function (IndexGuessBehavior) {\n IndexGuessBehavior[IndexGuessBehavior[\"None\"] = 0] = \"None\";\n IndexGuessBehavior[IndexGuessBehavior[\"GuessFromOrder\"] = 1] = \"GuessFromOrder\";\n return IndexGuessBehavior;\n}({});\n\n/**\n * Used to register a list item and its index (DOM position) in the `CompositeList`.\n */\nexport function useCompositeListItem(params = {}) {\n const {\n label,\n metadata,\n textRef,\n indexGuessBehavior,\n index: externalIndex\n } = params;\n const {\n register,\n unregister,\n subscribeMapChange,\n elementsRef,\n labelsRef,\n nextIndexRef\n } = useCompositeListContext();\n const indexRef = React.useRef(-1);\n const [index, setIndex] = React.useState(externalIndex ?? (indexGuessBehavior === IndexGuessBehavior.GuessFromOrder ? () => {\n if (indexRef.current === -1) {\n const newIndex = nextIndexRef.current;\n nextIndexRef.current += 1;\n indexRef.current = newIndex;\n }\n return indexRef.current;\n } : -1));\n const componentRef = React.useRef(null);\n const ref = React.useCallback(node => {\n componentRef.current = node;\n if (index !== -1 && node !== null) {\n elementsRef.current[index] = node;\n if (labelsRef) {\n const isLabelDefined = label !== undefined;\n labelsRef.current[index] = isLabelDefined ? label : textRef?.current?.textContent ?? node.textContent;\n }\n }\n }, [index, elementsRef, labelsRef, label, textRef]);\n useIsoLayoutEffect(() => {\n if (externalIndex != null) {\n return undefined;\n }\n const node = componentRef.current;\n if (node) {\n register(node, metadata);\n return () => {\n unregister(node);\n };\n }\n return undefined;\n }, [externalIndex, register, unregister, metadata]);\n useIsoLayoutEffect(() => {\n if (externalIndex != null) {\n return undefined;\n }\n return subscribeMapChange(map => {\n const i = componentRef.current ? map.get(componentRef.current)?.index : null;\n if (i != null) {\n setIndex(i);\n }\n });\n }, [externalIndex, subscribeMapChange, setIndex]);\n return React.useMemo(() => ({\n ref,\n index\n }), [index, ref]);\n}","'use client';\n\nimport * as React from 'react';\nexport const CompositeListContext = /*#__PURE__*/React.createContext({\n register: () => {},\n unregister: () => {},\n subscribeMapChange: () => {\n return () => {};\n },\n elementsRef: {\n current: []\n },\n nextIndexRef: {\n current: 0\n }\n});\nif (process.env.NODE_ENV !== \"production\") CompositeListContext.displayName = \"CompositeListContext\";\nexport function useCompositeListContext() {\n return React.useContext(CompositeListContext);\n}","'use client';\n\nimport { useRenderElement } from \"../../utils/useRenderElement.js\";\nimport { useCompositeItem } from \"./useCompositeItem.js\";\nimport { EMPTY_OBJECT, EMPTY_ARRAY } from \"../../utils/constants.js\";\n/**\n * @internal\n */\nexport function CompositeItem(componentProps) {\n const {\n render,\n className,\n state = EMPTY_OBJECT,\n props = EMPTY_ARRAY,\n refs = EMPTY_ARRAY,\n metadata,\n stateAttributesMapping,\n tag = 'div',\n ...elementProps\n } = componentProps;\n const {\n compositeProps,\n compositeRef\n } = useCompositeItem({\n metadata\n });\n return useRenderElement(tag, componentProps, {\n state,\n ref: [...refs, compositeRef],\n props: [compositeProps, ...props, elementProps],\n stateAttributesMapping\n });\n}","export const none = 'none';\nexport const triggerPress = 'trigger-press';\nexport const triggerHover = 'trigger-hover';\nexport const triggerFocus = 'trigger-focus';\nexport const outsidePress = 'outside-press';\nexport const itemPress = 'item-press';\nexport const closePress = 'close-press';\nexport const linkPress = 'link-press';\nexport const clearPress = 'clear-press';\nexport const chipRemovePress = 'chip-remove-press';\nexport const trackPress = 'track-press';\nexport const incrementPress = 'increment-press';\nexport const decrementPress = 'decrement-press';\nexport const inputChange = 'input-change';\nexport const inputClear = 'input-clear';\nexport const inputBlur = 'input-blur';\nexport const inputPaste = 'input-paste';\nexport const inputPress = 'input-press';\nexport const focusOut = 'focus-out';\nexport const escapeKey = 'escape-key';\nexport const closeWatcher = 'close-watcher';\nexport const listNavigation = 'list-navigation';\nexport const keyboard = 'keyboard';\nexport const pointer = 'pointer';\nexport const drag = 'drag';\nexport const wheel = 'wheel';\nexport const scrub = 'scrub';\nexport const cancelOpen = 'cancel-open';\nexport const siblingOpen = 'sibling-open';\nexport const disabled = 'disabled';\nexport const imperativeAction = 'imperative-action';\nexport const swipe = 'swipe';\nexport const windowResize = 'window-resize';","import { EMPTY_OBJECT } from \"./constants.js\";\nimport { REASONS } from \"./reasons.js\";\n\n/**\n * Maps a change `reason` string to the corresponding native event type.\n */\n\n/**\n * Details of custom change events emitted by Base UI components.\n */\n\n/**\n * Details of custom generic events emitted by Base UI components.\n */\n\n/**\n * Creates a Base UI event details object with the given reason and utilities\n * for preventing Base UI's internal event handling.\n */\nexport function createChangeEventDetails(reason, event, trigger, customProperties) {\n let canceled = false;\n let allowPropagation = false;\n const custom = customProperties ?? EMPTY_OBJECT;\n const details = {\n reason,\n event: event ?? new Event('base-ui'),\n cancel() {\n canceled = true;\n },\n allowPropagation() {\n allowPropagation = true;\n },\n get isCanceled() {\n return canceled;\n },\n get isPropagationAllowed() {\n return allowPropagation;\n },\n trigger,\n ...custom\n };\n return details;\n}\nexport function createGenericEventDetails(reason, event, customProperties) {\n const custom = customProperties ?? EMPTY_OBJECT;\n const details = {\n reason,\n event: event ?? new Event('base-ui'),\n ...custom\n };\n return details;\n}","\"use client\"\n\nimport { Toggle as TogglePrimitive } from \"@base-ui/react/toggle\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@workspace/ui/lib/utils\"\n\nconst toggleVariants = cva(\n \"group/toggle inline-flex items-center justify-center gap-1 rounded-lg text-sm font-medium whitespace-nowrap transition-all outline-none hover:bg-muted hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 aria-pressed:bg-muted data-[state=on]:bg-muted dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n default: \"bg-transparent\",\n outline: \"border border-input bg-transparent hover:bg-muted\",\n },\n size: {\n default: \"h-8 min-w-8 px-2\",\n sm: \"h-7 min-w-7 rounded-[min(var(--radius-md),12px)] px-1.5 text-[0.8rem]\",\n lg: \"h-9 min-w-9 px-2.5\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Toggle({\n className,\n variant = \"default\",\n size = \"default\",\n ...props\n}: TogglePrimitive.Props & VariantProps<typeof toggleVariants>) {\n return (\n <TogglePrimitive\n data-slot=\"toggle\"\n className={cn(toggleVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Toggle, toggleVariants }\n","import { z } from \"zod\"\nimport type { VoiceboxTool } from \"../types/tools.js\"\n\nexport function serializeTools(tools: VoiceboxTool[]) {\n return tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n parameters: z.toJSONSchema(tool.parameters as z.ZodType, {\n target: \"openapi-3.0\",\n }),\n }))\n}\n","import { useEffect } from \"react\"\nimport { RpcError } from \"livekit-client\"\nimport { useEnsureRoom } from \"@livekit/components-react\"\nimport type { VoiceboxTool } from \"../types/tools.js\"\n\nexport function useToolRegistration(\n tools?: VoiceboxTool[],\n onToolComplete?: () => void\n) {\n const room = useEnsureRoom()\n\n useEffect(() => {\n if (!tools || tools.length === 0) return\n\n const cleanups: (() => void)[] = []\n\n for (const tool of tools) {\n const methodName = `tool:${tool.name}`\n\n room.registerRpcMethod(methodName, async (data) => {\n try {\n const params = JSON.parse(data.payload)\n const parsed = tool.parameters.parse(params)\n const result = await tool.execute(parsed)\n onToolComplete?.()\n return JSON.stringify(result)\n } catch (error) {\n const message =\n error instanceof Error ? error.message : \"Tool execution failed\"\n throw new RpcError(1, message)\n }\n })\n\n cleanups.push(() => {\n room.unregisterRpcMethod(methodName)\n })\n }\n\n return () => {\n for (const cleanup of cleanups) {\n cleanup()\n }\n }\n }, [room, tools, onToolComplete])\n}\n","\"use client\"\n\nimport type React from \"react\"\nimport {\n SessionProvider,\n type UseSessionReturn,\n RoomAudioRenderer,\n type SessionProviderProps,\n type RoomAudioRendererProps,\n} from \"@livekit/components-react\"\nimport type { Room } from \"livekit-client\"\n\nexport type AgentSessionProviderProps = SessionProviderProps &\n RoomAudioRendererProps & {\n room?: Room\n volume?: number\n muted?: boolean\n session: UseSessionReturn\n children: React.ReactNode\n }\n\nexport function AgentSessionProvider({\n session,\n children,\n ...roomAudioRendererProps\n}: AgentSessionProviderProps) {\n return (\n <SessionProvider session={session}>\n {children}\n <RoomAudioRenderer {...roomAudioRendererProps} />\n </SessionProvider>\n )\n}\n","\"use client\"\n\nimport { Fragment, useMemo, type ReactNode } from \"react\"\nimport {\n type AgentState,\n useMultibandTrackVolume,\n} from \"@livekit/components-react\"\nimport type { LocalAudioTrack, RemoteAudioTrack } from \"livekit-client\"\nimport type { TrackReferenceOrPlaceholder } from \"@livekit/components-react\"\nimport { cn } from \"@workspace/ui/lib/utils\"\nimport { useAgentAudioVisualizerBarAnimator } from \"../hooks/use-agent-audio-visualizer-bar.js\"\n\nexport interface AgentAudioVisualizerBarProps {\n state?: AgentState\n barCount?: number\n audioTrack?: LocalAudioTrack | RemoteAudioTrack | TrackReferenceOrPlaceholder\n className?: string\n children?: ReactNode\n}\n\nexport function AgentAudioVisualizerBar({\n state = \"connecting\",\n barCount = 3,\n audioTrack,\n className,\n children,\n}: AgentAudioVisualizerBarProps) {\n const sequencerInterval = useMemo(() => {\n switch (state) {\n case \"connecting\":\n return 2000 / barCount\n case \"initializing\":\n return 2000\n case \"listening\":\n return 500\n case \"thinking\":\n return 150\n default:\n return 1000\n }\n }, [state, barCount])\n\n const highlightedIndices = useAgentAudioVisualizerBarAnimator(\n state,\n barCount,\n sequencerInterval\n )\n\n const volumeBands = useMultibandTrackVolume(audioTrack, {\n bands: barCount,\n loPass: 100,\n hiPass: 200,\n })\n\n const bands = useMemo(\n () => (state === \"speaking\" ? volumeBands : new Array(barCount).fill(0)),\n [state, volumeBands, barCount]\n )\n\n return (\n <div\n data-lk-state={state}\n className={cn(\n \"relative flex h-6 items-center justify-center gap-0.5\",\n className\n )}\n >\n {bands.map((band: number, idx: number) =>\n children ? (\n <Fragment key={idx}>\n {/* clone child with animation data attrs */}\n {children}\n </Fragment>\n ) : (\n <div\n key={idx}\n data-lk-index={idx}\n data-lk-highlighted={highlightedIndices.includes(idx)}\n style={{ height: `${Math.max(4, band * 24)}px` }}\n className=\"min-h-1 w-1 rounded-full bg-primary/20 transition-[height] duration-100 ease-linear data-[lk-highlighted=true]:bg-primary\"\n />\n )\n )}\n </div>\n )\n}\n","import { useEffect, useRef, useState } from \"react\"\nimport type { AgentState } from \"@livekit/components-react\"\n\nfunction generateConnectingSequenceBar(columns: number): number[][] {\n const seq = []\n for (let x = 0; x < columns; x++) {\n seq.push([x, columns - 1 - x])\n }\n return seq\n}\n\nfunction generateListeningSequenceBar(columns: number): number[][] {\n const center = Math.floor(columns / 2)\n return [[center], [-1]]\n}\n\nexport function useAgentAudioVisualizerBarAnimator(\n state: AgentState | undefined,\n columns: number,\n interval: number\n): number[] {\n const [index, setIndex] = useState(0)\n const [sequence, setSequence] = useState<number[][]>([[]])\n\n useEffect(() => {\n if (state === \"thinking\") {\n setSequence(generateListeningSequenceBar(columns))\n } else if (state === \"connecting\" || state === \"initializing\") {\n setSequence([...generateConnectingSequenceBar(columns)])\n } else if (state === \"listening\") {\n setSequence(generateListeningSequenceBar(columns))\n } else if (state === undefined || state === \"speaking\") {\n setSequence([new Array(columns).fill(0).map((_, idx) => idx)])\n } else {\n setSequence([[]])\n }\n setIndex(0)\n }, [state, columns])\n\n const animationFrameId = useRef<number | null>(null)\n useEffect(() => {\n let startTime = performance.now()\n\n const animate = (time: DOMHighResTimeStamp) => {\n if (time - startTime >= interval) {\n setIndex((prev) => prev + 1)\n startTime = time\n }\n animationFrameId.current = requestAnimationFrame(animate)\n }\n\n animationFrameId.current = requestAnimationFrame(animate)\n\n return () => {\n if (animationFrameId.current !== null) {\n cancelAnimationFrame(animationFrameId.current)\n }\n }\n }, [interval, columns, state, sequence.length])\n\n return sequence[index % sequence.length] ?? []\n}\n","\"use client\"\n\nimport { Fragment, useMemo, useState, type ComponentProps } from \"react\"\nimport { Track } from \"livekit-client\"\nimport {\n MicIcon,\n MicOffIcon,\n Loading03Icon,\n VideoIcon,\n VideoOffIcon,\n} from \"@hugeicons/core-free-icons\"\nimport { HugeiconsIcon } from \"@hugeicons/react\"\nimport { Toggle } from \"@workspace/ui/components/toggle\"\nimport { cn } from \"@workspace/ui/lib/utils\"\n\nfunction getSourceIcon(\n source: Track.Source,\n enabled: boolean,\n pending = false\n) {\n if (pending) return Loading03Icon\n switch (source) {\n case Track.Source.Microphone:\n return enabled ? MicIcon : MicOffIcon\n case Track.Source.Camera:\n return enabled ? VideoIcon : VideoOffIcon\n default:\n return MicIcon\n }\n}\n\nexport interface AgentTrackToggleProps\n extends Omit<ComponentProps<\"button\">, \"value\"> {\n source: \"camera\" | \"microphone\" | \"screen_share\"\n pending?: boolean\n pressed?: boolean\n defaultPressed?: boolean\n onPressedChange?: (pressed: boolean) => void\n}\n\nexport function AgentTrackToggle({\n source,\n pending = false,\n pressed,\n defaultPressed = false,\n className,\n onPressedChange,\n ...props\n}: AgentTrackToggleProps) {\n const [uncontrolledPressed, setUncontrolledPressed] = useState(\n defaultPressed ?? false\n )\n const isControlled = pressed !== undefined\n const resolvedPressed = useMemo(\n () => (isControlled ? pressed : uncontrolledPressed) ?? false,\n [isControlled, pressed, uncontrolledPressed]\n )\n\n const IconComponent = getSourceIcon(\n source as Track.Source,\n resolvedPressed,\n pending\n )\n\n const handlePressedChange = (nextPressed: boolean) => {\n if (!isControlled) setUncontrolledPressed(nextPressed)\n onPressedChange?.(nextPressed)\n }\n\n return (\n <Toggle\n pressed={isControlled ? pressed : undefined}\n defaultPressed={isControlled ? undefined : defaultPressed}\n aria-label={`Toggle ${source}`}\n onPressedChange={handlePressedChange}\n className={cn(\n \"size-9 rounded-lg\",\n \"data-[state=on]:bg-muted data-[state=on]:text-foreground\",\n \"data-[state=off]:bg-destructive/10 data-[state=off]:text-destructive\",\n className\n )}\n {...props}\n >\n <HugeiconsIcon\n icon={IconComponent}\n className={cn(pending && \"animate-spin\")}\n />\n {props.children}\n </Toggle>\n )\n}\n","\"use client\"\n\nimport type { TrackReferenceOrPlaceholder } from \"@livekit/components-react\"\nimport { cn } from \"@workspace/ui/lib/utils\"\nimport { AgentAudioVisualizerBar } from \"./agent-audio-visualizer-bar.js\"\nimport { AgentTrackToggle } from \"./agent-track-toggle.js\"\n\nexport interface AgentTrackControlProps {\n source: \"camera\" | \"microphone\" | \"screen_share\"\n pressed?: boolean\n pending?: boolean\n disabled?: boolean\n className?: string\n audioTrack?: TrackReferenceOrPlaceholder\n onPressedChange?: (pressed: boolean) => void\n}\n\nexport function AgentTrackControl({\n source,\n pressed,\n pending,\n disabled,\n className,\n audioTrack,\n onPressedChange,\n}: AgentTrackControlProps) {\n return (\n <div className={cn(\"flex items-center gap-0 rounded-md\", className)}>\n <AgentTrackToggle\n source={source}\n pressed={pressed}\n pending={pending}\n disabled={disabled}\n onPressedChange={onPressedChange}\n className=\"peer/track group/track focus:z-10 has-[.audiovisualizer]:w-auto has-[.audiovisualizer]:px-3 has-[~_button]:rounded-r-none has-[~_button]:border-r-0 has-[~_button]:pr-2 has-[~_button]:pl-3\"\n >\n {audioTrack && (\n <AgentAudioVisualizerBar\n barCount={3}\n state={pressed ? \"speaking\" : \"disconnected\"}\n audioTrack={pressed ? audioTrack : undefined}\n className=\"audiovisualizer\"\n />\n )}\n </AgentTrackToggle>\n </div>\n )\n}\n","\"use client\"\n\nimport type React from \"react\"\nimport { useSessionContext } from \"@livekit/components-react\"\nimport { CallEnd03Icon } from \"@hugeicons/core-free-icons\"\nimport { HugeiconsIcon } from \"@hugeicons/react\"\nimport { Button } from \"@workspace/ui/components/button\"\n\nexport interface AgentDisconnectButtonProps\n extends React.ComponentProps<\"button\"> {\n onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void\n}\n\nexport function AgentDisconnectButton({\n children,\n onClick,\n className,\n ...props\n}: AgentDisconnectButtonProps) {\n const { end } = useSessionContext()\n\n const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (typeof end === \"function\") end()\n }\n\n return (\n <Button\n variant=\"destructive\"\n size=\"icon\"\n onClick={handleClick}\n className={className}\n {...props}\n >\n {children ?? <HugeiconsIcon icon={CallEnd03Icon} />}\n </Button>\n )\n}\n","\"use client\"\n\nimport { useState, type KeyboardEvent } from \"react\"\nimport { useChat } from \"@livekit/components-react\"\nimport { HugeiconsIcon } from \"@hugeicons/react\"\nimport { Loading03Icon, Navigation03Icon } from \"@hugeicons/core-free-icons\"\nimport { cn } from \"@workspace/ui/lib/utils\"\n\nexport function AgentTranscriptPanel() {\n const { send } = useChat()\n const [message, setMessage] = useState(\"\")\n const [isSending, setIsSending] = useState(false)\n const isDisabled = isSending || message.trim().length === 0\n\n const handleSend = async () => {\n if (isDisabled) return\n try {\n setIsSending(true)\n await send(message.trim())\n setMessage(\"\")\n } catch {\n // silent\n } finally {\n setIsSending(false)\n }\n }\n\n const handleKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault()\n handleSend()\n }\n }\n\n return (\n <div className=\"flex h-full flex-col border-b\">\n {/* Input */}\n <div className=\"flex items-end gap-1 px-2 py-1\">\n <textarea\n autoFocus\n value={message}\n disabled={isSending}\n placeholder=\"Type something...\"\n onKeyDown={handleKeyDown}\n onChange={(e) => setMessage(e.target.value)}\n className=\"field-sizing-content max-h-20 min-h-6 flex-1 resize-none py-1 text-xs [scrollbar-width:thin] focus:outline-none disabled:cursor-not-allowed disabled:opacity-50\"\n />\n <button\n type=\"button\"\n disabled={isDisabled}\n onClick={handleSend}\n title={isSending ? \"Sending…\" : \"Send\"}\n className={cn(\n \"flex size-6 flex-shrink-0 items-center justify-center self-end rounded\",\n isDisabled\n ? \"cursor-not-allowed text-muted-foreground\"\n : \"cursor-pointer text-foreground hover:opacity-80\"\n )}\n >\n {isSending ? (\n <HugeiconsIcon\n icon={Loading03Icon}\n size={18}\n className=\"animate-spin\"\n />\n ) : (\n <HugeiconsIcon\n icon={Navigation03Icon}\n size={18}\n className=\"fill-primary/50 text-primary\"\n />\n )}\n </button>\n </div>\n </div>\n )\n}\n","import { useCallback } from \"react\"\nimport { Track } from \"livekit-client\"\nimport {\n type TrackReference,\n useTrackToggle,\n usePersistentUserChoices,\n useLocalParticipantPermissions,\n useSessionContext,\n} from \"@livekit/components-react\"\n\nconst trackSourceToProtocol = (source: Track.Source) => {\n switch (source) {\n case Track.Source.Camera:\n return 1\n case Track.Source.Microphone:\n return 2\n case Track.Source.ScreenShare:\n return 3\n default:\n return 0\n }\n}\n\nexport interface PublishPermissions {\n camera: boolean\n microphone: boolean\n screenShare: boolean\n data: boolean\n}\n\nexport function usePublishPermissions(): PublishPermissions {\n const localPermissions = useLocalParticipantPermissions()\n\n const canPublishSource = (source: Track.Source) => {\n return (\n !!localPermissions?.canPublish &&\n (localPermissions.canPublishSources.length === 0 ||\n localPermissions.canPublishSources.includes(\n trackSourceToProtocol(source)\n ))\n )\n }\n\n return {\n camera: canPublishSource(Track.Source.Camera),\n microphone: canPublishSource(Track.Source.Microphone),\n screenShare: canPublishSource(Track.Source.ScreenShare),\n data: localPermissions?.canPublishData ?? false,\n }\n}\n\nexport interface UseInputControlsProps {\n saveUserChoices?: boolean\n onDeviceError?: (error: { source: Track.Source; error: Error }) => void\n}\n\nexport interface UseInputControlsReturn {\n microphoneTrack?: TrackReference\n microphoneToggle: ReturnType<typeof useTrackToggle<Track.Source.Microphone>>\n cameraToggle: ReturnType<typeof useTrackToggle<Track.Source.Camera>>\n screenShareToggle: ReturnType<typeof useTrackToggle<Track.Source.ScreenShare>>\n handleAudioDeviceChange: (deviceId: string) => void\n handleVideoDeviceChange: (deviceId: string) => void\n handleMicrophoneDeviceSelectError: (error: Error) => void\n handleCameraDeviceSelectError: (error: Error) => void\n}\n\nexport function useInputControls({\n saveUserChoices = true,\n onDeviceError,\n}: UseInputControlsProps = {}): UseInputControlsReturn {\n const {\n local: { microphoneTrack },\n } = useSessionContext()\n\n const microphoneToggle = useTrackToggle({\n source: Track.Source.Microphone,\n onDeviceError: (error) =>\n onDeviceError?.({ source: Track.Source.Microphone, error }),\n })\n\n const cameraToggle = useTrackToggle({\n source: Track.Source.Camera,\n onDeviceError: (error) =>\n onDeviceError?.({ source: Track.Source.Camera, error }),\n })\n\n const screenShareToggle = useTrackToggle({\n source: Track.Source.ScreenShare,\n onDeviceError: (error) =>\n onDeviceError?.({ source: Track.Source.ScreenShare, error }),\n })\n\n const {\n saveAudioInputEnabled,\n saveVideoInputEnabled,\n saveAudioInputDeviceId,\n saveVideoInputDeviceId,\n } = usePersistentUserChoices({ preventSave: !saveUserChoices })\n\n const handleAudioDeviceChange = useCallback(\n (deviceId: string) => {\n saveAudioInputDeviceId(deviceId ?? \"default\")\n },\n [saveAudioInputDeviceId]\n )\n\n const handleVideoDeviceChange = useCallback(\n (deviceId: string) => {\n saveVideoInputDeviceId(deviceId ?? \"default\")\n },\n [saveVideoInputDeviceId]\n )\n\n const handleToggleCamera = useCallback(\n async (enabled?: boolean) => {\n if (screenShareToggle.enabled) {\n screenShareToggle.toggle(false)\n }\n await cameraToggle.toggle(enabled)\n saveVideoInputEnabled(!cameraToggle.enabled)\n },\n [cameraToggle, screenShareToggle, saveVideoInputEnabled]\n )\n\n const handleToggleMicrophone = useCallback(\n async (enabled?: boolean) => {\n await microphoneToggle.toggle(enabled)\n saveAudioInputEnabled(!microphoneToggle.enabled)\n },\n [microphoneToggle, saveAudioInputEnabled]\n )\n\n const handleToggleScreenShare = useCallback(\n async (enabled?: boolean) => {\n if (cameraToggle.enabled) {\n cameraToggle.toggle(false)\n }\n await screenShareToggle.toggle(enabled)\n },\n [cameraToggle, screenShareToggle]\n )\n\n const handleMicrophoneDeviceSelectError = useCallback(\n (error: Error) =>\n onDeviceError?.({ source: Track.Source.Microphone, error }),\n [onDeviceError]\n )\n\n const handleCameraDeviceSelectError = useCallback(\n (error: Error) => onDeviceError?.({ source: Track.Source.Camera, error }),\n [onDeviceError]\n )\n\n return {\n microphoneTrack,\n cameraToggle: {\n ...cameraToggle,\n toggle: handleToggleCamera,\n },\n microphoneToggle: {\n ...microphoneToggle,\n toggle: handleToggleMicrophone,\n },\n screenShareToggle: {\n ...screenShareToggle,\n toggle: handleToggleScreenShare,\n },\n handleAudioDeviceChange,\n handleVideoDeviceChange,\n handleMicrophoneDeviceSelectError,\n handleCameraDeviceSelectError,\n }\n}\n","import type { ComponentProps } from \"react\"\nimport { useEnsureRoom, useStartAudio } from \"@livekit/components-react\"\nimport { Button } from \"@workspace/ui/components/button\"\nimport type { Room } from \"livekit-client\"\n\n/**\n * Props for the StartAudioButton component.\n */\nexport interface StartAudioButtonProps extends ComponentProps<\"button\"> {\n /**\n * The size of the button.\n * @defaultValue 'default'\n */\n size?: \"default\" | \"sm\" | \"lg\" | \"icon\" | \"icon-sm\" | \"icon-lg\"\n /**\n * The variant of the button.\n * @defaultValue 'default'\n */\n variant?:\n | \"default\"\n | \"destructive\"\n | \"outline\"\n | \"secondary\"\n | \"ghost\"\n | \"link\"\n /**\n * The LiveKit room instance. If not provided, uses the room from context.\n */\n room?: Room\n /**\n * The label text to display on the button.\n */\n label: string\n}\n\n/**\n * A button that allows users to start audio playback.\n * Required for browsers that block autoplay of audio.\n * Only renders when audio playback is blocked.\n *\n * @extends ComponentProps<'button'>\n *\n * @example\n * ```tsx\n * <StartAudioButton label=\"Click to allow audio playback\" />\n * ```\n */\nexport function StartAudioButton({\n size = \"default\",\n variant = \"default\",\n label,\n room,\n ...props\n}: StartAudioButtonProps) {\n const roomEnsured = useEnsureRoom(room)\n const { mergedProps } = useStartAudio({ room: roomEnsured, props })\n return (\n <Button size={size} variant={variant} {...props} {...mergedProps}>\n {label}\n </Button>\n )\n}\n","\"use client\"\n\nimport { useState, useCallback, useEffect, useRef } from \"react\"\nimport { createPortal } from \"react-dom\"\nimport {\n motion,\n useMotionValue,\n useSpring,\n AnimatePresence,\n} from \"motion/react\"\nimport {\n Cursor02Icon,\n ArrowLeft01Icon,\n ArrowRight01Icon,\n Tick01Icon,\n} from \"@hugeicons/core-free-icons\"\nimport { HugeiconsIcon } from \"@hugeicons/react\"\nimport { Button } from \"@workspace/ui/components/button\"\nimport { useElementTracker } from \"../hooks/use-element-tracker.js\"\nimport type { Workflow, Step } from \"../schemas.js\"\n\ninterface WorkflowExecutionProps {\n workflow: Workflow\n attribute?: string\n cursor?: React.ReactNode\n onClose: () => void\n onStepChange?: (index: number) => void\n onError?: (error: string) => void\n}\n\nconst SPRING_CONFIG = { stiffness: 120, damping: 20, mass: 0.8 }\nconst CURSOR_OFFSET = 16\n\nexport function WorkflowExecution({\n workflow,\n attribute = \"data-meridial-id\",\n cursor,\n onClose,\n onStepChange,\n onError,\n}: WorkflowExecutionProps) {\n const [currentIndex, setCurrentIndex] = useState(0)\n\n const steps = workflow.steps\n const currentStep: Step | undefined = steps[currentIndex]\n\n const isFirstStep = currentIndex === 0\n const isLastStep = currentIndex === steps.length - 1\n\n useEffect(() => {\n onStepChange?.(currentIndex)\n }, [currentIndex, onStepChange])\n\n const handleBack = useCallback(() => {\n setCurrentIndex((prev) => Math.max(0, prev - 1))\n }, [])\n\n const handleNext = useCallback(() => {\n setCurrentIndex((prev) => {\n if (prev >= steps.length - 1) {\n onClose()\n return prev\n }\n return prev + 1\n })\n }, [steps.length, onClose])\n\n if (!currentStep) return null\n\n return (\n <ExecutionOverlay\n step={currentStep}\n stepIndex={currentIndex}\n totalSteps={steps.length}\n isFirstStep={isFirstStep}\n isLastStep={isLastStep}\n attribute={attribute}\n cursor={cursor}\n onBack={handleBack}\n onNext={handleNext}\n onError={onError}\n />\n )\n}\n\ninterface ExecutionOverlayProps {\n step: Step\n stepIndex: number\n totalSteps: number\n isFirstStep: boolean\n isLastStep: boolean\n attribute: string\n cursor?: React.ReactNode\n onBack: () => void\n onNext: () => void\n onError?: (msg: string) => void\n}\n\nfunction ExecutionOverlay({\n step,\n stepIndex,\n totalSteps,\n isFirstStep,\n isLastStep,\n attribute,\n cursor,\n onBack,\n onNext,\n onError,\n}: ExecutionOverlayProps) {\n const cssSelector = `[${attribute}=\"${step.elementId}\"]`\n\n const { rect } = useElementTracker({\n selector: cssSelector,\n urlPath: step.urlPath,\n onError: onError\n ? (msg) => {\n if (msg !== null) onError(msg)\n }\n : undefined,\n onClick: onNext,\n })\n\n const hasAnimated = useRef(false)\n const springX = useSpring(useMotionValue(0), SPRING_CONFIG)\n const springY = useSpring(useMotionValue(0), SPRING_CONFIG)\n\n if (rect) {\n const targetX = rect.right + CURSOR_OFFSET\n const targetY = rect.bottom + CURSOR_OFFSET\n\n if (!hasAnimated.current) {\n springX.jump(targetX)\n springY.jump(targetY)\n hasAnimated.current = true\n } else {\n springX.set(targetX)\n springY.set(targetY)\n }\n } else {\n hasAnimated.current = false\n }\n\n return createPortal(\n <AnimatePresence>\n {rect && (\n <motion.div\n data-meridial-ui\n className=\"pointer-events-none fixed z-[99999] flex items-start gap-3\"\n style={{ top: springY, left: springX }}\n initial={{ opacity: 0, scale: 0.6 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.6 }}\n transition={{ duration: 0.2 }}\n >\n {cursor ?? (\n <HugeiconsIcon\n icon={Cursor02Icon}\n strokeWidth={2}\n size={32}\n className=\"mt-1 shrink-0 fill-primary/60 text-primary\"\n />\n )}\n\n <div\n data-meridial-ui\n className=\"pointer-events-auto w-72 overflow-hidden rounded-lg border border-border bg-card shadow-lg\"\n >\n <AnimatePresence mode=\"wait\">\n <motion.div\n key={step.id}\n initial={{ opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -8 }}\n transition={{ duration: 0.2, ease: \"easeInOut\" }}\n className=\"px-4 pt-3 pb-2\"\n >\n <p className=\"text-sm leading-relaxed text-foreground\">\n {step.description || (\n <span className=\"text-muted-foreground italic\">\n No description\n </span>\n )}\n </p>\n <span className=\"mt-1 block text-xs text-muted-foreground\">\n Step {stepIndex + 1} of {totalSteps}\n </span>\n </motion.div>\n </AnimatePresence>\n\n <div\n data-meridial-ui\n className=\"flex justify-end gap-2 border-t px-3 py-2\"\n >\n <Button\n variant=\"outline\"\n size=\"sm\"\n data-meridial-ui\n onClick={onBack}\n disabled={isFirstStep}\n >\n <HugeiconsIcon icon={ArrowLeft01Icon} size={14} />\n Back\n </Button>\n <Button\n variant=\"default\"\n size=\"sm\"\n data-meridial-ui\n onClick={onNext}\n >\n {isLastStep ? (\n <>\n Finish\n <HugeiconsIcon icon={Tick01Icon} size={14} />\n </>\n ) : (\n <>\n Next\n <HugeiconsIcon icon={ArrowRight01Icon} size={14} />\n </>\n )}\n </Button>\n </div>\n </div>\n </motion.div>\n )}\n </AnimatePresence>,\n document.body\n )\n}\n","\"use client\"\n\nimport {\n ThumbsUpIcon,\n ThumbsDownIcon,\n MultiplicationSignIcon,\n} from \"@hugeicons/core-free-icons\"\nimport { HugeiconsIcon } from \"@hugeicons/react\"\nimport { Button } from \"@workspace/ui/components/button\"\n\ntype Outcome = \"POSITIVE\" | \"NEGATIVE\" | \"NEUTRAL\"\n\ninterface OutcomeBarProps {\n onSubmit: (outcome: Outcome) => void\n}\n\nexport function OutcomeBar({ onSubmit }: OutcomeBarProps) {\n return (\n <div className=\"flex items-center justify-between border-b px-3 py-2\">\n <span className=\"text-sm text-muted-foreground\">Did we help?</span>\n <div className=\"flex items-center gap-1\">\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() => onSubmit(\"POSITIVE\")}\n aria-label=\"Yes, this helped\"\n >\n <HugeiconsIcon icon={ThumbsUpIcon} className=\"size-4\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() => onSubmit(\"NEGATIVE\")}\n aria-label=\"No, this didn't help\"\n >\n <HugeiconsIcon icon={ThumbsDownIcon} className=\"size-4\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() => onSubmit(\"NEUTRAL\")}\n aria-label=\"Dismiss\"\n >\n <HugeiconsIcon icon={MultiplicationSignIcon} className=\"size-4\" />\n </Button>\n </div>\n </div>\n )\n}\n","\"use client\"\n\nimport type { SVGProps } from \"react\"\n\nexport function MeridialLogo(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n viewBox=\"0 0 120 120\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M13.281 74.0881L15.7251 69.8003L37.7371 89.6218L83.4484 98.732L102.441 97.8991L83.2815 101.205L35.3287 95.2458L13.281 74.0881Z\"\n fill=\"#009EBC\"\n stroke=\"#009EBC\"\n strokeWidth=\"0.5\"\n />\n <path\n d=\"M88.6986 90.1613L15.4758 69.5032L36.8477 90.3775L83.0111 99.2024L102.445 97.7944L88.6986 90.1613Z\"\n fill=\"url(#fl-g0)\"\n />\n <path\n d=\"M9.59212 38.8499L12.934 33.2319L34.6462 62.7104L86.7973 80.1624L108.813 81.1994L86.6098 82.9394L33.6228 69.8917L9.59212 38.8499Z\"\n fill=\"#009EBC\"\n stroke=\"#009EBC\"\n strokeWidth=\"0.5\"\n />\n <path\n d=\"M94.1734 69.4478L12.7627 33.0524L34.7293 62.7357L86.5626 80.2897L109.003 81.1016L94.1734 69.4478Z\"\n fill=\"url(#fl-g1)\"\n />\n <path\n d=\"M28.3329 17.4895L33.7347 13.5331L45.9901 38.7534L78.8505 55.5351L93.5023 57.1106L78.3627 57.1381L38.9556 40.7981L28.3329 17.4895Z\"\n fill=\"#009EBC\"\n stroke=\"#009EBC\"\n strokeWidth=\"0.5\"\n />\n <path\n d=\"M84.6112 46.7121L33.6396 12.9639L46.1488 38.6786L78.9538 55.4676L93.5814 57.0605L84.6112 46.7121Z\"\n fill=\"url(#fl-g2)\"\n />\n <defs>\n <linearGradient\n id=\"fl-g0\"\n x1=\"57.7988\"\n y1=\"66.4369\"\n x2=\"60.2919\"\n y2=\"100.848\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"#C3F6FF\" />\n <stop offset=\"1\" stopColor=\"#007B92\" />\n </linearGradient>\n <linearGradient\n id=\"fl-g1\"\n x1=\"61.633\"\n y1=\"34.8205\"\n x2=\"60.0227\"\n y2=\"79.3295\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"#B8F3FF\" />\n <stop offset=\"1\" stopColor=\"#007F99\" />\n </linearGradient>\n <linearGradient\n id=\"fl-g2\"\n x1=\"65.4953\"\n y1=\"16.4329\"\n x2=\"61.4521\"\n y2=\"53.5618\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"#D0F8FF\" />\n <stop offset=\"1\" stopColor=\"#009EBC\" />\n </linearGradient>\n </defs>\n </svg>\n )\n}\n","\"use client\"\n\nimport { useState } from \"react\"\nimport { motion, AnimatePresence } from \"motion/react\"\nimport { HugeiconsIcon } from \"@hugeicons/react\"\nimport {\n Call02Icon,\n ViewOffSlashIcon,\n PlayIcon,\n Cancel01Icon,\n StarIcon,\n} from \"@hugeicons/core-free-icons\"\nimport { cn } from \"@workspace/ui/lib/utils\"\nimport { Button } from \"@workspace/ui/components/button\"\nimport type { ApiWorkflow } from \"../schemas.js\"\n\nexport type TriggerPosition =\n | \"top-left\"\n | \"top-right\"\n | \"bottom-left\"\n | \"bottom-right\"\n\ninterface VoiceboxMenuProps {\n workflows: ApiWorkflow[]\n position: TriggerPosition\n playingWorkflowId?: string | null\n playingStepIndex?: number\n onPositionChange: (pos: TriggerPosition) => void\n onHide: () => void\n onAskMeridial: () => void\n onPlayGuide: (wf: ApiWorkflow) => void\n onAbortGuide: () => void\n}\n\nconst POSITION_LABELS: Record<TriggerPosition, string> = {\n \"top-left\": \"Top Left\",\n \"top-right\": \"Top Right\",\n \"bottom-left\": \"Bottom Left\",\n \"bottom-right\": \"Bottom Right\",\n}\n\nconst MENU_PLACEMENT: Record<\n TriggerPosition,\n { originX: number; originY: number; className: string }\n> = {\n \"bottom-right\": {\n originX: 1,\n originY: 1,\n className: \"right-0 bottom-full mb-3\",\n },\n \"bottom-left\": {\n originX: 0,\n originY: 1,\n className: \"left-0 bottom-full mb-3\",\n },\n \"top-right\": {\n originX: 1,\n originY: 0,\n className: \"right-0 top-full mt-3\",\n },\n \"top-left\": {\n originX: 0,\n originY: 0,\n className: \"left-0 top-full mt-3\",\n },\n}\n\nexport function VoiceboxMenu({\n workflows,\n position,\n playingWorkflowId,\n playingStepIndex = 0,\n onPositionChange,\n onHide,\n onAskMeridial,\n onPlayGuide,\n onAbortGuide,\n}: VoiceboxMenuProps) {\n const placement = MENU_PLACEMENT[position]\n const [activeTab, setActiveTab] = useState<\"settings\" | \"guides\">(\"settings\")\n\n // Sort: favorites first, then rest\n const sortedWorkflows = [...workflows].sort((a, b) => {\n if (a.isFavorite && !b.isFavorite) return -1\n if (!a.isFavorite && b.isFavorite) return 1\n return 0\n })\n\n return (\n <motion.div\n data-meridial-ui\n onClick={(e) => e.stopPropagation()}\n className={cn(\n \"absolute z-50 w-72 overflow-hidden rounded-lg border border-border bg-card shadow-lg\",\n \"[&::-webkit-scrollbar]:hidden scrollbar-none\",\n placement.className\n )}\n initial={{ opacity: 0, scale: 0.9 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.9 }}\n style={{\n transformOrigin: `${placement.originX * 100}% ${placement.originY * 100}%`,\n }}\n transition={{ duration: 0.15, ease: \"easeOut\" }}\n >\n {/* Tab bar */}\n <div data-meridial-ui className=\"flex border-b border-border\">\n <button\n data-meridial-ui\n onClick={() => setActiveTab(\"settings\")}\n className={cn(\n \"flex-1 cursor-pointer px-3 py-2 text-xs font-medium tracking-wider transition-colors\",\n activeTab === \"settings\"\n ? \"border-b-2 border-primary text-foreground\"\n : \"text-muted-foreground hover:text-foreground\"\n )}\n >\n Settings\n </button>\n <button\n data-meridial-ui\n onClick={() => setActiveTab(\"guides\")}\n className={cn(\n \"flex-1 cursor-pointer px-3 py-2 text-xs font-medium tracking-wider transition-colors\",\n activeTab === \"guides\"\n ? \"border-b-2 border-primary text-foreground\"\n : \"text-muted-foreground hover:text-foreground\"\n )}\n >\n Guides\n </button>\n </div>\n\n <AnimatePresence mode=\"wait\">\n {activeTab === \"settings\" ? (\n <motion.div\n key=\"settings\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.1 }}\n className=\"flex flex-col gap-0 h-[200px]\"\n >\n {/* Position */}\n <div\n data-meridial-ui\n className=\"border-b border-border px-3 py-2.5\"\n >\n <span className=\"mb-1.5 block text-xs font-medium tracking-wider text-muted-foreground\">\n Position\n </span>\n <div className=\"grid grid-cols-2 gap-1\">\n {(\n Object.entries(POSITION_LABELS) as [TriggerPosition, string][]\n ).map(([pos, label]) => (\n <button\n key={pos}\n data-meridial-ui\n onClick={() => onPositionChange(pos)}\n className={cn(\n \"cursor-pointer rounded px-2 py-1.5 text-xs font-medium transition-colors\",\n pos === position\n ? \"bg-primary text-primary-foreground\"\n : \"bg-muted text-muted-foreground hover:bg-muted/80 hover:text-foreground\"\n )}\n >\n {label}\n </button>\n ))}\n </div>\n </div>\n\n {/* Hide Until Next Visit */}\n <div className=\"flex items-center justify-between border-b border-border px-3 py-2.5\">\n <span className=\"text-xs font-medium tracking-wider text-muted-foreground\">\n Hide Until Next Visit\n </span>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n data-meridial-ui\n onClick={onHide}\n >\n <HugeiconsIcon\n icon={ViewOffSlashIcon}\n size={16}\n className=\"shrink-0\"\n />\n </Button>\n </div>\n\n {/* Ask For Help */}\n <div className=\"flex items-center justify-center p-2\">\n <Button\n data-meridial-ui\n onClick={onAskMeridial}\n variant=\"default\"\n className=\"w-full\"\n >\n <HugeiconsIcon\n icon={Call02Icon}\n size={16}\n className=\"shrink-0\"\n />\n Ask For Help\n </Button>\n </div>\n </motion.div>\n ) : (\n <motion.div\n key=\"guides\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.1 }}\n className=\"h-[200px] overflow-y-auto\"\n >\n {sortedWorkflows.length === 0 ? (\n <div className=\"flex h-full items-center justify-center text-xs text-muted-foreground\">\n No guides available\n </div>\n ) : (\n <div className=\"flex flex-col gap-0.5 p-2\">\n {sortedWorkflows.map((wf) => {\n const isPlaying = wf.id === playingWorkflowId\n const totalSteps = wf.steps.length\n const progressPercent =\n isPlaying && totalSteps > 0\n ? ((playingStepIndex + 1) / totalSteps) * 100\n : 0\n\n return (\n <div\n key={wf.id}\n data-meridial-ui\n className=\"relative overflow-hidden rounded-md px-3 py-2 hover:bg-muted\"\n >\n {/* Progress background fill */}\n {isPlaying && (\n <div\n className=\"absolute inset-0 bg-primary/10 transition-[width] duration-300 ease-out\"\n style={{ width: `${progressPercent}%` }}\n />\n )}\n\n <div className=\"relative flex items-start gap-2\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-1\">\n {wf.isFavorite && (\n <HugeiconsIcon\n icon={StarIcon}\n size={12}\n className=\"shrink-0 fill-amber-400 text-amber-400\"\n />\n )}\n <span className=\"line-clamp-1 text-sm font-medium text-foreground\">\n {wf.name}\n </span>\n </div>\n {wf.description && (\n <p className=\"line-clamp-2 mt-0.5 text-xs text-muted-foreground\">\n {wf.description}\n </p>\n )}\n </div>\n\n <Button\n variant=\"ghost\"\n size=\"icon\"\n data-meridial-ui\n onClick={() =>\n isPlaying ? onAbortGuide() : onPlayGuide(wf)\n }\n >\n <HugeiconsIcon\n icon={isPlaying ? Cancel01Icon : PlayIcon}\n size={16}\n className={\n isPlaying ? \"\" : \"fill-primary/60 text-primary\"\n }\n />\n </Button>\n </div>\n </div>\n )\n })}\n </div>\n )}\n </motion.div>\n )}\n </AnimatePresence>\n </motion.div>\n )\n}\n"],"mappings":"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","names":["useSessionContext","useEnsureRoom","AnimatePresence","motion","RpcError","useRef","useState","useMemo","useEffect","useCallback","Loading03Icon","HugeiconsIcon","React","React","React","React","React","React","IndexGuessBehavior","disabled","Toggle","disabled","Toggle","useEffect","error","jsx","useMemo","useEffect","useRef","useState","jsx","useMemo","useMemo","useState","jsx","jsxs","useState","useMemo","Toggle","jsx","disabled","HugeiconsIcon","jsx","HugeiconsIcon","useState","HugeiconsIcon","Loading03Icon","jsx","jsxs","useState","HugeiconsIcon","Loading03Icon","useCallback","Track","useSessionContext","useSessionContext","Track","error","useCallback","useEnsureRoom","jsx","useEnsureRoom","useState","useCallback","useEffect","useRef","HugeiconsIcon","Fragment","jsx","jsxs","useState","useEffect","useCallback","useRef","HugeiconsIcon","HugeiconsIcon","jsx","jsxs","HugeiconsIcon","jsx","jsxs","useState","motion","AnimatePresence","HugeiconsIcon","jsx","jsxs","useState","motion","AnimatePresence","HugeiconsIcon","Fragment","jsx","jsxs","useState","useRef","useEnsureRoom","useCallback","useEffect","error","RpcError","useSessionContext","motion","AnimatePresence","Toggle","HugeiconsIcon","Loading03Icon","useMemo"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/recorder.tsx","../../ui/src/components/waveform.tsx","../src/hooks/use-recorder-state.ts","../src/hooks/use-audio-recorder.ts","../src/hooks/use-click-capture.ts","../src/hooks/use-workflows.ts","../src/storage.ts","../src/components/action-button.tsx","../src/components/step-badge.tsx","../src/components/workflow-row.tsx","../src/components/workflow-list-panel.tsx","../src/workflow-editor.tsx","../src/hooks/use-position.ts","../src/components/cursor-guide.tsx","../src/components/delete-step-button.tsx"],"sourcesContent":["\"use client\"\n\nimport { useRef, useState, useCallback, useEffect, type RefObject } from \"react\"\nimport { useDraggable } from \"@neodrag/react\"\nimport { motion, AnimatePresence } from \"motion/react\"\nimport { Waveform } from \"@workspace/ui/components/waveform\"\nimport { Separator } from \"@workspace/ui/components/separator\"\nimport { useRecorderState } from \"./hooks/use-recorder-state.js\"\nimport { useAudioRecorder } from \"./hooks/use-audio-recorder.js\"\nimport { useClickCapture } from \"./hooks/use-click-capture.js\"\nimport { useWorkflows } from \"./hooks/use-workflows.js\"\nimport { generateWorkflowName } from \"./constants.js\"\nimport { DragHandle } from \"./components/drag-handle.js\"\nimport { ActionButton } from \"./components/action-button.js\"\nimport { StepBadge } from \"./components/step-badge.js\"\nimport { WorkflowListPanel } from \"./components/workflow-list-panel.js\"\nimport { WorkflowEditor } from \"./workflow-editor.js\"\nimport { saveAudio, deleteAudio } from \"./storage.js\"\nimport {\n workflowSchema,\n apiWorkflowsResponseSchema,\n type Step,\n type Workflow,\n} from \"./schemas.js\"\n\ninterface RecorderProps {\n baseUrl?: string\n publishableKey?: string\n attribute?: string\n cursor?: React.ReactNode\n onError?: (error: string) => void\n}\n\nexport function Recorder({\n baseUrl = \"\",\n publishableKey,\n attribute = \"data-meridial-id\",\n cursor,\n onError,\n}: RecorderProps) {\n // 1) Setup draggable container for the recorder UI\n const draggableRef = useRef<HTMLDivElement>(null)\n const keylessWarned = useRef(false)\n\n useDraggable(draggableRef as RefObject<HTMLElement>)\n\n // 2) Initialize recorder, audio, and workflow state\n const [state, dispatch] = useRecorderState()\n const audio = useAudioRecorder()\n const wf = useWorkflows()\n\n // 3) Local UI state and refs for capture and remote workflows\n const [showPanel, setShowPanel] = useState(false)\n const [editorWorkflowId, setPlayerWorkflowId] = useState<string | null>(null)\n const stepsRef = useRef<Omit<Step, \"id\">[]>([])\n const streamRef = useRef<MediaStream | null>(null)\n const [serverWorkflows, setServerWorkflows] = useState<Workflow[]>([])\n\n const isRecording = state.status === \"recording\"\n const isPaused = state.status === \"paused\"\n\n // 4) Warn once if no publishable key (local-only mode)\n useEffect(() => {\n if (!publishableKey && !keylessWarned.current) {\n keylessWarned.current = true\n console.warn(\n \"[Meridial] No publishableKey provided. Workflows will only be saved locally.\"\n )\n }\n }, [publishableKey])\n\n // 5) Fetch server workflows when authenticated so the panel can show both local and remote workflows\n useEffect(() => {\n if (!publishableKey) return\n\n fetch(`${baseUrl}/api/workflows`, {\n headers: { Authorization: `Bearer ${publishableKey}` },\n })\n .then(async (res) => {\n const data = await res.json()\n if (!res.ok) {\n const msg =\n (data?.error as string) || `Request failed (${res.status})`\n onError?.(msg)\n return\n }\n if (!data.workflows) return\n const parsed = apiWorkflowsResponseSchema.safeParse(data)\n if (!parsed.success) {\n onError?.(\"Invalid workflows response\")\n return\n }\n if (parsed.data.error) {\n onError?.(parsed.data.error)\n return\n }\n const workflows = parsed.data.workflows ?? []\n const mapped: Workflow[] = []\n for (const w of workflows) {\n const workflow = workflowSchema.safeParse({\n id: w.id,\n name: w.name,\n steps: w.steps,\n configured: true,\n createdAt: new Date().toISOString(),\n })\n if (workflow.success) {\n mapped.push(workflow.data)\n } else {\n console.error(\n \"[Meridial] Invalid workflow shape:\",\n w.id,\n workflow.error\n )\n }\n }\n setServerWorkflows(mapped)\n })\n .catch((err) => {\n const msg = err instanceof Error ? err.message : String(err)\n onError?.(msg)\n })\n }, [publishableKey])\n\n // 6) Track last captured element id to avoid duplicate consecutive steps\n const getLastElementId = useCallback(\n () => stepsRef.current[stepsRef.current.length - 1]?.elementId,\n []\n )\n // 7) While recording, capture user clicks as workflow steps\n useClickCapture({\n enabled: isRecording,\n attribute,\n onCapture: (step) => {\n if (getLastElementId() === step.elementId) return\n stepsRef.current.push(step)\n dispatch({ type: \"STEP_CAPTURED\" })\n },\n })\n\n // 8) When microphone stream is ready, start audio recording\n const handleStreamReady = useCallback(\n (stream: MediaStream) => {\n streamRef.current = stream\n audio.start(stream)\n },\n [audio.start]\n )\n\n // 9) Start a fresh recording session and reset captured steps\n const handleStartRecording = useCallback(() => {\n stepsRef.current = []\n dispatch({ type: \"START_RECORDING\" })\n }, [dispatch])\n\n // 10) Handle main action button: open panel, pause, or resume\n const handleActionClick = useCallback(() => {\n if (state.status === \"idle\") {\n setShowPanel((prev) => !prev)\n } else if (state.status === \"recording\") {\n dispatch({ type: \"PAUSE\" })\n audio.pause()\n } else if (state.status === \"paused\") {\n dispatch({ type: \"RESUME\" })\n audio.resume()\n }\n }, [state.status, dispatch, audio])\n\n // 11) Finalize a paused recording into a local workflow and persist audio\n const handleSave = useCallback(async () => {\n dispatch({ type: \"SAVE\" })\n audio.stop()\n\n // 11.1) Generate workflow and audio identifiers\n const id = crypto.randomUUID()\n const audioKey = `audio-${id}`\n // 11.2) Promote captured click steps into full workflow steps with ids\n const steps: Step[] = stepsRef.current.map((s) => ({\n ...s,\n id: crypto.randomUUID(),\n }))\n\n // 11.3) Store the new workflow locally as unconfigured\n wf.addWorkflow({\n id,\n name: generateWorkflowName(),\n steps,\n audioKey,\n configured: false,\n createdAt: new Date().toISOString(),\n })\n\n // 11.4) Persist audio blob shortly after and mark save as complete\n setTimeout(async () => {\n if (audio.audioBlob) {\n await saveAudio(audioKey, audio.audioBlob).catch(() => {})\n }\n dispatch({ type: \"SAVE_COMPLETE\" })\n }, 200)\n }, [dispatch, audio, wf, publishableKey, baseUrl])\n\n // 12) Handle renaming a workflow in the list\n const handleRename = useCallback(\n (id: string, name: string) => {\n wf.updateWorkflow(id, { name })\n },\n [wf]\n )\n\n // 13) Delete a workflow and its associated audio (if present)\n const handleDelete = useCallback(\n (id: string) => {\n const workflow = wf.getWorkflow(id)\n if (workflow?.audioKey) {\n deleteAudio(workflow.audioKey).catch(() => {})\n }\n wf.deleteWorkflow(id)\n },\n [wf]\n )\n\n // 14) Open the inline editor to configure a given workflow\n const handleConfigure = useCallback((id: string) => {\n setPlayerWorkflowId(id)\n setShowPanel(false)\n }, [])\n\n // 15) Close the editor overlay\n const handleEditorClose = useCallback(() => {\n setPlayerWorkflowId(null)\n }, [])\n\n // 16) Refresh workflows when the editor deletes one remotely\n const handleWorkflowDeleted = useCallback(() => {\n wf.refresh()\n }, [wf])\n\n // 17) Merge local + server workflows for the panel, avoiding duplicates\n const allWorkflows = [\n ...wf.visibleWorkflows,\n ...serverWorkflows.filter(\n (sw) => !wf.visibleWorkflows.some((lw) => lw.id === sw.id)\n ),\n ]\n\n return (\n <>\n <div\n ref={draggableRef}\n data-meridial-ui\n className=\"fixed bottom-4 left-4 z-50 w-64 items-stretch rounded border border-border bg-card shadow-md\"\n >\n <AnimatePresence initial={false}>\n {showPanel && state.status === \"idle\" && (\n <motion.div\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: \"auto\", opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n transition={{ duration: 0.24, ease: \"easeOut\" }}\n style={{ overflow: \"hidden\" }}\n >\n <WorkflowListPanel\n workflows={allWorkflows}\n hasMore={wf.hasMore}\n remainingCount={wf.remainingCount}\n onLoadMore={wf.loadMore}\n onRename={handleRename}\n onDelete={handleDelete}\n onConfigure={handleConfigure}\n />\n </motion.div>\n )}\n </AnimatePresence>\n <div data-meridial-ui className=\"flex h-12 items-center\">\n <DragHandle className=\"px-2\" />\n <Separator orientation=\"vertical\" className=\"h-full\" />\n {state.status === \"idle\" ? (\n <button\n data-meridial-ui\n onClick={handleStartRecording}\n className=\"w-full cursor-pointer px-4 text-sm tracking-wide text-foreground uppercase\"\n >\n Start Recording\n </button>\n ) : (\n <div className=\"relative h-full w-full\">\n {isRecording && (\n <Waveform\n data-meridial-ui\n active={isRecording}\n height={48}\n mode=\"static\"\n barWidth={3}\n barGap={1}\n barRadius={1.5}\n onStreamReady={handleStreamReady}\n className=\"text-primary\"\n />\n )}\n\n {isPaused && (\n <button\n data-meridial-ui\n onClick={handleSave}\n className=\"absolute inset-0 flex cursor-pointer items-center justify-center text-sm backdrop-blur-[1px]\"\n >\n SAVE WORKFLOW\n </button>\n )}\n {isRecording && state.stepCount > 0 && (\n <StepBadge count={state.stepCount} />\n )}\n </div>\n )}\n <Separator orientation=\"vertical\" className=\"h-full\" />\n <ActionButton\n openPanel={showPanel}\n state={state}\n hasUnconfigured={wf.hasUnconfigured}\n onClick={handleActionClick}\n />\n </div>\n </div>\n\n {editorWorkflowId && (\n <WorkflowEditor\n workflowId={editorWorkflowId}\n workflow={allWorkflows.find((w) => w.id === editorWorkflowId)}\n publishableKey={publishableKey}\n cursor={cursor}\n onClose={handleEditorClose}\n onWorkflowDeleted={handleWorkflowDeleted}\n onError={onError}\n />\n )}\n </>\n )\n}\n","\"use client\"\n\nimport { useEffect, useRef, type HTMLAttributes } from \"react\"\n\nimport { cn } from \"@workspace/ui/lib/utils\"\n\nexport type WaveformProps = HTMLAttributes<HTMLDivElement> & {\n active?: boolean\n processing?: boolean\n deviceId?: string\n barWidth?: number\n barHeight?: number\n barGap?: number\n barRadius?: number\n barColor?: string\n fadeEdges?: boolean\n fadeWidth?: number\n height?: string | number\n sensitivity?: number\n smoothingTimeConstant?: number\n fftSize?: number\n historySize?: number\n updateRate?: number\n mode?: \"scrolling\" | \"static\"\n onError?: (error: Error) => void\n onStreamReady?: (stream: MediaStream) => void\n onStreamEnd?: () => void\n}\n\nexport const Waveform = ({\n active = false,\n processing = false,\n deviceId,\n barWidth = 3,\n barGap = 1,\n barRadius = 1.5,\n barColor,\n fadeEdges = true,\n fadeWidth = 24,\n barHeight: baseBarHeight = 4,\n height = 64,\n sensitivity = 1,\n smoothingTimeConstant = 0.8,\n fftSize = 256,\n historySize = 60,\n updateRate = 30,\n mode = \"static\",\n onError,\n onStreamReady,\n onStreamEnd,\n className,\n ...props\n}: WaveformProps) => {\n const canvasRef = useRef<HTMLCanvasElement>(null)\n const containerRef = useRef<HTMLDivElement>(null)\n const historyRef = useRef<number[]>([])\n const analyserRef = useRef<AnalyserNode | null>(null)\n const audioContextRef = useRef<AudioContext | null>(null)\n const streamRef = useRef<MediaStream | null>(null)\n const animationRef = useRef<number>(0)\n const lastUpdateRef = useRef<number>(0)\n const processingAnimationRef = useRef<number | null>(null)\n const lastActiveDataRef = useRef<number[]>([])\n const transitionProgressRef = useRef(0)\n const staticBarsRef = useRef<number[]>([])\n const needsRedrawRef = useRef(true)\n const gradientCacheRef = useRef<CanvasGradient | null>(null)\n const lastWidthRef = useRef(0)\n\n const heightStyle = typeof height === \"number\" ? `${height}px` : height\n\n // Handle canvas resizing\n useEffect(() => {\n const canvas = canvasRef.current\n const container = containerRef.current\n if (!canvas || !container) return\n\n const resizeObserver = new ResizeObserver(() => {\n const rect = container.getBoundingClientRect()\n const dpr = window.devicePixelRatio || 1\n\n canvas.width = rect.width * dpr\n canvas.height = rect.height * dpr\n canvas.style.width = `${rect.width}px`\n canvas.style.height = `${rect.height}px`\n\n const ctx = canvas.getContext(\"2d\")\n if (ctx) {\n ctx.scale(dpr, dpr)\n }\n\n gradientCacheRef.current = null\n lastWidthRef.current = rect.width\n needsRedrawRef.current = true\n })\n\n resizeObserver.observe(container)\n return () => resizeObserver.disconnect()\n }, [])\n\n useEffect(() => {\n if (processing && !active) {\n let time = 0\n transitionProgressRef.current = 0\n\n const animateProcessing = () => {\n time += 0.03\n transitionProgressRef.current = Math.min(\n 1,\n transitionProgressRef.current + 0.02\n )\n\n const processingData = []\n const barCount = Math.floor(\n (containerRef.current?.getBoundingClientRect().width || 200) /\n (barWidth + barGap)\n )\n\n if (mode === \"static\") {\n const halfCount = Math.floor(barCount / 2)\n\n for (let i = 0; i < barCount; i++) {\n const normalizedPosition = (i - halfCount) / halfCount\n const centerWeight = 1 - Math.abs(normalizedPosition) * 0.4\n\n const wave1 = Math.sin(time * 1.5 + normalizedPosition * 3) * 0.25\n const wave2 = Math.sin(time * 0.8 - normalizedPosition * 2) * 0.2\n const wave3 = Math.cos(time * 2 + normalizedPosition) * 0.15\n const combinedWave = wave1 + wave2 + wave3\n const processingValue = (0.2 + combinedWave) * centerWeight\n\n let finalValue = processingValue\n if (\n lastActiveDataRef.current.length > 0 &&\n transitionProgressRef.current < 1\n ) {\n const lastDataIndex = Math.min(\n i,\n lastActiveDataRef.current.length - 1\n )\n const lastValue = lastActiveDataRef.current[lastDataIndex] || 0\n finalValue =\n lastValue * (1 - transitionProgressRef.current) +\n processingValue * transitionProgressRef.current\n }\n\n processingData.push(Math.max(0.05, Math.min(1, finalValue)))\n }\n } else {\n for (let i = 0; i < barCount; i++) {\n const normalizedPosition = (i - barCount / 2) / (barCount / 2)\n const centerWeight = 1 - Math.abs(normalizedPosition) * 0.4\n\n const wave1 = Math.sin(time * 1.5 + i * 0.15) * 0.25\n const wave2 = Math.sin(time * 0.8 - i * 0.1) * 0.2\n const wave3 = Math.cos(time * 2 + i * 0.05) * 0.15\n const combinedWave = wave1 + wave2 + wave3\n const processingValue = (0.2 + combinedWave) * centerWeight\n\n let finalValue = processingValue\n if (\n lastActiveDataRef.current.length > 0 &&\n transitionProgressRef.current < 1\n ) {\n const lastDataIndex = Math.floor(\n (i / barCount) * lastActiveDataRef.current.length\n )\n const lastValue = lastActiveDataRef.current[lastDataIndex] || 0\n finalValue =\n lastValue * (1 - transitionProgressRef.current) +\n processingValue * transitionProgressRef.current\n }\n\n processingData.push(Math.max(0.05, Math.min(1, finalValue)))\n }\n }\n\n if (mode === \"static\") {\n staticBarsRef.current = processingData\n } else {\n historyRef.current = processingData\n }\n\n needsRedrawRef.current = true\n processingAnimationRef.current =\n requestAnimationFrame(animateProcessing)\n }\n\n animateProcessing()\n\n return () => {\n if (processingAnimationRef.current) {\n cancelAnimationFrame(processingAnimationRef.current)\n }\n }\n } else if (!active && !processing) {\n const hasData =\n mode === \"static\"\n ? staticBarsRef.current.length > 0\n : historyRef.current.length > 0\n\n if (hasData) {\n let fadeProgress = 0\n const fadeToIdle = () => {\n fadeProgress += 0.03\n if (fadeProgress < 1) {\n if (mode === \"static\") {\n staticBarsRef.current = staticBarsRef.current.map(\n (value) => value * (1 - fadeProgress)\n )\n } else {\n historyRef.current = historyRef.current.map(\n (value) => value * (1 - fadeProgress)\n )\n }\n needsRedrawRef.current = true\n requestAnimationFrame(fadeToIdle)\n } else {\n if (mode === \"static\") {\n staticBarsRef.current = []\n } else {\n historyRef.current = []\n }\n }\n }\n fadeToIdle()\n }\n }\n }, [processing, active, barWidth, barGap, mode])\n\n // Handle microphone setup and teardown\n useEffect(() => {\n if (!active) {\n if (streamRef.current) {\n streamRef.current.getTracks().forEach((track) => track.stop())\n streamRef.current = null\n onStreamEnd?.()\n }\n if (\n audioContextRef.current &&\n audioContextRef.current.state !== \"closed\"\n ) {\n audioContextRef.current.close()\n audioContextRef.current = null\n }\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current)\n animationRef.current = 0\n }\n return\n }\n\n const setupMicrophone = async () => {\n try {\n const stream = await navigator.mediaDevices.getUserMedia({\n audio: deviceId\n ? {\n deviceId: { exact: deviceId },\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n }\n : {\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n },\n })\n streamRef.current = stream\n onStreamReady?.(stream)\n\n const AudioContextConstructor =\n window.AudioContext ||\n (window as unknown as { webkitAudioContext: typeof AudioContext })\n .webkitAudioContext\n const audioContext = new AudioContextConstructor()\n const analyser = audioContext.createAnalyser()\n analyser.fftSize = fftSize\n analyser.smoothingTimeConstant = smoothingTimeConstant\n\n const source = audioContext.createMediaStreamSource(stream)\n source.connect(analyser)\n\n audioContextRef.current = audioContext\n analyserRef.current = analyser\n\n // Clear history when starting\n historyRef.current = []\n } catch (error) {\n onError?.(error as Error)\n }\n }\n\n setupMicrophone()\n\n return () => {\n if (streamRef.current) {\n streamRef.current.getTracks().forEach((track) => track.stop())\n streamRef.current = null\n onStreamEnd?.()\n }\n if (\n audioContextRef.current &&\n audioContextRef.current.state !== \"closed\"\n ) {\n audioContextRef.current.close()\n audioContextRef.current = null\n }\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current)\n animationRef.current = 0\n }\n }\n }, [\n active,\n deviceId,\n fftSize,\n smoothingTimeConstant,\n onError,\n onStreamReady,\n onStreamEnd,\n ])\n\n // Animation loop\n useEffect(() => {\n const canvas = canvasRef.current\n if (!canvas) return\n\n const ctx = canvas.getContext(\"2d\")\n if (!ctx) return\n\n let rafId: number\n\n const animate = (currentTime: number) => {\n // Render waveform\n const rect = canvas.getBoundingClientRect()\n\n // Update audio data if active\n if (active && currentTime - lastUpdateRef.current > updateRate) {\n lastUpdateRef.current = currentTime\n\n if (analyserRef.current) {\n const dataArray = new Uint8Array(\n analyserRef.current.frequencyBinCount\n )\n analyserRef.current.getByteFrequencyData(dataArray)\n\n if (mode === \"static\") {\n // For static mode, update bars in place\n const startFreq = Math.floor(dataArray.length * 0.05)\n const endFreq = Math.floor(dataArray.length * 0.4)\n const relevantData = dataArray.slice(startFreq, endFreq)\n\n const barCount = Math.floor(rect.width / (barWidth + barGap))\n const halfCount = Math.floor(barCount / 2)\n const newBars: number[] = []\n\n // Mirror the data for symmetric display\n for (let i = halfCount - 1; i >= 0; i--) {\n const dataIndex = Math.floor(\n (i / halfCount) * relevantData.length\n )\n const source = relevantData[dataIndex] ?? 0\n const value = Math.min(1, (source / 255) * sensitivity)\n newBars.push(Math.max(0.05, value))\n }\n\n for (let i = 0; i < halfCount; i++) {\n const dataIndex = Math.floor(\n (i / halfCount) * relevantData.length\n )\n const source = relevantData[dataIndex] ?? 0\n const value = Math.min(1, (source / 255) * sensitivity)\n newBars.push(Math.max(0.05, value))\n }\n\n staticBarsRef.current = newBars\n lastActiveDataRef.current = newBars\n } else {\n // Scrolling mode - original behavior\n let sum = 0\n const startFreq = Math.floor(dataArray.length * 0.05)\n const endFreq = Math.floor(dataArray.length * 0.4)\n const relevantData = dataArray.slice(startFreq, endFreq)\n\n for (let i = 0; i < relevantData.length; i++) {\n const sample = relevantData[i] ?? 0\n sum += sample\n }\n const average =\n (sum / (relevantData.length || 1) / 255) * sensitivity\n\n // Add to history\n historyRef.current.push(Math.min(1, Math.max(0.05, average)))\n lastActiveDataRef.current = [...historyRef.current]\n\n // Maintain history size\n if (historyRef.current.length > historySize) {\n historyRef.current.shift()\n }\n }\n needsRedrawRef.current = true\n }\n }\n\n // Only redraw if needed\n if (!needsRedrawRef.current && !active) {\n rafId = requestAnimationFrame(animate)\n return\n }\n\n needsRedrawRef.current = active\n ctx.clearRect(0, 0, rect.width, rect.height)\n\n const computedBarColor =\n barColor ||\n (() => {\n const style = getComputedStyle(canvas)\n // Try to get the computed color value directly\n const color = style.color\n return color || \"#000\"\n })()\n\n const step = barWidth + barGap\n const barCount = Math.floor(rect.width / step)\n const centerY = rect.height / 2\n\n // Draw bars based on mode\n if (mode === \"static\") {\n // Static mode - bars in fixed positions\n const dataToRender = processing\n ? staticBarsRef.current\n : active\n ? staticBarsRef.current\n : staticBarsRef.current.length > 0\n ? staticBarsRef.current\n : []\n\n for (let i = 0; i < barCount && i < dataToRender.length; i++) {\n const value = dataToRender[i] || 0.1\n const x = i * step\n const barHeight = Math.max(baseBarHeight, value * rect.height * 0.8)\n const y = centerY - barHeight / 2\n\n ctx.fillStyle = computedBarColor\n ctx.globalAlpha = 0.4 + value * 0.6\n\n if (barRadius > 0) {\n ctx.beginPath()\n ctx.roundRect(x, y, barWidth, barHeight, barRadius)\n ctx.fill()\n } else {\n ctx.fillRect(x, y, barWidth, barHeight)\n }\n }\n } else {\n // Scrolling mode - original behavior\n for (let i = 0; i < barCount && i < historyRef.current.length; i++) {\n const dataIndex = historyRef.current.length - 1 - i\n const value = historyRef.current[dataIndex] || 0.1\n const x = rect.width - (i + 1) * step\n const barHeight = Math.max(baseBarHeight, value * rect.height * 0.8)\n const y = centerY - barHeight / 2\n\n ctx.fillStyle = computedBarColor\n ctx.globalAlpha = 0.4 + value * 0.6\n\n if (barRadius > 0) {\n ctx.beginPath()\n ctx.roundRect(x, y, barWidth, barHeight, barRadius)\n ctx.fill()\n } else {\n ctx.fillRect(x, y, barWidth, barHeight)\n }\n }\n }\n\n // Apply edge fading\n if (fadeEdges && fadeWidth > 0 && rect.width > 0) {\n // Cache gradient if width hasn't changed\n if (!gradientCacheRef.current || lastWidthRef.current !== rect.width) {\n const gradient = ctx.createLinearGradient(0, 0, rect.width, 0)\n const fadePercent = Math.min(0.3, fadeWidth / rect.width)\n\n // destination-out: removes destination where source alpha is high\n // We want: fade edges out, keep center solid\n // Left edge: start opaque (1) = remove, fade to transparent (0) = keep\n gradient.addColorStop(0, \"rgba(255,255,255,1)\")\n gradient.addColorStop(fadePercent, \"rgba(255,255,255,0)\")\n // Center stays transparent = keep everything\n gradient.addColorStop(1 - fadePercent, \"rgba(255,255,255,0)\")\n // Right edge: fade from transparent (0) = keep to opaque (1) = remove\n gradient.addColorStop(1, \"rgba(255,255,255,1)\")\n\n gradientCacheRef.current = gradient\n lastWidthRef.current = rect.width\n }\n\n ctx.globalCompositeOperation = \"destination-out\"\n ctx.fillStyle = gradientCacheRef.current\n ctx.fillRect(0, 0, rect.width, rect.height)\n ctx.globalCompositeOperation = \"source-over\"\n }\n\n ctx.globalAlpha = 1\n\n rafId = requestAnimationFrame(animate)\n }\n\n rafId = requestAnimationFrame(animate)\n\n return () => {\n if (rafId) {\n cancelAnimationFrame(rafId)\n }\n }\n }, [\n active,\n processing,\n sensitivity,\n updateRate,\n historySize,\n barWidth,\n baseBarHeight,\n barGap,\n barRadius,\n barColor,\n fadeEdges,\n fadeWidth,\n mode,\n ])\n\n return (\n <div\n className={cn(\"relative h-full w-full\", className)}\n ref={containerRef}\n style={{ height: heightStyle }}\n aria-label={\n active\n ? \"Live audio waveform\"\n : processing\n ? \"Processing audio\"\n : \"Audio waveform idle\"\n }\n role=\"img\"\n {...props}\n >\n {!active && !processing && (\n <div className=\"absolute top-1/2 right-0 left-0 -translate-y-1/2 border-t-2 border-dotted border-muted-foreground/20\" />\n )}\n <canvas\n className=\"block h-full w-full\"\n ref={canvasRef}\n aria-hidden=\"true\"\n />\n </div>\n )\n}\n","import { useReducer } from \"react\"\n\ntype RecorderState =\n | { status: \"idle\" }\n | { status: \"recording\"; stepCount: number; startTime: number }\n | { status: \"paused\"; stepCount: number }\n | { status: \"saving\" }\n\ntype RecorderAction =\n | { type: \"START_RECORDING\" }\n | { type: \"STEP_CAPTURED\" }\n | { type: \"PAUSE\" }\n | { type: \"RESUME\" }\n | { type: \"SAVE\" }\n | { type: \"SAVE_COMPLETE\" }\n\nfunction recorderReducer(\n state: RecorderState,\n action: RecorderAction\n): RecorderState {\n switch (action.type) {\n case \"START_RECORDING\":\n return { status: \"recording\", stepCount: 0, startTime: Date.now() }\n case \"STEP_CAPTURED\":\n if (state.status === \"recording\") {\n return { ...state, stepCount: state.stepCount + 1 }\n }\n return state\n case \"PAUSE\":\n if (state.status === \"recording\") {\n return { status: \"paused\", stepCount: state.stepCount }\n }\n return state\n case \"RESUME\":\n if (state.status === \"paused\") {\n return {\n status: \"recording\",\n stepCount: state.stepCount,\n startTime: Date.now(),\n }\n }\n return state\n case \"SAVE\":\n if (state.status === \"paused\") {\n return { status: \"saving\" }\n }\n return state\n case \"SAVE_COMPLETE\":\n return { status: \"idle\" }\n default:\n return state\n }\n}\n\nconst initialState: RecorderState = { status: \"idle\" }\n\nexport function useRecorderState() {\n return useReducer(recorderReducer, initialState)\n}\n\nexport type { RecorderState, RecorderAction }\n","import { useRef, useState, useCallback } from \"react\"\n\nexport function useAudioRecorder() {\n const mediaRecorderRef = useRef<MediaRecorder | null>(null)\n const chunksRef = useRef<Blob[]>([])\n const [audioBlob, setAudioBlob] = useState<Blob | null>(null)\n\n const start = useCallback((stream: MediaStream) => {\n chunksRef.current = []\n setAudioBlob(null)\n const recorder = new MediaRecorder(stream)\n recorder.ondataavailable = (e) => {\n if (e.data.size > 0) {\n chunksRef.current.push(e.data)\n }\n }\n recorder.onstop = () => {\n const blob = new Blob(chunksRef.current, { type: \"audio/webm\" })\n setAudioBlob(blob)\n }\n recorder.start()\n mediaRecorderRef.current = recorder\n }, [])\n\n const stop = useCallback(() => {\n if (\n mediaRecorderRef.current &&\n mediaRecorderRef.current.state !== \"inactive\"\n ) {\n mediaRecorderRef.current.stop()\n }\n }, [])\n\n const pause = useCallback(() => {\n if (\n mediaRecorderRef.current &&\n mediaRecorderRef.current.state === \"recording\"\n ) {\n mediaRecorderRef.current.pause()\n }\n }, [])\n\n const resume = useCallback(() => {\n if (\n mediaRecorderRef.current &&\n mediaRecorderRef.current.state === \"paused\"\n ) {\n mediaRecorderRef.current.resume()\n }\n }, [])\n\n return { start, stop, pause, resume, audioBlob } as const\n}\n","import { useEffect, useCallback } from \"react\"\nimport type { Step } from \"../schemas.js\"\n\nfunction getElementLabel(el: HTMLElement): string {\n const ariaLabel = el.getAttribute(\"aria-label\")\n if (ariaLabel) return ariaLabel\n\n const placeholder = el.getAttribute(\"placeholder\")\n if (placeholder) return placeholder\n\n const text = el.innerText?.trim()\n if (text && text.length <= 50) return text\n\n const tag = el.tagName.toLowerCase()\n return el.id ? `${tag}#${el.id}` : tag\n}\n\ninterface UseClickCaptureOptions {\n enabled: boolean\n attribute: string\n onCapture: (step: Omit<Step, \"id\">) => void\n}\n\nexport function useClickCapture({\n enabled,\n attribute,\n onCapture,\n}: UseClickCaptureOptions) {\n const handleClick = useCallback(\n (e: MouseEvent) => {\n const target = e.target as HTMLElement | null\n\n if (!target || target.closest(\"[data-meridial-ui]\")) return\n\n const el = target.closest(`[${attribute}]`) as HTMLElement | null\n if (!el) return // skip — element not stamped by SWC plugin\n\n const elementId = el.getAttribute(attribute)! // bare ID only\n const elementLabel = getElementLabel(el)\n const urlPath = window.location.pathname + window.location.search\n\n onCapture({ elementId, elementLabel, urlPath, description: \"\" })\n },\n [attribute, onCapture]\n )\n\n useEffect(() => {\n if (!enabled) return\n\n document.addEventListener(\"click\", handleClick, true)\n return () => {\n document.removeEventListener(\"click\", handleClick, true)\n }\n }, [enabled, handleClick])\n}\n","import { useState, useCallback, useMemo } from \"react\"\nimport type { Workflow } from \"../schemas.js\"\nimport * as storage from \"../storage.js\"\n\nconst PAGE_SIZE = 5\n\nexport function useWorkflows() {\n const [workflows, setWorkflows] = useState<Workflow[]>(() =>\n storage.loadWorkflows()\n )\n const [visibleCount, setVisibleCount] = useState(PAGE_SIZE)\n\n const sorted = useMemo(() => {\n const unconfigured = workflows.filter((w) => !w.configured)\n const configured = workflows.filter((w) => w.configured)\n return [...unconfigured, ...configured]\n }, [workflows])\n\n const hasUnconfigured = useMemo(\n () => workflows.some((w) => !w.configured),\n [workflows]\n )\n\n const visibleWorkflows = useMemo(\n () => sorted.slice(0, visibleCount),\n [sorted, visibleCount]\n )\n\n const hasMore = sorted.length > visibleCount\n const remainingCount = sorted.length - visibleCount\n\n const loadMore = useCallback(() => {\n setVisibleCount((c) => c + PAGE_SIZE)\n }, [])\n\n const refresh = useCallback(() => {\n setWorkflows(storage.loadWorkflows())\n }, [])\n\n const addWorkflow = useCallback((workflow: Workflow) => {\n storage.addWorkflow(workflow)\n setWorkflows(storage.loadWorkflows())\n }, [])\n\n const updateWorkflow = useCallback(\n (id: string, updates: Partial<Workflow>) => {\n storage.updateWorkflow(id, updates)\n setWorkflows(storage.loadWorkflows())\n },\n []\n )\n\n const deleteWorkflow = useCallback((id: string) => {\n storage.deleteWorkflow(id)\n setWorkflows(storage.loadWorkflows())\n }, [])\n\n const getWorkflow = useCallback((id: string) => {\n return storage.getWorkflow(id)\n }, [])\n\n return {\n workflows,\n hasUnconfigured,\n visibleWorkflows,\n loadMore,\n hasMore,\n remainingCount,\n addWorkflow,\n updateWorkflow,\n deleteWorkflow,\n getWorkflow,\n refresh,\n } as const\n}\n","import { z } from \"zod\"\nimport { STORAGE_KEYS } from \"./constants.js\"\nimport { workflowSchema, type Workflow } from \"./schemas.js\"\n\nconst workflowsArraySchema = z.array(workflowSchema)\n\n// --- localStorage: Workflows ---\n\nconst isBrowser = typeof window !== \"undefined\"\n\nexport function loadWorkflows(): Workflow[] {\n if (!isBrowser) return []\n try {\n const raw = localStorage.getItem(STORAGE_KEYS.workflows)\n if (!raw) return []\n const parsed: unknown = JSON.parse(raw)\n const result = workflowsArraySchema.safeParse(parsed)\n if (!result.success) {\n if (Array.isArray(parsed)) {\n const valid = parsed.filter(\n (item) => workflowSchema.safeParse(item).success\n )\n const validWorkflows = valid.map((item) => workflowSchema.parse(item))\n saveWorkflows(validWorkflows)\n return validWorkflows\n }\n localStorage.removeItem(STORAGE_KEYS.workflows)\n return []\n }\n return result.data\n } catch {\n localStorage.removeItem(STORAGE_KEYS.workflows)\n return []\n }\n}\n\nexport function saveWorkflows(workflows: Workflow[]): void {\n if (!isBrowser) return\n localStorage.setItem(STORAGE_KEYS.workflows, JSON.stringify(workflows))\n}\n\nexport function addWorkflow(workflow: Workflow): void {\n const workflows = loadWorkflows()\n workflows.push(workflow)\n saveWorkflows(workflows)\n}\n\nexport function updateWorkflow(id: string, updates: Partial<Workflow>): void {\n const workflows = loadWorkflows()\n const index = workflows.findIndex((w) => w.id === id)\n if (index !== -1) {\n workflows[index] = { ...workflows[index]!, ...updates }\n saveWorkflows(workflows)\n }\n}\n\nexport function deleteWorkflow(id: string): void {\n const workflows = loadWorkflows().filter((w) => w.id !== id)\n saveWorkflows(workflows)\n}\n\nexport function getWorkflow(id: string): Workflow | undefined {\n return loadWorkflows().find((w) => w.id === id)\n}\n\n// --- IndexedDB: Audio ---\n\nconst DB_NAME = \"meridial\"\nconst AUDIO_STORE = \"audio\"\nconst DB_VERSION = 1\n\nfunction openDB(): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const request = indexedDB.open(DB_NAME, DB_VERSION)\n request.onupgradeneeded = () => {\n const db = request.result\n if (!db.objectStoreNames.contains(AUDIO_STORE)) {\n db.createObjectStore(AUDIO_STORE)\n }\n }\n request.onsuccess = () => resolve(request.result)\n request.onerror = () => reject(request.error)\n })\n}\n\nexport async function saveAudio(key: string, blob: Blob): Promise<void> {\n const db = await openDB()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(AUDIO_STORE, \"readwrite\")\n tx.objectStore(AUDIO_STORE).put(blob, key)\n tx.oncomplete = () => resolve()\n tx.onerror = () => reject(tx.error)\n })\n}\n\nexport async function loadAudio(key: string): Promise<Blob | undefined> {\n const db = await openDB()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(AUDIO_STORE, \"readonly\")\n const request = tx.objectStore(AUDIO_STORE).get(key)\n request.onsuccess = () => resolve(request.result as Blob | undefined)\n request.onerror = () => reject(request.error)\n })\n}\n\nexport async function deleteAudio(key: string): Promise<void> {\n const db = await openDB()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(AUDIO_STORE, \"readwrite\")\n tx.objectStore(AUDIO_STORE).delete(key)\n tx.oncomplete = () => resolve()\n tx.onerror = () => reject(tx.error)\n })\n}\n","\"use client\"\n\nimport { HugeiconsIcon } from \"@hugeicons/react\"\nimport {\n ArrowDown01Icon,\n Alert01Icon,\n StopIcon,\n PlayIcon,\n Loading03Icon,\n} from \"@hugeicons/core-free-icons\"\nimport { cn } from \"@workspace/ui/lib/utils\"\nimport type { RecorderState } from \"../hooks/use-recorder-state.js\"\n\ninterface ActionButtonProps {\n state: RecorderState\n openPanel: boolean\n hasUnconfigured: boolean\n onClick: () => void\n}\n\nexport function ActionButton({\n state,\n openPanel,\n hasUnconfigured,\n onClick,\n}: ActionButtonProps) {\n let icon = ArrowDown01Icon\n let className = \"text-muted-foreground\"\n let spin = false\n\n if (state.status === \"idle\") {\n if (hasUnconfigured) {\n icon = Alert01Icon\n className = \"text-amber-500 fill-amber-500/20\"\n } else {\n icon = ArrowDown01Icon\n className = cn(\n \"fill-none text-muted-foreground transition-transform duration-200\",\n openPanel ? \"rotate-180\" : \"rotate-0\"\n )\n }\n } else if (state.status === \"recording\") {\n icon = StopIcon\n className = \"text-red-500 fill-destructive/50\"\n } else if (state.status === \"paused\") {\n icon = PlayIcon\n className = \"text-emerald-500 fill-emerald-500/20\"\n } else if (state.status === \"saving\") {\n icon = Loading03Icon\n className = \"text-muted-foreground\"\n spin = true\n }\n\n return (\n <button\n data-meridial-ui\n onClick={onClick}\n disabled={state.status === \"saving\"}\n className={cn(\"flex items-center justify-center px-2.5\", className, {\n \"cursor-not-allowed\": state.status === \"saving\",\n \"cursor-pointer hover:opacity-80 disabled:cursor-not-allowed disabled:opacity-50\":\n state.status !== \"saving\",\n })}\n >\n <HugeiconsIcon\n icon={icon}\n size={18}\n className={spin ? \"animate-spin\" : \"\"}\n fill={className}\n />\n </button>\n )\n}\n","\"use client\"\n\ninterface StepBadgeProps {\n count: number\n}\n\nexport function StepBadge({ count }: StepBadgeProps) {\n return (\n <div\n data-meridial-ui\n className=\"absolute right-1 bottom-1 flex h-5 min-w-5 items-center justify-center rounded-full bg-foreground px-1 text-xs font-medium text-background\"\n >\n {count}\n </div>\n )\n}\n","\"use client\"\n\nimport { useState, useRef, useEffect } from \"react\"\nimport { cn } from \"@workspace/ui/lib/utils\"\nimport { HugeiconsIcon } from \"@hugeicons/react\"\nimport {\n Alert01Icon,\n CheckmarkCircle02Icon,\n Delete01Icon,\n Settings01Icon,\n} from \"@hugeicons/core-free-icons\"\nimport type { Workflow } from \"../schemas.js\"\n\ninterface WorkflowRowProps {\n workflow: Workflow\n onRename: (id: string, name: string) => void\n onDelete: (id: string) => void\n onConfigure: (id: string) => void\n}\n\nexport function WorkflowRow({\n workflow,\n onRename,\n onDelete,\n onConfigure,\n}: WorkflowRowProps) {\n const [editing, setEditing] = useState(false)\n const [name, setName] = useState(workflow.name)\n const inputRef = useRef<HTMLInputElement>(null)\n\n useEffect(() => {\n if (editing && inputRef.current) {\n inputRef.current.focus()\n inputRef.current.select()\n }\n }, [editing])\n\n const commitRename = () => {\n const trimmed = name.trim()\n if (trimmed && trimmed !== workflow.name) {\n onRename(workflow.id, trimmed)\n } else {\n setName(workflow.name)\n }\n setEditing(false)\n }\n\n return (\n <div\n data-meridial-ui\n className=\"flex items-center gap-2 px-3 py-2 hover:bg-muted/50\"\n >\n <HugeiconsIcon\n icon={workflow.configured ? CheckmarkCircle02Icon : Alert01Icon}\n size={16}\n className={\n workflow.configured\n ? \"shrink-0 fill-green-500/20 text-green-500\"\n : \"shrink-0 fill-amber-500/20 text-amber-500\"\n }\n />\n\n {editing ? (\n <input\n ref={inputRef}\n data-meridial-ui\n value={name}\n onChange={(e) => setName(e.target.value)}\n onBlur={commitRename}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") commitRename()\n if (e.key === \"Escape\") {\n setName(workflow.name)\n setEditing(false)\n }\n }}\n className=\"min-w-0 flex-1 rounded border border-border bg-background px-1.5 py-0.5 text-sm outline-none\"\n />\n ) : (\n <button\n data-meridial-ui\n onClick={() => {\n if (workflow.configured) return\n setEditing(true)\n }}\n className=\"min-w-0 flex-1 cursor-pointer truncate text-left text-sm\"\n >\n {workflow.name}\n </button>\n )}\n\n {/* Only show delete button for unconfigured workflows to delete unconfigured workflows from local storage, workflow deletion is only possible via the dashboard*/}\n {!workflow.configured && (\n <button\n data-meridial-ui\n onClick={() => onDelete(workflow.id)}\n className=\"shrink-0 cursor-pointer p-0.5 text-muted-foreground hover:text-destructive\"\n >\n <HugeiconsIcon icon={Delete01Icon} size={14} />\n </button>\n )}\n\n <button\n data-meridial-ui\n onClick={() => onConfigure(workflow.id)}\n className={cn(\n \"shrink-0 cursor-pointer p-0.5\",\n workflow.configured\n ? \"text-muted-foreground hover:text-foreground\"\n : \"text-amber-500 hover:text-amber-500/80\"\n )}\n >\n <HugeiconsIcon icon={Settings01Icon} size={14} />\n </button>\n </div>\n )\n}\n","\"use client\"\n\nimport type { Workflow } from \"../schemas.js\"\nimport { WorkflowRow } from \"./workflow-row.js\"\n\ninterface WorkflowListPanelProps {\n workflows: Workflow[]\n hasMore: boolean\n remainingCount: number\n onLoadMore: () => void\n onRename: (id: string, name: string) => void\n onDelete: (id: string) => void\n onConfigure: (id: string) => void\n}\n\nexport function WorkflowListPanel({\n workflows,\n hasMore,\n remainingCount,\n onLoadMore,\n onRename,\n onDelete,\n onConfigure,\n}: WorkflowListPanelProps) {\n return (\n <div data-meridial-ui className=\"max-h-60 overflow-y-auto border-b bg-card\">\n {workflows.length === 0 ? (\n <p className=\"px-3 py-4 text-center text-sm text-muted-foreground\">\n No workflow recorded\n </p>\n ) : (\n <>\n {workflows.map((w) => (\n <WorkflowRow\n key={w.id}\n workflow={w}\n onRename={onRename}\n onDelete={onDelete}\n onConfigure={onConfigure}\n />\n ))}\n {hasMore && (\n <button\n data-meridial-ui\n onClick={onLoadMore}\n className=\"w-full cursor-pointer px-3 py-2 text-center text-sm text-muted-foreground hover:bg-muted/50 hover:text-foreground\"\n >\n {remainingCount} More…\n </button>\n )}\n </>\n )}\n </div>\n )\n}\n","\"use client\"\n\nimport { useRef, useState, useCallback, type RefObject } from \"react\"\nimport {\n MultiplicationSignIcon,\n Cursor02Icon,\n ArrowLeft01Icon,\n ArrowRight01Icon,\n Loading03Icon,\n Tick01Icon,\n} from \"@hugeicons/core-free-icons\"\nimport { HugeiconsIcon } from \"@hugeicons/react\"\nimport { Button } from \"@workspace/ui/components/button\"\nimport { createPortal } from \"react-dom\"\nimport { useDraggable } from \"@neodrag/react\"\nimport { usePosition } from \"./hooks/use-position.js\"\nimport { STORAGE_KEYS, MIN_DESC_LENGTH } from \"./constants.js\"\nimport { DragHandle } from \"./components/drag-handle.js\"\nimport { CursorGuide } from \"./components/cursor-guide.js\"\nimport { DeleteStepButton } from \"./components/delete-step-button.js\"\nimport type { Workflow, Step } from \"./schemas.js\"\nimport * as storage from \"./storage.js\"\n\ninterface WorkflowEditorProps {\n baseUrl?: string\n workflowId: string\n workflow?: Workflow\n publishableKey?: string\n cursor?: React.ReactNode\n onClose: () => void\n onWorkflowDeleted: (id: string) => void\n onError?: (error: string) => void\n}\n\nexport function WorkflowEditor({\n baseUrl = \"\",\n workflowId,\n workflow: workflowProp,\n publishableKey,\n cursor,\n onClose,\n onWorkflowDeleted,\n onError,\n}: WorkflowEditorProps) {\n const draggableRef = useRef<HTMLDivElement>(null)\n const { position, updatePosition } = usePosition(STORAGE_KEYS.editorPos)\n\n useDraggable(draggableRef as RefObject<HTMLElement>, {\n handle: \"[data-meridial-drag-handle]\",\n defaultPosition: position,\n onDragEnd: ({ offsetX, offsetY }) => {\n updatePosition({ x: offsetX, y: offsetY })\n },\n })\n\n const [workflowState, setWorkflowState] = useState<Workflow | null>(\n () => workflowProp ?? storage.getWorkflow(workflowId) ?? null\n )\n const isConfigured = workflowState?.configured ?? false\n\n const initialDescriptions: Record<string, string> = (() => {\n if (!workflowState) return {}\n const map: Record<string, string> = {}\n for (const step of workflowState.steps) {\n map[step.id] = step.description\n }\n return map\n })()\n\n const originalDescriptions =\n useRef<Record<string, string>>(initialDescriptions)\n\n const [currentIndex, setCurrentIndex] = useState(0)\n const [descriptions, setDescriptions] =\n useState<Record<string, string>>(initialDescriptions)\n const [saving, setSaving] = useState(false)\n const [savingChanges, setSavingChanges] = useState(false)\n\n const steps = workflowState?.steps ?? []\n const currentStep: Step | undefined = steps[currentIndex]\n const currentDesc = currentStep ? (descriptions[currentStep.id] ?? \"\") : \"\"\n\n const completedCount = steps.filter(\n (s) => (descriptions[s.id] ?? \"\").length >= MIN_DESC_LENGTH\n ).length\n\n const hasChanges =\n isConfigured &&\n steps.some(\n (s) =>\n (descriptions[s.id] ?? \"\") !==\n (originalDescriptions.current[s.id] ?? \"\")\n )\n\n const updateDescription = useCallback(\n (value: string) => {\n if (!currentStep) return\n setDescriptions((prev) => ({ ...prev, [currentStep.id]: value }))\n },\n [currentStep]\n )\n\n const handleDeleteStep = useCallback(async () => {\n if (!workflowState || !currentStep) return\n\n if (isConfigured && publishableKey) {\n try {\n const res = await fetch(\n `${baseUrl}/api/workflows/${workflowState.id}`,\n {\n method: \"PATCH\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${publishableKey}`,\n },\n body: JSON.stringify({ deleteStepId: currentStep.id }),\n }\n )\n if (!res.ok) {\n const data = await res.json().catch(() => ({}))\n throw new Error((data?.error as string) || `Failed (${res.status})`)\n }\n const data = await res.json()\n if (data.deleted) {\n onWorkflowDeleted(workflowState.id)\n onClose()\n return\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n onError?.(msg)\n return\n }\n } else {\n if (workflowState.steps.length === 1) {\n storage.deleteWorkflow(workflowState.id)\n if (workflowState.audioKey) {\n storage.deleteAudio(workflowState.audioKey).catch(() => {})\n }\n onWorkflowDeleted(workflowState.id)\n onClose()\n return\n }\n storage.updateWorkflow(workflowState.id, {\n steps: workflowState.steps.filter((s) => s.id !== currentStep.id),\n })\n }\n\n const newSteps = workflowState.steps.filter((s) => s.id !== currentStep.id)\n setWorkflowState({ ...workflowState, steps: newSteps })\n setCurrentIndex((prev) => Math.min(prev, newSteps.length - 1))\n }, [\n workflowState,\n currentStep,\n isConfigured,\n publishableKey,\n onClose,\n onWorkflowDeleted,\n ])\n\n const handleSaveChanges = useCallback(async () => {\n if (!workflowState || !publishableKey || !isConfigured) return\n\n setSavingChanges(true)\n\n try {\n const updatedSteps = steps.map((s) => ({\n ...s,\n description: descriptions[s.id] ?? s.description,\n }))\n\n const res = await fetch(`${baseUrl}/api/workflows/${workflowState.id}`, {\n method: \"PATCH\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${publishableKey}`,\n },\n body: JSON.stringify({ steps: updatedSteps }),\n })\n\n if (!res.ok) {\n const data = await res.json().catch(() => ({}))\n throw new Error((data?.error as string) || `Failed (${res.status})`)\n }\n\n setWorkflowState({ ...workflowState, steps: updatedSteps })\n const newBaseline: Record<string, string> = {}\n for (const s of updatedSteps) {\n newBaseline[s.id] = s.description\n }\n originalDescriptions.current = newBaseline\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n onError?.(msg)\n } finally {\n setSavingChanges(false)\n }\n }, [workflowState, publishableKey, isConfigured, steps, descriptions])\n\n const handleBack = useCallback(() => {\n setCurrentIndex((prev) => Math.max(0, prev - 1))\n }, [])\n\n const uploadAndFinish = useCallback(async () => {\n const wf = workflowState!\n const finalSteps = steps.map((s) => ({\n ...s,\n description: descriptions[s.id] ?? s.description,\n }))\n\n const finish = () => {\n storage.deleteWorkflow(wf.id)\n if (wf.audioKey) {\n storage.deleteAudio(wf.audioKey).catch(() => {})\n }\n onWorkflowDeleted(wf.id)\n setTimeout(() => {\n setSaving(false)\n onClose()\n }, 300)\n }\n\n if (publishableKey && wf.audioKey) {\n try {\n const audioBlob = await storage.loadAudio(wf.audioKey!)\n\n const presignRes = await fetch(`${baseUrl}/api/upload/presigned-url`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${publishableKey}`,\n },\n body: JSON.stringify({ workflowId: wf.id }),\n })\n if (!presignRes.ok) {\n throw new Error(\n `[Meridial] Failed to get presigned URL (status ${presignRes.status})`\n )\n }\n const { uploadUrl } = await presignRes.json()\n\n if (audioBlob) {\n const uploadRes = await fetch(uploadUrl, {\n method: \"PUT\",\n headers: { \"Content-Type\": \"audio/webm\" },\n body: audioBlob,\n })\n if (!uploadRes.ok) {\n throw new Error(\n `[Meridial] Failed to upload audio blob (status ${uploadRes.status})`\n )\n }\n }\n\n await fetch(`${baseUrl}/api/upload/complete`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${publishableKey}`,\n },\n body: JSON.stringify({\n workflowId: wf.id,\n name: wf.name,\n description: \"\",\n steps: finalSteps,\n }),\n })\n finish()\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n onError?.(msg)\n setSaving(false)\n }\n } else {\n finish()\n }\n }, [\n workflowState,\n steps,\n descriptions,\n publishableKey,\n onClose,\n onWorkflowDeleted,\n baseUrl,\n ])\n\n const handleNext = useCallback(() => {\n const isLast = currentIndex === steps.length - 1\n\n if (!isLast) {\n setCurrentIndex((prev) => prev + 1)\n return\n }\n\n if (isConfigured) {\n onClose()\n return\n }\n\n setSaving(true)\n uploadAndFinish()\n }, [isConfigured, currentIndex, steps, uploadAndFinish, onClose])\n\n if (!workflowState || !currentStep) return null\n\n const isLastStep = currentIndex === steps.length - 1\n const canAdvance = currentDesc.length >= MIN_DESC_LENGTH\n const allConfigured = completedCount === steps.length && steps.length > 0\n const isConfiguredSaveMode = isConfigured && hasChanges\n\n const primaryDisabled = isConfiguredSaveMode\n ? savingChanges\n : isLastStep\n ? isConfigured\n ? false\n : !allConfigured || saving\n : !canAdvance\n\n const primaryAction = isConfiguredSaveMode ? handleSaveChanges : handleNext\n\n return createPortal(\n <div\n ref={draggableRef}\n data-meridial-ui\n className=\"group fixed bottom-4 left-1/2 z-[99998] w-[500px] -translate-x-1/2 rounded border border-border bg-card shadow-md\"\n >\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2 p-2\">\n <DragHandle />\n <span className=\"text-sm text-muted-foreground\">\n {currentStep.elementLabel}\n </span>\n </div>\n <Button variant=\"ghost\" size=\"icon\" onClick={onClose}>\n <HugeiconsIcon\n icon={MultiplicationSignIcon}\n strokeWidth={2}\n size={16}\n />\n </Button>\n </div>\n\n <textarea\n data-meridial-ui\n value={currentDesc}\n onChange={(e) => updateDescription(e.target.value)}\n placeholder=\"Add or edit existing step description\"\n rows={3}\n className=\"-mb-2 w-full resize-none border-y bg-muted/50 px-3 py-2 text-sm text-foreground outline-none placeholder:text-muted-foreground\"\n />\n\n <div data-meridial-ui className=\"flex items-center justify-between p-2\">\n <span className=\"text-xs text-muted-foreground\">\n {completedCount} / {steps.length} Steps Completed\n </span>\n <div className=\"flex gap-2\">\n <DeleteStepButton onConfirm={handleDeleteStep} />\n <Button\n variant=\"outline\"\n data-meridial-ui\n onClick={handleBack}\n disabled={currentIndex === 0}\n title=\"Back\"\n >\n <HugeiconsIcon icon={ArrowLeft01Icon} size={16} />\n <span className=\"text-xs\">Back</span>\n </Button>\n <Button\n variant=\"default\"\n data-meridial-ui\n onClick={primaryAction}\n disabled={primaryDisabled}\n >\n {isConfiguredSaveMode ? (\n savingChanges ? (\n <>\n <HugeiconsIcon\n icon={Loading03Icon}\n size={14}\n className=\"animate-spin\"\n />\n Saving Workflow\n </>\n ) : (\n \"Save Workflow\"\n )\n ) : saving ? (\n <HugeiconsIcon\n icon={Loading03Icon}\n size={14}\n className=\"animate-spin\"\n />\n ) : isLastStep ? (\n <>\n Finish\n <HugeiconsIcon icon={Tick01Icon} size={14} />\n </>\n ) : (\n <>\n Next\n <HugeiconsIcon icon={ArrowRight01Icon} size={14} />\n </>\n )}\n </Button>\n </div>\n </div>\n <CursorGuide\n selector={currentStep.elementId}\n urlPath={currentStep.urlPath}\n onError={onError}\n onClick={isConfigured ? primaryAction : undefined}\n >\n {cursor ?? (\n <HugeiconsIcon\n icon={Cursor02Icon}\n strokeWidth={2}\n size={32}\n className=\"fill-primary/80 text-primary\"\n />\n )}\n </CursorGuide>\n </div>,\n document.body\n )\n}\n","import { useState, useCallback } from \"react\"\n\ninterface Position {\n x: number\n y: number\n}\n\nexport function usePosition(\n storageKey: string,\n defaultPos: Position = { x: 0, y: 0 }\n) {\n const [position] = useState<Position>(() => {\n if (typeof window === \"undefined\") return defaultPos\n try {\n const raw = localStorage.getItem(storageKey)\n if (raw) {\n const parsed = JSON.parse(raw) as Position\n if (typeof parsed.x === \"number\" && typeof parsed.y === \"number\") {\n return parsed\n }\n }\n } catch {\n // ignore\n }\n return defaultPos\n })\n\n const updatePosition = useCallback(\n (pos: Position) => {\n try {\n localStorage.setItem(storageKey, JSON.stringify(pos))\n } catch {\n // ignore\n }\n },\n [storageKey]\n )\n\n return { position, updatePosition } as const\n}\n","\"use client\"\n\nimport { useRef, type ReactNode } from \"react\"\nimport { createPortal } from \"react-dom\"\nimport {\n motion,\n useMotionValue,\n useSpring,\n AnimatePresence,\n} from \"motion/react\"\nimport { useElementTracker } from \"../hooks/use-element-tracker.js\"\n\ninterface CursorGuideProps {\n selector: string\n children: ReactNode\n urlPath: string\n onError?: (message: string) => void\n onClick?: () => void\n}\n\nconst SPRING_CONFIG = { stiffness: 120, damping: 20, mass: 0.8 }\nconst OFFSET = -16\n\nexport function CursorGuide({\n selector,\n urlPath,\n children,\n onError,\n onClick,\n}: CursorGuideProps) {\n const { rect } = useElementTracker({\n selector,\n urlPath,\n onError: onError\n ? (msg) => {\n if (msg !== null) onError(msg)\n }\n : undefined,\n onClick,\n })\n const hasAnimated = useRef(false)\n\n const springX = useSpring(useMotionValue(0), SPRING_CONFIG)\n const springY = useSpring(useMotionValue(0), SPRING_CONFIG)\n\n if (rect) {\n const targetX = rect.right + OFFSET\n const targetY = rect.bottom + OFFSET\n\n if (!hasAnimated.current) {\n // Snap immediately — first render or after a path change reset\n springX.jump(targetX)\n springY.jump(targetY)\n hasAnimated.current = true\n } else {\n springX.set(targetX)\n springY.set(targetY)\n }\n } else {\n // rect was cleared (path changed) — reset so the next element snaps in\n hasAnimated.current = false\n }\n\n return createPortal(\n <AnimatePresence>\n {rect && (\n <motion.div\n data-meridial-ui\n className=\"pointer-events-none fixed z-[99999]\"\n style={{ top: springY, left: springX }}\n initial={{ opacity: 0, scale: 0.6 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.6 }}\n transition={{ duration: 0.2 }}\n >\n {children}\n </motion.div>\n )}\n </AnimatePresence>,\n document.body\n )\n}\n","\"use client\"\n\nimport { useRef, useState } from \"react\"\nimport { motion, useAnimation } from \"motion/react\"\nimport { HugeiconsIcon } from \"@hugeicons/react\"\nimport { Delete01Icon } from \"@hugeicons/core-free-icons\"\nimport { Button } from \"@workspace/ui/components/button\"\n\ninterface DeleteStepButtonProps {\n holdDuration?: number\n onConfirm: () => void\n}\n\nexport function DeleteStepButton({\n holdDuration = 3000,\n onConfirm,\n}: DeleteStepButtonProps) {\n const [isHolding, setIsHolding] = useState(false)\n const controls = useAnimation()\n const holdingRef = useRef(false)\n\n async function handleHoldStart() {\n holdingRef.current = true\n setIsHolding(true)\n controls.set({ width: \"5%\" })\n\n await controls.start({\n width: \"100%\",\n transition: {\n duration: holdDuration / 1000,\n ease: \"linear\",\n },\n })\n\n if (holdingRef.current) {\n holdingRef.current = false\n setIsHolding(false)\n onConfirm()\n }\n }\n\n function handleHoldEnd() {\n holdingRef.current = false\n setIsHolding(false)\n controls.stop()\n controls.start({\n width: \"0%\",\n transition: { duration: 0.1 },\n })\n }\n\n return (\n <Button\n type=\"button\"\n onMouseDown={handleHoldStart}\n onMouseLeave={handleHoldEnd}\n onMouseUp={handleHoldEnd}\n onTouchCancel={handleHoldEnd}\n onTouchEnd={handleHoldEnd}\n onTouchStart={handleHoldStart}\n variant=\"destructive\"\n className=\"relative w-42\"\n >\n <motion.div\n animate={controls}\n className=\"absolute top-0 left-0 h-full rounded-tl-lg rounded-bl-lg bg-red-400/40 dark:bg-red-300/40\"\n initial={{ width: \"0%\" }}\n />\n <span className=\"relative z-10 flex items-center gap-1\">\n <HugeiconsIcon icon={Delete01Icon} size={14} />\n {isHolding ? \"Release to cancel\" : \"Hold to delete\"}\n </span>\n </Button>\n )\n}\n\nexport default DeleteStepButton\n"],"mappings":"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","names":["useRef","useState","useCallback","useEffect","useDraggable","motion","AnimatePresence","barCount","useRef","useEffect","useCallback","useState","useCallback","useState","useCallback","addWorkflow","updateWorkflow","deleteWorkflow","getWorkflow","jsx","jsx","useState","useRef","useEffect","HugeiconsIcon","Alert01Icon","jsx","jsxs","useState","useRef","useEffect","jsx","jsxs","useRef","useState","useCallback","Loading03Icon","HugeiconsIcon","createPortal","useState","useCallback","useRef","jsx","useRef","useRef","useState","motion","HugeiconsIcon","Delete01Icon","jsx","jsxs","useState","useRef","motion","HugeiconsIcon","Delete01Icon","Fragment","jsx","jsxs","useRef","useState","useCallback","data","createPortal","HugeiconsIcon","Loading03Icon","Fragment","jsx","jsxs","useRef","useDraggable","useState","useEffect","useCallback","AnimatePresence","motion"]}