@durablex/react-ui 0.1.0-beta.3 → 0.1.0-beta.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/dist/index.d.ts +15 -6
- package/dist/index.js +32 -3
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/components/RunsView.tsx +49 -5
- package/src/components/WorkflowsView.tsx +2 -2
- package/src/index.ts +5 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["SeparatorPrimitive","SheetPrimitive","TooltipPrimitive","Sidebar","SidebarPrimitive","DialogPrimitive","CONFIG","Sonner"],"sources":["../src/hooks/use-mobile.ts","../src/lib/utils.ts","../src/ui/button.tsx","../src/ui/input.tsx","../src/ui/separator.tsx","../src/ui/sheet.tsx","../src/ui/skeleton.tsx","../src/ui/tooltip.tsx","../src/ui/sidebar.tsx","../src/components/marks-geometry.ts","../src/components/AnimatedDurablexMark.tsx","../src/components/DurablexLogo.tsx","../src/shell/Sidebar.tsx","../src/shell/Topbar.tsx","../src/shell/AppShell.tsx","../src/hooks/use-copy.ts","../src/lib/format.ts","../src/lib/run-logs.ts","../src/lib/run-progress.ts","../src/components/Meta.tsx","../src/lib/json-highlight.ts","../src/components/JsonBlock.tsx","../src/components/LogList.tsx","../src/components/PayloadTabs.tsx","../src/components/ResumeMark.tsx","../src/lib/status-label.ts","../src/components/StatusBadge.tsx","../src/lib/step-detail.ts","../src/lib/step-display.ts","../src/components/StepGlyph.tsx","../src/components/StepTabsView.tsx","../src/components/StepInspector.tsx","../src/components/StepFlow.tsx","../src/components/StepRow.tsx","../src/lib/step-timeline.ts","../src/components/StepTimeline.tsx","../src/components/RunInspector.tsx","../src/hooks/use-confirm-action.ts","../src/components/RunCancelButton.tsx","../src/components/RunPauseButton.tsx","../src/ui/dialog.tsx","../src/components/JsonEditor.tsx","../src/components/ReplayRunDialog.tsx","../src/components/RunInspectorActions.tsx","../src/ui/resizable.tsx","../src/hooks/use-keyset-pager.ts","../src/lib/run-filters.ts","../src/lib/run-sort.ts","../src/lib/time-range.ts","../src/components/BulkReplayButton.tsx","../src/components/CursorPager.tsx","../src/components/RetryFromStepButton.tsx","../src/lib/control-action.ts","../src/components/RunControlHistory.tsx","../src/lib/app-color.ts","../src/components/filters/use-click-outside.ts","../src/components/filters/FilterDropdown.tsx","../src/components/filters/FilterDropdownButton.tsx","../src/components/filters/FilterDropdownItem.tsx","../src/components/filters/AppFilter.tsx","../src/components/filters/TimeRangeFilter.tsx","../src/components/RunsFilterBar.tsx","../src/components/RunsTableHead.tsx","../src/components/RunsTableLoader.tsx","../src/components/RunsTablePlaceholder.tsx","../src/components/AppTag.tsx","../src/components/GlyphBadge.tsx","../src/components/ScheduledBadge.tsx","../src/components/RunsTableRow.tsx","../src/components/RunsTable.tsx","../src/components/StatTileGrid.tsx","../src/components/StatsTiles.tsx","../src/components/RunsView.tsx","../src/components/filters/TimeZoneFilter.tsx","../src/components/SectionHeader.tsx","../src/components/charts/ChartCard.tsx","../src/ui/chart.tsx","../src/components/charts/RunLatencyChart.tsx","../src/components/charts/RunsOverTimeChart.tsx","../src/components/charts/RunCharts.tsx","../src/lib/flow-control.ts","../src/components/FlowControlBadge.tsx","../src/components/FlowControlSection.tsx","../src/components/WorkflowDetail.tsx","../src/components/WorkflowsView.tsx","../src/components/RunnerLiveBadge.tsx","../src/components/AppStatusBadge.tsx","../src/components/AppsView.tsx","../src/lib/table.ts","../src/ui/table.tsx","../src/components/TableStatusRows.tsx","../src/components/EventsList.tsx","../src/components/TriggerEventResult.tsx","../src/components/TriggerEventDialog.tsx","../src/components/EventsView.tsx","../src/lib/workflow-run.ts","../src/components/WorkflowRunDialog.tsx","../src/components/WorkflowRunAction.tsx","../src/lib/webhook-view.ts","../src/components/WebhookBadges.tsx","../src/components/WebhookStatusBadge.tsx","../src/components/DeliveryDetail.tsx","../src/components/DeliveriesSplit.tsx","../src/components/FormField.tsx","../src/components/SecretReveal.tsx","../src/components/EndpointFormDialog.tsx","../src/components/Facts.tsx","../src/components/EndpointRow.tsx","../src/components/EndpointsTab.tsx","../src/components/ReceiverFormDialog.tsx","../src/components/ReceiversTab.tsx","../src/components/WebhooksView.tsx","../src/components/FlowSummary.tsx","../src/components/OverviewView.tsx","../src/ui/sonner.tsx","../src/lib/theme.ts"],"sourcesContent":["import * as React from \"react\";\n\nconst MOBILE_BREAKPOINT = 768;\n\nexport function useIsMobile() {\n const [isMobile, setIsMobile] = React.useState(() => window.innerWidth < MOBILE_BREAKPOINT);\n\n React.useEffect(() => {\n const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);\n const onChange = () => setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n mql.addEventListener(\"change\", onChange);\n return () => mql.removeEventListener(\"change\", onChange);\n }, []);\n\n return isMobile;\n}\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { Slot } from \"radix-ui\";\n\nimport { cn } from \"../lib/utils\";\n\nconst buttonVariants = cva(\n \"group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 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-primary text-primary-foreground hover:bg-primary/80\",\n outline:\n \"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)] aria-expanded:bg-secondary aria-expanded:text-secondary-foreground\",\n ghost:\n \"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50\",\n destructive:\n \"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default:\n \"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2\",\n xs: \"h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3\",\n sm: \"h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5\",\n lg: \"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2\",\n icon: \"size-8\",\n \"icon-xs\":\n \"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3\",\n \"icon-sm\":\n \"size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg\",\n \"icon-lg\": \"size-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nfunction Button({\n className,\n variant = \"default\",\n size = \"default\",\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean;\n }) {\n const Comp = asChild ? Slot.Root : \"button\";\n\n return (\n <Comp\n data-slot=\"button\"\n data-variant={variant}\n data-size={size}\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n );\n}\n\nexport { Button, buttonVariants };\n","import * as React from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(\n \"h-8 w-full min-w-0 rounded-lg border border-input bg-transparent px-2.5 py-1 text-base transition-colors outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Input };\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Separator as SeparatorPrimitive } from \"radix-ui\";\n\nimport { cn } from \"../lib/utils\";\n\nfunction Separator({\n className,\n orientation = \"horizontal\",\n decorative = true,\n ...props\n}: React.ComponentProps<typeof SeparatorPrimitive.Root>) {\n return (\n <SeparatorPrimitive.Root\n data-slot=\"separator\"\n decorative={decorative}\n orientation={orientation}\n className={cn(\n \"shrink-0 bg-border data-horizontal:h-px data-horizontal:w-full data-vertical:w-px data-vertical:self-stretch\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Separator };\n","import * as React from \"react\";\nimport { Dialog as SheetPrimitive } from \"radix-ui\";\n\nimport { cn } from \"../lib/utils\";\nimport { Button } from \"./button\";\nimport { XIcon } from \"lucide-react\";\n\nfunction Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {\n return <SheetPrimitive.Root data-slot=\"sheet\" {...props} />;\n}\n\nfunction SheetTrigger({ ...props }: React.ComponentProps<typeof SheetPrimitive.Trigger>) {\n return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />;\n}\n\nfunction SheetClose({ ...props }: React.ComponentProps<typeof SheetPrimitive.Close>) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />;\n}\n\nfunction SheetPortal({ ...props }: React.ComponentProps<typeof SheetPrimitive.Portal>) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />;\n}\n\nfunction SheetOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Overlay>) {\n return (\n <SheetPrimitive.Overlay\n data-slot=\"sheet-overlay\"\n className={cn(\n \"fixed inset-0 z-50 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SheetContent({\n className,\n children,\n side = \"right\",\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Content> & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\n showCloseButton?: boolean;\n}) {\n return (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n data-slot=\"sheet-content\"\n data-side={side}\n className={cn(\n \"fixed z-50 flex flex-col gap-4 bg-popover bg-clip-padding text-sm text-popover-foreground shadow-lg transition duration-200 ease-in-out data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:h-auto data-[side=bottom]:border-t data-[side=left]:inset-y-0 data-[side=left]:left-0 data-[side=left]:h-full data-[side=left]:w-3/4 data-[side=left]:border-r data-[side=right]:inset-y-0 data-[side=right]:right-0 data-[side=right]:h-full data-[side=right]:w-3/4 data-[side=right]:border-l data-[side=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:h-auto data-[side=top]:border-b data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-[side=bottom]:data-open:slide-in-from-bottom-10 data-[side=left]:data-open:slide-in-from-left-10 data-[side=right]:data-open:slide-in-from-right-10 data-[side=top]:data-open:slide-in-from-top-10 data-closed:animate-out data-closed:fade-out-0 data-[side=bottom]:data-closed:slide-out-to-bottom-10 data-[side=left]:data-closed:slide-out-to-left-10 data-[side=right]:data-closed:slide-out-to-right-10 data-[side=top]:data-closed:slide-out-to-top-10\",\n className,\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <SheetPrimitive.Close data-slot=\"sheet-close\" asChild>\n <Button variant=\"ghost\" className=\"absolute top-3 right-3\" size=\"icon-sm\">\n <XIcon />\n <span className=\"sr-only\">Close</span>\n </Button>\n </SheetPrimitive.Close>\n )}\n </SheetPrimitive.Content>\n </SheetPortal>\n );\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-header\"\n className={cn(\"flex flex-col gap-0.5 p-4\", className)}\n {...props}\n />\n );\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-footer\"\n className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)}\n {...props}\n />\n );\n}\n\nfunction SheetTitle({ className, ...props }: React.ComponentProps<typeof SheetPrimitive.Title>) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn(\"font-heading text-base font-medium text-foreground\", className)}\n {...props}\n />\n );\n}\n\nfunction SheetDescription({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Description>) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n );\n}\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n};\n","import * as React from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\nfunction Skeleton({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"skeleton\"\n className={cn(\"animate-pulse rounded-md bg-muted\", className)}\n {...props}\n />\n );\n}\n\nexport { Skeleton };\n","import * as React from \"react\";\nimport { Tooltip as TooltipPrimitive } from \"radix-ui\";\n\nimport { cn } from \"../lib/utils\";\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delayDuration={delayDuration}\n {...props}\n />\n );\n}\n\nfunction Tooltip({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />;\n}\n\nfunction TooltipTrigger({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />;\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 0,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n \"z-50 inline-flex w-fit max-w-xs origin-(--radix-tooltip-content-transform-origin) items-center gap-1.5 rounded-md bg-foreground px-3 py-1.5 text-xs text-background has-data-[slot=kbd]:pr-1.5 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-sm data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className,\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n );\n}\n\nexport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { Slot } from \"radix-ui\";\n\nimport { useIsMobile } from \"../hooks/use-mobile\";\nimport { cn } from \"../lib/utils\";\nimport { Button } from \"./button\";\nimport { Input } from \"./input\";\nimport { Separator } from \"./separator\";\nimport { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle } from \"./sheet\";\nimport { Skeleton } from \"./skeleton\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"./tooltip\";\nimport { PanelLeftIcon } from \"lucide-react\";\n\nconst SIDEBAR_COOKIE_NAME = \"sidebar_state\";\nconst SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;\nconst SIDEBAR_WIDTH = \"16rem\";\nconst SIDEBAR_WIDTH_MOBILE = \"18rem\";\nconst SIDEBAR_WIDTH_ICON = \"3rem\";\nconst SIDEBAR_KEYBOARD_SHORTCUT = \"b\";\n\ntype SidebarContextProps = {\n state: \"expanded\" | \"collapsed\";\n open: boolean;\n setOpen: (open: boolean) => void;\n openMobile: boolean;\n setOpenMobile: (open: boolean) => void;\n isMobile: boolean;\n toggleSidebar: () => void;\n};\n\nconst SidebarContext = React.createContext<SidebarContextProps | null>(null);\n\nfunction useSidebar() {\n const context = React.useContext(SidebarContext);\n if (!context) {\n throw new Error(\"useSidebar must be used within a SidebarProvider.\");\n }\n\n return context;\n}\n\nfunction SidebarProvider({\n defaultOpen = true,\n open: openProp,\n onOpenChange: setOpenProp,\n className,\n style,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n defaultOpen?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}) {\n const isMobile = useIsMobile();\n const [openMobile, setOpenMobile] = React.useState(false);\n\n // This is the internal state of the sidebar.\n // We use openProp and setOpenProp for control from outside the component.\n const [_open, _setOpen] = React.useState(defaultOpen);\n const open = openProp ?? _open;\n const setOpen = React.useCallback(\n (value: boolean | ((value: boolean) => boolean)) => {\n const openState = typeof value === \"function\" ? value(open) : value;\n if (setOpenProp) {\n setOpenProp(openState);\n } else {\n _setOpen(openState);\n }\n\n // This sets the cookie to keep the sidebar state.\n document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`;\n },\n [setOpenProp, open],\n );\n\n // Helper to toggle the sidebar.\n const toggleSidebar = React.useCallback(() => {\n return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open);\n }, [isMobile, setOpen, setOpenMobile]);\n\n // Adds a keyboard shortcut to toggle the sidebar.\n React.useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === SIDEBAR_KEYBOARD_SHORTCUT && (event.metaKey || event.ctrlKey)) {\n event.preventDefault();\n toggleSidebar();\n }\n };\n\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [toggleSidebar]);\n\n // We add a state so that we can do data-state=\"expanded\" or \"collapsed\".\n // This makes it easier to style the sidebar with Tailwind classes.\n const state = open ? \"expanded\" : \"collapsed\";\n\n const contextValue = React.useMemo<SidebarContextProps>(\n () => ({\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n }),\n [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar],\n );\n\n return (\n <SidebarContext.Provider value={contextValue}>\n <div\n data-slot=\"sidebar-wrapper\"\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH,\n \"--sidebar-width-icon\": SIDEBAR_WIDTH_ICON,\n ...style,\n } as React.CSSProperties\n }\n className={cn(\n \"group/sidebar-wrapper flex min-h-svh w-full has-data-[variant=inset]:bg-sidebar\",\n className,\n )}\n {...props}\n >\n {children}\n </div>\n </SidebarContext.Provider>\n );\n}\n\nfunction Sidebar({\n side = \"left\",\n variant = \"sidebar\",\n collapsible = \"offcanvas\",\n className,\n children,\n dir,\n ...props\n}: React.ComponentProps<\"div\"> & {\n side?: \"left\" | \"right\";\n variant?: \"sidebar\" | \"floating\" | \"inset\";\n collapsible?: \"offcanvas\" | \"icon\" | \"none\";\n}) {\n const { isMobile, state, openMobile, setOpenMobile } = useSidebar();\n\n if (collapsible === \"none\") {\n return (\n <div\n data-slot=\"sidebar\"\n className={cn(\n \"flex h-full w-(--sidebar-width) flex-col bg-sidebar text-sidebar-foreground\",\n className,\n )}\n {...props}\n >\n {children}\n </div>\n );\n }\n\n if (isMobile) {\n return (\n <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>\n <SheetContent\n dir={dir}\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar\"\n data-mobile=\"true\"\n className=\"w-(--sidebar-width) bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden\"\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH_MOBILE,\n } as React.CSSProperties\n }\n side={side}\n >\n <SheetHeader className=\"sr-only\">\n <SheetTitle>Sidebar</SheetTitle>\n <SheetDescription>Displays the mobile sidebar.</SheetDescription>\n </SheetHeader>\n <div className=\"flex h-full w-full flex-col\">{children}</div>\n </SheetContent>\n </Sheet>\n );\n }\n\n return (\n <div\n className=\"group peer hidden text-sidebar-foreground md:block\"\n data-state={state}\n data-collapsible={state === \"collapsed\" ? collapsible : \"\"}\n data-variant={variant}\n data-side={side}\n data-slot=\"sidebar\"\n >\n {/* This is what handles the sidebar gap on desktop */}\n <div\n data-slot=\"sidebar-gap\"\n className={cn(\n \"relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear\",\n \"group-data-[collapsible=offcanvas]:w-0\",\n \"group-data-[side=right]:rotate-180\",\n variant === \"floating\" || variant === \"inset\"\n ? \"group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon)\",\n )}\n />\n <div\n data-slot=\"sidebar-container\"\n data-side={side}\n className={cn(\n \"fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear data-[side=left]:left-0 data-[side=left]:group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)] data-[side=right]:right-0 data-[side=right]:group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)] md:flex\",\n // Adjust the padding for floating and inset variants.\n variant === \"floating\" || variant === \"inset\"\n ? \"p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l\",\n className,\n )}\n {...props}\n >\n <div\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar-inner\"\n className=\"flex size-full flex-col bg-sidebar group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:shadow-sm group-data-[variant=floating]:ring-1 group-data-[variant=floating]:ring-sidebar-border\"\n >\n {children}\n </div>\n </div>\n </div>\n );\n}\n\nfunction SidebarTrigger({ className, onClick, ...props }: React.ComponentProps<typeof Button>) {\n const { toggleSidebar } = useSidebar();\n\n return (\n <Button\n data-sidebar=\"trigger\"\n data-slot=\"sidebar-trigger\"\n variant=\"ghost\"\n size=\"icon-sm\"\n className={cn(className)}\n onClick={(event) => {\n onClick?.(event);\n toggleSidebar();\n }}\n {...props}\n >\n <PanelLeftIcon />\n <span className=\"sr-only\">Toggle Sidebar</span>\n </Button>\n );\n}\n\nfunction SidebarRail({ className, ...props }: React.ComponentProps<\"button\">) {\n const { toggleSidebar } = useSidebar();\n\n return (\n <button\n data-sidebar=\"rail\"\n data-slot=\"sidebar-rail\"\n aria-label=\"Toggle Sidebar\"\n tabIndex={-1}\n onClick={toggleSidebar}\n title=\"Toggle Sidebar\"\n className={cn(\n \"absolute inset-y-0 z-20 hidden w-4 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:start-1/2 after:w-[2px] hover:after:bg-sidebar-border sm:flex ltr:-translate-x-1/2 rtl:-translate-x-1/2\",\n \"in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize\",\n \"[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize\",\n \"group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full hover:group-data-[collapsible=offcanvas]:bg-sidebar\",\n \"[[data-side=left][data-collapsible=offcanvas]_&]:-right-2\",\n \"[[data-side=right][data-collapsible=offcanvas]_&]:-left-2\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarInset({ className, ...props }: React.ComponentProps<\"main\">) {\n return (\n <main\n data-slot=\"sidebar-inset\"\n className={cn(\n \"relative flex w-full flex-1 flex-col bg-background md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarInput({ className, ...props }: React.ComponentProps<typeof Input>) {\n return (\n <Input\n data-slot=\"sidebar-input\"\n data-sidebar=\"input\"\n className={cn(\"h-8 w-full bg-background shadow-none\", className)}\n {...props}\n />\n );\n}\n\nfunction SidebarHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-header\"\n data-sidebar=\"header\"\n className={cn(\"flex flex-col gap-2 p-2\", className)}\n {...props}\n />\n );\n}\n\nfunction SidebarFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-footer\"\n data-sidebar=\"footer\"\n className={cn(\"flex flex-col gap-2 p-2\", className)}\n {...props}\n />\n );\n}\n\nfunction SidebarSeparator({ className, ...props }: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"sidebar-separator\"\n data-sidebar=\"separator\"\n className={cn(\"mx-2 w-auto bg-sidebar-border\", className)}\n {...props}\n />\n );\n}\n\nfunction SidebarContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-content\"\n data-sidebar=\"content\"\n className={cn(\n \"no-scrollbar flex min-h-0 flex-1 flex-col gap-0 overflow-auto group-data-[collapsible=icon]:overflow-hidden\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group\"\n data-sidebar=\"group\"\n className={cn(\"relative flex w-full min-w-0 flex-col p-2\", className)}\n {...props}\n />\n );\n}\n\nfunction SidebarGroupLabel({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"div\"> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"div\";\n\n return (\n <Comp\n data-slot=\"sidebar-group-label\"\n data-sidebar=\"group-label\"\n className={cn(\n \"flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium text-sidebar-foreground/70 ring-sidebar-ring outline-hidden transition-[margin,opacity] duration-200 ease-linear group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0 focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarGroupAction({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"button\";\n\n return (\n <Comp\n data-slot=\"sidebar-group-action\"\n data-sidebar=\"group-action\"\n className={cn(\n \"absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform group-data-[collapsible=icon]:hidden after:absolute after:-inset-2 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 md:after:hidden [&>svg]:size-4 [&>svg]:shrink-0\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarGroupContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group-content\"\n data-sidebar=\"group-content\"\n className={cn(\"w-full text-sm\", className)}\n {...props}\n />\n );\n}\n\nfunction SidebarMenu({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu\"\n data-sidebar=\"menu\"\n className={cn(\"flex w-full min-w-0 flex-col gap-0\", className)}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuItem({ className, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-item\"\n data-sidebar=\"menu-item\"\n className={cn(\"group/menu-item relative\", className)}\n {...props}\n />\n );\n}\n\nconst sidebarMenuButtonVariants = cva(\n \"peer/menu-button group/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm ring-sidebar-ring outline-hidden transition-[width,height,padding] group-has-data-[sidebar=menu-action]/menu-item:pr-8 group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-open:hover:bg-sidebar-accent data-open:hover:text-sidebar-accent-foreground data-active:bg-sidebar-accent data-active:font-medium data-active:text-sidebar-accent-foreground [&_svg]:size-4 [&_svg]:shrink-0 [&>span:last-child]:truncate\",\n {\n variants: {\n variant: {\n default: \"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n outline:\n \"bg-background shadow-[0_0_0_1px_var(--sidebar-border)] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_var(--sidebar-accent)]\",\n },\n size: {\n default: \"h-8 text-sm\",\n sm: \"h-7 text-xs\",\n lg: \"h-12 text-sm group-data-[collapsible=icon]:p-0!\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nfunction SidebarMenuButton({\n asChild = false,\n isActive = false,\n variant = \"default\",\n size = \"default\",\n tooltip,\n className,\n ...props\n}: React.ComponentProps<\"button\"> & {\n asChild?: boolean;\n isActive?: boolean;\n tooltip?: string | React.ComponentProps<typeof TooltipContent>;\n} & VariantProps<typeof sidebarMenuButtonVariants>) {\n const Comp = asChild ? Slot.Root : \"button\";\n const { isMobile, state } = useSidebar();\n\n const button = (\n <Comp\n data-slot=\"sidebar-menu-button\"\n data-sidebar=\"menu-button\"\n data-size={size}\n data-active={isActive}\n className={cn(sidebarMenuButtonVariants({ variant, size }), className)}\n {...props}\n />\n );\n\n if (!tooltip) {\n return button;\n }\n\n if (typeof tooltip === \"string\") {\n tooltip = {\n children: tooltip,\n };\n }\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent\n side=\"right\"\n align=\"center\"\n hidden={state !== \"collapsed\" || isMobile}\n {...tooltip}\n />\n </Tooltip>\n );\n}\n\nfunction SidebarMenuAction({\n className,\n asChild = false,\n showOnHover = false,\n ...props\n}: React.ComponentProps<\"button\"> & {\n asChild?: boolean;\n showOnHover?: boolean;\n}) {\n const Comp = asChild ? Slot.Root : \"button\";\n\n return (\n <Comp\n data-slot=\"sidebar-menu-action\"\n data-sidebar=\"menu-action\"\n className={cn(\n \"absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform group-data-[collapsible=icon]:hidden peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 after:absolute after:-inset-2 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 md:after:hidden [&>svg]:size-4 [&>svg]:shrink-0\",\n showOnHover &&\n \"group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 peer-data-active/menu-button:text-sidebar-accent-foreground aria-expanded:opacity-100 md:opacity-0\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuBadge({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-menu-badge\"\n data-sidebar=\"menu-badge\"\n className={cn(\n \"pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium text-sidebar-foreground tabular-nums select-none group-data-[collapsible=icon]:hidden peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 peer-data-active/menu-button:text-sidebar-accent-foreground\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuSkeleton({\n className,\n showIcon = false,\n ...props\n}: React.ComponentProps<\"div\"> & {\n showIcon?: boolean;\n}) {\n // Random width between 50 to 90%.\n const [width] = React.useState(() => {\n return `${Math.floor(Math.random() * 40) + 50}%`;\n });\n\n return (\n <div\n data-slot=\"sidebar-menu-skeleton\"\n data-sidebar=\"menu-skeleton\"\n className={cn(\"flex h-8 items-center gap-2 rounded-md px-2\", className)}\n {...props}\n >\n {showIcon && <Skeleton className=\"size-4 rounded-md\" data-sidebar=\"menu-skeleton-icon\" />}\n <Skeleton\n className=\"h-4 max-w-(--skeleton-width) flex-1\"\n data-sidebar=\"menu-skeleton-text\"\n style={\n {\n \"--skeleton-width\": width,\n } as React.CSSProperties\n }\n />\n </div>\n );\n}\n\nfunction SidebarMenuSub({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu-sub\"\n data-sidebar=\"menu-sub\"\n className={cn(\n \"mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5 group-data-[collapsible=icon]:hidden\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuSubItem({ className, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-sub-item\"\n data-sidebar=\"menu-sub-item\"\n className={cn(\"group/menu-sub-item relative\", className)}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuSubButton({\n asChild = false,\n size = \"md\",\n isActive = false,\n className,\n ...props\n}: React.ComponentProps<\"a\"> & {\n asChild?: boolean;\n size?: \"sm\" | \"md\";\n isActive?: boolean;\n}) {\n const Comp = asChild ? Slot.Root : \"a\";\n\n return (\n <Comp\n data-slot=\"sidebar-menu-sub-button\"\n data-sidebar=\"menu-sub-button\"\n data-size={size}\n data-active={isActive}\n className={cn(\n \"flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground ring-sidebar-ring outline-hidden group-data-[collapsible=icon]:hidden hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[size=md]:text-sm data-[size=sm]:text-xs data-active:bg-sidebar-accent data-active:text-sidebar-accent-foreground [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInput,\n SidebarInset,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n useSidebar,\n};\n","export const MARK_BARS = [\n { x: 3, y: 3, width: 4, height: 18 },\n { x: 7, y: 3, width: 10, height: 4 },\n { x: 7, y: 17, width: 10, height: 4 },\n { x: 17, y: 3, width: 4, height: 18 },\n { x: 0, y: 10.6, width: 3, height: 2.8 },\n { x: 21, y: 10.6, width: 3, height: 2.8 },\n];\n\nexport const RESUME_TRIANGLE = \"M10 8.4 L15.4 12 L10 15.6 Z\";\n","import { MARK_BARS, RESUME_TRIANGLE } from \"./marks-geometry\";\n\nexport function AnimatedDurablexMark({\n size = 22,\n className,\n}: {\n size?: number;\n className?: string;\n}) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n className={className ? `dx-mark ${className}` : \"dx-mark\"}\n role=\"img\"\n aria-label=\"Durablex: a run crashes, then resumes from its last checkpoint\"\n >\n <g className=\"dx-bars\">\n {MARK_BARS.map((b, i) => (\n <rect key={i} {...b} fill=\"currentColor\" />\n ))}\n </g>\n <g className=\"dx-fault\">\n {MARK_BARS.map((b, i) => (\n <rect key={i} {...b} fill=\"var(--dx-fault)\" />\n ))}\n </g>\n <g className=\"dx-resume\">\n <path d={RESUME_TRIANGLE} fill=\"var(--primary)\" />\n </g>\n </svg>\n );\n}\n","import { AnimatedDurablexMark } from \"./AnimatedDurablexMark\";\n\nexport function DurablexLogo() {\n return (\n <span className=\"text-foreground inline-flex items-center gap-2.5\">\n <AnimatedDurablexMark size={30} className=\"shrink-0\" />\n <span className=\"text-xl font-semibold tracking-tight group-data-[collapsible=icon]:hidden\">\n Durable<span className=\"text-primary\">x</span>\n </span>\n </span>\n );\n}\n","import type { LucideIcon } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport { DurablexLogo } from \"../components/DurablexLogo\";\nimport {\n Sidebar as SidebarPrimitive,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n} from \"../ui/sidebar\";\n\nexport interface NavItem {\n key: string;\n label: string;\n icon: LucideIcon;\n count?: number;\n}\n\nexport interface NavGroup {\n label: string;\n items: NavItem[];\n}\n\nexport function Sidebar({\n groups,\n active,\n onSelect,\n footer,\n}: {\n groups: NavGroup[];\n active: string;\n onSelect(key: string): void;\n footer?: ReactNode;\n}) {\n return (\n <SidebarPrimitive collapsible=\"icon\">\n <SidebarHeader>\n <div className=\"flex items-center gap-2 px-2 py-2.5\">\n <DurablexLogo />\n </div>\n </SidebarHeader>\n <SidebarContent>\n {groups.map((group) => (\n <SidebarGroup key={group.label}>\n <SidebarGroupLabel>{group.label}</SidebarGroupLabel>\n <SidebarGroupContent>\n <SidebarMenu>\n {group.items.map((item) => (\n <SidebarMenuItem key={item.key}>\n <SidebarMenuButton\n isActive={active === item.key}\n tooltip={item.label}\n onClick={() => onSelect(item.key)}\n >\n <item.icon />\n <span>{item.label}</span>\n {item.count != null && (\n <span className=\"text-muted-foreground ml-auto font-mono text-[11px] tabular-nums group-data-[collapsible=icon]:hidden\">\n {item.count}\n </span>\n )}\n </SidebarMenuButton>\n </SidebarMenuItem>\n ))}\n </SidebarMenu>\n </SidebarGroupContent>\n </SidebarGroup>\n ))}\n </SidebarContent>\n {footer && <SidebarFooter>{footer}</SidebarFooter>}\n </SidebarPrimitive>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { SidebarTrigger } from \"../ui/sidebar\";\n\nexport function Topbar({\n title,\n subtitle,\n rightSlot,\n}: {\n title: string;\n subtitle?: string;\n rightSlot?: ReactNode;\n}) {\n return (\n <header className=\"flex h-12 shrink-0 items-center gap-2 border-b px-4\">\n <SidebarTrigger />\n <h1 className=\"text-sm font-semibold tracking-tight\">{title}</h1>\n {subtitle && <span className=\"text-muted-foreground text-xs\">{subtitle}</span>}\n <span className=\"flex-1\" />\n {rightSlot}\n </header>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { SidebarInset, SidebarProvider } from \"../ui/sidebar\";\nimport { Sidebar, type NavGroup } from \"./Sidebar\";\nimport { Topbar } from \"./Topbar\";\n\nexport function AppShell({\n groups,\n active,\n onSelect,\n title,\n subtitle,\n rightSlot,\n sidebarFooter,\n children,\n}: {\n groups: NavGroup[];\n active: string;\n onSelect(key: string): void;\n title: string;\n subtitle?: string;\n rightSlot?: ReactNode;\n sidebarFooter?: ReactNode;\n children: ReactNode;\n}) {\n return (\n <SidebarProvider>\n <Sidebar groups={groups} active={active} onSelect={onSelect} footer={sidebarFooter} />\n <SidebarInset className=\"min-w-0\">\n <Topbar title={title} subtitle={subtitle} rightSlot={rightSlot} />\n {children}\n </SidebarInset>\n </SidebarProvider>\n );\n}\n","import { useCallback, useState } from \"react\";\n\n// Copy text and flip `copied` for a beat. navigator.clipboard is undefined in non-secure\n// contexts (http on a non-localhost host), so guard it rather than throwing on click.\nexport function useCopyToClipboard(resetMs = 1200) {\n const [copied, setCopied] = useState(false);\n\n const copy = useCallback(\n (text: string) => {\n void navigator.clipboard?.writeText(text).then(\n () => {\n setCopied(true);\n setTimeout(() => setCopied(false), resetMs);\n },\n () => undefined,\n );\n },\n [resetMs],\n );\n\n return { copied, copy };\n}\n","import type { StepErrorInfo } from \"@durablex/react\";\n\nexport function formatError(error: StepErrorInfo): string {\n return error.stack ? `${error.message}\\n\\n${error.stack}` : error.message;\n}\n\nexport function formatDuration(ms?: number | null): string {\n if (ms === null || ms === undefined) return \"-\";\n if (ms < 1000) return `${ms}ms`;\n const s = ms / 1000;\n if (s < 60) return `${s.toFixed(1)}s`;\n const m = s / 60;\n if (m < 60) return `${m.toFixed(1)}m`;\n return `${(m / 60).toFixed(1)}h`;\n}\n\nexport function formatTime(iso?: string | null): string {\n if (!iso) return \"-\";\n return new Date(iso).toLocaleTimeString([], { hour12: false });\n}\n\n// Time until a scheduled fire, as \"in 3m\". A non-positive delta reads as \"due\"\n// (the sweep runs on an interval, so a just-passed tick has not fired yet).\nexport function formatNextFire(iso?: string | null): string {\n if (!iso) return \"-\";\n const sec = (new Date(iso).getTime() - Date.now()) / 1000;\n if (sec <= 0) return \"due\";\n if (sec < 60) return `in ${Math.floor(sec)}s`;\n const min = sec / 60;\n if (min < 60) return `in ${Math.floor(min)}m`;\n const hr = min / 60;\n if (hr < 24) return `in ${Math.floor(hr)}h`;\n return `in ${Math.floor(hr / 24)}d`;\n}\n\nexport function formatRelative(iso?: string | null): string {\n if (!iso) return \"-\";\n const sec = Math.max(0, (Date.now() - new Date(iso).getTime()) / 1000);\n if (sec < 60) return `${Math.floor(sec)}s ago`;\n const min = sec / 60;\n if (min < 60) return `${Math.floor(min)}m ago`;\n const hr = min / 60;\n if (hr < 24) return `${Math.floor(hr)}h ago`;\n return `${Math.floor(hr / 24)}d ago`;\n}\n","import type { LogFrame, TimelineFrame } from \"@durablex/react\";\n\nexport const ROOT_SCOPE = \"@root\";\n\n// Stable empty array so a step with no logs passes the same reference every render.\nexport const NO_LOGS: LogFrame[] = [];\n\nexport interface RunLogs {\n // Step-scoped logs keyed by `${name}:${attempt}`, matching one step-attempt row.\n byStep: Map<string, LogFrame[]>;\n // Handler-level logs (scope '@root'), which belong to the run, not a step.\n root: LogFrame[];\n}\n\nexport function stepLogKey(name: string, attempt: number): string {\n return `${name}:${attempt}`;\n}\n\nexport function groupLogs(frames: TimelineFrame[]): RunLogs {\n const byStep = new Map<string, LogFrame[]>();\n const root: LogFrame[] = [];\n for (const f of frames) {\n if (f.kind !== \"log\") continue;\n if (f.scope === ROOT_SCOPE) {\n root.push(f);\n continue;\n }\n const key = stepLogKey(f.scope, f.attempt);\n const list = byStep.get(key);\n if (list) list.push(f);\n else byStep.set(key, [f]);\n }\n return { byStep, root };\n}\n","import type { Run, Step, StepStatus } from \"@durablex/react\";\n\n// 1-based ordinal of the run's current step, from the counts the runs list carries.\n// A terminal run has no live current step, so it reads as total/total.\nexport function currentStepNumber(run: Run): number {\n return run.currentStepIndex >= 0 ? run.currentStepIndex + 1 : run.stepCount;\n}\n\n// expectedStepTotals maps a workflow to the largest step count seen among its\n// finished runs - the denominator estimate for a run still discovering its steps.\n// A workflow's total isn't known up front (steps are discovered as the handler\n// executes, and can branch), so the dashboard estimates it from prior runs.\nexport function expectedStepTotals(runs: Run[]): Map<string, number> {\n const totals = new Map<string, number>();\n for (const r of runs) {\n if (!r.endedAt) continue;\n if (r.stepCount > (totals.get(r.workflowName) ?? 0)) {\n totals.set(r.workflowName, r.stepCount);\n }\n }\n return totals;\n}\n\n// The runs-table step label as \"{ix}/{total}\". A finished run shows its real\n// total; a live one uses the estimate from prior runs of the same workflow, never\n// below the steps it has already reached (so it never reads as e.g. 5/3).\nexport function stepCellLabel(run: Run, expectedTotal?: number): string {\n const ix = currentStepNumber(run);\n const total = run.endedAt ? run.stepCount : Math.max(run.stepCount, expectedTotal ?? 0);\n return `${ix}/${total}`;\n}\n\nconst FINISHED: ReadonlySet<StepStatus> = new Set([\"succeeded\", \"failed\", \"cancelled\", \"skipped\"]);\n\n// Position of the run within its step list, as \"{ix}/{total}\". The current step\n// (matched by name) anchors the index; otherwise it falls back to the count of\n// finished steps so terminal runs read as total/total.\nexport function stepProgress(run: Run, steps: Step[]): { ix: number; total: number } {\n const total = steps.length;\n if (total === 0) return { ix: 0, total: 0 };\n const cur = run.currentStepName ? steps.findIndex((s) => s.name === run.currentStepName) : -1;\n if (cur >= 0) return { ix: cur + 1, total };\n return { ix: steps.filter((s) => FINISHED.has(s.status)).length, total };\n}\n","export function Meta({\n label,\n value,\n error,\n onClick,\n title,\n}: {\n label: string;\n value: string;\n error?: boolean;\n onClick?: () => void;\n title?: string;\n}) {\n return (\n <div className=\"meta\">\n <span className=\"meta-k\">{label}</span>\n {onClick ? (\n <button\n type=\"button\"\n className=\"meta-v cursor-pointer border-0 bg-transparent p-0 text-left underline underline-offset-2\"\n title={title}\n onClick={onClick}\n >\n {value}\n </button>\n ) : (\n <span className={\"meta-v\" + (error ? \" err\" : \"\")}>{value}</span>\n )}\n </div>\n );\n}\n","export type JsonTokenKind = \"key\" | \"str\" | \"num\" | \"bool\" | \"null\" | \"punc\";\n\nexport const JSON_TOKEN_COLOR: Record<JsonTokenKind, string> = {\n key: \"var(--foreground)\",\n str: \"var(--st-succeeded-fg)\",\n num: \"var(--st-running-fg)\",\n bool: \"var(--primary)\",\n null: \"var(--muted-foreground)\",\n punc: \"color-mix(in oklch, var(--muted-foreground) 70%, transparent)\",\n};\n\nconst TOKEN =\n /\"(?:\\\\.|[^\"\\\\])*\"(\\s*:)?|\\b(?:true|false)\\b|\\bnull\\b|-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?/g;\n\nexport function tokenizeJson(src: string): { text: string; kind: JsonTokenKind }[] {\n const out: { text: string; kind: JsonTokenKind }[] = [];\n let last = 0;\n let m: RegExpExecArray | null;\n TOKEN.lastIndex = 0;\n while ((m = TOKEN.exec(src)) !== null) {\n if (m.index > last) out.push({ text: src.slice(last, m.index), kind: \"punc\" });\n const s = m[0];\n if (s[0] === '\"') {\n if (m[1]) {\n const q = s.lastIndexOf('\"') + 1;\n out.push({ text: s.slice(0, q), kind: \"key\" });\n out.push({ text: s.slice(q), kind: \"punc\" });\n } else {\n out.push({ text: s, kind: \"str\" });\n }\n } else if (s === \"true\" || s === \"false\") {\n out.push({ text: s, kind: \"bool\" });\n } else if (s === \"null\") {\n out.push({ text: s, kind: \"null\" });\n } else {\n out.push({ text: s, kind: \"num\" });\n }\n last = TOKEN.lastIndex;\n }\n if (last < src.length) out.push({ text: src.slice(last), kind: \"punc\" });\n return out;\n}\n\nexport type ParsedJson = { ok: true; value: unknown } | { ok: false; error: string };\n\nexport function parseJson(raw: string): ParsedJson {\n const text = raw.trim();\n if (text === \"\") return { ok: true, value: {} };\n try {\n return { ok: true, value: JSON.parse(text) };\n } catch {\n return { ok: false, error: \"Payload must be valid JSON\" };\n }\n}\n\nexport function highlightedJsonSpans(text: string) {\n return tokenizeJson(text).map((tok, i) => ({\n key: i,\n text: tok.text,\n color: JSON_TOKEN_COLOR[tok.kind],\n bold: tok.kind === \"bool\",\n italic: tok.kind === \"null\",\n }));\n}\n","import { useCopyToClipboard } from \"../hooks/use-copy\";\nimport { highlightedJsonSpans } from \"../lib/json-highlight\";\n\nexport function JsonBlock({ value }: { value: unknown }) {\n if (value === null || value === undefined) {\n return <p className=\"text-muted-foreground px-4 py-2.5 font-mono text-xs italic\">null</p>;\n }\n const text = JSON.stringify(value, null, 2);\n return (\n <div\n className=\"relative\"\n style={{ backgroundColor: \"color-mix(in oklch, var(--foreground) 5%, var(--card))\" }}\n >\n <CopyButton text={text} />\n <pre className=\"text-foreground max-h-72 overflow-auto px-4 py-2.5 font-mono text-[11.5px] leading-[1.7] tabular-nums\">\n {highlightedJsonSpans(text).map((tok) => (\n <span\n key={tok.key}\n style={{\n color: tok.color,\n fontWeight: tok.bold ? 500 : undefined,\n fontStyle: tok.italic ? \"italic\" : undefined,\n }}\n >\n {tok.text}\n </span>\n ))}\n </pre>\n </div>\n );\n}\n\nfunction CopyButton({ text }: { text: string }) {\n const { copied, copy } = useCopyToClipboard();\n return (\n <button\n type=\"button\"\n onClick={() => copy(text)}\n className=\"text-muted-foreground hover:text-foreground hover:bg-accent absolute top-[8px] right-[8px] border px-[7px] py-[2px] font-mono text-[9.5px] tracking-[0.05em] uppercase\"\n style={{\n backgroundColor: \"color-mix(in oklch, var(--card) 78%, transparent)\",\n backdropFilter: \"blur(3px)\",\n }}\n >\n {copied ? \"copied\" : \"copy\"}\n </button>\n );\n}\n","import type { LogFrame } from \"@durablex/react\";\nimport { formatTime } from \"../lib/format\";\n\nconst LEVEL_FG: Record<LogFrame[\"level\"], string> = {\n debug: \"var(--st-skipped-fg)\",\n info: \"var(--st-running-fg)\",\n warn: \"var(--st-waiting-fg)\",\n error: \"var(--st-failed-fg)\",\n};\n\nexport function LogList({ logs }: { logs: LogFrame[] }) {\n if (logs.length === 0) {\n return <p className=\"px-4 py-2.5 font-mono text-xs text-muted-foreground italic\">No logs.</p>;\n }\n return (\n <div\n className=\"flex max-h-72 flex-col gap-1.5 overflow-auto px-4 py-2.5 text-[12px] leading-[1.6]\"\n style={{ backgroundColor: \"color-mix(in oklch, var(--foreground) 5%, var(--card))\" }}\n >\n {logs.map((log) => {\n const fields = log.fields && Object.keys(log.fields).length > 0 ? log.fields : null;\n return (\n <div key={log.seq} className=\"flex w-max items-baseline gap-2 whitespace-nowrap\">\n <span className=\"tnum text-[11px] text-muted-foreground\">{formatTime(log.ts)}</span>\n <span\n className=\"font-medium uppercase text-[10px]\"\n style={{ color: LEVEL_FG[log.level] }}\n >\n {log.level}\n </span>\n <span>{log.message}</span>\n {fields && (\n <>\n <span className=\"text-muted-foreground\" aria-hidden>\n ·\n </span>\n <code className=\"text-[11px] text-muted-foreground\">{JSON.stringify(fields)}</code>\n </>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n","import { TriangleAlert } from \"lucide-react\";\nimport { useState } from \"react\";\nimport type { LogFrame, Run } from \"@durablex/react\";\nimport { formatError } from \"../lib/format\";\nimport { JsonBlock } from \"./JsonBlock\";\nimport { LogList } from \"./LogList\";\n\n// The run's panes: Error first (a failed run lands on it), then Input, Result, and\n// the run-level logs. Error and Result are mutually exclusive (a run either failed\n// or produced a result).\nconst PAYLOAD_TAB_LABEL = {\n error: \"Error\",\n input: \"Input\",\n result: \"Result\",\n logs: \"Logs\",\n} as const;\ntype PayloadTab = keyof typeof PAYLOAD_TAB_LABEL;\n\nfunction resultPlaceholder(status: Run[\"status\"]): string {\n if (status === \"failed\") return \"- no result (run failed)\";\n if (status === \"running\" || status === \"waiting\" || status === \"queued\") {\n return \"- pending (still running)\";\n }\n return \"null\";\n}\n\nexport function PayloadTabs({ run, logs }: { run: Run; logs: LogFrame[] }) {\n const hasResult = run.result !== null && run.result !== undefined;\n const tabs: PayloadTab[] = [];\n if (run.error) tabs.push(\"error\");\n tabs.push(\"input\", \"result\");\n if (logs.length > 0) tabs.push(\"logs\");\n const [tab, setTab] = useState<PayloadTab>(() => (run.error ? \"error\" : \"input\"));\n\n return (\n <div className=\"section\">\n <div className=\"io-tabs\">\n {tabs.map((t) => (\n <button\n key={t}\n type=\"button\"\n className=\"io-tab\"\n data-kind={t}\n data-on={tab === t ? \"1\" : \"0\"}\n onClick={() => setTab(t)}\n >\n {t === \"error\" && <TriangleAlert className=\"step-tab-ico\" />}\n {PAYLOAD_TAB_LABEL[t]}\n {t === \"result\" && !hasResult && <span className=\"io-null\">null</span>}\n </button>\n ))}\n </div>\n {tab === \"error\" && run.error ? (\n <pre className=\"errbox\">{formatError(run.error)}</pre>\n ) : tab === \"logs\" ? (\n <LogList logs={logs} />\n ) : tab === \"input\" ? (\n <JsonBlock value={run.input} />\n ) : hasResult ? (\n <JsonBlock value={run.result} />\n ) : (\n <div className=\"jsonwrap\">\n <pre className=\"json\">\n <span className=\"nul\">{resultPlaceholder(run.status)}</span>\n </pre>\n </div>\n )}\n </div>\n );\n}\n","import { cn } from \"../lib/utils\";\nimport { MARK_BARS, RESUME_TRIANGLE } from \"./marks-geometry\";\n\ntype ResumeMarkProps = {\n size?: number;\n variant?: \"run\" | \"load\";\n fault?: boolean;\n className?: string;\n title?: string;\n};\n\nexport function ResumeMark({ size = 16, variant, fault, className, title }: ResumeMarkProps) {\n return (\n <span\n className={cn(\"dxmark\", variant && `dxm-${variant}`, className)}\n style={{ width: size, height: size }}\n role={title ? \"img\" : undefined}\n aria-label={title}\n aria-hidden={title ? undefined : true}\n >\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <g className=\"dxm-bars\">\n {MARK_BARS.map((b, i) => (\n <rect key={i} {...b} fill=\"currentColor\" />\n ))}\n </g>\n {fault && (\n <g className=\"dxm-fault\">\n {MARK_BARS.map((b, i) => (\n <rect key={i} {...b} fill=\"var(--st-failed-fg)\" />\n ))}\n </g>\n )}\n <path className=\"dxm-tri\" d={RESUME_TRIANGLE} fill=\"var(--dxm-accent, var(--primary))\" />\n </svg>\n </span>\n );\n}\n","import type { RunStatus, StepStatus } from \"@durablex/react\";\n\n// \"waiting\" reads as \"in progress\" to users, so it displays as \"Running\".\nexport const STATUS_LABELS: Record<RunStatus | StepStatus, string> = {\n queued: \"Queued\",\n running: \"Running\",\n waiting: \"Running\",\n paused: \"Paused\",\n succeeded: \"Succeeded\",\n failed: \"Failed\",\n cancelled: \"Cancelled\",\n skipped: \"Skipped\",\n};\n","import type { RunStatus, StepStatus } from \"@durablex/react\";\nimport { cn } from \"../lib/utils\";\nimport { ResumeMark } from \"./ResumeMark\";\nimport { STATUS_LABELS } from \"../lib/status-label\";\n\ntype Status = RunStatus | StepStatus;\n\nconst LIVE_STATUSES: ReadonlySet<Status> = new Set([\"running\", \"waiting\"]);\n\nexport function StatusBadge({\n status,\n small,\n label,\n className,\n}: {\n status: Status;\n small?: boolean;\n label?: string;\n className?: string;\n}) {\n const live = LIVE_STATUSES.has(status);\n return (\n <span\n className={cn(\n \"inline-flex items-center gap-1.5 border border-transparent font-medium leading-none whitespace-nowrap\",\n small ? \"h-[17px] px-1.5 text-[10px]\" : \"h-[19px] px-1.5 text-[11px]\",\n status === \"skipped\" && \"border-dashed\",\n className,\n )}\n style={{\n backgroundColor: `var(--st-${status}-bg)`,\n color: `var(--st-${status}-fg)`,\n borderColor:\n status === \"skipped\"\n ? \"color-mix(in oklch, var(--st-skipped-fg) 40%, transparent)\"\n : undefined,\n }}\n >\n {live ? (\n <ResumeMark variant=\"run\" size={small ? 12 : 13} className=\"badge-mark\" />\n ) : (\n <span\n className=\"size-[6px] shrink-0 rounded-full\"\n style={{ backgroundColor: `var(--st-${status}-fg)` }}\n />\n )}\n {label ?? STATUS_LABELS[status] ?? status}\n </span>\n );\n}\n","import type { Step } from \"@durablex/react\";\nimport { formatError } from \"./format\";\n\n// A step's expandable panes: Error first when it failed, then Input, Output, and\n// the ctx.log lines it emitted. Each is shown only when the step has that content.\nexport type StepTab = \"error\" | \"input\" | \"output\" | \"logs\";\n\nexport const STEP_TAB_LABEL: Record<StepTab, string> = {\n error: \"Error\",\n input: \"Input\",\n output: \"Output\",\n logs: \"Logs\",\n};\n\nexport function stepTabs(step: Step, hasLogs: boolean): StepTab[] {\n const tabs: StepTab[] = [];\n if (step.error) tabs.push(\"error\");\n if (step.input !== null && step.input !== undefined) tabs.push(\"input\");\n if (step.output !== null && step.output !== undefined) tabs.push(\"output\");\n if (hasLogs) tabs.push(\"logs\");\n return tabs;\n}\n\nexport function stepErrorText(step: Step): string {\n return step.error ? formatError(step.error) : \"\";\n}\n\n// The step a steps view selects by default: the failed step, else the\n// running/waiting one, else the first. Shared by the flow and timeline views.\nexport function initialStepSelection(steps: Step[]): number {\n const failed = steps.findIndex((s) => s.status === \"failed\");\n if (failed >= 0) return failed;\n const active = steps.findIndex((s) => s.status === \"running\" || s.status === \"waiting\");\n return active >= 0 ? active : 0;\n}\n","import type { StepStatus } from \"@durablex/react\";\n\n// A paused run leaves its in-flight step recorded as running/waiting in the engine\n// (pause only flips the run's status), so the inspector would otherwise show a\n// \"Running\" step under a \"Paused\" run. This derives a display-only status so that\n// step reads as paused too; it never changes the stored step status.\nexport type StepDisplayStatus = StepStatus | \"paused\";\n\nconst IN_FLIGHT: ReadonlySet<StepStatus> = new Set([\"running\", \"waiting\"]);\n\nexport function stepDisplayStatus(status: StepStatus, runPaused: boolean): StepDisplayStatus {\n return runPaused && IN_FLIGHT.has(status) ? \"paused\" : status;\n}\n","import { Check, CircleDot, Clock, Loader2, Pause, X } from \"lucide-react\";\nimport type { ComponentType } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport type { StepDisplayStatus } from \"../lib/step-display\";\n\nconst GLYPH: Record<StepDisplayStatus, ComponentType<{ className?: string }>> = {\n succeeded: Check,\n failed: X,\n cancelled: X,\n running: Loader2,\n waiting: Clock,\n skipped: CircleDot,\n paused: Pause,\n};\n\nexport function StepGlyph({\n status,\n className,\n}: {\n status: StepDisplayStatus;\n className?: string;\n}) {\n const Glyph = GLYPH[status] ?? CircleDot;\n return <Glyph className={cn(className, status === \"running\" && \"animate-spin\")} />;\n}\n","import { TriangleAlert } from \"lucide-react\";\nimport type { LogFrame, Step } from \"@durablex/react\";\nimport { STEP_TAB_LABEL, stepErrorText, type StepTab } from \"../lib/step-detail\";\nimport { JsonBlock } from \"./JsonBlock\";\nimport { LogList } from \"./LogList\";\n\nexport function StepTabsView({\n step,\n logs,\n tabs,\n tab,\n onTab,\n}: {\n step: Step;\n logs: LogFrame[];\n tabs: StepTab[];\n tab: StepTab | null;\n onTab(t: StepTab): void;\n}) {\n return (\n <>\n <div className=\"step-tabs\" role=\"tablist\">\n {tabs.map((t) => (\n <button\n key={t}\n type=\"button\"\n role=\"tab\"\n aria-selected={tab === t}\n className=\"step-tab\"\n data-kind={t}\n onClick={() => onTab(t)}\n >\n {t === \"error\" && <TriangleAlert className=\"step-tab-ico\" />}\n {STEP_TAB_LABEL[t]}\n </button>\n ))}\n </div>\n <div className=\"step-pane\">\n {tab === \"error\" ? (\n <pre className=\"errbox\">{stepErrorText(step)}</pre>\n ) : tab === \"logs\" ? (\n <LogList logs={logs} />\n ) : tab === \"input\" ? (\n <JsonBlock value={step.input} />\n ) : (\n <JsonBlock value={step.output} />\n )}\n </div>\n </>\n );\n}\n","import { type ReactNode, useState } from \"react\";\nimport type { LogFrame, Step } from \"@durablex/react\";\nimport { formatDuration } from \"../lib/format\";\nimport { stepTabs, type StepTab } from \"../lib/step-detail\";\nimport { stepDisplayStatus } from \"../lib/step-display\";\nimport { StepTabsView } from \"./StepTabsView\";\n\n// Keyed by selection in the parent so the tab resets on step change without a\n// setState-in-effect.\nexport function StepInspector({\n step,\n logs,\n index,\n total,\n runPaused,\n renderStepRetry,\n}: {\n step: Step;\n logs: LogFrame[];\n index: number;\n total: number;\n runPaused: boolean;\n renderStepRetry?: (stepName: string) => ReactNode;\n}) {\n const tabs = stepTabs(step, logs.length > 0);\n const [tab, setTab] = useState<StepTab | null>(tabs[0] ?? null);\n return (\n <div className=\"flow-inspect\">\n <div className=\"fi-head\">\n <span className=\"fi-dot\" data-status={stepDisplayStatus(step.status, runPaused)} />\n <span className=\"fi-name\">{step.name}</span>\n <span className=\"fi-meta\">\n step {index + 1}/{total} · {formatDuration(step.durationMs)}\n </span>\n {renderStepRetry?.(step.name)}\n </div>\n {tabs.length > 0 ? (\n <StepTabsView step={step} logs={logs} tabs={tabs} tab={tab} onTab={setTab} />\n ) : (\n <div className=\"fi-empty\">No output, error, or logs recorded for this step.</div>\n )}\n </div>\n );\n}\n","import { ChevronRight, TriangleAlert } from \"lucide-react\";\nimport { Fragment, type ReactNode, useState } from \"react\";\nimport type { Step } from \"@durablex/react\";\nimport { formatDuration } from \"../lib/format\";\nimport { NO_LOGS, type RunLogs, stepLogKey } from \"../lib/run-logs\";\nimport { STATUS_LABELS } from \"../lib/status-label\";\nimport { initialStepSelection } from \"../lib/step-detail\";\nimport { stepDisplayStatus } from \"../lib/step-display\";\nimport { StepGlyph } from \"./StepGlyph\";\nimport { StepInspector } from \"./StepInspector\";\n\nfunction FlowNode({\n step,\n selected,\n runPaused,\n onSelect,\n}: {\n step: Step;\n selected: boolean;\n runPaused: boolean;\n onSelect(): void;\n}) {\n const display = stepDisplayStatus(step.status, runPaused);\n return (\n <button\n type=\"button\"\n className={\"flow-node focusable\" + (selected ? \" sel\" : \"\")}\n data-status={display}\n aria-pressed={selected}\n onClick={onSelect}\n >\n <span className=\"fn-rail\" />\n <span className=\"fn-node\">\n <StepGlyph status={display} className=\"fn-gly\" />\n </span>\n <span className=\"fn-name\">{step.name}</span>\n {step.attempt > 1 && <span className=\"fn-att\">×{step.attempt}</span>}\n {display !== \"succeeded\" && (\n <span className=\"fn-status\">{STATUS_LABELS[display] ?? display}</span>\n )}\n {step.error && <TriangleAlert className=\"fn-errflag\" />}\n <span className=\"fn-dur\">{formatDuration(step.durationMs)}</span>\n </button>\n );\n}\n\nexport function StepFlow({\n steps,\n workflowName,\n runPaused,\n logs,\n renderStepRetry,\n}: {\n steps: Step[];\n workflowName: string;\n runPaused: boolean;\n logs: RunLogs;\n renderStepRetry?: (stepName: string) => ReactNode;\n}) {\n const [sel, setSel] = useState(() => initialStepSelection(steps));\n const step = steps[sel] ?? steps[0];\n if (!step) return null;\n\n return (\n <div className=\"stepflow\">\n <div className=\"flow-canvas\">\n <div className=\"flow-trigger\">\n <span className=\"flow-trigger-dot\" />\n <span>trigger</span>\n <span className=\"flow-trigger-wf\">{workflowName}</span>\n </div>\n {steps.map((s, i) => {\n const prev = steps[i - 1];\n return (\n <Fragment key={`${s.index}-${s.attempt}`}>\n <div\n className=\"flow-edge\"\n data-status={prev ? prev.status : \"trigger\"}\n aria-hidden=\"true\"\n >\n <span className=\"fe-line\" />\n <ChevronRight className=\"fe-arrow\" />\n </div>\n <FlowNode\n step={s}\n selected={i === sel}\n runPaused={runPaused}\n onSelect={() => setSel(i)}\n />\n </Fragment>\n );\n })}\n </div>\n <StepInspector\n key={sel}\n step={step}\n logs={logs.byStep.get(stepLogKey(step.name, step.attempt)) ?? NO_LOGS}\n index={sel}\n total={steps.length}\n runPaused={runPaused}\n renderStepRetry={renderStepRetry}\n />\n </div>\n );\n}\n","import { ChevronRight } from \"lucide-react\";\nimport { type ReactNode, useState } from \"react\";\nimport type { LogFrame, Step } from \"@durablex/react\";\nimport { formatDuration } from \"../lib/format\";\nimport { STATUS_LABELS } from \"../lib/status-label\";\nimport { stepTabs, type StepTab } from \"../lib/step-detail\";\nimport { stepDisplayStatus } from \"../lib/step-display\";\nimport { StepGlyph } from \"./StepGlyph\";\nimport { StepTabsView } from \"./StepTabsView\";\n\nexport function StepRow({\n step,\n index,\n current,\n runPaused,\n logs,\n renderStepRetry,\n}: {\n step: Step;\n index: number;\n current: boolean;\n runPaused: boolean;\n logs: LogFrame[];\n renderStepRetry?: (stepName: string) => ReactNode;\n}) {\n const tabs = stepTabs(step, logs.length > 0);\n const retry = renderStepRetry?.(step.name);\n const expandable = tabs.length > 0 || retry != null;\n const [open, setOpen] = useState(step.status === \"failed\");\n const [tab, setTab] = useState<StepTab | null>(tabs[0] ?? null);\n const display = stepDisplayStatus(step.status, runPaused);\n\n return (\n <div\n className={\"step\" + (open ? \" open\" : \"\")}\n data-status={display}\n data-current={current ? \"1\" : undefined}\n >\n <button\n type=\"button\"\n className={\"step-row focusable\" + (expandable ? \"\" : \" static\")}\n aria-expanded={expandable ? open : undefined}\n onClick={() => expandable && setOpen(!open)}\n >\n <span className=\"step-node\">\n <StepGlyph status={display} className=\"step-gly\" />\n </span>\n <span className=\"step-ix\">{index}</span>\n <span className=\"step-name\">{step.name}</span>\n <span className=\"step-meta\">\n {display !== \"succeeded\" && (\n <span className=\"step-status\">{STATUS_LABELS[display] ?? display}</span>\n )}\n {step.attempt > 1 && <span className=\"step-att\">×{step.attempt}</span>}\n <span className=\"step-dur\">{formatDuration(step.durationMs)}</span>\n {expandable ? <ChevronRight className=\"step-chev\" /> : <span className=\"step-chev-sp\" />}\n </span>\n </button>\n {open && expandable && (\n <div className=\"step-body\">\n {tabs.length > 0 && (\n <StepTabsView step={step} logs={logs} tabs={tabs} tab={tab} onTab={setTab} />\n )}\n {retry && <div className=\"step-actions\">{retry}</div>}\n </div>\n )}\n </div>\n );\n}\n","import type { Step } from \"@durablex/react\";\n\nexport interface TimelineLane {\n step: Step;\n // Percentage offsets along the run's span; leftPct is null when the step never\n // started (queued/skipped), so the view renders a placeholder instead of a bar.\n leftPct: number | null;\n widthPct: number;\n}\n\nexport interface TimelineLayout {\n lanes: TimelineLane[];\n totalMs: number;\n}\n\n// A bar narrower than this is widened to stay visible (a sub-millisecond step on a\n// multi-second span would otherwise render as a hairline).\nconst MIN_BAR_PCT = 1.5;\n\n// buildTimelineLayout places each step on a shared axis running from the earliest\n// step start to the latest end. An unfinished step (running/waiting) extends to\n// `now`, so its bar grows until it completes.\nexport function buildTimelineLayout(steps: Step[], now: number): TimelineLayout {\n // Parse each step's timestamps once; a not-started step has start === null and\n // does not extend the axis (its placeholder bar carries no span).\n const spans = steps.map((step) => ({\n step,\n start: step.startedAt ? Date.parse(step.startedAt) : null,\n end: step.endedAt ? Date.parse(step.endedAt) : now,\n }));\n\n let min = Infinity;\n let max = 0;\n for (const s of spans) {\n if (s.start === null) continue;\n if (s.start < min) min = s.start;\n if (s.end > max) max = s.end;\n }\n if (min === Infinity) min = 0;\n const totalMs = Math.max(max - min, 1);\n\n const lanes = spans.map<TimelineLane>(({ step, start, end }) => {\n if (start === null) return { step, leftPct: null, widthPct: 0 };\n const leftPct = ((start - min) / totalMs) * 100;\n const widthPct = Math.max(((end - start) / totalMs) * 100, MIN_BAR_PCT);\n return { step, leftPct, widthPct };\n });\n\n return { lanes, totalMs };\n}\n","import { type ReactNode, useEffect, useMemo, useState } from \"react\";\nimport type { Step } from \"@durablex/react\";\nimport { formatDuration } from \"../lib/format\";\nimport { NO_LOGS, type RunLogs, stepLogKey } from \"../lib/run-logs\";\nimport { initialStepSelection } from \"../lib/step-detail\";\nimport { stepDisplayStatus } from \"../lib/step-display\";\nimport { buildTimelineLayout } from \"../lib/step-timeline\";\nimport { StepInspector } from \"./StepInspector\";\n\nexport function StepTimeline({\n steps,\n runPaused,\n logs,\n renderStepRetry,\n}: {\n steps: Step[];\n runPaused: boolean;\n logs: RunLogs;\n renderStepRetry?: (stepName: string) => ReactNode;\n}) {\n const [sel, setSel] = useState(() => initialStepSelection(steps));\n // An unfinished step's bar extends to \"now\"; tick it while any step is in\n // flight so the bar grows, and leave it frozen for a terminal or paused run.\n const ticking = !runPaused && steps.some((s) => s.status === \"running\" || s.status === \"waiting\");\n const [now, setNow] = useState(() => Date.now());\n useEffect(() => {\n if (!ticking) return;\n const id = setInterval(() => setNow(Date.now()), 1000);\n return () => clearInterval(id);\n }, [ticking]);\n\n const layout = useMemo(() => buildTimelineLayout(steps, now), [steps, now]);\n const step = steps[sel] ?? steps[0];\n if (!step) return null;\n\n // Axis ticks are cumulative offsets from the run's start, so every label carries a\n // leading \"+\" (the first reads \"+0ms\"), keeping the offset convention uniform.\n const ticks = [0, 0.25, 0.5, 0.75, 1].map(\n (f) => `+${formatDuration(Math.round(layout.totalMs * f))}`,\n );\n\n return (\n <div className=\"steptl\">\n <div className=\"tl-canvas\">\n <div className=\"tl-axis\" aria-hidden=\"true\">\n <span className=\"tl-axis-scale\">\n {ticks.map((label, i) => (\n <span key={i}>{label}</span>\n ))}\n </span>\n </div>\n {layout.lanes.map((lane, i) => (\n <button\n key={`${lane.step.index}-${lane.step.attempt}`}\n type=\"button\"\n className={\"tl-row focusable\" + (i === sel ? \" sel\" : \"\")}\n aria-pressed={i === sel}\n onClick={() => setSel(i)}\n >\n <span className=\"tl-label\">{lane.step.name}</span>\n <span className=\"tl-track\">\n {lane.leftPct === null ? (\n <span className=\"tl-skip\">not started</span>\n ) : (\n <span\n className=\"tl-bar\"\n data-status={stepDisplayStatus(lane.step.status, runPaused)}\n style={{ left: `${lane.leftPct}%`, width: `${lane.widthPct}%` }}\n />\n )}\n </span>\n <span className=\"tl-dur tnum\">{formatDuration(lane.step.durationMs)}</span>\n </button>\n ))}\n </div>\n <StepInspector\n key={sel}\n step={step}\n logs={logs.byStep.get(stepLogKey(step.name, step.attempt)) ?? NO_LOGS}\n index={sel}\n total={steps.length}\n runPaused={runPaused}\n renderStepRetry={renderStepRetry}\n />\n </div>\n );\n}\n","import { BarChartHorizontalBig, Check, Copy, Loader2, Workflow, X } from \"lucide-react\";\nimport { type ReactNode, useMemo, useState } from \"react\";\nimport {\n ACTIVE_STATUSES,\n type Run,\n type Step,\n TERMINAL_STATUSES,\n useRun,\n useRunStats,\n useRunStream,\n useRunSteps,\n useWorkflows,\n} from \"@durablex/react\";\nimport { useCopyToClipboard } from \"../hooks/use-copy\";\nimport { formatDuration, formatNextFire, formatTime } from \"../lib/format\";\nimport { groupLogs, NO_LOGS, type RunLogs, stepLogKey } from \"../lib/run-logs\";\nimport { stepProgress } from \"../lib/run-progress\";\nimport { Meta } from \"./Meta\";\nimport { PayloadTabs } from \"./PayloadTabs\";\nimport { StatusBadge } from \"./StatusBadge\";\nimport { StepFlow } from \"./StepFlow\";\nimport { StepRow } from \"./StepRow\";\nimport { StepTimeline } from \"./StepTimeline\";\n\ntype StepsView = \"list\" | \"flow\" | \"timeline\";\n\nexport interface RunInspectorProps {\n runId: string;\n onClose(): void;\n onFilterByEvent?: (eventId: string, eventName?: string) => void;\n onOpenRun?: (runId: string) => void;\n onShowReplays?: (runId: string) => void;\n // Control actions stay in the consumer; the kit feeds each slot the data it needs.\n // renderStepRetry is offered only on a terminal run, so the consumer never gates it.\n renderActions?: (run: Run) => ReactNode;\n renderControlHistory?: (runId: string) => ReactNode;\n renderStepRetry?: (runId: string, stepName: string) => ReactNode;\n}\n\nexport function RunInspector({\n runId,\n onClose,\n onFilterByEvent,\n onOpenRun,\n onShowReplays,\n renderActions,\n renderControlHistory,\n renderStepRetry,\n}: RunInspectorProps) {\n const run = useRun(runId);\n const status = run.data?.status;\n const isActive = status !== undefined && ACTIVE_STATUSES.has(status);\n const isPaused = status === \"paused\";\n const retryRunId = status !== undefined && TERMINAL_STATUSES.has(status) ? runId : undefined;\n const steps = useRunSteps(runId, isActive);\n const frames = useRunStream(runId);\n const logs = useMemo(() => groupLogs(frames), [frames]);\n const { data: workflows } = useWorkflows();\n const replayCount = useRunStats({ replayOf: runId }, { poll: false }).data?.total ?? 0;\n const [view, setView] = useState<StepsView>(\"list\");\n\n const stepRetry =\n retryRunId && renderStepRetry\n ? (stepName: string) => renderStepRetry(retryRunId, stepName)\n : undefined;\n\n if (run.isLoading) {\n return (\n <div className=\"run-panel\">\n <div className=\"steps-loading\">\n <Loader2 className=\"size-4 animate-spin\" />\n </div>\n </div>\n );\n }\n\n if (run.isError || !run.data) {\n return (\n <div className=\"run-panel\">\n <div className=\"fi-empty\">\n {run.error instanceof Error ? run.error.message : \"Run not found.\"}\n </div>\n </div>\n );\n }\n\n const r = run.data;\n const rows = steps.data ?? [];\n const progress = stepProgress(r, rows);\n const wf = workflows?.find((w) => w.name === r.workflowName && w.app === r.app);\n const scheduled = r.triggerKind === \"cron\";\n const sourceEventId = r.eventId;\n const replayOf = r.replayOf;\n const nextFire = scheduled ? wf?.schedules?.[0]?.nextFireAt : undefined;\n\n return (\n <div className=\"run-panel\">\n <div className=\"panel-head\">\n <div className=\"ph-top\">\n <h2>\n <span className=\"h2-name\">{r.workflowName}</span>\n </h2>\n <div className=\"ph-actions\">\n {renderActions?.(r)}\n <button\n type=\"button\"\n className=\"iconbtn focusable\"\n aria-label=\"Close\"\n onClick={onClose}\n >\n <X />\n </button>\n </div>\n </div>\n <div className=\"ph-status\">\n <StatusBadge status={r.status} />\n <span className=\"runid\">\n <span className=\"runid-text\">{r.id}</span>\n <CopyId id={r.id} />\n </span>\n </div>\n </div>\n\n <div className=\"panel-body\">\n <div className=\"metagrid\">\n <Meta label=\"Run id\" value={r.id} />\n <Meta label=\"App\" value={r.app} />\n {r.executedBy && <Meta label=\"Runner\" value={r.executedBy} />}\n <Meta label=\"Started\" value={formatTime(r.startedAt)} />\n <Meta label=\"Duration\" value={formatDuration(r.durationMs)} />\n <Meta label=\"Step\" value={`${progress.ix}/${progress.total}`} />\n <Meta label=\"Attempt\" value={String(r.attempt)} />\n {sourceEventId ? (\n <Meta\n label=\"Trigger\"\n value={r.eventName ?? \"event\"}\n title=\"Show all runs from this event\"\n onClick={() => onFilterByEvent?.(sourceEventId, r.eventName)}\n />\n ) : (\n <Meta label=\"Trigger\" value={scheduled ? \"Scheduled (cron)\" : \"Event\"} />\n )}\n {nextFire && <Meta label=\"Next fire\" value={formatNextFire(nextFire)} />}\n {replayOf && (\n <Meta\n label=\"Replay of\"\n value={replayOf}\n title=\"Open the run this was replayed from\"\n onClick={() => onOpenRun?.(replayOf)}\n />\n )}\n {replayCount > 0 && (\n <Meta\n label=\"Replayed into\"\n value={`${replayCount} run${replayCount === 1 ? \"\" : \"s\"}`}\n title=\"Show the runs replayed from this one\"\n onClick={() => onShowReplays?.(r.id)}\n />\n )}\n <Meta label=\"Errors\" value={String(r.errorCount)} error={r.errorCount > 0} />\n <Meta label=\"Ended\" value={formatTime(r.endedAt)} />\n </div>\n\n <PayloadTabs run={r} logs={logs.root} />\n\n {renderControlHistory?.(r.id)}\n\n <div className=\"steps-head\">\n <span className=\"sec-title\">Steps</span>\n <span className=\"steps-prog tnum\">\n {progress.ix}\n <span className=\"sp-sep\">/</span>\n {progress.total}\n </span>\n <div className=\"steps-seg\" role=\"tablist\">\n <button\n type=\"button\"\n className=\"seg-btn\"\n role=\"tab\"\n aria-selected={view === \"list\"}\n onClick={() => setView(\"list\")}\n >\n List\n </button>\n <button\n type=\"button\"\n className=\"seg-btn\"\n role=\"tab\"\n aria-selected={view === \"flow\"}\n onClick={() => setView(\"flow\")}\n >\n <Workflow className=\"seg-ico\" />\n Flow\n </button>\n <button\n type=\"button\"\n className=\"seg-btn\"\n role=\"tab\"\n aria-selected={view === \"timeline\"}\n onClick={() => setView(\"timeline\")}\n >\n <BarChartHorizontalBig className=\"seg-ico\" />\n Timeline\n </button>\n </div>\n </div>\n\n <RunStepsPanel\n loading={steps.isLoading}\n steps={rows}\n view={view}\n runPaused={isPaused}\n logs={logs}\n workflowName={r.workflowName}\n runId={r.id}\n renderStepRetry={stepRetry}\n />\n </div>\n </div>\n );\n}\n\nfunction RunStepsPanel({\n loading,\n steps,\n view,\n runPaused,\n logs,\n workflowName,\n runId,\n renderStepRetry,\n}: {\n loading: boolean;\n steps: Step[];\n view: StepsView;\n runPaused: boolean;\n logs: RunLogs;\n workflowName: string;\n runId: string;\n renderStepRetry?: (stepName: string) => ReactNode;\n}) {\n if (loading) {\n return (\n <div className=\"steps-loading\">\n <Loader2 className=\"size-3.5 animate-spin\" />\n </div>\n );\n }\n if (steps.length === 0) return <div className=\"steps-empty\">No steps recorded yet.</div>;\n if (view === \"flow\") {\n return (\n <StepFlow\n key={runId}\n steps={steps}\n workflowName={workflowName}\n runPaused={runPaused}\n logs={logs}\n renderStepRetry={renderStepRetry}\n />\n );\n }\n if (view === \"timeline\") {\n return (\n <StepTimeline\n key={runId}\n steps={steps}\n runPaused={runPaused}\n logs={logs}\n renderStepRetry={renderStepRetry}\n />\n );\n }\n return (\n <div className=\"steplist\">\n {steps.map((s) => (\n <StepRow\n key={`${s.index}-${s.attempt}`}\n step={s}\n index={s.index + 1}\n current={s.status === \"running\" || s.status === \"waiting\"}\n runPaused={runPaused}\n logs={logs.byStep.get(stepLogKey(s.name, s.attempt)) ?? NO_LOGS}\n renderStepRetry={renderStepRetry}\n />\n ))}\n </div>\n );\n}\n\nfunction CopyId({ id }: { id: string }) {\n const { copied, copy } = useCopyToClipboard();\n return (\n <button type=\"button\" className=\"copy\" title=\"Copy run id\" onClick={() => copy(id)}>\n {copied ? <Check className=\"size-3\" /> : <Copy className=\"size-3\" />}\n </button>\n );\n}\n","import { useState } from \"react\";\n\nconst CONFIRM_MS = 3000;\n\n// Two-click confirm for a destructive or bulk action: the first trigger arms and\n// returns; a second trigger within the window runs the action. Auto-disarms after.\nexport function useConfirmAction(action: () => void, ms = CONFIRM_MS) {\n const [confirming, setConfirming] = useState(false);\n const trigger = () => {\n if (!confirming) {\n setConfirming(true);\n setTimeout(() => setConfirming(false), ms);\n return;\n }\n setConfirming(false);\n action();\n };\n return { confirming, trigger };\n}\n","import { Loader2, X } from \"lucide-react\";\nimport { useCancelRun } from \"@durablex/react\";\nimport { useConfirmAction } from \"../hooks/use-confirm-action\";\n\n// Cancel is irreversible, so it takes a two-click confirm: the first click arms,\n// the second within the window cancels.\nexport function RunCancelButton({ id }: { id: string }) {\n const cancel = useCancelRun();\n const { confirming, trigger } = useConfirmAction(() => cancel.mutate(id));\n\n return (\n <button\n type=\"button\"\n className=\"btn focusable\"\n style={{ color: \"var(--st-failed-fg)\" }}\n disabled={cancel.isPending}\n onClick={trigger}\n >\n {cancel.isPending ? <Loader2 className=\"animate-spin\" /> : <X />}{\" \"}\n {cancel.isPending ? \"Cancelling\" : confirming ? \"Confirm cancel\" : \"Cancel\"}\n </button>\n );\n}\n","import { Loader2, Pause, Play } from \"lucide-react\";\nimport { usePauseRun, useResumeRun, type RunStatus } from \"@durablex/react\";\n\n// Reversible and cheap, so unlike Cancel these fire on a single click with no confirm.\nexport function RunPauseButton({ id, status }: { id: string; status: RunStatus }) {\n const pause = usePauseRun();\n const resume = useResumeRun();\n\n if (status === \"paused\") {\n return (\n <button\n type=\"button\"\n className=\"btn focusable\"\n title=\"Resume - re-queues the run; it continues from the next step.\"\n disabled={resume.isPending}\n onClick={() => resume.mutate(id)}\n >\n {resume.isPending ? <Loader2 className=\"animate-spin\" /> : <Play />} Resume\n </button>\n );\n }\n\n return (\n <button\n type=\"button\"\n className=\"btn focusable\"\n title=\"Pause - halts the run after the current step finishes.\"\n disabled={pause.isPending}\n onClick={() => pause.mutate(id)}\n >\n {pause.isPending ? <Loader2 className=\"animate-spin\" /> : <Pause />} Pause\n </button>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Dialog as DialogPrimitive } from \"radix-ui\";\n\nimport { cn } from \"../lib/utils\";\nimport { Button } from \"./button\";\nimport { XIcon } from \"lucide-react\";\n\nfunction Dialog({ ...props }: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />;\n}\n\nfunction DialogTrigger({ ...props }: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />;\n}\n\nfunction DialogPortal({ ...props }: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />;\n}\n\nfunction DialogClose({ ...props }: React.ComponentProps<typeof DialogPrimitive.Close>) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />;\n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n return (\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n className={cn(\n \"fixed inset-0 isolate z-50 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction DialogContent({\n className,\n children,\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\n showCloseButton?: boolean;\n}) {\n return (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n data-slot=\"dialog-content\"\n className={cn(\n \"fixed top-1/2 left-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-4 rounded-xl bg-popover p-4 text-sm text-popover-foreground ring-1 ring-foreground/10 duration-100 outline-none sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className,\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close data-slot=\"dialog-close\" asChild>\n <Button variant=\"ghost\" className=\"absolute top-2 right-2\" size=\"icon-sm\">\n <XIcon />\n <span className=\"sr-only\">Close</span>\n </Button>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPortal>\n );\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div data-slot=\"dialog-header\" className={cn(\"flex flex-col gap-2\", className)} {...props} />\n );\n}\n\nfunction DialogFooter({\n className,\n showCloseButton = false,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n showCloseButton?: boolean;\n}) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn(\n \"-mx-4 -mb-4 flex flex-col-reverse gap-2 rounded-b-xl border-t bg-muted/50 p-4 sm:flex-row sm:justify-end\",\n className,\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close asChild>\n <Button variant=\"outline\">Close</Button>\n </DialogPrimitive.Close>\n )}\n </div>\n );\n}\n\nfunction DialogTitle({ className, ...props }: React.ComponentProps<typeof DialogPrimitive.Title>) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n className={cn(\"font-heading text-base leading-none font-medium\", className)}\n {...props}\n />\n );\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n className={cn(\n \"text-sm text-muted-foreground *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n};\n","import { useRef, type UIEvent } from \"react\";\nimport { highlightedJsonSpans } from \"../lib/json-highlight\";\n\n// A textarea overlaid on a syntax-highlighted <pre>: the textarea's own text is\n// transparent (only its caret/selection show) so the highlighted layer reads\n// through. Both layers share identical font metrics and padding so the glyphs line\n// up; the textarea drives scrolling and the pre is scroll-synced behind it.\nconst SURFACE = \"whitespace-pre-wrap break-words px-2.5 py-2 font-mono text-xs leading-[1.6]\";\n\nexport function JsonEditor({\n value,\n onChange,\n invalid = false,\n minHeight = 150,\n ariaLabel = \"JSON payload\",\n}: {\n value: string;\n onChange: (next: string) => void;\n invalid?: boolean;\n minHeight?: number;\n ariaLabel?: string;\n}) {\n const preRef = useRef<HTMLPreElement>(null);\n\n const syncScroll = (e: UIEvent<HTMLTextAreaElement>) => {\n const pre = preRef.current;\n if (!pre) return;\n pre.scrollTop = e.currentTarget.scrollTop;\n pre.scrollLeft = e.currentTarget.scrollLeft;\n };\n\n const format = () => {\n try {\n onChange(JSON.stringify(JSON.parse(value), null, 2));\n } catch {\n // Invalid JSON has nothing to format; the invalid border already signals it.\n }\n };\n\n return (\n <div\n data-invalid={invalid}\n className=\"relative overflow-hidden rounded-lg border border-input transition-colors focus-within:border-ring focus-within:ring-3 focus-within:ring-ring/50 data-[invalid=true]:border-destructive data-[invalid=true]:ring-3 data-[invalid=true]:ring-destructive/20\"\n style={{ backgroundColor: \"color-mix(in oklch, var(--foreground) 4%, var(--card))\" }}\n >\n <button\n type=\"button\"\n onClick={format}\n className=\"text-muted-foreground hover:text-foreground hover:bg-accent absolute top-[6px] right-[6px] z-10 border px-[7px] py-[2px] font-mono text-[9.5px] tracking-[0.05em] uppercase\"\n style={{\n backgroundColor: \"color-mix(in oklch, var(--card) 78%, transparent)\",\n backdropFilter: \"blur(3px)\",\n }}\n >\n format\n </button>\n <pre\n ref={preRef}\n aria-hidden\n className={`text-foreground pointer-events-none m-0 overflow-hidden ${SURFACE}`}\n style={{ minHeight, maxHeight: 320 }}\n >\n {highlightedJsonSpans(value).map((tok) => (\n <span\n key={tok.key}\n style={{\n color: tok.color,\n fontWeight: tok.bold ? 500 : undefined,\n fontStyle: tok.italic ? \"italic\" : undefined,\n }}\n >\n {tok.text}\n </span>\n ))}\n {\"\\n\"}\n </pre>\n <textarea\n aria-label={ariaLabel}\n aria-invalid={invalid}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onScroll={syncScroll}\n spellCheck={false}\n autoCapitalize=\"off\"\n autoCorrect=\"off\"\n className={`absolute inset-0 resize-none overflow-auto bg-transparent text-transparent outline-none ${SURFACE}`}\n style={{ caretColor: \"var(--foreground)\" }}\n />\n </div>\n );\n}\n","import { useMemo, useState } from \"react\";\nimport { toast } from \"sonner\";\nimport { useReplayRun, type Run } from \"@durablex/react\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"../ui/dialog\";\nimport { Button } from \"../ui/button\";\nimport { parseJson } from \"../lib/json-highlight\";\nimport { JsonEditor } from \"./JsonEditor\";\n\nexport function ReplayRunDialog({\n run,\n open,\n onOpenChange,\n onOpenRun,\n}: {\n run: Run;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onOpenRun?: (runId: string) => void;\n}) {\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-md\">\n {open && (\n <ReplayForm\n key={run.id}\n run={run}\n onOpenRun={onOpenRun}\n onClose={() => onOpenChange(false)}\n />\n )}\n </DialogContent>\n </Dialog>\n );\n}\n\nfunction ReplayForm({\n run,\n onOpenRun,\n onClose,\n}: {\n run: Run;\n onOpenRun?: (runId: string) => void;\n onClose: () => void;\n}) {\n const original = useMemo(() => JSON.stringify(run.input ?? {}, null, 2), [run.input]);\n const [payload, setPayload] = useState(original);\n const replay = useReplayRun();\n\n const parsed = useMemo(() => parseJson(payload), [payload]);\n const canSubmit = parsed.ok && !replay.isPending;\n\n function submit() {\n if (!parsed.ok) return;\n // Send an override only when the payload actually changed, so an unedited\n // replay records as a plain replay rather than an edited-payload one.\n const edited = JSON.stringify(parsed.value) !== JSON.stringify(run.input ?? {});\n replay.mutate(\n { runId: run.id, input: edited ? parsed.value : undefined },\n {\n onSuccess: (forked) => {\n toast.success(\"Replay started\", {\n action: onOpenRun\n ? { label: \"View run\", onClick: () => onOpenRun(forked.id) }\n : undefined,\n });\n onClose();\n },\n },\n );\n }\n\n return (\n <>\n <DialogHeader>\n <DialogTitle>Replay {run.workflowName}</DialogTitle>\n <DialogDescription>\n Forks a new run from this input. The original run stays as history.\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"flex flex-col gap-1.5\">\n <span className=\"text-xs font-medium\">Input</span>\n <JsonEditor\n value={payload}\n onChange={setPayload}\n invalid={!parsed.ok}\n ariaLabel=\"Replay input\"\n />\n {!parsed.ok ? <span className=\"text-xs text-destructive\">{parsed.error}</span> : null}\n </div>\n\n {replay.isError ? (\n <span className=\"text-xs text-destructive\">\n Could not replay: {replay.error instanceof Error ? replay.error.message : \"unknown error\"}\n </span>\n ) : null}\n\n <DialogFooter showCloseButton>\n <Button disabled={!canSubmit} onClick={submit}>\n {replay.isPending ? \"Replaying...\" : \"Replay\"}\n </Button>\n </DialogFooter>\n </>\n );\n}\n","import { RotateCcw } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { ACTIVE_STATUSES, type Run } from \"@durablex/react\";\nimport { RunCancelButton } from \"./RunCancelButton\";\nimport { RunPauseButton } from \"./RunPauseButton\";\nimport { ReplayRunDialog } from \"./ReplayRunDialog\";\n\n// The run inspector's header controls: a live run can be paused/cancelled, a\n// terminal run replayed. onOpenRun is the navigation the replay toast uses to\n// jump to the forked run.\nexport function RunInspectorActions({\n run,\n onOpenRun,\n}: {\n run: Run;\n onOpenRun?: (runId: string) => void;\n}) {\n const isLive = ACTIVE_STATUSES.has(run.status) || run.status === \"paused\";\n if (isLive) {\n return (\n <>\n <RunPauseButton id={run.id} status={run.status} />\n <RunCancelButton id={run.id} />\n </>\n );\n }\n return <ReplayButton run={run} onOpenRun={onOpenRun} />;\n}\n\nfunction ReplayButton({ run, onOpenRun }: { run: Run; onOpenRun?: (runId: string) => void }) {\n const [open, setOpen] = useState(false);\n return (\n <>\n <button type=\"button\" className=\"btn focusable\" onClick={() => setOpen(true)}>\n <RotateCcw /> Replay\n </button>\n <ReplayRunDialog run={run} open={open} onOpenChange={setOpen} onOpenRun={onOpenRun} />\n </>\n );\n}\n","import * as ResizablePrimitive from \"react-resizable-panels\";\n\nimport { cn } from \"../lib/utils\";\n\nfunction ResizablePanelGroup({ className, ...props }: ResizablePrimitive.GroupProps) {\n return (\n <ResizablePrimitive.Group\n data-slot=\"resizable-panel-group\"\n className={cn(\"flex h-full w-full aria-[orientation=vertical]:flex-col\", className)}\n {...props}\n />\n );\n}\n\nfunction ResizablePanel({ ...props }: ResizablePrimitive.PanelProps) {\n return <ResizablePrimitive.Panel data-slot=\"resizable-panel\" {...props} />;\n}\n\nfunction ResizableHandle({\n withHandle,\n className,\n ...props\n}: ResizablePrimitive.SeparatorProps & {\n withHandle?: boolean;\n}) {\n return (\n <ResizablePrimitive.Separator\n data-slot=\"resizable-handle\"\n className={cn(\n \"relative flex w-px items-center justify-center bg-border ring-offset-background after:absolute after:inset-y-0 after:left-1/2 after:w-1 after:-translate-x-1/2 focus-visible:ring-1 focus-visible:ring-ring focus-visible:outline-hidden aria-[orientation=horizontal]:h-px aria-[orientation=horizontal]:w-full aria-[orientation=horizontal]:after:left-0 aria-[orientation=horizontal]:after:h-1 aria-[orientation=horizontal]:after:w-full aria-[orientation=horizontal]:after:translate-x-0 aria-[orientation=horizontal]:after:-translate-y-1/2 [&[aria-orientation=horizontal]>div]:rotate-90\",\n className,\n )}\n {...props}\n >\n {withHandle && <div className=\"z-10 flex h-6 w-1 shrink-0 rounded-lg bg-border\" />}\n </ResizablePrimitive.Separator>\n );\n}\n\nexport { ResizableHandle, ResizablePanel, ResizablePanelGroup };\n","import { useState } from \"react\";\n\n// Keyset cursor stack: `cursor` loads the current page; the stack holds the cursors of\n// earlier pages so \"Newer\" can walk back. Page 0 (newest) uses no cursor. Passing a new\n// `resetKey` (a filter/sort signature) snaps back to the newest page during render.\nexport function useKeysetPager(resetKey: string, pageSize: number) {\n const [cursor, setCursor] = useState<string | undefined>(undefined);\n const [prev, setPrev] = useState<(string | undefined)[]>([]);\n\n const [pageKey, setPageKey] = useState(resetKey);\n if (pageKey !== resetKey) {\n setPageKey(resetKey);\n setCursor(undefined);\n setPrev([]);\n }\n\n const depth = prev.length;\n\n function range(rowCount: number) {\n return { start: rowCount ? depth * pageSize + 1 : 0, end: depth * pageSize + rowCount };\n }\n function goOlder(nextCursor: string | null) {\n if (!nextCursor) return;\n setPrev((s) => [...s, cursor]);\n setCursor(nextCursor);\n }\n function goNewer() {\n if (prev.length === 0) return;\n setCursor(prev[prev.length - 1]);\n setPrev((s) => s.slice(0, -1));\n }\n\n return { cursor, canNewer: depth > 0, range, goOlder, goNewer };\n}\n","import type { RunStatus } from \"@durablex/react\";\n\nexport const ALL_FILTER = \"all\" as const;\n\nexport type StatusFilter = typeof ALL_FILTER | Exclude<RunStatus, \"waiting\">;\n\nexport const RUN_TYPE_FILTERS = [ALL_FILTER, \"triggered\", \"scheduled\"] as const;\nexport type RunTypeFilter = (typeof RUN_TYPE_FILTERS)[number];\n","export const RUN_SORT_KEYS = [\"workflow\", \"status\", \"app\", \"started\", \"duration\"] as const;\nexport type RunSortKey = (typeof RUN_SORT_KEYS)[number];\n\nexport const SORT_DIRS = [\"asc\", \"desc\"] as const;\nexport type SortDir = (typeof SORT_DIRS)[number];\n\nexport interface RunSort {\n key: RunSortKey;\n dir: SortDir;\n}\n\nexport const DEFAULT_RUN_SORT: RunSort = { key: \"started\", dir: \"desc\" };\n\nexport function toggleRunSort(prev: RunSort, key: RunSortKey): RunSort {\n if (prev.key === key) {\n return { key, dir: prev.dir === \"asc\" ? \"desc\" : \"asc\" };\n }\n return { key, dir: \"asc\" };\n}\n","export const DEFAULT_TIME_RANGE = \"1h\";\n\nexport const TIME_OPTIONS: [string, string][] = [\n [\"30s\", \"Last 30 seconds\"],\n [\"1m\", \"Last 1 minute\"],\n [\"10m\", \"Last 10 minutes\"],\n [\"30m\", \"Last 30 minutes\"],\n [\"1h\", \"Last 1 hour\"],\n [\"12h\", \"Last 12 hours\"],\n [\"1d\", \"Last 1 day\"],\n [\"3d\", \"Last 3 days\"],\n [\"7d\", \"Last 7 days\"],\n [\"30d\", \"Last 30 days\"],\n];\n\nconst UNIT_MS: Record<string, number> = {\n s: 1_000,\n m: 60_000,\n h: 3_600_000,\n d: 86_400_000,\n};\n\nexport function parseWindowMs(time: string): number | null {\n const match = /^(\\d+)([smhd])$/.exec(time.trim());\n if (!match) return null;\n const [, count, unit] = match;\n const ms = unit ? UNIT_MS[unit] : undefined;\n return ms ? Number(count) * ms : null;\n}\n\nexport function timeLabel(time: string): string {\n const preset = TIME_OPTIONS.find(([key]) => key === time);\n return preset ? preset[1] : `Last ${time}`;\n}\n\n// Quantize \"now\" so the cutoff is stable across renders (an unquantized value would\n// change every millisecond and thrash the query cache). The window still slides\n// forward once per bucket; freshness within a bucket comes from polling.\nconst SINCE_BUCKET_MS = 15_000;\n\n// Widths the series chart snaps to (1m..1d). Targeting ~48 buckets across the window\n// keeps bars readable.\nconst NICE_BUCKET_SECONDS = [60, 300, 900, 1800, 3600, 21_600, 86_400];\nconst WIDEST_BUCKET_SECONDS = 86_400;\nconst TARGET_BUCKETS = 48;\nconst DEFAULT_BUCKET_SECONDS = 3600;\n\nexport function seriesBucketSeconds(time: string): number {\n const windowMs = parseWindowMs(time);\n if (windowMs == null) return DEFAULT_BUCKET_SECONDS;\n const ideal = windowMs / 1000 / TARGET_BUCKETS;\n return NICE_BUCKET_SECONDS.find((s) => s >= ideal) ?? WIDEST_BUCKET_SECONDS;\n}\n\nexport const TIME_ZONES = [\"local\", \"utc\"] as const;\nexport type TimeZoneMode = (typeof TIME_ZONES)[number];\n\n// The viewer's auto-detected IANA zone (e.g. \"Europe/Madrid\"), shown so \"Local\"\n// names the zone it resolves to.\nexport const localTimeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n\n// An undefined timeZone renders in the viewer's local zone (Intl's default).\nexport function bucketTickLabel(\n ts: string,\n bucketSeconds: number,\n tz: TimeZoneMode = \"local\",\n): string {\n const d = new Date(ts);\n const timeZone = tz === \"utc\" ? \"UTC\" : undefined;\n if (bucketSeconds >= 86_400) {\n return d.toLocaleDateString([], { month: \"short\", day: \"numeric\", timeZone });\n }\n return d.toLocaleTimeString([], { hour: \"2-digit\", minute: \"2-digit\", timeZone });\n}\n\nexport function windowSince(time: string): string | undefined {\n const windowMs = parseWindowMs(time);\n if (windowMs == null) return undefined;\n const now = Math.floor(Date.now() / SINCE_BUCKET_MS) * SINCE_BUCKET_MS;\n return new Date(now - windowMs).toISOString();\n}\n","import { Loader2, RotateCcw } from \"lucide-react\";\nimport { toast } from \"sonner\";\nimport { useBulkReplay, type BulkReplayFilter } from \"@durablex/react\";\nimport { useConfirmAction } from \"../hooks/use-confirm-action\";\n\n// Two-click confirm since it forks every matching finished run at once; the engine\n// caps the fan-out and reports the outcome counts.\nexport function BulkReplayButton({ filter }: { filter: BulkReplayFilter }) {\n const bulk = useBulkReplay();\n const run = () =>\n bulk.mutate(filter, {\n onSuccess: (res) =>\n toast.success(`Replayed ${res.replayed} run${res.replayed === 1 ? \"\" : \"s\"}`, {\n description: res.capped\n ? \"Only the newest matches were replayed; narrow the filter.\"\n : undefined,\n }),\n onError: (err) => toast.error(`Bulk replay failed: ${err.message}`),\n });\n const { confirming, trigger } = useConfirmAction(run);\n\n if (bulk.isPending) {\n return (\n <span className=\"fb-btn\" aria-disabled>\n <Loader2 style={{ width: 12, height: 12 }} className=\"animate-spin\" /> Replaying\n </span>\n );\n }\n\n if (bulk.isSuccess) {\n const r = bulk.data;\n const title = `matched ${r.matched}, skipped ${r.skipped}, failed ${r.failed}${r.capped ? \", capped\" : \"\"}`;\n return (\n <span className=\"fb-meta\" title={title}>\n Replayed {r.replayed}\n {r.capped ? \"+\" : \"\"}\n </span>\n );\n }\n\n return (\n <button\n type=\"button\"\n className=\"fb-btn focusable\"\n title=\"Replay all finished runs matching the current filter\"\n onClick={trigger}\n >\n <RotateCcw style={{ width: 12, height: 12 }} />{\" \"}\n {confirming ? \"Confirm replay\" : \"Replay matching\"}\n </button>\n );\n}\n","import { ChevronLeft, ChevronRight } from \"lucide-react\";\n\ninterface CursorPagerProps {\n rangeStart: number;\n rangeEnd: number;\n canNewer: boolean;\n canOlder: boolean;\n onNewer(): void;\n onOlder(): void;\n}\n\nexport function CursorPager({\n rangeStart,\n rangeEnd,\n canNewer,\n canOlder,\n onNewer,\n onOlder,\n}: CursorPagerProps) {\n if (rangeEnd === 0) return null;\n\n return (\n <div className=\"pager\">\n <span className=\"pager-range\">\n {rangeStart}-{rangeEnd}\n </span>\n <span className=\"fb-spacer\" />\n <div className=\"pager-nav\">\n <button\n type=\"button\"\n className=\"pg-btn focusable\"\n disabled={!canNewer}\n aria-label=\"Newer runs\"\n onClick={onNewer}\n >\n <ChevronLeft />\n </button>\n <button\n type=\"button\"\n className=\"pg-btn focusable\"\n disabled={!canOlder}\n aria-label=\"Older runs\"\n onClick={onOlder}\n >\n <ChevronRight />\n </button>\n </div>\n </div>\n );\n}\n","import { Loader2, RotateCw } from \"lucide-react\";\nimport { toast } from \"sonner\";\nimport { useRetryFromStep } from \"@durablex/react\";\nimport { useConfirmAction } from \"../hooks/use-confirm-action\";\n\n// Retry forks a new run that re-executes from this step, so like Cancel it takes a\n// two-click confirm: the first click arms, the second within the window forks.\nexport function RetryFromStepButton({\n runId,\n stepName,\n onOpenRun,\n}: {\n runId: string;\n stepName: string;\n onOpenRun?: (runId: string) => void;\n}) {\n const retry = useRetryFromStep();\n const run = () =>\n retry.mutate(\n { runId, step: stepName },\n {\n onSuccess: (forked) =>\n toast.success(\"Retry started\", {\n action: onOpenRun\n ? { label: \"View run\", onClick: () => onOpenRun(forked.id) }\n : undefined,\n }),\n onError: (err) => toast.error(`Retry failed: ${err.message}`),\n },\n );\n const { confirming, trigger } = useConfirmAction(run);\n\n return (\n <button\n type=\"button\"\n className=\"btn focusable fi-retry\"\n disabled={retry.isPending}\n onClick={trigger}\n >\n {retry.isPending ? <Loader2 className=\"animate-spin\" /> : <RotateCw />}{\" \"}\n {confirming ? \"Confirm retry\" : \"Retry from here\"}\n </button>\n );\n}\n","import type { ControlAction, ControlActionKind } from \"@durablex/react\";\n\nexport const ACTION_LABELS: Record<ControlActionKind, string> = {\n cancel: \"Cancelled\",\n pause: \"Paused\",\n resume: \"Resumed\",\n replay: \"Replayed\",\n retry_from_step: \"Retried from step\",\n bulk_replay: \"Bulk replay\",\n};\n\n// An action recorded with no API-key label was driven by an unauthenticated (self-hosted) engine.\nexport function actorLabel(actor?: string): string {\n return actor || \"self-hosted\";\n}\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n return typeof v === \"object\" && v !== null && !Array.isArray(v);\n}\n\nfunction asNum(v: unknown): number {\n return typeof v === \"number\" ? v : 0;\n}\n\nexport function describeControlDetail(a: ControlAction): string {\n const d = a.detail;\n if (!isRecord(d)) return \"\";\n if (a.action === \"retry_from_step\" && typeof d.step === \"string\") {\n return `from \"${d.step}\"`;\n }\n if (a.action === \"bulk_replay\") {\n const summary = `${asNum(d.replayed)}/${asNum(d.matched)} replayed`;\n return d.capped ? `${summary}, capped` : summary;\n }\n return \"\";\n}\n","import { ArrowLeft, ArrowRight } from \"lucide-react\";\nimport { useControlActions, type ControlAction } from \"@durablex/react\";\nimport { ACTION_LABELS, actorLabel, describeControlDetail } from \"../lib/control-action\";\nimport { formatRelative } from \"../lib/format\";\n\n// The runId filter matches entries where this run is the target OR the fork. Show the\n// other run relative to the one being viewed: the fork it produced, or the source it came from.\nfunction lineage(a: ControlAction, runId: string): { run: string; incoming: boolean } | null {\n if (a.newRunId && a.newRunId === runId && a.runId) return { run: a.runId, incoming: true };\n if (a.newRunId && a.runId === runId) return { run: a.newRunId, incoming: false };\n return null;\n}\n\nfunction RunLink({ id, onOpenRun }: { id: string; onOpenRun?: (runId: string) => void }) {\n if (!onOpenRun) return <span className=\"font-mono text-[11px]\">{id}</span>;\n return (\n <button\n type=\"button\"\n className=\"hover:text-foreground font-mono text-[11px] underline underline-offset-2\"\n onClick={() => onOpenRun(id)}\n >\n {id}\n </button>\n );\n}\n\nexport function RunControlHistory({\n runId,\n onOpenRun,\n}: {\n runId: string;\n onOpenRun?: (runId: string) => void;\n}) {\n const { data: actions } = useControlActions({ runId });\n if (!actions || actions.length === 0) return null;\n\n return (\n <div className=\"mt-3 rounded-md border\">\n <div className=\"border-b px-2 py-1.5\">\n <span className=\"sec-title\">Control history</span>\n </div>\n <ul className=\"divide-y\">\n {actions.map((a) => {\n const detail = describeControlDetail(a);\n const link = lineage(a, runId);\n return (\n <li key={a.id} className=\"flex items-center gap-2 px-2 py-1.5 text-xs\">\n <span className=\"font-medium\">{ACTION_LABELS[a.action]}</span>\n {detail && (\n <span className=\"text-muted-foreground font-mono text-[11px]\">{detail}</span>\n )}\n {link && (\n <span className=\"text-muted-foreground flex items-center gap-1\">\n {link.incoming ? (\n <ArrowLeft className=\"size-3 shrink-0\" />\n ) : (\n <ArrowRight className=\"size-3 shrink-0\" />\n )}\n <RunLink id={link.run} onOpenRun={onOpenRun} />\n </span>\n )}\n <span className=\"text-muted-foreground ml-auto truncate font-mono text-[11px] whitespace-nowrap\">\n {actorLabel(a.actor)} · {formatRelative(a.createdAt)}\n </span>\n </li>\n );\n })}\n </ul>\n </div>\n );\n}\n","// Deterministic per-app accent. The engine does not persist an app color yet, so we\n// derive a stable hue from the name. All app colors share the same lightness/chroma\n// and vary only by hue, per the design brief.\nexport function appHue(name: string): string {\n let h = 0;\n for (let i = 0; i < name.length; i++) h = (h * 31 + name.charCodeAt(i)) | 0;\n return `oklch(0.62 0.15 ${((h % 360) + 360) % 360})`;\n}\n","import { useEffect, type RefObject } from \"react\";\n\nexport function useClickOutside(ref: RefObject<HTMLElement | null>, onClose: () => void) {\n useEffect(() => {\n const onDown = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) onClose();\n };\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n };\n document.addEventListener(\"mousedown\", onDown);\n document.addEventListener(\"keydown\", onKey);\n return () => {\n document.removeEventListener(\"mousedown\", onDown);\n document.removeEventListener(\"keydown\", onKey);\n };\n }, [ref, onClose]);\n}\n","import { useCallback, useRef, useState, type ReactNode } from \"react\";\nimport { useClickOutside } from \"./use-click-outside\";\n\nexport function FilterDropdown({\n trigger,\n align,\n width,\n children,\n}: {\n trigger: (open: boolean, toggle: () => void) => ReactNode;\n align?: \"right\";\n width?: number;\n children: (close: () => void) => ReactNode;\n}) {\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n const close = useCallback(() => setOpen(false), []);\n useClickOutside(ref, close);\n\n return (\n <div className=\"dd\" ref={ref}>\n {trigger(open, () => setOpen((o) => !o))}\n {open && (\n <div\n className={align === \"right\" ? \"dd-menu right\" : \"dd-menu\"}\n style={width ? { minWidth: width } : undefined}\n >\n {children(close)}\n </div>\n )}\n </div>\n );\n}\n","import { ChevronDown } from \"lucide-react\";\n\nexport function FilterDropdownButton({\n open,\n toggle,\n keyLabel,\n value,\n dot,\n}: {\n open: boolean;\n toggle: () => void;\n keyLabel?: string;\n value: string;\n dot?: string | null;\n}) {\n return (\n <button\n type=\"button\"\n className=\"dd-btn focusable\"\n data-open={open ? \"1\" : \"0\"}\n onClick={toggle}\n >\n {keyLabel && <span className=\"dd-key\">{keyLabel}</span>}\n <span className=\"dd-val\">\n {dot && <span className=\"vdot\" style={{ background: dot }} />}\n {value}\n </span>\n <ChevronDown className=\"dd-chev\" />\n </button>\n );\n}\n","import { Check } from \"lucide-react\";\n\nexport function FilterDropdownItem({\n active,\n dot,\n label,\n right,\n onClick,\n}: {\n active: boolean;\n dot?: string | null;\n label: string;\n right?: string;\n onClick: () => void;\n}) {\n return (\n <button\n type=\"button\"\n className=\"dd-item focusable\"\n data-on={active ? \"1\" : \"0\"}\n onClick={onClick}\n >\n {dot !== undefined && (\n <span\n className=\"dd-dot\"\n style={{\n background: dot || \"transparent\",\n border: dot ? \"0\" : \"1px solid var(--border)\",\n }}\n />\n )}\n <span className=\"dd-lbl\">{label}</span>\n {right != null && <span className=\"dd-rt\">{right}</span>}\n {active && <Check className=\"dd-check\" />}\n </button>\n );\n}\n","import { useMemo } from \"react\";\nimport { useWorkflows } from \"@durablex/react\";\nimport { appHue } from \"../../lib/app-color\";\nimport { ALL_FILTER } from \"../../lib/run-filters\";\nimport { FilterDropdown } from \"./FilterDropdown\";\nimport { FilterDropdownButton } from \"./FilterDropdownButton\";\nimport { FilterDropdownItem } from \"./FilterDropdownItem\";\n\nexport function AppFilter({\n app,\n onApp,\n align,\n width = 190,\n}: {\n app: string;\n onApp(app: string): void;\n align?: \"right\";\n width?: number;\n}) {\n const { data } = useWorkflows();\n const apps = useMemo(() => [...new Set((data ?? []).map((w) => w.app))].sort(), [data]);\n\n return (\n <FilterDropdown\n align={align}\n width={width}\n trigger={(open, toggle) => (\n <FilterDropdownButton\n open={open}\n toggle={toggle}\n keyLabel=\"App\"\n value={app === ALL_FILTER ? \"All\" : app}\n dot={app === ALL_FILTER ? null : appHue(app)}\n />\n )}\n >\n {(close) => (\n <>\n <FilterDropdownItem\n active={app === ALL_FILTER}\n dot={null}\n label=\"All apps\"\n onClick={() => {\n onApp(ALL_FILTER);\n close();\n }}\n />\n <div className=\"dd-sep\" />\n {apps.map((a) => (\n <FilterDropdownItem\n key={a}\n active={app === a}\n dot={appHue(a)}\n label={a}\n onClick={() => {\n onApp(a);\n close();\n }}\n />\n ))}\n </>\n )}\n </FilterDropdown>\n );\n}\n","import { TIME_OPTIONS, timeLabel } from \"../../lib/time-range\";\nimport { FilterDropdown } from \"./FilterDropdown\";\nimport { FilterDropdownButton } from \"./FilterDropdownButton\";\nimport { FilterDropdownItem } from \"./FilterDropdownItem\";\n\nexport function TimeRangeFilter({ time, onTime }: { time: string; onTime(time: string): void }) {\n return (\n <FilterDropdown\n width={210}\n trigger={(open, toggle) => (\n <FilterDropdownButton open={open} toggle={toggle} keyLabel=\"Time\" value={timeLabel(time)} />\n )}\n >\n {(close) => (\n <>\n <div className=\"dd-search\">\n <input\n placeholder=\"Relative time (5s, 1m, 2d)…\"\n onKeyDown={(e) => {\n const v = (e.target as HTMLInputElement).value.trim();\n if (e.key === \"Enter\" && v) {\n onTime(v);\n close();\n }\n }}\n />\n </div>\n {TIME_OPTIONS.map(([k, l]) => (\n <FilterDropdownItem\n key={k}\n active={time === k}\n label={l}\n onClick={() => {\n onTime(k);\n close();\n }}\n />\n ))}\n </>\n )}\n </FilterDropdown>\n );\n}\n","import { Braces, Search, X } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport { ALL_FILTER, type RunTypeFilter, type StatusFilter } from \"../lib/run-filters\";\nimport { AppFilter } from \"./filters/AppFilter\";\nimport { FilterDropdown } from \"./filters/FilterDropdown\";\nimport { FilterDropdownButton } from \"./filters/FilterDropdownButton\";\nimport { FilterDropdownItem } from \"./filters/FilterDropdownItem\";\nimport { TimeRangeFilter } from \"./filters/TimeRangeFilter\";\n\nconst STATUS_OPTIONS: { value: StatusFilter; label: string; color?: string }[] = [\n { value: ALL_FILTER, label: \"All statuses\" },\n { value: \"queued\", label: \"Queued\", color: \"var(--st-queued-fg)\" },\n { value: \"running\", label: \"Running\", color: \"var(--st-running-fg)\" },\n { value: \"paused\", label: \"Paused\", color: \"var(--st-paused-fg)\" },\n { value: \"succeeded\", label: \"Succeeded\", color: \"var(--st-succeeded-fg)\" },\n { value: \"failed\", label: \"Failed\", color: \"var(--st-failed-fg)\" },\n { value: \"cancelled\", label: \"Cancelled\", color: \"var(--st-cancelled-fg)\" },\n];\n\nconst RUNTYPE_OPTIONS: { value: RunTypeFilter; label: string }[] = [\n { value: ALL_FILTER, label: \"All run types\" },\n { value: \"triggered\", label: \"Event-triggered\" },\n { value: \"scheduled\", label: \"Scheduled (cron)\" },\n];\n\ninterface RunsFilterBarProps {\n query: string;\n onQuery(v: string): void;\n deep: boolean;\n onDeep(v: boolean): void;\n time: string;\n onTime(v: string): void;\n status: StatusFilter;\n onStatus(v: StatusFilter): void;\n app: string;\n onApp(v: string): void;\n runType: RunTypeFilter;\n onRunType(v: RunTypeFilter): void;\n shown: number;\n action?: ReactNode;\n}\n\nexport function RunsFilterBar({\n query,\n onQuery,\n deep,\n onDeep,\n time,\n onTime,\n status,\n onStatus,\n app,\n onApp,\n runType,\n onRunType,\n shown,\n action,\n}: RunsFilterBarProps) {\n const statusOpt = STATUS_OPTIONS.find((o) => o.value === status);\n const runTypeOpt = RUNTYPE_OPTIONS.find((o) => o.value === runType);\n const activeCount =\n (status !== ALL_FILTER ? 1 : 0) +\n (app !== ALL_FILTER ? 1 : 0) +\n (runType !== ALL_FILTER ? 1 : 0) +\n (query ? 1 : 0) +\n (deep ? 1 : 0);\n const clearAll = () => {\n onStatus(ALL_FILTER);\n onApp(ALL_FILTER);\n onRunType(ALL_FILTER);\n onQuery(\"\");\n onDeep(false);\n };\n\n return (\n <div className=\"filterbar\">\n <div className=\"fb-search-field\">\n <Search />\n <input\n placeholder={deep ? \"Search input & result…\" : \"Search runs, ids, apps…\"}\n value={query}\n onChange={(e) => onQuery(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Escape\") onQuery(\"\");\n }}\n />\n {query && (\n <span className=\"x\" title=\"Clear search\" onClick={() => onQuery(\"\")}>\n <X style={{ width: 12, height: 12 }} />\n </span>\n )}\n </div>\n\n <button\n type=\"button\"\n className=\"chip\"\n data-on={deep ? \"1\" : \"0\"}\n title=\"Also search run input, result, and error content\"\n onClick={() => onDeep(!deep)}\n >\n <Braces /> Payloads\n </button>\n\n <TimeRangeFilter time={time} onTime={onTime} />\n\n <FilterDropdown\n width={180}\n trigger={(open, toggle) => (\n <FilterDropdownButton\n open={open}\n toggle={toggle}\n keyLabel=\"Status\"\n value={statusOpt?.label === \"All statuses\" ? \"All\" : (statusOpt?.label ?? \"All\")}\n dot={statusOpt?.color ?? null}\n />\n )}\n >\n {(close) =>\n STATUS_OPTIONS.map((o) => (\n <FilterDropdownItem\n key={o.value}\n active={status === o.value}\n dot={o.color ?? null}\n label={o.label}\n onClick={() => {\n onStatus(o.value);\n close();\n }}\n />\n ))\n }\n </FilterDropdown>\n\n <AppFilter app={app} onApp={onApp} />\n\n <FilterDropdown\n width={180}\n trigger={(open, toggle) => (\n <FilterDropdownButton\n open={open}\n toggle={toggle}\n keyLabel=\"Run type\"\n value={\n runType === ALL_FILTER ? \"All\" : (runTypeOpt?.label.replace(/ \\(.*\\)/, \"\") ?? \"All\")\n }\n />\n )}\n >\n {(close) =>\n RUNTYPE_OPTIONS.map((o) => (\n <FilterDropdownItem\n key={o.value}\n active={runType === o.value}\n label={o.label}\n onClick={() => {\n onRunType(o.value);\n close();\n }}\n />\n ))\n }\n </FilterDropdown>\n\n {activeCount > 0 && (\n <button\n type=\"button\"\n className=\"fb-btn focusable\"\n title=\"Clear all filters\"\n onClick={clearAll}\n >\n <X style={{ width: 12, height: 12 }} /> Clear\n </button>\n )}\n\n <span className=\"fb-spacer\" />\n {action}\n <span className=\"fb-meta\">{shown} shown</span>\n </div>\n );\n}\n","import type { RunSort, RunSortKey } from \"../lib/run-sort\";\n\ninterface RunsTableHeadProps {\n label: string;\n sortKey: RunSortKey;\n sort: RunSort;\n onSort(key: RunSortKey): void;\n numeric?: boolean;\n}\n\nexport function RunsTableHead({ label, sortKey, sort, onSort, numeric }: RunsTableHeadProps) {\n const active = sort.key === sortKey;\n return (\n <th className={numeric ? \"sortable num\" : \"sortable\"} onClick={() => onSort(sortKey)}>\n {label}\n {active && <span className=\"arrow\">{sort.dir === \"asc\" ? \"↑\" : \"↓\"}</span>}\n </th>\n );\n}\n","import { ResumeMark } from \"./ResumeMark\";\n\nexport function RunsTableLoader() {\n return (\n <div className=\"runloader\">\n <ResumeMark size={44} variant=\"load\" fault className=\"loadmark\" title=\"Loading runs\" />\n <div className=\"runloader-cap\">Replaying runs…</div>\n </div>\n );\n}\n","import type { LucideIcon } from \"lucide-react\";\n\ninterface RunsTablePlaceholderProps {\n icon: LucideIcon;\n title: string;\n message: string;\n}\n\nexport function RunsTablePlaceholder({ icon: Icon, title, message }: RunsTablePlaceholderProps) {\n return (\n <div className=\"placeholder\">\n <div className=\"ph-inner\">\n <Icon className=\"ico\" />\n <h3>{title}</h3>\n <p>{message}</p>\n </div>\n </div>\n );\n}\n","import { appHue } from \"../lib/app-color\";\nimport { cn } from \"../lib/utils\";\n\nexport function AppTag({ app, className }: { app: string; className?: string }) {\n return (\n <span className={cn(\"inline-flex items-center gap-[6px] text-xs\", className)}>\n <span\n className=\"size-[9px] shrink-0 border\"\n style={{\n backgroundColor: appHue(app),\n borderColor: \"color-mix(in oklch, var(--foreground) 18%, transparent)\",\n }}\n />\n {app}\n </span>\n );\n}\n","import type { LucideIcon } from \"lucide-react\";\nimport { cn } from \"../lib/utils\";\n\n// tone maps to the --st-<tone>-bg/-fg CSS token pair.\nexport function GlyphBadge({\n icon: Icon,\n tone,\n label,\n ariaLabel,\n compact,\n className,\n}: {\n icon: LucideIcon;\n tone: string;\n label: string;\n ariaLabel?: string;\n compact?: boolean;\n className?: string;\n}) {\n if (compact) {\n return (\n <Icon\n className={cn(\"size-[13px] shrink-0\", className)}\n style={{ color: `var(--st-${tone}-fg)` }}\n aria-label={ariaLabel ?? label}\n />\n );\n }\n return (\n <span\n className={cn(\n \"inline-flex items-center gap-1 border border-transparent font-medium leading-none whitespace-nowrap h-[17px] px-1.5 text-[10px]\",\n className,\n )}\n style={{ backgroundColor: `var(--st-${tone}-bg)`, color: `var(--st-${tone}-fg)` }}\n >\n <Icon className=\"size-[11px] shrink-0\" />\n {label}\n </span>\n );\n}\n","import { Clock } from \"lucide-react\";\nimport { GlyphBadge } from \"./GlyphBadge\";\n\nexport function ScheduledBadge({ compact, className }: { compact?: boolean; className?: string }) {\n return (\n <GlyphBadge\n icon={Clock}\n tone=\"scheduled\"\n label=\"Scheduled\"\n ariaLabel=\"Scheduled (cron)\"\n compact={compact}\n className={className}\n />\n );\n}\n","import { RotateCcw } from \"lucide-react\";\nimport type { KeyboardEvent } from \"react\";\nimport { type Run, TERMINAL_STATUSES } from \"@durablex/react\";\nimport { formatDuration, formatRelative } from \"../lib/format\";\nimport { stepCellLabel } from \"../lib/run-progress\";\nimport type { RunSortKey } from \"../lib/run-sort\";\nimport { AppTag } from \"./AppTag\";\nimport { ScheduledBadge } from \"./ScheduledBadge\";\nimport { StatusBadge } from \"./StatusBadge\";\n\ninterface RunsTableRowProps {\n run: Run;\n selected: boolean;\n onSelect(id: string): void;\n hideColumns?: RunSortKey[];\n stepTotal?: number;\n onReplay?(id: string): void;\n}\n\nexport function RunsTableRow({\n run,\n selected,\n onSelect,\n hideColumns,\n stepTotal,\n onReplay,\n}: RunsTableRowProps) {\n const onKeyDown = (e: KeyboardEvent<HTMLTableRowElement>) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onSelect(run.id);\n }\n };\n\n return (\n <tr\n className=\"row focusable\"\n tabIndex={0}\n data-selected={selected ? \"1\" : \"0\"}\n onClick={() => onSelect(run.id)}\n onKeyDown={onKeyDown}\n >\n {!hideColumns?.includes(\"workflow\") && (\n <td>\n <div className=\"wf-cell\">\n <span className=\"wf-name\">{run.workflowName}</span>\n {run.triggerKind === \"cron\" && <ScheduledBadge compact />}\n </div>\n </td>\n )}\n <td>\n <StatusBadge status={run.status} />\n </td>\n {!hideColumns?.includes(\"app\") && (\n <td>\n <AppTag app={run.app} />\n </td>\n )}\n <td>\n <div className=\"step-cell\">\n {run.stepCount > 0 ? (\n <>\n <span className=\"ix\" style={{ color: `var(--st-${run.status}-fg)` }}>\n {stepCellLabel(run, stepTotal)}\n </span>\n {run.currentStepName && <span>{run.currentStepName}</span>}\n </>\n ) : (\n <span className=\"cell-mut\">-</span>\n )}\n {run.status === \"failed\" && run.error?.message && (\n <span className=\"run-err\" title={run.error.message}>\n {run.error.message.split(\"\\n\")[0]}\n </span>\n )}\n </div>\n </td>\n <td>\n <span className=\"ts cell-mut\">{formatRelative(run.startedAt)}</span>\n </td>\n <td className=\"num\">\n <span className=\"dur\">{formatDuration(run.durationMs)}</span>\n </td>\n {onReplay && (\n <td className=\"row-actions\">\n {TERMINAL_STATUSES.has(run.status) && (\n <button\n type=\"button\"\n className=\"row-action focusable\"\n title=\"Replay this run\"\n onClick={(e) => {\n e.stopPropagation();\n onReplay(run.id);\n }}\n >\n <RotateCcw className=\"size-3.5\" /> Replay\n </button>\n )}\n </td>\n )}\n </tr>\n );\n}\n","import { AlertTriangle, Inbox } from \"lucide-react\";\nimport { useMemo } from \"react\";\nimport type { Run } from \"@durablex/react\";\nimport { expectedStepTotals } from \"../lib/run-progress\";\nimport type { RunSort, RunSortKey } from \"../lib/run-sort\";\nimport { RunsTableHead } from \"./RunsTableHead\";\nimport { RunsTableLoader } from \"./RunsTableLoader\";\nimport { RunsTablePlaceholder } from \"./RunsTablePlaceholder\";\nimport { RunsTableRow } from \"./RunsTableRow\";\n\ninterface RunsTableProps {\n rows: Run[];\n selectedId: string | null;\n onSelect(id: string): void;\n sort: RunSort;\n onSort(key: RunSortKey): void;\n loading: boolean;\n isError: boolean;\n error: Error | null;\n emptyTitle: string;\n emptyMessage: string;\n hideColumns?: RunSortKey[];\n onReplay?(id: string): void;\n}\n\nexport function RunsTable({\n rows,\n selectedId,\n onSelect,\n sort,\n onSort,\n loading,\n isError,\n error,\n emptyTitle,\n emptyMessage,\n hideColumns,\n onReplay,\n}: RunsTableProps) {\n const expectedSteps = useMemo(() => expectedStepTotals(rows), [rows]);\n\n if (loading && rows.length === 0) {\n return (\n <div className=\"tablewrap\">\n <RunsTableLoader />\n </div>\n );\n }\n\n if (isError) {\n return (\n <div className=\"tablewrap\">\n <RunsTablePlaceholder\n icon={AlertTriangle}\n title=\"Failed to load runs\"\n message={error?.message ?? \"Something went wrong.\"}\n />\n </div>\n );\n }\n\n if (rows.length === 0) {\n return (\n <div className=\"tablewrap\">\n <RunsTablePlaceholder icon={Inbox} title={emptyTitle} message={emptyMessage} />\n </div>\n );\n }\n\n return (\n <div className=\"tablewrap\">\n <table className=\"runs\">\n <thead>\n <tr>\n {!hideColumns?.includes(\"workflow\") && (\n <RunsTableHead label=\"Workflow\" sortKey=\"workflow\" sort={sort} onSort={onSort} />\n )}\n <RunsTableHead label=\"Status\" sortKey=\"status\" sort={sort} onSort={onSort} />\n {!hideColumns?.includes(\"app\") && (\n <RunsTableHead label=\"App\" sortKey=\"app\" sort={sort} onSort={onSort} />\n )}\n <th>Current step</th>\n <RunsTableHead label=\"Started\" sortKey=\"started\" sort={sort} onSort={onSort} />\n <RunsTableHead\n label=\"Duration\"\n sortKey=\"duration\"\n sort={sort}\n onSort={onSort}\n numeric\n />\n {onReplay && <th aria-label=\"Actions\" />}\n </tr>\n </thead>\n <tbody>\n {rows.map((run) => (\n <RunsTableRow\n key={run.id}\n run={run}\n selected={selectedId === run.id}\n onSelect={onSelect}\n hideColumns={hideColumns}\n stepTotal={expectedSteps.get(run.workflowName)}\n onReplay={onReplay}\n />\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n","import type { StatusFilter } from \"../lib/run-filters\";\nimport { ResumeMark } from \"./ResumeMark\";\n\nexport interface StatTile {\n label: string;\n value: number;\n sub: string;\n token: string;\n mark?: boolean;\n trend?: \"up\" | \"down\";\n // When set, the tile is a button that filters the runs to this status (and shows\n // an active state while that filter is on). Tiles without it stay static.\n status?: StatusFilter;\n active?: boolean;\n}\n\nexport function StatTileGrid({\n tiles,\n onSelect,\n}: {\n tiles: StatTile[];\n onSelect?: (status: StatusFilter) => void;\n}) {\n return (\n <div className=\"stats\">\n {tiles.map((t) => {\n const inner = (\n <>\n <div className=\"stat-top\">\n {t.mark ? (\n <ResumeMark variant=\"run\" size={12} className=\"stat-mark\" />\n ) : (\n <i className=\"stat-dot\" style={{ background: `var(${t.token})` }} />\n )}\n <span className=\"stat-label\">{t.label}</span>\n </div>\n <div className=\"stat-val\">{t.value}</div>\n <div className=\"stat-sub\">\n <span className={t.trend ?? \"\"}>{t.sub}</span>\n </div>\n </>\n );\n if (t.status && onSelect) {\n const status = t.status;\n return (\n <button\n type=\"button\"\n className=\"stat stat-btn focusable\"\n key={t.label}\n data-active={t.active ? \"1\" : \"0\"}\n style={t.active ? { boxShadow: `inset 0 -2px 0 var(${t.token})` } : undefined}\n title={\n t.active\n ? `Clear the ${t.label.toLowerCase()} filter`\n : `Show ${t.label.toLowerCase()} runs`\n }\n onClick={() => onSelect(status)}\n >\n {inner}\n </button>\n );\n }\n return (\n <div className=\"stat\" key={t.label}>\n {inner}\n </div>\n );\n })}\n </div>\n );\n}\n","import type { RunStats } from \"@durablex/react\";\nimport type { StatusFilter } from \"../lib/run-filters\";\nimport { StatTileGrid } from \"./StatTileGrid\";\n\nconst EMPTY: RunStats = {\n total: 0,\n active: 0,\n queued: 0,\n running: 0,\n succeeded: 0,\n failed: 0,\n successRate: 100,\n};\n\nexport function StatsTiles({\n stats,\n rangeLabel,\n activeStatus,\n onFilterStatus,\n}: {\n stats?: RunStats;\n rangeLabel?: string;\n activeStatus?: StatusFilter;\n onFilterStatus?: (status: StatusFilter) => void;\n}) {\n const s = stats ?? EMPTY;\n\n return (\n <StatTileGrid\n onSelect={onFilterStatus}\n tiles={[\n {\n label: \"Recent\",\n value: s.total,\n sub: rangeLabel ?? \"recent\",\n token: \"--muted-foreground\",\n },\n {\n label: \"Active\",\n value: s.active,\n sub: \"in progress\",\n token: \"--st-running-fg\",\n mark: true,\n },\n {\n label: \"Succeeded\",\n value: s.succeeded,\n sub: `${s.successRate}% success`,\n token: \"--st-succeeded-fg\",\n trend: \"up\",\n status: \"succeeded\",\n active: activeStatus === \"succeeded\",\n },\n {\n label: \"Failed\",\n value: s.failed,\n sub: s.failed ? \"need attention\" : \"all clear\",\n token: \"--st-failed-fg\",\n trend: s.failed ? \"down\" : undefined,\n status: \"failed\",\n active: activeStatus === \"failed\",\n },\n ]}\n />\n );\n}\n","import { X } from \"lucide-react\";\nimport { toast } from \"sonner\";\nimport { type TriggerKind, useReplayRun, useRuns, useRunStats } from \"@durablex/react\";\nimport { ResizableHandle, ResizablePanel, ResizablePanelGroup } from \"../ui/resizable\";\nimport { useKeysetPager } from \"../hooks/use-keyset-pager\";\nimport { ALL_FILTER, type RunTypeFilter, type StatusFilter } from \"../lib/run-filters\";\nimport { type RunSort, type RunSortKey, toggleRunSort } from \"../lib/run-sort\";\nimport { timeLabel, windowSince } from \"../lib/time-range\";\nimport { BulkReplayButton } from \"./BulkReplayButton\";\nimport { CursorPager } from \"./CursorPager\";\nimport { RetryFromStepButton } from \"./RetryFromStepButton\";\nimport { RunControlHistory } from \"./RunControlHistory\";\nimport { RunInspector } from \"./RunInspector\";\nimport { RunInspectorActions } from \"./RunInspectorActions\";\nimport { RunsFilterBar } from \"./RunsFilterBar\";\nimport { RunsTable } from \"./RunsTable\";\nimport { StatsTiles } from \"./StatsTiles\";\n\nconst PAGE_SIZE = 30;\n\nconst RUN_TYPE_TO_TRIGGER: Record<RunTypeFilter, TriggerKind | undefined> = {\n all: undefined,\n triggered: \"event\",\n scheduled: \"cron\",\n};\n\nexport interface RunsViewState {\n status: StatusFilter;\n app: string;\n runType: RunTypeFilter;\n time: string;\n q: string;\n deep: boolean;\n sort: RunSort;\n run: string | null;\n event: string | null;\n replayOf: string | null;\n}\n\nexport interface RunsViewProps {\n state: RunsViewState;\n onChange: (patch: Partial<RunsViewState>, opts?: { push?: boolean }) => void;\n // Omit the write surface (run controls, replay, bulk replay) for a read-only embed.\n readOnly?: boolean;\n}\n\nexport function RunsView({ state, onChange, readOnly = false }: RunsViewProps) {\n const {\n app,\n runType,\n time,\n q: query,\n deep,\n sort,\n run: selectedRunId,\n event,\n replayOf,\n status,\n } = state;\n const openRun = (id: string) => onChange({ run: id }, { push: true });\n const onSort = (key: RunSortKey) => onChange({ sort: toggleRunSort(sort, key) });\n\n const replay = useReplayRun();\n const onReplay = (id: string) =>\n replay.mutate(\n { runId: id },\n {\n onSuccess: (forked) =>\n toast.success(\"Replay started\", {\n action: { label: \"View run\", onClick: () => openRun(forked.id) },\n }),\n onError: (err) => toast.error(`Replay failed: ${err.message}`),\n },\n );\n\n const since = windowSince(time);\n const appParam = app === ALL_FILTER ? undefined : app;\n const statusParam = status === ALL_FILTER ? undefined : status;\n const runTypeParam = RUN_TYPE_TO_TRIGGER[runType];\n const search = query.trim() || undefined;\n\n const filterKey = `${statusParam ?? \"\"}|${appParam ?? \"\"}|${runTypeParam ?? \"\"}|${event ?? \"\"}|${replayOf ?? \"\"}|${time}|${search ?? \"\"}|${deep ? \"d\" : \"\"}|${sort.key}-${sort.dir}`;\n const { cursor, canNewer, range, goOlder, goNewer } = useKeysetPager(filterKey, PAGE_SIZE);\n\n const { data, isLoading, isError, error } = useRuns({\n app: appParam,\n status: statusParam,\n runType: runTypeParam,\n eventId: event ?? undefined,\n replayOf: replayOf ?? undefined,\n q: search,\n deep,\n since,\n sort: sort.key,\n dir: sort.dir,\n limit: PAGE_SIZE,\n cursor,\n });\n const stats = useRunStats({ app: appParam, since });\n\n const rows = data?.runs ?? [];\n const nextCursor = data?.nextCursor ?? null;\n const { start: rangeStart, end: rangeEnd } = range(rows.length);\n\n const filtersActive = Boolean(\n search || statusParam || appParam || runTypeParam || event || replayOf,\n );\n\n let emptyMessage: string;\n if (deep && search) {\n emptyMessage = \"No runs contain that text in their input, result, or error.\";\n } else if (filtersActive) {\n emptyMessage = \"No runs match the current filter. Clear filters to see all recent runs.\";\n } else {\n emptyMessage = \"Trigger a workflow to see its run appear here.\";\n }\n\n return (\n <ResizablePanelGroup orientation=\"horizontal\" className=\"min-h-0 flex-1\">\n <ResizablePanel minSize=\"30%\">\n <div className=\"flex h-full min-h-0 flex-col\">\n <StatsTiles\n stats={stats.data}\n rangeLabel={timeLabel(time)}\n activeStatus={status}\n onFilterStatus={(s) => onChange({ status: status === s ? ALL_FILTER : s })}\n />\n <RunsFilterBar\n query={query}\n onQuery={(v) => onChange({ q: v })}\n deep={deep}\n onDeep={(v) => onChange({ deep: v })}\n time={time}\n onTime={(v) => onChange({ time: v })}\n status={status}\n onStatus={(v) => onChange({ status: v })}\n app={app}\n onApp={(v) => onChange({ app: v })}\n runType={runType}\n onRunType={(v) => onChange({ runType: v })}\n shown={rows.length}\n action={\n readOnly ? undefined : (\n <BulkReplayButton\n key={filterKey}\n filter={{ app: appParam, status: statusParam, runType: runTypeParam, since }}\n />\n )\n }\n />\n {event && (\n <div className=\"flex items-center gap-2 border-b px-3 py-1.5\">\n <span className=\"text-muted-foreground text-xs\">Runs triggered by event</span>\n <span className=\"text-[11px]\" title={event}>\n {rows[0]?.eventName ?? event}\n </span>\n <button\n type=\"button\"\n className=\"text-muted-foreground hover:text-foreground inline-flex items-center gap-1 text-xs\"\n onClick={() => onChange({ event: null })}\n >\n <X className=\"size-3\" /> clear\n </button>\n </div>\n )}\n {replayOf && (\n <div className=\"flex items-center gap-2 border-b px-3 py-1.5\">\n <span className=\"text-muted-foreground text-xs\">Runs replayed from</span>\n <button\n type=\"button\"\n className=\"text-[11px] hover:underline\"\n title={`Open source run ${replayOf}`}\n onClick={() => onChange({ run: replayOf }, { push: true })}\n >\n {rows[0]?.workflowName ?? replayOf}\n </button>\n <button\n type=\"button\"\n className=\"text-muted-foreground hover:text-foreground inline-flex items-center gap-1 text-xs\"\n onClick={() => onChange({ replayOf: null })}\n >\n <X className=\"size-3\" /> clear\n </button>\n </div>\n )}\n <RunsTable\n rows={rows}\n selectedId={selectedRunId}\n onSelect={openRun}\n sort={sort}\n onSort={onSort}\n loading={isLoading}\n isError={isError}\n error={error}\n emptyTitle={filtersActive ? \"No runs match\" : \"No runs yet\"}\n emptyMessage={emptyMessage}\n onReplay={readOnly ? undefined : onReplay}\n />\n {!isLoading && rows.length > 0 && (\n <CursorPager\n rangeStart={rangeStart}\n rangeEnd={rangeEnd}\n canNewer={canNewer}\n canOlder={nextCursor != null}\n onNewer={goNewer}\n onOlder={() => goOlder(nextCursor)}\n />\n )}\n </div>\n </ResizablePanel>\n {selectedRunId && (\n <>\n <ResizableHandle withHandle />\n <ResizablePanel defaultSize=\"38%\" minSize=\"24%\" maxSize=\"65%\">\n <RunInspector\n key={selectedRunId}\n runId={selectedRunId}\n onClose={() => onChange({ run: null })}\n onFilterByEvent={(id) => onChange({ event: id, run: null })}\n onOpenRun={openRun}\n onShowReplays={(id) => onChange({ replayOf: id, run: null }, { push: true })}\n renderActions={\n readOnly\n ? undefined\n : (run) => <RunInspectorActions run={run} onOpenRun={openRun} />\n }\n renderControlHistory={\n readOnly ? undefined : (id) => <RunControlHistory runId={id} onOpenRun={openRun} />\n }\n renderStepRetry={\n readOnly\n ? undefined\n : (rid, stepName) => (\n <RetryFromStepButton runId={rid} stepName={stepName} onOpenRun={openRun} />\n )\n }\n />\n </ResizablePanel>\n </>\n )}\n </ResizablePanelGroup>\n );\n}\n","import { localTimeZone, type TimeZoneMode } from \"../../lib/time-range\";\nimport { FilterDropdown } from \"./FilterDropdown\";\nimport { FilterDropdownButton } from \"./FilterDropdownButton\";\nimport { FilterDropdownItem } from \"./FilterDropdownItem\";\n\nconst OPTIONS: [TimeZoneMode, string][] = [\n [\"local\", `Local · ${localTimeZone}`],\n [\"utc\", \"UTC\"],\n];\n\nexport function TimeZoneFilter({ tz, onTz }: { tz: TimeZoneMode; onTz(tz: TimeZoneMode): void }) {\n return (\n <FilterDropdown\n align=\"right\"\n width={220}\n trigger={(open, toggle) => (\n <FilterDropdownButton\n open={open}\n toggle={toggle}\n keyLabel=\"Zone\"\n value={tz === \"utc\" ? \"UTC\" : \"Local\"}\n />\n )}\n >\n {(close) =>\n OPTIONS.map(([k, l]) => (\n <FilterDropdownItem\n key={k}\n active={tz === k}\n label={l}\n onClick={() => {\n onTz(k);\n close();\n }}\n />\n ))\n }\n </FilterDropdown>\n );\n}\n","import type { ReactNode } from \"react\";\n\nexport function SectionHeader({ children, action }: { children: ReactNode; action?: ReactNode }) {\n return (\n <div className=\"text-muted-foreground flex min-h-9 items-center justify-between border-b px-3 py-2 text-xs font-medium tracking-tight\">\n <span>{children}</span>\n {action}\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { SectionHeader } from \"../SectionHeader\";\n\nexport function ChartCard({\n title,\n action,\n children,\n}: {\n title: string;\n action?: ReactNode;\n children: ReactNode;\n}) {\n return (\n <section className=\"border-b\">\n <SectionHeader action={action}>{title}</SectionHeader>\n <div className=\"p-3\">{children}</div>\n </section>\n );\n}\n","import * as React from \"react\";\nimport * as RechartsPrimitive from \"recharts\";\nimport type { TooltipValueType } from \"recharts\";\n\nimport { cn } from \"../lib/utils\";\n\n// Format: { THEME_NAME: CSS_SELECTOR }\nconst THEMES = { light: \"\", dark: \".dark\" } as const;\n\nconst INITIAL_DIMENSION = { width: 320, height: 200 } as const;\ntype TooltipNameType = number | string;\n\nexport type ChartConfig = Record<\n string,\n {\n label?: React.ReactNode;\n icon?: React.ComponentType;\n } & (\n | { color?: string; theme?: never }\n | { color?: never; theme: Record<keyof typeof THEMES, string> }\n )\n>;\n\ntype ChartContextProps = {\n config: ChartConfig;\n};\n\nconst ChartContext = React.createContext<ChartContextProps | null>(null);\n\nfunction useChart() {\n const context = React.useContext(ChartContext);\n\n if (!context) {\n throw new Error(\"useChart must be used within a <ChartContainer />\");\n }\n\n return context;\n}\n\nfunction ChartContainer({\n id,\n className,\n children,\n config,\n initialDimension = INITIAL_DIMENSION,\n ...props\n}: React.ComponentProps<\"div\"> & {\n config: ChartConfig;\n children: React.ComponentProps<typeof RechartsPrimitive.ResponsiveContainer>[\"children\"];\n initialDimension?: {\n width: number;\n height: number;\n };\n}) {\n const uniqueId = React.useId();\n const chartId = `chart-${id ?? uniqueId.replace(/:/g, \"\")}`;\n\n return (\n <ChartContext.Provider value={{ config }}>\n <div\n data-slot=\"chart\"\n data-chart={chartId}\n className={cn(\n \"flex aspect-video justify-center text-xs [&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-border [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-hidden [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-border [&_.recharts-radial-bar-background-sector]:fill-muted [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-muted [&_.recharts-reference-line_[stroke='#ccc']]:stroke-border [&_.recharts-sector]:outline-hidden [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-surface]:outline-hidden\",\n className,\n )}\n {...props}\n >\n <ChartStyle id={chartId} config={config} />\n <RechartsPrimitive.ResponsiveContainer initialDimension={initialDimension}>\n {children}\n </RechartsPrimitive.ResponsiveContainer>\n </div>\n </ChartContext.Provider>\n );\n}\n\nconst ChartStyle = ({ id, config }: { id: string; config: ChartConfig }) => {\n const colorConfig = Object.entries(config).filter(([, config]) => config.theme ?? config.color);\n\n if (!colorConfig.length) {\n return null;\n }\n\n return (\n <style\n dangerouslySetInnerHTML={{\n __html: Object.entries(THEMES)\n .map(\n ([theme, prefix]) => `\n${prefix} [data-chart=${id}] {\n${colorConfig\n .map(([key, itemConfig]) => {\n const color = itemConfig.theme?.[theme as keyof typeof itemConfig.theme] ?? itemConfig.color;\n return color ? ` --color-${key}: ${color};` : null;\n })\n .join(\"\\n\")}\n}\n`,\n )\n .join(\"\\n\"),\n }}\n />\n );\n};\n\nconst ChartTooltip = RechartsPrimitive.Tooltip;\n\nfunction ChartTooltipContent({\n active,\n payload,\n className,\n indicator = \"dot\",\n hideLabel = false,\n hideIndicator = false,\n label,\n labelFormatter,\n labelClassName,\n formatter,\n color,\n nameKey,\n labelKey,\n}: React.ComponentProps<typeof RechartsPrimitive.Tooltip> &\n React.ComponentProps<\"div\"> & {\n hideLabel?: boolean;\n hideIndicator?: boolean;\n indicator?: \"line\" | \"dot\" | \"dashed\";\n nameKey?: string;\n labelKey?: string;\n } & Omit<\n RechartsPrimitive.DefaultTooltipContentProps<TooltipValueType, TooltipNameType>,\n \"accessibilityLayer\"\n >) {\n const { config } = useChart();\n\n const tooltipLabel = React.useMemo(() => {\n if (hideLabel || !payload?.length) {\n return null;\n }\n\n const [item] = payload;\n const key = `${labelKey ?? item?.dataKey ?? item?.name ?? \"value\"}`;\n const itemConfig = getPayloadConfigFromPayload(config, item, key);\n const value =\n !labelKey && typeof label === \"string\" ? (config[label]?.label ?? label) : itemConfig?.label;\n\n if (labelFormatter) {\n return (\n <div className={cn(\"font-medium\", labelClassName)}>{labelFormatter(value, payload)}</div>\n );\n }\n\n if (!value) {\n return null;\n }\n\n return <div className={cn(\"font-medium\", labelClassName)}>{value}</div>;\n }, [label, labelFormatter, payload, hideLabel, labelClassName, config, labelKey]);\n\n if (!active || !payload?.length) {\n return null;\n }\n\n const nestLabel = payload.length === 1 && indicator !== \"dot\";\n\n return (\n <div\n className={cn(\n \"grid min-w-32 items-start gap-1.5 rounded-lg border border-border/50 bg-background px-2.5 py-1.5 text-xs shadow-xl\",\n className,\n )}\n >\n {!nestLabel ? tooltipLabel : null}\n <div className=\"grid gap-1.5\">\n {payload\n .filter((item) => item.type !== \"none\")\n .map((item, index) => {\n const key = `${nameKey ?? item.name ?? item.dataKey ?? \"value\"}`;\n const itemConfig = getPayloadConfigFromPayload(config, item, key);\n const indicatorColor = color ?? item.payload?.fill ?? item.color;\n\n return (\n <div\n key={index}\n className={cn(\n \"flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-muted-foreground\",\n indicator === \"dot\" && \"items-center\",\n )}\n >\n {formatter && item?.value !== undefined && item.name ? (\n formatter(item.value, item.name, item, index, item.payload)\n ) : (\n <>\n {itemConfig?.icon ? (\n <itemConfig.icon />\n ) : (\n !hideIndicator && (\n <div\n className={cn(\n \"shrink-0 rounded-[2px] border-(--color-border) bg-(--color-bg)\",\n {\n \"h-2.5 w-2.5\": indicator === \"dot\",\n \"w-1\": indicator === \"line\",\n \"w-0 border-[1.5px] border-dashed bg-transparent\":\n indicator === \"dashed\",\n \"my-0.5\": nestLabel && indicator === \"dashed\",\n },\n )}\n style={\n {\n \"--color-bg\": indicatorColor,\n \"--color-border\": indicatorColor,\n } as React.CSSProperties\n }\n />\n )\n )}\n <div\n className={cn(\n \"flex flex-1 justify-between leading-none\",\n nestLabel ? \"items-end\" : \"items-center\",\n )}\n >\n <div className=\"grid gap-1.5\">\n {nestLabel ? tooltipLabel : null}\n <span className=\"text-muted-foreground\">\n {itemConfig?.label ?? item.name}\n </span>\n </div>\n {item.value != null && (\n <span className=\"font-mono font-medium text-foreground tabular-nums\">\n {typeof item.value === \"number\"\n ? item.value.toLocaleString()\n : String(item.value)}\n </span>\n )}\n </div>\n </>\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\nconst ChartLegend = RechartsPrimitive.Legend;\n\nfunction ChartLegendContent({\n className,\n hideIcon = false,\n payload,\n verticalAlign = \"bottom\",\n nameKey,\n}: React.ComponentProps<\"div\"> & {\n hideIcon?: boolean;\n nameKey?: string;\n} & RechartsPrimitive.DefaultLegendContentProps) {\n const { config } = useChart();\n\n if (!payload?.length) {\n return null;\n }\n\n return (\n <div\n className={cn(\n \"flex flex-wrap items-center justify-center gap-x-2.5 gap-y-1\",\n verticalAlign === \"top\" ? \"pb-3\" : \"pt-3\",\n className,\n )}\n >\n {payload\n .filter((item) => item.type !== \"none\")\n .map((item, index) => {\n const key = `${nameKey ?? item.dataKey ?? \"value\"}`;\n const itemConfig = getPayloadConfigFromPayload(config, item, key);\n\n return (\n <div\n key={index}\n className={cn(\n \"flex items-center gap-1.5 [&>svg]:h-3 [&>svg]:w-3 [&>svg]:text-muted-foreground\",\n )}\n >\n {itemConfig?.icon && !hideIcon ? (\n <itemConfig.icon />\n ) : (\n <div\n className=\"h-2 w-2 shrink-0 rounded-[2px]\"\n style={{\n backgroundColor: item.color,\n }}\n />\n )}\n {itemConfig?.label}\n </div>\n );\n })}\n </div>\n );\n}\n\nfunction getPayloadConfigFromPayload(config: ChartConfig, payload: unknown, key: string) {\n if (typeof payload !== \"object\" || payload === null) {\n return undefined;\n }\n\n const payloadPayload =\n \"payload\" in payload && typeof payload.payload === \"object\" && payload.payload !== null\n ? payload.payload\n : undefined;\n\n let configLabelKey: string = key;\n\n if (key in payload && typeof payload[key as keyof typeof payload] === \"string\") {\n configLabelKey = payload[key as keyof typeof payload] as string;\n } else if (\n payloadPayload &&\n key in payloadPayload &&\n typeof payloadPayload[key as keyof typeof payloadPayload] === \"string\"\n ) {\n configLabelKey = payloadPayload[key as keyof typeof payloadPayload] as string;\n }\n\n return configLabelKey in config ? config[configLabelKey] : config[key];\n}\n\nexport {\n ChartContainer,\n ChartTooltip,\n ChartTooltipContent,\n ChartLegend,\n ChartLegendContent,\n ChartStyle,\n};\n","import { CartesianGrid, Line, LineChart, XAxis, YAxis } from \"recharts\";\nimport type { RunSeries } from \"@durablex/react\";\nimport {\n type ChartConfig,\n ChartContainer,\n ChartLegend,\n ChartLegendContent,\n ChartTooltip,\n ChartTooltipContent,\n} from \"../../ui/chart\";\nimport { bucketTickLabel, type TimeZoneMode } from \"../../lib/time-range\";\n\nconst CONFIG: ChartConfig = {\n avgMs: { label: \"Avg\", color: \"var(--chart-1)\" },\n maxMs: { label: \"Max\", color: \"var(--chart-4)\" },\n};\n\n// formatMs renders a duration compactly for the axis/tooltip: sub-second in ms,\n// otherwise seconds.\nfunction formatMs(ms: number): string {\n return ms < 1000 ? `${ms}ms` : `${(ms / 1000).toFixed(ms < 10_000 ? 1 : 0)}s`;\n}\n\nexport function RunLatencyChart({ series, tz }: { series: RunSeries; tz: TimeZoneMode }) {\n const rows = series.buckets.map((b) => ({\n ts: b.ts,\n avgMs: b.avgMs ?? null,\n maxMs: b.maxMs ?? null,\n }));\n return (\n <ChartContainer config={CONFIG} className=\"aspect-auto h-56 w-full\">\n <LineChart data={rows} margin={{ left: 4, right: 8, top: 8 }}>\n <CartesianGrid vertical={false} />\n <XAxis\n dataKey=\"ts\"\n tickLine={false}\n axisLine={false}\n tickMargin={8}\n minTickGap={24}\n tickFormatter={(ts) => bucketTickLabel(ts, series.bucketSeconds, tz)}\n />\n <YAxis tickLine={false} axisLine={false} width={40} tickFormatter={formatMs} />\n <ChartTooltip\n content={\n <ChartTooltipContent\n formatter={(v) => formatMs(Number(v))}\n labelFormatter={(_, p) =>\n bucketTickLabel(String(p[0]?.payload.ts), series.bucketSeconds, tz)\n }\n />\n }\n />\n <ChartLegend content={<ChartLegendContent />} />\n <Line\n dataKey=\"avgMs\"\n type=\"monotone\"\n stroke=\"var(--color-avgMs)\"\n dot={false}\n connectNulls\n />\n <Line\n dataKey=\"maxMs\"\n type=\"monotone\"\n stroke=\"var(--color-maxMs)\"\n dot={false}\n connectNulls\n />\n </LineChart>\n </ChartContainer>\n );\n}\n","import { Bar, BarChart, CartesianGrid, XAxis, YAxis } from \"recharts\";\nimport type { RunSeries } from \"@durablex/react\";\nimport {\n type ChartConfig,\n ChartContainer,\n ChartLegend,\n ChartLegendContent,\n ChartTooltip,\n ChartTooltipContent,\n} from \"../../ui/chart\";\nimport { bucketTickLabel, type TimeZoneMode } from \"../../lib/time-range\";\n\n// The statuses stacked into each bucket bar, in draw order, each themed by the\n// shared status token so the chart reads the same as the run badges.\nconst STATUS_SERIES = [\n { key: \"succeeded\", label: \"Succeeded\", color: \"var(--st-succeeded-fg)\" },\n { key: \"failed\", label: \"Failed\", color: \"var(--st-failed-fg)\" },\n { key: \"cancelled\", label: \"Cancelled\", color: \"var(--st-cancelled-fg)\" },\n { key: \"running\", label: \"Running\", color: \"var(--st-running-fg)\" },\n { key: \"waiting\", label: \"Waiting\", color: \"var(--st-running-fg)\" },\n { key: \"queued\", label: \"Queued\", color: \"var(--st-queued-fg)\" },\n { key: \"paused\", label: \"Paused\", color: \"var(--st-paused-fg)\" },\n] as const;\n\nconst CONFIG: ChartConfig = Object.fromEntries(\n STATUS_SERIES.map((s) => [s.key, { label: s.label, color: s.color }]),\n);\n\nexport function RunsOverTimeChart({ series, tz }: { series: RunSeries; tz: TimeZoneMode }) {\n const rows = series.buckets.map((b) => ({ ts: b.ts, ...b.counts }));\n return (\n <ChartContainer config={CONFIG} className=\"aspect-auto h-56 w-full\">\n <BarChart data={rows} margin={{ left: 4, right: 8, top: 8 }}>\n <CartesianGrid vertical={false} />\n <XAxis\n dataKey=\"ts\"\n tickLine={false}\n axisLine={false}\n tickMargin={8}\n minTickGap={24}\n tickFormatter={(ts) => bucketTickLabel(ts, series.bucketSeconds, tz)}\n />\n <YAxis tickLine={false} axisLine={false} width={28} allowDecimals={false} />\n <ChartTooltip\n content={\n <ChartTooltipContent\n labelFormatter={(_, p) =>\n bucketTickLabel(String(p[0]?.payload.ts), series.bucketSeconds, tz)\n }\n />\n }\n />\n <ChartLegend content={<ChartLegendContent />} />\n {STATUS_SERIES.map((s) => (\n <Bar key={s.key} dataKey={s.key} stackId=\"runs\" fill={`var(--color-${s.key})`} />\n ))}\n </BarChart>\n </ChartContainer>\n );\n}\n","import { useState } from \"react\";\nimport type { RunSeries } from \"@durablex/react\";\nimport { TimeZoneFilter } from \"../filters/TimeZoneFilter\";\nimport type { TimeZoneMode } from \"../../lib/time-range\";\nimport { ChartCard } from \"./ChartCard\";\nimport { RunLatencyChart } from \"./RunLatencyChart\";\nimport { RunsOverTimeChart } from \"./RunsOverTimeChart\";\n\nexport function RunCharts({ series, loading }: { series?: RunSeries; loading: boolean }) {\n // tz governs the wall clock both time axes render in; the toggle lives on the\n // first chart since it applies to the whole pair.\n const [tz, setTz] = useState<TimeZoneMode>(\"local\");\n\n if (!series || series.buckets.length === 0) {\n return (\n <div className=\"text-muted-foreground grid h-40 place-items-center text-xs\">\n {loading ? \"Loading…\" : \"No runs in this window yet.\"}\n </div>\n );\n }\n return (\n <>\n <ChartCard title=\"Runs over time\" action={<TimeZoneFilter tz={tz} onTz={setTz} />}>\n <RunsOverTimeChart series={series} tz={tz} />\n </ChartCard>\n <ChartCard title=\"Run latency\">\n <RunLatencyChart series={series} tz={tz} />\n </ChartCard>\n </>\n );\n}\n","import type { FlowControl } from \"@durablex/react\";\nimport { formatDuration } from \"./format\";\n\nexport const FLOW_ADAPTERS = [\n \"concurrency\",\n \"throttle\",\n \"rateLimit\",\n \"debounce\",\n \"batch\",\n \"priority\",\n \"singleton\",\n \"idempotency\",\n] as const;\nexport type FlowAdapter = (typeof FLOW_ADAPTERS)[number];\n\nconst LABELS: Record<FlowAdapter, string> = {\n concurrency: \"Concurrency\",\n throttle: \"Throttle\",\n rateLimit: \"Rate limit\",\n debounce: \"Debounce\",\n batch: \"Batch\",\n priority: \"Priority\",\n singleton: \"Singleton\",\n idempotency: \"Idempotency\",\n};\n\nexport function hasFlowControl(fc?: FlowControl): boolean {\n return !!fc && FLOW_ADAPTERS.some((a) => fc[a] != null);\n}\n\nexport interface FlowRow {\n adapter: FlowAdapter;\n label: string;\n value: string;\n scopeKey?: string;\n}\n\n// One display row per configured adapter, in FLOW_ADAPTERS order. value is the\n// human-readable policy; scopeKey (when set) is the event field the policy is\n// keyed on.\nexport function flowControlRows(fc: FlowControl): FlowRow[] {\n const rows: FlowRow[] = [];\n const push = (adapter: FlowAdapter, value: string, scopeKey?: string) =>\n rows.push({ adapter, label: LABELS[adapter], value, scopeKey });\n\n if (fc.concurrency) push(\"concurrency\", `limit ${fc.concurrency.limit}`, fc.concurrency.key);\n if (fc.throttle)\n push(\n \"throttle\",\n `${fc.throttle.limit} per ${formatDuration(fc.throttle.perMs)}`,\n fc.throttle.key,\n );\n if (fc.rateLimit)\n push(\n \"rateLimit\",\n `${fc.rateLimit.limit} per ${formatDuration(fc.rateLimit.perMs)}`,\n fc.rateLimit.key,\n );\n if (fc.debounce)\n push(\"debounce\", `${formatDuration(fc.debounce.periodMs)} window`, fc.debounce.key);\n if (fc.batch)\n push(\"batch\", `up to ${fc.batch.maxSize}, ${formatDuration(fc.batch.timeoutMs)}`, fc.batch.key);\n if (fc.priority) {\n // A positive shift moves the run earlier in the queue (higher priority); negative defers it.\n const { shiftMs } = fc.priority;\n push(\"priority\", `${formatDuration(Math.abs(shiftMs))} ${shiftMs < 0 ? \"later\" : \"earlier\"}`);\n }\n if (fc.singleton) push(\"singleton\", fc.singleton.mode || \"-\", fc.singleton.key);\n if (fc.idempotency) {\n push(\n \"idempotency\",\n fc.idempotency.periodMs ? `${formatDuration(fc.idempotency.periodMs)} window` : \"on\",\n fc.idempotency.key,\n );\n }\n return rows;\n}\n","import { SlidersHorizontal } from \"lucide-react\";\nimport { GlyphBadge } from \"./GlyphBadge\";\n\n// Marks a workflow that has flow-control adapters configured. compact is a bare\n// glyph for dense table cells; the full form adds a labelled chip.\nexport function FlowControlBadge({\n compact,\n className,\n}: {\n compact?: boolean;\n className?: string;\n}) {\n return (\n <GlyphBadge\n icon={SlidersHorizontal}\n tone=\"running\"\n label=\"Flow control\"\n ariaLabel=\"Flow control configured\"\n compact={compact}\n className={className}\n />\n );\n}\n","import type { FlowControl, RunStats } from \"@durablex/react\";\nimport { useFlowState } from \"@durablex/react\";\nimport { SectionHeader } from \"./SectionHeader\";\nimport { type FlowAdapter, type FlowRow, flowControlRows } from \"../lib/flow-control\";\nimport { formatNextFire, formatRelative } from \"../lib/format\";\n\ninterface Live {\n stats?: RunStats;\n pending?: number;\n nextFireAt?: string;\n buffered?: number;\n oldestAt?: string;\n}\n\n// The live runtime number for the adapters that have one. concurrency reads from\n// run stats (in-flight + queued); debounce and batch read their buffer backlogs.\n// The other adapters are config-only and return null. The in-flight count is\n// workflow-wide; a keyed limit applies per scope, so it is shown as a plain count\n// (the configured limit sits in the value column) rather than a count/limit ratio.\nfunction liveLabel(adapter: FlowAdapter, l: Live): string | null {\n switch (adapter) {\n case \"concurrency\": {\n const queued = l.stats?.queued ?? 0;\n const base = `${l.stats?.running ?? 0} in-flight`;\n return queued > 0 ? `${base} · ${queued} queued` : base;\n }\n case \"debounce\":\n return `${l.pending ?? 0} pending${l.nextFireAt ? ` · next ${formatNextFire(l.nextFireAt)}` : \"\"}`;\n case \"batch\":\n return `${l.buffered ?? 0} buffered${l.oldestAt ? ` · oldest ${formatRelative(l.oldestAt)}` : \"\"}`;\n default:\n return null;\n }\n}\n\nfunction FlowControlRow({ row, live }: { row: FlowRow; live: string | null }) {\n return (\n <div className=\"fc-row\">\n <span className=\"fc-label\">{row.label}</span>\n <span className=\"fc-value\">{row.value}</span>\n {row.scopeKey && <span className=\"fc-key\">key {row.scopeKey}</span>}\n {live && <span className=\"fc-live\">{live}</span>}\n </div>\n );\n}\n\nexport function FlowControlSection({\n fc,\n app,\n workflow,\n stats,\n}: {\n fc: FlowControl;\n app: string;\n workflow: string;\n stats?: RunStats;\n}) {\n const flow = useFlowState({ app, workflow });\n const debounce = flow.data?.debounce.find((d) => d.workflow === workflow);\n const batch = flow.data?.batch.find((b) => b.workflow === workflow);\n\n return (\n <section className=\"flowctl\">\n <SectionHeader>Flow control</SectionHeader>\n <div className=\"fc-rows\">\n {flowControlRows(fc).map((row) => (\n <FlowControlRow\n key={row.adapter}\n row={row}\n live={liveLabel(row.adapter, {\n stats,\n pending: debounce?.pending,\n nextFireAt: debounce?.nextFireAt,\n buffered: batch?.buffered,\n oldestAt: batch?.oldestAt,\n })}\n />\n ))}\n </div>\n </section>\n );\n}\n","import { X } from \"lucide-react\";\nimport { useState, type ReactNode } from \"react\";\nimport { useRuns, useRunStats, useRunTimeSeries, type WorkflowDef } from \"@durablex/react\";\nimport { CursorPager } from \"./CursorPager\";\nimport { Meta } from \"./Meta\";\nimport { RunsTable } from \"./RunsTable\";\nimport { StatsTiles } from \"./StatsTiles\";\nimport { SectionHeader } from \"./SectionHeader\";\nimport { AppTag } from \"./AppTag\";\nimport { ScheduledBadge } from \"./ScheduledBadge\";\nimport { RunCharts } from \"./charts/RunCharts\";\nimport { FlowControlSection } from \"./FlowControlSection\";\nimport { TimeRangeFilter } from \"./filters/TimeRangeFilter\";\nimport { useKeysetPager } from \"../hooks/use-keyset-pager\";\nimport { hasFlowControl } from \"../lib/flow-control\";\nimport { formatNextFire, formatTime } from \"../lib/format\";\nimport { DEFAULT_RUN_SORT, type RunSortKey, toggleRunSort } from \"../lib/run-sort\";\nimport { DEFAULT_TIME_RANGE, seriesBucketSeconds, timeLabel, windowSince } from \"../lib/time-range\";\n\nconst RUNS_PAGE_SIZE = 30;\n\nexport function WorkflowDetail({\n workflow,\n onClose,\n onOpenRun,\n renderRunAction,\n}: {\n workflow: WorkflowDef;\n onClose(): void;\n onOpenRun(runId: string): void;\n renderRunAction?: (workflow: WorkflowDef) => ReactNode;\n}) {\n const [time, setTime] = useState(DEFAULT_TIME_RANGE);\n const [sort, setSort] = useState(DEFAULT_RUN_SORT);\n const onSort = (key: RunSortKey) => setSort((prev) => toggleRunSort(prev, key));\n\n const since = windowSince(time);\n const bucket = seriesBucketSeconds(time);\n const scope = { app: workflow.app, workflow: workflow.name };\n\n // Reset to the newest page whenever the time range or sort changes.\n const { cursor, canNewer, range, goOlder, goNewer } = useKeysetPager(\n `${time}|${sort.key}-${sort.dir}`,\n RUNS_PAGE_SIZE,\n );\n\n const stats = useRunStats({ ...scope, since });\n // Concurrency in-flight/queued are point-in-time, so they read an unwindowed count\n // (a run executing longer than the selected range still counts as in flight).\n const liveStats = useRunStats(scope);\n const { data: series, isLoading: seriesLoading } = useRunTimeSeries({ ...scope, since, bucket });\n const runs = useRuns({\n ...scope,\n since,\n sort: sort.key,\n dir: sort.dir,\n limit: RUNS_PAGE_SIZE,\n cursor,\n });\n const rows = runs.data?.runs ?? [];\n const nextCursor = runs.data?.nextCursor ?? null;\n const { start: rangeStart, end: rangeEnd } = range(rows.length);\n const schedule = workflow.scheduled ? workflow.schedules?.[0] : undefined;\n\n return (\n <div className=\"run-panel\">\n <div className=\"panel-head\">\n <div className=\"ph-top\">\n <h2>\n <span className=\"h2-name\">{workflow.name}</span>\n </h2>\n <div className=\"ph-actions\">\n {renderRunAction?.(workflow)}\n <button\n type=\"button\"\n className=\"iconbtn focusable\"\n aria-label=\"Close\"\n onClick={onClose}\n >\n <X />\n </button>\n </div>\n </div>\n <div className=\"ph-status\">\n <AppTag app={workflow.app} />\n {schedule && (\n <span className=\"step-cell\">\n <ScheduledBadge compact />\n <span className=\"font-mono text-xs\">{schedule.cron}</span>\n </span>\n )}\n </div>\n </div>\n\n <div className=\"panel-body\">\n <div className=\"metagrid\">\n <Meta label=\"App\" value={workflow.app} />\n <Meta label=\"Max attempts\" value={String(workflow.maxAttempts)} />\n <Meta label=\"Backoff\" value={workflow.backoff} />\n <Meta label=\"Schedule\" value={schedule ? schedule.cron : \"Not scheduled\"} />\n {schedule && <Meta label=\"Next fire\" value={formatNextFire(schedule.nextFireAt)} />}\n <Meta label=\"Registered\" value={formatTime(workflow.registeredAt)} />\n <Meta label=\"Updated\" value={formatTime(workflow.updatedAt)} />\n </div>\n\n {hasFlowControl(workflow.flowControl) && workflow.flowControl && (\n <FlowControlSection\n fc={workflow.flowControl}\n app={workflow.app}\n workflow={workflow.name}\n stats={liveStats.data}\n />\n )}\n\n <StatsTiles stats={stats.data} rangeLabel={timeLabel(time)} />\n <div className=\"filterbar\">\n <TimeRangeFilter time={time} onTime={setTime} />\n </div>\n\n <RunCharts series={series} loading={seriesLoading} />\n\n <SectionHeader>Runs</SectionHeader>\n <RunsTable\n rows={rows}\n selectedId={null}\n onSelect={onOpenRun}\n sort={sort}\n onSort={onSort}\n loading={runs.isLoading}\n isError={runs.isError}\n error={runs.error}\n emptyTitle=\"No runs yet\"\n emptyMessage=\"This workflow has no runs in the selected window.\"\n hideColumns={[\"workflow\", \"app\"]}\n />\n {!runs.isLoading && rows.length > 0 && (\n <CursorPager\n rangeStart={rangeStart}\n rangeEnd={rangeEnd}\n canNewer={canNewer}\n canOlder={nextCursor != null}\n onNewer={goNewer}\n onOlder={() => goOlder(nextCursor)}\n />\n )}\n </div>\n </div>\n );\n}\n","import { type KeyboardEvent, type ReactNode, useState } from \"react\";\nimport { useWorkflows, type WorkflowDef } from \"@durablex/react\";\nimport { ResizableHandle, ResizablePanel, ResizablePanelGroup } from \"../ui/resizable\";\nimport { hasFlowControl } from \"../lib/flow-control\";\nimport { ALL_FILTER } from \"../lib/run-filters\";\nimport { formatNextFire, formatTime } from \"../lib/format\";\nimport { AppFilter } from \"./filters/AppFilter\";\nimport { AppTag } from \"./AppTag\";\nimport { ScheduledBadge } from \"./ScheduledBadge\";\nimport { FlowControlBadge } from \"./FlowControlBadge\";\nimport { WorkflowDetail } from \"./WorkflowDetail\";\n\nconst WORKFLOW_COLUMNS = 6;\n// A workflow is identified by (app, name); JSON-encode the pair so the key can't\n// collide for different splits of the same concatenation (e.g. a|bc vs ab|c).\nconst workflowKey = (w: { app: string; name: string }) => JSON.stringify([w.app, w.name]);\n\nexport function WorkflowsView({\n onOpenRun,\n renderRunAction,\n}: {\n onOpenRun(runId: string): void;\n renderRunAction?: (workflow: WorkflowDef) => ReactNode;\n}) {\n const { data, isLoading, isError, error } = useWorkflows();\n const [app, setApp] = useState<string>(ALL_FILTER);\n const [selectedKey, setSelectedKey] = useState<string | null>(null);\n\n const rows = (data ?? []).filter((w) => app === ALL_FILTER || w.app === app);\n const selected = (data ?? []).find((w) => workflowKey(w) === selectedKey) ?? null;\n\n return (\n <ResizablePanelGroup orientation=\"horizontal\" className=\"min-h-0 flex-1\">\n <ResizablePanel minSize=\"30%\">\n <div className=\"content\">\n <div className=\"tbar\">\n <span className=\"meta\">{rows.length} workflows</span>\n <span className=\"tbar-spacer\" />\n <AppFilter app={app} onApp={setApp} align=\"right\" />\n </div>\n\n <div className=\"tablewrap\">\n <table className=\"runs\">\n <thead>\n <tr>\n <th>Name</th>\n <th>App</th>\n <th>Schedule</th>\n <th>Next run</th>\n <th className=\"num\">Max attempts</th>\n <th>Backoff</th>\n </tr>\n </thead>\n <tbody>\n {isLoading && rows.length === 0 ? (\n <tr className=\"table-status\">\n <td colSpan={WORKFLOW_COLUMNS}>Loading workflows…</td>\n </tr>\n ) : isError ? (\n <tr className=\"table-status\">\n <td colSpan={WORKFLOW_COLUMNS}>\n {error instanceof Error ? error.message : \"Failed to load workflows\"}\n </td>\n </tr>\n ) : rows.length === 0 ? (\n <tr className=\"table-status\">\n <td colSpan={WORKFLOW_COLUMNS}>\n No workflows registered. Start a runner to register one.\n </td>\n </tr>\n ) : (\n rows.map((w) => (\n <WorkflowRow\n key={workflowKey(w)}\n workflow={w}\n selected={workflowKey(w) === selectedKey}\n onSelect={() => setSelectedKey(workflowKey(w))}\n />\n ))\n )}\n </tbody>\n </table>\n </div>\n </div>\n </ResizablePanel>\n {selected && (\n <>\n <ResizableHandle withHandle />\n <ResizablePanel defaultSize=\"42%\" minSize=\"28%\" maxSize=\"68%\">\n <WorkflowDetail\n key={selectedKey ?? \"\"}\n workflow={selected}\n onClose={() => setSelectedKey(null)}\n onOpenRun={onOpenRun}\n renderRunAction={renderRunAction}\n />\n </ResizablePanel>\n </>\n )}\n </ResizablePanelGroup>\n );\n}\n\nfunction WorkflowRow({\n workflow: w,\n selected,\n onSelect,\n}: {\n workflow: WorkflowDef;\n selected: boolean;\n onSelect(): void;\n}) {\n const onKeyDown = (e: KeyboardEvent<HTMLTableRowElement>) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onSelect();\n }\n };\n const schedule = w.scheduled ? w.schedules?.[0] : undefined;\n\n return (\n <tr\n className=\"row focusable\"\n tabIndex={0}\n data-selected={selected ? \"1\" : \"0\"}\n onClick={onSelect}\n onKeyDown={onKeyDown}\n >\n <td>\n <div className=\"wf-cell\">\n <span className=\"wf-name\">{w.name}</span>\n {hasFlowControl(w.flowControl) && <FlowControlBadge compact />}\n </div>\n </td>\n <td>\n <AppTag app={w.app} />\n </td>\n <td>\n {schedule ? (\n <div className=\"step-cell\">\n <ScheduledBadge compact />\n <span className=\"font-mono text-xs\">{schedule.cron}</span>\n {w.schedules && w.schedules.length > 1 && (\n <span className=\"cell-mut\">+{w.schedules.length - 1}</span>\n )}\n </div>\n ) : (\n <span className=\"cell-mut\">-</span>\n )}\n </td>\n <td>\n {schedule ? (\n <span className=\"cell-mut\" title={formatTime(schedule.nextFireAt)}>\n {formatNextFire(schedule.nextFireAt)}\n </span>\n ) : (\n <span className=\"cell-mut\">-</span>\n )}\n </td>\n <td className=\"num\">\n <span className=\"dur\">{w.maxAttempts}</span>\n </td>\n <td>\n <span className=\"cell-mut font-mono text-xs\">{w.backoff}</span>\n </td>\n </tr>\n );\n}\n","import { StatusBadge } from \"./StatusBadge\";\n\nconst RUNNER_BADGE = {\n live: { status: \"succeeded\", label: \"Live\" },\n stale: { status: \"cancelled\", label: \"Stale\" },\n} as const;\n\nexport function RunnerLiveBadge({ live, small }: { live: boolean; small?: boolean }) {\n const m = live ? RUNNER_BADGE.live : RUNNER_BADGE.stale;\n return <StatusBadge status={m.status} label={m.label} small={small} />;\n}\n","import type { AppStatus } from \"@durablex/react\";\nimport { StatusBadge } from \"./StatusBadge\";\n\nconst APP_BADGE: Record<\n AppStatus,\n { status: \"succeeded\" | \"running\" | \"failed\" | \"cancelled\"; label: string }\n> = {\n connected: { status: \"succeeded\", label: \"Connected\" },\n syncing: { status: \"running\", label: \"Syncing\" },\n error: { status: \"failed\", label: \"Error\" },\n disconnected: { status: \"cancelled\", label: \"Disconnected\" },\n};\n\nexport function AppStatusBadge({ status, small }: { status: AppStatus; small?: boolean }) {\n const m = APP_BADGE[status];\n return <StatusBadge status={m.status} label={m.label} small={small} />;\n}\n","import { useMemo, useState } from \"react\";\nimport { useApps, type AppInfo, type AppStatus, type Runner } from \"@durablex/react\";\nimport { appHue } from \"../lib/app-color\";\nimport { formatRelative } from \"../lib/format\";\nimport { AppStatusBadge } from \"./AppStatusBadge\";\nimport { Meta } from \"./Meta\";\nimport { RunnerLiveBadge } from \"./RunnerLiveBadge\";\nimport { StatusBadge } from \"./StatusBadge\";\n\ninterface AppTile {\n label: string;\n value: number;\n sub: string;\n color: string;\n}\n\nexport function AppsView() {\n const { data: apps, isLoading } = useApps();\n\n const tiles = useMemo<AppTile[]>(() => {\n const by = (s: AppStatus) => apps.filter((a) => a.status === s).length;\n const issues = by(\"error\") + by(\"disconnected\");\n return [\n {\n label: \"Apps\",\n value: apps.length,\n sub: \"connected endpoints\",\n color: \"var(--muted-foreground)\",\n },\n {\n label: \"Connected\",\n value: by(\"connected\"),\n sub: \"healthy\",\n color: \"var(--st-succeeded-fg)\",\n },\n { label: \"Syncing\", value: by(\"syncing\"), sub: \"in progress\", color: \"var(--st-running-fg)\" },\n {\n label: \"Issues\",\n value: issues,\n sub: issues ? \"need attention\" : \"all clear\",\n color: issues ? \"var(--st-failed-fg)\" : \"var(--muted-foreground)\",\n },\n ];\n }, [apps]);\n\n return (\n <div className=\"content\">\n <div className=\"stats\">\n {tiles.map((t) => (\n <div className=\"stat\" key={t.label}>\n <div className=\"stat-top\">\n <i className=\"stat-dot\" style={{ background: t.color }} />\n <span className=\"stat-label\">{t.label}</span>\n </div>\n <div className=\"stat-val\">{t.value}</div>\n <div className=\"stat-sub\">\n <span>{t.sub}</span>\n </div>\n </div>\n ))}\n </div>\n\n <div className=\"tbar\">\n <span className=\"meta\">{apps.length} apps</span>\n </div>\n\n <div className=\"tablewrap\">\n <table className=\"runs apps-table\">\n <thead>\n <tr>\n <th>App</th>\n <th>Status</th>\n <th className=\"num\">Workflows</th>\n <th className=\"num\">Runs</th>\n <th>Last activity</th>\n </tr>\n </thead>\n <tbody>\n {isLoading && apps.length === 0 ? (\n <tr className=\"table-status\">\n <td colSpan={5}>Loading apps…</td>\n </tr>\n ) : apps.length === 0 ? (\n <tr className=\"table-status\">\n <td colSpan={5}>No apps yet. Start a runner to register one via the SDK.</td>\n </tr>\n ) : (\n apps.map((app) => <AppRow key={app.name} app={app} />)\n )}\n </tbody>\n </table>\n </div>\n </div>\n );\n}\n\nfunction AppRow({ app }: { app: AppInfo }) {\n const [open, setOpen] = useState(false);\n\n return (\n <>\n <tr className=\"row app-row\" aria-expanded={open} onClick={() => setOpen((o) => !o)}>\n <td>\n <div className=\"app-cell\">\n <ChevronGlyph />\n <i className=\"sq\" style={{ background: appHue(app.name) }} />\n <div className=\"app-id\">\n <span className=\"nm\">{app.name}</span>\n </div>\n </div>\n </td>\n <td>\n <AppStatusBadge status={app.status} />\n </td>\n <td className=\"num\">\n <span className=\"dur\">{app.workflowCount}</span>\n </td>\n <td className=\"num\">\n <span className=\"dur\">{app.runCount}</span>\n </td>\n <td>\n <span className=\"ts cell-mut\">\n {app.lastSyncAt ? formatRelative(app.lastSyncAt) : \"-\"}\n </span>\n </td>\n </tr>\n {open && (\n <tr className=\"app-detailrow\">\n <td colSpan={5}>\n <div className=\"app-detail-list\">\n <div className=\"app-sub\">Synced workflows · {app.workflows.length}</div>\n {app.workflows.length ? (\n app.workflows.map((w) => (\n <div className=\"app-wf\" key={w.name}>\n <span className=\"app-wf-name\">{w.name}</span>\n {w.lastStatus ? (\n <StatusBadge status={w.lastStatus} small />\n ) : (\n <span className=\"cell-mut\" style={{ fontSize: 11 }}>\n no runs\n </span>\n )}\n </div>\n ))\n ) : (\n <div className=\"cell-mut\" style={{ fontSize: 12, padding: \"4px 0\" }}>\n No workflows registered.\n </div>\n )}\n\n <div className=\"app-sub\">Connected runners · {app.runners.length}</div>\n {app.runners.length ? (\n app.runners.map((rn) => <RunnerRow key={rn.runnerId} runner={rn} />)\n ) : (\n <div className=\"cell-mut\" style={{ fontSize: 12, padding: \"4px 0\" }}>\n No runners connected.\n </div>\n )}\n </div>\n </td>\n </tr>\n )}\n </>\n );\n}\n\nfunction RunnerRow({ runner }: { runner: Runner }) {\n const rows = runnerMetaRows(runner);\n return (\n <div className=\"runner-block\">\n <div className=\"app-wf\">\n <span className=\"app-wf-name\" title={runner.url}>\n {runner.runnerId}\n </span>\n <span className=\"runner-row-end\">\n <span className=\"cell-mut\" style={{ fontSize: 11 }}>\n {runner.lastSeenAt ? formatRelative(runner.lastSeenAt) : \"-\"}\n </span>\n <RunnerLiveBadge live={runner.live} small />\n </span>\n </div>\n {rows.length > 0 && (\n <div className=\"metagrid runner-meta\">\n {rows.map((r) => (\n <Meta key={r.label} label={r.label} value={r.value} />\n ))}\n </div>\n )}\n </div>\n );\n}\n\n// runnerMetaRows builds the handshake fields a runner actually reported - absent\n// ones are dropped rather than shown blank (no mock fields).\nfunction runnerMetaRows(r: Runner): { label: string; value: string }[] {\n const rows: { label: string; value: string }[] = [];\n if (r.framework) rows.push({ label: \"framework\", value: r.framework });\n if (r.runtime) rows.push({ label: \"runtime\", value: r.runtime });\n const sdk = [r.sdkName, r.version].filter(Boolean).join(\" \");\n if (sdk) rows.push({ label: \"sdk\", value: sdk });\n if (r.region) rows.push({ label: \"region\", value: r.region });\n if (r.keyFingerprint) {\n const match =\n r.keyMatches === true ? \" (matches)\" : r.keyMatches === false ? \" (mismatch)\" : \"\";\n rows.push({ label: \"key\", value: r.keyFingerprint + match });\n }\n if (r.url) rows.push({ label: \"endpoint\", value: r.url });\n return rows;\n}\n\nfunction ChevronGlyph() {\n return (\n <svg\n className=\"app-chev\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.8}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m9 6 6 6-6 6\" />\n </svg>\n );\n}\n","export const TABLE_HEAD_CLASS =\n \"text-muted-foreground/70 h-7 px-2 text-[10px] tracking-wider uppercase\";\n","import * as React from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\nfunction Table({ className, ...props }: React.ComponentProps<\"table\">) {\n return (\n <div data-slot=\"table-container\" className=\"relative w-full overflow-x-auto\">\n <table\n data-slot=\"table\"\n className={cn(\"w-full caption-bottom text-sm\", className)}\n {...props}\n />\n </div>\n );\n}\n\nfunction TableHeader({ className, ...props }: React.ComponentProps<\"thead\">) {\n return <thead data-slot=\"table-header\" className={cn(\"[&_tr]:border-b\", className)} {...props} />;\n}\n\nfunction TableBody({ className, ...props }: React.ComponentProps<\"tbody\">) {\n return (\n <tbody\n data-slot=\"table-body\"\n className={cn(\"[&_tr:last-child]:border-0\", className)}\n {...props}\n />\n );\n}\n\nfunction TableFooter({ className, ...props }: React.ComponentProps<\"tfoot\">) {\n return (\n <tfoot\n data-slot=\"table-footer\"\n className={cn(\"border-t bg-muted/50 font-medium [&>tr]:last:border-b-0\", className)}\n {...props}\n />\n );\n}\n\nfunction TableRow({ className, ...props }: React.ComponentProps<\"tr\">) {\n return (\n <tr\n data-slot=\"table-row\"\n className={cn(\n \"border-b transition-colors hover:bg-muted/50 has-aria-expanded:bg-muted/50 data-[state=selected]:bg-muted\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction TableHead({ className, ...props }: React.ComponentProps<\"th\">) {\n return (\n <th\n data-slot=\"table-head\"\n className={cn(\n \"h-10 px-2 text-left align-middle font-medium whitespace-nowrap text-foreground [&:has([role=checkbox])]:pr-0\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction TableCell({ className, ...props }: React.ComponentProps<\"td\">) {\n return (\n <td\n data-slot=\"table-cell\"\n className={cn(\"p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0\", className)}\n {...props}\n />\n );\n}\n\nfunction TableCaption({ className, ...props }: React.ComponentProps<\"caption\">) {\n return (\n <caption\n data-slot=\"table-caption\"\n className={cn(\"mt-4 text-sm text-muted-foreground\", className)}\n {...props}\n />\n );\n}\n\nexport { Table, TableHeader, TableBody, TableFooter, TableHead, TableRow, TableCell, TableCaption };\n","import { Loader2 } from \"lucide-react\";\nimport { TableCell, TableRow } from \"../ui/table\";\n\ninterface TableStatusRowsProps {\n colSpan: number;\n isLoading: boolean;\n hasData: boolean;\n isError: boolean;\n error: Error | null;\n emptyMessage: string;\n errorFallback: string;\n}\n\nexport function TableStatusRows({\n colSpan,\n isLoading,\n hasData,\n isError,\n error,\n emptyMessage,\n errorFallback,\n}: TableStatusRowsProps) {\n if (isLoading && !hasData) {\n return (\n <TableRow>\n <TableCell colSpan={colSpan} className=\"py-8 text-center\">\n <Loader2 className=\"text-muted-foreground mx-auto h-4 w-4 animate-spin\" />\n </TableCell>\n </TableRow>\n );\n }\n\n if (isError) {\n return (\n <TableRow>\n <TableCell colSpan={colSpan} className=\"text-destructive py-6 text-center text-sm\">\n {error?.message ?? errorFallback}\n </TableCell>\n </TableRow>\n );\n }\n\n if (!hasData) {\n return (\n <TableRow>\n <TableCell colSpan={colSpan} className=\"text-muted-foreground py-6 text-center text-sm\">\n {emptyMessage}\n </TableCell>\n </TableRow>\n );\n }\n\n return null;\n}\n","import { ChevronDown, ChevronRight, Radio } from \"lucide-react\";\nimport { Fragment, useState } from \"react\";\nimport type { EventLogRecord, TriggeredOutcome } from \"@durablex/react\";\nimport { formatRelative } from \"../lib/format\";\nimport { TABLE_HEAD_CLASS } from \"../lib/table\";\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from \"../ui/table\";\nimport { AppTag } from \"./AppTag\";\nimport { TableStatusRows } from \"./TableStatusRows\";\n\nconst EVENT_COLUMNS = 5;\n\ninterface EventsListProps {\n events?: EventLogRecord[];\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n onOpenRun?: (runId: string) => void;\n}\n\n// outcomeSummary describes what an event did: runs created, gated matches, and\n// resumed waiters. An event that matched nothing reads as a dash.\nfunction outcomeSummary(ev: EventLogRecord): string {\n const runs = ev.triggered.filter((t) => t.runId).length;\n const gated = ev.triggered.length - runs;\n const parts: string[] = [];\n if (runs > 0) parts.push(`${runs} run${runs === 1 ? \"\" : \"s\"}`);\n if (gated > 0) parts.push(`${gated} gated`);\n if (ev.woke > 0) parts.push(`woke ${ev.woke}`);\n return parts.length > 0 ? parts.join(\" · \") : \"-\";\n}\n\n// Flags are mutually exclusive per the engine's trigger().\nfunction outcomeLabel(t: TriggeredOutcome): string {\n if (t.runId) return \"ran\";\n if (t.deduped) return \"deduped\";\n if (t.debounced) return \"debounced\";\n if (t.batched) return \"batched\";\n if (t.dropped) return \"dropped\";\n if (t.skipped) return \"skipped\";\n return \"no run\";\n}\n\nfunction OutcomeBadge({ outcome }: { outcome: TriggeredOutcome }) {\n const ran = Boolean(outcome.runId);\n return (\n <span\n className={\n \"border px-1.5 py-0.5 font-mono text-[10px] \" +\n (ran\n ? \"border-emerald-500/40 text-emerald-600 dark:text-emerald-400\"\n : \"text-muted-foreground\")\n }\n >\n {outcomeLabel(outcome)}\n </span>\n );\n}\n\nfunction TriggeredRow({\n outcome,\n onOpenRun,\n}: {\n outcome: TriggeredOutcome;\n onOpenRun?: (runId: string) => void;\n}) {\n const runId = outcome.runId;\n return (\n <div className=\"flex items-center gap-2 py-0.5\">\n <OutcomeBadge outcome={outcome} />\n <span className=\"text-xs font-medium\">{outcome.workflow}</span>\n {outcome.app && <AppTag app={outcome.app} />}\n {runId &&\n (onOpenRun ? (\n <button\n type=\"button\"\n className=\"text-muted-foreground hover:text-foreground font-mono text-[11px] underline underline-offset-2\"\n onClick={() => onOpenRun(runId)}\n >\n {runId}\n </button>\n ) : (\n <span className=\"text-muted-foreground font-mono text-[11px]\">{runId}</span>\n ))}\n </div>\n );\n}\n\nexport function EventsList({ events, isLoading, isError, error, onOpenRun }: EventsListProps) {\n const [expanded, setExpanded] = useState<string | null>(null);\n const toggle = (id: string) => setExpanded((cur) => (cur === id ? null : id));\n\n return (\n <div className=\"rounded-md border\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead className={TABLE_HEAD_CLASS}>Received</TableHead>\n <TableHead className={TABLE_HEAD_CLASS}>Event</TableHead>\n <TableHead className={TABLE_HEAD_CLASS}>App</TableHead>\n <TableHead className={TABLE_HEAD_CLASS}>Source</TableHead>\n <TableHead className={TABLE_HEAD_CLASS}>Outcome</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n <TableStatusRows\n colSpan={EVENT_COLUMNS}\n isLoading={isLoading}\n hasData={(events?.length ?? 0) > 0}\n isError={isError}\n error={error}\n emptyMessage=\"No events yet. Fire one with POST /events or emit from a workflow.\"\n errorFallback=\"Failed to load events\"\n />\n {events?.map((ev) => {\n const open = expanded === ev.id;\n const Chevron = open ? ChevronDown : ChevronRight;\n return (\n <Fragment key={ev.id}>\n <TableRow className=\"cursor-pointer\" onClick={() => toggle(ev.id)}>\n <TableCell className=\"text-muted-foreground px-2 py-1.5 font-mono text-[11px] whitespace-nowrap\">\n {formatRelative(ev.receivedAt)}\n </TableCell>\n <TableCell className=\"px-2 py-1.5\">\n <div className=\"flex items-center gap-1.5\">\n <Chevron className=\"text-muted-foreground size-3.5 shrink-0\" />\n <Radio className=\"text-muted-foreground size-3.5 shrink-0 opacity-70\" />\n <span className=\"text-xs font-medium\">{ev.name}</span>\n </div>\n </TableCell>\n <TableCell className=\"px-2 py-1.5\">\n <AppTag app={ev.app} />\n </TableCell>\n <TableCell className=\"text-muted-foreground px-2 py-1.5 font-mono text-[11px]\">\n {ev.source}\n </TableCell>\n <TableCell className=\"text-muted-foreground px-2 py-1.5 font-mono text-[11px]\">\n {outcomeSummary(ev)}\n </TableCell>\n </TableRow>\n {open && (\n <TableRow>\n <TableCell colSpan={EVENT_COLUMNS} className=\"bg-muted/30 px-2 py-2\">\n {ev.triggered.length > 0 ? (\n <div className=\"flex flex-col gap-0.5 pl-6\">\n {ev.triggered.map((t) => (\n <TriggeredRow\n key={`${t.workflow}-${t.app ?? \"\"}`}\n outcome={t}\n onOpenRun={onOpenRun}\n />\n ))}\n </div>\n ) : (\n <span className=\"text-muted-foreground pl-6 font-mono text-[11px]\">\n {ev.woke > 0\n ? `Woke ${ev.woke} waiting run(s); no new run.`\n : \"Matched no workflow.\"}\n </span>\n )}\n </TableCell>\n </TableRow>\n )}\n </Fragment>\n );\n })}\n </TableBody>\n </Table>\n </div>\n );\n}\n","import type { SendEventResult, TriggeredOutcome } from \"@durablex/react\";\n\nfunction triggerStatus(o: TriggeredOutcome): string {\n if (o.dropped) return \"dropped\";\n if (o.deduped) return \"deduped\";\n if (o.debounced) return \"debounced\";\n if (o.batched) return \"batched\";\n if (o.skipped) return \"skipped\";\n return \"started\";\n}\n\nfunction TriggerRow({\n t,\n onOpenRun,\n}: {\n t: TriggeredOutcome;\n onOpenRun?: (runId: string) => void;\n}) {\n const status = triggerStatus(t);\n const runId = t.runId;\n return (\n <li className=\"flex items-center justify-between gap-2 font-mono\">\n <span className=\"truncate\">{t.workflow}</span>\n {runId && onOpenRun ? (\n <button\n type=\"button\"\n className=\"text-primary hover:underline\"\n onClick={() => onOpenRun(runId)}\n >\n {status}\n </button>\n ) : (\n <span className=\"text-muted-foreground\">{status}</span>\n )}\n </li>\n );\n}\n\nexport function TriggerEventResult({\n result,\n onOpenRun,\n}: {\n result: SendEventResult;\n onOpenRun?: (runId: string) => void;\n}) {\n const triggered = result.triggered ?? [];\n return (\n <div className=\"rounded-lg border border-border bg-muted/40 p-2.5 text-xs\">\n <div className=\"font-medium text-foreground\">\n Event accepted · woke {result.woke} {result.woke === 1 ? \"run\" : \"runs\"}\n </div>\n {triggered.length > 0 ? (\n <ul className=\"mt-1.5 flex flex-col gap-1\">\n {triggered.map((t, i) => (\n <TriggerRow key={`${t.workflow}-${i}`} t={t} onOpenRun={onOpenRun} />\n ))}\n </ul>\n ) : null}\n </div>\n );\n}\n","import { useMemo, useState, type ReactNode } from \"react\";\nimport { ZapIcon } from \"lucide-react\";\nimport {\n useTriggerEvent,\n useWorkflows,\n type SendEventResult,\n type WorkflowDef,\n} from \"@durablex/react\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from \"../ui/dialog\";\nimport { Button } from \"../ui/button\";\nimport { Input } from \"../ui/input\";\nimport { parseJson } from \"../lib/json-highlight\";\nimport { ALL_FILTER } from \"../lib/run-filters\";\nimport { AppFilter } from \"./filters/AppFilter\";\nimport { JsonEditor } from \"./JsonEditor\";\nimport { TriggerEventResult } from \"./TriggerEventResult\";\n\nexport function TriggerEventDialog({ onOpenRun }: { onOpenRun?: (runId: string) => void }) {\n const [open, setOpen] = useState(false);\n\n return (\n <Dialog open={open} onOpenChange={setOpen}>\n <DialogTrigger asChild>\n <Button size=\"sm\" variant=\"outline\">\n <ZapIcon /> Trigger event\n </Button>\n </DialogTrigger>\n <DialogContent className=\"sm:max-w-md\">\n {open && <TriggerForm onClose={() => setOpen(false)} onOpenRun={onOpenRun} />}\n </DialogContent>\n </Dialog>\n );\n}\n\n// Concrete (non-wildcard) event names a workflow can be triggered by, for the\n// event-name autocomplete - a workflow with no triggers fires on its own name.\nfunction knownEventNames(workflows: WorkflowDef[] | undefined): string[] {\n const names = new Set<string>();\n for (const w of workflows ?? []) {\n const triggers = w.triggers ?? [];\n if (triggers.length === 0) names.add(w.name);\n for (const t of triggers) {\n if (t.event && !t.event.endsWith(\"*\")) names.add(t.event);\n }\n }\n return [...names].sort();\n}\n\nfunction TriggerForm({\n onClose,\n onOpenRun,\n}: {\n onClose: () => void;\n onOpenRun?: (runId: string) => void;\n}) {\n const { data: workflows } = useWorkflows();\n const eventNames = useMemo(() => knownEventNames(workflows), [workflows]);\n\n const [name, setName] = useState(\"\");\n const [app, setApp] = useState<string>(ALL_FILTER);\n const [payload, setPayload] = useState(\"{}\");\n const [result, setResult] = useState<SendEventResult | null>(null);\n const fire = useTriggerEvent();\n\n const parsed = useMemo(() => parseJson(payload), [payload]);\n const canSubmit = name.trim() !== \"\" && parsed.ok && !fire.isPending;\n\n function submit() {\n if (!parsed.ok) return;\n fire.mutate(\n { name: name.trim(), app: app === ALL_FILTER ? undefined : app, data: parsed.value },\n { onSuccess: setResult },\n );\n }\n\n return (\n <>\n <DialogHeader>\n <DialogTitle>Trigger event</DialogTitle>\n <DialogDescription>\n Fire an event into the engine. Every workflow whose trigger matches the name runs.\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"flex flex-col gap-3\">\n <Field label=\"Event name\" htmlFor=\"trigger-name\">\n <Input\n id=\"trigger-name\"\n list=\"trigger-event-names\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"order.placed\"\n autoFocus\n />\n <datalist id=\"trigger-event-names\">\n {eventNames.map((n) => (\n <option key={n} value={n} />\n ))}\n </datalist>\n </Field>\n\n <div className=\"flex flex-col gap-1.5\">\n <span className=\"text-xs font-medium\">App</span>\n <div>\n <AppFilter app={app} onApp={setApp} />\n </div>\n <span className=\"text-muted-foreground text-[11px]\">\n \"All apps\" fires the event namespace-wide.\n </span>\n </div>\n\n <Field label=\"Payload\" htmlFor=\"trigger-payload\" hint=\"JSON\">\n <JsonEditor\n value={payload}\n onChange={setPayload}\n invalid={!parsed.ok}\n ariaLabel=\"Event payload\"\n />\n {!parsed.ok ? <span className=\"text-xs text-destructive\">{parsed.error}</span> : null}\n </Field>\n\n {result ? (\n <TriggerEventResult\n result={result}\n onOpenRun={\n onOpenRun\n ? (id) => {\n onClose();\n onOpenRun(id);\n }\n : undefined\n }\n />\n ) : null}\n {fire.isError ? (\n <span className=\"text-xs text-destructive\">\n Could not fire event:{\" \"}\n {fire.error instanceof Error ? fire.error.message : \"unknown error\"}\n </span>\n ) : null}\n </div>\n\n <DialogFooter showCloseButton>\n <Button disabled={!canSubmit} onClick={submit}>\n {fire.isPending ? \"Firing...\" : \"Fire event\"}\n </Button>\n </DialogFooter>\n </>\n );\n}\n\nfunction Field({\n label,\n htmlFor,\n hint,\n children,\n}: {\n label: string;\n htmlFor: string;\n hint?: string;\n children: ReactNode;\n}) {\n return (\n <div className=\"flex flex-col gap-1.5\">\n <label htmlFor={htmlFor} className=\"flex items-center gap-1.5 text-xs font-medium\">\n {label}\n {hint ? <span className=\"font-normal text-muted-foreground\">{hint}</span> : null}\n </label>\n {children}\n </div>\n );\n}\n","import { useEvents } from \"@durablex/react\";\nimport { EventsList } from \"./EventsList\";\nimport { TriggerEventDialog } from \"./TriggerEventDialog\";\n\nexport function EventsView({ onOpenRun }: { onOpenRun?: (runId: string) => void }) {\n const { data: events, isLoading, isError, error } = useEvents();\n return (\n <div className=\"flex min-h-0 flex-1 flex-col gap-3 overflow-y-auto p-4\">\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"text-muted-foreground font-mono text-[11px]\">\n {events?.length ?? 0} events · live\n </span>\n <TriggerEventDialog onOpenRun={onOpenRun} />\n </div>\n <EventsList\n events={events}\n isLoading={isLoading}\n isError={isError}\n error={error}\n onOpenRun={onOpenRun}\n />\n </div>\n );\n}\n","import type { WorkflowDef } from \"@durablex/react\";\n\n// A single event a workflow can be run from. `value` is what to pre-fill into the\n// event-name field: a wildcard pattern has its trailing \"*\" stripped so the user\n// completes a concrete name. `filter` is the trigger's CEL `if`, surfaced as a hint.\nexport interface EventRunOption {\n value: string;\n pattern: string;\n isWildcard: boolean;\n filter?: string;\n}\n\n// A cron-only workflow has no event to fire and no manual fire-now endpoint, so it\n// is not runnable from the dashboard yet (Phase 4). A workflow with no triggers at\n// all runs on an event matching its own name.\nexport interface WorkflowRunPlan {\n runnable: boolean;\n options: EventRunOption[];\n}\n\nexport function workflowRunPlan(workflow: WorkflowDef): WorkflowRunPlan {\n const triggers = workflow.triggers ?? [];\n\n if (triggers.length === 0) {\n return {\n runnable: true,\n options: [{ value: workflow.name, pattern: workflow.name, isWildcard: false }],\n };\n }\n\n const options = triggers.flatMap<EventRunOption>((t) => {\n if (!t.event) return [];\n const isWildcard = t.event.endsWith(\"*\");\n return [\n {\n value: isWildcard ? t.event.slice(0, -1) : t.event,\n pattern: t.event,\n isWildcard,\n filter: t.if,\n },\n ];\n });\n\n return { runnable: options.length > 0, options };\n}\n","import { useMemo, useState, type ReactNode } from \"react\";\nimport { useTriggerEvent, type SendEventResult, type WorkflowDef } from \"@durablex/react\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"../ui/dialog\";\nimport { Button } from \"../ui/button\";\nimport { Input } from \"../ui/input\";\nimport { parseJson } from \"../lib/json-highlight\";\nimport { workflowRunPlan, type EventRunOption } from \"../lib/workflow-run\";\nimport { AppTag } from \"./AppTag\";\nimport { JsonEditor } from \"./JsonEditor\";\nimport { TriggerEventResult } from \"./TriggerEventResult\";\n\nexport function WorkflowRunDialog({\n workflow,\n open,\n onOpenChange,\n onOpenRun,\n}: {\n workflow: WorkflowDef;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onOpenRun: (runId: string) => void;\n}) {\n // A cron-only workflow has no fireable trigger, so RunForm (which reads options[0]) is\n // only mounted when there is at least one option. WorkflowRunAction already gates on this.\n const runnable = workflowRunPlan(workflow).options.length > 0;\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-md\">\n {open && runnable && (\n <RunForm\n key={workflow.name}\n workflow={workflow}\n onClose={() => onOpenChange(false)}\n onOpenRun={onOpenRun}\n />\n )}\n </DialogContent>\n </Dialog>\n );\n}\n\nfunction RunForm({\n workflow,\n onClose,\n onOpenRun,\n}: {\n workflow: WorkflowDef;\n onClose: () => void;\n onOpenRun: (runId: string) => void;\n}) {\n const { options } = workflowRunPlan(workflow);\n const [selected, setSelected] = useState(0);\n // RunForm is only mounted when options is non-empty; the fallback keeps the type total.\n const option: EventRunOption = options[selected] ??\n options[0] ?? { value: \"\", pattern: \"\", isWildcard: false };\n\n const [eventName, setEventName] = useState(option.value);\n const [payload, setPayload] = useState(\"{}\");\n const [result, setResult] = useState<SendEventResult | null>(null);\n const fire = useTriggerEvent();\n\n const parsed = useMemo(() => parseJson(payload), [payload]);\n const canSubmit = eventName.trim() !== \"\" && parsed.ok && !fire.isPending;\n\n function pick(index: number) {\n const opt = options[index];\n if (!opt) return;\n setSelected(index);\n setEventName(opt.value);\n }\n\n function submit() {\n if (!parsed.ok) return;\n fire.mutate(\n { name: eventName.trim(), app: workflow.app, data: parsed.value },\n { onSuccess: setResult },\n );\n }\n\n return (\n <>\n <DialogHeader>\n <DialogTitle>Run {workflow.name}</DialogTitle>\n <DialogDescription>\n Fires this workflow's triggering event. Any other workflow whose trigger matches the event\n also runs.\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex flex-col gap-2 rounded-lg border border-border bg-muted/30 p-2.5 text-xs\">\n {options.length > 1 && (\n <Row label=\"Trigger\">\n <div className=\"flex flex-wrap gap-1.5\">\n {options.map((o, i) => (\n <button\n key={o.pattern}\n type=\"button\"\n className=\"chip focusable font-mono\"\n data-on={i === selected ? \"1\" : \"0\"}\n aria-pressed={i === selected}\n onClick={() => pick(i)}\n >\n {o.pattern}\n </button>\n ))}\n </div>\n </Row>\n )}\n\n <Row label=\"Event\">\n {option.isWildcard ? (\n <Input\n value={eventName}\n onChange={(e) => setEventName(e.target.value)}\n aria-label=\"Event name\"\n className=\"h-7\"\n autoFocus\n />\n ) : (\n <span className=\"font-mono\">{option.pattern}</span>\n )}\n </Row>\n\n <Row label=\"App\">\n <AppTag app={workflow.app} />\n </Row>\n\n {option.isWildcard && (\n <p className=\"text-muted-foreground\">\n <code className=\"font-mono\">{option.pattern}</code> is a wildcard - complete the event\n name above.\n </p>\n )}\n {option.filter && (\n <p className=\"text-muted-foreground\">\n Only runs when: <code className=\"font-mono\">{option.filter}</code>\n </p>\n )}\n </div>\n\n <div className=\"flex flex-col gap-1.5\">\n <span className=\"text-xs font-medium\">Payload</span>\n <JsonEditor value={payload} onChange={setPayload} invalid={!parsed.ok} />\n {!parsed.ok ? <span className=\"text-xs text-destructive\">{parsed.error}</span> : null}\n </div>\n\n {result ? (\n <TriggerEventResult\n result={result}\n onOpenRun={(id) => {\n onClose();\n onOpenRun(id);\n }}\n />\n ) : null}\n {fire.isError ? (\n <span className=\"text-xs text-destructive\">\n Could not run: {fire.error instanceof Error ? fire.error.message : \"unknown error\"}\n </span>\n ) : null}\n </div>\n\n <DialogFooter showCloseButton>\n <Button disabled={!canSubmit} onClick={submit}>\n {fire.isPending ? \"Running...\" : \"Run\"}\n </Button>\n </DialogFooter>\n </>\n );\n}\n\nfunction Row({ label, children }: { label: string; children: ReactNode }) {\n return (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-muted-foreground w-12 shrink-0\">{label}</span>\n {children}\n </div>\n );\n}\n","import { useState } from \"react\";\nimport { Play } from \"lucide-react\";\nimport type { WorkflowDef } from \"@durablex/react\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../ui/tooltip\";\nimport { workflowRunPlan } from \"../lib/workflow-run\";\nimport { WorkflowRunDialog } from \"./WorkflowRunDialog\";\n\nexport function WorkflowRunAction({\n workflow,\n onOpenRun,\n}: {\n workflow: WorkflowDef;\n onOpenRun(runId: string): void;\n}) {\n const [open, setOpen] = useState(false);\n\n if (!workflowRunPlan(workflow).runnable) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"btn\" aria-disabled>\n <Play /> Run\n </span>\n </TooltipTrigger>\n <TooltipContent>\n This workflow only runs on a schedule, so there is no event to fire. Manual fire-now lands\n in a later release.\n </TooltipContent>\n </Tooltip>\n );\n }\n\n return (\n <>\n <button type=\"button\" className=\"btn focusable\" onClick={() => setOpen(true)}>\n <Play /> Run\n </button>\n <WorkflowRunDialog\n workflow={workflow}\n open={open}\n onOpenChange={setOpen}\n onOpenRun={onOpenRun}\n />\n </>\n );\n}\n","import type {\n WebhookDelivery,\n WebhookEndpoint,\n WebhookEndpointStats,\n WebhookReceiver,\n} from \"@durablex/react\";\n\n// WEBHOOK_TABS are the three sub-views of the Webhooks page, mirrored into the URL so a\n// tab (and a selected delivery) is shareable like the Runs view.\nexport const WEBHOOK_TABS = [\"deliveries\", \"endpoints\", \"receivers\"] as const;\nexport type WebhookTab = (typeof WEBHOOK_TABS)[number];\n\n// DeliveryView collapses the engine's six delivery statuses into the four the dashboard\n// shows. failed (awaiting a retry) and delivering both read as \"retrying\"; a pending row\n// is \"queued\" until its first attempt; exhausted/dead are terminal \"failed\".\nexport const DELIVERY_VIEWS = [\"delivered\", \"retrying\", \"failed\", \"queued\"] as const;\nexport type DeliveryView = (typeof DELIVERY_VIEWS)[number];\n\nexport function deliveryView(d: Pick<WebhookDelivery, \"status\" | \"attemptCount\">): DeliveryView {\n switch (d.status) {\n case \"succeeded\":\n return \"delivered\";\n case \"exhausted\":\n case \"dead\":\n return \"failed\";\n case \"delivering\":\n case \"failed\":\n return \"retrying\";\n default:\n return d.attemptCount > 0 ? \"retrying\" : \"queued\";\n }\n}\n\nexport const DELIVERY_VIEW_TOKEN: Record<DeliveryView, string> = {\n delivered: \"succeeded\",\n retrying: \"running\",\n failed: \"failed\",\n queued: \"queued\",\n};\n\nexport const DELIVERY_VIEW_LABEL: Record<DeliveryView, string> = {\n delivered: \"Delivered\",\n retrying: \"Retrying\",\n failed: \"Failed\",\n queued: \"Queued\",\n};\n\nexport type EndpointHealth = \"active\" | \"failing\" | \"disabled\";\n\nexport function endpointHealth(\n endpoint: WebhookEndpoint,\n recent: WebhookDelivery[],\n): EndpointHealth {\n if (!endpoint.enabled) return \"disabled\";\n const latest = recent[0];\n if (latest && deliveryView(latest) === \"failed\") return \"failing\";\n return \"active\";\n}\n\nexport const shortUrl = (u: string) => u.replace(/^https?:\\/\\//, \"\");\n\nexport const displayName = (name: string | undefined, fallback: string) =>\n name && name.trim() ? name : fallback;\n\nexport const endpointLabel = (e: WebhookEndpoint) => displayName(e.name, shortUrl(e.url));\nexport const receiverLabel = (r: WebhookReceiver) => displayName(r.name, r.slug);\n\nexport const DELIVERY_LIST_LIMIT = 200;\n\nexport function groupDeliveriesByEndpoint(\n deliveries: WebhookDelivery[],\n): Map<string, WebhookDelivery[]> {\n const m = new Map<string, WebhookDelivery[]>();\n for (const d of deliveries) {\n if (!d.endpointId) continue;\n const list = m.get(d.endpointId);\n if (list) list.push(d);\n else m.set(d.endpointId, [d]);\n }\n return m;\n}\n\nexport function codePillClass(code: number | undefined): string {\n if (code == null || code === 0) return \"none\";\n if (code < 300) return \"ok\";\n if (code < 500) return \"warn\";\n return \"err\";\n}\n\n// successRate is computed over settled deliveries only (succeeded vs terminal-failed).\n// stats.delivered counts every row in the window including in-flight ones, so dividing by\n// it would understate the rate while retries are outstanding. null when nothing has settled.\nexport function successRate(stats?: WebhookEndpointStats): number | null {\n if (!stats) return null;\n const settled = stats.succeeded + stats.failed;\n if (settled === 0) return null;\n return Math.round((stats.succeeded / settled) * 100);\n}\n\n// endpointMeta resolves the display label and failing-state for a delivery. Custom\n// deliveries (ctx.webhook.send) carry no endpointId, so fall back to the delivery URL.\nexport function endpointMeta(\n d: WebhookDelivery,\n endpoints: WebhookEndpoint[],\n byEndpoint: Map<string, WebhookDelivery[]>,\n): { label: string; failing: boolean } {\n const ep = d.endpointId ? endpoints.find((e) => e.id === d.endpointId) : undefined;\n if (!ep) return { label: shortUrl(d.url), failing: false };\n return {\n label: endpointLabel(ep),\n failing: endpointHealth(ep, byEndpoint.get(ep.id) ?? []) === \"failing\",\n };\n}\n","import { cn } from \"../lib/utils\";\nimport {\n codePillClass,\n DELIVERY_VIEW_LABEL,\n DELIVERY_VIEW_TOKEN,\n type DeliveryView,\n type EndpointHealth,\n} from \"../lib/webhook-view\";\nimport { ResumeMark } from \"./ResumeMark\";\n\nfunction StatusPill({\n token,\n label,\n small,\n live,\n}: {\n token: string;\n label: string;\n small?: boolean;\n live?: boolean;\n}) {\n return (\n <span\n className={cn(\n \"inline-flex items-center gap-1.5 border border-transparent font-medium leading-none whitespace-nowrap\",\n small ? \"h-[17px] px-1.5 text-[10px]\" : \"h-[19px] px-1.5 text-[11px]\",\n )}\n style={{ backgroundColor: `var(--st-${token}-bg)`, color: `var(--st-${token}-fg)` }}\n >\n {live ? <ResumeMark size={small ? 12 : 13} variant=\"run\" /> : <i className=\"bdot\" />}\n {label}\n </span>\n );\n}\n\nexport function DeliveryBadge({ view, small }: { view: DeliveryView; small?: boolean }) {\n return (\n <StatusPill\n token={DELIVERY_VIEW_TOKEN[view]}\n label={DELIVERY_VIEW_LABEL[view]}\n small={small}\n live={view === \"retrying\"}\n />\n );\n}\n\nconst HEALTH_TOKEN: Record<EndpointHealth, string> = {\n active: \"succeeded\",\n failing: \"failed\",\n disabled: \"cancelled\",\n};\nconst HEALTH_LABEL: Record<EndpointHealth, string> = {\n active: \"Active\",\n failing: \"Failing\",\n disabled: \"Disabled\",\n};\n\nexport function EndpointBadge({ health, small }: { health: EndpointHealth; small?: boolean }) {\n return <StatusPill token={HEALTH_TOKEN[health]} label={HEALTH_LABEL[health]} small={small} />;\n}\n\nexport function CodePill({ code }: { code?: number }) {\n const k = codePillClass(code);\n return <span className={`wh-code ${k}`}>{k === \"none\" ? \"-\" : code}</span>;\n}\n\nexport function EventChip({ name }: { name: string }) {\n return <span className=\"wh-evchip\">{name === \"*\" ? \"all events\" : name}</span>;\n}\n","import type { DeliveryStatus } from \"@durablex/react\";\nimport { cn } from \"../lib/utils\";\n\n// failed = awaiting retry, exhausted = retries spent, dead = a non-retryable response.\nconst STATUS_CLASS: Record<DeliveryStatus, string> = {\n pending: \"text-muted-foreground border-border\",\n delivering: \"border-sky-500/40 text-sky-600 dark:text-sky-400\",\n succeeded: \"border-emerald-500/40 text-emerald-600 dark:text-emerald-400\",\n failed: \"border-amber-500/40 text-amber-600 dark:text-amber-400\",\n exhausted: \"border-red-500/40 text-red-600 dark:text-red-400\",\n dead: \"border-red-500/40 text-red-600 dark:text-red-400\",\n};\n\nexport function WebhookStatusBadge({ status }: { status: DeliveryStatus }) {\n return (\n <span\n className={cn(\n \"inline-flex border px-1.5 py-0.5 font-mono text-[10px] leading-none\",\n STATUS_CLASS[status],\n )}\n >\n {status}\n </span>\n );\n}\n","import { Loader2, RotateCw, X } from \"lucide-react\";\nimport { toast } from \"sonner\";\nimport type { AttemptOutcome, WebhookDeliveryAttempt } from \"@durablex/react\";\nimport { useConfirmAction } from \"../hooks/use-confirm-action\";\nimport { useDelivery, useRedeliverDelivery } from \"@durablex/react\";\nimport { formatDuration, formatNextFire, formatTime } from \"../lib/format\";\nimport { JsonBlock } from \"./JsonBlock\";\nimport { Meta } from \"./Meta\";\nimport { WebhookStatusBadge } from \"./WebhookStatusBadge\";\n\nconst OUTCOME_CLASS: Record<AttemptOutcome, string> = {\n succeeded: \"text-emerald-600 dark:text-emerald-400\",\n http_error: \"text-amber-600 dark:text-amber-400\",\n timeout: \"text-amber-600 dark:text-amber-400\",\n connection_error: \"text-red-600 dark:text-red-400\",\n skipped: \"text-muted-foreground\",\n};\n\nfunction AttemptRow({ a }: { a: WebhookDeliveryAttempt }) {\n return (\n <div className=\"border-border flex flex-col gap-1 border-b px-3 py-2 last:border-b-0\">\n <div className=\"flex items-center gap-2 text-[11px]\">\n <span className=\"text-muted-foreground font-mono\">#{a.attempt}</span>\n <span className={\"font-mono \" + (OUTCOME_CLASS[a.outcome] ?? \"text-foreground\")}>\n {a.outcome}\n </span>\n {a.statusCode != null && a.statusCode > 0 && (\n <span className=\"font-mono tabular-nums\">HTTP {a.statusCode}</span>\n )}\n <span className=\"text-muted-foreground ml-auto font-mono\">\n {formatDuration(a.durationMs)}\n </span>\n <span className=\"text-muted-foreground font-mono\">{formatTime(a.createdAt)}</span>\n </div>\n {a.error && (\n <div className=\"text-red-600 dark:text-red-400 font-mono text-[11px] break-words\">\n {a.error}\n </div>\n )}\n {a.responseSnippet && (\n <div className=\"text-muted-foreground bg-muted/40 max-h-24 overflow-y-auto px-2 py-1 font-mono text-[11px] break-words whitespace-pre-wrap\">\n {a.responseSnippet}\n </div>\n )}\n </div>\n );\n}\n\nexport function DeliveryDetail({\n deliveryId,\n onClose,\n onOpenRun,\n embedded,\n}: {\n deliveryId: string;\n onClose?: () => void;\n onOpenRun?: (runId: string) => void;\n embedded?: boolean;\n}) {\n const { data, isLoading, isError, error } = useDelivery(deliveryId);\n\n if (isLoading) {\n return (\n <div className=\"run-panel\">\n <div className=\"steps-loading\">\n <Loader2 className=\"size-4 animate-spin\" />\n </div>\n </div>\n );\n }\n if (isError || !data) {\n return (\n <div className=\"run-panel\">\n <div className=\"fi-empty\">\n {error instanceof Error ? error.message : \"Delivery not found.\"}\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"run-panel\">\n <div className=\"panel-head\">\n <div className=\"ph-top\">\n <h2>\n <WebhookStatusBadge status={data.status} />\n <span className=\"h2-name font-mono text-[13px]\">{data.eventKind}</span>\n </h2>\n <div className=\"ph-actions\">\n {data.status !== \"pending\" && data.status !== \"delivering\" && (\n <RedeliverButton id={data.id} />\n )}\n {!embedded && (\n <button\n type=\"button\"\n className=\"iconbtn focusable\"\n aria-label=\"Close\"\n onClick={onClose}\n >\n <X className=\"size-3.5\" />\n </button>\n )}\n </div>\n </div>\n <div className=\"ph-status\">\n <span className=\"runid\" title={data.url}>\n <span className=\"runid-text\">{data.url}</span>\n </span>\n </div>\n </div>\n\n <div className=\"min-h-0 flex-1 overflow-y-auto\">\n <div className=\"metagrid\">\n <Meta label=\"App\" value={data.app || \"-\"} />\n <Meta label=\"Attempts\" value={`${data.attemptCount}/${data.maxAttempts}`} />\n {data.sourceRunId != null && (\n <SourceRunMeta runId={data.sourceRunId} onOpenRun={onOpenRun} />\n )}\n {data.endpointId && <Meta label=\"Endpoint\" value={data.endpointId} />}\n {data.nextAttemptAt && (\n <Meta label=\"Next attempt\" value={formatNextFire(data.nextAttemptAt)} />\n )}\n <Meta label=\"Created\" value={formatTime(data.createdAt)} />\n </div>\n\n <div className=\"section\">\n <div className=\"text-muted-foreground border-border border-b px-3 py-1.5 text-[10px] tracking-wider uppercase\">\n Attempts ({data.attempts.length})\n </div>\n {data.attempts.length === 0 ? (\n <div className=\"text-muted-foreground px-3 py-3 text-[11px]\">\n No attempts yet; awaiting the sweeper.\n </div>\n ) : (\n data.attempts.map((a) => <AttemptRow key={a.id} a={a} />)\n )}\n </div>\n\n {data.payload != null && (\n <div className=\"section\">\n <div className=\"text-muted-foreground border-border border-b px-3 py-1.5 text-[10px] tracking-wider uppercase\">\n Payload\n </div>\n <div className=\"px-3 py-2\">\n <JsonBlock value={data.payload} />\n </div>\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction RedeliverButton({ id }: { id: string }) {\n const redeliver = useRedeliverDelivery();\n const { confirming, trigger } = useConfirmAction(() =>\n redeliver.mutate(id, {\n onSuccess: () => toast.success(\"Delivery re-queued\"),\n onError: (e: Error) => toast.error(`Could not redeliver: ${e.message}`),\n }),\n );\n return (\n <button\n type=\"button\"\n className=\"btn focusable\"\n disabled={redeliver.isPending}\n onClick={trigger}\n >\n {redeliver.isPending ? (\n <Loader2 className=\"size-3 animate-spin\" />\n ) : (\n <RotateCw className=\"size-3\" />\n )}\n {confirming ? \"Confirm redeliver\" : \"Redeliver\"}\n </button>\n );\n}\n\nfunction SourceRunMeta({ runId, onOpenRun }: { runId: string; onOpenRun?: (id: string) => void }) {\n return (\n <Meta\n label=\"Source run\"\n value={runId}\n onClick={onOpenRun ? () => onOpenRun(runId) : undefined}\n title={`Open run ${runId}`}\n />\n );\n}\n","import { Inbox, RotateCw, Search, Send, X } from \"lucide-react\";\nimport { useMemo, useState } from \"react\";\nimport type { WebhookDelivery } from \"@durablex/react\";\nimport { useDeliveries, useEndpoints } from \"@durablex/react\";\nimport { formatRelative } from \"../lib/format\";\nimport {\n DELIVERY_LIST_LIMIT,\n type DeliveryView,\n deliveryView,\n endpointMeta,\n groupDeliveriesByEndpoint,\n shortUrl,\n} from \"../lib/webhook-view\";\nimport { CodePill, DeliveryBadge } from \"./WebhookBadges\";\nimport { DeliveryDetail } from \"./DeliveryDetail\";\n\nconst SPLIT_FILTERS: [DeliveryView | \"all\", string][] = [\n [\"all\", \"All\"],\n [\"delivered\", \"Delivered\"],\n [\"retrying\", \"Retrying\"],\n [\"failed\", \"Failed\"],\n [\"queued\", \"Queued\"],\n];\n\nfunction DeliveryListItem({\n d,\n label,\n failing,\n selected,\n onClick,\n}: {\n d: WebhookDelivery;\n label: string;\n failing: boolean;\n selected: boolean;\n onClick(): void;\n}) {\n const view = deliveryView(d);\n return (\n <button\n type=\"button\"\n className=\"whs-item\"\n data-selected={selected ? \"1\" : \"0\"}\n onClick={onClick}\n >\n <span className=\"whs-accent\" />\n <div className=\"whs-item-main\">\n <div className=\"whs-item-top\">\n <span className=\"whs-ev\">{d.eventKind}</span>\n <span className=\"whs-time\">{formatRelative(d.createdAt)}</span>\n </div>\n <div className=\"whs-item-bot\">\n <DeliveryBadge view={view} small />\n <span className=\"whs-ep\">\n <i\n className=\"sq\"\n style={{ background: failing ? \"var(--st-failed-fg)\" : \"var(--primary)\" }}\n />\n {label}\n </span>\n {d.attemptCount > 1 && (\n <span\n className={\n \"whs-att-tag\" + (view === \"failed\" ? \" err\" : view === \"retrying\" ? \" warn\" : \"\")\n }\n >\n <RotateCw />\n {d.attemptCount}/{d.maxAttempts}\n </span>\n )}\n <CodePill code={d.lastStatusCode} />\n </div>\n </div>\n </button>\n );\n}\n\nexport function DeliveriesSplit({ onOpenRun }: { onOpenRun?: (runId: string) => void }) {\n const { data } = useDeliveries({ limit: DELIVERY_LIST_LIMIT });\n const endpointsData = useEndpoints().data;\n const endpoints = useMemo(() => endpointsData ?? [], [endpointsData]);\n const all = useMemo(() => data?.deliveries ?? [], [data]);\n const [view, setView] = useState<DeliveryView | \"all\">(\"all\");\n const [query, setQuery] = useState(\"\");\n\n const byEndpoint = useMemo(() => groupDeliveriesByEndpoint(all), [all]);\n\n const rows = useMemo(() => {\n let r = all;\n if (view !== \"all\") r = r.filter((d) => deliveryView(d) === view);\n const q = query.trim().toLowerCase();\n if (q) {\n r = r.filter((d) => {\n const { label } = endpointMeta(d, endpoints, byEndpoint);\n return (\n d.eventKind.toLowerCase().includes(q) ||\n d.id.toLowerCase().includes(q) ||\n shortUrl(d.url).toLowerCase().includes(q) ||\n label.toLowerCase().includes(q)\n );\n });\n }\n return r;\n }, [all, endpoints, byEndpoint, view, query]);\n\n const [selId, setSelId] = useState<string | null>(null);\n const sel = rows.find((d) => d.id === selId) ?? rows[0] ?? null;\n\n return (\n <div className=\"whs\">\n <div className=\"whs-list\">\n <div className=\"whs-toolbar\">\n <div className=\"fb-search-field whs-search2\">\n <Search />\n <input\n placeholder=\"Search deliveries…\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Escape\") setQuery(\"\");\n }}\n />\n {query && (\n <span className=\"x\" onClick={() => setQuery(\"\")} title=\"Clear\">\n <X style={{ width: 12, height: 12 }} />\n </span>\n )}\n </div>\n <div className=\"whs-chips\">\n {SPLIT_FILTERS.map(([k, label]) => (\n <button\n key={k}\n type=\"button\"\n className=\"chip\"\n data-on={view === k ? \"1\" : \"0\"}\n onClick={() => setView(k)}\n >\n {label}\n </button>\n ))}\n </div>\n <div className=\"whs-count\">\n {rows.length === all.length\n ? `${all.length} deliveries`\n : `${rows.length} of ${all.length} deliveries`}\n </div>\n </div>\n <div className=\"whs-scroll\">\n {rows.length ? (\n rows.map((d) => {\n const { label, failing } = endpointMeta(d, endpoints, byEndpoint);\n return (\n <DeliveryListItem\n key={d.id}\n d={d}\n label={label}\n failing={failing}\n selected={sel?.id === d.id}\n onClick={() => setSelId(d.id)}\n />\n );\n })\n ) : (\n <div className=\"whs-empty\">\n <Inbox className=\"ico\" />\n <span>No deliveries match.</span>\n </div>\n )}\n </div>\n </div>\n\n <div className=\"whs-detail\">\n {sel ? (\n <DeliveryDetail key={sel.id} deliveryId={sel.id} embedded onOpenRun={onOpenRun} />\n ) : (\n <div className=\"panel-empty\">\n <div>\n <Send className=\"mx-auto mb-2.5 size-6 opacity-60\" />\n <div className=\"text-foreground mb-1 font-semibold\">No delivery selected</div>\n <div>Pick a delivery from the list to inspect its payload and attempts.</div>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\n\nexport function FormField({ label, children }: { label: string; children: ReactNode }) {\n return (\n <label className=\"flex flex-col gap-1\">\n <span className=\"text-muted-foreground text-[11px] tracking-wide uppercase\">{label}</span>\n {children}\n </label>\n );\n}\n","import { Check, Copy, TriangleAlert } from \"lucide-react\";\nimport { Button } from \"../ui/button\";\nimport { DialogFooter, DialogHeader, DialogTitle } from \"../ui/dialog\";\nimport { useCopyToClipboard } from \"../hooks/use-copy\";\n\nexport function SecretReveal({ secret, onDone }: { secret: string; onDone: () => void }) {\n const { copied, copy } = useCopyToClipboard();\n\n return (\n <>\n <DialogHeader>\n <DialogTitle>Signing secret</DialogTitle>\n </DialogHeader>\n <div className=\"flex flex-col gap-3 py-1\">\n <div className=\"text-muted-foreground flex items-start gap-2 text-xs\">\n <TriangleAlert\n className=\"mt-0.5 size-3.5 shrink-0\"\n style={{ color: \"var(--st-waiting-fg)\" }}\n />\n <span>Copy this secret now. It is stored encrypted and cannot be shown again.</span>\n </div>\n <div className=\"bg-muted flex items-center gap-2 border px-2.5 py-2\">\n <code className=\"flex-1 truncate font-mono text-xs\">{secret}</code>\n <button\n type=\"button\"\n className=\"iconbtn focusable\"\n aria-label=\"Copy secret\"\n onClick={() => copy(secret)}\n >\n {copied ? (\n <Check className=\"size-3.5\" style={{ color: \"var(--st-succeeded-fg)\" }} />\n ) : (\n <Copy className=\"size-3.5\" />\n )}\n </button>\n </div>\n </div>\n <DialogFooter>\n <Button size=\"sm\" onClick={onDone}>\n Done\n </Button>\n </DialogFooter>\n </>\n );\n}\n","import { useState } from \"react\";\nimport { toast } from \"sonner\";\nimport {\n type EndpointInput,\n type EndpointPatch,\n SUBSCRIBABLE_EVENT_KINDS,\n type SubscribableEventKind,\n type WebhookEndpoint,\n} from \"@durablex/react\";\nimport { Button } from \"../ui/button\";\nimport { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from \"../ui/dialog\";\nimport { Input } from \"../ui/input\";\nimport { useCreateEndpoint, useUpdateEndpoint } from \"@durablex/react\";\nimport { FormField } from \"./FormField\";\nimport { SecretReveal } from \"./SecretReveal\";\nexport function EndpointFormDialog({\n open,\n onOpenChange,\n endpoint,\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n endpoint?: WebhookEndpoint;\n}) {\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-md\">\n {open && <EndpointForm endpoint={endpoint} onClose={() => onOpenChange(false)} />}\n </DialogContent>\n </Dialog>\n );\n}\n\nfunction EndpointForm({ endpoint, onClose }: { endpoint?: WebhookEndpoint; onClose: () => void }) {\n const editing = endpoint != null;\n const [name, setName] = useState(endpoint?.name ?? \"\");\n const [url, setUrl] = useState(endpoint?.url ?? \"\");\n const [app, setApp] = useState(endpoint?.app ?? \"\");\n const [kinds, setKinds] = useState<Set<SubscribableEventKind>>(\n () => new Set((endpoint?.eventKinds ?? []).filter(isSubscribable)),\n );\n const [rotate, setRotate] = useState(false);\n const [secret, setSecret] = useState<string | null>(null);\n\n const create = useCreateEndpoint();\n const update = useUpdateEndpoint();\n const pending = create.isPending || update.isPending;\n const canSubmit = url.trim() !== \"\" && kinds.size > 0 && !pending;\n\n function toggleKind(k: SubscribableEventKind) {\n setKinds((prev) => {\n const next = new Set(prev);\n if (next.has(k)) next.delete(k);\n else next.add(k);\n return next;\n });\n }\n\n function submit() {\n if (!canSubmit) return;\n const eventKinds = [...kinds];\n if (editing) {\n const patch: EndpointPatch = {\n name: name.trim(),\n url: url.trim(),\n app: app.trim(),\n eventKinds,\n rotateSecret: rotate,\n };\n update.mutate(\n { id: endpoint.id, patch },\n {\n onSuccess: (res) => {\n if (res.secret) setSecret(res.secret);\n else onClose();\n },\n onError: (e: Error) => toast.error(`Could not save endpoint: ${e.message}`),\n },\n );\n return;\n }\n const input: EndpointInput = {\n name: name.trim() || undefined,\n url: url.trim(),\n app: app.trim() || undefined,\n eventKinds,\n };\n create.mutate(input, {\n onSuccess: (res) => (res.secret ? setSecret(res.secret) : onClose()),\n onError: (e: Error) => toast.error(`Could not save endpoint: ${e.message}`),\n });\n }\n\n if (secret) {\n return <SecretReveal secret={secret} onDone={onClose} />;\n }\n\n return (\n <>\n <DialogHeader>\n <DialogTitle>{editing ? \"Edit endpoint\" : \"Add endpoint\"}</DialogTitle>\n </DialogHeader>\n <div className=\"flex flex-col gap-3 py-1\">\n <FormField label=\"Name (optional)\">\n <Input\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"Acme Production\"\n />\n </FormField>\n <FormField label=\"Destination URL\">\n <Input\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n placeholder=\"https://hooks.example.com/dx\"\n />\n </FormField>\n <FormField label=\"App (optional, restricts to one app)\">\n <Input value={app} onChange={(e) => setApp(e.target.value)} placeholder=\"all apps\" />\n </FormField>\n <fieldset className=\"flex flex-col gap-1.5\">\n <legend className=\"text-muted-foreground mb-1 text-[11px] tracking-wide uppercase\">\n Subscribed events\n </legend>\n {SUBSCRIBABLE_EVENT_KINDS.map((k) => (\n <label key={k} className=\"flex items-center gap-2 font-mono text-xs\">\n <input type=\"checkbox\" checked={kinds.has(k)} onChange={() => toggleKind(k)} />\n {k}\n </label>\n ))}\n </fieldset>\n {editing && (\n <label className=\"flex items-center gap-2 text-xs\">\n <input type=\"checkbox\" checked={rotate} onChange={(e) => setRotate(e.target.checked)} />\n Rotate signing secret (the new secret is shown once)\n </label>\n )}\n </div>\n <DialogFooter>\n <Button size=\"sm\" variant=\"ghost\" onClick={onClose} disabled={pending}>\n Cancel\n </Button>\n <Button size=\"sm\" onClick={submit} disabled={!canSubmit}>\n {editing ? \"Save changes\" : \"Create endpoint\"}\n </Button>\n </DialogFooter>\n </>\n );\n}\n\nfunction isSubscribable(k: string): k is SubscribableEventKind {\n return (SUBSCRIBABLE_EVENT_KINDS as readonly string[]).includes(k);\n}\n","export function Facts({ rows }: { rows: [string, string][] }) {\n return (\n <dl className=\"grid grid-cols-[max-content_1fr] gap-x-4 gap-y-1.5 text-xs\">\n {rows.map(([k, v]) => (\n <div key={k} className=\"contents\">\n <dt className=\"text-muted-foreground\">{k}</dt>\n <dd className=\"min-w-0 truncate font-mono\" title={v}>\n {v}\n </dd>\n </div>\n ))}\n </dl>\n );\n}\n","import { ChevronRight, ExternalLink, Pencil, Power, Trash2 } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { toast } from \"sonner\";\nimport type { WebhookDelivery, WebhookEndpoint, WebhookEndpointStats } from \"@durablex/react\";\nimport { useConfirmAction } from \"../hooks/use-confirm-action\";\nimport { useDeleteEndpoint, useUpdateEndpoint } from \"@durablex/react\";\nimport { formatRelative } from \"../lib/format\";\nimport {\n deliveryView,\n endpointHealth,\n endpointLabel,\n shortUrl,\n successRate,\n} from \"../lib/webhook-view\";\nimport { Facts } from \"./Facts\";\nimport { CodePill, DeliveryBadge, EndpointBadge, EventChip } from \"./WebhookBadges\";\n\nexport function EndpointRow({\n ep,\n stats,\n recent,\n onEdit,\n}: {\n ep: WebhookEndpoint;\n stats?: WebhookEndpointStats;\n recent: WebhookDelivery[];\n onEdit(): void;\n}) {\n const [open, setOpen] = useState(false);\n const health = endpointHealth(ep, recent);\n const rate = successRate(stats);\n const dot =\n health === \"failing\"\n ? \"var(--st-failed-fg)\"\n : health === \"disabled\"\n ? \"var(--muted-foreground)\"\n : \"var(--primary)\";\n\n return (\n <>\n <tr className=\"row app-row\" aria-expanded={open} onClick={() => setOpen(!open)}>\n <td>\n <div className=\"app-cell\">\n <ChevronRight className=\"app-chev\" />\n <i className=\"sq\" style={{ width: 8, height: 8, background: dot }} />\n <div className=\"app-id\">\n <span className=\"nm\">{endpointLabel(ep)}</span>\n <span className=\"url\">{shortUrl(ep.url)}</span>\n </div>\n </div>\n </td>\n <td>\n <EndpointBadge health={health} />\n </td>\n <td>\n <div className=\"wh-evchips\">\n {ep.eventKinds.slice(0, 2).map((e) => (\n <EventChip key={e} name={e} />\n ))}\n {ep.eventKinds.length > 2 && (\n <span className=\"wh-evmore\">+{ep.eventKinds.length - 2}</span>\n )}\n </div>\n </td>\n <td className=\"num\">\n <span className=\"dur\">{rate == null ? \"-\" : `${rate}%`}</span>\n </td>\n <td className=\"num\">\n <span className=\"dur\">{stats?.delivered ?? 0}</span>\n </td>\n <td>\n <span className=\"ts cell-mut\">\n {stats?.lastDelivery ? formatRelative(stats.lastDelivery) : \"-\"}\n </span>\n </td>\n </tr>\n {open && (\n <tr className=\"app-detailrow\">\n <td colSpan={6}>\n <div className=\"wh-od\">\n <div className=\"wh-od-main\">\n <div className=\"wh-od-sec\">\n <div className=\"wh-od-h\">Configuration</div>\n <Facts\n rows={[\n [\"URL\", ep.url],\n [\"Endpoint id\", ep.id],\n [\"Signing secret\", \"sealed - rotate to reset\"],\n [\"Created\", formatRelative(ep.createdAt)],\n ]}\n />\n </div>\n <div className=\"wh-od-sec\">\n <div className=\"wh-od-h\">Subscribed events · {ep.eventKinds.length}</div>\n <div className=\"wh-evchips wrap\">\n {ep.eventKinds.map((e) => (\n <EventChip key={e} name={e} />\n ))}\n </div>\n </div>\n <EndpointActions ep={ep} onEdit={onEdit} />\n </div>\n <div className=\"wh-od-side\">\n <div className=\"wh-od-h\">Recent deliveries · {recent.length}</div>\n {recent.length ? (\n <div className=\"wh-reclist\">\n {recent.slice(0, 12).map((d) => (\n <div className=\"wh-rec\" key={d.id}>\n <span className=\"wh-rec-ev\">{d.eventKind}</span>\n <span className=\"wh-rec-meta\">\n <CodePill code={d.lastStatusCode} />\n <DeliveryBadge view={deliveryView(d)} small />\n <span className=\"wh-rec-at\">{formatRelative(d.createdAt)}</span>\n </span>\n </div>\n ))}\n </div>\n ) : (\n <div className=\"wh-rec-empty\">No deliveries yet.</div>\n )}\n </div>\n </div>\n </td>\n </tr>\n )}\n </>\n );\n}\n\nfunction EndpointActions({ ep, onEdit }: { ep: WebhookEndpoint; onEdit(): void }) {\n const update = useUpdateEndpoint();\n const del = useDeleteEndpoint();\n const remove = useConfirmAction(() =>\n del.mutate(ep.id, {\n onSuccess: () => toast.success(\"Endpoint deleted\"),\n onError: (e: Error) => toast.error(`Could not delete endpoint: ${e.message}`),\n }),\n );\n\n return (\n <div className=\"app-actions\" onClick={(e) => e.stopPropagation()}>\n <button type=\"button\" className=\"btn focusable\" onClick={onEdit}>\n <Pencil /> Edit\n </button>\n <button\n type=\"button\"\n className=\"btn focusable\"\n disabled={update.isPending}\n onClick={() =>\n update.mutate(\n { id: ep.id, patch: { enabled: !ep.enabled } },\n { onError: (e: Error) => toast.error(`Could not update endpoint: ${e.message}`) },\n )\n }\n >\n <Power /> {ep.enabled ? \"Disable\" : \"Enable\"}\n </button>\n <a className=\"btn focusable\" href={ep.url} target=\"_blank\" rel=\"noreferrer\">\n <ExternalLink /> Open endpoint\n </a>\n <button\n type=\"button\"\n className=\"btn focusable\"\n style={{ color: \"var(--st-failed-fg)\" }}\n disabled={del.isPending}\n onClick={remove.trigger}\n >\n <Trash2 /> {remove.confirming ? \"Confirm delete\" : \"Delete\"}\n </button>\n </div>\n );\n}\n","import { Plus } from \"lucide-react\";\nimport { useMemo, useState } from \"react\";\nimport type { WebhookEndpoint } from \"@durablex/react\";\nimport { useDeliveries, useEndpoints, useEndpointStats } from \"@durablex/react\";\nimport { DELIVERY_LIST_LIMIT, groupDeliveriesByEndpoint } from \"../lib/webhook-view\";\nimport { EndpointFormDialog } from \"./EndpointFormDialog\";\nimport { EndpointRow } from \"./EndpointRow\";\n\nconst STATS_WINDOW = 24 * 60 * 60 * 1000;\n\nexport function EndpointsTab() {\n // Lazy initializer: reads the clock once at mount so the boundary is stable across re-renders.\n const [since] = useState(() => new Date(Date.now() - STATS_WINDOW).toISOString());\n const endpoints = useEndpoints().data ?? [];\n const statsData = useEndpointStats(since).data;\n const deliveriesData = useDeliveries({ limit: DELIVERY_LIST_LIMIT }).data?.deliveries;\n const [adding, setAdding] = useState(false);\n const [editing, setEditing] = useState<WebhookEndpoint | null>(null);\n\n const statsById = useMemo(\n () => new Map((statsData ?? []).map((s) => [s.endpointId, s])),\n [statsData],\n );\n const recentById = useMemo(\n () => groupDeliveriesByEndpoint(deliveriesData ?? []),\n [deliveriesData],\n );\n\n return (\n <div className=\"content\">\n <div className=\"tbar\">\n <span className=\"text-muted-foreground font-mono text-[11px]\">\n {endpoints.length} endpoints\n </span>\n <span className=\"tbar-spacer\" />\n <button type=\"button\" className=\"btn focusable\" onClick={() => setAdding(true)}>\n <Plus /> Add endpoint\n </button>\n </div>\n <div className=\"tablewrap\">\n {endpoints.length === 0 ? (\n <div className=\"placeholder\">\n <div className=\"ph-inner\">\n <h3>No outbound endpoints</h3>\n <p>Add an endpoint to deliver run lifecycle events to an external URL.</p>\n </div>\n </div>\n ) : (\n <table className=\"runs apps-table\">\n <thead>\n <tr>\n <th>Endpoint</th>\n <th>Status</th>\n <th>Events</th>\n <th className=\"num\">Success</th>\n <th className=\"num\">Sent · 24h</th>\n <th>Last delivery</th>\n </tr>\n </thead>\n <tbody>\n {endpoints.map((ep) => (\n <EndpointRow\n key={ep.id}\n ep={ep}\n stats={statsById.get(ep.id)}\n recent={recentById.get(ep.id) ?? []}\n onEdit={() => setEditing(ep)}\n />\n ))}\n </tbody>\n </table>\n )}\n </div>\n\n <EndpointFormDialog open={adding} onOpenChange={setAdding} />\n <EndpointFormDialog\n open={editing != null}\n onOpenChange={(o) => !o && setEditing(null)}\n endpoint={editing ?? undefined}\n />\n </div>\n );\n}\n","import { useState } from \"react\";\nimport { toast } from \"sonner\";\nimport type { ReceiverInput, ReceiverPatch, WebhookReceiver } from \"@durablex/react\";\nimport { Button } from \"../ui/button\";\nimport { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from \"../ui/dialog\";\nimport { Input } from \"../ui/input\";\nimport { useCreateReceiver, useUpdateReceiver } from \"@durablex/react\";\nimport { FormField } from \"./FormField\";\nimport { SecretReveal } from \"./SecretReveal\";\nexport function ReceiverFormDialog({\n open,\n onOpenChange,\n receiver,\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n receiver?: WebhookReceiver;\n}) {\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-md\">\n {open && <ReceiverForm receiver={receiver} onClose={() => onOpenChange(false)} />}\n </DialogContent>\n </Dialog>\n );\n}\n\nfunction ReceiverForm({ receiver, onClose }: { receiver?: WebhookReceiver; onClose: () => void }) {\n const editing = receiver != null;\n const [name, setName] = useState(receiver?.name ?? \"\");\n const [eventName, setEventName] = useState(receiver?.eventName ?? \"\");\n const [app, setApp] = useState(receiver?.app ?? \"\");\n const [rotate, setRotate] = useState(false);\n const [secret, setSecret] = useState<string | null>(null);\n\n const create = useCreateReceiver();\n const update = useUpdateReceiver();\n const pending = create.isPending || update.isPending;\n const canSubmit = eventName.trim() !== \"\" && !pending;\n\n function submit() {\n if (!canSubmit) return;\n if (editing) {\n const patch: ReceiverPatch = {\n name: name.trim(),\n eventName: eventName.trim(),\n app: app.trim(),\n rotateSecret: rotate,\n };\n update.mutate(\n { id: receiver.id, patch },\n {\n onSuccess: (res) => (res.secret ? setSecret(res.secret) : onClose()),\n onError: (e: Error) => toast.error(`Could not save receiver: ${e.message}`),\n },\n );\n return;\n }\n const input: ReceiverInput = {\n name: name.trim() || undefined,\n eventName: eventName.trim(),\n app: app.trim() || undefined,\n };\n create.mutate(input, {\n onSuccess: (res) => (res.secret ? setSecret(res.secret) : onClose()),\n onError: (e: Error) => toast.error(`Could not save receiver: ${e.message}`),\n });\n }\n\n if (secret) {\n return <SecretReveal secret={secret} onDone={onClose} />;\n }\n\n return (\n <>\n <DialogHeader>\n <DialogTitle>{editing ? \"Edit receiver\" : \"Add receiver\"}</DialogTitle>\n </DialogHeader>\n <div className=\"flex flex-col gap-3 py-1\">\n <FormField label=\"Name (optional)\">\n <Input value={name} onChange={(e) => setName(e.target.value)} placeholder=\"Stripe\" />\n </FormField>\n <FormField label=\"Maps to event\">\n <Input\n value={eventName}\n onChange={(e) => setEventName(e.target.value)}\n placeholder=\"stripe.charge\"\n />\n </FormField>\n <FormField label=\"App (optional)\">\n <Input value={app} onChange={(e) => setApp(e.target.value)} placeholder=\"default app\" />\n </FormField>\n {editing && (\n <>\n <FormField label=\"Receive URL (immutable)\">\n <Input\n value={`/webhooks/${receiver.slug}`}\n readOnly\n className=\"text-muted-foreground\"\n />\n </FormField>\n <label className=\"flex items-center gap-2 text-xs\">\n <input\n type=\"checkbox\"\n checked={rotate}\n onChange={(e) => setRotate(e.target.checked)}\n />\n Rotate signing secret (the new secret is shown once)\n </label>\n </>\n )}\n </div>\n <DialogFooter>\n <Button size=\"sm\" variant=\"ghost\" onClick={onClose} disabled={pending}>\n Cancel\n </Button>\n <Button size=\"sm\" onClick={submit} disabled={!canSubmit}>\n {editing ? \"Save changes\" : \"Create receiver\"}\n </Button>\n </DialogFooter>\n </>\n );\n}\n","import { Check, ChevronRight, Copy, Pencil, Plus, Power, Trash2 } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { toast } from \"sonner\";\nimport type { WebhookReceiver } from \"@durablex/react\";\nimport { useConfirmAction } from \"../hooks/use-confirm-action\";\nimport { useReceivers, useDeleteReceiver, useUpdateReceiver } from \"@durablex/react\";\nimport { formatRelative } from \"../lib/format\";\nimport { receiverLabel } from \"../lib/webhook-view\";\nimport { Facts } from \"./Facts\";\nimport { EndpointBadge } from \"./WebhookBadges\";\nimport { ReceiverFormDialog } from \"./ReceiverFormDialog\";\n\nexport function ReceiversTab() {\n const receivers = useReceivers().data ?? [];\n const [adding, setAdding] = useState(false);\n const [editing, setEditing] = useState<WebhookReceiver | null>(null);\n\n return (\n <div className=\"content\">\n <div className=\"tbar\">\n <span className=\"text-muted-foreground font-mono text-[11px]\">\n {receivers.length} receivers\n </span>\n <span className=\"tbar-spacer\" />\n <button type=\"button\" className=\"btn focusable\" onClick={() => setAdding(true)}>\n <Plus /> Add receiver\n </button>\n </div>\n <div className=\"tablewrap\">\n {receivers.length === 0 ? (\n <div className=\"placeholder\">\n <div className=\"ph-inner\">\n <h3>No inbound receivers</h3>\n <p>Add a receiver to map a verified external POST onto a durablex event.</p>\n </div>\n </div>\n ) : (\n <table className=\"runs apps-table\">\n <thead>\n <tr>\n <th>Source</th>\n <th>Status</th>\n <th>Verification</th>\n <th>Maps to event</th>\n <th>App</th>\n <th>Created</th>\n </tr>\n </thead>\n <tbody>\n {receivers.map((rc) => (\n <ReceiverRow key={rc.id} rc={rc} onEdit={() => setEditing(rc)} />\n ))}\n </tbody>\n </table>\n )}\n </div>\n\n <ReceiverFormDialog open={adding} onOpenChange={setAdding} />\n <ReceiverFormDialog\n open={editing != null}\n onOpenChange={(o) => !o && setEditing(null)}\n receiver={editing ?? undefined}\n />\n </div>\n );\n}\n\nfunction ReceiverRow({ rc, onEdit }: { rc: WebhookReceiver; onEdit(): void }) {\n const [open, setOpen] = useState(false);\n const dot = rc.enabled ? \"var(--primary)\" : \"var(--muted-foreground)\";\n const path = `/webhooks/${rc.slug}`;\n\n return (\n <>\n <tr className=\"row app-row\" aria-expanded={open} onClick={() => setOpen(!open)}>\n <td>\n <div className=\"app-cell\">\n <ChevronRight className=\"app-chev\" />\n <i className=\"sq\" style={{ width: 8, height: 8, background: dot }} />\n <div className=\"app-id\">\n <span className=\"nm\">{receiverLabel(rc)}</span>\n <span className=\"url\">{path}</span>\n </div>\n </div>\n </td>\n <td>\n <EndpointBadge health={rc.enabled ? \"active\" : \"disabled\"} />\n </td>\n <td>\n <span className=\"wh-verify ok\">\n <Check /> Signed\n </span>\n </td>\n <td>\n <span className=\"wf-name text-xs\">{rc.eventName}</span>\n </td>\n <td>\n <span className=\"text-muted-foreground text-[11px]\">{rc.app || \"-\"}</span>\n </td>\n <td>\n <span className=\"ts cell-mut\">{formatRelative(rc.createdAt)}</span>\n </td>\n </tr>\n {open && (\n <tr className=\"app-detailrow\">\n <td colSpan={6}>\n <div className=\"wh-od\">\n <div className=\"wh-od-main\">\n <div className=\"wh-od-sec\">\n <div className=\"wh-od-h\">Configuration</div>\n <Facts\n rows={[\n [\"Receive URL\", path],\n [\"Receiver id\", rc.id],\n [\"Signature\", rc.scheme],\n [\"Maps to\", rc.eventName],\n ]}\n />\n </div>\n <ReceiverActions rc={rc} path={path} onEdit={onEdit} />\n </div>\n <div className=\"wh-od-side\">\n <div className=\"wh-od-h\">Verification</div>\n <p className=\"text-muted-foreground text-xs\">\n Inbound posts are HMAC-verified against this receiver's signing secret. Rotate the\n secret from Edit; the new value is shown once.\n </p>\n </div>\n </div>\n </td>\n </tr>\n )}\n </>\n );\n}\n\nfunction ReceiverActions({\n rc,\n path,\n onEdit,\n}: {\n rc: WebhookReceiver;\n path: string;\n onEdit(): void;\n}) {\n const update = useUpdateReceiver();\n const del = useDeleteReceiver();\n const remove = useConfirmAction(() =>\n del.mutate(rc.id, {\n onSuccess: () => toast.success(\"Receiver deleted\"),\n onError: (e: Error) => toast.error(`Could not delete receiver: ${e.message}`),\n }),\n );\n\n function copyUrl() {\n void navigator.clipboard?.writeText(`${window.location.origin}${path}`).then(\n () => toast.success(\"Receive URL copied\"),\n () => undefined,\n );\n }\n\n return (\n <div className=\"app-actions\" onClick={(e) => e.stopPropagation()}>\n <button type=\"button\" className=\"btn focusable\" onClick={onEdit}>\n <Pencil /> Edit\n </button>\n <button type=\"button\" className=\"btn focusable\" onClick={copyUrl}>\n <Copy /> Copy URL\n </button>\n <button\n type=\"button\"\n className=\"btn focusable\"\n disabled={update.isPending}\n onClick={() =>\n update.mutate(\n { id: rc.id, patch: { enabled: !rc.enabled } },\n { onError: (e: Error) => toast.error(`Could not update receiver: ${e.message}`) },\n )\n }\n >\n <Power /> {rc.enabled ? \"Disable\" : \"Enable\"}\n </button>\n <button\n type=\"button\"\n className=\"btn focusable\"\n style={{ color: \"var(--st-failed-fg)\" }}\n disabled={del.isPending}\n onClick={remove.trigger}\n >\n <Trash2 /> {remove.confirming ? \"Confirm delete\" : \"Delete\"}\n </button>\n </div>\n );\n}\n","import { Globe, Inbox, Send } from \"lucide-react\";\nimport type { ComponentType } from \"react\";\nimport { useState } from \"react\";\nimport { DeliveriesSplit } from \"./DeliveriesSplit\";\nimport { EndpointsTab } from \"./EndpointsTab\";\nimport { ReceiversTab } from \"./ReceiversTab\";\nimport { useEndpoints, useReceivers } from \"@durablex/react\";\nimport type { WebhookTab } from \"../lib/webhook-view\";\n\nconst TABS = [\n { key: \"deliveries\", label: \"Deliveries\", Icon: Send },\n { key: \"endpoints\", label: \"Endpoints\", Icon: Globe },\n { key: \"receivers\", label: \"Receivers\", Icon: Inbox },\n] as const;\n\nexport function WebhooksView({ onOpenRun }: { onOpenRun?: (runId: string) => void }) {\n const [tab, setTab] = useState<WebhookTab>(\"deliveries\");\n const endpoints = useEndpoints().data?.length;\n const receivers = useReceivers().data?.length;\n const counts: Record<WebhookTab, number | undefined> = {\n deliveries: undefined,\n endpoints,\n receivers,\n };\n\n return (\n <div className=\"wh-root\">\n <div className=\"wh-subnav\" role=\"tablist\">\n {TABS.map(({ key, label, Icon }) => (\n <WebhookTab\n key={key}\n label={label}\n Icon={Icon}\n count={counts[key]}\n selected={tab === key}\n onSelect={() => setTab(key)}\n />\n ))}\n </div>\n <div className=\"wh-body\">\n {tab === \"deliveries\" && <DeliveriesSplit onOpenRun={onOpenRun} />}\n {tab === \"endpoints\" && <EndpointsTab />}\n {tab === \"receivers\" && <ReceiversTab />}\n </div>\n </div>\n );\n}\n\nfunction WebhookTab({\n label,\n Icon,\n count,\n selected,\n onSelect,\n}: {\n label: string;\n Icon: ComponentType<{ className?: string }>;\n count?: number;\n selected: boolean;\n onSelect(): void;\n}) {\n return (\n <button type=\"button\" className=\"wh-tab\" role=\"tab\" aria-selected={selected} onClick={onSelect}>\n <Icon className=\"wh-tab-ico\" />\n <span>{label}</span>\n {count != null && <span className=\"wh-count tabular-nums\">{count}</span>}\n </button>\n );\n}\n","import type { RunStats } from \"@durablex/react\";\nimport { useFlowState } from \"@durablex/react\";\nimport { SectionHeader } from \"./SectionHeader\";\nimport { StatTileGrid } from \"./StatTileGrid\";\n\n// Namespace-wide (or per-app) flow-control state: queue depth and in-flight from run\n// stats, plus the buffered totals across the debounce and batch adapters.\nexport function FlowSummary({ app, stats }: { app?: string; stats?: RunStats }) {\n const flow = useFlowState(app ? { app } : {});\n const debouncePending = (flow.data?.debounce ?? []).reduce((n, d) => n + d.pending, 0);\n const batchBuffered = (flow.data?.batch ?? []).reduce((n, b) => n + b.buffered, 0);\n\n return (\n <section className=\"flowsum\">\n <SectionHeader>Flow control</SectionHeader>\n <StatTileGrid\n tiles={[\n {\n label: \"Queue depth\",\n value: stats?.queued ?? 0,\n sub: \"waiting to start\",\n token: \"--st-queued-fg\",\n },\n {\n label: \"In-flight\",\n value: stats?.running ?? 0,\n sub: \"executing now\",\n token: \"--st-running-fg\",\n mark: true,\n },\n {\n label: \"Debounce pending\",\n value: debouncePending,\n sub: \"coalescing\",\n token: \"--st-waiting-fg\",\n },\n {\n label: \"Batch buffered\",\n value: batchBuffered,\n sub: \"awaiting flush\",\n token: \"--st-waiting-fg\",\n },\n ]}\n />\n </section>\n );\n}\n","import { useState } from \"react\";\nimport { useRunStats, useRunTimeSeries } from \"@durablex/react\";\nimport { StatsTiles } from \"./StatsTiles\";\nimport { AppFilter } from \"./filters/AppFilter\";\nimport { TimeRangeFilter } from \"./filters/TimeRangeFilter\";\nimport { RunCharts } from \"./charts/RunCharts\";\nimport { FlowSummary } from \"./FlowSummary\";\nimport { ALL_FILTER } from \"../lib/run-filters\";\nimport { DEFAULT_TIME_RANGE, seriesBucketSeconds, timeLabel, windowSince } from \"../lib/time-range\";\n\nexport function OverviewView() {\n const [time, setTime] = useState(DEFAULT_TIME_RANGE);\n const [app, setApp] = useState<string>(ALL_FILTER);\n\n const since = windowSince(time);\n const appParam = app === ALL_FILTER ? undefined : app;\n const bucket = seriesBucketSeconds(time);\n\n const stats = useRunStats({ app: appParam, since });\n // Queue depth / in-flight are point-in-time facts, so the flow summary reads an\n // unwindowed count - a run started before the selected range is still in flight.\n const liveStats = useRunStats({ app: appParam });\n const { data: series, isLoading } = useRunTimeSeries({ app: appParam, since, bucket });\n\n return (\n <div className=\"flex h-full min-h-0 flex-col\">\n <StatsTiles stats={stats.data} rangeLabel={timeLabel(time)} />\n <div className=\"filterbar\">\n <TimeRangeFilter time={time} onTime={setTime} />\n <AppFilter app={app} onApp={setApp} />\n </div>\n\n <div className=\"min-h-0 flex-1 overflow-auto\">\n <FlowSummary app={appParam} stats={liveStats.data} />\n <RunCharts series={series} loading={isLoading} />\n </div>\n </div>\n );\n}\n","import * as React from \"react\";\nimport {\n CircleCheckIcon,\n InfoIcon,\n Loader2Icon,\n OctagonXIcon,\n TriangleAlertIcon,\n} from \"lucide-react\";\nimport { Toaster as Sonner, type ToasterProps } from \"sonner\";\n\nconst Toaster = ({ ...props }: ToasterProps) => {\n return (\n <Sonner\n className=\"toaster group\"\n icons={{\n success: <CircleCheckIcon className=\"size-4\" />,\n info: <InfoIcon className=\"size-4\" />,\n warning: <TriangleAlertIcon className=\"size-4\" />,\n error: <OctagonXIcon className=\"size-4\" />,\n loading: <Loader2Icon className=\"size-4 animate-spin\" />,\n }}\n style={\n {\n \"--normal-bg\": \"var(--popover)\",\n \"--normal-text\": \"var(--popover-foreground)\",\n \"--normal-border\": \"var(--border)\",\n \"--border-radius\": \"var(--radius)\",\n } as React.CSSProperties\n }\n {...props}\n />\n );\n};\n\nexport { Toaster };\n","export const THEME_PREFS = [\"light\", \"system\", \"dark\"] as const;\nexport type ThemePref = (typeof THEME_PREFS)[number];\n\nconst KEY = \"dx.theme\";\nconst query = \"(prefers-color-scheme: dark)\";\n\nexport function getThemePref(): ThemePref {\n const v = localStorage.getItem(KEY);\n return v === \"light\" || v === \"dark\" ? v : \"system\";\n}\n\nfunction resolveDark(pref: ThemePref): boolean {\n return pref === \"system\" ? window.matchMedia(query).matches : pref === \"dark\";\n}\n\nexport function applyThemePref(pref: ThemePref): void {\n const dark = resolveDark(pref);\n document.documentElement.classList.toggle(\"dark\", dark);\n document.documentElement.style.colorScheme = dark ? \"dark\" : \"light\";\n}\n\nexport function setThemePref(pref: ThemePref): void {\n localStorage.setItem(KEY, pref);\n applyThemePref(pref);\n}\n\n// Re-apply on OS change so the \"system\" preference stays live.\nexport function watchSystemTheme(getPref: () => ThemePref): () => void {\n const mq = window.matchMedia(query);\n const onChange = () => {\n if (getPref() === \"system\") applyThemePref(\"system\");\n };\n mq.addEventListener(\"change\", onChange);\n return () => mq.removeEventListener(\"change\", onChange);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["SeparatorPrimitive","SheetPrimitive","TooltipPrimitive","Sidebar","SidebarPrimitive","DialogPrimitive","CONFIG","Sonner"],"sources":["../src/hooks/use-mobile.ts","../src/lib/utils.ts","../src/ui/button.tsx","../src/ui/input.tsx","../src/ui/separator.tsx","../src/ui/sheet.tsx","../src/ui/skeleton.tsx","../src/ui/tooltip.tsx","../src/ui/sidebar.tsx","../src/components/marks-geometry.ts","../src/components/AnimatedDurablexMark.tsx","../src/components/DurablexLogo.tsx","../src/shell/Sidebar.tsx","../src/shell/Topbar.tsx","../src/shell/AppShell.tsx","../src/hooks/use-copy.ts","../src/lib/format.ts","../src/lib/run-logs.ts","../src/lib/run-progress.ts","../src/components/Meta.tsx","../src/lib/json-highlight.ts","../src/components/JsonBlock.tsx","../src/components/LogList.tsx","../src/components/PayloadTabs.tsx","../src/components/ResumeMark.tsx","../src/lib/status-label.ts","../src/components/StatusBadge.tsx","../src/lib/step-detail.ts","../src/lib/step-display.ts","../src/components/StepGlyph.tsx","../src/components/StepTabsView.tsx","../src/components/StepInspector.tsx","../src/components/StepFlow.tsx","../src/components/StepRow.tsx","../src/lib/step-timeline.ts","../src/components/StepTimeline.tsx","../src/components/RunInspector.tsx","../src/hooks/use-confirm-action.ts","../src/components/RunCancelButton.tsx","../src/components/RunPauseButton.tsx","../src/ui/dialog.tsx","../src/components/JsonEditor.tsx","../src/components/ReplayRunDialog.tsx","../src/components/RunInspectorActions.tsx","../src/ui/resizable.tsx","../src/hooks/use-keyset-pager.ts","../src/lib/run-filters.ts","../src/lib/run-sort.ts","../src/lib/time-range.ts","../src/components/BulkReplayButton.tsx","../src/components/CursorPager.tsx","../src/components/RetryFromStepButton.tsx","../src/lib/control-action.ts","../src/components/RunControlHistory.tsx","../src/lib/app-color.ts","../src/components/filters/use-click-outside.ts","../src/components/filters/FilterDropdown.tsx","../src/components/filters/FilterDropdownButton.tsx","../src/components/filters/FilterDropdownItem.tsx","../src/components/filters/AppFilter.tsx","../src/components/filters/TimeRangeFilter.tsx","../src/components/RunsFilterBar.tsx","../src/components/RunsTableHead.tsx","../src/components/RunsTableLoader.tsx","../src/components/RunsTablePlaceholder.tsx","../src/components/AppTag.tsx","../src/components/GlyphBadge.tsx","../src/components/ScheduledBadge.tsx","../src/components/RunsTableRow.tsx","../src/components/RunsTable.tsx","../src/components/StatTileGrid.tsx","../src/components/StatsTiles.tsx","../src/components/RunsView.tsx","../src/components/filters/TimeZoneFilter.tsx","../src/components/SectionHeader.tsx","../src/components/charts/ChartCard.tsx","../src/ui/chart.tsx","../src/components/charts/RunLatencyChart.tsx","../src/components/charts/RunsOverTimeChart.tsx","../src/components/charts/RunCharts.tsx","../src/lib/flow-control.ts","../src/components/FlowControlBadge.tsx","../src/components/FlowControlSection.tsx","../src/components/WorkflowDetail.tsx","../src/components/WorkflowsView.tsx","../src/components/RunnerLiveBadge.tsx","../src/components/AppStatusBadge.tsx","../src/components/AppsView.tsx","../src/lib/table.ts","../src/ui/table.tsx","../src/components/TableStatusRows.tsx","../src/components/EventsList.tsx","../src/components/TriggerEventResult.tsx","../src/components/TriggerEventDialog.tsx","../src/components/EventsView.tsx","../src/lib/workflow-run.ts","../src/components/WorkflowRunDialog.tsx","../src/components/WorkflowRunAction.tsx","../src/lib/webhook-view.ts","../src/components/WebhookBadges.tsx","../src/components/WebhookStatusBadge.tsx","../src/components/DeliveryDetail.tsx","../src/components/DeliveriesSplit.tsx","../src/components/FormField.tsx","../src/components/SecretReveal.tsx","../src/components/EndpointFormDialog.tsx","../src/components/Facts.tsx","../src/components/EndpointRow.tsx","../src/components/EndpointsTab.tsx","../src/components/ReceiverFormDialog.tsx","../src/components/ReceiversTab.tsx","../src/components/WebhooksView.tsx","../src/components/FlowSummary.tsx","../src/components/OverviewView.tsx","../src/ui/sonner.tsx","../src/lib/theme.ts"],"sourcesContent":["import * as React from \"react\";\n\nconst MOBILE_BREAKPOINT = 768;\n\nexport function useIsMobile() {\n const [isMobile, setIsMobile] = React.useState(() => window.innerWidth < MOBILE_BREAKPOINT);\n\n React.useEffect(() => {\n const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);\n const onChange = () => setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n mql.addEventListener(\"change\", onChange);\n return () => mql.removeEventListener(\"change\", onChange);\n }, []);\n\n return isMobile;\n}\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { Slot } from \"radix-ui\";\n\nimport { cn } from \"../lib/utils\";\n\nconst buttonVariants = cva(\n \"group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 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-primary text-primary-foreground hover:bg-primary/80\",\n outline:\n \"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)] aria-expanded:bg-secondary aria-expanded:text-secondary-foreground\",\n ghost:\n \"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50\",\n destructive:\n \"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default:\n \"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2\",\n xs: \"h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3\",\n sm: \"h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5\",\n lg: \"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2\",\n icon: \"size-8\",\n \"icon-xs\":\n \"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3\",\n \"icon-sm\":\n \"size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg\",\n \"icon-lg\": \"size-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nfunction Button({\n className,\n variant = \"default\",\n size = \"default\",\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean;\n }) {\n const Comp = asChild ? Slot.Root : \"button\";\n\n return (\n <Comp\n data-slot=\"button\"\n data-variant={variant}\n data-size={size}\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n );\n}\n\nexport { Button, buttonVariants };\n","import * as React from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(\n \"h-8 w-full min-w-0 rounded-lg border border-input bg-transparent px-2.5 py-1 text-base transition-colors outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Input };\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Separator as SeparatorPrimitive } from \"radix-ui\";\n\nimport { cn } from \"../lib/utils\";\n\nfunction Separator({\n className,\n orientation = \"horizontal\",\n decorative = true,\n ...props\n}: React.ComponentProps<typeof SeparatorPrimitive.Root>) {\n return (\n <SeparatorPrimitive.Root\n data-slot=\"separator\"\n decorative={decorative}\n orientation={orientation}\n className={cn(\n \"shrink-0 bg-border data-horizontal:h-px data-horizontal:w-full data-vertical:w-px data-vertical:self-stretch\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Separator };\n","import * as React from \"react\";\nimport { Dialog as SheetPrimitive } from \"radix-ui\";\n\nimport { cn } from \"../lib/utils\";\nimport { Button } from \"./button\";\nimport { XIcon } from \"lucide-react\";\n\nfunction Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {\n return <SheetPrimitive.Root data-slot=\"sheet\" {...props} />;\n}\n\nfunction SheetTrigger({ ...props }: React.ComponentProps<typeof SheetPrimitive.Trigger>) {\n return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />;\n}\n\nfunction SheetClose({ ...props }: React.ComponentProps<typeof SheetPrimitive.Close>) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />;\n}\n\nfunction SheetPortal({ ...props }: React.ComponentProps<typeof SheetPrimitive.Portal>) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />;\n}\n\nfunction SheetOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Overlay>) {\n return (\n <SheetPrimitive.Overlay\n data-slot=\"sheet-overlay\"\n className={cn(\n \"fixed inset-0 z-50 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SheetContent({\n className,\n children,\n side = \"right\",\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Content> & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\n showCloseButton?: boolean;\n}) {\n return (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n data-slot=\"sheet-content\"\n data-side={side}\n className={cn(\n \"fixed z-50 flex flex-col gap-4 bg-popover bg-clip-padding text-sm text-popover-foreground shadow-lg transition duration-200 ease-in-out data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:h-auto data-[side=bottom]:border-t data-[side=left]:inset-y-0 data-[side=left]:left-0 data-[side=left]:h-full data-[side=left]:w-3/4 data-[side=left]:border-r data-[side=right]:inset-y-0 data-[side=right]:right-0 data-[side=right]:h-full data-[side=right]:w-3/4 data-[side=right]:border-l data-[side=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:h-auto data-[side=top]:border-b data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-[side=bottom]:data-open:slide-in-from-bottom-10 data-[side=left]:data-open:slide-in-from-left-10 data-[side=right]:data-open:slide-in-from-right-10 data-[side=top]:data-open:slide-in-from-top-10 data-closed:animate-out data-closed:fade-out-0 data-[side=bottom]:data-closed:slide-out-to-bottom-10 data-[side=left]:data-closed:slide-out-to-left-10 data-[side=right]:data-closed:slide-out-to-right-10 data-[side=top]:data-closed:slide-out-to-top-10\",\n className,\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <SheetPrimitive.Close data-slot=\"sheet-close\" asChild>\n <Button variant=\"ghost\" className=\"absolute top-3 right-3\" size=\"icon-sm\">\n <XIcon />\n <span className=\"sr-only\">Close</span>\n </Button>\n </SheetPrimitive.Close>\n )}\n </SheetPrimitive.Content>\n </SheetPortal>\n );\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-header\"\n className={cn(\"flex flex-col gap-0.5 p-4\", className)}\n {...props}\n />\n );\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-footer\"\n className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)}\n {...props}\n />\n );\n}\n\nfunction SheetTitle({ className, ...props }: React.ComponentProps<typeof SheetPrimitive.Title>) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn(\"font-heading text-base font-medium text-foreground\", className)}\n {...props}\n />\n );\n}\n\nfunction SheetDescription({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Description>) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n );\n}\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n};\n","import * as React from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\nfunction Skeleton({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"skeleton\"\n className={cn(\"animate-pulse rounded-md bg-muted\", className)}\n {...props}\n />\n );\n}\n\nexport { Skeleton };\n","import * as React from \"react\";\nimport { Tooltip as TooltipPrimitive } from \"radix-ui\";\n\nimport { cn } from \"../lib/utils\";\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delayDuration={delayDuration}\n {...props}\n />\n );\n}\n\nfunction Tooltip({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />;\n}\n\nfunction TooltipTrigger({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />;\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 0,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n \"z-50 inline-flex w-fit max-w-xs origin-(--radix-tooltip-content-transform-origin) items-center gap-1.5 rounded-md bg-foreground px-3 py-1.5 text-xs text-background has-data-[slot=kbd]:pr-1.5 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-sm data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className,\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n );\n}\n\nexport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { Slot } from \"radix-ui\";\n\nimport { useIsMobile } from \"../hooks/use-mobile\";\nimport { cn } from \"../lib/utils\";\nimport { Button } from \"./button\";\nimport { Input } from \"./input\";\nimport { Separator } from \"./separator\";\nimport { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle } from \"./sheet\";\nimport { Skeleton } from \"./skeleton\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"./tooltip\";\nimport { PanelLeftIcon } from \"lucide-react\";\n\nconst SIDEBAR_COOKIE_NAME = \"sidebar_state\";\nconst SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;\nconst SIDEBAR_WIDTH = \"16rem\";\nconst SIDEBAR_WIDTH_MOBILE = \"18rem\";\nconst SIDEBAR_WIDTH_ICON = \"3rem\";\nconst SIDEBAR_KEYBOARD_SHORTCUT = \"b\";\n\ntype SidebarContextProps = {\n state: \"expanded\" | \"collapsed\";\n open: boolean;\n setOpen: (open: boolean) => void;\n openMobile: boolean;\n setOpenMobile: (open: boolean) => void;\n isMobile: boolean;\n toggleSidebar: () => void;\n};\n\nconst SidebarContext = React.createContext<SidebarContextProps | null>(null);\n\nfunction useSidebar() {\n const context = React.useContext(SidebarContext);\n if (!context) {\n throw new Error(\"useSidebar must be used within a SidebarProvider.\");\n }\n\n return context;\n}\n\nfunction SidebarProvider({\n defaultOpen = true,\n open: openProp,\n onOpenChange: setOpenProp,\n className,\n style,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n defaultOpen?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}) {\n const isMobile = useIsMobile();\n const [openMobile, setOpenMobile] = React.useState(false);\n\n // This is the internal state of the sidebar.\n // We use openProp and setOpenProp for control from outside the component.\n const [_open, _setOpen] = React.useState(defaultOpen);\n const open = openProp ?? _open;\n const setOpen = React.useCallback(\n (value: boolean | ((value: boolean) => boolean)) => {\n const openState = typeof value === \"function\" ? value(open) : value;\n if (setOpenProp) {\n setOpenProp(openState);\n } else {\n _setOpen(openState);\n }\n\n // This sets the cookie to keep the sidebar state.\n document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`;\n },\n [setOpenProp, open],\n );\n\n // Helper to toggle the sidebar.\n const toggleSidebar = React.useCallback(() => {\n return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open);\n }, [isMobile, setOpen, setOpenMobile]);\n\n // Adds a keyboard shortcut to toggle the sidebar.\n React.useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === SIDEBAR_KEYBOARD_SHORTCUT && (event.metaKey || event.ctrlKey)) {\n event.preventDefault();\n toggleSidebar();\n }\n };\n\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [toggleSidebar]);\n\n // We add a state so that we can do data-state=\"expanded\" or \"collapsed\".\n // This makes it easier to style the sidebar with Tailwind classes.\n const state = open ? \"expanded\" : \"collapsed\";\n\n const contextValue = React.useMemo<SidebarContextProps>(\n () => ({\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n }),\n [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar],\n );\n\n return (\n <SidebarContext.Provider value={contextValue}>\n <div\n data-slot=\"sidebar-wrapper\"\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH,\n \"--sidebar-width-icon\": SIDEBAR_WIDTH_ICON,\n ...style,\n } as React.CSSProperties\n }\n className={cn(\n \"group/sidebar-wrapper flex min-h-svh w-full has-data-[variant=inset]:bg-sidebar\",\n className,\n )}\n {...props}\n >\n {children}\n </div>\n </SidebarContext.Provider>\n );\n}\n\nfunction Sidebar({\n side = \"left\",\n variant = \"sidebar\",\n collapsible = \"offcanvas\",\n className,\n children,\n dir,\n ...props\n}: React.ComponentProps<\"div\"> & {\n side?: \"left\" | \"right\";\n variant?: \"sidebar\" | \"floating\" | \"inset\";\n collapsible?: \"offcanvas\" | \"icon\" | \"none\";\n}) {\n const { isMobile, state, openMobile, setOpenMobile } = useSidebar();\n\n if (collapsible === \"none\") {\n return (\n <div\n data-slot=\"sidebar\"\n className={cn(\n \"flex h-full w-(--sidebar-width) flex-col bg-sidebar text-sidebar-foreground\",\n className,\n )}\n {...props}\n >\n {children}\n </div>\n );\n }\n\n if (isMobile) {\n return (\n <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>\n <SheetContent\n dir={dir}\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar\"\n data-mobile=\"true\"\n className=\"w-(--sidebar-width) bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden\"\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH_MOBILE,\n } as React.CSSProperties\n }\n side={side}\n >\n <SheetHeader className=\"sr-only\">\n <SheetTitle>Sidebar</SheetTitle>\n <SheetDescription>Displays the mobile sidebar.</SheetDescription>\n </SheetHeader>\n <div className=\"flex h-full w-full flex-col\">{children}</div>\n </SheetContent>\n </Sheet>\n );\n }\n\n return (\n <div\n className=\"group peer hidden text-sidebar-foreground md:block\"\n data-state={state}\n data-collapsible={state === \"collapsed\" ? collapsible : \"\"}\n data-variant={variant}\n data-side={side}\n data-slot=\"sidebar\"\n >\n {/* This is what handles the sidebar gap on desktop */}\n <div\n data-slot=\"sidebar-gap\"\n className={cn(\n \"relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear\",\n \"group-data-[collapsible=offcanvas]:w-0\",\n \"group-data-[side=right]:rotate-180\",\n variant === \"floating\" || variant === \"inset\"\n ? \"group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon)\",\n )}\n />\n <div\n data-slot=\"sidebar-container\"\n data-side={side}\n className={cn(\n \"fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear data-[side=left]:left-0 data-[side=left]:group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)] data-[side=right]:right-0 data-[side=right]:group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)] md:flex\",\n // Adjust the padding for floating and inset variants.\n variant === \"floating\" || variant === \"inset\"\n ? \"p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l\",\n className,\n )}\n {...props}\n >\n <div\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar-inner\"\n className=\"flex size-full flex-col bg-sidebar group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:shadow-sm group-data-[variant=floating]:ring-1 group-data-[variant=floating]:ring-sidebar-border\"\n >\n {children}\n </div>\n </div>\n </div>\n );\n}\n\nfunction SidebarTrigger({ className, onClick, ...props }: React.ComponentProps<typeof Button>) {\n const { toggleSidebar } = useSidebar();\n\n return (\n <Button\n data-sidebar=\"trigger\"\n data-slot=\"sidebar-trigger\"\n variant=\"ghost\"\n size=\"icon-sm\"\n className={cn(className)}\n onClick={(event) => {\n onClick?.(event);\n toggleSidebar();\n }}\n {...props}\n >\n <PanelLeftIcon />\n <span className=\"sr-only\">Toggle Sidebar</span>\n </Button>\n );\n}\n\nfunction SidebarRail({ className, ...props }: React.ComponentProps<\"button\">) {\n const { toggleSidebar } = useSidebar();\n\n return (\n <button\n data-sidebar=\"rail\"\n data-slot=\"sidebar-rail\"\n aria-label=\"Toggle Sidebar\"\n tabIndex={-1}\n onClick={toggleSidebar}\n title=\"Toggle Sidebar\"\n className={cn(\n \"absolute inset-y-0 z-20 hidden w-4 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:start-1/2 after:w-[2px] hover:after:bg-sidebar-border sm:flex ltr:-translate-x-1/2 rtl:-translate-x-1/2\",\n \"in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize\",\n \"[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize\",\n \"group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full hover:group-data-[collapsible=offcanvas]:bg-sidebar\",\n \"[[data-side=left][data-collapsible=offcanvas]_&]:-right-2\",\n \"[[data-side=right][data-collapsible=offcanvas]_&]:-left-2\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarInset({ className, ...props }: React.ComponentProps<\"main\">) {\n return (\n <main\n data-slot=\"sidebar-inset\"\n className={cn(\n \"relative flex w-full flex-1 flex-col bg-background md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarInput({ className, ...props }: React.ComponentProps<typeof Input>) {\n return (\n <Input\n data-slot=\"sidebar-input\"\n data-sidebar=\"input\"\n className={cn(\"h-8 w-full bg-background shadow-none\", className)}\n {...props}\n />\n );\n}\n\nfunction SidebarHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-header\"\n data-sidebar=\"header\"\n className={cn(\"flex flex-col gap-2 p-2\", className)}\n {...props}\n />\n );\n}\n\nfunction SidebarFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-footer\"\n data-sidebar=\"footer\"\n className={cn(\"flex flex-col gap-2 p-2\", className)}\n {...props}\n />\n );\n}\n\nfunction SidebarSeparator({ className, ...props }: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"sidebar-separator\"\n data-sidebar=\"separator\"\n className={cn(\"mx-2 w-auto bg-sidebar-border\", className)}\n {...props}\n />\n );\n}\n\nfunction SidebarContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-content\"\n data-sidebar=\"content\"\n className={cn(\n \"no-scrollbar flex min-h-0 flex-1 flex-col gap-0 overflow-auto group-data-[collapsible=icon]:overflow-hidden\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group\"\n data-sidebar=\"group\"\n className={cn(\"relative flex w-full min-w-0 flex-col p-2\", className)}\n {...props}\n />\n );\n}\n\nfunction SidebarGroupLabel({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"div\"> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"div\";\n\n return (\n <Comp\n data-slot=\"sidebar-group-label\"\n data-sidebar=\"group-label\"\n className={cn(\n \"flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium text-sidebar-foreground/70 ring-sidebar-ring outline-hidden transition-[margin,opacity] duration-200 ease-linear group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0 focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarGroupAction({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"button\";\n\n return (\n <Comp\n data-slot=\"sidebar-group-action\"\n data-sidebar=\"group-action\"\n className={cn(\n \"absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform group-data-[collapsible=icon]:hidden after:absolute after:-inset-2 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 md:after:hidden [&>svg]:size-4 [&>svg]:shrink-0\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarGroupContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group-content\"\n data-sidebar=\"group-content\"\n className={cn(\"w-full text-sm\", className)}\n {...props}\n />\n );\n}\n\nfunction SidebarMenu({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu\"\n data-sidebar=\"menu\"\n className={cn(\"flex w-full min-w-0 flex-col gap-0\", className)}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuItem({ className, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-item\"\n data-sidebar=\"menu-item\"\n className={cn(\"group/menu-item relative\", className)}\n {...props}\n />\n );\n}\n\nconst sidebarMenuButtonVariants = cva(\n \"peer/menu-button group/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm ring-sidebar-ring outline-hidden transition-[width,height,padding] group-has-data-[sidebar=menu-action]/menu-item:pr-8 group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-open:hover:bg-sidebar-accent data-open:hover:text-sidebar-accent-foreground data-active:bg-sidebar-accent data-active:font-medium data-active:text-sidebar-accent-foreground [&_svg]:size-4 [&_svg]:shrink-0 [&>span:last-child]:truncate\",\n {\n variants: {\n variant: {\n default: \"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n outline:\n \"bg-background shadow-[0_0_0_1px_var(--sidebar-border)] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_var(--sidebar-accent)]\",\n },\n size: {\n default: \"h-8 text-sm\",\n sm: \"h-7 text-xs\",\n lg: \"h-12 text-sm group-data-[collapsible=icon]:p-0!\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nfunction SidebarMenuButton({\n asChild = false,\n isActive = false,\n variant = \"default\",\n size = \"default\",\n tooltip,\n className,\n ...props\n}: React.ComponentProps<\"button\"> & {\n asChild?: boolean;\n isActive?: boolean;\n tooltip?: string | React.ComponentProps<typeof TooltipContent>;\n} & VariantProps<typeof sidebarMenuButtonVariants>) {\n const Comp = asChild ? Slot.Root : \"button\";\n const { isMobile, state } = useSidebar();\n\n const button = (\n <Comp\n data-slot=\"sidebar-menu-button\"\n data-sidebar=\"menu-button\"\n data-size={size}\n data-active={isActive}\n className={cn(sidebarMenuButtonVariants({ variant, size }), className)}\n {...props}\n />\n );\n\n if (!tooltip) {\n return button;\n }\n\n if (typeof tooltip === \"string\") {\n tooltip = {\n children: tooltip,\n };\n }\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent\n side=\"right\"\n align=\"center\"\n hidden={state !== \"collapsed\" || isMobile}\n {...tooltip}\n />\n </Tooltip>\n );\n}\n\nfunction SidebarMenuAction({\n className,\n asChild = false,\n showOnHover = false,\n ...props\n}: React.ComponentProps<\"button\"> & {\n asChild?: boolean;\n showOnHover?: boolean;\n}) {\n const Comp = asChild ? Slot.Root : \"button\";\n\n return (\n <Comp\n data-slot=\"sidebar-menu-action\"\n data-sidebar=\"menu-action\"\n className={cn(\n \"absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform group-data-[collapsible=icon]:hidden peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 after:absolute after:-inset-2 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 md:after:hidden [&>svg]:size-4 [&>svg]:shrink-0\",\n showOnHover &&\n \"group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 peer-data-active/menu-button:text-sidebar-accent-foreground aria-expanded:opacity-100 md:opacity-0\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuBadge({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-menu-badge\"\n data-sidebar=\"menu-badge\"\n className={cn(\n \"pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium text-sidebar-foreground tabular-nums select-none group-data-[collapsible=icon]:hidden peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 peer-data-active/menu-button:text-sidebar-accent-foreground\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuSkeleton({\n className,\n showIcon = false,\n ...props\n}: React.ComponentProps<\"div\"> & {\n showIcon?: boolean;\n}) {\n // Random width between 50 to 90%.\n const [width] = React.useState(() => {\n return `${Math.floor(Math.random() * 40) + 50}%`;\n });\n\n return (\n <div\n data-slot=\"sidebar-menu-skeleton\"\n data-sidebar=\"menu-skeleton\"\n className={cn(\"flex h-8 items-center gap-2 rounded-md px-2\", className)}\n {...props}\n >\n {showIcon && <Skeleton className=\"size-4 rounded-md\" data-sidebar=\"menu-skeleton-icon\" />}\n <Skeleton\n className=\"h-4 max-w-(--skeleton-width) flex-1\"\n data-sidebar=\"menu-skeleton-text\"\n style={\n {\n \"--skeleton-width\": width,\n } as React.CSSProperties\n }\n />\n </div>\n );\n}\n\nfunction SidebarMenuSub({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu-sub\"\n data-sidebar=\"menu-sub\"\n className={cn(\n \"mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5 group-data-[collapsible=icon]:hidden\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuSubItem({ className, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-sub-item\"\n data-sidebar=\"menu-sub-item\"\n className={cn(\"group/menu-sub-item relative\", className)}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuSubButton({\n asChild = false,\n size = \"md\",\n isActive = false,\n className,\n ...props\n}: React.ComponentProps<\"a\"> & {\n asChild?: boolean;\n size?: \"sm\" | \"md\";\n isActive?: boolean;\n}) {\n const Comp = asChild ? Slot.Root : \"a\";\n\n return (\n <Comp\n data-slot=\"sidebar-menu-sub-button\"\n data-sidebar=\"menu-sub-button\"\n data-size={size}\n data-active={isActive}\n className={cn(\n \"flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground ring-sidebar-ring outline-hidden group-data-[collapsible=icon]:hidden hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[size=md]:text-sm data-[size=sm]:text-xs data-active:bg-sidebar-accent data-active:text-sidebar-accent-foreground [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInput,\n SidebarInset,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n useSidebar,\n};\n","export const MARK_BARS = [\n { x: 3, y: 3, width: 4, height: 18 },\n { x: 7, y: 3, width: 10, height: 4 },\n { x: 7, y: 17, width: 10, height: 4 },\n { x: 17, y: 3, width: 4, height: 18 },\n { x: 0, y: 10.6, width: 3, height: 2.8 },\n { x: 21, y: 10.6, width: 3, height: 2.8 },\n];\n\nexport const RESUME_TRIANGLE = \"M10 8.4 L15.4 12 L10 15.6 Z\";\n","import { MARK_BARS, RESUME_TRIANGLE } from \"./marks-geometry\";\n\nexport function AnimatedDurablexMark({\n size = 22,\n className,\n}: {\n size?: number;\n className?: string;\n}) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n className={className ? `dx-mark ${className}` : \"dx-mark\"}\n role=\"img\"\n aria-label=\"Durablex: a run crashes, then resumes from its last checkpoint\"\n >\n <g className=\"dx-bars\">\n {MARK_BARS.map((b, i) => (\n <rect key={i} {...b} fill=\"currentColor\" />\n ))}\n </g>\n <g className=\"dx-fault\">\n {MARK_BARS.map((b, i) => (\n <rect key={i} {...b} fill=\"var(--dx-fault)\" />\n ))}\n </g>\n <g className=\"dx-resume\">\n <path d={RESUME_TRIANGLE} fill=\"var(--primary)\" />\n </g>\n </svg>\n );\n}\n","import { AnimatedDurablexMark } from \"./AnimatedDurablexMark\";\n\nexport function DurablexLogo() {\n return (\n <span className=\"text-foreground inline-flex items-center gap-2.5\">\n <AnimatedDurablexMark size={30} className=\"shrink-0\" />\n <span className=\"text-xl font-semibold tracking-tight group-data-[collapsible=icon]:hidden\">\n Durable<span className=\"text-primary\">x</span>\n </span>\n </span>\n );\n}\n","import type { LucideIcon } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport { DurablexLogo } from \"../components/DurablexLogo\";\nimport {\n Sidebar as SidebarPrimitive,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n} from \"../ui/sidebar\";\n\nexport interface NavItem {\n key: string;\n label: string;\n icon: LucideIcon;\n count?: number;\n}\n\nexport interface NavGroup {\n label: string;\n items: NavItem[];\n}\n\nexport function Sidebar({\n groups,\n active,\n onSelect,\n footer,\n}: {\n groups: NavGroup[];\n active: string;\n onSelect(key: string): void;\n footer?: ReactNode;\n}) {\n return (\n <SidebarPrimitive collapsible=\"icon\">\n <SidebarHeader>\n <div className=\"flex items-center gap-2 px-2 py-2.5\">\n <DurablexLogo />\n </div>\n </SidebarHeader>\n <SidebarContent>\n {groups.map((group) => (\n <SidebarGroup key={group.label}>\n <SidebarGroupLabel>{group.label}</SidebarGroupLabel>\n <SidebarGroupContent>\n <SidebarMenu>\n {group.items.map((item) => (\n <SidebarMenuItem key={item.key}>\n <SidebarMenuButton\n isActive={active === item.key}\n tooltip={item.label}\n onClick={() => onSelect(item.key)}\n >\n <item.icon />\n <span>{item.label}</span>\n {item.count != null && (\n <span className=\"text-muted-foreground ml-auto font-mono text-[11px] tabular-nums group-data-[collapsible=icon]:hidden\">\n {item.count}\n </span>\n )}\n </SidebarMenuButton>\n </SidebarMenuItem>\n ))}\n </SidebarMenu>\n </SidebarGroupContent>\n </SidebarGroup>\n ))}\n </SidebarContent>\n {footer && <SidebarFooter>{footer}</SidebarFooter>}\n </SidebarPrimitive>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { SidebarTrigger } from \"../ui/sidebar\";\n\nexport function Topbar({\n title,\n subtitle,\n rightSlot,\n}: {\n title: string;\n subtitle?: string;\n rightSlot?: ReactNode;\n}) {\n return (\n <header className=\"flex h-12 shrink-0 items-center gap-2 border-b px-4\">\n <SidebarTrigger />\n <h1 className=\"text-sm font-semibold tracking-tight\">{title}</h1>\n {subtitle && <span className=\"text-muted-foreground text-xs\">{subtitle}</span>}\n <span className=\"flex-1\" />\n {rightSlot}\n </header>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { SidebarInset, SidebarProvider } from \"../ui/sidebar\";\nimport { Sidebar, type NavGroup } from \"./Sidebar\";\nimport { Topbar } from \"./Topbar\";\n\nexport function AppShell({\n groups,\n active,\n onSelect,\n title,\n subtitle,\n rightSlot,\n sidebarFooter,\n children,\n}: {\n groups: NavGroup[];\n active: string;\n onSelect(key: string): void;\n title: string;\n subtitle?: string;\n rightSlot?: ReactNode;\n sidebarFooter?: ReactNode;\n children: ReactNode;\n}) {\n return (\n <SidebarProvider>\n <Sidebar groups={groups} active={active} onSelect={onSelect} footer={sidebarFooter} />\n <SidebarInset className=\"min-w-0\">\n <Topbar title={title} subtitle={subtitle} rightSlot={rightSlot} />\n {children}\n </SidebarInset>\n </SidebarProvider>\n );\n}\n","import { useCallback, useState } from \"react\";\n\n// Copy text and flip `copied` for a beat. navigator.clipboard is undefined in non-secure\n// contexts (http on a non-localhost host), so guard it rather than throwing on click.\nexport function useCopyToClipboard(resetMs = 1200) {\n const [copied, setCopied] = useState(false);\n\n const copy = useCallback(\n (text: string) => {\n void navigator.clipboard?.writeText(text).then(\n () => {\n setCopied(true);\n setTimeout(() => setCopied(false), resetMs);\n },\n () => undefined,\n );\n },\n [resetMs],\n );\n\n return { copied, copy };\n}\n","import type { StepErrorInfo } from \"@durablex/react\";\n\nexport function formatError(error: StepErrorInfo): string {\n return error.stack ? `${error.message}\\n\\n${error.stack}` : error.message;\n}\n\nexport function formatDuration(ms?: number | null): string {\n if (ms === null || ms === undefined) return \"-\";\n if (ms < 1000) return `${ms}ms`;\n const s = ms / 1000;\n if (s < 60) return `${s.toFixed(1)}s`;\n const m = s / 60;\n if (m < 60) return `${m.toFixed(1)}m`;\n return `${(m / 60).toFixed(1)}h`;\n}\n\nexport function formatTime(iso?: string | null): string {\n if (!iso) return \"-\";\n return new Date(iso).toLocaleTimeString([], { hour12: false });\n}\n\n// Time until a scheduled fire, as \"in 3m\". A non-positive delta reads as \"due\"\n// (the sweep runs on an interval, so a just-passed tick has not fired yet).\nexport function formatNextFire(iso?: string | null): string {\n if (!iso) return \"-\";\n const sec = (new Date(iso).getTime() - Date.now()) / 1000;\n if (sec <= 0) return \"due\";\n if (sec < 60) return `in ${Math.floor(sec)}s`;\n const min = sec / 60;\n if (min < 60) return `in ${Math.floor(min)}m`;\n const hr = min / 60;\n if (hr < 24) return `in ${Math.floor(hr)}h`;\n return `in ${Math.floor(hr / 24)}d`;\n}\n\nexport function formatRelative(iso?: string | null): string {\n if (!iso) return \"-\";\n const sec = Math.max(0, (Date.now() - new Date(iso).getTime()) / 1000);\n if (sec < 60) return `${Math.floor(sec)}s ago`;\n const min = sec / 60;\n if (min < 60) return `${Math.floor(min)}m ago`;\n const hr = min / 60;\n if (hr < 24) return `${Math.floor(hr)}h ago`;\n return `${Math.floor(hr / 24)}d ago`;\n}\n","import type { LogFrame, TimelineFrame } from \"@durablex/react\";\n\nexport const ROOT_SCOPE = \"@root\";\n\n// Stable empty array so a step with no logs passes the same reference every render.\nexport const NO_LOGS: LogFrame[] = [];\n\nexport interface RunLogs {\n // Step-scoped logs keyed by `${name}:${attempt}`, matching one step-attempt row.\n byStep: Map<string, LogFrame[]>;\n // Handler-level logs (scope '@root'), which belong to the run, not a step.\n root: LogFrame[];\n}\n\nexport function stepLogKey(name: string, attempt: number): string {\n return `${name}:${attempt}`;\n}\n\nexport function groupLogs(frames: TimelineFrame[]): RunLogs {\n const byStep = new Map<string, LogFrame[]>();\n const root: LogFrame[] = [];\n for (const f of frames) {\n if (f.kind !== \"log\") continue;\n if (f.scope === ROOT_SCOPE) {\n root.push(f);\n continue;\n }\n const key = stepLogKey(f.scope, f.attempt);\n const list = byStep.get(key);\n if (list) list.push(f);\n else byStep.set(key, [f]);\n }\n return { byStep, root };\n}\n","import type { Run, Step, StepStatus } from \"@durablex/react\";\n\n// 1-based ordinal of the run's current step, from the counts the runs list carries.\n// A terminal run has no live current step, so it reads as total/total.\nexport function currentStepNumber(run: Run): number {\n return run.currentStepIndex >= 0 ? run.currentStepIndex + 1 : run.stepCount;\n}\n\n// expectedStepTotals maps a workflow to the largest step count seen among its\n// finished runs - the denominator estimate for a run still discovering its steps.\n// A workflow's total isn't known up front (steps are discovered as the handler\n// executes, and can branch), so the dashboard estimates it from prior runs.\nexport function expectedStepTotals(runs: Run[]): Map<string, number> {\n const totals = new Map<string, number>();\n for (const r of runs) {\n if (!r.endedAt) continue;\n if (r.stepCount > (totals.get(r.workflowName) ?? 0)) {\n totals.set(r.workflowName, r.stepCount);\n }\n }\n return totals;\n}\n\n// The runs-table step label as \"{ix}/{total}\". A finished run shows its real\n// total; a live one uses the estimate from prior runs of the same workflow, never\n// below the steps it has already reached (so it never reads as e.g. 5/3).\nexport function stepCellLabel(run: Run, expectedTotal?: number): string {\n const ix = currentStepNumber(run);\n const total = run.endedAt ? run.stepCount : Math.max(run.stepCount, expectedTotal ?? 0);\n return `${ix}/${total}`;\n}\n\nconst FINISHED: ReadonlySet<StepStatus> = new Set([\"succeeded\", \"failed\", \"cancelled\", \"skipped\"]);\n\n// Position of the run within its step list, as \"{ix}/{total}\". The current step\n// (matched by name) anchors the index; otherwise it falls back to the count of\n// finished steps so terminal runs read as total/total.\nexport function stepProgress(run: Run, steps: Step[]): { ix: number; total: number } {\n const total = steps.length;\n if (total === 0) return { ix: 0, total: 0 };\n const cur = run.currentStepName ? steps.findIndex((s) => s.name === run.currentStepName) : -1;\n if (cur >= 0) return { ix: cur + 1, total };\n return { ix: steps.filter((s) => FINISHED.has(s.status)).length, total };\n}\n","export function Meta({\n label,\n value,\n error,\n onClick,\n title,\n}: {\n label: string;\n value: string;\n error?: boolean;\n onClick?: () => void;\n title?: string;\n}) {\n return (\n <div className=\"meta\">\n <span className=\"meta-k\">{label}</span>\n {onClick ? (\n <button\n type=\"button\"\n className=\"meta-v cursor-pointer border-0 bg-transparent p-0 text-left underline underline-offset-2\"\n title={title}\n onClick={onClick}\n >\n {value}\n </button>\n ) : (\n <span className={\"meta-v\" + (error ? \" err\" : \"\")}>{value}</span>\n )}\n </div>\n );\n}\n","export type JsonTokenKind = \"key\" | \"str\" | \"num\" | \"bool\" | \"null\" | \"punc\";\n\nexport const JSON_TOKEN_COLOR: Record<JsonTokenKind, string> = {\n key: \"var(--foreground)\",\n str: \"var(--st-succeeded-fg)\",\n num: \"var(--st-running-fg)\",\n bool: \"var(--primary)\",\n null: \"var(--muted-foreground)\",\n punc: \"color-mix(in oklch, var(--muted-foreground) 70%, transparent)\",\n};\n\nconst TOKEN =\n /\"(?:\\\\.|[^\"\\\\])*\"(\\s*:)?|\\b(?:true|false)\\b|\\bnull\\b|-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?/g;\n\nexport function tokenizeJson(src: string): { text: string; kind: JsonTokenKind }[] {\n const out: { text: string; kind: JsonTokenKind }[] = [];\n let last = 0;\n let m: RegExpExecArray | null;\n TOKEN.lastIndex = 0;\n while ((m = TOKEN.exec(src)) !== null) {\n if (m.index > last) out.push({ text: src.slice(last, m.index), kind: \"punc\" });\n const s = m[0];\n if (s[0] === '\"') {\n if (m[1]) {\n const q = s.lastIndexOf('\"') + 1;\n out.push({ text: s.slice(0, q), kind: \"key\" });\n out.push({ text: s.slice(q), kind: \"punc\" });\n } else {\n out.push({ text: s, kind: \"str\" });\n }\n } else if (s === \"true\" || s === \"false\") {\n out.push({ text: s, kind: \"bool\" });\n } else if (s === \"null\") {\n out.push({ text: s, kind: \"null\" });\n } else {\n out.push({ text: s, kind: \"num\" });\n }\n last = TOKEN.lastIndex;\n }\n if (last < src.length) out.push({ text: src.slice(last), kind: \"punc\" });\n return out;\n}\n\nexport type ParsedJson = { ok: true; value: unknown } | { ok: false; error: string };\n\nexport function parseJson(raw: string): ParsedJson {\n const text = raw.trim();\n if (text === \"\") return { ok: true, value: {} };\n try {\n return { ok: true, value: JSON.parse(text) };\n } catch {\n return { ok: false, error: \"Payload must be valid JSON\" };\n }\n}\n\nexport function highlightedJsonSpans(text: string) {\n return tokenizeJson(text).map((tok, i) => ({\n key: i,\n text: tok.text,\n color: JSON_TOKEN_COLOR[tok.kind],\n bold: tok.kind === \"bool\",\n italic: tok.kind === \"null\",\n }));\n}\n","import { useCopyToClipboard } from \"../hooks/use-copy\";\nimport { highlightedJsonSpans } from \"../lib/json-highlight\";\n\nexport function JsonBlock({ value }: { value: unknown }) {\n if (value === null || value === undefined) {\n return <p className=\"text-muted-foreground px-4 py-2.5 font-mono text-xs italic\">null</p>;\n }\n const text = JSON.stringify(value, null, 2);\n return (\n <div\n className=\"relative\"\n style={{ backgroundColor: \"color-mix(in oklch, var(--foreground) 5%, var(--card))\" }}\n >\n <CopyButton text={text} />\n <pre className=\"text-foreground max-h-72 overflow-auto px-4 py-2.5 font-mono text-[11.5px] leading-[1.7] tabular-nums\">\n {highlightedJsonSpans(text).map((tok) => (\n <span\n key={tok.key}\n style={{\n color: tok.color,\n fontWeight: tok.bold ? 500 : undefined,\n fontStyle: tok.italic ? \"italic\" : undefined,\n }}\n >\n {tok.text}\n </span>\n ))}\n </pre>\n </div>\n );\n}\n\nfunction CopyButton({ text }: { text: string }) {\n const { copied, copy } = useCopyToClipboard();\n return (\n <button\n type=\"button\"\n onClick={() => copy(text)}\n className=\"text-muted-foreground hover:text-foreground hover:bg-accent absolute top-[8px] right-[8px] border px-[7px] py-[2px] font-mono text-[9.5px] tracking-[0.05em] uppercase\"\n style={{\n backgroundColor: \"color-mix(in oklch, var(--card) 78%, transparent)\",\n backdropFilter: \"blur(3px)\",\n }}\n >\n {copied ? \"copied\" : \"copy\"}\n </button>\n );\n}\n","import type { LogFrame } from \"@durablex/react\";\nimport { formatTime } from \"../lib/format\";\n\nconst LEVEL_FG: Record<LogFrame[\"level\"], string> = {\n debug: \"var(--st-skipped-fg)\",\n info: \"var(--st-running-fg)\",\n warn: \"var(--st-waiting-fg)\",\n error: \"var(--st-failed-fg)\",\n};\n\nexport function LogList({ logs }: { logs: LogFrame[] }) {\n if (logs.length === 0) {\n return <p className=\"px-4 py-2.5 font-mono text-xs text-muted-foreground italic\">No logs.</p>;\n }\n return (\n <div\n className=\"flex max-h-72 flex-col gap-1.5 overflow-auto px-4 py-2.5 text-[12px] leading-[1.6]\"\n style={{ backgroundColor: \"color-mix(in oklch, var(--foreground) 5%, var(--card))\" }}\n >\n {logs.map((log) => {\n const fields = log.fields && Object.keys(log.fields).length > 0 ? log.fields : null;\n return (\n <div key={log.seq} className=\"flex w-max items-baseline gap-2 whitespace-nowrap\">\n <span className=\"tnum text-[11px] text-muted-foreground\">{formatTime(log.ts)}</span>\n <span\n className=\"font-medium uppercase text-[10px]\"\n style={{ color: LEVEL_FG[log.level] }}\n >\n {log.level}\n </span>\n <span>{log.message}</span>\n {fields && (\n <>\n <span className=\"text-muted-foreground\" aria-hidden>\n ·\n </span>\n <code className=\"text-[11px] text-muted-foreground\">{JSON.stringify(fields)}</code>\n </>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n","import { TriangleAlert } from \"lucide-react\";\nimport { useState } from \"react\";\nimport type { LogFrame, Run } from \"@durablex/react\";\nimport { formatError } from \"../lib/format\";\nimport { JsonBlock } from \"./JsonBlock\";\nimport { LogList } from \"./LogList\";\n\n// The run's panes: Error first (a failed run lands on it), then Input, Result, and\n// the run-level logs. Error and Result are mutually exclusive (a run either failed\n// or produced a result).\nconst PAYLOAD_TAB_LABEL = {\n error: \"Error\",\n input: \"Input\",\n result: \"Result\",\n logs: \"Logs\",\n} as const;\ntype PayloadTab = keyof typeof PAYLOAD_TAB_LABEL;\n\nfunction resultPlaceholder(status: Run[\"status\"]): string {\n if (status === \"failed\") return \"- no result (run failed)\";\n if (status === \"running\" || status === \"waiting\" || status === \"queued\") {\n return \"- pending (still running)\";\n }\n return \"null\";\n}\n\nexport function PayloadTabs({ run, logs }: { run: Run; logs: LogFrame[] }) {\n const hasResult = run.result !== null && run.result !== undefined;\n const tabs: PayloadTab[] = [];\n if (run.error) tabs.push(\"error\");\n tabs.push(\"input\", \"result\");\n if (logs.length > 0) tabs.push(\"logs\");\n const [tab, setTab] = useState<PayloadTab>(() => (run.error ? \"error\" : \"input\"));\n\n return (\n <div className=\"section\">\n <div className=\"io-tabs\">\n {tabs.map((t) => (\n <button\n key={t}\n type=\"button\"\n className=\"io-tab\"\n data-kind={t}\n data-on={tab === t ? \"1\" : \"0\"}\n onClick={() => setTab(t)}\n >\n {t === \"error\" && <TriangleAlert className=\"step-tab-ico\" />}\n {PAYLOAD_TAB_LABEL[t]}\n {t === \"result\" && !hasResult && <span className=\"io-null\">null</span>}\n </button>\n ))}\n </div>\n {tab === \"error\" && run.error ? (\n <pre className=\"errbox\">{formatError(run.error)}</pre>\n ) : tab === \"logs\" ? (\n <LogList logs={logs} />\n ) : tab === \"input\" ? (\n <JsonBlock value={run.input} />\n ) : hasResult ? (\n <JsonBlock value={run.result} />\n ) : (\n <div className=\"jsonwrap\">\n <pre className=\"json\">\n <span className=\"nul\">{resultPlaceholder(run.status)}</span>\n </pre>\n </div>\n )}\n </div>\n );\n}\n","import { cn } from \"../lib/utils\";\nimport { MARK_BARS, RESUME_TRIANGLE } from \"./marks-geometry\";\n\ntype ResumeMarkProps = {\n size?: number;\n variant?: \"run\" | \"load\";\n fault?: boolean;\n className?: string;\n title?: string;\n};\n\nexport function ResumeMark({ size = 16, variant, fault, className, title }: ResumeMarkProps) {\n return (\n <span\n className={cn(\"dxmark\", variant && `dxm-${variant}`, className)}\n style={{ width: size, height: size }}\n role={title ? \"img\" : undefined}\n aria-label={title}\n aria-hidden={title ? undefined : true}\n >\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <g className=\"dxm-bars\">\n {MARK_BARS.map((b, i) => (\n <rect key={i} {...b} fill=\"currentColor\" />\n ))}\n </g>\n {fault && (\n <g className=\"dxm-fault\">\n {MARK_BARS.map((b, i) => (\n <rect key={i} {...b} fill=\"var(--st-failed-fg)\" />\n ))}\n </g>\n )}\n <path className=\"dxm-tri\" d={RESUME_TRIANGLE} fill=\"var(--dxm-accent, var(--primary))\" />\n </svg>\n </span>\n );\n}\n","import type { RunStatus, StepStatus } from \"@durablex/react\";\n\n// \"waiting\" reads as \"in progress\" to users, so it displays as \"Running\".\nexport const STATUS_LABELS: Record<RunStatus | StepStatus, string> = {\n queued: \"Queued\",\n running: \"Running\",\n waiting: \"Running\",\n paused: \"Paused\",\n succeeded: \"Succeeded\",\n failed: \"Failed\",\n cancelled: \"Cancelled\",\n skipped: \"Skipped\",\n};\n","import type { RunStatus, StepStatus } from \"@durablex/react\";\nimport { cn } from \"../lib/utils\";\nimport { ResumeMark } from \"./ResumeMark\";\nimport { STATUS_LABELS } from \"../lib/status-label\";\n\ntype Status = RunStatus | StepStatus;\n\nconst LIVE_STATUSES: ReadonlySet<Status> = new Set([\"running\", \"waiting\"]);\n\nexport function StatusBadge({\n status,\n small,\n label,\n className,\n}: {\n status: Status;\n small?: boolean;\n label?: string;\n className?: string;\n}) {\n const live = LIVE_STATUSES.has(status);\n return (\n <span\n className={cn(\n \"inline-flex items-center gap-1.5 border border-transparent font-medium leading-none whitespace-nowrap\",\n small ? \"h-[17px] px-1.5 text-[10px]\" : \"h-[19px] px-1.5 text-[11px]\",\n status === \"skipped\" && \"border-dashed\",\n className,\n )}\n style={{\n backgroundColor: `var(--st-${status}-bg)`,\n color: `var(--st-${status}-fg)`,\n borderColor:\n status === \"skipped\"\n ? \"color-mix(in oklch, var(--st-skipped-fg) 40%, transparent)\"\n : undefined,\n }}\n >\n {live ? (\n <ResumeMark variant=\"run\" size={small ? 12 : 13} className=\"badge-mark\" />\n ) : (\n <span\n className=\"size-[6px] shrink-0 rounded-full\"\n style={{ backgroundColor: `var(--st-${status}-fg)` }}\n />\n )}\n {label ?? STATUS_LABELS[status] ?? status}\n </span>\n );\n}\n","import type { Step } from \"@durablex/react\";\nimport { formatError } from \"./format\";\n\n// A step's expandable panes: Error first when it failed, then Input, Output, and\n// the ctx.log lines it emitted. Each is shown only when the step has that content.\nexport type StepTab = \"error\" | \"input\" | \"output\" | \"logs\";\n\nexport const STEP_TAB_LABEL: Record<StepTab, string> = {\n error: \"Error\",\n input: \"Input\",\n output: \"Output\",\n logs: \"Logs\",\n};\n\nexport function stepTabs(step: Step, hasLogs: boolean): StepTab[] {\n const tabs: StepTab[] = [];\n if (step.error) tabs.push(\"error\");\n if (step.input !== null && step.input !== undefined) tabs.push(\"input\");\n if (step.output !== null && step.output !== undefined) tabs.push(\"output\");\n if (hasLogs) tabs.push(\"logs\");\n return tabs;\n}\n\nexport function stepErrorText(step: Step): string {\n return step.error ? formatError(step.error) : \"\";\n}\n\n// The step a steps view selects by default: the failed step, else the\n// running/waiting one, else the first. Shared by the flow and timeline views.\nexport function initialStepSelection(steps: Step[]): number {\n const failed = steps.findIndex((s) => s.status === \"failed\");\n if (failed >= 0) return failed;\n const active = steps.findIndex((s) => s.status === \"running\" || s.status === \"waiting\");\n return active >= 0 ? active : 0;\n}\n","import type { StepStatus } from \"@durablex/react\";\n\n// A paused run leaves its in-flight step recorded as running/waiting in the engine\n// (pause only flips the run's status), so the inspector would otherwise show a\n// \"Running\" step under a \"Paused\" run. This derives a display-only status so that\n// step reads as paused too; it never changes the stored step status.\nexport type StepDisplayStatus = StepStatus | \"paused\";\n\nconst IN_FLIGHT: ReadonlySet<StepStatus> = new Set([\"running\", \"waiting\"]);\n\nexport function stepDisplayStatus(status: StepStatus, runPaused: boolean): StepDisplayStatus {\n return runPaused && IN_FLIGHT.has(status) ? \"paused\" : status;\n}\n","import { Check, CircleDot, Clock, Loader2, Pause, X } from \"lucide-react\";\nimport type { ComponentType } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport type { StepDisplayStatus } from \"../lib/step-display\";\n\nconst GLYPH: Record<StepDisplayStatus, ComponentType<{ className?: string }>> = {\n succeeded: Check,\n failed: X,\n cancelled: X,\n running: Loader2,\n waiting: Clock,\n skipped: CircleDot,\n paused: Pause,\n};\n\nexport function StepGlyph({\n status,\n className,\n}: {\n status: StepDisplayStatus;\n className?: string;\n}) {\n const Glyph = GLYPH[status] ?? CircleDot;\n return <Glyph className={cn(className, status === \"running\" && \"animate-spin\")} />;\n}\n","import { TriangleAlert } from \"lucide-react\";\nimport type { LogFrame, Step } from \"@durablex/react\";\nimport { STEP_TAB_LABEL, stepErrorText, type StepTab } from \"../lib/step-detail\";\nimport { JsonBlock } from \"./JsonBlock\";\nimport { LogList } from \"./LogList\";\n\nexport function StepTabsView({\n step,\n logs,\n tabs,\n tab,\n onTab,\n}: {\n step: Step;\n logs: LogFrame[];\n tabs: StepTab[];\n tab: StepTab | null;\n onTab(t: StepTab): void;\n}) {\n return (\n <>\n <div className=\"step-tabs\" role=\"tablist\">\n {tabs.map((t) => (\n <button\n key={t}\n type=\"button\"\n role=\"tab\"\n aria-selected={tab === t}\n className=\"step-tab\"\n data-kind={t}\n onClick={() => onTab(t)}\n >\n {t === \"error\" && <TriangleAlert className=\"step-tab-ico\" />}\n {STEP_TAB_LABEL[t]}\n </button>\n ))}\n </div>\n <div className=\"step-pane\">\n {tab === \"error\" ? (\n <pre className=\"errbox\">{stepErrorText(step)}</pre>\n ) : tab === \"logs\" ? (\n <LogList logs={logs} />\n ) : tab === \"input\" ? (\n <JsonBlock value={step.input} />\n ) : (\n <JsonBlock value={step.output} />\n )}\n </div>\n </>\n );\n}\n","import { type ReactNode, useState } from \"react\";\nimport type { LogFrame, Step } from \"@durablex/react\";\nimport { formatDuration } from \"../lib/format\";\nimport { stepTabs, type StepTab } from \"../lib/step-detail\";\nimport { stepDisplayStatus } from \"../lib/step-display\";\nimport { StepTabsView } from \"./StepTabsView\";\n\n// Keyed by selection in the parent so the tab resets on step change without a\n// setState-in-effect.\nexport function StepInspector({\n step,\n logs,\n index,\n total,\n runPaused,\n renderStepRetry,\n}: {\n step: Step;\n logs: LogFrame[];\n index: number;\n total: number;\n runPaused: boolean;\n renderStepRetry?: (stepName: string) => ReactNode;\n}) {\n const tabs = stepTabs(step, logs.length > 0);\n const [tab, setTab] = useState<StepTab | null>(tabs[0] ?? null);\n return (\n <div className=\"flow-inspect\">\n <div className=\"fi-head\">\n <span className=\"fi-dot\" data-status={stepDisplayStatus(step.status, runPaused)} />\n <span className=\"fi-name\">{step.name}</span>\n <span className=\"fi-meta\">\n step {index + 1}/{total} · {formatDuration(step.durationMs)}\n </span>\n {renderStepRetry?.(step.name)}\n </div>\n {tabs.length > 0 ? (\n <StepTabsView step={step} logs={logs} tabs={tabs} tab={tab} onTab={setTab} />\n ) : (\n <div className=\"fi-empty\">No output, error, or logs recorded for this step.</div>\n )}\n </div>\n );\n}\n","import { ChevronRight, TriangleAlert } from \"lucide-react\";\nimport { Fragment, type ReactNode, useState } from \"react\";\nimport type { Step } from \"@durablex/react\";\nimport { formatDuration } from \"../lib/format\";\nimport { NO_LOGS, type RunLogs, stepLogKey } from \"../lib/run-logs\";\nimport { STATUS_LABELS } from \"../lib/status-label\";\nimport { initialStepSelection } from \"../lib/step-detail\";\nimport { stepDisplayStatus } from \"../lib/step-display\";\nimport { StepGlyph } from \"./StepGlyph\";\nimport { StepInspector } from \"./StepInspector\";\n\nfunction FlowNode({\n step,\n selected,\n runPaused,\n onSelect,\n}: {\n step: Step;\n selected: boolean;\n runPaused: boolean;\n onSelect(): void;\n}) {\n const display = stepDisplayStatus(step.status, runPaused);\n return (\n <button\n type=\"button\"\n className={\"flow-node focusable\" + (selected ? \" sel\" : \"\")}\n data-status={display}\n aria-pressed={selected}\n onClick={onSelect}\n >\n <span className=\"fn-rail\" />\n <span className=\"fn-node\">\n <StepGlyph status={display} className=\"fn-gly\" />\n </span>\n <span className=\"fn-name\">{step.name}</span>\n {step.attempt > 1 && <span className=\"fn-att\">×{step.attempt}</span>}\n {display !== \"succeeded\" && (\n <span className=\"fn-status\">{STATUS_LABELS[display] ?? display}</span>\n )}\n {step.error && <TriangleAlert className=\"fn-errflag\" />}\n <span className=\"fn-dur\">{formatDuration(step.durationMs)}</span>\n </button>\n );\n}\n\nexport function StepFlow({\n steps,\n workflowName,\n runPaused,\n logs,\n renderStepRetry,\n}: {\n steps: Step[];\n workflowName: string;\n runPaused: boolean;\n logs: RunLogs;\n renderStepRetry?: (stepName: string) => ReactNode;\n}) {\n const [sel, setSel] = useState(() => initialStepSelection(steps));\n const step = steps[sel] ?? steps[0];\n if (!step) return null;\n\n return (\n <div className=\"stepflow\">\n <div className=\"flow-canvas\">\n <div className=\"flow-trigger\">\n <span className=\"flow-trigger-dot\" />\n <span>trigger</span>\n <span className=\"flow-trigger-wf\">{workflowName}</span>\n </div>\n {steps.map((s, i) => {\n const prev = steps[i - 1];\n return (\n <Fragment key={`${s.index}-${s.attempt}`}>\n <div\n className=\"flow-edge\"\n data-status={prev ? prev.status : \"trigger\"}\n aria-hidden=\"true\"\n >\n <span className=\"fe-line\" />\n <ChevronRight className=\"fe-arrow\" />\n </div>\n <FlowNode\n step={s}\n selected={i === sel}\n runPaused={runPaused}\n onSelect={() => setSel(i)}\n />\n </Fragment>\n );\n })}\n </div>\n <StepInspector\n key={sel}\n step={step}\n logs={logs.byStep.get(stepLogKey(step.name, step.attempt)) ?? NO_LOGS}\n index={sel}\n total={steps.length}\n runPaused={runPaused}\n renderStepRetry={renderStepRetry}\n />\n </div>\n );\n}\n","import { ChevronRight } from \"lucide-react\";\nimport { type ReactNode, useState } from \"react\";\nimport type { LogFrame, Step } from \"@durablex/react\";\nimport { formatDuration } from \"../lib/format\";\nimport { STATUS_LABELS } from \"../lib/status-label\";\nimport { stepTabs, type StepTab } from \"../lib/step-detail\";\nimport { stepDisplayStatus } from \"../lib/step-display\";\nimport { StepGlyph } from \"./StepGlyph\";\nimport { StepTabsView } from \"./StepTabsView\";\n\nexport function StepRow({\n step,\n index,\n current,\n runPaused,\n logs,\n renderStepRetry,\n}: {\n step: Step;\n index: number;\n current: boolean;\n runPaused: boolean;\n logs: LogFrame[];\n renderStepRetry?: (stepName: string) => ReactNode;\n}) {\n const tabs = stepTabs(step, logs.length > 0);\n const retry = renderStepRetry?.(step.name);\n const expandable = tabs.length > 0 || retry != null;\n const [open, setOpen] = useState(step.status === \"failed\");\n const [tab, setTab] = useState<StepTab | null>(tabs[0] ?? null);\n const display = stepDisplayStatus(step.status, runPaused);\n\n return (\n <div\n className={\"step\" + (open ? \" open\" : \"\")}\n data-status={display}\n data-current={current ? \"1\" : undefined}\n >\n <button\n type=\"button\"\n className={\"step-row focusable\" + (expandable ? \"\" : \" static\")}\n aria-expanded={expandable ? open : undefined}\n onClick={() => expandable && setOpen(!open)}\n >\n <span className=\"step-node\">\n <StepGlyph status={display} className=\"step-gly\" />\n </span>\n <span className=\"step-ix\">{index}</span>\n <span className=\"step-name\">{step.name}</span>\n <span className=\"step-meta\">\n {display !== \"succeeded\" && (\n <span className=\"step-status\">{STATUS_LABELS[display] ?? display}</span>\n )}\n {step.attempt > 1 && <span className=\"step-att\">×{step.attempt}</span>}\n <span className=\"step-dur\">{formatDuration(step.durationMs)}</span>\n {expandable ? <ChevronRight className=\"step-chev\" /> : <span className=\"step-chev-sp\" />}\n </span>\n </button>\n {open && expandable && (\n <div className=\"step-body\">\n {tabs.length > 0 && (\n <StepTabsView step={step} logs={logs} tabs={tabs} tab={tab} onTab={setTab} />\n )}\n {retry && <div className=\"step-actions\">{retry}</div>}\n </div>\n )}\n </div>\n );\n}\n","import type { Step } from \"@durablex/react\";\n\nexport interface TimelineLane {\n step: Step;\n // Percentage offsets along the run's span; leftPct is null when the step never\n // started (queued/skipped), so the view renders a placeholder instead of a bar.\n leftPct: number | null;\n widthPct: number;\n}\n\nexport interface TimelineLayout {\n lanes: TimelineLane[];\n totalMs: number;\n}\n\n// A bar narrower than this is widened to stay visible (a sub-millisecond step on a\n// multi-second span would otherwise render as a hairline).\nconst MIN_BAR_PCT = 1.5;\n\n// buildTimelineLayout places each step on a shared axis running from the earliest\n// step start to the latest end. An unfinished step (running/waiting) extends to\n// `now`, so its bar grows until it completes.\nexport function buildTimelineLayout(steps: Step[], now: number): TimelineLayout {\n // Parse each step's timestamps once; a not-started step has start === null and\n // does not extend the axis (its placeholder bar carries no span).\n const spans = steps.map((step) => ({\n step,\n start: step.startedAt ? Date.parse(step.startedAt) : null,\n end: step.endedAt ? Date.parse(step.endedAt) : now,\n }));\n\n let min = Infinity;\n let max = 0;\n for (const s of spans) {\n if (s.start === null) continue;\n if (s.start < min) min = s.start;\n if (s.end > max) max = s.end;\n }\n if (min === Infinity) min = 0;\n const totalMs = Math.max(max - min, 1);\n\n const lanes = spans.map<TimelineLane>(({ step, start, end }) => {\n if (start === null) return { step, leftPct: null, widthPct: 0 };\n const leftPct = ((start - min) / totalMs) * 100;\n const widthPct = Math.max(((end - start) / totalMs) * 100, MIN_BAR_PCT);\n return { step, leftPct, widthPct };\n });\n\n return { lanes, totalMs };\n}\n","import { type ReactNode, useEffect, useMemo, useState } from \"react\";\nimport type { Step } from \"@durablex/react\";\nimport { formatDuration } from \"../lib/format\";\nimport { NO_LOGS, type RunLogs, stepLogKey } from \"../lib/run-logs\";\nimport { initialStepSelection } from \"../lib/step-detail\";\nimport { stepDisplayStatus } from \"../lib/step-display\";\nimport { buildTimelineLayout } from \"../lib/step-timeline\";\nimport { StepInspector } from \"./StepInspector\";\n\nexport function StepTimeline({\n steps,\n runPaused,\n logs,\n renderStepRetry,\n}: {\n steps: Step[];\n runPaused: boolean;\n logs: RunLogs;\n renderStepRetry?: (stepName: string) => ReactNode;\n}) {\n const [sel, setSel] = useState(() => initialStepSelection(steps));\n // An unfinished step's bar extends to \"now\"; tick it while any step is in\n // flight so the bar grows, and leave it frozen for a terminal or paused run.\n const ticking = !runPaused && steps.some((s) => s.status === \"running\" || s.status === \"waiting\");\n const [now, setNow] = useState(() => Date.now());\n useEffect(() => {\n if (!ticking) return;\n const id = setInterval(() => setNow(Date.now()), 1000);\n return () => clearInterval(id);\n }, [ticking]);\n\n const layout = useMemo(() => buildTimelineLayout(steps, now), [steps, now]);\n const step = steps[sel] ?? steps[0];\n if (!step) return null;\n\n // Axis ticks are cumulative offsets from the run's start, so every label carries a\n // leading \"+\" (the first reads \"+0ms\"), keeping the offset convention uniform.\n const ticks = [0, 0.25, 0.5, 0.75, 1].map(\n (f) => `+${formatDuration(Math.round(layout.totalMs * f))}`,\n );\n\n return (\n <div className=\"steptl\">\n <div className=\"tl-canvas\">\n <div className=\"tl-axis\" aria-hidden=\"true\">\n <span className=\"tl-axis-scale\">\n {ticks.map((label, i) => (\n <span key={i}>{label}</span>\n ))}\n </span>\n </div>\n {layout.lanes.map((lane, i) => (\n <button\n key={`${lane.step.index}-${lane.step.attempt}`}\n type=\"button\"\n className={\"tl-row focusable\" + (i === sel ? \" sel\" : \"\")}\n aria-pressed={i === sel}\n onClick={() => setSel(i)}\n >\n <span className=\"tl-label\">{lane.step.name}</span>\n <span className=\"tl-track\">\n {lane.leftPct === null ? (\n <span className=\"tl-skip\">not started</span>\n ) : (\n <span\n className=\"tl-bar\"\n data-status={stepDisplayStatus(lane.step.status, runPaused)}\n style={{ left: `${lane.leftPct}%`, width: `${lane.widthPct}%` }}\n />\n )}\n </span>\n <span className=\"tl-dur tnum\">{formatDuration(lane.step.durationMs)}</span>\n </button>\n ))}\n </div>\n <StepInspector\n key={sel}\n step={step}\n logs={logs.byStep.get(stepLogKey(step.name, step.attempt)) ?? NO_LOGS}\n index={sel}\n total={steps.length}\n runPaused={runPaused}\n renderStepRetry={renderStepRetry}\n />\n </div>\n );\n}\n","import { BarChartHorizontalBig, Check, Copy, Loader2, Workflow, X } from \"lucide-react\";\nimport { type ReactNode, useMemo, useState } from \"react\";\nimport {\n ACTIVE_STATUSES,\n type Run,\n type Step,\n TERMINAL_STATUSES,\n useRun,\n useRunStats,\n useRunStream,\n useRunSteps,\n useWorkflows,\n} from \"@durablex/react\";\nimport { useCopyToClipboard } from \"../hooks/use-copy\";\nimport { formatDuration, formatNextFire, formatTime } from \"../lib/format\";\nimport { groupLogs, NO_LOGS, type RunLogs, stepLogKey } from \"../lib/run-logs\";\nimport { stepProgress } from \"../lib/run-progress\";\nimport { Meta } from \"./Meta\";\nimport { PayloadTabs } from \"./PayloadTabs\";\nimport { StatusBadge } from \"./StatusBadge\";\nimport { StepFlow } from \"./StepFlow\";\nimport { StepRow } from \"./StepRow\";\nimport { StepTimeline } from \"./StepTimeline\";\n\ntype StepsView = \"list\" | \"flow\" | \"timeline\";\n\nexport interface RunInspectorProps {\n runId: string;\n onClose(): void;\n onFilterByEvent?: (eventId: string, eventName?: string) => void;\n onOpenRun?: (runId: string) => void;\n onShowReplays?: (runId: string) => void;\n // Control actions stay in the consumer; the kit feeds each slot the data it needs.\n // renderStepRetry is offered only on a terminal run, so the consumer never gates it.\n renderActions?: (run: Run) => ReactNode;\n renderControlHistory?: (runId: string) => ReactNode;\n renderStepRetry?: (runId: string, stepName: string) => ReactNode;\n}\n\nexport function RunInspector({\n runId,\n onClose,\n onFilterByEvent,\n onOpenRun,\n onShowReplays,\n renderActions,\n renderControlHistory,\n renderStepRetry,\n}: RunInspectorProps) {\n const run = useRun(runId);\n const status = run.data?.status;\n const isActive = status !== undefined && ACTIVE_STATUSES.has(status);\n const isPaused = status === \"paused\";\n const retryRunId = status !== undefined && TERMINAL_STATUSES.has(status) ? runId : undefined;\n const steps = useRunSteps(runId, isActive);\n const frames = useRunStream(runId);\n const logs = useMemo(() => groupLogs(frames), [frames]);\n const { data: workflows } = useWorkflows();\n const replayCount = useRunStats({ replayOf: runId }, { poll: false }).data?.total ?? 0;\n const [view, setView] = useState<StepsView>(\"list\");\n\n const stepRetry =\n retryRunId && renderStepRetry\n ? (stepName: string) => renderStepRetry(retryRunId, stepName)\n : undefined;\n\n if (run.isLoading) {\n return (\n <div className=\"run-panel\">\n <div className=\"steps-loading\">\n <Loader2 className=\"size-4 animate-spin\" />\n </div>\n </div>\n );\n }\n\n if (run.isError || !run.data) {\n return (\n <div className=\"run-panel\">\n <div className=\"fi-empty\">\n {run.error instanceof Error ? run.error.message : \"Run not found.\"}\n </div>\n </div>\n );\n }\n\n const r = run.data;\n const rows = steps.data ?? [];\n const progress = stepProgress(r, rows);\n const wf = workflows?.find((w) => w.name === r.workflowName && w.app === r.app);\n const scheduled = r.triggerKind === \"cron\";\n const sourceEventId = r.eventId;\n const replayOf = r.replayOf;\n const nextFire = scheduled ? wf?.schedules?.[0]?.nextFireAt : undefined;\n\n return (\n <div className=\"run-panel\">\n <div className=\"panel-head\">\n <div className=\"ph-top\">\n <h2>\n <span className=\"h2-name\">{r.workflowName}</span>\n </h2>\n <div className=\"ph-actions\">\n {renderActions?.(r)}\n <button\n type=\"button\"\n className=\"iconbtn focusable\"\n aria-label=\"Close\"\n onClick={onClose}\n >\n <X />\n </button>\n </div>\n </div>\n <div className=\"ph-status\">\n <StatusBadge status={r.status} />\n <span className=\"runid\">\n <span className=\"runid-text\">{r.id}</span>\n <CopyId id={r.id} />\n </span>\n </div>\n </div>\n\n <div className=\"panel-body\">\n <div className=\"metagrid\">\n <Meta label=\"Run id\" value={r.id} />\n <Meta label=\"App\" value={r.app} />\n {r.executedBy && <Meta label=\"Runner\" value={r.executedBy} />}\n <Meta label=\"Started\" value={formatTime(r.startedAt)} />\n <Meta label=\"Duration\" value={formatDuration(r.durationMs)} />\n <Meta label=\"Step\" value={`${progress.ix}/${progress.total}`} />\n <Meta label=\"Attempt\" value={String(r.attempt)} />\n {sourceEventId ? (\n <Meta\n label=\"Trigger\"\n value={r.eventName ?? \"event\"}\n title=\"Show all runs from this event\"\n onClick={() => onFilterByEvent?.(sourceEventId, r.eventName)}\n />\n ) : (\n <Meta label=\"Trigger\" value={scheduled ? \"Scheduled (cron)\" : \"Event\"} />\n )}\n {nextFire && <Meta label=\"Next fire\" value={formatNextFire(nextFire)} />}\n {replayOf && (\n <Meta\n label=\"Replay of\"\n value={replayOf}\n title=\"Open the run this was replayed from\"\n onClick={() => onOpenRun?.(replayOf)}\n />\n )}\n {replayCount > 0 && (\n <Meta\n label=\"Replayed into\"\n value={`${replayCount} run${replayCount === 1 ? \"\" : \"s\"}`}\n title=\"Show the runs replayed from this one\"\n onClick={() => onShowReplays?.(r.id)}\n />\n )}\n <Meta label=\"Errors\" value={String(r.errorCount)} error={r.errorCount > 0} />\n <Meta label=\"Ended\" value={formatTime(r.endedAt)} />\n </div>\n\n <PayloadTabs run={r} logs={logs.root} />\n\n {renderControlHistory?.(r.id)}\n\n <div className=\"steps-head\">\n <span className=\"sec-title\">Steps</span>\n <span className=\"steps-prog tnum\">\n {progress.ix}\n <span className=\"sp-sep\">/</span>\n {progress.total}\n </span>\n <div className=\"steps-seg\" role=\"tablist\">\n <button\n type=\"button\"\n className=\"seg-btn\"\n role=\"tab\"\n aria-selected={view === \"list\"}\n onClick={() => setView(\"list\")}\n >\n List\n </button>\n <button\n type=\"button\"\n className=\"seg-btn\"\n role=\"tab\"\n aria-selected={view === \"flow\"}\n onClick={() => setView(\"flow\")}\n >\n <Workflow className=\"seg-ico\" />\n Flow\n </button>\n <button\n type=\"button\"\n className=\"seg-btn\"\n role=\"tab\"\n aria-selected={view === \"timeline\"}\n onClick={() => setView(\"timeline\")}\n >\n <BarChartHorizontalBig className=\"seg-ico\" />\n Timeline\n </button>\n </div>\n </div>\n\n <RunStepsPanel\n loading={steps.isLoading}\n steps={rows}\n view={view}\n runPaused={isPaused}\n logs={logs}\n workflowName={r.workflowName}\n runId={r.id}\n renderStepRetry={stepRetry}\n />\n </div>\n </div>\n );\n}\n\nfunction RunStepsPanel({\n loading,\n steps,\n view,\n runPaused,\n logs,\n workflowName,\n runId,\n renderStepRetry,\n}: {\n loading: boolean;\n steps: Step[];\n view: StepsView;\n runPaused: boolean;\n logs: RunLogs;\n workflowName: string;\n runId: string;\n renderStepRetry?: (stepName: string) => ReactNode;\n}) {\n if (loading) {\n return (\n <div className=\"steps-loading\">\n <Loader2 className=\"size-3.5 animate-spin\" />\n </div>\n );\n }\n if (steps.length === 0) return <div className=\"steps-empty\">No steps recorded yet.</div>;\n if (view === \"flow\") {\n return (\n <StepFlow\n key={runId}\n steps={steps}\n workflowName={workflowName}\n runPaused={runPaused}\n logs={logs}\n renderStepRetry={renderStepRetry}\n />\n );\n }\n if (view === \"timeline\") {\n return (\n <StepTimeline\n key={runId}\n steps={steps}\n runPaused={runPaused}\n logs={logs}\n renderStepRetry={renderStepRetry}\n />\n );\n }\n return (\n <div className=\"steplist\">\n {steps.map((s) => (\n <StepRow\n key={`${s.index}-${s.attempt}`}\n step={s}\n index={s.index + 1}\n current={s.status === \"running\" || s.status === \"waiting\"}\n runPaused={runPaused}\n logs={logs.byStep.get(stepLogKey(s.name, s.attempt)) ?? NO_LOGS}\n renderStepRetry={renderStepRetry}\n />\n ))}\n </div>\n );\n}\n\nfunction CopyId({ id }: { id: string }) {\n const { copied, copy } = useCopyToClipboard();\n return (\n <button type=\"button\" className=\"copy\" title=\"Copy run id\" onClick={() => copy(id)}>\n {copied ? <Check className=\"size-3\" /> : <Copy className=\"size-3\" />}\n </button>\n );\n}\n","import { useState } from \"react\";\n\nconst CONFIRM_MS = 3000;\n\n// Two-click confirm for a destructive or bulk action: the first trigger arms and\n// returns; a second trigger within the window runs the action. Auto-disarms after.\nexport function useConfirmAction(action: () => void, ms = CONFIRM_MS) {\n const [confirming, setConfirming] = useState(false);\n const trigger = () => {\n if (!confirming) {\n setConfirming(true);\n setTimeout(() => setConfirming(false), ms);\n return;\n }\n setConfirming(false);\n action();\n };\n return { confirming, trigger };\n}\n","import { Loader2, X } from \"lucide-react\";\nimport { useCancelRun } from \"@durablex/react\";\nimport { useConfirmAction } from \"../hooks/use-confirm-action\";\n\n// Cancel is irreversible, so it takes a two-click confirm: the first click arms,\n// the second within the window cancels.\nexport function RunCancelButton({ id }: { id: string }) {\n const cancel = useCancelRun();\n const { confirming, trigger } = useConfirmAction(() => cancel.mutate(id));\n\n return (\n <button\n type=\"button\"\n className=\"btn focusable\"\n style={{ color: \"var(--st-failed-fg)\" }}\n disabled={cancel.isPending}\n onClick={trigger}\n >\n {cancel.isPending ? <Loader2 className=\"animate-spin\" /> : <X />}{\" \"}\n {cancel.isPending ? \"Cancelling\" : confirming ? \"Confirm cancel\" : \"Cancel\"}\n </button>\n );\n}\n","import { Loader2, Pause, Play } from \"lucide-react\";\nimport { usePauseRun, useResumeRun, type RunStatus } from \"@durablex/react\";\n\n// Reversible and cheap, so unlike Cancel these fire on a single click with no confirm.\nexport function RunPauseButton({ id, status }: { id: string; status: RunStatus }) {\n const pause = usePauseRun();\n const resume = useResumeRun();\n\n if (status === \"paused\") {\n return (\n <button\n type=\"button\"\n className=\"btn focusable\"\n title=\"Resume - re-queues the run; it continues from the next step.\"\n disabled={resume.isPending}\n onClick={() => resume.mutate(id)}\n >\n {resume.isPending ? <Loader2 className=\"animate-spin\" /> : <Play />} Resume\n </button>\n );\n }\n\n return (\n <button\n type=\"button\"\n className=\"btn focusable\"\n title=\"Pause - halts the run after the current step finishes.\"\n disabled={pause.isPending}\n onClick={() => pause.mutate(id)}\n >\n {pause.isPending ? <Loader2 className=\"animate-spin\" /> : <Pause />} Pause\n </button>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Dialog as DialogPrimitive } from \"radix-ui\";\n\nimport { cn } from \"../lib/utils\";\nimport { Button } from \"./button\";\nimport { XIcon } from \"lucide-react\";\n\nfunction Dialog({ ...props }: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />;\n}\n\nfunction DialogTrigger({ ...props }: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />;\n}\n\nfunction DialogPortal({ ...props }: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />;\n}\n\nfunction DialogClose({ ...props }: React.ComponentProps<typeof DialogPrimitive.Close>) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />;\n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n return (\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n className={cn(\n \"fixed inset-0 isolate z-50 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction DialogContent({\n className,\n children,\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\n showCloseButton?: boolean;\n}) {\n return (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n data-slot=\"dialog-content\"\n className={cn(\n \"fixed top-1/2 left-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-4 rounded-xl bg-popover p-4 text-sm text-popover-foreground ring-1 ring-foreground/10 duration-100 outline-none sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className,\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close data-slot=\"dialog-close\" asChild>\n <Button variant=\"ghost\" className=\"absolute top-2 right-2\" size=\"icon-sm\">\n <XIcon />\n <span className=\"sr-only\">Close</span>\n </Button>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPortal>\n );\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div data-slot=\"dialog-header\" className={cn(\"flex flex-col gap-2\", className)} {...props} />\n );\n}\n\nfunction DialogFooter({\n className,\n showCloseButton = false,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n showCloseButton?: boolean;\n}) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn(\n \"-mx-4 -mb-4 flex flex-col-reverse gap-2 rounded-b-xl border-t bg-muted/50 p-4 sm:flex-row sm:justify-end\",\n className,\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close asChild>\n <Button variant=\"outline\">Close</Button>\n </DialogPrimitive.Close>\n )}\n </div>\n );\n}\n\nfunction DialogTitle({ className, ...props }: React.ComponentProps<typeof DialogPrimitive.Title>) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n className={cn(\"font-heading text-base leading-none font-medium\", className)}\n {...props}\n />\n );\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n className={cn(\n \"text-sm text-muted-foreground *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n};\n","import { useRef, type UIEvent } from \"react\";\nimport { highlightedJsonSpans } from \"../lib/json-highlight\";\n\n// A textarea overlaid on a syntax-highlighted <pre>: the textarea's own text is\n// transparent (only its caret/selection show) so the highlighted layer reads\n// through. Both layers share identical font metrics and padding so the glyphs line\n// up; the textarea drives scrolling and the pre is scroll-synced behind it.\nconst SURFACE = \"whitespace-pre-wrap break-words px-2.5 py-2 font-mono text-xs leading-[1.6]\";\n\nexport function JsonEditor({\n value,\n onChange,\n invalid = false,\n minHeight = 150,\n ariaLabel = \"JSON payload\",\n}: {\n value: string;\n onChange: (next: string) => void;\n invalid?: boolean;\n minHeight?: number;\n ariaLabel?: string;\n}) {\n const preRef = useRef<HTMLPreElement>(null);\n\n const syncScroll = (e: UIEvent<HTMLTextAreaElement>) => {\n const pre = preRef.current;\n if (!pre) return;\n pre.scrollTop = e.currentTarget.scrollTop;\n pre.scrollLeft = e.currentTarget.scrollLeft;\n };\n\n const format = () => {\n try {\n onChange(JSON.stringify(JSON.parse(value), null, 2));\n } catch {\n // Invalid JSON has nothing to format; the invalid border already signals it.\n }\n };\n\n return (\n <div\n data-invalid={invalid}\n className=\"relative overflow-hidden rounded-lg border border-input transition-colors focus-within:border-ring focus-within:ring-3 focus-within:ring-ring/50 data-[invalid=true]:border-destructive data-[invalid=true]:ring-3 data-[invalid=true]:ring-destructive/20\"\n style={{ backgroundColor: \"color-mix(in oklch, var(--foreground) 4%, var(--card))\" }}\n >\n <button\n type=\"button\"\n onClick={format}\n className=\"text-muted-foreground hover:text-foreground hover:bg-accent absolute top-[6px] right-[6px] z-10 border px-[7px] py-[2px] font-mono text-[9.5px] tracking-[0.05em] uppercase\"\n style={{\n backgroundColor: \"color-mix(in oklch, var(--card) 78%, transparent)\",\n backdropFilter: \"blur(3px)\",\n }}\n >\n format\n </button>\n <pre\n ref={preRef}\n aria-hidden\n className={`text-foreground pointer-events-none m-0 overflow-hidden ${SURFACE}`}\n style={{ minHeight, maxHeight: 320 }}\n >\n {highlightedJsonSpans(value).map((tok) => (\n <span\n key={tok.key}\n style={{\n color: tok.color,\n fontWeight: tok.bold ? 500 : undefined,\n fontStyle: tok.italic ? \"italic\" : undefined,\n }}\n >\n {tok.text}\n </span>\n ))}\n {\"\\n\"}\n </pre>\n <textarea\n aria-label={ariaLabel}\n aria-invalid={invalid}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onScroll={syncScroll}\n spellCheck={false}\n autoCapitalize=\"off\"\n autoCorrect=\"off\"\n className={`absolute inset-0 resize-none overflow-auto bg-transparent text-transparent outline-none ${SURFACE}`}\n style={{ caretColor: \"var(--foreground)\" }}\n />\n </div>\n );\n}\n","import { useMemo, useState } from \"react\";\nimport { toast } from \"sonner\";\nimport { useReplayRun, type Run } from \"@durablex/react\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"../ui/dialog\";\nimport { Button } from \"../ui/button\";\nimport { parseJson } from \"../lib/json-highlight\";\nimport { JsonEditor } from \"./JsonEditor\";\n\nexport function ReplayRunDialog({\n run,\n open,\n onOpenChange,\n onOpenRun,\n}: {\n run: Run;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onOpenRun?: (runId: string) => void;\n}) {\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-md\">\n {open && (\n <ReplayForm\n key={run.id}\n run={run}\n onOpenRun={onOpenRun}\n onClose={() => onOpenChange(false)}\n />\n )}\n </DialogContent>\n </Dialog>\n );\n}\n\nfunction ReplayForm({\n run,\n onOpenRun,\n onClose,\n}: {\n run: Run;\n onOpenRun?: (runId: string) => void;\n onClose: () => void;\n}) {\n const original = useMemo(() => JSON.stringify(run.input ?? {}, null, 2), [run.input]);\n const [payload, setPayload] = useState(original);\n const replay = useReplayRun();\n\n const parsed = useMemo(() => parseJson(payload), [payload]);\n const canSubmit = parsed.ok && !replay.isPending;\n\n function submit() {\n if (!parsed.ok) return;\n // Send an override only when the payload actually changed, so an unedited\n // replay records as a plain replay rather than an edited-payload one.\n const edited = JSON.stringify(parsed.value) !== JSON.stringify(run.input ?? {});\n replay.mutate(\n { runId: run.id, input: edited ? parsed.value : undefined },\n {\n onSuccess: (forked) => {\n toast.success(\"Replay started\", {\n action: onOpenRun\n ? { label: \"View run\", onClick: () => onOpenRun(forked.id) }\n : undefined,\n });\n onClose();\n },\n },\n );\n }\n\n return (\n <>\n <DialogHeader>\n <DialogTitle>Replay {run.workflowName}</DialogTitle>\n <DialogDescription>\n Forks a new run from this input. The original run stays as history.\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"flex flex-col gap-1.5\">\n <span className=\"text-xs font-medium\">Input</span>\n <JsonEditor\n value={payload}\n onChange={setPayload}\n invalid={!parsed.ok}\n ariaLabel=\"Replay input\"\n />\n {!parsed.ok ? <span className=\"text-xs text-destructive\">{parsed.error}</span> : null}\n </div>\n\n {replay.isError ? (\n <span className=\"text-xs text-destructive\">\n Could not replay: {replay.error instanceof Error ? replay.error.message : \"unknown error\"}\n </span>\n ) : null}\n\n <DialogFooter showCloseButton>\n <Button disabled={!canSubmit} onClick={submit}>\n {replay.isPending ? \"Replaying...\" : \"Replay\"}\n </Button>\n </DialogFooter>\n </>\n );\n}\n","import { RotateCcw } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { ACTIVE_STATUSES, type Run } from \"@durablex/react\";\nimport { RunCancelButton } from \"./RunCancelButton\";\nimport { RunPauseButton } from \"./RunPauseButton\";\nimport { ReplayRunDialog } from \"./ReplayRunDialog\";\n\n// The run inspector's header controls: a live run can be paused/cancelled, a\n// terminal run replayed. onOpenRun is the navigation the replay toast uses to\n// jump to the forked run.\nexport function RunInspectorActions({\n run,\n onOpenRun,\n}: {\n run: Run;\n onOpenRun?: (runId: string) => void;\n}) {\n const isLive = ACTIVE_STATUSES.has(run.status) || run.status === \"paused\";\n if (isLive) {\n return (\n <>\n <RunPauseButton id={run.id} status={run.status} />\n <RunCancelButton id={run.id} />\n </>\n );\n }\n return <ReplayButton run={run} onOpenRun={onOpenRun} />;\n}\n\nfunction ReplayButton({ run, onOpenRun }: { run: Run; onOpenRun?: (runId: string) => void }) {\n const [open, setOpen] = useState(false);\n return (\n <>\n <button type=\"button\" className=\"btn focusable\" onClick={() => setOpen(true)}>\n <RotateCcw /> Replay\n </button>\n <ReplayRunDialog run={run} open={open} onOpenChange={setOpen} onOpenRun={onOpenRun} />\n </>\n );\n}\n","import * as ResizablePrimitive from \"react-resizable-panels\";\n\nimport { cn } from \"../lib/utils\";\n\nfunction ResizablePanelGroup({ className, ...props }: ResizablePrimitive.GroupProps) {\n return (\n <ResizablePrimitive.Group\n data-slot=\"resizable-panel-group\"\n className={cn(\"flex h-full w-full aria-[orientation=vertical]:flex-col\", className)}\n {...props}\n />\n );\n}\n\nfunction ResizablePanel({ ...props }: ResizablePrimitive.PanelProps) {\n return <ResizablePrimitive.Panel data-slot=\"resizable-panel\" {...props} />;\n}\n\nfunction ResizableHandle({\n withHandle,\n className,\n ...props\n}: ResizablePrimitive.SeparatorProps & {\n withHandle?: boolean;\n}) {\n return (\n <ResizablePrimitive.Separator\n data-slot=\"resizable-handle\"\n className={cn(\n \"relative flex w-px items-center justify-center bg-border ring-offset-background after:absolute after:inset-y-0 after:left-1/2 after:w-1 after:-translate-x-1/2 focus-visible:ring-1 focus-visible:ring-ring focus-visible:outline-hidden aria-[orientation=horizontal]:h-px aria-[orientation=horizontal]:w-full aria-[orientation=horizontal]:after:left-0 aria-[orientation=horizontal]:after:h-1 aria-[orientation=horizontal]:after:w-full aria-[orientation=horizontal]:after:translate-x-0 aria-[orientation=horizontal]:after:-translate-y-1/2 [&[aria-orientation=horizontal]>div]:rotate-90\",\n className,\n )}\n {...props}\n >\n {withHandle && <div className=\"z-10 flex h-6 w-1 shrink-0 rounded-lg bg-border\" />}\n </ResizablePrimitive.Separator>\n );\n}\n\nexport { ResizableHandle, ResizablePanel, ResizablePanelGroup };\n","import { useState } from \"react\";\n\n// Keyset cursor stack: `cursor` loads the current page; the stack holds the cursors of\n// earlier pages so \"Newer\" can walk back. Page 0 (newest) uses no cursor. Passing a new\n// `resetKey` (a filter/sort signature) snaps back to the newest page during render.\nexport function useKeysetPager(resetKey: string, pageSize: number) {\n const [cursor, setCursor] = useState<string | undefined>(undefined);\n const [prev, setPrev] = useState<(string | undefined)[]>([]);\n\n const [pageKey, setPageKey] = useState(resetKey);\n if (pageKey !== resetKey) {\n setPageKey(resetKey);\n setCursor(undefined);\n setPrev([]);\n }\n\n const depth = prev.length;\n\n function range(rowCount: number) {\n return { start: rowCount ? depth * pageSize + 1 : 0, end: depth * pageSize + rowCount };\n }\n function goOlder(nextCursor: string | null) {\n if (!nextCursor) return;\n setPrev((s) => [...s, cursor]);\n setCursor(nextCursor);\n }\n function goNewer() {\n if (prev.length === 0) return;\n setCursor(prev[prev.length - 1]);\n setPrev((s) => s.slice(0, -1));\n }\n\n return { cursor, canNewer: depth > 0, range, goOlder, goNewer };\n}\n","import type { RunStatus } from \"@durablex/react\";\n\nexport const ALL_FILTER = \"all\" as const;\n\nexport type StatusFilter = typeof ALL_FILTER | Exclude<RunStatus, \"waiting\">;\n\nexport const RUN_TYPE_FILTERS = [ALL_FILTER, \"triggered\", \"scheduled\"] as const;\nexport type RunTypeFilter = (typeof RUN_TYPE_FILTERS)[number];\n","export const RUN_SORT_KEYS = [\"workflow\", \"status\", \"app\", \"started\", \"duration\"] as const;\nexport type RunSortKey = (typeof RUN_SORT_KEYS)[number];\n\nexport const SORT_DIRS = [\"asc\", \"desc\"] as const;\nexport type SortDir = (typeof SORT_DIRS)[number];\n\nexport interface RunSort {\n key: RunSortKey;\n dir: SortDir;\n}\n\nexport const DEFAULT_RUN_SORT: RunSort = { key: \"started\", dir: \"desc\" };\n\nexport function toggleRunSort(prev: RunSort, key: RunSortKey): RunSort {\n if (prev.key === key) {\n return { key, dir: prev.dir === \"asc\" ? \"desc\" : \"asc\" };\n }\n return { key, dir: \"asc\" };\n}\n","export const DEFAULT_TIME_RANGE = \"1h\";\n\nexport const TIME_OPTIONS: [string, string][] = [\n [\"30s\", \"Last 30 seconds\"],\n [\"1m\", \"Last 1 minute\"],\n [\"10m\", \"Last 10 minutes\"],\n [\"30m\", \"Last 30 minutes\"],\n [\"1h\", \"Last 1 hour\"],\n [\"12h\", \"Last 12 hours\"],\n [\"1d\", \"Last 1 day\"],\n [\"3d\", \"Last 3 days\"],\n [\"7d\", \"Last 7 days\"],\n [\"30d\", \"Last 30 days\"],\n];\n\nconst UNIT_MS: Record<string, number> = {\n s: 1_000,\n m: 60_000,\n h: 3_600_000,\n d: 86_400_000,\n};\n\nexport function parseWindowMs(time: string): number | null {\n const match = /^(\\d+)([smhd])$/.exec(time.trim());\n if (!match) return null;\n const [, count, unit] = match;\n const ms = unit ? UNIT_MS[unit] : undefined;\n return ms ? Number(count) * ms : null;\n}\n\nexport function timeLabel(time: string): string {\n const preset = TIME_OPTIONS.find(([key]) => key === time);\n return preset ? preset[1] : `Last ${time}`;\n}\n\n// Quantize \"now\" so the cutoff is stable across renders (an unquantized value would\n// change every millisecond and thrash the query cache). The window still slides\n// forward once per bucket; freshness within a bucket comes from polling.\nconst SINCE_BUCKET_MS = 15_000;\n\n// Widths the series chart snaps to (1m..1d). Targeting ~48 buckets across the window\n// keeps bars readable.\nconst NICE_BUCKET_SECONDS = [60, 300, 900, 1800, 3600, 21_600, 86_400];\nconst WIDEST_BUCKET_SECONDS = 86_400;\nconst TARGET_BUCKETS = 48;\nconst DEFAULT_BUCKET_SECONDS = 3600;\n\nexport function seriesBucketSeconds(time: string): number {\n const windowMs = parseWindowMs(time);\n if (windowMs == null) return DEFAULT_BUCKET_SECONDS;\n const ideal = windowMs / 1000 / TARGET_BUCKETS;\n return NICE_BUCKET_SECONDS.find((s) => s >= ideal) ?? WIDEST_BUCKET_SECONDS;\n}\n\nexport const TIME_ZONES = [\"local\", \"utc\"] as const;\nexport type TimeZoneMode = (typeof TIME_ZONES)[number];\n\n// The viewer's auto-detected IANA zone (e.g. \"Europe/Madrid\"), shown so \"Local\"\n// names the zone it resolves to.\nexport const localTimeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n\n// An undefined timeZone renders in the viewer's local zone (Intl's default).\nexport function bucketTickLabel(\n ts: string,\n bucketSeconds: number,\n tz: TimeZoneMode = \"local\",\n): string {\n const d = new Date(ts);\n const timeZone = tz === \"utc\" ? \"UTC\" : undefined;\n if (bucketSeconds >= 86_400) {\n return d.toLocaleDateString([], { month: \"short\", day: \"numeric\", timeZone });\n }\n return d.toLocaleTimeString([], { hour: \"2-digit\", minute: \"2-digit\", timeZone });\n}\n\nexport function windowSince(time: string): string | undefined {\n const windowMs = parseWindowMs(time);\n if (windowMs == null) return undefined;\n const now = Math.floor(Date.now() / SINCE_BUCKET_MS) * SINCE_BUCKET_MS;\n return new Date(now - windowMs).toISOString();\n}\n","import { Loader2, RotateCcw } from \"lucide-react\";\nimport { toast } from \"sonner\";\nimport { useBulkReplay, type BulkReplayFilter } from \"@durablex/react\";\nimport { useConfirmAction } from \"../hooks/use-confirm-action\";\n\n// Two-click confirm since it forks every matching finished run at once; the engine\n// caps the fan-out and reports the outcome counts.\nexport function BulkReplayButton({ filter }: { filter: BulkReplayFilter }) {\n const bulk = useBulkReplay();\n const run = () =>\n bulk.mutate(filter, {\n onSuccess: (res) =>\n toast.success(`Replayed ${res.replayed} run${res.replayed === 1 ? \"\" : \"s\"}`, {\n description: res.capped\n ? \"Only the newest matches were replayed; narrow the filter.\"\n : undefined,\n }),\n onError: (err) => toast.error(`Bulk replay failed: ${err.message}`),\n });\n const { confirming, trigger } = useConfirmAction(run);\n\n if (bulk.isPending) {\n return (\n <span className=\"fb-btn\" aria-disabled>\n <Loader2 style={{ width: 12, height: 12 }} className=\"animate-spin\" /> Replaying\n </span>\n );\n }\n\n if (bulk.isSuccess) {\n const r = bulk.data;\n const title = `matched ${r.matched}, skipped ${r.skipped}, failed ${r.failed}${r.capped ? \", capped\" : \"\"}`;\n return (\n <span className=\"fb-meta\" title={title}>\n Replayed {r.replayed}\n {r.capped ? \"+\" : \"\"}\n </span>\n );\n }\n\n return (\n <button\n type=\"button\"\n className=\"fb-btn focusable\"\n title=\"Replay all finished runs matching the current filter\"\n onClick={trigger}\n >\n <RotateCcw style={{ width: 12, height: 12 }} />{\" \"}\n {confirming ? \"Confirm replay\" : \"Replay matching\"}\n </button>\n );\n}\n","import { ChevronLeft, ChevronRight } from \"lucide-react\";\n\ninterface CursorPagerProps {\n rangeStart: number;\n rangeEnd: number;\n canNewer: boolean;\n canOlder: boolean;\n onNewer(): void;\n onOlder(): void;\n}\n\nexport function CursorPager({\n rangeStart,\n rangeEnd,\n canNewer,\n canOlder,\n onNewer,\n onOlder,\n}: CursorPagerProps) {\n if (rangeEnd === 0) return null;\n\n return (\n <div className=\"pager\">\n <span className=\"pager-range\">\n {rangeStart}-{rangeEnd}\n </span>\n <span className=\"fb-spacer\" />\n <div className=\"pager-nav\">\n <button\n type=\"button\"\n className=\"pg-btn focusable\"\n disabled={!canNewer}\n aria-label=\"Newer runs\"\n onClick={onNewer}\n >\n <ChevronLeft />\n </button>\n <button\n type=\"button\"\n className=\"pg-btn focusable\"\n disabled={!canOlder}\n aria-label=\"Older runs\"\n onClick={onOlder}\n >\n <ChevronRight />\n </button>\n </div>\n </div>\n );\n}\n","import { Loader2, RotateCw } from \"lucide-react\";\nimport { toast } from \"sonner\";\nimport { useRetryFromStep } from \"@durablex/react\";\nimport { useConfirmAction } from \"../hooks/use-confirm-action\";\n\n// Retry forks a new run that re-executes from this step, so like Cancel it takes a\n// two-click confirm: the first click arms, the second within the window forks.\nexport function RetryFromStepButton({\n runId,\n stepName,\n onOpenRun,\n}: {\n runId: string;\n stepName: string;\n onOpenRun?: (runId: string) => void;\n}) {\n const retry = useRetryFromStep();\n const run = () =>\n retry.mutate(\n { runId, step: stepName },\n {\n onSuccess: (forked) =>\n toast.success(\"Retry started\", {\n action: onOpenRun\n ? { label: \"View run\", onClick: () => onOpenRun(forked.id) }\n : undefined,\n }),\n onError: (err) => toast.error(`Retry failed: ${err.message}`),\n },\n );\n const { confirming, trigger } = useConfirmAction(run);\n\n return (\n <button\n type=\"button\"\n className=\"btn focusable fi-retry\"\n disabled={retry.isPending}\n onClick={trigger}\n >\n {retry.isPending ? <Loader2 className=\"animate-spin\" /> : <RotateCw />}{\" \"}\n {confirming ? \"Confirm retry\" : \"Retry from here\"}\n </button>\n );\n}\n","import type { ControlAction, ControlActionKind } from \"@durablex/react\";\n\nexport const ACTION_LABELS: Record<ControlActionKind, string> = {\n cancel: \"Cancelled\",\n pause: \"Paused\",\n resume: \"Resumed\",\n replay: \"Replayed\",\n retry_from_step: \"Retried from step\",\n bulk_replay: \"Bulk replay\",\n};\n\n// An action recorded with no API-key label was driven by an unauthenticated (self-hosted) engine.\nexport function actorLabel(actor?: string): string {\n return actor || \"self-hosted\";\n}\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n return typeof v === \"object\" && v !== null && !Array.isArray(v);\n}\n\nfunction asNum(v: unknown): number {\n return typeof v === \"number\" ? v : 0;\n}\n\nexport function describeControlDetail(a: ControlAction): string {\n const d = a.detail;\n if (!isRecord(d)) return \"\";\n if (a.action === \"retry_from_step\" && typeof d.step === \"string\") {\n return `from \"${d.step}\"`;\n }\n if (a.action === \"bulk_replay\") {\n const summary = `${asNum(d.replayed)}/${asNum(d.matched)} replayed`;\n return d.capped ? `${summary}, capped` : summary;\n }\n return \"\";\n}\n","import { ArrowLeft, ArrowRight } from \"lucide-react\";\nimport { useControlActions, type ControlAction } from \"@durablex/react\";\nimport { ACTION_LABELS, actorLabel, describeControlDetail } from \"../lib/control-action\";\nimport { formatRelative } from \"../lib/format\";\n\n// The runId filter matches entries where this run is the target OR the fork. Show the\n// other run relative to the one being viewed: the fork it produced, or the source it came from.\nfunction lineage(a: ControlAction, runId: string): { run: string; incoming: boolean } | null {\n if (a.newRunId && a.newRunId === runId && a.runId) return { run: a.runId, incoming: true };\n if (a.newRunId && a.runId === runId) return { run: a.newRunId, incoming: false };\n return null;\n}\n\nfunction RunLink({ id, onOpenRun }: { id: string; onOpenRun?: (runId: string) => void }) {\n if (!onOpenRun) return <span className=\"font-mono text-[11px]\">{id}</span>;\n return (\n <button\n type=\"button\"\n className=\"hover:text-foreground font-mono text-[11px] underline underline-offset-2\"\n onClick={() => onOpenRun(id)}\n >\n {id}\n </button>\n );\n}\n\nexport function RunControlHistory({\n runId,\n onOpenRun,\n}: {\n runId: string;\n onOpenRun?: (runId: string) => void;\n}) {\n const { data: actions } = useControlActions({ runId });\n if (!actions || actions.length === 0) return null;\n\n return (\n <div className=\"mt-3 rounded-md border\">\n <div className=\"border-b px-2 py-1.5\">\n <span className=\"sec-title\">Control history</span>\n </div>\n <ul className=\"divide-y\">\n {actions.map((a) => {\n const detail = describeControlDetail(a);\n const link = lineage(a, runId);\n return (\n <li key={a.id} className=\"flex items-center gap-2 px-2 py-1.5 text-xs\">\n <span className=\"font-medium\">{ACTION_LABELS[a.action]}</span>\n {detail && (\n <span className=\"text-muted-foreground font-mono text-[11px]\">{detail}</span>\n )}\n {link && (\n <span className=\"text-muted-foreground flex items-center gap-1\">\n {link.incoming ? (\n <ArrowLeft className=\"size-3 shrink-0\" />\n ) : (\n <ArrowRight className=\"size-3 shrink-0\" />\n )}\n <RunLink id={link.run} onOpenRun={onOpenRun} />\n </span>\n )}\n <span className=\"text-muted-foreground ml-auto truncate font-mono text-[11px] whitespace-nowrap\">\n {actorLabel(a.actor)} · {formatRelative(a.createdAt)}\n </span>\n </li>\n );\n })}\n </ul>\n </div>\n );\n}\n","// Deterministic per-app accent. The engine does not persist an app color yet, so we\n// derive a stable hue from the name. All app colors share the same lightness/chroma\n// and vary only by hue, per the design brief.\nexport function appHue(name: string): string {\n let h = 0;\n for (let i = 0; i < name.length; i++) h = (h * 31 + name.charCodeAt(i)) | 0;\n return `oklch(0.62 0.15 ${((h % 360) + 360) % 360})`;\n}\n","import { useEffect, type RefObject } from \"react\";\n\nexport function useClickOutside(ref: RefObject<HTMLElement | null>, onClose: () => void) {\n useEffect(() => {\n const onDown = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) onClose();\n };\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n };\n document.addEventListener(\"mousedown\", onDown);\n document.addEventListener(\"keydown\", onKey);\n return () => {\n document.removeEventListener(\"mousedown\", onDown);\n document.removeEventListener(\"keydown\", onKey);\n };\n }, [ref, onClose]);\n}\n","import { useCallback, useRef, useState, type ReactNode } from \"react\";\nimport { useClickOutside } from \"./use-click-outside\";\n\nexport function FilterDropdown({\n trigger,\n align,\n width,\n children,\n}: {\n trigger: (open: boolean, toggle: () => void) => ReactNode;\n align?: \"right\";\n width?: number;\n children: (close: () => void) => ReactNode;\n}) {\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n const close = useCallback(() => setOpen(false), []);\n useClickOutside(ref, close);\n\n return (\n <div className=\"dd\" ref={ref}>\n {trigger(open, () => setOpen((o) => !o))}\n {open && (\n <div\n className={align === \"right\" ? \"dd-menu right\" : \"dd-menu\"}\n style={width ? { minWidth: width } : undefined}\n >\n {children(close)}\n </div>\n )}\n </div>\n );\n}\n","import { ChevronDown } from \"lucide-react\";\n\nexport function FilterDropdownButton({\n open,\n toggle,\n keyLabel,\n value,\n dot,\n}: {\n open: boolean;\n toggle: () => void;\n keyLabel?: string;\n value: string;\n dot?: string | null;\n}) {\n return (\n <button\n type=\"button\"\n className=\"dd-btn focusable\"\n data-open={open ? \"1\" : \"0\"}\n onClick={toggle}\n >\n {keyLabel && <span className=\"dd-key\">{keyLabel}</span>}\n <span className=\"dd-val\">\n {dot && <span className=\"vdot\" style={{ background: dot }} />}\n {value}\n </span>\n <ChevronDown className=\"dd-chev\" />\n </button>\n );\n}\n","import { Check } from \"lucide-react\";\n\nexport function FilterDropdownItem({\n active,\n dot,\n label,\n right,\n onClick,\n}: {\n active: boolean;\n dot?: string | null;\n label: string;\n right?: string;\n onClick: () => void;\n}) {\n return (\n <button\n type=\"button\"\n className=\"dd-item focusable\"\n data-on={active ? \"1\" : \"0\"}\n onClick={onClick}\n >\n {dot !== undefined && (\n <span\n className=\"dd-dot\"\n style={{\n background: dot || \"transparent\",\n border: dot ? \"0\" : \"1px solid var(--border)\",\n }}\n />\n )}\n <span className=\"dd-lbl\">{label}</span>\n {right != null && <span className=\"dd-rt\">{right}</span>}\n {active && <Check className=\"dd-check\" />}\n </button>\n );\n}\n","import { useMemo } from \"react\";\nimport { useWorkflows } from \"@durablex/react\";\nimport { appHue } from \"../../lib/app-color\";\nimport { ALL_FILTER } from \"../../lib/run-filters\";\nimport { FilterDropdown } from \"./FilterDropdown\";\nimport { FilterDropdownButton } from \"./FilterDropdownButton\";\nimport { FilterDropdownItem } from \"./FilterDropdownItem\";\n\nexport function AppFilter({\n app,\n onApp,\n align,\n width = 190,\n}: {\n app: string;\n onApp(app: string): void;\n align?: \"right\";\n width?: number;\n}) {\n const { data } = useWorkflows();\n const apps = useMemo(() => [...new Set((data ?? []).map((w) => w.app))].sort(), [data]);\n\n return (\n <FilterDropdown\n align={align}\n width={width}\n trigger={(open, toggle) => (\n <FilterDropdownButton\n open={open}\n toggle={toggle}\n keyLabel=\"App\"\n value={app === ALL_FILTER ? \"All\" : app}\n dot={app === ALL_FILTER ? null : appHue(app)}\n />\n )}\n >\n {(close) => (\n <>\n <FilterDropdownItem\n active={app === ALL_FILTER}\n dot={null}\n label=\"All apps\"\n onClick={() => {\n onApp(ALL_FILTER);\n close();\n }}\n />\n <div className=\"dd-sep\" />\n {apps.map((a) => (\n <FilterDropdownItem\n key={a}\n active={app === a}\n dot={appHue(a)}\n label={a}\n onClick={() => {\n onApp(a);\n close();\n }}\n />\n ))}\n </>\n )}\n </FilterDropdown>\n );\n}\n","import { TIME_OPTIONS, timeLabel } from \"../../lib/time-range\";\nimport { FilterDropdown } from \"./FilterDropdown\";\nimport { FilterDropdownButton } from \"./FilterDropdownButton\";\nimport { FilterDropdownItem } from \"./FilterDropdownItem\";\n\nexport function TimeRangeFilter({ time, onTime }: { time: string; onTime(time: string): void }) {\n return (\n <FilterDropdown\n width={210}\n trigger={(open, toggle) => (\n <FilterDropdownButton open={open} toggle={toggle} keyLabel=\"Time\" value={timeLabel(time)} />\n )}\n >\n {(close) => (\n <>\n <div className=\"dd-search\">\n <input\n placeholder=\"Relative time (5s, 1m, 2d)…\"\n onKeyDown={(e) => {\n const v = (e.target as HTMLInputElement).value.trim();\n if (e.key === \"Enter\" && v) {\n onTime(v);\n close();\n }\n }}\n />\n </div>\n {TIME_OPTIONS.map(([k, l]) => (\n <FilterDropdownItem\n key={k}\n active={time === k}\n label={l}\n onClick={() => {\n onTime(k);\n close();\n }}\n />\n ))}\n </>\n )}\n </FilterDropdown>\n );\n}\n","import { Braces, Search, X } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport { ALL_FILTER, type RunTypeFilter, type StatusFilter } from \"../lib/run-filters\";\nimport { AppFilter } from \"./filters/AppFilter\";\nimport { FilterDropdown } from \"./filters/FilterDropdown\";\nimport { FilterDropdownButton } from \"./filters/FilterDropdownButton\";\nimport { FilterDropdownItem } from \"./filters/FilterDropdownItem\";\nimport { TimeRangeFilter } from \"./filters/TimeRangeFilter\";\n\nconst STATUS_OPTIONS: { value: StatusFilter; label: string; color?: string }[] = [\n { value: ALL_FILTER, label: \"All statuses\" },\n { value: \"queued\", label: \"Queued\", color: \"var(--st-queued-fg)\" },\n { value: \"running\", label: \"Running\", color: \"var(--st-running-fg)\" },\n { value: \"paused\", label: \"Paused\", color: \"var(--st-paused-fg)\" },\n { value: \"succeeded\", label: \"Succeeded\", color: \"var(--st-succeeded-fg)\" },\n { value: \"failed\", label: \"Failed\", color: \"var(--st-failed-fg)\" },\n { value: \"cancelled\", label: \"Cancelled\", color: \"var(--st-cancelled-fg)\" },\n];\n\nconst RUNTYPE_OPTIONS: { value: RunTypeFilter; label: string }[] = [\n { value: ALL_FILTER, label: \"All run types\" },\n { value: \"triggered\", label: \"Event-triggered\" },\n { value: \"scheduled\", label: \"Scheduled (cron)\" },\n];\n\ninterface RunsFilterBarProps {\n query: string;\n onQuery(v: string): void;\n deep: boolean;\n onDeep(v: boolean): void;\n time: string;\n onTime(v: string): void;\n status: StatusFilter;\n onStatus(v: StatusFilter): void;\n app: string;\n onApp(v: string): void;\n runType: RunTypeFilter;\n onRunType(v: RunTypeFilter): void;\n shown: number;\n action?: ReactNode;\n}\n\nexport function RunsFilterBar({\n query,\n onQuery,\n deep,\n onDeep,\n time,\n onTime,\n status,\n onStatus,\n app,\n onApp,\n runType,\n onRunType,\n shown,\n action,\n}: RunsFilterBarProps) {\n const statusOpt = STATUS_OPTIONS.find((o) => o.value === status);\n const runTypeOpt = RUNTYPE_OPTIONS.find((o) => o.value === runType);\n const activeCount =\n (status !== ALL_FILTER ? 1 : 0) +\n (app !== ALL_FILTER ? 1 : 0) +\n (runType !== ALL_FILTER ? 1 : 0) +\n (query ? 1 : 0) +\n (deep ? 1 : 0);\n const clearAll = () => {\n onStatus(ALL_FILTER);\n onApp(ALL_FILTER);\n onRunType(ALL_FILTER);\n onQuery(\"\");\n onDeep(false);\n };\n\n return (\n <div className=\"filterbar\">\n <div className=\"fb-search-field\">\n <Search />\n <input\n placeholder={deep ? \"Search input & result…\" : \"Search runs, ids, apps…\"}\n value={query}\n onChange={(e) => onQuery(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Escape\") onQuery(\"\");\n }}\n />\n {query && (\n <span className=\"x\" title=\"Clear search\" onClick={() => onQuery(\"\")}>\n <X style={{ width: 12, height: 12 }} />\n </span>\n )}\n </div>\n\n <button\n type=\"button\"\n className=\"chip\"\n data-on={deep ? \"1\" : \"0\"}\n title=\"Also search run input, result, and error content\"\n onClick={() => onDeep(!deep)}\n >\n <Braces /> Payloads\n </button>\n\n <TimeRangeFilter time={time} onTime={onTime} />\n\n <FilterDropdown\n width={180}\n trigger={(open, toggle) => (\n <FilterDropdownButton\n open={open}\n toggle={toggle}\n keyLabel=\"Status\"\n value={statusOpt?.label === \"All statuses\" ? \"All\" : (statusOpt?.label ?? \"All\")}\n dot={statusOpt?.color ?? null}\n />\n )}\n >\n {(close) =>\n STATUS_OPTIONS.map((o) => (\n <FilterDropdownItem\n key={o.value}\n active={status === o.value}\n dot={o.color ?? null}\n label={o.label}\n onClick={() => {\n onStatus(o.value);\n close();\n }}\n />\n ))\n }\n </FilterDropdown>\n\n <AppFilter app={app} onApp={onApp} />\n\n <FilterDropdown\n width={180}\n trigger={(open, toggle) => (\n <FilterDropdownButton\n open={open}\n toggle={toggle}\n keyLabel=\"Run type\"\n value={\n runType === ALL_FILTER ? \"All\" : (runTypeOpt?.label.replace(/ \\(.*\\)/, \"\") ?? \"All\")\n }\n />\n )}\n >\n {(close) =>\n RUNTYPE_OPTIONS.map((o) => (\n <FilterDropdownItem\n key={o.value}\n active={runType === o.value}\n label={o.label}\n onClick={() => {\n onRunType(o.value);\n close();\n }}\n />\n ))\n }\n </FilterDropdown>\n\n {activeCount > 0 && (\n <button\n type=\"button\"\n className=\"fb-btn focusable\"\n title=\"Clear all filters\"\n onClick={clearAll}\n >\n <X style={{ width: 12, height: 12 }} /> Clear\n </button>\n )}\n\n <span className=\"fb-spacer\" />\n {action}\n <span className=\"fb-meta\">{shown} shown</span>\n </div>\n );\n}\n","import type { RunSort, RunSortKey } from \"../lib/run-sort\";\n\ninterface RunsTableHeadProps {\n label: string;\n sortKey: RunSortKey;\n sort: RunSort;\n onSort(key: RunSortKey): void;\n numeric?: boolean;\n}\n\nexport function RunsTableHead({ label, sortKey, sort, onSort, numeric }: RunsTableHeadProps) {\n const active = sort.key === sortKey;\n return (\n <th className={numeric ? \"sortable num\" : \"sortable\"} onClick={() => onSort(sortKey)}>\n {label}\n {active && <span className=\"arrow\">{sort.dir === \"asc\" ? \"↑\" : \"↓\"}</span>}\n </th>\n );\n}\n","import { ResumeMark } from \"./ResumeMark\";\n\nexport function RunsTableLoader() {\n return (\n <div className=\"runloader\">\n <ResumeMark size={44} variant=\"load\" fault className=\"loadmark\" title=\"Loading runs\" />\n <div className=\"runloader-cap\">Replaying runs…</div>\n </div>\n );\n}\n","import type { LucideIcon } from \"lucide-react\";\n\ninterface RunsTablePlaceholderProps {\n icon: LucideIcon;\n title: string;\n message: string;\n}\n\nexport function RunsTablePlaceholder({ icon: Icon, title, message }: RunsTablePlaceholderProps) {\n return (\n <div className=\"placeholder\">\n <div className=\"ph-inner\">\n <Icon className=\"ico\" />\n <h3>{title}</h3>\n <p>{message}</p>\n </div>\n </div>\n );\n}\n","import { appHue } from \"../lib/app-color\";\nimport { cn } from \"../lib/utils\";\n\nexport function AppTag({ app, className }: { app: string; className?: string }) {\n return (\n <span className={cn(\"inline-flex items-center gap-[6px] text-xs\", className)}>\n <span\n className=\"size-[9px] shrink-0 border\"\n style={{\n backgroundColor: appHue(app),\n borderColor: \"color-mix(in oklch, var(--foreground) 18%, transparent)\",\n }}\n />\n {app}\n </span>\n );\n}\n","import type { LucideIcon } from \"lucide-react\";\nimport { cn } from \"../lib/utils\";\n\n// tone maps to the --st-<tone>-bg/-fg CSS token pair.\nexport function GlyphBadge({\n icon: Icon,\n tone,\n label,\n ariaLabel,\n compact,\n className,\n}: {\n icon: LucideIcon;\n tone: string;\n label: string;\n ariaLabel?: string;\n compact?: boolean;\n className?: string;\n}) {\n if (compact) {\n return (\n <Icon\n className={cn(\"size-[13px] shrink-0\", className)}\n style={{ color: `var(--st-${tone}-fg)` }}\n aria-label={ariaLabel ?? label}\n />\n );\n }\n return (\n <span\n className={cn(\n \"inline-flex items-center gap-1 border border-transparent font-medium leading-none whitespace-nowrap h-[17px] px-1.5 text-[10px]\",\n className,\n )}\n style={{ backgroundColor: `var(--st-${tone}-bg)`, color: `var(--st-${tone}-fg)` }}\n >\n <Icon className=\"size-[11px] shrink-0\" />\n {label}\n </span>\n );\n}\n","import { Clock } from \"lucide-react\";\nimport { GlyphBadge } from \"./GlyphBadge\";\n\nexport function ScheduledBadge({ compact, className }: { compact?: boolean; className?: string }) {\n return (\n <GlyphBadge\n icon={Clock}\n tone=\"scheduled\"\n label=\"Scheduled\"\n ariaLabel=\"Scheduled (cron)\"\n compact={compact}\n className={className}\n />\n );\n}\n","import { RotateCcw } from \"lucide-react\";\nimport type { KeyboardEvent } from \"react\";\nimport { type Run, TERMINAL_STATUSES } from \"@durablex/react\";\nimport { formatDuration, formatRelative } from \"../lib/format\";\nimport { stepCellLabel } from \"../lib/run-progress\";\nimport type { RunSortKey } from \"../lib/run-sort\";\nimport { AppTag } from \"./AppTag\";\nimport { ScheduledBadge } from \"./ScheduledBadge\";\nimport { StatusBadge } from \"./StatusBadge\";\n\ninterface RunsTableRowProps {\n run: Run;\n selected: boolean;\n onSelect(id: string): void;\n hideColumns?: RunSortKey[];\n stepTotal?: number;\n onReplay?(id: string): void;\n}\n\nexport function RunsTableRow({\n run,\n selected,\n onSelect,\n hideColumns,\n stepTotal,\n onReplay,\n}: RunsTableRowProps) {\n const onKeyDown = (e: KeyboardEvent<HTMLTableRowElement>) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onSelect(run.id);\n }\n };\n\n return (\n <tr\n className=\"row focusable\"\n tabIndex={0}\n data-selected={selected ? \"1\" : \"0\"}\n onClick={() => onSelect(run.id)}\n onKeyDown={onKeyDown}\n >\n {!hideColumns?.includes(\"workflow\") && (\n <td>\n <div className=\"wf-cell\">\n <span className=\"wf-name\">{run.workflowName}</span>\n {run.triggerKind === \"cron\" && <ScheduledBadge compact />}\n </div>\n </td>\n )}\n <td>\n <StatusBadge status={run.status} />\n </td>\n {!hideColumns?.includes(\"app\") && (\n <td>\n <AppTag app={run.app} />\n </td>\n )}\n <td>\n <div className=\"step-cell\">\n {run.stepCount > 0 ? (\n <>\n <span className=\"ix\" style={{ color: `var(--st-${run.status}-fg)` }}>\n {stepCellLabel(run, stepTotal)}\n </span>\n {run.currentStepName && <span>{run.currentStepName}</span>}\n </>\n ) : (\n <span className=\"cell-mut\">-</span>\n )}\n {run.status === \"failed\" && run.error?.message && (\n <span className=\"run-err\" title={run.error.message}>\n {run.error.message.split(\"\\n\")[0]}\n </span>\n )}\n </div>\n </td>\n <td>\n <span className=\"ts cell-mut\">{formatRelative(run.startedAt)}</span>\n </td>\n <td className=\"num\">\n <span className=\"dur\">{formatDuration(run.durationMs)}</span>\n </td>\n {onReplay && (\n <td className=\"row-actions\">\n {TERMINAL_STATUSES.has(run.status) && (\n <button\n type=\"button\"\n className=\"row-action focusable\"\n title=\"Replay this run\"\n onClick={(e) => {\n e.stopPropagation();\n onReplay(run.id);\n }}\n >\n <RotateCcw className=\"size-3.5\" /> Replay\n </button>\n )}\n </td>\n )}\n </tr>\n );\n}\n","import { AlertTriangle, Inbox } from \"lucide-react\";\nimport { useMemo } from \"react\";\nimport type { Run } from \"@durablex/react\";\nimport { expectedStepTotals } from \"../lib/run-progress\";\nimport type { RunSort, RunSortKey } from \"../lib/run-sort\";\nimport { RunsTableHead } from \"./RunsTableHead\";\nimport { RunsTableLoader } from \"./RunsTableLoader\";\nimport { RunsTablePlaceholder } from \"./RunsTablePlaceholder\";\nimport { RunsTableRow } from \"./RunsTableRow\";\n\ninterface RunsTableProps {\n rows: Run[];\n selectedId: string | null;\n onSelect(id: string): void;\n sort: RunSort;\n onSort(key: RunSortKey): void;\n loading: boolean;\n isError: boolean;\n error: Error | null;\n emptyTitle: string;\n emptyMessage: string;\n hideColumns?: RunSortKey[];\n onReplay?(id: string): void;\n}\n\nexport function RunsTable({\n rows,\n selectedId,\n onSelect,\n sort,\n onSort,\n loading,\n isError,\n error,\n emptyTitle,\n emptyMessage,\n hideColumns,\n onReplay,\n}: RunsTableProps) {\n const expectedSteps = useMemo(() => expectedStepTotals(rows), [rows]);\n\n if (loading && rows.length === 0) {\n return (\n <div className=\"tablewrap\">\n <RunsTableLoader />\n </div>\n );\n }\n\n if (isError) {\n return (\n <div className=\"tablewrap\">\n <RunsTablePlaceholder\n icon={AlertTriangle}\n title=\"Failed to load runs\"\n message={error?.message ?? \"Something went wrong.\"}\n />\n </div>\n );\n }\n\n if (rows.length === 0) {\n return (\n <div className=\"tablewrap\">\n <RunsTablePlaceholder icon={Inbox} title={emptyTitle} message={emptyMessage} />\n </div>\n );\n }\n\n return (\n <div className=\"tablewrap\">\n <table className=\"runs\">\n <thead>\n <tr>\n {!hideColumns?.includes(\"workflow\") && (\n <RunsTableHead label=\"Workflow\" sortKey=\"workflow\" sort={sort} onSort={onSort} />\n )}\n <RunsTableHead label=\"Status\" sortKey=\"status\" sort={sort} onSort={onSort} />\n {!hideColumns?.includes(\"app\") && (\n <RunsTableHead label=\"App\" sortKey=\"app\" sort={sort} onSort={onSort} />\n )}\n <th>Current step</th>\n <RunsTableHead label=\"Started\" sortKey=\"started\" sort={sort} onSort={onSort} />\n <RunsTableHead\n label=\"Duration\"\n sortKey=\"duration\"\n sort={sort}\n onSort={onSort}\n numeric\n />\n {onReplay && <th aria-label=\"Actions\" />}\n </tr>\n </thead>\n <tbody>\n {rows.map((run) => (\n <RunsTableRow\n key={run.id}\n run={run}\n selected={selectedId === run.id}\n onSelect={onSelect}\n hideColumns={hideColumns}\n stepTotal={expectedSteps.get(run.workflowName)}\n onReplay={onReplay}\n />\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n","import type { StatusFilter } from \"../lib/run-filters\";\nimport { ResumeMark } from \"./ResumeMark\";\n\nexport interface StatTile {\n label: string;\n value: number;\n sub: string;\n token: string;\n mark?: boolean;\n trend?: \"up\" | \"down\";\n // When set, the tile is a button that filters the runs to this status (and shows\n // an active state while that filter is on). Tiles without it stay static.\n status?: StatusFilter;\n active?: boolean;\n}\n\nexport function StatTileGrid({\n tiles,\n onSelect,\n}: {\n tiles: StatTile[];\n onSelect?: (status: StatusFilter) => void;\n}) {\n return (\n <div className=\"stats\">\n {tiles.map((t) => {\n const inner = (\n <>\n <div className=\"stat-top\">\n {t.mark ? (\n <ResumeMark variant=\"run\" size={12} className=\"stat-mark\" />\n ) : (\n <i className=\"stat-dot\" style={{ background: `var(${t.token})` }} />\n )}\n <span className=\"stat-label\">{t.label}</span>\n </div>\n <div className=\"stat-val\">{t.value}</div>\n <div className=\"stat-sub\">\n <span className={t.trend ?? \"\"}>{t.sub}</span>\n </div>\n </>\n );\n if (t.status && onSelect) {\n const status = t.status;\n return (\n <button\n type=\"button\"\n className=\"stat stat-btn focusable\"\n key={t.label}\n data-active={t.active ? \"1\" : \"0\"}\n style={t.active ? { boxShadow: `inset 0 -2px 0 var(${t.token})` } : undefined}\n title={\n t.active\n ? `Clear the ${t.label.toLowerCase()} filter`\n : `Show ${t.label.toLowerCase()} runs`\n }\n onClick={() => onSelect(status)}\n >\n {inner}\n </button>\n );\n }\n return (\n <div className=\"stat\" key={t.label}>\n {inner}\n </div>\n );\n })}\n </div>\n );\n}\n","import type { RunStats } from \"@durablex/react\";\nimport type { StatusFilter } from \"../lib/run-filters\";\nimport { StatTileGrid } from \"./StatTileGrid\";\n\nconst EMPTY: RunStats = {\n total: 0,\n active: 0,\n queued: 0,\n running: 0,\n succeeded: 0,\n failed: 0,\n successRate: 100,\n};\n\nexport function StatsTiles({\n stats,\n rangeLabel,\n activeStatus,\n onFilterStatus,\n}: {\n stats?: RunStats;\n rangeLabel?: string;\n activeStatus?: StatusFilter;\n onFilterStatus?: (status: StatusFilter) => void;\n}) {\n const s = stats ?? EMPTY;\n\n return (\n <StatTileGrid\n onSelect={onFilterStatus}\n tiles={[\n {\n label: \"Recent\",\n value: s.total,\n sub: rangeLabel ?? \"recent\",\n token: \"--muted-foreground\",\n },\n {\n label: \"Active\",\n value: s.active,\n sub: \"in progress\",\n token: \"--st-running-fg\",\n mark: true,\n },\n {\n label: \"Succeeded\",\n value: s.succeeded,\n sub: `${s.successRate}% success`,\n token: \"--st-succeeded-fg\",\n trend: \"up\",\n status: \"succeeded\",\n active: activeStatus === \"succeeded\",\n },\n {\n label: \"Failed\",\n value: s.failed,\n sub: s.failed ? \"need attention\" : \"all clear\",\n token: \"--st-failed-fg\",\n trend: s.failed ? \"down\" : undefined,\n status: \"failed\",\n active: activeStatus === \"failed\",\n },\n ]}\n />\n );\n}\n","import { X } from \"lucide-react\";\nimport { useCallback, useState } from \"react\";\nimport { toast } from \"sonner\";\nimport { type TriggerKind, useReplayRun, useRuns, useRunStats } from \"@durablex/react\";\nimport { ResizableHandle, ResizablePanel, ResizablePanelGroup } from \"../ui/resizable\";\nimport { useKeysetPager } from \"../hooks/use-keyset-pager\";\nimport { ALL_FILTER, type RunTypeFilter, type StatusFilter } from \"../lib/run-filters\";\nimport { DEFAULT_RUN_SORT, type RunSort, type RunSortKey, toggleRunSort } from \"../lib/run-sort\";\nimport { DEFAULT_TIME_RANGE, timeLabel, windowSince } from \"../lib/time-range\";\nimport { BulkReplayButton } from \"./BulkReplayButton\";\nimport { CursorPager } from \"./CursorPager\";\nimport { RetryFromStepButton } from \"./RetryFromStepButton\";\nimport { RunControlHistory } from \"./RunControlHistory\";\nimport { RunInspector } from \"./RunInspector\";\nimport { RunInspectorActions } from \"./RunInspectorActions\";\nimport { RunsFilterBar } from \"./RunsFilterBar\";\nimport { RunsTable } from \"./RunsTable\";\nimport { StatsTiles } from \"./StatsTiles\";\n\nconst PAGE_SIZE = 30;\n\nconst RUN_TYPE_TO_TRIGGER: Record<RunTypeFilter, TriggerKind | undefined> = {\n all: undefined,\n triggered: \"event\",\n scheduled: \"cron\",\n};\n\nexport interface RunsViewState {\n status: StatusFilter;\n app: string;\n runType: RunTypeFilter;\n time: string;\n q: string;\n deep: boolean;\n sort: RunSort;\n run: string | null;\n event: string | null;\n replayOf: string | null;\n}\n\nexport const DEFAULT_RUNS_VIEW_STATE: RunsViewState = {\n status: ALL_FILTER,\n app: ALL_FILTER,\n runType: ALL_FILTER,\n time: DEFAULT_TIME_RANGE,\n q: \"\",\n deep: false,\n sort: DEFAULT_RUN_SORT,\n run: null,\n event: null,\n replayOf: null,\n};\n\n// Local-state backing for consumers that do not wire RunsView to their own store\n// (the OSS dashboard backs it with the URL instead). `initial` seeds deep-links.\nexport function useRunsViewState(initial?: Partial<RunsViewState>): {\n state: RunsViewState;\n onChange: (patch: Partial<RunsViewState>) => void;\n} {\n const [state, setState] = useState<RunsViewState>(() => ({\n ...DEFAULT_RUNS_VIEW_STATE,\n ...initial,\n }));\n const onChange = useCallback(\n (patch: Partial<RunsViewState>) => setState((s) => ({ ...s, ...patch })),\n [],\n );\n return { state, onChange };\n}\n\nexport interface RunsViewProps {\n // Controlled: pass both to back the view with your own store. Omit both to run\n // uncontrolled with internal state seeded by initialState.\n state?: RunsViewState;\n onChange?: (patch: Partial<RunsViewState>, opts?: { push?: boolean }) => void;\n initialState?: Partial<RunsViewState>;\n // Omit the write surface (run controls, replay, bulk replay) for a read-only embed.\n readOnly?: boolean;\n}\n\nexport function RunsView({\n state: controlledState,\n onChange: controlledOnChange,\n initialState,\n readOnly = false,\n}: RunsViewProps) {\n // Uncontrolled by default (own local state); a consumer that wants to back the\n // view with its own store (the OSS dashboard uses the URL) passes state + onChange.\n const local = useRunsViewState(initialState);\n const state = controlledState ?? local.state;\n const onChange = controlledOnChange ?? local.onChange;\n const {\n app,\n runType,\n time,\n q: query,\n deep,\n sort,\n run: selectedRunId,\n event,\n replayOf,\n status,\n } = state;\n const openRun = (id: string) => onChange({ run: id }, { push: true });\n const onSort = (key: RunSortKey) => onChange({ sort: toggleRunSort(sort, key) });\n\n const replay = useReplayRun();\n const onReplay = (id: string) =>\n replay.mutate(\n { runId: id },\n {\n onSuccess: (forked) =>\n toast.success(\"Replay started\", {\n action: { label: \"View run\", onClick: () => openRun(forked.id) },\n }),\n onError: (err) => toast.error(`Replay failed: ${err.message}`),\n },\n );\n\n const since = windowSince(time);\n const appParam = app === ALL_FILTER ? undefined : app;\n const statusParam = status === ALL_FILTER ? undefined : status;\n const runTypeParam = RUN_TYPE_TO_TRIGGER[runType];\n const search = query.trim() || undefined;\n\n const filterKey = `${statusParam ?? \"\"}|${appParam ?? \"\"}|${runTypeParam ?? \"\"}|${event ?? \"\"}|${replayOf ?? \"\"}|${time}|${search ?? \"\"}|${deep ? \"d\" : \"\"}|${sort.key}-${sort.dir}`;\n const { cursor, canNewer, range, goOlder, goNewer } = useKeysetPager(filterKey, PAGE_SIZE);\n\n const { data, isLoading, isError, error } = useRuns({\n app: appParam,\n status: statusParam,\n runType: runTypeParam,\n eventId: event ?? undefined,\n replayOf: replayOf ?? undefined,\n q: search,\n deep,\n since,\n sort: sort.key,\n dir: sort.dir,\n limit: PAGE_SIZE,\n cursor,\n });\n const stats = useRunStats({ app: appParam, since });\n\n const rows = data?.runs ?? [];\n const nextCursor = data?.nextCursor ?? null;\n const { start: rangeStart, end: rangeEnd } = range(rows.length);\n\n const filtersActive = Boolean(\n search || statusParam || appParam || runTypeParam || event || replayOf,\n );\n\n let emptyMessage: string;\n if (deep && search) {\n emptyMessage = \"No runs contain that text in their input, result, or error.\";\n } else if (filtersActive) {\n emptyMessage = \"No runs match the current filter. Clear filters to see all recent runs.\";\n } else {\n emptyMessage = \"Trigger a workflow to see its run appear here.\";\n }\n\n return (\n <ResizablePanelGroup orientation=\"horizontal\" className=\"min-h-0 flex-1\">\n <ResizablePanel minSize=\"30%\">\n <div className=\"flex h-full min-h-0 flex-col\">\n <StatsTiles\n stats={stats.data}\n rangeLabel={timeLabel(time)}\n activeStatus={status}\n onFilterStatus={(s) => onChange({ status: status === s ? ALL_FILTER : s })}\n />\n <RunsFilterBar\n query={query}\n onQuery={(v) => onChange({ q: v })}\n deep={deep}\n onDeep={(v) => onChange({ deep: v })}\n time={time}\n onTime={(v) => onChange({ time: v })}\n status={status}\n onStatus={(v) => onChange({ status: v })}\n app={app}\n onApp={(v) => onChange({ app: v })}\n runType={runType}\n onRunType={(v) => onChange({ runType: v })}\n shown={rows.length}\n action={\n readOnly ? undefined : (\n <BulkReplayButton\n key={filterKey}\n filter={{ app: appParam, status: statusParam, runType: runTypeParam, since }}\n />\n )\n }\n />\n {event && (\n <div className=\"flex items-center gap-2 border-b px-3 py-1.5\">\n <span className=\"text-muted-foreground text-xs\">Runs triggered by event</span>\n <span className=\"text-[11px]\" title={event}>\n {rows[0]?.eventName ?? event}\n </span>\n <button\n type=\"button\"\n className=\"text-muted-foreground hover:text-foreground inline-flex items-center gap-1 text-xs\"\n onClick={() => onChange({ event: null })}\n >\n <X className=\"size-3\" /> clear\n </button>\n </div>\n )}\n {replayOf && (\n <div className=\"flex items-center gap-2 border-b px-3 py-1.5\">\n <span className=\"text-muted-foreground text-xs\">Runs replayed from</span>\n <button\n type=\"button\"\n className=\"text-[11px] hover:underline\"\n title={`Open source run ${replayOf}`}\n onClick={() => onChange({ run: replayOf }, { push: true })}\n >\n {rows[0]?.workflowName ?? replayOf}\n </button>\n <button\n type=\"button\"\n className=\"text-muted-foreground hover:text-foreground inline-flex items-center gap-1 text-xs\"\n onClick={() => onChange({ replayOf: null })}\n >\n <X className=\"size-3\" /> clear\n </button>\n </div>\n )}\n <RunsTable\n rows={rows}\n selectedId={selectedRunId}\n onSelect={openRun}\n sort={sort}\n onSort={onSort}\n loading={isLoading}\n isError={isError}\n error={error}\n emptyTitle={filtersActive ? \"No runs match\" : \"No runs yet\"}\n emptyMessage={emptyMessage}\n onReplay={readOnly ? undefined : onReplay}\n />\n {!isLoading && rows.length > 0 && (\n <CursorPager\n rangeStart={rangeStart}\n rangeEnd={rangeEnd}\n canNewer={canNewer}\n canOlder={nextCursor != null}\n onNewer={goNewer}\n onOlder={() => goOlder(nextCursor)}\n />\n )}\n </div>\n </ResizablePanel>\n {selectedRunId && (\n <>\n <ResizableHandle withHandle />\n <ResizablePanel defaultSize=\"38%\" minSize=\"24%\" maxSize=\"65%\">\n <RunInspector\n key={selectedRunId}\n runId={selectedRunId}\n onClose={() => onChange({ run: null })}\n onFilterByEvent={(id) => onChange({ event: id, run: null })}\n onOpenRun={openRun}\n onShowReplays={(id) => onChange({ replayOf: id, run: null }, { push: true })}\n renderActions={\n readOnly\n ? undefined\n : (run) => <RunInspectorActions run={run} onOpenRun={openRun} />\n }\n renderControlHistory={\n readOnly ? undefined : (id) => <RunControlHistory runId={id} onOpenRun={openRun} />\n }\n renderStepRetry={\n readOnly\n ? undefined\n : (rid, stepName) => (\n <RetryFromStepButton runId={rid} stepName={stepName} onOpenRun={openRun} />\n )\n }\n />\n </ResizablePanel>\n </>\n )}\n </ResizablePanelGroup>\n );\n}\n","import { localTimeZone, type TimeZoneMode } from \"../../lib/time-range\";\nimport { FilterDropdown } from \"./FilterDropdown\";\nimport { FilterDropdownButton } from \"./FilterDropdownButton\";\nimport { FilterDropdownItem } from \"./FilterDropdownItem\";\n\nconst OPTIONS: [TimeZoneMode, string][] = [\n [\"local\", `Local · ${localTimeZone}`],\n [\"utc\", \"UTC\"],\n];\n\nexport function TimeZoneFilter({ tz, onTz }: { tz: TimeZoneMode; onTz(tz: TimeZoneMode): void }) {\n return (\n <FilterDropdown\n align=\"right\"\n width={220}\n trigger={(open, toggle) => (\n <FilterDropdownButton\n open={open}\n toggle={toggle}\n keyLabel=\"Zone\"\n value={tz === \"utc\" ? \"UTC\" : \"Local\"}\n />\n )}\n >\n {(close) =>\n OPTIONS.map(([k, l]) => (\n <FilterDropdownItem\n key={k}\n active={tz === k}\n label={l}\n onClick={() => {\n onTz(k);\n close();\n }}\n />\n ))\n }\n </FilterDropdown>\n );\n}\n","import type { ReactNode } from \"react\";\n\nexport function SectionHeader({ children, action }: { children: ReactNode; action?: ReactNode }) {\n return (\n <div className=\"text-muted-foreground flex min-h-9 items-center justify-between border-b px-3 py-2 text-xs font-medium tracking-tight\">\n <span>{children}</span>\n {action}\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { SectionHeader } from \"../SectionHeader\";\n\nexport function ChartCard({\n title,\n action,\n children,\n}: {\n title: string;\n action?: ReactNode;\n children: ReactNode;\n}) {\n return (\n <section className=\"border-b\">\n <SectionHeader action={action}>{title}</SectionHeader>\n <div className=\"p-3\">{children}</div>\n </section>\n );\n}\n","import * as React from \"react\";\nimport * as RechartsPrimitive from \"recharts\";\nimport type { TooltipValueType } from \"recharts\";\n\nimport { cn } from \"../lib/utils\";\n\n// Format: { THEME_NAME: CSS_SELECTOR }\nconst THEMES = { light: \"\", dark: \".dark\" } as const;\n\nconst INITIAL_DIMENSION = { width: 320, height: 200 } as const;\ntype TooltipNameType = number | string;\n\nexport type ChartConfig = Record<\n string,\n {\n label?: React.ReactNode;\n icon?: React.ComponentType;\n } & (\n | { color?: string; theme?: never }\n | { color?: never; theme: Record<keyof typeof THEMES, string> }\n )\n>;\n\ntype ChartContextProps = {\n config: ChartConfig;\n};\n\nconst ChartContext = React.createContext<ChartContextProps | null>(null);\n\nfunction useChart() {\n const context = React.useContext(ChartContext);\n\n if (!context) {\n throw new Error(\"useChart must be used within a <ChartContainer />\");\n }\n\n return context;\n}\n\nfunction ChartContainer({\n id,\n className,\n children,\n config,\n initialDimension = INITIAL_DIMENSION,\n ...props\n}: React.ComponentProps<\"div\"> & {\n config: ChartConfig;\n children: React.ComponentProps<typeof RechartsPrimitive.ResponsiveContainer>[\"children\"];\n initialDimension?: {\n width: number;\n height: number;\n };\n}) {\n const uniqueId = React.useId();\n const chartId = `chart-${id ?? uniqueId.replace(/:/g, \"\")}`;\n\n return (\n <ChartContext.Provider value={{ config }}>\n <div\n data-slot=\"chart\"\n data-chart={chartId}\n className={cn(\n \"flex aspect-video justify-center text-xs [&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-border [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-hidden [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-border [&_.recharts-radial-bar-background-sector]:fill-muted [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-muted [&_.recharts-reference-line_[stroke='#ccc']]:stroke-border [&_.recharts-sector]:outline-hidden [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-surface]:outline-hidden\",\n className,\n )}\n {...props}\n >\n <ChartStyle id={chartId} config={config} />\n <RechartsPrimitive.ResponsiveContainer initialDimension={initialDimension}>\n {children}\n </RechartsPrimitive.ResponsiveContainer>\n </div>\n </ChartContext.Provider>\n );\n}\n\nconst ChartStyle = ({ id, config }: { id: string; config: ChartConfig }) => {\n const colorConfig = Object.entries(config).filter(([, config]) => config.theme ?? config.color);\n\n if (!colorConfig.length) {\n return null;\n }\n\n return (\n <style\n dangerouslySetInnerHTML={{\n __html: Object.entries(THEMES)\n .map(\n ([theme, prefix]) => `\n${prefix} [data-chart=${id}] {\n${colorConfig\n .map(([key, itemConfig]) => {\n const color = itemConfig.theme?.[theme as keyof typeof itemConfig.theme] ?? itemConfig.color;\n return color ? ` --color-${key}: ${color};` : null;\n })\n .join(\"\\n\")}\n}\n`,\n )\n .join(\"\\n\"),\n }}\n />\n );\n};\n\nconst ChartTooltip = RechartsPrimitive.Tooltip;\n\nfunction ChartTooltipContent({\n active,\n payload,\n className,\n indicator = \"dot\",\n hideLabel = false,\n hideIndicator = false,\n label,\n labelFormatter,\n labelClassName,\n formatter,\n color,\n nameKey,\n labelKey,\n}: React.ComponentProps<typeof RechartsPrimitive.Tooltip> &\n React.ComponentProps<\"div\"> & {\n hideLabel?: boolean;\n hideIndicator?: boolean;\n indicator?: \"line\" | \"dot\" | \"dashed\";\n nameKey?: string;\n labelKey?: string;\n } & Omit<\n RechartsPrimitive.DefaultTooltipContentProps<TooltipValueType, TooltipNameType>,\n \"accessibilityLayer\"\n >) {\n const { config } = useChart();\n\n const tooltipLabel = React.useMemo(() => {\n if (hideLabel || !payload?.length) {\n return null;\n }\n\n const [item] = payload;\n const key = `${labelKey ?? item?.dataKey ?? item?.name ?? \"value\"}`;\n const itemConfig = getPayloadConfigFromPayload(config, item, key);\n const value =\n !labelKey && typeof label === \"string\" ? (config[label]?.label ?? label) : itemConfig?.label;\n\n if (labelFormatter) {\n return (\n <div className={cn(\"font-medium\", labelClassName)}>{labelFormatter(value, payload)}</div>\n );\n }\n\n if (!value) {\n return null;\n }\n\n return <div className={cn(\"font-medium\", labelClassName)}>{value}</div>;\n }, [label, labelFormatter, payload, hideLabel, labelClassName, config, labelKey]);\n\n if (!active || !payload?.length) {\n return null;\n }\n\n const nestLabel = payload.length === 1 && indicator !== \"dot\";\n\n return (\n <div\n className={cn(\n \"grid min-w-32 items-start gap-1.5 rounded-lg border border-border/50 bg-background px-2.5 py-1.5 text-xs shadow-xl\",\n className,\n )}\n >\n {!nestLabel ? tooltipLabel : null}\n <div className=\"grid gap-1.5\">\n {payload\n .filter((item) => item.type !== \"none\")\n .map((item, index) => {\n const key = `${nameKey ?? item.name ?? item.dataKey ?? \"value\"}`;\n const itemConfig = getPayloadConfigFromPayload(config, item, key);\n const indicatorColor = color ?? item.payload?.fill ?? item.color;\n\n return (\n <div\n key={index}\n className={cn(\n \"flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-muted-foreground\",\n indicator === \"dot\" && \"items-center\",\n )}\n >\n {formatter && item?.value !== undefined && item.name ? (\n formatter(item.value, item.name, item, index, item.payload)\n ) : (\n <>\n {itemConfig?.icon ? (\n <itemConfig.icon />\n ) : (\n !hideIndicator && (\n <div\n className={cn(\n \"shrink-0 rounded-[2px] border-(--color-border) bg-(--color-bg)\",\n {\n \"h-2.5 w-2.5\": indicator === \"dot\",\n \"w-1\": indicator === \"line\",\n \"w-0 border-[1.5px] border-dashed bg-transparent\":\n indicator === \"dashed\",\n \"my-0.5\": nestLabel && indicator === \"dashed\",\n },\n )}\n style={\n {\n \"--color-bg\": indicatorColor,\n \"--color-border\": indicatorColor,\n } as React.CSSProperties\n }\n />\n )\n )}\n <div\n className={cn(\n \"flex flex-1 justify-between leading-none\",\n nestLabel ? \"items-end\" : \"items-center\",\n )}\n >\n <div className=\"grid gap-1.5\">\n {nestLabel ? tooltipLabel : null}\n <span className=\"text-muted-foreground\">\n {itemConfig?.label ?? item.name}\n </span>\n </div>\n {item.value != null && (\n <span className=\"font-mono font-medium text-foreground tabular-nums\">\n {typeof item.value === \"number\"\n ? item.value.toLocaleString()\n : String(item.value)}\n </span>\n )}\n </div>\n </>\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\nconst ChartLegend = RechartsPrimitive.Legend;\n\nfunction ChartLegendContent({\n className,\n hideIcon = false,\n payload,\n verticalAlign = \"bottom\",\n nameKey,\n}: React.ComponentProps<\"div\"> & {\n hideIcon?: boolean;\n nameKey?: string;\n} & RechartsPrimitive.DefaultLegendContentProps) {\n const { config } = useChart();\n\n if (!payload?.length) {\n return null;\n }\n\n return (\n <div\n className={cn(\n \"flex flex-wrap items-center justify-center gap-x-2.5 gap-y-1\",\n verticalAlign === \"top\" ? \"pb-3\" : \"pt-3\",\n className,\n )}\n >\n {payload\n .filter((item) => item.type !== \"none\")\n .map((item, index) => {\n const key = `${nameKey ?? item.dataKey ?? \"value\"}`;\n const itemConfig = getPayloadConfigFromPayload(config, item, key);\n\n return (\n <div\n key={index}\n className={cn(\n \"flex items-center gap-1.5 [&>svg]:h-3 [&>svg]:w-3 [&>svg]:text-muted-foreground\",\n )}\n >\n {itemConfig?.icon && !hideIcon ? (\n <itemConfig.icon />\n ) : (\n <div\n className=\"h-2 w-2 shrink-0 rounded-[2px]\"\n style={{\n backgroundColor: item.color,\n }}\n />\n )}\n {itemConfig?.label}\n </div>\n );\n })}\n </div>\n );\n}\n\nfunction getPayloadConfigFromPayload(config: ChartConfig, payload: unknown, key: string) {\n if (typeof payload !== \"object\" || payload === null) {\n return undefined;\n }\n\n const payloadPayload =\n \"payload\" in payload && typeof payload.payload === \"object\" && payload.payload !== null\n ? payload.payload\n : undefined;\n\n let configLabelKey: string = key;\n\n if (key in payload && typeof payload[key as keyof typeof payload] === \"string\") {\n configLabelKey = payload[key as keyof typeof payload] as string;\n } else if (\n payloadPayload &&\n key in payloadPayload &&\n typeof payloadPayload[key as keyof typeof payloadPayload] === \"string\"\n ) {\n configLabelKey = payloadPayload[key as keyof typeof payloadPayload] as string;\n }\n\n return configLabelKey in config ? config[configLabelKey] : config[key];\n}\n\nexport {\n ChartContainer,\n ChartTooltip,\n ChartTooltipContent,\n ChartLegend,\n ChartLegendContent,\n ChartStyle,\n};\n","import { CartesianGrid, Line, LineChart, XAxis, YAxis } from \"recharts\";\nimport type { RunSeries } from \"@durablex/react\";\nimport {\n type ChartConfig,\n ChartContainer,\n ChartLegend,\n ChartLegendContent,\n ChartTooltip,\n ChartTooltipContent,\n} from \"../../ui/chart\";\nimport { bucketTickLabel, type TimeZoneMode } from \"../../lib/time-range\";\n\nconst CONFIG: ChartConfig = {\n avgMs: { label: \"Avg\", color: \"var(--chart-1)\" },\n maxMs: { label: \"Max\", color: \"var(--chart-4)\" },\n};\n\n// formatMs renders a duration compactly for the axis/tooltip: sub-second in ms,\n// otherwise seconds.\nfunction formatMs(ms: number): string {\n return ms < 1000 ? `${ms}ms` : `${(ms / 1000).toFixed(ms < 10_000 ? 1 : 0)}s`;\n}\n\nexport function RunLatencyChart({ series, tz }: { series: RunSeries; tz: TimeZoneMode }) {\n const rows = series.buckets.map((b) => ({\n ts: b.ts,\n avgMs: b.avgMs ?? null,\n maxMs: b.maxMs ?? null,\n }));\n return (\n <ChartContainer config={CONFIG} className=\"aspect-auto h-56 w-full\">\n <LineChart data={rows} margin={{ left: 4, right: 8, top: 8 }}>\n <CartesianGrid vertical={false} />\n <XAxis\n dataKey=\"ts\"\n tickLine={false}\n axisLine={false}\n tickMargin={8}\n minTickGap={24}\n tickFormatter={(ts) => bucketTickLabel(ts, series.bucketSeconds, tz)}\n />\n <YAxis tickLine={false} axisLine={false} width={40} tickFormatter={formatMs} />\n <ChartTooltip\n content={\n <ChartTooltipContent\n formatter={(v) => formatMs(Number(v))}\n labelFormatter={(_, p) =>\n bucketTickLabel(String(p[0]?.payload.ts), series.bucketSeconds, tz)\n }\n />\n }\n />\n <ChartLegend content={<ChartLegendContent />} />\n <Line\n dataKey=\"avgMs\"\n type=\"monotone\"\n stroke=\"var(--color-avgMs)\"\n dot={false}\n connectNulls\n />\n <Line\n dataKey=\"maxMs\"\n type=\"monotone\"\n stroke=\"var(--color-maxMs)\"\n dot={false}\n connectNulls\n />\n </LineChart>\n </ChartContainer>\n );\n}\n","import { Bar, BarChart, CartesianGrid, XAxis, YAxis } from \"recharts\";\nimport type { RunSeries } from \"@durablex/react\";\nimport {\n type ChartConfig,\n ChartContainer,\n ChartLegend,\n ChartLegendContent,\n ChartTooltip,\n ChartTooltipContent,\n} from \"../../ui/chart\";\nimport { bucketTickLabel, type TimeZoneMode } from \"../../lib/time-range\";\n\n// The statuses stacked into each bucket bar, in draw order, each themed by the\n// shared status token so the chart reads the same as the run badges.\nconst STATUS_SERIES = [\n { key: \"succeeded\", label: \"Succeeded\", color: \"var(--st-succeeded-fg)\" },\n { key: \"failed\", label: \"Failed\", color: \"var(--st-failed-fg)\" },\n { key: \"cancelled\", label: \"Cancelled\", color: \"var(--st-cancelled-fg)\" },\n { key: \"running\", label: \"Running\", color: \"var(--st-running-fg)\" },\n { key: \"waiting\", label: \"Waiting\", color: \"var(--st-running-fg)\" },\n { key: \"queued\", label: \"Queued\", color: \"var(--st-queued-fg)\" },\n { key: \"paused\", label: \"Paused\", color: \"var(--st-paused-fg)\" },\n] as const;\n\nconst CONFIG: ChartConfig = Object.fromEntries(\n STATUS_SERIES.map((s) => [s.key, { label: s.label, color: s.color }]),\n);\n\nexport function RunsOverTimeChart({ series, tz }: { series: RunSeries; tz: TimeZoneMode }) {\n const rows = series.buckets.map((b) => ({ ts: b.ts, ...b.counts }));\n return (\n <ChartContainer config={CONFIG} className=\"aspect-auto h-56 w-full\">\n <BarChart data={rows} margin={{ left: 4, right: 8, top: 8 }}>\n <CartesianGrid vertical={false} />\n <XAxis\n dataKey=\"ts\"\n tickLine={false}\n axisLine={false}\n tickMargin={8}\n minTickGap={24}\n tickFormatter={(ts) => bucketTickLabel(ts, series.bucketSeconds, tz)}\n />\n <YAxis tickLine={false} axisLine={false} width={28} allowDecimals={false} />\n <ChartTooltip\n content={\n <ChartTooltipContent\n labelFormatter={(_, p) =>\n bucketTickLabel(String(p[0]?.payload.ts), series.bucketSeconds, tz)\n }\n />\n }\n />\n <ChartLegend content={<ChartLegendContent />} />\n {STATUS_SERIES.map((s) => (\n <Bar key={s.key} dataKey={s.key} stackId=\"runs\" fill={`var(--color-${s.key})`} />\n ))}\n </BarChart>\n </ChartContainer>\n );\n}\n","import { useState } from \"react\";\nimport type { RunSeries } from \"@durablex/react\";\nimport { TimeZoneFilter } from \"../filters/TimeZoneFilter\";\nimport type { TimeZoneMode } from \"../../lib/time-range\";\nimport { ChartCard } from \"./ChartCard\";\nimport { RunLatencyChart } from \"./RunLatencyChart\";\nimport { RunsOverTimeChart } from \"./RunsOverTimeChart\";\n\nexport function RunCharts({ series, loading }: { series?: RunSeries; loading: boolean }) {\n // tz governs the wall clock both time axes render in; the toggle lives on the\n // first chart since it applies to the whole pair.\n const [tz, setTz] = useState<TimeZoneMode>(\"local\");\n\n if (!series || series.buckets.length === 0) {\n return (\n <div className=\"text-muted-foreground grid h-40 place-items-center text-xs\">\n {loading ? \"Loading…\" : \"No runs in this window yet.\"}\n </div>\n );\n }\n return (\n <>\n <ChartCard title=\"Runs over time\" action={<TimeZoneFilter tz={tz} onTz={setTz} />}>\n <RunsOverTimeChart series={series} tz={tz} />\n </ChartCard>\n <ChartCard title=\"Run latency\">\n <RunLatencyChart series={series} tz={tz} />\n </ChartCard>\n </>\n );\n}\n","import type { FlowControl } from \"@durablex/react\";\nimport { formatDuration } from \"./format\";\n\nexport const FLOW_ADAPTERS = [\n \"concurrency\",\n \"throttle\",\n \"rateLimit\",\n \"debounce\",\n \"batch\",\n \"priority\",\n \"singleton\",\n \"idempotency\",\n] as const;\nexport type FlowAdapter = (typeof FLOW_ADAPTERS)[number];\n\nconst LABELS: Record<FlowAdapter, string> = {\n concurrency: \"Concurrency\",\n throttle: \"Throttle\",\n rateLimit: \"Rate limit\",\n debounce: \"Debounce\",\n batch: \"Batch\",\n priority: \"Priority\",\n singleton: \"Singleton\",\n idempotency: \"Idempotency\",\n};\n\nexport function hasFlowControl(fc?: FlowControl): boolean {\n return !!fc && FLOW_ADAPTERS.some((a) => fc[a] != null);\n}\n\nexport interface FlowRow {\n adapter: FlowAdapter;\n label: string;\n value: string;\n scopeKey?: string;\n}\n\n// One display row per configured adapter, in FLOW_ADAPTERS order. value is the\n// human-readable policy; scopeKey (when set) is the event field the policy is\n// keyed on.\nexport function flowControlRows(fc: FlowControl): FlowRow[] {\n const rows: FlowRow[] = [];\n const push = (adapter: FlowAdapter, value: string, scopeKey?: string) =>\n rows.push({ adapter, label: LABELS[adapter], value, scopeKey });\n\n if (fc.concurrency) push(\"concurrency\", `limit ${fc.concurrency.limit}`, fc.concurrency.key);\n if (fc.throttle)\n push(\n \"throttle\",\n `${fc.throttle.limit} per ${formatDuration(fc.throttle.perMs)}`,\n fc.throttle.key,\n );\n if (fc.rateLimit)\n push(\n \"rateLimit\",\n `${fc.rateLimit.limit} per ${formatDuration(fc.rateLimit.perMs)}`,\n fc.rateLimit.key,\n );\n if (fc.debounce)\n push(\"debounce\", `${formatDuration(fc.debounce.periodMs)} window`, fc.debounce.key);\n if (fc.batch)\n push(\"batch\", `up to ${fc.batch.maxSize}, ${formatDuration(fc.batch.timeoutMs)}`, fc.batch.key);\n if (fc.priority) {\n // A positive shift moves the run earlier in the queue (higher priority); negative defers it.\n const { shiftMs } = fc.priority;\n push(\"priority\", `${formatDuration(Math.abs(shiftMs))} ${shiftMs < 0 ? \"later\" : \"earlier\"}`);\n }\n if (fc.singleton) push(\"singleton\", fc.singleton.mode || \"-\", fc.singleton.key);\n if (fc.idempotency) {\n push(\n \"idempotency\",\n fc.idempotency.periodMs ? `${formatDuration(fc.idempotency.periodMs)} window` : \"on\",\n fc.idempotency.key,\n );\n }\n return rows;\n}\n","import { SlidersHorizontal } from \"lucide-react\";\nimport { GlyphBadge } from \"./GlyphBadge\";\n\n// Marks a workflow that has flow-control adapters configured. compact is a bare\n// glyph for dense table cells; the full form adds a labelled chip.\nexport function FlowControlBadge({\n compact,\n className,\n}: {\n compact?: boolean;\n className?: string;\n}) {\n return (\n <GlyphBadge\n icon={SlidersHorizontal}\n tone=\"running\"\n label=\"Flow control\"\n ariaLabel=\"Flow control configured\"\n compact={compact}\n className={className}\n />\n );\n}\n","import type { FlowControl, RunStats } from \"@durablex/react\";\nimport { useFlowState } from \"@durablex/react\";\nimport { SectionHeader } from \"./SectionHeader\";\nimport { type FlowAdapter, type FlowRow, flowControlRows } from \"../lib/flow-control\";\nimport { formatNextFire, formatRelative } from \"../lib/format\";\n\ninterface Live {\n stats?: RunStats;\n pending?: number;\n nextFireAt?: string;\n buffered?: number;\n oldestAt?: string;\n}\n\n// The live runtime number for the adapters that have one. concurrency reads from\n// run stats (in-flight + queued); debounce and batch read their buffer backlogs.\n// The other adapters are config-only and return null. The in-flight count is\n// workflow-wide; a keyed limit applies per scope, so it is shown as a plain count\n// (the configured limit sits in the value column) rather than a count/limit ratio.\nfunction liveLabel(adapter: FlowAdapter, l: Live): string | null {\n switch (adapter) {\n case \"concurrency\": {\n const queued = l.stats?.queued ?? 0;\n const base = `${l.stats?.running ?? 0} in-flight`;\n return queued > 0 ? `${base} · ${queued} queued` : base;\n }\n case \"debounce\":\n return `${l.pending ?? 0} pending${l.nextFireAt ? ` · next ${formatNextFire(l.nextFireAt)}` : \"\"}`;\n case \"batch\":\n return `${l.buffered ?? 0} buffered${l.oldestAt ? ` · oldest ${formatRelative(l.oldestAt)}` : \"\"}`;\n default:\n return null;\n }\n}\n\nfunction FlowControlRow({ row, live }: { row: FlowRow; live: string | null }) {\n return (\n <div className=\"fc-row\">\n <span className=\"fc-label\">{row.label}</span>\n <span className=\"fc-value\">{row.value}</span>\n {row.scopeKey && <span className=\"fc-key\">key {row.scopeKey}</span>}\n {live && <span className=\"fc-live\">{live}</span>}\n </div>\n );\n}\n\nexport function FlowControlSection({\n fc,\n app,\n workflow,\n stats,\n}: {\n fc: FlowControl;\n app: string;\n workflow: string;\n stats?: RunStats;\n}) {\n const flow = useFlowState({ app, workflow });\n const debounce = flow.data?.debounce.find((d) => d.workflow === workflow);\n const batch = flow.data?.batch.find((b) => b.workflow === workflow);\n\n return (\n <section className=\"flowctl\">\n <SectionHeader>Flow control</SectionHeader>\n <div className=\"fc-rows\">\n {flowControlRows(fc).map((row) => (\n <FlowControlRow\n key={row.adapter}\n row={row}\n live={liveLabel(row.adapter, {\n stats,\n pending: debounce?.pending,\n nextFireAt: debounce?.nextFireAt,\n buffered: batch?.buffered,\n oldestAt: batch?.oldestAt,\n })}\n />\n ))}\n </div>\n </section>\n );\n}\n","import { X } from \"lucide-react\";\nimport { useState, type ReactNode } from \"react\";\nimport { useRuns, useRunStats, useRunTimeSeries, type WorkflowDef } from \"@durablex/react\";\nimport { CursorPager } from \"./CursorPager\";\nimport { Meta } from \"./Meta\";\nimport { RunsTable } from \"./RunsTable\";\nimport { StatsTiles } from \"./StatsTiles\";\nimport { SectionHeader } from \"./SectionHeader\";\nimport { AppTag } from \"./AppTag\";\nimport { ScheduledBadge } from \"./ScheduledBadge\";\nimport { RunCharts } from \"./charts/RunCharts\";\nimport { FlowControlSection } from \"./FlowControlSection\";\nimport { TimeRangeFilter } from \"./filters/TimeRangeFilter\";\nimport { useKeysetPager } from \"../hooks/use-keyset-pager\";\nimport { hasFlowControl } from \"../lib/flow-control\";\nimport { formatNextFire, formatTime } from \"../lib/format\";\nimport { DEFAULT_RUN_SORT, type RunSortKey, toggleRunSort } from \"../lib/run-sort\";\nimport { DEFAULT_TIME_RANGE, seriesBucketSeconds, timeLabel, windowSince } from \"../lib/time-range\";\n\nconst RUNS_PAGE_SIZE = 30;\n\nexport function WorkflowDetail({\n workflow,\n onClose,\n onOpenRun,\n renderRunAction,\n}: {\n workflow: WorkflowDef;\n onClose(): void;\n onOpenRun(runId: string): void;\n renderRunAction?: (workflow: WorkflowDef) => ReactNode;\n}) {\n const [time, setTime] = useState(DEFAULT_TIME_RANGE);\n const [sort, setSort] = useState(DEFAULT_RUN_SORT);\n const onSort = (key: RunSortKey) => setSort((prev) => toggleRunSort(prev, key));\n\n const since = windowSince(time);\n const bucket = seriesBucketSeconds(time);\n const scope = { app: workflow.app, workflow: workflow.name };\n\n // Reset to the newest page whenever the time range or sort changes.\n const { cursor, canNewer, range, goOlder, goNewer } = useKeysetPager(\n `${time}|${sort.key}-${sort.dir}`,\n RUNS_PAGE_SIZE,\n );\n\n const stats = useRunStats({ ...scope, since });\n // Concurrency in-flight/queued are point-in-time, so they read an unwindowed count\n // (a run executing longer than the selected range still counts as in flight).\n const liveStats = useRunStats(scope);\n const { data: series, isLoading: seriesLoading } = useRunTimeSeries({ ...scope, since, bucket });\n const runs = useRuns({\n ...scope,\n since,\n sort: sort.key,\n dir: sort.dir,\n limit: RUNS_PAGE_SIZE,\n cursor,\n });\n const rows = runs.data?.runs ?? [];\n const nextCursor = runs.data?.nextCursor ?? null;\n const { start: rangeStart, end: rangeEnd } = range(rows.length);\n const schedule = workflow.scheduled ? workflow.schedules?.[0] : undefined;\n\n return (\n <div className=\"run-panel\">\n <div className=\"panel-head\">\n <div className=\"ph-top\">\n <h2>\n <span className=\"h2-name\">{workflow.name}</span>\n </h2>\n <div className=\"ph-actions\">\n {renderRunAction?.(workflow)}\n <button\n type=\"button\"\n className=\"iconbtn focusable\"\n aria-label=\"Close\"\n onClick={onClose}\n >\n <X />\n </button>\n </div>\n </div>\n <div className=\"ph-status\">\n <AppTag app={workflow.app} />\n {schedule && (\n <span className=\"step-cell\">\n <ScheduledBadge compact />\n <span className=\"font-mono text-xs\">{schedule.cron}</span>\n </span>\n )}\n </div>\n </div>\n\n <div className=\"panel-body\">\n <div className=\"metagrid\">\n <Meta label=\"App\" value={workflow.app} />\n <Meta label=\"Max attempts\" value={String(workflow.maxAttempts)} />\n <Meta label=\"Backoff\" value={workflow.backoff} />\n <Meta label=\"Schedule\" value={schedule ? schedule.cron : \"Not scheduled\"} />\n {schedule && <Meta label=\"Next fire\" value={formatNextFire(schedule.nextFireAt)} />}\n <Meta label=\"Registered\" value={formatTime(workflow.registeredAt)} />\n <Meta label=\"Updated\" value={formatTime(workflow.updatedAt)} />\n </div>\n\n {hasFlowControl(workflow.flowControl) && workflow.flowControl && (\n <FlowControlSection\n fc={workflow.flowControl}\n app={workflow.app}\n workflow={workflow.name}\n stats={liveStats.data}\n />\n )}\n\n <StatsTiles stats={stats.data} rangeLabel={timeLabel(time)} />\n <div className=\"filterbar\">\n <TimeRangeFilter time={time} onTime={setTime} />\n </div>\n\n <RunCharts series={series} loading={seriesLoading} />\n\n <SectionHeader>Runs</SectionHeader>\n <RunsTable\n rows={rows}\n selectedId={null}\n onSelect={onOpenRun}\n sort={sort}\n onSort={onSort}\n loading={runs.isLoading}\n isError={runs.isError}\n error={runs.error}\n emptyTitle=\"No runs yet\"\n emptyMessage=\"This workflow has no runs in the selected window.\"\n hideColumns={[\"workflow\", \"app\"]}\n />\n {!runs.isLoading && rows.length > 0 && (\n <CursorPager\n rangeStart={rangeStart}\n rangeEnd={rangeEnd}\n canNewer={canNewer}\n canOlder={nextCursor != null}\n onNewer={goNewer}\n onOlder={() => goOlder(nextCursor)}\n />\n )}\n </div>\n </div>\n );\n}\n","import { type KeyboardEvent, type ReactNode, useState } from \"react\";\nimport { useWorkflows, type WorkflowDef } from \"@durablex/react\";\nimport { ResizableHandle, ResizablePanel, ResizablePanelGroup } from \"../ui/resizable\";\nimport { hasFlowControl } from \"../lib/flow-control\";\nimport { ALL_FILTER } from \"../lib/run-filters\";\nimport { formatNextFire, formatTime } from \"../lib/format\";\nimport { AppFilter } from \"./filters/AppFilter\";\nimport { AppTag } from \"./AppTag\";\nimport { ScheduledBadge } from \"./ScheduledBadge\";\nimport { FlowControlBadge } from \"./FlowControlBadge\";\nimport { WorkflowDetail } from \"./WorkflowDetail\";\n\nconst WORKFLOW_COLUMNS = 6;\n// A workflow is identified by (app, name); JSON-encode the pair so the key can't\n// collide for different splits of the same concatenation (e.g. a|bc vs ab|c).\nconst workflowKey = (w: { app: string; name: string }) => JSON.stringify([w.app, w.name]);\n\nexport function WorkflowsView({\n onOpenRun,\n renderRunAction,\n}: {\n onOpenRun?: (runId: string) => void;\n renderRunAction?: (workflow: WorkflowDef) => ReactNode;\n}) {\n const { data, isLoading, isError, error } = useWorkflows();\n const [app, setApp] = useState<string>(ALL_FILTER);\n const [selectedKey, setSelectedKey] = useState<string | null>(null);\n\n const rows = (data ?? []).filter((w) => app === ALL_FILTER || w.app === app);\n const selected = (data ?? []).find((w) => workflowKey(w) === selectedKey) ?? null;\n\n return (\n <ResizablePanelGroup orientation=\"horizontal\" className=\"min-h-0 flex-1\">\n <ResizablePanel minSize=\"30%\">\n <div className=\"content\">\n <div className=\"tbar\">\n <span className=\"meta\">{rows.length} workflows</span>\n <span className=\"tbar-spacer\" />\n <AppFilter app={app} onApp={setApp} align=\"right\" />\n </div>\n\n <div className=\"tablewrap\">\n <table className=\"runs\">\n <thead>\n <tr>\n <th>Name</th>\n <th>App</th>\n <th>Schedule</th>\n <th>Next run</th>\n <th className=\"num\">Max attempts</th>\n <th>Backoff</th>\n </tr>\n </thead>\n <tbody>\n {isLoading && rows.length === 0 ? (\n <tr className=\"table-status\">\n <td colSpan={WORKFLOW_COLUMNS}>Loading workflows…</td>\n </tr>\n ) : isError ? (\n <tr className=\"table-status\">\n <td colSpan={WORKFLOW_COLUMNS}>\n {error instanceof Error ? error.message : \"Failed to load workflows\"}\n </td>\n </tr>\n ) : rows.length === 0 ? (\n <tr className=\"table-status\">\n <td colSpan={WORKFLOW_COLUMNS}>\n No workflows registered. Start a runner to register one.\n </td>\n </tr>\n ) : (\n rows.map((w) => (\n <WorkflowRow\n key={workflowKey(w)}\n workflow={w}\n selected={workflowKey(w) === selectedKey}\n onSelect={() => setSelectedKey(workflowKey(w))}\n />\n ))\n )}\n </tbody>\n </table>\n </div>\n </div>\n </ResizablePanel>\n {selected && (\n <>\n <ResizableHandle withHandle />\n <ResizablePanel defaultSize=\"42%\" minSize=\"28%\" maxSize=\"68%\">\n <WorkflowDetail\n key={selectedKey ?? \"\"}\n workflow={selected}\n onClose={() => setSelectedKey(null)}\n onOpenRun={onOpenRun ?? (() => {})}\n renderRunAction={renderRunAction}\n />\n </ResizablePanel>\n </>\n )}\n </ResizablePanelGroup>\n );\n}\n\nfunction WorkflowRow({\n workflow: w,\n selected,\n onSelect,\n}: {\n workflow: WorkflowDef;\n selected: boolean;\n onSelect(): void;\n}) {\n const onKeyDown = (e: KeyboardEvent<HTMLTableRowElement>) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onSelect();\n }\n };\n const schedule = w.scheduled ? w.schedules?.[0] : undefined;\n\n return (\n <tr\n className=\"row focusable\"\n tabIndex={0}\n data-selected={selected ? \"1\" : \"0\"}\n onClick={onSelect}\n onKeyDown={onKeyDown}\n >\n <td>\n <div className=\"wf-cell\">\n <span className=\"wf-name\">{w.name}</span>\n {hasFlowControl(w.flowControl) && <FlowControlBadge compact />}\n </div>\n </td>\n <td>\n <AppTag app={w.app} />\n </td>\n <td>\n {schedule ? (\n <div className=\"step-cell\">\n <ScheduledBadge compact />\n <span className=\"font-mono text-xs\">{schedule.cron}</span>\n {w.schedules && w.schedules.length > 1 && (\n <span className=\"cell-mut\">+{w.schedules.length - 1}</span>\n )}\n </div>\n ) : (\n <span className=\"cell-mut\">-</span>\n )}\n </td>\n <td>\n {schedule ? (\n <span className=\"cell-mut\" title={formatTime(schedule.nextFireAt)}>\n {formatNextFire(schedule.nextFireAt)}\n </span>\n ) : (\n <span className=\"cell-mut\">-</span>\n )}\n </td>\n <td className=\"num\">\n <span className=\"dur\">{w.maxAttempts}</span>\n </td>\n <td>\n <span className=\"cell-mut font-mono text-xs\">{w.backoff}</span>\n </td>\n </tr>\n );\n}\n","import { StatusBadge } from \"./StatusBadge\";\n\nconst RUNNER_BADGE = {\n live: { status: \"succeeded\", label: \"Live\" },\n stale: { status: \"cancelled\", label: \"Stale\" },\n} as const;\n\nexport function RunnerLiveBadge({ live, small }: { live: boolean; small?: boolean }) {\n const m = live ? RUNNER_BADGE.live : RUNNER_BADGE.stale;\n return <StatusBadge status={m.status} label={m.label} small={small} />;\n}\n","import type { AppStatus } from \"@durablex/react\";\nimport { StatusBadge } from \"./StatusBadge\";\n\nconst APP_BADGE: Record<\n AppStatus,\n { status: \"succeeded\" | \"running\" | \"failed\" | \"cancelled\"; label: string }\n> = {\n connected: { status: \"succeeded\", label: \"Connected\" },\n syncing: { status: \"running\", label: \"Syncing\" },\n error: { status: \"failed\", label: \"Error\" },\n disconnected: { status: \"cancelled\", label: \"Disconnected\" },\n};\n\nexport function AppStatusBadge({ status, small }: { status: AppStatus; small?: boolean }) {\n const m = APP_BADGE[status];\n return <StatusBadge status={m.status} label={m.label} small={small} />;\n}\n","import { useMemo, useState } from \"react\";\nimport { useApps, type AppInfo, type AppStatus, type Runner } from \"@durablex/react\";\nimport { appHue } from \"../lib/app-color\";\nimport { formatRelative } from \"../lib/format\";\nimport { AppStatusBadge } from \"./AppStatusBadge\";\nimport { Meta } from \"./Meta\";\nimport { RunnerLiveBadge } from \"./RunnerLiveBadge\";\nimport { StatusBadge } from \"./StatusBadge\";\n\ninterface AppTile {\n label: string;\n value: number;\n sub: string;\n color: string;\n}\n\nexport function AppsView() {\n const { data: apps, isLoading } = useApps();\n\n const tiles = useMemo<AppTile[]>(() => {\n const by = (s: AppStatus) => apps.filter((a) => a.status === s).length;\n const issues = by(\"error\") + by(\"disconnected\");\n return [\n {\n label: \"Apps\",\n value: apps.length,\n sub: \"connected endpoints\",\n color: \"var(--muted-foreground)\",\n },\n {\n label: \"Connected\",\n value: by(\"connected\"),\n sub: \"healthy\",\n color: \"var(--st-succeeded-fg)\",\n },\n { label: \"Syncing\", value: by(\"syncing\"), sub: \"in progress\", color: \"var(--st-running-fg)\" },\n {\n label: \"Issues\",\n value: issues,\n sub: issues ? \"need attention\" : \"all clear\",\n color: issues ? \"var(--st-failed-fg)\" : \"var(--muted-foreground)\",\n },\n ];\n }, [apps]);\n\n return (\n <div className=\"content\">\n <div className=\"stats\">\n {tiles.map((t) => (\n <div className=\"stat\" key={t.label}>\n <div className=\"stat-top\">\n <i className=\"stat-dot\" style={{ background: t.color }} />\n <span className=\"stat-label\">{t.label}</span>\n </div>\n <div className=\"stat-val\">{t.value}</div>\n <div className=\"stat-sub\">\n <span>{t.sub}</span>\n </div>\n </div>\n ))}\n </div>\n\n <div className=\"tbar\">\n <span className=\"meta\">{apps.length} apps</span>\n </div>\n\n <div className=\"tablewrap\">\n <table className=\"runs apps-table\">\n <thead>\n <tr>\n <th>App</th>\n <th>Status</th>\n <th className=\"num\">Workflows</th>\n <th className=\"num\">Runs</th>\n <th>Last activity</th>\n </tr>\n </thead>\n <tbody>\n {isLoading && apps.length === 0 ? (\n <tr className=\"table-status\">\n <td colSpan={5}>Loading apps…</td>\n </tr>\n ) : apps.length === 0 ? (\n <tr className=\"table-status\">\n <td colSpan={5}>No apps yet. Start a runner to register one via the SDK.</td>\n </tr>\n ) : (\n apps.map((app) => <AppRow key={app.name} app={app} />)\n )}\n </tbody>\n </table>\n </div>\n </div>\n );\n}\n\nfunction AppRow({ app }: { app: AppInfo }) {\n const [open, setOpen] = useState(false);\n\n return (\n <>\n <tr className=\"row app-row\" aria-expanded={open} onClick={() => setOpen((o) => !o)}>\n <td>\n <div className=\"app-cell\">\n <ChevronGlyph />\n <i className=\"sq\" style={{ background: appHue(app.name) }} />\n <div className=\"app-id\">\n <span className=\"nm\">{app.name}</span>\n </div>\n </div>\n </td>\n <td>\n <AppStatusBadge status={app.status} />\n </td>\n <td className=\"num\">\n <span className=\"dur\">{app.workflowCount}</span>\n </td>\n <td className=\"num\">\n <span className=\"dur\">{app.runCount}</span>\n </td>\n <td>\n <span className=\"ts cell-mut\">\n {app.lastSyncAt ? formatRelative(app.lastSyncAt) : \"-\"}\n </span>\n </td>\n </tr>\n {open && (\n <tr className=\"app-detailrow\">\n <td colSpan={5}>\n <div className=\"app-detail-list\">\n <div className=\"app-sub\">Synced workflows · {app.workflows.length}</div>\n {app.workflows.length ? (\n app.workflows.map((w) => (\n <div className=\"app-wf\" key={w.name}>\n <span className=\"app-wf-name\">{w.name}</span>\n {w.lastStatus ? (\n <StatusBadge status={w.lastStatus} small />\n ) : (\n <span className=\"cell-mut\" style={{ fontSize: 11 }}>\n no runs\n </span>\n )}\n </div>\n ))\n ) : (\n <div className=\"cell-mut\" style={{ fontSize: 12, padding: \"4px 0\" }}>\n No workflows registered.\n </div>\n )}\n\n <div className=\"app-sub\">Connected runners · {app.runners.length}</div>\n {app.runners.length ? (\n app.runners.map((rn) => <RunnerRow key={rn.runnerId} runner={rn} />)\n ) : (\n <div className=\"cell-mut\" style={{ fontSize: 12, padding: \"4px 0\" }}>\n No runners connected.\n </div>\n )}\n </div>\n </td>\n </tr>\n )}\n </>\n );\n}\n\nfunction RunnerRow({ runner }: { runner: Runner }) {\n const rows = runnerMetaRows(runner);\n return (\n <div className=\"runner-block\">\n <div className=\"app-wf\">\n <span className=\"app-wf-name\" title={runner.url}>\n {runner.runnerId}\n </span>\n <span className=\"runner-row-end\">\n <span className=\"cell-mut\" style={{ fontSize: 11 }}>\n {runner.lastSeenAt ? formatRelative(runner.lastSeenAt) : \"-\"}\n </span>\n <RunnerLiveBadge live={runner.live} small />\n </span>\n </div>\n {rows.length > 0 && (\n <div className=\"metagrid runner-meta\">\n {rows.map((r) => (\n <Meta key={r.label} label={r.label} value={r.value} />\n ))}\n </div>\n )}\n </div>\n );\n}\n\n// runnerMetaRows builds the handshake fields a runner actually reported - absent\n// ones are dropped rather than shown blank (no mock fields).\nfunction runnerMetaRows(r: Runner): { label: string; value: string }[] {\n const rows: { label: string; value: string }[] = [];\n if (r.framework) rows.push({ label: \"framework\", value: r.framework });\n if (r.runtime) rows.push({ label: \"runtime\", value: r.runtime });\n const sdk = [r.sdkName, r.version].filter(Boolean).join(\" \");\n if (sdk) rows.push({ label: \"sdk\", value: sdk });\n if (r.region) rows.push({ label: \"region\", value: r.region });\n if (r.keyFingerprint) {\n const match =\n r.keyMatches === true ? \" (matches)\" : r.keyMatches === false ? \" (mismatch)\" : \"\";\n rows.push({ label: \"key\", value: r.keyFingerprint + match });\n }\n if (r.url) rows.push({ label: \"endpoint\", value: r.url });\n return rows;\n}\n\nfunction ChevronGlyph() {\n return (\n <svg\n className=\"app-chev\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.8}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m9 6 6 6-6 6\" />\n </svg>\n );\n}\n","export const TABLE_HEAD_CLASS =\n \"text-muted-foreground/70 h-7 px-2 text-[10px] tracking-wider uppercase\";\n","import * as React from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\nfunction Table({ className, ...props }: React.ComponentProps<\"table\">) {\n return (\n <div data-slot=\"table-container\" className=\"relative w-full overflow-x-auto\">\n <table\n data-slot=\"table\"\n className={cn(\"w-full caption-bottom text-sm\", className)}\n {...props}\n />\n </div>\n );\n}\n\nfunction TableHeader({ className, ...props }: React.ComponentProps<\"thead\">) {\n return <thead data-slot=\"table-header\" className={cn(\"[&_tr]:border-b\", className)} {...props} />;\n}\n\nfunction TableBody({ className, ...props }: React.ComponentProps<\"tbody\">) {\n return (\n <tbody\n data-slot=\"table-body\"\n className={cn(\"[&_tr:last-child]:border-0\", className)}\n {...props}\n />\n );\n}\n\nfunction TableFooter({ className, ...props }: React.ComponentProps<\"tfoot\">) {\n return (\n <tfoot\n data-slot=\"table-footer\"\n className={cn(\"border-t bg-muted/50 font-medium [&>tr]:last:border-b-0\", className)}\n {...props}\n />\n );\n}\n\nfunction TableRow({ className, ...props }: React.ComponentProps<\"tr\">) {\n return (\n <tr\n data-slot=\"table-row\"\n className={cn(\n \"border-b transition-colors hover:bg-muted/50 has-aria-expanded:bg-muted/50 data-[state=selected]:bg-muted\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction TableHead({ className, ...props }: React.ComponentProps<\"th\">) {\n return (\n <th\n data-slot=\"table-head\"\n className={cn(\n \"h-10 px-2 text-left align-middle font-medium whitespace-nowrap text-foreground [&:has([role=checkbox])]:pr-0\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction TableCell({ className, ...props }: React.ComponentProps<\"td\">) {\n return (\n <td\n data-slot=\"table-cell\"\n className={cn(\"p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0\", className)}\n {...props}\n />\n );\n}\n\nfunction TableCaption({ className, ...props }: React.ComponentProps<\"caption\">) {\n return (\n <caption\n data-slot=\"table-caption\"\n className={cn(\"mt-4 text-sm text-muted-foreground\", className)}\n {...props}\n />\n );\n}\n\nexport { Table, TableHeader, TableBody, TableFooter, TableHead, TableRow, TableCell, TableCaption };\n","import { Loader2 } from \"lucide-react\";\nimport { TableCell, TableRow } from \"../ui/table\";\n\ninterface TableStatusRowsProps {\n colSpan: number;\n isLoading: boolean;\n hasData: boolean;\n isError: boolean;\n error: Error | null;\n emptyMessage: string;\n errorFallback: string;\n}\n\nexport function TableStatusRows({\n colSpan,\n isLoading,\n hasData,\n isError,\n error,\n emptyMessage,\n errorFallback,\n}: TableStatusRowsProps) {\n if (isLoading && !hasData) {\n return (\n <TableRow>\n <TableCell colSpan={colSpan} className=\"py-8 text-center\">\n <Loader2 className=\"text-muted-foreground mx-auto h-4 w-4 animate-spin\" />\n </TableCell>\n </TableRow>\n );\n }\n\n if (isError) {\n return (\n <TableRow>\n <TableCell colSpan={colSpan} className=\"text-destructive py-6 text-center text-sm\">\n {error?.message ?? errorFallback}\n </TableCell>\n </TableRow>\n );\n }\n\n if (!hasData) {\n return (\n <TableRow>\n <TableCell colSpan={colSpan} className=\"text-muted-foreground py-6 text-center text-sm\">\n {emptyMessage}\n </TableCell>\n </TableRow>\n );\n }\n\n return null;\n}\n","import { ChevronDown, ChevronRight, Radio } from \"lucide-react\";\nimport { Fragment, useState } from \"react\";\nimport type { EventLogRecord, TriggeredOutcome } from \"@durablex/react\";\nimport { formatRelative } from \"../lib/format\";\nimport { TABLE_HEAD_CLASS } from \"../lib/table\";\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from \"../ui/table\";\nimport { AppTag } from \"./AppTag\";\nimport { TableStatusRows } from \"./TableStatusRows\";\n\nconst EVENT_COLUMNS = 5;\n\ninterface EventsListProps {\n events?: EventLogRecord[];\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n onOpenRun?: (runId: string) => void;\n}\n\n// outcomeSummary describes what an event did: runs created, gated matches, and\n// resumed waiters. An event that matched nothing reads as a dash.\nfunction outcomeSummary(ev: EventLogRecord): string {\n const runs = ev.triggered.filter((t) => t.runId).length;\n const gated = ev.triggered.length - runs;\n const parts: string[] = [];\n if (runs > 0) parts.push(`${runs} run${runs === 1 ? \"\" : \"s\"}`);\n if (gated > 0) parts.push(`${gated} gated`);\n if (ev.woke > 0) parts.push(`woke ${ev.woke}`);\n return parts.length > 0 ? parts.join(\" · \") : \"-\";\n}\n\n// Flags are mutually exclusive per the engine's trigger().\nfunction outcomeLabel(t: TriggeredOutcome): string {\n if (t.runId) return \"ran\";\n if (t.deduped) return \"deduped\";\n if (t.debounced) return \"debounced\";\n if (t.batched) return \"batched\";\n if (t.dropped) return \"dropped\";\n if (t.skipped) return \"skipped\";\n return \"no run\";\n}\n\nfunction OutcomeBadge({ outcome }: { outcome: TriggeredOutcome }) {\n const ran = Boolean(outcome.runId);\n return (\n <span\n className={\n \"border px-1.5 py-0.5 font-mono text-[10px] \" +\n (ran\n ? \"border-emerald-500/40 text-emerald-600 dark:text-emerald-400\"\n : \"text-muted-foreground\")\n }\n >\n {outcomeLabel(outcome)}\n </span>\n );\n}\n\nfunction TriggeredRow({\n outcome,\n onOpenRun,\n}: {\n outcome: TriggeredOutcome;\n onOpenRun?: (runId: string) => void;\n}) {\n const runId = outcome.runId;\n return (\n <div className=\"flex items-center gap-2 py-0.5\">\n <OutcomeBadge outcome={outcome} />\n <span className=\"text-xs font-medium\">{outcome.workflow}</span>\n {outcome.app && <AppTag app={outcome.app} />}\n {runId &&\n (onOpenRun ? (\n <button\n type=\"button\"\n className=\"text-muted-foreground hover:text-foreground font-mono text-[11px] underline underline-offset-2\"\n onClick={() => onOpenRun(runId)}\n >\n {runId}\n </button>\n ) : (\n <span className=\"text-muted-foreground font-mono text-[11px]\">{runId}</span>\n ))}\n </div>\n );\n}\n\nexport function EventsList({ events, isLoading, isError, error, onOpenRun }: EventsListProps) {\n const [expanded, setExpanded] = useState<string | null>(null);\n const toggle = (id: string) => setExpanded((cur) => (cur === id ? null : id));\n\n return (\n <div className=\"rounded-md border\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead className={TABLE_HEAD_CLASS}>Received</TableHead>\n <TableHead className={TABLE_HEAD_CLASS}>Event</TableHead>\n <TableHead className={TABLE_HEAD_CLASS}>App</TableHead>\n <TableHead className={TABLE_HEAD_CLASS}>Source</TableHead>\n <TableHead className={TABLE_HEAD_CLASS}>Outcome</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n <TableStatusRows\n colSpan={EVENT_COLUMNS}\n isLoading={isLoading}\n hasData={(events?.length ?? 0) > 0}\n isError={isError}\n error={error}\n emptyMessage=\"No events yet. Fire one with POST /events or emit from a workflow.\"\n errorFallback=\"Failed to load events\"\n />\n {events?.map((ev) => {\n const open = expanded === ev.id;\n const Chevron = open ? ChevronDown : ChevronRight;\n return (\n <Fragment key={ev.id}>\n <TableRow className=\"cursor-pointer\" onClick={() => toggle(ev.id)}>\n <TableCell className=\"text-muted-foreground px-2 py-1.5 font-mono text-[11px] whitespace-nowrap\">\n {formatRelative(ev.receivedAt)}\n </TableCell>\n <TableCell className=\"px-2 py-1.5\">\n <div className=\"flex items-center gap-1.5\">\n <Chevron className=\"text-muted-foreground size-3.5 shrink-0\" />\n <Radio className=\"text-muted-foreground size-3.5 shrink-0 opacity-70\" />\n <span className=\"text-xs font-medium\">{ev.name}</span>\n </div>\n </TableCell>\n <TableCell className=\"px-2 py-1.5\">\n <AppTag app={ev.app} />\n </TableCell>\n <TableCell className=\"text-muted-foreground px-2 py-1.5 font-mono text-[11px]\">\n {ev.source}\n </TableCell>\n <TableCell className=\"text-muted-foreground px-2 py-1.5 font-mono text-[11px]\">\n {outcomeSummary(ev)}\n </TableCell>\n </TableRow>\n {open && (\n <TableRow>\n <TableCell colSpan={EVENT_COLUMNS} className=\"bg-muted/30 px-2 py-2\">\n {ev.triggered.length > 0 ? (\n <div className=\"flex flex-col gap-0.5 pl-6\">\n {ev.triggered.map((t) => (\n <TriggeredRow\n key={`${t.workflow}-${t.app ?? \"\"}`}\n outcome={t}\n onOpenRun={onOpenRun}\n />\n ))}\n </div>\n ) : (\n <span className=\"text-muted-foreground pl-6 font-mono text-[11px]\">\n {ev.woke > 0\n ? `Woke ${ev.woke} waiting run(s); no new run.`\n : \"Matched no workflow.\"}\n </span>\n )}\n </TableCell>\n </TableRow>\n )}\n </Fragment>\n );\n })}\n </TableBody>\n </Table>\n </div>\n );\n}\n","import type { SendEventResult, TriggeredOutcome } from \"@durablex/react\";\n\nfunction triggerStatus(o: TriggeredOutcome): string {\n if (o.dropped) return \"dropped\";\n if (o.deduped) return \"deduped\";\n if (o.debounced) return \"debounced\";\n if (o.batched) return \"batched\";\n if (o.skipped) return \"skipped\";\n return \"started\";\n}\n\nfunction TriggerRow({\n t,\n onOpenRun,\n}: {\n t: TriggeredOutcome;\n onOpenRun?: (runId: string) => void;\n}) {\n const status = triggerStatus(t);\n const runId = t.runId;\n return (\n <li className=\"flex items-center justify-between gap-2 font-mono\">\n <span className=\"truncate\">{t.workflow}</span>\n {runId && onOpenRun ? (\n <button\n type=\"button\"\n className=\"text-primary hover:underline\"\n onClick={() => onOpenRun(runId)}\n >\n {status}\n </button>\n ) : (\n <span className=\"text-muted-foreground\">{status}</span>\n )}\n </li>\n );\n}\n\nexport function TriggerEventResult({\n result,\n onOpenRun,\n}: {\n result: SendEventResult;\n onOpenRun?: (runId: string) => void;\n}) {\n const triggered = result.triggered ?? [];\n return (\n <div className=\"rounded-lg border border-border bg-muted/40 p-2.5 text-xs\">\n <div className=\"font-medium text-foreground\">\n Event accepted · woke {result.woke} {result.woke === 1 ? \"run\" : \"runs\"}\n </div>\n {triggered.length > 0 ? (\n <ul className=\"mt-1.5 flex flex-col gap-1\">\n {triggered.map((t, i) => (\n <TriggerRow key={`${t.workflow}-${i}`} t={t} onOpenRun={onOpenRun} />\n ))}\n </ul>\n ) : null}\n </div>\n );\n}\n","import { useMemo, useState, type ReactNode } from \"react\";\nimport { ZapIcon } from \"lucide-react\";\nimport {\n useTriggerEvent,\n useWorkflows,\n type SendEventResult,\n type WorkflowDef,\n} from \"@durablex/react\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from \"../ui/dialog\";\nimport { Button } from \"../ui/button\";\nimport { Input } from \"../ui/input\";\nimport { parseJson } from \"../lib/json-highlight\";\nimport { ALL_FILTER } from \"../lib/run-filters\";\nimport { AppFilter } from \"./filters/AppFilter\";\nimport { JsonEditor } from \"./JsonEditor\";\nimport { TriggerEventResult } from \"./TriggerEventResult\";\n\nexport function TriggerEventDialog({ onOpenRun }: { onOpenRun?: (runId: string) => void }) {\n const [open, setOpen] = useState(false);\n\n return (\n <Dialog open={open} onOpenChange={setOpen}>\n <DialogTrigger asChild>\n <Button size=\"sm\" variant=\"outline\">\n <ZapIcon /> Trigger event\n </Button>\n </DialogTrigger>\n <DialogContent className=\"sm:max-w-md\">\n {open && <TriggerForm onClose={() => setOpen(false)} onOpenRun={onOpenRun} />}\n </DialogContent>\n </Dialog>\n );\n}\n\n// Concrete (non-wildcard) event names a workflow can be triggered by, for the\n// event-name autocomplete - a workflow with no triggers fires on its own name.\nfunction knownEventNames(workflows: WorkflowDef[] | undefined): string[] {\n const names = new Set<string>();\n for (const w of workflows ?? []) {\n const triggers = w.triggers ?? [];\n if (triggers.length === 0) names.add(w.name);\n for (const t of triggers) {\n if (t.event && !t.event.endsWith(\"*\")) names.add(t.event);\n }\n }\n return [...names].sort();\n}\n\nfunction TriggerForm({\n onClose,\n onOpenRun,\n}: {\n onClose: () => void;\n onOpenRun?: (runId: string) => void;\n}) {\n const { data: workflows } = useWorkflows();\n const eventNames = useMemo(() => knownEventNames(workflows), [workflows]);\n\n const [name, setName] = useState(\"\");\n const [app, setApp] = useState<string>(ALL_FILTER);\n const [payload, setPayload] = useState(\"{}\");\n const [result, setResult] = useState<SendEventResult | null>(null);\n const fire = useTriggerEvent();\n\n const parsed = useMemo(() => parseJson(payload), [payload]);\n const canSubmit = name.trim() !== \"\" && parsed.ok && !fire.isPending;\n\n function submit() {\n if (!parsed.ok) return;\n fire.mutate(\n { name: name.trim(), app: app === ALL_FILTER ? undefined : app, data: parsed.value },\n { onSuccess: setResult },\n );\n }\n\n return (\n <>\n <DialogHeader>\n <DialogTitle>Trigger event</DialogTitle>\n <DialogDescription>\n Fire an event into the engine. Every workflow whose trigger matches the name runs.\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"flex flex-col gap-3\">\n <Field label=\"Event name\" htmlFor=\"trigger-name\">\n <Input\n id=\"trigger-name\"\n list=\"trigger-event-names\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"order.placed\"\n autoFocus\n />\n <datalist id=\"trigger-event-names\">\n {eventNames.map((n) => (\n <option key={n} value={n} />\n ))}\n </datalist>\n </Field>\n\n <div className=\"flex flex-col gap-1.5\">\n <span className=\"text-xs font-medium\">App</span>\n <div>\n <AppFilter app={app} onApp={setApp} />\n </div>\n <span className=\"text-muted-foreground text-[11px]\">\n \"All apps\" fires the event namespace-wide.\n </span>\n </div>\n\n <Field label=\"Payload\" htmlFor=\"trigger-payload\" hint=\"JSON\">\n <JsonEditor\n value={payload}\n onChange={setPayload}\n invalid={!parsed.ok}\n ariaLabel=\"Event payload\"\n />\n {!parsed.ok ? <span className=\"text-xs text-destructive\">{parsed.error}</span> : null}\n </Field>\n\n {result ? (\n <TriggerEventResult\n result={result}\n onOpenRun={\n onOpenRun\n ? (id) => {\n onClose();\n onOpenRun(id);\n }\n : undefined\n }\n />\n ) : null}\n {fire.isError ? (\n <span className=\"text-xs text-destructive\">\n Could not fire event:{\" \"}\n {fire.error instanceof Error ? fire.error.message : \"unknown error\"}\n </span>\n ) : null}\n </div>\n\n <DialogFooter showCloseButton>\n <Button disabled={!canSubmit} onClick={submit}>\n {fire.isPending ? \"Firing...\" : \"Fire event\"}\n </Button>\n </DialogFooter>\n </>\n );\n}\n\nfunction Field({\n label,\n htmlFor,\n hint,\n children,\n}: {\n label: string;\n htmlFor: string;\n hint?: string;\n children: ReactNode;\n}) {\n return (\n <div className=\"flex flex-col gap-1.5\">\n <label htmlFor={htmlFor} className=\"flex items-center gap-1.5 text-xs font-medium\">\n {label}\n {hint ? <span className=\"font-normal text-muted-foreground\">{hint}</span> : null}\n </label>\n {children}\n </div>\n );\n}\n","import { useEvents } from \"@durablex/react\";\nimport { EventsList } from \"./EventsList\";\nimport { TriggerEventDialog } from \"./TriggerEventDialog\";\n\nexport function EventsView({ onOpenRun }: { onOpenRun?: (runId: string) => void }) {\n const { data: events, isLoading, isError, error } = useEvents();\n return (\n <div className=\"flex min-h-0 flex-1 flex-col gap-3 overflow-y-auto p-4\">\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"text-muted-foreground font-mono text-[11px]\">\n {events?.length ?? 0} events · live\n </span>\n <TriggerEventDialog onOpenRun={onOpenRun} />\n </div>\n <EventsList\n events={events}\n isLoading={isLoading}\n isError={isError}\n error={error}\n onOpenRun={onOpenRun}\n />\n </div>\n );\n}\n","import type { WorkflowDef } from \"@durablex/react\";\n\n// A single event a workflow can be run from. `value` is what to pre-fill into the\n// event-name field: a wildcard pattern has its trailing \"*\" stripped so the user\n// completes a concrete name. `filter` is the trigger's CEL `if`, surfaced as a hint.\nexport interface EventRunOption {\n value: string;\n pattern: string;\n isWildcard: boolean;\n filter?: string;\n}\n\n// A cron-only workflow has no event to fire and no manual fire-now endpoint, so it\n// is not runnable from the dashboard yet (Phase 4). A workflow with no triggers at\n// all runs on an event matching its own name.\nexport interface WorkflowRunPlan {\n runnable: boolean;\n options: EventRunOption[];\n}\n\nexport function workflowRunPlan(workflow: WorkflowDef): WorkflowRunPlan {\n const triggers = workflow.triggers ?? [];\n\n if (triggers.length === 0) {\n return {\n runnable: true,\n options: [{ value: workflow.name, pattern: workflow.name, isWildcard: false }],\n };\n }\n\n const options = triggers.flatMap<EventRunOption>((t) => {\n if (!t.event) return [];\n const isWildcard = t.event.endsWith(\"*\");\n return [\n {\n value: isWildcard ? t.event.slice(0, -1) : t.event,\n pattern: t.event,\n isWildcard,\n filter: t.if,\n },\n ];\n });\n\n return { runnable: options.length > 0, options };\n}\n","import { useMemo, useState, type ReactNode } from \"react\";\nimport { useTriggerEvent, type SendEventResult, type WorkflowDef } from \"@durablex/react\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"../ui/dialog\";\nimport { Button } from \"../ui/button\";\nimport { Input } from \"../ui/input\";\nimport { parseJson } from \"../lib/json-highlight\";\nimport { workflowRunPlan, type EventRunOption } from \"../lib/workflow-run\";\nimport { AppTag } from \"./AppTag\";\nimport { JsonEditor } from \"./JsonEditor\";\nimport { TriggerEventResult } from \"./TriggerEventResult\";\n\nexport function WorkflowRunDialog({\n workflow,\n open,\n onOpenChange,\n onOpenRun,\n}: {\n workflow: WorkflowDef;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onOpenRun: (runId: string) => void;\n}) {\n // A cron-only workflow has no fireable trigger, so RunForm (which reads options[0]) is\n // only mounted when there is at least one option. WorkflowRunAction already gates on this.\n const runnable = workflowRunPlan(workflow).options.length > 0;\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-md\">\n {open && runnable && (\n <RunForm\n key={workflow.name}\n workflow={workflow}\n onClose={() => onOpenChange(false)}\n onOpenRun={onOpenRun}\n />\n )}\n </DialogContent>\n </Dialog>\n );\n}\n\nfunction RunForm({\n workflow,\n onClose,\n onOpenRun,\n}: {\n workflow: WorkflowDef;\n onClose: () => void;\n onOpenRun: (runId: string) => void;\n}) {\n const { options } = workflowRunPlan(workflow);\n const [selected, setSelected] = useState(0);\n // RunForm is only mounted when options is non-empty; the fallback keeps the type total.\n const option: EventRunOption = options[selected] ??\n options[0] ?? { value: \"\", pattern: \"\", isWildcard: false };\n\n const [eventName, setEventName] = useState(option.value);\n const [payload, setPayload] = useState(\"{}\");\n const [result, setResult] = useState<SendEventResult | null>(null);\n const fire = useTriggerEvent();\n\n const parsed = useMemo(() => parseJson(payload), [payload]);\n const canSubmit = eventName.trim() !== \"\" && parsed.ok && !fire.isPending;\n\n function pick(index: number) {\n const opt = options[index];\n if (!opt) return;\n setSelected(index);\n setEventName(opt.value);\n }\n\n function submit() {\n if (!parsed.ok) return;\n fire.mutate(\n { name: eventName.trim(), app: workflow.app, data: parsed.value },\n { onSuccess: setResult },\n );\n }\n\n return (\n <>\n <DialogHeader>\n <DialogTitle>Run {workflow.name}</DialogTitle>\n <DialogDescription>\n Fires this workflow's triggering event. Any other workflow whose trigger matches the event\n also runs.\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex flex-col gap-2 rounded-lg border border-border bg-muted/30 p-2.5 text-xs\">\n {options.length > 1 && (\n <Row label=\"Trigger\">\n <div className=\"flex flex-wrap gap-1.5\">\n {options.map((o, i) => (\n <button\n key={o.pattern}\n type=\"button\"\n className=\"chip focusable font-mono\"\n data-on={i === selected ? \"1\" : \"0\"}\n aria-pressed={i === selected}\n onClick={() => pick(i)}\n >\n {o.pattern}\n </button>\n ))}\n </div>\n </Row>\n )}\n\n <Row label=\"Event\">\n {option.isWildcard ? (\n <Input\n value={eventName}\n onChange={(e) => setEventName(e.target.value)}\n aria-label=\"Event name\"\n className=\"h-7\"\n autoFocus\n />\n ) : (\n <span className=\"font-mono\">{option.pattern}</span>\n )}\n </Row>\n\n <Row label=\"App\">\n <AppTag app={workflow.app} />\n </Row>\n\n {option.isWildcard && (\n <p className=\"text-muted-foreground\">\n <code className=\"font-mono\">{option.pattern}</code> is a wildcard - complete the event\n name above.\n </p>\n )}\n {option.filter && (\n <p className=\"text-muted-foreground\">\n Only runs when: <code className=\"font-mono\">{option.filter}</code>\n </p>\n )}\n </div>\n\n <div className=\"flex flex-col gap-1.5\">\n <span className=\"text-xs font-medium\">Payload</span>\n <JsonEditor value={payload} onChange={setPayload} invalid={!parsed.ok} />\n {!parsed.ok ? <span className=\"text-xs text-destructive\">{parsed.error}</span> : null}\n </div>\n\n {result ? (\n <TriggerEventResult\n result={result}\n onOpenRun={(id) => {\n onClose();\n onOpenRun(id);\n }}\n />\n ) : null}\n {fire.isError ? (\n <span className=\"text-xs text-destructive\">\n Could not run: {fire.error instanceof Error ? fire.error.message : \"unknown error\"}\n </span>\n ) : null}\n </div>\n\n <DialogFooter showCloseButton>\n <Button disabled={!canSubmit} onClick={submit}>\n {fire.isPending ? \"Running...\" : \"Run\"}\n </Button>\n </DialogFooter>\n </>\n );\n}\n\nfunction Row({ label, children }: { label: string; children: ReactNode }) {\n return (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-muted-foreground w-12 shrink-0\">{label}</span>\n {children}\n </div>\n );\n}\n","import { useState } from \"react\";\nimport { Play } from \"lucide-react\";\nimport type { WorkflowDef } from \"@durablex/react\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../ui/tooltip\";\nimport { workflowRunPlan } from \"../lib/workflow-run\";\nimport { WorkflowRunDialog } from \"./WorkflowRunDialog\";\n\nexport function WorkflowRunAction({\n workflow,\n onOpenRun,\n}: {\n workflow: WorkflowDef;\n onOpenRun(runId: string): void;\n}) {\n const [open, setOpen] = useState(false);\n\n if (!workflowRunPlan(workflow).runnable) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"btn\" aria-disabled>\n <Play /> Run\n </span>\n </TooltipTrigger>\n <TooltipContent>\n This workflow only runs on a schedule, so there is no event to fire. Manual fire-now lands\n in a later release.\n </TooltipContent>\n </Tooltip>\n );\n }\n\n return (\n <>\n <button type=\"button\" className=\"btn focusable\" onClick={() => setOpen(true)}>\n <Play /> Run\n </button>\n <WorkflowRunDialog\n workflow={workflow}\n open={open}\n onOpenChange={setOpen}\n onOpenRun={onOpenRun}\n />\n </>\n );\n}\n","import type {\n WebhookDelivery,\n WebhookEndpoint,\n WebhookEndpointStats,\n WebhookReceiver,\n} from \"@durablex/react\";\n\n// WEBHOOK_TABS are the three sub-views of the Webhooks page, mirrored into the URL so a\n// tab (and a selected delivery) is shareable like the Runs view.\nexport const WEBHOOK_TABS = [\"deliveries\", \"endpoints\", \"receivers\"] as const;\nexport type WebhookTab = (typeof WEBHOOK_TABS)[number];\n\n// DeliveryView collapses the engine's six delivery statuses into the four the dashboard\n// shows. failed (awaiting a retry) and delivering both read as \"retrying\"; a pending row\n// is \"queued\" until its first attempt; exhausted/dead are terminal \"failed\".\nexport const DELIVERY_VIEWS = [\"delivered\", \"retrying\", \"failed\", \"queued\"] as const;\nexport type DeliveryView = (typeof DELIVERY_VIEWS)[number];\n\nexport function deliveryView(d: Pick<WebhookDelivery, \"status\" | \"attemptCount\">): DeliveryView {\n switch (d.status) {\n case \"succeeded\":\n return \"delivered\";\n case \"exhausted\":\n case \"dead\":\n return \"failed\";\n case \"delivering\":\n case \"failed\":\n return \"retrying\";\n default:\n return d.attemptCount > 0 ? \"retrying\" : \"queued\";\n }\n}\n\nexport const DELIVERY_VIEW_TOKEN: Record<DeliveryView, string> = {\n delivered: \"succeeded\",\n retrying: \"running\",\n failed: \"failed\",\n queued: \"queued\",\n};\n\nexport const DELIVERY_VIEW_LABEL: Record<DeliveryView, string> = {\n delivered: \"Delivered\",\n retrying: \"Retrying\",\n failed: \"Failed\",\n queued: \"Queued\",\n};\n\nexport type EndpointHealth = \"active\" | \"failing\" | \"disabled\";\n\nexport function endpointHealth(\n endpoint: WebhookEndpoint,\n recent: WebhookDelivery[],\n): EndpointHealth {\n if (!endpoint.enabled) return \"disabled\";\n const latest = recent[0];\n if (latest && deliveryView(latest) === \"failed\") return \"failing\";\n return \"active\";\n}\n\nexport const shortUrl = (u: string) => u.replace(/^https?:\\/\\//, \"\");\n\nexport const displayName = (name: string | undefined, fallback: string) =>\n name && name.trim() ? name : fallback;\n\nexport const endpointLabel = (e: WebhookEndpoint) => displayName(e.name, shortUrl(e.url));\nexport const receiverLabel = (r: WebhookReceiver) => displayName(r.name, r.slug);\n\nexport const DELIVERY_LIST_LIMIT = 200;\n\nexport function groupDeliveriesByEndpoint(\n deliveries: WebhookDelivery[],\n): Map<string, WebhookDelivery[]> {\n const m = new Map<string, WebhookDelivery[]>();\n for (const d of deliveries) {\n if (!d.endpointId) continue;\n const list = m.get(d.endpointId);\n if (list) list.push(d);\n else m.set(d.endpointId, [d]);\n }\n return m;\n}\n\nexport function codePillClass(code: number | undefined): string {\n if (code == null || code === 0) return \"none\";\n if (code < 300) return \"ok\";\n if (code < 500) return \"warn\";\n return \"err\";\n}\n\n// successRate is computed over settled deliveries only (succeeded vs terminal-failed).\n// stats.delivered counts every row in the window including in-flight ones, so dividing by\n// it would understate the rate while retries are outstanding. null when nothing has settled.\nexport function successRate(stats?: WebhookEndpointStats): number | null {\n if (!stats) return null;\n const settled = stats.succeeded + stats.failed;\n if (settled === 0) return null;\n return Math.round((stats.succeeded / settled) * 100);\n}\n\n// endpointMeta resolves the display label and failing-state for a delivery. Custom\n// deliveries (ctx.webhook.send) carry no endpointId, so fall back to the delivery URL.\nexport function endpointMeta(\n d: WebhookDelivery,\n endpoints: WebhookEndpoint[],\n byEndpoint: Map<string, WebhookDelivery[]>,\n): { label: string; failing: boolean } {\n const ep = d.endpointId ? endpoints.find((e) => e.id === d.endpointId) : undefined;\n if (!ep) return { label: shortUrl(d.url), failing: false };\n return {\n label: endpointLabel(ep),\n failing: endpointHealth(ep, byEndpoint.get(ep.id) ?? []) === \"failing\",\n };\n}\n","import { cn } from \"../lib/utils\";\nimport {\n codePillClass,\n DELIVERY_VIEW_LABEL,\n DELIVERY_VIEW_TOKEN,\n type DeliveryView,\n type EndpointHealth,\n} from \"../lib/webhook-view\";\nimport { ResumeMark } from \"./ResumeMark\";\n\nfunction StatusPill({\n token,\n label,\n small,\n live,\n}: {\n token: string;\n label: string;\n small?: boolean;\n live?: boolean;\n}) {\n return (\n <span\n className={cn(\n \"inline-flex items-center gap-1.5 border border-transparent font-medium leading-none whitespace-nowrap\",\n small ? \"h-[17px] px-1.5 text-[10px]\" : \"h-[19px] px-1.5 text-[11px]\",\n )}\n style={{ backgroundColor: `var(--st-${token}-bg)`, color: `var(--st-${token}-fg)` }}\n >\n {live ? <ResumeMark size={small ? 12 : 13} variant=\"run\" /> : <i className=\"bdot\" />}\n {label}\n </span>\n );\n}\n\nexport function DeliveryBadge({ view, small }: { view: DeliveryView; small?: boolean }) {\n return (\n <StatusPill\n token={DELIVERY_VIEW_TOKEN[view]}\n label={DELIVERY_VIEW_LABEL[view]}\n small={small}\n live={view === \"retrying\"}\n />\n );\n}\n\nconst HEALTH_TOKEN: Record<EndpointHealth, string> = {\n active: \"succeeded\",\n failing: \"failed\",\n disabled: \"cancelled\",\n};\nconst HEALTH_LABEL: Record<EndpointHealth, string> = {\n active: \"Active\",\n failing: \"Failing\",\n disabled: \"Disabled\",\n};\n\nexport function EndpointBadge({ health, small }: { health: EndpointHealth; small?: boolean }) {\n return <StatusPill token={HEALTH_TOKEN[health]} label={HEALTH_LABEL[health]} small={small} />;\n}\n\nexport function CodePill({ code }: { code?: number }) {\n const k = codePillClass(code);\n return <span className={`wh-code ${k}`}>{k === \"none\" ? \"-\" : code}</span>;\n}\n\nexport function EventChip({ name }: { name: string }) {\n return <span className=\"wh-evchip\">{name === \"*\" ? \"all events\" : name}</span>;\n}\n","import type { DeliveryStatus } from \"@durablex/react\";\nimport { cn } from \"../lib/utils\";\n\n// failed = awaiting retry, exhausted = retries spent, dead = a non-retryable response.\nconst STATUS_CLASS: Record<DeliveryStatus, string> = {\n pending: \"text-muted-foreground border-border\",\n delivering: \"border-sky-500/40 text-sky-600 dark:text-sky-400\",\n succeeded: \"border-emerald-500/40 text-emerald-600 dark:text-emerald-400\",\n failed: \"border-amber-500/40 text-amber-600 dark:text-amber-400\",\n exhausted: \"border-red-500/40 text-red-600 dark:text-red-400\",\n dead: \"border-red-500/40 text-red-600 dark:text-red-400\",\n};\n\nexport function WebhookStatusBadge({ status }: { status: DeliveryStatus }) {\n return (\n <span\n className={cn(\n \"inline-flex border px-1.5 py-0.5 font-mono text-[10px] leading-none\",\n STATUS_CLASS[status],\n )}\n >\n {status}\n </span>\n );\n}\n","import { Loader2, RotateCw, X } from \"lucide-react\";\nimport { toast } from \"sonner\";\nimport type { AttemptOutcome, WebhookDeliveryAttempt } from \"@durablex/react\";\nimport { useConfirmAction } from \"../hooks/use-confirm-action\";\nimport { useDelivery, useRedeliverDelivery } from \"@durablex/react\";\nimport { formatDuration, formatNextFire, formatTime } from \"../lib/format\";\nimport { JsonBlock } from \"./JsonBlock\";\nimport { Meta } from \"./Meta\";\nimport { WebhookStatusBadge } from \"./WebhookStatusBadge\";\n\nconst OUTCOME_CLASS: Record<AttemptOutcome, string> = {\n succeeded: \"text-emerald-600 dark:text-emerald-400\",\n http_error: \"text-amber-600 dark:text-amber-400\",\n timeout: \"text-amber-600 dark:text-amber-400\",\n connection_error: \"text-red-600 dark:text-red-400\",\n skipped: \"text-muted-foreground\",\n};\n\nfunction AttemptRow({ a }: { a: WebhookDeliveryAttempt }) {\n return (\n <div className=\"border-border flex flex-col gap-1 border-b px-3 py-2 last:border-b-0\">\n <div className=\"flex items-center gap-2 text-[11px]\">\n <span className=\"text-muted-foreground font-mono\">#{a.attempt}</span>\n <span className={\"font-mono \" + (OUTCOME_CLASS[a.outcome] ?? \"text-foreground\")}>\n {a.outcome}\n </span>\n {a.statusCode != null && a.statusCode > 0 && (\n <span className=\"font-mono tabular-nums\">HTTP {a.statusCode}</span>\n )}\n <span className=\"text-muted-foreground ml-auto font-mono\">\n {formatDuration(a.durationMs)}\n </span>\n <span className=\"text-muted-foreground font-mono\">{formatTime(a.createdAt)}</span>\n </div>\n {a.error && (\n <div className=\"text-red-600 dark:text-red-400 font-mono text-[11px] break-words\">\n {a.error}\n </div>\n )}\n {a.responseSnippet && (\n <div className=\"text-muted-foreground bg-muted/40 max-h-24 overflow-y-auto px-2 py-1 font-mono text-[11px] break-words whitespace-pre-wrap\">\n {a.responseSnippet}\n </div>\n )}\n </div>\n );\n}\n\nexport function DeliveryDetail({\n deliveryId,\n onClose,\n onOpenRun,\n embedded,\n}: {\n deliveryId: string;\n onClose?: () => void;\n onOpenRun?: (runId: string) => void;\n embedded?: boolean;\n}) {\n const { data, isLoading, isError, error } = useDelivery(deliveryId);\n\n if (isLoading) {\n return (\n <div className=\"run-panel\">\n <div className=\"steps-loading\">\n <Loader2 className=\"size-4 animate-spin\" />\n </div>\n </div>\n );\n }\n if (isError || !data) {\n return (\n <div className=\"run-panel\">\n <div className=\"fi-empty\">\n {error instanceof Error ? error.message : \"Delivery not found.\"}\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"run-panel\">\n <div className=\"panel-head\">\n <div className=\"ph-top\">\n <h2>\n <WebhookStatusBadge status={data.status} />\n <span className=\"h2-name font-mono text-[13px]\">{data.eventKind}</span>\n </h2>\n <div className=\"ph-actions\">\n {data.status !== \"pending\" && data.status !== \"delivering\" && (\n <RedeliverButton id={data.id} />\n )}\n {!embedded && (\n <button\n type=\"button\"\n className=\"iconbtn focusable\"\n aria-label=\"Close\"\n onClick={onClose}\n >\n <X className=\"size-3.5\" />\n </button>\n )}\n </div>\n </div>\n <div className=\"ph-status\">\n <span className=\"runid\" title={data.url}>\n <span className=\"runid-text\">{data.url}</span>\n </span>\n </div>\n </div>\n\n <div className=\"min-h-0 flex-1 overflow-y-auto\">\n <div className=\"metagrid\">\n <Meta label=\"App\" value={data.app || \"-\"} />\n <Meta label=\"Attempts\" value={`${data.attemptCount}/${data.maxAttempts}`} />\n {data.sourceRunId != null && (\n <SourceRunMeta runId={data.sourceRunId} onOpenRun={onOpenRun} />\n )}\n {data.endpointId && <Meta label=\"Endpoint\" value={data.endpointId} />}\n {data.nextAttemptAt && (\n <Meta label=\"Next attempt\" value={formatNextFire(data.nextAttemptAt)} />\n )}\n <Meta label=\"Created\" value={formatTime(data.createdAt)} />\n </div>\n\n <div className=\"section\">\n <div className=\"text-muted-foreground border-border border-b px-3 py-1.5 text-[10px] tracking-wider uppercase\">\n Attempts ({data.attempts.length})\n </div>\n {data.attempts.length === 0 ? (\n <div className=\"text-muted-foreground px-3 py-3 text-[11px]\">\n No attempts yet; awaiting the sweeper.\n </div>\n ) : (\n data.attempts.map((a) => <AttemptRow key={a.id} a={a} />)\n )}\n </div>\n\n {data.payload != null && (\n <div className=\"section\">\n <div className=\"text-muted-foreground border-border border-b px-3 py-1.5 text-[10px] tracking-wider uppercase\">\n Payload\n </div>\n <div className=\"px-3 py-2\">\n <JsonBlock value={data.payload} />\n </div>\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction RedeliverButton({ id }: { id: string }) {\n const redeliver = useRedeliverDelivery();\n const { confirming, trigger } = useConfirmAction(() =>\n redeliver.mutate(id, {\n onSuccess: () => toast.success(\"Delivery re-queued\"),\n onError: (e: Error) => toast.error(`Could not redeliver: ${e.message}`),\n }),\n );\n return (\n <button\n type=\"button\"\n className=\"btn focusable\"\n disabled={redeliver.isPending}\n onClick={trigger}\n >\n {redeliver.isPending ? (\n <Loader2 className=\"size-3 animate-spin\" />\n ) : (\n <RotateCw className=\"size-3\" />\n )}\n {confirming ? \"Confirm redeliver\" : \"Redeliver\"}\n </button>\n );\n}\n\nfunction SourceRunMeta({ runId, onOpenRun }: { runId: string; onOpenRun?: (id: string) => void }) {\n return (\n <Meta\n label=\"Source run\"\n value={runId}\n onClick={onOpenRun ? () => onOpenRun(runId) : undefined}\n title={`Open run ${runId}`}\n />\n );\n}\n","import { Inbox, RotateCw, Search, Send, X } from \"lucide-react\";\nimport { useMemo, useState } from \"react\";\nimport type { WebhookDelivery } from \"@durablex/react\";\nimport { useDeliveries, useEndpoints } from \"@durablex/react\";\nimport { formatRelative } from \"../lib/format\";\nimport {\n DELIVERY_LIST_LIMIT,\n type DeliveryView,\n deliveryView,\n endpointMeta,\n groupDeliveriesByEndpoint,\n shortUrl,\n} from \"../lib/webhook-view\";\nimport { CodePill, DeliveryBadge } from \"./WebhookBadges\";\nimport { DeliveryDetail } from \"./DeliveryDetail\";\n\nconst SPLIT_FILTERS: [DeliveryView | \"all\", string][] = [\n [\"all\", \"All\"],\n [\"delivered\", \"Delivered\"],\n [\"retrying\", \"Retrying\"],\n [\"failed\", \"Failed\"],\n [\"queued\", \"Queued\"],\n];\n\nfunction DeliveryListItem({\n d,\n label,\n failing,\n selected,\n onClick,\n}: {\n d: WebhookDelivery;\n label: string;\n failing: boolean;\n selected: boolean;\n onClick(): void;\n}) {\n const view = deliveryView(d);\n return (\n <button\n type=\"button\"\n className=\"whs-item\"\n data-selected={selected ? \"1\" : \"0\"}\n onClick={onClick}\n >\n <span className=\"whs-accent\" />\n <div className=\"whs-item-main\">\n <div className=\"whs-item-top\">\n <span className=\"whs-ev\">{d.eventKind}</span>\n <span className=\"whs-time\">{formatRelative(d.createdAt)}</span>\n </div>\n <div className=\"whs-item-bot\">\n <DeliveryBadge view={view} small />\n <span className=\"whs-ep\">\n <i\n className=\"sq\"\n style={{ background: failing ? \"var(--st-failed-fg)\" : \"var(--primary)\" }}\n />\n {label}\n </span>\n {d.attemptCount > 1 && (\n <span\n className={\n \"whs-att-tag\" + (view === \"failed\" ? \" err\" : view === \"retrying\" ? \" warn\" : \"\")\n }\n >\n <RotateCw />\n {d.attemptCount}/{d.maxAttempts}\n </span>\n )}\n <CodePill code={d.lastStatusCode} />\n </div>\n </div>\n </button>\n );\n}\n\nexport function DeliveriesSplit({ onOpenRun }: { onOpenRun?: (runId: string) => void }) {\n const { data } = useDeliveries({ limit: DELIVERY_LIST_LIMIT });\n const endpointsData = useEndpoints().data;\n const endpoints = useMemo(() => endpointsData ?? [], [endpointsData]);\n const all = useMemo(() => data?.deliveries ?? [], [data]);\n const [view, setView] = useState<DeliveryView | \"all\">(\"all\");\n const [query, setQuery] = useState(\"\");\n\n const byEndpoint = useMemo(() => groupDeliveriesByEndpoint(all), [all]);\n\n const rows = useMemo(() => {\n let r = all;\n if (view !== \"all\") r = r.filter((d) => deliveryView(d) === view);\n const q = query.trim().toLowerCase();\n if (q) {\n r = r.filter((d) => {\n const { label } = endpointMeta(d, endpoints, byEndpoint);\n return (\n d.eventKind.toLowerCase().includes(q) ||\n d.id.toLowerCase().includes(q) ||\n shortUrl(d.url).toLowerCase().includes(q) ||\n label.toLowerCase().includes(q)\n );\n });\n }\n return r;\n }, [all, endpoints, byEndpoint, view, query]);\n\n const [selId, setSelId] = useState<string | null>(null);\n const sel = rows.find((d) => d.id === selId) ?? rows[0] ?? null;\n\n return (\n <div className=\"whs\">\n <div className=\"whs-list\">\n <div className=\"whs-toolbar\">\n <div className=\"fb-search-field whs-search2\">\n <Search />\n <input\n placeholder=\"Search deliveries…\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Escape\") setQuery(\"\");\n }}\n />\n {query && (\n <span className=\"x\" onClick={() => setQuery(\"\")} title=\"Clear\">\n <X style={{ width: 12, height: 12 }} />\n </span>\n )}\n </div>\n <div className=\"whs-chips\">\n {SPLIT_FILTERS.map(([k, label]) => (\n <button\n key={k}\n type=\"button\"\n className=\"chip\"\n data-on={view === k ? \"1\" : \"0\"}\n onClick={() => setView(k)}\n >\n {label}\n </button>\n ))}\n </div>\n <div className=\"whs-count\">\n {rows.length === all.length\n ? `${all.length} deliveries`\n : `${rows.length} of ${all.length} deliveries`}\n </div>\n </div>\n <div className=\"whs-scroll\">\n {rows.length ? (\n rows.map((d) => {\n const { label, failing } = endpointMeta(d, endpoints, byEndpoint);\n return (\n <DeliveryListItem\n key={d.id}\n d={d}\n label={label}\n failing={failing}\n selected={sel?.id === d.id}\n onClick={() => setSelId(d.id)}\n />\n );\n })\n ) : (\n <div className=\"whs-empty\">\n <Inbox className=\"ico\" />\n <span>No deliveries match.</span>\n </div>\n )}\n </div>\n </div>\n\n <div className=\"whs-detail\">\n {sel ? (\n <DeliveryDetail key={sel.id} deliveryId={sel.id} embedded onOpenRun={onOpenRun} />\n ) : (\n <div className=\"panel-empty\">\n <div>\n <Send className=\"mx-auto mb-2.5 size-6 opacity-60\" />\n <div className=\"text-foreground mb-1 font-semibold\">No delivery selected</div>\n <div>Pick a delivery from the list to inspect its payload and attempts.</div>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\n\nexport function FormField({ label, children }: { label: string; children: ReactNode }) {\n return (\n <label className=\"flex flex-col gap-1\">\n <span className=\"text-muted-foreground text-[11px] tracking-wide uppercase\">{label}</span>\n {children}\n </label>\n );\n}\n","import { Check, Copy, TriangleAlert } from \"lucide-react\";\nimport { Button } from \"../ui/button\";\nimport { DialogFooter, DialogHeader, DialogTitle } from \"../ui/dialog\";\nimport { useCopyToClipboard } from \"../hooks/use-copy\";\n\nexport function SecretReveal({ secret, onDone }: { secret: string; onDone: () => void }) {\n const { copied, copy } = useCopyToClipboard();\n\n return (\n <>\n <DialogHeader>\n <DialogTitle>Signing secret</DialogTitle>\n </DialogHeader>\n <div className=\"flex flex-col gap-3 py-1\">\n <div className=\"text-muted-foreground flex items-start gap-2 text-xs\">\n <TriangleAlert\n className=\"mt-0.5 size-3.5 shrink-0\"\n style={{ color: \"var(--st-waiting-fg)\" }}\n />\n <span>Copy this secret now. It is stored encrypted and cannot be shown again.</span>\n </div>\n <div className=\"bg-muted flex items-center gap-2 border px-2.5 py-2\">\n <code className=\"flex-1 truncate font-mono text-xs\">{secret}</code>\n <button\n type=\"button\"\n className=\"iconbtn focusable\"\n aria-label=\"Copy secret\"\n onClick={() => copy(secret)}\n >\n {copied ? (\n <Check className=\"size-3.5\" style={{ color: \"var(--st-succeeded-fg)\" }} />\n ) : (\n <Copy className=\"size-3.5\" />\n )}\n </button>\n </div>\n </div>\n <DialogFooter>\n <Button size=\"sm\" onClick={onDone}>\n Done\n </Button>\n </DialogFooter>\n </>\n );\n}\n","import { useState } from \"react\";\nimport { toast } from \"sonner\";\nimport {\n type EndpointInput,\n type EndpointPatch,\n SUBSCRIBABLE_EVENT_KINDS,\n type SubscribableEventKind,\n type WebhookEndpoint,\n} from \"@durablex/react\";\nimport { Button } from \"../ui/button\";\nimport { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from \"../ui/dialog\";\nimport { Input } from \"../ui/input\";\nimport { useCreateEndpoint, useUpdateEndpoint } from \"@durablex/react\";\nimport { FormField } from \"./FormField\";\nimport { SecretReveal } from \"./SecretReveal\";\nexport function EndpointFormDialog({\n open,\n onOpenChange,\n endpoint,\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n endpoint?: WebhookEndpoint;\n}) {\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-md\">\n {open && <EndpointForm endpoint={endpoint} onClose={() => onOpenChange(false)} />}\n </DialogContent>\n </Dialog>\n );\n}\n\nfunction EndpointForm({ endpoint, onClose }: { endpoint?: WebhookEndpoint; onClose: () => void }) {\n const editing = endpoint != null;\n const [name, setName] = useState(endpoint?.name ?? \"\");\n const [url, setUrl] = useState(endpoint?.url ?? \"\");\n const [app, setApp] = useState(endpoint?.app ?? \"\");\n const [kinds, setKinds] = useState<Set<SubscribableEventKind>>(\n () => new Set((endpoint?.eventKinds ?? []).filter(isSubscribable)),\n );\n const [rotate, setRotate] = useState(false);\n const [secret, setSecret] = useState<string | null>(null);\n\n const create = useCreateEndpoint();\n const update = useUpdateEndpoint();\n const pending = create.isPending || update.isPending;\n const canSubmit = url.trim() !== \"\" && kinds.size > 0 && !pending;\n\n function toggleKind(k: SubscribableEventKind) {\n setKinds((prev) => {\n const next = new Set(prev);\n if (next.has(k)) next.delete(k);\n else next.add(k);\n return next;\n });\n }\n\n function submit() {\n if (!canSubmit) return;\n const eventKinds = [...kinds];\n if (editing) {\n const patch: EndpointPatch = {\n name: name.trim(),\n url: url.trim(),\n app: app.trim(),\n eventKinds,\n rotateSecret: rotate,\n };\n update.mutate(\n { id: endpoint.id, patch },\n {\n onSuccess: (res) => {\n if (res.secret) setSecret(res.secret);\n else onClose();\n },\n onError: (e: Error) => toast.error(`Could not save endpoint: ${e.message}`),\n },\n );\n return;\n }\n const input: EndpointInput = {\n name: name.trim() || undefined,\n url: url.trim(),\n app: app.trim() || undefined,\n eventKinds,\n };\n create.mutate(input, {\n onSuccess: (res) => (res.secret ? setSecret(res.secret) : onClose()),\n onError: (e: Error) => toast.error(`Could not save endpoint: ${e.message}`),\n });\n }\n\n if (secret) {\n return <SecretReveal secret={secret} onDone={onClose} />;\n }\n\n return (\n <>\n <DialogHeader>\n <DialogTitle>{editing ? \"Edit endpoint\" : \"Add endpoint\"}</DialogTitle>\n </DialogHeader>\n <div className=\"flex flex-col gap-3 py-1\">\n <FormField label=\"Name (optional)\">\n <Input\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"Acme Production\"\n />\n </FormField>\n <FormField label=\"Destination URL\">\n <Input\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n placeholder=\"https://hooks.example.com/dx\"\n />\n </FormField>\n <FormField label=\"App (optional, restricts to one app)\">\n <Input value={app} onChange={(e) => setApp(e.target.value)} placeholder=\"all apps\" />\n </FormField>\n <fieldset className=\"flex flex-col gap-1.5\">\n <legend className=\"text-muted-foreground mb-1 text-[11px] tracking-wide uppercase\">\n Subscribed events\n </legend>\n {SUBSCRIBABLE_EVENT_KINDS.map((k) => (\n <label key={k} className=\"flex items-center gap-2 font-mono text-xs\">\n <input type=\"checkbox\" checked={kinds.has(k)} onChange={() => toggleKind(k)} />\n {k}\n </label>\n ))}\n </fieldset>\n {editing && (\n <label className=\"flex items-center gap-2 text-xs\">\n <input type=\"checkbox\" checked={rotate} onChange={(e) => setRotate(e.target.checked)} />\n Rotate signing secret (the new secret is shown once)\n </label>\n )}\n </div>\n <DialogFooter>\n <Button size=\"sm\" variant=\"ghost\" onClick={onClose} disabled={pending}>\n Cancel\n </Button>\n <Button size=\"sm\" onClick={submit} disabled={!canSubmit}>\n {editing ? \"Save changes\" : \"Create endpoint\"}\n </Button>\n </DialogFooter>\n </>\n );\n}\n\nfunction isSubscribable(k: string): k is SubscribableEventKind {\n return (SUBSCRIBABLE_EVENT_KINDS as readonly string[]).includes(k);\n}\n","export function Facts({ rows }: { rows: [string, string][] }) {\n return (\n <dl className=\"grid grid-cols-[max-content_1fr] gap-x-4 gap-y-1.5 text-xs\">\n {rows.map(([k, v]) => (\n <div key={k} className=\"contents\">\n <dt className=\"text-muted-foreground\">{k}</dt>\n <dd className=\"min-w-0 truncate font-mono\" title={v}>\n {v}\n </dd>\n </div>\n ))}\n </dl>\n );\n}\n","import { ChevronRight, ExternalLink, Pencil, Power, Trash2 } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { toast } from \"sonner\";\nimport type { WebhookDelivery, WebhookEndpoint, WebhookEndpointStats } from \"@durablex/react\";\nimport { useConfirmAction } from \"../hooks/use-confirm-action\";\nimport { useDeleteEndpoint, useUpdateEndpoint } from \"@durablex/react\";\nimport { formatRelative } from \"../lib/format\";\nimport {\n deliveryView,\n endpointHealth,\n endpointLabel,\n shortUrl,\n successRate,\n} from \"../lib/webhook-view\";\nimport { Facts } from \"./Facts\";\nimport { CodePill, DeliveryBadge, EndpointBadge, EventChip } from \"./WebhookBadges\";\n\nexport function EndpointRow({\n ep,\n stats,\n recent,\n onEdit,\n}: {\n ep: WebhookEndpoint;\n stats?: WebhookEndpointStats;\n recent: WebhookDelivery[];\n onEdit(): void;\n}) {\n const [open, setOpen] = useState(false);\n const health = endpointHealth(ep, recent);\n const rate = successRate(stats);\n const dot =\n health === \"failing\"\n ? \"var(--st-failed-fg)\"\n : health === \"disabled\"\n ? \"var(--muted-foreground)\"\n : \"var(--primary)\";\n\n return (\n <>\n <tr className=\"row app-row\" aria-expanded={open} onClick={() => setOpen(!open)}>\n <td>\n <div className=\"app-cell\">\n <ChevronRight className=\"app-chev\" />\n <i className=\"sq\" style={{ width: 8, height: 8, background: dot }} />\n <div className=\"app-id\">\n <span className=\"nm\">{endpointLabel(ep)}</span>\n <span className=\"url\">{shortUrl(ep.url)}</span>\n </div>\n </div>\n </td>\n <td>\n <EndpointBadge health={health} />\n </td>\n <td>\n <div className=\"wh-evchips\">\n {ep.eventKinds.slice(0, 2).map((e) => (\n <EventChip key={e} name={e} />\n ))}\n {ep.eventKinds.length > 2 && (\n <span className=\"wh-evmore\">+{ep.eventKinds.length - 2}</span>\n )}\n </div>\n </td>\n <td className=\"num\">\n <span className=\"dur\">{rate == null ? \"-\" : `${rate}%`}</span>\n </td>\n <td className=\"num\">\n <span className=\"dur\">{stats?.delivered ?? 0}</span>\n </td>\n <td>\n <span className=\"ts cell-mut\">\n {stats?.lastDelivery ? formatRelative(stats.lastDelivery) : \"-\"}\n </span>\n </td>\n </tr>\n {open && (\n <tr className=\"app-detailrow\">\n <td colSpan={6}>\n <div className=\"wh-od\">\n <div className=\"wh-od-main\">\n <div className=\"wh-od-sec\">\n <div className=\"wh-od-h\">Configuration</div>\n <Facts\n rows={[\n [\"URL\", ep.url],\n [\"Endpoint id\", ep.id],\n [\"Signing secret\", \"sealed - rotate to reset\"],\n [\"Created\", formatRelative(ep.createdAt)],\n ]}\n />\n </div>\n <div className=\"wh-od-sec\">\n <div className=\"wh-od-h\">Subscribed events · {ep.eventKinds.length}</div>\n <div className=\"wh-evchips wrap\">\n {ep.eventKinds.map((e) => (\n <EventChip key={e} name={e} />\n ))}\n </div>\n </div>\n <EndpointActions ep={ep} onEdit={onEdit} />\n </div>\n <div className=\"wh-od-side\">\n <div className=\"wh-od-h\">Recent deliveries · {recent.length}</div>\n {recent.length ? (\n <div className=\"wh-reclist\">\n {recent.slice(0, 12).map((d) => (\n <div className=\"wh-rec\" key={d.id}>\n <span className=\"wh-rec-ev\">{d.eventKind}</span>\n <span className=\"wh-rec-meta\">\n <CodePill code={d.lastStatusCode} />\n <DeliveryBadge view={deliveryView(d)} small />\n <span className=\"wh-rec-at\">{formatRelative(d.createdAt)}</span>\n </span>\n </div>\n ))}\n </div>\n ) : (\n <div className=\"wh-rec-empty\">No deliveries yet.</div>\n )}\n </div>\n </div>\n </td>\n </tr>\n )}\n </>\n );\n}\n\nfunction EndpointActions({ ep, onEdit }: { ep: WebhookEndpoint; onEdit(): void }) {\n const update = useUpdateEndpoint();\n const del = useDeleteEndpoint();\n const remove = useConfirmAction(() =>\n del.mutate(ep.id, {\n onSuccess: () => toast.success(\"Endpoint deleted\"),\n onError: (e: Error) => toast.error(`Could not delete endpoint: ${e.message}`),\n }),\n );\n\n return (\n <div className=\"app-actions\" onClick={(e) => e.stopPropagation()}>\n <button type=\"button\" className=\"btn focusable\" onClick={onEdit}>\n <Pencil /> Edit\n </button>\n <button\n type=\"button\"\n className=\"btn focusable\"\n disabled={update.isPending}\n onClick={() =>\n update.mutate(\n { id: ep.id, patch: { enabled: !ep.enabled } },\n { onError: (e: Error) => toast.error(`Could not update endpoint: ${e.message}`) },\n )\n }\n >\n <Power /> {ep.enabled ? \"Disable\" : \"Enable\"}\n </button>\n <a className=\"btn focusable\" href={ep.url} target=\"_blank\" rel=\"noreferrer\">\n <ExternalLink /> Open endpoint\n </a>\n <button\n type=\"button\"\n className=\"btn focusable\"\n style={{ color: \"var(--st-failed-fg)\" }}\n disabled={del.isPending}\n onClick={remove.trigger}\n >\n <Trash2 /> {remove.confirming ? \"Confirm delete\" : \"Delete\"}\n </button>\n </div>\n );\n}\n","import { Plus } from \"lucide-react\";\nimport { useMemo, useState } from \"react\";\nimport type { WebhookEndpoint } from \"@durablex/react\";\nimport { useDeliveries, useEndpoints, useEndpointStats } from \"@durablex/react\";\nimport { DELIVERY_LIST_LIMIT, groupDeliveriesByEndpoint } from \"../lib/webhook-view\";\nimport { EndpointFormDialog } from \"./EndpointFormDialog\";\nimport { EndpointRow } from \"./EndpointRow\";\n\nconst STATS_WINDOW = 24 * 60 * 60 * 1000;\n\nexport function EndpointsTab() {\n // Lazy initializer: reads the clock once at mount so the boundary is stable across re-renders.\n const [since] = useState(() => new Date(Date.now() - STATS_WINDOW).toISOString());\n const endpoints = useEndpoints().data ?? [];\n const statsData = useEndpointStats(since).data;\n const deliveriesData = useDeliveries({ limit: DELIVERY_LIST_LIMIT }).data?.deliveries;\n const [adding, setAdding] = useState(false);\n const [editing, setEditing] = useState<WebhookEndpoint | null>(null);\n\n const statsById = useMemo(\n () => new Map((statsData ?? []).map((s) => [s.endpointId, s])),\n [statsData],\n );\n const recentById = useMemo(\n () => groupDeliveriesByEndpoint(deliveriesData ?? []),\n [deliveriesData],\n );\n\n return (\n <div className=\"content\">\n <div className=\"tbar\">\n <span className=\"text-muted-foreground font-mono text-[11px]\">\n {endpoints.length} endpoints\n </span>\n <span className=\"tbar-spacer\" />\n <button type=\"button\" className=\"btn focusable\" onClick={() => setAdding(true)}>\n <Plus /> Add endpoint\n </button>\n </div>\n <div className=\"tablewrap\">\n {endpoints.length === 0 ? (\n <div className=\"placeholder\">\n <div className=\"ph-inner\">\n <h3>No outbound endpoints</h3>\n <p>Add an endpoint to deliver run lifecycle events to an external URL.</p>\n </div>\n </div>\n ) : (\n <table className=\"runs apps-table\">\n <thead>\n <tr>\n <th>Endpoint</th>\n <th>Status</th>\n <th>Events</th>\n <th className=\"num\">Success</th>\n <th className=\"num\">Sent · 24h</th>\n <th>Last delivery</th>\n </tr>\n </thead>\n <tbody>\n {endpoints.map((ep) => (\n <EndpointRow\n key={ep.id}\n ep={ep}\n stats={statsById.get(ep.id)}\n recent={recentById.get(ep.id) ?? []}\n onEdit={() => setEditing(ep)}\n />\n ))}\n </tbody>\n </table>\n )}\n </div>\n\n <EndpointFormDialog open={adding} onOpenChange={setAdding} />\n <EndpointFormDialog\n open={editing != null}\n onOpenChange={(o) => !o && setEditing(null)}\n endpoint={editing ?? undefined}\n />\n </div>\n );\n}\n","import { useState } from \"react\";\nimport { toast } from \"sonner\";\nimport type { ReceiverInput, ReceiverPatch, WebhookReceiver } from \"@durablex/react\";\nimport { Button } from \"../ui/button\";\nimport { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from \"../ui/dialog\";\nimport { Input } from \"../ui/input\";\nimport { useCreateReceiver, useUpdateReceiver } from \"@durablex/react\";\nimport { FormField } from \"./FormField\";\nimport { SecretReveal } from \"./SecretReveal\";\nexport function ReceiverFormDialog({\n open,\n onOpenChange,\n receiver,\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n receiver?: WebhookReceiver;\n}) {\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-md\">\n {open && <ReceiverForm receiver={receiver} onClose={() => onOpenChange(false)} />}\n </DialogContent>\n </Dialog>\n );\n}\n\nfunction ReceiverForm({ receiver, onClose }: { receiver?: WebhookReceiver; onClose: () => void }) {\n const editing = receiver != null;\n const [name, setName] = useState(receiver?.name ?? \"\");\n const [eventName, setEventName] = useState(receiver?.eventName ?? \"\");\n const [app, setApp] = useState(receiver?.app ?? \"\");\n const [rotate, setRotate] = useState(false);\n const [secret, setSecret] = useState<string | null>(null);\n\n const create = useCreateReceiver();\n const update = useUpdateReceiver();\n const pending = create.isPending || update.isPending;\n const canSubmit = eventName.trim() !== \"\" && !pending;\n\n function submit() {\n if (!canSubmit) return;\n if (editing) {\n const patch: ReceiverPatch = {\n name: name.trim(),\n eventName: eventName.trim(),\n app: app.trim(),\n rotateSecret: rotate,\n };\n update.mutate(\n { id: receiver.id, patch },\n {\n onSuccess: (res) => (res.secret ? setSecret(res.secret) : onClose()),\n onError: (e: Error) => toast.error(`Could not save receiver: ${e.message}`),\n },\n );\n return;\n }\n const input: ReceiverInput = {\n name: name.trim() || undefined,\n eventName: eventName.trim(),\n app: app.trim() || undefined,\n };\n create.mutate(input, {\n onSuccess: (res) => (res.secret ? setSecret(res.secret) : onClose()),\n onError: (e: Error) => toast.error(`Could not save receiver: ${e.message}`),\n });\n }\n\n if (secret) {\n return <SecretReveal secret={secret} onDone={onClose} />;\n }\n\n return (\n <>\n <DialogHeader>\n <DialogTitle>{editing ? \"Edit receiver\" : \"Add receiver\"}</DialogTitle>\n </DialogHeader>\n <div className=\"flex flex-col gap-3 py-1\">\n <FormField label=\"Name (optional)\">\n <Input value={name} onChange={(e) => setName(e.target.value)} placeholder=\"Stripe\" />\n </FormField>\n <FormField label=\"Maps to event\">\n <Input\n value={eventName}\n onChange={(e) => setEventName(e.target.value)}\n placeholder=\"stripe.charge\"\n />\n </FormField>\n <FormField label=\"App (optional)\">\n <Input value={app} onChange={(e) => setApp(e.target.value)} placeholder=\"default app\" />\n </FormField>\n {editing && (\n <>\n <FormField label=\"Receive URL (immutable)\">\n <Input\n value={`/webhooks/${receiver.slug}`}\n readOnly\n className=\"text-muted-foreground\"\n />\n </FormField>\n <label className=\"flex items-center gap-2 text-xs\">\n <input\n type=\"checkbox\"\n checked={rotate}\n onChange={(e) => setRotate(e.target.checked)}\n />\n Rotate signing secret (the new secret is shown once)\n </label>\n </>\n )}\n </div>\n <DialogFooter>\n <Button size=\"sm\" variant=\"ghost\" onClick={onClose} disabled={pending}>\n Cancel\n </Button>\n <Button size=\"sm\" onClick={submit} disabled={!canSubmit}>\n {editing ? \"Save changes\" : \"Create receiver\"}\n </Button>\n </DialogFooter>\n </>\n );\n}\n","import { Check, ChevronRight, Copy, Pencil, Plus, Power, Trash2 } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { toast } from \"sonner\";\nimport type { WebhookReceiver } from \"@durablex/react\";\nimport { useConfirmAction } from \"../hooks/use-confirm-action\";\nimport { useReceivers, useDeleteReceiver, useUpdateReceiver } from \"@durablex/react\";\nimport { formatRelative } from \"../lib/format\";\nimport { receiverLabel } from \"../lib/webhook-view\";\nimport { Facts } from \"./Facts\";\nimport { EndpointBadge } from \"./WebhookBadges\";\nimport { ReceiverFormDialog } from \"./ReceiverFormDialog\";\n\nexport function ReceiversTab() {\n const receivers = useReceivers().data ?? [];\n const [adding, setAdding] = useState(false);\n const [editing, setEditing] = useState<WebhookReceiver | null>(null);\n\n return (\n <div className=\"content\">\n <div className=\"tbar\">\n <span className=\"text-muted-foreground font-mono text-[11px]\">\n {receivers.length} receivers\n </span>\n <span className=\"tbar-spacer\" />\n <button type=\"button\" className=\"btn focusable\" onClick={() => setAdding(true)}>\n <Plus /> Add receiver\n </button>\n </div>\n <div className=\"tablewrap\">\n {receivers.length === 0 ? (\n <div className=\"placeholder\">\n <div className=\"ph-inner\">\n <h3>No inbound receivers</h3>\n <p>Add a receiver to map a verified external POST onto a durablex event.</p>\n </div>\n </div>\n ) : (\n <table className=\"runs apps-table\">\n <thead>\n <tr>\n <th>Source</th>\n <th>Status</th>\n <th>Verification</th>\n <th>Maps to event</th>\n <th>App</th>\n <th>Created</th>\n </tr>\n </thead>\n <tbody>\n {receivers.map((rc) => (\n <ReceiverRow key={rc.id} rc={rc} onEdit={() => setEditing(rc)} />\n ))}\n </tbody>\n </table>\n )}\n </div>\n\n <ReceiverFormDialog open={adding} onOpenChange={setAdding} />\n <ReceiverFormDialog\n open={editing != null}\n onOpenChange={(o) => !o && setEditing(null)}\n receiver={editing ?? undefined}\n />\n </div>\n );\n}\n\nfunction ReceiverRow({ rc, onEdit }: { rc: WebhookReceiver; onEdit(): void }) {\n const [open, setOpen] = useState(false);\n const dot = rc.enabled ? \"var(--primary)\" : \"var(--muted-foreground)\";\n const path = `/webhooks/${rc.slug}`;\n\n return (\n <>\n <tr className=\"row app-row\" aria-expanded={open} onClick={() => setOpen(!open)}>\n <td>\n <div className=\"app-cell\">\n <ChevronRight className=\"app-chev\" />\n <i className=\"sq\" style={{ width: 8, height: 8, background: dot }} />\n <div className=\"app-id\">\n <span className=\"nm\">{receiverLabel(rc)}</span>\n <span className=\"url\">{path}</span>\n </div>\n </div>\n </td>\n <td>\n <EndpointBadge health={rc.enabled ? \"active\" : \"disabled\"} />\n </td>\n <td>\n <span className=\"wh-verify ok\">\n <Check /> Signed\n </span>\n </td>\n <td>\n <span className=\"wf-name text-xs\">{rc.eventName}</span>\n </td>\n <td>\n <span className=\"text-muted-foreground text-[11px]\">{rc.app || \"-\"}</span>\n </td>\n <td>\n <span className=\"ts cell-mut\">{formatRelative(rc.createdAt)}</span>\n </td>\n </tr>\n {open && (\n <tr className=\"app-detailrow\">\n <td colSpan={6}>\n <div className=\"wh-od\">\n <div className=\"wh-od-main\">\n <div className=\"wh-od-sec\">\n <div className=\"wh-od-h\">Configuration</div>\n <Facts\n rows={[\n [\"Receive URL\", path],\n [\"Receiver id\", rc.id],\n [\"Signature\", rc.scheme],\n [\"Maps to\", rc.eventName],\n ]}\n />\n </div>\n <ReceiverActions rc={rc} path={path} onEdit={onEdit} />\n </div>\n <div className=\"wh-od-side\">\n <div className=\"wh-od-h\">Verification</div>\n <p className=\"text-muted-foreground text-xs\">\n Inbound posts are HMAC-verified against this receiver's signing secret. Rotate the\n secret from Edit; the new value is shown once.\n </p>\n </div>\n </div>\n </td>\n </tr>\n )}\n </>\n );\n}\n\nfunction ReceiverActions({\n rc,\n path,\n onEdit,\n}: {\n rc: WebhookReceiver;\n path: string;\n onEdit(): void;\n}) {\n const update = useUpdateReceiver();\n const del = useDeleteReceiver();\n const remove = useConfirmAction(() =>\n del.mutate(rc.id, {\n onSuccess: () => toast.success(\"Receiver deleted\"),\n onError: (e: Error) => toast.error(`Could not delete receiver: ${e.message}`),\n }),\n );\n\n function copyUrl() {\n void navigator.clipboard?.writeText(`${window.location.origin}${path}`).then(\n () => toast.success(\"Receive URL copied\"),\n () => undefined,\n );\n }\n\n return (\n <div className=\"app-actions\" onClick={(e) => e.stopPropagation()}>\n <button type=\"button\" className=\"btn focusable\" onClick={onEdit}>\n <Pencil /> Edit\n </button>\n <button type=\"button\" className=\"btn focusable\" onClick={copyUrl}>\n <Copy /> Copy URL\n </button>\n <button\n type=\"button\"\n className=\"btn focusable\"\n disabled={update.isPending}\n onClick={() =>\n update.mutate(\n { id: rc.id, patch: { enabled: !rc.enabled } },\n { onError: (e: Error) => toast.error(`Could not update receiver: ${e.message}`) },\n )\n }\n >\n <Power /> {rc.enabled ? \"Disable\" : \"Enable\"}\n </button>\n <button\n type=\"button\"\n className=\"btn focusable\"\n style={{ color: \"var(--st-failed-fg)\" }}\n disabled={del.isPending}\n onClick={remove.trigger}\n >\n <Trash2 /> {remove.confirming ? \"Confirm delete\" : \"Delete\"}\n </button>\n </div>\n );\n}\n","import { Globe, Inbox, Send } from \"lucide-react\";\nimport type { ComponentType } from \"react\";\nimport { useState } from \"react\";\nimport { DeliveriesSplit } from \"./DeliveriesSplit\";\nimport { EndpointsTab } from \"./EndpointsTab\";\nimport { ReceiversTab } from \"./ReceiversTab\";\nimport { useEndpoints, useReceivers } from \"@durablex/react\";\nimport type { WebhookTab } from \"../lib/webhook-view\";\n\nconst TABS = [\n { key: \"deliveries\", label: \"Deliveries\", Icon: Send },\n { key: \"endpoints\", label: \"Endpoints\", Icon: Globe },\n { key: \"receivers\", label: \"Receivers\", Icon: Inbox },\n] as const;\n\nexport function WebhooksView({ onOpenRun }: { onOpenRun?: (runId: string) => void }) {\n const [tab, setTab] = useState<WebhookTab>(\"deliveries\");\n const endpoints = useEndpoints().data?.length;\n const receivers = useReceivers().data?.length;\n const counts: Record<WebhookTab, number | undefined> = {\n deliveries: undefined,\n endpoints,\n receivers,\n };\n\n return (\n <div className=\"wh-root\">\n <div className=\"wh-subnav\" role=\"tablist\">\n {TABS.map(({ key, label, Icon }) => (\n <WebhookTab\n key={key}\n label={label}\n Icon={Icon}\n count={counts[key]}\n selected={tab === key}\n onSelect={() => setTab(key)}\n />\n ))}\n </div>\n <div className=\"wh-body\">\n {tab === \"deliveries\" && <DeliveriesSplit onOpenRun={onOpenRun} />}\n {tab === \"endpoints\" && <EndpointsTab />}\n {tab === \"receivers\" && <ReceiversTab />}\n </div>\n </div>\n );\n}\n\nfunction WebhookTab({\n label,\n Icon,\n count,\n selected,\n onSelect,\n}: {\n label: string;\n Icon: ComponentType<{ className?: string }>;\n count?: number;\n selected: boolean;\n onSelect(): void;\n}) {\n return (\n <button type=\"button\" className=\"wh-tab\" role=\"tab\" aria-selected={selected} onClick={onSelect}>\n <Icon className=\"wh-tab-ico\" />\n <span>{label}</span>\n {count != null && <span className=\"wh-count tabular-nums\">{count}</span>}\n </button>\n );\n}\n","import type { RunStats } from \"@durablex/react\";\nimport { useFlowState } from \"@durablex/react\";\nimport { SectionHeader } from \"./SectionHeader\";\nimport { StatTileGrid } from \"./StatTileGrid\";\n\n// Namespace-wide (or per-app) flow-control state: queue depth and in-flight from run\n// stats, plus the buffered totals across the debounce and batch adapters.\nexport function FlowSummary({ app, stats }: { app?: string; stats?: RunStats }) {\n const flow = useFlowState(app ? { app } : {});\n const debouncePending = (flow.data?.debounce ?? []).reduce((n, d) => n + d.pending, 0);\n const batchBuffered = (flow.data?.batch ?? []).reduce((n, b) => n + b.buffered, 0);\n\n return (\n <section className=\"flowsum\">\n <SectionHeader>Flow control</SectionHeader>\n <StatTileGrid\n tiles={[\n {\n label: \"Queue depth\",\n value: stats?.queued ?? 0,\n sub: \"waiting to start\",\n token: \"--st-queued-fg\",\n },\n {\n label: \"In-flight\",\n value: stats?.running ?? 0,\n sub: \"executing now\",\n token: \"--st-running-fg\",\n mark: true,\n },\n {\n label: \"Debounce pending\",\n value: debouncePending,\n sub: \"coalescing\",\n token: \"--st-waiting-fg\",\n },\n {\n label: \"Batch buffered\",\n value: batchBuffered,\n sub: \"awaiting flush\",\n token: \"--st-waiting-fg\",\n },\n ]}\n />\n </section>\n );\n}\n","import { useState } from \"react\";\nimport { useRunStats, useRunTimeSeries } from \"@durablex/react\";\nimport { StatsTiles } from \"./StatsTiles\";\nimport { AppFilter } from \"./filters/AppFilter\";\nimport { TimeRangeFilter } from \"./filters/TimeRangeFilter\";\nimport { RunCharts } from \"./charts/RunCharts\";\nimport { FlowSummary } from \"./FlowSummary\";\nimport { ALL_FILTER } from \"../lib/run-filters\";\nimport { DEFAULT_TIME_RANGE, seriesBucketSeconds, timeLabel, windowSince } from \"../lib/time-range\";\n\nexport function OverviewView() {\n const [time, setTime] = useState(DEFAULT_TIME_RANGE);\n const [app, setApp] = useState<string>(ALL_FILTER);\n\n const since = windowSince(time);\n const appParam = app === ALL_FILTER ? undefined : app;\n const bucket = seriesBucketSeconds(time);\n\n const stats = useRunStats({ app: appParam, since });\n // Queue depth / in-flight are point-in-time facts, so the flow summary reads an\n // unwindowed count - a run started before the selected range is still in flight.\n const liveStats = useRunStats({ app: appParam });\n const { data: series, isLoading } = useRunTimeSeries({ app: appParam, since, bucket });\n\n return (\n <div className=\"flex h-full min-h-0 flex-col\">\n <StatsTiles stats={stats.data} rangeLabel={timeLabel(time)} />\n <div className=\"filterbar\">\n <TimeRangeFilter time={time} onTime={setTime} />\n <AppFilter app={app} onApp={setApp} />\n </div>\n\n <div className=\"min-h-0 flex-1 overflow-auto\">\n <FlowSummary app={appParam} stats={liveStats.data} />\n <RunCharts series={series} loading={isLoading} />\n </div>\n </div>\n );\n}\n","import * as React from \"react\";\nimport {\n CircleCheckIcon,\n InfoIcon,\n Loader2Icon,\n OctagonXIcon,\n TriangleAlertIcon,\n} from \"lucide-react\";\nimport { Toaster as Sonner, type ToasterProps } from \"sonner\";\n\nconst Toaster = ({ ...props }: ToasterProps) => {\n return (\n <Sonner\n className=\"toaster group\"\n icons={{\n success: <CircleCheckIcon className=\"size-4\" />,\n info: <InfoIcon className=\"size-4\" />,\n warning: <TriangleAlertIcon className=\"size-4\" />,\n error: <OctagonXIcon className=\"size-4\" />,\n loading: <Loader2Icon className=\"size-4 animate-spin\" />,\n }}\n style={\n {\n \"--normal-bg\": \"var(--popover)\",\n \"--normal-text\": \"var(--popover-foreground)\",\n \"--normal-border\": \"var(--border)\",\n \"--border-radius\": \"var(--radius)\",\n } as React.CSSProperties\n }\n {...props}\n />\n );\n};\n\nexport { Toaster };\n","export const THEME_PREFS = [\"light\", \"system\", \"dark\"] as const;\nexport type ThemePref = (typeof THEME_PREFS)[number];\n\nconst KEY = \"dx.theme\";\nconst query = \"(prefers-color-scheme: dark)\";\n\nexport function getThemePref(): ThemePref {\n const v = localStorage.getItem(KEY);\n return v === \"light\" || v === \"dark\" ? v : \"system\";\n}\n\nfunction resolveDark(pref: ThemePref): boolean {\n return pref === \"system\" ? window.matchMedia(query).matches : pref === \"dark\";\n}\n\nexport function applyThemePref(pref: ThemePref): void {\n const dark = resolveDark(pref);\n document.documentElement.classList.toggle(\"dark\", dark);\n document.documentElement.style.colorScheme = dark ? \"dark\" : \"light\";\n}\n\nexport function setThemePref(pref: ThemePref): void {\n localStorage.setItem(KEY, pref);\n applyThemePref(pref);\n}\n\n// Re-apply on OS change so the \"system\" preference stays live.\nexport function watchSystemTheme(getPref: () => ThemePref): () => void {\n const mq = window.matchMedia(query);\n const onChange = () => {\n if (getPref() === \"system\") applyThemePref(\"system\");\n };\n mq.addEventListener(\"change\", onChange);\n return () => mq.removeEventListener(\"change\", onChange);\n}\n"],"mappings":"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"}
|