@workerdeck/ui 3.4.0 → 3.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["AlertDialogPrimitive","PopoverPrimitive","SonnerToaster","Map"],"sources":["../src/components/ui/Card.tsx","../src/components/ui/AlertDialog.tsx","../src/components/ui/Popover.tsx","../src/components/ui/Sonner.tsx","../src/components/ui/Empty.tsx","../src/components/prompt-area/segment-helpers.ts","../src/components/terminal/StatusLine.tsx","../src/components/agent/TaskList.tsx","../src/components/agent/TasksDialog.tsx","../src/components/agent/SessionList.tsx","../src/components/agent/ProjectIcon.tsx","../src/components/agent/SessionFilters.tsx","../src/components/agent/ContextRing.tsx","../src/components/agent/EngineIcon.tsx","../src/components/agent/SessionStatusIcon.tsx","../src/components/agent/SessionSteps.tsx","../src/components/agent/SessionItem.tsx","../src/components/agent/SessionGroups.tsx","../src/components/agent/SessionBrowser.tsx","../src/components/agent/SubagentToggle.tsx"],"sourcesContent":["import { type HTMLAttributes } from 'react'\nimport { cn } from '../../lib/utils.ts'\n\nexport function Card({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return <div data-slot=\"card\" className={cn('rounded-lg border border-border bg-surface', className)} {...props} />\n}\n\nexport function CardHeader({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return <div className={cn('flex items-start justify-between gap-3 px-4 pt-3.5 pb-3', className)} {...props} />\n}\n\nexport function CardTitle({ className, ...props }: HTMLAttributes<HTMLHeadingElement>) {\n return <h3 className={cn('text-heading-3 font-semibold text-text', className)} {...props} />\n}\n\nexport function CardContent({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return <div className={cn('px-4 pb-4', className)} {...props} />\n}\n","import { type FunctionComponent } from 'react'\nimport { AlertDialog as AlertDialogPrimitive } from '@base-ui/react/alert-dialog'\nimport { cn } from '../../lib/utils.ts'\nimport { PortalScope } from './PortalScope.tsx'\n\nexport const AlertDialog = AlertDialogPrimitive.Root\nexport const AlertDialogTrigger = AlertDialogPrimitive.Trigger\nexport const AlertDialogClose = AlertDialogPrimitive.Close\n\nexport const AlertDialogContent: FunctionComponent<AlertDialogPrimitive.Popup.Props> = ({ className, children, ...props }) => (\n <AlertDialogPrimitive.Portal>\n <PortalScope>\n <AlertDialogPrimitive.Backdrop\n className={cn(\n 'fixed inset-0 z-70 bg-black/40 backdrop-blur-[1px]',\n 'transition-opacity duration-(--motion-base)',\n 'data-starting-style:opacity-0 data-ending-style:opacity-0',\n )}\n />\n <AlertDialogPrimitive.Popup\n data-slot=\"alert-dialog-content\"\n className={cn(\n 'fixed top-1/2 left-1/2 z-70 w-[min(28rem,calc(100vw-2rem))] -translate-x-1/2 -translate-y-1/2',\n 'rounded-lg border border-border bg-surface p-5 shadow-(--shadow-lg) outline-none',\n 'transition-[opacity,transform] duration-(--motion-base)',\n 'data-starting-style:scale-95 data-starting-style:opacity-0',\n 'data-ending-style:scale-95 data-ending-style:opacity-0',\n className,\n )}\n {...props}\n >\n {children}\n </AlertDialogPrimitive.Popup>\n </PortalScope>\n </AlertDialogPrimitive.Portal>\n)\n\nexport const AlertDialogTitle: FunctionComponent<AlertDialogPrimitive.Title.Props> = ({ className, ...props }) => (\n <AlertDialogPrimitive.Title className={cn('text-heading-3 font-semibold text-text', className)} {...props} />\n)\n\nexport const AlertDialogDescription: FunctionComponent<AlertDialogPrimitive.Description.Props> = ({ className, ...props }) => (\n <AlertDialogPrimitive.Description className={cn('mt-1.5 text-body-sm text-muted-foreground', className)} {...props} />\n)\n","import { type FunctionComponent } from 'react'\nimport { Popover as PopoverPrimitive } from '@base-ui/react/popover'\nimport { cn } from '../../lib/utils.ts'\nimport { PortalScope } from './PortalScope.tsx'\n\nexport const Popover = PopoverPrimitive.Root\nexport const PopoverTrigger = PopoverPrimitive.Trigger\n\nexport const PopoverContent: FunctionComponent<\n PopoverPrimitive.Popup.Props & Pick<PopoverPrimitive.Positioner.Props, 'align' | 'side' | 'sideOffset'>\n> = ({ className, align = 'end', side = 'bottom', sideOffset = 6, ...props }) => (\n <PopoverPrimitive.Portal>\n <PortalScope>\n <PopoverPrimitive.Positioner align={align} side={side} sideOffset={sideOffset} className=\"isolate z-80 outline-none\">\n <PopoverPrimitive.Popup\n data-slot=\"popover-content\"\n className={cn(\n 'rounded-md border border-border bg-surface p-2 text-fg-1 shadow-(--shadow-lg) outline-none',\n 'transition-[opacity,transform] duration-(--motion-base)',\n 'data-starting-style:scale-95 data-starting-style:opacity-0',\n 'data-ending-style:scale-95 data-ending-style:opacity-0',\n className,\n )}\n {...props}\n />\n </PopoverPrimitive.Positioner>\n </PortalScope>\n </PopoverPrimitive.Portal>\n)\n","import { Toaster as SonnerToaster, toast } from 'sonner'\n\nexport { toast }\n\nexport function Toaster() {\n return (\n <SonnerToaster\n position=\"bottom-right\"\n toastOptions={{\n style: {\n background: 'var(--surface)',\n color: 'var(--text)',\n border: '1px solid var(--border)',\n boxShadow: 'var(--shadow-md)',\n fontFamily: 'var(--cw-font-sans)',\n fontSize: 'var(--text-body-sm)',\n },\n }}\n />\n )\n}\n","import type { ReactNode } from 'react'\nimport { Button } from './Button.tsx'\n\nexport function Empty({\n icon,\n title,\n description,\n action,\n onAction,\n}: {\n icon: ReactNode\n title: string\n description?: ReactNode\n action?: string\n onAction?: () => void\n}) {\n return (\n <div className=\"flex flex-col items-center gap-2 px-5 py-8 text-center\">\n <div className=\"text-fg-4 opacity-60 [&_svg]:size-7\">{icon}</div>\n <p className=\"text-body-sm font-medium text-fg-2\">{title}</p>\n {description ? <p className=\"max-w-[26ch] text-balance text-label leading-relaxed text-fg-4\">{description}</p> : null}\n {action && onAction ? (\n <Button variant=\"outline\" size=\"sm\" className=\"mt-1\" onClick={onAction}>\n {action}\n </Button>\n ) : null}\n </div>\n )\n}\n\nexport function EmptyKey({ children }: { children: ReactNode }) {\n return <span className=\"rounded border border-border px-1 font-mono text-fg-3\">{children}</span>\n}\n","/**\n * Convenience helpers for creating and inspecting Segments.\n *\n * These reduce boilerplate when building AI chat UIs that work with the\n * PromptArea document model.\n *\n * @example\n * ```ts\n * import { text, chip, isSegmentsEmpty, segmentsToPlainText } from './segment-helpers.ts'\n *\n * const greeting = [text('Hello '), chip({ trigger: '@', value: 'u1', displayText: 'Alice' })]\n * isSegmentsEmpty(greeting) // false\n * segmentsToPlainText(greeting) // \"Hello @Alice\"\n * ```\n */\n\nimport type { Segment, TextSegment, ChipSegment } from './types.ts'\nimport { segmentsToPlainText, plainTextToSegments } from './prompt-area-engine.ts'\n\n// Re-export serialization utilities so consumers have a single import.\nexport { segmentsToPlainText, plainTextToSegments }\n\n/** Create a text segment. */\nexport function text(value: string): TextSegment {\n return { type: 'text', text: value }\n}\n\n/** Create a chip segment. */\nexport function chip(opts: Omit<ChipSegment, 'type'>): ChipSegment {\n return { type: 'chip', ...opts }\n}\n\n/** Returns `true` when the segment array is empty or contains only whitespace text. */\nexport function isSegmentsEmpty(segments: Segment[]): boolean {\n if (segments.length === 0) {\n return true\n }\n return segments.every((seg) => seg.type === 'text' && seg.text.trim() === '')\n}\n\n/** Returns `true` when the segment array contains at least one chip. */\nexport function hasChips(segments: Segment[]): boolean {\n return segments.some((seg) => seg.type === 'chip')\n}\n\n/** Extracts all chip segments from a segment array. */\nexport function getChips(segments: Segment[]): ChipSegment[] {\n return segments.filter((seg): seg is ChipSegment => seg.type === 'chip')\n}\n\n/** Extracts chips matching a specific trigger character. */\nexport function getChipsByTrigger(segments: Segment[], trigger: string): ChipSegment[] {\n return segments.filter((seg): seg is ChipSegment => seg.type === 'chip' && seg.trigger === trigger)\n}\n","import type { RateLimitInfo } from '@workerdeck/protocol'\nimport type { ConnectionState, TranscriptState } from '@workerdeck/react'\nimport { formatCost, formatTokens } from '../../lib/format.ts'\nimport {\n contextSeverity,\n meterSeverity,\n modelLabel,\n statusPresentation,\n tightestWindow,\n windowLabel,\n type StatusSeverity,\n} from '../../lib/status.ts'\nimport { Ink, Row, type Tone } from './row.tsx'\n\nconst SEVERITY_TONE: Record<StatusSeverity, Tone> = {\n none: 'dim',\n warning: 'yellow',\n error: 'red',\n}\n\nexport interface TerminalStatusLineProps {\n className?: string\n state: TranscriptState\n rateLimits?: Record<string, RateLimitInfo>\n connection?: ConnectionState\n onOpenStatus?: () => void\n onOpenContext?: () => void\n onOpenUsage?: () => void\n}\n\nfunction Reading({ tone, onPress, label, children }: { tone?: Tone; onPress?: () => void; label?: string; children: React.ReactNode }) {\n if (!onPress) {\n return <Ink tone={tone}>{children}</Ink>\n }\n return (\n <button type=\"button\" className=\"term-reading\" onClick={onPress} title={label}>\n <Ink tone={tone}>{children}</Ink>\n </button>\n )\n}\n\nexport function TerminalStatusLine({\n className,\n state,\n rateLimits,\n connection,\n onOpenStatus,\n onOpenContext,\n onOpenUsage,\n}: TerminalStatusLineProps) {\n const presentation = statusPresentation({ status: state.status, connection })\n const usage = state.contextUsage\n const window = tightestWindow(rateLimits ?? state.rateLimits)\n const model = modelLabel({ model: state.model, models: state.models ?? [] })\n\n const parts: React.ReactNode[] = [\n <Reading key=\"status\" tone={SEVERITY_TONE[presentation.severity]} onPress={onOpenStatus} label=\"Session status\">\n {presentation.label}\n </Reading>,\n ]\n\n if (usage) {\n parts.push(\n <Reading key=\"context\" tone={SEVERITY_TONE[contextSeverity(usage)]} onPress={onOpenContext} label=\"Context window\">\n {Math.round(usage.percentage)}% ctx ({formatTokens(usage.totalTokens)})\n </Reading>,\n )\n }\n\n if (window) {\n parts.push(\n <Reading key=\"usage\" tone={SEVERITY_TONE[meterSeverity(window.info.utilization)]} onPress={onOpenUsage} label=\"Plan usage\">\n {Math.round(window.info.utilization ?? 0)}% {windowLabel(window.key)}\n </Reading>,\n )\n }\n\n const costUsd = state.costUsd ?? (state.totalCostUsd || undefined)\n if (costUsd !== undefined && costUsd > 0) {\n parts.push(\n <Ink key=\"cost\" tone=\"faint\">\n {formatCost(costUsd)}\n </Ink>,\n )\n }\n\n if (model) {\n parts.push(\n <Ink key=\"model\" tone=\"faint\">\n {model}\n </Ink>,\n )\n }\n if (state.permissionMode && state.permissionMode !== 'default') {\n parts.push(\n <Ink key=\"mode\" tone=\"yellow\">\n {state.permissionMode}\n </Ink>,\n )\n }\n\n return (\n <Row data-slot=\"status-line\" tone=\"dim\" className={className}>\n {parts.map((part, index) => (\n <span key={index}>\n {index > 0 ? <Ink tone=\"faint\"> · </Ink> : null}\n {part}\n </span>\n ))}\n </Row>\n )\n}\n","import { ArrowRight, Check, CircleAlert, Circle } from 'lucide-react'\nimport { taskSummary, visibleTasks } from '@workerdeck/protocol'\nimport type { SessionTask } from '@workerdeck/protocol'\nimport { Spinner } from '../ui/Spinner.tsx'\nimport { cn } from '../../lib/utils.ts'\n\nexport interface TaskListProps {\n tasks: readonly SessionTask[]\n showCompleted: boolean\n // Absent where the toggle lives outside this list - VS Code puts it in the view's title bar.\n onShowCompletedChange?: (showCompleted: boolean) => void\n onSelectTask?: (task: SessionTask) => void\n className?: string\n}\n\nexport function TaskList({ tasks, showCompleted, onShowCompletedChange, onSelectTask, className }: TaskListProps) {\n const summary = taskSummary(tasks)\n const shown = visibleTasks(tasks, showCompleted)\n const hidden = tasks.length - shown.length\n return (\n <div className={cn('flex flex-col', className)}>\n <div className=\"flex items-baseline justify-between gap-4 pb-1.5\">\n <span className=\"text-label text-fg-3\">\n {summary.done} of {summary.total} done\n {summary.failed > 0 ? ` · ${summary.failed} failed` : ''}\n </span>\n {summary.done > 0 && onShowCompletedChange ? (\n <button\n type=\"button\"\n onClick={() => onShowCompletedChange(!showCompleted)}\n className=\"shrink-0 rounded-[4px] px-1 py-0.5 text-label text-fg-4 outline-none hover:bg-row-hover hover:text-fg-2\"\n >\n {showCompleted ? 'Hide completed' : `Show completed (${summary.done})`}\n </button>\n ) : null}\n </div>\n {shown.length === 0 ? (\n <p className=\"py-6 text-center text-body-sm text-fg-4\">\n {tasks.length === 0 ? 'No tasks yet - a checklist appears once the agent plans one.' : `${hidden} completed, all hidden.`}\n </p>\n ) : (\n <div className=\"flex flex-col\">\n {shown.map((task) => (\n <TaskRow key={task.key} task={task} onSelect={onSelectTask} />\n ))}\n </div>\n )}\n </div>\n )\n}\n\nfunction TaskRow({ task, onSelect }: { task: SessionTask; onSelect?: (task: SessionTask) => void }) {\n const pressable = onSelect !== undefined && task.toolUseId !== undefined\n const body = task.state === 'failed' ? 'text-danger' : task.state === 'done' ? 'text-fg-4' : 'text-fg-2'\n const row = (\n <>\n <TaskIcon state={task.state} />\n <span className={cn('min-w-0 flex-1 truncate text-left', task.state === 'done' ? 'line-through' : undefined)}>{task.label}</span>\n {task.detail ? <span className=\"shrink-0 tabular-nums text-fg-4\">{task.detail}</span> : null}\n {pressable ? <ArrowRight className=\"size-3.5 shrink-0 text-fg-4\" /> : null}\n </>\n )\n const className = cn('flex w-full items-center gap-1.5 rounded-[4px] px-1.5 py-1 text-body-sm outline-none', body)\n if (!pressable) {\n return <div className={className}>{row}</div>\n }\n return (\n <button type=\"button\" title={task.label} onClick={() => onSelect(task)} className={cn(className, 'hover:bg-row-active')}>\n {row}\n </button>\n )\n}\n\nfunction TaskIcon({ state }: { state: SessionTask['state'] }) {\n switch (state) {\n case 'running': {\n return <Spinner className=\"size-[13px] shrink-0\" />\n }\n case 'failed': {\n return <CircleAlert className=\"size-[13px] shrink-0\" />\n }\n case 'done': {\n return <Check className=\"size-[13px] shrink-0\" />\n }\n default: {\n return <Circle className=\"size-[13px] shrink-0 text-fg-4\" />\n }\n }\n}\n","import type { SessionTask } from '@workerdeck/protocol'\nimport { Dialog, DialogBody, DialogContent, DialogHeader } from '../ui/Dialog.tsx'\nimport { TaskList } from './TaskList.tsx'\n\nexport interface TasksDialogProps {\n tasks: readonly SessionTask[]\n showCompleted: boolean\n onShowCompletedChange: (showCompleted: boolean) => void\n onSelectTask?: (task: SessionTask) => void\n open: boolean\n onOpenChange: (open: boolean) => void\n className?: string\n}\n\nexport function TasksDialog({\n tasks,\n showCompleted,\n onShowCompletedChange,\n onSelectTask,\n open,\n onOpenChange,\n className,\n}: TasksDialogProps) {\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className={className}>\n <DialogHeader title=\"Tasks\" description=\"The agent's checklist and the tasks it has spawned\" />\n <DialogBody>\n <TaskList\n tasks={tasks}\n showCompleted={showCompleted}\n onShowCompletedChange={onShowCompletedChange}\n onSelectTask={\n onSelectTask\n ? (task) => {\n onOpenChange(false)\n onSelectTask(task)\n }\n : undefined\n }\n />\n </DialogBody>\n </DialogContent>\n </Dialog>\n )\n}\n","import type { SessionInfo } from '@workerdeck/protocol'\nimport { Trash2 } from 'lucide-react'\nimport { Badge } from '../ui/Badge.tsx'\nimport { Button } from '../ui/Button.tsx'\nimport { cn } from '../../lib/utils.ts'\nimport { formatCost, formatRelativeTime } from '../../lib/format.ts'\nimport { STATUS_META } from './status.ts'\n\nexport interface SessionListItemProps {\n session: SessionInfo\n active?: boolean\n onSelect?: (id: string) => void\n onDelete?: (id: string) => void\n className?: string\n}\n\nexport function SessionListItem({ session, active, onSelect, onDelete, className }: SessionListItemProps) {\n const meta = STATUS_META[session.status]\n return (\n <div\n data-slot=\"session-list-item\"\n data-active={active || undefined}\n className={cn(\n 'group flex w-full items-center gap-2 rounded-md border border-transparent px-2.5 py-2 text-left transition-colors',\n active ? 'border-border bg-surface' : 'hover:bg-surface-hover',\n className,\n )}\n >\n <button type=\"button\" onClick={() => onSelect?.(session.id)} className=\"min-w-0 flex-1 text-left outline-none\">\n <div className=\"flex items-center gap-2\">\n <span className=\"truncate text-body-sm font-medium text-fg-1\">{session.title ?? session.id.slice(0, 8)}</span>\n <Badge variant={meta.variant} dot className=\"shrink-0\">\n {meta.label}\n </Badge>\n </div>\n <div className=\"mt-0.5 flex items-center gap-2 font-mono text-label text-fg-4\">\n <span className=\"truncate\">{session.cwd}</span>\n {session.profile ? <span className=\"shrink-0\">@{session.profile}</span> : null}\n <span className=\"shrink-0\">{formatCost(session.costUsd ?? session.totalCostUsd)}</span>\n <span className=\"shrink-0\">{formatRelativeTime(session.lastActivityAt ?? session.createdAt)}</span>\n </div>\n </button>\n {onDelete ? (\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label=\"Close session\"\n className=\"opacity-0 transition-opacity group-hover:opacity-100\"\n onClick={() => onDelete(session.id)}\n >\n <Trash2 className=\"size-3.5 text-fg-3\" />\n </Button>\n ) : null}\n </div>\n )\n}\n\nexport interface SessionListProps {\n sessions: SessionInfo[]\n activeId?: string\n onSelect?: (id: string) => void\n onDelete?: (id: string) => void\n emptyText?: string\n className?: string\n}\n\nexport function SessionList({ sessions, activeId, onSelect, onDelete, emptyText = 'No sessions yet.', className }: SessionListProps) {\n return (\n <div data-slot=\"session-list\" className={cn('flex flex-col gap-1', className)}>\n {sessions.length === 0 ? (\n <div className=\"px-2.5 py-6 text-center text-body-sm text-fg-4\">{emptyText}</div>\n ) : (\n sessions.map((session) => (\n <SessionListItem key={session.id} session={session} active={session.id === activeId} onSelect={onSelect} onDelete={onDelete} />\n ))\n )}\n </div>\n )\n}\n","import type { ProjectIcon as ProjectIconSpec } from '@workerdeck/protocol'\nimport {\n Anchor,\n Atom,\n Beaker,\n Bike,\n Binary,\n Blocks,\n Bot,\n Box,\n Brain,\n Briefcase,\n Brush,\n Bug,\n Building2,\n Cable,\n Camera,\n Car,\n Cat,\n CircuitBoard,\n Cloud,\n Code,\n Coffee,\n Cog,\n Compass,\n Container,\n Cpu,\n CreditCard,\n Database,\n Diamond,\n Dog,\n Feather,\n Film,\n Flame,\n FlaskConical,\n Folder,\n Gamepad2,\n Gauge,\n Gem,\n Ghost,\n Gift,\n GitBranch,\n Globe,\n GraduationCap,\n Hammer,\n Hexagon,\n House,\n Image,\n Key,\n Landmark,\n Laptop,\n Layers,\n Leaf,\n Library,\n Lightbulb,\n Lock,\n Mail,\n Map,\n MessageCircle,\n Mic,\n Monitor,\n Moon,\n Mountain,\n Music,\n Network,\n Newspaper,\n Notebook,\n Orbit,\n Package,\n Palette,\n PenTool,\n Phone,\n PiggyBank,\n Plane,\n Plug,\n Puzzle,\n Radar,\n Radio,\n Receipt,\n Rocket,\n Ruler,\n Satellite,\n Scale,\n Scissors,\n Server,\n Shield,\n Ship,\n ShoppingCart,\n Signal,\n Smartphone,\n Sparkles,\n Sprout,\n Square,\n Star,\n Sun,\n Table,\n Tag,\n Target,\n Telescope,\n Terminal,\n TestTube,\n TreePine,\n Trophy,\n Truck,\n Umbrella,\n Users,\n Wallet,\n Wand,\n Waves,\n Webhook,\n Wifi,\n Wrench,\n Zap,\n} from 'lucide-react'\nimport type { ComponentType } from 'react'\nimport { cn } from '../../lib/utils.ts'\n\nconst GLYPHS: Record<string, ComponentType<{ className?: string }>> = {\n anchor: Anchor,\n atom: Atom,\n beaker: Beaker,\n bike: Bike,\n binary: Binary,\n blocks: Blocks,\n bot: Bot,\n box: Box,\n brain: Brain,\n briefcase: Briefcase,\n brush: Brush,\n bug: Bug,\n 'building-2': Building2,\n cable: Cable,\n camera: Camera,\n car: Car,\n cat: Cat,\n 'circuit-board': CircuitBoard,\n cloud: Cloud,\n code: Code,\n coffee: Coffee,\n cog: Cog,\n compass: Compass,\n container: Container,\n cpu: Cpu,\n 'credit-card': CreditCard,\n database: Database,\n diamond: Diamond,\n dog: Dog,\n feather: Feather,\n film: Film,\n flame: Flame,\n 'flask-conical': FlaskConical,\n folder: Folder,\n 'gamepad-2': Gamepad2,\n gauge: Gauge,\n gem: Gem,\n ghost: Ghost,\n gift: Gift,\n 'git-branch': GitBranch,\n globe: Globe,\n 'graduation-cap': GraduationCap,\n hammer: Hammer,\n hexagon: Hexagon,\n house: House,\n image: Image,\n key: Key,\n landmark: Landmark,\n laptop: Laptop,\n layers: Layers,\n leaf: Leaf,\n library: Library,\n lightbulb: Lightbulb,\n lock: Lock,\n mail: Mail,\n map: Map,\n 'message-circle': MessageCircle,\n mic: Mic,\n monitor: Monitor,\n moon: Moon,\n mountain: Mountain,\n music: Music,\n network: Network,\n newspaper: Newspaper,\n notebook: Notebook,\n orbit: Orbit,\n package: Package,\n palette: Palette,\n 'pen-tool': PenTool,\n phone: Phone,\n 'piggy-bank': PiggyBank,\n plane: Plane,\n plug: Plug,\n puzzle: Puzzle,\n radar: Radar,\n radio: Radio,\n receipt: Receipt,\n rocket: Rocket,\n ruler: Ruler,\n satellite: Satellite,\n scale: Scale,\n scissors: Scissors,\n server: Server,\n shield: Shield,\n ship: Ship,\n 'shopping-cart': ShoppingCart,\n signal: Signal,\n smartphone: Smartphone,\n sparkles: Sparkles,\n sprout: Sprout,\n square: Square,\n star: Star,\n sun: Sun,\n table: Table,\n tag: Tag,\n target: Target,\n telescope: Telescope,\n terminal: Terminal,\n 'test-tube': TestTube,\n 'tree-pine': TreePine,\n trophy: Trophy,\n truck: Truck,\n umbrella: Umbrella,\n users: Users,\n wallet: Wallet,\n wand: Wand,\n waves: Waves,\n webhook: Webhook,\n wifi: Wifi,\n wrench: Wrench,\n zap: Zap,\n}\n\nexport function ProjectIcon({\n icon,\n src,\n name,\n className,\n}: {\n icon: ProjectIconSpec | undefined\n src?: string\n name?: string\n className?: string\n}) {\n if (!icon) {\n return null\n }\n if (icon.type === 'image') {\n if (!src) {\n return null\n }\n return <img src={src} alt=\"\" aria-hidden title={name} className={cn('inline-block size-3 shrink-0 object-contain', className)} />\n }\n const Glyph = GLYPHS[icon.name] ?? Folder\n return <Glyph className={cn('inline-block size-3 shrink-0', className)} />\n}\n","import { useMemo } from 'react'\nimport type { ReactNode } from 'react'\nimport { Filter, X } from 'lucide-react'\nimport { STATE_LABELS, STATE_ORDER, adaptersOf, displayCustomized, facetFilterCount, projectsOf } from '@workerdeck/protocol'\nimport type { GroupBy, SessionRow, SessionState, SortBy, StepDisplay, ViewConfig, WorkspaceScope } from '@workerdeck/protocol'\nimport { Button } from '../ui/Button.tsx'\nimport { Popover, PopoverContent, PopoverTrigger } from '../ui/Popover.tsx'\nimport { OptionSelect, Select, SelectContent, SelectItem, SelectItemText, SelectTrigger, SelectValue } from '../ui/Select.tsx'\nimport { cn } from '../../lib/utils.ts'\n\nexport type SessionFiltersProps = {\n config: ViewConfig\n onConfigChange: (config: ViewConfig) => void\n rows: readonly SessionRow[]\n scope?: WorkspaceScope\n gateways?: readonly { id: string; name: string }[]\n className?: string\n}\n\nexport const STEP_DISPLAY_OPTIONS: readonly { value: StepDisplay; label: string }[] = [\n { value: 'all', label: 'All' },\n { value: 'active', label: 'Active' },\n { value: 'none', label: 'Hide' },\n]\n\nexport function SessionFilters({ config, onConfigChange, rows, scope, gateways: gatewaysProp, className }: SessionFiltersProps) {\n const adapters = useMemo(() => adaptersOf(rows), [rows])\n const projects = useMemo(() => projectsOf(rows), [rows])\n const gateways = useMemo(() => {\n if (gatewaysProp) {\n return gatewaysProp\n }\n const seen = new Map<string, string>()\n for (const row of rows) {\n seen.set(row.hostId, row.hostName)\n }\n return [...seen].map(([id, name]) => ({ id, name }))\n }, [rows, gatewaysProp])\n\n const set = (patch: Partial<ViewConfig>) => onConfigChange({ ...config, ...patch })\n\n return (\n <div data-slot=\"session-filters\" className={cn('flex flex-col gap-3', className)}>\n <Section title=\"Filter\">\n {scope ? (\n <FilterRow label=\"Scope\">\n <OptionSelect\n className=\"w-full min-w-0\"\n label=\"Scope\"\n value={config.scoped ? 'scoped' : 'all'}\n options={[\n { value: 'scoped', label: scope.label },\n { value: 'all', label: 'All folders' },\n ]}\n onChange={(value) => set({ scoped: value === 'scoped' })}\n />\n </FilterRow>\n ) : null}\n <FilterRow label=\"State\">\n <FacetSelect\n label=\"State\"\n value={config.states}\n options={STATE_ORDER.map((s) => ({ value: s, label: STATE_LABELS[s] }))}\n onChange={(states) => set({ states: states as SessionState[] })}\n />\n </FilterRow>\n {adapters.length > 1 ? (\n <FilterRow label=\"Engine\">\n <FacetSelect\n label=\"Engine\"\n value={config.adapters}\n options={adapters.map((a) => ({ value: a, label: a }))}\n onChange={(next) => set({ adapters: next })}\n />\n </FilterRow>\n ) : null}\n {gateways.length > 1 ? (\n <FilterRow label=\"Gateway\">\n <FacetSelect\n label=\"Gateway\"\n value={config.gateways}\n options={gateways.map((g) => ({ value: g.id, label: g.name }))}\n onChange={(next) => set({ gateways: next })}\n />\n </FilterRow>\n ) : null}\n {projects.length > 1 ? (\n <FilterRow label=\"Project\">\n <FacetSelect\n label=\"Project\"\n value={config.projects ?? []}\n options={projects.map((p) => ({ value: p.key, label: p.label }))}\n onChange={(next) => set({ projects: next })}\n />\n </FilterRow>\n ) : null}\n </Section>\n\n <Section title=\"Layout\">\n <FilterRow label=\"Group\">\n <OptionSelect\n className=\"w-full min-w-0\"\n label=\"Group\"\n value={config.groupBy}\n options={[\n { value: 'none', label: 'No grouping' },\n { value: 'state', label: 'By state' },\n { value: 'adapter', label: 'By engine' },\n { value: 'project', label: gateways.length > 1 ? 'By gateway & project' : 'By project' },\n { value: 'custom', label: 'Custom' },\n ]}\n onChange={(groupBy) => set({ groupBy: groupBy as GroupBy })}\n />\n </FilterRow>\n <FilterRow label=\"Sort\">\n <OptionSelect\n className=\"w-full min-w-0\"\n label=\"Sort\"\n value={config.sortBy}\n options={[\n { value: 'recent', label: 'Recent' },\n { value: 'name', label: 'Name' },\n { value: 'state', label: 'State' },\n ...(projects.length > 1 ? [{ value: 'project' as const, label: 'Project' }] : []),\n ...(gateways.length > 1 ? [{ value: 'gateway' as const, label: 'Gateway' }] : []),\n ]}\n onChange={(sortBy) => set({ sortBy: sortBy as SortBy })}\n />\n </FilterRow>\n </Section>\n\n <Section title=\"Show under each session\">\n <FilterRow label=\"Agents\">\n <StepDisplayControl label=\"Agents\" value={config.subagents} onChange={(subagents) => set({ subagents })} />\n </FilterRow>\n <FilterRow label=\"Shells\">\n <StepDisplayControl label=\"Shells\" value={config.shells ?? 'active'} onChange={(shells) => set({ shells })} />\n </FilterRow>\n <FilterRow label=\"Tasks\">\n <StepDisplayControl label=\"Tasks\" value={config.tasks ?? 'active'} onChange={(tasks) => set({ tasks })} />\n </FilterRow>\n </Section>\n </div>\n )\n}\n\nexport type SessionFiltersButtonProps = SessionFiltersProps & {\n open?: boolean\n onOpenChange?: (open: boolean) => void\n}\n\nexport function SessionFiltersButton({ open, onOpenChange, className, ...props }: SessionFiltersButtonProps) {\n const count = facetFilterCount(props.config)\n const engaged = count > 0 || displayCustomized(props.config)\n return (\n <Popover open={open} onOpenChange={onOpenChange}>\n <PopoverTrigger\n render={\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label={count > 0 ? `Filters (${count} active)` : 'Filters'}\n title={count > 0 ? `${count} filter${count === 1 ? '' : 's'} active` : 'Filters'}\n className={className}\n >\n <Filter className={cn('size-3.5', engaged && 'fill-current text-fg-1')} />\n </Button>\n }\n />\n <PopoverContent className=\"w-80\">\n <SessionFilters {...props} />\n </PopoverContent>\n </Popover>\n )\n}\n\nexport function StepDisplayControl({\n label,\n value,\n onChange,\n}: {\n label: string\n value: StepDisplay\n onChange: (value: StepDisplay) => void\n}) {\n return (\n <div role=\"radiogroup\" aria-label={label} className=\"flex w-full rounded-md border border-border p-px\">\n {STEP_DISPLAY_OPTIONS.map((option) => (\n <button\n key={option.value}\n type=\"button\"\n role=\"radio\"\n aria-checked={option.value === value}\n onClick={() => onChange(option.value)}\n className={cn(\n 'min-w-0 flex-1 truncate rounded-[4px] px-1.5 py-0.5 text-label outline-none transition-colors',\n 'focus-visible:ring-2 focus-visible:ring-ring',\n option.value === value ? 'bg-row-selected text-fg-1' : 'text-fg-3 hover:bg-row-hover hover:text-fg-1',\n )}\n >\n {option.label}\n </button>\n ))}\n </div>\n )\n}\n\nfunction Section({ title, children }: { title: string; children: ReactNode }) {\n return (\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"text-label font-medium uppercase tracking-wide text-fg-4\">{title}</div>\n {children}\n </div>\n )\n}\n\nfunction FilterRow({ label, children }: { label: string; children: ReactNode }) {\n return (\n <div className=\"flex items-center gap-2\">\n <span aria-hidden className=\"w-16 shrink-0 truncate text-label text-fg-3\">\n {label}\n </span>\n <div className=\"min-w-0 flex-1\">{children}</div>\n </div>\n )\n}\n\nfunction FacetSelect({\n label,\n value,\n options,\n onChange,\n}: {\n label: string\n value: string[]\n options: { value: string; label: string }[]\n onChange: (value: string[]) => void\n}) {\n return (\n <div className=\"flex items-center gap-1\">\n <Select multiple value={value} onValueChange={(v) => onChange(v as string[])}>\n <SelectTrigger aria-label={label} className=\"min-w-0 flex-1\">\n <SelectValue>\n {value.length === 0\n ? 'All'\n : value.length === 1\n ? (options.find((o) => o.value === value[0])?.label ?? 'All')\n : `${value.length} selected`}\n </SelectValue>\n </SelectTrigger>\n <SelectContent>\n {options.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n <SelectItemText>{option.label}</SelectItemText>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {value.length > 0 ? (\n <Button variant=\"ghost\" size=\"icon-sm\" aria-label={`Clear ${label}`} onClick={() => onChange([])}>\n <X className=\"size-3 text-fg-4\" />\n </Button>\n ) : null}\n </div>\n )\n}\n","import type { ContextReading, ProfileEngine } from '@workerdeck/protocol'\nimport { ProgressRing } from '../ui/ProgressRing.tsx'\nimport { Tip } from '../ui/Tooltip.tsx'\nimport { cn } from '../../lib/utils.ts'\nimport { formatTokens } from '../../lib/format.ts'\nimport { contextNote } from '../../lib/context-note.ts'\nimport { meterColorClass } from '../../lib/status.ts'\n\nexport function ContextRing({\n usage,\n engine,\n size = 11,\n className,\n}: {\n usage: ContextReading | undefined\n engine?: ProfileEngine\n size?: number\n className?: string\n}) {\n if (usage === undefined) {\n return null\n }\n const note = contextNote(engine)\n const reading = `Context ${usage.percentage.toFixed(0)}% · ${formatTokens(usage.totalTokens)} / ${formatTokens(usage.maxTokens)}`\n const shell = cn('shrink-0 leading-none', meterColorClass(usage.percentage), className)\n const ring = <ProgressRing value={usage.percentage} size={size} strokeWidth={2} />\n if (!note) {\n return (\n <span title={reading} className={shell}>\n {ring}\n </span>\n )\n }\n return (\n <Tip\n render={<span className={shell} />}\n content={\n <div className=\"flex max-w-64 flex-col gap-1 py-0.5\">\n <span className=\"font-mono text-fg-2\">{reading}</span>\n <span className=\"text-fg-3\">{note.summary}</span>\n <span className=\"text-fg-3\">{note.hint}</span>\n </div>\n }\n >\n {ring}\n </Tip>\n )\n}\n","import { cn } from '../../lib/utils.ts'\n\n// Paths from `@lobehub/icons-static-svg` (MIT, © LobeHub), inlined. The marks are trademarks of their owners, used only to identify a session's engine.\nconst PATHS: Record<string, { title: string; d: string }> = {\n claude: {\n title: 'Claude',\n d: 'M4.709 15.955l4.72-2.647.08-.23-.08-.128H9.2l-.79-.048-2.698-.073-2.339-.097-2.266-.122-.571-.121L0 11.784l.055-.352.48-.321.686.06 1.52.103 2.278.158 1.652.097 2.449.255h.389l.055-.157-.134-.098-.103-.097-2.358-1.596-2.552-1.688-1.336-.972-.724-.491-.364-.462-.158-1.008.656-.722.881.06.225.061.893.686 1.908 1.476 2.491 1.833.365.304.145-.103.019-.073-.164-.274-1.355-2.446-1.446-2.49-.644-1.032-.17-.619a2.97 2.97 0 01-.104-.729L6.283.134 6.696 0l.996.134.42.364.62 1.414 1.002 2.229 1.555 3.03.456.898.243.832.091.255h.158V9.01l.128-1.706.237-2.095.23-2.695.08-.76.376-.91.747-.492.584.28.48.685-.067.444-.286 1.851-.559 2.903-.364 1.942h.212l.243-.242.985-1.306 1.652-2.064.73-.82.85-.904.547-.431h1.033l.76 1.129-.34 1.166-1.064 1.347-.881 1.142-1.264 1.7-.79 1.36.073.11.188-.02 2.856-.606 1.543-.28 1.841-.315.833.388.091.395-.328.807-1.969.486-2.309.462-3.439.813-.042.03.049.061 1.549.146.662.036h1.622l3.02.225.79.522.474.638-.079.485-1.215.62-1.64-.389-3.829-.91-1.312-.329h-.182v.11l1.093 1.068 2.006 1.81 2.509 2.33.127.578-.322.455-.34-.049-2.205-1.657-.851-.747-1.926-1.62h-.128v.17l.444.649 2.345 3.521.122 1.08-.17.353-.608.213-.668-.122-1.374-1.925-1.415-2.167-1.143-1.943-.14.08-.674 7.254-.316.37-.729.28-.607-.461-.322-.747.322-1.476.389-1.924.315-1.53.286-1.9.17-.632-.012-.042-.14.018-1.434 1.967-2.18 2.945-1.726 1.845-.414.164-.717-.37.067-.662.401-.589 2.388-3.036 1.44-1.882.93-1.086-.006-.158h-.055L4.132 18.56l-1.13.146-.487-.456.061-.746.231-.243 1.908-1.312-.006.006z',\n },\n codex: {\n title: 'OpenAI',\n d: 'M9.205 8.658v-2.26c0-.19.072-.333.238-.428l4.543-2.616c.619-.357 1.356-.523 2.117-.523 2.854 0 4.662 2.212 4.662 4.566 0 .167 0 .357-.024.547l-4.71-2.759a.797.797 0 00-.856 0l-5.97 3.473zm10.609 8.8V12.06c0-.333-.143-.57-.429-.737l-5.97-3.473 1.95-1.118a.433.433 0 01.476 0l4.543 2.617c1.309.76 2.189 2.378 2.189 3.948 0 1.808-1.07 3.473-2.76 4.163zM7.802 12.703l-1.95-1.142c-.167-.095-.239-.238-.239-.428V5.899c0-2.545 1.95-4.472 4.591-4.472 1 0 1.927.333 2.712.928L8.23 5.067c-.285.166-.428.404-.428.737v6.898zM12 15.128l-2.795-1.57v-3.33L12 8.658l2.795 1.57v3.33L12 15.128zm1.796 7.23c-1 0-1.927-.332-2.712-.927l4.686-2.712c.285-.166.428-.404.428-.737v-6.898l1.974 1.142c.167.095.238.238.238.428v5.233c0 2.545-1.974 4.472-4.614 4.472zm-5.637-5.303l-4.544-2.617c-1.308-.761-2.188-2.378-2.188-3.948A4.482 4.482 0 014.21 6.327v5.423c0 .333.143.571.428.738l5.947 3.449-1.95 1.118a.432.432 0 01-.476 0zm-.262 3.9c-2.688 0-4.662-2.021-4.662-4.519 0-.19.024-.38.047-.57l4.686 2.71c.286.167.571.167.856 0l5.97-3.448v2.26c0 .19-.07.333-.237.428l-4.543 2.616c-.619.357-1.356.523-2.117.523zm5.899 2.83a5.947 5.947 0 005.827-4.756C22.287 18.339 24 15.84 24 13.296c0-1.665-.713-3.282-1.998-4.448.119-.5.19-.999.19-1.498 0-3.401-2.759-5.947-5.946-5.947-.642 0-1.26.095-1.88.31A5.962 5.962 0 0010.205 0a5.947 5.947 0 00-5.827 4.757C1.713 5.447 0 7.945 0 10.49c0 1.666.713 3.283 1.998 4.448-.119.5-.19 1-.19 1.499 0 3.401 2.759 5.946 5.946 5.946.642 0 1.26-.095 1.88-.309a5.96 5.96 0 004.162 1.713z',\n },\n gemini: {\n title: 'Gemini',\n d: 'M20.616 10.835a14.147 14.147 0 01-4.45-3.001 14.111 14.111 0 01-3.678-6.452.503.503 0 00-.975 0 14.134 14.134 0 01-3.679 6.452 14.155 14.155 0 01-4.45 3.001c-.65.28-1.318.505-2.002.678a.502.502 0 000 .975c.684.172 1.35.397 2.002.677a14.147 14.147 0 014.45 3.001 14.112 14.112 0 013.679 6.453.502.502 0 00.975 0c.172-.685.397-1.351.677-2.003a14.145 14.145 0 013.001-4.45 14.113 14.113 0 016.453-3.678.503.503 0 000-.975 13.245 13.245 0 01-2.003-.678z',\n },\n deepseek: {\n title: 'DeepSeek',\n d: 'M23.748 4.482c-.254-.124-.364.113-.512.234-.051.039-.094.09-.137.136-.372.397-.806.657-1.373.626-.829-.046-1.537.214-2.163.848-.133-.782-.575-1.248-1.247-1.548-.352-.156-.708-.311-.955-.65-.172-.241-.219-.51-.305-.774-.055-.16-.11-.323-.293-.35-.2-.031-.278.136-.356.276-.313.572-.434 1.202-.422 1.84.027 1.436.633 2.58 1.838 3.393.137.093.172.187.129.323-.082.28-.18.552-.266.833-.055.179-.137.217-.329.14a5.526 5.526 0 01-1.736-1.18c-.857-.828-1.631-1.742-2.597-2.458a11.365 11.365 0 00-.689-.471c-.985-.957.13-1.743.388-1.836.27-.098.093-.432-.779-.428-.872.004-1.67.295-2.687.684a3.055 3.055 0 01-.465.137 9.597 9.597 0 00-2.883-.102c-1.885.21-3.39 1.102-4.497 2.623C.082 8.606-.231 10.684.152 12.85c.403 2.284 1.569 4.175 3.36 5.653 1.858 1.533 3.997 2.284 6.438 2.14 1.482-.085 3.133-.284 4.994-1.86.47.234.962.327 1.78.397.63.059 1.236-.03 1.705-.128.735-.156.684-.837.419-.961-2.155-1.004-1.682-.595-2.113-.926 1.096-1.296 2.746-2.642 3.392-7.003.05-.347.007-.565 0-.845-.004-.17.035-.237.23-.256a4.173 4.173 0 001.545-.475c1.396-.763 1.96-2.015 2.093-3.517.02-.23-.004-.467-.247-.588zM11.581 18c-2.089-1.642-3.102-2.183-3.52-2.16-.392.024-.321.471-.235.763.09.288.207.486.371.739.114.167.192.416-.113.603-.673.416-1.842-.14-1.897-.167-1.361-.802-2.5-1.86-3.301-3.307-.774-1.393-1.224-2.887-1.298-4.482-.02-.386.093-.522.477-.592a4.696 4.696 0 011.529-.039c2.132.312 3.946 1.265 5.468 2.774.868.86 1.525 1.887 2.202 2.891.72 1.066 1.494 2.082 2.48 2.914.348.292.625.514.891.677-.802.09-2.14.11-3.054-.614zm1-6.44a.306.306 0 01.415-.287.302.302 0 01.2.288.306.306 0 01-.31.307.303.303 0 01-.304-.308zm3.11 1.596c-.2.081-.399.151-.59.16a1.245 1.245 0 01-.798-.254c-.274-.23-.47-.358-.552-.758a1.73 1.73 0 01.016-.588c.07-.327-.008-.537-.239-.727-.187-.156-.426-.199-.688-.199a.559.559 0 01-.254-.078c-.11-.054-.2-.19-.114-.358.028-.054.16-.186.192-.21.356-.202.767-.136 1.146.016.352.144.618.408 1.001.782.391.451.462.576.685.914.176.265.336.537.445.848.067.195-.019.354-.25.452z',\n },\n moonshot: {\n title: 'Moonshot',\n d: 'M1.052 16.916l9.539 2.552a21.007 21.007 0 00.06 2.033l5.956 1.593a11.997 11.997 0 01-5.586.865l-.18-.016-.044-.004-.084-.009-.094-.01a11.605 11.605 0 01-.157-.02l-.107-.014-.11-.016a11.962 11.962 0 01-.32-.051l-.042-.008-.075-.013-.107-.02-.07-.015-.093-.019-.075-.016-.095-.02-.097-.023-.094-.022-.068-.017-.088-.022-.09-.024-.095-.025-.082-.023-.109-.03-.062-.02-.084-.025-.093-.028-.105-.034-.058-.019-.08-.026-.09-.031-.066-.024a6.293 6.293 0 01-.044-.015l-.068-.025-.101-.037-.057-.022-.08-.03-.087-.035-.088-.035-.079-.032-.095-.04-.063-.028-.063-.027a5.655 5.655 0 01-.041-.018l-.066-.03-.103-.047-.052-.024-.096-.046-.062-.03-.084-.04-.086-.044-.093-.047-.052-.027-.103-.055-.057-.03-.058-.032a6.49 6.49 0 01-.046-.026l-.094-.053-.06-.034-.051-.03-.072-.041-.082-.05-.093-.056-.052-.032-.084-.053-.061-.039-.079-.05-.07-.047-.053-.035a7.785 7.785 0 01-.054-.036l-.044-.03-.044-.03a6.066 6.066 0 01-.04-.028l-.057-.04-.076-.054-.069-.05-.074-.054-.056-.042-.076-.057-.076-.059-.086-.067-.045-.035-.064-.052-.074-.06-.089-.073-.046-.039-.046-.039a7.516 7.516 0 01-.043-.037l-.045-.04-.061-.053-.07-.062-.068-.06-.062-.058-.067-.062-.053-.05-.088-.084a13.28 13.28 0 01-.099-.097l-.029-.028-.041-.042-.069-.07-.05-.051-.05-.053a6.457 6.457 0 01-.168-.179l-.08-.088-.062-.07-.071-.08-.042-.049-.053-.062-.058-.068-.046-.056a7.175 7.175 0 01-.027-.033l-.045-.055-.066-.082-.041-.052-.05-.064-.02-.025a11.99 11.99 0 01-1.44-2.402zm-1.02-5.794l11.353 3.037a20.468 20.468 0 00-.469 2.011l10.817 2.894a12.076 12.076 0 01-1.845 2.005L.657 15.923l-.016-.046-.035-.104a11.965 11.965 0 01-.05-.153l-.007-.023a11.896 11.896 0 01-.207-.741l-.03-.126-.018-.08-.021-.097-.018-.081-.018-.09-.017-.084-.018-.094c-.026-.141-.05-.283-.071-.426l-.017-.118-.011-.083-.013-.102a12.01 12.01 0 01-.019-.161l-.005-.047a12.12 12.12 0 01-.034-2.145zm1.593-5.15l11.948 3.196c-.368.605-.705 1.231-1.01 1.875l11.295 3.022c-.142.82-.368 1.612-.668 2.365l-11.55-3.09L.124 10.26l.015-.1.008-.049.01-.067.015-.087.018-.098c.026-.148.056-.295.088-.442l.028-.124.02-.085.024-.097c.022-.09.045-.18.07-.268l.028-.102.023-.083.03-.1.025-.082.03-.096.026-.082.031-.095a11.896 11.896 0 011.01-2.232zm4.442-4.4L17.352 4.59a20.77 20.77 0 00-1.688 1.721l7.823 2.093c.267.852.442 1.744.513 2.665L2.106 5.213l.045-.065.027-.04.04-.055.046-.065.055-.076.054-.072.064-.086.05-.065.057-.073.055-.07.06-.074.055-.069.065-.077.054-.066.066-.077.053-.06.072-.082.053-.06.067-.074.054-.058.073-.078.058-.06.063-.067.168-.17.1-.098.059-.056.076-.071a12.084 12.084 0 012.272-1.677zM12.017 0h.097l.082.001.069.001.054.002.068.002.046.001.076.003.047.002.06.003.054.002.087.005.105.007.144.011.088.007.044.004.077.008.082.008.047.005.102.012.05.006.108.014.081.01.042.006.065.01.207.032.07.012.065.011.14.026.092.018.11.022.046.01.075.016.041.01L14.7.3l.042.01.065.015.049.012.071.017.096.024.112.03.113.03.113.032.05.015.07.02.078.024.073.023.05.016.05.016.076.025.099.033.102.036.048.017.064.023.093.034.11.041.116.045.1.04.047.02.06.024.041.018.063.026.04.018.057.025.11.048.1.046.074.035.075.036.06.028.092.046.091.045.102.052.053.028.049.026.046.024.06.033.041.022.052.029.088.05.106.06.087.051.057.034.053.032.096.059.088.055.098.062.036.024.064.041.084.056.04.027.062.042.062.043.023.017c.054.037.108.075.161.114l.083.06.065.048.056.043.086.065.082.064.04.03.05.041.086.069.079.065.085.071c.712.6 1.353 1.283 1.909 2.031L7.222.994l.062-.027.065-.028.081-.034.086-.035c.113-.045.227-.09.341-.131l.096-.035.093-.033.084-.03.096-.031c.087-.03.176-.058.264-.085l.091-.027.086-.025.102-.03.085-.023.1-.026L9.04.37l.09-.023.091-.022.095-.022.09-.02.098-.021.091-.02.095-.018.092-.018.1-.018.091-.016.098-.017.092-.014.097-.015.092-.013.102-.013.091-.012.105-.012.09-.01.105-.01c.093-.01.186-.018.28-.024l.106-.008.09-.005.11-.006.093-.004.1-.004.097-.002.099-.002.197-.002z',\n },\n}\n\nexport function engineMark(engine: string, model?: string): string | undefined {\n if (engine === 'claude') {\n return 'claude'\n }\n if (engine === 'codex') {\n return 'codex'\n }\n const id = model?.toLowerCase() ?? ''\n if (!id) {\n return undefined\n }\n if (id.includes('gemini')) {\n return 'gemini'\n }\n if (id.includes('deepseek')) {\n return 'deepseek'\n }\n if (id.includes('moonshot') || id.includes('kimi')) {\n return 'moonshot'\n }\n if (id.includes('claude')) {\n return 'claude'\n }\n if (id.startsWith('gpt') || id.startsWith('o1') || id.startsWith('o3') || id.includes('openai')) {\n return 'codex'\n }\n return undefined\n}\n\nconst VENDOR_MARK: Record<string, string> = {\n claude: 'text-vendor-claude',\n codex: 'text-vendor-openai',\n}\nconst VENDOR_TEXT: Record<string, string> = {\n claude: 'text-vendor-claude',\n}\n\nexport function vendorMarkClass(engine: string, model?: string): string {\n return VENDOR_MARK[engineMark(engine, model) ?? ''] ?? 'text-fg-3'\n}\n\nexport function vendorTextClass(engine: string, model?: string): string {\n return VENDOR_TEXT[engineMark(engine, model) ?? ''] ?? 'text-fg-3'\n}\n\nexport function EngineIcon({ engine, model, className }: { engine: string; model?: string; className?: string }) {\n const mark = PATHS[engineMark(engine, model) ?? '']\n if (!mark) {\n return (\n <span aria-hidden title={engine} className={cn('shrink-0 text-fg-3', className)}>\n ·\n </span>\n )\n }\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n role=\"img\"\n aria-label={mark.title}\n className={cn('size-3 shrink-0 text-fg-3', className)}\n >\n <title>{mark.title}</title>\n <path d={mark.d} />\n </svg>\n )\n}\n","import { BellRing, CircleAlert, CircleSlash, Moon, PauseCircle } from 'lucide-react'\nimport type { SessionRow } from '@workerdeck/protocol'\nimport { Spinner } from '../ui/Spinner.tsx'\nimport { cn } from '../../lib/utils.ts'\n\nexport function SessionStatusIcon({ row, className }: { row: SessionRow; className?: string }) {\n const { info } = row\n const size = cn('size-4 shrink-0', className)\n if (row.state === 'attention') {\n return <BellRing className={cn(size, 'animate-pulse text-warning')} />\n }\n if (row.state === 'working') {\n return <Spinner className={cn(size, 'text-info')} />\n }\n switch (info.status) {\n case 'failed': {\n return <CircleAlert className={cn(size, 'text-danger')} />\n }\n case 'closed': {\n return <CircleSlash className={cn(size, 'text-fg-4')} />\n }\n case 'parked': {\n return <PauseCircle className={cn(size, 'text-fg-3')} />\n }\n default: {\n return <Moon className={cn(size, 'text-fg-4')} />\n }\n }\n}\n","import { ArrowRight, Check, Circle, CircleAlert } from 'lucide-react'\nimport { displayedTasks, isAgentRecord, subagentLabel, visibleShells, visibleSubagents } from '@workerdeck/protocol'\nimport type { SessionInfo, SessionTask, ShellInfo, StepDisplay, SubagentDisplay, SubagentInfo } from '@workerdeck/protocol'\nimport { Spinner } from '../ui/Spinner.tsx'\nimport { cn } from '../../lib/utils.ts'\nimport { AgentWriteIcon } from '../terminal/affordances.tsx'\nimport {\n SHELL_AGENT_WRITE_NOTE,\n SHELL_GLYPH,\n SHELL_KILL_GLYPH,\n shellAgentWriteLabel,\n shellGrantable,\n shellInfoFailed,\n shellInfoLabel,\n shellInfoStatusText,\n shellTitle,\n} from '../terminal/shell-row.ts'\n\nexport type StepKind = 'agent' | 'shell' | 'task'\n\nexport type Step = {\n key: string\n kind: StepKind\n label: string\n noun: string\n state: 'done' | 'running' | 'failed' | 'pending'\n detail?: string\n title: string\n onSelect: () => void\n onKill?: () => void\n killLabel?: string\n agentWrite?: { granted: boolean; label: string; toggle: () => void }\n}\n\nexport type ShellStepOptions = {\n now: number\n show?: StepDisplay\n onSelect: (shellId: string) => void\n onKill?: (shellId: string) => void\n // Offered only where the session's agent holds the shell write tools.\n onAgentWrite?: (shellId: string, enabled: boolean) => void\n}\n\nexport type TaskStepOptions = {\n show: StepDisplay\n // Whether the session is still working: a checklist item left in progress after the turn ended is not running.\n live: boolean\n onSelect: (task: SessionTask) => void\n onStop?: (toolUseId: string) => void\n}\n\nexport function sessionSteps(\n info: SessionInfo,\n onSelect: (toolUseId: string) => void,\n show: SubagentDisplay = 'all',\n shells?: ShellStepOptions,\n tasks?: TaskStepOptions,\n): Step[] {\n const agents: Step[] = visibleSubagents(info, show)\n .filter(isAgentRecord)\n .map((sub) => ({\n key: sub.toolUseId,\n kind: 'agent',\n label: subagentLabel(sub),\n noun: 'agent',\n state: stepState(sub.status),\n detail: sub.toolCount > 0 ? String(sub.toolCount) : undefined,\n title: `${subagentLabel(sub)} · ${sub.toolCount} tool${sub.toolCount === 1 ? '' : 's'}`,\n onSelect: () => onSelect(sub.toolUseId),\n }))\n const taskSteps = tasks === undefined ? [] : displayedTasks(info, tasks.show).map((task) => taskStep(task, tasks))\n if (shells === undefined) {\n return [...agents, ...taskSteps]\n }\n const grants = info.shellAgentWrite !== undefined\n const shellSteps = visibleShells(info, shells.show ?? 'active', shells.now).map((shell) => shellStep(shell, shells, grants))\n return [...agents, ...taskSteps, ...shellSteps]\n}\n\nfunction taskStep(task: SessionTask, options: TaskStepOptions): Step {\n const stalled = task.source === 'checklist' && task.state === 'running' && !options.live\n const toolUseId = task.toolUseId\n return {\n key: task.key,\n kind: 'task',\n label: task.label,\n noun: 'task',\n state: stalled ? 'pending' : task.state,\n detail: task.detail,\n title: stalled ? `${task.label} · left in progress` : task.label,\n onSelect: () => options.onSelect(task),\n onKill: task.stoppable && toolUseId !== undefined && options.onStop ? () => options.onStop?.(toolUseId) : undefined,\n killLabel: 'Stop this task',\n }\n}\n\nfunction shellStep(shell: ShellInfo, options: ShellStepOptions, grants: boolean): Step {\n const status = shellInfoStatusText(shell)\n const running = shell.status === 'running'\n return {\n key: shell.id,\n kind: 'shell',\n label: shellInfoLabel(shell),\n noun: 'shell',\n state: shellInfoFailed(shell) ? 'failed' : running ? 'running' : 'done',\n detail: running ? (shell.agentWrite === true ? SHELL_AGENT_WRITE_NOTE : undefined) : status,\n title: `${shellTitle(shell)} · ${status}`,\n onSelect: () => options.onSelect(shell.id),\n onKill: running && options.onKill ? () => options.onKill?.(shell.id) : undefined,\n killLabel: 'Kill this shell',\n agentWrite:\n grants && options.onAgentWrite && shellGrantable(shell)\n ? {\n granted: shell.agentWrite === true,\n label: shellAgentWriteLabel(shell),\n toggle: () => options.onAgentWrite?.(shell.id, shell.agentWrite !== true),\n }\n : undefined,\n }\n}\n\nfunction stepState(status: SubagentInfo['status']): Step['state'] {\n switch (status) {\n case 'running': {\n return 'running'\n }\n case 'failed': {\n return 'failed'\n }\n default: {\n return 'done'\n }\n }\n}\n\nexport function StepRow({ step, active = false, onSelect }: { step: Step; active?: boolean; onSelect: () => void }) {\n const body =\n step.state === 'failed'\n ? 'text-danger'\n : step.kind === 'shell'\n ? 'text-[var(--wd-shell-accent)]'\n : step.kind === 'task'\n ? step.state === 'pending'\n ? 'text-fg-4'\n : 'text-fg-2'\n : 'text-success'\n return (\n <div className={cn('flex w-full items-center rounded-[4px] pr-1.5', active ? 'bg-row-selected' : 'hover:bg-row-active', body)}>\n <button\n type=\"button\"\n title={step.title}\n aria-current={active || undefined}\n onClick={(e) => {\n e.stopPropagation()\n onSelect()\n }}\n className=\"flex min-w-0 flex-1 items-center gap-1.5 py-1 pr-1 pl-3.5 text-left text-micro outline-none\"\n >\n <StepIcon step={step} />\n <span className=\"min-w-0 flex-1 truncate\">{step.label}</span>\n {step.detail ? <span className=\"shrink-0 tabular-nums text-fg-4\">{step.detail}</span> : null}\n {step.kind === 'agent' ? <ArrowRight className=\"size-3.5 shrink-0 text-fg-4\" /> : null}\n </button>\n {step.agentWrite ? (\n <button\n type=\"button\"\n aria-label={step.agentWrite.label}\n aria-pressed={step.agentWrite.granted}\n title={step.agentWrite.label}\n onClick={(e) => {\n e.stopPropagation()\n step.agentWrite?.toggle()\n }}\n className={cn(\n 'shrink-0 px-1 text-micro leading-none outline-none',\n step.agentWrite.granted ? 'text-warning' : 'text-fg-4 hover:text-fg-1',\n )}\n >\n <AgentWriteIcon granted={step.agentWrite.granted} className=\"size-3.5\" />\n </button>\n ) : null}\n {step.onKill ? (\n <button\n type=\"button\"\n aria-label={`${step.kind === 'task' ? 'Stop' : 'Kill'} ${step.label}`}\n title={step.killLabel}\n onClick={(e) => {\n e.stopPropagation()\n step.onKill?.()\n }}\n className=\"shrink-0 px-1 text-micro leading-none text-fg-4 outline-none hover:text-danger\"\n >\n {SHELL_KILL_GLYPH}\n </button>\n ) : null}\n </div>\n )\n}\n\nfunction StepIcon({ step }: { step: Step }) {\n if (step.kind === 'shell') {\n return <span className=\"w-[11px] shrink-0 text-center leading-none\">{SHELL_GLYPH}</span>\n }\n switch (step.state) {\n case 'running': {\n return <Spinner className=\"size-[11px] shrink-0\" />\n }\n case 'failed': {\n return <CircleAlert className=\"size-[11px] shrink-0\" />\n }\n case 'pending': {\n return <Circle className=\"size-[11px] shrink-0\" />\n }\n default: {\n return <Check className=\"size-[11px] shrink-0\" />\n }\n }\n}\n","import { Fragment, useEffect, useRef, useState } from 'react'\nimport type { ReactNode } from 'react'\nimport { projectLabel, projectName, projectSubpath, sessionLabel } from '@workerdeck/protocol'\nimport type { SessionRow, SessionTask, StepDisplay, SubagentDisplay } from '@workerdeck/protocol'\nimport { ContextRing } from './ContextRing.tsx'\nimport { EngineIcon, vendorMarkClass, vendorTextClass } from './EngineIcon.tsx'\nimport { ProjectIcon } from './ProjectIcon.tsx'\nimport { SessionStatusIcon } from './SessionStatusIcon.tsx'\nimport { StepRow, sessionSteps } from './SessionSteps.tsx'\nimport type { Step } from './SessionSteps.tsx'\nimport { cn } from '../../lib/utils.ts'\nimport { formatCost, formatRelativeTime, friendlyModel } from '../../lib/format.ts'\n\nexport type SelectModifiers = { meta: boolean; ctrl: boolean; alt: boolean }\n\nexport interface SessionItemProps {\n row: SessionRow\n active?: boolean\n activeStepKey?: string\n showGateway?: boolean\n showProject?: boolean\n projectIcons?: Record<string, string>\n subagents?: SubagentDisplay\n shells?: StepDisplay\n tasks?: StepDisplay\n onSelect?: (modifiers: SelectModifiers) => void\n onSelectSubagent?: (toolUseId: string) => void\n onSelectTask?: (task: SessionTask) => void\n onStopTask?: (toolUseId: string) => void\n onSelectShell?: (shellId: string) => void\n onKillShell?: (shellId: string) => void\n onShellAgentWrite?: (shellId: string, enabled: boolean) => void\n now?: number\n onRename?: (title: string) => void\n renameOn?: 'doubleClick' | 'external'\n editing?: boolean\n onEditingChange?: (editing: boolean) => void\n actions?: ReactNode\n className?: string\n}\n\nconst NO_MODIFIERS: SelectModifiers = { meta: false, ctrl: false, alt: false }\n\nexport function SessionItem({\n row,\n active = false,\n activeStepKey,\n showGateway,\n showProject = true,\n projectIcons,\n subagents = 'active',\n shells = 'active',\n tasks = 'active',\n onSelect,\n onSelectSubagent,\n onSelectTask,\n onStopTask,\n onSelectShell,\n onKillShell,\n onShellAgentWrite,\n now,\n onRename,\n renameOn = 'doubleClick',\n editing,\n onEditingChange,\n actions,\n className,\n}: SessionItemProps) {\n const { info } = row\n const [ownEditing, setOwnEditing] = useState(false)\n const isEditing = editing ?? ownEditing\n const setEditing = (next: boolean) => {\n setOwnEditing(next)\n onEditingChange?.(next)\n }\n\n const engine = info.engine ?? 'claude'\n const project = showProject ? projectLabel(row) : projectSubpath(row)\n const projectTitle = showProject ? projectName(row) : undefined\n const projectIcon = showProject ? info.project?.icon : undefined\n const iconSrc = projectIcon?.type === 'image' ? projectIcons?.[projectIcon.hash] : undefined\n const cost = formatCost(info.costUsd ?? info.totalCostUsd)\n const extras = [\n showGateway ? row.hostName : undefined,\n info.profile ? `@${info.profile}` : undefined,\n cost === '-' ? undefined : cost,\n ].filter((part): part is string => Boolean(part))\n\n const model = friendlyModel(info.model)\n const parts: ReactNode[] = []\n if (model) {\n parts.push(\n <span key=\"model\" className={vendorTextClass(engine, info.model)}>\n {model}\n </span>,\n )\n }\n if (project !== undefined) {\n parts.push(\n <span key=\"project\" title={projectTitle}>\n <ProjectIcon icon={projectIcon} src={iconSrc} name={projectTitle} className=\"mr-1.5 size-4 align-[-0.3em]\" />\n {project}\n </span>,\n )\n }\n for (const extra of extras) {\n parts.push(<span key={extra}>{extra}</span>)\n }\n const steps = sessionSteps(\n info,\n (toolUseId) => (onSelectSubagent ? onSelectSubagent(toolUseId) : onSelect?.(NO_MODIFIERS)),\n subagents,\n {\n now: now ?? Date.now(),\n show: shells,\n onSelect: (shellId) => (onSelectShell ? onSelectShell(shellId) : onSelect?.(NO_MODIFIERS)),\n onKill: onKillShell,\n onAgentWrite: onShellAgentWrite,\n },\n {\n show: tasks,\n live: info.status === 'running' || info.status === 'starting' || info.status === 'awaiting_approval',\n onSelect: (task) => (onSelectTask ? onSelectTask(task) : onSelect?.(NO_MODIFIERS)),\n onStop: onStopTask,\n },\n )\n const holdsOpenStep = steps.some((s) => s.key === activeStepKey)\n\n return (\n <div\n data-slot=\"session-item\"\n data-active={active || undefined}\n data-asleep={info.engineAsleep || undefined}\n title={info.engineAsleep ? 'Asleep, wakes on your next message' : undefined}\n role=\"button\"\n tabIndex={0}\n onClick={(e) => {\n if (e.detail > 1 || isEditing) {\n return\n }\n onSelect?.({ meta: e.metaKey, ctrl: e.ctrlKey, alt: e.altKey })\n }}\n onKeyDown={(e) => {\n if (e.target !== e.currentTarget) {\n return\n }\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onSelect?.({ meta: e.metaKey, ctrl: e.ctrlKey, alt: e.altKey })\n }\n }}\n className={cn(\n 'group flex w-full cursor-pointer flex-col p-1 text-left outline-none',\n 'rounded-[4px] transition-colors focus-visible:ring-2 focus-visible:ring-ring',\n holdsOpenStep ? 'bg-row-selected-weak' : active ? 'bg-row-selected' : 'hover:bg-row-hover',\n className,\n )}\n >\n <div className={cn('flex flex-col gap-1 py-0.5 pr-0.5 pl-1.5', info.engineAsleep && 'opacity-60')}>\n <div className=\"flex h-5 items-center gap-1.5 overflow-hidden\">\n <Gutter>\n <SessionStatusIcon row={row} />\n </Gutter>\n {isEditing && onRename ? (\n <NameEditor\n initial={info.title ?? ''}\n onCommit={(title) => {\n setEditing(false)\n if (title !== (info.title ?? '')) {\n onRename(title)\n }\n }}\n onCancel={() => setEditing(false)}\n />\n ) : (\n <span\n onDoubleClick={\n onRename && renameOn === 'doubleClick'\n ? (e) => {\n e.stopPropagation()\n setEditing(true)\n }\n : undefined\n }\n className=\"min-w-0 flex-1 truncate text-body-sm font-medium tracking-[-0.005em] text-fg-1\"\n >\n {sessionLabel(info)}\n </span>\n )}\n {row.unseen > 0 ? (\n <span\n // Prose, not rows: `unseen` counts messages a person has not read (`proseCount`).\n title={`${row.unseen} new message${row.unseen === 1 ? '' : 's'}`}\n className={cn(\n 'flex h-4 min-w-6 shrink-0 items-center justify-center rounded-full px-2',\n 'text-[0.75rem] leading-none tracking-[-0.005em] tabular-nums',\n // Grey while the turn is still producing, accent once it has stopped: the badge's colour\n // answers \"is this waiting for me\", and a working session is not yet.\n row.state === 'working' ? 'bg-badge text-badge-fg' : 'bg-accent text-accent-fg',\n )}\n >\n {row.unseen}\n </span>\n ) : null}\n <ContextRing usage={info.contextUsage} engine={engine} size={16} className=\"p-0.5\" />\n </div>\n\n <div className=\"flex h-5 items-center gap-1.5 overflow-hidden text-body-sm tracking-[-0.005em]\">\n <Gutter>\n <EngineIcon engine={engine} model={info.model} className={cn('size-4', vendorMarkClass(engine, info.model))} />\n </Gutter>\n <span className=\"min-w-0 truncate text-fg-4\">\n {parts.map((part, i) => (\n <Fragment key={i}>\n {i > 0 ? ' · ' : ''}\n {part}\n </Fragment>\n ))}\n </span>\n <span className=\"shrink-0 text-fg-4\">\n {parts.length > 0 ? '· ' : ''}\n {formatRelativeTime(info.lastActivityAt ?? info.createdAt)}\n </span>\n <span className=\"min-w-0 flex-1\" />\n {actions}\n </div>\n </div>\n\n {steps.length > 0 ? (\n <div className=\"flex flex-col\">\n {steps.map((step: Step) => (\n <StepRow key={step.key} step={step} active={step.key === activeStepKey} onSelect={step.onSelect} />\n ))}\n </div>\n ) : null}\n </div>\n )\n}\n\nfunction Gutter({ children }: { children: ReactNode }) {\n return <span className=\"flex size-4 shrink-0 items-center justify-center\">{children}</span>\n}\n\nfunction NameEditor({ initial, onCommit, onCancel }: { initial: string; onCommit: (title: string) => void; onCancel: () => void }) {\n const [value, setValue] = useState(initial)\n const ref = useRef<HTMLInputElement>(null)\n useEffect(() => {\n ref.current?.focus()\n ref.current?.select()\n }, [])\n useEffect(() => {\n const onWindowFocus = () => {\n ref.current?.focus()\n ref.current?.select()\n }\n window.addEventListener('focus', onWindowFocus)\n return () => window.removeEventListener('focus', onWindowFocus)\n }, [])\n return (\n <input\n ref={ref}\n value={value}\n spellCheck={false}\n placeholder=\"Session name\"\n aria-label=\"Session name\"\n onClick={(e) => e.stopPropagation()}\n onDoubleClick={(e) => e.stopPropagation()}\n onChange={(e) => setValue(e.target.value)}\n onBlur={() => {\n // Guarded on `document.hasFocus()`: selecting a session focuses another surface (in the extension, another view), and an unguarded blur closes the editor in the frame it appeared.\n if (document.hasFocus()) {\n onCommit(value.trim())\n }\n }}\n onKeyDown={(e) => {\n e.stopPropagation()\n if (e.key === 'Enter') {\n onCommit(value.trim())\n } else if (e.key === 'Escape') {\n onCancel()\n }\n }}\n className={cn(\n '-my-0.5 min-w-0 flex-1 rounded-sm border border-ring bg-bg px-1 py-px',\n 'text-body-sm leading-5 text-fg-1 outline-none',\n )}\n />\n )\n}\n","import { useState } from 'react'\nimport type { DragEvent, HTMLAttributes, ReactNode } from 'react'\nimport { GripVertical, Pencil, Plus, Trash2 } from 'lucide-react'\nimport {\n addCustomGroup,\n moveCustomGroup,\n moveToCustomGroup,\n newCustomGroupId,\n removeCustomGroup,\n renameCustomGroup,\n} from '@workerdeck/protocol'\nimport type { CustomGroup, SessionGroup } from '@workerdeck/protocol'\nimport { Button } from '../ui/Button.tsx'\nimport { Input } from '../ui/Input.tsx'\nimport { cn } from '../../lib/utils.ts'\n\ntype DragItem = { kind: 'session'; key: string } | { kind: 'group'; id: string }\n\nexport type GroupDrag = ReturnType<typeof useGroupDrag>\n\n// The payload lives in state rather than `dataTransfer`, which is unreadable during `dragover`; `setData` is still\n// written because some engines refuse to start a drag without it.\nexport function useGroupDrag(groups: readonly CustomGroup[], onChange: (groups: CustomGroup[]) => void) {\n const [item, setItem] = useState<DragItem>()\n const [over, setOver] = useState<string>()\n const end = () => {\n setItem(undefined)\n setOver(undefined)\n }\n const start = (e: DragEvent, next: DragItem) => {\n e.stopPropagation()\n e.dataTransfer.effectAllowed = 'move'\n e.dataTransfer.setData('text/plain', next.kind === 'session' ? next.key : next.id)\n setItem(next)\n }\n const accept = (e: DragEvent, spot: string) => {\n e.preventDefault()\n e.stopPropagation()\n e.dataTransfer.dropEffect = 'move'\n setOver(spot)\n }\n\n function session(key: string, group: SessionGroup): HTMLAttributes<HTMLDivElement> {\n return {\n draggable: true,\n onDragStart: (e) => start(e, { kind: 'session', key }),\n onDragEnd: end,\n onDragOver: (e) => {\n if (item?.kind === 'session') {\n accept(e, `row:${key}`)\n }\n },\n onDrop: (e) => {\n if (item?.kind !== 'session') {\n return\n }\n e.preventDefault()\n e.stopPropagation()\n if (item.key !== key) {\n onChange(moveToCustomGroup(groups, item.key, group.custom, group.custom ? key : undefined))\n }\n end()\n },\n }\n }\n\n function container(group: SessionGroup): HTMLAttributes<HTMLDivElement> {\n return {\n onDragOver: (e) => {\n if (item) {\n accept(e, `group:${group.key}`)\n }\n },\n onDrop: (e) => {\n e.preventDefault()\n if (item?.kind === 'session') {\n onChange(moveToCustomGroup(groups, item.key, group.custom))\n } else if (item?.kind === 'group') {\n onChange(moveCustomGroup(groups, item.id, group.custom))\n }\n end()\n },\n }\n }\n\n function header(group: SessionGroup): HTMLAttributes<HTMLDivElement> {\n const id = group.custom\n if (id === undefined) {\n return {}\n }\n return { draggable: true, onDragStart: (e) => start(e, { kind: 'group', id }), onDragEnd: end }\n }\n\n return {\n dragging: item !== undefined,\n isOver: (spot: string) => over === spot,\n session,\n container,\n header,\n create: (name = 'New group') => {\n const id = newCustomGroupId()\n onChange(addCustomGroup(groups, name, id))\n return id\n },\n rename: (id: string, name: string) => onChange(renameCustomGroup(groups, id, name)),\n remove: (id: string) => onChange(removeCustomGroup(groups, id)),\n }\n}\n\nexport function CustomGroupHeader({\n group,\n editing,\n onEditingChange,\n onRename,\n onRemove,\n dragProps,\n}: {\n group: SessionGroup\n editing: boolean\n onEditingChange: (editing: boolean) => void\n onRename: (name: string) => void\n onRemove: () => void\n dragProps: HTMLAttributes<HTMLDivElement>\n}) {\n if (editing) {\n return <GroupNameInput initial={group.label ?? ''} onRename={onRename} onDone={() => onEditingChange(false)} />\n }\n\n const custom = group.custom !== undefined\n return (\n <GroupHeading\n {...dragProps}\n label={group.label ?? ''}\n count={group.rows.length}\n className={cn('group/heading', custom && 'cursor-grab')}\n onDoubleClick={custom ? () => onEditingChange(true) : undefined}\n leading={custom ? <GripVertical className=\"-ml-1.5 size-3 opacity-0 group-hover/heading:opacity-60\" /> : undefined}\n actions={\n custom ? (\n <>\n <HeadingAction label=\"Rename group\" onClick={() => onEditingChange(true)}>\n <Pencil className=\"size-3\" />\n </HeadingAction>\n <HeadingAction label=\"Delete group\" title=\"Delete the group - its sessions move to Ungrouped\" onClick={onRemove}>\n <Trash2 className=\"size-3\" />\n </HeadingAction>\n </>\n ) : undefined\n }\n />\n )\n}\n\nfunction GroupNameInput({ initial, onRename, onDone }: { initial: string; onRename: (name: string) => void; onDone: () => void }) {\n const [draft, setDraft] = useState(initial)\n const commit = () => {\n const name = draft.trim()\n if (name && name !== initial) {\n onRename(name)\n }\n onDone()\n }\n return (\n <div className=\"px-2\">\n <Input\n autoFocus\n aria-label=\"Group name\"\n value={draft}\n onFocus={(e) => e.currentTarget.select()}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={commit}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n commit()\n } else if (e.key === 'Escape') {\n e.stopPropagation()\n onDone()\n }\n }}\n className=\"h-6 text-label\"\n />\n </div>\n )\n}\n\nexport function GroupHeading({\n label,\n count,\n leading,\n actions,\n className,\n ...rest\n}: {\n label: ReactNode\n count: number\n leading?: ReactNode\n actions?: ReactNode\n} & HTMLAttributes<HTMLDivElement>) {\n return (\n <div {...rest} className={cn('group/heading flex min-h-5 items-center gap-2 px-2 text-label font-medium text-fg-4', className)}>\n {leading}\n <span className=\"min-w-0 truncate uppercase tracking-wide\">{label}</span>\n <span className=\"text-fg-4/70\">{count}</span>\n {actions ? (\n <span className=\"ml-auto flex items-center gap-0.5 opacity-0 transition-opacity group-hover/heading:opacity-100 focus-within:opacity-100\">\n {actions}\n </span>\n ) : null}\n </div>\n )\n}\n\nexport function HeadingAction({\n label,\n title,\n onClick,\n children,\n}: {\n label: string\n title?: string\n onClick: () => void\n children: ReactNode\n}) {\n return (\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label={label}\n title={title ?? label}\n className=\"size-5 text-fg-3\"\n onClick={(e) => {\n e.stopPropagation()\n onClick()\n }}\n >\n {children}\n </Button>\n )\n}\n\nexport function NewGroupButton({ onClick }: { onClick: () => void }) {\n return (\n <Button variant=\"ghost\" size=\"xs\" className=\"mx-1 self-start text-fg-3\" onClick={onClick}>\n <Plus />\n New group\n </Button>\n )\n}\n","import { useMemo, useState } from 'react'\nimport type { HTMLAttributes, ReactNode } from 'react'\nimport { BedDouble, Eraser, FolderOpen, Layers, Pencil, Plus, Search, SearchX, Trash2, X } from 'lucide-react'\nimport { clearFilters, filterRows, groupRows, hasFacetFilter, scopeActive, sessionKey, subsetSummary } from '@workerdeck/protocol'\nimport type { SessionGroup, SessionRow, SessionTask, StepDisplay, SubagentDisplay, ViewConfig, WorkspaceScope } from '@workerdeck/protocol'\nimport { Button } from '../ui/Button.tsx'\nimport { Empty } from '../ui/Empty.tsx'\nimport { Input } from '../ui/Input.tsx'\nimport { ProjectIcon } from './ProjectIcon.tsx'\nimport { SessionFilters } from './SessionFilters.tsx'\nimport { SessionItem, type SelectModifiers } from './SessionItem.tsx'\nimport { CustomGroupHeader, GroupHeading, HeadingAction, NewGroupButton, useGroupDrag } from './SessionGroups.tsx'\nimport { cn } from '../../lib/utils.ts'\n\nexport { SessionStatusIcon } from './SessionStatusIcon.tsx'\n\nexport interface SessionBrowserProps {\n rows: SessionRow[]\n config: ViewConfig\n onConfigChange: (config: ViewConfig) => void\n scope?: WorkspaceScope\n activeId?: string\n activeSubagentId?: string\n activeShellId?: string\n now?: number\n // Overrides `activeId`, for a host whose session ids are unique only per gateway.\n isActive?: (row: SessionRow) => boolean\n // Replaces the pencil / eraser / trash; rename then falls back to the card's own double-click.\n rowActions?: (row: SessionRow) => ReactNode\n // Overrides the count of gateways among `rows` when deciding whether a card names its gateway.\n gatewayCount?: number\n showSubset?: boolean\n onSelect?: (row: SessionRow, modifiers: SelectModifiers) => void\n onDelete?: (row: SessionRow) => void\n onRename?: (row: SessionRow, title: string) => void\n onClearContext?: (row: SessionRow) => void\n onSleep?: (row: SessionRow) => void\n onSelectSubagent?: (row: SessionRow, toolUseId: string) => void\n onSelectTask?: (row: SessionRow, task: SessionTask) => void\n onStopTask?: (row: SessionRow, toolUseId: string) => void\n onSelectShell?: (row: SessionRow, shellId: string) => void\n onKillShell?: (row: SessionRow, shellId: string) => void\n onShellAgentWrite?: (row: SessionRow, shellId: string, enabled: boolean) => void\n // Draws a `+` on each project heading: start a session on that gateway, in that project's root.\n onCreateInGroup?: (target: GroupTarget) => void\n emptyState?: ReactNode\n // The facet controls, drawn inline. A host with a header puts `SessionFiltersButton` there instead.\n showControls?: boolean\n showSearch?: boolean\n autoFocusSearch?: boolean\n projectIcons?: Record<string, string>\n className?: string\n}\n\nexport type GroupTarget = { hostId: string; cwd?: string }\n\nexport function rowShapeClass(active: boolean): string {\n return cn('px-2 py-1.5 hover:bg-row-hover', active ? 'mr-1 ml-0 rounded-r-md border-l-4 border-l-accent' : 'mx-1 rounded-md')\n}\n\nexport function SessionBrowser({\n rows,\n config,\n onConfigChange,\n scope,\n activeId,\n activeSubagentId,\n activeShellId,\n now,\n isActive = (row) => row.info.id === activeId,\n rowActions,\n gatewayCount,\n showSubset = true,\n onSelect,\n onDelete,\n onRename,\n onClearContext,\n onSleep,\n onSelectSubagent,\n onSelectTask,\n onStopTask,\n onSelectShell,\n onKillShell,\n onShellAgentWrite,\n onCreateInGroup,\n emptyState,\n showControls = true,\n showSearch = showControls,\n autoFocusSearch,\n projectIcons,\n className,\n}: SessionBrowserProps) {\n const rowGateways = useMemo(() => new Set(rows.map((row) => row.hostId)).size, [rows])\n const gateways = gatewayCount ?? rowGateways\n const visible = useMemo(() => filterRows(rows, config, scope), [rows, config, scope])\n const groups = useMemo(() => groupRows(visible, config, { gatewayCount: gateways }), [visible, config, gateways])\n const subset = subsetSummary(config, scope, visible.length, rows.length)\n const custom = config.groupBy === 'custom'\n const [editingGroup, setEditingGroup] = useState<string>()\n\n const set = (patch: Partial<ViewConfig>) => onConfigChange({ ...config, ...patch })\n const drag = useGroupDrag(config.customGroups ?? [], (customGroups) => set({ customGroups }))\n\n const heading = (group: SessionGroup) => {\n if (custom) {\n return (\n <CustomGroupHeader\n group={group}\n editing={group.custom !== undefined && editingGroup === group.custom}\n onEditingChange={(editing) => setEditingGroup(editing ? group.custom : undefined)}\n onRename={(name) => group.custom && drag.rename(group.custom, name)}\n onRemove={() => group.custom && drag.remove(group.custom)}\n dragProps={drag.header(group)}\n />\n )\n }\n if (config.groupBy === 'none' || !group.label) {\n return null\n }\n const project = config.groupBy === 'project'\n const target = project && group.hostId ? { hostId: group.hostId, cwd: group.cwd } : undefined\n return (\n <GroupHeading\n label={\n group.gateway && group.project ? (\n <>\n {group.gateway}\n <span aria-hidden> · </span>\n <span className=\"text-fg-1\">{group.project}</span>\n </>\n ) : (\n group.label\n )\n }\n count={group.rows.length}\n title={project && group.cwd ? group.cwd : undefined}\n leading={\n project ? (\n <ProjectIcon icon={group.rows[0]?.info.project?.icon} src={iconSrcOf(group.rows[0], projectIcons)} name={group.label} />\n ) : undefined\n }\n actions={\n target && onCreateInGroup ? (\n <HeadingAction label={`New session in ${group.label}`} onClick={() => onCreateInGroup(target)}>\n <Plus className=\"size-3\" />\n </HeadingAction>\n ) : undefined\n }\n />\n )\n }\n\n return (\n <div data-slot=\"session-browser\" className={cn('flex flex-col gap-3', className)}>\n {showSearch ? (\n <SessionSearch value={config.search} onChange={(search) => set({ search })} autoFocus={autoFocusSearch} className=\"px-2\" />\n ) : null}\n {showControls ? <SessionFilters config={config} onConfigChange={onConfigChange} rows={rows} scope={scope} className=\"px-2\" /> : null}\n\n {subset && showSubset ? (\n <div className=\"flex items-center gap-2 px-3 text-label text-fg-4\">\n <span>\n {subset.shown} of {subset.total}\n {subset.causes.length ? ` · ${subset.causes.join(' · ')}` : null}\n </span>\n <button\n type=\"button\"\n className=\"text-fg-3 underline underline-offset-2 hover:text-fg-1\"\n onClick={() => onConfigChange(clearFilters(config))}\n >\n Show all\n </button>\n </div>\n ) : null}\n\n {rows.length === 0 ? (\n (emptyState ?? <Empty icon={<Layers />} title=\"No sessions yet\" />)\n ) : visible.length === 0 ? (\n hasFacetFilter(config) ? (\n <Empty\n icon={<SearchX />}\n title=\"No matches\"\n description=\"No session matches the current search and filters.\"\n action=\"Clear filters\"\n onAction={() => onConfigChange(clearFilters(config))}\n />\n ) : scope && scopeActive(config, scope) ? (\n <Empty\n icon={<FolderOpen />}\n title=\"Nothing in this folder\"\n description={`No session is running in ${scope.label}.`}\n action=\"Show all folders\"\n onAction={() => set({ scoped: false })}\n />\n ) : (\n <Empty icon={<Layers />} title=\"Nothing here\" description=\"No session to show.\" />\n )\n ) : (\n <div className=\"flex flex-col gap-4 px-1\">\n {groups.map((group) => (\n <div\n key={group.key}\n {...(custom ? drag.container(group) : {})}\n className={cn('flex flex-col gap-1 rounded-md', custom && drag.isOver(`group:${group.key}`) && 'bg-row-hover/50')}\n >\n {heading(group)}\n {custom && group.custom !== undefined && group.rows.length === 0 ? (\n <div className=\"mx-1 rounded-md border border-dashed border-border px-2 py-2 text-center text-label text-fg-4\">\n Drag sessions here\n </div>\n ) : null}\n {group.rows.map((row) => (\n <SessionRowItem\n key={sessionKey(row)}\n dragProps={custom ? drag.session(sessionKey(row), group) : undefined}\n dropTarget={custom && drag.isOver(`row:${sessionKey(row)}`)}\n row={row}\n active={isActive(row)}\n activeSubagentId={activeSubagentId}\n activeShellId={activeShellId}\n actions={rowActions?.(row)}\n now={now}\n showGateway={gateways > 1 && config.groupBy !== 'project'}\n showProject={config.groupBy !== 'project'}\n subagents={config.subagents}\n shells={config.shells}\n tasks={config.tasks}\n projectIcons={projectIcons}\n onSelect={onSelect}\n onDelete={onDelete}\n onRename={onRename}\n onClearContext={onClearContext}\n onSleep={onSleep}\n onSelectSubagent={onSelectSubagent}\n onSelectTask={onSelectTask}\n onStopTask={onStopTask}\n onSelectShell={onSelectShell}\n onKillShell={onKillShell}\n onShellAgentWrite={onShellAgentWrite}\n />\n ))}\n </div>\n ))}\n {custom ? <NewGroupButton onClick={() => setEditingGroup(drag.create())} /> : null}\n </div>\n )}\n </div>\n )\n}\n\nfunction iconSrcOf(row: SessionRow | undefined, icons: Record<string, string> | undefined): string | undefined {\n const icon = row?.info.project?.icon\n return icon?.type === 'image' ? icons?.[icon.hash] : undefined\n}\n\ninterface SessionRowItemProps {\n row: SessionRow\n dragProps?: HTMLAttributes<HTMLDivElement>\n dropTarget?: boolean\n active?: boolean\n actions?: ReactNode\n activeSubagentId?: string\n activeShellId?: string\n now?: number\n showGateway?: boolean\n showProject?: boolean\n subagents?: SubagentDisplay\n shells?: StepDisplay\n tasks?: StepDisplay\n projectIcons?: Record<string, string>\n onSelect?: (row: SessionRow, modifiers: SelectModifiers) => void\n onDelete?: (row: SessionRow) => void\n onRename?: (row: SessionRow, title: string) => void\n onClearContext?: (row: SessionRow) => void\n onSleep?: (row: SessionRow) => void\n onSelectSubagent?: (row: SessionRow, toolUseId: string) => void\n onSelectTask?: (row: SessionRow, task: SessionTask) => void\n onStopTask?: (row: SessionRow, toolUseId: string) => void\n onSelectShell?: (row: SessionRow, shellId: string) => void\n onKillShell?: (row: SessionRow, shellId: string) => void\n onShellAgentWrite?: (row: SessionRow, shellId: string, enabled: boolean) => void\n}\n\nfunction SessionRowItem({\n row,\n dragProps,\n dropTarget,\n active,\n actions,\n activeSubagentId,\n activeShellId,\n now,\n showGateway,\n showProject = true,\n subagents,\n shells,\n tasks,\n projectIcons,\n onSelect,\n onDelete,\n onRename,\n onClearContext,\n onSleep,\n onSelectSubagent,\n onSelectTask,\n onStopTask,\n onSelectShell,\n onKillShell,\n onShellAgentWrite,\n}: SessionRowItemProps) {\n const { info } = row\n const [editing, setEditing] = useState(false)\n\n const item = (\n <SessionItem\n row={row}\n active={active === true}\n activeStepKey={active ? (activeShellId ?? activeSubagentId) : undefined}\n now={now}\n showGateway={showGateway}\n showProject={showProject}\n subagents={subagents}\n shells={shells}\n tasks={tasks}\n projectIcons={projectIcons}\n onSelect={(modifiers) => onSelect?.(row, modifiers)}\n onSelectSubagent={onSelectSubagent ? (id) => onSelectSubagent(row, id) : undefined}\n onSelectTask={onSelectTask ? (task) => onSelectTask(row, task) : undefined}\n onStopTask={onStopTask ? (id) => onStopTask(row, id) : undefined}\n onSelectShell={onSelectShell ? (id) => onSelectShell(row, id) : undefined}\n onKillShell={onKillShell ? (id) => onKillShell(row, id) : undefined}\n onShellAgentWrite={onShellAgentWrite ? (id, enabled) => onShellAgentWrite(row, id, enabled) : undefined}\n onRename={onRename ? (title) => onRename(row, title) : undefined}\n renameOn={actions === undefined ? 'external' : 'doubleClick'}\n editing={actions === undefined ? editing : undefined}\n onEditingChange={actions === undefined ? setEditing : undefined}\n actions={\n actions ?? (\n <>\n {onRename && !editing ? (\n <RowAction label=\"Rename session\" onClick={() => setEditing(true)}>\n <Pencil className=\"size-3 text-fg-3\" />\n </RowAction>\n ) : null}\n {onClearContext && info.capabilities?.clearContext ? (\n <RowAction\n label=\"Clear context\"\n title=\"Clear the conversation - the session keeps running and the old conversation stays resumable\"\n onClick={() => onClearContext(row)}\n >\n <Eraser className=\"size-3 text-fg-3\" />\n </RowAction>\n ) : null}\n {onSleep && info.capabilities?.engineSleep && info.status === 'idle' && !info.engineAsleep ? (\n <RowAction\n label=\"Sleep session\"\n title=\"Stop the engine process to free its memory - the session stays here and wakes on your next message\"\n onClick={() => onSleep(row)}\n >\n <BedDouble className=\"size-3 text-fg-3\" />\n </RowAction>\n ) : null}\n {onDelete ? (\n <RowAction label=\"Close session\" onClick={() => onDelete(row)}>\n <Trash2 className=\"size-3 text-fg-3\" />\n </RowAction>\n ) : null}\n </>\n )\n }\n />\n )\n if (!dragProps) {\n return item\n }\n return (\n <div {...dragProps} className={cn('rounded-md', dropTarget && 'shadow-[inset_0_2px_0_0_var(--color-accent)]')}>\n {item}\n </div>\n )\n}\n\nfunction RowAction({ label, title, onClick, children }: { label: string; title?: string; onClick: () => void; children: ReactNode }) {\n return (\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label={label}\n title={title ?? label}\n className=\"size-5 shrink-0 opacity-0 transition-opacity group-hover:opacity-100\"\n onClick={(e) => {\n e.stopPropagation()\n onClick()\n }}\n >\n {children}\n </Button>\n )\n}\n\nexport function SessionSearch({\n value,\n onChange,\n autoFocus,\n className,\n inputClassName,\n}: {\n value: string\n onChange: (value: string) => void\n autoFocus?: boolean\n className?: string\n inputClassName?: string\n}) {\n return (\n <div className={cn('relative', className)}>\n <Search className=\"pointer-events-none absolute top-1/2 left-4.5 size-3.5 -translate-y-1/2 text-fg-4\" />\n <Input\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Escape' && value) {\n e.stopPropagation()\n onChange('')\n }\n }}\n placeholder=\"Search sessions\"\n aria-label=\"Search sessions\"\n autoFocus={autoFocus}\n className={cn('pr-7 pl-8', inputClassName)}\n />\n {value ? (\n <button\n type=\"button\"\n aria-label=\"Clear search\"\n onClick={() => onChange('')}\n className=\"absolute top-1/2 right-3.5 -translate-y-1/2 rounded p-0.5 text-fg-4 hover:text-fg-1\"\n >\n <X className=\"size-3\" />\n </button>\n ) : null}\n </div>\n )\n}\n","import { Check, ChevronDown } from 'lucide-react'\nimport type { SubagentDisplay } from '@workerdeck/protocol'\nimport { Button } from '../ui/Button.tsx'\nimport { Menu, MenuContent, MenuItem, MenuTrigger } from '../ui/Menu.tsx'\nimport { cn } from '../../lib/utils.ts'\n\nexport const SUBAGENT_DISPLAY_ORDER: readonly SubagentDisplay[] = ['all', 'active', 'none']\n\nexport const SUBAGENT_DISPLAY_META: Record<SubagentDisplay, { label: string; hint: string }> = {\n all: { label: 'All sub-agents', hint: 'Showing every sub-agent' },\n active: { label: 'Hide completed', hint: 'Showing running and failed sub-agents' },\n none: { label: 'Hide sub-agents', hint: 'Sub-agents hidden' },\n}\n\nconst HIDDEN_ROW = 0.34\n\n// A session line at full strength over two child rows, and a hidden child is greyed rather than\n// struck: a sub-agent the card is not drawing has not failed, and a cross would say it had.\nexport function SubagentDisplayIcon({ value, className }: { value: SubagentDisplay; className?: string }) {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n className={className}\n >\n <path d=\"M3 5h18\" />\n <path d=\"M9 12h12\" opacity={value === 'none' ? HIDDEN_ROW : 1} />\n <path d=\"M9 19h12\" opacity={value === 'all' ? 1 : HIDDEN_ROW} />\n </svg>\n )\n}\n\nexport type SubagentToggleProps = {\n value: SubagentDisplay\n onChange: (value: SubagentDisplay) => void\n className?: string\n}\n\n// A menu rather than a press-to-cycle button: three stops are one more than a person can read off\n// a single glyph, and the caret is what promises the other two.\nexport function SubagentToggle({ value, onChange, className }: SubagentToggleProps) {\n const meta = SUBAGENT_DISPLAY_META[value]\n return (\n <Menu>\n <MenuTrigger\n render={\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label={`Sub-agents: ${meta.label}`}\n title={meta.hint}\n className={cn('w-9 gap-0.5', className)}\n >\n <SubagentDisplayIcon value={value} className=\"size-4\" />\n <ChevronDown className=\"size-2.5 text-fg-4\" />\n </Button>\n }\n />\n <MenuContent className=\"min-w-44\">\n {SUBAGENT_DISPLAY_ORDER.map((option) => (\n <MenuItem key={option} onClick={() => onChange(option)}>\n <SubagentDisplayIcon value={option} className=\"size-4 shrink-0 text-fg-3\" />\n <span className=\"flex-1\">{SUBAGENT_DISPLAY_META[option].label}</span>\n {option === value ? <Check className=\"size-3.5 shrink-0 text-accent\" /> : null}\n </MenuItem>\n ))}\n </MenuContent>\n </Menu>\n )\n}\n"],"mappings":";;;;;;;;;;AAGA,SAAgB,KAAK,EAAE,WAAW,GAAG,SAAyC;CAC5E,OAAO,oBAAC,OAAD;EAAK,aAAU;EAAO,WAAW,GAAG,8CAA8C,SAAS;EAAG,GAAI;CAAQ,CAAA;AACnH;AAEA,SAAgB,WAAW,EAAE,WAAW,GAAG,SAAyC;CAClF,OAAO,oBAAC,OAAD;EAAK,WAAW,GAAG,2DAA2D,SAAS;EAAG,GAAI;CAAQ,CAAA;AAC/G;AAEA,SAAgB,UAAU,EAAE,WAAW,GAAG,SAA6C;CACrF,OAAO,oBAAC,MAAD;EAAI,WAAW,GAAG,0CAA0C,SAAS;EAAG,GAAI;CAAQ,CAAA;AAC7F;AAEA,SAAgB,YAAY,EAAE,WAAW,GAAG,SAAyC;CACnF,OAAO,oBAAC,OAAD;EAAK,WAAW,GAAG,aAAa,SAAS;EAAG,GAAI;CAAQ,CAAA;AACjE;;;ACZA,MAAa,cAAcA,cAAqB;AAChD,MAAa,qBAAqBA,cAAqB;AACvD,MAAa,mBAAmBA,cAAqB;AAErD,MAAa,sBAA2E,EAAE,WAAW,UAAU,GAAG,YAChH,oBAACA,cAAqB,QAAtB,EAAA,UACE,qBAAC,aAAD,EAAA,UAAA,CACE,oBAACA,cAAqB,UAAtB,EACE,WAAW,GACT,sDACA,+CACA,2DACF,EACD,CAAA,GACD,oBAACA,cAAqB,OAAtB;CACE,aAAU;CACV,WAAW,GACT,iGACA,oFACA,2DACA,8DACA,0DACA,SACF;CACA,GAAI;CAEH;AACyB,CAAA,CACjB,EAAA,CAAA,EACc,CAAA;AAG/B,MAAa,oBAAyE,EAAE,WAAW,GAAG,YACpG,oBAACA,cAAqB,OAAtB;CAA4B,WAAW,GAAG,0CAA0C,SAAS;CAAG,GAAI;AAAQ,CAAA;AAG9G,MAAa,0BAAqF,EAAE,WAAW,GAAG,YAChH,oBAACA,cAAqB,aAAtB;CAAkC,WAAW,GAAG,6CAA6C,SAAS;CAAG,GAAI;AAAQ,CAAA;;;ACrCvH,MAAa,UAAUC,UAAiB;AACxC,MAAa,iBAAiBA,UAAiB;AAE/C,MAAa,kBAER,EAAE,WAAW,QAAQ,OAAO,OAAO,UAAU,aAAa,GAAG,GAAG,YACnE,oBAACA,UAAiB,QAAlB,EAAA,UACE,oBAAC,aAAD,EAAA,UACE,oBAACA,UAAiB,YAAlB;CAAoC;CAAa;CAAkB;CAAY,WAAU;CACvF,UAAA,oBAACA,UAAiB,OAAlB;EACE,aAAU;EACV,WAAW,GACT,8FACA,2DACA,8DACA,0DACA,SACF;EACA,GAAI;CACL,CAAA;AAC0B,CAAA,EAClB,CAAA,EACU,CAAA;;;ACvB3B,SAAgB,UAAU;CACxB,OACE,oBAACC,WAAD;EACE,UAAS;EACT,cAAc,EACZ,OAAO;GACL,YAAY;GACZ,OAAO;GACP,QAAQ;GACR,WAAW;GACX,YAAY;GACZ,UAAU;EACZ,EACF;CACD,CAAA;AAEL;;;ACjBA,SAAgB,MAAM,EACpB,MACA,OACA,aACA,QACA,YAOC;CACD,OACE,qBAAC,OAAD;EAAK,WAAU;EAAf,UAAA;GACE,oBAAC,OAAD;IAAK,WAAU;IAAuC,UAAA;GAAU,CAAA;GAChE,oBAAC,KAAD;IAAG,WAAU;IAAsC,UAAA;GAAS,CAAA;GAC3D,cAAc,oBAAC,KAAD;IAAG,WAAU;IAAkE,UAAA;GAAe,CAAA,IAAI;GAChH,UAAU,WACT,oBAAC,QAAD;IAAQ,SAAQ;IAAU,MAAK;IAAK,WAAU;IAAO,SAAS;IAC3D,UAAA;GACK,CAAA,IACN;EACD;;AAET;AAEA,SAAgB,SAAS,EAAE,YAAqC;CAC9D,OAAO,oBAAC,QAAD;EAAM,WAAU;EAAyD;CAAe,CAAA;AACjG;;;;ACCA,SAAgB,gBAAgB,UAA8B;CAC5D,IAAI,SAAS,WAAW,GACtB,OAAO;CAET,OAAO,SAAS,OAAO,QAAQ,IAAI,SAAS,UAAU,IAAI,KAAK,KAAK,MAAM,EAAE;AAC9E;;AAaA,SAAgB,kBAAkB,UAAqB,SAAgC;CACrF,OAAO,SAAS,QAAQ,QAA4B,IAAI,SAAS,UAAU,IAAI,YAAY,OAAO;AACpG;;;ACvCA,MAAM,gBAA8C;CAClD,MAAM;CACN,SAAS;CACT,OAAO;AACT;AAYA,SAAS,QAAQ,EAAE,MAAM,SAAS,OAAO,YAA8F;CACrI,IAAI,CAAC,SACH,OAAO,oBAAC,KAAD;EAAW;EAAO;CAAc,CAAA;CAEzC,OACE,oBAAC,UAAD;EAAQ,MAAK;EAAS,WAAU;EAAe,SAAS;EAAS,OAAO;EACtE,UAAA,oBAAC,KAAD;GAAW;GAAO;EAAc,CAAA;CAC1B,CAAA;AAEZ;AAEA,SAAgB,mBAAmB,EACjC,WACA,OACA,YACA,YACA,cACA,eACA,eAC0B;CAC1B,MAAM,eAAe,mBAAmB;EAAE,QAAQ,MAAM;EAAQ;CAAW,CAAC;CAC5E,MAAM,QAAQ,MAAM;CACpB,MAAM,SAAS,eAAe,cAAc,MAAM,UAAU;CAC5D,MAAM,QAAQ,WAAW;EAAE,OAAO,MAAM;EAAO,QAAQ,MAAM,UAAU,CAAC;CAAE,CAAC;CAE3E,MAAM,QAA2B,CAC/B,oBAAC,SAAD;EAAsB,MAAM,cAAc,aAAa;EAAW,SAAS;EAAc,OAAM;EAC5F,UAAA,aAAa;CACP,GAFI,QAEJ,CACX;CAEA,IAAI,OACF,MAAM,KACJ,qBAAC,SAAD;EAAuB,MAAM,cAAc,gBAAgB,KAAK;EAAI,SAAS;EAAe,OAAM;EAAlG,UAAA;GACG,KAAK,MAAM,MAAM,UAAU;GAAE;GAAQ,aAAa,MAAM,WAAW;GAAE;EAC/D;CAFI,GAAA,SAEJ,CACX;CAGF,IAAI,QACF,MAAM,KACJ,qBAAC,SAAD;EAAqB,MAAM,cAAc,cAAc,OAAO,KAAK,WAAW;EAAI,SAAS;EAAa,OAAM;EAA9G,UAAA;GACG,KAAK,MAAM,OAAO,KAAK,eAAe,CAAC;GAAE;GAAG,YAAY,OAAO,GAAG;EAC5D;CAFI,GAAA,OAEJ,CACX;CAGF,MAAM,UAAU,MAAM,YAAY,MAAM,gBAAgB,KAAA;CACxD,IAAI,YAAY,KAAA,KAAa,UAAU,GACrC,MAAM,KACJ,oBAAC,KAAD;EAAgB,MAAK;EAClB,UAAA,WAAW,OAAO;CAChB,GAFI,MAEJ,CACP;CAGF,IAAI,OACF,MAAM,KACJ,oBAAC,KAAD;EAAiB,MAAK;EACnB,UAAA;CACE,GAFI,OAEJ,CACP;CAEF,IAAI,MAAM,kBAAkB,MAAM,mBAAmB,WACnD,MAAM,KACJ,oBAAC,KAAD;EAAgB,MAAK;EAClB,UAAA,MAAM;CACJ,GAFI,MAEJ,CACP;CAGF,OACE,oBAAC,KAAD;EAAK,aAAU;EAAc,MAAK;EAAiB;EAChD,UAAA,MAAM,KAAK,MAAM,UAChB,qBAAC,QAAD,EAAA,UAAA,CACG,QAAQ,IAAI,oBAAC,KAAD;GAAK,MAAK;GAAQ,UAAA;EAAQ,CAAA,IAAI,MAC1C,IACG,EAAA,GAHK,KAGL,CACP;CACE,CAAA;AAET;;;AChGA,SAAgB,SAAS,EAAE,OAAO,eAAe,uBAAuB,cAAc,aAA4B;CAChH,MAAM,UAAU,YAAY,KAAK;CACjC,MAAM,QAAQ,aAAa,OAAO,aAAa;CAC/C,MAAM,SAAS,MAAM,SAAS,MAAM;CACpC,OACE,qBAAC,OAAD;EAAK,WAAW,GAAG,iBAAiB,SAAS;EAA7C,UAAA,CACE,qBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACE,qBAAC,QAAD;IAAM,WAAU;IAAhB,UAAA;KACG,QAAQ;KAAK;KAAK,QAAQ;KAAM;KAChC,QAAQ,SAAS,IAAI,MAAM,QAAQ,OAAO,WAAW;IAClD;GACL,CAAA,GAAA,QAAQ,OAAO,KAAK,wBACnB,oBAAC,UAAD;IACE,MAAK;IACL,eAAe,sBAAsB,CAAC,aAAa;IACnD,WAAU;IAET,UAAA,gBAAgB,mBAAmB,mBAAmB,QAAQ,KAAK;GAC9D,CAAA,IACN,IACD;EACJ,CAAA,GAAA,MAAM,WAAW,IAChB,oBAAC,KAAD;GAAG,WAAU;GACV,UAAA,MAAM,WAAW,IAAI,iEAAiE,GAAG,OAAO;EAChG,CAAA,IAEH,oBAAC,OAAD;GAAK,WAAU;GACZ,UAAA,MAAM,KAAK,SACV,oBAAC,SAAD;IAA8B;IAAM,UAAU;GAAe,GAA/C,KAAK,GAA0C,CAC9D;EACE,CAAA,CAEJ;;AAET;AAEA,SAAS,QAAQ,EAAE,MAAM,YAA2E;CAClG,MAAM,YAAY,aAAa,KAAA,KAAa,KAAK,cAAc,KAAA;CAC/D,MAAM,OAAO,KAAK,UAAU,WAAW,gBAAgB,KAAK,UAAU,SAAS,cAAc;CAC7F,MAAM,MACJ,qBAAA,YAAA,EAAA,UAAA;EACE,oBAAC,UAAD,EAAU,OAAO,KAAK,MAAQ,CAAA;EAC9B,oBAAC,QAAD;GAAM,WAAW,GAAG,qCAAqC,KAAK,UAAU,SAAS,iBAAiB,KAAA,CAAS;GAAI,UAAA,KAAK;EAAY,CAAA;EAC/H,KAAK,SAAS,oBAAC,QAAD;GAAM,WAAU;GAAmC,UAAA,KAAK;EAAa,CAAA,IAAI;EACvF,YAAY,oBAAC,YAAD,EAAY,WAAU,8BAA+B,CAAA,IAAI;CACtE,EAAA,CAAA;CAEJ,MAAM,YAAY,GAAG,wFAAwF,IAAI;CACjH,IAAI,CAAC,WACH,OAAO,oBAAC,OAAD;EAAgB;EAAY,UAAA;CAAS,CAAA;CAE9C,OACE,oBAAC,UAAD;EAAQ,MAAK;EAAS,OAAO,KAAK;EAAO,eAAe,SAAS,IAAI;EAAG,WAAW,GAAG,WAAW,qBAAqB;EACnH,UAAA;CACK,CAAA;AAEZ;AAEA,SAAS,SAAS,EAAE,SAA0C;CAC5D,QAAQ,OAAR;EACE,KAAK,WACH,OAAO,oBAAC,SAAD,EAAS,WAAU,uBAAwB,CAAA;EAEpD,KAAK,UACH,OAAO,oBAAC,aAAD,EAAa,WAAU,uBAAwB,CAAA;EAExD,KAAK,QACH,OAAO,oBAAC,OAAD,EAAO,WAAU,uBAAwB,CAAA;EAElD,SACE,OAAO,oBAAC,QAAD,EAAQ,WAAU,iCAAkC,CAAA;CAE/D;AACF;;;AC1EA,SAAgB,YAAY,EAC1B,OACA,eACA,uBACA,cACA,MACA,cACA,aACmB;CACnB,OACE,oBAAC,QAAD;EAAc;EAAoB;EAChC,UAAA,qBAAC,eAAD;GAA0B;GAA1B,UAAA,CACE,oBAAC,cAAD;IAAc,OAAM;IAAQ,aAAY;GAAsD,CAAA,GAC9F,oBAAC,YAAD,EAAA,UACE,oBAAC,UAAD;IACS;IACQ;IACQ;IACvB,cACE,gBACK,SAAS;KACR,aAAa,KAAK;KAClB,aAAa,IAAI;IACnB,IACA,KAAA;GAEP,CAAA,EACS,CAAA,CACC;;CACT,CAAA;AAEZ;;;AC7BA,SAAgB,gBAAgB,EAAE,SAAS,QAAQ,UAAU,UAAU,aAAmC;CACxG,MAAM,OAAO,YAAY,QAAQ;CACjC,OACE,qBAAC,OAAD;EACE,aAAU;EACV,eAAa,UAAU,KAAA;EACvB,WAAW,GACT,qHACA,SAAS,6BAA6B,0BACtC,SACF;EAPF,UAAA,CASE,qBAAC,UAAD;GAAQ,MAAK;GAAS,eAAe,WAAW,QAAQ,EAAE;GAAG,WAAU;GAAvE,UAAA,CACE,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,oBAAC,QAAD;KAAM,WAAU;KAA+C,UAAA,QAAQ,SAAS,QAAQ,GAAG,MAAM,GAAG,CAAC;IAAQ,CAAA,GAC7G,oBAAC,OAAD;KAAO,SAAS,KAAK;KAAS,KAAA;KAAI,WAAU;KACzC,UAAA,KAAK;IACD,CAAA,CACJ;GACL,CAAA,GAAA,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KACE,oBAAC,QAAD;MAAM,WAAU;MAAY,UAAA,QAAQ;KAAU,CAAA;KAC7C,QAAQ,UAAU,qBAAC,QAAD;MAAM,WAAU;MAAhB,UAAA,CAA2B,KAAE,QAAQ,OAAc;KAAI,CAAA,IAAA;KAC1E,oBAAC,QAAD;MAAM,WAAU;MAAY,UAAA,WAAW,QAAQ,WAAW,QAAQ,YAAY;KAAQ,CAAA;KACtF,oBAAC,QAAD;MAAM,WAAU;MAAY,UAAA,mBAAmB,QAAQ,kBAAkB,QAAQ,SAAS;KAAQ,CAAA;IAC/F;GACC,CAAA,CAAA;EACP,CAAA,GAAA,WACC,oBAAC,QAAD;GACE,SAAQ;GACR,MAAK;GACL,cAAW;GACX,WAAU;GACV,eAAe,SAAS,QAAQ,EAAE;GAElC,UAAA,oBAAC,QAAD,EAAQ,WAAU,qBAAsB,CAAA;EAClC,CAAA,IACN,IACD;;AAET;AAWA,SAAgB,YAAY,EAAE,UAAU,UAAU,UAAU,UAAU,YAAY,oBAAoB,aAA+B;CACnI,OACE,oBAAC,OAAD;EAAK,aAAU;EAAe,WAAW,GAAG,uBAAuB,SAAS;EACzE,UAAA,SAAS,WAAW,IACnB,oBAAC,OAAD;GAAK,WAAU;GAAkD,UAAA;EAAe,CAAA,IAEhF,SAAS,KAAK,YACZ,oBAAC,iBAAD;GAA2C;GAAS,QAAQ,QAAQ,OAAO;GAAoB;GAAoB;EAAW,GAAxG,QAAQ,EAAgG,CAC/H;CAEA,CAAA;AAET;;;ACuCA,MAAM,SAAgE;CACpE,QAAQ;CACR,MAAM;CACN,QAAQ;CACR,MAAM;CACN,QAAQ;CACR,QAAQ;CACR,KAAK;CACL,KAAK;CACL,OAAO;CACP,WAAW;CACX,OAAO;CACP,KAAK;CACL,cAAc;CACd,OAAO;CACP,QAAQ;CACR,KAAK;CACL,KAAK;CACL,iBAAiB;CACjB,OAAO;CACP,MAAM;CACN,QAAQ;CACR,KAAK;CACL,SAAS;CACT,WAAW;CACX,KAAK;CACL,eAAe;CACf,UAAU;CACV,SAAS;CACT,KAAK;CACL,SAAS;CACT,MAAM;CACN,OAAO;CACP,iBAAiB;CACjB,QAAQ;CACR,aAAa;CACb,OAAO;CACP,KAAK;CACL,OAAO;CACP,MAAM;CACN,cAAc;CACd,OAAO;CACP,kBAAkB;CAClB,QAAQ;CACR,SAAS;CACT,OAAO;CACP,OAAO;CACP,KAAK;CACL,UAAU;CACV,QAAQ;CACR,QAAQ;CACR,MAAM;CACN,SAAS;CACT,WAAW;CACX,MAAM;CACN,MAAM;CACN,KAAKC;CACL,kBAAkB;CAClB,KAAK;CACL,SAAS;CACT,MAAM;CACN,UAAU;CACV,OAAO;CACP,SAAS;CACT,WAAW;CACX,UAAU;CACV,OAAO;CACP,SAAS;CACT,SAAS;CACT,YAAY;CACZ,OAAO;CACP,cAAc;CACd,OAAO;CACP,MAAM;CACN,QAAQ;CACR,OAAO;CACP,OAAO;CACP,SAAS;CACT,QAAQ;CACR,OAAO;CACP,WAAW;CACX,OAAO;CACP,UAAU;CACV,QAAQ;CACR,QAAQ;CACR,MAAM;CACN,iBAAiB;CACjB,QAAQ;CACR,YAAY;CACZ,UAAU;CACV,QAAQ;CACR,QAAQ;CACR,MAAM;CACN,KAAK;CACL,OAAO;CACP,KAAK;CACL,QAAQ;CACR,WAAW;CACX,UAAU;CACV,aAAa;CACb,aAAa;CACb,QAAQ;CACR,OAAO;CACP,UAAU;CACV,OAAO;CACP,QAAQ;CACR,MAAM;CACN,OAAO;CACP,SAAS;CACT,MAAM;CACN,QAAQ;CACR,KAAK;AACP;AAEA,SAAgB,YAAY,EAC1B,MACA,KACA,MACA,aAMC;CACD,IAAI,CAAC,MACH,OAAO;CAET,IAAI,KAAK,SAAS,SAAS;EACzB,IAAI,CAAC,KACH,OAAO;EAET,OAAO,oBAAC,OAAD;GAAU;GAAK,KAAI;GAAG,eAAA;GAAY,OAAO;GAAM,WAAW,GAAG,+CAA+C,SAAS;EAAI,CAAA;CAClI;CACA,MAAM,QAAQ,OAAO,KAAK,SAAS;CACnC,OAAO,oBAAC,OAAD,EAAO,WAAW,GAAG,gCAAgC,SAAS,EAAI,CAAA;AAC3E;;;AC1OA,MAAa,uBAAyE;CACpF;EAAE,OAAO;EAAO,OAAO;CAAM;CAC7B;EAAE,OAAO;EAAU,OAAO;CAAS;CACnC;EAAE,OAAO;EAAQ,OAAO;CAAO;AACjC;AAEA,SAAgB,eAAe,EAAE,QAAQ,gBAAgB,MAAM,OAAO,UAAU,cAAc,aAAkC;CAC9H,MAAM,WAAW,cAAc,WAAW,IAAI,GAAG,CAAC,IAAI,CAAC;CACvD,MAAM,WAAW,cAAc,WAAW,IAAI,GAAG,CAAC,IAAI,CAAC;CACvD,MAAM,WAAW,cAAc;EAC7B,IAAI,cACF,OAAO;EAET,MAAM,uBAAO,IAAI,IAAoB;EACrC,KAAK,MAAM,OAAO,MAChB,KAAK,IAAI,IAAI,QAAQ,IAAI,QAAQ;EAEnC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,WAAW;GAAE;GAAI;EAAK,EAAE;CACrD,GAAG,CAAC,MAAM,YAAY,CAAC;CAEvB,MAAM,OAAO,UAA+B,eAAe;EAAE,GAAG;EAAQ,GAAG;CAAM,CAAC;CAElF,OACE,qBAAC,OAAD;EAAK,aAAU;EAAkB,WAAW,GAAG,uBAAuB,SAAS;EAA/E,UAAA;GACE,qBAAC,SAAD;IAAS,OAAM;IAAf,UAAA;KACG,QACC,oBAAC,WAAD;MAAW,OAAM;MACf,UAAA,oBAAC,cAAD;OACE,WAAU;OACV,OAAM;OACN,OAAO,OAAO,SAAS,WAAW;OAClC,SAAS,CACP;QAAE,OAAO;QAAU,OAAO,MAAM;OAAM,GACtC;QAAE,OAAO;QAAO,OAAO;OAAc,CACvC;OACA,WAAW,UAAU,IAAI,EAAE,QAAQ,UAAU,SAAS,CAAC;MACxD,CAAA;KACQ,CAAA,IACT;KACJ,oBAAC,WAAD;MAAW,OAAM;MACf,UAAA,oBAAC,aAAD;OACE,OAAM;OACN,OAAO,OAAO;OACd,SAAS,YAAY,KAAK,OAAO;QAAE,OAAO;QAAG,OAAO,aAAa;OAAG,EAAE;OACtE,WAAW,WAAW,IAAI,EAAU,OAAyB,CAAC;MAC/D,CAAA;KACQ,CAAA;KACV,SAAS,SAAS,IACjB,oBAAC,WAAD;MAAW,OAAM;MACf,UAAA,oBAAC,aAAD;OACE,OAAM;OACN,OAAO,OAAO;OACd,SAAS,SAAS,KAAK,OAAO;QAAE,OAAO;QAAG,OAAO;OAAE,EAAE;OACrD,WAAW,SAAS,IAAI,EAAE,UAAU,KAAK,CAAC;MAC3C,CAAA;KACQ,CAAA,IACT;KACH,SAAS,SAAS,IACjB,oBAAC,WAAD;MAAW,OAAM;MACf,UAAA,oBAAC,aAAD;OACE,OAAM;OACN,OAAO,OAAO;OACd,SAAS,SAAS,KAAK,OAAO;QAAE,OAAO,EAAE;QAAI,OAAO,EAAE;OAAK,EAAE;OAC7D,WAAW,SAAS,IAAI,EAAE,UAAU,KAAK,CAAC;MAC3C,CAAA;KACQ,CAAA,IACT;KACH,SAAS,SAAS,IACjB,oBAAC,WAAD;MAAW,OAAM;MACf,UAAA,oBAAC,aAAD;OACE,OAAM;OACN,OAAO,OAAO,YAAY,CAAC;OAC3B,SAAS,SAAS,KAAK,OAAO;QAAE,OAAO,EAAE;QAAK,OAAO,EAAE;OAAM,EAAE;OAC/D,WAAW,SAAS,IAAI,EAAE,UAAU,KAAK,CAAC;MAC3C,CAAA;KACQ,CAAA,IACT;IACG;;GAET,qBAAC,SAAD;IAAS,OAAM;IAAf,UAAA,CACE,oBAAC,WAAD;KAAW,OAAM;KACf,UAAA,oBAAC,cAAD;MACE,WAAU;MACV,OAAM;MACN,OAAO,OAAO;MACd,SAAS;OACP;QAAE,OAAO;QAAQ,OAAO;OAAc;OACtC;QAAE,OAAO;QAAS,OAAO;OAAW;OACpC;QAAE,OAAO;QAAW,OAAO;OAAY;OACvC;QAAE,OAAO;QAAW,OAAO,SAAS,SAAS,IAAI,yBAAyB;OAAa;OACvF;QAAE,OAAO;QAAU,OAAO;OAAS;MACrC;MACA,WAAW,YAAY,IAAI,EAAW,QAAmB,CAAC;KAC3D,CAAA;IACQ,CAAA,GACX,oBAAC,WAAD;KAAW,OAAM;KACf,UAAA,oBAAC,cAAD;MACE,WAAU;MACV,OAAM;MACN,OAAO,OAAO;MACd,SAAS;OACP;QAAE,OAAO;QAAU,OAAO;OAAS;OACnC;QAAE,OAAO;QAAQ,OAAO;OAAO;OAC/B;QAAE,OAAO;QAAS,OAAO;OAAQ;OACjC,GAAI,SAAS,SAAS,IAAI,CAAC;QAAE,OAAO;QAAoB,OAAO;OAAU,CAAC,IAAI,CAAC;OAC/E,GAAI,SAAS,SAAS,IAAI,CAAC;QAAE,OAAO;QAAoB,OAAO;OAAU,CAAC,IAAI,CAAC;MACjF;MACA,WAAW,WAAW,IAAI,EAAU,OAAiB,CAAC;KACvD,CAAA;IACQ,CAAA,CACJ;;GAET,qBAAC,SAAD;IAAS,OAAM;IAAf,UAAA;KACE,oBAAC,WAAD;MAAW,OAAM;MACf,UAAA,oBAAC,oBAAD;OAAoB,OAAM;OAAS,OAAO,OAAO;OAAW,WAAW,cAAc,IAAI,EAAE,UAAU,CAAC;MAAI,CAAA;KACjG,CAAA;KACX,oBAAC,WAAD;MAAW,OAAM;MACf,UAAA,oBAAC,oBAAD;OAAoB,OAAM;OAAS,OAAO,OAAO,UAAU;OAAU,WAAW,WAAW,IAAI,EAAE,OAAO,CAAC;MAAI,CAAA;KACpG,CAAA;KACX,oBAAC,WAAD;MAAW,OAAM;MACf,UAAA,oBAAC,oBAAD;OAAoB,OAAM;OAAQ,OAAO,OAAO,SAAS;OAAU,WAAW,UAAU,IAAI,EAAE,MAAM,CAAC;MAAI,CAAA;KAChG,CAAA;IACJ;;EACN;;AAET;AAOA,SAAgB,qBAAqB,EAAE,MAAM,cAAc,WAAW,GAAG,SAAoC;CAC3G,MAAM,QAAQ,iBAAiB,MAAM,MAAM;CAC3C,MAAM,UAAU,QAAQ,KAAK,kBAAkB,MAAM,MAAM;CAC3D,OACE,qBAAC,SAAD;EAAe;EAAoB;EAAnC,UAAA,CACE,oBAAC,gBAAD,EACE,QACE,oBAAC,QAAD;GACE,SAAQ;GACR,MAAK;GACL,cAAY,QAAQ,IAAI,YAAY,MAAM,YAAY;GACtD,OAAO,QAAQ,IAAI,GAAG,MAAM,SAAS,UAAU,IAAI,KAAK,IAAI,WAAW;GAC5D;GAEX,UAAA,oBAAC,QAAD,EAAQ,WAAW,GAAG,YAAY,WAAW,wBAAwB,EAAI,CAAA;EACnE,CAAA,EAEX,CAAA,GACD,oBAAC,gBAAD;GAAgB,WAAU;GACxB,UAAA,oBAAC,gBAAD,EAAgB,GAAI,MAAQ,CAAA;EACd,CAAA,CACT;;AAEb;AAEA,SAAgB,mBAAmB,EACjC,OACA,OACA,YAKC;CACD,OACE,oBAAC,OAAD;EAAK,MAAK;EAAa,cAAY;EAAO,WAAU;EACjD,UAAA,qBAAqB,KAAK,WACzB,oBAAC,UAAD;GAEE,MAAK;GACL,MAAK;GACL,gBAAc,OAAO,UAAU;GAC/B,eAAe,SAAS,OAAO,KAAK;GACpC,WAAW,GACT,iGACA,gDACA,OAAO,UAAU,QAAQ,8BAA8B,8CACzD;GAEC,UAAA,OAAO;EACF,GAZD,OAAO,KAYN,CACT;CACE,CAAA;AAET;AAEA,SAAS,QAAQ,EAAE,OAAO,YAAoD;CAC5E,OACE,qBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACE,oBAAC,OAAD;GAAK,WAAU;GAA4D,UAAA;EAAW,CAAA,GACrF,QACE;;AAET;AAEA,SAAS,UAAU,EAAE,OAAO,YAAoD;CAC9E,OACE,qBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACE,oBAAC,QAAD;GAAM,eAAA;GAAY,WAAU;GACzB,UAAA;EACG,CAAA,GACN,oBAAC,OAAD;GAAK,WAAU;GAAkB;EAAc,CAAA,CAC5C;;AAET;AAEA,SAAS,YAAY,EACnB,OACA,OACA,SACA,YAMC;CACD,OACE,qBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACE,qBAAC,QAAD;GAAQ,UAAA;GAAgB;GAAO,gBAAgB,MAAM,SAAS,CAAa;GAA3E,UAAA,CACE,oBAAC,eAAD;IAAe,cAAY;IAAO,WAAU;IAC1C,UAAA,oBAAC,aAAD,EAAA,UACG,MAAM,WAAW,IACd,QACA,MAAM,WAAW,IACd,QAAQ,MAAM,MAAM,EAAE,UAAU,MAAM,EAAE,CAAC,EAAE,SAAS,QACrD,GAAG,MAAM,OAAO,WACX,CAAA;GACA,CAAA,GACf,oBAAC,eAAD,EAAA,UACG,QAAQ,KAAK,WACZ,oBAAC,YAAD;IAA+B,OAAO,OAAO;IAC3C,UAAA,oBAAC,gBAAD,EAAA,UAAiB,OAAO,MAAsB,CAAA;GACpC,GAFK,OAAO,KAEZ,CACb,EACY,CAAA,CACT;EACP,CAAA,GAAA,MAAM,SAAS,IACd,oBAAC,QAAD;GAAQ,SAAQ;GAAQ,MAAK;GAAU,cAAY,SAAS;GAAS,eAAe,SAAS,CAAC,CAAC;GAC7F,UAAA,oBAAC,GAAD,EAAG,WAAU,mBAAoB,CAAA;EAC3B,CAAA,IACN,IACD;;AAET;;;ACjQA,SAAgB,YAAY,EAC1B,OACA,QACA,OAAO,IACP,aAMC;CACD,IAAI,UAAU,KAAA,GACZ,OAAO;CAET,MAAM,OAAO,YAAY,MAAM;CAC/B,MAAM,UAAU,WAAW,MAAM,WAAW,QAAQ,CAAC,EAAE,MAAM,aAAa,MAAM,WAAW,EAAE,KAAK,aAAa,MAAM,SAAS;CAC9H,MAAM,QAAQ,GAAG,yBAAyB,gBAAgB,MAAM,UAAU,GAAG,SAAS;CACtF,MAAM,OAAO,oBAAC,cAAD;EAAc,OAAO,MAAM;EAAkB;EAAM,aAAa;CAAI,CAAA;CACjF,IAAI,CAAC,MACH,OACE,oBAAC,QAAD;EAAM,OAAO;EAAS,WAAW;EAC9B,UAAA;CACG,CAAA;CAGV,OACE,oBAAC,KAAD;EACE,QAAQ,oBAAC,QAAD,EAAM,WAAW,MAAQ,CAAA;EACjC,SACE,qBAAC,OAAD;GAAK,WAAU;GAAf,UAAA;IACE,oBAAC,QAAD;KAAM,WAAU;KAAuB,UAAA;IAAc,CAAA;IACrD,oBAAC,QAAD;KAAM,WAAU;KAAa,UAAA,KAAK;IAAc,CAAA;IAChD,oBAAC,QAAD;KAAM,WAAU;KAAa,UAAA,KAAK;IAAW,CAAA;GAC1C;;EAGN,UAAA;CACE,CAAA;AAET;;;AC5CA,MAAM,QAAsD;CAC1D,QAAQ;EACN,OAAO;EACP,GAAG;CACL;CACA,OAAO;EACL,OAAO;EACP,GAAG;CACL;CACA,QAAQ;EACN,OAAO;EACP,GAAG;CACL;CACA,UAAU;EACR,OAAO;EACP,GAAG;CACL;CACA,UAAU;EACR,OAAO;EACP,GAAG;CACL;AACF;AAEA,SAAgB,WAAW,QAAgB,OAAoC;CAC7E,IAAI,WAAW,UACb,OAAO;CAET,IAAI,WAAW,SACb,OAAO;CAET,MAAM,KAAK,OAAO,YAAY,KAAK;CACnC,IAAI,CAAC,IACH;CAEF,IAAI,GAAG,SAAS,QAAQ,GACtB,OAAO;CAET,IAAI,GAAG,SAAS,UAAU,GACxB,OAAO;CAET,IAAI,GAAG,SAAS,UAAU,KAAK,GAAG,SAAS,MAAM,GAC/C,OAAO;CAET,IAAI,GAAG,SAAS,QAAQ,GACtB,OAAO;CAET,IAAI,GAAG,WAAW,KAAK,KAAK,GAAG,WAAW,IAAI,KAAK,GAAG,WAAW,IAAI,KAAK,GAAG,SAAS,QAAQ,GAC5F,OAAO;AAGX;AAEA,MAAM,cAAsC;CAC1C,QAAQ;CACR,OAAO;AACT;AACA,MAAM,cAAsC,EAC1C,QAAQ,qBACV;AAEA,SAAgB,gBAAgB,QAAgB,OAAwB;CACtE,OAAO,YAAY,WAAW,QAAQ,KAAK,KAAK,OAAO;AACzD;AAEA,SAAgB,gBAAgB,QAAgB,OAAwB;CACtE,OAAO,YAAY,WAAW,QAAQ,KAAK,KAAK,OAAO;AACzD;AAEA,SAAgB,WAAW,EAAE,QAAQ,OAAO,aAAqE;CAC/G,MAAM,OAAO,MAAM,WAAW,QAAQ,KAAK,KAAK;CAChD,IAAI,CAAC,MACH,OACE,oBAAC,QAAD;EAAM,eAAA;EAAY,OAAO;EAAQ,WAAW,GAAG,sBAAsB,SAAS;EAAG,UAAA;CAE3E,CAAA;CAGV,OACE,qBAAC,OAAD;EACE,SAAQ;EACR,MAAK;EACL,UAAS;EACT,MAAK;EACL,cAAY,KAAK;EACjB,WAAW,GAAG,6BAA6B,SAAS;EANtD,UAAA,CAQE,oBAAC,SAAD,EAAA,UAAQ,KAAK,MAAa,CAAA,GAC1B,oBAAC,QAAD,EAAM,GAAG,KAAK,EAAI,CAAA,CACf;;AAET;;;ACxFA,SAAgB,kBAAkB,EAAE,KAAK,aAAsD;CAC7F,MAAM,EAAE,SAAS;CACjB,MAAM,OAAO,GAAG,mBAAmB,SAAS;CAC5C,IAAI,IAAI,UAAU,aAChB,OAAO,oBAAC,UAAD,EAAU,WAAW,GAAG,MAAM,4BAA4B,EAAI,CAAA;CAEvE,IAAI,IAAI,UAAU,WAChB,OAAO,oBAAC,SAAD,EAAS,WAAW,GAAG,MAAM,WAAW,EAAI,CAAA;CAErD,QAAQ,KAAK,QAAb;EACE,KAAK,UACH,OAAO,oBAAC,aAAD,EAAa,WAAW,GAAG,MAAM,aAAa,EAAI,CAAA;EAE3D,KAAK,UACH,OAAO,oBAAC,aAAD,EAAa,WAAW,GAAG,MAAM,WAAW,EAAI,CAAA;EAEzD,KAAK,UACH,OAAO,oBAAC,aAAD,EAAa,WAAW,GAAG,MAAM,WAAW,EAAI,CAAA;EAEzD,SACE,OAAO,oBAAC,MAAD,EAAM,WAAW,GAAG,MAAM,WAAW,EAAI,CAAA;CAEpD;AACF;;;ACuBA,SAAgB,aACd,MACA,UACA,OAAwB,OACxB,QACA,OACQ;CACR,MAAM,SAAiB,iBAAiB,MAAM,IAAI,CAAC,CAChD,OAAO,aAAa,CAAC,CACrB,KAAK,SAAS;EACb,KAAK,IAAI;EACT,MAAM;EACN,OAAO,cAAc,GAAG;EACxB,MAAM;EACN,OAAO,UAAU,IAAI,MAAM;EAC3B,QAAQ,IAAI,YAAY,IAAI,OAAO,IAAI,SAAS,IAAI,KAAA;EACpD,OAAO,GAAG,cAAc,GAAG,EAAE,KAAK,IAAI,UAAU,OAAO,IAAI,cAAc,IAAI,KAAK;EAClF,gBAAgB,SAAS,IAAI,SAAS;CACxC,EAAE;CACJ,MAAM,YAAY,UAAU,KAAA,IAAY,CAAC,IAAI,eAAe,MAAM,MAAM,IAAI,CAAC,CAAC,KAAK,SAAS,SAAS,MAAM,KAAK,CAAC;CACjH,IAAI,WAAW,KAAA,GACb,OAAO,CAAC,GAAG,QAAQ,GAAG,SAAS;CAEjC,MAAM,SAAS,KAAK,oBAAoB,KAAA;CACxC,MAAM,aAAa,cAAc,MAAM,OAAO,QAAQ,UAAU,OAAO,GAAG,CAAC,CAAC,KAAK,UAAU,UAAU,OAAO,QAAQ,MAAM,CAAC;CAC3H,OAAO;EAAC,GAAG;EAAQ,GAAG;EAAW,GAAG;CAAU;AAChD;AAEA,SAAS,SAAS,MAAmB,SAAgC;CACnE,MAAM,UAAU,KAAK,WAAW,eAAe,KAAK,UAAU,aAAa,CAAC,QAAQ;CACpF,MAAM,YAAY,KAAK;CACvB,OAAO;EACL,KAAK,KAAK;EACV,MAAM;EACN,OAAO,KAAK;EACZ,MAAM;EACN,OAAO,UAAU,YAAY,KAAK;EAClC,QAAQ,KAAK;EACb,OAAO,UAAU,GAAG,KAAK,MAAM,uBAAuB,KAAK;EAC3D,gBAAgB,QAAQ,SAAS,IAAI;EACrC,QAAQ,KAAK,aAAa,cAAc,KAAA,KAAa,QAAQ,eAAe,QAAQ,SAAS,SAAS,IAAI,KAAA;EAC1G,WAAW;CACb;AACF;AAEA,SAAS,UAAU,OAAkB,SAA2B,QAAuB;CACrF,MAAM,SAAS,oBAAoB,KAAK;CACxC,MAAM,UAAU,MAAM,WAAW;CACjC,OAAO;EACL,KAAK,MAAM;EACX,MAAM;EACN,OAAO,eAAe,KAAK;EAC3B,MAAM;EACN,OAAO,gBAAgB,KAAK,IAAI,WAAW,UAAU,YAAY;EACjE,QAAQ,UAAW,MAAM,eAAe,OAAO,yBAAyB,KAAA,IAAa;EACrF,OAAO,GAAG,WAAW,KAAK,EAAE,KAAK;EACjC,gBAAgB,QAAQ,SAAS,MAAM,EAAE;EACzC,QAAQ,WAAW,QAAQ,eAAe,QAAQ,SAAS,MAAM,EAAE,IAAI,KAAA;EACvE,WAAW;EACX,YACE,UAAU,QAAQ,gBAAgB,eAAe,KAAK,IAClD;GACE,SAAS,MAAM,eAAe;GAC9B,OAAO,qBAAqB,KAAK;GACjC,cAAc,QAAQ,eAAe,MAAM,IAAI,MAAM,eAAe,IAAI;EAC1E,IACA,KAAA;CACR;AACF;AAEA,SAAS,UAAU,QAA+C;CAChE,QAAQ,QAAR;EACE,KAAK,WACH,OAAO;EAET,KAAK,UACH,OAAO;EAET,SACE,OAAO;CAEX;AACF;AAEA,SAAgB,QAAQ,EAAE,MAAM,SAAS,OAAO,YAAoE;CAClH,MAAM,OACJ,KAAK,UAAU,WACX,gBACA,KAAK,SAAS,UACZ,kCACA,KAAK,SAAS,SACZ,KAAK,UAAU,YACb,cACA,cACF;CACV,OACE,qBAAC,OAAD;EAAK,WAAW,GAAG,iDAAiD,SAAS,oBAAoB,uBAAuB,IAAI;EAA5H,UAAA;GACE,qBAAC,UAAD;IACE,MAAK;IACL,OAAO,KAAK;IACZ,gBAAc,UAAU,KAAA;IACxB,UAAU,MAAM;KACd,EAAE,gBAAgB;KAClB,SAAS;IACX;IACA,WAAU;IARZ,UAAA;KAUE,oBAAC,UAAD,EAAgB,KAAO,CAAA;KACvB,oBAAC,QAAD;MAAM,WAAU;MAA2B,UAAA,KAAK;KAAY,CAAA;KAC3D,KAAK,SAAS,oBAAC,QAAD;MAAM,WAAU;MAAmC,UAAA,KAAK;KAAa,CAAA,IAAI;KACvF,KAAK,SAAS,UAAU,oBAAC,YAAD,EAAY,WAAU,8BAA+B,CAAA,IAAI;IAC5E;;GACP,KAAK,aACJ,oBAAC,UAAD;IACE,MAAK;IACL,cAAY,KAAK,WAAW;IAC5B,gBAAc,KAAK,WAAW;IAC9B,OAAO,KAAK,WAAW;IACvB,UAAU,MAAM;KACd,EAAE,gBAAgB;KAClB,KAAK,YAAY,OAAO;IAC1B;IACA,WAAW,GACT,sDACA,KAAK,WAAW,UAAU,iBAAiB,2BAC7C;IAEA,UAAA,oBAAC,gBAAD;KAAgB,SAAS,KAAK,WAAW;KAAS,WAAU;IAAY,CAAA;GAClE,CAAA,IACN;GACH,KAAK,SACJ,oBAAC,UAAD;IACE,MAAK;IACL,cAAY,GAAG,KAAK,SAAS,SAAS,SAAS,OAAO,GAAG,KAAK;IAC9D,OAAO,KAAK;IACZ,UAAU,MAAM;KACd,EAAE,gBAAgB;KAClB,KAAK,SAAS;IAChB;IACA,WAAU;;GAGJ,CAAA,IACN;EACD;;AAET;AAEA,SAAS,SAAS,EAAE,QAAwB;CAC1C,IAAI,KAAK,SAAS,SAChB,OAAO,oBAAC,QAAD;EAAM,WAAU;;CAAgE,CAAA;CAEzF,QAAQ,KAAK,OAAb;EACE,KAAK,WACH,OAAO,oBAAC,SAAD,EAAS,WAAU,uBAAwB,CAAA;EAEpD,KAAK,UACH,OAAO,oBAAC,aAAD,EAAa,WAAU,uBAAwB,CAAA;EAExD,KAAK,WACH,OAAO,oBAAC,QAAD,EAAQ,WAAU,uBAAwB,CAAA;EAEnD,SACE,OAAO,oBAAC,OAAD,EAAO,WAAU,uBAAwB,CAAA;CAEpD;AACF;;;AChLA,MAAM,eAAgC;CAAE,MAAM;CAAO,MAAM;CAAO,KAAK;AAAM;AAE7E,SAAgB,YAAY,EAC1B,KACA,SAAS,OACT,eACA,aACA,cAAc,MACd,cACA,YAAY,UACZ,SAAS,UACT,QAAQ,UACR,UACA,kBACA,cACA,YACA,eACA,aACA,mBACA,KACA,UACA,WAAW,eACX,SACA,iBACA,SACA,aACmB;CACnB,MAAM,EAAE,SAAS;CACjB,MAAM,CAAC,YAAY,iBAAiB,SAAS,KAAK;CAClD,MAAM,YAAY,WAAW;CAC7B,MAAM,cAAc,SAAkB;EACpC,cAAc,IAAI;EAClB,kBAAkB,IAAI;CACxB;CAEA,MAAM,SAAS,KAAK,UAAU;CAC9B,MAAM,UAAU,cAAc,aAAa,GAAG,IAAI,eAAe,GAAG;CACpE,MAAM,eAAe,cAAc,YAAY,GAAG,IAAI,KAAA;CACtD,MAAM,cAAc,cAAc,KAAK,SAAS,OAAO,KAAA;CACvD,MAAM,UAAU,aAAa,SAAS,UAAU,eAAe,YAAY,QAAQ,KAAA;CACnF,MAAM,OAAO,WAAW,KAAK,WAAW,KAAK,YAAY;CACzD,MAAM,SAAS;EACb,cAAc,IAAI,WAAW,KAAA;EAC7B,KAAK,UAAU,IAAI,KAAK,YAAY,KAAA;EACpC,SAAS,MAAM,KAAA,IAAY;CAC7B,CAAC,CAAC,QAAQ,SAAyB,QAAQ,IAAI,CAAC;CAEhD,MAAM,QAAQ,cAAc,KAAK,KAAK;CACtC,MAAM,QAAqB,CAAC;CAC5B,IAAI,OACF,MAAM,KACJ,oBAAC,QAAD;EAAkB,WAAW,gBAAgB,QAAQ,KAAK,KAAK;EAC5D,UAAA;CACG,GAFI,OAEJ,CACR;CAEF,IAAI,YAAY,KAAA,GACd,MAAM,KACJ,qBAAC,QAAD;EAAoB,OAAO;EAA3B,UAAA,CACE,oBAAC,aAAD;GAAa,MAAM;GAAa,KAAK;GAAS,MAAM;GAAc,WAAU;EAAgC,CAAA,GAC3G,OACG;CAHI,GAAA,SAGJ,CACR;CAEF,KAAK,MAAM,SAAS,QAClB,MAAM,KAAK,oBAAC,QAAD,EAAA,UAAmB,MAAY,GAApB,KAAoB,CAAC;CAE7C,MAAM,QAAQ,aACZ,OACC,cAAe,mBAAmB,iBAAiB,SAAS,IAAI,WAAW,YAAY,GACxF,WACA;EACE,KAAK,OAAO,KAAK,IAAI;EACrB,MAAM;EACN,WAAW,YAAa,gBAAgB,cAAc,OAAO,IAAI,WAAW,YAAY;EACxF,QAAQ;EACR,cAAc;CAChB,GACA;EACE,MAAM;EACN,MAAM,KAAK,WAAW,aAAa,KAAK,WAAW,cAAc,KAAK,WAAW;EACjF,WAAW,SAAU,eAAe,aAAa,IAAI,IAAI,WAAW,YAAY;EAChF,QAAQ;CACV,CACF;CACA,MAAM,gBAAgB,MAAM,MAAM,MAAM,EAAE,QAAQ,aAAa;CAE/D,OACE,qBAAC,OAAD;EACE,aAAU;EACV,eAAa,UAAU,KAAA;EACvB,eAAa,KAAK,gBAAgB,KAAA;EAClC,OAAO,KAAK,eAAe,uCAAuC,KAAA;EAClE,MAAK;EACL,UAAU;EACV,UAAU,MAAM;GACd,IAAI,EAAE,SAAS,KAAK,WAClB;GAEF,WAAW;IAAE,MAAM,EAAE;IAAS,MAAM,EAAE;IAAS,KAAK,EAAE;GAAO,CAAC;EAChE;EACA,YAAY,MAAM;GAChB,IAAI,EAAE,WAAW,EAAE,eACjB;GAEF,IAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;IACtC,EAAE,eAAe;IACjB,WAAW;KAAE,MAAM,EAAE;KAAS,MAAM,EAAE;KAAS,KAAK,EAAE;IAAO,CAAC;GAChE;EACF;EACA,WAAW,GACT,wEACA,gFACA,gBAAgB,yBAAyB,SAAS,oBAAoB,sBACtE,SACF;EA3BF,UAAA,CA6BE,qBAAC,OAAD;GAAK,WAAW,GAAG,4CAA4C,KAAK,gBAAgB,YAAY;GAAhG,UAAA,CACE,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KACE,oBAAC,QAAD,EAAA,UACE,oBAAC,mBAAD,EAAwB,IAAM,CAAA,EACxB,CAAA;KACP,aAAa,WACZ,oBAAC,YAAD;MACE,SAAS,KAAK,SAAS;MACvB,WAAW,UAAU;OACnB,WAAW,KAAK;OAChB,IAAI,WAAW,KAAK,SAAS,KAC3B,SAAS,KAAK;MAElB;MACA,gBAAgB,WAAW,KAAK;KACjC,CAAA,IAED,oBAAC,QAAD;MACE,eACE,YAAY,aAAa,iBACpB,MAAM;OACL,EAAE,gBAAgB;OAClB,WAAW,IAAI;MACjB,IACA,KAAA;MAEN,WAAU;MAET,UAAA,aAAa,IAAI;KACd,CAAA;KAEP,IAAI,SAAS,IACZ,oBAAC,QAAD;MAEE,OAAO,GAAG,IAAI,OAAO,cAAc,IAAI,WAAW,IAAI,KAAK;MAC3D,WAAW,GACT,2EACA,gEAGA,IAAI,UAAU,YAAY,2BAA2B,0BACvD;MAEC,UAAA,IAAI;KACD,CAAA,IACJ;KACJ,oBAAC,aAAD;MAAa,OAAO,KAAK;MAAsB;MAAQ,MAAM;MAAI,WAAU;KAAS,CAAA;IACjF;GAEL,CAAA,GAAA,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KACE,oBAAC,QAAD,EAAA,UACE,oBAAC,YAAD;MAAoB;MAAQ,OAAO,KAAK;MAAO,WAAW,GAAG,UAAU,gBAAgB,QAAQ,KAAK,KAAK,CAAC;KAAI,CAAA,EACxG,CAAA;KACR,oBAAC,QAAD;MAAM,WAAU;MACb,UAAA,MAAM,KAAK,MAAM,MAChB,qBAAC,UAAD,EAAA,UAAA,CACG,IAAI,IAAI,QAAQ,IAChB,IACO,EAAA,GAHK,CAGL,CACX;KACG,CAAA;KACN,qBAAC,QAAD;MAAM,WAAU;MAAhB,UAAA,CACG,MAAM,SAAS,IAAI,OAAO,IAC1B,mBAAmB,KAAK,kBAAkB,KAAK,SAAS,CACrD;;KACN,oBAAC,QAAD,EAAM,WAAU,iBAAkB,CAAA;KACjC;IACE;GACF,CAAA,CAAA;EAEJ,CAAA,GAAA,MAAM,SAAS,IACd,oBAAC,OAAD;GAAK,WAAU;GACZ,UAAA,MAAM,KAAK,SACV,oBAAC,SAAD;IAA8B;IAAM,QAAQ,KAAK,QAAQ;IAAe,UAAU,KAAK;GAAW,GAApF,KAAK,GAA+E,CACnG;EACE,CAAA,IACH,IACD;;AAET;AAEA,SAAS,OAAO,EAAE,YAAqC;CACrD,OAAO,oBAAC,QAAD;EAAM,WAAU;EAAoD;CAAe,CAAA;AAC5F;AAEA,SAAS,WAAW,EAAE,SAAS,UAAU,YAA0F;CACjI,MAAM,CAAC,OAAO,YAAY,SAAS,OAAO;CAC1C,MAAM,MAAM,OAAyB,IAAI;CACzC,gBAAgB;EACd,IAAI,SAAS,MAAM;EACnB,IAAI,SAAS,OAAO;CACtB,GAAG,CAAC,CAAC;CACL,gBAAgB;EACd,MAAM,sBAAsB;GAC1B,IAAI,SAAS,MAAM;GACnB,IAAI,SAAS,OAAO;EACtB;EACA,OAAO,iBAAiB,SAAS,aAAa;EAC9C,aAAa,OAAO,oBAAoB,SAAS,aAAa;CAChE,GAAG,CAAC,CAAC;CACL,OACE,oBAAC,SAAD;EACO;EACE;EACP,YAAY;EACZ,aAAY;EACZ,cAAW;EACX,UAAU,MAAM,EAAE,gBAAgB;EAClC,gBAAgB,MAAM,EAAE,gBAAgB;EACxC,WAAW,MAAM,SAAS,EAAE,OAAO,KAAK;EACxC,cAAc;GAEZ,IAAI,SAAS,SAAS,GACpB,SAAS,MAAM,KAAK,CAAC;EAEzB;EACA,YAAY,MAAM;GAChB,EAAE,gBAAgB;GAClB,IAAI,EAAE,QAAQ,SACZ,SAAS,MAAM,KAAK,CAAC;QAChB,IAAI,EAAE,QAAQ,UACnB,SAAS;EAEb;EACA,WAAW,GACT,yEACA,+CACF;CACD,CAAA;AAEL;;;AC1QA,SAAgB,aAAa,QAAgC,UAA2C;CACtG,MAAM,CAAC,MAAM,WAAW,SAAmB;CAC3C,MAAM,CAAC,MAAM,WAAW,SAAiB;CACzC,MAAM,YAAY;EAChB,QAAQ,KAAA,CAAS;EACjB,QAAQ,KAAA,CAAS;CACnB;CACA,MAAM,SAAS,GAAc,SAAmB;EAC9C,EAAE,gBAAgB;EAClB,EAAE,aAAa,gBAAgB;EAC/B,EAAE,aAAa,QAAQ,cAAc,KAAK,SAAS,YAAY,KAAK,MAAM,KAAK,EAAE;EACjF,QAAQ,IAAI;CACd;CACA,MAAM,UAAU,GAAc,SAAiB;EAC7C,EAAE,eAAe;EACjB,EAAE,gBAAgB;EAClB,EAAE,aAAa,aAAa;EAC5B,QAAQ,IAAI;CACd;CAEA,SAAS,QAAQ,KAAa,OAAqD;EACjF,OAAO;GACL,WAAW;GACX,cAAc,MAAM,MAAM,GAAG;IAAE,MAAM;IAAW;GAAI,CAAC;GACrD,WAAW;GACX,aAAa,MAAM;IACjB,IAAI,MAAM,SAAS,WACjB,OAAO,GAAG,OAAO,KAAK;GAE1B;GACA,SAAS,MAAM;IACb,IAAI,MAAM,SAAS,WACjB;IAEF,EAAE,eAAe;IACjB,EAAE,gBAAgB;IAClB,IAAI,KAAK,QAAQ,KACf,SAAS,kBAAkB,QAAQ,KAAK,KAAK,MAAM,QAAQ,MAAM,SAAS,MAAM,KAAA,CAAS,CAAC;IAE5F,IAAI;GACN;EACF;CACF;CAEA,SAAS,UAAU,OAAqD;EACtE,OAAO;GACL,aAAa,MAAM;IACjB,IAAI,MACF,OAAO,GAAG,SAAS,MAAM,KAAK;GAElC;GACA,SAAS,MAAM;IACb,EAAE,eAAe;IACjB,IAAI,MAAM,SAAS,WACjB,SAAS,kBAAkB,QAAQ,KAAK,KAAK,MAAM,MAAM,CAAC;SACrD,IAAI,MAAM,SAAS,SACxB,SAAS,gBAAgB,QAAQ,KAAK,IAAI,MAAM,MAAM,CAAC;IAEzD,IAAI;GACN;EACF;CACF;CAEA,SAAS,OAAO,OAAqD;EACnE,MAAM,KAAK,MAAM;EACjB,IAAI,OAAO,KAAA,GACT,OAAO,CAAC;EAEV,OAAO;GAAE,WAAW;GAAM,cAAc,MAAM,MAAM,GAAG;IAAE,MAAM;IAAS;GAAG,CAAC;GAAG,WAAW;EAAI;CAChG;CAEA,OAAO;EACL,UAAU,SAAS,KAAA;EACnB,SAAS,SAAiB,SAAS;EACnC;EACA;EACA;EACA,SAAS,OAAO,gBAAgB;GAC9B,MAAM,KAAK,iBAAiB;GAC5B,SAAS,eAAe,QAAQ,MAAM,EAAE,CAAC;GACzC,OAAO;EACT;EACA,SAAS,IAAY,SAAiB,SAAS,kBAAkB,QAAQ,IAAI,IAAI,CAAC;EAClF,SAAS,OAAe,SAAS,kBAAkB,QAAQ,EAAE,CAAC;CAChE;AACF;AAEA,SAAgB,kBAAkB,EAChC,OACA,SACA,iBACA,UACA,UACA,aAQC;CACD,IAAI,SACF,OAAO,oBAAC,gBAAD;EAAgB,SAAS,MAAM,SAAS;EAAc;EAAU,cAAc,gBAAgB,KAAK;CAAI,CAAA;CAGhH,MAAM,SAAS,MAAM,WAAW,KAAA;CAChC,OACE,oBAAC,cAAD;EACE,GAAI;EACJ,OAAO,MAAM,SAAS;EACtB,OAAO,MAAM,KAAK;EAClB,WAAW,GAAG,iBAAiB,UAAU,aAAa;EACtD,eAAe,eAAe,gBAAgB,IAAI,IAAI,KAAA;EACtD,SAAS,SAAS,oBAAC,cAAD,EAAc,WAAU,0DAA2D,CAAA,IAAI,KAAA;EACzG,SACE,SACE,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,eAAD;GAAe,OAAM;GAAe,eAAe,gBAAgB,IAAI;GACrE,UAAA,oBAAC,QAAD,EAAQ,WAAU,SAAU,CAAA;EACf,CAAA,GACf,oBAAC,eAAD;GAAe,OAAM;GAAe,OAAM;GAAoD,SAAS;GACrG,UAAA,oBAAC,QAAD,EAAQ,WAAU,SAAU,CAAA;EACf,CAAA,CACf,EAAA,CAAA,IACA,KAAA;CAEP,CAAA;AAEL;AAEA,SAAS,eAAe,EAAE,SAAS,UAAU,UAAqF;CAChI,MAAM,CAAC,OAAO,YAAY,SAAS,OAAO;CAC1C,MAAM,eAAe;EACnB,MAAM,OAAO,MAAM,KAAK;EACxB,IAAI,QAAQ,SAAS,SACnB,SAAS,IAAI;EAEf,OAAO;CACT;CACA,OACE,oBAAC,OAAD;EAAK,WAAU;EACb,UAAA,oBAAC,OAAD;GACE,WAAA;GACA,cAAW;GACX,OAAO;GACP,UAAU,MAAM,EAAE,cAAc,OAAO;GACvC,WAAW,MAAM,SAAS,EAAE,OAAO,KAAK;GACxC,QAAQ;GACR,YAAY,MAAM;IAChB,IAAI,EAAE,QAAQ,SACZ,OAAO;SACF,IAAI,EAAE,QAAQ,UAAU;KAC7B,EAAE,gBAAgB;KAClB,OAAO;IACT;GACF;GACA,WAAU;EACX,CAAA;CACE,CAAA;AAET;AAEA,SAAgB,aAAa,EAC3B,OACA,OACA,SACA,SACA,WACA,GAAG,QAM+B;CAClC,OACE,qBAAC,OAAD;EAAK,GAAI;EAAM,WAAW,GAAG,uFAAuF,SAAS;EAA7H,UAAA;GACG;GACD,oBAAC,QAAD;IAAM,WAAU;IAA4C,UAAA;GAAY,CAAA;GACxE,oBAAC,QAAD;IAAM,WAAU;IAAgB,UAAA;GAAY,CAAA;GAC3C,UACC,oBAAC,QAAD;IAAM,WAAU;IACb,UAAA;GACG,CAAA,IACJ;EACD;;AAET;AAEA,SAAgB,cAAc,EAC5B,OACA,OACA,SACA,YAMC;CACD,OACE,oBAAC,QAAD;EACE,SAAQ;EACR,MAAK;EACL,cAAY;EACZ,OAAO,SAAS;EAChB,WAAU;EACV,UAAU,MAAM;GACd,EAAE,gBAAgB;GAClB,QAAQ;EACV;EAEC;CACK,CAAA;AAEZ;AAEA,SAAgB,eAAe,EAAE,WAAoC;CACnE,OACE,qBAAC,QAAD;EAAQ,SAAQ;EAAQ,MAAK;EAAK,WAAU;EAAqC;EAAjF,UAAA,CACE,oBAAC,MAAD,CAAO,CAAA,GAAC,WAEF;;AAEZ;;;AC/LA,SAAgB,cAAc,QAAyB;CACrD,OAAO,GAAG,kCAAkC,SAAS,sDAAsD,iBAAiB;AAC9H;AAEA,SAAgB,eAAe,EAC7B,MACA,QACA,gBACA,OACA,UACA,kBACA,eACA,KACA,YAAY,QAAQ,IAAI,KAAK,OAAO,UACpC,YACA,cACA,aAAa,MACb,UACA,UACA,UACA,gBACA,SACA,kBACA,cACA,YACA,eACA,aACA,mBACA,iBACA,YACA,eAAe,MACf,aAAa,cACb,iBACA,cACA,aACsB;CACtB,MAAM,cAAc,cAAc,IAAI,IAAI,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;CACrF,MAAM,WAAW,gBAAgB;CACjC,MAAM,UAAU,cAAc,WAAW,MAAM,QAAQ,KAAK,GAAG;EAAC;EAAM;EAAQ;CAAK,CAAC;CACpF,MAAM,SAAS,cAAc,UAAU,SAAS,QAAQ,EAAE,cAAc,SAAS,CAAC,GAAG;EAAC;EAAS;EAAQ;CAAQ,CAAC;CAChH,MAAM,SAAS,cAAc,QAAQ,OAAO,QAAQ,QAAQ,KAAK,MAAM;CACvE,MAAM,SAAS,OAAO,YAAY;CAClC,MAAM,CAAC,cAAc,mBAAmB,SAAiB;CAEzD,MAAM,OAAO,UAA+B,eAAe;EAAE,GAAG;EAAQ,GAAG;CAAM,CAAC;CAClF,MAAM,OAAO,aAAa,OAAO,gBAAgB,CAAC,IAAI,iBAAiB,IAAI,EAAE,aAAa,CAAC,CAAC;CAE5F,MAAM,WAAW,UAAwB;EACvC,IAAI,QACF,OACE,oBAAC,mBAAD;GACS;GACP,SAAS,MAAM,WAAW,KAAA,KAAa,iBAAiB,MAAM;GAC9D,kBAAkB,YAAY,gBAAgB,UAAU,MAAM,SAAS,KAAA,CAAS;GAChF,WAAW,SAAS,MAAM,UAAU,KAAK,OAAO,MAAM,QAAQ,IAAI;GAClE,gBAAgB,MAAM,UAAU,KAAK,OAAO,MAAM,MAAM;GACxD,WAAW,KAAK,OAAO,KAAK;EAC7B,CAAA;EAGL,IAAI,OAAO,YAAY,UAAU,CAAC,MAAM,OACtC,OAAO;EAET,MAAM,UAAU,OAAO,YAAY;EACnC,MAAM,SAAS,WAAW,MAAM,SAAS;GAAE,QAAQ,MAAM;GAAQ,KAAK,MAAM;EAAI,IAAI,KAAA;EACpF,OACE,oBAAC,cAAD;GACE,OACE,MAAM,WAAW,MAAM,UACrB,qBAAA,YAAA,EAAA,UAAA;IACG,MAAM;IACP,oBAAC,QAAD;KAAM,eAAA;KAAY,UAAA;IAAS,CAAA;IAC3B,oBAAC,QAAD;KAAM,WAAU;KAAa,UAAA,MAAM;IAAc,CAAA;GACjD,EAAA,CAAA,IAEF,MAAM;GAGV,OAAO,MAAM,KAAK;GAClB,OAAO,WAAW,MAAM,MAAM,MAAM,MAAM,KAAA;GAC1C,SACE,UACE,oBAAC,aAAD;IAAa,MAAM,MAAM,KAAK,EAAE,EAAE,KAAK,SAAS;IAAM,KAAK,UAAU,MAAM,KAAK,IAAI,YAAY;IAAG,MAAM,MAAM;GAAQ,CAAA,IACrH,KAAA;GAEN,SACE,UAAU,kBACR,oBAAC,eAAD;IAAe,OAAO,kBAAkB,MAAM;IAAS,eAAe,gBAAgB,MAAM;IAC1F,UAAA,oBAAC,MAAD,EAAM,WAAU,SAAU,CAAA;GACb,CAAA,IACb,KAAA;EAEP,CAAA;CAEL;CAEA,OACE,qBAAC,OAAD;EAAK,aAAU;EAAkB,WAAW,GAAG,uBAAuB,SAAS;EAA/E,UAAA;GACG,aACC,oBAAC,eAAD;IAAe,OAAO,OAAO;IAAQ,WAAW,WAAW,IAAI,EAAE,OAAO,CAAC;IAAG,WAAW;IAAiB,WAAU;GAAQ,CAAA,IACxH;GACH,eAAe,oBAAC,gBAAD;IAAwB;IAAwB;IAAsB;IAAa;IAAO,WAAU;GAAQ,CAAA,IAAI;GAE/H,UAAU,aACT,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,qBAAC,QAAD,EAAA,UAAA;KACG,OAAO;KAAM;KAAK,OAAO;KACzB,OAAO,OAAO,SAAS,MAAM,OAAO,OAAO,KAAK,KAAK,MAAM;IACxD,EAAA,CAAA,GACN,oBAAC,UAAD;KACE,MAAK;KACL,WAAU;KACV,eAAe,eAAe,aAAa,MAAM,CAAC;KACnD,UAAA;IAEO,CAAA,CACL;GACH,CAAA,IAAA;GAEH,KAAK,WAAW,IACd,cAAc,oBAAC,OAAD;IAAO,MAAM,oBAAC,QAAD,CAAS,CAAA;IAAG,OAAM;GAAmB,CAAA,IAC/D,QAAQ,WAAW,IACrB,eAAe,MAAM,IACnB,oBAAC,OAAD;IACE,MAAM,oBAAC,SAAD,CAAU,CAAA;IAChB,OAAM;IACN,aAAY;IACZ,QAAO;IACP,gBAAgB,eAAe,aAAa,MAAM,CAAC;GACpD,CAAA,IACC,SAAS,YAAY,QAAQ,KAAK,IACpC,oBAAC,OAAD;IACE,MAAM,oBAAC,YAAD,CAAa,CAAA;IACnB,OAAM;IACN,aAAa,4BAA4B,MAAM,MAAM;IACrD,QAAO;IACP,gBAAgB,IAAI,EAAE,QAAQ,MAAM,CAAC;GACtC,CAAA,IAED,oBAAC,OAAD;IAAO,MAAM,oBAAC,QAAD,CAAS,CAAA;IAAG,OAAM;IAAe,aAAY;GAAuB,CAAA,IAGnF,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACG,OAAO,KAAK,UACX,qBAAC,OAAD;KAEE,GAAK,SAAS,KAAK,UAAU,KAAK,IAAI,CAAC;KACvC,WAAW,GAAG,kCAAkC,UAAU,KAAK,OAAO,SAAS,MAAM,KAAK,KAAK,iBAAiB;KAHlH,UAAA;MAKG,QAAQ,KAAK;MACb,UAAU,MAAM,WAAW,KAAA,KAAa,MAAM,KAAK,WAAW,IAC7D,oBAAC,OAAD;OAAK,WAAU;OAAgG,UAAA;MAE1G,CAAA,IACH;MACH,MAAM,KAAK,KAAK,QACf,oBAAC,gBAAD;OAEE,WAAW,SAAS,KAAK,QAAQ,WAAW,GAAG,GAAG,KAAK,IAAI,KAAA;OAC3D,YAAY,UAAU,KAAK,OAAO,OAAO,WAAW,GAAG,GAAG;OACrD;OACL,QAAQ,SAAS,GAAG;OACF;OACH;OACf,SAAS,aAAa,GAAG;OACpB;OACL,aAAa,WAAW,KAAK,OAAO,YAAY;OAChD,aAAa,OAAO,YAAY;OAChC,WAAW,OAAO;OAClB,QAAQ,OAAO;OACf,OAAO,OAAO;OACA;OACJ;OACA;OACA;OACM;OACP;OACS;OACJ;OACF;OACG;OACF;OACM;MACpB,GA1BM,WAAW,GAAG,CA0BpB,CACF;KACE;IAxCE,GAAA,MAAM,GAwCR,CACN,GACA,SAAS,oBAAC,gBAAD,EAAgB,eAAe,gBAAgB,KAAK,OAAO,CAAC,EAAI,CAAA,IAAI,IAC3E;;EAEJ;;AAET;AAEA,SAAS,UAAU,KAA6B,OAA+D;CAC7G,MAAM,OAAO,KAAK,KAAK,SAAS;CAChC,OAAO,MAAM,SAAS,UAAU,QAAQ,KAAK,QAAQ,KAAA;AACvD;AA8BA,SAAS,eAAe,EACtB,KACA,WACA,YACA,QACA,SACA,kBACA,eACA,KACA,aACA,cAAc,MACd,WACA,QACA,OACA,cACA,UACA,UACA,UACA,gBACA,SACA,kBACA,cACA,YACA,eACA,aACA,qBACsB;CACtB,MAAM,EAAE,SAAS;CACjB,MAAM,CAAC,SAAS,cAAc,SAAS,KAAK;CAE5C,MAAM,OACJ,oBAAC,aAAD;EACO;EACL,QAAQ,WAAW;EACnB,eAAe,SAAU,iBAAiB,mBAAoB,KAAA;EACzD;EACQ;EACA;EACF;EACH;EACD;EACO;EACd,WAAW,cAAc,WAAW,KAAK,SAAS;EAClD,kBAAkB,oBAAoB,OAAO,iBAAiB,KAAK,EAAE,IAAI,KAAA;EACzE,cAAc,gBAAgB,SAAS,aAAa,KAAK,IAAI,IAAI,KAAA;EACjE,YAAY,cAAc,OAAO,WAAW,KAAK,EAAE,IAAI,KAAA;EACvD,eAAe,iBAAiB,OAAO,cAAc,KAAK,EAAE,IAAI,KAAA;EAChE,aAAa,eAAe,OAAO,YAAY,KAAK,EAAE,IAAI,KAAA;EAC1D,mBAAmB,qBAAqB,IAAI,YAAY,kBAAkB,KAAK,IAAI,OAAO,IAAI,KAAA;EAC9F,UAAU,YAAY,UAAU,SAAS,KAAK,KAAK,IAAI,KAAA;EACvD,UAAU,YAAY,KAAA,IAAY,aAAa;EAC/C,SAAS,YAAY,KAAA,IAAY,UAAU,KAAA;EAC3C,iBAAiB,YAAY,KAAA,IAAY,aAAa,KAAA;EACtD,SACE,WACE,qBAAA,YAAA,EAAA,UAAA;GACG,YAAY,CAAC,UACZ,oBAAC,WAAD;IAAW,OAAM;IAAiB,eAAe,WAAW,IAAI;IAC9D,UAAA,oBAAC,QAAD,EAAQ,WAAU,mBAAoB,CAAA;GAC7B,CAAA,IACT;GACH,kBAAkB,KAAK,cAAc,eACpC,oBAAC,WAAD;IACE,OAAM;IACN,OAAM;IACN,eAAe,eAAe,GAAG;IAEjC,UAAA,oBAAC,QAAD,EAAQ,WAAU,mBAAoB,CAAA;GAC7B,CAAA,IACT;GACH,WAAW,KAAK,cAAc,eAAe,KAAK,WAAW,UAAU,CAAC,KAAK,eAC5E,oBAAC,WAAD;IACE,OAAM;IACN,OAAM;IACN,eAAe,QAAQ,GAAG;IAE1B,UAAA,oBAAC,WAAD,EAAW,WAAU,mBAAoB,CAAA;GAChC,CAAA,IACT;GACH,WACC,oBAAC,WAAD;IAAW,OAAM;IAAgB,eAAe,SAAS,GAAG;IAC1D,UAAA,oBAAC,QAAD,EAAQ,WAAU,mBAAoB,CAAA;GAC7B,CAAA,IACT;EACJ,EAAA,CAAA;CAGP,CAAA;CAEH,IAAI,CAAC,WACH,OAAO;CAET,OACE,oBAAC,OAAD;EAAK,GAAI;EAAW,WAAW,GAAG,cAAc,cAAc,8CAA8C;EACzG,UAAA;CACE,CAAA;AAET;AAEA,SAAS,UAAU,EAAE,OAAO,OAAO,SAAS,YAAyF;CACnI,OACE,oBAAC,QAAD;EACE,SAAQ;EACR,MAAK;EACL,cAAY;EACZ,OAAO,SAAS;EAChB,WAAU;EACV,UAAU,MAAM;GACd,EAAE,gBAAgB;GAClB,QAAQ;EACV;EAEC;CACK,CAAA;AAEZ;AAEA,SAAgB,cAAc,EAC5B,OACA,UACA,WACA,WACA,kBAOC;CACD,OACE,qBAAC,OAAD;EAAK,WAAW,GAAG,YAAY,SAAS;EAAxC,UAAA;GACE,oBAAC,QAAD,EAAQ,WAAU,oFAAqF,CAAA;GACvG,oBAAC,OAAD;IACS;IACP,WAAW,MAAM,SAAS,EAAE,OAAO,KAAK;IACxC,YAAY,MAAM;KAChB,IAAI,EAAE,QAAQ,YAAY,OAAO;MAC/B,EAAE,gBAAgB;MAClB,SAAS,EAAE;KACb;IACF;IACA,aAAY;IACZ,cAAW;IACA;IACX,WAAW,GAAG,aAAa,cAAc;GAC1C,CAAA;GACA,QACC,oBAAC,UAAD;IACE,MAAK;IACL,cAAW;IACX,eAAe,SAAS,EAAE;IAC1B,WAAU;IAEV,UAAA,oBAAC,GAAD,EAAG,WAAU,SAAU,CAAA;GACjB,CAAA,IACN;EACD;;AAET;;;ACpbA,MAAa,yBAAqD;CAAC;CAAO;CAAU;AAAM;AAE1F,MAAa,wBAAkF;CAC7F,KAAK;EAAE,OAAO;EAAkB,MAAM;CAA0B;CAChE,QAAQ;EAAE,OAAO;EAAkB,MAAM;CAAwC;CACjF,MAAM;EAAE,OAAO;EAAmB,MAAM;CAAoB;AAC9D;AAEA,MAAM,aAAa;AAInB,SAAgB,oBAAoB,EAAE,OAAO,aAA6D;CACxG,OACE,qBAAC,OAAD;EACE,SAAQ;EACR,MAAK;EACL,QAAO;EACP,aAAa;EACb,eAAc;EACd,gBAAe;EACf,eAAY;EACD;EARb,UAAA;GAUE,oBAAC,QAAD,EAAM,GAAE,UAAW,CAAA;GACnB,oBAAC,QAAD;IAAM,GAAE;IAAW,SAAS,UAAU,SAAS,aAAa;GAAI,CAAA;GAChE,oBAAC,QAAD;IAAM,GAAE;IAAW,SAAS,UAAU,QAAQ,IAAI;GAAa,CAAA;EAC5D;;AAET;AAUA,SAAgB,eAAe,EAAE,OAAO,UAAU,aAAkC;CAClF,MAAM,OAAO,sBAAsB;CACnC,OACE,qBAAC,MAAD,EAAA,UAAA,CACE,oBAAC,aAAD,EACE,QACE,qBAAC,QAAD;EACE,SAAQ;EACR,MAAK;EACL,cAAY,eAAe,KAAK;EAChC,OAAO,KAAK;EACZ,WAAW,GAAG,eAAe,SAAS;EALxC,UAAA,CAOE,oBAAC,qBAAD;GAA4B;GAAO,WAAU;EAAU,CAAA,GACvD,oBAAC,aAAD,EAAa,WAAU,qBAAsB,CAAA,CACvC;CAEX,CAAA,EAAA,CAAA,GACD,oBAAC,aAAD;EAAa,WAAU;EACpB,UAAA,uBAAuB,KAAK,WAC3B,qBAAC,UAAD;GAAuB,eAAe,SAAS,MAAM;GAArD,UAAA;IACE,oBAAC,qBAAD;KAAqB,OAAO;KAAQ,WAAU;IAA6B,CAAA;IAC3E,oBAAC,QAAD;KAAM,WAAU;KAAU,UAAA,sBAAsB,OAAO,CAAC;IAAY,CAAA;IACnE,WAAW,QAAQ,oBAAC,OAAD,EAAO,WAAU,gCAAiC,CAAA,IAAI;GAClE;EAJK,GAAA,MAIL,CACX;CACU,CAAA,CACT,EAAA,CAAA;AAEV"}
1
+ {"version":3,"file":"index.mjs","names":["AlertDialogPrimitive","PopoverPrimitive","SonnerToaster","Map","ImageIcon"],"sources":["../src/components/ui/Card.tsx","../src/components/ui/AlertDialog.tsx","../src/components/ui/Popover.tsx","../src/components/ui/Sonner.tsx","../src/components/ui/Empty.tsx","../src/components/prompt-area/segment-helpers.ts","../src/components/terminal/StatusLine.tsx","../src/components/agent/TaskList.tsx","../src/components/agent/TasksDialog.tsx","../src/components/agent/SessionList.tsx","../src/components/agent/EngineIcon.tsx","../src/components/agent/SessionStatusIcon.tsx","../src/components/agent/AgentAvatar.tsx","../src/components/agent/ProjectIcon.tsx","../src/components/agent/SessionFilters.tsx","../src/components/agent/ContextRing.tsx","../src/components/agent/SessionSteps.tsx","../src/components/agent/SessionItem.tsx","../src/lib/team-drop.ts","../src/components/agent/SessionGroups.tsx","../src/components/agent/SessionBrowser.tsx","../src/components/agent/SubagentToggle.tsx"],"sourcesContent":["import { type HTMLAttributes } from 'react'\nimport { cn } from '../../lib/utils.ts'\n\nexport function Card({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return <div data-slot=\"card\" className={cn('rounded-lg border border-border bg-surface', className)} {...props} />\n}\n\nexport function CardHeader({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return <div className={cn('flex items-start justify-between gap-3 px-4 pt-3.5 pb-3', className)} {...props} />\n}\n\nexport function CardTitle({ className, ...props }: HTMLAttributes<HTMLHeadingElement>) {\n return <h3 className={cn('text-heading-3 font-semibold text-text', className)} {...props} />\n}\n\nexport function CardContent({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return <div className={cn('px-4 pb-4', className)} {...props} />\n}\n","import { type FunctionComponent } from 'react'\nimport { AlertDialog as AlertDialogPrimitive } from '@base-ui/react/alert-dialog'\nimport { cn } from '../../lib/utils.ts'\nimport { PortalScope } from './PortalScope.tsx'\n\nexport const AlertDialog = AlertDialogPrimitive.Root\nexport const AlertDialogTrigger = AlertDialogPrimitive.Trigger\nexport const AlertDialogClose = AlertDialogPrimitive.Close\n\nexport const AlertDialogContent: FunctionComponent<AlertDialogPrimitive.Popup.Props> = ({ className, children, ...props }) => (\n <AlertDialogPrimitive.Portal>\n <PortalScope>\n <AlertDialogPrimitive.Backdrop\n className={cn(\n 'fixed inset-0 z-70 bg-black/40 backdrop-blur-[1px]',\n 'transition-opacity duration-(--motion-base)',\n 'data-starting-style:opacity-0 data-ending-style:opacity-0',\n )}\n />\n <AlertDialogPrimitive.Popup\n data-slot=\"alert-dialog-content\"\n className={cn(\n 'fixed top-1/2 left-1/2 z-70 w-[min(28rem,calc(100vw-2rem))] -translate-x-1/2 -translate-y-1/2',\n 'rounded-lg border border-border bg-surface p-5 shadow-(--shadow-lg) outline-none',\n 'transition-[opacity,transform] duration-(--motion-base)',\n 'data-starting-style:scale-95 data-starting-style:opacity-0',\n 'data-ending-style:scale-95 data-ending-style:opacity-0',\n className,\n )}\n {...props}\n >\n {children}\n </AlertDialogPrimitive.Popup>\n </PortalScope>\n </AlertDialogPrimitive.Portal>\n)\n\nexport const AlertDialogTitle: FunctionComponent<AlertDialogPrimitive.Title.Props> = ({ className, ...props }) => (\n <AlertDialogPrimitive.Title className={cn('text-heading-3 font-semibold text-text', className)} {...props} />\n)\n\nexport const AlertDialogDescription: FunctionComponent<AlertDialogPrimitive.Description.Props> = ({ className, ...props }) => (\n <AlertDialogPrimitive.Description className={cn('mt-1.5 text-body-sm text-muted-foreground', className)} {...props} />\n)\n","import { type FunctionComponent } from 'react'\nimport { Popover as PopoverPrimitive } from '@base-ui/react/popover'\nimport { cn } from '../../lib/utils.ts'\nimport { PortalScope } from './PortalScope.tsx'\n\nexport const Popover = PopoverPrimitive.Root\nexport const PopoverTrigger = PopoverPrimitive.Trigger\n\nexport const PopoverContent: FunctionComponent<\n PopoverPrimitive.Popup.Props & Pick<PopoverPrimitive.Positioner.Props, 'align' | 'side' | 'sideOffset'>\n> = ({ className, align = 'end', side = 'bottom', sideOffset = 6, ...props }) => (\n <PopoverPrimitive.Portal>\n <PortalScope>\n <PopoverPrimitive.Positioner align={align} side={side} sideOffset={sideOffset} className=\"isolate z-80 outline-none\">\n <PopoverPrimitive.Popup\n data-slot=\"popover-content\"\n className={cn(\n 'rounded-md border border-border bg-surface p-2 text-fg-1 shadow-(--shadow-lg) outline-none',\n 'transition-[opacity,transform] duration-(--motion-base)',\n 'data-starting-style:scale-95 data-starting-style:opacity-0',\n 'data-ending-style:scale-95 data-ending-style:opacity-0',\n className,\n )}\n {...props}\n />\n </PopoverPrimitive.Positioner>\n </PortalScope>\n </PopoverPrimitive.Portal>\n)\n","import { Toaster as SonnerToaster, toast } from 'sonner'\n\nexport { toast }\n\nexport function Toaster() {\n return (\n <SonnerToaster\n position=\"bottom-right\"\n toastOptions={{\n style: {\n background: 'var(--surface)',\n color: 'var(--text)',\n border: '1px solid var(--border)',\n boxShadow: 'var(--shadow-md)',\n fontFamily: 'var(--cw-font-sans)',\n fontSize: 'var(--text-body-sm)',\n },\n }}\n />\n )\n}\n","import type { ReactNode } from 'react'\nimport { Button } from './Button.tsx'\n\nexport function Empty({\n icon,\n title,\n description,\n action,\n onAction,\n}: {\n icon: ReactNode\n title: string\n description?: ReactNode\n action?: string\n onAction?: () => void\n}) {\n return (\n <div className=\"flex flex-col items-center gap-2 px-5 py-8 text-center\">\n <div className=\"text-fg-4 opacity-60 [&_svg]:size-7\">{icon}</div>\n <p className=\"text-body-sm font-medium text-fg-2\">{title}</p>\n {description ? <p className=\"max-w-[26ch] text-balance text-label leading-relaxed text-fg-4\">{description}</p> : null}\n {action && onAction ? (\n <Button variant=\"outline\" size=\"sm\" className=\"mt-1\" onClick={onAction}>\n {action}\n </Button>\n ) : null}\n </div>\n )\n}\n\nexport function EmptyKey({ children }: { children: ReactNode }) {\n return <span className=\"rounded border border-border px-1 font-mono text-fg-3\">{children}</span>\n}\n","/**\n * Convenience helpers for creating and inspecting Segments.\n *\n * These reduce boilerplate when building AI chat UIs that work with the\n * PromptArea document model.\n *\n * @example\n * ```ts\n * import { text, chip, isSegmentsEmpty, segmentsToPlainText } from './segment-helpers.ts'\n *\n * const greeting = [text('Hello '), chip({ trigger: '@', value: 'u1', displayText: 'Alice' })]\n * isSegmentsEmpty(greeting) // false\n * segmentsToPlainText(greeting) // \"Hello @Alice\"\n * ```\n */\n\nimport type { Segment, TextSegment, ChipSegment } from './types.ts'\nimport { segmentsToPlainText, plainTextToSegments } from './prompt-area-engine.ts'\n\n// Re-export serialization utilities so consumers have a single import.\nexport { segmentsToPlainText, plainTextToSegments }\n\n/** Create a text segment. */\nexport function text(value: string): TextSegment {\n return { type: 'text', text: value }\n}\n\n/** Create a chip segment. */\nexport function chip(opts: Omit<ChipSegment, 'type'>): ChipSegment {\n return { type: 'chip', ...opts }\n}\n\n/** Returns `true` when the segment array is empty or contains only whitespace text. */\nexport function isSegmentsEmpty(segments: Segment[]): boolean {\n if (segments.length === 0) {\n return true\n }\n return segments.every((seg) => seg.type === 'text' && seg.text.trim() === '')\n}\n\n/** Returns `true` when the segment array contains at least one chip. */\nexport function hasChips(segments: Segment[]): boolean {\n return segments.some((seg) => seg.type === 'chip')\n}\n\n/** Extracts all chip segments from a segment array. */\nexport function getChips(segments: Segment[]): ChipSegment[] {\n return segments.filter((seg): seg is ChipSegment => seg.type === 'chip')\n}\n\n/** Extracts chips matching a specific trigger character. */\nexport function getChipsByTrigger(segments: Segment[], trigger: string): ChipSegment[] {\n return segments.filter((seg): seg is ChipSegment => seg.type === 'chip' && seg.trigger === trigger)\n}\n","import type { RateLimitInfo } from '@workerdeck/protocol'\nimport type { ConnectionState, TranscriptState } from '@workerdeck/react'\nimport { formatCost, formatTokens } from '../../lib/format.ts'\nimport {\n contextSeverity,\n meterSeverity,\n modelLabel,\n statusPresentation,\n tightestWindow,\n windowLabel,\n type StatusSeverity,\n} from '../../lib/status.ts'\nimport { Ink, Row, type Tone } from './row.tsx'\n\nconst SEVERITY_TONE: Record<StatusSeverity, Tone> = {\n none: 'dim',\n warning: 'yellow',\n error: 'red',\n}\n\nexport interface TerminalStatusLineProps {\n className?: string\n state: TranscriptState\n rateLimits?: Record<string, RateLimitInfo>\n connection?: ConnectionState\n onOpenStatus?: () => void\n onOpenContext?: () => void\n onOpenUsage?: () => void\n}\n\nfunction Reading({ tone, onPress, label, children }: { tone?: Tone; onPress?: () => void; label?: string; children: React.ReactNode }) {\n if (!onPress) {\n return <Ink tone={tone}>{children}</Ink>\n }\n return (\n <button type=\"button\" className=\"term-reading\" onClick={onPress} title={label}>\n <Ink tone={tone}>{children}</Ink>\n </button>\n )\n}\n\nexport function TerminalStatusLine({\n className,\n state,\n rateLimits,\n connection,\n onOpenStatus,\n onOpenContext,\n onOpenUsage,\n}: TerminalStatusLineProps) {\n const presentation = statusPresentation({ status: state.status, connection })\n const usage = state.contextUsage\n const window = tightestWindow(rateLimits ?? state.rateLimits)\n const model = modelLabel({ model: state.model, models: state.models ?? [] })\n\n const parts: React.ReactNode[] = [\n <Reading key=\"status\" tone={SEVERITY_TONE[presentation.severity]} onPress={onOpenStatus} label=\"Session status\">\n {presentation.label}\n </Reading>,\n ]\n\n if (usage) {\n parts.push(\n <Reading key=\"context\" tone={SEVERITY_TONE[contextSeverity(usage)]} onPress={onOpenContext} label=\"Context window\">\n {Math.round(usage.percentage)}% ctx ({formatTokens(usage.totalTokens)})\n </Reading>,\n )\n }\n\n if (window) {\n parts.push(\n <Reading key=\"usage\" tone={SEVERITY_TONE[meterSeverity(window.info.utilization)]} onPress={onOpenUsage} label=\"Plan usage\">\n {Math.round(window.info.utilization ?? 0)}% {windowLabel(window.key)}\n </Reading>,\n )\n }\n\n const costUsd = state.costUsd ?? (state.totalCostUsd || undefined)\n if (costUsd !== undefined && costUsd > 0) {\n parts.push(\n <Ink key=\"cost\" tone=\"faint\">\n {formatCost(costUsd)}\n </Ink>,\n )\n }\n\n if (model) {\n parts.push(\n <Ink key=\"model\" tone=\"faint\">\n {model}\n </Ink>,\n )\n }\n if (state.permissionMode && state.permissionMode !== 'default') {\n parts.push(\n <Ink key=\"mode\" tone=\"yellow\">\n {state.permissionMode}\n </Ink>,\n )\n }\n\n return (\n <Row data-slot=\"status-line\" tone=\"dim\" className={className}>\n {parts.map((part, index) => (\n <span key={index}>\n {index > 0 ? <Ink tone=\"faint\"> · </Ink> : null}\n {part}\n </span>\n ))}\n </Row>\n )\n}\n","import { ArrowRight, Check, CircleAlert, Circle } from 'lucide-react'\nimport { taskSummary, visibleTasks } from '@workerdeck/protocol'\nimport type { SessionTask } from '@workerdeck/protocol'\nimport { Spinner } from '../ui/Spinner.tsx'\nimport { cn } from '../../lib/utils.ts'\n\nexport interface TaskListProps {\n tasks: readonly SessionTask[]\n showCompleted: boolean\n // Absent where the toggle lives outside this list - VS Code puts it in the view's title bar.\n onShowCompletedChange?: (showCompleted: boolean) => void\n onSelectTask?: (task: SessionTask) => void\n className?: string\n}\n\nexport function TaskList({ tasks, showCompleted, onShowCompletedChange, onSelectTask, className }: TaskListProps) {\n const summary = taskSummary(tasks)\n const shown = visibleTasks(tasks, showCompleted)\n const hidden = tasks.length - shown.length\n return (\n <div className={cn('flex flex-col', className)}>\n <div className=\"flex items-baseline justify-between gap-4 pb-1.5\">\n <span className=\"text-label text-fg-3\">\n {summary.done} of {summary.total} done\n {summary.failed > 0 ? ` · ${summary.failed} failed` : ''}\n </span>\n {summary.done > 0 && onShowCompletedChange ? (\n <button\n type=\"button\"\n onClick={() => onShowCompletedChange(!showCompleted)}\n className=\"shrink-0 rounded-[4px] px-1 py-0.5 text-label text-fg-4 outline-none hover:bg-row-hover hover:text-fg-2\"\n >\n {showCompleted ? 'Hide completed' : `Show completed (${summary.done})`}\n </button>\n ) : null}\n </div>\n {shown.length === 0 ? (\n <p className=\"py-6 text-center text-body-sm text-fg-4\">\n {tasks.length === 0 ? 'No tasks yet - a checklist appears once the agent plans one.' : `${hidden} completed, all hidden.`}\n </p>\n ) : (\n <div className=\"flex flex-col\">\n {shown.map((task) => (\n <TaskRow key={task.key} task={task} onSelect={onSelectTask} />\n ))}\n </div>\n )}\n </div>\n )\n}\n\nfunction TaskRow({ task, onSelect }: { task: SessionTask; onSelect?: (task: SessionTask) => void }) {\n const pressable = onSelect !== undefined && task.toolUseId !== undefined\n const body = task.state === 'failed' ? 'text-danger' : task.state === 'done' ? 'text-fg-4' : 'text-fg-2'\n const row = (\n <>\n <TaskIcon state={task.state} />\n <span className={cn('min-w-0 flex-1 truncate text-left', task.state === 'done' ? 'line-through' : undefined)}>{task.label}</span>\n {task.detail ? <span className=\"shrink-0 tabular-nums text-fg-4\">{task.detail}</span> : null}\n {pressable ? <ArrowRight className=\"size-3.5 shrink-0 text-fg-4\" /> : null}\n </>\n )\n const className = cn('flex w-full items-center gap-1.5 rounded-[4px] px-1.5 py-1 text-body-sm outline-none', body)\n if (!pressable) {\n return <div className={className}>{row}</div>\n }\n return (\n <button type=\"button\" title={task.label} onClick={() => onSelect(task)} className={cn(className, 'hover:bg-row-active')}>\n {row}\n </button>\n )\n}\n\nfunction TaskIcon({ state }: { state: SessionTask['state'] }) {\n switch (state) {\n case 'running': {\n return <Spinner className=\"size-[13px] shrink-0\" />\n }\n case 'failed': {\n return <CircleAlert className=\"size-[13px] shrink-0\" />\n }\n case 'done': {\n return <Check className=\"size-[13px] shrink-0\" />\n }\n default: {\n return <Circle className=\"size-[13px] shrink-0 text-fg-4\" />\n }\n }\n}\n","import type { SessionTask } from '@workerdeck/protocol'\nimport { Dialog, DialogBody, DialogContent, DialogHeader } from '../ui/Dialog.tsx'\nimport { TaskList } from './TaskList.tsx'\n\nexport interface TasksDialogProps {\n tasks: readonly SessionTask[]\n showCompleted: boolean\n onShowCompletedChange: (showCompleted: boolean) => void\n onSelectTask?: (task: SessionTask) => void\n open: boolean\n onOpenChange: (open: boolean) => void\n className?: string\n}\n\nexport function TasksDialog({\n tasks,\n showCompleted,\n onShowCompletedChange,\n onSelectTask,\n open,\n onOpenChange,\n className,\n}: TasksDialogProps) {\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className={className}>\n <DialogHeader title=\"Tasks\" description=\"The agent's checklist and the tasks it has spawned\" />\n <DialogBody>\n <TaskList\n tasks={tasks}\n showCompleted={showCompleted}\n onShowCompletedChange={onShowCompletedChange}\n onSelectTask={\n onSelectTask\n ? (task) => {\n onOpenChange(false)\n onSelectTask(task)\n }\n : undefined\n }\n />\n </DialogBody>\n </DialogContent>\n </Dialog>\n )\n}\n","import type { SessionInfo } from '@workerdeck/protocol'\nimport { Trash2 } from 'lucide-react'\nimport { Badge } from '../ui/Badge.tsx'\nimport { Button } from '../ui/Button.tsx'\nimport { cn } from '../../lib/utils.ts'\nimport { formatCost, formatRelativeTime } from '../../lib/format.ts'\nimport { STATUS_META } from './status.ts'\n\nexport interface SessionListItemProps {\n session: SessionInfo\n active?: boolean\n onSelect?: (id: string) => void\n onDelete?: (id: string) => void\n className?: string\n}\n\nexport function SessionListItem({ session, active, onSelect, onDelete, className }: SessionListItemProps) {\n const meta = STATUS_META[session.status]\n return (\n <div\n data-slot=\"session-list-item\"\n data-active={active || undefined}\n className={cn(\n 'group flex w-full items-center gap-2 rounded-md border border-transparent px-2.5 py-2 text-left transition-colors',\n active ? 'border-border bg-surface' : 'hover:bg-surface-hover',\n className,\n )}\n >\n <button type=\"button\" onClick={() => onSelect?.(session.id)} className=\"min-w-0 flex-1 text-left outline-none\">\n <div className=\"flex items-center gap-2\">\n <span className=\"truncate text-body-sm font-medium text-fg-1\">{session.title ?? session.id.slice(0, 8)}</span>\n <Badge variant={meta.variant} dot className=\"shrink-0\">\n {meta.label}\n </Badge>\n </div>\n <div className=\"mt-0.5 flex items-center gap-2 font-mono text-label text-fg-4\">\n <span className=\"truncate\">{session.cwd}</span>\n {session.profile ? <span className=\"shrink-0\">@{session.profile}</span> : null}\n <span className=\"shrink-0\">{formatCost(session.costUsd ?? session.totalCostUsd)}</span>\n <span className=\"shrink-0\">{formatRelativeTime(session.lastActivityAt ?? session.createdAt)}</span>\n </div>\n </button>\n {onDelete ? (\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label=\"Close session\"\n className=\"opacity-0 transition-opacity group-hover:opacity-100\"\n onClick={() => onDelete(session.id)}\n >\n <Trash2 className=\"size-3.5 text-fg-3\" />\n </Button>\n ) : null}\n </div>\n )\n}\n\nexport interface SessionListProps {\n sessions: SessionInfo[]\n activeId?: string\n onSelect?: (id: string) => void\n onDelete?: (id: string) => void\n emptyText?: string\n className?: string\n}\n\nexport function SessionList({ sessions, activeId, onSelect, onDelete, emptyText = 'No sessions yet.', className }: SessionListProps) {\n return (\n <div data-slot=\"session-list\" className={cn('flex flex-col gap-1', className)}>\n {sessions.length === 0 ? (\n <div className=\"px-2.5 py-6 text-center text-body-sm text-fg-4\">{emptyText}</div>\n ) : (\n sessions.map((session) => (\n <SessionListItem key={session.id} session={session} active={session.id === activeId} onSelect={onSelect} onDelete={onDelete} />\n ))\n )}\n </div>\n )\n}\n","import { cn } from '../../lib/utils.ts'\n\n// Paths from `@lobehub/icons-static-svg` (MIT, © LobeHub), inlined. The marks are trademarks of their owners, used only to identify a session's engine.\nconst PATHS: Record<string, { title: string; d: string }> = {\n claude: {\n title: 'Claude',\n d: 'M4.709 15.955l4.72-2.647.08-.23-.08-.128H9.2l-.79-.048-2.698-.073-2.339-.097-2.266-.122-.571-.121L0 11.784l.055-.352.48-.321.686.06 1.52.103 2.278.158 1.652.097 2.449.255h.389l.055-.157-.134-.098-.103-.097-2.358-1.596-2.552-1.688-1.336-.972-.724-.491-.364-.462-.158-1.008.656-.722.881.06.225.061.893.686 1.908 1.476 2.491 1.833.365.304.145-.103.019-.073-.164-.274-1.355-2.446-1.446-2.49-.644-1.032-.17-.619a2.97 2.97 0 01-.104-.729L6.283.134 6.696 0l.996.134.42.364.62 1.414 1.002 2.229 1.555 3.03.456.898.243.832.091.255h.158V9.01l.128-1.706.237-2.095.23-2.695.08-.76.376-.91.747-.492.584.28.48.685-.067.444-.286 1.851-.559 2.903-.364 1.942h.212l.243-.242.985-1.306 1.652-2.064.73-.82.85-.904.547-.431h1.033l.76 1.129-.34 1.166-1.064 1.347-.881 1.142-1.264 1.7-.79 1.36.073.11.188-.02 2.856-.606 1.543-.28 1.841-.315.833.388.091.395-.328.807-1.969.486-2.309.462-3.439.813-.042.03.049.061 1.549.146.662.036h1.622l3.02.225.79.522.474.638-.079.485-1.215.62-1.64-.389-3.829-.91-1.312-.329h-.182v.11l1.093 1.068 2.006 1.81 2.509 2.33.127.578-.322.455-.34-.049-2.205-1.657-.851-.747-1.926-1.62h-.128v.17l.444.649 2.345 3.521.122 1.08-.17.353-.608.213-.668-.122-1.374-1.925-1.415-2.167-1.143-1.943-.14.08-.674 7.254-.316.37-.729.28-.607-.461-.322-.747.322-1.476.389-1.924.315-1.53.286-1.9.17-.632-.012-.042-.14.018-1.434 1.967-2.18 2.945-1.726 1.845-.414.164-.717-.37.067-.662.401-.589 2.388-3.036 1.44-1.882.93-1.086-.006-.158h-.055L4.132 18.56l-1.13.146-.487-.456.061-.746.231-.243 1.908-1.312-.006.006z',\n },\n codex: {\n title: 'OpenAI',\n d: 'M9.205 8.658v-2.26c0-.19.072-.333.238-.428l4.543-2.616c.619-.357 1.356-.523 2.117-.523 2.854 0 4.662 2.212 4.662 4.566 0 .167 0 .357-.024.547l-4.71-2.759a.797.797 0 00-.856 0l-5.97 3.473zm10.609 8.8V12.06c0-.333-.143-.57-.429-.737l-5.97-3.473 1.95-1.118a.433.433 0 01.476 0l4.543 2.617c1.309.76 2.189 2.378 2.189 3.948 0 1.808-1.07 3.473-2.76 4.163zM7.802 12.703l-1.95-1.142c-.167-.095-.239-.238-.239-.428V5.899c0-2.545 1.95-4.472 4.591-4.472 1 0 1.927.333 2.712.928L8.23 5.067c-.285.166-.428.404-.428.737v6.898zM12 15.128l-2.795-1.57v-3.33L12 8.658l2.795 1.57v3.33L12 15.128zm1.796 7.23c-1 0-1.927-.332-2.712-.927l4.686-2.712c.285-.166.428-.404.428-.737v-6.898l1.974 1.142c.167.095.238.238.238.428v5.233c0 2.545-1.974 4.472-4.614 4.472zm-5.637-5.303l-4.544-2.617c-1.308-.761-2.188-2.378-2.188-3.948A4.482 4.482 0 014.21 6.327v5.423c0 .333.143.571.428.738l5.947 3.449-1.95 1.118a.432.432 0 01-.476 0zm-.262 3.9c-2.688 0-4.662-2.021-4.662-4.519 0-.19.024-.38.047-.57l4.686 2.71c.286.167.571.167.856 0l5.97-3.448v2.26c0 .19-.07.333-.237.428l-4.543 2.616c-.619.357-1.356.523-2.117.523zm5.899 2.83a5.947 5.947 0 005.827-4.756C22.287 18.339 24 15.84 24 13.296c0-1.665-.713-3.282-1.998-4.448.119-.5.19-.999.19-1.498 0-3.401-2.759-5.947-5.946-5.947-.642 0-1.26.095-1.88.31A5.962 5.962 0 0010.205 0a5.947 5.947 0 00-5.827 4.757C1.713 5.447 0 7.945 0 10.49c0 1.666.713 3.283 1.998 4.448-.119.5-.19 1-.19 1.499 0 3.401 2.759 5.946 5.946 5.946.642 0 1.26-.095 1.88-.309a5.96 5.96 0 004.162 1.713z',\n },\n gemini: {\n title: 'Gemini',\n d: 'M20.616 10.835a14.147 14.147 0 01-4.45-3.001 14.111 14.111 0 01-3.678-6.452.503.503 0 00-.975 0 14.134 14.134 0 01-3.679 6.452 14.155 14.155 0 01-4.45 3.001c-.65.28-1.318.505-2.002.678a.502.502 0 000 .975c.684.172 1.35.397 2.002.677a14.147 14.147 0 014.45 3.001 14.112 14.112 0 013.679 6.453.502.502 0 00.975 0c.172-.685.397-1.351.677-2.003a14.145 14.145 0 013.001-4.45 14.113 14.113 0 016.453-3.678.503.503 0 000-.975 13.245 13.245 0 01-2.003-.678z',\n },\n deepseek: {\n title: 'DeepSeek',\n d: 'M23.748 4.482c-.254-.124-.364.113-.512.234-.051.039-.094.09-.137.136-.372.397-.806.657-1.373.626-.829-.046-1.537.214-2.163.848-.133-.782-.575-1.248-1.247-1.548-.352-.156-.708-.311-.955-.65-.172-.241-.219-.51-.305-.774-.055-.16-.11-.323-.293-.35-.2-.031-.278.136-.356.276-.313.572-.434 1.202-.422 1.84.027 1.436.633 2.58 1.838 3.393.137.093.172.187.129.323-.082.28-.18.552-.266.833-.055.179-.137.217-.329.14a5.526 5.526 0 01-1.736-1.18c-.857-.828-1.631-1.742-2.597-2.458a11.365 11.365 0 00-.689-.471c-.985-.957.13-1.743.388-1.836.27-.098.093-.432-.779-.428-.872.004-1.67.295-2.687.684a3.055 3.055 0 01-.465.137 9.597 9.597 0 00-2.883-.102c-1.885.21-3.39 1.102-4.497 2.623C.082 8.606-.231 10.684.152 12.85c.403 2.284 1.569 4.175 3.36 5.653 1.858 1.533 3.997 2.284 6.438 2.14 1.482-.085 3.133-.284 4.994-1.86.47.234.962.327 1.78.397.63.059 1.236-.03 1.705-.128.735-.156.684-.837.419-.961-2.155-1.004-1.682-.595-2.113-.926 1.096-1.296 2.746-2.642 3.392-7.003.05-.347.007-.565 0-.845-.004-.17.035-.237.23-.256a4.173 4.173 0 001.545-.475c1.396-.763 1.96-2.015 2.093-3.517.02-.23-.004-.467-.247-.588zM11.581 18c-2.089-1.642-3.102-2.183-3.52-2.16-.392.024-.321.471-.235.763.09.288.207.486.371.739.114.167.192.416-.113.603-.673.416-1.842-.14-1.897-.167-1.361-.802-2.5-1.86-3.301-3.307-.774-1.393-1.224-2.887-1.298-4.482-.02-.386.093-.522.477-.592a4.696 4.696 0 011.529-.039c2.132.312 3.946 1.265 5.468 2.774.868.86 1.525 1.887 2.202 2.891.72 1.066 1.494 2.082 2.48 2.914.348.292.625.514.891.677-.802.09-2.14.11-3.054-.614zm1-6.44a.306.306 0 01.415-.287.302.302 0 01.2.288.306.306 0 01-.31.307.303.303 0 01-.304-.308zm3.11 1.596c-.2.081-.399.151-.59.16a1.245 1.245 0 01-.798-.254c-.274-.23-.47-.358-.552-.758a1.73 1.73 0 01.016-.588c.07-.327-.008-.537-.239-.727-.187-.156-.426-.199-.688-.199a.559.559 0 01-.254-.078c-.11-.054-.2-.19-.114-.358.028-.054.16-.186.192-.21.356-.202.767-.136 1.146.016.352.144.618.408 1.001.782.391.451.462.576.685.914.176.265.336.537.445.848.067.195-.019.354-.25.452z',\n },\n moonshot: {\n title: 'Moonshot',\n d: 'M1.052 16.916l9.539 2.552a21.007 21.007 0 00.06 2.033l5.956 1.593a11.997 11.997 0 01-5.586.865l-.18-.016-.044-.004-.084-.009-.094-.01a11.605 11.605 0 01-.157-.02l-.107-.014-.11-.016a11.962 11.962 0 01-.32-.051l-.042-.008-.075-.013-.107-.02-.07-.015-.093-.019-.075-.016-.095-.02-.097-.023-.094-.022-.068-.017-.088-.022-.09-.024-.095-.025-.082-.023-.109-.03-.062-.02-.084-.025-.093-.028-.105-.034-.058-.019-.08-.026-.09-.031-.066-.024a6.293 6.293 0 01-.044-.015l-.068-.025-.101-.037-.057-.022-.08-.03-.087-.035-.088-.035-.079-.032-.095-.04-.063-.028-.063-.027a5.655 5.655 0 01-.041-.018l-.066-.03-.103-.047-.052-.024-.096-.046-.062-.03-.084-.04-.086-.044-.093-.047-.052-.027-.103-.055-.057-.03-.058-.032a6.49 6.49 0 01-.046-.026l-.094-.053-.06-.034-.051-.03-.072-.041-.082-.05-.093-.056-.052-.032-.084-.053-.061-.039-.079-.05-.07-.047-.053-.035a7.785 7.785 0 01-.054-.036l-.044-.03-.044-.03a6.066 6.066 0 01-.04-.028l-.057-.04-.076-.054-.069-.05-.074-.054-.056-.042-.076-.057-.076-.059-.086-.067-.045-.035-.064-.052-.074-.06-.089-.073-.046-.039-.046-.039a7.516 7.516 0 01-.043-.037l-.045-.04-.061-.053-.07-.062-.068-.06-.062-.058-.067-.062-.053-.05-.088-.084a13.28 13.28 0 01-.099-.097l-.029-.028-.041-.042-.069-.07-.05-.051-.05-.053a6.457 6.457 0 01-.168-.179l-.08-.088-.062-.07-.071-.08-.042-.049-.053-.062-.058-.068-.046-.056a7.175 7.175 0 01-.027-.033l-.045-.055-.066-.082-.041-.052-.05-.064-.02-.025a11.99 11.99 0 01-1.44-2.402zm-1.02-5.794l11.353 3.037a20.468 20.468 0 00-.469 2.011l10.817 2.894a12.076 12.076 0 01-1.845 2.005L.657 15.923l-.016-.046-.035-.104a11.965 11.965 0 01-.05-.153l-.007-.023a11.896 11.896 0 01-.207-.741l-.03-.126-.018-.08-.021-.097-.018-.081-.018-.09-.017-.084-.018-.094c-.026-.141-.05-.283-.071-.426l-.017-.118-.011-.083-.013-.102a12.01 12.01 0 01-.019-.161l-.005-.047a12.12 12.12 0 01-.034-2.145zm1.593-5.15l11.948 3.196c-.368.605-.705 1.231-1.01 1.875l11.295 3.022c-.142.82-.368 1.612-.668 2.365l-11.55-3.09L.124 10.26l.015-.1.008-.049.01-.067.015-.087.018-.098c.026-.148.056-.295.088-.442l.028-.124.02-.085.024-.097c.022-.09.045-.18.07-.268l.028-.102.023-.083.03-.1.025-.082.03-.096.026-.082.031-.095a11.896 11.896 0 011.01-2.232zm4.442-4.4L17.352 4.59a20.77 20.77 0 00-1.688 1.721l7.823 2.093c.267.852.442 1.744.513 2.665L2.106 5.213l.045-.065.027-.04.04-.055.046-.065.055-.076.054-.072.064-.086.05-.065.057-.073.055-.07.06-.074.055-.069.065-.077.054-.066.066-.077.053-.06.072-.082.053-.06.067-.074.054-.058.073-.078.058-.06.063-.067.168-.17.1-.098.059-.056.076-.071a12.084 12.084 0 012.272-1.677zM12.017 0h.097l.082.001.069.001.054.002.068.002.046.001.076.003.047.002.06.003.054.002.087.005.105.007.144.011.088.007.044.004.077.008.082.008.047.005.102.012.05.006.108.014.081.01.042.006.065.01.207.032.07.012.065.011.14.026.092.018.11.022.046.01.075.016.041.01L14.7.3l.042.01.065.015.049.012.071.017.096.024.112.03.113.03.113.032.05.015.07.02.078.024.073.023.05.016.05.016.076.025.099.033.102.036.048.017.064.023.093.034.11.041.116.045.1.04.047.02.06.024.041.018.063.026.04.018.057.025.11.048.1.046.074.035.075.036.06.028.092.046.091.045.102.052.053.028.049.026.046.024.06.033.041.022.052.029.088.05.106.06.087.051.057.034.053.032.096.059.088.055.098.062.036.024.064.041.084.056.04.027.062.042.062.043.023.017c.054.037.108.075.161.114l.083.06.065.048.056.043.086.065.082.064.04.03.05.041.086.069.079.065.085.071c.712.6 1.353 1.283 1.909 2.031L7.222.994l.062-.027.065-.028.081-.034.086-.035c.113-.045.227-.09.341-.131l.096-.035.093-.033.084-.03.096-.031c.087-.03.176-.058.264-.085l.091-.027.086-.025.102-.03.085-.023.1-.026L9.04.37l.09-.023.091-.022.095-.022.09-.02.098-.021.091-.02.095-.018.092-.018.1-.018.091-.016.098-.017.092-.014.097-.015.092-.013.102-.013.091-.012.105-.012.09-.01.105-.01c.093-.01.186-.018.28-.024l.106-.008.09-.005.11-.006.093-.004.1-.004.097-.002.099-.002.197-.002z',\n },\n}\n\nexport function engineMark(engine: string, model?: string): string | undefined {\n if (engine === 'claude') {\n return 'claude'\n }\n if (engine === 'codex') {\n return 'codex'\n }\n const id = model?.toLowerCase() ?? ''\n if (!id) {\n return undefined\n }\n if (id.includes('gemini')) {\n return 'gemini'\n }\n if (id.includes('deepseek')) {\n return 'deepseek'\n }\n if (id.includes('moonshot') || id.includes('kimi')) {\n return 'moonshot'\n }\n if (id.includes('claude')) {\n return 'claude'\n }\n if (id.startsWith('gpt') || id.startsWith('o1') || id.startsWith('o3') || id.includes('openai')) {\n return 'codex'\n }\n return undefined\n}\n\nconst VENDOR_MARK: Record<string, string> = {\n claude: 'text-vendor-claude',\n codex: 'text-vendor-openai',\n}\nconst VENDOR_TEXT: Record<string, string> = {\n claude: 'text-vendor-claude',\n}\n\nexport function vendorMarkClass(engine: string, model?: string): string {\n return VENDOR_MARK[engineMark(engine, model) ?? ''] ?? 'text-fg-3'\n}\n\nexport function vendorTextClass(engine: string, model?: string): string {\n return VENDOR_TEXT[engineMark(engine, model) ?? ''] ?? 'text-fg-3'\n}\n\nexport function EngineIcon({ engine, model, className }: { engine: string; model?: string; className?: string }) {\n const mark = PATHS[engineMark(engine, model) ?? '']\n if (!mark) {\n return (\n <span aria-hidden title={engine} className={cn('shrink-0 text-fg-3', className)}>\n ·\n </span>\n )\n }\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n role=\"img\"\n aria-label={mark.title}\n className={cn('size-3 shrink-0 text-fg-3', className)}\n >\n <title>{mark.title}</title>\n <path d={mark.d} />\n </svg>\n )\n}\n","import { BellRing, CircleAlert, CircleSlash, Moon, PauseCircle } from 'lucide-react'\nimport type { SessionRow } from '@workerdeck/protocol'\nimport { Spinner } from '../ui/Spinner.tsx'\nimport { cn } from '../../lib/utils.ts'\n\nexport function SessionStatusIcon({ row, className }: { row: SessionRow; className?: string }) {\n const { info } = row\n const size = cn('size-4 shrink-0', className)\n if (row.state === 'attention') {\n return <BellRing className={cn(size, 'animate-pulse text-warning')} />\n }\n if (row.state === 'working') {\n return <Spinner className={cn(size, 'text-info')} />\n }\n switch (info.status) {\n case 'failed': {\n return <CircleAlert className={cn(size, 'text-danger')} />\n }\n case 'closed': {\n return <CircleSlash className={cn(size, 'text-fg-4')} />\n }\n case 'parked': {\n return <PauseCircle className={cn(size, 'text-fg-3')} />\n }\n default: {\n return <Moon className={cn(size, 'text-fg-4')} />\n }\n }\n}\n","import type { CSSProperties } from 'react'\nimport type { AgentRef, SessionRow, SessionState } from '@workerdeck/protocol'\nimport { EngineIcon, vendorMarkClass } from './EngineIcon.tsx'\nimport { SessionStatusIcon } from './SessionStatusIcon.tsx'\nimport { cn } from '../../lib/utils.ts'\n\nexport type AgentAvatarImage = { still: string; busy?: { src: string; durations: number[] } }\n\n// Keyed by `AgentRef.avatar`, the gateway path: the host fetches with its own credentials and hands over data URLs.\nexport type AgentAvatars = Record<string, AgentAvatarImage>\n\nexport function avatarOf(avatars: AgentAvatars | undefined, agent: AgentRef | undefined): AgentAvatarImage | undefined {\n return agent?.avatar === undefined ? undefined : avatars?.[agent.avatar]\n}\n\nexport interface AgentAvatarProps {\n row: SessionRow\n image?: AgentAvatarImage\n size?: number\n // The state the corner badge draws; a folded lead passes its team's most urgent one.\n state?: SessionState\n badge?: boolean\n className?: string\n}\n\nexport function AgentAvatar({ row, image, size = 32, state, badge = true, className }: AgentAvatarProps) {\n const { info } = row\n const shown = state ?? row.state\n const busy = shown === 'working' && image?.busy && image.busy.durations.length > 1 ? image.busy : undefined\n const asleep = info.engineAsleep === true\n const engine = info.engine ?? 'claude'\n const badgeSize = size >= 28 ? 14 : 11\n return (\n <span\n data-slot=\"agent-avatar\"\n className={cn('relative inline-flex shrink-0', className)}\n style={{ width: size, height: size }}\n title={info.agent?.name}\n >\n {busy ? (\n <span\n aria-hidden\n className=\"wd-avatar-strip size-full rounded-[4px]\"\n style={\n {\n backgroundImage: `url(${busy.src})`,\n backgroundSize: `${busy.durations.length * size}px ${size}px`,\n '--wd-strip-end': `-${busy.durations.length * size}px`,\n '--wd-strip-steps': busy.durations.length,\n animationDuration: `${busy.durations.reduce((sum, ms) => sum + ms, 0)}ms`,\n } as CSSProperties\n }\n />\n ) : image ? (\n <img\n src={image.still}\n alt=\"\"\n draggable={false}\n className={cn('size-full rounded-[4px] [image-rendering:pixelated]', asleep && 'opacity-60 grayscale')}\n />\n ) : (\n <span className=\"flex size-full items-center justify-center rounded-[4px] border border-dashed border-border\">\n <EngineIcon engine={engine} model={info.model} className={cn('size-1/2', vendorMarkClass(engine, info.model))} />\n </span>\n )}\n {badge && (shown !== 'idle' || asleep) ? (\n <span\n className=\"absolute -right-1 -bottom-1 flex items-center justify-center rounded-full bg-bg\"\n style={{ width: badgeSize, height: badgeSize }}\n >\n <SessionStatusIcon row={{ ...row, state: shown }} className=\"size-full p-px\" />\n </span>\n ) : null}\n </span>\n )\n}\n\nexport function LeadChip({ className }: { className?: string }) {\n return (\n <span\n className={cn(\n 'shrink-0 rounded-[3px] border border-accent/50 px-1 text-[0.625rem] leading-3.5 font-medium tracking-wide text-accent',\n className,\n )}\n >\n LEAD\n </span>\n )\n}\n\nexport interface AgentHeadingProps {\n row: SessionRow\n image?: AgentAvatarImage\n // Overrides `AgentRef.conversation`, which a gateway sends from the second conversation on.\n conversation?: number\n className?: string\n}\n\n// A session panel's title for an agent: avatar, name, its place in a team. Plain sessions keep the host's own title.\nexport function AgentHeading({ row, image, conversation, className }: AgentHeadingProps) {\n const agent = row.info.agent\n if (!agent) {\n return null\n }\n const n = conversation ?? agent.conversation ?? 1\n const detail = [agent.lead !== undefined && agent.team ? `${agent.team} team` : undefined, `conversation ${n}`]\n .filter(Boolean)\n .join(' · ')\n return (\n <span data-slot=\"agent-heading\" className={cn('flex min-w-0 items-center gap-2', className)}>\n <AgentAvatar row={row} image={image} size={24} />\n <span className=\"truncate text-body-sm font-medium text-fg-1\">{agent.name}</span>\n {agent.leads ? <LeadChip /> : null}\n {detail ? <span className=\"shrink-0 text-label text-fg-4\">{detail}</span> : null}\n </span>\n )\n}\n","import type { ProjectIcon as ProjectIconSpec } from '@workerdeck/protocol'\nimport {\n Anchor,\n Atom,\n Beaker,\n Bike,\n Binary,\n Blocks,\n Bot,\n Box,\n Brain,\n Briefcase,\n Brush,\n Bug,\n Building2,\n Cable,\n Camera,\n Car,\n Cat,\n CircuitBoard,\n Cloud,\n Code,\n Coffee,\n Cog,\n Compass,\n Container,\n Cpu,\n CreditCard,\n Database,\n Diamond,\n Dog,\n Feather,\n Film,\n Flame,\n FlaskConical,\n Folder,\n Gamepad2,\n Gauge,\n Gem,\n Ghost,\n Gift,\n GitBranch,\n Globe,\n GraduationCap,\n Hammer,\n Hexagon,\n House,\n Image,\n Key,\n Landmark,\n Laptop,\n Layers,\n Leaf,\n Library,\n Lightbulb,\n Lock,\n Mail,\n Map,\n MessageCircle,\n Mic,\n Monitor,\n Moon,\n Mountain,\n Music,\n Network,\n Newspaper,\n Notebook,\n Orbit,\n Package,\n Palette,\n PenTool,\n Phone,\n PiggyBank,\n Plane,\n Plug,\n Puzzle,\n Radar,\n Radio,\n Receipt,\n Rocket,\n Ruler,\n Satellite,\n Scale,\n Scissors,\n Server,\n Shield,\n Ship,\n ShoppingCart,\n Signal,\n Smartphone,\n Sparkles,\n Sprout,\n Square,\n Star,\n Sun,\n Table,\n Tag,\n Target,\n Telescope,\n Terminal,\n TestTube,\n TreePine,\n Trophy,\n Truck,\n Umbrella,\n Users,\n Wallet,\n Wand,\n Waves,\n Webhook,\n Wifi,\n Wrench,\n Zap,\n} from 'lucide-react'\nimport type { ComponentType } from 'react'\nimport { cn } from '../../lib/utils.ts'\n\nconst GLYPHS: Record<string, ComponentType<{ className?: string }>> = {\n anchor: Anchor,\n atom: Atom,\n beaker: Beaker,\n bike: Bike,\n binary: Binary,\n blocks: Blocks,\n bot: Bot,\n box: Box,\n brain: Brain,\n briefcase: Briefcase,\n brush: Brush,\n bug: Bug,\n 'building-2': Building2,\n cable: Cable,\n camera: Camera,\n car: Car,\n cat: Cat,\n 'circuit-board': CircuitBoard,\n cloud: Cloud,\n code: Code,\n coffee: Coffee,\n cog: Cog,\n compass: Compass,\n container: Container,\n cpu: Cpu,\n 'credit-card': CreditCard,\n database: Database,\n diamond: Diamond,\n dog: Dog,\n feather: Feather,\n film: Film,\n flame: Flame,\n 'flask-conical': FlaskConical,\n folder: Folder,\n 'gamepad-2': Gamepad2,\n gauge: Gauge,\n gem: Gem,\n ghost: Ghost,\n gift: Gift,\n 'git-branch': GitBranch,\n globe: Globe,\n 'graduation-cap': GraduationCap,\n hammer: Hammer,\n hexagon: Hexagon,\n house: House,\n image: Image,\n key: Key,\n landmark: Landmark,\n laptop: Laptop,\n layers: Layers,\n leaf: Leaf,\n library: Library,\n lightbulb: Lightbulb,\n lock: Lock,\n mail: Mail,\n map: Map,\n 'message-circle': MessageCircle,\n mic: Mic,\n monitor: Monitor,\n moon: Moon,\n mountain: Mountain,\n music: Music,\n network: Network,\n newspaper: Newspaper,\n notebook: Notebook,\n orbit: Orbit,\n package: Package,\n palette: Palette,\n 'pen-tool': PenTool,\n phone: Phone,\n 'piggy-bank': PiggyBank,\n plane: Plane,\n plug: Plug,\n puzzle: Puzzle,\n radar: Radar,\n radio: Radio,\n receipt: Receipt,\n rocket: Rocket,\n ruler: Ruler,\n satellite: Satellite,\n scale: Scale,\n scissors: Scissors,\n server: Server,\n shield: Shield,\n ship: Ship,\n 'shopping-cart': ShoppingCart,\n signal: Signal,\n smartphone: Smartphone,\n sparkles: Sparkles,\n sprout: Sprout,\n square: Square,\n star: Star,\n sun: Sun,\n table: Table,\n tag: Tag,\n target: Target,\n telescope: Telescope,\n terminal: Terminal,\n 'test-tube': TestTube,\n 'tree-pine': TreePine,\n trophy: Trophy,\n truck: Truck,\n umbrella: Umbrella,\n users: Users,\n wallet: Wallet,\n wand: Wand,\n waves: Waves,\n webhook: Webhook,\n wifi: Wifi,\n wrench: Wrench,\n zap: Zap,\n}\n\nexport function ProjectIcon({\n icon,\n src,\n name,\n className,\n}: {\n icon: ProjectIconSpec | undefined\n src?: string\n name?: string\n className?: string\n}) {\n if (!icon) {\n return null\n }\n if (icon.type === 'image') {\n if (!src) {\n return null\n }\n return <img src={src} alt=\"\" aria-hidden title={name} className={cn('inline-block size-3 shrink-0 object-contain', className)} />\n }\n const Glyph = GLYPHS[icon.name] ?? Folder\n return <Glyph className={cn('inline-block size-3 shrink-0', className)} />\n}\n","import { useMemo } from 'react'\nimport type { ReactNode } from 'react'\nimport { Filter, X } from 'lucide-react'\nimport { STATE_LABELS, STATE_ORDER, adaptersOf, displayCustomized, facetFilterCount, projectsOf } from '@workerdeck/protocol'\nimport type { GroupBy, SessionRow, SessionState, SortBy, StepDisplay, ViewConfig, WorkspaceScope } from '@workerdeck/protocol'\nimport { Button } from '../ui/Button.tsx'\nimport { Popover, PopoverContent, PopoverTrigger } from '../ui/Popover.tsx'\nimport { OptionSelect, Select, SelectContent, SelectItem, SelectItemText, SelectTrigger, SelectValue } from '../ui/Select.tsx'\nimport { cn } from '../../lib/utils.ts'\n\nexport type SessionFiltersProps = {\n config: ViewConfig\n onConfigChange: (config: ViewConfig) => void\n rows: readonly SessionRow[]\n scope?: WorkspaceScope\n gateways?: readonly { id: string; name: string }[]\n className?: string\n}\n\nexport const STEP_DISPLAY_OPTIONS: readonly { value: StepDisplay; label: string }[] = [\n { value: 'all', label: 'All' },\n { value: 'active', label: 'Active' },\n { value: 'none', label: 'Hide' },\n]\n\nexport function SessionFilters({ config, onConfigChange, rows, scope, gateways: gatewaysProp, className }: SessionFiltersProps) {\n const adapters = useMemo(() => adaptersOf(rows), [rows])\n const projects = useMemo(() => projectsOf(rows), [rows])\n const gateways = useMemo(() => {\n if (gatewaysProp) {\n return gatewaysProp\n }\n const seen = new Map<string, string>()\n for (const row of rows) {\n seen.set(row.hostId, row.hostName)\n }\n return [...seen].map(([id, name]) => ({ id, name }))\n }, [rows, gatewaysProp])\n\n const set = (patch: Partial<ViewConfig>) => onConfigChange({ ...config, ...patch })\n\n return (\n <div data-slot=\"session-filters\" className={cn('flex flex-col gap-3', className)}>\n <Section title=\"Filter\">\n {scope ? (\n <FilterRow label=\"Scope\">\n <OptionSelect\n className=\"w-full min-w-0\"\n label=\"Scope\"\n value={config.scoped ? 'scoped' : 'all'}\n options={[\n { value: 'scoped', label: scope.label },\n { value: 'all', label: 'All folders' },\n ]}\n onChange={(value) => set({ scoped: value === 'scoped' })}\n />\n </FilterRow>\n ) : null}\n <FilterRow label=\"State\">\n <FacetSelect\n label=\"State\"\n value={config.states}\n options={STATE_ORDER.map((s) => ({ value: s, label: STATE_LABELS[s] }))}\n onChange={(states) => set({ states: states as SessionState[] })}\n />\n </FilterRow>\n {adapters.length > 1 ? (\n <FilterRow label=\"Engine\">\n <FacetSelect\n label=\"Engine\"\n value={config.adapters}\n options={adapters.map((a) => ({ value: a, label: a }))}\n onChange={(next) => set({ adapters: next })}\n />\n </FilterRow>\n ) : null}\n {gateways.length > 1 ? (\n <FilterRow label=\"Gateway\">\n <FacetSelect\n label=\"Gateway\"\n value={config.gateways}\n options={gateways.map((g) => ({ value: g.id, label: g.name }))}\n onChange={(next) => set({ gateways: next })}\n />\n </FilterRow>\n ) : null}\n {projects.length > 1 ? (\n <FilterRow label=\"Project\">\n <FacetSelect\n label=\"Project\"\n value={config.projects ?? []}\n options={projects.map((p) => ({ value: p.key, label: p.label }))}\n onChange={(next) => set({ projects: next })}\n />\n </FilterRow>\n ) : null}\n </Section>\n\n <Section title=\"Layout\">\n <FilterRow label=\"Group\">\n <OptionSelect\n className=\"w-full min-w-0\"\n label=\"Group\"\n value={config.groupBy}\n options={[\n { value: 'none', label: 'No grouping' },\n { value: 'state', label: 'By state' },\n { value: 'adapter', label: 'By engine' },\n { value: 'project', label: gateways.length > 1 ? 'By gateway & project' : 'By project' },\n { value: 'custom', label: 'Custom' },\n ]}\n onChange={(groupBy) => set({ groupBy: groupBy as GroupBy })}\n />\n </FilterRow>\n <FilterRow label=\"Sort\">\n <OptionSelect\n className=\"w-full min-w-0\"\n label=\"Sort\"\n value={config.sortBy}\n options={[\n { value: 'recent', label: 'Recent' },\n { value: 'name', label: 'Name' },\n { value: 'state', label: 'State' },\n ...(projects.length > 1 ? [{ value: 'project' as const, label: 'Project' }] : []),\n ...(gateways.length > 1 ? [{ value: 'gateway' as const, label: 'Gateway' }] : []),\n ]}\n onChange={(sortBy) => set({ sortBy: sortBy as SortBy })}\n />\n </FilterRow>\n </Section>\n\n <Section title=\"Show under each session\">\n <FilterRow label=\"Agents\">\n <StepDisplayControl label=\"Agents\" value={config.subagents} onChange={(subagents) => set({ subagents })} />\n </FilterRow>\n <FilterRow label=\"Shells\">\n <StepDisplayControl label=\"Shells\" value={config.shells ?? 'active'} onChange={(shells) => set({ shells })} />\n </FilterRow>\n <FilterRow label=\"Tasks\">\n <StepDisplayControl label=\"Tasks\" value={config.tasks ?? 'active'} onChange={(tasks) => set({ tasks })} />\n </FilterRow>\n </Section>\n </div>\n )\n}\n\nexport type SessionFiltersButtonProps = SessionFiltersProps & {\n open?: boolean\n onOpenChange?: (open: boolean) => void\n}\n\nexport function SessionFiltersButton({ open, onOpenChange, className, ...props }: SessionFiltersButtonProps) {\n const count = facetFilterCount(props.config)\n const engaged = count > 0 || displayCustomized(props.config)\n return (\n <Popover open={open} onOpenChange={onOpenChange}>\n <PopoverTrigger\n render={\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label={count > 0 ? `Filters (${count} active)` : 'Filters'}\n title={count > 0 ? `${count} filter${count === 1 ? '' : 's'} active` : 'Filters'}\n className={className}\n >\n <Filter className={cn('size-3.5', engaged && 'fill-current text-fg-1')} />\n </Button>\n }\n />\n <PopoverContent className=\"w-80\">\n <SessionFilters {...props} />\n </PopoverContent>\n </Popover>\n )\n}\n\nexport function StepDisplayControl({\n label,\n value,\n onChange,\n}: {\n label: string\n value: StepDisplay\n onChange: (value: StepDisplay) => void\n}) {\n return (\n <div role=\"radiogroup\" aria-label={label} className=\"flex w-full rounded-md border border-border p-px\">\n {STEP_DISPLAY_OPTIONS.map((option) => (\n <button\n key={option.value}\n type=\"button\"\n role=\"radio\"\n aria-checked={option.value === value}\n onClick={() => onChange(option.value)}\n className={cn(\n 'min-w-0 flex-1 truncate rounded-[4px] px-1.5 py-0.5 text-label outline-none transition-colors',\n 'focus-visible:ring-2 focus-visible:ring-ring',\n option.value === value ? 'bg-row-selected text-fg-1' : 'text-fg-3 hover:bg-row-hover hover:text-fg-1',\n )}\n >\n {option.label}\n </button>\n ))}\n </div>\n )\n}\n\nfunction Section({ title, children }: { title: string; children: ReactNode }) {\n return (\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"text-label font-medium uppercase tracking-wide text-fg-4\">{title}</div>\n {children}\n </div>\n )\n}\n\nfunction FilterRow({ label, children }: { label: string; children: ReactNode }) {\n return (\n <div className=\"flex items-center gap-2\">\n <span aria-hidden className=\"w-16 shrink-0 truncate text-label text-fg-3\">\n {label}\n </span>\n <div className=\"min-w-0 flex-1\">{children}</div>\n </div>\n )\n}\n\nfunction FacetSelect({\n label,\n value,\n options,\n onChange,\n}: {\n label: string\n value: string[]\n options: { value: string; label: string }[]\n onChange: (value: string[]) => void\n}) {\n return (\n <div className=\"flex items-center gap-1\">\n <Select multiple value={value} onValueChange={(v) => onChange(v as string[])}>\n <SelectTrigger aria-label={label} className=\"min-w-0 flex-1\">\n <SelectValue>\n {value.length === 0\n ? 'All'\n : value.length === 1\n ? (options.find((o) => o.value === value[0])?.label ?? 'All')\n : `${value.length} selected`}\n </SelectValue>\n </SelectTrigger>\n <SelectContent>\n {options.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n <SelectItemText>{option.label}</SelectItemText>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {value.length > 0 ? (\n <Button variant=\"ghost\" size=\"icon-sm\" aria-label={`Clear ${label}`} onClick={() => onChange([])}>\n <X className=\"size-3 text-fg-4\" />\n </Button>\n ) : null}\n </div>\n )\n}\n","import type { ContextReading, ProfileEngine } from '@workerdeck/protocol'\nimport { ProgressRing } from '../ui/ProgressRing.tsx'\nimport { Tip } from '../ui/Tooltip.tsx'\nimport { cn } from '../../lib/utils.ts'\nimport { formatTokens } from '../../lib/format.ts'\nimport { contextNote } from '../../lib/context-note.ts'\nimport { meterColorClass } from '../../lib/status.ts'\n\nexport function ContextRing({\n usage,\n engine,\n size = 11,\n className,\n}: {\n usage: ContextReading | undefined\n engine?: ProfileEngine\n size?: number\n className?: string\n}) {\n if (usage === undefined) {\n return null\n }\n const note = contextNote(engine)\n const reading = `Context ${usage.percentage.toFixed(0)}% · ${formatTokens(usage.totalTokens)} / ${formatTokens(usage.maxTokens)}`\n const shell = cn('shrink-0 leading-none', meterColorClass(usage.percentage), className)\n const ring = <ProgressRing value={usage.percentage} size={size} strokeWidth={2} />\n if (!note) {\n return (\n <span title={reading} className={shell}>\n {ring}\n </span>\n )\n }\n return (\n <Tip\n render={<span className={shell} />}\n content={\n <div className=\"flex max-w-64 flex-col gap-1 py-0.5\">\n <span className=\"font-mono text-fg-2\">{reading}</span>\n <span className=\"text-fg-3\">{note.summary}</span>\n <span className=\"text-fg-3\">{note.hint}</span>\n </div>\n }\n >\n {ring}\n </Tip>\n )\n}\n","import { ArrowRight, Check, Circle, CircleAlert } from 'lucide-react'\nimport { displayedTasks, isAgentRecord, subagentLabel, visibleShells, visibleSubagents } from '@workerdeck/protocol'\nimport type { SessionInfo, SessionTask, ShellInfo, StepDisplay, SubagentDisplay, SubagentInfo } from '@workerdeck/protocol'\nimport { Spinner } from '../ui/Spinner.tsx'\nimport { cn } from '../../lib/utils.ts'\nimport { AgentWriteIcon } from '../terminal/affordances.tsx'\nimport {\n SHELL_AGENT_WRITE_NOTE,\n SHELL_GLYPH,\n SHELL_KILL_GLYPH,\n shellAgentWriteLabel,\n shellGrantable,\n shellInfoFailed,\n shellInfoLabel,\n shellInfoStatusText,\n shellTitle,\n} from '../terminal/shell-row.ts'\n\nexport type StepKind = 'agent' | 'shell' | 'task'\n\nexport type Step = {\n key: string\n kind: StepKind\n label: string\n noun: string\n state: 'done' | 'running' | 'failed' | 'pending'\n detail?: string\n title: string\n onSelect: () => void\n onKill?: () => void\n killLabel?: string\n agentWrite?: { granted: boolean; label: string; toggle: () => void }\n}\n\nexport type ShellStepOptions = {\n now: number\n show?: StepDisplay\n onSelect: (shellId: string) => void\n onKill?: (shellId: string) => void\n // Offered only where the session's agent holds the shell write tools.\n onAgentWrite?: (shellId: string, enabled: boolean) => void\n}\n\nexport type TaskStepOptions = {\n show: StepDisplay\n // Whether the session is still working: a checklist item left in progress after the turn ended is not running.\n live: boolean\n onSelect: (task: SessionTask) => void\n onStop?: (toolUseId: string) => void\n}\n\nexport function sessionSteps(\n info: SessionInfo,\n onSelect: (toolUseId: string) => void,\n show: SubagentDisplay = 'all',\n shells?: ShellStepOptions,\n tasks?: TaskStepOptions,\n): Step[] {\n const agents: Step[] = visibleSubagents(info, show)\n .filter(isAgentRecord)\n .map((sub) => ({\n key: sub.toolUseId,\n kind: 'agent',\n label: subagentLabel(sub),\n noun: 'agent',\n state: stepState(sub.status),\n detail: sub.toolCount > 0 ? String(sub.toolCount) : undefined,\n title: `${subagentLabel(sub)} · ${sub.toolCount} tool${sub.toolCount === 1 ? '' : 's'}`,\n onSelect: () => onSelect(sub.toolUseId),\n }))\n const taskSteps = tasks === undefined ? [] : displayedTasks(info, tasks.show).map((task) => taskStep(task, tasks))\n if (shells === undefined) {\n return [...agents, ...taskSteps]\n }\n const grants = info.shellAgentWrite !== undefined\n const shellSteps = visibleShells(info, shells.show ?? 'active', shells.now).map((shell) => shellStep(shell, shells, grants))\n return [...agents, ...taskSteps, ...shellSteps]\n}\n\nfunction taskStep(task: SessionTask, options: TaskStepOptions): Step {\n const stalled = task.source === 'checklist' && task.state === 'running' && !options.live\n const toolUseId = task.toolUseId\n return {\n key: task.key,\n kind: 'task',\n label: task.label,\n noun: 'task',\n state: stalled ? 'pending' : task.state,\n detail: task.detail,\n title: stalled ? `${task.label} · left in progress` : task.label,\n onSelect: () => options.onSelect(task),\n onKill: task.stoppable && toolUseId !== undefined && options.onStop ? () => options.onStop?.(toolUseId) : undefined,\n killLabel: 'Stop this task',\n }\n}\n\nfunction shellStep(shell: ShellInfo, options: ShellStepOptions, grants: boolean): Step {\n const status = shellInfoStatusText(shell)\n const running = shell.status === 'running'\n return {\n key: shell.id,\n kind: 'shell',\n label: shellInfoLabel(shell),\n noun: 'shell',\n state: shellInfoFailed(shell) ? 'failed' : running ? 'running' : 'done',\n detail: running ? (shell.agentWrite === true ? SHELL_AGENT_WRITE_NOTE : undefined) : status,\n title: `${shellTitle(shell)} · ${status}`,\n onSelect: () => options.onSelect(shell.id),\n onKill: running && options.onKill ? () => options.onKill?.(shell.id) : undefined,\n killLabel: 'Kill this shell',\n agentWrite:\n grants && options.onAgentWrite && shellGrantable(shell)\n ? {\n granted: shell.agentWrite === true,\n label: shellAgentWriteLabel(shell),\n toggle: () => options.onAgentWrite?.(shell.id, shell.agentWrite !== true),\n }\n : undefined,\n }\n}\n\nfunction stepState(status: SubagentInfo['status']): Step['state'] {\n switch (status) {\n case 'running': {\n return 'running'\n }\n case 'failed': {\n return 'failed'\n }\n default: {\n return 'done'\n }\n }\n}\n\nexport function StepRow({ step, active = false, onSelect }: { step: Step; active?: boolean; onSelect: () => void }) {\n const body =\n step.state === 'failed'\n ? 'text-danger'\n : step.kind === 'shell'\n ? 'text-[var(--wd-shell-accent)]'\n : step.kind === 'task'\n ? step.state === 'pending'\n ? 'text-fg-4'\n : 'text-fg-2'\n : 'text-success'\n return (\n <div className={cn('flex w-full items-center rounded-[4px] pr-1.5', active ? 'bg-row-selected' : 'hover:bg-row-active', body)}>\n <button\n type=\"button\"\n title={step.title}\n aria-current={active || undefined}\n onClick={(e) => {\n e.stopPropagation()\n onSelect()\n }}\n className=\"flex min-w-0 flex-1 items-center gap-1.5 py-1 pr-1 pl-3.5 text-left text-micro outline-none\"\n >\n <StepIcon step={step} />\n <span className=\"min-w-0 flex-1 truncate\">{step.label}</span>\n {step.detail ? <span className=\"shrink-0 tabular-nums text-fg-4\">{step.detail}</span> : null}\n {step.kind === 'agent' ? <ArrowRight className=\"size-3.5 shrink-0 text-fg-4\" /> : null}\n </button>\n {step.agentWrite ? (\n <button\n type=\"button\"\n aria-label={step.agentWrite.label}\n aria-pressed={step.agentWrite.granted}\n title={step.agentWrite.label}\n onClick={(e) => {\n e.stopPropagation()\n step.agentWrite?.toggle()\n }}\n className={cn(\n 'shrink-0 px-1 text-micro leading-none outline-none',\n step.agentWrite.granted ? 'text-warning' : 'text-fg-4 hover:text-fg-1',\n )}\n >\n <AgentWriteIcon granted={step.agentWrite.granted} className=\"size-3.5\" />\n </button>\n ) : null}\n {step.onKill ? (\n <button\n type=\"button\"\n aria-label={`${step.kind === 'task' ? 'Stop' : 'Kill'} ${step.label}`}\n title={step.killLabel}\n onClick={(e) => {\n e.stopPropagation()\n step.onKill?.()\n }}\n className=\"shrink-0 px-1 text-micro leading-none text-fg-4 outline-none hover:text-danger\"\n >\n {SHELL_KILL_GLYPH}\n </button>\n ) : null}\n </div>\n )\n}\n\nfunction StepIcon({ step }: { step: Step }) {\n if (step.kind === 'shell') {\n return <span className=\"w-[11px] shrink-0 text-center leading-none\">{SHELL_GLYPH}</span>\n }\n switch (step.state) {\n case 'running': {\n return <Spinner className=\"size-[11px] shrink-0\" />\n }\n case 'failed': {\n return <CircleAlert className=\"size-[11px] shrink-0\" />\n }\n case 'pending': {\n return <Circle className=\"size-[11px] shrink-0\" />\n }\n default: {\n return <Check className=\"size-[11px] shrink-0\" />\n }\n }\n}\n","import { Fragment, useEffect, useRef, useState } from 'react'\nimport { Users } from 'lucide-react'\nimport type { ReactNode } from 'react'\nimport { projectLabel, projectName, projectSubpath, sessionLabel } from '@workerdeck/protocol'\nimport type { SessionInfo, SessionRow, SessionState, SessionTask, StepDisplay, SubagentDisplay } from '@workerdeck/protocol'\nimport { AgentAvatar, LeadChip, avatarOf, type AgentAvatars } from './AgentAvatar.tsx'\nimport { ContextRing } from './ContextRing.tsx'\nimport { EngineIcon, vendorMarkClass, vendorTextClass } from './EngineIcon.tsx'\nimport { ProjectIcon } from './ProjectIcon.tsx'\nimport { SessionStatusIcon } from './SessionStatusIcon.tsx'\nimport { StepRow, sessionSteps } from './SessionSteps.tsx'\nimport type { Step } from './SessionSteps.tsx'\nimport { cn } from '../../lib/utils.ts'\nimport { formatCost, formatRelativeTime, friendlyModel } from '../../lib/format.ts'\n\nexport type SelectModifiers = { meta: boolean; ctrl: boolean; alt: boolean }\n\nexport interface SessionItemProps {\n row: SessionRow\n active?: boolean\n activeStepKey?: string\n showGateway?: boolean\n showProject?: boolean\n projectIcons?: Record<string, string>\n subagents?: SubagentDisplay\n shells?: StepDisplay\n tasks?: StepDisplay\n onSelect?: (modifiers: SelectModifiers) => void\n onSelectSubagent?: (toolUseId: string) => void\n onSelectTask?: (task: SessionTask) => void\n onStopTask?: (toolUseId: string) => void\n onSelectShell?: (shellId: string) => void\n onKillShell?: (shellId: string) => void\n onShellAgentWrite?: (shellId: string, enabled: boolean) => void\n now?: number\n onRename?: (title: string) => void\n renameOn?: 'doubleClick' | 'external'\n editing?: boolean\n onEditingChange?: (editing: boolean) => void\n actions?: ReactNode\n // Drawn when `row.info.agent` is set: the card then leads with the avatar and names the agent.\n avatars?: AgentAvatars\n // `member` is the one-row card a team draws under its lead.\n variant?: 'card' | 'member'\n // The state the avatar badge draws, for a folded lead standing in for its team.\n badgeState?: SessionState\n // Unread summed over a folded team's members, drawn with the team glyph beside the lead's own.\n teamUnseen?: number\n // A folded lead's members, drawn on its first line before the context ring.\n teamTray?: ReactNode\n // Draws a session with no agent in the agent card's shape (an engine-mark tile for the avatar), so a list mixing\n // agents and plain sessions keeps one column.\n tile?: boolean\n className?: string\n}\n\nconst NO_MODIFIERS: SelectModifiers = { meta: false, ctrl: false, alt: false }\n\nexport function SessionItem({\n row,\n active = false,\n activeStepKey,\n showGateway,\n showProject = true,\n projectIcons,\n subagents = 'active',\n shells = 'active',\n tasks = 'active',\n onSelect,\n onSelectSubagent,\n onSelectTask,\n onStopTask,\n onSelectShell,\n onKillShell,\n onShellAgentWrite,\n now,\n onRename,\n renameOn = 'doubleClick',\n editing,\n onEditingChange,\n actions,\n avatars,\n variant = 'card',\n badgeState,\n teamUnseen = 0,\n teamTray,\n tile = false,\n className,\n}: SessionItemProps) {\n const { info } = row\n const [ownEditing, setOwnEditing] = useState(false)\n const isEditing = editing ?? ownEditing\n const setEditing = (next: boolean) => {\n setOwnEditing(next)\n onEditingChange?.(next)\n }\n\n const engine = info.engine ?? 'claude'\n const project = showProject ? projectLabel(row) : projectSubpath(row)\n const projectTitle = showProject ? projectName(row) : undefined\n const projectIcon = showProject ? info.project?.icon : undefined\n const iconSrc = projectIcon?.type === 'image' ? projectIcons?.[projectIcon.hash] : undefined\n const cost = formatCost(info.costUsd ?? info.totalCostUsd)\n const extras = [\n showGateway ? row.hostName : undefined,\n info.profile ? `@${info.profile}` : undefined,\n cost === '-' ? undefined : cost,\n ].filter((part): part is string => Boolean(part))\n\n const model = friendlyModel(info.model)\n const status = statusLine(info.statusLabel)\n // Its own approval or question, or (on a lead) a team member's: the one card that asks for an action.\n const needsYou = row.state === 'attention' || row.teamState === 'attention' || badgeState === 'attention'\n const parts: ReactNode[] = []\n if (model) {\n parts.push(\n <span key=\"model\" className={vendorTextClass(engine, info.model)}>\n {model}\n </span>,\n )\n }\n if (status) {\n parts.push(\n <span key=\"status\" title={status} className=\"text-fg-3\">\n {status}\n </span>,\n )\n }\n if (project !== undefined) {\n parts.push(\n <span key=\"project\" title={projectTitle}>\n <ProjectIcon icon={projectIcon} src={iconSrc} name={projectTitle} className=\"mr-1.5 size-4 align-[-0.3em]\" />\n {project}\n </span>,\n )\n }\n for (const extra of extras) {\n parts.push(<span key={extra}>{extra}</span>)\n }\n const steps = sessionSteps(\n info,\n (toolUseId) => (onSelectSubagent ? onSelectSubagent(toolUseId) : onSelect?.(NO_MODIFIERS)),\n subagents,\n {\n now: now ?? Date.now(),\n show: shells,\n onSelect: (shellId) => (onSelectShell ? onSelectShell(shellId) : onSelect?.(NO_MODIFIERS)),\n onKill: onKillShell,\n onAgentWrite: onShellAgentWrite,\n },\n {\n show: tasks,\n live: info.status === 'running' || info.status === 'starting' || info.status === 'awaiting_approval',\n onSelect: (task) => (onSelectTask ? onSelectTask(task) : onSelect?.(NO_MODIFIERS)),\n onStop: onStopTask,\n },\n )\n const holdsOpenStep = steps.some((s) => s.key === activeStepKey)\n const agent = info.agent\n const label = agent ? agent.name : sessionLabel(info)\n const editable = agent ? agent.name : (info.title ?? '')\n const time = formatRelativeTime(info.lastActivityAt ?? info.createdAt)\n const nameLabel =\n isEditing && onRename ? (\n <NameEditor\n initial={editable}\n placeholder={agent ? 'Agent name' : 'Session name'}\n onCommit={(title) => {\n setEditing(false)\n if (title !== editable && (title || !agent)) {\n onRename(title)\n }\n }}\n onCancel={() => setEditing(false)}\n />\n ) : (\n <span\n onDoubleClick={\n onRename && renameOn === 'doubleClick'\n ? (e) => {\n e.stopPropagation()\n setEditing(true)\n }\n : undefined\n }\n className=\"min-w-0 shrink truncate text-body-sm font-medium tracking-[-0.005em] text-fg-1\"\n >\n {label}\n </span>\n )\n const unread =\n row.unseen > 0 ? (\n <span\n // Prose, not rows: `unseen` counts messages a person has not read (`proseCount`).\n title={`${row.unseen} new message${row.unseen === 1 ? '' : 's'}`}\n className={cn(\n 'flex h-4 min-w-6 shrink-0 items-center justify-center rounded-full px-2',\n 'text-[0.75rem] leading-none tracking-[-0.005em] tabular-nums',\n // Grey while the turn is still producing, accent once it has stopped: the badge's colour\n // answers \"is this waiting for me\", and a working session is not yet.\n row.state === 'working' ? 'bg-badge text-badge-fg' : 'bg-accent text-accent-fg',\n )}\n >\n {row.unseen}\n </span>\n ) : null\n\n return (\n <div\n data-slot=\"session-item\"\n data-active={active || undefined}\n data-asleep={info.engineAsleep || undefined}\n title={info.engineAsleep ? 'Asleep, wakes on your next message' : undefined}\n role=\"button\"\n tabIndex={0}\n onClick={(e) => {\n if (e.detail > 1 || isEditing) {\n return\n }\n onSelect?.({ meta: e.metaKey, ctrl: e.ctrlKey, alt: e.altKey })\n }}\n onKeyDown={(e) => {\n if (e.target !== e.currentTarget) {\n return\n }\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onSelect?.({ meta: e.metaKey, ctrl: e.ctrlKey, alt: e.altKey })\n }\n }}\n className={cn(\n 'group flex w-full cursor-pointer flex-col p-1 text-left outline-none',\n 'rounded-[4px] transition-colors focus-visible:ring-2 focus-visible:ring-ring',\n needsYou\n ? cn('bg-row-attention', active && 'ring-1 ring-accent ring-inset')\n : holdsOpenStep\n ? 'bg-row-selected-weak'\n : active\n ? 'bg-row-selected'\n : 'hover:bg-row-hover',\n className,\n )}\n >\n {agent && variant === 'member' ? (\n <div className={cn('flex h-6 items-center gap-1.5 overflow-hidden py-0.5 pr-0.5 pl-1.5', info.engineAsleep && 'opacity-60')}>\n <AgentAvatar row={row} image={avatarOf(avatars, agent)} size={22} />\n {nameLabel}\n {status ? (\n <span title={status} className=\"min-w-0 flex-1 truncate text-body-sm text-fg-3\">\n {status}\n </span>\n ) : (\n <span className=\"flex-1\" />\n )}\n {unread}\n <span className=\"shrink-0 text-body-sm text-fg-4\">{time}</span>\n {actions}\n </div>\n ) : agent || tile ? (\n <div className={cn('flex items-center gap-2 py-0.5 pr-0.5 pl-1.5', info.engineAsleep && 'opacity-60')}>\n <AgentAvatar row={row} image={avatarOf(avatars, agent)} state={badgeState} />\n <div className=\"flex min-w-0 flex-1 flex-col gap-1\">\n <div className=\"flex h-5 items-center gap-1.5 overflow-hidden\">\n {nameLabel}\n {agent?.leads ? <LeadChip /> : null}\n {agent ? <span className=\"w-max max-w-max min-w-0 grow basis-0 truncate text-label text-fg-4/70\">{time}</span> : null}\n <span className=\"flex-1\" />\n {unread}\n {teamUnseen > 0 ? (\n <span\n title={`${teamUnseen} new message${teamUnseen === 1 ? '' : 's'} in the team`}\n className=\"flex h-4 shrink-0 items-center gap-0.5 rounded-full bg-accent px-1.5 text-[0.75rem] leading-none text-accent-fg tabular-nums\"\n >\n <Users className=\"size-3\" />\n {teamUnseen}\n </span>\n ) : null}\n {teamTray}\n <ContextRing usage={info.contextUsage} engine={engine} size={16} className=\"p-0.5\" />\n </div>\n <div className=\"flex h-5 items-center gap-1.5 overflow-hidden text-body-sm tracking-[-0.005em]\">\n {agent ? (\n <>\n {model ? <span className={cn('shrink-0', vendorTextClass(engine, info.model))}>{model}</span> : null}\n {status ? (\n <span title={status} className=\"min-w-0 truncate text-fg-3\">\n {model ? '· ' : ''}\n {status}\n </span>\n ) : null}\n </>\n ) : (\n <>\n <span className=\"min-w-0 truncate text-fg-4\">\n {parts.map((part, i) => (\n <Fragment key={i}>\n {i > 0 ? ' · ' : ''}\n {part}\n </Fragment>\n ))}\n </span>\n <span className=\"shrink-0 text-fg-4\">\n {parts.length > 0 ? '· ' : ''}\n {time}\n </span>\n </>\n )}\n <span className=\"min-w-0 flex-1\" />\n {actions}\n </div>\n </div>\n </div>\n ) : (\n <div className={cn('flex flex-col gap-1 py-0.5 pr-0.5 pl-1.5', info.engineAsleep && 'opacity-60')}>\n <div className=\"flex h-5 items-center gap-1.5 overflow-hidden\">\n <Gutter>\n <SessionStatusIcon row={row} />\n </Gutter>\n {nameLabel}\n <span className=\"flex-1\" />\n {unread}\n <ContextRing usage={info.contextUsage} engine={engine} size={16} className=\"p-0.5\" />\n </div>\n\n <div className=\"flex h-5 items-center gap-1.5 overflow-hidden text-body-sm tracking-[-0.005em]\">\n <Gutter>\n <EngineIcon engine={engine} model={info.model} className={cn('size-4', vendorMarkClass(engine, info.model))} />\n </Gutter>\n <span className=\"min-w-0 truncate text-fg-4\">\n {parts.map((part, i) => (\n <Fragment key={i}>\n {i > 0 ? ' · ' : ''}\n {part}\n </Fragment>\n ))}\n </span>\n <span className=\"shrink-0 text-fg-4\">\n {parts.length > 0 ? '· ' : ''}\n {time}\n </span>\n <span className=\"min-w-0 flex-1\" />\n {actions}\n </div>\n </div>\n )}\n\n {steps.length > 0 ? (\n <div className=\"flex flex-col\">\n {steps.map((step: Step) => (\n <StepRow key={step.key} step={step} active={step.key === activeStepKey} onSelect={step.onSelect} />\n ))}\n </div>\n ) : null}\n </div>\n )\n}\n\nfunction Gutter({ children }: { children: ReactNode }) {\n return <span className=\"flex size-4 shrink-0 items-center justify-center\">{children}</span>\n}\n\nfunction NameEditor({\n initial,\n placeholder,\n onCommit,\n onCancel,\n}: {\n initial: string\n placeholder: string\n onCommit: (title: string) => void\n onCancel: () => void\n}) {\n const [value, setValue] = useState(initial)\n const ref = useRef<HTMLInputElement>(null)\n useEffect(() => {\n ref.current?.focus()\n ref.current?.select()\n }, [])\n useEffect(() => {\n const onWindowFocus = () => {\n ref.current?.focus()\n ref.current?.select()\n }\n window.addEventListener('focus', onWindowFocus)\n return () => window.removeEventListener('focus', onWindowFocus)\n }, [])\n return (\n <input\n ref={ref}\n value={value}\n spellCheck={false}\n placeholder={placeholder}\n aria-label={placeholder}\n onClick={(e) => e.stopPropagation()}\n onDoubleClick={(e) => e.stopPropagation()}\n onChange={(e) => setValue(e.target.value)}\n onBlur={() => {\n // Guarded on `document.hasFocus()`: selecting a session focuses another surface (in the extension, another view), and an unguarded blur closes the editor in the frame it appeared.\n if (document.hasFocus()) {\n onCommit(value.trim())\n }\n }}\n onKeyDown={(e) => {\n e.stopPropagation()\n if (e.key === 'Enter') {\n onCommit(value.trim())\n } else if (e.key === 'Escape') {\n onCancel()\n }\n }}\n className={cn(\n '-my-0.5 min-w-0 flex-1 rounded-sm border border-ring bg-bg px-1 py-px',\n 'text-body-sm leading-5 text-fg-1 outline-none',\n )}\n />\n )\n}\n\nexport function statusLine(label: SessionInfo['statusLabel']): string | undefined {\n return label ? (label.emoji ? `${label.emoji} ${label.text}` : label.text) : undefined\n}\n","import type { SessionRow } from '@workerdeck/protocol'\n\nexport type DropZone = 'before' | 'join' | 'after'\n\n// What a drop asks of the host: `lead: null` leaves the team. Joining renumbers the team densely from 0, so\n// `siblings` lists the other members whose `order` changes; teams are small and most of them never moved.\nexport type TeamMove = { row: SessionRow; lead: SessionRow | null; order?: number; siblings?: { row: SessionRow; order: number }[] }\n\nexport function dropZone(offsetY: number, height: number): DropZone {\n if (height <= 0) {\n return 'join'\n }\n const at = offsetY / height\n return at < 0.25 ? 'before' : at > 0.75 ? 'after' : 'join'\n}\n\n// Mirrors the gateway's `leadRefusal`, so a drag can say no before it asks; the 409 stays the authority.\nexport function teamDropRefusal(dragged: SessionRow, lead: SessionRow): string | undefined {\n const mover = dragged.info.agent\n const target = lead.info.agent\n if (dragged.hostId !== lead.hostId) {\n return 'a team stays on one gateway'\n }\n if (!target) {\n return 'only an agent can lead a team'\n }\n if (mover?.id === target.id || dragged.info.id === lead.info.id) {\n return 'an agent cannot lead its own team'\n }\n if (target.lead !== undefined) {\n return `${target.name} is a member of a team; teams are one level deep`\n }\n if (mover?.leads) {\n return `${mover.name} leads a team; teams are one level deep`\n }\n return undefined\n}\n\n// The move a drop over a member asks for: join (or reorder within) that member's team, at the member's place.\nexport function memberDrop(dragged: SessionRow, lead: SessionRow, member: SessionRow, zone: DropZone): TeamMove | string {\n const refusal = teamDropRefusal(dragged, lead)\n if (refusal) {\n return refusal\n }\n const others = (lead.members ?? []).filter((row) => row.info.id !== dragged.info.id || row.hostId !== dragged.hostId)\n const at = others.findIndex((row) => row.info.id === member.info.id && row.hostId === member.hostId)\n const index = at < 0 ? others.length : zone === 'before' ? at : at + 1\n return placeMember(dragged, lead, others, index)\n}\n\nexport function joinDrop(dragged: SessionRow, lead: SessionRow): TeamMove | string {\n const refusal = teamDropRefusal(dragged, lead)\n if (refusal) {\n return refusal\n }\n const others = (lead.members ?? []).filter((row) => row.info.id !== dragged.info.id || row.hostId !== dragged.hostId)\n return placeMember(dragged, lead, others, others.length)\n}\n\nfunction placeMember(dragged: SessionRow, lead: SessionRow, others: readonly SessionRow[], index: number): TeamMove {\n const siblings = others\n .map((row, i) => ({ row, order: i < index ? i : i + 1 }))\n .filter(({ row, order }) => row.info.agent?.order !== order)\n return { row: dragged, lead, order: index, ...(siblings.length ? { siblings } : {}) }\n}\n","import { useEffect, useRef, useState } from 'react'\nimport type { DragEvent, HTMLAttributes, ReactNode } from 'react'\nimport { GripVertical, Image as ImageIcon, Pencil, Plus, Trash2 } from 'lucide-react'\nimport {\n addCustomGroup,\n moveCustomGroup,\n moveToCustomGroup,\n newCustomGroupId,\n removeCustomGroup,\n renameCustomGroup,\n sessionKey,\n styleCustomGroup,\n customGroupColor,\n PROJECT_ACCENTS,\n} from '@workerdeck/protocol'\nimport type { CustomGroup, SessionGroup, SessionRow } from '@workerdeck/protocol'\nimport { dropZone, joinDrop, memberDrop, type DropZone, type TeamMove } from '../../lib/team-drop.ts'\nimport { Button } from '../ui/Button.tsx'\nimport { Input } from '../ui/Input.tsx'\nimport { Popover, PopoverContent, PopoverTrigger } from '../ui/Popover.tsx'\nimport { cn } from '../../lib/utils.ts'\n\ntype DragItem = { kind: 'session'; key: string } | { kind: 'group'; id: string }\n\nexport type GroupDrag = ReturnType<typeof useGroupDrag>\n\n// Where a card sits: `lead` is set for a member, the team it is drawn under.\nexport type DragPlace = { row: SessionRow; lead?: SessionRow }\n\nexport type TeamDrag = {\n rowOf: (key: string) => SessionRow | undefined\n // A rejection's message is drawn under the card it was dropped on: a gateway 409 is user-facing copy.\n onMove: (move: TeamMove) => Promise<void> | void\n}\n\ntype Over = { spot: string; refusal?: string }\n\nexport type DropCue = { zone?: DropZone | 'refused'; message?: string }\ntype Landing = Over & { run?: () => void }\n\nconst ERROR_MS = 5000\n\n// The payload lives in state rather than `dataTransfer`, which is unreadable during `dragover`; `setData` is still\n// written because some engines refuse to start a drag without it. A card is split in three: the middle joins its\n// team, the edges reorder (custom groups) or leave a team.\nexport function useGroupDrag(\n groups: readonly CustomGroup[],\n onChange: (groups: CustomGroup[]) => void,\n options: { custom: boolean; team?: TeamDrag },\n) {\n const { custom, team } = options\n const [item, setItem] = useState<DragItem>()\n const [over, setOver] = useState<Over>()\n const [failure, setFailure] = useState<{ key: string; message: string }>()\n const failureTimer = useRef<ReturnType<typeof setTimeout>>(undefined)\n useEffect(() => () => clearTimeout(failureTimer.current), [])\n const end = () => {\n setItem(undefined)\n setOver(undefined)\n }\n const start = (e: DragEvent, next: DragItem) => {\n e.stopPropagation()\n e.dataTransfer.effectAllowed = 'move'\n e.dataTransfer.setData('text/plain', next.kind === 'session' ? next.key : next.id)\n setItem(next)\n }\n const accept = (e: DragEvent, next: Over) => {\n e.preventDefault()\n e.stopPropagation()\n e.dataTransfer.dropEffect = next.refusal ? 'none' : 'move'\n if (over?.spot !== next.spot || over.refusal !== next.refusal) {\n setOver(next)\n }\n }\n const fail = (key: string, err: unknown) => {\n clearTimeout(failureTimer.current)\n setFailure({ key, message: err instanceof Error ? err.message : String(err) })\n failureTimer.current = setTimeout(() => setFailure(undefined), ERROR_MS)\n }\n const move = (key: string, next: TeamMove) => () => {\n setFailure(undefined)\n void Promise.resolve()\n .then(() => team!.onMove(next))\n .catch((err: unknown) => fail(key, err))\n }\n\n function land(e: DragEvent<HTMLDivElement>, key: string, group: SessionGroup, place?: DragPlace): Landing | undefined {\n if (item?.kind !== 'session' || item.key === key) {\n return undefined\n }\n const reorder = custom\n ? { spot: `row:${key}`, run: () => onChange(moveToCustomGroup(groups, item.key, group.custom, group.custom ? key : undefined)) }\n : undefined\n const dragged = team?.rowOf(item.key)\n if (!team || !dragged || !place) {\n return reorder\n }\n const rect = e.currentTarget.getBoundingClientRect()\n const zone = dropZone(e.clientY - rect.top, rect.height)\n if (place.lead) {\n const result = memberDrop(dragged, place.lead, place.row, zone)\n return typeof result === 'string'\n ? { spot: `refused:${key}`, refusal: result }\n : { spot: `${zone === 'before' ? 'before' : 'after'}:${key}`, run: move(key, result) }\n }\n if (zone === 'join') {\n const result = joinDrop(dragged, place.row)\n if (typeof result !== 'string') {\n return { spot: `join:${key}`, run: move(key, result) }\n }\n return reorder ?? { spot: `refused:${key}`, refusal: result }\n }\n if (dragged.info.agent?.lead !== undefined) {\n const leave = move(key, { row: dragged, lead: null })\n return {\n spot: `${zone}:${key}`,\n run: () => {\n leave()\n reorder?.run()\n },\n }\n }\n return reorder ? { ...reorder, spot: `${zone}:${key}` } : undefined\n }\n\n function session(key: string, group: SessionGroup, place?: DragPlace): HTMLAttributes<HTMLDivElement> {\n return {\n draggable: true,\n onDragStart: (e) => start(e, { kind: 'session', key }),\n onDragEnd: end,\n onDragOver: (e) => {\n const landing = land(e, key, group, place)\n if (landing) {\n accept(e, landing)\n }\n },\n onDrop: (e) => {\n const landing = land(e, key, group, place)\n if (!landing) {\n return\n }\n e.preventDefault()\n e.stopPropagation()\n landing.run?.()\n end()\n },\n }\n }\n\n function container(group: SessionGroup): HTMLAttributes<HTMLDivElement> {\n const leaving = () => {\n const dragged = item?.kind === 'session' ? team?.rowOf(item.key) : undefined\n return dragged?.info.agent?.lead !== undefined ? dragged : undefined\n }\n return {\n onDragOver: (e) => {\n if (item && (custom || leaving())) {\n accept(e, { spot: `group:${group.key}` })\n }\n },\n onDrop: (e) => {\n e.preventDefault()\n const member = leaving()\n if (member) {\n move(sessionKey(member), { row: member, lead: null })()\n }\n if (custom && item?.kind === 'session') {\n onChange(moveToCustomGroup(groups, item.key, group.custom))\n } else if (custom && item?.kind === 'group') {\n onChange(moveCustomGroup(groups, item.id, group.custom))\n }\n end()\n },\n }\n }\n\n function header(group: SessionGroup): HTMLAttributes<HTMLDivElement> {\n const id = group.custom\n if (id === undefined) {\n return {}\n }\n return { draggable: true, onDragStart: (e) => start(e, { kind: 'group', id }), onDragEnd: end }\n }\n\n // What to draw on a card while something hovers it, and a rejected drop's message for a while after.\n function cue(key: string): DropCue {\n if (failure?.key === key) {\n return { zone: 'refused', message: failure.message }\n }\n const spot = over?.spot\n if (!spot || spot.slice(spot.indexOf(':') + 1) !== key) {\n return {}\n }\n const kind = spot.slice(0, spot.indexOf(':'))\n if (kind === 'refused') {\n return { zone: 'refused', message: over?.refusal }\n }\n return kind === 'row' || kind === 'before'\n ? { zone: 'before' }\n : kind === 'after'\n ? { zone: 'after' }\n : kind === 'join'\n ? { zone: 'join' }\n : {}\n }\n\n return {\n dragging: item !== undefined,\n isOver: (spot: string) => over?.spot === spot,\n cue,\n session,\n container,\n header,\n create: (name = 'New group') => {\n const id = newCustomGroupId()\n onChange(addCustomGroup(groups, name, id))\n return id\n },\n rename: (id: string, name: string) => onChange(renameCustomGroup(groups, id, name)),\n style: (id: string, look: { color?: string | null; icon?: string | null }) => onChange(styleCustomGroup(groups, id, look)),\n remove: (id: string) => onChange(removeCustomGroup(groups, id)),\n }\n}\n\nexport function CustomGroupHeader({\n group,\n look,\n editing,\n onEditingChange,\n onRename,\n onRemove,\n onStyle,\n dragProps,\n}: {\n group: SessionGroup\n // The stored group, for its colour and image; absent for the ungrouped bucket.\n look?: CustomGroup\n editing: boolean\n onEditingChange: (editing: boolean) => void\n onRename: (name: string) => void\n onRemove: () => void\n onStyle?: (look: { color?: string | null; icon?: string | null }) => void\n dragProps: HTMLAttributes<HTMLDivElement>\n}) {\n if (editing) {\n return <GroupNameInput initial={group.label ?? ''} onRename={onRename} onDone={() => onEditingChange(false)} />\n }\n\n const custom = group.custom !== undefined\n return (\n <GroupHeading\n {...dragProps}\n label={group.label ?? ''}\n count={group.rows.length}\n caps={!custom}\n className={cn('group/heading', custom && 'cursor-grab')}\n onDoubleClick={custom ? () => onEditingChange(true) : undefined}\n leading={\n custom ? (\n <>\n <GripVertical className=\"-mr-1.5 -ml-1.5 size-3 opacity-0 group-hover/heading:opacity-60\" />\n {look ? <GroupBadge group={look} onStyle={onStyle} /> : null}\n </>\n ) : undefined\n }\n actions={\n custom ? (\n <>\n <HeadingAction label=\"Rename group\" onClick={() => onEditingChange(true)}>\n <Pencil className=\"size-3\" />\n </HeadingAction>\n <HeadingAction label=\"Delete group\" title=\"Delete the group - its sessions move to Ungrouped\" onClick={onRemove}>\n <Trash2 className=\"size-3\" />\n </HeadingAction>\n </>\n ) : undefined\n }\n />\n )\n}\n\nfunction GroupNameInput({ initial, onRename, onDone }: { initial: string; onRename: (name: string) => void; onDone: () => void }) {\n const [draft, setDraft] = useState(initial)\n const commit = () => {\n const name = draft.trim()\n if (name && name !== initial) {\n onRename(name)\n }\n onDone()\n }\n return (\n <div className=\"px-2\">\n <Input\n autoFocus\n aria-label=\"Group name\"\n value={draft}\n onFocus={(e) => e.currentTarget.select()}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={commit}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n commit()\n } else if (e.key === 'Escape') {\n e.stopPropagation()\n onDone()\n }\n }}\n className=\"h-6 text-label\"\n />\n </div>\n )\n}\n\nexport function GroupHeading({\n label,\n count,\n leading,\n actions,\n caps = true,\n className,\n ...rest\n}: {\n label: ReactNode\n count: number\n leading?: ReactNode\n actions?: ReactNode\n // Off for a name the operator typed, which keeps its own case.\n caps?: boolean\n} & HTMLAttributes<HTMLDivElement>) {\n return (\n <div {...rest} className={cn('group/heading flex min-h-5 items-center gap-2 px-2 text-label font-medium text-fg-4', className)}>\n {leading}\n <span className={cn('min-w-0 truncate', caps ? 'uppercase tracking-wide' : 'text-fg-3')}>{label}</span>\n <span className=\"text-fg-4/70\">{count}</span>\n {actions ? (\n <span className=\"ml-auto flex items-center gap-0.5 opacity-0 transition-opacity group-hover/heading:opacity-100 focus-within:opacity-100\">\n {actions}\n </span>\n ) : null}\n </div>\n )\n}\n\nexport function HeadingAction({\n label,\n title,\n onClick,\n children,\n}: {\n label: string\n title?: string\n onClick: () => void\n children: ReactNode\n}) {\n return (\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label={label}\n title={title ?? label}\n className=\"size-5 text-fg-3\"\n onClick={(e) => {\n e.stopPropagation()\n onClick()\n }}\n >\n {children}\n </Button>\n )\n}\n\nexport function NewGroupButton({ onClick }: { onClick: () => void }) {\n return (\n <Button variant=\"ghost\" size=\"xs\" className=\"mx-1 self-start text-fg-3\" onClick={onClick}>\n <Plus />\n New group\n </Button>\n )\n}\n\nconst ICON_PX = 64\n\n// A group's badge: its image, else its colour; pressing it picks either.\nexport function GroupBadge({\n group,\n onStyle,\n}: {\n group: CustomGroup\n onStyle?: (look: { color?: string | null; icon?: string | null }) => void\n}) {\n const [error, setError] = useState<string>()\n const file = useRef<HTMLInputElement>(null)\n const mark = group.icon ? (\n <img src={group.icon} alt=\"\" className=\"size-3.5 rounded-[3px] object-cover\" draggable={false} />\n ) : (\n <span className=\"size-2 rounded-[2px]\" style={{ background: customGroupColor(group) }} />\n )\n if (!onStyle) {\n return <span className=\"flex size-3.5 shrink-0 items-center justify-center\">{mark}</span>\n }\n return (\n <Popover>\n <PopoverTrigger\n render={\n <button\n type=\"button\"\n aria-label={`Colour or image for ${group.name}`}\n title=\"Colour or image\"\n onClick={(e) => e.stopPropagation()}\n onDoubleClick={(e) => e.stopPropagation()}\n className=\"flex size-3.5 shrink-0 items-center justify-center rounded-[3px] hover:ring-1 hover:ring-border\"\n >\n {mark}\n </button>\n }\n />\n <PopoverContent align=\"start\" className=\"flex w-44 flex-col gap-2\">\n <div className=\"grid grid-cols-4 gap-1.5\">\n {PROJECT_ACCENTS.map((color) => (\n <button\n key={color}\n type=\"button\"\n aria-label={`Colour ${color}`}\n onClick={() => onStyle({ color, icon: null })}\n className={cn(\n 'h-6 rounded-[4px] ring-offset-1 ring-offset-surface',\n !group.icon && customGroupColor(group) === color && 'ring-2 ring-fg-3',\n )}\n style={{ background: color }}\n />\n ))}\n </div>\n <input\n ref={file}\n type=\"file\"\n accept=\"image/*\"\n className=\"hidden\"\n onChange={(e) => {\n const picked = e.target.files?.[0]\n e.target.value = ''\n if (!picked) {\n return\n }\n setError(undefined)\n void iconFromFile(picked)\n .then((icon) => onStyle({ icon }))\n .catch(() => setError('That image could not be read'))\n }}\n />\n <Button variant=\"outline\" size=\"xs\" onClick={() => file.current?.click()}>\n <ImageIcon />\n Choose image…\n </Button>\n {group.icon ? (\n <Button variant=\"ghost\" size=\"xs\" onClick={() => onStyle({ icon: null })}>\n Remove image\n </Button>\n ) : null}\n {error ? <span className=\"text-label text-danger\">{error}</span> : null}\n </PopoverContent>\n </Popover>\n )\n}\n\n// Scaled to cover a 64 px square and re-encoded, so a photo from disk stores as a few kB in the view config.\nasync function iconFromFile(file: File): Promise<string> {\n const bitmap = await createImageBitmap(file)\n const canvas = document.createElement('canvas')\n canvas.width = ICON_PX\n canvas.height = ICON_PX\n const context = canvas.getContext('2d')\n if (!context) {\n throw new Error('no canvas')\n }\n const scale = Math.max(ICON_PX / bitmap.width, ICON_PX / bitmap.height)\n const width = bitmap.width * scale\n const height = bitmap.height * scale\n context.drawImage(bitmap, (ICON_PX - width) / 2, (ICON_PX - height) / 2, width, height)\n bitmap.close()\n return canvas.toDataURL('image/png')\n}\n","import { useMemo, useState } from 'react'\nimport type { HTMLAttributes, ReactNode } from 'react'\nimport { BedDouble, ChevronDown, ChevronRight, Eraser, FolderOpen, Layers, Pencil, Plus, Search, SearchX, Trash2, X } from 'lucide-react'\nimport {\n clearFilters,\n filterRows,\n groupRows,\n hasFacetFilter,\n isTeamCollapsed,\n scopeActive,\n sessionKey,\n subsetSummary,\n teamSummary,\n toggleTeamCollapsed,\n} from '@workerdeck/protocol'\nimport type {\n SessionGroup,\n SessionRow,\n SessionState,\n SessionTask,\n StepDisplay,\n SubagentDisplay,\n ViewConfig,\n WorkspaceScope,\n} from '@workerdeck/protocol'\nimport { AgentAvatar, avatarOf, type AgentAvatars } from './AgentAvatar.tsx'\nimport { Button } from '../ui/Button.tsx'\nimport { Empty } from '../ui/Empty.tsx'\nimport { Input } from '../ui/Input.tsx'\nimport { ProjectIcon } from './ProjectIcon.tsx'\nimport { SessionFilters } from './SessionFilters.tsx'\nimport { SessionItem, type SelectModifiers } from './SessionItem.tsx'\nimport { CustomGroupHeader, GroupHeading, HeadingAction, NewGroupButton, useGroupDrag, type DropCue } from './SessionGroups.tsx'\nimport type { TeamMove } from '../../lib/team-drop.ts'\nimport { cn } from '../../lib/utils.ts'\n\nexport { SessionStatusIcon } from './SessionStatusIcon.tsx'\n\nexport interface SessionBrowserProps {\n rows: SessionRow[]\n config: ViewConfig\n onConfigChange: (config: ViewConfig) => void\n scope?: WorkspaceScope\n activeId?: string\n activeSubagentId?: string\n activeShellId?: string\n now?: number\n // Overrides `activeId`, for a host whose session ids are unique only per gateway.\n isActive?: (row: SessionRow) => boolean\n // Replaces the pencil / eraser / trash; rename then falls back to the card's own double-click.\n rowActions?: (row: SessionRow) => ReactNode\n // Overrides the count of gateways among `rows` when deciding whether a card names its gateway.\n gatewayCount?: number\n showSubset?: boolean\n onSelect?: (row: SessionRow, modifiers: SelectModifiers) => void\n onDelete?: (row: SessionRow) => void\n onRename?: (row: SessionRow, title: string) => void\n // An agent card's name is the agent's, not the session title; without this, agent cards are not renamable.\n onRenameAgent?: (row: SessionRow, name: string) => void\n onClearContext?: (row: SessionRow) => void\n onSleep?: (row: SessionRow) => void\n onSelectSubagent?: (row: SessionRow, toolUseId: string) => void\n onSelectTask?: (row: SessionRow, task: SessionTask) => void\n onStopTask?: (row: SessionRow, toolUseId: string) => void\n onSelectShell?: (row: SessionRow, shellId: string) => void\n onKillShell?: (row: SessionRow, shellId: string) => void\n onShellAgentWrite?: (row: SessionRow, shellId: string, enabled: boolean) => void\n avatars?: AgentAvatars\n // Makes cards draggable onto each other: the middle of a card joins its team, a member dropped outside leaves.\n // Reject with an Error to draw its message under the card.\n onTeamMove?: (move: TeamMove) => Promise<void> | void\n // Draws a `+` on each project heading: start a session on that gateway, in that project's root.\n onCreateInGroup?: (target: GroupTarget) => void\n emptyState?: ReactNode\n // The facet controls, drawn inline. A host with a header puts `SessionFiltersButton` there instead.\n showControls?: boolean\n showSearch?: boolean\n autoFocusSearch?: boolean\n projectIcons?: Record<string, string>\n className?: string\n}\n\nexport type GroupTarget = { hostId: string; cwd?: string }\n\nexport function rowShapeClass(active: boolean): string {\n return cn('px-2 py-1.5 hover:bg-row-hover', active ? 'mr-1 ml-0 rounded-r-md border-l-4 border-l-accent' : 'mx-1 rounded-md')\n}\n\nexport function SessionBrowser({\n rows,\n config,\n onConfigChange,\n scope,\n activeId,\n activeSubagentId,\n activeShellId,\n now,\n isActive = (row) => row.info.id === activeId,\n rowActions,\n gatewayCount,\n showSubset = true,\n onSelect,\n onDelete,\n onRename,\n onRenameAgent,\n onClearContext,\n onSleep,\n onSelectSubagent,\n onSelectTask,\n onStopTask,\n onSelectShell,\n onKillShell,\n onShellAgentWrite,\n avatars,\n onTeamMove,\n onCreateInGroup,\n emptyState,\n showControls = true,\n showSearch = showControls,\n autoFocusSearch,\n projectIcons,\n className,\n}: SessionBrowserProps) {\n const rowGateways = useMemo(() => new Set(rows.map((row) => row.hostId)).size, [rows])\n const gateways = gatewayCount ?? rowGateways\n const visible = useMemo(() => filterRows(rows, config, scope), [rows, config, scope])\n const groups = useMemo(() => groupRows(visible, config, { gatewayCount: gateways, all: rows }), [visible, config, gateways, rows])\n const subset = subsetSummary(config, scope, visible.length, rows.length)\n const tiles = useMemo(() => rows.some((row) => row.info.agent !== undefined), [rows])\n const custom = config.groupBy === 'custom'\n const [editingGroup, setEditingGroup] = useState<string>()\n\n const set = (patch: Partial<ViewConfig>) => onConfigChange({ ...config, ...patch })\n const byKey = useMemo(() => new Map(rows.map((row) => [sessionKey(row), row])), [rows])\n const drag = useGroupDrag(config.customGroups ?? [], (customGroups) => set({ customGroups }), {\n custom,\n team: onTeamMove ? { rowOf: (key) => byKey.get(key), onMove: onTeamMove } : undefined,\n })\n const draggable = custom || onTeamMove !== undefined\n\n const heading = (group: SessionGroup) => {\n if (custom) {\n return (\n <CustomGroupHeader\n group={group}\n look={config.customGroups?.find((custom) => custom.id === group.custom)}\n onStyle={(look) => group.custom && drag.style(group.custom, look)}\n editing={group.custom !== undefined && editingGroup === group.custom}\n onEditingChange={(editing) => setEditingGroup(editing ? group.custom : undefined)}\n onRename={(name) => group.custom && drag.rename(group.custom, name)}\n onRemove={() => group.custom && drag.remove(group.custom)}\n dragProps={drag.header(group)}\n />\n )\n }\n if (group.earlier) {\n return (\n <button\n type=\"button\"\n aria-expanded={config.earlierOpen === true}\n onClick={() => set({ earlierOpen: !config.earlierOpen })}\n className=\"flex items-center gap-1 px-2 text-left text-label text-fg-4 hover:text-fg-2\"\n >\n {config.earlierOpen ? <ChevronDown className=\"size-3.5\" /> : <ChevronRight className=\"size-3.5\" />}\n Earlier · {group.rows.length} one-off session{group.rows.length === 1 ? '' : 's'}\n </button>\n )\n }\n if (config.groupBy === 'none' || !group.label) {\n return null\n }\n const project = config.groupBy === 'project'\n const target = project && group.hostId ? { hostId: group.hostId, cwd: group.cwd } : undefined\n return (\n <GroupHeading\n label={\n group.gateway && group.project ? (\n <>\n {group.gateway}\n <span aria-hidden> · </span>\n <span className=\"text-fg-1\">{group.project}</span>\n </>\n ) : (\n group.label\n )\n }\n count={group.rows.length}\n title={project && group.cwd ? group.cwd : undefined}\n leading={\n project ? (\n <ProjectIcon icon={group.rows[0]?.info.project?.icon} src={iconSrcOf(group.rows[0], projectIcons)} name={group.label} />\n ) : undefined\n }\n actions={\n target && onCreateInGroup ? (\n <HeadingAction label={`New session in ${group.label}`} onClick={() => onCreateInGroup(target)}>\n <Plus className=\"size-3\" />\n </HeadingAction>\n ) : undefined\n }\n />\n )\n }\n\n return (\n <div data-slot=\"session-browser\" className={cn('flex flex-col gap-3', className)}>\n {showSearch ? (\n <SessionSearch value={config.search} onChange={(search) => set({ search })} autoFocus={autoFocusSearch} className=\"px-2\" />\n ) : null}\n {showControls ? <SessionFilters config={config} onConfigChange={onConfigChange} rows={rows} scope={scope} className=\"px-2\" /> : null}\n\n {subset && showSubset ? (\n <div className=\"flex items-center gap-2 px-3 text-label text-fg-4\">\n <span>\n {subset.shown} of {subset.total}\n {subset.causes.length ? ` · ${subset.causes.join(' · ')}` : null}\n </span>\n <button\n type=\"button\"\n className=\"text-fg-3 underline underline-offset-2 hover:text-fg-1\"\n onClick={() => onConfigChange(clearFilters(config))}\n >\n Show all\n </button>\n </div>\n ) : null}\n\n {rows.length === 0 ? (\n (emptyState ?? <Empty icon={<Layers />} title=\"No sessions yet\" />)\n ) : visible.length === 0 ? (\n hasFacetFilter(config) ? (\n <Empty\n icon={<SearchX />}\n title=\"No matches\"\n description=\"No session matches the current search and filters.\"\n action=\"Clear filters\"\n onAction={() => onConfigChange(clearFilters(config))}\n />\n ) : scope && scopeActive(config, scope) ? (\n <Empty\n icon={<FolderOpen />}\n title=\"Nothing in this folder\"\n description={`No session is running in ${scope.label}.`}\n action=\"Show all folders\"\n onAction={() => set({ scoped: false })}\n />\n ) : (\n <Empty icon={<Layers />} title=\"Nothing here\" description=\"No session to show.\" />\n )\n ) : (\n <div className=\"flex flex-col gap-2 px-1\">\n {groups.map((group) => (\n <div\n key={group.key}\n {...(draggable ? drag.container(group) : {})}\n className={cn('flex flex-col gap-1 rounded-md', draggable && drag.isOver(`group:${group.key}`) && 'bg-row-hover/50')}\n >\n {heading(group)}\n {custom && group.custom !== undefined && group.rows.length === 0 ? (\n <div className=\"mx-1 rounded-md border border-dashed border-border px-2 py-2 text-center text-label text-fg-4\">\n Drag sessions here\n </div>\n ) : null}\n {group.earlier && !config.earlierOpen\n ? null\n : group.rows.map((row) => {\n const item = (member: SessionRow, variant: 'card' | 'member', extra: Partial<SessionRowItemProps> = {}) => (\n <SessionRowItem\n key={sessionKey(member)}\n dragProps={\n onTeamMove || (custom && variant === 'card')\n ? drag.session(sessionKey(member), group, variant === 'member' ? { row: member, lead: row } : { row })\n : undefined\n }\n dropCue={draggable ? drag.cue(sessionKey(member)) : undefined}\n row={member}\n variant={variant}\n active={isActive(member)}\n activeSubagentId={activeSubagentId}\n activeShellId={activeShellId}\n actions={rowActions?.(member)}\n now={now}\n showGateway={gateways > 1 && config.groupBy !== 'project'}\n showProject={config.groupBy !== 'project'}\n subagents={config.subagents}\n shells={config.shells}\n tasks={config.tasks}\n projectIcons={projectIcons}\n avatars={avatars}\n tile={tiles}\n onSelect={onSelect}\n onDelete={onDelete}\n onRename={member.info.agent ? onRenameAgent : onRename}\n onClearContext={onClearContext}\n onSleep={onSleep}\n onSelectSubagent={onSelectSubagent}\n onSelectTask={onSelectTask}\n onStopTask={onStopTask}\n onSelectShell={onSelectShell}\n onKillShell={onKillShell}\n onShellAgentWrite={onShellAgentWrite}\n {...extra}\n />\n )\n if (!row.members?.length) {\n return item(row, 'card', { className: row.context ? 'opacity-50' : undefined })\n }\n const collapsed = isTeamCollapsed(config, row)\n return (\n <TeamBlock\n key={sessionKey(row)}\n lead={row}\n collapsed={collapsed}\n avatars={avatars}\n onToggle={() => onConfigChange(toggleTeamCollapsed(config, row))}\n renderLead={(summary, tray) =>\n item(row, 'card', {\n className: row.context ? 'opacity-50' : undefined,\n badgeState: collapsed ? row.teamState : undefined,\n teamUnseen: collapsed ? summary.unseen : 0,\n teamTray: tray,\n })\n }\n renderMember={(member) => item(member, 'member')}\n />\n )\n })}\n </div>\n ))}\n {custom ? <NewGroupButton onClick={() => setEditingGroup(drag.create())} /> : null}\n </div>\n )}\n </div>\n )\n}\n\nfunction iconSrcOf(row: SessionRow | undefined, icons: Record<string, string> | undefined): string | undefined {\n const icon = row?.info.project?.icon\n return icon?.type === 'image' ? icons?.[icon.hash] : undefined\n}\n\ninterface SessionRowItemProps {\n row: SessionRow\n variant?: 'card' | 'member'\n avatars?: AgentAvatars\n badgeState?: SessionState\n teamUnseen?: number\n teamTray?: ReactNode\n tile?: boolean\n className?: string\n dragProps?: HTMLAttributes<HTMLDivElement>\n dropCue?: DropCue\n active?: boolean\n actions?: ReactNode\n activeSubagentId?: string\n activeShellId?: string\n now?: number\n showGateway?: boolean\n showProject?: boolean\n subagents?: SubagentDisplay\n shells?: StepDisplay\n tasks?: StepDisplay\n projectIcons?: Record<string, string>\n onSelect?: (row: SessionRow, modifiers: SelectModifiers) => void\n onDelete?: (row: SessionRow) => void\n onRename?: (row: SessionRow, title: string) => void\n onClearContext?: (row: SessionRow) => void\n onSleep?: (row: SessionRow) => void\n onSelectSubagent?: (row: SessionRow, toolUseId: string) => void\n onSelectTask?: (row: SessionRow, task: SessionTask) => void\n onStopTask?: (row: SessionRow, toolUseId: string) => void\n onSelectShell?: (row: SessionRow, shellId: string) => void\n onKillShell?: (row: SessionRow, shellId: string) => void\n onShellAgentWrite?: (row: SessionRow, shellId: string, enabled: boolean) => void\n}\n\nfunction SessionRowItem({\n row,\n variant,\n avatars,\n badgeState,\n teamUnseen,\n teamTray,\n tile,\n className,\n dragProps,\n dropCue,\n active,\n actions,\n activeSubagentId,\n activeShellId,\n now,\n showGateway,\n showProject = true,\n subagents,\n shells,\n tasks,\n projectIcons,\n onSelect,\n onDelete,\n onRename,\n onClearContext,\n onSleep,\n onSelectSubagent,\n onSelectTask,\n onStopTask,\n onSelectShell,\n onKillShell,\n onShellAgentWrite,\n}: SessionRowItemProps) {\n const { info } = row\n const [editing, setEditing] = useState(false)\n\n const item = (\n <SessionItem\n row={row}\n variant={variant}\n avatars={avatars}\n badgeState={badgeState}\n teamUnseen={teamUnseen}\n teamTray={teamTray}\n tile={tile}\n className={className}\n active={active === true}\n activeStepKey={active ? (activeShellId ?? activeSubagentId) : undefined}\n now={now}\n showGateway={showGateway}\n showProject={showProject}\n subagents={subagents}\n shells={shells}\n tasks={tasks}\n projectIcons={projectIcons}\n onSelect={(modifiers) => onSelect?.(row, modifiers)}\n onSelectSubagent={onSelectSubagent ? (id) => onSelectSubagent(row, id) : undefined}\n onSelectTask={onSelectTask ? (task) => onSelectTask(row, task) : undefined}\n onStopTask={onStopTask ? (id) => onStopTask(row, id) : undefined}\n onSelectShell={onSelectShell ? (id) => onSelectShell(row, id) : undefined}\n onKillShell={onKillShell ? (id) => onKillShell(row, id) : undefined}\n onShellAgentWrite={onShellAgentWrite ? (id, enabled) => onShellAgentWrite(row, id, enabled) : undefined}\n onRename={onRename ? (title) => onRename(row, title) : undefined}\n renameOn={actions === undefined ? 'external' : 'doubleClick'}\n editing={actions === undefined ? editing : undefined}\n onEditingChange={actions === undefined ? setEditing : undefined}\n actions={\n actions ?? (\n <>\n {onRename && !editing ? (\n <RowAction label={info.agent ? 'Rename agent' : 'Rename session'} onClick={() => setEditing(true)}>\n <Pencil className=\"size-3 text-fg-3\" />\n </RowAction>\n ) : null}\n {onClearContext && info.capabilities?.clearContext ? (\n <RowAction\n label=\"Clear context\"\n title=\"Clear the conversation - the session keeps running and the old conversation stays resumable\"\n onClick={() => onClearContext(row)}\n >\n <Eraser className=\"size-3 text-fg-3\" />\n </RowAction>\n ) : null}\n {onSleep && info.capabilities?.engineSleep && info.status === 'idle' && !info.engineAsleep ? (\n <RowAction\n label=\"Sleep session\"\n title=\"Stop the engine process to free its memory - the session stays here and wakes on your next message\"\n onClick={() => onSleep(row)}\n >\n <BedDouble className=\"size-3 text-fg-3\" />\n </RowAction>\n ) : null}\n {onDelete ? (\n <RowAction label=\"Close session\" onClick={() => onDelete(row)}>\n <Trash2 className=\"size-3 text-fg-3\" />\n </RowAction>\n ) : null}\n </>\n )\n }\n />\n )\n if (!dragProps) {\n return item\n }\n const zone = dropCue?.zone\n return (\n <div\n {...dragProps}\n title={zone === 'refused' ? dropCue?.message : undefined}\n className={cn(\n 'rounded-md',\n zone === 'before' && 'shadow-[inset_0_2px_0_0_var(--color-accent)]',\n zone === 'after' && 'shadow-[inset_0_-2px_0_0_var(--color-accent)]',\n zone === 'join' && 'bg-accent/10 ring-1 ring-accent',\n zone === 'refused' && 'ring-1 ring-danger/60',\n )}\n >\n {item}\n {zone === 'refused' && dropCue?.message ? (\n <div role=\"status\" className=\"px-3 pb-1 text-label text-danger\">\n {dropCue.message}\n </div>\n ) : null}\n </div>\n )\n}\n\nconst TRAY_MAX = 4\n\n// A folded team draws its members on the lead's first line (avatar and status each) and no row of its own; the tray\n// unfolds it. Expanded, a tree line runs from the lead's avatar with the knob atop it, so neither state needs a twistie.\nfunction TeamBlock({\n lead,\n collapsed,\n avatars,\n onToggle,\n renderLead,\n renderMember,\n}: {\n lead: SessionRow\n collapsed: boolean\n avatars?: AgentAvatars\n onToggle: () => void\n renderLead: (summary: ReturnType<typeof teamSummary>, tray?: ReactNode) => ReactNode\n renderMember: (member: SessionRow) => ReactNode\n}) {\n const members = lead.members ?? []\n const summary = teamSummary(lead)\n if (collapsed) {\n const surfaced = members.filter((member) => member.state === 'attention')\n const counts = [\n `${summary.members} member${summary.members === 1 ? '' : 's'}`,\n summary.working ? `${summary.working} working` : undefined,\n summary.attention ? `${summary.attention} need${summary.attention === 1 ? 's' : ''} you` : undefined,\n ].filter(Boolean)\n const hidden = members.length - TRAY_MAX\n const tray = (\n <button\n type=\"button\"\n aria-expanded={false}\n aria-label={`Expand ${lead.info.agent?.name ?? 'team'}: ${counts.join(', ')}`}\n title={counts.join(' · ')}\n onClick={(e) => {\n e.stopPropagation()\n onToggle()\n }}\n className=\"flex shrink-0 items-center gap-1 rounded-[4px] px-0.5 hover:bg-row-hover\"\n >\n {members.slice(0, hidden > 0 ? TRAY_MAX - 1 : TRAY_MAX).map((member) => (\n <AgentAvatar\n key={sessionKey(member)}\n row={member}\n image={avatarOf(avatars, member.info.agent)}\n size={16}\n className=\"rounded-[3px]\"\n />\n ))}\n {hidden > 0 ? <span className=\"text-label text-fg-4 tabular-nums\">+{hidden + 1}</span> : null}\n </button>\n )\n return (\n <div data-slot=\"team\" data-collapsed className=\"flex flex-col\">\n {renderLead(summary, tray)}\n {surfaced.length ? <div className=\"ml-3 flex flex-col\">{surfaced.map(renderMember)}</div> : null}\n </div>\n )\n }\n return (\n <div data-slot=\"team\" className=\"flex flex-col\">\n {renderLead(summary)}\n <div className=\"relative ml-3.5 flex flex-col pl-1\">\n <span aria-hidden className=\"absolute top-0 bottom-3 left-0 w-px bg-border\" />\n <button\n type=\"button\"\n aria-expanded\n aria-label={`Collapse ${lead.info.agent?.name ?? 'team'}`}\n onClick={onToggle}\n className=\"absolute -top-1 -left-[7px] flex size-3.5 items-center justify-center rounded-full border border-border bg-bg text-fg-4 hover:text-fg-1\"\n >\n <ChevronDown className=\"size-2.5\" />\n </button>\n {members.map(renderMember)}\n </div>\n </div>\n )\n}\n\nfunction RowAction({ label, title, onClick, children }: { label: string; title?: string; onClick: () => void; children: ReactNode }) {\n return (\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label={label}\n title={title ?? label}\n className=\"size-5 shrink-0 opacity-0 transition-opacity group-hover:opacity-100\"\n onClick={(e) => {\n e.stopPropagation()\n onClick()\n }}\n >\n {children}\n </Button>\n )\n}\n\nexport function SessionSearch({\n value,\n onChange,\n autoFocus,\n className,\n inputClassName,\n}: {\n value: string\n onChange: (value: string) => void\n autoFocus?: boolean\n className?: string\n inputClassName?: string\n}) {\n return (\n <div className={cn('relative', className)}>\n <Search className=\"pointer-events-none absolute top-1/2 left-4.5 size-3.5 -translate-y-1/2 text-fg-4\" />\n <Input\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Escape' && value) {\n e.stopPropagation()\n onChange('')\n }\n }}\n placeholder=\"Search sessions\"\n aria-label=\"Search sessions\"\n autoFocus={autoFocus}\n className={cn('pr-7 pl-8', inputClassName)}\n />\n {value ? (\n <button\n type=\"button\"\n aria-label=\"Clear search\"\n onClick={() => onChange('')}\n className=\"absolute top-1/2 right-3.5 -translate-y-1/2 rounded p-0.5 text-fg-4 hover:text-fg-1\"\n >\n <X className=\"size-3\" />\n </button>\n ) : null}\n </div>\n )\n}\n","import { Check, ChevronDown } from 'lucide-react'\nimport type { SubagentDisplay } from '@workerdeck/protocol'\nimport { Button } from '../ui/Button.tsx'\nimport { Menu, MenuContent, MenuItem, MenuTrigger } from '../ui/Menu.tsx'\nimport { cn } from '../../lib/utils.ts'\n\nexport const SUBAGENT_DISPLAY_ORDER: readonly SubagentDisplay[] = ['all', 'active', 'none']\n\nexport const SUBAGENT_DISPLAY_META: Record<SubagentDisplay, { label: string; hint: string }> = {\n all: { label: 'All sub-agents', hint: 'Showing every sub-agent' },\n active: { label: 'Hide completed', hint: 'Showing running and failed sub-agents' },\n none: { label: 'Hide sub-agents', hint: 'Sub-agents hidden' },\n}\n\nconst HIDDEN_ROW = 0.34\n\n// A session line at full strength over two child rows, and a hidden child is greyed rather than\n// struck: a sub-agent the card is not drawing has not failed, and a cross would say it had.\nexport function SubagentDisplayIcon({ value, className }: { value: SubagentDisplay; className?: string }) {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n className={className}\n >\n <path d=\"M3 5h18\" />\n <path d=\"M9 12h12\" opacity={value === 'none' ? HIDDEN_ROW : 1} />\n <path d=\"M9 19h12\" opacity={value === 'all' ? 1 : HIDDEN_ROW} />\n </svg>\n )\n}\n\nexport type SubagentToggleProps = {\n value: SubagentDisplay\n onChange: (value: SubagentDisplay) => void\n className?: string\n}\n\n// A menu rather than a press-to-cycle button: three stops are one more than a person can read off\n// a single glyph, and the caret is what promises the other two.\nexport function SubagentToggle({ value, onChange, className }: SubagentToggleProps) {\n const meta = SUBAGENT_DISPLAY_META[value]\n return (\n <Menu>\n <MenuTrigger\n render={\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label={`Sub-agents: ${meta.label}`}\n title={meta.hint}\n className={cn('w-9 gap-0.5', className)}\n >\n <SubagentDisplayIcon value={value} className=\"size-4\" />\n <ChevronDown className=\"size-2.5 text-fg-4\" />\n </Button>\n }\n />\n <MenuContent className=\"min-w-44\">\n {SUBAGENT_DISPLAY_ORDER.map((option) => (\n <MenuItem key={option} onClick={() => onChange(option)}>\n <SubagentDisplayIcon value={option} className=\"size-4 shrink-0 text-fg-3\" />\n <span className=\"flex-1\">{SUBAGENT_DISPLAY_META[option].label}</span>\n {option === value ? <Check className=\"size-3.5 shrink-0 text-accent\" /> : null}\n </MenuItem>\n ))}\n </MenuContent>\n </Menu>\n )\n}\n"],"mappings":"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"}