@nice-code/action 0.11.0 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/devtools/browser/index.cjs +39 -1
- package/build/devtools/browser/index.cjs.map +1 -1
- package/build/devtools/browser/index.mjs +39 -1
- package/build/devtools/browser/index.mjs.map +1 -1
- package/build/devtools/server/index.cjs +1 -1
- package/build/devtools/server/index.cjs.map +1 -1
- package/build/devtools/server/index.mjs +1 -1
- package/build/devtools/server/index.mjs.map +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["MONO","MONO","SANS","SourceMapConsumer","ExternalLink","Component","Loader2","CircleCheck","CircleAlert","CircleX","Circle","Sparkle","Variable","PackageCheck","CircleX","Fragment","Variable","PackageCheck","CircleX"],"sources":["../../../../nice-devtools-shared/src/colors.ts","../../../../nice-devtools-shared/src/format.ts","../../../../nice-devtools-shared/src/json.tsx","../../../../nice-devtools-shared/src/dock.ts","../../../../nice-devtools-shared/src/list.ts","../../../../nice-devtools-shared/src/components/SectionLabel.tsx","../../../../nice-devtools-shared/src/components/Tooltip.tsx","../../../../nice-devtools-shared/src/components/PanelChrome.tsx","../../../../nice-devtools-shared/src/components/FollowLatestToggles.tsx","../../../../nice-devtools-shared/src/components/VirtualList.tsx","../../../src/devtools/core/devtools_colors.ts","../../../src/devtools/browser/ui_util/size.ts","../../../src/devtools/browser/components/DetailSection.tsx","../../../src/devtools/browser/components/NiceErrorDisplay.tsx","../../../src/devtools/browser/devtools_storage.ts","../../../src/devtools/browser/components/sourceMapResolver.ts","../../../src/devtools/browser/components/StackTraceSection.tsx","../../../src/devtools/browser/components/ActionErrorDisplay.tsx","../../../src/devtools/browser/components/Chip.tsx","../../../src/devtools/browser/components/Icon.tsx","../../../src/devtools/browser/components/DomainChip.tsx","../../../src/devtools/browser/components/HandlerChips.tsx","../../../src/devtools/browser/components/utils.ts","../../../src/devtools/browser/components/RunningTimer.tsx","../../../src/devtools/browser/components/CallStackSection.tsx","../../../src/devtools/browser/components/ChildDispatchChips.tsx","../../../src/devtools/browser/components/MetaSection.tsx","../../../src/devtools/browser/components/OriginChip.tsx","../../../src/devtools/browser/components/RoutingSection.tsx","../../../src/devtools/browser/components/action_detail/ActionDetailPanel.tsx","../../../src/devtools/browser/components/action_list/IoTooltipContent.tsx","../../../src/devtools/browser/components/action_list/ActionInputAndOutputChip.tsx","../../../src/devtools/browser/components/action_list/ActionEntryRow.tsx","../../../src/devtools/browser/components/action_list/ActionList.tsx","../../../src/devtools/browser/NiceActionDevtools.tsx"],"sourcesContent":["// Shared visual language for the nice-* devtools (nice-action + nice-state).\n//\n// These tokens are the single source of truth for the palette both devtools\n// suites paint with, so the two feel like siblings when used side by side.\n// Package-specific colours (e.g. nice-action's handler/stack-frame roles or\n// nice-state's editor surface) live in each package's own `devtools_colors`\n// module, which re-exports everything from here.\n\n// ─── The 5 canonical semantic tokens ─────────────────────────────────────────\n// Every status / role colour in the devtools must resolve to one of these five.\nexport const DEVTOOL_COLOR_SEMANTIC_ERROR = \"#FF5C5C\"; // Critical failures, error messages, error borders\nexport const DEVTOOL_COLOR_SEMANTIC_SUCCESS = \"#A3E635\"; // Successful execution, routing hops, add patches\nexport const DEVTOOL_COLOR_SEMANTIC_SYSTEM = \"#38BDF8\"; // System actions, domain/store tags, clickable links\nexport const DEVTOOL_COLOR_SEMANTIC_WARNING = \"#FB923C\"; // Intermediate statuses, timing highlights, edits\nexport const DEVTOOL_COLOR_SEMANTIC_METADATA = \"#A1A1AA\"; // Timestamps, non-interactive labels, timeline\n\n// ─── Text hierarchy (4 levels — no intermediate aliases) ─────────────────────\nexport const DEVTOOL_COLOR_TEXT_EMPHASIS = \"#f1f5f9\"; // Primary content — names, headings\nexport const DEVTOOL_COLOR_TEXT_SECONDARY = \"#cbd5e1\"; // General readable content\nexport const DEVTOOL_COLOR_TEXT_MUTED = \"#64748b\"; // Supporting / subdued labels\nexport const DEVTOOL_COLOR_TEXT_FAINT = \"#334155\"; // Near-invisible chrome, expand arrows\n\n// ─── Surface / layout palette ─────────────────────────────────────────────────\nexport const DEVTOOL_LIST_BASE_BACKGROUND = \"#0f172a\";\nexport const DEVTOOL_LIST_SELECTED_BACKGROUND = \"#1d2942\";\nexport const DEVTOOL_DETAIL_BASE_BACKGROUND = \"#0d1729\";\nexport const DEVTOOL_DETAIL_HEADER_BACKGROUND = \"#131f35\";\nexport const DEVTOOL_SECTION_BACKGROUND = \"#1e293b\";\nexport const DEVTOOL_SECTION_STRING_BACKGROUND = \"#0d131f\";\nexport const DEVTOOL_PANEL_BORDER = \"#1e293b\";\nexport const DEVTOOL_PANEL_DIVIDER_BORDER = \"#1d3352\";\n\n// ─── Error display surface ────────────────────────────────────────────────────\nexport const DEVTOOL_ERROR_BACKGROUND = \"#1e0a0a\";\n\n// ─── Tooltip ──────────────────────────────────────────────────────────────────\nexport const DEVTOOL_TOOLTIP_BACKGROUND = \"#0c1526\";\nexport const DEVTOOL_TOOLTIP_TITLE_BACKGROUND = \"#101b2e\";\nexport const DEVTOOL_TOOLTIP_TITLE_BOTTOM_BORDER = \"#211f5f\";\nexport const DEVTOOL_TOOLTIP_BORDER = \"#312e81\";\n\n// ─── JSON syntax highlighting ─────────────────────────────────────────────────\nexport const DEVTOOL_JSON_KEY = \"#a5b4fc\";\nexport const DEVTOOL_JSON_STRING = \"#fbbf24\";\nexport const DEVTOOL_JSON_NUMBER = \"#34d399\";\nexport const DEVTOOL_JSON_KEYWORD = \"#a78bfa\";\nexport const DEVTOOL_JSON_PUNCTUATION = \"#475569\";\n\n// ─── Fonts ──────────────────────────────────────────────────────────────────--\nexport const MONO_FONT = \"ui-monospace, 'Cascadia Code', 'Source Code Pro', monospace\";\nexport const SANS_FONT = \"ui-sans-serif, system-ui, sans-serif\";\n","// Small, dependency-free formatting helpers shared by both devtools suites.\n\n/** Pretty-print any value to JSON, degrading gracefully for cyclic / non-JSON values. */\nexport function safeStringify(value: unknown, indent = 2): string {\n if (value === undefined) return \"undefined\";\n if (value === null) return \"null\";\n try {\n return JSON.stringify(value, null, indent);\n } catch {\n return String(value);\n }\n}\n\n/** Wall-clock time of day, e.g. `14:03:09`. */\nexport function formatTimestamp(ms: number): string {\n return new Date(ms).toLocaleTimeString([], {\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n hour12: false,\n });\n}\n\n/** Compact relative age: `850ms`, `3.2s`, `4m`. */\nexport function formatRelativeAge(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60_000) return `${(ms / 1000).toFixed(1)}s`;\n return `${Math.floor(ms / 60_000)}m`;\n}\n","import type { CSSProperties, ReactNode } from \"react\";\nimport {\n DEVTOOL_JSON_KEY,\n DEVTOOL_JSON_KEYWORD,\n DEVTOOL_JSON_NUMBER,\n DEVTOOL_JSON_PUNCTUATION,\n DEVTOOL_JSON_STRING,\n DEVTOOL_SECTION_STRING_BACKGROUND,\n MONO_FONT,\n} from \"./colors\";\nimport { safeStringify } from \"./format\";\n\n// Regex-based JSON tokenizer — strings (and the `:` that may follow a key),\n// numbers, keywords and structural punctuation each get their own colour.\nconst JSON_TOKEN_RE =\n /(\"(?:\\\\.|[^\"\\\\])*\")(\\s*:)?|(-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?)|(\\btrue\\b|\\bfalse\\b|\\bnull\\b|\\bundefined\\b)|([{}[\\],])/g;\n\n/** Tokenize a JSON string into coloured <span> nodes for inline rendering. */\nexport function renderColoredJson(text: string): ReactNode[] {\n const nodes: ReactNode[] = [];\n let last = 0;\n let i = 0;\n JSON_TOKEN_RE.lastIndex = 0;\n for (let m = JSON_TOKEN_RE.exec(text); m !== null; m = JSON_TOKEN_RE.exec(text)) {\n if (m.index > last) nodes.push(text.slice(last, m.index));\n const [, str, colon, num, kw, punct] = m;\n if (str != null) {\n if (colon != null) {\n nodes.push(\n <span key={i++} style={{ color: DEVTOOL_JSON_KEY }}>\n {str}\n </span>,\n );\n nodes.push(\n <span key={i++} style={{ color: DEVTOOL_JSON_PUNCTUATION }}>\n {colon}\n </span>,\n );\n } else {\n nodes.push(\n <span key={i++} style={{ color: DEVTOOL_JSON_STRING }}>\n {str}\n </span>,\n );\n }\n } else if (num != null) {\n nodes.push(\n <span key={i++} style={{ color: DEVTOOL_JSON_NUMBER }}>\n {num}\n </span>,\n );\n } else if (kw != null) {\n nodes.push(\n <span key={i++} style={{ color: DEVTOOL_JSON_KEYWORD }}>\n {kw}\n </span>,\n );\n } else if (punct != null) {\n nodes.push(\n <span key={i++} style={{ color: DEVTOOL_JSON_PUNCTUATION }}>\n {punct}\n </span>,\n );\n }\n last = JSON_TOKEN_RE.lastIndex;\n }\n if (last < text.length) nodes.push(text.slice(last));\n return nodes;\n}\n\n/** A pre-formatted, syntax-highlighted JSON block. */\nexport function JsonView({\n value,\n indent = 2,\n style,\n}: {\n value: unknown;\n indent?: number;\n style?: CSSProperties;\n}) {\n const text = safeStringify(value, indent);\n return (\n <pre\n style={{\n margin: 0,\n padding: \"8px 10px\",\n borderRadius: \"4px\",\n fontSize: \"11px\",\n lineHeight: 1.5,\n fontFamily: MONO_FONT,\n background: DEVTOOL_SECTION_STRING_BACKGROUND,\n overflowX: \"auto\",\n whiteSpace: \"pre-wrap\",\n wordBreak: \"break-word\",\n ...style,\n }}\n >\n {renderColoredJson(text)}\n </pre>\n );\n}\n","// ─── Shared devtools dock coordinator ────────────────────────────────────────\n//\n// The nice-action and nice-state devtools are independent packages, but when\n// both are mounted on the same page their panels would fight over screen space,\n// over `document.body`'s margins, and their collapsed launch buttons would land\n// on top of each other. This coordinator lets them cooperate WITHOUT importing\n// each other: it lives on a single versioned `window` global (the same approach\n// the React DevTools hook uses), so whichever package loads first installs the\n// engine and the other simply reuses it.\n//\n// Responsibilities:\n// • Own all four `document.body` margins centrally (no more stomping).\n// • Stack panels docked to the same side so they sit edge-to-edge (`dockOffset`).\n// • Provide a single \"primary\" devtool that renders ONE combined launcher\n// listing every devtool while they are all closed.\n// • Tell each OPEN panel which other devtools are still closed, so it can offer\n// to open them from its own header.\n//\n// This now lives in nice-devtools-shared so both packages link the SAME engine\n// at the source level. The `window` global + VERSION guard is still kept so a\n// page mixing mismatched published versions falls back gracefully.\n\nexport type TDockSide = \"top\" | \"bottom\" | \"left\" | \"right\";\n\n/** A handle to one registered devtool, used to render launch controls. */\nexport interface IDockDevtoolRef {\n id: string;\n label: string;\n icon: string;\n badge?: string;\n onOpen: () => void;\n}\n\n/** The live, syncable part of a devtool's registration. */\nexport interface IDockDevtoolSync {\n side: TDockSide;\n size: number;\n open: boolean;\n badge?: string;\n}\n\nexport interface IDockDevtoolInput extends IDockDevtoolSync {\n id: string;\n label: string;\n icon: string;\n onOpen: () => void;\n}\n\nexport interface IDockView {\n /** Offset (px) from the docked edge — stacks open panels on the same side. */\n dockOffset: number;\n /**\n * True when this panel shares its dock side with another open panel (stacked\n * either nearer or further from the edge). Stacked panels square off all their\n * corners so they sit flush as one continuous block — only a panel alone on\n * its side keeps its rounded, page-facing corners.\n */\n stacked: boolean;\n /** Is any devtool on the page currently open? */\n anyOpen: boolean;\n /** First-registered devtool — the one that renders the combined launcher. */\n isPrimary: boolean;\n /** Every registered devtool, for the combined launcher. */\n devtools: IDockDevtoolRef[];\n /** Closed devtools other than this one, for an open panel's header. */\n otherClosed: IDockDevtoolRef[];\n}\n\nexport interface IDevtoolsDockCoordinator {\n version: number;\n register(panel: IDockDevtoolInput): () => void;\n update(id: string, next: IDockDevtoolSync): void;\n getView(id: string): IDockView;\n subscribe(listener: () => void): () => void;\n}\n\nconst GLOBAL_KEY = \"__NICE_DEVTOOLS_DOCK__\";\nconst VERSION = 4;\n\nfunction createCoordinator(): IDevtoolsDockCoordinator {\n // Insertion order is preserved by Map, giving panels a stable stacking order\n // and a deterministic \"primary\" (the first registered).\n const panels = new Map<string, IDockDevtoolInput>();\n const listeners = new Set<() => void>();\n\n function toRef(panel: IDockDevtoolInput): IDockDevtoolRef {\n return {\n id: panel.id,\n label: panel.label,\n icon: panel.icon,\n badge: panel.badge,\n onOpen: panel.onOpen,\n };\n }\n\n function applyBodyMargins(): void {\n if (typeof document === \"undefined\") return;\n const margins: Record<TDockSide, number> = { top: 0, bottom: 0, left: 0, right: 0 };\n for (const panel of panels.values()) {\n if (panel.open) margins[panel.side] += panel.size;\n }\n const sides: TDockSide[] = [\"top\", \"bottom\", \"left\", \"right\"];\n for (const side of sides) {\n if (margins[side] > 0) {\n document.body.style.setProperty(`margin-${side}`, `${margins[side]}px`);\n } else {\n document.body.style.removeProperty(`margin-${side}`);\n }\n }\n }\n\n function notify(): void {\n applyBodyMargins();\n for (const listener of listeners) listener();\n }\n\n return {\n version: VERSION,\n register(panel) {\n panels.set(panel.id, { ...panel });\n notify();\n return () => {\n panels.delete(panel.id);\n notify();\n };\n },\n update(id, next) {\n const existing = panels.get(id);\n if (existing == null) return;\n if (\n existing.side === next.side &&\n existing.size === next.size &&\n existing.open === next.open &&\n existing.badge === next.badge\n ) {\n return;\n }\n panels.set(id, { ...existing, ...next });\n notify();\n },\n getView(id) {\n const list = [...panels.values()];\n const anyOpen = list.some((p) => p.open);\n const firstId = list.length > 0 ? list[0].id : null;\n\n let dockOffset = 0;\n let stacked = false;\n const self = panels.get(id);\n if (self != null && self.open) {\n let seenSelf = false;\n for (const panel of list) {\n if (panel.id === id) {\n seenSelf = true;\n continue;\n }\n if (panel.open && panel.side === self.side) {\n // Any open neighbour on the same side means we're stacked. Panels\n // earlier in the list stack closer to the dock edge (and add to our\n // offset); later ones stack beyond us, away from the edge.\n stacked = true;\n if (!seenSelf) dockOffset += panel.size;\n }\n }\n }\n\n return {\n dockOffset,\n stacked,\n anyOpen,\n isPrimary: id === firstId,\n devtools: list.map(toRef),\n otherClosed: list.filter((p) => !p.open && p.id !== id).map(toRef),\n };\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n };\n}\n\n/**\n * Returns the page-wide dock coordinator, installing it on `window` the first\n * time it is requested. On the server (no `window`) a throwaway instance is\n * returned so callers can use it unconditionally.\n */\nexport function getDevtoolsDockCoordinator(): IDevtoolsDockCoordinator {\n if (typeof window === \"undefined\") return createCoordinator();\n\n const host = window as unknown as Record<string, IDevtoolsDockCoordinator | undefined>;\n const existing = host[GLOBAL_KEY];\n if (existing != null && existing.version === VERSION) return existing;\n\n const created = createCoordinator();\n host[GLOBAL_KEY] = created;\n return created;\n}\n","import type { Virtualizer } from \"@tanstack/react-virtual\";\nimport { type RefObject, useCallback, useLayoutEffect, useRef } from \"react\";\n\n/**\n * Pin a virtualized list's viewport to a stable anchor row across list\n * mutations. Both devtools timelines are newest-first, so new entries (and\n * merges) prepend at the top; without this they shove whatever the user is\n * looking at downward. The anchor is the selected row when one is visible,\n * otherwise the first visible row, so \"the thing I selected / am reading\" stays\n * put at the same screen position. Returns an `onScroll` handler that must be\n * wired to the scroll container.\n *\n * `hoveringRef` is optional. When provided, the hook keeps the viewport still\n * even across selection changes while the cursor is over the list — the caller\n * is expected to suppress its own scroll-into-view in that case and let this\n * hold the view rock-still (nice-action's pause-on-hover behaviour). When\n * omitted, a selection change yields to the caller's scroll-into-view effect.\n */\nexport function useListScrollAnchor({\n containerRef,\n virtualizer,\n itemKeys,\n selectedKey,\n hoveringRef,\n}: {\n containerRef: RefObject<HTMLDivElement | null>;\n virtualizer: Virtualizer<HTMLDivElement, Element>;\n itemKeys: string[];\n selectedKey: string | null;\n hoveringRef?: RefObject<boolean>;\n}): () => void {\n const anchorRef = useRef<{ key: string; delta: number } | null>(null);\n const selectedKeyRef = useRef(selectedKey);\n selectedKeyRef.current = selectedKey;\n\n // Record where the anchor row sits relative to the viewport top. Called on every scroll (incl.\n // programmatic ones), so it always reflects the last position the user actually saw.\n const captureAnchor = useCallback(() => {\n const el = containerRef.current;\n if (el == null) return;\n const items = virtualizer.getVirtualItems();\n if (items.length === 0) {\n anchorRef.current = null;\n return;\n }\n const scrollTop = el.scrollTop;\n const sel = selectedKeyRef.current;\n const chosen =\n (sel != null ? items.find((vi) => String(vi.key) === sel) : undefined) ??\n items.find((vi) => vi.end > scrollTop) ??\n items[0];\n anchorRef.current = { key: String(chosen.key), delta: chosen.start - scrollTop };\n }, [containerRef, virtualizer]);\n\n const prevSelectedRef = useRef(selectedKey);\n useLayoutEffect(() => {\n const selectionChanged = prevSelectedRef.current !== selectedKey;\n prevSelectedRef.current = selectedKey;\n // A selection change is normally handled by the caller's scroll-into-view effect — don't fight it.\n // We only re-pin when the list data shifted underneath a stable selection. The exception is while\n // hovering: the caller suppresses its scroll-into-view, so we own keeping the view still and must\n // re-pin through selection changes (e.g. \"stay on latest\" re-selecting each new entry) too.\n if (selectionChanged && !(hoveringRef?.current ?? false)) return;\n const anchor = anchorRef.current;\n if (anchor == null) return;\n const index = itemKeys.indexOf(anchor.key);\n if (index < 0) return;\n const offset = virtualizer.getOffsetForIndex(index, \"start\")?.[0];\n if (offset == null) return;\n const target = Math.max(0, offset - anchor.delta);\n const current = virtualizer.scrollOffset ?? 0;\n if (Math.abs(target - current) > 1) virtualizer.scrollToOffset(target);\n }, [itemKeys, selectedKey, virtualizer, hoveringRef]);\n\n return captureAnchor;\n}\n","import { DEVTOOL_COLOR_SEMANTIC_SYSTEM } from \"../colors\";\n\n/** Small uppercase heading used above a detail/section block. */\nexport function SectionLabel({\n label,\n color = DEVTOOL_COLOR_SEMANTIC_SYSTEM,\n}: {\n label: string;\n color?: string;\n}) {\n return (\n <div\n style={{\n color,\n fontSize: \"0.85em\",\n marginBottom: \"3px\",\n textTransform: \"uppercase\",\n letterSpacing: \"0.05em\",\n fontWeight: 500,\n textAlign: \"left\",\n }}\n >\n {label}\n </div>\n );\n}\n","import { type CSSProperties, type ReactNode, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n DEVTOOL_COLOR_TEXT_SECONDARY,\n DEVTOOL_TOOLTIP_BACKGROUND,\n DEVTOOL_TOOLTIP_BORDER,\n DEVTOOL_TOOLTIP_TITLE_BACKGROUND,\n DEVTOOL_TOOLTIP_TITLE_BOTTOM_BORDER,\n} from \"../colors\";\n\nexport interface ITooltipConfig {\n content: ReactNode;\n title?: ReactNode;\n /** \"center\" centers the tooltip above/below the anchor (default).\n * \"edge\" aligns the nearer horizontal edge with the anchor edge. */\n align?: \"center\" | \"edge\";\n maxWidth?: number;\n}\n\nexport function Tooltip({\n anchor,\n config,\n children,\n}: {\n anchor: DOMRect;\n config: ITooltipConfig;\n children?: ReactNode;\n}) {\n const resolvedTitle = config?.title;\n const resolvedAlign = config?.align;\n const resolvedMaxWidth = config?.maxWidth ?? 400;\n const resolvedContent = config != null ? config.content : children;\n\n const showAbove = anchor.top >= window.innerHeight - anchor.bottom;\n const gap = 6;\n const screenMargin = 16;\n const top = showAbove ? Math.round(anchor.top - gap) : Math.round(anchor.bottom + gap);\n const maxHeight = showAbove\n ? Math.round(anchor.top - gap - screenMargin)\n : Math.round(window.innerHeight - anchor.bottom - gap - screenMargin);\n\n let left: number | undefined;\n let right: number | undefined;\n let transform: string | undefined;\n\n if (resolvedAlign === \"center\") {\n const halfMax = resolvedMaxWidth != null ? resolvedMaxWidth / 2 : 120;\n const center = Math.round(anchor.left + anchor.width / 2);\n left = Math.max(\n halfMax + screenMargin,\n Math.min(center, window.innerWidth - halfMax - screenMargin),\n );\n transform = showAbove ? \"translateX(-50%) translateY(-100%)\" : \"translateX(-50%)\";\n } else {\n const anchorMidX = anchor.left + anchor.width / 2;\n if (anchorMidX <= window.innerWidth / 2) {\n left = Math.max(screenMargin, anchor.left);\n } else {\n right = Math.max(screenMargin, window.innerWidth - anchor.right);\n }\n if (showAbove) transform = \"translateY(-100%)\";\n }\n\n // Render into a portal at the document root. The tooltip is positioned in viewport coordinates\n // (position: fixed), but list rows are virtualized inside a `transform: translateY()` container —\n // a transformed ancestor becomes the containing block for fixed descendants and (with its\n // `overflow: hidden`) clips them, mispositioning and hiding the tooltip. Portaling out of that\n // subtree restores true viewport-fixed behaviour everywhere.\n return createPortal(\n <div\n style={{\n position: \"fixed\",\n left,\n right,\n top,\n transform,\n zIndex: 2147483647,\n background: DEVTOOL_TOOLTIP_BACKGROUND,\n border: `1px solid ${DEVTOOL_TOOLTIP_BORDER}`,\n borderRadius: \"5px\",\n boxShadow: \"0 4px 20px rgba(0,0,0,0.6)\",\n pointerEvents: \"none\",\n maxWidth: resolvedMaxWidth != null ? `${resolvedMaxWidth}px` : undefined,\n maxHeight: `${maxHeight}px`,\n overflowY: \"auto\",\n overflowX: \"hidden\",\n // Reset inherited white-space: tooltips are DOM descendants of anchors\n // (e.g. Chip sets `nowrap`), which would otherwise stop content wrapping.\n whiteSpace: \"normal\",\n wordBreak: \"break-word\",\n overflowWrap: \"anywhere\",\n }}\n >\n {resolvedTitle != null && (\n <div\n style={{\n background: DEVTOOL_TOOLTIP_TITLE_BACKGROUND,\n padding: \"6px 8px\",\n alignSelf: \"start\",\n textAlign: \"left\",\n color: DEVTOOL_COLOR_TEXT_SECONDARY,\n fontSize: \"0.75rem\",\n fontWeight: 600,\n paddingBottom: \"4px\",\n marginBottom: \"4px\",\n borderBottom: `1px solid ${DEVTOOL_TOOLTIP_TITLE_BOTTOM_BORDER}`,\n }}\n >\n {resolvedTitle}\n </div>\n )}\n <div\n style={{\n padding: \"6px 8px\",\n }}\n >\n {resolvedContent}\n </div>\n </div>,\n document.body,\n );\n}\n\n/**\n * Wraps inline content so it shows `config` as a hover tooltip. When `config` is null the children\n * render untouched (no hover handlers, no tooltip). Useful for non-Chip text labels that still need\n * the same tooltip treatment as Chips.\n */\nexport function HoverTooltip({\n config,\n children,\n style,\n}: {\n config?: ITooltipConfig;\n children: ReactNode;\n style?: CSSProperties;\n}) {\n const [anchor, setAnchor] = useState<DOMRect | null>(null);\n const enabled = config != null;\n\n return (\n <>\n <span\n onMouseEnter={\n enabled ? (e) => setAnchor(e.currentTarget.getBoundingClientRect()) : undefined\n }\n onMouseLeave={enabled ? () => setAnchor(null) : undefined}\n style={{ ...style, cursor: enabled ? \"default\" : style?.cursor }}\n >\n {children}\n </span>\n {enabled && anchor != null && config != null && <Tooltip anchor={anchor} config={config} />}\n </>\n );\n}\n","import {\n type CSSProperties,\n type MouseEvent as ReactMouseEvent,\n type ReactNode,\n useState,\n} from \"react\";\nimport {\n DEVTOOL_COLOR_SEMANTIC_SYSTEM,\n DEVTOOL_COLOR_TEXT_FAINT,\n DEVTOOL_COLOR_TEXT_MUTED,\n DEVTOOL_COLOR_TEXT_SECONDARY,\n DEVTOOL_LIST_BASE_BACKGROUND,\n DEVTOOL_SECTION_BACKGROUND,\n MONO_FONT,\n SANS_FONT,\n} from \"../colors\";\nimport type { TDockSide } from \"../dock\";\n\n/** Where a devtools panel is docked. */\nexport type TDevtoolsPosition = \"dock-bottom\" | \"dock-top\" | \"dock-left\" | \"dock-right\";\n\nexport interface IDevtoolsLauncherItem {\n id: string;\n label: string;\n icon: string;\n badge?: string;\n onOpen: () => void;\n}\n\nconst DOCKED_SIZE_MIN = 140;\n\n// 3×3 picker grid. Each slot has a stable key so the empty corners don't collide\n// (a single shared key for all of them triggers React's duplicate-key warning).\nconst POSITION_GRID: { key: string; pos: TDevtoolsPosition | null }[] = [\n { key: \"tl\", pos: null },\n { key: \"tc\", pos: \"dock-top\" },\n { key: \"tr\", pos: null },\n { key: \"ml\", pos: \"dock-left\" },\n { key: \"mc\", pos: null },\n { key: \"mr\", pos: \"dock-right\" },\n { key: \"bl\", pos: null },\n { key: \"bc\", pos: \"dock-bottom\" },\n { key: \"br\", pos: null },\n];\n\nexport function getDockSide(pos: TDevtoolsPosition): TDockSide {\n switch (pos) {\n case \"dock-top\":\n return \"top\";\n case \"dock-left\":\n return \"left\";\n case \"dock-right\":\n return \"right\";\n default:\n return \"bottom\";\n }\n}\n\nfunction chromeButtonStyle(color: string): CSSProperties {\n return {\n background: \"none\",\n border: \"none\",\n color,\n cursor: \"pointer\",\n fontSize: \"11px\",\n padding: 0,\n fontFamily: SANS_FONT,\n whiteSpace: \"nowrap\",\n };\n}\n\n/**\n * The panel's top chrome: a brand/title on the left (plus pills to open any other\n * closed devtools), and the panel controls on the right. The controls column\n * holds any caller-provided `children` (e.g. a mode switch) above a row of the\n * pause/clear actions, then the dock-position picker and the close button.\n *\n * `onTogglePause` is optional — when omitted no pause control is shown (the\n * nice-action timeline has nothing to pause), keeping a single header component\n * consistent across both devtools suites.\n */\nexport function PanelHeader({\n title,\n position,\n onPositionChange,\n onClose,\n onClear,\n paused,\n onTogglePause,\n openOthers,\n children,\n}: {\n title: string;\n position: TDevtoolsPosition;\n onPositionChange: (p: TDevtoolsPosition) => void;\n onClose: () => void;\n onClear?: () => void;\n paused?: boolean;\n onTogglePause?: () => void;\n openOthers?: IDevtoolsLauncherItem[];\n children?: ReactNode;\n}) {\n const hasActionsRow = onTogglePause != null || onClear != null;\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"6px 11px\",\n gap: \"10px\",\n background: DEVTOOL_SECTION_BACKGROUND,\n borderBottom: `1px solid ${DEVTOOL_LIST_BASE_BACKGROUND}`,\n flexShrink: 0,\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"8px\", minWidth: 0 }}>\n <span\n style={{\n color: DEVTOOL_COLOR_SEMANTIC_SYSTEM,\n fontWeight: \"bold\",\n fontSize: \"11px\",\n whiteSpace: \"nowrap\",\n }}\n >\n {title}\n </span>\n {openOthers?.map((item) => (\n <button\n key={item.id}\n onClick={item.onOpen}\n title={`Open ${item.label} devtools`}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"4px\",\n background: DEVTOOL_LIST_BASE_BACKGROUND,\n border: `1px solid ${DEVTOOL_COLOR_TEXT_FAINT}`,\n borderRadius: \"999px\",\n color: DEVTOOL_COLOR_TEXT_MUTED,\n cursor: \"pointer\",\n fontSize: \"10px\",\n padding: \"1px 7px 1px 6px\",\n fontFamily: SANS_FONT,\n whiteSpace: \"nowrap\",\n }}\n >\n <span>{item.icon}</span>\n <span>{item.label}</span>\n {item.badge != null && (\n <span style={{ color: DEVTOOL_COLOR_SEMANTIC_SYSTEM }}>{item.badge}</span>\n )}\n </button>\n ))}\n </div>\n <div style={{ display: \"flex\", gap: \"10px\", alignItems: \"center\" }}>\n <div style={{ display: \"flex\", flexDirection: \"column\", alignItems: \"stretch\" }}>\n {children}\n {hasActionsRow && (\n <div\n style={{\n display: \"flex\",\n gap: \"10px\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"3px\",\n }}\n >\n {onTogglePause != null && (\n <button\n onClick={onTogglePause}\n title={paused ? \"Resume recording\" : \"Pause recording\"}\n style={chromeButtonStyle(\n paused ? DEVTOOL_COLOR_SEMANTIC_SYSTEM : DEVTOOL_COLOR_TEXT_MUTED,\n )}\n >\n {paused ? \"▶ resume\" : \"⏸ pause\"}\n </button>\n )}\n {onClear != null && (\n <button onClick={onClear} style={chromeButtonStyle(DEVTOOL_COLOR_TEXT_MUTED)}>\n clear\n </button>\n )}\n </div>\n )}\n </div>\n <PositionPicker position={position} onChange={onPositionChange} />\n <button\n onClick={onClose}\n style={{ ...chromeButtonStyle(DEVTOOL_COLOR_TEXT_MUTED), fontSize: \"16px\", lineHeight: \"1\" }}\n >\n ×\n </button>\n </div>\n </div>\n );\n}\n\nfunction PositionPicker({\n position,\n onChange,\n}: {\n position: TDevtoolsPosition;\n onChange: (p: TDevtoolsPosition) => void;\n}) {\n return (\n <div\n title=\"Move / dock panel\"\n style={{ display: \"grid\", gridTemplateColumns: \"repeat(3, 9px)\", gap: \"2px\", padding: \"2px\" }}\n >\n {POSITION_GRID.map(({ key, pos }) => {\n if (pos == null) return <div key={key} style={{ width: \"9px\", height: \"9px\" }} />;\n const isTopBottom = pos === \"dock-top\" || pos === \"dock-bottom\";\n const isActive = pos === position;\n return (\n <div\n key={key}\n title={pos}\n onClick={() => onChange(pos)}\n style={{\n width: \"9px\",\n height: \"9px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: \"pointer\",\n }}\n >\n <div\n style={{\n width: isTopBottom ? \"9px\" : \"3px\",\n height: isTopBottom ? \"3px\" : \"9px\",\n borderRadius: \"1px\",\n background: isActive ? DEVTOOL_COLOR_SEMANTIC_SYSTEM : DEVTOOL_COLOR_TEXT_FAINT,\n }}\n />\n </div>\n );\n })}\n </div>\n );\n}\n\nexport function ResizeHandle({\n dockSide,\n dockedSize,\n onChange,\n}: {\n dockSide: TDockSide;\n dockedSize: number;\n onChange: (size: number) => void;\n}) {\n const isHoriz = dockSide === \"left\" || dockSide === \"right\";\n\n const onMouseDown = (e: ReactMouseEvent<HTMLDivElement>) => {\n e.preventDefault();\n const startCoord = isHoriz ? e.clientX : e.clientY;\n const startSize = dockedSize;\n const maxSize = isHoriz ? window.innerWidth * 0.85 : window.innerHeight * 0.85;\n const sign = dockSide === \"bottom\" || dockSide === \"right\" ? -1 : 1;\n\n const onMove = (me: MouseEvent) => {\n const delta = (isHoriz ? me.clientX : me.clientY) - startCoord;\n onChange(Math.max(DOCKED_SIZE_MIN, Math.min(maxSize, startSize + sign * delta)));\n };\n const onUp = () => {\n window.removeEventListener(\"mousemove\", onMove);\n window.removeEventListener(\"mouseup\", onUp);\n };\n window.addEventListener(\"mousemove\", onMove);\n window.addEventListener(\"mouseup\", onUp);\n };\n\n const edgeStyle: CSSProperties =\n dockSide === \"bottom\"\n ? { top: 0, left: 0, right: 0, height: \"5px\", cursor: \"ns-resize\" }\n : dockSide === \"top\"\n ? { bottom: 0, left: 0, right: 0, height: \"5px\", cursor: \"ns-resize\" }\n : dockSide === \"right\"\n ? { top: 0, bottom: 0, left: 0, width: \"5px\", cursor: \"ew-resize\" }\n : { top: 0, bottom: 0, right: 0, width: \"5px\", cursor: \"ew-resize\" };\n\n return (\n <div\n onMouseDown={onMouseDown}\n style={{ position: \"absolute\", zIndex: 10, background: \"transparent\", ...edgeStyle }}\n />\n );\n}\n\nconst SPLIT_RATIO_MIN = 0.15;\nconst SPLIT_RATIO_MAX = 0.85;\n\n/**\n * Draggable divider between the list and the detail pane. `horizontal` refers to\n * the split axis: a row layout (dock top/bottom) splits horizontally and drags\n * left/right; a column layout (dock left/right) splits vertically. The reported\n * ratio is the fraction of the container the *detail* pane should occupy.\n */\nexport function SplitHandle({\n horizontal,\n onRatioChange,\n}: {\n horizontal: boolean;\n onRatioChange: (ratio: number) => void;\n}) {\n const [hovered, setHovered] = useState(false);\n\n const onMouseDown = (e: ReactMouseEvent<HTMLDivElement>) => {\n e.preventDefault();\n const container = e.currentTarget.parentElement;\n if (container == null) return;\n\n const onMove = (me: MouseEvent) => {\n const rect = container.getBoundingClientRect();\n // Detail sits after the handle (right / bottom), so its size is measured\n // from the far edge back to the cursor.\n const ratio = horizontal\n ? (rect.right - me.clientX) / rect.width\n : (rect.bottom - me.clientY) / rect.height;\n onRatioChange(Math.max(SPLIT_RATIO_MIN, Math.min(SPLIT_RATIO_MAX, ratio)));\n };\n const onUp = () => {\n window.removeEventListener(\"mousemove\", onMove);\n window.removeEventListener(\"mouseup\", onUp);\n };\n window.addEventListener(\"mousemove\", onMove);\n window.addEventListener(\"mouseup\", onUp);\n };\n\n return (\n <div\n onMouseDown={onMouseDown}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n style={{\n flex: \"0 0 5px\",\n alignSelf: \"stretch\",\n cursor: horizontal ? \"ew-resize\" : \"ns-resize\",\n background: hovered ? DEVTOOL_COLOR_SEMANTIC_SYSTEM : \"transparent\",\n opacity: hovered ? 0.6 : 1,\n zIndex: 5,\n }}\n />\n );\n}\n\n/** A compact segmented toggle (e.g. the nice-state Timeline / State switch). */\nexport function SegmentedControl<T extends string>({\n options,\n value,\n onChange,\n}: {\n options: { value: T; label: string }[];\n value: T;\n onChange: (value: T) => void;\n}) {\n return (\n <div\n style={{\n display: \"flex\",\n border: `1px solid ${DEVTOOL_COLOR_TEXT_FAINT}`,\n borderRadius: \"5px\",\n overflow: \"hidden\",\n }}\n >\n {options.map((opt) => {\n const active = opt.value === value;\n return (\n <button\n key={opt.value}\n onClick={() => onChange(opt.value)}\n style={{\n background: active ? DEVTOOL_COLOR_SEMANTIC_SYSTEM : \"transparent\",\n color: active ? \"#0f172a\" : DEVTOOL_COLOR_TEXT_MUTED,\n border: \"none\",\n cursor: \"pointer\",\n fontSize: \"10px\",\n fontWeight: active ? 700 : 500,\n padding: \"3px 9px\",\n fontFamily: SANS_FONT,\n }}\n >\n {opt.label}\n </button>\n );\n })}\n </div>\n );\n}\n\n/**\n * The combined, page-wide launcher shown while every devtool is collapsed — one\n * grouped pill with a segment per registered devtool, so the buttons never\n * overlap or hide behind each other. Rendered by the coordinator's \"primary\"\n * devtool only.\n */\nexport function DevtoolsLauncher({ items }: { items: IDevtoolsLauncherItem[] }) {\n return (\n <div\n style={{\n position: \"fixed\",\n bottom: \"16px\",\n right: \"16px\",\n zIndex: 2147483647,\n display: \"flex\",\n fontFamily: MONO_FONT,\n fontSize: \"12px\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n background: DEVTOOL_SECTION_BACKGROUND,\n border: `1px solid ${DEVTOOL_COLOR_TEXT_FAINT}`,\n borderRadius: \"6px\",\n overflow: \"hidden\",\n boxShadow: \"0 8px 24px rgba(0,0,0,0.35)\",\n }}\n >\n {items.map((item, i) => (\n <button\n key={item.id}\n onClick={item.onOpen}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"5px\",\n background: \"transparent\",\n color: DEVTOOL_COLOR_TEXT_SECONDARY,\n border: \"none\",\n borderLeft: i > 0 ? `1px solid ${DEVTOOL_COLOR_TEXT_FAINT}` : \"none\",\n cursor: \"pointer\",\n padding: \"6px 11px\",\n fontFamily: MONO_FONT,\n fontSize: \"12px\",\n lineHeight: \"1.5\",\n }}\n >\n <span>{item.icon}</span>\n <span>{item.label}</span>\n {item.badge != null && (\n <span style={{ color: DEVTOOL_COLOR_SEMANTIC_SYSTEM }}>{item.badge}</span>\n )}\n </button>\n ))}\n </div>\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\nimport {\n DEVTOOL_COLOR_SEMANTIC_SYSTEM,\n DEVTOOL_COLOR_TEXT_MUTED,\n DEVTOOL_COLOR_TEXT_SECONDARY,\n DEVTOOL_LIST_BASE_BACKGROUND,\n DEVTOOL_SECTION_BACKGROUND,\n SANS_FONT,\n} from \"../colors\";\n\n/**\n * The \"Follow latest\" toggle pair shown above a devtools timeline list, with its\n * indented \"clicking latest re-follows\" sub-option. `noun` is the thing the\n * timeline tracks (\"action\" in nice-action, \"change\" in nice-state) and is woven\n * into the explanatory tooltips so both suites read naturally from one component.\n */\nexport function FollowLatestToggles({\n noun,\n stayOnLatest,\n onStayOnLatestChange,\n followLatestOnSelect,\n onFollowLatestOnSelectChange,\n}: {\n noun: string;\n stayOnLatest: boolean;\n onStayOnLatestChange: (next: boolean) => void;\n followLatestOnSelect: boolean;\n onFollowLatestOnSelectChange: (next: boolean) => void;\n}) {\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n flexShrink: 0,\n paddingBottom: \"3px\",\n background: DEVTOOL_SECTION_BACKGROUND,\n borderBottom: `1px solid ${DEVTOOL_LIST_BASE_BACKGROUND}`,\n }}\n >\n <ToggleLabel\n title={`Auto-select the most recent ${noun} so the detail pane keeps showing the latest as new ${noun}s land`}\n checked={stayOnLatest}\n onChange={onStayOnLatestChange}\n >\n Follow latest\n </ToggleLabel>\n {/* Sub-option of \"Follow latest\": indented under it because it only tunes\n how following resumes when the latest entry is clicked. */}\n <div style={{ display: \"flex\", alignItems: \"center\", paddingLeft: \"12px\", marginTop: \"-4px\" }}>\n <span\n aria-hidden\n style={{\n color: DEVTOOL_COLOR_TEXT_MUTED,\n fontFamily: SANS_FONT,\n fontSize: \"10px\",\n lineHeight: 1,\n }}\n >\n └\n </span>\n <ToggleLabel\n title={`When you click the latest ${noun}, turn 'Follow latest' back on so the view resumes tracking new ${noun}s. Turn this off to pin exactly to the ${noun} you click instead.`}\n checked={followLatestOnSelect}\n onChange={onFollowLatestOnSelectChange}\n >\n clicking latest re-follows\n </ToggleLabel>\n </div>\n </div>\n );\n}\n\nfunction ToggleLabel({\n checked,\n onChange,\n title,\n children,\n}: {\n checked: boolean;\n onChange: (next: boolean) => void;\n title: string;\n children: ReactNode;\n}) {\n return (\n <label\n title={title}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n padding: \"5px 10px\",\n cursor: \"pointer\",\n userSelect: \"none\",\n color: checked ? DEVTOOL_COLOR_TEXT_SECONDARY : DEVTOOL_COLOR_TEXT_MUTED,\n fontSize: \"10px\",\n fontFamily: SANS_FONT,\n }}\n >\n <input\n type=\"checkbox\"\n checked={checked}\n onChange={(e) => onChange(e.target.checked)}\n style={{ accentColor: DEVTOOL_COLOR_SEMANTIC_SYSTEM, cursor: \"pointer\", margin: 0 }}\n />\n {children}\n </label>\n );\n}\n","import { useVirtualizer } from \"@tanstack/react-virtual\";\nimport { type CSSProperties, type ReactNode, useEffect, useMemo, useRef, useState } from \"react\";\nimport { DEVTOOL_COLOR_SEMANTIC_WARNING, DEVTOOL_TOOLTIP_BACKGROUND, SANS_FONT } from \"../colors\";\nimport { useListScrollAnchor } from \"../list\";\n\n/**\n * The shared, virtualized timeline list used by both the nice-action and\n * nice-state devtools. It owns everything about *how the list behaves* — windowed\n * rendering, viewport anchoring across prepends, scroll-the-selection-into-view,\n * and pause-on-hover with a \"N new\" catch-up hint — while each devtool supplies\n * its own `renderItem` for the row content (which stays unique per devtool).\n *\n * Behaviour notes:\n * • The list is assumed newest-first: new rows prepend at the top. While the\n * cursor is over the list the viewport is held perfectly still (so reading\n * isn't disrupted); fresh rows still render above and a sticky \"↑ N new\"\n * badge hints they're there. Move the cursor away and normal follow resumes.\n * • `selectedKey` is the stable item key of the selected row (NOT necessarily a\n * sub-selection inside it). When it changes the row is scrolled into view —\n * unless the cursor is hovering, in which case the view is left untouched.\n */\nexport function DevtoolsVirtualList<T>({\n items,\n getItemKey,\n renderItem,\n selectedKey,\n estimateSize,\n overscan = 8,\n rowStyle,\n empty,\n footer,\n style,\n}: {\n items: T[];\n /** Stable identity for a row — must not change as later items merge/prepend. */\n getItemKey: (item: T, index: number) => string;\n renderItem: (item: T, index: number) => ReactNode;\n /** Key of the currently-selected row, for anchoring + scroll-into-view. */\n selectedKey: string | null;\n /** Estimated row height (px) for the virtualizer. */\n estimateSize: number;\n overscan?: number;\n /** Extra style merged onto each absolutely-positioned row wrapper. */\n rowStyle?: CSSProperties;\n /** Rendered in place of the list when there are no items. */\n empty?: ReactNode;\n /** Rendered after the rows, inside the scroll container (e.g. a \"start of history\" cap). */\n footer?: ReactNode;\n style?: CSSProperties;\n}) {\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Pause-on-hover (auto-scroll only): while the cursor is over the list, new entries keep arriving\n // and rendering — the user can still scroll up to reach them — but the viewport must not move on\n // its own. A ref mirrors the state so effects can read it without re-subscribing.\n const [isHovering, setIsHovering] = useState(false);\n const hoveringRef = useRef(false);\n hoveringRef.current = isHovering;\n\n // New activity that arrived while hovering — surfaced as a small \"N new\" indicator so the user knows\n // there are fresh items above (the list is newest-first) without the view jumping to reveal them.\n const hoverBaselineCountRef = useRef(0);\n const pendingCount = isHovering ? Math.max(0, items.length - hoverBaselineCountRef.current) : 0;\n const hasPendingActivity = isHovering && pendingCount > 0;\n\n // Stable getItemKey across renders so the keys memo only recomputes when items change.\n const getItemKeyRef = useRef(getItemKey);\n getItemKeyRef.current = getItemKey;\n const itemKeys = useMemo(() => items.map((item, i) => getItemKeyRef.current(item, i)), [items]);\n\n const virtualizer = useVirtualizer({\n count: items.length,\n getScrollElement: () => containerRef.current,\n estimateSize: () => estimateSize,\n overscan,\n getItemKey: (index) => itemKeys[index],\n });\n\n const onScroll = useListScrollAnchor({\n containerRef,\n virtualizer,\n itemKeys,\n selectedKey,\n hoveringRef,\n });\n\n // Scroll the selected row into view when the selection changes. With \"follow latest\" this is also\n // what keeps the viewport pinned to the top: each new entry reselects the new latest (index 0), so\n // we scroll back up to it. The anchor hook above deliberately yields on selection changes.\n const prevSelectedRef = useRef(selectedKey);\n useEffect(() => {\n if (selectedKey === prevSelectedRef.current) return;\n prevSelectedRef.current = selectedKey;\n if (selectedKey == null) return;\n // While hovering, hold the view still — don't yank it to the (possibly auto-re-selected) latest\n // row. The scroll-anchor keeps the current position pinned; new rows still render above.\n if (hoveringRef.current) return;\n const index = itemKeys.indexOf(selectedKey);\n if (index >= 0) virtualizer.scrollToIndex(index, { align: \"auto\" });\n }, [selectedKey, itemKeys, virtualizer]);\n\n if (items.length === 0) return <>{empty}</>;\n\n return (\n <div\n ref={containerRef}\n style={style}\n onScroll={onScroll}\n onMouseEnter={() => {\n hoverBaselineCountRef.current = items.length;\n setIsHovering(true);\n }}\n onMouseLeave={() => setIsHovering(false)}\n >\n {hasPendingActivity && <PendingIndicator count={pendingCount} />}\n <div style={{ position: \"relative\", width: \"100%\", height: virtualizer.getTotalSize() }}>\n {virtualizer.getVirtualItems().map((vItem) => (\n <div\n key={vItem.key}\n data-index={vItem.index}\n ref={virtualizer.measureElement}\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n width: \"100%\",\n transform: `translateY(${vItem.start}px)`,\n ...rowStyle,\n }}\n >\n {renderItem(items[vItem.index], vItem.index)}\n </div>\n ))}\n </div>\n {footer}\n </div>\n );\n}\n\n/**\n * A sticky, zero-height overlay floating over the rows without taking layout space. Shown only once\n * new items have arrived while hovering, hinting they're above (newest-first) so the user can scroll\n * up without the view having jumped there.\n */\nfunction PendingIndicator({ count }: { count: number }) {\n return (\n <div style={{ position: \"sticky\", top: 0, height: 0, zIndex: 5, pointerEvents: \"none\" }}>\n <div\n style={{\n position: \"absolute\",\n top: \"6px\",\n right: \"10px\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"5px\",\n padding: \"2px 7px\",\n borderRadius: \"10px\",\n fontSize: \"10px\",\n fontFamily: SANS_FONT,\n color: DEVTOOL_COLOR_SEMANTIC_WARNING,\n background: DEVTOOL_TOOLTIP_BACKGROUND,\n border: `1px solid ${DEVTOOL_COLOR_SEMANTIC_WARNING}55`,\n boxShadow: \"0 2px 8px rgba(0,0,0,0.5)\",\n whiteSpace: \"nowrap\",\n }}\n >\n ↑ {count} new\n </div>\n </div>\n );\n}\n","import {\r\n DEVTOOL_COLOR_SEMANTIC_ERROR,\r\n DEVTOOL_COLOR_SEMANTIC_METADATA,\r\n DEVTOOL_COLOR_SEMANTIC_SUCCESS,\r\n DEVTOOL_COLOR_SEMANTIC_SYSTEM,\r\n DEVTOOL_COLOR_SEMANTIC_WARNING,\r\n DEVTOOL_COLOR_TEXT_FAINT,\r\n DEVTOOL_COLOR_TEXT_MUTED,\r\n DEVTOOL_SECTION_BACKGROUND,\r\n} from \"nice-devtools-shared\";\r\nimport type { IChipColorEntry } from \"../browser/components/Chip\";\r\n\r\n// The shared palette (semantic tokens, text hierarchy, surfaces, tooltip + JSON\r\n// colours, fonts) is the single source of truth across the nice-* devtools.\r\n// Re-exported by name (not `export *`) so bundlers reliably link the external\r\n// package — a bare `export *` from a dependency tripped Bun's bundler.\r\nexport {\r\n DEVTOOL_COLOR_SEMANTIC_ERROR,\r\n DEVTOOL_COLOR_SEMANTIC_METADATA,\r\n DEVTOOL_COLOR_SEMANTIC_SUCCESS,\r\n DEVTOOL_COLOR_SEMANTIC_SYSTEM,\r\n DEVTOOL_COLOR_SEMANTIC_WARNING,\r\n DEVTOOL_COLOR_TEXT_EMPHASIS,\r\n DEVTOOL_COLOR_TEXT_FAINT,\r\n DEVTOOL_COLOR_TEXT_MUTED,\r\n DEVTOOL_COLOR_TEXT_SECONDARY,\r\n DEVTOOL_DETAIL_BASE_BACKGROUND,\r\n DEVTOOL_DETAIL_HEADER_BACKGROUND,\r\n DEVTOOL_ERROR_BACKGROUND,\r\n DEVTOOL_JSON_KEY,\r\n DEVTOOL_JSON_KEYWORD,\r\n DEVTOOL_JSON_NUMBER,\r\n DEVTOOL_JSON_PUNCTUATION,\r\n DEVTOOL_JSON_STRING,\r\n DEVTOOL_LIST_BASE_BACKGROUND,\r\n DEVTOOL_LIST_SELECTED_BACKGROUND,\r\n DEVTOOL_PANEL_BORDER,\r\n DEVTOOL_PANEL_DIVIDER_BORDER,\r\n DEVTOOL_SECTION_BACKGROUND,\r\n DEVTOOL_SECTION_STRING_BACKGROUND,\r\n DEVTOOL_TOOLTIP_BACKGROUND,\r\n DEVTOOL_TOOLTIP_BORDER,\r\n DEVTOOL_TOOLTIP_TITLE_BACKGROUND,\r\n DEVTOOL_TOOLTIP_TITLE_BOTTOM_BORDER,\r\n MONO_FONT,\r\n SANS_FONT,\r\n} from \"nice-devtools-shared\";\r\n\r\n// ─── Handler chip colours (role-specific, not status) ─────────────────────────\r\nexport const DEVTOOL_COLOR_HANDLER_LOCAL_TEXT = \"#34bb89\";\r\nexport const DEVTOOL_COLOR_HANDLER_LOCAL_BORDER = \"#144427\";\r\nexport const DEVTOOL_COLOR_HANDLER_EXTERNAL_TEXT = \"#cfa12a\";\r\nexport const DEVTOOL_COLOR_HANDLER_EXTERNAL_BORDER = \"#723917\";\r\n\r\n// ─── nice-action-specific surfaces ────────────────────────────────────────────\r\nexport const DEVTOOL_LIST_HEADER_SELECTED_BACKGROUND = \"#1d2942\";\r\nexport const DEVTOOL_LIST_GROUP_DIVIDER = \"#101109\";\r\nexport const DEVTOOL_STACK_TRACE_BACKGROUND = \"#040a13\";\r\nexport const DEVTOOL_ERROR_BADGE_BACKGROUND = \"#2d0f0f\";\r\n\r\n// ─── Call stack ───────────────────────────────────────────────────────────────\r\nexport const DEVTOOL_COLOR_CALL_STACK_DIVIDER = \"#0a1120\";\r\n\r\n// ─── Stack trace frame colours (user vs internal) ─────────────────────────────\r\nexport const DEVTOOL_STACK_FRAME_USER_NUMBER = \"#64748b\";\r\nexport const DEVTOOL_STACK_FRAME_USER_FUNCTION = \"#e2e8f0\";\r\nexport const DEVTOOL_STACK_FRAME_USER_FOLDER = \"#596b83\";\r\nexport const DEVTOOL_STACK_FRAME_USER_FILE = \"#8a9ebb\";\r\nexport const DEVTOOL_STACK_FRAME_USER_LINE = \"#4a7fa8\";\r\nexport const DEVTOOL_STACK_FRAME_INTERNAL_NUMBER = \"#2d3f53\";\r\nexport const DEVTOOL_STACK_FRAME_INTERNAL_FUNCTION = \"#50698b\";\r\nexport const DEVTOOL_STACK_FRAME_INTERNAL_FOLDER = \"#2d3f53\";\r\nexport const DEVTOOL_STACK_FRAME_INTERNAL_FILE = \"#425979\";\r\nexport const DEVTOOL_STACK_FRAME_INTERNAL_LINE = \"#2d4a63\";\r\n\r\n// ─── Chip / Icon semantic colour table ───────────────────────────────────────\r\n// Chip and Icon components resolve colours exclusively through this table.\r\n// ESemanticThing names what a UI element *is*; SEMANTIC_COLORS maps it to paint.\r\n// The age_latest chip reuses the base status entries (failed/action_error/aborted/\r\n// running_action) — no separate variants needed.\r\n\r\nexport enum ESemanticThing {\r\n // Status / outcome\r\n running_action = \"running_action\",\r\n success = \"success\",\r\n action_error = \"action_error\",\r\n failed = \"failed\",\r\n aborted = \"aborted\",\r\n error = \"error\", // error chip in list / tooltip\r\n // Role / classification\r\n domain = \"domain\",\r\n handler_local = \"handler_local\",\r\n handler_external = \"handler_external\",\r\n origin = \"origin\", // runtime an action was received from (inbound / pushed actions)\r\n // List decorators\r\n age = \"age\", // non-latest relative-age chip\r\n io_input = \"io_input\",\r\n io_output = \"io_output\",\r\n // Fallback\r\n default = \"default\",\r\n}\r\n\r\nexport const SEMANTIC_COLORS: Record<ESemanticThing, IChipColorEntry> = {\r\n running_action: {\r\n color: DEVTOOL_COLOR_SEMANTIC_SYSTEM,\r\n borderColor: `${DEVTOOL_COLOR_SEMANTIC_SYSTEM}55`,\r\n },\r\n success: {\r\n color: DEVTOOL_COLOR_SEMANTIC_SUCCESS,\r\n borderColor: `${DEVTOOL_COLOR_SEMANTIC_SUCCESS}55`,\r\n },\r\n action_error: {\r\n color: DEVTOOL_COLOR_SEMANTIC_WARNING,\r\n borderColor: `${DEVTOOL_COLOR_SEMANTIC_WARNING}55`,\r\n },\r\n failed: {\r\n color: DEVTOOL_COLOR_SEMANTIC_ERROR,\r\n borderColor: `${DEVTOOL_COLOR_SEMANTIC_ERROR}55`,\r\n },\r\n aborted: {\r\n color: DEVTOOL_COLOR_SEMANTIC_METADATA,\r\n borderColor: DEVTOOL_COLOR_TEXT_FAINT,\r\n },\r\n error: {\r\n color: DEVTOOL_COLOR_SEMANTIC_ERROR,\r\n borderColor: DEVTOOL_COLOR_SEMANTIC_ERROR,\r\n subtle: { color: \"#FF5C5C9f\", borderColor: \"transparent\" },\r\n },\r\n domain: {\r\n color: DEVTOOL_COLOR_SEMANTIC_SYSTEM,\r\n borderColor: `${DEVTOOL_COLOR_SEMANTIC_SYSTEM}55`,\r\n subtle: { color: \"#4b5563\", borderColor: \"transparent\" },\r\n },\r\n handler_local: {\r\n color: DEVTOOL_COLOR_HANDLER_LOCAL_TEXT,\r\n borderColor: DEVTOOL_COLOR_HANDLER_LOCAL_BORDER,\r\n subtle: { color: \"#4b5563\", borderColor: \"transparent\" },\r\n },\r\n handler_external: {\r\n color: DEVTOOL_COLOR_HANDLER_EXTERNAL_TEXT,\r\n borderColor: DEVTOOL_COLOR_HANDLER_EXTERNAL_BORDER,\r\n subtle: { color: \"#cfa12a9f\", borderColor: \"transparent\" },\r\n },\r\n origin: {\r\n color: DEVTOOL_COLOR_SEMANTIC_SYSTEM,\r\n borderColor: `${DEVTOOL_COLOR_SEMANTIC_SYSTEM}55`,\r\n subtle: { color: `${DEVTOOL_COLOR_SEMANTIC_SYSTEM}9f`, borderColor: \"transparent\" },\r\n },\r\n age: {\r\n color: DEVTOOL_COLOR_SEMANTIC_METADATA,\r\n borderColor: DEVTOOL_SECTION_BACKGROUND,\r\n subtle: { color: \"#4b5563\", borderColor: \"transparent\" },\r\n },\r\n io_input: {\r\n color: \"#fbbf24\",\r\n subtle: { color: \"#fbbe249f\", borderColor: \"transparent\" },\r\n borderColor: \"#78350f\",\r\n },\r\n io_output: {\r\n color: \"#a78bfa\",\r\n subtle: { color: \"#a78bfa9f\", borderColor: \"transparent\" },\r\n borderColor: \"#4c1d95\",\r\n },\r\n default: {\r\n color: DEVTOOL_COLOR_TEXT_MUTED,\r\n borderColor: DEVTOOL_COLOR_TEXT_FAINT,\r\n },\r\n};\r\n","export enum ESize {\n sm = \"sm\",\n md = \"md\",\n lg = \"lg\",\n}\n\nexport function getSizeValue(size: ESize): number {\n switch (size) {\n case ESize.sm:\n return 0.75;\n case ESize.md:\n return 1;\n case ESize.lg:\n return 1.2;\n default:\n return 1;\n }\n}\n","import { renderColoredJson, safeStringify } from \"nice-devtools-shared\";\r\nimport { useState } from \"react\";\r\nimport {\r\n DEVTOOL_COLOR_SEMANTIC_SYSTEM,\r\n DEVTOOL_COLOR_TEXT_FAINT,\r\n DEVTOOL_COLOR_TEXT_MUTED,\r\n DEVTOOL_COLOR_TEXT_SECONDARY,\r\n DEVTOOL_SECTION_BACKGROUND,\r\n DEVTOOL_SECTION_STRING_BACKGROUND,\r\n} from \"../../core/devtools_colors\";\r\nimport { SectionLabel } from \"./SectionLabel\";\r\n\r\nconst COMPACT_CHAR_LIMIT = 120;\r\nconst MONO = \"ui-monospace, 'Cascadia Code', 'Source Code Pro', monospace\";\r\n\r\nfunction tryParseJson(s: string): unknown {\r\n try {\r\n return JSON.parse(s);\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function DetailSection({\r\n label,\r\n value,\r\n color = DEVTOOL_COLOR_SEMANTIC_SYSTEM,\r\n}: {\r\n label: string;\r\n value: unknown;\r\n color?: string;\r\n}) {\r\n // If the value is a raw string that is valid JSON, parse and render it as\r\n // structured data with syntax highlighting instead of as a plain string.\r\n const parsedFromString = typeof value === \"string\" ? tryParseJson(value) : null;\r\n const isPlainString = typeof value === \"string\" && parsedFromString === null;\r\n const effectiveValue = parsedFromString !== null ? parsedFromString : value;\r\n\r\n const [expanded, setExpanded] = useState(false);\r\n const fullJson = isPlainString ? (value as string) : safeStringify(effectiveValue, 2);\r\n const compactJson = isPlainString ? (value as string) : safeStringify(effectiveValue, 0);\r\n\r\n const canExpand = fullJson !== compactJson || compactJson.length > COMPACT_CHAR_LIMIT;\r\n const compactDisplay =\r\n compactJson.length > COMPACT_CHAR_LIMIT\r\n ? `${compactJson.slice(0, COMPACT_CHAR_LIMIT)}…`\r\n : compactJson;\r\n\r\n const baseStyle = isPlainString\r\n ? { background: DEVTOOL_SECTION_STRING_BACKGROUND, color: DEVTOOL_COLOR_TEXT_MUTED }\r\n : { background: DEVTOOL_SECTION_BACKGROUND, color: DEVTOOL_COLOR_TEXT_SECONDARY };\r\n\r\n return (\r\n <div>\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n marginBottom: \"3px\",\r\n }}\r\n >\r\n <SectionLabel label={label} color={color} />\r\n {canExpand && (\r\n <span style={{ color: DEVTOOL_COLOR_TEXT_FAINT, fontSize: \"11px\" }}>\r\n {expanded ? \"▾\" : \"▸\"}\r\n </span>\r\n )}\r\n </div>\r\n {expanded ? (\r\n <div\r\n onClick={canExpand ? () => setExpanded(false) : undefined}\r\n style={{\r\n margin: 0,\r\n padding: \"6px 8px\",\r\n borderRadius: \"4px\",\r\n fontSize: \"11px\",\r\n fontFamily: MONO,\r\n overflowX: \"auto\",\r\n textAlign: \"left\",\r\n whiteSpace: \"pre-wrap\",\r\n wordBreak: \"break-all\",\r\n cursor: canExpand ? \"pointer\" : \"default\",\r\n fontStyle: isPlainString ? \"italic\" : \"normal\",\r\n ...baseStyle,\r\n }}\r\n >\r\n {isPlainString ? fullJson : renderColoredJson(fullJson)}\r\n </div>\r\n ) : (\r\n <div\r\n onClick={canExpand ? () => setExpanded(true) : undefined}\r\n style={{\r\n padding: \"5px 8px\",\r\n borderRadius: \"4px\",\r\n fontSize: \"11px\",\r\n fontFamily: MONO,\r\n whiteSpace: \"nowrap\",\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n cursor: canExpand ? \"pointer\" : \"default\",\r\n fontStyle: isPlainString ? \"italic\" : \"normal\",\r\n ...baseStyle,\r\n }}\r\n >\r\n {compactDisplay}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import {\n DEVTOOL_COLOR_SEMANTIC_ERROR,\n DEVTOOL_COLOR_TEXT_MUTED,\n DEVTOOL_ERROR_BACKGROUND,\n DEVTOOL_ERROR_BADGE_BACKGROUND,\n} from \"../../core/devtools_colors\";\n\nconst MONO = \"ui-monospace, 'Cascadia Code', 'Source Code Pro', monospace\";\nconst SANS = \"ui-sans-serif, system-ui, -apple-system, sans-serif\";\n\nimport { SectionLabel } from \"./SectionLabel\";\n\nexport type TNiceErrorJson = {\n name: \"NiceError\";\n message: string;\n ids: string[];\n httpStatusCode: number;\n def: { domain: string; allDomains: string[] };\n};\n\nexport function isNiceErrorJson(value: unknown): value is TNiceErrorJson {\n if (typeof value !== \"object\" || value == null) return false;\n const v = value as Record<string, unknown>;\n return v[\"name\"] === \"NiceError\" && Array.isArray(v[\"ids\"]) && typeof v[\"message\"] === \"string\";\n}\n\nexport function NiceErrorBody({ error }: { error: TNiceErrorJson }) {\n return (\n <div\n style={{\n background: DEVTOOL_ERROR_BACKGROUND,\n border: `1px solid ${DEVTOOL_COLOR_SEMANTIC_ERROR}`,\n borderRadius: \"4px\",\n overflow: \"hidden\",\n }}\n >\n {/* Main exception message — largest, boldest */}\n <div\n style={{\n padding: \"12px 14px\",\n color: DEVTOOL_COLOR_SEMANTIC_ERROR,\n fontSize: \"1em\",\n fontWeight: \"700\",\n lineHeight: \"1.45\",\n wordBreak: \"break-word\",\n fontFamily: SANS,\n textAlign: \"left\",\n borderBottom: `1px solid ${DEVTOOL_ERROR_BADGE_BACKGROUND}`,\n }}\n >\n {error.message}\n </div>\n {/* Error code, domain, HTTP status — smaller, subdued */}\n <div\n style={{\n padding: \"6px 14px 8px\",\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: \"10px\",\n alignItems: \"center\",\n background: DEVTOOL_ERROR_BADGE_BACKGROUND,\n }}\n >\n {error.ids.map((id) => (\n <span\n key={id}\n style={{\n color: DEVTOOL_COLOR_SEMANTIC_ERROR,\n fontFamily: MONO,\n fontSize: \"11px\",\n fontWeight: \"600\",\n }}\n >\n {id}\n </span>\n ))}\n <span style={{ color: DEVTOOL_COLOR_TEXT_MUTED, fontSize: \"10px\", fontFamily: SANS }}>\n domain:{\" \"}\n <span style={{ color: DEVTOOL_COLOR_TEXT_MUTED, fontFamily: MONO }}>\n {error.def.domain}\n </span>\n </span>\n <span style={{ color: DEVTOOL_COLOR_TEXT_MUTED, fontSize: \"10px\", fontFamily: SANS }}>\n http:{\" \"}\n <span style={{ color: DEVTOOL_COLOR_TEXT_MUTED, fontFamily: MONO }}>\n {error.httpStatusCode}\n </span>\n </span>\n </div>\n </div>\n );\n}\n\nexport function NiceErrorDisplay({\n error,\n label,\n color,\n}: {\n error: TNiceErrorJson;\n label: string;\n color: string;\n}) {\n return (\n <div>\n <SectionLabel label={label} color={color} />\n <NiceErrorBody error={error} />\n </div>\n );\n}\n","import { createTypedWebLocalStorage } from \"@nice-code/util\";\nimport type { TRuntimeCoordinateEnvId } from \"../../ActionRuntime/RuntimeCoordinate\";\n\ninterface TBrowserDevtoolsTypedStorage {\n runtimeToProjectFilePath: Record<TRuntimeCoordinateEnvId, string>;\n}\n\nexport const devtools_storage = createTypedWebLocalStorage<TBrowserDevtoolsTypedStorage>({\n localStorage: window.localStorage,\n keyPrefix: \"nice-action-devtools::\",\n});\n\ndevtools_storage.updateJsonWithDef(\"runtimeToProjectFilePath\", {}, (prev) => prev);\n","import { type RawSourceMap, SourceMapConsumer } from \"source-map-js\";\n\n// Cache by normalized URL (no query string — Vite adds ?t= for HMR but the map is stable).\n// Stored as a Promise so concurrent lookups for the same file share one in-flight fetch.\nconst consumerCache = new Map<string, Promise<SourceMapConsumer | null>>();\n\nasync function loadConsumer(fileUrl: string): Promise<SourceMapConsumer | null> {\n try {\n if (!fileUrl.startsWith(\"http://\") && !fileUrl.startsWith(\"https://\")) return null;\n\n const resp = await fetch(fileUrl);\n if (!resp.ok) return null;\n const text = await resp.text();\n\n const match = text.match(/\\/\\/[#@] sourceMappingURL=(\\S+)/);\n if (match == null) return null;\n const mapRef = match[1]!;\n\n let mapJson: string;\n if (mapRef.startsWith(\"data:\")) {\n // Inline source map: data:application/json;charset=utf-8;base64,<payload>\n const commaIdx = mapRef.indexOf(\",\");\n if (commaIdx === -1) return null;\n const header = mapRef.slice(5, commaIdx);\n const payload = mapRef.slice(commaIdx + 1);\n mapJson = header.includes(\"base64\") ? atob(payload) : decodeURIComponent(payload);\n } else {\n // External .map file — resolve relative to the source file URL\n const mapUrl = new URL(mapRef, fileUrl).href;\n const mapResp = await fetch(mapUrl);\n if (!mapResp.ok) return null;\n mapJson = await mapResp.text();\n }\n\n return new SourceMapConsumer(JSON.parse(mapJson) as RawSourceMap);\n } catch {\n return null;\n }\n}\n\nfunction getConsumer(fileUrl: string): Promise<SourceMapConsumer | null> {\n const key = fileUrl.split(\"?\")[0] ?? fileUrl;\n if (!consumerCache.has(key)) {\n consumerCache.set(key, loadConsumer(fileUrl));\n }\n return consumerCache.get(key)!;\n}\n\nexport interface IResolvedSourcePosition {\n file: string;\n line: number;\n col: number;\n}\n\nexport async function resolveCompiledPosition(\n fileUrl: string,\n line: number,\n col: number,\n): Promise<IResolvedSourcePosition | null> {\n try {\n const consumer = await getConsumer(fileUrl);\n if (consumer == null) return null;\n\n // source-map-js types MappedPosition as non-nullable but returns nulls when there's no mapping\n const pos = consumer.originalPositionFor({ line, column: col }) as {\n source: string | null;\n line: number | null;\n column: number | null;\n };\n if (pos.source == null || pos.line == null) return null;\n\n return { file: pos.source, line: pos.line, col: pos.column ?? 0 };\n } catch {\n return null;\n }\n}\n","import { ExternalLink } from \"lucide-react\";\r\nimport { useEffect, useRef, useState } from \"react\";\r\nimport type {\r\n IRuntimeCoordinate,\r\n TRuntimeCoordinateEnvId,\r\n} from \"../../../ActionRuntime/RuntimeCoordinate\";\r\nimport {\r\n DEVTOOL_COLOR_SEMANTIC_SYSTEM,\r\n DEVTOOL_COLOR_SEMANTIC_WARNING,\r\n DEVTOOL_COLOR_TEXT_EMPHASIS,\r\n DEVTOOL_COLOR_TEXT_MUTED,\r\n DEVTOOL_COLOR_TEXT_SECONDARY,\r\n DEVTOOL_LIST_BASE_BACKGROUND,\r\n DEVTOOL_PANEL_BORDER,\r\n DEVTOOL_STACK_FRAME_INTERNAL_FILE,\r\n DEVTOOL_STACK_FRAME_INTERNAL_FOLDER,\r\n DEVTOOL_STACK_FRAME_INTERNAL_FUNCTION,\r\n DEVTOOL_STACK_FRAME_INTERNAL_LINE,\r\n DEVTOOL_STACK_FRAME_INTERNAL_NUMBER,\r\n DEVTOOL_STACK_FRAME_USER_FILE,\r\n DEVTOOL_STACK_FRAME_USER_FOLDER,\r\n DEVTOOL_STACK_FRAME_USER_FUNCTION,\r\n DEVTOOL_STACK_FRAME_USER_LINE,\r\n DEVTOOL_STACK_FRAME_USER_NUMBER,\r\n DEVTOOL_STACK_TRACE_BACKGROUND,\r\n DEVTOOL_TOOLTIP_BACKGROUND,\r\n DEVTOOL_TOOLTIP_BORDER,\r\n DEVTOOL_TOOLTIP_TITLE_BACKGROUND,\r\n} from \"../../core/devtools_colors\";\r\nimport { devtools_storage } from \"../devtools_storage\";\r\nimport { SectionLabel } from \"./SectionLabel\";\r\nimport { resolveCompiledPosition } from \"./sourceMapResolver\";\r\n\r\ninterface IStackFrame {\r\n fn?: string;\r\n file?: string;\r\n /** The file URL from the raw stack trace, before source-map resolution overwrites `file`. */\r\n originalFile?: string;\r\n line?: number;\r\n col?: number;\r\n raw: string;\r\n isInternal: boolean;\r\n internalProjectPath?: string;\r\n}\r\n\r\nconst INTERNAL_PATTERNS = [\r\n \"/nice-action/\", // monorepo workspace paths: packages/nice-action/src/...\r\n \"@nice-code/action\", // npm scoped package: webpack://@nice-code/action/..., /@nice-code/action/...\r\n \"/nice-error/\",\r\n \"@nice-code/error\",\r\n \"node_modules/\",\r\n \"native code\",\r\n \"<anonymous>\",\r\n];\r\n\r\nfunction isInternalFrame(file: string): boolean {\r\n return INTERNAL_PATTERNS.some((p) => file.includes(p));\r\n}\r\n\r\nfunction parseStackFrames(stack: string): IStackFrame[] {\r\n return stack\r\n .split(\"\\n\")\r\n .slice(1)\r\n .map((line): IStackFrame | null => {\r\n const raw = line.trim();\r\n if (raw === \"\") return null;\r\n const matchFn = raw.match(/^at (.+?) \\((.+):(\\d+):(\\d+)\\)$/);\r\n if (matchFn != null) {\r\n const file = matchFn[2]!;\r\n return {\r\n fn: matchFn[1],\r\n file,\r\n line: parseInt(matchFn[3]!, 10),\r\n col: parseInt(matchFn[4]!, 10),\r\n raw,\r\n isInternal: isInternalFrame(file),\r\n };\r\n }\r\n const matchUrl = raw.match(/^at (.+):(\\d+):(\\d+)$/);\r\n if (matchUrl != null) {\r\n const file = matchUrl[1]!;\r\n return {\r\n file,\r\n line: parseInt(matchUrl[2]!, 10),\r\n col: parseInt(matchUrl[3]!, 10),\r\n raw,\r\n isInternal: isInternalFrame(file),\r\n };\r\n }\r\n return { raw, isInternal: true };\r\n })\r\n .filter((f): f is IStackFrame => f != null);\r\n}\r\n\r\nasync function resolveSourceMapPositions(frames: IStackFrame[]): Promise<IStackFrame[]> {\r\n return Promise.all(\r\n frames.map(async (frame): Promise<IStackFrame> => {\r\n if (frame.isInternal || frame.file == null || frame.line == null) return frame;\r\n const resolved = await resolveCompiledPosition(frame.file, frame.line, frame.col ?? 0);\r\n if (resolved == null) return frame;\r\n return {\r\n ...frame,\r\n originalFile: frame.file,\r\n file: resolved.file,\r\n line: resolved.line,\r\n col: resolved.col,\r\n };\r\n }),\r\n );\r\n}\r\n\r\nfunction formatFrameFile(file: string | undefined): string {\r\n if (file == null) return \"?\";\r\n let path = file;\r\n try {\r\n const url = new URL(file);\r\n path = url.pathname.split(\"?\")[0] ?? url.pathname;\r\n // Vite serves files outside the project root under /@fs/<absolute-path>\r\n if (path.startsWith(\"/@fs/\")) path = path.slice(4);\r\n } catch {\r\n /* not a URL, use as-is */\r\n }\r\n const parts = path.replace(/\\\\/g, \"/\").split(\"/\").filter(Boolean);\r\n // Strip common Windows drive segment like \"c:\" at the front\r\n const filtered = parts[0]?.match(/^[a-zA-Z]:$/) != null ? parts.slice(1) : parts;\r\n // Show up to 4 segments (3 dirs + filename), enough to identify without overwhelming\r\n const tail = filtered.slice(-4);\r\n return tail.join(\"/\") || file;\r\n}\r\n\r\n// Returns the stack-origin HTTP URL for path extraction: prefers originalFile (pre-source-map)\r\n// over the post-resolution file, because Vite source maps often reduce the path to just a\r\n// basename (\"App.tsx\") which loses the root-relative path info the URL had (\"/src/App.tsx\").\r\nfunction getOriginUrl(frame: IStackFrame): string | null {\r\n const candidate = frame.originalFile ?? frame.file;\r\n if (candidate == null) return null;\r\n try {\r\n new URL(candidate);\r\n return candidate;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n// True when the frame's origin URL is Vite root-relative (no /@fs/ embedded absolute path),\r\n// meaning we need a configured project root to build an absolute VS Code path.\r\nfunction frameNeedsProjectRoot(frame: IStackFrame): boolean {\r\n if (frame.isInternal) return false;\r\n const originUrl = getOriginUrl(frame);\r\n if (originUrl == null) return false;\r\n const path = new URL(originUrl).pathname.split(\"?\")[0] ?? \"\";\r\n return !path.startsWith(\"/@fs/\");\r\n}\r\n\r\nfunction buildVscodeUrl(frame: IStackFrame, projectRoot: string | null): string | null {\r\n if (frame.line == null) return null;\r\n\r\n const originUrl = getOriginUrl(frame);\r\n if (originUrl != null) {\r\n let path = new URL(originUrl).pathname.split(\"?\")[0] ?? \"\";\r\n if (path.startsWith(\"/@fs/\")) {\r\n // Absolute path embedded by Vite (e.g. /@fs/C:/d/project/src/foo.ts)\r\n path = path.slice(5);\r\n if (/^\\/[a-zA-Z]:\\//.test(path)) path = path.slice(1);\r\n return `vscode://file/${path}:${frame.line}:${frame.col ?? 1}`;\r\n }\r\n // Root-relative Vite path (e.g. /src/App.tsx) — needs project root\r\n if (projectRoot == null) return null;\r\n const normalRoot = projectRoot.replace(/[/\\\\]+$/, \"\").replace(/\\\\/g, \"/\");\r\n return `vscode://file/${normalRoot}${path}:${frame.line}:${frame.col ?? 1}`;\r\n }\r\n\r\n // No HTTP URL available — use frame.file directly (post-source-map plain path)\r\n const filePath = frame.file;\r\n if (filePath == null) return null;\r\n const normalPath = filePath.replace(/\\\\/g, \"/\");\r\n // Windows absolute: C:/path\r\n if (/^[a-zA-Z]:\\//.test(normalPath)) {\r\n return `vscode://file/${normalPath}:${frame.line}:${frame.col ?? 1}`;\r\n }\r\n // Leading slash before Windows drive: /c:/path\r\n if (/^\\/[a-zA-Z]:\\//.test(normalPath)) {\r\n return `vscode://file/${normalPath.slice(1)}:${frame.line}:${frame.col ?? 1}`;\r\n }\r\n // Unix absolute or root-relative (e.g. /src/App.tsx, /home/user/project/src/foo.ts)\r\n if (normalPath.startsWith(\"/\")) {\r\n if (projectRoot == null) return null;\r\n const normalRoot = projectRoot.replace(/[/\\\\]+$/, \"\").replace(/\\\\/g, \"/\");\r\n return `vscode://file/${normalRoot}${normalPath}:${frame.line}:${frame.col ?? 1}`;\r\n }\r\n // Relative path (e.g. \"App.tsx\", \"../../src/App.tsx\")\r\n if (projectRoot == null) return null;\r\n const normalRoot = projectRoot.replace(/[/\\\\]+$/, \"\").replace(/\\\\/g, \"/\");\r\n return `vscode://file/${normalRoot}/${normalPath}:${frame.line}:${frame.col ?? 1}`;\r\n}\r\n\r\n// ─── Project root setup modal ────────────────────────────────────────────────\r\n\r\nfunction ProjectRootSetupModal({\r\n envId,\r\n currentValue,\r\n onSave,\r\n onCancel,\r\n}: {\r\n envId: string;\r\n currentValue: string;\r\n onSave: (path: string) => void;\r\n onCancel: () => void;\r\n}) {\r\n const [value, setValue] = useState(currentValue);\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n\r\n useEffect(() => {\r\n inputRef.current?.focus();\r\n inputRef.current?.select();\r\n }, []);\r\n\r\n useEffect(() => {\r\n const handler = (e: KeyboardEvent) => {\r\n if (e.key === \"Escape\") onCancel();\r\n };\r\n window.addEventListener(\"keydown\", handler);\r\n return () => window.removeEventListener(\"keydown\", handler);\r\n }, [onCancel]);\r\n\r\n const handleSubmit = (e: React.SyntheticEvent<HTMLFormElement>) => {\r\n e.preventDefault();\r\n const trimmed = value.trim();\r\n if (trimmed !== \"\") onSave(trimmed);\r\n };\r\n\r\n return (\r\n <div\r\n style={{\r\n position: \"fixed\",\r\n inset: 0,\r\n zIndex: 2147483647,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n }}\r\n >\r\n <div\r\n onClick={onCancel}\r\n style={{ position: \"absolute\", inset: 0, background: \"rgba(0, 0, 0, 0.72)\" }}\r\n />\r\n <form\r\n onSubmit={handleSubmit}\r\n style={{\r\n position: \"relative\",\r\n background: DEVTOOL_TOOLTIP_BACKGROUND,\r\n border: `1px solid ${DEVTOOL_TOOLTIP_BORDER}`,\r\n borderRadius: \"8px\",\r\n width: \"420px\",\r\n maxWidth: \"90vw\",\r\n boxShadow: \"0 8px 32px rgba(0, 0, 0, 0.8)\",\r\n overflow: \"hidden\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n }}\r\n >\r\n {/* Header */}\r\n <div\r\n style={{\r\n background: DEVTOOL_TOOLTIP_TITLE_BACKGROUND,\r\n borderBottom: `1px solid ${DEVTOOL_TOOLTIP_BORDER}`,\r\n padding: \"10px 14px\",\r\n }}\r\n >\r\n <div\r\n style={{\r\n color: DEVTOOL_COLOR_TEXT_EMPHASIS,\r\n fontSize: \"12px\",\r\n fontWeight: 600,\r\n marginBottom: \"2px\",\r\n }}\r\n >\r\n Set project root\r\n </div>\r\n <div style={{ color: DEVTOOL_COLOR_TEXT_MUTED, fontSize: \"10px\" }}>\r\n Runtime:{\" \"}\r\n <span\r\n style={{\r\n color: DEVTOOL_COLOR_SEMANTIC_SYSTEM,\r\n fontFamily: \"ui-monospace, 'Cascadia Code', 'Source Code Pro', monospace\",\r\n }}\r\n >\r\n {envId}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n {/* Body */}\r\n <div style={{ padding: \"14px\", display: \"flex\", flexDirection: \"column\", gap: \"8px\" }}>\r\n <div style={{ color: DEVTOOL_COLOR_TEXT_MUTED, fontSize: \"10px\", lineHeight: 1.4 }}>\r\n Provide the absolute path to this project's root so that root-relative source file paths\r\n (e.g.{\" \"}\r\n <span\r\n style={{\r\n fontFamily: \"ui-monospace, 'Cascadia Code', 'Source Code Pro', monospace\",\r\n }}\r\n >\r\n src/App.tsx\r\n </span>\r\n ) can be opened in VS Code.\r\n </div>\r\n <input\r\n ref={inputRef}\r\n value={value}\r\n onChange={(e) => setValue(e.currentTarget.value)}\r\n placeholder=\"e.g. C:/d/nice-code/packages/demo-frontend\"\r\n style={{\r\n background: DEVTOOL_STACK_TRACE_BACKGROUND,\r\n border: `1px solid ${DEVTOOL_TOOLTIP_BORDER}`,\r\n borderRadius: \"4px\",\r\n color: DEVTOOL_COLOR_TEXT_SECONDARY,\r\n fontSize: \"11px\",\r\n fontFamily: \"ui-monospace, 'Cascadia Code', 'Source Code Pro', monospace\",\r\n padding: \"7px 9px\",\r\n outline: \"none\",\r\n width: \"100%\",\r\n boxSizing: \"border-box\",\r\n }}\r\n />\r\n </div>\r\n\r\n {/* Footer */}\r\n <div\r\n style={{\r\n display: \"flex\",\r\n justifyContent: \"flex-end\",\r\n gap: \"8px\",\r\n padding: \"10px 14px\",\r\n borderTop: `1px solid ${DEVTOOL_PANEL_BORDER}`,\r\n }}\r\n >\r\n <button\r\n type=\"button\"\r\n onClick={onCancel}\r\n style={{\r\n background: \"transparent\",\r\n border: `1px solid ${DEVTOOL_PANEL_BORDER}`,\r\n borderRadius: \"4px\",\r\n color: DEVTOOL_COLOR_TEXT_MUTED,\r\n fontSize: \"11px\",\r\n padding: \"5px 12px\",\r\n cursor: \"pointer\",\r\n }}\r\n >\r\n Cancel\r\n </button>\r\n <button\r\n type=\"submit\"\r\n disabled={value.trim() === \"\"}\r\n style={{\r\n background: `${DEVTOOL_COLOR_SEMANTIC_SYSTEM}22`,\r\n border: `1px solid ${DEVTOOL_COLOR_SEMANTIC_SYSTEM}66`,\r\n borderRadius: \"4px\",\r\n color: DEVTOOL_COLOR_SEMANTIC_SYSTEM,\r\n fontSize: \"11px\",\r\n padding: \"5px 12px\",\r\n cursor: value.trim() === \"\" ? \"not-allowed\" : \"pointer\",\r\n opacity: value.trim() === \"\" ? 0.5 : 1,\r\n }}\r\n >\r\n Save\r\n </button>\r\n </div>\r\n </form>\r\n </div>\r\n );\r\n}\r\n\r\n// ─── Open-in-VS Code button ───────────────────────────────────────────────────\r\n\r\nfunction OpenInVscodeButton({\r\n frame,\r\n projectRoot,\r\n onNeedSetup,\r\n}: {\r\n frame: IStackFrame;\r\n projectRoot: string | null;\r\n onNeedSetup: () => void;\r\n}) {\r\n const [hovered, setHovered] = useState(false);\r\n const needsSetup = frameNeedsProjectRoot(frame) && projectRoot == null;\r\n const url = buildVscodeUrl(frame, projectRoot);\r\n\r\n if (frame.file == null || frame.line == null) return null;\r\n if (!needsSetup && url == null) return null;\r\n\r\n const baseStyle: React.CSSProperties = {\r\n position: \"absolute\",\r\n bottom: \"3px\",\r\n right: \"4px\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n width: \"16px\",\r\n height: \"16px\",\r\n opacity: hovered ? 0.85 : 0.25,\r\n transition: \"opacity 0.15s ease\",\r\n cursor: \"pointer\",\r\n flexShrink: 0,\r\n };\r\n\r\n if (needsSetup) {\r\n return (\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onNeedSetup();\r\n }}\r\n onMouseEnter={() => setHovered(true)}\r\n onMouseLeave={() => setHovered(false)}\r\n title=\"Set project root to open in VS Code\"\r\n style={{\r\n ...baseStyle,\r\n color: DEVTOOL_COLOR_SEMANTIC_WARNING,\r\n background: \"none\",\r\n border: \"none\",\r\n padding: 0,\r\n }}\r\n >\r\n <ExternalLink size={10} strokeWidth={1.8} />\r\n </button>\r\n );\r\n }\r\n\r\n return (\r\n <a\r\n href={url!}\r\n onClick={(e) => e.stopPropagation()}\r\n onMouseEnter={() => setHovered(true)}\r\n onMouseLeave={() => setHovered(false)}\r\n title=\"Open in VS Code\"\r\n style={{\r\n ...baseStyle,\r\n color: DEVTOOL_COLOR_TEXT_SECONDARY,\r\n textDecoration: \"none\",\r\n }}\r\n >\r\n <ExternalLink size={10} strokeWidth={1.8} />\r\n </a>\r\n );\r\n}\r\n\r\n// ─── Exports ──────────────────────────────────────────────────────────────────\r\n\r\nexport function countUserFrames(_runtime: IRuntimeCoordinate, stack: string | undefined): number {\r\n if (stack == null) return 0;\r\n return parseStackFrames(stack).filter((f) => !f.isInternal).length;\r\n}\r\n\r\nexport function StackTraceSection({\r\n label,\r\n stack,\r\n color = DEVTOOL_COLOR_SEMANTIC_SYSTEM,\r\n runtime,\r\n minFrameCount,\r\n}: {\r\n label: string;\r\n stack: string | undefined;\r\n runtime: IRuntimeCoordinate;\r\n color?: string;\r\n minFrameCount?: number;\r\n}) {\r\n const [showAll, setShowAll] = useState(false);\r\n const [resolvedFrames, setResolvedFrames] = useState<IStackFrame[] | null>(null);\r\n const [projectRootMap, setProjectRootMap] = useState<Record<TRuntimeCoordinateEnvId, string>>({});\r\n const [showSetupModal, setShowSetupModal] = useState(false);\r\n\r\n useEffect(() => {\r\n void devtools_storage\r\n .getJsonOrDef(\"runtimeToProjectFilePath\", {})\r\n .then((map) => setProjectRootMap(map));\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (stack == null) return;\r\n setResolvedFrames(null);\r\n const parsed = parseStackFrames(stack);\r\n let cancelled = false;\r\n resolveSourceMapPositions(parsed).then((frames) => {\r\n if (!cancelled) setResolvedFrames(frames);\r\n });\r\n return () => {\r\n cancelled = true;\r\n };\r\n }, [stack]);\r\n\r\n if (stack == null) return null;\r\n\r\n const allFrames = resolvedFrames ?? parseStackFrames(stack);\r\n const userFrames = allFrames.filter((f) => !f.isInternal);\r\n const hasInternalFrames = allFrames.length > userFrames.length;\r\n const displayFrames = showAll ? allFrames : userFrames;\r\n const phantomFrameCount = !showAll ? Math.max(0, (minFrameCount ?? 0) - displayFrames.length) : 0;\r\n\r\n if (allFrames.length === 0) return null;\r\n\r\n const runtimeKey = `envId[${runtime.envId}]` as TRuntimeCoordinateEnvId;\r\n const projectRoot = projectRootMap[runtimeKey] ?? null;\r\n\r\n const handleSaveProjectRoot = (path: string) => {\r\n setProjectRootMap((prev) => ({ ...prev, [runtimeKey]: path }));\r\n setShowSetupModal(false);\r\n void devtools_storage.updateJsonWithDef(\"runtimeToProjectFilePath\", {}, (prev) => ({\r\n ...prev,\r\n [runtimeKey]: path,\r\n }));\r\n };\r\n\r\n return (\r\n <div>\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n marginBottom: \"3px\",\r\n }}\r\n >\r\n <SectionLabel label={label} color={color} />\r\n {hasInternalFrames && (\r\n <span style={{ color: DEVTOOL_COLOR_TEXT_MUTED, fontSize: \"9px\" }}>\r\n {!showAll ? \"user only\" : `all (${allFrames.length})`}\r\n </span>\r\n )}\r\n </div>\r\n <div\r\n onClick={() => setShowAll((s) => !s)}\r\n style={{\r\n background: DEVTOOL_STACK_TRACE_BACKGROUND,\r\n borderRadius: \"4px\",\r\n padding: \"2px\",\r\n overflow: \"hidden\",\r\n cursor: \"pointer\",\r\n }}\r\n >\r\n {displayFrames.length === 0 ? (\r\n <div\r\n style={{\r\n padding: \"6px 10px\",\r\n color: DEVTOOL_COLOR_TEXT_MUTED,\r\n fontSize: \"10px\",\r\n fontStyle: \"italic\",\r\n }}\r\n >\r\n no user frames captured\r\n </div>\r\n ) : (\r\n displayFrames.map((frame, idx) => {\r\n const displayFile = formatFrameFile(frame.file);\r\n const slashIdx = displayFile.lastIndexOf(\"/\");\r\n const folderPrefix = slashIdx >= 0 ? displayFile.slice(0, slashIdx + 1) : \"\";\r\n const bareFilename = slashIdx >= 0 ? displayFile.slice(slashIdx + 1) : displayFile;\r\n const titleStr = frame.file != null ? frame.file : frame.raw;\r\n const isUser = !frame.isInternal;\r\n return (\r\n <div\r\n key={frame.raw}\r\n title={titleStr}\r\n style={{\r\n position: \"relative\",\r\n display: \"flex\",\r\n flexDirection: \"row\",\r\n gap: \"0.5em\",\r\n padding: \"4px\",\r\n paddingRight: \"22px\",\r\n borderBottom: `1px solid ${DEVTOOL_LIST_BASE_BACKGROUND}`,\r\n }}\r\n >\r\n <span\r\n style={{\r\n color: isUser\r\n ? DEVTOOL_STACK_FRAME_USER_NUMBER\r\n : DEVTOOL_STACK_FRAME_INTERNAL_NUMBER,\r\n fontSize: \"10px\",\r\n minWidth: \"10px\",\r\n textAlign: \"left\",\r\n flexShrink: 0,\r\n fontVariantNumeric: \"tabular-nums\",\r\n }}\r\n >\r\n {idx + 1}\r\n </span>\r\n <div\r\n style={{\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: \"0.15em\",\r\n lineHeight: 1.2,\r\n }}\r\n >\r\n <div style={{ display: \"flex\", alignItems: \"center\" }}>\r\n <span\r\n style={{\r\n color: isUser\r\n ? DEVTOOL_STACK_FRAME_USER_FUNCTION\r\n : DEVTOOL_STACK_FRAME_INTERNAL_FUNCTION,\r\n fontSize: \"12px\",\r\n fontWeight: 500,\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n whiteSpace: \"nowrap\",\r\n }}\r\n >\r\n {frame.fn ?? \"(anonymous)\"}\r\n </span>\r\n </div>\r\n <div style={{ display: \"flex\", alignItems: \"baseline\", overflow: \"hidden\" }}>\r\n {folderPrefix !== \"\" && (\r\n <span\r\n style={{\r\n color: isUser\r\n ? DEVTOOL_STACK_FRAME_USER_FOLDER\r\n : DEVTOOL_STACK_FRAME_INTERNAL_FOLDER,\r\n fontSize: \"10px\",\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n whiteSpace: \"nowrap\",\r\n flexShrink: 1,\r\n minWidth: 0,\r\n }}\r\n >\r\n {folderPrefix}\r\n </span>\r\n )}\r\n <span\r\n style={{\r\n color: isUser\r\n ? DEVTOOL_STACK_FRAME_USER_FILE\r\n : DEVTOOL_STACK_FRAME_INTERNAL_FILE,\r\n fontSize: \"10px\",\r\n whiteSpace: \"nowrap\",\r\n flexShrink: 0,\r\n }}\r\n >\r\n {bareFilename}\r\n </span>\r\n {frame.line != null && (\r\n <span\r\n style={{\r\n color: isUser\r\n ? DEVTOOL_STACK_FRAME_USER_LINE\r\n : DEVTOOL_STACK_FRAME_INTERNAL_LINE,\r\n fontSize: \"10px\",\r\n whiteSpace: \"nowrap\",\r\n flexShrink: 0,\r\n fontVariantNumeric: \"tabular-nums\",\r\n }}\r\n >\r\n :{frame.line}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n <OpenInVscodeButton\r\n frame={frame}\r\n projectRoot={projectRoot}\r\n onNeedSetup={() => setShowSetupModal(true)}\r\n />\r\n </div>\r\n );\r\n })\r\n )}\r\n {Array.from({ length: phantomFrameCount }, (_, i) => i).map((i) => (\r\n <div\r\n key={`phantom-${i}`}\r\n aria-hidden=\"true\"\r\n style={{\r\n visibility: \"hidden\",\r\n display: \"flex\",\r\n flexDirection: \"row\",\r\n gap: \"0.5em\",\r\n padding: \"4px\",\r\n borderBottom: `1px solid ${DEVTOOL_LIST_BASE_BACKGROUND}`,\r\n }}\r\n >\r\n <span style={{ fontSize: \"10px\", minWidth: \"10px\", flexShrink: 0 }}>0</span>\r\n <div\r\n style={{ display: \"flex\", flexDirection: \"column\", gap: \"0.15em\", lineHeight: 1.2 }}\r\n >\r\n <div style={{ fontSize: \"12px\" }}>placeholder</div>\r\n <div style={{ fontSize: \"10px\" }}>placeholder/file.ts:1</div>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n\r\n {showSetupModal && (\r\n <ProjectRootSetupModal\r\n envId={runtime.envId}\r\n currentValue={projectRoot ?? \"\"}\r\n onSave={handleSaveProjectRoot}\r\n onCancel={() => setShowSetupModal(false)}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n","import type { IRuntimeCoordinate } from \"../../../ActionRuntime/RuntimeCoordinate\";\nimport type { IDevtoolsActionEntry } from \"../../core/ActionDevtools.types\";\nimport {\n DEVTOOL_COLOR_SEMANTIC_ERROR,\n DEVTOOL_COLOR_SEMANTIC_METADATA,\n DEVTOOL_COLOR_TEXT_MUTED,\n DEVTOOL_ERROR_BADGE_BACKGROUND,\n} from \"../../core/devtools_colors\";\nimport { DetailSection } from \"./DetailSection\";\nimport { isNiceErrorJson, NiceErrorDisplay } from \"./NiceErrorDisplay\";\nimport { StackTraceSection } from \"./StackTraceSection\";\n\nconst MONO = \"ui-monospace, 'Cascadia Code', 'Source Code Pro', monospace\";\nconst SANS = \"ui-sans-serif, system-ui, -apple-system, sans-serif\";\n\nfunction FullErrorContent({\n label,\n error,\n errorStack,\n color,\n runtime,\n}: {\n label: string;\n error: unknown;\n errorStack: string | undefined;\n color: string;\n runtime: IRuntimeCoordinate;\n}) {\n return (\n <>\n {isNiceErrorJson(error) ? (\n <NiceErrorDisplay error={error} label={label} color={color} />\n ) : (\n <DetailSection label={label} value={error} color={color} />\n )}\n <StackTraceSection runtime={runtime} label=\"Error Stack\" stack={errorStack} color={color} />\n </>\n );\n}\n\nfunction CompactErrorContent({ value, color }: { value: unknown; color: string }) {\n if (isNiceErrorJson(value)) {\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"1em\",\n width: \"100%\",\n minWidth: 0,\n }}\n >\n <div\n style={{\n color,\n fontFamily: SANS,\n fontSize: \"12px\",\n fontWeight: 600,\n lineHeight: \"1.4\",\n wordBreak: \"break-word\",\n overflowWrap: \"anywhere\",\n textAlign: \"left\",\n }}\n >\n {value.message}\n </div>\n <div\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: \"6px\",\n alignItems: \"center\",\n minWidth: 0,\n }}\n >\n {value.ids.map((id) => (\n <span\n key={id}\n style={{\n color,\n fontFamily: MONO,\n fontSize: \"10px\",\n opacity: 0.8,\n wordBreak: \"break-word\",\n overflowWrap: \"anywhere\",\n }}\n >\n {id}\n </span>\n ))}\n <span\n style={{\n color: DEVTOOL_COLOR_TEXT_MUTED,\n fontFamily: MONO,\n fontSize: \"10px\",\n wordBreak: \"break-word\",\n overflowWrap: \"anywhere\",\n }}\n >\n {value.def.domain}\n </span>\n </div>\n </div>\n );\n }\n\n const text = typeof value === \"string\" ? value : value != null ? String(value) : null;\n if (text == null) return null;\n return (\n <div\n style={{\n color,\n fontFamily: SANS,\n fontSize: \"12px\",\n lineHeight: \"1.4\",\n wordBreak: \"break-word\",\n overflowWrap: \"anywhere\",\n }}\n >\n {text}\n </div>\n );\n}\n\n// ─── Public component ─────────────────────────────────────────────────────────\n\nexport function ActionErrorDisplay({\n entry,\n compact,\n}: {\n entry: IDevtoolsActionEntry;\n compact?: boolean;\n}) {\n const { status, error, abortReason, errorStack } = entry;\n\n if (status === \"action-error\") {\n const color = DEVTOOL_COLOR_SEMANTIC_ERROR;\n if (compact) return <CompactErrorContent value={error} color={color} />;\n return (\n <FullErrorContent\n runtime={entry.meta.originClient}\n label=\"Action Error\"\n error={error}\n errorStack={errorStack}\n color={color}\n />\n );\n }\n\n if (status === \"failed\") {\n const color = DEVTOOL_COLOR_SEMANTIC_ERROR;\n if (compact) return <CompactErrorContent value={error} color={color} />;\n return (\n <FullErrorContent\n runtime={entry.meta.originClient}\n label=\"Error\"\n error={error}\n errorStack={errorStack}\n color={color}\n />\n );\n }\n\n if (status === \"aborted\") {\n const color = DEVTOOL_COLOR_SEMANTIC_METADATA;\n if (compact) return <CompactErrorContent value={abortReason} color={color} />;\n return (\n <>\n {abortReason != null &&\n (isNiceErrorJson(abortReason) ? (\n <NiceErrorDisplay error={abortReason} label=\"Abort Reason\" color={color} />\n ) : (\n <DetailSection label=\"Abort Reason\" value={abortReason} color={color} />\n ))}\n <StackTraceSection\n runtime={entry.meta.originClient}\n label=\"Abort Stack\"\n stack={errorStack}\n color={color}\n />\n </>\n );\n }\n\n return null;\n}\n","import { type CSSProperties, type ReactNode, useState } from \"react\";\nimport {\n DEVTOOL_LIST_BASE_BACKGROUND,\n type ESemanticThing,\n SEMANTIC_COLORS,\n} from \"../../core/devtools_colors\";\nimport { ESize } from \"../ui_util/size\";\nimport { type ITooltipConfig, Tooltip } from \"./Tooltip\";\n\nconst CHIP_SIZE_STYLES: Record<ESize, { fontSize: string; padding: string }> = {\n [ESize.sm]: { fontSize: \"0.8em\", padding: \"1px 3px\" },\n [ESize.md]: { fontSize: \"0.9em\", padding: \"1px 4px\" },\n [ESize.lg]: { fontSize: \"1em\", padding: \"2px 6px\" },\n};\n\nexport interface IChipColorEntry {\n color: string;\n borderColor: string;\n subtle?: { color?: string; borderColor?: string };\n}\n\ninterface IChipProps {\n color: ESemanticThing;\n subtle?: boolean;\n size?: ESize;\n rounded?: boolean;\n tooltip?: ITooltipConfig;\n children: ReactNode;\n}\n\nexport function Chip({\n color,\n subtle = false,\n size = ESize.md,\n rounded = false,\n tooltip,\n children,\n}: IChipProps) {\n const [anchor, setAnchor] = useState<DOMRect | null>(null);\n const hasTooltip = tooltip != null;\n const { fontSize, padding } = CHIP_SIZE_STYLES[size];\n const colorEntry = SEMANTIC_COLORS[color];\n const resolvedColor = subtle ? (colorEntry.subtle?.color ?? colorEntry.color) : colorEntry.color;\n const resolvedBorderColor = subtle\n ? (colorEntry.subtle?.borderColor ?? \"transparent\")\n : colorEntry.borderColor;\n\n return (\n <>\n <span\n onMouseEnter={\n hasTooltip ? (e) => setAnchor(e.currentTarget.getBoundingClientRect()) : undefined\n }\n onMouseLeave={hasTooltip ? () => setAnchor(null) : undefined}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n color: resolvedColor,\n fontSize,\n background: DEVTOOL_LIST_BASE_BACKGROUND,\n border: `1px solid ${resolvedBorderColor}`,\n padding,\n borderRadius: rounded ? \"0.6rem\" : \"3px\",\n flexShrink: 0,\n whiteSpace: \"nowrap\",\n cursor: hasTooltip ? \"default\" : undefined,\n // ...style,\n }}\n >\n {children}\n </span>\n {anchor != null && hasTooltip && <Tooltip anchor={anchor} config={tooltip} />}\n </>\n );\n}\n","import type { LucideIcon } from \"lucide-react\";\nimport type { CSSProperties } from \"react\";\nimport { useState } from \"react\";\nimport { type ESemanticThing, SEMANTIC_COLORS } from \"../../core/devtools_colors\";\nimport { ESize, getSizeValue } from \"../ui_util/size\";\nimport { type ITooltipConfig, Tooltip } from \"./Tooltip\";\n\ninterface IIconProps {\n icon: LucideIcon | LucideIcon[];\n color: ESemanticThing;\n size?: ESize;\n subtle?: boolean;\n tooltip?: ITooltipConfig;\n style?: CSSProperties;\n noBackground?: boolean;\n}\n\nconst BASE_ICON_SIDE_LENGTH_EM = 1.6; // in em, based on visual tuning\nconst ICON_GAP_EM = 0.3; // gap between icons when multiple are shown, in em\n\nexport function Icon({\n icon: IconComponent,\n color,\n size = ESize.md,\n subtle = false,\n tooltip,\n style,\n noBackground = false,\n}: IIconProps) {\n const [anchor, setAnchor] = useState<DOMRect | null>(null);\n const hasTooltip = tooltip != null;\n const colorEntry = SEMANTIC_COLORS[color];\n const resolvedColor = subtle ? (colorEntry.subtle?.color ?? colorEntry.color) : colorEntry.color;\n\n const finalIcons = Array.isArray(IconComponent) ? IconComponent : [IconComponent];\n const fullIconWidthEm =\n (finalIcons.length - 1) * ICON_GAP_EM +\n finalIcons.length * BASE_ICON_SIDE_LENGTH_EM * getSizeValue(size);\n\n const iconSideLengthEm = `${BASE_ICON_SIDE_LENGTH_EM * getSizeValue(size)}em`;\n\n return (\n <>\n <div\n onMouseEnter={\n hasTooltip ? (e) => setAnchor(e.currentTarget.getBoundingClientRect()) : undefined\n }\n onMouseLeave={hasTooltip ? () => setAnchor(null) : undefined}\n style={{\n borderRadius: \"0.4em\",\n width: `${fullIconWidthEm}em`,\n height: iconSideLengthEm,\n padding: \"0.15em\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: noBackground ? \"none\" : \"rgba(0,0,0,0.4)\",\n color: resolvedColor,\n flexShrink: 0,\n cursor: hasTooltip ? \"default\" : undefined,\n ...style,\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: `${ICON_GAP_EM}em` }}>\n {finalIcons.map((Comp, i) => (\n <Comp key={`${Comp.name}-${i}`} size={iconSideLengthEm} strokeWidth={2.6} />\n ))}\n </div>\n </div>\n {anchor != null && hasTooltip && <Tooltip anchor={anchor} config={tooltip} />}\n </>\n );\n}\n","import { Component } from \"lucide-react\";\nimport { DEVTOOL_COLOR_SEMANTIC_SYSTEM, ESemanticThing } from \"../../core/devtools_colors\";\nimport { ESize } from \"../ui_util/size\";\nimport { Chip } from \"./Chip\";\nimport { Icon } from \"./Icon\";\n\nfunction DomainHierarchyContent({ allDomains }: { allDomains: string[] }) {\n return (\n <>\n {allDomains.map((d, i) => {\n const isCurrent = i === allDomains.length - 1;\n return (\n <div\n key={d}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.3rem\",\n paddingLeft: `${i * 10}px`,\n paddingTop: i > 0 ? \"0.1rem\" : undefined,\n }}\n >\n <span\n style={{\n fontSize: \"0.8rem\",\n height: \"0.6em\",\n width: \"0.6em\",\n overflow: \"hidden\",\n color: isCurrent ? DEVTOOL_COLOR_SEMANTIC_SYSTEM : \"#3730a3\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n ⬢\n </span>\n <span\n style={{\n color: isCurrent ? DEVTOOL_COLOR_SEMANTIC_SYSTEM : \"#4b5563\",\n fontSize: \"0.7rem\",\n fontWeight: isCurrent ? 500 : undefined,\n }}\n >\n {d}\n </span>\n </div>\n );\n })}\n </>\n );\n}\n\nexport function DomainChip({\n compact = false,\n subtle = false,\n domain,\n allDomains,\n size,\n}: {\n compact?: boolean;\n subtle?: boolean;\n domain: string;\n allDomains: string[];\n size?: ESize;\n}) {\n if (compact) {\n return (\n <Icon\n icon={Component}\n color={ESemanticThing.domain}\n tooltip={{\n content: <DomainHierarchyContent allDomains={allDomains} />,\n title: \"Action Domain\",\n align: \"edge\",\n }}\n />\n );\n }\n return (\n <Chip\n color={ESemanticThing.domain}\n subtle={subtle}\n size={size}\n rounded\n tooltip={{\n content: <DomainHierarchyContent allDomains={allDomains} />,\n title: \"Action Domain\",\n align: \"edge\",\n }}\n // style={{ display: \"flex\", alignItems: \"center\", gap: \"0.4em\" }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.4em\" }}>\n <span\n style={{\n height: \"1.2em\",\n width: \"1.2em\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <Component height={\"1.2em\"} width={\"1.2em\"} />\n </span>\n <span>{domain}</span>\n </div>\n </Chip>\n );\n}\n","import type { IDevtoolsActionEntry, IDevtoolsRouteItem } from \"../../core/ActionDevtools.types\";\r\nimport { DEVTOOL_COLOR_TEXT_MUTED, ESemanticThing } from \"../../core/devtools_colors\";\r\nimport { ESize } from \"../ui_util/size\";\r\nimport { Chip } from \"./Chip\";\r\nimport type { ITooltipConfig } from \"./Tooltip\";\r\n\r\nexport function getExternalLabel(hop: IDevtoolsRouteItem): string | null {\r\n if (hop.handlerType !== \"external\") return null;\r\n return hop.handlerClient != null\r\n ? `${hop.transport ?? \"ext\"} → ${hop.handlerClient.envId}`\r\n : `→ ${hop.transport ?? \"ext\"}`;\r\n}\r\n\r\n/**\r\n * Extended transport details (request/WebSocket endpoint) for the external handler — shown on hover\r\n * only, so the chip/label itself stays short.\r\n */\r\nexport function getTransportTooltip(hop: IDevtoolsRouteItem): ITooltipConfig | undefined {\r\n return getTransportTooltipForHops([hop]);\r\n}\r\n\r\n/**\r\n * Aggregate transport tooltip for a chip/label that represents one or more external hops (e.g. a\r\n * grouped child-dispatch chip that accumulates several transports for the same runtime).\r\n */\r\nexport function getTransportTooltipForHops(hops: IDevtoolsRouteItem[]): ITooltipConfig | undefined {\r\n const lines = hops\r\n .filter((hop) => hop.handlerType === \"external\")\r\n .map((hop) => ({ summary: hop.transportSummary, url: hop.transportUrl }))\r\n .filter((line) => line.summary != null || line.url != null);\r\n\r\n if (lines.length === 0) return undefined;\r\n\r\n return {\r\n title: \"Transport\",\r\n content: (\r\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"6px\", fontSize: \"11px\" }}>\r\n {lines.map((line) => (\r\n <div\r\n key={`${line.summary ?? \"\"}:${line.url ?? \"\"}`}\r\n style={{ display: \"flex\", flexDirection: \"column\", gap: \"2px\" }}\r\n >\r\n {line.summary != null && <span>{line.summary}</span>}\r\n {line.url != null && line.url !== line.summary && (\r\n <span style={{ color: DEVTOOL_COLOR_TEXT_MUTED, wordBreak: \"break-all\" }}>\r\n {line.url}\r\n </span>\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n ),\r\n };\r\n}\r\n\r\ninterface IHandlerChipsProps {\r\n entry: IDevtoolsActionEntry;\r\n size: ESize;\r\n subtle?: boolean;\r\n}\r\n\r\nexport function HandlerChips({ entry, size, subtle }: IHandlerChipsProps) {\r\n const firstHop = entry.meta.routing[0];\r\n const localEnvId = firstHop != null ? firstHop.runtime.envId : null;\r\n const externalLabel = firstHop != null ? getExternalLabel(firstHop) : null;\r\n const firstHopIsLocal = firstHop != null && firstHop.handlerType === \"local\";\r\n\r\n return (\r\n <>\r\n {localEnvId != null && (firstHopIsLocal || externalLabel == null) && (\r\n <Chip color={ESemanticThing.handler_local} size={size} subtle={subtle}>\r\n {localEnvId}\r\n </Chip>\r\n )}\r\n {externalLabel != null && (\r\n <Chip\r\n color={ESemanticThing.handler_external}\r\n size={size}\r\n subtle={subtle}\r\n tooltip={firstHop != null ? getTransportTooltip(firstHop) : undefined}\r\n >\r\n {externalLabel}\r\n </Chip>\r\n )}\r\n </>\r\n );\r\n}\r\n","import { Circle, CircleAlert, CircleCheck, CircleX, Loader2, type LucideIcon } from \"lucide-react\";\r\nimport type { IDevtoolsActionEntry, TDevtoolsActionStatus } from \"../../core/ActionDevtools.types\";\r\nimport {\r\n DEVTOOL_COLOR_SEMANTIC_ERROR,\r\n DEVTOOL_COLOR_SEMANTIC_METADATA,\r\n DEVTOOL_COLOR_SEMANTIC_SUCCESS,\r\n DEVTOOL_COLOR_SEMANTIC_SYSTEM,\r\n DEVTOOL_COLOR_SEMANTIC_WARNING,\r\n ESemanticThing,\r\n} from \"../../core/devtools_colors\";\r\n\r\n// Re-exported from the shared devtools package so existing imports from this\r\n// module keep working.\r\nexport { formatRelativeAge, formatTimestamp, safeStringify } from \"nice-devtools-shared\";\r\n\r\n// CSS colour strings for inline styles — resolved from the 5 semantic tokens.\r\nexport const STATUS_COLOR: Record<TDevtoolsActionStatus, string> = {\r\n running: DEVTOOL_COLOR_SEMANTIC_SYSTEM,\r\n success: DEVTOOL_COLOR_SEMANTIC_SUCCESS,\r\n \"action-error\": DEVTOOL_COLOR_SEMANTIC_WARNING,\r\n failed: DEVTOOL_COLOR_SEMANTIC_ERROR,\r\n aborted: DEVTOOL_COLOR_SEMANTIC_METADATA,\r\n};\r\n\r\n// ESemanticThing values for Chip / Icon components that resolve via SEMANTIC_COLORS.\r\nexport const STATUS_THING: Record<TDevtoolsActionStatus, ESemanticThing> = {\r\n running: ESemanticThing.running_action,\r\n success: ESemanticThing.success,\r\n \"action-error\": ESemanticThing.action_error,\r\n failed: ESemanticThing.failed,\r\n aborted: ESemanticThing.aborted,\r\n};\r\n\r\n// Text fallbacks — keep for tooltip prose only; prefer STATUS_ICON for visual indicators.\r\nexport const STATUS_SYMBOL: Record<TDevtoolsActionStatus, string> = {\r\n running: \"●\",\r\n success: \"✓\",\r\n \"action-error\": \"!\",\r\n failed: \"✗\",\r\n aborted: \"○\",\r\n};\r\n\r\nexport const STATUS_ICON: Record<TDevtoolsActionStatus, LucideIcon> = {\r\n running: Loader2,\r\n success: CircleCheck,\r\n \"action-error\": CircleAlert,\r\n failed: CircleX,\r\n aborted: Circle,\r\n};\r\n\r\n/**\r\n * The runtime an action *originated* on, when that differs from the runtime that handled it — i.e. an\r\n * inbound action received over a transport (a backend push, or an action relayed from another client),\r\n * rather than one dispatched locally. Returns `null` for locally-originated actions (where the origin\r\n * matches the handling runtime) and for actions with no known origin.\r\n */\r\nexport function getInboundOrigin(\r\n entry: IDevtoolsActionEntry,\r\n): { envId: string; perId?: string; insId?: string } | null {\r\n const origin = entry.meta.originClient;\r\n if (origin == null || origin.envId === \"unknown\" || origin.envId === \"_unset_\") return null;\r\n\r\n // The first routing hop's runtime is the one that received/handled the action locally.\r\n const local = entry.meta.routing[0]?.runtime;\r\n if (local == null) return null;\r\n\r\n const sameRuntime =\r\n origin.envId === local.envId &&\r\n (origin.perId ?? null) === (local.perId ?? null) &&\r\n (origin.insId ?? null) === (local.insId ?? null);\r\n\r\n return sameRuntime ? null : origin;\r\n}\r\n\r\nexport function formatDuration(entry: IDevtoolsActionEntry): string | null {\r\n return entry.endTime != null ? `${entry.endTime - entry.startTime}ms` : null;\r\n}\r\n","import { useEffect, useState } from \"react\";\nimport type { IDevtoolsActionEntry } from \"../../core/ActionDevtools.types\";\nimport { formatDuration } from \"./utils\";\n\nexport function RunningTimer({ startTime }: { startTime: number }) {\n const [elapsed, setElapsed] = useState(() => Date.now() - startTime);\n\n useEffect(() => {\n const interval = setInterval(() => setElapsed(Date.now() - startTime), 100);\n return () => clearInterval(interval);\n }, [startTime]);\n\n return <>{elapsed}ms</>;\n}\n\nexport function DurationDisplay({ entry }: { entry: IDevtoolsActionEntry }) {\n const d = formatDuration(entry);\n return <>{d ?? <RunningTimer startTime={entry.startTime} />}</>;\n}\n","import type { IDevtoolsActionEntry } from \"../../core/ActionDevtools.types\";\r\nimport {\r\n DEVTOOL_COLOR_CALL_STACK_DIVIDER,\r\n DEVTOOL_COLOR_HANDLER_EXTERNAL_TEXT,\r\n DEVTOOL_COLOR_HANDLER_LOCAL_TEXT,\r\n DEVTOOL_COLOR_SEMANTIC_SYSTEM,\r\n DEVTOOL_COLOR_TEXT_FAINT,\r\n DEVTOOL_COLOR_TEXT_SECONDARY,\r\n DEVTOOL_DETAIL_HEADER_BACKGROUND,\r\n DEVTOOL_SECTION_BACKGROUND,\r\n} from \"../../core/devtools_colors\";\r\nimport { ESize } from \"../ui_util/size\";\r\nimport { DomainChip } from \"./DomainChip\";\r\nimport { getExternalLabel, getTransportTooltip } from \"./HandlerChips\";\r\nimport { DurationDisplay } from \"./RunningTimer\";\r\nimport { HoverTooltip } from \"./Tooltip\";\r\nimport { STATUS_COLOR, STATUS_SYMBOL } from \"./utils\";\r\n\r\nfunction getCalledLabel(entry: IDevtoolsActionEntry): string {\r\n const firstHop = entry.meta.routing[0];\r\n if (firstHop == null) return \"↳ call\";\r\n if (firstHop.handlerType === \"local\") return \"↳ local\";\r\n const label = getExternalLabel(firstHop);\r\n return label != null ? `↳ ${label}` : \"↳ call\";\r\n}\r\n\r\nfunction getCalledColor(entry: IDevtoolsActionEntry): string {\r\n const firstHop = entry.meta.routing[0];\r\n if (firstHop == null) return DEVTOOL_COLOR_SEMANTIC_SYSTEM;\r\n if (firstHop.handlerType === \"local\") return DEVTOOL_COLOR_HANDLER_LOCAL_TEXT;\r\n return DEVTOOL_COLOR_HANDLER_EXTERNAL_TEXT;\r\n}\r\n\r\nfunction CallStackLink({\r\n entry,\r\n entryRole,\r\n isFocused,\r\n onClick,\r\n}: {\r\n entry: IDevtoolsActionEntry;\r\n entryRole: \"caller\" | \"called\";\r\n isFocused: boolean;\r\n onClick: () => void;\r\n}) {\r\n const color = STATUS_COLOR[entry.status];\r\n const symbol = STATUS_SYMBOL[entry.status];\r\n\r\n const labelColor = entryRole === \"caller\" ? DEVTOOL_COLOR_TEXT_SECONDARY : getCalledColor(entry);\r\n const label = entryRole === \"caller\" ? \"↑ from\" : getCalledLabel(entry);\r\n\r\n const firstHop = entry.meta.routing[0];\r\n const transportTooltip =\r\n entryRole === \"called\" && firstHop != null ? getTransportTooltip(firstHop) : undefined;\r\n\r\n return (\r\n <div\r\n onClick={onClick}\r\n style={{\r\n background: isFocused ? DEVTOOL_SECTION_BACKGROUND : DEVTOOL_DETAIL_HEADER_BACKGROUND,\r\n borderBottom: `1px solid ${DEVTOOL_COLOR_CALL_STACK_DIVIDER}`,\r\n borderLeft: isFocused\r\n ? `2px solid ${DEVTOOL_COLOR_SEMANTIC_SYSTEM}`\r\n : \"2px solid transparent\",\r\n padding: \"5px 12px 5px 10px\",\r\n display: \"grid\",\r\n gridTemplateColumns: \"1fr 1fr\",\r\n alignItems: \"center\",\r\n columnGap: \"6px\",\r\n cursor: \"pointer\",\r\n }}\r\n >\r\n {/* Status symbol + relationship hint */}\r\n <span style={{ display: \"flex\", alignItems: \"center\", gap: \"1em\", flexShrink: 0 }}>\r\n <span style={{ color, fontSize: \"10px\", flexShrink: 0 }}>{symbol}</span>\r\n <HoverTooltip config={transportTooltip} style={{ flexShrink: 0, display: \"flex\" }}>\r\n <span style={{ color: labelColor, fontSize: \"9px\" }}>{label}</span>\r\n </HoverTooltip>\r\n <span style={{ display: \"flex\", alignItems: \"center\", gap: \"5px\" }}>\r\n <span\r\n style={{\r\n color: DEVTOOL_COLOR_TEXT_SECONDARY,\r\n fontSize: \"11px\",\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n whiteSpace: \"nowrap\",\r\n }}\r\n >\r\n {entry.actionId}\r\n </span>\r\n <DomainChip domain={entry.domain} allDomains={entry.allDomains} size={ESize.sm} />\r\n </span>\r\n </span>\r\n\r\n {/* Duration */}\r\n <span\r\n style={{\r\n color: DEVTOOL_COLOR_TEXT_FAINT,\r\n fontSize: \"10px\",\r\n textAlign: \"right\",\r\n whiteSpace: \"nowrap\",\r\n }}\r\n >\r\n <DurationDisplay entry={entry} />\r\n </span>\r\n </div>\r\n );\r\n}\r\n\r\nexport function CallStackSection({\r\n parent,\r\n childEntries,\r\n focusedChildCuid,\r\n onFocusChild,\r\n onSelectParent,\r\n}: {\r\n parent: IDevtoolsActionEntry | null;\r\n childEntries: IDevtoolsActionEntry[];\r\n focusedChildCuid: string | null;\r\n onFocusChild: (cuid: string) => void;\r\n onSelectParent: (cuid: string) => void;\r\n}) {\r\n if (parent == null && childEntries.length === 0) return null;\r\n\r\n return (\r\n <div>\r\n {parent != null && (\r\n <CallStackLink\r\n entry={parent}\r\n entryRole=\"caller\"\r\n isFocused={false}\r\n onClick={() => onSelectParent(parent.cuid)}\r\n />\r\n )}\r\n {childEntries.map((child) => (\r\n <CallStackLink\r\n key={child.cuid}\r\n entry={child}\r\n entryRole=\"called\"\r\n isFocused={focusedChildCuid === child.cuid}\r\n onClick={() => onFocusChild(child.cuid)}\r\n />\r\n ))}\r\n </div>\r\n );\r\n}\r\n","import type { IDevtoolsRouteItem } from \"../../core/ActionDevtools.types\";\nimport { ESemanticThing } from \"../../core/devtools_colors\";\nimport { ESize } from \"../ui_util/size\";\nimport { Chip } from \"./Chip\";\nimport { getTransportTooltipForHops } from \"./HandlerChips\";\n\nexport function ChildDispatchChips({\n childRouteItems,\n size = ESize.sm,\n}: {\n childRouteItems?: IDevtoolsRouteItem[];\n size?: ESize;\n}) {\n if (childRouteItems == null || childRouteItems.length === 0) return null;\n\n // Group by external runtime (handlerClient.envId), accumulating transports + their hops\n const groups = new Map<\n string,\n { runtimeId: string; transports: string[]; hasClient: boolean; hops: IDevtoolsRouteItem[] }\n >();\n for (const item of childRouteItems) {\n const runtimeId = item.handlerClient?.envId ?? item.transport ?? \"ext\";\n const hasClient = item.handlerClient != null;\n if (!groups.has(runtimeId)) {\n groups.set(runtimeId, { runtimeId, transports: [], hasClient, hops: [] });\n }\n const group = groups.get(runtimeId)!;\n group.hops.push(item);\n const transport = item.transport;\n if (transport != null && !group.transports.includes(transport)) {\n group.transports.push(transport);\n }\n }\n\n return (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"4px\", flexWrap: \"wrap\" }}>\n {Array.from(groups.values()).map((group) => {\n const transportStr = group.transports.length > 0 ? group.transports.join(\", \") : \"ext\";\n const label = group.hasClient\n ? `${transportStr} → ${group.runtimeId}`\n : `→ ${transportStr}`;\n return (\n <Chip\n key={group.runtimeId}\n color={ESemanticThing.handler_external}\n size={size}\n tooltip={getTransportTooltipForHops(group.hops)}\n >\n {label}\n </Chip>\n );\n })}\n </div>\n );\n}\n","import { useState } from \"react\";\r\nimport type { IDevtoolsActionEntry } from \"../../core/ActionDevtools.types\";\r\nimport {\r\n DEVTOOL_COLOR_SEMANTIC_SYSTEM,\r\n DEVTOOL_COLOR_TEXT_FAINT,\r\n DEVTOOL_COLOR_TEXT_MUTED,\r\n DEVTOOL_COLOR_TEXT_SECONDARY,\r\n DEVTOOL_LIST_BASE_BACKGROUND,\r\n DEVTOOL_SECTION_BACKGROUND,\r\n} from \"../../core/devtools_colors\";\r\n\r\nfunction MetaChip({ label, value }: { label: string; value: string }) {\r\n return (\r\n <span style={{ whiteSpace: \"nowrap\" }}>\r\n <span style={{ color: DEVTOOL_COLOR_TEXT_MUTED }}>{label} </span>\r\n <span style={{ color: DEVTOOL_COLOR_TEXT_SECONDARY }}>{value}</span>\r\n </span>\r\n );\r\n}\r\n\r\nexport function MetaSection({ entry }: { entry: IDevtoolsActionEntry }) {\r\n const [expanded, setExpanded] = useState(false);\r\n const { meta, cuid } = entry;\r\n\r\n const expandedRows: { label: string; value: string }[] = [\r\n { label: \"cuid\", value: cuid },\r\n { label: \"runtime\", value: meta.originClient.envId },\r\n ...(meta.originClient.perId != null\r\n ? [{ label: \"perId\", value: meta.originClient.perId }]\r\n : []),\r\n ...(meta.originClient.insId != null\r\n ? [{ label: \"insId\", value: meta.originClient.insId }]\r\n : []),\r\n ];\r\n\r\n return (\r\n <div>\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n marginBottom: \"3px\",\r\n }}\r\n >\r\n <div\r\n style={{\r\n color: DEVTOOL_COLOR_SEMANTIC_SYSTEM,\r\n fontSize: \"10px\",\r\n textTransform: \"uppercase\",\r\n letterSpacing: \"0.05em\",\r\n }}\r\n >\r\n Meta\r\n </div>\r\n <span style={{ color: DEVTOOL_COLOR_TEXT_FAINT, fontSize: \"11px\" }}>\r\n {expanded ? \"▾\" : \"▸\"}\r\n </span>\r\n </div>\r\n {expanded ? (\r\n <div\r\n onClick={() => setExpanded(false)}\r\n style={{\r\n background: DEVTOOL_SECTION_BACKGROUND,\r\n borderRadius: \"4px\",\r\n overflow: \"hidden\",\r\n cursor: \"pointer\",\r\n }}\r\n >\r\n {expandedRows.map(({ label, value }, i) => (\r\n <div\r\n key={label}\r\n style={{\r\n display: \"grid\",\r\n gridTemplateColumns: \"52px 1fr\",\r\n columnGap: \"8px\",\r\n padding: \"4px 8px\",\r\n borderBottom:\r\n i < expandedRows.length - 1\r\n ? `1px solid ${DEVTOOL_LIST_BASE_BACKGROUND}`\r\n : \"none\",\r\n alignItems: \"start\",\r\n }}\r\n >\r\n <span\r\n style={{\r\n textAlign: \"left\",\r\n color: DEVTOOL_COLOR_TEXT_MUTED,\r\n fontSize: \"10px\",\r\n paddingTop: \"1px\",\r\n }}\r\n >\r\n {label}\r\n </span>\r\n <span\r\n style={{\r\n textAlign: \"left\",\r\n color: DEVTOOL_COLOR_TEXT_SECONDARY,\r\n fontSize: \"11px\",\r\n wordBreak: \"break-all\",\r\n }}\r\n >\r\n {value}\r\n </span>\r\n </div>\r\n ))}\r\n </div>\r\n ) : (\r\n <div\r\n onClick={() => setExpanded(true)}\r\n style={{\r\n background: DEVTOOL_SECTION_BACKGROUND,\r\n borderRadius: \"4px\",\r\n padding: \"5px 8px\",\r\n fontSize: \"11px\",\r\n display: \"flex\",\r\n gap: \"10px\",\r\n rowGap: \"2px\",\r\n flexWrap: \"wrap\",\r\n cursor: \"pointer\",\r\n }}\r\n >\r\n <MetaChip label=\"cuid\" value={`…${cuid.slice(-8)}`} />\r\n <MetaChip label=\"runtime\" value={meta.originClient.envId} />\r\n {meta.originClient.perId != null && (\r\n <MetaChip\r\n label=\"perId\"\r\n value={\r\n meta.originClient.perId.length > 10\r\n ? `${meta.originClient.perId.slice(0, 10)}…`\r\n : meta.originClient.perId\r\n }\r\n />\r\n )}\r\n {meta.originClient.insId != null && (\r\n <MetaChip\r\n label=\"insId\"\r\n value={\r\n meta.originClient.insId.length > 10\r\n ? `${meta.originClient.insId.slice(0, 10)}…`\r\n : meta.originClient.insId\r\n }\r\n />\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { ESemanticThing } from \"../../core/devtools_colors\";\nimport { ESize } from \"../ui_util/size\";\nimport { Chip } from \"./Chip\";\n\n/**\n * Marks an action that was received from another runtime (a backend push, or an action relayed from\n * another client) rather than dispatched locally. The chip shows the origin's `envId`; the tooltip\n * carries the full coordinate. Render it only when {@link getInboundOrigin} returns a value.\n */\nexport function OriginChip({\n origin,\n size = ESize.md,\n subtle,\n}: {\n origin: { envId: string; perId?: string; insId?: string };\n size?: ESize;\n subtle?: boolean;\n}) {\n return (\n <Chip\n color={ESemanticThing.origin}\n size={size}\n subtle={subtle}\n tooltip={{\n title: \"Received from\",\n content: (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"2px\", fontSize: \"11px\" }}>\n <span>env {origin.envId}</span>\n {origin.perId != null && <span>perId {origin.perId}</span>}\n {origin.insId != null && <span>insId {origin.insId}</span>}\n </div>\n ),\n }}\n >\n {`⇠ ${origin.envId}`}\n </Chip>\n );\n}\n","import type { IDevtoolsActionEntry } from \"../../core/ActionDevtools.types\";\r\nimport {\r\n DEVTOOL_COLOR_SEMANTIC_SUCCESS,\r\n DEVTOOL_COLOR_SEMANTIC_WARNING,\r\n DEVTOOL_COLOR_TEXT_FAINT,\r\n DEVTOOL_COLOR_TEXT_MUTED,\r\n DEVTOOL_COLOR_TEXT_SECONDARY,\r\n DEVTOOL_LIST_BASE_BACKGROUND,\r\n DEVTOOL_SECTION_BACKGROUND,\r\n} from \"../../core/devtools_colors\";\r\nimport { getTransportTooltip } from \"./HandlerChips\";\r\nimport { SectionLabel } from \"./SectionLabel\";\r\nimport { HoverTooltip } from \"./Tooltip\";\r\n\r\nexport function RoutingSection({\r\n entry,\r\n minHopCount = 0,\r\n}: {\r\n entry: IDevtoolsActionEntry;\r\n minHopCount?: number;\r\n}) {\r\n const { meta, startTime } = entry;\r\n const hopCount = meta.routing.length;\r\n const phantomCount = Math.max(0, minHopCount - hopCount);\r\n\r\n if (hopCount === 0 && phantomCount === 0) return null;\r\n\r\n return (\r\n <div>\r\n <SectionLabel\r\n label={hopCount > 0 ? `Routing · ${hopCount} hop${hopCount !== 1 ? \"s\" : \"\"}` : \"Routing\"}\r\n />\r\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"2px\" }}>\r\n {meta.routing.map((hop, i) => {\r\n const isLocal = hop.handlerType === \"local\";\r\n const isLast = i === hopCount - 1 && phantomCount === 0;\r\n const badgeColor = isLocal\r\n ? DEVTOOL_COLOR_SEMANTIC_SUCCESS\r\n : DEVTOOL_COLOR_SEMANTIC_WARNING;\r\n const badgeText = isLocal\r\n ? \"● exec\"\r\n : `→ ${hop.transportSummary ?? hop.transport ?? \"ext\"}`;\r\n const transportTooltip = isLocal ? undefined : getTransportTooltip(hop);\r\n const runtimeTitle =\r\n [hop.runtime.perId, hop.runtime.insId].filter(Boolean).join(\" · \") || undefined;\r\n\r\n return (\r\n <div\r\n key={`${hop.time}-${hop.runtime.envId}`}\r\n style={{\r\n background: DEVTOOL_SECTION_BACKGROUND,\r\n borderRadius: \"4px\",\r\n overflow: \"hidden\",\r\n display: \"grid\",\r\n gridTemplateColumns: \"30% 1fr 30%\",\r\n alignItems: \"center\",\r\n columnGap: \"8px\",\r\n borderBottom: isLast ? undefined : `1px solid ${DEVTOOL_LIST_BASE_BACKGROUND}`,\r\n padding: \"4px 8px\",\r\n }}\r\n >\r\n <span\r\n style={{ display: \"flex\", flexDirection: \"row\", alignItems: \"center\", gap: \"10px\" }}\r\n >\r\n <span\r\n style={{\r\n color: DEVTOOL_COLOR_TEXT_FAINT,\r\n fontSize: \"10px\",\r\n width: \"16px\",\r\n textAlign: \"right\",\r\n }}\r\n >\r\n {i + 1}\r\n </span>\r\n <span\r\n title={runtimeTitle}\r\n style={{\r\n color: DEVTOOL_COLOR_TEXT_SECONDARY,\r\n fontSize: \"11px\",\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n whiteSpace: \"nowrap\",\r\n textAlign: \"center\",\r\n }}\r\n >\r\n {hop.runtime.envId}\r\n </span>\r\n </span>\r\n <HoverTooltip\r\n config={transportTooltip}\r\n style={{ display: \"block\", minWidth: 0, overflow: \"hidden\" }}\r\n >\r\n <span\r\n style={{\r\n color: badgeColor,\r\n fontSize: \"10px\",\r\n whiteSpace: \"nowrap\",\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n display: \"block\",\r\n }}\r\n >\r\n {badgeText}\r\n </span>\r\n </HoverTooltip>\r\n <span\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n paddingRight: \"8px\",\r\n overflow: \"hidden\",\r\n }}\r\n >\r\n <span\r\n style={{\r\n color: DEVTOOL_COLOR_TEXT_MUTED,\r\n fontSize: \"10px\",\r\n whiteSpace: \"nowrap\",\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n }}\r\n >\r\n {hop.handlerClient != null ? `↳ ${hop.handlerClient.envId}` : \"\"}\r\n </span>\r\n <span\r\n style={{\r\n color: DEVTOOL_COLOR_TEXT_FAINT,\r\n fontSize: \"10px\",\r\n flexShrink: 0,\r\n marginLeft: \"auto\",\r\n }}\r\n >\r\n +{hop.time - startTime}ms\r\n </span>\r\n </span>\r\n </div>\r\n );\r\n })}\r\n {Array.from({ length: phantomCount }, (_, i) => `routing-phantom-${hopCount + i}`).map(\r\n (key) => (\r\n <div\r\n key={key}\r\n aria-hidden=\"true\"\r\n style={{\r\n visibility: \"hidden\",\r\n background: DEVTOOL_SECTION_BACKGROUND,\r\n borderRadius: \"4px\",\r\n display: \"grid\",\r\n gridTemplateColumns: \"30% 1fr 30%\",\r\n alignItems: \"center\",\r\n columnGap: \"8px\",\r\n padding: \"4px 8px\",\r\n }}\r\n >\r\n <span\r\n style={{ display: \"flex\", flexDirection: \"row\", alignItems: \"center\", gap: \"10px\" }}\r\n >\r\n <span style={{ fontSize: \"10px\", width: \"16px\" }}>0</span>\r\n <span style={{ fontSize: \"11px\" }}>placeholder</span>\r\n </span>\r\n <span style={{ fontSize: \"10px\" }}>placeholder</span>\r\n <span />\r\n </div>\r\n ),\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { useMemo, useState } from \"react\";\nimport type {\n IDevtoolsActionEntry,\n IDevtoolsRouteItem,\n TDevtoolsActionStatus,\n} from \"../../../core/ActionDevtools.types\";\nimport {\n DEVTOOL_COLOR_SEMANTIC_ERROR,\n DEVTOOL_COLOR_SEMANTIC_METADATA,\n DEVTOOL_COLOR_SEMANTIC_SUCCESS,\n DEVTOOL_COLOR_TEXT_EMPHASIS,\n DEVTOOL_COLOR_TEXT_SECONDARY,\n DEVTOOL_DETAIL_BASE_BACKGROUND,\n DEVTOOL_DETAIL_HEADER_BACKGROUND,\n DEVTOOL_LIST_BASE_BACKGROUND,\n DEVTOOL_SECTION_BACKGROUND,\n} from \"../../../core/devtools_colors\";\nimport { ESize } from \"../../ui_util/size\";\nimport { ActionErrorDisplay } from \"../ActionErrorDisplay\";\nimport { CallStackSection } from \"../CallStackSection\";\nimport { ChildDispatchChips } from \"../ChildDispatchChips\";\nimport { DetailSection } from \"../DetailSection\";\nimport { DomainChip } from \"../DomainChip\";\nimport { HandlerChips } from \"../HandlerChips\";\nimport { MetaSection } from \"../MetaSection\";\nimport { OriginChip } from \"../OriginChip\";\nimport { RoutingSection } from \"../RoutingSection\";\nimport { DurationDisplay } from \"../RunningTimer\";\nimport { countUserFrames, StackTraceSection } from \"../StackTraceSection\";\nimport { formatTimestamp, getInboundOrigin, STATUS_COLOR, STATUS_ICON } from \"../utils\";\n\nconst STATUS_BADGE_LABEL: Record<TDevtoolsActionStatus, string> = {\n running: \"RUNNING\",\n success: \"SUCCESS\",\n \"action-error\": \"ERROR\",\n failed: \"FAILED\",\n aborted: \"ABORTED\",\n};\n\n// Both action-error and failed are critical — use Error Red so the badge always\n// signals danger consistently, regardless of the underlying status sub-type.\nconst STATUS_BADGE_BG: Record<TDevtoolsActionStatus, string> = {\n running: STATUS_COLOR.running,\n success: STATUS_COLOR.success,\n \"action-error\": DEVTOOL_COLOR_SEMANTIC_ERROR,\n failed: DEVTOOL_COLOR_SEMANTIC_ERROR,\n aborted: DEVTOOL_COLOR_SEMANTIC_METADATA,\n};\n\nconst STATUS_BADGE_TEXT_COLOR: Record<TDevtoolsActionStatus, string> = {\n running: \"#0f172a\",\n success: \"#0f172a\",\n \"action-error\": \"#ffffff\",\n failed: \"#ffffff\",\n aborted: \"#0f172a\",\n};\n\nfunction DetailHeader({\n entry,\n isActive,\n onClick,\n childExternalRouteItems,\n}: {\n entry: IDevtoolsActionEntry;\n isActive: boolean;\n onClick: () => void;\n childExternalRouteItems?: IDevtoolsRouteItem[];\n}) {\n const color = STATUS_COLOR[entry.status];\n const StatusIconComponent = STATUS_ICON[entry.status];\n const timestamp = formatTimestamp(entry.startTime);\n const inboundOrigin = getInboundOrigin(entry);\n\n return (\n <div\n onClick={!isActive ? onClick : undefined}\n style={{\n padding: \"0.5em 1em\",\n background: isActive ? DEVTOOL_SECTION_BACKGROUND : DEVTOOL_DETAIL_HEADER_BACKGROUND,\n borderBottom: `1px solid ${DEVTOOL_LIST_BASE_BACKGROUND}`,\n borderLeft: isActive ? `2px solid ${color}` : \"2px solid transparent\",\n flexShrink: 0,\n flexDirection: \"row\",\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: \"1em\",\n cursor: isActive ? \"default\" : \"pointer\",\n }}\n >\n <div style={{ flex: 1, minWidth: 0, display: \"flex\", flexDirection: \"column\", gap: \"0.5em\" }}>\n <div style={{ display: \"flex\", alignItems: \"center\", minWidth: 0, gap: \"0.5em\" }}>\n <span\n style={{\n color,\n flexShrink: 0,\n display: \"flex\",\n alignItems: \"center\",\n animation:\n entry.status === \"running\"\n ? \"__nice-action-pulse 1.2s ease-in-out infinite\"\n : undefined,\n }}\n >\n <StatusIconComponent size={20} strokeWidth={1.75} />\n </span>\n <span\n style={{\n color: DEVTOOL_COLOR_TEXT_EMPHASIS,\n fontSize: \"1.2em\",\n fontWeight: \"600\",\n fontFamily: \"ui-monospace, 'Cascadia Code', 'Source Code Pro', monospace\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n flexShrink: 1,\n minWidth: \"2.5em\",\n }}\n >\n {entry.actionId}\n </span>\n {/* Status pill badge */}\n <span\n style={{\n flexShrink: 0,\n padding: \"2px 9px\",\n borderRadius: \"999px\",\n background: STATUS_BADGE_BG[entry.status],\n color: STATUS_BADGE_TEXT_COLOR[entry.status],\n fontSize: \"9px\",\n fontWeight: \"700\",\n letterSpacing: \"0.1em\",\n textTransform: \"uppercase\",\n fontFamily: \"ui-sans-serif, system-ui, sans-serif\",\n }}\n >\n {STATUS_BADGE_LABEL[entry.status]}\n </span>\n <DomainChip domain={entry.domain} allDomains={entry.allDomains} size={ESize.md} />\n </div>\n\n {/* Handler chips | timestamp + duration */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: \"8px\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n minWidth: 0,\n overflow: \"hidden\",\n }}\n >\n {inboundOrigin != null && <OriginChip origin={inboundOrigin} size={ESize.md} />}\n <HandlerChips entry={entry} size={ESize.md} />\n <ChildDispatchChips childRouteItems={childExternalRouteItems} size={ESize.md} />\n </div>\n\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"8px\", flexShrink: 0 }}>\n <span\n style={{\n color: DEVTOOL_COLOR_SEMANTIC_METADATA,\n fontSize: \"10px\",\n letterSpacing: \"0.02em\",\n fontFamily: \"ui-sans-serif, system-ui, sans-serif\",\n }}\n >\n {timestamp}\n </span>\n <span style={{ color, fontSize: \"12px\", fontWeight: \"500\" }}>\n <DurationDisplay entry={entry} />\n </span>\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nexport function ActionDetailPanel({\n entry,\n parent,\n childEntries,\n onSelectEntry,\n}: {\n entry: IDevtoolsActionEntry;\n parent: IDevtoolsActionEntry | null;\n childEntries: IDevtoolsActionEntry[];\n onSelectEntry: (cuid: string) => void;\n}) {\n const [focusedChildCuid, setFocusedChildCuid] = useState<string | null>(null);\n\n const focusedEntry =\n focusedChildCuid != null\n ? (childEntries.find((e) => e.cuid === focusedChildCuid) ?? entry)\n : entry;\n\n const maxRoutingHops = Math.max(\n entry.meta.routing.length,\n ...childEntries.map((e) => e.meta.routing.length),\n 0,\n );\n\n const maxCallSiteFrames = Math.max(\n countUserFrames(entry.meta.originClient, entry.callSite),\n ...childEntries.map((e) => countUserFrames(e.meta.originClient, e.callSite)),\n 0,\n );\n\n const childExternalRouteItems = useMemo(() => {\n const seen = new Set<string>();\n const result: IDevtoolsRouteItem[] = [];\n for (const child of childEntries) {\n const firstHop = child.meta.routing[0];\n if (firstHop == null || firstHop.handlerType !== \"external\") continue;\n const key = `${firstHop.handlerClient?.envId ?? \"\"}:${firstHop.transport ?? \"\"}`;\n if (seen.has(key)) continue;\n seen.add(key);\n result.push(firstHop);\n }\n return result;\n }, [childEntries]);\n\n const handleFocusChild = (cuid: string) => {\n setFocusedChildCuid((prev) => (prev === cuid ? null : cuid));\n };\n\n return (\n <div\n style={{\n flex: 1,\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n minHeight: 0,\n background: DEVTOOL_DETAIL_BASE_BACKGROUND,\n }}\n >\n <DetailHeader\n entry={entry}\n isActive={focusedChildCuid === null}\n onClick={() => setFocusedChildCuid(null)}\n childExternalRouteItems={childExternalRouteItems}\n />\n <CallStackSection\n parent={parent}\n childEntries={childEntries}\n focusedChildCuid={focusedChildCuid}\n onFocusChild={handleFocusChild}\n onSelectParent={onSelectEntry}\n />\n <div\n style={{\n flex: 1,\n overflowY: \"auto\",\n minHeight: 0,\n padding: \"10px 12px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"8px\",\n }}\n >\n {focusedEntry.input !== undefined ? (\n <DetailSection label=\"Input\" value={focusedEntry.input} />\n ) : (\n <DetailSection label=\"Input\" value={\"No input required or given\"} />\n )}\n {focusedEntry.status === \"success\" && (\n <DetailSection\n label=\"Output\"\n value={focusedEntry.output}\n color={DEVTOOL_COLOR_SEMANTIC_SUCCESS}\n />\n )}\n {(focusedEntry.status === \"action-error\" ||\n focusedEntry.status === \"failed\" ||\n focusedEntry.status === \"aborted\") && <ActionErrorDisplay entry={focusedEntry} />}\n {focusedEntry.progressUpdates.length > 0 && (\n <DetailSection\n label={`Progress (${focusedEntry.progressUpdates.length})`}\n value={focusedEntry.progressUpdates}\n />\n )}\n <StackTraceSection\n runtime={entry.meta.originClient}\n label=\"Dispatch Site\"\n stack={focusedEntry.callSite}\n color={DEVTOOL_COLOR_TEXT_SECONDARY}\n minFrameCount={maxCallSiteFrames}\n />\n <RoutingSection entry={focusedEntry} minHopCount={maxRoutingHops} />\n <MetaSection entry={focusedEntry} />\n </div>\n </div>\n );\n}\n","import { renderColoredJson, safeStringify } from \"nice-devtools-shared\";\r\n\r\nfunction stripOuterBraces(json: string): string {\r\n const lines = json.split(\"\\n\");\r\n if (lines.length > 2 && lines[0] === \"{\" && lines[lines.length - 1] === \"}\") {\r\n return lines\r\n .slice(1, -1)\r\n .map((l) => l.slice(2))\r\n .join(\"\\n\");\r\n }\r\n return json;\r\n}\r\n\r\nexport function IoTooltipContent({ value }: { value: unknown }) {\r\n const text = stripOuterBraces(safeStringify(value, 2));\r\n return (\r\n <div\r\n style={{\r\n fontFamily: \"ui-monospace, 'Cascadia Code', 'Source Code Pro', monospace\",\r\n fontSize: \"10px\",\r\n whiteSpace: \"pre-wrap\",\r\n wordBreak: \"break-all\",\r\n lineHeight: \"1.5\",\r\n textAlign: \"left\",\r\n }}\r\n >\r\n {renderColoredJson(text)}\r\n </div>\r\n );\r\n}\r\n","import { CircleX, PackageCheck, Sparkle, Sprout, Variable } from \"lucide-react\";\nimport { useState } from \"react\";\nimport type { IDevtoolsActionEntry } from \"../../../core/ActionDevtools.types\";\nimport { DEVTOOL_COLOR_TEXT_MUTED, ESemanticThing } from \"../../../core/devtools_colors\";\nimport { ESize, getSizeValue } from \"../../ui_util/size\";\nimport { ActionErrorDisplay } from \"../ActionErrorDisplay\";\nimport { Chip } from \"../Chip\";\nimport { getExternalLabel, getTransportTooltip } from \"../HandlerChips\";\nimport { Icon } from \"../Icon\";\nimport { Tooltip } from \"../Tooltip\";\nimport { EBreakGroupReason } from \"./action_list.types\";\nimport { IoTooltipContent } from \"./IoTooltipContent\";\n\ninterface IActionInputAndOutputChipProps {\n entry: IDevtoolsActionEntry;\n breakReasons: EBreakGroupReason[];\n subtle?: boolean;\n size?: ESize;\n}\n\nexport const ActionInputAndOutputChip = ({\n entry,\n breakReasons,\n subtle,\n size = ESize.md,\n}: IActionInputAndOutputChipProps) => {\n const firstHop = entry.meta.routing[0];\n const localEnvId = firstHop != null ? firstHop.runtime.envId : null;\n const externalLabel = firstHop != null ? getExternalLabel(firstHop) : null;\n const firstHopIsLocal = firstHop != null && firstHop.handlerType === \"local\";\n const isLocal = localEnvId != null && (firstHopIsLocal || externalLabel == null);\n const color = isLocal ? ESemanticThing.handler_local : ESemanticThing.handler_external;\n\n const transportTooltip = firstHop != null ? getTransportTooltip(firstHop) : undefined;\n const [labelAnchor, setLabelAnchor] = useState<DOMRect | null>(null);\n\n const isNewInput = breakReasons.includes(EBreakGroupReason.new_input);\n const isNewOutput = breakReasons.includes(EBreakGroupReason.new_output);\n const hasError = entry.error != null || entry.abortReason != null;\n\n const sizeNum = getSizeValue(size);\n const newIconSizeEm = `${sizeNum * 0.9}em`; // visually tuned\n\n const label = `${(isLocal ? localEnvId : externalLabel) ?? \"unknown\"}`;\n\n const newSparkleComp = (\n <div\n style={{\n opacity: 0.9,\n alignSelf: \"start\",\n marginLeft: \"-0.6em\",\n }}\n >\n <Sparkle\n strokeWidth={\"0.2em\"}\n color={\"rgba(243, 250, 140, 1)\"}\n width={newIconSizeEm}\n height={newIconSizeEm}\n />\n </div>\n );\n\n return (\n <Chip color={color} size={size} subtle={subtle}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.4em\" }}>\n <Icon\n noBackground\n icon={Variable}\n color={color}\n subtle={subtle || entry.input === undefined}\n tooltip={{\n content:\n entry.input !== undefined ? (\n <IoTooltipContent value={entry.input} />\n ) : (\n <span style={{ color: DEVTOOL_COLOR_TEXT_MUTED, fontSize: \"10px\" }}>\n No input required or given\n </span>\n ),\n title: isNewInput ? \"New Input\" : \"Input\",\n }}\n />\n {isNewInput && newSparkleComp}\n <span style={{ opacity: 0.6 }} color={color}>\n →\n </span>\n <span\n title={transportTooltip == null ? label : undefined}\n style={{\n opacity: 0.8,\n cursor: transportTooltip != null ? \"default\" : undefined,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n maxWidth: \"14ch\",\n }}\n onMouseEnter={\n transportTooltip != null\n ? (e) => setLabelAnchor(e.currentTarget.getBoundingClientRect())\n : undefined\n }\n onMouseLeave={transportTooltip != null ? () => setLabelAnchor(null) : undefined}\n >\n {label}\n </span>\n {labelAnchor != null && transportTooltip != null && (\n <Tooltip anchor={labelAnchor} config={transportTooltip} />\n )}\n <span style={{ opacity: 0.6 }} color={color}>\n →\n </span>\n {entry.status === \"success\" && entry.output !== undefined && (\n <Icon\n noBackground\n icon={PackageCheck}\n color={!hasError ? color : ESemanticThing.default}\n tooltip={{\n content: <IoTooltipContent value={entry.output} />,\n title: isNewOutput ? \"New Output\" : \"Output\",\n }}\n />\n )}\n {(entry.error != null || entry.abortReason != null) && (\n <Icon\n noBackground\n icon={CircleX}\n color={entry.status === \"aborted\" ? ESemanticThing.aborted : ESemanticThing.error}\n tooltip={{\n content: <ActionErrorDisplay entry={entry} compact />,\n title: entry.status === \"aborted\" ? \"Aborted\" : \"Error\",\n maxWidth: 340,\n }}\n />\n )}\n {isNewOutput && newSparkleComp}\n </div>\n </Chip>\n );\n};\n","import { CircleX, PackageCheck, Variable } from \"lucide-react\";\nimport { Fragment, useState } from \"react\";\nimport type {\n IDevtoolsActionEntry,\n TDevtoolsActionStatus,\n} from \"../../../core/ActionDevtools.types\";\nimport {\n DEVTOOL_COLOR_SEMANTIC_METADATA,\n DEVTOOL_COLOR_SEMANTIC_WARNING,\n DEVTOOL_COLOR_TEXT_MUTED,\n DEVTOOL_COLOR_TEXT_SECONDARY,\n DEVTOOL_LIST_HEADER_SELECTED_BACKGROUND,\n DEVTOOL_PANEL_BORDER,\n DEVTOOL_SECTION_BACKGROUND,\n ESemanticThing,\n} from \"../../../core/devtools_colors\";\nimport { ESize } from \"../../ui_util/size\";\nimport { ActionErrorDisplay } from \"../ActionErrorDisplay\";\nimport { Chip } from \"../Chip\";\nimport { HandlerChips } from \"../HandlerChips\";\nimport { Icon } from \"../Icon\";\nimport { OriginChip } from \"../OriginChip\";\nimport { DurationDisplay } from \"../RunningTimer\";\nimport { Tooltip } from \"../Tooltip\";\nimport {\n formatRelativeAge,\n formatTimestamp,\n getInboundOrigin,\n STATUS_COLOR,\n STATUS_SYMBOL,\n} from \"../utils\";\nimport { ActionInputAndOutputChip } from \"./ActionInputAndOutputChip\";\nimport { EBreakGroupReason } from \"./action_list.types\";\nimport { IoTooltipContent } from \"./IoTooltipContent\";\n\n// Max group dots to render before collapsing the rest into a \"+ X\" indicator.\nconst MAX_GROUP_DOTS = 5;\n\nfunction getLatestChipColor(status: TDevtoolsActionStatus): ESemanticThing {\n if (status === \"failed\") return ESemanticThing.failed;\n if (status === \"action-error\") return ESemanticThing.action_error;\n if (status === \"aborted\") return ESemanticThing.aborted;\n return ESemanticThing.success;\n}\n\n// ─── Group dot + tooltip ──────────────────────────────────────────────────────\n\nfunction GroupDotTooltip({\n entry,\n index,\n total,\n refTime,\n dotColor,\n anchor,\n}: {\n entry: IDevtoolsActionEntry;\n index: number;\n total: number;\n refTime: number;\n dotColor: string;\n anchor: DOMRect;\n}) {\n const symbol = STATUS_SYMBOL[entry.status];\n const deltaMs = refTime - entry.startTime;\n const relStr = index === 0 ? \"latest run\" : `−${formatRelativeAge(deltaMs)} from latest`;\n const durationStr = entry.endTime != null ? `${entry.endTime - entry.startTime}ms` : \"running…\";\n\n return (\n <Tooltip\n anchor={anchor}\n config={{\n align: \"center\",\n maxWidth: 240,\n content: (\n <>\n <div style={{ color: dotColor, marginBottom: \"1px\" }}>\n {symbol} run {index + 1} of {total}\n </div>\n <div style={{ color: DEVTOOL_COLOR_TEXT_SECONDARY }}>\n {formatTimestamp(entry.startTime)}\n </div>\n <div style={{ color: DEVTOOL_COLOR_TEXT_MUTED }}>{durationStr}</div>\n {index > 0 && (\n <div\n style={{\n color: DEVTOOL_COLOR_TEXT_MUTED,\n marginTop: \"3px\",\n paddingTop: \"3px\",\n borderTop: `1px solid ${DEVTOOL_SECTION_BACKGROUND}`,\n }}\n >\n {relStr}\n </div>\n )}\n </>\n ),\n }}\n />\n );\n}\n\nfunction GroupDot({\n entry,\n index,\n total,\n refTime,\n isActive,\n onSelect,\n}: {\n entry: IDevtoolsActionEntry;\n index: number;\n total: number;\n refTime: number;\n isActive: boolean;\n onSelect: () => void;\n}) {\n const [anchor, setAnchor] = useState<DOMRect | null>(null);\n const dotColor = STATUS_COLOR[entry.status];\n const hovered = anchor != null;\n\n return (\n <>\n <button\n data-cuid={entry.cuid}\n onClick={(e) => {\n e.stopPropagation();\n onSelect();\n }}\n onMouseEnter={(e) => setAnchor(e.currentTarget.getBoundingClientRect())}\n onMouseLeave={() => setAnchor(null)}\n style={{\n width: \"9px\",\n height: \"9px\",\n borderRadius: \"50%\",\n border: isActive\n ? `2px solid ${dotColor}`\n : hovered\n ? `1px solid ${dotColor}99`\n : \"1px solid transparent\",\n background: isActive ? \"transparent\" : dotColor,\n cursor: \"pointer\",\n padding: 0,\n flexShrink: 0,\n opacity: isActive ? 1 : hovered ? 0.8 : 0.35,\n transform: hovered ? \"scale(1.55)\" : \"scale(1)\",\n transition: \"transform 0.1s ease, opacity 0.1s ease, border-color 0.1s ease\",\n }}\n />\n {hovered && anchor != null && (\n <GroupDotTooltip\n entry={entry}\n index={index}\n total={total}\n refTime={refTime}\n dotColor={dotColor}\n anchor={anchor}\n />\n )}\n </>\n );\n}\n\n// ─── Main row ─────────────────────────────────────────────────────────────────\n\nexport function ActionEntryRow({\n entry,\n isSelected,\n onClick,\n isLatest = false,\n latestTime,\n childEntries,\n breakReasons,\n groupEntries,\n selectedGroupCuid,\n onSelectGroupEntry,\n}: {\n entry: IDevtoolsActionEntry;\n isSelected: boolean;\n onClick: () => void;\n isLatest?: boolean;\n latestTime?: number;\n childEntries?: IDevtoolsActionEntry[];\n breakReasons: EBreakGroupReason[];\n groupEntries?: IDevtoolsActionEntry[];\n selectedGroupCuid?: string | null;\n onSelectGroupEntry?: (cuid: string) => void;\n}) {\n const timestamp = formatTimestamp(entry.startTime);\n const hasGroup = groupEntries != null && groupEntries.length > 1;\n const inboundOrigin = getInboundOrigin(entry);\n\n // The bottom section surfaces cross-runtime usage only — child actions that were handled on a\n // *different* runtime (external handlers with their transports). Children handled on the local\n // runtime are intentionally omitted here; their local-runtime chip shows on the top section and in\n // the detail panel instead.\n const externalChildEntries =\n childEntries?.filter((child) => child.meta.routing[0]?.handlerType === \"external\") ?? [];\n\n const nonIoBreakReasons =\n breakReasons?.filter(\n (r) => r !== EBreakGroupReason.new_input && r !== EBreakGroupReason.new_output,\n ) ?? [];\n\n const hasBottomError = entry.error != null || entry.abortReason != null;\n\n const hasBottomContent = externalChildEntries.length > 0 || nonIoBreakReasons.length > 0;\n\n return (\n <div\n data-cuid={entry.cuid}\n onClick={onClick}\n style={{\n position: \"relative\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"5px\",\n padding: \"0.5em 0.6em\",\n cursor: \"pointer\",\n background: isSelected ? DEVTOOL_LIST_HEADER_SELECTED_BACKGROUND : \"transparent\",\n border: `1px solid ${DEVTOOL_PANEL_BORDER}`,\n borderLeft: isSelected\n ? `2px solid ${STATUS_COLOR[entry.status]}`\n : entry.status === \"failed\" || entry.status === \"action-error\"\n ? `2px solid ${STATUS_COLOR[entry.status]}55`\n : `2px solid ${DEVTOOL_PANEL_BORDER}`,\n borderRadius: \"3px\",\n margin: \"2px 4px\",\n }}\n >\n {/* Timeline vertical line */}\n <div\n style={{\n position: \"absolute\",\n left: \"2em\",\n top: 0,\n bottom: 0,\n width: \"1px\",\n background: `${DEVTOOL_COLOR_SEMANTIC_METADATA}28`,\n pointerEvents: \"none\",\n zIndex: 0,\n }}\n />\n\n {/* Line 1 — identity: age chip + actionId (the hero, gets the full line) + duration.\n actionId is never sacrificed to fit the routing/I-O detail, which now lives on line 2. */}\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"8px\" }}>\n {/* Age chip + timestamp — chip sits on the timeline line; the timestamp is absolutely\n positioned beneath it so it falls into the empty gutter alongside line 2 instead of\n adding height to this row. */}\n <div\n style={{\n position: \"relative\",\n zIndex: 1,\n flexShrink: 0,\n minWidth: \"3.4em\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"flex-start\",\n }}\n >\n {isLatest ? (\n <Chip size={ESize.sm} color={getLatestChipColor(entry.status)}>\n latest\n </Chip>\n ) : (\n <Chip size={ESize.sm} color={getLatestChipColor(entry.status)}>\n +{latestTime != null ? formatRelativeAge(latestTime - entry.startTime) : \"?\"}\n </Chip>\n )}\n <span\n style={{\n position: \"absolute\",\n top: \"100%\",\n left: 0,\n marginTop: \"5px\",\n color: DEVTOOL_COLOR_SEMANTIC_METADATA,\n fontSize: \"10px\",\n lineHeight: \"1em\",\n letterSpacing: \"0.02em\",\n fontFamily: \"ui-sans-serif, system-ui, sans-serif\",\n opacity: 0.7,\n paddingLeft: \"0.1em\",\n whiteSpace: \"nowrap\",\n }}\n >\n {timestamp}\n </span>\n </div>\n\n <span\n title={entry.actionId}\n style={{\n flex: 1,\n minWidth: 0,\n color: DEVTOOL_COLOR_TEXT_SECONDARY,\n fontSize: \"1em\",\n fontWeight: 400,\n fontFamily: \"ui-monospace, 'Cascadia Code', 'Source Code Pro', monospace\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {entry.actionId}\n </span>\n\n <span\n style={{\n color: DEVTOOL_COLOR_SEMANTIC_WARNING,\n lineHeight: \"1em\",\n fontSize: \"11px\",\n opacity: 0.9,\n flexShrink: 0,\n fontFamily: \"ui-sans-serif, system-ui, sans-serif\",\n }}\n >\n <DurationDisplay entry={entry} />\n </span>\n </div>\n\n {/* Line 2 — routing: origin + input→handler→output, aligned under the actionId. Giving this\n its own line lets the handler/transport detail use the full panel width instead of squeezing\n the action name on a single cramped row. */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.4em\",\n paddingLeft: \"4.5em\",\n minWidth: 0,\n }}\n >\n {inboundOrigin != null && <OriginChip origin={inboundOrigin} size={ESize.sm} subtle />}\n <ActionInputAndOutputChip breakReasons={breakReasons} entry={entry} size={ESize.sm} />\n </div>\n\n {/* Bottom section: cross-runtime child action handlers — subtle, left-aligned to the timeline */}\n {hasBottomContent && (\n <div\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n alignItems: \"center\",\n gap: \"4px\",\n paddingLeft: \"4.5em\",\n }}\n >\n {externalChildEntries.map((child) => (\n <Fragment key={child.actionId}>\n <Icon\n size={ESize.sm}\n icon={Variable}\n color={ESemanticThing.io_input}\n subtle\n tooltip={{\n content:\n child.input !== undefined ? (\n <IoTooltipContent value={child.input} />\n ) : (\n <span style={{ color: DEVTOOL_COLOR_TEXT_MUTED, fontSize: \"10px\" }}>\n No input required or given\n </span>\n ),\n title: `Input · ${child.actionId}`,\n }}\n />\n <HandlerChips entry={child} size={ESize.sm} subtle />\n {child.status === \"success\" && child.output !== undefined && (\n <Icon\n size={ESize.sm}\n icon={PackageCheck}\n color={ESemanticThing.io_output}\n subtle\n tooltip={{\n content: <IoTooltipContent value={child.output} />,\n title: `Output · ${child.actionId}`,\n }}\n />\n )}\n </Fragment>\n ))}\n {nonIoBreakReasons.map((reason) => (\n <Chip key={reason} color={ESemanticThing.default} subtle>\n {reason}\n </Chip>\n ))}\n {externalChildEntries.length > 0 && hasBottomError && (\n <Icon\n size={ESize.sm}\n icon={CircleX}\n color={entry.status === \"aborted\" ? ESemanticThing.aborted : ESemanticThing.error}\n subtle\n tooltip={{\n content: <ActionErrorDisplay entry={entry} compact />,\n title: entry.status === \"aborted\" ? \"Aborted\" : \"Error\",\n maxWidth: 340,\n }}\n />\n )}\n </div>\n )}\n\n {/* Group dots — same left alignment as bottom section */}\n {hasGroup && (\n <div\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n alignItems: \"center\",\n gap: \"5px\",\n paddingLeft: \"4.6em\",\n paddingBottom: \"2px\",\n }}\n >\n {groupEntries!.slice(0, MAX_GROUP_DOTS).map((e, i) => (\n <GroupDot\n key={e.cuid}\n entry={e}\n index={i}\n total={groupEntries!.length}\n refTime={groupEntries![0]!.startTime}\n isActive={selectedGroupCuid === e.cuid}\n onSelect={() => onSelectGroupEntry?.(e.cuid)}\n />\n ))}\n {groupEntries!.length > MAX_GROUP_DOTS && (\n <span\n style={{\n fontSize: \"0.7em\",\n opacity: 0.5,\n flexShrink: 0,\n lineHeight: 1,\n }}\n >\n + {groupEntries!.length - MAX_GROUP_DOTS}\n </span>\n )}\n </div>\n )}\n </div>\n );\n}\n","import { DevtoolsVirtualList } from \"nice-devtools-shared\";\r\nimport { useMemo, useRef } from \"react\";\r\nimport { DEVTOOL_COLOR_TEXT_MUTED, DEVTOOL_LIST_GROUP_DIVIDER } from \"../../../core/devtools_colors\";\r\nimport type { IDevtoolsActionEntry } from \"../../../server\";\r\nimport type { IEntryGroup } from \"../../NiceActionDevtools\";\r\nimport { safeStringify } from \"../utils\";\r\nimport { ActionEntryRow } from \"./ActionEntryRow\";\r\nimport { EBreakGroupReason } from \"./action_list.types\";\r\n\r\nfunction getBreakReasons(\r\n current: IDevtoolsActionEntry,\r\n previous: IDevtoolsActionEntry,\r\n): EBreakGroupReason[] {\r\n const reasons: EBreakGroupReason[] = [];\r\n const inputChanged =\r\n current.inputHash != null && previous.inputHash != null\r\n ? current.inputHash !== previous.inputHash\r\n : safeStringify(current.input, 0) !== safeStringify(previous.input, 0);\r\n if (inputChanged) reasons.push(EBreakGroupReason.new_input);\r\n const outputChanged =\r\n current.outputHash != null &&\r\n previous.outputHash != null &&\r\n current.outputHash !== previous.outputHash;\r\n if (outputChanged) reasons.push(EBreakGroupReason.new_output);\r\n return reasons;\r\n}\r\ntype TFlatItem = {\r\n group: IEntryGroup;\r\n groupIndex: number;\r\n breakReasons: EBreakGroupReason[];\r\n};\r\n// Gather child entries for a group across all runs, deduped by actionId (representative's run wins).\r\nfunction getGroupChildEntries(\r\n group: IEntryGroup,\r\n childEntriesMap: Map<string, IDevtoolsActionEntry[]>,\r\n): IDevtoolsActionEntry[] | undefined {\r\n const seen = new Set<string>();\r\n const result: IDevtoolsActionEntry[] = [];\r\n for (const e of [group.representative, ...group.rest]) {\r\n for (const child of childEntriesMap.get(e.cuid) ?? []) {\r\n if (!seen.has(child.actionId)) {\r\n seen.add(child.actionId);\r\n result.push(child);\r\n }\r\n }\r\n }\r\n return result.length > 0 ? result.sort((a, b) => a.startTime - b.startTime) : undefined;\r\n}\r\n// Stable React key — keyed on oldest cuid so prepending new entries never remounts the group DOM node.\r\nfunction getFlatItemKey(item: TFlatItem): string {\r\n const oldestCuid =\r\n item.group.rest[item.group.rest.length - 1]?.cuid ?? item.group.representative.cuid;\r\n return `g:${oldestCuid}`;\r\n}\r\n\r\nexport function ActionList({\r\n groups,\r\n selectedCuid,\r\n onGroupClick,\r\n onSubClick,\r\n childEntriesMap,\r\n style,\r\n}: {\r\n groups: IEntryGroup[];\r\n selectedCuid: string | null;\r\n onGroupClick: (group: IEntryGroup) => void;\r\n onSubClick: (cuid: string, isSelected: boolean) => void;\r\n childEntriesMap: Map<string, IDevtoolsActionEntry[]>;\r\n style?: React.CSSProperties;\r\n}) {\r\n const latestTime = groups[0]?.representative.startTime;\r\n\r\n const flatItems = useMemo<TFlatItem[]>(() => {\r\n return groups.map((group, gi) => {\r\n const prevGroup = groups[gi + 1];\r\n let breakReasons: EBreakGroupReason[] = [];\r\n if (\r\n prevGroup != null &&\r\n prevGroup.representative.actionId === group.representative.actionId &&\r\n prevGroup.representative.domain === group.representative.domain\r\n ) {\r\n const reasons = getBreakReasons(group.representative, prevGroup.representative);\r\n if (reasons.length > 0) breakReasons = reasons;\r\n }\r\n return { group, groupIndex: gi, breakReasons };\r\n });\r\n }, [groups]);\r\n\r\n // Only entries added since the previous render get the one-shot \"shine\" highlight.\r\n // Keying on the representative cuid (which changes when a fresh run merges into a\r\n // group) reproduces the old mount-driven behaviour, but driving it off a data diff\r\n // instead of DOM mount means virtualization's mount/unmount on scroll never replays it.\r\n const prevRepCuidsRef = useRef<Set<string> | null>(null);\r\n const newRepCuids = useMemo<Set<string>>(() => {\r\n const current = new Set(flatItems.map((i) => i.group.representative.cuid));\r\n const prev = prevRepCuidsRef.current;\r\n const result = new Set<string>();\r\n if (prev != null) {\r\n for (const c of current) if (!prev.has(c)) result.add(c);\r\n }\r\n prevRepCuidsRef.current = current;\r\n return result;\r\n }, [flatItems]);\r\n\r\n // The selected row is identified by its enclosing group's stable key, since the\r\n // selection may be a sub-entry inside the group rather than its representative.\r\n const selectedAnchorKey = useMemo(() => {\r\n if (selectedCuid == null) return null;\r\n const item = flatItems.find(\r\n (i) =>\r\n i.group.representative.cuid === selectedCuid ||\r\n i.group.rest.some((e) => e.cuid === selectedCuid),\r\n );\r\n return item != null ? getFlatItemKey(item) : null;\r\n }, [flatItems, selectedCuid]);\r\n\r\n return (\r\n <DevtoolsVirtualList<TFlatItem>\r\n items={flatItems}\r\n getItemKey={getFlatItemKey}\r\n selectedKey={selectedAnchorKey}\r\n estimateSize={64}\r\n overscan={8}\r\n style={style}\r\n rowStyle={{ borderBottom: `1px solid ${DEVTOOL_LIST_GROUP_DIVIDER}`, overflow: \"hidden\" }}\r\n empty={\r\n <div style={style}>\r\n <div style={{ padding: \"24px\", textAlign: \"center\", color: DEVTOOL_COLOR_TEXT_MUTED }}>\r\n No actions recorded yet\r\n </div>\r\n </div>\r\n }\r\n footer={\r\n <div style={{ padding: \"24px\", textAlign: \"center\", color: DEVTOOL_COLOR_TEXT_MUTED }}>\r\n Start of action history\r\n </div>\r\n }\r\n renderItem={(item) => {\r\n const { group } = item;\r\n const shine = newRepCuids.has(group.representative.cuid);\r\n return (\r\n <>\r\n {shine && (\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n inset: 0,\r\n pointerEvents: \"none\",\r\n background:\r\n \"linear-gradient(90deg, transparent 0%, rgba(148, 210, 255, 0.13) 50%, transparent 100%)\",\r\n animation: \"__nice-action-shine 0.65s ease-out forwards\",\r\n }}\r\n />\r\n )}\r\n <ActionEntryRow\r\n entry={group.representative}\r\n isSelected={\r\n selectedCuid === group.representative.cuid ||\r\n group.rest.some((e) => e.cuid === selectedCuid)\r\n }\r\n isLatest={item.groupIndex === 0}\r\n latestTime={latestTime}\r\n childEntries={getGroupChildEntries(group, childEntriesMap)}\r\n breakReasons={item.breakReasons}\r\n groupEntries={group.rest.length > 0 ? [group.representative, ...group.rest] : undefined}\r\n selectedGroupCuid={selectedCuid}\r\n onSelectGroupEntry={(cuid) => onSubClick(cuid, selectedCuid === cuid)}\r\n onClick={() => onGroupClick(group)}\r\n />\r\n </>\r\n );\r\n }}\r\n />\r\n );\r\n}\r\n","import {\r\n DevtoolsLauncher,\r\n FollowLatestToggles,\r\n getDevtoolsDockCoordinator,\r\n getDockSide,\r\n PanelHeader,\r\n ResizeHandle,\r\n SplitHandle,\r\n} from \"nice-devtools-shared\";\r\nimport { useEffect, useId, useMemo, useReducer, useState } from \"react\";\r\nimport type { IDevtoolsActionEntry, TDevtoolsPosition } from \"../core/ActionDevtools.types\";\r\nimport type { ActionDevtoolsCore } from \"../core/ActionDevtoolsCore\";\r\nimport {\r\n DEVTOOL_COLOR_TEXT_SECONDARY,\r\n DEVTOOL_LIST_BASE_BACKGROUND,\r\n DEVTOOL_PANEL_BORDER,\r\n DEVTOOL_PANEL_DIVIDER_BORDER,\r\n} from \"../core/devtools_colors\";\r\nimport { ActionDetailPanel } from \"./components/action_detail/ActionDetailPanel\";\r\nimport { ActionList } from \"./components/action_list/ActionList\";\r\nimport { safeStringify } from \"./components/utils\";\r\n\r\nif (typeof document !== \"undefined\" && !document.getElementById(\"__nice-action-devtools-styles\")) {\r\n const style = document.createElement(\"style\");\r\n style.id = \"__nice-action-devtools-styles\";\r\n style.textContent = `\r\n @keyframes __nice-action-pulse {\r\n 0%, 100% { opacity: 1; }\r\n 50% { opacity: 0.35; }\r\n }\r\n @keyframes __nice-action-shine {\r\n 0% { transform: translateX(-100%); opacity: 0; }\r\n 15% { opacity: 1; }\r\n 85% { opacity: 1; }\r\n 100% { transform: translateX(200%); opacity: 0; }\r\n }\r\n #__nice-action-devtools-panel ::-webkit-scrollbar {\r\n width: 4px;\r\n height: 4px;\r\n }\r\n #__nice-action-devtools-panel ::-webkit-scrollbar-track {\r\n background: transparent;\r\n }\r\n #__nice-action-devtools-panel ::-webkit-scrollbar-thumb {\r\n background: #334155;\r\n border-radius: 2px;\r\n }\r\n #__nice-action-devtools-panel ::-webkit-scrollbar-thumb:hover {\r\n background: #475569;\r\n }\r\n #__nice-action-devtools-panel ::-webkit-scrollbar-corner {\r\n background: transparent;\r\n }\r\n /* Shield the panel's native form controls from the host app's global element\r\n styles (e.g. a bare \\`input {}\\`/\\`button {}\\` rule). \\`all: revert\\` drops them\r\n to the UA baseline the panel is authored against; the panel's own inline\r\n styles still win, so its look is unchanged across any host. */\r\n #__nice-action-devtools-panel input,\r\n #__nice-action-devtools-panel button,\r\n #__nice-action-devtools-panel select,\r\n #__nice-action-devtools-panel textarea { all: revert; font-family: inherit; }\r\n `;\r\n document.head?.appendChild(style);\r\n}\r\n\r\nconst PREFS_KEY = \"__nice-action-devtools-prefs\";\r\n\r\ninterface IDevtoolsPrefs {\r\n position: TDevtoolsPosition;\r\n isOpen: boolean;\r\n dockedHeight: number; // dock-top / dock-bottom\r\n dockedWidth: number; // dock-left / dock-right\r\n detailRatio: number; // fraction of the panel the detail pane occupies\r\n stayOnLatest: boolean;\r\n followLatestOnSelect: boolean;\r\n}\r\n\r\nconst DOCKED_HEIGHT_DEFAULT = 320;\r\nconst DOCKED_WIDTH_DEFAULT = 330;\r\nconst DETAIL_RATIO_DEFAULT = 0.5;\r\n\r\nconst DOCK_POSITIONS: TDevtoolsPosition[] = [\"dock-bottom\", \"dock-top\", \"dock-left\", \"dock-right\"];\r\n\r\nfunction isDockPosition(value: unknown): value is TDevtoolsPosition {\r\n return typeof value === \"string\" && (DOCK_POSITIONS as string[]).includes(value);\r\n}\r\n\r\nfunction readPrefs(defaultPosition: TDevtoolsPosition, initialOpen: boolean): IDevtoolsPrefs {\r\n const fallback: IDevtoolsPrefs = {\r\n position: defaultPosition,\r\n isOpen: initialOpen,\r\n dockedHeight: DOCKED_HEIGHT_DEFAULT,\r\n dockedWidth: DOCKED_WIDTH_DEFAULT,\r\n detailRatio: DETAIL_RATIO_DEFAULT,\r\n stayOnLatest: true,\r\n followLatestOnSelect: true,\r\n };\r\n try {\r\n if (typeof localStorage === \"undefined\") return fallback;\r\n const stored = localStorage.getItem(PREFS_KEY);\r\n const merged = stored != null ? { ...fallback, ...JSON.parse(stored) } : fallback;\r\n // Migrate any legacy floating-corner position to the default dock side.\r\n if (!isDockPosition(merged.position)) merged.position = defaultPosition;\r\n return merged;\r\n } catch (_e) {\r\n return fallback;\r\n }\r\n}\r\n\r\nfunction writePrefs(prefs: IDevtoolsPrefs): void {\r\n try {\r\n localStorage.setItem(PREFS_KEY, JSON.stringify(prefs));\r\n } catch (_e) {\r\n return;\r\n }\r\n}\r\n\r\nexport interface INiceActionDevtoolsProps {\r\n core: ActionDevtoolsCore;\r\n position?: TDevtoolsPosition;\r\n initialOpen?: boolean;\r\n /** Show the panel even when NODE_ENV is not \"development\". */\r\n forceEnable?: boolean;\r\n}\r\n\r\nexport interface IEntryGroup {\r\n representative: IDevtoolsActionEntry;\r\n rest: IDevtoolsActionEntry[];\r\n}\r\n\r\nfunction getHandlerKey(entry: IDevtoolsActionEntry): string {\r\n const hop = entry.meta.routing[0];\r\n if (hop == null) return \"none\";\r\n if (hop.handlerType === \"local\") return \"local\";\r\n return `ext:${hop.transport ?? \"ext\"}`;\r\n}\r\n\r\n/** Same logical call — used both for grouping and for deciding which running rows to show. */\r\nfunction entriesShareActionInput(a: IDevtoolsActionEntry, b: IDevtoolsActionEntry): boolean {\r\n if (a.actionId !== b.actionId || a.domain !== b.domain) return false;\r\n return a.inputHash != null && b.inputHash != null\r\n ? a.inputHash === b.inputHash\r\n : safeStringify(a.input, 0) === safeStringify(b.input, 0);\r\n}\r\n\r\nfunction canGroupWith(a: IDevtoolsActionEntry, b: IDevtoolsActionEntry): boolean {\r\n if (!entriesShareActionInput(a, b)) return false;\r\n const handlerA = getHandlerKey(a);\r\n const handlerB = getHandlerKey(b);\r\n // \"none\" means routing wasn't captured (e.g. aborted before dispatch recorded the hop, or a running\r\n // entry whose transport hasn't been resolved yet). Only treat handlers as conflicting when both\r\n // sides have a known, differing key.\r\n const handlerConflict = handlerA !== \"none\" && handlerB !== \"none\" && handlerA !== handlerB;\r\n if (handlerConflict) return false;\r\n // A running entry has no final status/output yet. Fold it into a same-identity group (rendered with\r\n // a live running indicator) instead of forcing a lone row that collapses into the group the instant\r\n // it settles — the flash we want to avoid. Once both entries have settled the checks below separate\r\n // them by final status + output.\r\n if (a.status === \"running\" || b.status === \"running\") return true;\r\n // Only enforce output equality when both entries have a hash (i.e. a result payload exists).\r\n // Aborted actions won't have one, so they group purely on input + status.\r\n const outputMatch =\r\n a.outputHash != null && b.outputHash != null ? a.outputHash === b.outputHash : true;\r\n return a.status === b.status && outputMatch;\r\n}\r\n\r\nfunction groupEntries(entries: readonly IDevtoolsActionEntry[]): IEntryGroup[] {\r\n const groups: IEntryGroup[] = [];\r\n for (const entry of entries) {\r\n const last = groups[groups.length - 1];\r\n if (last != null && canGroupWith(entry, last.representative)) {\r\n last.rest.push(entry);\r\n } else {\r\n groups.push({ representative: entry, rest: [] });\r\n }\r\n }\r\n return groups;\r\n}\r\n\r\nexport function NiceActionDevtools({ forceEnable, ...props }: INiceActionDevtoolsProps) {\r\n // Bracket notation bypasses Bun's dot-notation `define` substitution, so\r\n // `process[\"env\"][\"NODE_ENV\"]` stays as a live expression in the built output\r\n // and the consumer's bundler evaluates it at their build time.\r\n if (!forceEnable && process[\"env\"][\"NODE_ENV\"] !== \"development\") {\r\n return null;\r\n }\r\n return <NiceActionDevtools_Panel {...props} />;\r\n}\r\n\r\nfunction NiceActionDevtools_Panel({\r\n core,\r\n position: defaultPosition = \"dock-right\",\r\n initialOpen = false,\r\n}: INiceActionDevtoolsProps) {\r\n const [prefs, setPrefsRaw] = useState<IDevtoolsPrefs>(() =>\r\n readPrefs(defaultPosition, initialOpen),\r\n );\r\n const [entries, setEntries] = useState<readonly IDevtoolsActionEntry[]>([]);\r\n const [selectedCuid, setSelectedCuid] = useState<string | null>(null);\r\n useEffect(() => core.subscribe(setEntries), [core]);\r\n\r\n const groups = useMemo(() => {\r\n const byCuid = new Map(entries.map((e) => [e.cuid, e]));\r\n // Children render nested under their parent group, never as their own root row. Running roots are\r\n // kept (unlike the old behaviour that dropped every running entry): a long-lived action — e.g. one\r\n // waiting for a WebSocket to connect + handshake before it can be sent — must be visible *while in\r\n // flight*, not only once it finishes. `canGroupWith` folds a running entry into an adjacent\r\n // identical group, so repeated fast calls still don't flash a lone row that immediately collapses.\r\n const roots = entries.filter((e) => e.parentCuid == null || !byCuid.has(e.parentCuid));\r\n return groupEntries(roots);\r\n }, [entries]);\r\n\r\n const childEntriesMap = useMemo(() => {\r\n const map = new Map<string, IDevtoolsActionEntry[]>();\r\n for (const entry of entries) {\r\n if (entry.parentCuid == null) continue;\r\n const existing = map.get(entry.parentCuid) ?? [];\r\n map.set(entry.parentCuid, [...existing, entry]);\r\n }\r\n for (const arr of map.values()) {\r\n arr.sort((a, b) => a.startTime - b.startTime);\r\n }\r\n return map;\r\n }, [entries]);\r\n\r\n const setPrefs = (update: Partial<IDevtoolsPrefs>) => {\r\n setPrefsRaw((prev) => ({ ...prev, ...update }));\r\n };\r\n\r\n // Persist prefs to localStorage, debounced — a resize drag fires on every\r\n // mouse move, so writing on each one would thrash localStorage.\r\n useEffect(() => {\r\n const timer = setTimeout(() => writePrefs(prefs), 250);\r\n return () => clearTimeout(timer);\r\n }, [prefs]);\r\n\r\n const {\r\n position,\r\n isOpen,\r\n dockedHeight,\r\n dockedWidth,\r\n detailRatio,\r\n stayOnLatest,\r\n followLatestOnSelect,\r\n } = prefs;\r\n const dockSide = getDockSide(position);\r\n const isHorizDock = dockSide === \"top\" || dockSide === \"bottom\";\r\n const dockedSize = isHorizDock ? dockedHeight : dockedWidth;\r\n\r\n // \"Follow latest\": whenever a new group lands at the head of the (newest-first)\r\n // list, follow it so the detail pane always shows the latest action. The head\r\n // group's representative is the newest root — now including a still-running one —\r\n // so its cuid changes as new actions start or finish, which is exactly the signal\r\n // to re-select.\r\n const latestCuid = groups.length > 0 ? groups[0].representative.cuid : null;\r\n useEffect(() => {\r\n if (stayOnLatest && latestCuid != null) setSelectedCuid(latestCuid);\r\n }, [stayOnLatest, latestCuid]);\r\n\r\n // Apply a new selection and reconcile follow state, mirroring the timeline\r\n // toggles: selecting the latest action means \"show me the latest\" (resume\r\n // following when the sub-toggle allows it); any other selection is the user\r\n // taking control, so following stops.\r\n const applySelection = (next: string | null) => {\r\n if (next != null && next === latestCuid && followLatestOnSelect) {\r\n if (!stayOnLatest) setPrefs({ stayOnLatest: true });\r\n } else if (stayOnLatest) {\r\n setPrefs({ stayOnLatest: false });\r\n }\r\n setSelectedCuid(next);\r\n };\r\n\r\n const handleGroupRowClick = (group: IEntryGroup) => {\r\n const repCuid = group.representative.cuid;\r\n const allInGroup = [group.representative, ...group.rest];\r\n const selectedInGroup = allInGroup.find((e) => e.cuid === selectedCuid) ?? null;\r\n if (selectedInGroup != null && selectedCuid !== repCuid) {\r\n applySelection(repCuid);\r\n } else {\r\n applySelection(selectedCuid === repCuid ? null : repCuid);\r\n }\r\n };\r\n\r\n const selectedEntry = selectedCuid != null ? entries.find((e) => e.cuid === selectedCuid) : null;\r\n const runningCount = entries.filter((e) => e.status === \"running\").length;\r\n\r\n // Coordinate with any other nice-* devtools on the page so panels and launch\r\n // buttons cooperate instead of overlapping (see devtools_dock.ts).\r\n const dock = useMemo(() => getDevtoolsDockCoordinator(), []);\r\n const panelId = useId();\r\n const [, bumpView] = useReducer((n: number) => n + 1, 0);\r\n const badge = runningCount > 0 ? `${runningCount}●` : undefined;\r\n\r\n // biome-ignore lint/correctness/useExhaustiveDependencies: register once on mount; the effect below syncs the live fields.\r\n useEffect(() => {\r\n const unregister = dock.register({\r\n id: panelId,\r\n label: \"actions\",\r\n icon: \"⚡\",\r\n side: dockSide,\r\n size: dockedSize,\r\n open: isOpen,\r\n badge,\r\n onOpen: () => setPrefs({ isOpen: true }),\r\n });\r\n const unsubscribe = dock.subscribe(bumpView);\r\n return () => {\r\n unregister();\r\n unsubscribe();\r\n };\r\n }, [dock, panelId]);\r\n\r\n useEffect(() => {\r\n dock.update(panelId, { side: dockSide, size: dockedSize, open: isOpen, badge });\r\n }, [dock, panelId, dockSide, dockedSize, isOpen, badge]);\r\n\r\n const view = dock.getView(panelId);\r\n\r\n const baseStyle: React.CSSProperties = {\r\n position: \"fixed\",\r\n zIndex: 2147483647,\r\n fontFamily: \"ui-monospace, 'Cascadia Code', 'Source Code Pro', monospace\",\r\n fontSize: \"12px\",\r\n };\r\n\r\n // While every devtool is collapsed, the primary one renders a single combined\r\n // launcher for all of them; the others render nothing.\r\n if (!isOpen) {\r\n if (view.isPrimary && !view.anyOpen) {\r\n return <DevtoolsLauncher items={view.devtools} />;\r\n }\r\n return null;\r\n }\r\n\r\n const panelStyle: React.CSSProperties = {\r\n ...baseStyle,\r\n background: DEVTOOL_LIST_BASE_BACKGROUND,\r\n border: `1px solid ${DEVTOOL_PANEL_BORDER}`,\r\n color: DEVTOOL_COLOR_TEXT_SECONDARY,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n boxShadow: \"0 -4px 24px rgba(0,0,0,0.4)\",\r\n overflow: \"hidden\",\r\n // When stacked alongside another panel on the same side, square off every\r\n // corner so the panels read as one continuous block instead of leaving a\r\n // curved seam or a rounded edge poking out behind a neighbour.\r\n ...(dockSide === \"bottom\"\r\n ? {\r\n bottom: view.dockOffset,\r\n left: 0,\r\n right: 0,\r\n height: `${dockedSize}px`,\r\n borderRadius: view.stacked ? \"0\" : \"8px 8px 0 0\",\r\n }\r\n : dockSide === \"top\"\r\n ? {\r\n top: view.dockOffset,\r\n left: 0,\r\n right: 0,\r\n height: `${dockedSize}px`,\r\n borderRadius: view.stacked ? \"0\" : \"0 0 8px 8px\",\r\n }\r\n : dockSide === \"left\"\r\n ? {\r\n top: 0,\r\n left: view.dockOffset,\r\n bottom: 0,\r\n width: `${dockedSize}px`,\r\n borderRadius: view.stacked ? \"0\" : \"0 8px 8px 0\",\r\n }\r\n : {\r\n top: 0,\r\n right: view.dockOffset,\r\n bottom: 0,\r\n width: `${dockedSize}px`,\r\n borderRadius: view.stacked ? \"0\" : \"8px 0 0 8px\",\r\n }),\r\n };\r\n\r\n const selectedEntryParent =\r\n selectedEntry?.parentCuid != null\r\n ? (entries.find((e) => e.cuid === selectedEntry.parentCuid) ?? null)\r\n : null;\r\n const selectedEntryChildren =\r\n selectedEntry != null\r\n ? [...entries]\r\n .filter((e) => e.parentCuid === selectedEntry.cuid)\r\n .sort((a, b) => a.startTime - b.startTime)\r\n : [];\r\n\r\n const virtualListProps = {\r\n groups,\r\n selectedCuid,\r\n onGroupClick: handleGroupRowClick,\r\n onSubClick: (cuid: string, isSelected: boolean) => {\r\n applySelection(isSelected ? null : cuid);\r\n },\r\n childEntriesMap,\r\n };\r\n\r\n return (\r\n <div id=\"__nice-action-devtools-panel\" style={panelStyle}>\r\n <ResizeHandle\r\n dockSide={dockSide}\r\n dockedSize={dockedSize}\r\n onChange={(size) => setPrefs(isHorizDock ? { dockedHeight: size } : { dockedWidth: size })}\r\n />\r\n <PanelHeader\r\n title=\"⚡ action\"\r\n position={position}\r\n onPositionChange={(p) => setPrefs({ position: p })}\r\n onClose={() => setPrefs({ isOpen: false })}\r\n onClear={\r\n entries.length > 0\r\n ? () => {\r\n core.clear();\r\n setSelectedCuid(null);\r\n }\r\n : undefined\r\n }\r\n openOthers={view.otherClosed}\r\n />\r\n\r\n <div\r\n style={{\r\n flex: 1,\r\n display: \"flex\",\r\n flexDirection: isHorizDock ? \"row\" : \"column\",\r\n overflow: \"hidden\",\r\n minHeight: 0,\r\n }}\r\n >\r\n {/* List — shares the panel with the detail pane via the draggable split */}\r\n <div\r\n style={{\r\n flexGrow: selectedEntry != null ? 1 - detailRatio : 1,\r\n flexShrink: 1,\r\n flexBasis: 0,\r\n minWidth: 0,\r\n minHeight: 0,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n overflow: \"hidden\",\r\n }}\r\n >\r\n <FollowLatestToggles\r\n noun=\"action\"\r\n stayOnLatest={stayOnLatest}\r\n onStayOnLatestChange={(next) => setPrefs({ stayOnLatest: next })}\r\n followLatestOnSelect={followLatestOnSelect}\r\n onFollowLatestOnSelectChange={(next) => {\r\n // Enabling this while already sitting on the latest action is itself\r\n // a \"select the latest\" intent — start following so the view tracks\r\n // new actions, matching what a fresh click on the latest would do.\r\n if (next && latestCuid != null && selectedCuid === latestCuid && !stayOnLatest) {\r\n setPrefs({ followLatestOnSelect: next, stayOnLatest: true });\r\n } else {\r\n setPrefs({ followLatestOnSelect: next });\r\n }\r\n }}\r\n />\r\n <ActionList\r\n {...virtualListProps}\r\n style={{ width: \"100%\", flex: 1, minHeight: 0, overflowY: \"auto\" }}\r\n />\r\n </div>\r\n {/* Detail — resizable; ratio persisted in prefs */}\r\n {selectedEntry != null && (\r\n <>\r\n <SplitHandle\r\n horizontal={isHorizDock}\r\n onRatioChange={(ratio) => setPrefs({ detailRatio: ratio })}\r\n />\r\n <div\r\n style={{\r\n flexGrow: detailRatio,\r\n flexShrink: 1,\r\n flexBasis: 0,\r\n minWidth: 0,\r\n minHeight: 0,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n overflow: \"hidden\",\r\n ...(isHorizDock\r\n ? {\r\n borderLeft: `1px solid ${DEVTOOL_PANEL_DIVIDER_BORDER}`,\r\n boxShadow: \"inset 18px 0 36px -14px rgba(0,0,0,0.8)\",\r\n }\r\n : {\r\n borderTop: `1px solid ${DEVTOOL_PANEL_DIVIDER_BORDER}`,\r\n boxShadow: \"inset 0 18px 36px -14px rgba(0,0,0,0.8)\",\r\n }),\r\n }}\r\n >\r\n <ActionDetailPanel\r\n key={selectedEntry.cuid}\r\n entry={selectedEntry}\r\n parent={selectedEntryParent}\r\n childEntries={selectedEntryChildren}\r\n onSelectEntry={(cuid) => setSelectedCuid(cuid)}\r\n />\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["MONO","MONO","SANS","SourceMapConsumer","ExternalLink","Component","Loader2","CircleCheck","CircleAlert","CircleX","Circle","Sparkle","Variable","PackageCheck","CircleX","Fragment","Variable","PackageCheck","CircleX"],"sources":["../../../../nice-devtools-shared/src/colors.ts","../../../../nice-devtools-shared/src/env.ts","../../../../nice-devtools-shared/src/format.ts","../../../../nice-devtools-shared/src/json.tsx","../../../../nice-devtools-shared/src/dock.ts","../../../../nice-devtools-shared/src/list.ts","../../../../nice-devtools-shared/src/components/SectionLabel.tsx","../../../../nice-devtools-shared/src/components/Tooltip.tsx","../../../../nice-devtools-shared/src/components/PanelChrome.tsx","../../../../nice-devtools-shared/src/components/FollowLatestToggles.tsx","../../../../nice-devtools-shared/src/components/VirtualList.tsx","../../../src/devtools/core/devtools_colors.ts","../../../src/devtools/browser/ui_util/size.ts","../../../src/devtools/browser/components/DetailSection.tsx","../../../src/devtools/browser/components/NiceErrorDisplay.tsx","../../../src/devtools/browser/devtools_storage.ts","../../../src/devtools/browser/components/sourceMapResolver.ts","../../../src/devtools/browser/components/StackTraceSection.tsx","../../../src/devtools/browser/components/ActionErrorDisplay.tsx","../../../src/devtools/browser/components/Chip.tsx","../../../src/devtools/browser/components/Icon.tsx","../../../src/devtools/browser/components/DomainChip.tsx","../../../src/devtools/browser/components/HandlerChips.tsx","../../../src/devtools/browser/components/utils.ts","../../../src/devtools/browser/components/RunningTimer.tsx","../../../src/devtools/browser/components/CallStackSection.tsx","../../../src/devtools/browser/components/ChildDispatchChips.tsx","../../../src/devtools/browser/components/MetaSection.tsx","../../../src/devtools/browser/components/OriginChip.tsx","../../../src/devtools/browser/components/RoutingSection.tsx","../../../src/devtools/browser/components/action_detail/ActionDetailPanel.tsx","../../../src/devtools/browser/components/action_list/IoTooltipContent.tsx","../../../src/devtools/browser/components/action_list/ActionInputAndOutputChip.tsx","../../../src/devtools/browser/components/action_list/ActionEntryRow.tsx","../../../src/devtools/browser/components/action_list/ActionList.tsx","../../../src/devtools/browser/NiceActionDevtools.tsx"],"sourcesContent":["// Shared visual language for the nice-* devtools (nice-action + nice-state).\n//\n// These tokens are the single source of truth for the palette both devtools\n// suites paint with, so the two feel like siblings when used side by side.\n// Package-specific colours (e.g. nice-action's handler/stack-frame roles or\n// nice-state's editor surface) live in each package's own `devtools_colors`\n// module, which re-exports everything from here.\n\n// ─── The 5 canonical semantic tokens ─────────────────────────────────────────\n// Every status / role colour in the devtools must resolve to one of these five.\nexport const DEVTOOL_COLOR_SEMANTIC_ERROR = \"#FF5C5C\"; // Critical failures, error messages, error borders\nexport const DEVTOOL_COLOR_SEMANTIC_SUCCESS = \"#A3E635\"; // Successful execution, routing hops, add patches\nexport const DEVTOOL_COLOR_SEMANTIC_SYSTEM = \"#38BDF8\"; // System actions, domain/store tags, clickable links\nexport const DEVTOOL_COLOR_SEMANTIC_WARNING = \"#FB923C\"; // Intermediate statuses, timing highlights, edits\nexport const DEVTOOL_COLOR_SEMANTIC_METADATA = \"#A1A1AA\"; // Timestamps, non-interactive labels, timeline\n\n// ─── Text hierarchy (4 levels — no intermediate aliases) ─────────────────────\nexport const DEVTOOL_COLOR_TEXT_EMPHASIS = \"#f1f5f9\"; // Primary content — names, headings\nexport const DEVTOOL_COLOR_TEXT_SECONDARY = \"#cbd5e1\"; // General readable content\nexport const DEVTOOL_COLOR_TEXT_MUTED = \"#64748b\"; // Supporting / subdued labels\nexport const DEVTOOL_COLOR_TEXT_FAINT = \"#334155\"; // Near-invisible chrome, expand arrows\n\n// ─── Surface / layout palette ─────────────────────────────────────────────────\nexport const DEVTOOL_LIST_BASE_BACKGROUND = \"#0f172a\";\nexport const DEVTOOL_LIST_SELECTED_BACKGROUND = \"#1d2942\";\nexport const DEVTOOL_DETAIL_BASE_BACKGROUND = \"#0d1729\";\nexport const DEVTOOL_DETAIL_HEADER_BACKGROUND = \"#131f35\";\nexport const DEVTOOL_SECTION_BACKGROUND = \"#1e293b\";\nexport const DEVTOOL_SECTION_STRING_BACKGROUND = \"#0d131f\";\nexport const DEVTOOL_PANEL_BORDER = \"#1e293b\";\nexport const DEVTOOL_PANEL_DIVIDER_BORDER = \"#1d3352\";\n\n// ─── Error display surface ────────────────────────────────────────────────────\nexport const DEVTOOL_ERROR_BACKGROUND = \"#1e0a0a\";\n\n// ─── Tooltip ──────────────────────────────────────────────────────────────────\nexport const DEVTOOL_TOOLTIP_BACKGROUND = \"#0c1526\";\nexport const DEVTOOL_TOOLTIP_TITLE_BACKGROUND = \"#101b2e\";\nexport const DEVTOOL_TOOLTIP_TITLE_BOTTOM_BORDER = \"#211f5f\";\nexport const DEVTOOL_TOOLTIP_BORDER = \"#312e81\";\n\n// ─── JSON syntax highlighting ─────────────────────────────────────────────────\nexport const DEVTOOL_JSON_KEY = \"#a5b4fc\";\nexport const DEVTOOL_JSON_STRING = \"#fbbf24\";\nexport const DEVTOOL_JSON_NUMBER = \"#34d399\";\nexport const DEVTOOL_JSON_KEYWORD = \"#a78bfa\";\nexport const DEVTOOL_JSON_PUNCTUATION = \"#475569\";\n\n// ─── Fonts ──────────────────────────────────────────────────────────────────--\nexport const MONO_FONT = \"ui-monospace, 'Cascadia Code', 'Source Code Pro', monospace\";\nexport const SANS_FONT = \"ui-sans-serif, system-ui, sans-serif\";\n","// Dev-mode detection for the devtools gate.\n//\n// The browser devtools must render in a consumer's dev build and disappear in\n// their production build — across whatever bundler the consumer uses. There is\n// no single token that works everywhere, so we probe the well-known ones in\n// order, most reliable first, and let the consumer's bundler statically replace\n// whichever it owns at *their* build time.\n//\n// Why not just read `process.env.NODE_ENV`? In a Vite browser app there is no\n// `process` global, so a bare read throws `ReferenceError: process is not\n// defined`. And the library's own build must not bake in a verdict (an earlier\n// version inlined it to `\"production\"`), so the expressions below are left live\n// in the published output for the consumer to evaluate.\n\ninterface IViteEnv {\n DEV?: boolean;\n MODE?: string;\n}\n\n// Module-scoped ambient so this file type-checks in a consumer app that has no\n// `@types/node` (our packages publish a `source` export, so the consumer's tsc\n// compiles this very file). It only shadows `process` within this module and is\n// erased at build time, leaving the literal `process.env.NODE_ENV` token for the\n// consumer's bundler to statically replace. Typed as always-present so the read\n// below stays a plain member access (the token bundlers match); the try/catch in\n// readNodeEnv handles the runtime case where `process` is genuinely undefined.\ndeclare const process: { env: { NODE_ENV?: string } };\n\n// Vite (and other `import.meta.env` bundlers). `import.meta.env.DEV` is a real\n// boolean that Vite statically replaces in the consumer build; in dev it is\n// `true`, in `vite build` it is `false`. Read through a cast so we don't need\n// `vite/client` types here — the cast erases and Vite still sees the literal\n// `import.meta.env` member expression to replace.\nfunction readViteEnv(): IViteEnv | undefined {\n try {\n return (import.meta as unknown as { env?: IViteEnv }).env;\n } catch {\n // `import.meta` is unavailable in a CommonJS runtime — fall through.\n return undefined;\n }\n}\n\n// Node / webpack / Next / esbuild. These bundlers replace the exact\n// `process.env.NODE_ENV` token with a string literal at build time, so the\n// `process` reference never survives to run in the browser. The try/catch only\n// matters for an unbundled runtime where `process` is genuinely undefined.\nfunction readNodeEnv(): string | undefined {\n try {\n return process.env.NODE_ENV;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Whether the devtools should be active.\n *\n * Detection order: Vite's `import.meta.env`, then `process.env.NODE_ENV`, then —\n * if neither is resolvable (e.g. unbundled browser ESM) — default to enabled so\n * the panel never silently vanishes. Real production builds always resolve one\n * of the first two and correctly get `false`.\n *\n * `forceEnable` short-circuits to `true` for consumers who want the panel in\n * production builds as well.\n */\nexport function isDevtoolsEnabled(forceEnable?: boolean): boolean {\n if (forceEnable === true) return true;\n\n const viteEnv = readViteEnv();\n if (viteEnv != null) {\n if (typeof viteEnv.DEV === \"boolean\") return viteEnv.DEV;\n if (typeof viteEnv.MODE === \"string\") return viteEnv.MODE !== \"production\";\n }\n\n const nodeEnv = readNodeEnv();\n if (nodeEnv != null) return nodeEnv !== \"production\";\n\n return true;\n}\n","// Small, dependency-free formatting helpers shared by both devtools suites.\n\n/** Pretty-print any value to JSON, degrading gracefully for cyclic / non-JSON values. */\nexport function safeStringify(value: unknown, indent = 2): string {\n if (value === undefined) return \"undefined\";\n if (value === null) return \"null\";\n try {\n return JSON.stringify(value, null, indent);\n } catch {\n return String(value);\n }\n}\n\n/** Wall-clock time of day, e.g. `14:03:09`. */\nexport function formatTimestamp(ms: number): string {\n return new Date(ms).toLocaleTimeString([], {\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n hour12: false,\n });\n}\n\n/** Compact relative age: `850ms`, `3.2s`, `4m`. */\nexport function formatRelativeAge(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60_000) return `${(ms / 1000).toFixed(1)}s`;\n return `${Math.floor(ms / 60_000)}m`;\n}\n","import type { CSSProperties, ReactNode } from \"react\";\nimport {\n DEVTOOL_JSON_KEY,\n DEVTOOL_JSON_KEYWORD,\n DEVTOOL_JSON_NUMBER,\n DEVTOOL_JSON_PUNCTUATION,\n DEVTOOL_JSON_STRING,\n DEVTOOL_SECTION_STRING_BACKGROUND,\n MONO_FONT,\n} from \"./colors\";\nimport { safeStringify } from \"./format\";\n\n// Regex-based JSON tokenizer — strings (and the `:` that may follow a key),\n// numbers, keywords and structural punctuation each get their own colour.\nconst JSON_TOKEN_RE =\n /(\"(?:\\\\.|[^\"\\\\])*\")(\\s*:)?|(-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?)|(\\btrue\\b|\\bfalse\\b|\\bnull\\b|\\bundefined\\b)|([{}[\\],])/g;\n\n/** Tokenize a JSON string into coloured <span> nodes for inline rendering. */\nexport function renderColoredJson(text: string): ReactNode[] {\n const nodes: ReactNode[] = [];\n let last = 0;\n let i = 0;\n JSON_TOKEN_RE.lastIndex = 0;\n for (let m = JSON_TOKEN_RE.exec(text); m !== null; m = JSON_TOKEN_RE.exec(text)) {\n if (m.index > last) nodes.push(text.slice(last, m.index));\n const [, str, colon, num, kw, punct] = m;\n if (str != null) {\n if (colon != null) {\n nodes.push(\n <span key={i++} style={{ color: DEVTOOL_JSON_KEY }}>\n {str}\n </span>,\n );\n nodes.push(\n <span key={i++} style={{ color: DEVTOOL_JSON_PUNCTUATION }}>\n {colon}\n </span>,\n );\n } else {\n nodes.push(\n <span key={i++} style={{ color: DEVTOOL_JSON_STRING }}>\n {str}\n </span>,\n );\n }\n } else if (num != null) {\n nodes.push(\n <span key={i++} style={{ color: DEVTOOL_JSON_NUMBER }}>\n {num}\n </span>,\n );\n } else if (kw != null) {\n nodes.push(\n <span key={i++} style={{ color: DEVTOOL_JSON_KEYWORD }}>\n {kw}\n </span>,\n );\n } else if (punct != null) {\n nodes.push(\n <span key={i++} style={{ color: DEVTOOL_JSON_PUNCTUATION }}>\n {punct}\n </span>,\n );\n }\n last = JSON_TOKEN_RE.lastIndex;\n }\n if (last < text.length) nodes.push(text.slice(last));\n return nodes;\n}\n\n/** A pre-formatted, syntax-highlighted JSON block. */\nexport function JsonView({\n value,\n indent = 2,\n style,\n}: {\n value: unknown;\n indent?: number;\n style?: CSSProperties;\n}) {\n const text = safeStringify(value, indent);\n return (\n <pre\n style={{\n margin: 0,\n padding: \"8px 10px\",\n borderRadius: \"4px\",\n fontSize: \"11px\",\n lineHeight: 1.5,\n fontFamily: MONO_FONT,\n background: DEVTOOL_SECTION_STRING_BACKGROUND,\n overflowX: \"auto\",\n whiteSpace: \"pre-wrap\",\n wordBreak: \"break-word\",\n ...style,\n }}\n >\n {renderColoredJson(text)}\n </pre>\n );\n}\n","// ─── Shared devtools dock coordinator ────────────────────────────────────────\n//\n// The nice-action and nice-state devtools are independent packages, but when\n// both are mounted on the same page their panels would fight over screen space,\n// over `document.body`'s margins, and their collapsed launch buttons would land\n// on top of each other. This coordinator lets them cooperate WITHOUT importing\n// each other: it lives on a single versioned `window` global (the same approach\n// the React DevTools hook uses), so whichever package loads first installs the\n// engine and the other simply reuses it.\n//\n// Responsibilities:\n// • Own all four `document.body` margins centrally (no more stomping).\n// • Stack panels docked to the same side so they sit edge-to-edge (`dockOffset`).\n// • Provide a single \"primary\" devtool that renders ONE combined launcher\n// listing every devtool while they are all closed.\n// • Tell each OPEN panel which other devtools are still closed, so it can offer\n// to open them from its own header.\n//\n// This now lives in nice-devtools-shared so both packages link the SAME engine\n// at the source level. The `window` global + VERSION guard is still kept so a\n// page mixing mismatched published versions falls back gracefully.\n\nexport type TDockSide = \"top\" | \"bottom\" | \"left\" | \"right\";\n\n/** A handle to one registered devtool, used to render launch controls. */\nexport interface IDockDevtoolRef {\n id: string;\n label: string;\n icon: string;\n badge?: string;\n onOpen: () => void;\n}\n\n/** The live, syncable part of a devtool's registration. */\nexport interface IDockDevtoolSync {\n side: TDockSide;\n size: number;\n open: boolean;\n badge?: string;\n}\n\nexport interface IDockDevtoolInput extends IDockDevtoolSync {\n id: string;\n label: string;\n icon: string;\n onOpen: () => void;\n}\n\nexport interface IDockView {\n /** Offset (px) from the docked edge — stacks open panels on the same side. */\n dockOffset: number;\n /**\n * True when this panel shares its dock side with another open panel (stacked\n * either nearer or further from the edge). Stacked panels square off all their\n * corners so they sit flush as one continuous block — only a panel alone on\n * its side keeps its rounded, page-facing corners.\n */\n stacked: boolean;\n /** Is any devtool on the page currently open? */\n anyOpen: boolean;\n /** First-registered devtool — the one that renders the combined launcher. */\n isPrimary: boolean;\n /** Every registered devtool, for the combined launcher. */\n devtools: IDockDevtoolRef[];\n /** Closed devtools other than this one, for an open panel's header. */\n otherClosed: IDockDevtoolRef[];\n}\n\nexport interface IDevtoolsDockCoordinator {\n version: number;\n register(panel: IDockDevtoolInput): () => void;\n update(id: string, next: IDockDevtoolSync): void;\n getView(id: string): IDockView;\n subscribe(listener: () => void): () => void;\n}\n\nconst GLOBAL_KEY = \"__NICE_DEVTOOLS_DOCK__\";\nconst VERSION = 4;\n\nfunction createCoordinator(): IDevtoolsDockCoordinator {\n // Insertion order is preserved by Map, giving panels a stable stacking order\n // and a deterministic \"primary\" (the first registered).\n const panels = new Map<string, IDockDevtoolInput>();\n const listeners = new Set<() => void>();\n\n function toRef(panel: IDockDevtoolInput): IDockDevtoolRef {\n return {\n id: panel.id,\n label: panel.label,\n icon: panel.icon,\n badge: panel.badge,\n onOpen: panel.onOpen,\n };\n }\n\n function applyBodyMargins(): void {\n if (typeof document === \"undefined\") return;\n const margins: Record<TDockSide, number> = { top: 0, bottom: 0, left: 0, right: 0 };\n for (const panel of panels.values()) {\n if (panel.open) margins[panel.side] += panel.size;\n }\n const sides: TDockSide[] = [\"top\", \"bottom\", \"left\", \"right\"];\n for (const side of sides) {\n if (margins[side] > 0) {\n document.body.style.setProperty(`margin-${side}`, `${margins[side]}px`);\n } else {\n document.body.style.removeProperty(`margin-${side}`);\n }\n }\n }\n\n function notify(): void {\n applyBodyMargins();\n for (const listener of listeners) listener();\n }\n\n return {\n version: VERSION,\n register(panel) {\n panels.set(panel.id, { ...panel });\n notify();\n return () => {\n panels.delete(panel.id);\n notify();\n };\n },\n update(id, next) {\n const existing = panels.get(id);\n if (existing == null) return;\n if (\n existing.side === next.side &&\n existing.size === next.size &&\n existing.open === next.open &&\n existing.badge === next.badge\n ) {\n return;\n }\n panels.set(id, { ...existing, ...next });\n notify();\n },\n getView(id) {\n const list = [...panels.values()];\n const anyOpen = list.some((p) => p.open);\n const firstId = list.length > 0 ? list[0].id : null;\n\n let dockOffset = 0;\n let stacked = false;\n const self = panels.get(id);\n if (self != null && self.open) {\n let seenSelf = false;\n for (const panel of list) {\n if (panel.id === id) {\n seenSelf = true;\n continue;\n }\n if (panel.open && panel.side === self.side) {\n // Any open neighbour on the same side means we're stacked. Panels\n // earlier in the list stack closer to the dock edge (and add to our\n // offset); later ones stack beyond us, away from the edge.\n stacked = true;\n if (!seenSelf) dockOffset += panel.size;\n }\n }\n }\n\n return {\n dockOffset,\n stacked,\n anyOpen,\n isPrimary: id === firstId,\n devtools: list.map(toRef),\n otherClosed: list.filter((p) => !p.open && p.id !== id).map(toRef),\n };\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n };\n}\n\n/**\n * Returns the page-wide dock coordinator, installing it on `window` the first\n * time it is requested. On the server (no `window`) a throwaway instance is\n * returned so callers can use it unconditionally.\n */\nexport function getDevtoolsDockCoordinator(): IDevtoolsDockCoordinator {\n if (typeof window === \"undefined\") return createCoordinator();\n\n const host = window as unknown as Record<string, IDevtoolsDockCoordinator | undefined>;\n const existing = host[GLOBAL_KEY];\n if (existing != null && existing.version === VERSION) return existing;\n\n const created = createCoordinator();\n host[GLOBAL_KEY] = created;\n return created;\n}\n","import type { Virtualizer } from \"@tanstack/react-virtual\";\nimport { type RefObject, useCallback, useLayoutEffect, useRef } from \"react\";\n\n/**\n * Pin a virtualized list's viewport to a stable anchor row across list\n * mutations. Both devtools timelines are newest-first, so new entries (and\n * merges) prepend at the top; without this they shove whatever the user is\n * looking at downward. The anchor is the selected row when one is visible,\n * otherwise the first visible row, so \"the thing I selected / am reading\" stays\n * put at the same screen position. Returns an `onScroll` handler that must be\n * wired to the scroll container.\n *\n * `hoveringRef` is optional. When provided, the hook keeps the viewport still\n * even across selection changes while the cursor is over the list — the caller\n * is expected to suppress its own scroll-into-view in that case and let this\n * hold the view rock-still (nice-action's pause-on-hover behaviour). When\n * omitted, a selection change yields to the caller's scroll-into-view effect.\n */\nexport function useListScrollAnchor({\n containerRef,\n virtualizer,\n itemKeys,\n selectedKey,\n hoveringRef,\n}: {\n containerRef: RefObject<HTMLDivElement | null>;\n virtualizer: Virtualizer<HTMLDivElement, Element>;\n itemKeys: string[];\n selectedKey: string | null;\n hoveringRef?: RefObject<boolean>;\n}): () => void {\n const anchorRef = useRef<{ key: string; delta: number } | null>(null);\n const selectedKeyRef = useRef(selectedKey);\n selectedKeyRef.current = selectedKey;\n\n // Record where the anchor row sits relative to the viewport top. Called on every scroll (incl.\n // programmatic ones), so it always reflects the last position the user actually saw.\n const captureAnchor = useCallback(() => {\n const el = containerRef.current;\n if (el == null) return;\n const items = virtualizer.getVirtualItems();\n if (items.length === 0) {\n anchorRef.current = null;\n return;\n }\n const scrollTop = el.scrollTop;\n const sel = selectedKeyRef.current;\n const chosen =\n (sel != null ? items.find((vi) => String(vi.key) === sel) : undefined) ??\n items.find((vi) => vi.end > scrollTop) ??\n items[0];\n anchorRef.current = { key: String(chosen.key), delta: chosen.start - scrollTop };\n }, [containerRef, virtualizer]);\n\n const prevSelectedRef = useRef(selectedKey);\n useLayoutEffect(() => {\n const selectionChanged = prevSelectedRef.current !== selectedKey;\n prevSelectedRef.current = selectedKey;\n // A selection change is normally handled by the caller's scroll-into-view effect — don't fight it.\n // We only re-pin when the list data shifted underneath a stable selection. The exception is while\n // hovering: the caller suppresses its scroll-into-view, so we own keeping the view still and must\n // re-pin through selection changes (e.g. \"stay on latest\" re-selecting each new entry) too.\n if (selectionChanged && !(hoveringRef?.current ?? false)) return;\n const anchor = anchorRef.current;\n if (anchor == null) return;\n const index = itemKeys.indexOf(anchor.key);\n if (index < 0) return;\n const offset = virtualizer.getOffsetForIndex(index, \"start\")?.[0];\n if (offset == null) return;\n const target = Math.max(0, offset - anchor.delta);\n const current = virtualizer.scrollOffset ?? 0;\n if (Math.abs(target - current) > 1) virtualizer.scrollToOffset(target);\n }, [itemKeys, selectedKey, virtualizer, hoveringRef]);\n\n return captureAnchor;\n}\n","import { DEVTOOL_COLOR_SEMANTIC_SYSTEM } from \"../colors\";\n\n/** Small uppercase heading used above a detail/section block. */\nexport function SectionLabel({\n label,\n color = DEVTOOL_COLOR_SEMANTIC_SYSTEM,\n}: {\n label: string;\n color?: string;\n}) {\n return (\n <div\n style={{\n color,\n fontSize: \"0.85em\",\n marginBottom: \"3px\",\n textTransform: \"uppercase\",\n letterSpacing: \"0.05em\",\n fontWeight: 500,\n textAlign: \"left\",\n }}\n >\n {label}\n </div>\n );\n}\n","import { type CSSProperties, type ReactNode, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n DEVTOOL_COLOR_TEXT_SECONDARY,\n DEVTOOL_TOOLTIP_BACKGROUND,\n DEVTOOL_TOOLTIP_BORDER,\n DEVTOOL_TOOLTIP_TITLE_BACKGROUND,\n DEVTOOL_TOOLTIP_TITLE_BOTTOM_BORDER,\n} from \"../colors\";\n\nexport interface ITooltipConfig {\n content: ReactNode;\n title?: ReactNode;\n /** \"center\" centers the tooltip above/below the anchor (default).\n * \"edge\" aligns the nearer horizontal edge with the anchor edge. */\n align?: \"center\" | \"edge\";\n maxWidth?: number;\n}\n\nexport function Tooltip({\n anchor,\n config,\n children,\n}: {\n anchor: DOMRect;\n config: ITooltipConfig;\n children?: ReactNode;\n}) {\n const resolvedTitle = config?.title;\n const resolvedAlign = config?.align;\n const resolvedMaxWidth = config?.maxWidth ?? 400;\n const resolvedContent = config != null ? config.content : children;\n\n const showAbove = anchor.top >= window.innerHeight - anchor.bottom;\n const gap = 6;\n const screenMargin = 16;\n const top = showAbove ? Math.round(anchor.top - gap) : Math.round(anchor.bottom + gap);\n const maxHeight = showAbove\n ? Math.round(anchor.top - gap - screenMargin)\n : Math.round(window.innerHeight - anchor.bottom - gap - screenMargin);\n\n let left: number | undefined;\n let right: number | undefined;\n let transform: string | undefined;\n\n if (resolvedAlign === \"center\") {\n const halfMax = resolvedMaxWidth != null ? resolvedMaxWidth / 2 : 120;\n const center = Math.round(anchor.left + anchor.width / 2);\n left = Math.max(\n halfMax + screenMargin,\n Math.min(center, window.innerWidth - halfMax - screenMargin),\n );\n transform = showAbove ? \"translateX(-50%) translateY(-100%)\" : \"translateX(-50%)\";\n } else {\n const anchorMidX = anchor.left + anchor.width / 2;\n if (anchorMidX <= window.innerWidth / 2) {\n left = Math.max(screenMargin, anchor.left);\n } else {\n right = Math.max(screenMargin, window.innerWidth - anchor.right);\n }\n if (showAbove) transform = \"translateY(-100%)\";\n }\n\n // Render into a portal at the document root. The tooltip is positioned in viewport coordinates\n // (position: fixed), but list rows are virtualized inside a `transform: translateY()` container —\n // a transformed ancestor becomes the containing block for fixed descendants and (with its\n // `overflow: hidden`) clips them, mispositioning and hiding the tooltip. Portaling out of that\n // subtree restores true viewport-fixed behaviour everywhere.\n return createPortal(\n <div\n style={{\n position: \"fixed\",\n left,\n right,\n top,\n transform,\n zIndex: 2147483647,\n background: DEVTOOL_TOOLTIP_BACKGROUND,\n border: `1px solid ${DEVTOOL_TOOLTIP_BORDER}`,\n borderRadius: \"5px\",\n boxShadow: \"0 4px 20px rgba(0,0,0,0.6)\",\n pointerEvents: \"none\",\n maxWidth: resolvedMaxWidth != null ? `${resolvedMaxWidth}px` : undefined,\n maxHeight: `${maxHeight}px`,\n overflowY: \"auto\",\n overflowX: \"hidden\",\n // Reset inherited white-space: tooltips are DOM descendants of anchors\n // (e.g. Chip sets `nowrap`), which would otherwise stop content wrapping.\n whiteSpace: \"normal\",\n wordBreak: \"break-word\",\n overflowWrap: \"anywhere\",\n }}\n >\n {resolvedTitle != null && (\n <div\n style={{\n background: DEVTOOL_TOOLTIP_TITLE_BACKGROUND,\n padding: \"6px 8px\",\n alignSelf: \"start\",\n textAlign: \"left\",\n color: DEVTOOL_COLOR_TEXT_SECONDARY,\n fontSize: \"0.75rem\",\n fontWeight: 600,\n paddingBottom: \"4px\",\n marginBottom: \"4px\",\n borderBottom: `1px solid ${DEVTOOL_TOOLTIP_TITLE_BOTTOM_BORDER}`,\n }}\n >\n {resolvedTitle}\n </div>\n )}\n <div\n style={{\n padding: \"6px 8px\",\n }}\n >\n {resolvedContent}\n </div>\n </div>,\n document.body,\n );\n}\n\n/**\n * Wraps inline content so it shows `config` as a hover tooltip. When `config` is null the children\n * render untouched (no hover handlers, no tooltip). Useful for non-Chip text labels that still need\n * the same tooltip treatment as Chips.\n */\nexport function HoverTooltip({\n config,\n children,\n style,\n}: {\n config?: ITooltipConfig;\n children: ReactNode;\n style?: CSSProperties;\n}) {\n const [anchor, setAnchor] = useState<DOMRect | null>(null);\n const enabled = config != null;\n\n return (\n <>\n <span\n onMouseEnter={\n enabled ? (e) => setAnchor(e.currentTarget.getBoundingClientRect()) : undefined\n }\n onMouseLeave={enabled ? () => setAnchor(null) : undefined}\n style={{ ...style, cursor: enabled ? \"default\" : style?.cursor }}\n >\n {children}\n </span>\n {enabled && anchor != null && config != null && <Tooltip anchor={anchor} config={config} />}\n </>\n );\n}\n","import {\n type CSSProperties,\n type MouseEvent as ReactMouseEvent,\n type ReactNode,\n useState,\n} from \"react\";\nimport {\n DEVTOOL_COLOR_SEMANTIC_SYSTEM,\n DEVTOOL_COLOR_TEXT_FAINT,\n DEVTOOL_COLOR_TEXT_MUTED,\n DEVTOOL_COLOR_TEXT_SECONDARY,\n DEVTOOL_LIST_BASE_BACKGROUND,\n DEVTOOL_SECTION_BACKGROUND,\n MONO_FONT,\n SANS_FONT,\n} from \"../colors\";\nimport type { TDockSide } from \"../dock\";\n\n/** Where a devtools panel is docked. */\nexport type TDevtoolsPosition = \"dock-bottom\" | \"dock-top\" | \"dock-left\" | \"dock-right\";\n\nexport interface IDevtoolsLauncherItem {\n id: string;\n label: string;\n icon: string;\n badge?: string;\n onOpen: () => void;\n}\n\nconst DOCKED_SIZE_MIN = 140;\n\n// 3×3 picker grid. Each slot has a stable key so the empty corners don't collide\n// (a single shared key for all of them triggers React's duplicate-key warning).\nconst POSITION_GRID: { key: string; pos: TDevtoolsPosition | null }[] = [\n { key: \"tl\", pos: null },\n { key: \"tc\", pos: \"dock-top\" },\n { key: \"tr\", pos: null },\n { key: \"ml\", pos: \"dock-left\" },\n { key: \"mc\", pos: null },\n { key: \"mr\", pos: \"dock-right\" },\n { key: \"bl\", pos: null },\n { key: \"bc\", pos: \"dock-bottom\" },\n { key: \"br\", pos: null },\n];\n\nexport function getDockSide(pos: TDevtoolsPosition): TDockSide {\n switch (pos) {\n case \"dock-top\":\n return \"top\";\n case \"dock-left\":\n return \"left\";\n case \"dock-right\":\n return \"right\";\n default:\n return \"bottom\";\n }\n}\n\nfunction chromeButtonStyle(color: string): CSSProperties {\n return {\n background: \"none\",\n border: \"none\",\n color,\n cursor: \"pointer\",\n fontSize: \"11px\",\n padding: 0,\n fontFamily: SANS_FONT,\n whiteSpace: \"nowrap\",\n };\n}\n\n/**\n * The panel's top chrome: a brand/title on the left (plus pills to open any other\n * closed devtools), and the panel controls on the right. The controls column\n * holds any caller-provided `children` (e.g. a mode switch) above a row of the\n * pause/clear actions, then the dock-position picker and the close button.\n *\n * `onTogglePause` is optional — when omitted no pause control is shown (the\n * nice-action timeline has nothing to pause), keeping a single header component\n * consistent across both devtools suites.\n */\nexport function PanelHeader({\n title,\n position,\n onPositionChange,\n onClose,\n onClear,\n paused,\n onTogglePause,\n openOthers,\n children,\n}: {\n title: string;\n position: TDevtoolsPosition;\n onPositionChange: (p: TDevtoolsPosition) => void;\n onClose: () => void;\n onClear?: () => void;\n paused?: boolean;\n onTogglePause?: () => void;\n openOthers?: IDevtoolsLauncherItem[];\n children?: ReactNode;\n}) {\n const hasActionsRow = onTogglePause != null || onClear != null;\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"6px 11px\",\n gap: \"10px\",\n background: DEVTOOL_SECTION_BACKGROUND,\n borderBottom: `1px solid ${DEVTOOL_LIST_BASE_BACKGROUND}`,\n flexShrink: 0,\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"8px\", minWidth: 0 }}>\n <span\n style={{\n color: DEVTOOL_COLOR_SEMANTIC_SYSTEM,\n fontWeight: \"bold\",\n fontSize: \"11px\",\n whiteSpace: \"nowrap\",\n }}\n >\n {title}\n </span>\n {openOthers?.map((item) => (\n <button\n key={item.id}\n onClick={item.onOpen}\n title={`Open ${item.label} devtools`}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"4px\",\n background: DEVTOOL_LIST_BASE_BACKGROUND,\n border: `1px solid ${DEVTOOL_COLOR_TEXT_FAINT}`,\n borderRadius: \"999px\",\n color: DEVTOOL_COLOR_TEXT_MUTED,\n cursor: \"pointer\",\n fontSize: \"10px\",\n padding: \"1px 7px 1px 6px\",\n fontFamily: SANS_FONT,\n whiteSpace: \"nowrap\",\n }}\n >\n <span>{item.icon}</span>\n <span>{item.label}</span>\n {item.badge != null && (\n <span style={{ color: DEVTOOL_COLOR_SEMANTIC_SYSTEM }}>{item.badge}</span>\n )}\n </button>\n ))}\n </div>\n <div style={{ display: \"flex\", gap: \"10px\", alignItems: \"center\" }}>\n <div style={{ display: \"flex\", flexDirection: \"column\", alignItems: \"stretch\" }}>\n {children}\n {hasActionsRow && (\n <div\n style={{\n display: \"flex\",\n gap: \"10px\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"3px\",\n }}\n >\n {onTogglePause != null && (\n <button\n onClick={onTogglePause}\n title={paused ? \"Resume recording\" : \"Pause recording\"}\n style={chromeButtonStyle(\n paused ? DEVTOOL_COLOR_SEMANTIC_SYSTEM : DEVTOOL_COLOR_TEXT_MUTED,\n )}\n >\n {paused ? \"▶ resume\" : \"⏸ pause\"}\n </button>\n )}\n {onClear != null && (\n <button onClick={onClear} style={chromeButtonStyle(DEVTOOL_COLOR_TEXT_MUTED)}>\n clear\n </button>\n )}\n </div>\n )}\n </div>\n <PositionPicker position={position} onChange={onPositionChange} />\n <button\n onClick={onClose}\n style={{ ...chromeButtonStyle(DEVTOOL_COLOR_TEXT_MUTED), fontSize: \"16px\", lineHeight: \"1\" }}\n >\n ×\n </button>\n </div>\n </div>\n );\n}\n\nfunction PositionPicker({\n position,\n onChange,\n}: {\n position: TDevtoolsPosition;\n onChange: (p: TDevtoolsPosition) => void;\n}) {\n return (\n <div\n title=\"Move / dock panel\"\n style={{ display: \"grid\", gridTemplateColumns: \"repeat(3, 9px)\", gap: \"2px\", padding: \"2px\" }}\n >\n {POSITION_GRID.map(({ key, pos }) => {\n if (pos == null) return <div key={key} style={{ width: \"9px\", height: \"9px\" }} />;\n const isTopBottom = pos === \"dock-top\" || pos === \"dock-bottom\";\n const isActive = pos === position;\n return (\n <div\n key={key}\n title={pos}\n onClick={() => onChange(pos)}\n style={{\n width: \"9px\",\n height: \"9px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: \"pointer\",\n }}\n >\n <div\n style={{\n width: isTopBottom ? \"9px\" : \"3px\",\n height: isTopBottom ? \"3px\" : \"9px\",\n borderRadius: \"1px\",\n background: isActive ? DEVTOOL_COLOR_SEMANTIC_SYSTEM : DEVTOOL_COLOR_TEXT_FAINT,\n }}\n />\n </div>\n );\n })}\n </div>\n );\n}\n\nexport function ResizeHandle({\n dockSide,\n dockedSize,\n onChange,\n}: {\n dockSide: TDockSide;\n dockedSize: number;\n onChange: (size: number) => void;\n}) {\n const isHoriz = dockSide === \"left\" || dockSide === \"right\";\n\n const onMouseDown = (e: ReactMouseEvent<HTMLDivElement>) => {\n e.preventDefault();\n const startCoord = isHoriz ? e.clientX : e.clientY;\n const startSize = dockedSize;\n const maxSize = isHoriz ? window.innerWidth * 0.85 : window.innerHeight * 0.85;\n const sign = dockSide === \"bottom\" || dockSide === \"right\" ? -1 : 1;\n\n const onMove = (me: MouseEvent) => {\n const delta = (isHoriz ? me.clientX : me.clientY) - startCoord;\n onChange(Math.max(DOCKED_SIZE_MIN, Math.min(maxSize, startSize + sign * delta)));\n };\n const onUp = () => {\n window.removeEventListener(\"mousemove\", onMove);\n window.removeEventListener(\"mouseup\", onUp);\n };\n window.addEventListener(\"mousemove\", onMove);\n window.addEventListener(\"mouseup\", onUp);\n };\n\n const edgeStyle: CSSProperties =\n dockSide === \"bottom\"\n ? { top: 0, left: 0, right: 0, height: \"5px\", cursor: \"ns-resize\" }\n : dockSide === \"top\"\n ? { bottom: 0, left: 0, right: 0, height: \"5px\", cursor: \"ns-resize\" }\n : dockSide === \"right\"\n ? { top: 0, bottom: 0, left: 0, width: \"5px\", cursor: \"ew-resize\" }\n : { top: 0, bottom: 0, right: 0, width: \"5px\", cursor: \"ew-resize\" };\n\n return (\n <div\n onMouseDown={onMouseDown}\n style={{ position: \"absolute\", zIndex: 10, background: \"transparent\", ...edgeStyle }}\n />\n );\n}\n\nconst SPLIT_RATIO_MIN = 0.15;\nconst SPLIT_RATIO_MAX = 0.85;\n\n/**\n * Draggable divider between the list and the detail pane. `horizontal` refers to\n * the split axis: a row layout (dock top/bottom) splits horizontally and drags\n * left/right; a column layout (dock left/right) splits vertically. The reported\n * ratio is the fraction of the container the *detail* pane should occupy.\n */\nexport function SplitHandle({\n horizontal,\n onRatioChange,\n}: {\n horizontal: boolean;\n onRatioChange: (ratio: number) => void;\n}) {\n const [hovered, setHovered] = useState(false);\n\n const onMouseDown = (e: ReactMouseEvent<HTMLDivElement>) => {\n e.preventDefault();\n const container = e.currentTarget.parentElement;\n if (container == null) return;\n\n const onMove = (me: MouseEvent) => {\n const rect = container.getBoundingClientRect();\n // Detail sits after the handle (right / bottom), so its size is measured\n // from the far edge back to the cursor.\n const ratio = horizontal\n ? (rect.right - me.clientX) / rect.width\n : (rect.bottom - me.clientY) / rect.height;\n onRatioChange(Math.max(SPLIT_RATIO_MIN, Math.min(SPLIT_RATIO_MAX, ratio)));\n };\n const onUp = () => {\n window.removeEventListener(\"mousemove\", onMove);\n window.removeEventListener(\"mouseup\", onUp);\n };\n window.addEventListener(\"mousemove\", onMove);\n window.addEventListener(\"mouseup\", onUp);\n };\n\n return (\n <div\n onMouseDown={onMouseDown}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n style={{\n flex: \"0 0 5px\",\n alignSelf: \"stretch\",\n cursor: horizontal ? \"ew-resize\" : \"ns-resize\",\n background: hovered ? DEVTOOL_COLOR_SEMANTIC_SYSTEM : \"transparent\",\n opacity: hovered ? 0.6 : 1,\n zIndex: 5,\n }}\n />\n );\n}\n\n/** A compact segmented toggle (e.g. the nice-state Timeline / State switch). */\nexport function SegmentedControl<T extends string>({\n options,\n value,\n onChange,\n}: {\n options: { value: T; label: string }[];\n value: T;\n onChange: (value: T) => void;\n}) {\n return (\n <div\n style={{\n display: \"flex\",\n border: `1px solid ${DEVTOOL_COLOR_TEXT_FAINT}`,\n borderRadius: \"5px\",\n overflow: \"hidden\",\n }}\n >\n {options.map((opt) => {\n const active = opt.value === value;\n return (\n <button\n key={opt.value}\n onClick={() => onChange(opt.value)}\n style={{\n background: active ? DEVTOOL_COLOR_SEMANTIC_SYSTEM : \"transparent\",\n color: active ? \"#0f172a\" : DEVTOOL_COLOR_TEXT_MUTED,\n border: \"none\",\n cursor: \"pointer\",\n fontSize: \"10px\",\n fontWeight: active ? 700 : 500,\n padding: \"3px 9px\",\n fontFamily: SANS_FONT,\n }}\n >\n {opt.label}\n </button>\n );\n })}\n </div>\n );\n}\n\n/**\n * The combined, page-wide launcher shown while every devtool is collapsed — one\n * grouped pill with a segment per registered devtool, so the buttons never\n * overlap or hide behind each other. Rendered by the coordinator's \"primary\"\n * devtool only.\n */\nexport function DevtoolsLauncher({ items }: { items: IDevtoolsLauncherItem[] }) {\n return (\n <div\n style={{\n position: \"fixed\",\n bottom: \"16px\",\n right: \"16px\",\n zIndex: 2147483647,\n display: \"flex\",\n fontFamily: MONO_FONT,\n fontSize: \"12px\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n background: DEVTOOL_SECTION_BACKGROUND,\n border: `1px solid ${DEVTOOL_COLOR_TEXT_FAINT}`,\n borderRadius: \"6px\",\n overflow: \"hidden\",\n boxShadow: \"0 8px 24px rgba(0,0,0,0.35)\",\n }}\n >\n {items.map((item, i) => (\n <button\n key={item.id}\n onClick={item.onOpen}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"5px\",\n background: \"transparent\",\n color: DEVTOOL_COLOR_TEXT_SECONDARY,\n border: \"none\",\n borderLeft: i > 0 ? `1px solid ${DEVTOOL_COLOR_TEXT_FAINT}` : \"none\",\n cursor: \"pointer\",\n padding: \"6px 11px\",\n fontFamily: MONO_FONT,\n fontSize: \"12px\",\n lineHeight: \"1.5\",\n }}\n >\n <span>{item.icon}</span>\n <span>{item.label}</span>\n {item.badge != null && (\n <span style={{ color: DEVTOOL_COLOR_SEMANTIC_SYSTEM }}>{item.badge}</span>\n )}\n </button>\n ))}\n </div>\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\nimport {\n DEVTOOL_COLOR_SEMANTIC_SYSTEM,\n DEVTOOL_COLOR_TEXT_MUTED,\n DEVTOOL_COLOR_TEXT_SECONDARY,\n DEVTOOL_LIST_BASE_BACKGROUND,\n DEVTOOL_SECTION_BACKGROUND,\n SANS_FONT,\n} from \"../colors\";\n\n/**\n * The \"Follow latest\" toggle pair shown above a devtools timeline list, with its\n * indented \"clicking latest re-follows\" sub-option. `noun` is the thing the\n * timeline tracks (\"action\" in nice-action, \"change\" in nice-state) and is woven\n * into the explanatory tooltips so both suites read naturally from one component.\n */\nexport function FollowLatestToggles({\n noun,\n stayOnLatest,\n onStayOnLatestChange,\n followLatestOnSelect,\n onFollowLatestOnSelectChange,\n}: {\n noun: string;\n stayOnLatest: boolean;\n onStayOnLatestChange: (next: boolean) => void;\n followLatestOnSelect: boolean;\n onFollowLatestOnSelectChange: (next: boolean) => void;\n}) {\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n flexShrink: 0,\n paddingBottom: \"3px\",\n background: DEVTOOL_SECTION_BACKGROUND,\n borderBottom: `1px solid ${DEVTOOL_LIST_BASE_BACKGROUND}`,\n }}\n >\n <ToggleLabel\n title={`Auto-select the most recent ${noun} so the detail pane keeps showing the latest as new ${noun}s land`}\n checked={stayOnLatest}\n onChange={onStayOnLatestChange}\n >\n Follow latest\n </ToggleLabel>\n {/* Sub-option of \"Follow latest\": indented under it because it only tunes\n how following resumes when the latest entry is clicked. */}\n <div style={{ display: \"flex\", alignItems: \"center\", paddingLeft: \"12px\", marginTop: \"-4px\" }}>\n <span\n aria-hidden\n style={{\n color: DEVTOOL_COLOR_TEXT_MUTED,\n fontFamily: SANS_FONT,\n fontSize: \"10px\",\n lineHeight: 1,\n }}\n >\n └\n </span>\n <ToggleLabel\n title={`When you click the latest ${noun}, turn 'Follow latest' back on so the view resumes tracking new ${noun}s. Turn this off to pin exactly to the ${noun} you click instead.`}\n checked={followLatestOnSelect}\n onChange={onFollowLatestOnSelectChange}\n >\n clicking latest re-follows\n </ToggleLabel>\n </div>\n </div>\n );\n}\n\nfunction ToggleLabel({\n checked,\n onChange,\n title,\n children,\n}: {\n checked: boolean;\n onChange: (next: boolean) => void;\n title: string;\n children: ReactNode;\n}) {\n return (\n <label\n title={title}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n padding: \"5px 10px\",\n cursor: \"pointer\",\n userSelect: \"none\",\n color: checked ? DEVTOOL_COLOR_TEXT_SECONDARY : DEVTOOL_COLOR_TEXT_MUTED,\n fontSize: \"10px\",\n fontFamily: SANS_FONT,\n }}\n >\n <input\n type=\"checkbox\"\n checked={checked}\n onChange={(e) => onChange(e.target.checked)}\n style={{ accentColor: DEVTOOL_COLOR_SEMANTIC_SYSTEM, cursor: \"pointer\", margin: 0 }}\n />\n {children}\n </label>\n );\n}\n","import { useVirtualizer } from \"@tanstack/react-virtual\";\nimport { type CSSProperties, type ReactNode, useEffect, useMemo, useRef, useState } from \"react\";\nimport { DEVTOOL_COLOR_SEMANTIC_WARNING, DEVTOOL_TOOLTIP_BACKGROUND, SANS_FONT } from \"../colors\";\nimport { useListScrollAnchor } from \"../list\";\n\n/**\n * The shared, virtualized timeline list used by both the nice-action and\n * nice-state devtools. It owns everything about *how the list behaves* — windowed\n * rendering, viewport anchoring across prepends, scroll-the-selection-into-view,\n * and pause-on-hover with a \"N new\" catch-up hint — while each devtool supplies\n * its own `renderItem` for the row content (which stays unique per devtool).\n *\n * Behaviour notes:\n * • The list is assumed newest-first: new rows prepend at the top. While the\n * cursor is over the list the viewport is held perfectly still (so reading\n * isn't disrupted); fresh rows still render above and a sticky \"↑ N new\"\n * badge hints they're there. Move the cursor away and normal follow resumes.\n * • `selectedKey` is the stable item key of the selected row (NOT necessarily a\n * sub-selection inside it). When it changes the row is scrolled into view —\n * unless the cursor is hovering, in which case the view is left untouched.\n */\nexport function DevtoolsVirtualList<T>({\n items,\n getItemKey,\n renderItem,\n selectedKey,\n estimateSize,\n overscan = 8,\n rowStyle,\n empty,\n footer,\n style,\n}: {\n items: T[];\n /** Stable identity for a row — must not change as later items merge/prepend. */\n getItemKey: (item: T, index: number) => string;\n renderItem: (item: T, index: number) => ReactNode;\n /** Key of the currently-selected row, for anchoring + scroll-into-view. */\n selectedKey: string | null;\n /** Estimated row height (px) for the virtualizer. */\n estimateSize: number;\n overscan?: number;\n /** Extra style merged onto each absolutely-positioned row wrapper. */\n rowStyle?: CSSProperties;\n /** Rendered in place of the list when there are no items. */\n empty?: ReactNode;\n /** Rendered after the rows, inside the scroll container (e.g. a \"start of history\" cap). */\n footer?: ReactNode;\n style?: CSSProperties;\n}) {\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Pause-on-hover (auto-scroll only): while the cursor is over the list, new entries keep arriving\n // and rendering — the user can still scroll up to reach them — but the viewport must not move on\n // its own. A ref mirrors the state so effects can read it without re-subscribing.\n const [isHovering, setIsHovering] = useState(false);\n const hoveringRef = useRef(false);\n hoveringRef.current = isHovering;\n\n // New activity that arrived while hovering — surfaced as a small \"N new\" indicator so the user knows\n // there are fresh items above (the list is newest-first) without the view jumping to reveal them.\n const hoverBaselineCountRef = useRef(0);\n const pendingCount = isHovering ? Math.max(0, items.length - hoverBaselineCountRef.current) : 0;\n const hasPendingActivity = isHovering && pendingCount > 0;\n\n // Stable getItemKey across renders so the keys memo only recomputes when items change.\n const getItemKeyRef = useRef(getItemKey);\n getItemKeyRef.current = getItemKey;\n const itemKeys = useMemo(() => items.map((item, i) => getItemKeyRef.current(item, i)), [items]);\n\n const virtualizer = useVirtualizer({\n count: items.length,\n getScrollElement: () => containerRef.current,\n estimateSize: () => estimateSize,\n overscan,\n getItemKey: (index) => itemKeys[index],\n });\n\n const onScroll = useListScrollAnchor({\n containerRef,\n virtualizer,\n itemKeys,\n selectedKey,\n hoveringRef,\n });\n\n // Scroll the selected row into view when the selection changes. With \"follow latest\" this is also\n // what keeps the viewport pinned to the top: each new entry reselects the new latest (index 0), so\n // we scroll back up to it. The anchor hook above deliberately yields on selection changes.\n const prevSelectedRef = useRef(selectedKey);\n useEffect(() => {\n if (selectedKey === prevSelectedRef.current) return;\n prevSelectedRef.current = selectedKey;\n if (selectedKey == null) return;\n // While hovering, hold the view still — don't yank it to the (possibly auto-re-selected) latest\n // row. The scroll-anchor keeps the current position pinned; new rows still render above.\n if (hoveringRef.current) return;\n const index = itemKeys.indexOf(selectedKey);\n if (index >= 0) virtualizer.scrollToIndex(index, { align: \"auto\" });\n }, [selectedKey, itemKeys, virtualizer]);\n\n if (items.length === 0) return <>{empty}</>;\n\n return (\n <div\n ref={containerRef}\n style={style}\n onScroll={onScroll}\n onMouseEnter={() => {\n hoverBaselineCountRef.current = items.length;\n setIsHovering(true);\n }}\n onMouseLeave={() => setIsHovering(false)}\n >\n {hasPendingActivity && <PendingIndicator count={pendingCount} />}\n <div style={{ position: \"relative\", width: \"100%\", height: virtualizer.getTotalSize() }}>\n {virtualizer.getVirtualItems().map((vItem) => (\n <div\n key={vItem.key}\n data-index={vItem.index}\n ref={virtualizer.measureElement}\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n width: \"100%\",\n transform: `translateY(${vItem.start}px)`,\n ...rowStyle,\n }}\n >\n {renderItem(items[vItem.index], vItem.index)}\n </div>\n ))}\n </div>\n {footer}\n </div>\n );\n}\n\n/**\n * A sticky, zero-height overlay floating over the rows without taking layout space. Shown only once\n * new items have arrived while hovering, hinting they're above (newest-first) so the user can scroll\n * up without the view having jumped there.\n */\nfunction PendingIndicator({ count }: { count: number }) {\n return (\n <div style={{ position: \"sticky\", top: 0, height: 0, zIndex: 5, pointerEvents: \"none\" }}>\n <div\n style={{\n position: \"absolute\",\n top: \"6px\",\n right: \"10px\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"5px\",\n padding: \"2px 7px\",\n borderRadius: \"10px\",\n fontSize: \"10px\",\n fontFamily: SANS_FONT,\n color: DEVTOOL_COLOR_SEMANTIC_WARNING,\n background: DEVTOOL_TOOLTIP_BACKGROUND,\n border: `1px solid ${DEVTOOL_COLOR_SEMANTIC_WARNING}55`,\n boxShadow: \"0 2px 8px rgba(0,0,0,0.5)\",\n whiteSpace: \"nowrap\",\n }}\n >\n ↑ {count} new\n </div>\n </div>\n );\n}\n","import {\r\n DEVTOOL_COLOR_SEMANTIC_ERROR,\r\n DEVTOOL_COLOR_SEMANTIC_METADATA,\r\n DEVTOOL_COLOR_SEMANTIC_SUCCESS,\r\n DEVTOOL_COLOR_SEMANTIC_SYSTEM,\r\n DEVTOOL_COLOR_SEMANTIC_WARNING,\r\n DEVTOOL_COLOR_TEXT_FAINT,\r\n DEVTOOL_COLOR_TEXT_MUTED,\r\n DEVTOOL_SECTION_BACKGROUND,\r\n} from \"nice-devtools-shared\";\r\nimport type { IChipColorEntry } from \"../browser/components/Chip\";\r\n\r\n// The shared palette (semantic tokens, text hierarchy, surfaces, tooltip + JSON\r\n// colours, fonts) is the single source of truth across the nice-* devtools.\r\n// Re-exported by name (not `export *`) so bundlers reliably link the external\r\n// package — a bare `export *` from a dependency tripped Bun's bundler.\r\nexport {\r\n DEVTOOL_COLOR_SEMANTIC_ERROR,\r\n DEVTOOL_COLOR_SEMANTIC_METADATA,\r\n DEVTOOL_COLOR_SEMANTIC_SUCCESS,\r\n DEVTOOL_COLOR_SEMANTIC_SYSTEM,\r\n DEVTOOL_COLOR_SEMANTIC_WARNING,\r\n DEVTOOL_COLOR_TEXT_EMPHASIS,\r\n DEVTOOL_COLOR_TEXT_FAINT,\r\n DEVTOOL_COLOR_TEXT_MUTED,\r\n DEVTOOL_COLOR_TEXT_SECONDARY,\r\n DEVTOOL_DETAIL_BASE_BACKGROUND,\r\n DEVTOOL_DETAIL_HEADER_BACKGROUND,\r\n DEVTOOL_ERROR_BACKGROUND,\r\n DEVTOOL_JSON_KEY,\r\n DEVTOOL_JSON_KEYWORD,\r\n DEVTOOL_JSON_NUMBER,\r\n DEVTOOL_JSON_PUNCTUATION,\r\n DEVTOOL_JSON_STRING,\r\n DEVTOOL_LIST_BASE_BACKGROUND,\r\n DEVTOOL_LIST_SELECTED_BACKGROUND,\r\n DEVTOOL_PANEL_BORDER,\r\n DEVTOOL_PANEL_DIVIDER_BORDER,\r\n DEVTOOL_SECTION_BACKGROUND,\r\n DEVTOOL_SECTION_STRING_BACKGROUND,\r\n DEVTOOL_TOOLTIP_BACKGROUND,\r\n DEVTOOL_TOOLTIP_BORDER,\r\n DEVTOOL_TOOLTIP_TITLE_BACKGROUND,\r\n DEVTOOL_TOOLTIP_TITLE_BOTTOM_BORDER,\r\n MONO_FONT,\r\n SANS_FONT,\r\n} from \"nice-devtools-shared\";\r\n\r\n// ─── Handler chip colours (role-specific, not status) ─────────────────────────\r\nexport const DEVTOOL_COLOR_HANDLER_LOCAL_TEXT = \"#34bb89\";\r\nexport const DEVTOOL_COLOR_HANDLER_LOCAL_BORDER = \"#144427\";\r\nexport const DEVTOOL_COLOR_HANDLER_EXTERNAL_TEXT = \"#cfa12a\";\r\nexport const DEVTOOL_COLOR_HANDLER_EXTERNAL_BORDER = \"#723917\";\r\n\r\n// ─── nice-action-specific surfaces ────────────────────────────────────────────\r\nexport const DEVTOOL_LIST_HEADER_SELECTED_BACKGROUND = \"#1d2942\";\r\nexport const DEVTOOL_LIST_GROUP_DIVIDER = \"#101109\";\r\nexport const DEVTOOL_STACK_TRACE_BACKGROUND = \"#040a13\";\r\nexport const DEVTOOL_ERROR_BADGE_BACKGROUND = \"#2d0f0f\";\r\n\r\n// ─── Call stack ───────────────────────────────────────────────────────────────\r\nexport const DEVTOOL_COLOR_CALL_STACK_DIVIDER = \"#0a1120\";\r\n\r\n// ─── Stack trace frame colours (user vs internal) ─────────────────────────────\r\nexport const DEVTOOL_STACK_FRAME_USER_NUMBER = \"#64748b\";\r\nexport const DEVTOOL_STACK_FRAME_USER_FUNCTION = \"#e2e8f0\";\r\nexport const DEVTOOL_STACK_FRAME_USER_FOLDER = \"#596b83\";\r\nexport const DEVTOOL_STACK_FRAME_USER_FILE = \"#8a9ebb\";\r\nexport const DEVTOOL_STACK_FRAME_USER_LINE = \"#4a7fa8\";\r\nexport const DEVTOOL_STACK_FRAME_INTERNAL_NUMBER = \"#2d3f53\";\r\nexport const DEVTOOL_STACK_FRAME_INTERNAL_FUNCTION = \"#50698b\";\r\nexport const DEVTOOL_STACK_FRAME_INTERNAL_FOLDER = \"#2d3f53\";\r\nexport const DEVTOOL_STACK_FRAME_INTERNAL_FILE = \"#425979\";\r\nexport const DEVTOOL_STACK_FRAME_INTERNAL_LINE = \"#2d4a63\";\r\n\r\n// ─── Chip / Icon semantic colour table ───────────────────────────────────────\r\n// Chip and Icon components resolve colours exclusively through this table.\r\n// ESemanticThing names what a UI element *is*; SEMANTIC_COLORS maps it to paint.\r\n// The age_latest chip reuses the base status entries (failed/action_error/aborted/\r\n// running_action) — no separate variants needed.\r\n\r\nexport enum ESemanticThing {\r\n // Status / outcome\r\n running_action = \"running_action\",\r\n success = \"success\",\r\n action_error = \"action_error\",\r\n failed = \"failed\",\r\n aborted = \"aborted\",\r\n error = \"error\", // error chip in list / tooltip\r\n // Role / classification\r\n domain = \"domain\",\r\n handler_local = \"handler_local\",\r\n handler_external = \"handler_external\",\r\n origin = \"origin\", // runtime an action was received from (inbound / pushed actions)\r\n // List decorators\r\n age = \"age\", // non-latest relative-age chip\r\n io_input = \"io_input\",\r\n io_output = \"io_output\",\r\n // Fallback\r\n default = \"default\",\r\n}\r\n\r\nexport const SEMANTIC_COLORS: Record<ESemanticThing, IChipColorEntry> = {\r\n running_action: {\r\n color: DEVTOOL_COLOR_SEMANTIC_SYSTEM,\r\n borderColor: `${DEVTOOL_COLOR_SEMANTIC_SYSTEM}55`,\r\n },\r\n success: {\r\n color: DEVTOOL_COLOR_SEMANTIC_SUCCESS,\r\n borderColor: `${DEVTOOL_COLOR_SEMANTIC_SUCCESS}55`,\r\n },\r\n action_error: {\r\n color: DEVTOOL_COLOR_SEMANTIC_WARNING,\r\n borderColor: `${DEVTOOL_COLOR_SEMANTIC_WARNING}55`,\r\n },\r\n failed: {\r\n color: DEVTOOL_COLOR_SEMANTIC_ERROR,\r\n borderColor: `${DEVTOOL_COLOR_SEMANTIC_ERROR}55`,\r\n },\r\n aborted: {\r\n color: DEVTOOL_COLOR_SEMANTIC_METADATA,\r\n borderColor: DEVTOOL_COLOR_TEXT_FAINT,\r\n },\r\n error: {\r\n color: DEVTOOL_COLOR_SEMANTIC_ERROR,\r\n borderColor: DEVTOOL_COLOR_SEMANTIC_ERROR,\r\n subtle: { color: \"#FF5C5C9f\", borderColor: \"transparent\" },\r\n },\r\n domain: {\r\n color: DEVTOOL_COLOR_SEMANTIC_SYSTEM,\r\n borderColor: `${DEVTOOL_COLOR_SEMANTIC_SYSTEM}55`,\r\n subtle: { color: \"#4b5563\", borderColor: \"transparent\" },\r\n },\r\n handler_local: {\r\n color: DEVTOOL_COLOR_HANDLER_LOCAL_TEXT,\r\n borderColor: DEVTOOL_COLOR_HANDLER_LOCAL_BORDER,\r\n subtle: { color: \"#4b5563\", borderColor: \"transparent\" },\r\n },\r\n handler_external: {\r\n color: DEVTOOL_COLOR_HANDLER_EXTERNAL_TEXT,\r\n borderColor: DEVTOOL_COLOR_HANDLER_EXTERNAL_BORDER,\r\n subtle: { color: \"#cfa12a9f\", borderColor: \"transparent\" },\r\n },\r\n origin: {\r\n color: DEVTOOL_COLOR_SEMANTIC_SYSTEM,\r\n borderColor: `${DEVTOOL_COLOR_SEMANTIC_SYSTEM}55`,\r\n subtle: { color: `${DEVTOOL_COLOR_SEMANTIC_SYSTEM}9f`, borderColor: \"transparent\" },\r\n },\r\n age: {\r\n color: DEVTOOL_COLOR_SEMANTIC_METADATA,\r\n borderColor: DEVTOOL_SECTION_BACKGROUND,\r\n subtle: { color: \"#4b5563\", borderColor: \"transparent\" },\r\n },\r\n io_input: {\r\n color: \"#fbbf24\",\r\n subtle: { color: \"#fbbe249f\", borderColor: \"transparent\" },\r\n borderColor: \"#78350f\",\r\n },\r\n io_output: {\r\n color: \"#a78bfa\",\r\n subtle: { color: \"#a78bfa9f\", borderColor: \"transparent\" },\r\n borderColor: \"#4c1d95\",\r\n },\r\n default: {\r\n color: DEVTOOL_COLOR_TEXT_MUTED,\r\n borderColor: DEVTOOL_COLOR_TEXT_FAINT,\r\n },\r\n};\r\n","export enum ESize {\n sm = \"sm\",\n md = \"md\",\n lg = \"lg\",\n}\n\nexport function getSizeValue(size: ESize): number {\n switch (size) {\n case ESize.sm:\n return 0.75;\n case ESize.md:\n return 1;\n case ESize.lg:\n return 1.2;\n default:\n return 1;\n }\n}\n","import { renderColoredJson, safeStringify } from \"nice-devtools-shared\";\r\nimport { useState } from \"react\";\r\nimport {\r\n DEVTOOL_COLOR_SEMANTIC_SYSTEM,\r\n DEVTOOL_COLOR_TEXT_FAINT,\r\n DEVTOOL_COLOR_TEXT_MUTED,\r\n DEVTOOL_COLOR_TEXT_SECONDARY,\r\n DEVTOOL_SECTION_BACKGROUND,\r\n DEVTOOL_SECTION_STRING_BACKGROUND,\r\n} from \"../../core/devtools_colors\";\r\nimport { SectionLabel } from \"./SectionLabel\";\r\n\r\nconst COMPACT_CHAR_LIMIT = 120;\r\nconst MONO = \"ui-monospace, 'Cascadia Code', 'Source Code Pro', monospace\";\r\n\r\nfunction tryParseJson(s: string): unknown {\r\n try {\r\n return JSON.parse(s);\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function DetailSection({\r\n label,\r\n value,\r\n color = DEVTOOL_COLOR_SEMANTIC_SYSTEM,\r\n}: {\r\n label: string;\r\n value: unknown;\r\n color?: string;\r\n}) {\r\n // If the value is a raw string that is valid JSON, parse and render it as\r\n // structured data with syntax highlighting instead of as a plain string.\r\n const parsedFromString = typeof value === \"string\" ? tryParseJson(value) : null;\r\n const isPlainString = typeof value === \"string\" && parsedFromString === null;\r\n const effectiveValue = parsedFromString !== null ? parsedFromString : value;\r\n\r\n const [expanded, setExpanded] = useState(false);\r\n const fullJson = isPlainString ? (value as string) : safeStringify(effectiveValue, 2);\r\n const compactJson = isPlainString ? (value as string) : safeStringify(effectiveValue, 0);\r\n\r\n const canExpand = fullJson !== compactJson || compactJson.length > COMPACT_CHAR_LIMIT;\r\n const compactDisplay =\r\n compactJson.length > COMPACT_CHAR_LIMIT\r\n ? `${compactJson.slice(0, COMPACT_CHAR_LIMIT)}…`\r\n : compactJson;\r\n\r\n const baseStyle = isPlainString\r\n ? { background: DEVTOOL_SECTION_STRING_BACKGROUND, color: DEVTOOL_COLOR_TEXT_MUTED }\r\n : { background: DEVTOOL_SECTION_BACKGROUND, color: DEVTOOL_COLOR_TEXT_SECONDARY };\r\n\r\n return (\r\n <div>\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n marginBottom: \"3px\",\r\n }}\r\n >\r\n <SectionLabel label={label} color={color} />\r\n {canExpand && (\r\n <span style={{ color: DEVTOOL_COLOR_TEXT_FAINT, fontSize: \"11px\" }}>\r\n {expanded ? \"▾\" : \"▸\"}\r\n </span>\r\n )}\r\n </div>\r\n {expanded ? (\r\n <div\r\n onClick={canExpand ? () => setExpanded(false) : undefined}\r\n style={{\r\n margin: 0,\r\n padding: \"6px 8px\",\r\n borderRadius: \"4px\",\r\n fontSize: \"11px\",\r\n fontFamily: MONO,\r\n overflowX: \"auto\",\r\n textAlign: \"left\",\r\n whiteSpace: \"pre-wrap\",\r\n wordBreak: \"break-all\",\r\n cursor: canExpand ? \"pointer\" : \"default\",\r\n fontStyle: isPlainString ? \"italic\" : \"normal\",\r\n ...baseStyle,\r\n }}\r\n >\r\n {isPlainString ? fullJson : renderColoredJson(fullJson)}\r\n </div>\r\n ) : (\r\n <div\r\n onClick={canExpand ? () => setExpanded(true) : undefined}\r\n style={{\r\n padding: \"5px 8px\",\r\n borderRadius: \"4px\",\r\n fontSize: \"11px\",\r\n fontFamily: MONO,\r\n whiteSpace: \"nowrap\",\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n cursor: canExpand ? \"pointer\" : \"default\",\r\n fontStyle: isPlainString ? \"italic\" : \"normal\",\r\n ...baseStyle,\r\n }}\r\n >\r\n {compactDisplay}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import {\n DEVTOOL_COLOR_SEMANTIC_ERROR,\n DEVTOOL_COLOR_TEXT_MUTED,\n DEVTOOL_ERROR_BACKGROUND,\n DEVTOOL_ERROR_BADGE_BACKGROUND,\n} from \"../../core/devtools_colors\";\n\nconst MONO = \"ui-monospace, 'Cascadia Code', 'Source Code Pro', monospace\";\nconst SANS = \"ui-sans-serif, system-ui, -apple-system, sans-serif\";\n\nimport { SectionLabel } from \"./SectionLabel\";\n\nexport type TNiceErrorJson = {\n name: \"NiceError\";\n message: string;\n ids: string[];\n httpStatusCode: number;\n def: { domain: string; allDomains: string[] };\n};\n\nexport function isNiceErrorJson(value: unknown): value is TNiceErrorJson {\n if (typeof value !== \"object\" || value == null) return false;\n const v = value as Record<string, unknown>;\n return v[\"name\"] === \"NiceError\" && Array.isArray(v[\"ids\"]) && typeof v[\"message\"] === \"string\";\n}\n\nexport function NiceErrorBody({ error }: { error: TNiceErrorJson }) {\n return (\n <div\n style={{\n background: DEVTOOL_ERROR_BACKGROUND,\n border: `1px solid ${DEVTOOL_COLOR_SEMANTIC_ERROR}`,\n borderRadius: \"4px\",\n overflow: \"hidden\",\n }}\n >\n {/* Main exception message — largest, boldest */}\n <div\n style={{\n padding: \"12px 14px\",\n color: DEVTOOL_COLOR_SEMANTIC_ERROR,\n fontSize: \"1em\",\n fontWeight: \"700\",\n lineHeight: \"1.45\",\n wordBreak: \"break-word\",\n fontFamily: SANS,\n textAlign: \"left\",\n borderBottom: `1px solid ${DEVTOOL_ERROR_BADGE_BACKGROUND}`,\n }}\n >\n {error.message}\n </div>\n {/* Error code, domain, HTTP status — smaller, subdued */}\n <div\n style={{\n padding: \"6px 14px 8px\",\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: \"10px\",\n alignItems: \"center\",\n background: DEVTOOL_ERROR_BADGE_BACKGROUND,\n }}\n >\n {error.ids.map((id) => (\n <span\n key={id}\n style={{\n color: DEVTOOL_COLOR_SEMANTIC_ERROR,\n fontFamily: MONO,\n fontSize: \"11px\",\n fontWeight: \"600\",\n }}\n >\n {id}\n </span>\n ))}\n <span style={{ color: DEVTOOL_COLOR_TEXT_MUTED, fontSize: \"10px\", fontFamily: SANS }}>\n domain:{\" \"}\n <span style={{ color: DEVTOOL_COLOR_TEXT_MUTED, fontFamily: MONO }}>\n {error.def.domain}\n </span>\n </span>\n <span style={{ color: DEVTOOL_COLOR_TEXT_MUTED, fontSize: \"10px\", fontFamily: SANS }}>\n http:{\" \"}\n <span style={{ color: DEVTOOL_COLOR_TEXT_MUTED, fontFamily: MONO }}>\n {error.httpStatusCode}\n </span>\n </span>\n </div>\n </div>\n );\n}\n\nexport function NiceErrorDisplay({\n error,\n label,\n color,\n}: {\n error: TNiceErrorJson;\n label: string;\n color: string;\n}) {\n return (\n <div>\n <SectionLabel label={label} color={color} />\n <NiceErrorBody error={error} />\n </div>\n );\n}\n","import { createTypedWebLocalStorage } from \"@nice-code/util\";\nimport type { TRuntimeCoordinateEnvId } from \"../../ActionRuntime/RuntimeCoordinate\";\n\ninterface TBrowserDevtoolsTypedStorage {\n runtimeToProjectFilePath: Record<TRuntimeCoordinateEnvId, string>;\n}\n\nexport const devtools_storage = createTypedWebLocalStorage<TBrowserDevtoolsTypedStorage>({\n localStorage: window.localStorage,\n keyPrefix: \"nice-action-devtools::\",\n});\n\ndevtools_storage.updateJsonWithDef(\"runtimeToProjectFilePath\", {}, (prev) => prev);\n","import { type RawSourceMap, SourceMapConsumer } from \"source-map-js\";\n\n// Cache by normalized URL (no query string — Vite adds ?t= for HMR but the map is stable).\n// Stored as a Promise so concurrent lookups for the same file share one in-flight fetch.\nconst consumerCache = new Map<string, Promise<SourceMapConsumer | null>>();\n\nasync function loadConsumer(fileUrl: string): Promise<SourceMapConsumer | null> {\n try {\n if (!fileUrl.startsWith(\"http://\") && !fileUrl.startsWith(\"https://\")) return null;\n\n const resp = await fetch(fileUrl);\n if (!resp.ok) return null;\n const text = await resp.text();\n\n const match = text.match(/\\/\\/[#@] sourceMappingURL=(\\S+)/);\n if (match == null) return null;\n const mapRef = match[1]!;\n\n let mapJson: string;\n if (mapRef.startsWith(\"data:\")) {\n // Inline source map: data:application/json;charset=utf-8;base64,<payload>\n const commaIdx = mapRef.indexOf(\",\");\n if (commaIdx === -1) return null;\n const header = mapRef.slice(5, commaIdx);\n const payload = mapRef.slice(commaIdx + 1);\n mapJson = header.includes(\"base64\") ? atob(payload) : decodeURIComponent(payload);\n } else {\n // External .map file — resolve relative to the source file URL\n const mapUrl = new URL(mapRef, fileUrl).href;\n const mapResp = await fetch(mapUrl);\n if (!mapResp.ok) return null;\n mapJson = await mapResp.text();\n }\n\n return new SourceMapConsumer(JSON.parse(mapJson) as RawSourceMap);\n } catch {\n return null;\n }\n}\n\nfunction getConsumer(fileUrl: string): Promise<SourceMapConsumer | null> {\n const key = fileUrl.split(\"?\")[0] ?? fileUrl;\n if (!consumerCache.has(key)) {\n consumerCache.set(key, loadConsumer(fileUrl));\n }\n return consumerCache.get(key)!;\n}\n\nexport interface IResolvedSourcePosition {\n file: string;\n line: number;\n col: number;\n}\n\nexport async function resolveCompiledPosition(\n fileUrl: string,\n line: number,\n col: number,\n): Promise<IResolvedSourcePosition | null> {\n try {\n const consumer = await getConsumer(fileUrl);\n if (consumer == null) return null;\n\n // source-map-js types MappedPosition as non-nullable but returns nulls when there's no mapping\n const pos = consumer.originalPositionFor({ line, column: col }) as {\n source: string | null;\n line: number | null;\n column: number | null;\n };\n if (pos.source == null || pos.line == null) return null;\n\n return { file: pos.source, line: pos.line, col: pos.column ?? 0 };\n } catch {\n return null;\n }\n}\n","import { ExternalLink } from \"lucide-react\";\r\nimport { useEffect, useRef, useState } from \"react\";\r\nimport type {\r\n IRuntimeCoordinate,\r\n TRuntimeCoordinateEnvId,\r\n} from \"../../../ActionRuntime/RuntimeCoordinate\";\r\nimport {\r\n DEVTOOL_COLOR_SEMANTIC_SYSTEM,\r\n DEVTOOL_COLOR_SEMANTIC_WARNING,\r\n DEVTOOL_COLOR_TEXT_EMPHASIS,\r\n DEVTOOL_COLOR_TEXT_MUTED,\r\n DEVTOOL_COLOR_TEXT_SECONDARY,\r\n DEVTOOL_LIST_BASE_BACKGROUND,\r\n DEVTOOL_PANEL_BORDER,\r\n DEVTOOL_STACK_FRAME_INTERNAL_FILE,\r\n DEVTOOL_STACK_FRAME_INTERNAL_FOLDER,\r\n DEVTOOL_STACK_FRAME_INTERNAL_FUNCTION,\r\n DEVTOOL_STACK_FRAME_INTERNAL_LINE,\r\n DEVTOOL_STACK_FRAME_INTERNAL_NUMBER,\r\n DEVTOOL_STACK_FRAME_USER_FILE,\r\n DEVTOOL_STACK_FRAME_USER_FOLDER,\r\n DEVTOOL_STACK_FRAME_USER_FUNCTION,\r\n DEVTOOL_STACK_FRAME_USER_LINE,\r\n DEVTOOL_STACK_FRAME_USER_NUMBER,\r\n DEVTOOL_STACK_TRACE_BACKGROUND,\r\n DEVTOOL_TOOLTIP_BACKGROUND,\r\n DEVTOOL_TOOLTIP_BORDER,\r\n DEVTOOL_TOOLTIP_TITLE_BACKGROUND,\r\n} from \"../../core/devtools_colors\";\r\nimport { devtools_storage } from \"../devtools_storage\";\r\nimport { SectionLabel } from \"./SectionLabel\";\r\nimport { resolveCompiledPosition } from \"./sourceMapResolver\";\r\n\r\ninterface IStackFrame {\r\n fn?: string;\r\n file?: string;\r\n /** The file URL from the raw stack trace, before source-map resolution overwrites `file`. */\r\n originalFile?: string;\r\n line?: number;\r\n col?: number;\r\n raw: string;\r\n isInternal: boolean;\r\n internalProjectPath?: string;\r\n}\r\n\r\nconst INTERNAL_PATTERNS = [\r\n \"/nice-action/\", // monorepo workspace paths: packages/nice-action/src/...\r\n \"@nice-code/action\", // npm scoped package: webpack://@nice-code/action/..., /@nice-code/action/...\r\n \"/nice-error/\",\r\n \"@nice-code/error\",\r\n \"node_modules/\",\r\n \"native code\",\r\n \"<anonymous>\",\r\n];\r\n\r\nfunction isInternalFrame(file: string): boolean {\r\n return INTERNAL_PATTERNS.some((p) => file.includes(p));\r\n}\r\n\r\nfunction parseStackFrames(stack: string): IStackFrame[] {\r\n return stack\r\n .split(\"\\n\")\r\n .slice(1)\r\n .map((line): IStackFrame | null => {\r\n const raw = line.trim();\r\n if (raw === \"\") return null;\r\n const matchFn = raw.match(/^at (.+?) \\((.+):(\\d+):(\\d+)\\)$/);\r\n if (matchFn != null) {\r\n const file = matchFn[2]!;\r\n return {\r\n fn: matchFn[1],\r\n file,\r\n line: parseInt(matchFn[3]!, 10),\r\n col: parseInt(matchFn[4]!, 10),\r\n raw,\r\n isInternal: isInternalFrame(file),\r\n };\r\n }\r\n const matchUrl = raw.match(/^at (.+):(\\d+):(\\d+)$/);\r\n if (matchUrl != null) {\r\n const file = matchUrl[1]!;\r\n return {\r\n file,\r\n line: parseInt(matchUrl[2]!, 10),\r\n col: parseInt(matchUrl[3]!, 10),\r\n raw,\r\n isInternal: isInternalFrame(file),\r\n };\r\n }\r\n return { raw, isInternal: true };\r\n })\r\n .filter((f): f is IStackFrame => f != null);\r\n}\r\n\r\nasync function resolveSourceMapPositions(frames: IStackFrame[]): Promise<IStackFrame[]> {\r\n return Promise.all(\r\n frames.map(async (frame): Promise<IStackFrame> => {\r\n if (frame.isInternal || frame.file == null || frame.line == null) return frame;\r\n const resolved = await resolveCompiledPosition(frame.file, frame.line, frame.col ?? 0);\r\n if (resolved == null) return frame;\r\n return {\r\n ...frame,\r\n originalFile: frame.file,\r\n file: resolved.file,\r\n line: resolved.line,\r\n col: resolved.col,\r\n };\r\n }),\r\n );\r\n}\r\n\r\nfunction formatFrameFile(file: string | undefined): string {\r\n if (file == null) return \"?\";\r\n let path = file;\r\n try {\r\n const url = new URL(file);\r\n path = url.pathname.split(\"?\")[0] ?? url.pathname;\r\n // Vite serves files outside the project root under /@fs/<absolute-path>\r\n if (path.startsWith(\"/@fs/\")) path = path.slice(4);\r\n } catch {\r\n /* not a URL, use as-is */\r\n }\r\n const parts = path.replace(/\\\\/g, \"/\").split(\"/\").filter(Boolean);\r\n // Strip common Windows drive segment like \"c:\" at the front\r\n const filtered = parts[0]?.match(/^[a-zA-Z]:$/) != null ? parts.slice(1) : parts;\r\n // Show up to 4 segments (3 dirs + filename), enough to identify without overwhelming\r\n const tail = filtered.slice(-4);\r\n return tail.join(\"/\") || file;\r\n}\r\n\r\n// Returns the stack-origin HTTP URL for path extraction: prefers originalFile (pre-source-map)\r\n// over the post-resolution file, because Vite source maps often reduce the path to just a\r\n// basename (\"App.tsx\") which loses the root-relative path info the URL had (\"/src/App.tsx\").\r\nfunction getOriginUrl(frame: IStackFrame): string | null {\r\n const candidate = frame.originalFile ?? frame.file;\r\n if (candidate == null) return null;\r\n try {\r\n new URL(candidate);\r\n return candidate;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n// True when the frame's origin URL is Vite root-relative (no /@fs/ embedded absolute path),\r\n// meaning we need a configured project root to build an absolute VS Code path.\r\nfunction frameNeedsProjectRoot(frame: IStackFrame): boolean {\r\n if (frame.isInternal) return false;\r\n const originUrl = getOriginUrl(frame);\r\n if (originUrl == null) return false;\r\n const path = new URL(originUrl).pathname.split(\"?\")[0] ?? \"\";\r\n return !path.startsWith(\"/@fs/\");\r\n}\r\n\r\nfunction buildVscodeUrl(frame: IStackFrame, projectRoot: string | null): string | null {\r\n if (frame.line == null) return null;\r\n\r\n const originUrl = getOriginUrl(frame);\r\n if (originUrl != null) {\r\n let path = new URL(originUrl).pathname.split(\"?\")[0] ?? \"\";\r\n if (path.startsWith(\"/@fs/\")) {\r\n // Absolute path embedded by Vite (e.g. /@fs/C:/d/project/src/foo.ts)\r\n path = path.slice(5);\r\n if (/^\\/[a-zA-Z]:\\//.test(path)) path = path.slice(1);\r\n return `vscode://file/${path}:${frame.line}:${frame.col ?? 1}`;\r\n }\r\n // Root-relative Vite path (e.g. /src/App.tsx) — needs project root\r\n if (projectRoot == null) return null;\r\n const normalRoot = projectRoot.replace(/[/\\\\]+$/, \"\").replace(/\\\\/g, \"/\");\r\n return `vscode://file/${normalRoot}${path}:${frame.line}:${frame.col ?? 1}`;\r\n }\r\n\r\n // No HTTP URL available — use frame.file directly (post-source-map plain path)\r\n const filePath = frame.file;\r\n if (filePath == null) return null;\r\n const normalPath = filePath.replace(/\\\\/g, \"/\");\r\n // Windows absolute: C:/path\r\n if (/^[a-zA-Z]:\\//.test(normalPath)) {\r\n return `vscode://file/${normalPath}:${frame.line}:${frame.col ?? 1}`;\r\n }\r\n // Leading slash before Windows drive: /c:/path\r\n if (/^\\/[a-zA-Z]:\\//.test(normalPath)) {\r\n return `vscode://file/${normalPath.slice(1)}:${frame.line}:${frame.col ?? 1}`;\r\n }\r\n // Unix absolute or root-relative (e.g. /src/App.tsx, /home/user/project/src/foo.ts)\r\n if (normalPath.startsWith(\"/\")) {\r\n if (projectRoot == null) return null;\r\n const normalRoot = projectRoot.replace(/[/\\\\]+$/, \"\").replace(/\\\\/g, \"/\");\r\n return `vscode://file/${normalRoot}${normalPath}:${frame.line}:${frame.col ?? 1}`;\r\n }\r\n // Relative path (e.g. \"App.tsx\", \"../../src/App.tsx\")\r\n if (projectRoot == null) return null;\r\n const normalRoot = projectRoot.replace(/[/\\\\]+$/, \"\").replace(/\\\\/g, \"/\");\r\n return `vscode://file/${normalRoot}/${normalPath}:${frame.line}:${frame.col ?? 1}`;\r\n}\r\n\r\n// ─── Project root setup modal ────────────────────────────────────────────────\r\n\r\nfunction ProjectRootSetupModal({\r\n envId,\r\n currentValue,\r\n onSave,\r\n onCancel,\r\n}: {\r\n envId: string;\r\n currentValue: string;\r\n onSave: (path: string) => void;\r\n onCancel: () => void;\r\n}) {\r\n const [value, setValue] = useState(currentValue);\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n\r\n useEffect(() => {\r\n inputRef.current?.focus();\r\n inputRef.current?.select();\r\n }, []);\r\n\r\n useEffect(() => {\r\n const handler = (e: KeyboardEvent) => {\r\n if (e.key === \"Escape\") onCancel();\r\n };\r\n window.addEventListener(\"keydown\", handler);\r\n return () => window.removeEventListener(\"keydown\", handler);\r\n }, [onCancel]);\r\n\r\n const handleSubmit = (e: React.SyntheticEvent<HTMLFormElement>) => {\r\n e.preventDefault();\r\n const trimmed = value.trim();\r\n if (trimmed !== \"\") onSave(trimmed);\r\n };\r\n\r\n return (\r\n <div\r\n style={{\r\n position: \"fixed\",\r\n inset: 0,\r\n zIndex: 2147483647,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n }}\r\n >\r\n <div\r\n onClick={onCancel}\r\n style={{ position: \"absolute\", inset: 0, background: \"rgba(0, 0, 0, 0.72)\" }}\r\n />\r\n <form\r\n onSubmit={handleSubmit}\r\n style={{\r\n position: \"relative\",\r\n background: DEVTOOL_TOOLTIP_BACKGROUND,\r\n border: `1px solid ${DEVTOOL_TOOLTIP_BORDER}`,\r\n borderRadius: \"8px\",\r\n width: \"420px\",\r\n maxWidth: \"90vw\",\r\n boxShadow: \"0 8px 32px rgba(0, 0, 0, 0.8)\",\r\n overflow: \"hidden\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n }}\r\n >\r\n {/* Header */}\r\n <div\r\n style={{\r\n background: DEVTOOL_TOOLTIP_TITLE_BACKGROUND,\r\n borderBottom: `1px solid ${DEVTOOL_TOOLTIP_BORDER}`,\r\n padding: \"10px 14px\",\r\n }}\r\n >\r\n <div\r\n style={{\r\n color: DEVTOOL_COLOR_TEXT_EMPHASIS,\r\n fontSize: \"12px\",\r\n fontWeight: 600,\r\n marginBottom: \"2px\",\r\n }}\r\n >\r\n Set project root\r\n </div>\r\n <div style={{ color: DEVTOOL_COLOR_TEXT_MUTED, fontSize: \"10px\" }}>\r\n Runtime:{\" \"}\r\n <span\r\n style={{\r\n color: DEVTOOL_COLOR_SEMANTIC_SYSTEM,\r\n fontFamily: \"ui-monospace, 'Cascadia Code', 'Source Code Pro', monospace\",\r\n }}\r\n >\r\n {envId}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n {/* Body */}\r\n <div style={{ padding: \"14px\", display: \"flex\", flexDirection: \"column\", gap: \"8px\" }}>\r\n <div style={{ color: DEVTOOL_COLOR_TEXT_MUTED, fontSize: \"10px\", lineHeight: 1.4 }}>\r\n Provide the absolute path to this project's root so that root-relative source file paths\r\n (e.g.{\" \"}\r\n <span\r\n style={{\r\n fontFamily: \"ui-monospace, 'Cascadia Code', 'Source Code Pro', monospace\",\r\n }}\r\n >\r\n src/App.tsx\r\n </span>\r\n ) can be opened in VS Code.\r\n </div>\r\n <input\r\n ref={inputRef}\r\n value={value}\r\n onChange={(e) => setValue(e.currentTarget.value)}\r\n placeholder=\"e.g. C:/d/nice-code/packages/demo-frontend\"\r\n style={{\r\n background: DEVTOOL_STACK_TRACE_BACKGROUND,\r\n border: `1px solid ${DEVTOOL_TOOLTIP_BORDER}`,\r\n borderRadius: \"4px\",\r\n color: DEVTOOL_COLOR_TEXT_SECONDARY,\r\n fontSize: \"11px\",\r\n fontFamily: \"ui-monospace, 'Cascadia Code', 'Source Code Pro', monospace\",\r\n padding: \"7px 9px\",\r\n outline: \"none\",\r\n width: \"100%\",\r\n boxSizing: \"border-box\",\r\n }}\r\n />\r\n </div>\r\n\r\n {/* Footer */}\r\n <div\r\n style={{\r\n display: \"flex\",\r\n justifyContent: \"flex-end\",\r\n gap: \"8px\",\r\n padding: \"10px 14px\",\r\n borderTop: `1px solid ${DEVTOOL_PANEL_BORDER}`,\r\n }}\r\n >\r\n <button\r\n type=\"button\"\r\n onClick={onCancel}\r\n style={{\r\n background: \"transparent\",\r\n border: `1px solid ${DEVTOOL_PANEL_BORDER}`,\r\n borderRadius: \"4px\",\r\n color: DEVTOOL_COLOR_TEXT_MUTED,\r\n fontSize: \"11px\",\r\n padding: \"5px 12px\",\r\n cursor: \"pointer\",\r\n }}\r\n >\r\n Cancel\r\n </button>\r\n <button\r\n type=\"submit\"\r\n disabled={value.trim() === \"\"}\r\n style={{\r\n background: `${DEVTOOL_COLOR_SEMANTIC_SYSTEM}22`,\r\n border: `1px solid ${DEVTOOL_COLOR_SEMANTIC_SYSTEM}66`,\r\n borderRadius: \"4px\",\r\n color: DEVTOOL_COLOR_SEMANTIC_SYSTEM,\r\n fontSize: \"11px\",\r\n padding: \"5px 12px\",\r\n cursor: value.trim() === \"\" ? \"not-allowed\" : \"pointer\",\r\n opacity: value.trim() === \"\" ? 0.5 : 1,\r\n }}\r\n >\r\n Save\r\n </button>\r\n </div>\r\n </form>\r\n </div>\r\n );\r\n}\r\n\r\n// ─── Open-in-VS Code button ───────────────────────────────────────────────────\r\n\r\nfunction OpenInVscodeButton({\r\n frame,\r\n projectRoot,\r\n onNeedSetup,\r\n}: {\r\n frame: IStackFrame;\r\n projectRoot: string | null;\r\n onNeedSetup: () => void;\r\n}) {\r\n const [hovered, setHovered] = useState(false);\r\n const needsSetup = frameNeedsProjectRoot(frame) && projectRoot == null;\r\n const url = buildVscodeUrl(frame, projectRoot);\r\n\r\n if (frame.file == null || frame.line == null) return null;\r\n if (!needsSetup && url == null) return null;\r\n\r\n const baseStyle: React.CSSProperties = {\r\n position: \"absolute\",\r\n bottom: \"3px\",\r\n right: \"4px\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n width: \"16px\",\r\n height: \"16px\",\r\n opacity: hovered ? 0.85 : 0.25,\r\n transition: \"opacity 0.15s ease\",\r\n cursor: \"pointer\",\r\n flexShrink: 0,\r\n };\r\n\r\n if (needsSetup) {\r\n return (\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onNeedSetup();\r\n }}\r\n onMouseEnter={() => setHovered(true)}\r\n onMouseLeave={() => setHovered(false)}\r\n title=\"Set project root to open in VS Code\"\r\n style={{\r\n ...baseStyle,\r\n color: DEVTOOL_COLOR_SEMANTIC_WARNING,\r\n background: \"none\",\r\n border: \"none\",\r\n padding: 0,\r\n }}\r\n >\r\n <ExternalLink size={10} strokeWidth={1.8} />\r\n </button>\r\n );\r\n }\r\n\r\n return (\r\n <a\r\n href={url!}\r\n onClick={(e) => e.stopPropagation()}\r\n onMouseEnter={() => setHovered(true)}\r\n onMouseLeave={() => setHovered(false)}\r\n title=\"Open in VS Code\"\r\n style={{\r\n ...baseStyle,\r\n color: DEVTOOL_COLOR_TEXT_SECONDARY,\r\n textDecoration: \"none\",\r\n }}\r\n >\r\n <ExternalLink size={10} strokeWidth={1.8} />\r\n </a>\r\n );\r\n}\r\n\r\n// ─── Exports ──────────────────────────────────────────────────────────────────\r\n\r\nexport function countUserFrames(_runtime: IRuntimeCoordinate, stack: string | undefined): number {\r\n if (stack == null) return 0;\r\n return parseStackFrames(stack).filter((f) => !f.isInternal).length;\r\n}\r\n\r\nexport function StackTraceSection({\r\n label,\r\n stack,\r\n color = DEVTOOL_COLOR_SEMANTIC_SYSTEM,\r\n runtime,\r\n minFrameCount,\r\n}: {\r\n label: string;\r\n stack: string | undefined;\r\n runtime: IRuntimeCoordinate;\r\n color?: string;\r\n minFrameCount?: number;\r\n}) {\r\n const [showAll, setShowAll] = useState(false);\r\n const [resolvedFrames, setResolvedFrames] = useState<IStackFrame[] | null>(null);\r\n const [projectRootMap, setProjectRootMap] = useState<Record<TRuntimeCoordinateEnvId, string>>({});\r\n const [showSetupModal, setShowSetupModal] = useState(false);\r\n\r\n useEffect(() => {\r\n void devtools_storage\r\n .getJsonOrDef(\"runtimeToProjectFilePath\", {})\r\n .then((map) => setProjectRootMap(map));\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (stack == null) return;\r\n setResolvedFrames(null);\r\n const parsed = parseStackFrames(stack);\r\n let cancelled = false;\r\n resolveSourceMapPositions(parsed).then((frames) => {\r\n if (!cancelled) setResolvedFrames(frames);\r\n });\r\n return () => {\r\n cancelled = true;\r\n };\r\n }, [stack]);\r\n\r\n if (stack == null) return null;\r\n\r\n const allFrames = resolvedFrames ?? parseStackFrames(stack);\r\n const userFrames = allFrames.filter((f) => !f.isInternal);\r\n const hasInternalFrames = allFrames.length > userFrames.length;\r\n const displayFrames = showAll ? allFrames : userFrames;\r\n const phantomFrameCount = !showAll ? Math.max(0, (minFrameCount ?? 0) - displayFrames.length) : 0;\r\n\r\n if (allFrames.length === 0) return null;\r\n\r\n const runtimeKey = `envId[${runtime.envId}]` as TRuntimeCoordinateEnvId;\r\n const projectRoot = projectRootMap[runtimeKey] ?? null;\r\n\r\n const handleSaveProjectRoot = (path: string) => {\r\n setProjectRootMap((prev) => ({ ...prev, [runtimeKey]: path }));\r\n setShowSetupModal(false);\r\n void devtools_storage.updateJsonWithDef(\"runtimeToProjectFilePath\", {}, (prev) => ({\r\n ...prev,\r\n [runtimeKey]: path,\r\n }));\r\n };\r\n\r\n return (\r\n <div>\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n marginBottom: \"3px\",\r\n }}\r\n >\r\n <SectionLabel label={label} color={color} />\r\n {hasInternalFrames && (\r\n <span style={{ color: DEVTOOL_COLOR_TEXT_MUTED, fontSize: \"9px\" }}>\r\n {!showAll ? \"user only\" : `all (${allFrames.length})`}\r\n </span>\r\n )}\r\n </div>\r\n <div\r\n onClick={() => setShowAll((s) => !s)}\r\n style={{\r\n background: DEVTOOL_STACK_TRACE_BACKGROUND,\r\n borderRadius: \"4px\",\r\n padding: \"2px\",\r\n overflow: \"hidden\",\r\n cursor: \"pointer\",\r\n }}\r\n >\r\n {displayFrames.length === 0 ? (\r\n <div\r\n style={{\r\n padding: \"6px 10px\",\r\n color: DEVTOOL_COLOR_TEXT_MUTED,\r\n fontSize: \"10px\",\r\n fontStyle: \"italic\",\r\n }}\r\n >\r\n no user frames captured\r\n </div>\r\n ) : (\r\n displayFrames.map((frame, idx) => {\r\n const displayFile = formatFrameFile(frame.file);\r\n const slashIdx = displayFile.lastIndexOf(\"/\");\r\n const folderPrefix = slashIdx >= 0 ? displayFile.slice(0, slashIdx + 1) : \"\";\r\n const bareFilename = slashIdx >= 0 ? displayFile.slice(slashIdx + 1) : displayFile;\r\n const titleStr = frame.file != null ? frame.file : frame.raw;\r\n const isUser = !frame.isInternal;\r\n return (\r\n <div\r\n key={frame.raw}\r\n title={titleStr}\r\n style={{\r\n position: \"relative\",\r\n display: \"flex\",\r\n flexDirection: \"row\",\r\n gap: \"0.5em\",\r\n padding: \"4px\",\r\n paddingRight: \"22px\",\r\n borderBottom: `1px solid ${DEVTOOL_LIST_BASE_BACKGROUND}`,\r\n }}\r\n >\r\n <span\r\n style={{\r\n color: isUser\r\n ? DEVTOOL_STACK_FRAME_USER_NUMBER\r\n : DEVTOOL_STACK_FRAME_INTERNAL_NUMBER,\r\n fontSize: \"10px\",\r\n minWidth: \"10px\",\r\n textAlign: \"left\",\r\n flexShrink: 0,\r\n fontVariantNumeric: \"tabular-nums\",\r\n }}\r\n >\r\n {idx + 1}\r\n </span>\r\n <div\r\n style={{\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: \"0.15em\",\r\n lineHeight: 1.2,\r\n }}\r\n >\r\n <div style={{ display: \"flex\", alignItems: \"center\" }}>\r\n <span\r\n style={{\r\n color: isUser\r\n ? DEVTOOL_STACK_FRAME_USER_FUNCTION\r\n : DEVTOOL_STACK_FRAME_INTERNAL_FUNCTION,\r\n fontSize: \"12px\",\r\n fontWeight: 500,\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n whiteSpace: \"nowrap\",\r\n }}\r\n >\r\n {frame.fn ?? \"(anonymous)\"}\r\n </span>\r\n </div>\r\n <div style={{ display: \"flex\", alignItems: \"baseline\", overflow: \"hidden\" }}>\r\n {folderPrefix !== \"\" && (\r\n <span\r\n style={{\r\n color: isUser\r\n ? DEVTOOL_STACK_FRAME_USER_FOLDER\r\n : DEVTOOL_STACK_FRAME_INTERNAL_FOLDER,\r\n fontSize: \"10px\",\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n whiteSpace: \"nowrap\",\r\n flexShrink: 1,\r\n minWidth: 0,\r\n }}\r\n >\r\n {folderPrefix}\r\n </span>\r\n )}\r\n <span\r\n style={{\r\n color: isUser\r\n ? DEVTOOL_STACK_FRAME_USER_FILE\r\n : DEVTOOL_STACK_FRAME_INTERNAL_FILE,\r\n fontSize: \"10px\",\r\n whiteSpace: \"nowrap\",\r\n flexShrink: 0,\r\n }}\r\n >\r\n {bareFilename}\r\n </span>\r\n {frame.line != null && (\r\n <span\r\n style={{\r\n color: isUser\r\n ? DEVTOOL_STACK_FRAME_USER_LINE\r\n : DEVTOOL_STACK_FRAME_INTERNAL_LINE,\r\n fontSize: \"10px\",\r\n whiteSpace: \"nowrap\",\r\n flexShrink: 0,\r\n fontVariantNumeric: \"tabular-nums\",\r\n }}\r\n >\r\n :{frame.line}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n <OpenInVscodeButton\r\n frame={frame}\r\n projectRoot={projectRoot}\r\n onNeedSetup={() => setShowSetupModal(true)}\r\n />\r\n </div>\r\n );\r\n })\r\n )}\r\n {Array.from({ length: phantomFrameCount }, (_, i) => i).map((i) => (\r\n <div\r\n key={`phantom-${i}`}\r\n aria-hidden=\"true\"\r\n style={{\r\n visibility: \"hidden\",\r\n display: \"flex\",\r\n flexDirection: \"row\",\r\n gap: \"0.5em\",\r\n padding: \"4px\",\r\n borderBottom: `1px solid ${DEVTOOL_LIST_BASE_BACKGROUND}`,\r\n }}\r\n >\r\n <span style={{ fontSize: \"10px\", minWidth: \"10px\", flexShrink: 0 }}>0</span>\r\n <div\r\n style={{ display: \"flex\", flexDirection: \"column\", gap: \"0.15em\", lineHeight: 1.2 }}\r\n >\r\n <div style={{ fontSize: \"12px\" }}>placeholder</div>\r\n <div style={{ fontSize: \"10px\" }}>placeholder/file.ts:1</div>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n\r\n {showSetupModal && (\r\n <ProjectRootSetupModal\r\n envId={runtime.envId}\r\n currentValue={projectRoot ?? \"\"}\r\n onSave={handleSaveProjectRoot}\r\n onCancel={() => setShowSetupModal(false)}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n","import type { IRuntimeCoordinate } from \"../../../ActionRuntime/RuntimeCoordinate\";\nimport type { IDevtoolsActionEntry } from \"../../core/ActionDevtools.types\";\nimport {\n DEVTOOL_COLOR_SEMANTIC_ERROR,\n DEVTOOL_COLOR_SEMANTIC_METADATA,\n DEVTOOL_COLOR_TEXT_MUTED,\n DEVTOOL_ERROR_BADGE_BACKGROUND,\n} from \"../../core/devtools_colors\";\nimport { DetailSection } from \"./DetailSection\";\nimport { isNiceErrorJson, NiceErrorDisplay } from \"./NiceErrorDisplay\";\nimport { StackTraceSection } from \"./StackTraceSection\";\n\nconst MONO = \"ui-monospace, 'Cascadia Code', 'Source Code Pro', monospace\";\nconst SANS = \"ui-sans-serif, system-ui, -apple-system, sans-serif\";\n\nfunction FullErrorContent({\n label,\n error,\n errorStack,\n color,\n runtime,\n}: {\n label: string;\n error: unknown;\n errorStack: string | undefined;\n color: string;\n runtime: IRuntimeCoordinate;\n}) {\n return (\n <>\n {isNiceErrorJson(error) ? (\n <NiceErrorDisplay error={error} label={label} color={color} />\n ) : (\n <DetailSection label={label} value={error} color={color} />\n )}\n <StackTraceSection runtime={runtime} label=\"Error Stack\" stack={errorStack} color={color} />\n </>\n );\n}\n\nfunction CompactErrorContent({ value, color }: { value: unknown; color: string }) {\n if (isNiceErrorJson(value)) {\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"1em\",\n width: \"100%\",\n minWidth: 0,\n }}\n >\n <div\n style={{\n color,\n fontFamily: SANS,\n fontSize: \"12px\",\n fontWeight: 600,\n lineHeight: \"1.4\",\n wordBreak: \"break-word\",\n overflowWrap: \"anywhere\",\n textAlign: \"left\",\n }}\n >\n {value.message}\n </div>\n <div\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: \"6px\",\n alignItems: \"center\",\n minWidth: 0,\n }}\n >\n {value.ids.map((id) => (\n <span\n key={id}\n style={{\n color,\n fontFamily: MONO,\n fontSize: \"10px\",\n opacity: 0.8,\n wordBreak: \"break-word\",\n overflowWrap: \"anywhere\",\n }}\n >\n {id}\n </span>\n ))}\n <span\n style={{\n color: DEVTOOL_COLOR_TEXT_MUTED,\n fontFamily: MONO,\n fontSize: \"10px\",\n wordBreak: \"break-word\",\n overflowWrap: \"anywhere\",\n }}\n >\n {value.def.domain}\n </span>\n </div>\n </div>\n );\n }\n\n const text = typeof value === \"string\" ? value : value != null ? String(value) : null;\n if (text == null) return null;\n return (\n <div\n style={{\n color,\n fontFamily: SANS,\n fontSize: \"12px\",\n lineHeight: \"1.4\",\n wordBreak: \"break-word\",\n overflowWrap: \"anywhere\",\n }}\n >\n {text}\n </div>\n );\n}\n\n// ─── Public component ─────────────────────────────────────────────────────────\n\nexport function ActionErrorDisplay({\n entry,\n compact,\n}: {\n entry: IDevtoolsActionEntry;\n compact?: boolean;\n}) {\n const { status, error, abortReason, errorStack } = entry;\n\n if (status === \"action-error\") {\n const color = DEVTOOL_COLOR_SEMANTIC_ERROR;\n if (compact) return <CompactErrorContent value={error} color={color} />;\n return (\n <FullErrorContent\n runtime={entry.meta.originClient}\n label=\"Action Error\"\n error={error}\n errorStack={errorStack}\n color={color}\n />\n );\n }\n\n if (status === \"failed\") {\n const color = DEVTOOL_COLOR_SEMANTIC_ERROR;\n if (compact) return <CompactErrorContent value={error} color={color} />;\n return (\n <FullErrorContent\n runtime={entry.meta.originClient}\n label=\"Error\"\n error={error}\n errorStack={errorStack}\n color={color}\n />\n );\n }\n\n if (status === \"aborted\") {\n const color = DEVTOOL_COLOR_SEMANTIC_METADATA;\n if (compact) return <CompactErrorContent value={abortReason} color={color} />;\n return (\n <>\n {abortReason != null &&\n (isNiceErrorJson(abortReason) ? (\n <NiceErrorDisplay error={abortReason} label=\"Abort Reason\" color={color} />\n ) : (\n <DetailSection label=\"Abort Reason\" value={abortReason} color={color} />\n ))}\n <StackTraceSection\n runtime={entry.meta.originClient}\n label=\"Abort Stack\"\n stack={errorStack}\n color={color}\n />\n </>\n );\n }\n\n return null;\n}\n","import { type CSSProperties, type ReactNode, useState } from \"react\";\nimport {\n DEVTOOL_LIST_BASE_BACKGROUND,\n type ESemanticThing,\n SEMANTIC_COLORS,\n} from \"../../core/devtools_colors\";\nimport { ESize } from \"../ui_util/size\";\nimport { type ITooltipConfig, Tooltip } from \"./Tooltip\";\n\nconst CHIP_SIZE_STYLES: Record<ESize, { fontSize: string; padding: string }> = {\n [ESize.sm]: { fontSize: \"0.8em\", padding: \"1px 3px\" },\n [ESize.md]: { fontSize: \"0.9em\", padding: \"1px 4px\" },\n [ESize.lg]: { fontSize: \"1em\", padding: \"2px 6px\" },\n};\n\nexport interface IChipColorEntry {\n color: string;\n borderColor: string;\n subtle?: { color?: string; borderColor?: string };\n}\n\ninterface IChipProps {\n color: ESemanticThing;\n subtle?: boolean;\n size?: ESize;\n rounded?: boolean;\n tooltip?: ITooltipConfig;\n children: ReactNode;\n}\n\nexport function Chip({\n color,\n subtle = false,\n size = ESize.md,\n rounded = false,\n tooltip,\n children,\n}: IChipProps) {\n const [anchor, setAnchor] = useState<DOMRect | null>(null);\n const hasTooltip = tooltip != null;\n const { fontSize, padding } = CHIP_SIZE_STYLES[size];\n const colorEntry = SEMANTIC_COLORS[color];\n const resolvedColor = subtle ? (colorEntry.subtle?.color ?? colorEntry.color) : colorEntry.color;\n const resolvedBorderColor = subtle\n ? (colorEntry.subtle?.borderColor ?? \"transparent\")\n : colorEntry.borderColor;\n\n return (\n <>\n <span\n onMouseEnter={\n hasTooltip ? (e) => setAnchor(e.currentTarget.getBoundingClientRect()) : undefined\n }\n onMouseLeave={hasTooltip ? () => setAnchor(null) : undefined}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n color: resolvedColor,\n fontSize,\n background: DEVTOOL_LIST_BASE_BACKGROUND,\n border: `1px solid ${resolvedBorderColor}`,\n padding,\n borderRadius: rounded ? \"0.6rem\" : \"3px\",\n flexShrink: 0,\n whiteSpace: \"nowrap\",\n cursor: hasTooltip ? \"default\" : undefined,\n // ...style,\n }}\n >\n {children}\n </span>\n {anchor != null && hasTooltip && <Tooltip anchor={anchor} config={tooltip} />}\n </>\n );\n}\n","import type { LucideIcon } from \"lucide-react\";\nimport type { CSSProperties } from \"react\";\nimport { useState } from \"react\";\nimport { type ESemanticThing, SEMANTIC_COLORS } from \"../../core/devtools_colors\";\nimport { ESize, getSizeValue } from \"../ui_util/size\";\nimport { type ITooltipConfig, Tooltip } from \"./Tooltip\";\n\ninterface IIconProps {\n icon: LucideIcon | LucideIcon[];\n color: ESemanticThing;\n size?: ESize;\n subtle?: boolean;\n tooltip?: ITooltipConfig;\n style?: CSSProperties;\n noBackground?: boolean;\n}\n\nconst BASE_ICON_SIDE_LENGTH_EM = 1.6; // in em, based on visual tuning\nconst ICON_GAP_EM = 0.3; // gap between icons when multiple are shown, in em\n\nexport function Icon({\n icon: IconComponent,\n color,\n size = ESize.md,\n subtle = false,\n tooltip,\n style,\n noBackground = false,\n}: IIconProps) {\n const [anchor, setAnchor] = useState<DOMRect | null>(null);\n const hasTooltip = tooltip != null;\n const colorEntry = SEMANTIC_COLORS[color];\n const resolvedColor = subtle ? (colorEntry.subtle?.color ?? colorEntry.color) : colorEntry.color;\n\n const finalIcons = Array.isArray(IconComponent) ? IconComponent : [IconComponent];\n const fullIconWidthEm =\n (finalIcons.length - 1) * ICON_GAP_EM +\n finalIcons.length * BASE_ICON_SIDE_LENGTH_EM * getSizeValue(size);\n\n const iconSideLengthEm = `${BASE_ICON_SIDE_LENGTH_EM * getSizeValue(size)}em`;\n\n return (\n <>\n <div\n onMouseEnter={\n hasTooltip ? (e) => setAnchor(e.currentTarget.getBoundingClientRect()) : undefined\n }\n onMouseLeave={hasTooltip ? () => setAnchor(null) : undefined}\n style={{\n borderRadius: \"0.4em\",\n width: `${fullIconWidthEm}em`,\n height: iconSideLengthEm,\n padding: \"0.15em\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: noBackground ? \"none\" : \"rgba(0,0,0,0.4)\",\n color: resolvedColor,\n flexShrink: 0,\n cursor: hasTooltip ? \"default\" : undefined,\n ...style,\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: `${ICON_GAP_EM}em` }}>\n {finalIcons.map((Comp, i) => (\n <Comp key={`${Comp.name}-${i}`} size={iconSideLengthEm} strokeWidth={2.6} />\n ))}\n </div>\n </div>\n {anchor != null && hasTooltip && <Tooltip anchor={anchor} config={tooltip} />}\n </>\n );\n}\n","import { Component } from \"lucide-react\";\nimport { DEVTOOL_COLOR_SEMANTIC_SYSTEM, ESemanticThing } from \"../../core/devtools_colors\";\nimport { ESize } from \"../ui_util/size\";\nimport { Chip } from \"./Chip\";\nimport { Icon } from \"./Icon\";\n\nfunction DomainHierarchyContent({ allDomains }: { allDomains: string[] }) {\n return (\n <>\n {allDomains.map((d, i) => {\n const isCurrent = i === allDomains.length - 1;\n return (\n <div\n key={d}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.3rem\",\n paddingLeft: `${i * 10}px`,\n paddingTop: i > 0 ? \"0.1rem\" : undefined,\n }}\n >\n <span\n style={{\n fontSize: \"0.8rem\",\n height: \"0.6em\",\n width: \"0.6em\",\n overflow: \"hidden\",\n color: isCurrent ? DEVTOOL_COLOR_SEMANTIC_SYSTEM : \"#3730a3\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n ⬢\n </span>\n <span\n style={{\n color: isCurrent ? DEVTOOL_COLOR_SEMANTIC_SYSTEM : \"#4b5563\",\n fontSize: \"0.7rem\",\n fontWeight: isCurrent ? 500 : undefined,\n }}\n >\n {d}\n </span>\n </div>\n );\n })}\n </>\n );\n}\n\nexport function DomainChip({\n compact = false,\n subtle = false,\n domain,\n allDomains,\n size,\n}: {\n compact?: boolean;\n subtle?: boolean;\n domain: string;\n allDomains: string[];\n size?: ESize;\n}) {\n if (compact) {\n return (\n <Icon\n icon={Component}\n color={ESemanticThing.domain}\n tooltip={{\n content: <DomainHierarchyContent allDomains={allDomains} />,\n title: \"Action Domain\",\n align: \"edge\",\n }}\n />\n );\n }\n return (\n <Chip\n color={ESemanticThing.domain}\n subtle={subtle}\n size={size}\n rounded\n tooltip={{\n content: <DomainHierarchyContent allDomains={allDomains} />,\n title: \"Action Domain\",\n align: \"edge\",\n }}\n // style={{ display: \"flex\", alignItems: \"center\", gap: \"0.4em\" }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.4em\" }}>\n <span\n style={{\n height: \"1.2em\",\n width: \"1.2em\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <Component height={\"1.2em\"} width={\"1.2em\"} />\n </span>\n <span>{domain}</span>\n </div>\n </Chip>\n );\n}\n","import type { IDevtoolsActionEntry, IDevtoolsRouteItem } from \"../../core/ActionDevtools.types\";\r\nimport { DEVTOOL_COLOR_TEXT_MUTED, ESemanticThing } from \"../../core/devtools_colors\";\r\nimport { ESize } from \"../ui_util/size\";\r\nimport { Chip } from \"./Chip\";\r\nimport type { ITooltipConfig } from \"./Tooltip\";\r\n\r\nexport function getExternalLabel(hop: IDevtoolsRouteItem): string | null {\r\n if (hop.handlerType !== \"external\") return null;\r\n return hop.handlerClient != null\r\n ? `${hop.transport ?? \"ext\"} → ${hop.handlerClient.envId}`\r\n : `→ ${hop.transport ?? \"ext\"}`;\r\n}\r\n\r\n/**\r\n * Extended transport details (request/WebSocket endpoint) for the external handler — shown on hover\r\n * only, so the chip/label itself stays short.\r\n */\r\nexport function getTransportTooltip(hop: IDevtoolsRouteItem): ITooltipConfig | undefined {\r\n return getTransportTooltipForHops([hop]);\r\n}\r\n\r\n/**\r\n * Aggregate transport tooltip for a chip/label that represents one or more external hops (e.g. a\r\n * grouped child-dispatch chip that accumulates several transports for the same runtime).\r\n */\r\nexport function getTransportTooltipForHops(hops: IDevtoolsRouteItem[]): ITooltipConfig | undefined {\r\n const lines = hops\r\n .filter((hop) => hop.handlerType === \"external\")\r\n .map((hop) => ({ summary: hop.transportSummary, url: hop.transportUrl }))\r\n .filter((line) => line.summary != null || line.url != null);\r\n\r\n if (lines.length === 0) return undefined;\r\n\r\n return {\r\n title: \"Transport\",\r\n content: (\r\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"6px\", fontSize: \"11px\" }}>\r\n {lines.map((line) => (\r\n <div\r\n key={`${line.summary ?? \"\"}:${line.url ?? \"\"}`}\r\n style={{ display: \"flex\", flexDirection: \"column\", gap: \"2px\" }}\r\n >\r\n {line.summary != null && <span>{line.summary}</span>}\r\n {line.url != null && line.url !== line.summary && (\r\n <span style={{ color: DEVTOOL_COLOR_TEXT_MUTED, wordBreak: \"break-all\" }}>\r\n {line.url}\r\n </span>\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n ),\r\n };\r\n}\r\n\r\ninterface IHandlerChipsProps {\r\n entry: IDevtoolsActionEntry;\r\n size: ESize;\r\n subtle?: boolean;\r\n}\r\n\r\nexport function HandlerChips({ entry, size, subtle }: IHandlerChipsProps) {\r\n const firstHop = entry.meta.routing[0];\r\n const localEnvId = firstHop != null ? firstHop.runtime.envId : null;\r\n const externalLabel = firstHop != null ? getExternalLabel(firstHop) : null;\r\n const firstHopIsLocal = firstHop != null && firstHop.handlerType === \"local\";\r\n\r\n return (\r\n <>\r\n {localEnvId != null && (firstHopIsLocal || externalLabel == null) && (\r\n <Chip color={ESemanticThing.handler_local} size={size} subtle={subtle}>\r\n {localEnvId}\r\n </Chip>\r\n )}\r\n {externalLabel != null && (\r\n <Chip\r\n color={ESemanticThing.handler_external}\r\n size={size}\r\n subtle={subtle}\r\n tooltip={firstHop != null ? getTransportTooltip(firstHop) : undefined}\r\n >\r\n {externalLabel}\r\n </Chip>\r\n )}\r\n </>\r\n );\r\n}\r\n","import { Circle, CircleAlert, CircleCheck, CircleX, Loader2, type LucideIcon } from \"lucide-react\";\r\nimport type { IDevtoolsActionEntry, TDevtoolsActionStatus } from \"../../core/ActionDevtools.types\";\r\nimport {\r\n DEVTOOL_COLOR_SEMANTIC_ERROR,\r\n DEVTOOL_COLOR_SEMANTIC_METADATA,\r\n DEVTOOL_COLOR_SEMANTIC_SUCCESS,\r\n DEVTOOL_COLOR_SEMANTIC_SYSTEM,\r\n DEVTOOL_COLOR_SEMANTIC_WARNING,\r\n ESemanticThing,\r\n} from \"../../core/devtools_colors\";\r\n\r\n// Re-exported from the shared devtools package so existing imports from this\r\n// module keep working.\r\nexport { formatRelativeAge, formatTimestamp, safeStringify } from \"nice-devtools-shared\";\r\n\r\n// CSS colour strings for inline styles — resolved from the 5 semantic tokens.\r\nexport const STATUS_COLOR: Record<TDevtoolsActionStatus, string> = {\r\n running: DEVTOOL_COLOR_SEMANTIC_SYSTEM,\r\n success: DEVTOOL_COLOR_SEMANTIC_SUCCESS,\r\n \"action-error\": DEVTOOL_COLOR_SEMANTIC_WARNING,\r\n failed: DEVTOOL_COLOR_SEMANTIC_ERROR,\r\n aborted: DEVTOOL_COLOR_SEMANTIC_METADATA,\r\n};\r\n\r\n// ESemanticThing values for Chip / Icon components that resolve via SEMANTIC_COLORS.\r\nexport const STATUS_THING: Record<TDevtoolsActionStatus, ESemanticThing> = {\r\n running: ESemanticThing.running_action,\r\n success: ESemanticThing.success,\r\n \"action-error\": ESemanticThing.action_error,\r\n failed: ESemanticThing.failed,\r\n aborted: ESemanticThing.aborted,\r\n};\r\n\r\n// Text fallbacks — keep for tooltip prose only; prefer STATUS_ICON for visual indicators.\r\nexport const STATUS_SYMBOL: Record<TDevtoolsActionStatus, string> = {\r\n running: \"●\",\r\n success: \"✓\",\r\n \"action-error\": \"!\",\r\n failed: \"✗\",\r\n aborted: \"○\",\r\n};\r\n\r\nexport const STATUS_ICON: Record<TDevtoolsActionStatus, LucideIcon> = {\r\n running: Loader2,\r\n success: CircleCheck,\r\n \"action-error\": CircleAlert,\r\n failed: CircleX,\r\n aborted: Circle,\r\n};\r\n\r\n/**\r\n * The runtime an action *originated* on, when that differs from the runtime that handled it — i.e. an\r\n * inbound action received over a transport (a backend push, or an action relayed from another client),\r\n * rather than one dispatched locally. Returns `null` for locally-originated actions (where the origin\r\n * matches the handling runtime) and for actions with no known origin.\r\n */\r\nexport function getInboundOrigin(\r\n entry: IDevtoolsActionEntry,\r\n): { envId: string; perId?: string; insId?: string } | null {\r\n const origin = entry.meta.originClient;\r\n if (origin == null || origin.envId === \"unknown\" || origin.envId === \"_unset_\") return null;\r\n\r\n // The first routing hop's runtime is the one that received/handled the action locally.\r\n const local = entry.meta.routing[0]?.runtime;\r\n if (local == null) return null;\r\n\r\n const sameRuntime =\r\n origin.envId === local.envId &&\r\n (origin.perId ?? null) === (local.perId ?? null) &&\r\n (origin.insId ?? null) === (local.insId ?? null);\r\n\r\n return sameRuntime ? null : origin;\r\n}\r\n\r\nexport function formatDuration(entry: IDevtoolsActionEntry): string | null {\r\n return entry.endTime != null ? `${entry.endTime - entry.startTime}ms` : null;\r\n}\r\n","import { useEffect, useState } from \"react\";\nimport type { IDevtoolsActionEntry } from \"../../core/ActionDevtools.types\";\nimport { formatDuration } from \"./utils\";\n\nexport function RunningTimer({ startTime }: { startTime: number }) {\n const [elapsed, setElapsed] = useState(() => Date.now() - startTime);\n\n useEffect(() => {\n const interval = setInterval(() => setElapsed(Date.now() - startTime), 100);\n return () => clearInterval(interval);\n }, [startTime]);\n\n return <>{elapsed}ms</>;\n}\n\nexport function DurationDisplay({ entry }: { entry: IDevtoolsActionEntry }) {\n const d = formatDuration(entry);\n return <>{d ?? <RunningTimer startTime={entry.startTime} />}</>;\n}\n","import type { IDevtoolsActionEntry } from \"../../core/ActionDevtools.types\";\r\nimport {\r\n DEVTOOL_COLOR_CALL_STACK_DIVIDER,\r\n DEVTOOL_COLOR_HANDLER_EXTERNAL_TEXT,\r\n DEVTOOL_COLOR_HANDLER_LOCAL_TEXT,\r\n DEVTOOL_COLOR_SEMANTIC_SYSTEM,\r\n DEVTOOL_COLOR_TEXT_FAINT,\r\n DEVTOOL_COLOR_TEXT_SECONDARY,\r\n DEVTOOL_DETAIL_HEADER_BACKGROUND,\r\n DEVTOOL_SECTION_BACKGROUND,\r\n} from \"../../core/devtools_colors\";\r\nimport { ESize } from \"../ui_util/size\";\r\nimport { DomainChip } from \"./DomainChip\";\r\nimport { getExternalLabel, getTransportTooltip } from \"./HandlerChips\";\r\nimport { DurationDisplay } from \"./RunningTimer\";\r\nimport { HoverTooltip } from \"./Tooltip\";\r\nimport { STATUS_COLOR, STATUS_SYMBOL } from \"./utils\";\r\n\r\nfunction getCalledLabel(entry: IDevtoolsActionEntry): string {\r\n const firstHop = entry.meta.routing[0];\r\n if (firstHop == null) return \"↳ call\";\r\n if (firstHop.handlerType === \"local\") return \"↳ local\";\r\n const label = getExternalLabel(firstHop);\r\n return label != null ? `↳ ${label}` : \"↳ call\";\r\n}\r\n\r\nfunction getCalledColor(entry: IDevtoolsActionEntry): string {\r\n const firstHop = entry.meta.routing[0];\r\n if (firstHop == null) return DEVTOOL_COLOR_SEMANTIC_SYSTEM;\r\n if (firstHop.handlerType === \"local\") return DEVTOOL_COLOR_HANDLER_LOCAL_TEXT;\r\n return DEVTOOL_COLOR_HANDLER_EXTERNAL_TEXT;\r\n}\r\n\r\nfunction CallStackLink({\r\n entry,\r\n entryRole,\r\n isFocused,\r\n onClick,\r\n}: {\r\n entry: IDevtoolsActionEntry;\r\n entryRole: \"caller\" | \"called\";\r\n isFocused: boolean;\r\n onClick: () => void;\r\n}) {\r\n const color = STATUS_COLOR[entry.status];\r\n const symbol = STATUS_SYMBOL[entry.status];\r\n\r\n const labelColor = entryRole === \"caller\" ? DEVTOOL_COLOR_TEXT_SECONDARY : getCalledColor(entry);\r\n const label = entryRole === \"caller\" ? \"↑ from\" : getCalledLabel(entry);\r\n\r\n const firstHop = entry.meta.routing[0];\r\n const transportTooltip =\r\n entryRole === \"called\" && firstHop != null ? getTransportTooltip(firstHop) : undefined;\r\n\r\n return (\r\n <div\r\n onClick={onClick}\r\n style={{\r\n background: isFocused ? DEVTOOL_SECTION_BACKGROUND : DEVTOOL_DETAIL_HEADER_BACKGROUND,\r\n borderBottom: `1px solid ${DEVTOOL_COLOR_CALL_STACK_DIVIDER}`,\r\n borderLeft: isFocused\r\n ? `2px solid ${DEVTOOL_COLOR_SEMANTIC_SYSTEM}`\r\n : \"2px solid transparent\",\r\n padding: \"5px 12px 5px 10px\",\r\n display: \"grid\",\r\n gridTemplateColumns: \"1fr 1fr\",\r\n alignItems: \"center\",\r\n columnGap: \"6px\",\r\n cursor: \"pointer\",\r\n }}\r\n >\r\n {/* Status symbol + relationship hint */}\r\n <span style={{ display: \"flex\", alignItems: \"center\", gap: \"1em\", flexShrink: 0 }}>\r\n <span style={{ color, fontSize: \"10px\", flexShrink: 0 }}>{symbol}</span>\r\n <HoverTooltip config={transportTooltip} style={{ flexShrink: 0, display: \"flex\" }}>\r\n <span style={{ color: labelColor, fontSize: \"9px\" }}>{label}</span>\r\n </HoverTooltip>\r\n <span style={{ display: \"flex\", alignItems: \"center\", gap: \"5px\" }}>\r\n <span\r\n style={{\r\n color: DEVTOOL_COLOR_TEXT_SECONDARY,\r\n fontSize: \"11px\",\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n whiteSpace: \"nowrap\",\r\n }}\r\n >\r\n {entry.actionId}\r\n </span>\r\n <DomainChip domain={entry.domain} allDomains={entry.allDomains} size={ESize.sm} />\r\n </span>\r\n </span>\r\n\r\n {/* Duration */}\r\n <span\r\n style={{\r\n color: DEVTOOL_COLOR_TEXT_FAINT,\r\n fontSize: \"10px\",\r\n textAlign: \"right\",\r\n whiteSpace: \"nowrap\",\r\n }}\r\n >\r\n <DurationDisplay entry={entry} />\r\n </span>\r\n </div>\r\n );\r\n}\r\n\r\nexport function CallStackSection({\r\n parent,\r\n childEntries,\r\n focusedChildCuid,\r\n onFocusChild,\r\n onSelectParent,\r\n}: {\r\n parent: IDevtoolsActionEntry | null;\r\n childEntries: IDevtoolsActionEntry[];\r\n focusedChildCuid: string | null;\r\n onFocusChild: (cuid: string) => void;\r\n onSelectParent: (cuid: string) => void;\r\n}) {\r\n if (parent == null && childEntries.length === 0) return null;\r\n\r\n return (\r\n <div>\r\n {parent != null && (\r\n <CallStackLink\r\n entry={parent}\r\n entryRole=\"caller\"\r\n isFocused={false}\r\n onClick={() => onSelectParent(parent.cuid)}\r\n />\r\n )}\r\n {childEntries.map((child) => (\r\n <CallStackLink\r\n key={child.cuid}\r\n entry={child}\r\n entryRole=\"called\"\r\n isFocused={focusedChildCuid === child.cuid}\r\n onClick={() => onFocusChild(child.cuid)}\r\n />\r\n ))}\r\n </div>\r\n );\r\n}\r\n","import type { IDevtoolsRouteItem } from \"../../core/ActionDevtools.types\";\nimport { ESemanticThing } from \"../../core/devtools_colors\";\nimport { ESize } from \"../ui_util/size\";\nimport { Chip } from \"./Chip\";\nimport { getTransportTooltipForHops } from \"./HandlerChips\";\n\nexport function ChildDispatchChips({\n childRouteItems,\n size = ESize.sm,\n}: {\n childRouteItems?: IDevtoolsRouteItem[];\n size?: ESize;\n}) {\n if (childRouteItems == null || childRouteItems.length === 0) return null;\n\n // Group by external runtime (handlerClient.envId), accumulating transports + their hops\n const groups = new Map<\n string,\n { runtimeId: string; transports: string[]; hasClient: boolean; hops: IDevtoolsRouteItem[] }\n >();\n for (const item of childRouteItems) {\n const runtimeId = item.handlerClient?.envId ?? item.transport ?? \"ext\";\n const hasClient = item.handlerClient != null;\n if (!groups.has(runtimeId)) {\n groups.set(runtimeId, { runtimeId, transports: [], hasClient, hops: [] });\n }\n const group = groups.get(runtimeId)!;\n group.hops.push(item);\n const transport = item.transport;\n if (transport != null && !group.transports.includes(transport)) {\n group.transports.push(transport);\n }\n }\n\n return (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"4px\", flexWrap: \"wrap\" }}>\n {Array.from(groups.values()).map((group) => {\n const transportStr = group.transports.length > 0 ? group.transports.join(\", \") : \"ext\";\n const label = group.hasClient\n ? `${transportStr} → ${group.runtimeId}`\n : `→ ${transportStr}`;\n return (\n <Chip\n key={group.runtimeId}\n color={ESemanticThing.handler_external}\n size={size}\n tooltip={getTransportTooltipForHops(group.hops)}\n >\n {label}\n </Chip>\n );\n })}\n </div>\n );\n}\n","import { useState } from \"react\";\r\nimport type { IDevtoolsActionEntry } from \"../../core/ActionDevtools.types\";\r\nimport {\r\n DEVTOOL_COLOR_SEMANTIC_SYSTEM,\r\n DEVTOOL_COLOR_TEXT_FAINT,\r\n DEVTOOL_COLOR_TEXT_MUTED,\r\n DEVTOOL_COLOR_TEXT_SECONDARY,\r\n DEVTOOL_LIST_BASE_BACKGROUND,\r\n DEVTOOL_SECTION_BACKGROUND,\r\n} from \"../../core/devtools_colors\";\r\n\r\nfunction MetaChip({ label, value }: { label: string; value: string }) {\r\n return (\r\n <span style={{ whiteSpace: \"nowrap\" }}>\r\n <span style={{ color: DEVTOOL_COLOR_TEXT_MUTED }}>{label} </span>\r\n <span style={{ color: DEVTOOL_COLOR_TEXT_SECONDARY }}>{value}</span>\r\n </span>\r\n );\r\n}\r\n\r\nexport function MetaSection({ entry }: { entry: IDevtoolsActionEntry }) {\r\n const [expanded, setExpanded] = useState(false);\r\n const { meta, cuid } = entry;\r\n\r\n const expandedRows: { label: string; value: string }[] = [\r\n { label: \"cuid\", value: cuid },\r\n { label: \"runtime\", value: meta.originClient.envId },\r\n ...(meta.originClient.perId != null\r\n ? [{ label: \"perId\", value: meta.originClient.perId }]\r\n : []),\r\n ...(meta.originClient.insId != null\r\n ? [{ label: \"insId\", value: meta.originClient.insId }]\r\n : []),\r\n ];\r\n\r\n return (\r\n <div>\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n marginBottom: \"3px\",\r\n }}\r\n >\r\n <div\r\n style={{\r\n color: DEVTOOL_COLOR_SEMANTIC_SYSTEM,\r\n fontSize: \"10px\",\r\n textTransform: \"uppercase\",\r\n letterSpacing: \"0.05em\",\r\n }}\r\n >\r\n Meta\r\n </div>\r\n <span style={{ color: DEVTOOL_COLOR_TEXT_FAINT, fontSize: \"11px\" }}>\r\n {expanded ? \"▾\" : \"▸\"}\r\n </span>\r\n </div>\r\n {expanded ? (\r\n <div\r\n onClick={() => setExpanded(false)}\r\n style={{\r\n background: DEVTOOL_SECTION_BACKGROUND,\r\n borderRadius: \"4px\",\r\n overflow: \"hidden\",\r\n cursor: \"pointer\",\r\n }}\r\n >\r\n {expandedRows.map(({ label, value }, i) => (\r\n <div\r\n key={label}\r\n style={{\r\n display: \"grid\",\r\n gridTemplateColumns: \"52px 1fr\",\r\n columnGap: \"8px\",\r\n padding: \"4px 8px\",\r\n borderBottom:\r\n i < expandedRows.length - 1\r\n ? `1px solid ${DEVTOOL_LIST_BASE_BACKGROUND}`\r\n : \"none\",\r\n alignItems: \"start\",\r\n }}\r\n >\r\n <span\r\n style={{\r\n textAlign: \"left\",\r\n color: DEVTOOL_COLOR_TEXT_MUTED,\r\n fontSize: \"10px\",\r\n paddingTop: \"1px\",\r\n }}\r\n >\r\n {label}\r\n </span>\r\n <span\r\n style={{\r\n textAlign: \"left\",\r\n color: DEVTOOL_COLOR_TEXT_SECONDARY,\r\n fontSize: \"11px\",\r\n wordBreak: \"break-all\",\r\n }}\r\n >\r\n {value}\r\n </span>\r\n </div>\r\n ))}\r\n </div>\r\n ) : (\r\n <div\r\n onClick={() => setExpanded(true)}\r\n style={{\r\n background: DEVTOOL_SECTION_BACKGROUND,\r\n borderRadius: \"4px\",\r\n padding: \"5px 8px\",\r\n fontSize: \"11px\",\r\n display: \"flex\",\r\n gap: \"10px\",\r\n rowGap: \"2px\",\r\n flexWrap: \"wrap\",\r\n cursor: \"pointer\",\r\n }}\r\n >\r\n <MetaChip label=\"cuid\" value={`…${cuid.slice(-8)}`} />\r\n <MetaChip label=\"runtime\" value={meta.originClient.envId} />\r\n {meta.originClient.perId != null && (\r\n <MetaChip\r\n label=\"perId\"\r\n value={\r\n meta.originClient.perId.length > 10\r\n ? `${meta.originClient.perId.slice(0, 10)}…`\r\n : meta.originClient.perId\r\n }\r\n />\r\n )}\r\n {meta.originClient.insId != null && (\r\n <MetaChip\r\n label=\"insId\"\r\n value={\r\n meta.originClient.insId.length > 10\r\n ? `${meta.originClient.insId.slice(0, 10)}…`\r\n : meta.originClient.insId\r\n }\r\n />\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { ESemanticThing } from \"../../core/devtools_colors\";\nimport { ESize } from \"../ui_util/size\";\nimport { Chip } from \"./Chip\";\n\n/**\n * Marks an action that was received from another runtime (a backend push, or an action relayed from\n * another client) rather than dispatched locally. The chip shows the origin's `envId`; the tooltip\n * carries the full coordinate. Render it only when {@link getInboundOrigin} returns a value.\n */\nexport function OriginChip({\n origin,\n size = ESize.md,\n subtle,\n}: {\n origin: { envId: string; perId?: string; insId?: string };\n size?: ESize;\n subtle?: boolean;\n}) {\n return (\n <Chip\n color={ESemanticThing.origin}\n size={size}\n subtle={subtle}\n tooltip={{\n title: \"Received from\",\n content: (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"2px\", fontSize: \"11px\" }}>\n <span>env {origin.envId}</span>\n {origin.perId != null && <span>perId {origin.perId}</span>}\n {origin.insId != null && <span>insId {origin.insId}</span>}\n </div>\n ),\n }}\n >\n {`⇠ ${origin.envId}`}\n </Chip>\n );\n}\n","import type { IDevtoolsActionEntry } from \"../../core/ActionDevtools.types\";\r\nimport {\r\n DEVTOOL_COLOR_SEMANTIC_SUCCESS,\r\n DEVTOOL_COLOR_SEMANTIC_WARNING,\r\n DEVTOOL_COLOR_TEXT_FAINT,\r\n DEVTOOL_COLOR_TEXT_MUTED,\r\n DEVTOOL_COLOR_TEXT_SECONDARY,\r\n DEVTOOL_LIST_BASE_BACKGROUND,\r\n DEVTOOL_SECTION_BACKGROUND,\r\n} from \"../../core/devtools_colors\";\r\nimport { getTransportTooltip } from \"./HandlerChips\";\r\nimport { SectionLabel } from \"./SectionLabel\";\r\nimport { HoverTooltip } from \"./Tooltip\";\r\n\r\nexport function RoutingSection({\r\n entry,\r\n minHopCount = 0,\r\n}: {\r\n entry: IDevtoolsActionEntry;\r\n minHopCount?: number;\r\n}) {\r\n const { meta, startTime } = entry;\r\n const hopCount = meta.routing.length;\r\n const phantomCount = Math.max(0, minHopCount - hopCount);\r\n\r\n if (hopCount === 0 && phantomCount === 0) return null;\r\n\r\n return (\r\n <div>\r\n <SectionLabel\r\n label={hopCount > 0 ? `Routing · ${hopCount} hop${hopCount !== 1 ? \"s\" : \"\"}` : \"Routing\"}\r\n />\r\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"2px\" }}>\r\n {meta.routing.map((hop, i) => {\r\n const isLocal = hop.handlerType === \"local\";\r\n const isLast = i === hopCount - 1 && phantomCount === 0;\r\n const badgeColor = isLocal\r\n ? DEVTOOL_COLOR_SEMANTIC_SUCCESS\r\n : DEVTOOL_COLOR_SEMANTIC_WARNING;\r\n const badgeText = isLocal\r\n ? \"● exec\"\r\n : `→ ${hop.transportSummary ?? hop.transport ?? \"ext\"}`;\r\n const transportTooltip = isLocal ? undefined : getTransportTooltip(hop);\r\n const runtimeTitle =\r\n [hop.runtime.perId, hop.runtime.insId].filter(Boolean).join(\" · \") || undefined;\r\n\r\n return (\r\n <div\r\n key={`${hop.time}-${hop.runtime.envId}`}\r\n style={{\r\n background: DEVTOOL_SECTION_BACKGROUND,\r\n borderRadius: \"4px\",\r\n overflow: \"hidden\",\r\n display: \"grid\",\r\n gridTemplateColumns: \"30% 1fr 30%\",\r\n alignItems: \"center\",\r\n columnGap: \"8px\",\r\n borderBottom: isLast ? undefined : `1px solid ${DEVTOOL_LIST_BASE_BACKGROUND}`,\r\n padding: \"4px 8px\",\r\n }}\r\n >\r\n <span\r\n style={{ display: \"flex\", flexDirection: \"row\", alignItems: \"center\", gap: \"10px\" }}\r\n >\r\n <span\r\n style={{\r\n color: DEVTOOL_COLOR_TEXT_FAINT,\r\n fontSize: \"10px\",\r\n width: \"16px\",\r\n textAlign: \"right\",\r\n }}\r\n >\r\n {i + 1}\r\n </span>\r\n <span\r\n title={runtimeTitle}\r\n style={{\r\n color: DEVTOOL_COLOR_TEXT_SECONDARY,\r\n fontSize: \"11px\",\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n whiteSpace: \"nowrap\",\r\n textAlign: \"center\",\r\n }}\r\n >\r\n {hop.runtime.envId}\r\n </span>\r\n </span>\r\n <HoverTooltip\r\n config={transportTooltip}\r\n style={{ display: \"block\", minWidth: 0, overflow: \"hidden\" }}\r\n >\r\n <span\r\n style={{\r\n color: badgeColor,\r\n fontSize: \"10px\",\r\n whiteSpace: \"nowrap\",\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n display: \"block\",\r\n }}\r\n >\r\n {badgeText}\r\n </span>\r\n </HoverTooltip>\r\n <span\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n paddingRight: \"8px\",\r\n overflow: \"hidden\",\r\n }}\r\n >\r\n <span\r\n style={{\r\n color: DEVTOOL_COLOR_TEXT_MUTED,\r\n fontSize: \"10px\",\r\n whiteSpace: \"nowrap\",\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n }}\r\n >\r\n {hop.handlerClient != null ? `↳ ${hop.handlerClient.envId}` : \"\"}\r\n </span>\r\n <span\r\n style={{\r\n color: DEVTOOL_COLOR_TEXT_FAINT,\r\n fontSize: \"10px\",\r\n flexShrink: 0,\r\n marginLeft: \"auto\",\r\n }}\r\n >\r\n +{hop.time - startTime}ms\r\n </span>\r\n </span>\r\n </div>\r\n );\r\n })}\r\n {Array.from({ length: phantomCount }, (_, i) => `routing-phantom-${hopCount + i}`).map(\r\n (key) => (\r\n <div\r\n key={key}\r\n aria-hidden=\"true\"\r\n style={{\r\n visibility: \"hidden\",\r\n background: DEVTOOL_SECTION_BACKGROUND,\r\n borderRadius: \"4px\",\r\n display: \"grid\",\r\n gridTemplateColumns: \"30% 1fr 30%\",\r\n alignItems: \"center\",\r\n columnGap: \"8px\",\r\n padding: \"4px 8px\",\r\n }}\r\n >\r\n <span\r\n style={{ display: \"flex\", flexDirection: \"row\", alignItems: \"center\", gap: \"10px\" }}\r\n >\r\n <span style={{ fontSize: \"10px\", width: \"16px\" }}>0</span>\r\n <span style={{ fontSize: \"11px\" }}>placeholder</span>\r\n </span>\r\n <span style={{ fontSize: \"10px\" }}>placeholder</span>\r\n <span />\r\n </div>\r\n ),\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { useMemo, useState } from \"react\";\nimport type {\n IDevtoolsActionEntry,\n IDevtoolsRouteItem,\n TDevtoolsActionStatus,\n} from \"../../../core/ActionDevtools.types\";\nimport {\n DEVTOOL_COLOR_SEMANTIC_ERROR,\n DEVTOOL_COLOR_SEMANTIC_METADATA,\n DEVTOOL_COLOR_SEMANTIC_SUCCESS,\n DEVTOOL_COLOR_TEXT_EMPHASIS,\n DEVTOOL_COLOR_TEXT_SECONDARY,\n DEVTOOL_DETAIL_BASE_BACKGROUND,\n DEVTOOL_DETAIL_HEADER_BACKGROUND,\n DEVTOOL_LIST_BASE_BACKGROUND,\n DEVTOOL_SECTION_BACKGROUND,\n} from \"../../../core/devtools_colors\";\nimport { ESize } from \"../../ui_util/size\";\nimport { ActionErrorDisplay } from \"../ActionErrorDisplay\";\nimport { CallStackSection } from \"../CallStackSection\";\nimport { ChildDispatchChips } from \"../ChildDispatchChips\";\nimport { DetailSection } from \"../DetailSection\";\nimport { DomainChip } from \"../DomainChip\";\nimport { HandlerChips } from \"../HandlerChips\";\nimport { MetaSection } from \"../MetaSection\";\nimport { OriginChip } from \"../OriginChip\";\nimport { RoutingSection } from \"../RoutingSection\";\nimport { DurationDisplay } from \"../RunningTimer\";\nimport { countUserFrames, StackTraceSection } from \"../StackTraceSection\";\nimport { formatTimestamp, getInboundOrigin, STATUS_COLOR, STATUS_ICON } from \"../utils\";\n\nconst STATUS_BADGE_LABEL: Record<TDevtoolsActionStatus, string> = {\n running: \"RUNNING\",\n success: \"SUCCESS\",\n \"action-error\": \"ERROR\",\n failed: \"FAILED\",\n aborted: \"ABORTED\",\n};\n\n// Both action-error and failed are critical — use Error Red so the badge always\n// signals danger consistently, regardless of the underlying status sub-type.\nconst STATUS_BADGE_BG: Record<TDevtoolsActionStatus, string> = {\n running: STATUS_COLOR.running,\n success: STATUS_COLOR.success,\n \"action-error\": DEVTOOL_COLOR_SEMANTIC_ERROR,\n failed: DEVTOOL_COLOR_SEMANTIC_ERROR,\n aborted: DEVTOOL_COLOR_SEMANTIC_METADATA,\n};\n\nconst STATUS_BADGE_TEXT_COLOR: Record<TDevtoolsActionStatus, string> = {\n running: \"#0f172a\",\n success: \"#0f172a\",\n \"action-error\": \"#ffffff\",\n failed: \"#ffffff\",\n aborted: \"#0f172a\",\n};\n\nfunction DetailHeader({\n entry,\n isActive,\n onClick,\n childExternalRouteItems,\n}: {\n entry: IDevtoolsActionEntry;\n isActive: boolean;\n onClick: () => void;\n childExternalRouteItems?: IDevtoolsRouteItem[];\n}) {\n const color = STATUS_COLOR[entry.status];\n const StatusIconComponent = STATUS_ICON[entry.status];\n const timestamp = formatTimestamp(entry.startTime);\n const inboundOrigin = getInboundOrigin(entry);\n\n return (\n <div\n onClick={!isActive ? onClick : undefined}\n style={{\n padding: \"0.5em 1em\",\n background: isActive ? DEVTOOL_SECTION_BACKGROUND : DEVTOOL_DETAIL_HEADER_BACKGROUND,\n borderBottom: `1px solid ${DEVTOOL_LIST_BASE_BACKGROUND}`,\n borderLeft: isActive ? `2px solid ${color}` : \"2px solid transparent\",\n flexShrink: 0,\n flexDirection: \"row\",\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: \"1em\",\n cursor: isActive ? \"default\" : \"pointer\",\n }}\n >\n <div style={{ flex: 1, minWidth: 0, display: \"flex\", flexDirection: \"column\", gap: \"0.5em\" }}>\n <div style={{ display: \"flex\", alignItems: \"center\", minWidth: 0, gap: \"0.5em\" }}>\n <span\n style={{\n color,\n flexShrink: 0,\n display: \"flex\",\n alignItems: \"center\",\n animation:\n entry.status === \"running\"\n ? \"__nice-action-pulse 1.2s ease-in-out infinite\"\n : undefined,\n }}\n >\n <StatusIconComponent size={20} strokeWidth={1.75} />\n </span>\n <span\n style={{\n color: DEVTOOL_COLOR_TEXT_EMPHASIS,\n fontSize: \"1.2em\",\n fontWeight: \"600\",\n fontFamily: \"ui-monospace, 'Cascadia Code', 'Source Code Pro', monospace\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n flexShrink: 1,\n minWidth: \"2.5em\",\n }}\n >\n {entry.actionId}\n </span>\n {/* Status pill badge */}\n <span\n style={{\n flexShrink: 0,\n padding: \"2px 9px\",\n borderRadius: \"999px\",\n background: STATUS_BADGE_BG[entry.status],\n color: STATUS_BADGE_TEXT_COLOR[entry.status],\n fontSize: \"9px\",\n fontWeight: \"700\",\n letterSpacing: \"0.1em\",\n textTransform: \"uppercase\",\n fontFamily: \"ui-sans-serif, system-ui, sans-serif\",\n }}\n >\n {STATUS_BADGE_LABEL[entry.status]}\n </span>\n <DomainChip domain={entry.domain} allDomains={entry.allDomains} size={ESize.md} />\n </div>\n\n {/* Handler chips | timestamp + duration */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: \"8px\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n minWidth: 0,\n overflow: \"hidden\",\n }}\n >\n {inboundOrigin != null && <OriginChip origin={inboundOrigin} size={ESize.md} />}\n <HandlerChips entry={entry} size={ESize.md} />\n <ChildDispatchChips childRouteItems={childExternalRouteItems} size={ESize.md} />\n </div>\n\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"8px\", flexShrink: 0 }}>\n <span\n style={{\n color: DEVTOOL_COLOR_SEMANTIC_METADATA,\n fontSize: \"10px\",\n letterSpacing: \"0.02em\",\n fontFamily: \"ui-sans-serif, system-ui, sans-serif\",\n }}\n >\n {timestamp}\n </span>\n <span style={{ color, fontSize: \"12px\", fontWeight: \"500\" }}>\n <DurationDisplay entry={entry} />\n </span>\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nexport function ActionDetailPanel({\n entry,\n parent,\n childEntries,\n onSelectEntry,\n}: {\n entry: IDevtoolsActionEntry;\n parent: IDevtoolsActionEntry | null;\n childEntries: IDevtoolsActionEntry[];\n onSelectEntry: (cuid: string) => void;\n}) {\n const [focusedChildCuid, setFocusedChildCuid] = useState<string | null>(null);\n\n const focusedEntry =\n focusedChildCuid != null\n ? (childEntries.find((e) => e.cuid === focusedChildCuid) ?? entry)\n : entry;\n\n const maxRoutingHops = Math.max(\n entry.meta.routing.length,\n ...childEntries.map((e) => e.meta.routing.length),\n 0,\n );\n\n const maxCallSiteFrames = Math.max(\n countUserFrames(entry.meta.originClient, entry.callSite),\n ...childEntries.map((e) => countUserFrames(e.meta.originClient, e.callSite)),\n 0,\n );\n\n const childExternalRouteItems = useMemo(() => {\n const seen = new Set<string>();\n const result: IDevtoolsRouteItem[] = [];\n for (const child of childEntries) {\n const firstHop = child.meta.routing[0];\n if (firstHop == null || firstHop.handlerType !== \"external\") continue;\n const key = `${firstHop.handlerClient?.envId ?? \"\"}:${firstHop.transport ?? \"\"}`;\n if (seen.has(key)) continue;\n seen.add(key);\n result.push(firstHop);\n }\n return result;\n }, [childEntries]);\n\n const handleFocusChild = (cuid: string) => {\n setFocusedChildCuid((prev) => (prev === cuid ? null : cuid));\n };\n\n return (\n <div\n style={{\n flex: 1,\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n minHeight: 0,\n background: DEVTOOL_DETAIL_BASE_BACKGROUND,\n }}\n >\n <DetailHeader\n entry={entry}\n isActive={focusedChildCuid === null}\n onClick={() => setFocusedChildCuid(null)}\n childExternalRouteItems={childExternalRouteItems}\n />\n <CallStackSection\n parent={parent}\n childEntries={childEntries}\n focusedChildCuid={focusedChildCuid}\n onFocusChild={handleFocusChild}\n onSelectParent={onSelectEntry}\n />\n <div\n style={{\n flex: 1,\n overflowY: \"auto\",\n minHeight: 0,\n padding: \"10px 12px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"8px\",\n }}\n >\n {focusedEntry.input !== undefined ? (\n <DetailSection label=\"Input\" value={focusedEntry.input} />\n ) : (\n <DetailSection label=\"Input\" value={\"No input required or given\"} />\n )}\n {focusedEntry.status === \"success\" && (\n <DetailSection\n label=\"Output\"\n value={focusedEntry.output}\n color={DEVTOOL_COLOR_SEMANTIC_SUCCESS}\n />\n )}\n {(focusedEntry.status === \"action-error\" ||\n focusedEntry.status === \"failed\" ||\n focusedEntry.status === \"aborted\") && <ActionErrorDisplay entry={focusedEntry} />}\n {focusedEntry.progressUpdates.length > 0 && (\n <DetailSection\n label={`Progress (${focusedEntry.progressUpdates.length})`}\n value={focusedEntry.progressUpdates}\n />\n )}\n <StackTraceSection\n runtime={entry.meta.originClient}\n label=\"Dispatch Site\"\n stack={focusedEntry.callSite}\n color={DEVTOOL_COLOR_TEXT_SECONDARY}\n minFrameCount={maxCallSiteFrames}\n />\n <RoutingSection entry={focusedEntry} minHopCount={maxRoutingHops} />\n <MetaSection entry={focusedEntry} />\n </div>\n </div>\n );\n}\n","import { renderColoredJson, safeStringify } from \"nice-devtools-shared\";\r\n\r\nfunction stripOuterBraces(json: string): string {\r\n const lines = json.split(\"\\n\");\r\n if (lines.length > 2 && lines[0] === \"{\" && lines[lines.length - 1] === \"}\") {\r\n return lines\r\n .slice(1, -1)\r\n .map((l) => l.slice(2))\r\n .join(\"\\n\");\r\n }\r\n return json;\r\n}\r\n\r\nexport function IoTooltipContent({ value }: { value: unknown }) {\r\n const text = stripOuterBraces(safeStringify(value, 2));\r\n return (\r\n <div\r\n style={{\r\n fontFamily: \"ui-monospace, 'Cascadia Code', 'Source Code Pro', monospace\",\r\n fontSize: \"10px\",\r\n whiteSpace: \"pre-wrap\",\r\n wordBreak: \"break-all\",\r\n lineHeight: \"1.5\",\r\n textAlign: \"left\",\r\n }}\r\n >\r\n {renderColoredJson(text)}\r\n </div>\r\n );\r\n}\r\n","import { CircleX, PackageCheck, Sparkle, Sprout, Variable } from \"lucide-react\";\nimport { useState } from \"react\";\nimport type { IDevtoolsActionEntry } from \"../../../core/ActionDevtools.types\";\nimport { DEVTOOL_COLOR_TEXT_MUTED, ESemanticThing } from \"../../../core/devtools_colors\";\nimport { ESize, getSizeValue } from \"../../ui_util/size\";\nimport { ActionErrorDisplay } from \"../ActionErrorDisplay\";\nimport { Chip } from \"../Chip\";\nimport { getExternalLabel, getTransportTooltip } from \"../HandlerChips\";\nimport { Icon } from \"../Icon\";\nimport { Tooltip } from \"../Tooltip\";\nimport { EBreakGroupReason } from \"./action_list.types\";\nimport { IoTooltipContent } from \"./IoTooltipContent\";\n\ninterface IActionInputAndOutputChipProps {\n entry: IDevtoolsActionEntry;\n breakReasons: EBreakGroupReason[];\n subtle?: boolean;\n size?: ESize;\n}\n\nexport const ActionInputAndOutputChip = ({\n entry,\n breakReasons,\n subtle,\n size = ESize.md,\n}: IActionInputAndOutputChipProps) => {\n const firstHop = entry.meta.routing[0];\n const localEnvId = firstHop != null ? firstHop.runtime.envId : null;\n const externalLabel = firstHop != null ? getExternalLabel(firstHop) : null;\n const firstHopIsLocal = firstHop != null && firstHop.handlerType === \"local\";\n const isLocal = localEnvId != null && (firstHopIsLocal || externalLabel == null);\n const color = isLocal ? ESemanticThing.handler_local : ESemanticThing.handler_external;\n\n const transportTooltip = firstHop != null ? getTransportTooltip(firstHop) : undefined;\n const [labelAnchor, setLabelAnchor] = useState<DOMRect | null>(null);\n\n const isNewInput = breakReasons.includes(EBreakGroupReason.new_input);\n const isNewOutput = breakReasons.includes(EBreakGroupReason.new_output);\n const hasError = entry.error != null || entry.abortReason != null;\n\n const sizeNum = getSizeValue(size);\n const newIconSizeEm = `${sizeNum * 0.9}em`; // visually tuned\n\n const label = `${(isLocal ? localEnvId : externalLabel) ?? \"unknown\"}`;\n\n const newSparkleComp = (\n <div\n style={{\n opacity: 0.9,\n alignSelf: \"start\",\n marginLeft: \"-0.6em\",\n }}\n >\n <Sparkle\n strokeWidth={\"0.2em\"}\n color={\"rgba(243, 250, 140, 1)\"}\n width={newIconSizeEm}\n height={newIconSizeEm}\n />\n </div>\n );\n\n return (\n <Chip color={color} size={size} subtle={subtle}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.4em\" }}>\n <Icon\n noBackground\n icon={Variable}\n color={color}\n subtle={subtle || entry.input === undefined}\n tooltip={{\n content:\n entry.input !== undefined ? (\n <IoTooltipContent value={entry.input} />\n ) : (\n <span style={{ color: DEVTOOL_COLOR_TEXT_MUTED, fontSize: \"10px\" }}>\n No input required or given\n </span>\n ),\n title: isNewInput ? \"New Input\" : \"Input\",\n }}\n />\n {isNewInput && newSparkleComp}\n <span style={{ opacity: 0.6 }} color={color}>\n →\n </span>\n <span\n title={transportTooltip == null ? label : undefined}\n style={{\n opacity: 0.8,\n cursor: transportTooltip != null ? \"default\" : undefined,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n maxWidth: \"14ch\",\n }}\n onMouseEnter={\n transportTooltip != null\n ? (e) => setLabelAnchor(e.currentTarget.getBoundingClientRect())\n : undefined\n }\n onMouseLeave={transportTooltip != null ? () => setLabelAnchor(null) : undefined}\n >\n {label}\n </span>\n {labelAnchor != null && transportTooltip != null && (\n <Tooltip anchor={labelAnchor} config={transportTooltip} />\n )}\n <span style={{ opacity: 0.6 }} color={color}>\n →\n </span>\n {entry.status === \"success\" && entry.output !== undefined && (\n <Icon\n noBackground\n icon={PackageCheck}\n color={!hasError ? color : ESemanticThing.default}\n tooltip={{\n content: <IoTooltipContent value={entry.output} />,\n title: isNewOutput ? \"New Output\" : \"Output\",\n }}\n />\n )}\n {(entry.error != null || entry.abortReason != null) && (\n <Icon\n noBackground\n icon={CircleX}\n color={entry.status === \"aborted\" ? ESemanticThing.aborted : ESemanticThing.error}\n tooltip={{\n content: <ActionErrorDisplay entry={entry} compact />,\n title: entry.status === \"aborted\" ? \"Aborted\" : \"Error\",\n maxWidth: 340,\n }}\n />\n )}\n {isNewOutput && newSparkleComp}\n </div>\n </Chip>\n );\n};\n","import { CircleX, PackageCheck, Variable } from \"lucide-react\";\nimport { Fragment, useState } from \"react\";\nimport type {\n IDevtoolsActionEntry,\n TDevtoolsActionStatus,\n} from \"../../../core/ActionDevtools.types\";\nimport {\n DEVTOOL_COLOR_SEMANTIC_METADATA,\n DEVTOOL_COLOR_SEMANTIC_WARNING,\n DEVTOOL_COLOR_TEXT_MUTED,\n DEVTOOL_COLOR_TEXT_SECONDARY,\n DEVTOOL_LIST_HEADER_SELECTED_BACKGROUND,\n DEVTOOL_PANEL_BORDER,\n DEVTOOL_SECTION_BACKGROUND,\n ESemanticThing,\n} from \"../../../core/devtools_colors\";\nimport { ESize } from \"../../ui_util/size\";\nimport { ActionErrorDisplay } from \"../ActionErrorDisplay\";\nimport { Chip } from \"../Chip\";\nimport { HandlerChips } from \"../HandlerChips\";\nimport { Icon } from \"../Icon\";\nimport { OriginChip } from \"../OriginChip\";\nimport { DurationDisplay } from \"../RunningTimer\";\nimport { Tooltip } from \"../Tooltip\";\nimport {\n formatRelativeAge,\n formatTimestamp,\n getInboundOrigin,\n STATUS_COLOR,\n STATUS_SYMBOL,\n} from \"../utils\";\nimport { ActionInputAndOutputChip } from \"./ActionInputAndOutputChip\";\nimport { EBreakGroupReason } from \"./action_list.types\";\nimport { IoTooltipContent } from \"./IoTooltipContent\";\n\n// Max group dots to render before collapsing the rest into a \"+ X\" indicator.\nconst MAX_GROUP_DOTS = 5;\n\nfunction getLatestChipColor(status: TDevtoolsActionStatus): ESemanticThing {\n if (status === \"failed\") return ESemanticThing.failed;\n if (status === \"action-error\") return ESemanticThing.action_error;\n if (status === \"aborted\") return ESemanticThing.aborted;\n return ESemanticThing.success;\n}\n\n// ─── Group dot + tooltip ──────────────────────────────────────────────────────\n\nfunction GroupDotTooltip({\n entry,\n index,\n total,\n refTime,\n dotColor,\n anchor,\n}: {\n entry: IDevtoolsActionEntry;\n index: number;\n total: number;\n refTime: number;\n dotColor: string;\n anchor: DOMRect;\n}) {\n const symbol = STATUS_SYMBOL[entry.status];\n const deltaMs = refTime - entry.startTime;\n const relStr = index === 0 ? \"latest run\" : `−${formatRelativeAge(deltaMs)} from latest`;\n const durationStr = entry.endTime != null ? `${entry.endTime - entry.startTime}ms` : \"running…\";\n\n return (\n <Tooltip\n anchor={anchor}\n config={{\n align: \"center\",\n maxWidth: 240,\n content: (\n <>\n <div style={{ color: dotColor, marginBottom: \"1px\" }}>\n {symbol} run {index + 1} of {total}\n </div>\n <div style={{ color: DEVTOOL_COLOR_TEXT_SECONDARY }}>\n {formatTimestamp(entry.startTime)}\n </div>\n <div style={{ color: DEVTOOL_COLOR_TEXT_MUTED }}>{durationStr}</div>\n {index > 0 && (\n <div\n style={{\n color: DEVTOOL_COLOR_TEXT_MUTED,\n marginTop: \"3px\",\n paddingTop: \"3px\",\n borderTop: `1px solid ${DEVTOOL_SECTION_BACKGROUND}`,\n }}\n >\n {relStr}\n </div>\n )}\n </>\n ),\n }}\n />\n );\n}\n\nfunction GroupDot({\n entry,\n index,\n total,\n refTime,\n isActive,\n onSelect,\n}: {\n entry: IDevtoolsActionEntry;\n index: number;\n total: number;\n refTime: number;\n isActive: boolean;\n onSelect: () => void;\n}) {\n const [anchor, setAnchor] = useState<DOMRect | null>(null);\n const dotColor = STATUS_COLOR[entry.status];\n const hovered = anchor != null;\n\n return (\n <>\n <button\n data-cuid={entry.cuid}\n onClick={(e) => {\n e.stopPropagation();\n onSelect();\n }}\n onMouseEnter={(e) => setAnchor(e.currentTarget.getBoundingClientRect())}\n onMouseLeave={() => setAnchor(null)}\n style={{\n width: \"9px\",\n height: \"9px\",\n borderRadius: \"50%\",\n border: isActive\n ? `2px solid ${dotColor}`\n : hovered\n ? `1px solid ${dotColor}99`\n : \"1px solid transparent\",\n background: isActive ? \"transparent\" : dotColor,\n cursor: \"pointer\",\n padding: 0,\n flexShrink: 0,\n opacity: isActive ? 1 : hovered ? 0.8 : 0.35,\n transform: hovered ? \"scale(1.55)\" : \"scale(1)\",\n transition: \"transform 0.1s ease, opacity 0.1s ease, border-color 0.1s ease\",\n }}\n />\n {hovered && anchor != null && (\n <GroupDotTooltip\n entry={entry}\n index={index}\n total={total}\n refTime={refTime}\n dotColor={dotColor}\n anchor={anchor}\n />\n )}\n </>\n );\n}\n\n// ─── Main row ─────────────────────────────────────────────────────────────────\n\nexport function ActionEntryRow({\n entry,\n isSelected,\n onClick,\n isLatest = false,\n latestTime,\n childEntries,\n breakReasons,\n groupEntries,\n selectedGroupCuid,\n onSelectGroupEntry,\n}: {\n entry: IDevtoolsActionEntry;\n isSelected: boolean;\n onClick: () => void;\n isLatest?: boolean;\n latestTime?: number;\n childEntries?: IDevtoolsActionEntry[];\n breakReasons: EBreakGroupReason[];\n groupEntries?: IDevtoolsActionEntry[];\n selectedGroupCuid?: string | null;\n onSelectGroupEntry?: (cuid: string) => void;\n}) {\n const timestamp = formatTimestamp(entry.startTime);\n const hasGroup = groupEntries != null && groupEntries.length > 1;\n const inboundOrigin = getInboundOrigin(entry);\n\n // The bottom section surfaces cross-runtime usage only — child actions that were handled on a\n // *different* runtime (external handlers with their transports). Children handled on the local\n // runtime are intentionally omitted here; their local-runtime chip shows on the top section and in\n // the detail panel instead.\n const externalChildEntries =\n childEntries?.filter((child) => child.meta.routing[0]?.handlerType === \"external\") ?? [];\n\n const nonIoBreakReasons =\n breakReasons?.filter(\n (r) => r !== EBreakGroupReason.new_input && r !== EBreakGroupReason.new_output,\n ) ?? [];\n\n const hasBottomError = entry.error != null || entry.abortReason != null;\n\n const hasBottomContent = externalChildEntries.length > 0 || nonIoBreakReasons.length > 0;\n\n return (\n <div\n data-cuid={entry.cuid}\n onClick={onClick}\n style={{\n position: \"relative\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"5px\",\n padding: \"0.5em 0.6em\",\n cursor: \"pointer\",\n background: isSelected ? DEVTOOL_LIST_HEADER_SELECTED_BACKGROUND : \"transparent\",\n border: `1px solid ${DEVTOOL_PANEL_BORDER}`,\n borderLeft: isSelected\n ? `2px solid ${STATUS_COLOR[entry.status]}`\n : entry.status === \"failed\" || entry.status === \"action-error\"\n ? `2px solid ${STATUS_COLOR[entry.status]}55`\n : `2px solid ${DEVTOOL_PANEL_BORDER}`,\n borderRadius: \"3px\",\n margin: \"2px 4px\",\n }}\n >\n {/* Timeline vertical line */}\n <div\n style={{\n position: \"absolute\",\n left: \"2em\",\n top: 0,\n bottom: 0,\n width: \"1px\",\n background: `${DEVTOOL_COLOR_SEMANTIC_METADATA}28`,\n pointerEvents: \"none\",\n zIndex: 0,\n }}\n />\n\n {/* Line 1 — identity: age chip + actionId (the hero, gets the full line) + duration.\n actionId is never sacrificed to fit the routing/I-O detail, which now lives on line 2. */}\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"8px\" }}>\n {/* Age chip + timestamp — chip sits on the timeline line; the timestamp is absolutely\n positioned beneath it so it falls into the empty gutter alongside line 2 instead of\n adding height to this row. */}\n <div\n style={{\n position: \"relative\",\n zIndex: 1,\n flexShrink: 0,\n minWidth: \"3.4em\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"flex-start\",\n }}\n >\n {isLatest ? (\n <Chip size={ESize.sm} color={getLatestChipColor(entry.status)}>\n latest\n </Chip>\n ) : (\n <Chip size={ESize.sm} color={getLatestChipColor(entry.status)}>\n +{latestTime != null ? formatRelativeAge(latestTime - entry.startTime) : \"?\"}\n </Chip>\n )}\n <span\n style={{\n position: \"absolute\",\n top: \"100%\",\n left: 0,\n marginTop: \"5px\",\n color: DEVTOOL_COLOR_SEMANTIC_METADATA,\n fontSize: \"10px\",\n lineHeight: \"1em\",\n letterSpacing: \"0.02em\",\n fontFamily: \"ui-sans-serif, system-ui, sans-serif\",\n opacity: 0.7,\n paddingLeft: \"0.1em\",\n whiteSpace: \"nowrap\",\n }}\n >\n {timestamp}\n </span>\n </div>\n\n <span\n title={entry.actionId}\n style={{\n flex: 1,\n minWidth: 0,\n color: DEVTOOL_COLOR_TEXT_SECONDARY,\n fontSize: \"1em\",\n fontWeight: 400,\n fontFamily: \"ui-monospace, 'Cascadia Code', 'Source Code Pro', monospace\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {entry.actionId}\n </span>\n\n <span\n style={{\n color: DEVTOOL_COLOR_SEMANTIC_WARNING,\n lineHeight: \"1em\",\n fontSize: \"11px\",\n opacity: 0.9,\n flexShrink: 0,\n fontFamily: \"ui-sans-serif, system-ui, sans-serif\",\n }}\n >\n <DurationDisplay entry={entry} />\n </span>\n </div>\n\n {/* Line 2 — routing: origin + input→handler→output, aligned under the actionId. Giving this\n its own line lets the handler/transport detail use the full panel width instead of squeezing\n the action name on a single cramped row. */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.4em\",\n paddingLeft: \"4.5em\",\n minWidth: 0,\n }}\n >\n {inboundOrigin != null && <OriginChip origin={inboundOrigin} size={ESize.sm} subtle />}\n <ActionInputAndOutputChip breakReasons={breakReasons} entry={entry} size={ESize.sm} />\n </div>\n\n {/* Bottom section: cross-runtime child action handlers — subtle, left-aligned to the timeline */}\n {hasBottomContent && (\n <div\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n alignItems: \"center\",\n gap: \"4px\",\n paddingLeft: \"4.5em\",\n }}\n >\n {externalChildEntries.map((child) => (\n <Fragment key={child.actionId}>\n <Icon\n size={ESize.sm}\n icon={Variable}\n color={ESemanticThing.io_input}\n subtle\n tooltip={{\n content:\n child.input !== undefined ? (\n <IoTooltipContent value={child.input} />\n ) : (\n <span style={{ color: DEVTOOL_COLOR_TEXT_MUTED, fontSize: \"10px\" }}>\n No input required or given\n </span>\n ),\n title: `Input · ${child.actionId}`,\n }}\n />\n <HandlerChips entry={child} size={ESize.sm} subtle />\n {child.status === \"success\" && child.output !== undefined && (\n <Icon\n size={ESize.sm}\n icon={PackageCheck}\n color={ESemanticThing.io_output}\n subtle\n tooltip={{\n content: <IoTooltipContent value={child.output} />,\n title: `Output · ${child.actionId}`,\n }}\n />\n )}\n </Fragment>\n ))}\n {nonIoBreakReasons.map((reason) => (\n <Chip key={reason} color={ESemanticThing.default} subtle>\n {reason}\n </Chip>\n ))}\n {externalChildEntries.length > 0 && hasBottomError && (\n <Icon\n size={ESize.sm}\n icon={CircleX}\n color={entry.status === \"aborted\" ? ESemanticThing.aborted : ESemanticThing.error}\n subtle\n tooltip={{\n content: <ActionErrorDisplay entry={entry} compact />,\n title: entry.status === \"aborted\" ? \"Aborted\" : \"Error\",\n maxWidth: 340,\n }}\n />\n )}\n </div>\n )}\n\n {/* Group dots — same left alignment as bottom section */}\n {hasGroup && (\n <div\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n alignItems: \"center\",\n gap: \"5px\",\n paddingLeft: \"4.6em\",\n paddingBottom: \"2px\",\n }}\n >\n {groupEntries!.slice(0, MAX_GROUP_DOTS).map((e, i) => (\n <GroupDot\n key={e.cuid}\n entry={e}\n index={i}\n total={groupEntries!.length}\n refTime={groupEntries![0]!.startTime}\n isActive={selectedGroupCuid === e.cuid}\n onSelect={() => onSelectGroupEntry?.(e.cuid)}\n />\n ))}\n {groupEntries!.length > MAX_GROUP_DOTS && (\n <span\n style={{\n fontSize: \"0.7em\",\n opacity: 0.5,\n flexShrink: 0,\n lineHeight: 1,\n }}\n >\n + {groupEntries!.length - MAX_GROUP_DOTS}\n </span>\n )}\n </div>\n )}\n </div>\n );\n}\n","import { DevtoolsVirtualList } from \"nice-devtools-shared\";\r\nimport { useMemo, useRef } from \"react\";\r\nimport { DEVTOOL_COLOR_TEXT_MUTED, DEVTOOL_LIST_GROUP_DIVIDER } from \"../../../core/devtools_colors\";\r\nimport type { IDevtoolsActionEntry } from \"../../../server\";\r\nimport type { IEntryGroup } from \"../../NiceActionDevtools\";\r\nimport { safeStringify } from \"../utils\";\r\nimport { ActionEntryRow } from \"./ActionEntryRow\";\r\nimport { EBreakGroupReason } from \"./action_list.types\";\r\n\r\nfunction getBreakReasons(\r\n current: IDevtoolsActionEntry,\r\n previous: IDevtoolsActionEntry,\r\n): EBreakGroupReason[] {\r\n const reasons: EBreakGroupReason[] = [];\r\n const inputChanged =\r\n current.inputHash != null && previous.inputHash != null\r\n ? current.inputHash !== previous.inputHash\r\n : safeStringify(current.input, 0) !== safeStringify(previous.input, 0);\r\n if (inputChanged) reasons.push(EBreakGroupReason.new_input);\r\n const outputChanged =\r\n current.outputHash != null &&\r\n previous.outputHash != null &&\r\n current.outputHash !== previous.outputHash;\r\n if (outputChanged) reasons.push(EBreakGroupReason.new_output);\r\n return reasons;\r\n}\r\ntype TFlatItem = {\r\n group: IEntryGroup;\r\n groupIndex: number;\r\n breakReasons: EBreakGroupReason[];\r\n};\r\n// Gather child entries for a group across all runs, deduped by actionId (representative's run wins).\r\nfunction getGroupChildEntries(\r\n group: IEntryGroup,\r\n childEntriesMap: Map<string, IDevtoolsActionEntry[]>,\r\n): IDevtoolsActionEntry[] | undefined {\r\n const seen = new Set<string>();\r\n const result: IDevtoolsActionEntry[] = [];\r\n for (const e of [group.representative, ...group.rest]) {\r\n for (const child of childEntriesMap.get(e.cuid) ?? []) {\r\n if (!seen.has(child.actionId)) {\r\n seen.add(child.actionId);\r\n result.push(child);\r\n }\r\n }\r\n }\r\n return result.length > 0 ? result.sort((a, b) => a.startTime - b.startTime) : undefined;\r\n}\r\n// Stable React key — keyed on oldest cuid so prepending new entries never remounts the group DOM node.\r\nfunction getFlatItemKey(item: TFlatItem): string {\r\n const oldestCuid =\r\n item.group.rest[item.group.rest.length - 1]?.cuid ?? item.group.representative.cuid;\r\n return `g:${oldestCuid}`;\r\n}\r\n\r\nexport function ActionList({\r\n groups,\r\n selectedCuid,\r\n onGroupClick,\r\n onSubClick,\r\n childEntriesMap,\r\n style,\r\n}: {\r\n groups: IEntryGroup[];\r\n selectedCuid: string | null;\r\n onGroupClick: (group: IEntryGroup) => void;\r\n onSubClick: (cuid: string, isSelected: boolean) => void;\r\n childEntriesMap: Map<string, IDevtoolsActionEntry[]>;\r\n style?: React.CSSProperties;\r\n}) {\r\n const latestTime = groups[0]?.representative.startTime;\r\n\r\n const flatItems = useMemo<TFlatItem[]>(() => {\r\n return groups.map((group, gi) => {\r\n const prevGroup = groups[gi + 1];\r\n let breakReasons: EBreakGroupReason[] = [];\r\n if (\r\n prevGroup != null &&\r\n prevGroup.representative.actionId === group.representative.actionId &&\r\n prevGroup.representative.domain === group.representative.domain\r\n ) {\r\n const reasons = getBreakReasons(group.representative, prevGroup.representative);\r\n if (reasons.length > 0) breakReasons = reasons;\r\n }\r\n return { group, groupIndex: gi, breakReasons };\r\n });\r\n }, [groups]);\r\n\r\n // Only entries added since the previous render get the one-shot \"shine\" highlight.\r\n // Keying on the representative cuid (which changes when a fresh run merges into a\r\n // group) reproduces the old mount-driven behaviour, but driving it off a data diff\r\n // instead of DOM mount means virtualization's mount/unmount on scroll never replays it.\r\n const prevRepCuidsRef = useRef<Set<string> | null>(null);\r\n const newRepCuids = useMemo<Set<string>>(() => {\r\n const current = new Set(flatItems.map((i) => i.group.representative.cuid));\r\n const prev = prevRepCuidsRef.current;\r\n const result = new Set<string>();\r\n if (prev != null) {\r\n for (const c of current) if (!prev.has(c)) result.add(c);\r\n }\r\n prevRepCuidsRef.current = current;\r\n return result;\r\n }, [flatItems]);\r\n\r\n // The selected row is identified by its enclosing group's stable key, since the\r\n // selection may be a sub-entry inside the group rather than its representative.\r\n const selectedAnchorKey = useMemo(() => {\r\n if (selectedCuid == null) return null;\r\n const item = flatItems.find(\r\n (i) =>\r\n i.group.representative.cuid === selectedCuid ||\r\n i.group.rest.some((e) => e.cuid === selectedCuid),\r\n );\r\n return item != null ? getFlatItemKey(item) : null;\r\n }, [flatItems, selectedCuid]);\r\n\r\n return (\r\n <DevtoolsVirtualList<TFlatItem>\r\n items={flatItems}\r\n getItemKey={getFlatItemKey}\r\n selectedKey={selectedAnchorKey}\r\n estimateSize={64}\r\n overscan={8}\r\n style={style}\r\n rowStyle={{ borderBottom: `1px solid ${DEVTOOL_LIST_GROUP_DIVIDER}`, overflow: \"hidden\" }}\r\n empty={\r\n <div style={style}>\r\n <div style={{ padding: \"24px\", textAlign: \"center\", color: DEVTOOL_COLOR_TEXT_MUTED }}>\r\n No actions recorded yet\r\n </div>\r\n </div>\r\n }\r\n footer={\r\n <div style={{ padding: \"24px\", textAlign: \"center\", color: DEVTOOL_COLOR_TEXT_MUTED }}>\r\n Start of action history\r\n </div>\r\n }\r\n renderItem={(item) => {\r\n const { group } = item;\r\n const shine = newRepCuids.has(group.representative.cuid);\r\n return (\r\n <>\r\n {shine && (\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n inset: 0,\r\n pointerEvents: \"none\",\r\n background:\r\n \"linear-gradient(90deg, transparent 0%, rgba(148, 210, 255, 0.13) 50%, transparent 100%)\",\r\n animation: \"__nice-action-shine 0.65s ease-out forwards\",\r\n }}\r\n />\r\n )}\r\n <ActionEntryRow\r\n entry={group.representative}\r\n isSelected={\r\n selectedCuid === group.representative.cuid ||\r\n group.rest.some((e) => e.cuid === selectedCuid)\r\n }\r\n isLatest={item.groupIndex === 0}\r\n latestTime={latestTime}\r\n childEntries={getGroupChildEntries(group, childEntriesMap)}\r\n breakReasons={item.breakReasons}\r\n groupEntries={group.rest.length > 0 ? [group.representative, ...group.rest] : undefined}\r\n selectedGroupCuid={selectedCuid}\r\n onSelectGroupEntry={(cuid) => onSubClick(cuid, selectedCuid === cuid)}\r\n onClick={() => onGroupClick(group)}\r\n />\r\n </>\r\n );\r\n }}\r\n />\r\n );\r\n}\r\n","import {\r\n DevtoolsLauncher,\r\n FollowLatestToggles,\r\n getDevtoolsDockCoordinator,\r\n getDockSide,\r\n isDevtoolsEnabled,\r\n PanelHeader,\r\n ResizeHandle,\r\n SplitHandle,\r\n} from \"nice-devtools-shared\";\r\nimport { useEffect, useId, useMemo, useReducer, useState } from \"react\";\r\nimport type { IDevtoolsActionEntry, TDevtoolsPosition } from \"../core/ActionDevtools.types\";\r\nimport type { ActionDevtoolsCore } from \"../core/ActionDevtoolsCore\";\r\nimport {\r\n DEVTOOL_COLOR_TEXT_SECONDARY,\r\n DEVTOOL_LIST_BASE_BACKGROUND,\r\n DEVTOOL_PANEL_BORDER,\r\n DEVTOOL_PANEL_DIVIDER_BORDER,\r\n} from \"../core/devtools_colors\";\r\nimport { ActionDetailPanel } from \"./components/action_detail/ActionDetailPanel\";\r\nimport { ActionList } from \"./components/action_list/ActionList\";\r\nimport { safeStringify } from \"./components/utils\";\r\n\r\nif (typeof document !== \"undefined\" && !document.getElementById(\"__nice-action-devtools-styles\")) {\r\n const style = document.createElement(\"style\");\r\n style.id = \"__nice-action-devtools-styles\";\r\n style.textContent = `\r\n @keyframes __nice-action-pulse {\r\n 0%, 100% { opacity: 1; }\r\n 50% { opacity: 0.35; }\r\n }\r\n @keyframes __nice-action-shine {\r\n 0% { transform: translateX(-100%); opacity: 0; }\r\n 15% { opacity: 1; }\r\n 85% { opacity: 1; }\r\n 100% { transform: translateX(200%); opacity: 0; }\r\n }\r\n #__nice-action-devtools-panel ::-webkit-scrollbar {\r\n width: 4px;\r\n height: 4px;\r\n }\r\n #__nice-action-devtools-panel ::-webkit-scrollbar-track {\r\n background: transparent;\r\n }\r\n #__nice-action-devtools-panel ::-webkit-scrollbar-thumb {\r\n background: #334155;\r\n border-radius: 2px;\r\n }\r\n #__nice-action-devtools-panel ::-webkit-scrollbar-thumb:hover {\r\n background: #475569;\r\n }\r\n #__nice-action-devtools-panel ::-webkit-scrollbar-corner {\r\n background: transparent;\r\n }\r\n /* Shield the panel's native form controls from the host app's global element\r\n styles (e.g. a bare \\`input {}\\`/\\`button {}\\` rule). \\`all: revert\\` drops them\r\n to the UA baseline the panel is authored against; the panel's own inline\r\n styles still win, so its look is unchanged across any host. */\r\n #__nice-action-devtools-panel input,\r\n #__nice-action-devtools-panel button,\r\n #__nice-action-devtools-panel select,\r\n #__nice-action-devtools-panel textarea { all: revert; font-family: inherit; }\r\n `;\r\n document.head?.appendChild(style);\r\n}\r\n\r\nconst PREFS_KEY = \"__nice-action-devtools-prefs\";\r\n\r\ninterface IDevtoolsPrefs {\r\n position: TDevtoolsPosition;\r\n isOpen: boolean;\r\n dockedHeight: number; // dock-top / dock-bottom\r\n dockedWidth: number; // dock-left / dock-right\r\n detailRatio: number; // fraction of the panel the detail pane occupies\r\n stayOnLatest: boolean;\r\n followLatestOnSelect: boolean;\r\n}\r\n\r\nconst DOCKED_HEIGHT_DEFAULT = 320;\r\nconst DOCKED_WIDTH_DEFAULT = 330;\r\nconst DETAIL_RATIO_DEFAULT = 0.5;\r\n\r\nconst DOCK_POSITIONS: TDevtoolsPosition[] = [\"dock-bottom\", \"dock-top\", \"dock-left\", \"dock-right\"];\r\n\r\nfunction isDockPosition(value: unknown): value is TDevtoolsPosition {\r\n return typeof value === \"string\" && (DOCK_POSITIONS as string[]).includes(value);\r\n}\r\n\r\nfunction readPrefs(defaultPosition: TDevtoolsPosition, initialOpen: boolean): IDevtoolsPrefs {\r\n const fallback: IDevtoolsPrefs = {\r\n position: defaultPosition,\r\n isOpen: initialOpen,\r\n dockedHeight: DOCKED_HEIGHT_DEFAULT,\r\n dockedWidth: DOCKED_WIDTH_DEFAULT,\r\n detailRatio: DETAIL_RATIO_DEFAULT,\r\n stayOnLatest: true,\r\n followLatestOnSelect: true,\r\n };\r\n try {\r\n if (typeof localStorage === \"undefined\") return fallback;\r\n const stored = localStorage.getItem(PREFS_KEY);\r\n const merged = stored != null ? { ...fallback, ...JSON.parse(stored) } : fallback;\r\n // Migrate any legacy floating-corner position to the default dock side.\r\n if (!isDockPosition(merged.position)) merged.position = defaultPosition;\r\n return merged;\r\n } catch (_e) {\r\n return fallback;\r\n }\r\n}\r\n\r\nfunction writePrefs(prefs: IDevtoolsPrefs): void {\r\n try {\r\n localStorage.setItem(PREFS_KEY, JSON.stringify(prefs));\r\n } catch (_e) {\r\n return;\r\n }\r\n}\r\n\r\nexport interface INiceActionDevtoolsProps {\r\n core: ActionDevtoolsCore;\r\n position?: TDevtoolsPosition;\r\n initialOpen?: boolean;\r\n /** Show the panel even when NODE_ENV is not \"development\". */\r\n forceEnable?: boolean;\r\n}\r\n\r\nexport interface IEntryGroup {\r\n representative: IDevtoolsActionEntry;\r\n rest: IDevtoolsActionEntry[];\r\n}\r\n\r\nfunction getHandlerKey(entry: IDevtoolsActionEntry): string {\r\n const hop = entry.meta.routing[0];\r\n if (hop == null) return \"none\";\r\n if (hop.handlerType === \"local\") return \"local\";\r\n return `ext:${hop.transport ?? \"ext\"}`;\r\n}\r\n\r\n/** Same logical call — used both for grouping and for deciding which running rows to show. */\r\nfunction entriesShareActionInput(a: IDevtoolsActionEntry, b: IDevtoolsActionEntry): boolean {\r\n if (a.actionId !== b.actionId || a.domain !== b.domain) return false;\r\n return a.inputHash != null && b.inputHash != null\r\n ? a.inputHash === b.inputHash\r\n : safeStringify(a.input, 0) === safeStringify(b.input, 0);\r\n}\r\n\r\nfunction canGroupWith(a: IDevtoolsActionEntry, b: IDevtoolsActionEntry): boolean {\r\n if (!entriesShareActionInput(a, b)) return false;\r\n const handlerA = getHandlerKey(a);\r\n const handlerB = getHandlerKey(b);\r\n // \"none\" means routing wasn't captured (e.g. aborted before dispatch recorded the hop, or a running\r\n // entry whose transport hasn't been resolved yet). Only treat handlers as conflicting when both\r\n // sides have a known, differing key.\r\n const handlerConflict = handlerA !== \"none\" && handlerB !== \"none\" && handlerA !== handlerB;\r\n if (handlerConflict) return false;\r\n // A running entry has no final status/output yet. Fold it into a same-identity group (rendered with\r\n // a live running indicator) instead of forcing a lone row that collapses into the group the instant\r\n // it settles — the flash we want to avoid. Once both entries have settled the checks below separate\r\n // them by final status + output.\r\n if (a.status === \"running\" || b.status === \"running\") return true;\r\n // Only enforce output equality when both entries have a hash (i.e. a result payload exists).\r\n // Aborted actions won't have one, so they group purely on input + status.\r\n const outputMatch =\r\n a.outputHash != null && b.outputHash != null ? a.outputHash === b.outputHash : true;\r\n return a.status === b.status && outputMatch;\r\n}\r\n\r\nfunction groupEntries(entries: readonly IDevtoolsActionEntry[]): IEntryGroup[] {\r\n const groups: IEntryGroup[] = [];\r\n for (const entry of entries) {\r\n const last = groups[groups.length - 1];\r\n if (last != null && canGroupWith(entry, last.representative)) {\r\n last.rest.push(entry);\r\n } else {\r\n groups.push({ representative: entry, rest: [] });\r\n }\r\n }\r\n return groups;\r\n}\r\n\r\nexport function NiceActionDevtools({ forceEnable, ...props }: INiceActionDevtoolsProps) {\r\n // Hidden in the consumer's production build; `forceEnable` overrides. See\r\n // isDevtoolsEnabled for how dev mode is detected across bundlers.\r\n if (!isDevtoolsEnabled(forceEnable)) {\r\n return null;\r\n }\r\n return <NiceActionDevtools_Panel {...props} />;\r\n}\r\n\r\nfunction NiceActionDevtools_Panel({\r\n core,\r\n position: defaultPosition = \"dock-right\",\r\n initialOpen = false,\r\n}: INiceActionDevtoolsProps) {\r\n const [prefs, setPrefsRaw] = useState<IDevtoolsPrefs>(() =>\r\n readPrefs(defaultPosition, initialOpen),\r\n );\r\n const [entries, setEntries] = useState<readonly IDevtoolsActionEntry[]>([]);\r\n const [selectedCuid, setSelectedCuid] = useState<string | null>(null);\r\n useEffect(() => core.subscribe(setEntries), [core]);\r\n\r\n const groups = useMemo(() => {\r\n const byCuid = new Map(entries.map((e) => [e.cuid, e]));\r\n // Children render nested under their parent group, never as their own root row. Running roots are\r\n // kept (unlike the old behaviour that dropped every running entry): a long-lived action — e.g. one\r\n // waiting for a WebSocket to connect + handshake before it can be sent — must be visible *while in\r\n // flight*, not only once it finishes. `canGroupWith` folds a running entry into an adjacent\r\n // identical group, so repeated fast calls still don't flash a lone row that immediately collapses.\r\n const roots = entries.filter((e) => e.parentCuid == null || !byCuid.has(e.parentCuid));\r\n return groupEntries(roots);\r\n }, [entries]);\r\n\r\n const childEntriesMap = useMemo(() => {\r\n const map = new Map<string, IDevtoolsActionEntry[]>();\r\n for (const entry of entries) {\r\n if (entry.parentCuid == null) continue;\r\n const existing = map.get(entry.parentCuid) ?? [];\r\n map.set(entry.parentCuid, [...existing, entry]);\r\n }\r\n for (const arr of map.values()) {\r\n arr.sort((a, b) => a.startTime - b.startTime);\r\n }\r\n return map;\r\n }, [entries]);\r\n\r\n const setPrefs = (update: Partial<IDevtoolsPrefs>) => {\r\n setPrefsRaw((prev) => ({ ...prev, ...update }));\r\n };\r\n\r\n // Persist prefs to localStorage, debounced — a resize drag fires on every\r\n // mouse move, so writing on each one would thrash localStorage.\r\n useEffect(() => {\r\n const timer = setTimeout(() => writePrefs(prefs), 250);\r\n return () => clearTimeout(timer);\r\n }, [prefs]);\r\n\r\n const {\r\n position,\r\n isOpen,\r\n dockedHeight,\r\n dockedWidth,\r\n detailRatio,\r\n stayOnLatest,\r\n followLatestOnSelect,\r\n } = prefs;\r\n const dockSide = getDockSide(position);\r\n const isHorizDock = dockSide === \"top\" || dockSide === \"bottom\";\r\n const dockedSize = isHorizDock ? dockedHeight : dockedWidth;\r\n\r\n // \"Follow latest\": whenever a new group lands at the head of the (newest-first)\r\n // list, follow it so the detail pane always shows the latest action. The head\r\n // group's representative is the newest root — now including a still-running one —\r\n // so its cuid changes as new actions start or finish, which is exactly the signal\r\n // to re-select.\r\n const latestCuid = groups.length > 0 ? groups[0].representative.cuid : null;\r\n useEffect(() => {\r\n if (stayOnLatest && latestCuid != null) setSelectedCuid(latestCuid);\r\n }, [stayOnLatest, latestCuid]);\r\n\r\n // Apply a new selection and reconcile follow state, mirroring the timeline\r\n // toggles: selecting the latest action means \"show me the latest\" (resume\r\n // following when the sub-toggle allows it); any other selection is the user\r\n // taking control, so following stops.\r\n const applySelection = (next: string | null) => {\r\n if (next != null && next === latestCuid && followLatestOnSelect) {\r\n if (!stayOnLatest) setPrefs({ stayOnLatest: true });\r\n } else if (stayOnLatest) {\r\n setPrefs({ stayOnLatest: false });\r\n }\r\n setSelectedCuid(next);\r\n };\r\n\r\n const handleGroupRowClick = (group: IEntryGroup) => {\r\n const repCuid = group.representative.cuid;\r\n const allInGroup = [group.representative, ...group.rest];\r\n const selectedInGroup = allInGroup.find((e) => e.cuid === selectedCuid) ?? null;\r\n if (selectedInGroup != null && selectedCuid !== repCuid) {\r\n applySelection(repCuid);\r\n } else {\r\n applySelection(selectedCuid === repCuid ? null : repCuid);\r\n }\r\n };\r\n\r\n const selectedEntry = selectedCuid != null ? entries.find((e) => e.cuid === selectedCuid) : null;\r\n const runningCount = entries.filter((e) => e.status === \"running\").length;\r\n\r\n // Coordinate with any other nice-* devtools on the page so panels and launch\r\n // buttons cooperate instead of overlapping (see devtools_dock.ts).\r\n const dock = useMemo(() => getDevtoolsDockCoordinator(), []);\r\n const panelId = useId();\r\n const [, bumpView] = useReducer((n: number) => n + 1, 0);\r\n const badge = runningCount > 0 ? `${runningCount}●` : undefined;\r\n\r\n // biome-ignore lint/correctness/useExhaustiveDependencies: register once on mount; the effect below syncs the live fields.\r\n useEffect(() => {\r\n const unregister = dock.register({\r\n id: panelId,\r\n label: \"actions\",\r\n icon: \"⚡\",\r\n side: dockSide,\r\n size: dockedSize,\r\n open: isOpen,\r\n badge,\r\n onOpen: () => setPrefs({ isOpen: true }),\r\n });\r\n const unsubscribe = dock.subscribe(bumpView);\r\n return () => {\r\n unregister();\r\n unsubscribe();\r\n };\r\n }, [dock, panelId]);\r\n\r\n useEffect(() => {\r\n dock.update(panelId, { side: dockSide, size: dockedSize, open: isOpen, badge });\r\n }, [dock, panelId, dockSide, dockedSize, isOpen, badge]);\r\n\r\n const view = dock.getView(panelId);\r\n\r\n const baseStyle: React.CSSProperties = {\r\n position: \"fixed\",\r\n zIndex: 2147483647,\r\n fontFamily: \"ui-monospace, 'Cascadia Code', 'Source Code Pro', monospace\",\r\n fontSize: \"12px\",\r\n };\r\n\r\n // While every devtool is collapsed, the primary one renders a single combined\r\n // launcher for all of them; the others render nothing.\r\n if (!isOpen) {\r\n if (view.isPrimary && !view.anyOpen) {\r\n return <DevtoolsLauncher items={view.devtools} />;\r\n }\r\n return null;\r\n }\r\n\r\n const panelStyle: React.CSSProperties = {\r\n ...baseStyle,\r\n background: DEVTOOL_LIST_BASE_BACKGROUND,\r\n border: `1px solid ${DEVTOOL_PANEL_BORDER}`,\r\n color: DEVTOOL_COLOR_TEXT_SECONDARY,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n boxShadow: \"0 -4px 24px rgba(0,0,0,0.4)\",\r\n overflow: \"hidden\",\r\n // When stacked alongside another panel on the same side, square off every\r\n // corner so the panels read as one continuous block instead of leaving a\r\n // curved seam or a rounded edge poking out behind a neighbour.\r\n ...(dockSide === \"bottom\"\r\n ? {\r\n bottom: view.dockOffset,\r\n left: 0,\r\n right: 0,\r\n height: `${dockedSize}px`,\r\n borderRadius: view.stacked ? \"0\" : \"8px 8px 0 0\",\r\n }\r\n : dockSide === \"top\"\r\n ? {\r\n top: view.dockOffset,\r\n left: 0,\r\n right: 0,\r\n height: `${dockedSize}px`,\r\n borderRadius: view.stacked ? \"0\" : \"0 0 8px 8px\",\r\n }\r\n : dockSide === \"left\"\r\n ? {\r\n top: 0,\r\n left: view.dockOffset,\r\n bottom: 0,\r\n width: `${dockedSize}px`,\r\n borderRadius: view.stacked ? \"0\" : \"0 8px 8px 0\",\r\n }\r\n : {\r\n top: 0,\r\n right: view.dockOffset,\r\n bottom: 0,\r\n width: `${dockedSize}px`,\r\n borderRadius: view.stacked ? \"0\" : \"8px 0 0 8px\",\r\n }),\r\n };\r\n\r\n const selectedEntryParent =\r\n selectedEntry?.parentCuid != null\r\n ? (entries.find((e) => e.cuid === selectedEntry.parentCuid) ?? null)\r\n : null;\r\n const selectedEntryChildren =\r\n selectedEntry != null\r\n ? [...entries]\r\n .filter((e) => e.parentCuid === selectedEntry.cuid)\r\n .sort((a, b) => a.startTime - b.startTime)\r\n : [];\r\n\r\n const virtualListProps = {\r\n groups,\r\n selectedCuid,\r\n onGroupClick: handleGroupRowClick,\r\n onSubClick: (cuid: string, isSelected: boolean) => {\r\n applySelection(isSelected ? null : cuid);\r\n },\r\n childEntriesMap,\r\n };\r\n\r\n return (\r\n <div id=\"__nice-action-devtools-panel\" style={panelStyle}>\r\n <ResizeHandle\r\n dockSide={dockSide}\r\n dockedSize={dockedSize}\r\n onChange={(size) => setPrefs(isHorizDock ? { dockedHeight: size } : { dockedWidth: size })}\r\n />\r\n <PanelHeader\r\n title=\"⚡ action\"\r\n position={position}\r\n onPositionChange={(p) => setPrefs({ position: p })}\r\n onClose={() => setPrefs({ isOpen: false })}\r\n onClear={\r\n entries.length > 0\r\n ? () => {\r\n core.clear();\r\n setSelectedCuid(null);\r\n }\r\n : undefined\r\n }\r\n openOthers={view.otherClosed}\r\n />\r\n\r\n <div\r\n style={{\r\n flex: 1,\r\n display: \"flex\",\r\n flexDirection: isHorizDock ? \"row\" : \"column\",\r\n overflow: \"hidden\",\r\n minHeight: 0,\r\n }}\r\n >\r\n {/* List — shares the panel with the detail pane via the draggable split */}\r\n <div\r\n style={{\r\n flexGrow: selectedEntry != null ? 1 - detailRatio : 1,\r\n flexShrink: 1,\r\n flexBasis: 0,\r\n minWidth: 0,\r\n minHeight: 0,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n overflow: \"hidden\",\r\n }}\r\n >\r\n <FollowLatestToggles\r\n noun=\"action\"\r\n stayOnLatest={stayOnLatest}\r\n onStayOnLatestChange={(next) => setPrefs({ stayOnLatest: next })}\r\n followLatestOnSelect={followLatestOnSelect}\r\n onFollowLatestOnSelectChange={(next) => {\r\n // Enabling this while already sitting on the latest action is itself\r\n // a \"select the latest\" intent — start following so the view tracks\r\n // new actions, matching what a fresh click on the latest would do.\r\n if (next && latestCuid != null && selectedCuid === latestCuid && !stayOnLatest) {\r\n setPrefs({ followLatestOnSelect: next, stayOnLatest: true });\r\n } else {\r\n setPrefs({ followLatestOnSelect: next });\r\n }\r\n }}\r\n />\r\n <ActionList\r\n {...virtualListProps}\r\n style={{ width: \"100%\", flex: 1, minHeight: 0, overflowY: \"auto\" }}\r\n />\r\n </div>\r\n {/* Detail — resizable; ratio persisted in prefs */}\r\n {selectedEntry != null && (\r\n <>\r\n <SplitHandle\r\n horizontal={isHorizDock}\r\n onRatioChange={(ratio) => setPrefs({ detailRatio: ratio })}\r\n />\r\n <div\r\n style={{\r\n flexGrow: detailRatio,\r\n flexShrink: 1,\r\n flexBasis: 0,\r\n minWidth: 0,\r\n minHeight: 0,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n overflow: \"hidden\",\r\n ...(isHorizDock\r\n ? {\r\n borderLeft: `1px solid ${DEVTOOL_PANEL_DIVIDER_BORDER}`,\r\n boxShadow: \"inset 18px 0 36px -14px rgba(0,0,0,0.8)\",\r\n }\r\n : {\r\n borderTop: `1px solid ${DEVTOOL_PANEL_DIVIDER_BORDER}`,\r\n boxShadow: \"inset 0 18px 36px -14px rgba(0,0,0,0.8)\",\r\n }),\r\n }}\r\n >\r\n <ActionDetailPanel\r\n key={selectedEntry.cuid}\r\n entry={selectedEntry}\r\n parent={selectedEntryParent}\r\n childEntries={selectedEntryChildren}\r\n onSelectEntry={(cuid) => setSelectedCuid(cuid)}\r\n />\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"mappings":"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"}
|