@nice-code/action 0.13.0 → 0.14.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.
@@ -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/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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"}
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","../../../../../node_modules/.bun/source-map-js@1.2.1/node_modules/source-map-js/lib/base64.js","../../../../../node_modules/.bun/source-map-js@1.2.1/node_modules/source-map-js/lib/base64-vlq.js","../../../../../node_modules/.bun/source-map-js@1.2.1/node_modules/source-map-js/lib/util.js","../../../../../node_modules/.bun/source-map-js@1.2.1/node_modules/source-map-js/lib/array-set.js","../../../../../node_modules/.bun/source-map-js@1.2.1/node_modules/source-map-js/lib/mapping-list.js","../../../../../node_modules/.bun/source-map-js@1.2.1/node_modules/source-map-js/lib/source-map-generator.js","../../../../../node_modules/.bun/source-map-js@1.2.1/node_modules/source-map-js/lib/binary-search.js","../../../../../node_modules/.bun/source-map-js@1.2.1/node_modules/source-map-js/lib/quick-sort.js","../../../../../node_modules/.bun/source-map-js@1.2.1/node_modules/source-map-js/lib/source-map-consumer.js","../../../../../node_modules/.bun/source-map-js@1.2.1/node_modules/source-map-js/lib/source-node.js","../../../../../node_modules/.bun/source-map-js@1.2.1/node_modules/source-map-js/source-map.js","../../../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","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');\n\n/**\n * Encode an integer in the range of 0 to 63 to a single base 64 digit.\n */\nexports.encode = function (number) {\n if (0 <= number && number < intToCharMap.length) {\n return intToCharMap[number];\n }\n throw new TypeError(\"Must be between 0 and 63: \" + number);\n};\n\n/**\n * Decode a single base 64 character code digit to an integer. Returns -1 on\n * failure.\n */\nexports.decode = function (charCode) {\n var bigA = 65; // 'A'\n var bigZ = 90; // 'Z'\n\n var littleA = 97; // 'a'\n var littleZ = 122; // 'z'\n\n var zero = 48; // '0'\n var nine = 57; // '9'\n\n var plus = 43; // '+'\n var slash = 47; // '/'\n\n var littleOffset = 26;\n var numberOffset = 52;\n\n // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ\n if (bigA <= charCode && charCode <= bigZ) {\n return (charCode - bigA);\n }\n\n // 26 - 51: abcdefghijklmnopqrstuvwxyz\n if (littleA <= charCode && charCode <= littleZ) {\n return (charCode - littleA + littleOffset);\n }\n\n // 52 - 61: 0123456789\n if (zero <= charCode && charCode <= nine) {\n return (charCode - zero + numberOffset);\n }\n\n // 62: +\n if (charCode == plus) {\n return 62;\n }\n\n // 63: /\n if (charCode == slash) {\n return 63;\n }\n\n // Invalid base64 digit.\n return -1;\n};\n","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n *\n * Based on the Base 64 VLQ implementation in Closure Compiler:\n * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java\n *\n * Copyright 2011 The Closure Compiler Authors. All rights reserved.\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following\n * disclaimer in the documentation and/or other materials provided\n * with the distribution.\n * * Neither the name of Google Inc. nor the names of its\n * contributors may be used to endorse or promote products derived\n * from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nvar base64 = require('./base64');\n\n// A single base 64 digit can contain 6 bits of data. For the base 64 variable\n// length quantities we use in the source map spec, the first bit is the sign,\n// the next four bits are the actual value, and the 6th bit is the\n// continuation bit. The continuation bit tells us whether there are more\n// digits in this value following this digit.\n//\n// Continuation\n// | Sign\n// | |\n// V V\n// 101011\n\nvar VLQ_BASE_SHIFT = 5;\n\n// binary: 100000\nvar VLQ_BASE = 1 << VLQ_BASE_SHIFT;\n\n// binary: 011111\nvar VLQ_BASE_MASK = VLQ_BASE - 1;\n\n// binary: 100000\nvar VLQ_CONTINUATION_BIT = VLQ_BASE;\n\n/**\n * Converts from a two-complement value to a value where the sign bit is\n * placed in the least significant bit. For example, as decimals:\n * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary)\n * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary)\n */\nfunction toVLQSigned(aValue) {\n return aValue < 0\n ? ((-aValue) << 1) + 1\n : (aValue << 1) + 0;\n}\n\n/**\n * Converts to a two-complement value from a value where the sign bit is\n * placed in the least significant bit. For example, as decimals:\n * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1\n * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2\n */\nfunction fromVLQSigned(aValue) {\n var isNegative = (aValue & 1) === 1;\n var shifted = aValue >> 1;\n return isNegative\n ? -shifted\n : shifted;\n}\n\n/**\n * Returns the base 64 VLQ encoded value.\n */\nexports.encode = function base64VLQ_encode(aValue) {\n var encoded = \"\";\n var digit;\n\n var vlq = toVLQSigned(aValue);\n\n do {\n digit = vlq & VLQ_BASE_MASK;\n vlq >>>= VLQ_BASE_SHIFT;\n if (vlq > 0) {\n // There are still more digits in this value, so we must make sure the\n // continuation bit is marked.\n digit |= VLQ_CONTINUATION_BIT;\n }\n encoded += base64.encode(digit);\n } while (vlq > 0);\n\n return encoded;\n};\n\n/**\n * Decodes the next base 64 VLQ value from the given string and returns the\n * value and the rest of the string via the out parameter.\n */\nexports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) {\n var strLen = aStr.length;\n var result = 0;\n var shift = 0;\n var continuation, digit;\n\n do {\n if (aIndex >= strLen) {\n throw new Error(\"Expected more digits in base 64 VLQ value.\");\n }\n\n digit = base64.decode(aStr.charCodeAt(aIndex++));\n if (digit === -1) {\n throw new Error(\"Invalid base64 digit: \" + aStr.charAt(aIndex - 1));\n }\n\n continuation = !!(digit & VLQ_CONTINUATION_BIT);\n digit &= VLQ_BASE_MASK;\n result = result + (digit << shift);\n shift += VLQ_BASE_SHIFT;\n } while (continuation);\n\n aOutParam.value = fromVLQSigned(result);\n aOutParam.rest = aIndex;\n};\n","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\n/**\n * This is a helper function for getting values from parameter/options\n * objects.\n *\n * @param args The object we are extracting values from\n * @param name The name of the property we are getting.\n * @param defaultValue An optional value to return if the property is missing\n * from the object. If this is not specified and the property is missing, an\n * error will be thrown.\n */\nfunction getArg(aArgs, aName, aDefaultValue) {\n if (aName in aArgs) {\n return aArgs[aName];\n } else if (arguments.length === 3) {\n return aDefaultValue;\n } else {\n throw new Error('\"' + aName + '\" is a required argument.');\n }\n}\nexports.getArg = getArg;\n\nvar urlRegexp = /^(?:([\\w+\\-.]+):)?\\/\\/(?:(\\w+:\\w+)@)?([\\w.-]*)(?::(\\d+))?(.*)$/;\nvar dataUrlRegexp = /^data:.+\\,.+$/;\n\nfunction urlParse(aUrl) {\n var match = aUrl.match(urlRegexp);\n if (!match) {\n return null;\n }\n return {\n scheme: match[1],\n auth: match[2],\n host: match[3],\n port: match[4],\n path: match[5]\n };\n}\nexports.urlParse = urlParse;\n\nfunction urlGenerate(aParsedUrl) {\n var url = '';\n if (aParsedUrl.scheme) {\n url += aParsedUrl.scheme + ':';\n }\n url += '//';\n if (aParsedUrl.auth) {\n url += aParsedUrl.auth + '@';\n }\n if (aParsedUrl.host) {\n url += aParsedUrl.host;\n }\n if (aParsedUrl.port) {\n url += \":\" + aParsedUrl.port\n }\n if (aParsedUrl.path) {\n url += aParsedUrl.path;\n }\n return url;\n}\nexports.urlGenerate = urlGenerate;\n\nvar MAX_CACHED_INPUTS = 32;\n\n/**\n * Takes some function `f(input) -> result` and returns a memoized version of\n * `f`.\n *\n * We keep at most `MAX_CACHED_INPUTS` memoized results of `f` alive. The\n * memoization is a dumb-simple, linear least-recently-used cache.\n */\nfunction lruMemoize(f) {\n var cache = [];\n\n return function(input) {\n for (var i = 0; i < cache.length; i++) {\n if (cache[i].input === input) {\n var temp = cache[0];\n cache[0] = cache[i];\n cache[i] = temp;\n return cache[0].result;\n }\n }\n\n var result = f(input);\n\n cache.unshift({\n input,\n result,\n });\n\n if (cache.length > MAX_CACHED_INPUTS) {\n cache.pop();\n }\n\n return result;\n };\n}\n\n/**\n * Normalizes a path, or the path portion of a URL:\n *\n * - Replaces consecutive slashes with one slash.\n * - Removes unnecessary '.' parts.\n * - Removes unnecessary '<dir>/..' parts.\n *\n * Based on code in the Node.js 'path' core module.\n *\n * @param aPath The path or url to normalize.\n */\nvar normalize = lruMemoize(function normalize(aPath) {\n var path = aPath;\n var url = urlParse(aPath);\n if (url) {\n if (!url.path) {\n return aPath;\n }\n path = url.path;\n }\n var isAbsolute = exports.isAbsolute(path);\n // Split the path into parts between `/` characters. This is much faster than\n // using `.split(/\\/+/g)`.\n var parts = [];\n var start = 0;\n var i = 0;\n while (true) {\n start = i;\n i = path.indexOf(\"/\", start);\n if (i === -1) {\n parts.push(path.slice(start));\n break;\n } else {\n parts.push(path.slice(start, i));\n while (i < path.length && path[i] === \"/\") {\n i++;\n }\n }\n }\n\n for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {\n part = parts[i];\n if (part === '.') {\n parts.splice(i, 1);\n } else if (part === '..') {\n up++;\n } else if (up > 0) {\n if (part === '') {\n // The first part is blank if the path is absolute. Trying to go\n // above the root is a no-op. Therefore we can remove all '..' parts\n // directly after the root.\n parts.splice(i + 1, up);\n up = 0;\n } else {\n parts.splice(i, 2);\n up--;\n }\n }\n }\n path = parts.join('/');\n\n if (path === '') {\n path = isAbsolute ? '/' : '.';\n }\n\n if (url) {\n url.path = path;\n return urlGenerate(url);\n }\n return path;\n});\nexports.normalize = normalize;\n\n/**\n * Joins two paths/URLs.\n *\n * @param aRoot The root path or URL.\n * @param aPath The path or URL to be joined with the root.\n *\n * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a\n * scheme-relative URL: Then the scheme of aRoot, if any, is prepended\n * first.\n * - Otherwise aPath is a path. If aRoot is a URL, then its path portion\n * is updated with the result and aRoot is returned. Otherwise the result\n * is returned.\n * - If aPath is absolute, the result is aPath.\n * - Otherwise the two paths are joined with a slash.\n * - Joining for example 'http://' and 'www.example.com' is also supported.\n */\nfunction join(aRoot, aPath) {\n if (aRoot === \"\") {\n aRoot = \".\";\n }\n if (aPath === \"\") {\n aPath = \".\";\n }\n var aPathUrl = urlParse(aPath);\n var aRootUrl = urlParse(aRoot);\n if (aRootUrl) {\n aRoot = aRootUrl.path || '/';\n }\n\n // `join(foo, '//www.example.org')`\n if (aPathUrl && !aPathUrl.scheme) {\n if (aRootUrl) {\n aPathUrl.scheme = aRootUrl.scheme;\n }\n return urlGenerate(aPathUrl);\n }\n\n if (aPathUrl || aPath.match(dataUrlRegexp)) {\n return aPath;\n }\n\n // `join('http://', 'www.example.com')`\n if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {\n aRootUrl.host = aPath;\n return urlGenerate(aRootUrl);\n }\n\n var joined = aPath.charAt(0) === '/'\n ? aPath\n : normalize(aRoot.replace(/\\/+$/, '') + '/' + aPath);\n\n if (aRootUrl) {\n aRootUrl.path = joined;\n return urlGenerate(aRootUrl);\n }\n return joined;\n}\nexports.join = join;\n\nexports.isAbsolute = function (aPath) {\n return aPath.charAt(0) === '/' || urlRegexp.test(aPath);\n};\n\n/**\n * Make a path relative to a URL or another path.\n *\n * @param aRoot The root path or URL.\n * @param aPath The path or URL to be made relative to aRoot.\n */\nfunction relative(aRoot, aPath) {\n if (aRoot === \"\") {\n aRoot = \".\";\n }\n\n aRoot = aRoot.replace(/\\/$/, '');\n\n // It is possible for the path to be above the root. In this case, simply\n // checking whether the root is a prefix of the path won't work. Instead, we\n // need to remove components from the root one by one, until either we find\n // a prefix that fits, or we run out of components to remove.\n var level = 0;\n while (aPath.indexOf(aRoot + '/') !== 0) {\n var index = aRoot.lastIndexOf(\"/\");\n if (index < 0) {\n return aPath;\n }\n\n // If the only part of the root that is left is the scheme (i.e. http://,\n // file:///, etc.), one or more slashes (/), or simply nothing at all, we\n // have exhausted all components, so the path is not relative to the root.\n aRoot = aRoot.slice(0, index);\n if (aRoot.match(/^([^\\/]+:\\/)?\\/*$/)) {\n return aPath;\n }\n\n ++level;\n }\n\n // Make sure we add a \"../\" for each component we removed from the root.\n return Array(level + 1).join(\"../\") + aPath.substr(aRoot.length + 1);\n}\nexports.relative = relative;\n\nvar supportsNullProto = (function () {\n var obj = Object.create(null);\n return !('__proto__' in obj);\n}());\n\nfunction identity (s) {\n return s;\n}\n\n/**\n * Because behavior goes wacky when you set `__proto__` on objects, we\n * have to prefix all the strings in our set with an arbitrary character.\n *\n * See https://github.com/mozilla/source-map/pull/31 and\n * https://github.com/mozilla/source-map/issues/30\n *\n * @param String aStr\n */\nfunction toSetString(aStr) {\n if (isProtoString(aStr)) {\n return '$' + aStr;\n }\n\n return aStr;\n}\nexports.toSetString = supportsNullProto ? identity : toSetString;\n\nfunction fromSetString(aStr) {\n if (isProtoString(aStr)) {\n return aStr.slice(1);\n }\n\n return aStr;\n}\nexports.fromSetString = supportsNullProto ? identity : fromSetString;\n\nfunction isProtoString(s) {\n if (!s) {\n return false;\n }\n\n var length = s.length;\n\n if (length < 9 /* \"__proto__\".length */) {\n return false;\n }\n\n if (s.charCodeAt(length - 1) !== 95 /* '_' */ ||\n s.charCodeAt(length - 2) !== 95 /* '_' */ ||\n s.charCodeAt(length - 3) !== 111 /* 'o' */ ||\n s.charCodeAt(length - 4) !== 116 /* 't' */ ||\n s.charCodeAt(length - 5) !== 111 /* 'o' */ ||\n s.charCodeAt(length - 6) !== 114 /* 'r' */ ||\n s.charCodeAt(length - 7) !== 112 /* 'p' */ ||\n s.charCodeAt(length - 8) !== 95 /* '_' */ ||\n s.charCodeAt(length - 9) !== 95 /* '_' */) {\n return false;\n }\n\n for (var i = length - 10; i >= 0; i--) {\n if (s.charCodeAt(i) !== 36 /* '$' */) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Comparator between two mappings where the original positions are compared.\n *\n * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n * mappings with the same original source/line/column, but different generated\n * line and column the same. Useful when searching for a mapping with a\n * stubbed out mapping.\n */\nfunction compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {\n var cmp = strcmp(mappingA.source, mappingB.source);\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalLine - mappingB.originalLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalColumn - mappingB.originalColumn;\n if (cmp !== 0 || onlyCompareOriginal) {\n return cmp;\n }\n\n cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.generatedLine - mappingB.generatedLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n return strcmp(mappingA.name, mappingB.name);\n}\nexports.compareByOriginalPositions = compareByOriginalPositions;\n\nfunction compareByOriginalPositionsNoSource(mappingA, mappingB, onlyCompareOriginal) {\n var cmp\n\n cmp = mappingA.originalLine - mappingB.originalLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalColumn - mappingB.originalColumn;\n if (cmp !== 0 || onlyCompareOriginal) {\n return cmp;\n }\n\n cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.generatedLine - mappingB.generatedLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n return strcmp(mappingA.name, mappingB.name);\n}\nexports.compareByOriginalPositionsNoSource = compareByOriginalPositionsNoSource;\n\n/**\n * Comparator between two mappings with deflated source and name indices where\n * the generated positions are compared.\n *\n * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n * mappings with the same generated line and column, but different\n * source/name/original line and column the same. Useful when searching for a\n * mapping with a stubbed out mapping.\n */\nfunction compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) {\n var cmp = mappingA.generatedLine - mappingB.generatedLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n if (cmp !== 0 || onlyCompareGenerated) {\n return cmp;\n }\n\n cmp = strcmp(mappingA.source, mappingB.source);\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalLine - mappingB.originalLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalColumn - mappingB.originalColumn;\n if (cmp !== 0) {\n return cmp;\n }\n\n return strcmp(mappingA.name, mappingB.name);\n}\nexports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;\n\nfunction compareByGeneratedPositionsDeflatedNoLine(mappingA, mappingB, onlyCompareGenerated) {\n var cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n if (cmp !== 0 || onlyCompareGenerated) {\n return cmp;\n }\n\n cmp = strcmp(mappingA.source, mappingB.source);\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalLine - mappingB.originalLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalColumn - mappingB.originalColumn;\n if (cmp !== 0) {\n return cmp;\n }\n\n return strcmp(mappingA.name, mappingB.name);\n}\nexports.compareByGeneratedPositionsDeflatedNoLine = compareByGeneratedPositionsDeflatedNoLine;\n\nfunction strcmp(aStr1, aStr2) {\n if (aStr1 === aStr2) {\n return 0;\n }\n\n if (aStr1 === null) {\n return 1; // aStr2 !== null\n }\n\n if (aStr2 === null) {\n return -1; // aStr1 !== null\n }\n\n if (aStr1 > aStr2) {\n return 1;\n }\n\n return -1;\n}\n\n/**\n * Comparator between two mappings with inflated source and name strings where\n * the generated positions are compared.\n */\nfunction compareByGeneratedPositionsInflated(mappingA, mappingB) {\n var cmp = mappingA.generatedLine - mappingB.generatedLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = strcmp(mappingA.source, mappingB.source);\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalLine - mappingB.originalLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalColumn - mappingB.originalColumn;\n if (cmp !== 0) {\n return cmp;\n }\n\n return strcmp(mappingA.name, mappingB.name);\n}\nexports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated;\n\n/**\n * Strip any JSON XSSI avoidance prefix from the string (as documented\n * in the source maps specification), and then parse the string as\n * JSON.\n */\nfunction parseSourceMapInput(str) {\n return JSON.parse(str.replace(/^\\)]}'[^\\n]*\\n/, ''));\n}\nexports.parseSourceMapInput = parseSourceMapInput;\n\n/**\n * Compute the URL of a source given the the source root, the source's\n * URL, and the source map's URL.\n */\nfunction computeSourceURL(sourceRoot, sourceURL, sourceMapURL) {\n sourceURL = sourceURL || '';\n\n if (sourceRoot) {\n // This follows what Chrome does.\n if (sourceRoot[sourceRoot.length - 1] !== '/' && sourceURL[0] !== '/') {\n sourceRoot += '/';\n }\n // The spec says:\n // Line 4: An optional source root, useful for relocating source\n // files on a server or removing repeated values in the\n // “sources” entry. This value is prepended to the individual\n // entries in the “source” field.\n sourceURL = sourceRoot + sourceURL;\n }\n\n // Historically, SourceMapConsumer did not take the sourceMapURL as\n // a parameter. This mode is still somewhat supported, which is why\n // this code block is conditional. However, it's preferable to pass\n // the source map URL to SourceMapConsumer, so that this function\n // can implement the source URL resolution algorithm as outlined in\n // the spec. This block is basically the equivalent of:\n // new URL(sourceURL, sourceMapURL).toString()\n // ... except it avoids using URL, which wasn't available in the\n // older releases of node still supported by this library.\n //\n // The spec says:\n // If the sources are not absolute URLs after prepending of the\n // “sourceRoot”, the sources are resolved relative to the\n // SourceMap (like resolving script src in a html document).\n if (sourceMapURL) {\n var parsed = urlParse(sourceMapURL);\n if (!parsed) {\n throw new Error(\"sourceMapURL could not be parsed\");\n }\n if (parsed.path) {\n // Strip the last path component, but keep the \"/\".\n var index = parsed.path.lastIndexOf('/');\n if (index >= 0) {\n parsed.path = parsed.path.substring(0, index + 1);\n }\n }\n sourceURL = join(urlGenerate(parsed), sourceURL);\n }\n\n return normalize(sourceURL);\n}\nexports.computeSourceURL = computeSourceURL;\n","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar util = require('./util');\nvar has = Object.prototype.hasOwnProperty;\nvar hasNativeMap = typeof Map !== \"undefined\";\n\n/**\n * A data structure which is a combination of an array and a set. Adding a new\n * member is O(1), testing for membership is O(1), and finding the index of an\n * element is O(1). Removing elements from the set is not supported. Only\n * strings are supported for membership.\n */\nfunction ArraySet() {\n this._array = [];\n this._set = hasNativeMap ? new Map() : Object.create(null);\n}\n\n/**\n * Static method for creating ArraySet instances from an existing array.\n */\nArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {\n var set = new ArraySet();\n for (var i = 0, len = aArray.length; i < len; i++) {\n set.add(aArray[i], aAllowDuplicates);\n }\n return set;\n};\n\n/**\n * Return how many unique items are in this ArraySet. If duplicates have been\n * added, than those do not count towards the size.\n *\n * @returns Number\n */\nArraySet.prototype.size = function ArraySet_size() {\n return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length;\n};\n\n/**\n * Add the given string to this set.\n *\n * @param String aStr\n */\nArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {\n var sStr = hasNativeMap ? aStr : util.toSetString(aStr);\n var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr);\n var idx = this._array.length;\n if (!isDuplicate || aAllowDuplicates) {\n this._array.push(aStr);\n }\n if (!isDuplicate) {\n if (hasNativeMap) {\n this._set.set(aStr, idx);\n } else {\n this._set[sStr] = idx;\n }\n }\n};\n\n/**\n * Is the given string a member of this set?\n *\n * @param String aStr\n */\nArraySet.prototype.has = function ArraySet_has(aStr) {\n if (hasNativeMap) {\n return this._set.has(aStr);\n } else {\n var sStr = util.toSetString(aStr);\n return has.call(this._set, sStr);\n }\n};\n\n/**\n * What is the index of the given string in the array?\n *\n * @param String aStr\n */\nArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) {\n if (hasNativeMap) {\n var idx = this._set.get(aStr);\n if (idx >= 0) {\n return idx;\n }\n } else {\n var sStr = util.toSetString(aStr);\n if (has.call(this._set, sStr)) {\n return this._set[sStr];\n }\n }\n\n throw new Error('\"' + aStr + '\" is not in the set.');\n};\n\n/**\n * What is the element at the given index?\n *\n * @param Number aIdx\n */\nArraySet.prototype.at = function ArraySet_at(aIdx) {\n if (aIdx >= 0 && aIdx < this._array.length) {\n return this._array[aIdx];\n }\n throw new Error('No element indexed by ' + aIdx);\n};\n\n/**\n * Returns the array representation of this set (which has the proper indices\n * indicated by indexOf). Note that this is a copy of the internal array used\n * for storing the members so that no one can mess with internal state.\n */\nArraySet.prototype.toArray = function ArraySet_toArray() {\n return this._array.slice();\n};\n\nexports.ArraySet = ArraySet;\n","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2014 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar util = require('./util');\n\n/**\n * Determine whether mappingB is after mappingA with respect to generated\n * position.\n */\nfunction generatedPositionAfter(mappingA, mappingB) {\n // Optimized for most common case\n var lineA = mappingA.generatedLine;\n var lineB = mappingB.generatedLine;\n var columnA = mappingA.generatedColumn;\n var columnB = mappingB.generatedColumn;\n return lineB > lineA || lineB == lineA && columnB >= columnA ||\n util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0;\n}\n\n/**\n * A data structure to provide a sorted view of accumulated mappings in a\n * performance conscious manner. It trades a neglibable overhead in general\n * case for a large speedup in case of mappings being added in order.\n */\nfunction MappingList() {\n this._array = [];\n this._sorted = true;\n // Serves as infimum\n this._last = {generatedLine: -1, generatedColumn: 0};\n}\n\n/**\n * Iterate through internal items. This method takes the same arguments that\n * `Array.prototype.forEach` takes.\n *\n * NOTE: The order of the mappings is NOT guaranteed.\n */\nMappingList.prototype.unsortedForEach =\n function MappingList_forEach(aCallback, aThisArg) {\n this._array.forEach(aCallback, aThisArg);\n };\n\n/**\n * Add the given source mapping.\n *\n * @param Object aMapping\n */\nMappingList.prototype.add = function MappingList_add(aMapping) {\n if (generatedPositionAfter(this._last, aMapping)) {\n this._last = aMapping;\n this._array.push(aMapping);\n } else {\n this._sorted = false;\n this._array.push(aMapping);\n }\n};\n\n/**\n * Returns the flat, sorted array of mappings. The mappings are sorted by\n * generated position.\n *\n * WARNING: This method returns internal data without copying, for\n * performance. The return value must NOT be mutated, and should be treated as\n * an immutable borrow. If you want to take ownership, you must make your own\n * copy.\n */\nMappingList.prototype.toArray = function MappingList_toArray() {\n if (!this._sorted) {\n this._array.sort(util.compareByGeneratedPositionsInflated);\n this._sorted = true;\n }\n return this._array;\n};\n\nexports.MappingList = MappingList;\n","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar base64VLQ = require('./base64-vlq');\nvar util = require('./util');\nvar ArraySet = require('./array-set').ArraySet;\nvar MappingList = require('./mapping-list').MappingList;\n\n/**\n * An instance of the SourceMapGenerator represents a source map which is\n * being built incrementally. You may pass an object with the following\n * properties:\n *\n * - file: The filename of the generated source.\n * - sourceRoot: A root for all relative URLs in this source map.\n */\nfunction SourceMapGenerator(aArgs) {\n if (!aArgs) {\n aArgs = {};\n }\n this._file = util.getArg(aArgs, 'file', null);\n this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null);\n this._skipValidation = util.getArg(aArgs, 'skipValidation', false);\n this._ignoreInvalidMapping = util.getArg(aArgs, 'ignoreInvalidMapping', false);\n this._sources = new ArraySet();\n this._names = new ArraySet();\n this._mappings = new MappingList();\n this._sourcesContents = null;\n}\n\nSourceMapGenerator.prototype._version = 3;\n\n/**\n * Creates a new SourceMapGenerator based on a SourceMapConsumer\n *\n * @param aSourceMapConsumer The SourceMap.\n */\nSourceMapGenerator.fromSourceMap =\n function SourceMapGenerator_fromSourceMap(aSourceMapConsumer, generatorOps) {\n var sourceRoot = aSourceMapConsumer.sourceRoot;\n var generator = new SourceMapGenerator(Object.assign(generatorOps || {}, {\n file: aSourceMapConsumer.file,\n sourceRoot: sourceRoot\n }));\n aSourceMapConsumer.eachMapping(function (mapping) {\n var newMapping = {\n generated: {\n line: mapping.generatedLine,\n column: mapping.generatedColumn\n }\n };\n\n if (mapping.source != null) {\n newMapping.source = mapping.source;\n if (sourceRoot != null) {\n newMapping.source = util.relative(sourceRoot, newMapping.source);\n }\n\n newMapping.original = {\n line: mapping.originalLine,\n column: mapping.originalColumn\n };\n\n if (mapping.name != null) {\n newMapping.name = mapping.name;\n }\n }\n\n generator.addMapping(newMapping);\n });\n aSourceMapConsumer.sources.forEach(function (sourceFile) {\n var sourceRelative = sourceFile;\n if (sourceRoot !== null) {\n sourceRelative = util.relative(sourceRoot, sourceFile);\n }\n\n if (!generator._sources.has(sourceRelative)) {\n generator._sources.add(sourceRelative);\n }\n\n var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n if (content != null) {\n generator.setSourceContent(sourceFile, content);\n }\n });\n return generator;\n };\n\n/**\n * Add a single mapping from original source line and column to the generated\n * source's line and column for this source map being created. The mapping\n * object should have the following properties:\n *\n * - generated: An object with the generated line and column positions.\n * - original: An object with the original line and column positions.\n * - source: The original source file (relative to the sourceRoot).\n * - name: An optional original token name for this mapping.\n */\nSourceMapGenerator.prototype.addMapping =\n function SourceMapGenerator_addMapping(aArgs) {\n var generated = util.getArg(aArgs, 'generated');\n var original = util.getArg(aArgs, 'original', null);\n var source = util.getArg(aArgs, 'source', null);\n var name = util.getArg(aArgs, 'name', null);\n\n if (!this._skipValidation) {\n if (this._validateMapping(generated, original, source, name) === false) {\n return;\n }\n }\n\n if (source != null) {\n source = String(source);\n if (!this._sources.has(source)) {\n this._sources.add(source);\n }\n }\n\n if (name != null) {\n name = String(name);\n if (!this._names.has(name)) {\n this._names.add(name);\n }\n }\n\n this._mappings.add({\n generatedLine: generated.line,\n generatedColumn: generated.column,\n originalLine: original != null && original.line,\n originalColumn: original != null && original.column,\n source: source,\n name: name\n });\n };\n\n/**\n * Set the source content for a source file.\n */\nSourceMapGenerator.prototype.setSourceContent =\n function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) {\n var source = aSourceFile;\n if (this._sourceRoot != null) {\n source = util.relative(this._sourceRoot, source);\n }\n\n if (aSourceContent != null) {\n // Add the source content to the _sourcesContents map.\n // Create a new _sourcesContents map if the property is null.\n if (!this._sourcesContents) {\n this._sourcesContents = Object.create(null);\n }\n this._sourcesContents[util.toSetString(source)] = aSourceContent;\n } else if (this._sourcesContents) {\n // Remove the source file from the _sourcesContents map.\n // If the _sourcesContents map is empty, set the property to null.\n delete this._sourcesContents[util.toSetString(source)];\n if (Object.keys(this._sourcesContents).length === 0) {\n this._sourcesContents = null;\n }\n }\n };\n\n/**\n * Applies the mappings of a sub-source-map for a specific source file to the\n * source map being generated. Each mapping to the supplied source file is\n * rewritten using the supplied source map. Note: The resolution for the\n * resulting mappings is the minimium of this map and the supplied map.\n *\n * @param aSourceMapConsumer The source map to be applied.\n * @param aSourceFile Optional. The filename of the source file.\n * If omitted, SourceMapConsumer's file property will be used.\n * @param aSourceMapPath Optional. The dirname of the path to the source map\n * to be applied. If relative, it is relative to the SourceMapConsumer.\n * This parameter is needed when the two source maps aren't in the same\n * directory, and the source map to be applied contains relative source\n * paths. If so, those relative source paths need to be rewritten\n * relative to the SourceMapGenerator.\n */\nSourceMapGenerator.prototype.applySourceMap =\n function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) {\n var sourceFile = aSourceFile;\n // If aSourceFile is omitted, we will use the file property of the SourceMap\n if (aSourceFile == null) {\n if (aSourceMapConsumer.file == null) {\n throw new Error(\n 'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' +\n 'or the source map\\'s \"file\" property. Both were omitted.'\n );\n }\n sourceFile = aSourceMapConsumer.file;\n }\n var sourceRoot = this._sourceRoot;\n // Make \"sourceFile\" relative if an absolute Url is passed.\n if (sourceRoot != null) {\n sourceFile = util.relative(sourceRoot, sourceFile);\n }\n // Applying the SourceMap can add and remove items from the sources and\n // the names array.\n var newSources = new ArraySet();\n var newNames = new ArraySet();\n\n // Find mappings for the \"sourceFile\"\n this._mappings.unsortedForEach(function (mapping) {\n if (mapping.source === sourceFile && mapping.originalLine != null) {\n // Check if it can be mapped by the source map, then update the mapping.\n var original = aSourceMapConsumer.originalPositionFor({\n line: mapping.originalLine,\n column: mapping.originalColumn\n });\n if (original.source != null) {\n // Copy mapping\n mapping.source = original.source;\n if (aSourceMapPath != null) {\n mapping.source = util.join(aSourceMapPath, mapping.source)\n }\n if (sourceRoot != null) {\n mapping.source = util.relative(sourceRoot, mapping.source);\n }\n mapping.originalLine = original.line;\n mapping.originalColumn = original.column;\n if (original.name != null) {\n mapping.name = original.name;\n }\n }\n }\n\n var source = mapping.source;\n if (source != null && !newSources.has(source)) {\n newSources.add(source);\n }\n\n var name = mapping.name;\n if (name != null && !newNames.has(name)) {\n newNames.add(name);\n }\n\n }, this);\n this._sources = newSources;\n this._names = newNames;\n\n // Copy sourcesContents of applied map.\n aSourceMapConsumer.sources.forEach(function (sourceFile) {\n var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n if (content != null) {\n if (aSourceMapPath != null) {\n sourceFile = util.join(aSourceMapPath, sourceFile);\n }\n if (sourceRoot != null) {\n sourceFile = util.relative(sourceRoot, sourceFile);\n }\n this.setSourceContent(sourceFile, content);\n }\n }, this);\n };\n\n/**\n * A mapping can have one of the three levels of data:\n *\n * 1. Just the generated position.\n * 2. The Generated position, original position, and original source.\n * 3. Generated and original position, original source, as well as a name\n * token.\n *\n * To maintain consistency, we validate that any new mapping being added falls\n * in to one of these categories.\n */\nSourceMapGenerator.prototype._validateMapping =\n function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource,\n aName) {\n // When aOriginal is truthy but has empty values for .line and .column,\n // it is most likely a programmer error. In this case we throw a very\n // specific error message to try to guide them the right way.\n // For example: https://github.com/Polymer/polymer-bundler/pull/519\n if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') {\n var message = 'original.line and original.column are not numbers -- you probably meant to omit ' +\n 'the original mapping entirely and only map the generated position. If so, pass ' +\n 'null for the original mapping instead of an object with empty or null values.'\n\n if (this._ignoreInvalidMapping) {\n if (typeof console !== 'undefined' && console.warn) {\n console.warn(message);\n }\n return false;\n } else {\n throw new Error(message);\n }\n }\n\n if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\n && aGenerated.line > 0 && aGenerated.column >= 0\n && !aOriginal && !aSource && !aName) {\n // Case 1.\n return;\n }\n else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\n && aOriginal && 'line' in aOriginal && 'column' in aOriginal\n && aGenerated.line > 0 && aGenerated.column >= 0\n && aOriginal.line > 0 && aOriginal.column >= 0\n && aSource) {\n // Cases 2 and 3.\n return;\n }\n else {\n var message = 'Invalid mapping: ' + JSON.stringify({\n generated: aGenerated,\n source: aSource,\n original: aOriginal,\n name: aName\n });\n\n if (this._ignoreInvalidMapping) {\n if (typeof console !== 'undefined' && console.warn) {\n console.warn(message);\n }\n return false;\n } else {\n throw new Error(message)\n }\n }\n };\n\n/**\n * Serialize the accumulated mappings in to the stream of base 64 VLQs\n * specified by the source map format.\n */\nSourceMapGenerator.prototype._serializeMappings =\n function SourceMapGenerator_serializeMappings() {\n var previousGeneratedColumn = 0;\n var previousGeneratedLine = 1;\n var previousOriginalColumn = 0;\n var previousOriginalLine = 0;\n var previousName = 0;\n var previousSource = 0;\n var result = '';\n var next;\n var mapping;\n var nameIdx;\n var sourceIdx;\n\n var mappings = this._mappings.toArray();\n for (var i = 0, len = mappings.length; i < len; i++) {\n mapping = mappings[i];\n next = ''\n\n if (mapping.generatedLine !== previousGeneratedLine) {\n previousGeneratedColumn = 0;\n while (mapping.generatedLine !== previousGeneratedLine) {\n next += ';';\n previousGeneratedLine++;\n }\n }\n else {\n if (i > 0) {\n if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) {\n continue;\n }\n next += ',';\n }\n }\n\n next += base64VLQ.encode(mapping.generatedColumn\n - previousGeneratedColumn);\n previousGeneratedColumn = mapping.generatedColumn;\n\n if (mapping.source != null) {\n sourceIdx = this._sources.indexOf(mapping.source);\n next += base64VLQ.encode(sourceIdx - previousSource);\n previousSource = sourceIdx;\n\n // lines are stored 0-based in SourceMap spec version 3\n next += base64VLQ.encode(mapping.originalLine - 1\n - previousOriginalLine);\n previousOriginalLine = mapping.originalLine - 1;\n\n next += base64VLQ.encode(mapping.originalColumn\n - previousOriginalColumn);\n previousOriginalColumn = mapping.originalColumn;\n\n if (mapping.name != null) {\n nameIdx = this._names.indexOf(mapping.name);\n next += base64VLQ.encode(nameIdx - previousName);\n previousName = nameIdx;\n }\n }\n\n result += next;\n }\n\n return result;\n };\n\nSourceMapGenerator.prototype._generateSourcesContent =\n function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {\n return aSources.map(function (source) {\n if (!this._sourcesContents) {\n return null;\n }\n if (aSourceRoot != null) {\n source = util.relative(aSourceRoot, source);\n }\n var key = util.toSetString(source);\n return Object.prototype.hasOwnProperty.call(this._sourcesContents, key)\n ? this._sourcesContents[key]\n : null;\n }, this);\n };\n\n/**\n * Externalize the source map.\n */\nSourceMapGenerator.prototype.toJSON =\n function SourceMapGenerator_toJSON() {\n var map = {\n version: this._version,\n sources: this._sources.toArray(),\n names: this._names.toArray(),\n mappings: this._serializeMappings()\n };\n if (this._file != null) {\n map.file = this._file;\n }\n if (this._sourceRoot != null) {\n map.sourceRoot = this._sourceRoot;\n }\n if (this._sourcesContents) {\n map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);\n }\n\n return map;\n };\n\n/**\n * Render the source map being generated to a string.\n */\nSourceMapGenerator.prototype.toString =\n function SourceMapGenerator_toString() {\n return JSON.stringify(this.toJSON());\n };\n\nexports.SourceMapGenerator = SourceMapGenerator;\n","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nexports.GREATEST_LOWER_BOUND = 1;\nexports.LEAST_UPPER_BOUND = 2;\n\n/**\n * Recursive implementation of binary search.\n *\n * @param aLow Indices here and lower do not contain the needle.\n * @param aHigh Indices here and higher do not contain the needle.\n * @param aNeedle The element being searched for.\n * @param aHaystack The non-empty array being searched.\n * @param aCompare Function which takes two elements and returns -1, 0, or 1.\n * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\n * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\n * closest element that is smaller than or greater than the one we are\n * searching for, respectively, if the exact element cannot be found.\n */\nfunction recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) {\n // This function terminates when one of the following is true:\n //\n // 1. We find the exact element we are looking for.\n //\n // 2. We did not find the exact element, but we can return the index of\n // the next-closest element.\n //\n // 3. We did not find the exact element, and there is no next-closest\n // element than the one we are searching for, so we return -1.\n var mid = Math.floor((aHigh - aLow) / 2) + aLow;\n var cmp = aCompare(aNeedle, aHaystack[mid], true);\n if (cmp === 0) {\n // Found the element we are looking for.\n return mid;\n }\n else if (cmp > 0) {\n // Our needle is greater than aHaystack[mid].\n if (aHigh - mid > 1) {\n // The element is in the upper half.\n return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias);\n }\n\n // The exact needle element was not found in this haystack. Determine if\n // we are in termination case (3) or (2) and return the appropriate thing.\n if (aBias == exports.LEAST_UPPER_BOUND) {\n return aHigh < aHaystack.length ? aHigh : -1;\n } else {\n return mid;\n }\n }\n else {\n // Our needle is less than aHaystack[mid].\n if (mid - aLow > 1) {\n // The element is in the lower half.\n return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias);\n }\n\n // we are in termination case (3) or (2) and return the appropriate thing.\n if (aBias == exports.LEAST_UPPER_BOUND) {\n return mid;\n } else {\n return aLow < 0 ? -1 : aLow;\n }\n }\n}\n\n/**\n * This is an implementation of binary search which will always try and return\n * the index of the closest element if there is no exact hit. This is because\n * mappings between original and generated line/col pairs are single points,\n * and there is an implicit region between each of them, so a miss just means\n * that you aren't on the very start of a region.\n *\n * @param aNeedle The element you are looking for.\n * @param aHaystack The array that is being searched.\n * @param aCompare A function which takes the needle and an element in the\n * array and returns -1, 0, or 1 depending on whether the needle is less\n * than, equal to, or greater than the element, respectively.\n * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\n * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\n * closest element that is smaller than or greater than the one we are\n * searching for, respectively, if the exact element cannot be found.\n * Defaults to 'binarySearch.GREATEST_LOWER_BOUND'.\n */\nexports.search = function search(aNeedle, aHaystack, aCompare, aBias) {\n if (aHaystack.length === 0) {\n return -1;\n }\n\n var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack,\n aCompare, aBias || exports.GREATEST_LOWER_BOUND);\n if (index < 0) {\n return -1;\n }\n\n // We have found either the exact element, or the next-closest element than\n // the one we are searching for. However, there may be more than one such\n // element. Make sure we always return the smallest of these.\n while (index - 1 >= 0) {\n if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) {\n break;\n }\n --index;\n }\n\n return index;\n};\n","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\n// It turns out that some (most?) JavaScript engines don't self-host\n// `Array.prototype.sort`. This makes sense because C++ will likely remain\n// faster than JS when doing raw CPU-intensive sorting. However, when using a\n// custom comparator function, calling back and forth between the VM's C++ and\n// JIT'd JS is rather slow *and* loses JIT type information, resulting in\n// worse generated code for the comparator function than would be optimal. In\n// fact, when sorting with a comparator, these costs outweigh the benefits of\n// sorting in C++. By using our own JS-implemented Quick Sort (below), we get\n// a ~3500ms mean speed-up in `bench/bench.html`.\n\nfunction SortTemplate(comparator) {\n\n/**\n * Swap the elements indexed by `x` and `y` in the array `ary`.\n *\n * @param {Array} ary\n * The array.\n * @param {Number} x\n * The index of the first item.\n * @param {Number} y\n * The index of the second item.\n */\nfunction swap(ary, x, y) {\n var temp = ary[x];\n ary[x] = ary[y];\n ary[y] = temp;\n}\n\n/**\n * Returns a random integer within the range `low .. high` inclusive.\n *\n * @param {Number} low\n * The lower bound on the range.\n * @param {Number} high\n * The upper bound on the range.\n */\nfunction randomIntInRange(low, high) {\n return Math.round(low + (Math.random() * (high - low)));\n}\n\n/**\n * The Quick Sort algorithm.\n *\n * @param {Array} ary\n * An array to sort.\n * @param {function} comparator\n * Function to use to compare two items.\n * @param {Number} p\n * Start index of the array\n * @param {Number} r\n * End index of the array\n */\nfunction doQuickSort(ary, comparator, p, r) {\n // If our lower bound is less than our upper bound, we (1) partition the\n // array into two pieces and (2) recurse on each half. If it is not, this is\n // the empty array and our base case.\n\n if (p < r) {\n // (1) Partitioning.\n //\n // The partitioning chooses a pivot between `p` and `r` and moves all\n // elements that are less than or equal to the pivot to the before it, and\n // all the elements that are greater than it after it. The effect is that\n // once partition is done, the pivot is in the exact place it will be when\n // the array is put in sorted order, and it will not need to be moved\n // again. This runs in O(n) time.\n\n // Always choose a random pivot so that an input array which is reverse\n // sorted does not cause O(n^2) running time.\n var pivotIndex = randomIntInRange(p, r);\n var i = p - 1;\n\n swap(ary, pivotIndex, r);\n var pivot = ary[r];\n\n // Immediately after `j` is incremented in this loop, the following hold\n // true:\n //\n // * Every element in `ary[p .. i]` is less than or equal to the pivot.\n //\n // * Every element in `ary[i+1 .. j-1]` is greater than the pivot.\n for (var j = p; j < r; j++) {\n if (comparator(ary[j], pivot, false) <= 0) {\n i += 1;\n swap(ary, i, j);\n }\n }\n\n swap(ary, i + 1, j);\n var q = i + 1;\n\n // (2) Recurse on each half.\n\n doQuickSort(ary, comparator, p, q - 1);\n doQuickSort(ary, comparator, q + 1, r);\n }\n}\n\n return doQuickSort;\n}\n\nfunction cloneSort(comparator) {\n let template = SortTemplate.toString();\n let templateFn = new Function(`return ${template}`)();\n return templateFn(comparator);\n}\n\n/**\n * Sort the given array in-place with the given comparator function.\n *\n * @param {Array} ary\n * An array to sort.\n * @param {function} comparator\n * Function to use to compare two items.\n */\n\nlet sortCache = new WeakMap();\nexports.quickSort = function (ary, comparator, start = 0) {\n let doQuickSort = sortCache.get(comparator);\n if (doQuickSort === void 0) {\n doQuickSort = cloneSort(comparator);\n sortCache.set(comparator, doQuickSort);\n }\n doQuickSort(ary, comparator, start, ary.length - 1);\n};\n","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar util = require('./util');\nvar binarySearch = require('./binary-search');\nvar ArraySet = require('./array-set').ArraySet;\nvar base64VLQ = require('./base64-vlq');\nvar quickSort = require('./quick-sort').quickSort;\n\nfunction SourceMapConsumer(aSourceMap, aSourceMapURL) {\n var sourceMap = aSourceMap;\n if (typeof aSourceMap === 'string') {\n sourceMap = util.parseSourceMapInput(aSourceMap);\n }\n\n return sourceMap.sections != null\n ? new IndexedSourceMapConsumer(sourceMap, aSourceMapURL)\n : new BasicSourceMapConsumer(sourceMap, aSourceMapURL);\n}\n\nSourceMapConsumer.fromSourceMap = function(aSourceMap, aSourceMapURL) {\n return BasicSourceMapConsumer.fromSourceMap(aSourceMap, aSourceMapURL);\n}\n\n/**\n * The version of the source mapping spec that we are consuming.\n */\nSourceMapConsumer.prototype._version = 3;\n\n// `__generatedMappings` and `__originalMappings` are arrays that hold the\n// parsed mapping coordinates from the source map's \"mappings\" attribute. They\n// are lazily instantiated, accessed via the `_generatedMappings` and\n// `_originalMappings` getters respectively, and we only parse the mappings\n// and create these arrays once queried for a source location. We jump through\n// these hoops because there can be many thousands of mappings, and parsing\n// them is expensive, so we only want to do it if we must.\n//\n// Each object in the arrays is of the form:\n//\n// {\n// generatedLine: The line number in the generated code,\n// generatedColumn: The column number in the generated code,\n// source: The path to the original source file that generated this\n// chunk of code,\n// originalLine: The line number in the original source that\n// corresponds to this chunk of generated code,\n// originalColumn: The column number in the original source that\n// corresponds to this chunk of generated code,\n// name: The name of the original symbol which generated this chunk of\n// code.\n// }\n//\n// All properties except for `generatedLine` and `generatedColumn` can be\n// `null`.\n//\n// `_generatedMappings` is ordered by the generated positions.\n//\n// `_originalMappings` is ordered by the original positions.\n\nSourceMapConsumer.prototype.__generatedMappings = null;\nObject.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', {\n configurable: true,\n enumerable: true,\n get: function () {\n if (!this.__generatedMappings) {\n this._parseMappings(this._mappings, this.sourceRoot);\n }\n\n return this.__generatedMappings;\n }\n});\n\nSourceMapConsumer.prototype.__originalMappings = null;\nObject.defineProperty(SourceMapConsumer.prototype, '_originalMappings', {\n configurable: true,\n enumerable: true,\n get: function () {\n if (!this.__originalMappings) {\n this._parseMappings(this._mappings, this.sourceRoot);\n }\n\n return this.__originalMappings;\n }\n});\n\nSourceMapConsumer.prototype._charIsMappingSeparator =\n function SourceMapConsumer_charIsMappingSeparator(aStr, index) {\n var c = aStr.charAt(index);\n return c === \";\" || c === \",\";\n };\n\n/**\n * Parse the mappings in a string in to a data structure which we can easily\n * query (the ordered arrays in the `this.__generatedMappings` and\n * `this.__originalMappings` properties).\n */\nSourceMapConsumer.prototype._parseMappings =\n function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n throw new Error(\"Subclasses must implement _parseMappings\");\n };\n\nSourceMapConsumer.GENERATED_ORDER = 1;\nSourceMapConsumer.ORIGINAL_ORDER = 2;\n\nSourceMapConsumer.GREATEST_LOWER_BOUND = 1;\nSourceMapConsumer.LEAST_UPPER_BOUND = 2;\n\n/**\n * Iterate over each mapping between an original source/line/column and a\n * generated line/column in this source map.\n *\n * @param Function aCallback\n * The function that is called with each mapping.\n * @param Object aContext\n * Optional. If specified, this object will be the value of `this` every\n * time that `aCallback` is called.\n * @param aOrder\n * Either `SourceMapConsumer.GENERATED_ORDER` or\n * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to\n * iterate over the mappings sorted by the generated file's line/column\n * order or the original's source/line/column order, respectively. Defaults to\n * `SourceMapConsumer.GENERATED_ORDER`.\n */\nSourceMapConsumer.prototype.eachMapping =\n function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) {\n var context = aContext || null;\n var order = aOrder || SourceMapConsumer.GENERATED_ORDER;\n\n var mappings;\n switch (order) {\n case SourceMapConsumer.GENERATED_ORDER:\n mappings = this._generatedMappings;\n break;\n case SourceMapConsumer.ORIGINAL_ORDER:\n mappings = this._originalMappings;\n break;\n default:\n throw new Error(\"Unknown order of iteration.\");\n }\n\n var sourceRoot = this.sourceRoot;\n var boundCallback = aCallback.bind(context);\n var names = this._names;\n var sources = this._sources;\n var sourceMapURL = this._sourceMapURL;\n\n for (var i = 0, n = mappings.length; i < n; i++) {\n var mapping = mappings[i];\n var source = mapping.source === null ? null : sources.at(mapping.source);\n if(source !== null) {\n source = util.computeSourceURL(sourceRoot, source, sourceMapURL);\n }\n boundCallback({\n source: source,\n generatedLine: mapping.generatedLine,\n generatedColumn: mapping.generatedColumn,\n originalLine: mapping.originalLine,\n originalColumn: mapping.originalColumn,\n name: mapping.name === null ? null : names.at(mapping.name)\n });\n }\n };\n\n/**\n * Returns all generated line and column information for the original source,\n * line, and column provided. If no column is provided, returns all mappings\n * corresponding to a either the line we are searching for or the next\n * closest line that has any mappings. Otherwise, returns all mappings\n * corresponding to the given line and either the column we are searching for\n * or the next closest column that has any offsets.\n *\n * The only argument is an object with the following properties:\n *\n * - source: The filename of the original source.\n * - line: The line number in the original source. The line number is 1-based.\n * - column: Optional. the column number in the original source.\n * The column number is 0-based.\n *\n * and an array of objects is returned, each with the following properties:\n *\n * - line: The line number in the generated source, or null. The\n * line number is 1-based.\n * - column: The column number in the generated source, or null.\n * The column number is 0-based.\n */\nSourceMapConsumer.prototype.allGeneratedPositionsFor =\n function SourceMapConsumer_allGeneratedPositionsFor(aArgs) {\n var line = util.getArg(aArgs, 'line');\n\n // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping\n // returns the index of the closest mapping less than the needle. By\n // setting needle.originalColumn to 0, we thus find the last mapping for\n // the given line, provided such a mapping exists.\n var needle = {\n source: util.getArg(aArgs, 'source'),\n originalLine: line,\n originalColumn: util.getArg(aArgs, 'column', 0)\n };\n\n needle.source = this._findSourceIndex(needle.source);\n if (needle.source < 0) {\n return [];\n }\n\n var mappings = [];\n\n var index = this._findMapping(needle,\n this._originalMappings,\n \"originalLine\",\n \"originalColumn\",\n util.compareByOriginalPositions,\n binarySearch.LEAST_UPPER_BOUND);\n if (index >= 0) {\n var mapping = this._originalMappings[index];\n\n if (aArgs.column === undefined) {\n var originalLine = mapping.originalLine;\n\n // Iterate until either we run out of mappings, or we run into\n // a mapping for a different line than the one we found. Since\n // mappings are sorted, this is guaranteed to find all mappings for\n // the line we found.\n while (mapping && mapping.originalLine === originalLine) {\n mappings.push({\n line: util.getArg(mapping, 'generatedLine', null),\n column: util.getArg(mapping, 'generatedColumn', null),\n lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n });\n\n mapping = this._originalMappings[++index];\n }\n } else {\n var originalColumn = mapping.originalColumn;\n\n // Iterate until either we run out of mappings, or we run into\n // a mapping for a different line than the one we were searching for.\n // Since mappings are sorted, this is guaranteed to find all mappings for\n // the line we are searching for.\n while (mapping &&\n mapping.originalLine === line &&\n mapping.originalColumn == originalColumn) {\n mappings.push({\n line: util.getArg(mapping, 'generatedLine', null),\n column: util.getArg(mapping, 'generatedColumn', null),\n lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n });\n\n mapping = this._originalMappings[++index];\n }\n }\n }\n\n return mappings;\n };\n\nexports.SourceMapConsumer = SourceMapConsumer;\n\n/**\n * A BasicSourceMapConsumer instance represents a parsed source map which we can\n * query for information about the original file positions by giving it a file\n * position in the generated source.\n *\n * The first parameter is the raw source map (either as a JSON string, or\n * already parsed to an object). According to the spec, source maps have the\n * following attributes:\n *\n * - version: Which version of the source map spec this map is following.\n * - sources: An array of URLs to the original source files.\n * - names: An array of identifiers which can be referrenced by individual mappings.\n * - sourceRoot: Optional. The URL root from which all sources are relative.\n * - sourcesContent: Optional. An array of contents of the original source files.\n * - mappings: A string of base64 VLQs which contain the actual mappings.\n * - file: Optional. The generated file this source map is associated with.\n *\n * Here is an example source map, taken from the source map spec[0]:\n *\n * {\n * version : 3,\n * file: \"out.js\",\n * sourceRoot : \"\",\n * sources: [\"foo.js\", \"bar.js\"],\n * names: [\"src\", \"maps\", \"are\", \"fun\"],\n * mappings: \"AA,AB;;ABCDE;\"\n * }\n *\n * The second parameter, if given, is a string whose value is the URL\n * at which the source map was found. This URL is used to compute the\n * sources array.\n *\n * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#\n */\nfunction BasicSourceMapConsumer(aSourceMap, aSourceMapURL) {\n var sourceMap = aSourceMap;\n if (typeof aSourceMap === 'string') {\n sourceMap = util.parseSourceMapInput(aSourceMap);\n }\n\n var version = util.getArg(sourceMap, 'version');\n var sources = util.getArg(sourceMap, 'sources');\n // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which\n // requires the array) to play nice here.\n var names = util.getArg(sourceMap, 'names', []);\n var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null);\n var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null);\n var mappings = util.getArg(sourceMap, 'mappings');\n var file = util.getArg(sourceMap, 'file', null);\n\n // Once again, Sass deviates from the spec and supplies the version as a\n // string rather than a number, so we use loose equality checking here.\n if (version != this._version) {\n throw new Error('Unsupported version: ' + version);\n }\n\n if (sourceRoot) {\n sourceRoot = util.normalize(sourceRoot);\n }\n\n sources = sources\n .map(String)\n // Some source maps produce relative source paths like \"./foo.js\" instead of\n // \"foo.js\". Normalize these first so that future comparisons will succeed.\n // See bugzil.la/1090768.\n .map(util.normalize)\n // Always ensure that absolute sources are internally stored relative to\n // the source root, if the source root is absolute. Not doing this would\n // be particularly problematic when the source root is a prefix of the\n // source (valid, but why??). See github issue #199 and bugzil.la/1188982.\n .map(function (source) {\n return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source)\n ? util.relative(sourceRoot, source)\n : source;\n });\n\n // Pass `true` below to allow duplicate names and sources. While source maps\n // are intended to be compressed and deduplicated, the TypeScript compiler\n // sometimes generates source maps with duplicates in them. See Github issue\n // #72 and bugzil.la/889492.\n this._names = ArraySet.fromArray(names.map(String), true);\n this._sources = ArraySet.fromArray(sources, true);\n\n this._absoluteSources = this._sources.toArray().map(function (s) {\n return util.computeSourceURL(sourceRoot, s, aSourceMapURL);\n });\n\n this.sourceRoot = sourceRoot;\n this.sourcesContent = sourcesContent;\n this._mappings = mappings;\n this._sourceMapURL = aSourceMapURL;\n this.file = file;\n}\n\nBasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\nBasicSourceMapConsumer.prototype.consumer = SourceMapConsumer;\n\n/**\n * Utility function to find the index of a source. Returns -1 if not\n * found.\n */\nBasicSourceMapConsumer.prototype._findSourceIndex = function(aSource) {\n var relativeSource = aSource;\n if (this.sourceRoot != null) {\n relativeSource = util.relative(this.sourceRoot, relativeSource);\n }\n\n if (this._sources.has(relativeSource)) {\n return this._sources.indexOf(relativeSource);\n }\n\n // Maybe aSource is an absolute URL as returned by |sources|. In\n // this case we can't simply undo the transform.\n var i;\n for (i = 0; i < this._absoluteSources.length; ++i) {\n if (this._absoluteSources[i] == aSource) {\n return i;\n }\n }\n\n return -1;\n};\n\n/**\n * Create a BasicSourceMapConsumer from a SourceMapGenerator.\n *\n * @param SourceMapGenerator aSourceMap\n * The source map that will be consumed.\n * @param String aSourceMapURL\n * The URL at which the source map can be found (optional)\n * @returns BasicSourceMapConsumer\n */\nBasicSourceMapConsumer.fromSourceMap =\n function SourceMapConsumer_fromSourceMap(aSourceMap, aSourceMapURL) {\n var smc = Object.create(BasicSourceMapConsumer.prototype);\n\n var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true);\n var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true);\n smc.sourceRoot = aSourceMap._sourceRoot;\n smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(),\n smc.sourceRoot);\n smc.file = aSourceMap._file;\n smc._sourceMapURL = aSourceMapURL;\n smc._absoluteSources = smc._sources.toArray().map(function (s) {\n return util.computeSourceURL(smc.sourceRoot, s, aSourceMapURL);\n });\n\n // Because we are modifying the entries (by converting string sources and\n // names to indices into the sources and names ArraySets), we have to make\n // a copy of the entry or else bad things happen. Shared mutable state\n // strikes again! See github issue #191.\n\n var generatedMappings = aSourceMap._mappings.toArray().slice();\n var destGeneratedMappings = smc.__generatedMappings = [];\n var destOriginalMappings = smc.__originalMappings = [];\n\n for (var i = 0, length = generatedMappings.length; i < length; i++) {\n var srcMapping = generatedMappings[i];\n var destMapping = new Mapping;\n destMapping.generatedLine = srcMapping.generatedLine;\n destMapping.generatedColumn = srcMapping.generatedColumn;\n\n if (srcMapping.source) {\n destMapping.source = sources.indexOf(srcMapping.source);\n destMapping.originalLine = srcMapping.originalLine;\n destMapping.originalColumn = srcMapping.originalColumn;\n\n if (srcMapping.name) {\n destMapping.name = names.indexOf(srcMapping.name);\n }\n\n destOriginalMappings.push(destMapping);\n }\n\n destGeneratedMappings.push(destMapping);\n }\n\n quickSort(smc.__originalMappings, util.compareByOriginalPositions);\n\n return smc;\n };\n\n/**\n * The version of the source mapping spec that we are consuming.\n */\nBasicSourceMapConsumer.prototype._version = 3;\n\n/**\n * The list of original sources.\n */\nObject.defineProperty(BasicSourceMapConsumer.prototype, 'sources', {\n get: function () {\n return this._absoluteSources.slice();\n }\n});\n\n/**\n * Provide the JIT with a nice shape / hidden class.\n */\nfunction Mapping() {\n this.generatedLine = 0;\n this.generatedColumn = 0;\n this.source = null;\n this.originalLine = null;\n this.originalColumn = null;\n this.name = null;\n}\n\n/**\n * Parse the mappings in a string in to a data structure which we can easily\n * query (the ordered arrays in the `this.__generatedMappings` and\n * `this.__originalMappings` properties).\n */\n\nconst compareGenerated = util.compareByGeneratedPositionsDeflatedNoLine;\nfunction sortGenerated(array, start) {\n let l = array.length;\n let n = array.length - start;\n if (n <= 1) {\n return;\n } else if (n == 2) {\n let a = array[start];\n let b = array[start + 1];\n if (compareGenerated(a, b) > 0) {\n array[start] = b;\n array[start + 1] = a;\n }\n } else if (n < 20) {\n for (let i = start; i < l; i++) {\n for (let j = i; j > start; j--) {\n let a = array[j - 1];\n let b = array[j];\n if (compareGenerated(a, b) <= 0) {\n break;\n }\n array[j - 1] = b;\n array[j] = a;\n }\n }\n } else {\n quickSort(array, compareGenerated, start);\n }\n}\nBasicSourceMapConsumer.prototype._parseMappings =\n function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n var generatedLine = 1;\n var previousGeneratedColumn = 0;\n var previousOriginalLine = 0;\n var previousOriginalColumn = 0;\n var previousSource = 0;\n var previousName = 0;\n var length = aStr.length;\n var index = 0;\n var cachedSegments = {};\n var temp = {};\n var originalMappings = [];\n var generatedMappings = [];\n var mapping, str, segment, end, value;\n\n let subarrayStart = 0;\n while (index < length) {\n if (aStr.charAt(index) === ';') {\n generatedLine++;\n index++;\n previousGeneratedColumn = 0;\n\n sortGenerated(generatedMappings, subarrayStart);\n subarrayStart = generatedMappings.length;\n }\n else if (aStr.charAt(index) === ',') {\n index++;\n }\n else {\n mapping = new Mapping();\n mapping.generatedLine = generatedLine;\n\n for (end = index; end < length; end++) {\n if (this._charIsMappingSeparator(aStr, end)) {\n break;\n }\n }\n str = aStr.slice(index, end);\n\n segment = [];\n while (index < end) {\n base64VLQ.decode(aStr, index, temp);\n value = temp.value;\n index = temp.rest;\n segment.push(value);\n }\n\n if (segment.length === 2) {\n throw new Error('Found a source, but no line and column');\n }\n\n if (segment.length === 3) {\n throw new Error('Found a source and line, but no column');\n }\n\n // Generated column.\n mapping.generatedColumn = previousGeneratedColumn + segment[0];\n previousGeneratedColumn = mapping.generatedColumn;\n\n if (segment.length > 1) {\n // Original source.\n mapping.source = previousSource + segment[1];\n previousSource += segment[1];\n\n // Original line.\n mapping.originalLine = previousOriginalLine + segment[2];\n previousOriginalLine = mapping.originalLine;\n // Lines are stored 0-based\n mapping.originalLine += 1;\n\n // Original column.\n mapping.originalColumn = previousOriginalColumn + segment[3];\n previousOriginalColumn = mapping.originalColumn;\n\n if (segment.length > 4) {\n // Original name.\n mapping.name = previousName + segment[4];\n previousName += segment[4];\n }\n }\n\n generatedMappings.push(mapping);\n if (typeof mapping.originalLine === 'number') {\n let currentSource = mapping.source;\n while (originalMappings.length <= currentSource) {\n originalMappings.push(null);\n }\n if (originalMappings[currentSource] === null) {\n originalMappings[currentSource] = [];\n }\n originalMappings[currentSource].push(mapping);\n }\n }\n }\n\n sortGenerated(generatedMappings, subarrayStart);\n this.__generatedMappings = generatedMappings;\n\n for (var i = 0; i < originalMappings.length; i++) {\n if (originalMappings[i] != null) {\n quickSort(originalMappings[i], util.compareByOriginalPositionsNoSource);\n }\n }\n this.__originalMappings = [].concat(...originalMappings);\n };\n\n/**\n * Find the mapping that best matches the hypothetical \"needle\" mapping that\n * we are searching for in the given \"haystack\" of mappings.\n */\nBasicSourceMapConsumer.prototype._findMapping =\n function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName,\n aColumnName, aComparator, aBias) {\n // To return the position we are searching for, we must first find the\n // mapping for the given position and then return the opposite position it\n // points to. Because the mappings are sorted, we can use binary search to\n // find the best mapping.\n\n if (aNeedle[aLineName] <= 0) {\n throw new TypeError('Line must be greater than or equal to 1, got '\n + aNeedle[aLineName]);\n }\n if (aNeedle[aColumnName] < 0) {\n throw new TypeError('Column must be greater than or equal to 0, got '\n + aNeedle[aColumnName]);\n }\n\n return binarySearch.search(aNeedle, aMappings, aComparator, aBias);\n };\n\n/**\n * Compute the last column for each generated mapping. The last column is\n * inclusive.\n */\nBasicSourceMapConsumer.prototype.computeColumnSpans =\n function SourceMapConsumer_computeColumnSpans() {\n for (var index = 0; index < this._generatedMappings.length; ++index) {\n var mapping = this._generatedMappings[index];\n\n // Mappings do not contain a field for the last generated columnt. We\n // can come up with an optimistic estimate, however, by assuming that\n // mappings are contiguous (i.e. given two consecutive mappings, the\n // first mapping ends where the second one starts).\n if (index + 1 < this._generatedMappings.length) {\n var nextMapping = this._generatedMappings[index + 1];\n\n if (mapping.generatedLine === nextMapping.generatedLine) {\n mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1;\n continue;\n }\n }\n\n // The last mapping for each line spans the entire line.\n mapping.lastGeneratedColumn = Infinity;\n }\n };\n\n/**\n * Returns the original source, line, and column information for the generated\n * source's line and column positions provided. The only argument is an object\n * with the following properties:\n *\n * - line: The line number in the generated source. The line number\n * is 1-based.\n * - column: The column number in the generated source. The column\n * number is 0-based.\n * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\n * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\n * closest element that is smaller than or greater than the one we are\n * searching for, respectively, if the exact element cannot be found.\n * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\n *\n * and an object is returned with the following properties:\n *\n * - source: The original source file, or null.\n * - line: The line number in the original source, or null. The\n * line number is 1-based.\n * - column: The column number in the original source, or null. The\n * column number is 0-based.\n * - name: The original identifier, or null.\n */\nBasicSourceMapConsumer.prototype.originalPositionFor =\n function SourceMapConsumer_originalPositionFor(aArgs) {\n var needle = {\n generatedLine: util.getArg(aArgs, 'line'),\n generatedColumn: util.getArg(aArgs, 'column')\n };\n\n var index = this._findMapping(\n needle,\n this._generatedMappings,\n \"generatedLine\",\n \"generatedColumn\",\n util.compareByGeneratedPositionsDeflated,\n util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)\n );\n\n if (index >= 0) {\n var mapping = this._generatedMappings[index];\n\n if (mapping.generatedLine === needle.generatedLine) {\n var source = util.getArg(mapping, 'source', null);\n if (source !== null) {\n source = this._sources.at(source);\n source = util.computeSourceURL(this.sourceRoot, source, this._sourceMapURL);\n }\n var name = util.getArg(mapping, 'name', null);\n if (name !== null) {\n name = this._names.at(name);\n }\n return {\n source: source,\n line: util.getArg(mapping, 'originalLine', null),\n column: util.getArg(mapping, 'originalColumn', null),\n name: name\n };\n }\n }\n\n return {\n source: null,\n line: null,\n column: null,\n name: null\n };\n };\n\n/**\n * Return true if we have the source content for every source in the source\n * map, false otherwise.\n */\nBasicSourceMapConsumer.prototype.hasContentsOfAllSources =\n function BasicSourceMapConsumer_hasContentsOfAllSources() {\n if (!this.sourcesContent) {\n return false;\n }\n return this.sourcesContent.length >= this._sources.size() &&\n !this.sourcesContent.some(function (sc) { return sc == null; });\n };\n\n/**\n * Returns the original source content. The only argument is the url of the\n * original source file. Returns null if no original source content is\n * available.\n */\nBasicSourceMapConsumer.prototype.sourceContentFor =\n function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {\n if (!this.sourcesContent) {\n return null;\n }\n\n var index = this._findSourceIndex(aSource);\n if (index >= 0) {\n return this.sourcesContent[index];\n }\n\n var relativeSource = aSource;\n if (this.sourceRoot != null) {\n relativeSource = util.relative(this.sourceRoot, relativeSource);\n }\n\n var url;\n if (this.sourceRoot != null\n && (url = util.urlParse(this.sourceRoot))) {\n // XXX: file:// URIs and absolute paths lead to unexpected behavior for\n // many users. We can help them out when they expect file:// URIs to\n // behave like it would if they were running a local HTTP server. See\n // https://bugzilla.mozilla.org/show_bug.cgi?id=885597.\n var fileUriAbsPath = relativeSource.replace(/^file:\\/\\//, \"\");\n if (url.scheme == \"file\"\n && this._sources.has(fileUriAbsPath)) {\n return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]\n }\n\n if ((!url.path || url.path == \"/\")\n && this._sources.has(\"/\" + relativeSource)) {\n return this.sourcesContent[this._sources.indexOf(\"/\" + relativeSource)];\n }\n }\n\n // This function is used recursively from\n // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we\n // don't want to throw if we can't find the source - we just want to\n // return null, so we provide a flag to exit gracefully.\n if (nullOnMissing) {\n return null;\n }\n else {\n throw new Error('\"' + relativeSource + '\" is not in the SourceMap.');\n }\n };\n\n/**\n * Returns the generated line and column information for the original source,\n * line, and column positions provided. The only argument is an object with\n * the following properties:\n *\n * - source: The filename of the original source.\n * - line: The line number in the original source. The line number\n * is 1-based.\n * - column: The column number in the original source. The column\n * number is 0-based.\n * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\n * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\n * closest element that is smaller than or greater than the one we are\n * searching for, respectively, if the exact element cannot be found.\n * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\n *\n * and an object is returned with the following properties:\n *\n * - line: The line number in the generated source, or null. The\n * line number is 1-based.\n * - column: The column number in the generated source, or null.\n * The column number is 0-based.\n */\nBasicSourceMapConsumer.prototype.generatedPositionFor =\n function SourceMapConsumer_generatedPositionFor(aArgs) {\n var source = util.getArg(aArgs, 'source');\n source = this._findSourceIndex(source);\n if (source < 0) {\n return {\n line: null,\n column: null,\n lastColumn: null\n };\n }\n\n var needle = {\n source: source,\n originalLine: util.getArg(aArgs, 'line'),\n originalColumn: util.getArg(aArgs, 'column')\n };\n\n var index = this._findMapping(\n needle,\n this._originalMappings,\n \"originalLine\",\n \"originalColumn\",\n util.compareByOriginalPositions,\n util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)\n );\n\n if (index >= 0) {\n var mapping = this._originalMappings[index];\n\n if (mapping.source === needle.source) {\n return {\n line: util.getArg(mapping, 'generatedLine', null),\n column: util.getArg(mapping, 'generatedColumn', null),\n lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n };\n }\n }\n\n return {\n line: null,\n column: null,\n lastColumn: null\n };\n };\n\nexports.BasicSourceMapConsumer = BasicSourceMapConsumer;\n\n/**\n * An IndexedSourceMapConsumer instance represents a parsed source map which\n * we can query for information. It differs from BasicSourceMapConsumer in\n * that it takes \"indexed\" source maps (i.e. ones with a \"sections\" field) as\n * input.\n *\n * The first parameter is a raw source map (either as a JSON string, or already\n * parsed to an object). According to the spec for indexed source maps, they\n * have the following attributes:\n *\n * - version: Which version of the source map spec this map is following.\n * - file: Optional. The generated file this source map is associated with.\n * - sections: A list of section definitions.\n *\n * Each value under the \"sections\" field has two fields:\n * - offset: The offset into the original specified at which this section\n * begins to apply, defined as an object with a \"line\" and \"column\"\n * field.\n * - map: A source map definition. This source map could also be indexed,\n * but doesn't have to be.\n *\n * Instead of the \"map\" field, it's also possible to have a \"url\" field\n * specifying a URL to retrieve a source map from, but that's currently\n * unsupported.\n *\n * Here's an example source map, taken from the source map spec[0], but\n * modified to omit a section which uses the \"url\" field.\n *\n * {\n * version : 3,\n * file: \"app.js\",\n * sections: [{\n * offset: {line:100, column:10},\n * map: {\n * version : 3,\n * file: \"section.js\",\n * sources: [\"foo.js\", \"bar.js\"],\n * names: [\"src\", \"maps\", \"are\", \"fun\"],\n * mappings: \"AAAA,E;;ABCDE;\"\n * }\n * }],\n * }\n *\n * The second parameter, if given, is a string whose value is the URL\n * at which the source map was found. This URL is used to compute the\n * sources array.\n *\n * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt\n */\nfunction IndexedSourceMapConsumer(aSourceMap, aSourceMapURL) {\n var sourceMap = aSourceMap;\n if (typeof aSourceMap === 'string') {\n sourceMap = util.parseSourceMapInput(aSourceMap);\n }\n\n var version = util.getArg(sourceMap, 'version');\n var sections = util.getArg(sourceMap, 'sections');\n\n if (version != this._version) {\n throw new Error('Unsupported version: ' + version);\n }\n\n this._sources = new ArraySet();\n this._names = new ArraySet();\n\n var lastOffset = {\n line: -1,\n column: 0\n };\n this._sections = sections.map(function (s) {\n if (s.url) {\n // The url field will require support for asynchronicity.\n // See https://github.com/mozilla/source-map/issues/16\n throw new Error('Support for url field in sections not implemented.');\n }\n var offset = util.getArg(s, 'offset');\n var offsetLine = util.getArg(offset, 'line');\n var offsetColumn = util.getArg(offset, 'column');\n\n if (offsetLine < lastOffset.line ||\n (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) {\n throw new Error('Section offsets must be ordered and non-overlapping.');\n }\n lastOffset = offset;\n\n return {\n generatedOffset: {\n // The offset fields are 0-based, but we use 1-based indices when\n // encoding/decoding from VLQ.\n generatedLine: offsetLine + 1,\n generatedColumn: offsetColumn + 1\n },\n consumer: new SourceMapConsumer(util.getArg(s, 'map'), aSourceMapURL)\n }\n });\n}\n\nIndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\nIndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer;\n\n/**\n * The version of the source mapping spec that we are consuming.\n */\nIndexedSourceMapConsumer.prototype._version = 3;\n\n/**\n * The list of original sources.\n */\nObject.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', {\n get: function () {\n var sources = [];\n for (var i = 0; i < this._sections.length; i++) {\n for (var j = 0; j < this._sections[i].consumer.sources.length; j++) {\n sources.push(this._sections[i].consumer.sources[j]);\n }\n }\n return sources;\n }\n});\n\n/**\n * Returns the original source, line, and column information for the generated\n * source's line and column positions provided. The only argument is an object\n * with the following properties:\n *\n * - line: The line number in the generated source. The line number\n * is 1-based.\n * - column: The column number in the generated source. The column\n * number is 0-based.\n *\n * and an object is returned with the following properties:\n *\n * - source: The original source file, or null.\n * - line: The line number in the original source, or null. The\n * line number is 1-based.\n * - column: The column number in the original source, or null. The\n * column number is 0-based.\n * - name: The original identifier, or null.\n */\nIndexedSourceMapConsumer.prototype.originalPositionFor =\n function IndexedSourceMapConsumer_originalPositionFor(aArgs) {\n var needle = {\n generatedLine: util.getArg(aArgs, 'line'),\n generatedColumn: util.getArg(aArgs, 'column')\n };\n\n // Find the section containing the generated position we're trying to map\n // to an original position.\n var sectionIndex = binarySearch.search(needle, this._sections,\n function(needle, section) {\n var cmp = needle.generatedLine - section.generatedOffset.generatedLine;\n if (cmp) {\n return cmp;\n }\n\n return (needle.generatedColumn -\n section.generatedOffset.generatedColumn);\n });\n var section = this._sections[sectionIndex];\n\n if (!section) {\n return {\n source: null,\n line: null,\n column: null,\n name: null\n };\n }\n\n return section.consumer.originalPositionFor({\n line: needle.generatedLine -\n (section.generatedOffset.generatedLine - 1),\n column: needle.generatedColumn -\n (section.generatedOffset.generatedLine === needle.generatedLine\n ? section.generatedOffset.generatedColumn - 1\n : 0),\n bias: aArgs.bias\n });\n };\n\n/**\n * Return true if we have the source content for every source in the source\n * map, false otherwise.\n */\nIndexedSourceMapConsumer.prototype.hasContentsOfAllSources =\n function IndexedSourceMapConsumer_hasContentsOfAllSources() {\n return this._sections.every(function (s) {\n return s.consumer.hasContentsOfAllSources();\n });\n };\n\n/**\n * Returns the original source content. The only argument is the url of the\n * original source file. Returns null if no original source content is\n * available.\n */\nIndexedSourceMapConsumer.prototype.sourceContentFor =\n function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {\n for (var i = 0; i < this._sections.length; i++) {\n var section = this._sections[i];\n\n var content = section.consumer.sourceContentFor(aSource, true);\n if (content || content === '') {\n return content;\n }\n }\n if (nullOnMissing) {\n return null;\n }\n else {\n throw new Error('\"' + aSource + '\" is not in the SourceMap.');\n }\n };\n\n/**\n * Returns the generated line and column information for the original source,\n * line, and column positions provided. The only argument is an object with\n * the following properties:\n *\n * - source: The filename of the original source.\n * - line: The line number in the original source. The line number\n * is 1-based.\n * - column: The column number in the original source. The column\n * number is 0-based.\n *\n * and an object is returned with the following properties:\n *\n * - line: The line number in the generated source, or null. The\n * line number is 1-based. \n * - column: The column number in the generated source, or null.\n * The column number is 0-based.\n */\nIndexedSourceMapConsumer.prototype.generatedPositionFor =\n function IndexedSourceMapConsumer_generatedPositionFor(aArgs) {\n for (var i = 0; i < this._sections.length; i++) {\n var section = this._sections[i];\n\n // Only consider this section if the requested source is in the list of\n // sources of the consumer.\n if (section.consumer._findSourceIndex(util.getArg(aArgs, 'source')) === -1) {\n continue;\n }\n var generatedPosition = section.consumer.generatedPositionFor(aArgs);\n if (generatedPosition) {\n var ret = {\n line: generatedPosition.line +\n (section.generatedOffset.generatedLine - 1),\n column: generatedPosition.column +\n (section.generatedOffset.generatedLine === generatedPosition.line\n ? section.generatedOffset.generatedColumn - 1\n : 0)\n };\n return ret;\n }\n }\n\n return {\n line: null,\n column: null\n };\n };\n\n/**\n * Parse the mappings in a string in to a data structure which we can easily\n * query (the ordered arrays in the `this.__generatedMappings` and\n * `this.__originalMappings` properties).\n */\nIndexedSourceMapConsumer.prototype._parseMappings =\n function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n this.__generatedMappings = [];\n this.__originalMappings = [];\n for (var i = 0; i < this._sections.length; i++) {\n var section = this._sections[i];\n var sectionMappings = section.consumer._generatedMappings;\n for (var j = 0; j < sectionMappings.length; j++) {\n var mapping = sectionMappings[j];\n\n var source = section.consumer._sources.at(mapping.source);\n if(source !== null) {\n source = util.computeSourceURL(section.consumer.sourceRoot, source, this._sourceMapURL);\n }\n this._sources.add(source);\n source = this._sources.indexOf(source);\n\n var name = null;\n if (mapping.name) {\n name = section.consumer._names.at(mapping.name);\n this._names.add(name);\n name = this._names.indexOf(name);\n }\n\n // The mappings coming from the consumer for the section have\n // generated positions relative to the start of the section, so we\n // need to offset them to be relative to the start of the concatenated\n // generated file.\n var adjustedMapping = {\n source: source,\n generatedLine: mapping.generatedLine +\n (section.generatedOffset.generatedLine - 1),\n generatedColumn: mapping.generatedColumn +\n (section.generatedOffset.generatedLine === mapping.generatedLine\n ? section.generatedOffset.generatedColumn - 1\n : 0),\n originalLine: mapping.originalLine,\n originalColumn: mapping.originalColumn,\n name: name\n };\n\n this.__generatedMappings.push(adjustedMapping);\n if (typeof adjustedMapping.originalLine === 'number') {\n this.__originalMappings.push(adjustedMapping);\n }\n }\n }\n\n quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated);\n quickSort(this.__originalMappings, util.compareByOriginalPositions);\n };\n\nexports.IndexedSourceMapConsumer = IndexedSourceMapConsumer;\n","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar SourceMapGenerator = require('./source-map-generator').SourceMapGenerator;\nvar util = require('./util');\n\n// Matches a Windows-style `\\r\\n` newline or a `\\n` newline used by all other\n// operating systems these days (capturing the result).\nvar REGEX_NEWLINE = /(\\r?\\n)/;\n\n// Newline character code for charCodeAt() comparisons\nvar NEWLINE_CODE = 10;\n\n// Private symbol for identifying `SourceNode`s when multiple versions of\n// the source-map library are loaded. This MUST NOT CHANGE across\n// versions!\nvar isSourceNode = \"$$$isSourceNode$$$\";\n\n/**\n * SourceNodes provide a way to abstract over interpolating/concatenating\n * snippets of generated JavaScript source code while maintaining the line and\n * column information associated with the original source code.\n *\n * @param aLine The original line number.\n * @param aColumn The original column number.\n * @param aSource The original source's filename.\n * @param aChunks Optional. An array of strings which are snippets of\n * generated JS, or other SourceNodes.\n * @param aName The original identifier.\n */\nfunction SourceNode(aLine, aColumn, aSource, aChunks, aName) {\n this.children = [];\n this.sourceContents = {};\n this.line = aLine == null ? null : aLine;\n this.column = aColumn == null ? null : aColumn;\n this.source = aSource == null ? null : aSource;\n this.name = aName == null ? null : aName;\n this[isSourceNode] = true;\n if (aChunks != null) this.add(aChunks);\n}\n\n/**\n * Creates a SourceNode from generated code and a SourceMapConsumer.\n *\n * @param aGeneratedCode The generated code\n * @param aSourceMapConsumer The SourceMap for the generated code\n * @param aRelativePath Optional. The path that relative sources in the\n * SourceMapConsumer should be relative to.\n */\nSourceNode.fromStringWithSourceMap =\n function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) {\n // The SourceNode we want to fill with the generated code\n // and the SourceMap\n var node = new SourceNode();\n\n // All even indices of this array are one line of the generated code,\n // while all odd indices are the newlines between two adjacent lines\n // (since `REGEX_NEWLINE` captures its match).\n // Processed fragments are accessed by calling `shiftNextLine`.\n var remainingLines = aGeneratedCode.split(REGEX_NEWLINE);\n var remainingLinesIndex = 0;\n var shiftNextLine = function() {\n var lineContents = getNextLine();\n // The last line of a file might not have a newline.\n var newLine = getNextLine() || \"\";\n return lineContents + newLine;\n\n function getNextLine() {\n return remainingLinesIndex < remainingLines.length ?\n remainingLines[remainingLinesIndex++] : undefined;\n }\n };\n\n // We need to remember the position of \"remainingLines\"\n var lastGeneratedLine = 1, lastGeneratedColumn = 0;\n\n // The generate SourceNodes we need a code range.\n // To extract it current and last mapping is used.\n // Here we store the last mapping.\n var lastMapping = null;\n\n aSourceMapConsumer.eachMapping(function (mapping) {\n if (lastMapping !== null) {\n // We add the code from \"lastMapping\" to \"mapping\":\n // First check if there is a new line in between.\n if (lastGeneratedLine < mapping.generatedLine) {\n // Associate first line with \"lastMapping\"\n addMappingWithCode(lastMapping, shiftNextLine());\n lastGeneratedLine++;\n lastGeneratedColumn = 0;\n // The remaining code is added without mapping\n } else {\n // There is no new line in between.\n // Associate the code between \"lastGeneratedColumn\" and\n // \"mapping.generatedColumn\" with \"lastMapping\"\n var nextLine = remainingLines[remainingLinesIndex] || '';\n var code = nextLine.substr(0, mapping.generatedColumn -\n lastGeneratedColumn);\n remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn -\n lastGeneratedColumn);\n lastGeneratedColumn = mapping.generatedColumn;\n addMappingWithCode(lastMapping, code);\n // No more remaining code, continue\n lastMapping = mapping;\n return;\n }\n }\n // We add the generated code until the first mapping\n // to the SourceNode without any mapping.\n // Each line is added as separate string.\n while (lastGeneratedLine < mapping.generatedLine) {\n node.add(shiftNextLine());\n lastGeneratedLine++;\n }\n if (lastGeneratedColumn < mapping.generatedColumn) {\n var nextLine = remainingLines[remainingLinesIndex] || '';\n node.add(nextLine.substr(0, mapping.generatedColumn));\n remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn);\n lastGeneratedColumn = mapping.generatedColumn;\n }\n lastMapping = mapping;\n }, this);\n // We have processed all mappings.\n if (remainingLinesIndex < remainingLines.length) {\n if (lastMapping) {\n // Associate the remaining code in the current line with \"lastMapping\"\n addMappingWithCode(lastMapping, shiftNextLine());\n }\n // and add the remaining lines without any mapping\n node.add(remainingLines.splice(remainingLinesIndex).join(\"\"));\n }\n\n // Copy sourcesContent into SourceNode\n aSourceMapConsumer.sources.forEach(function (sourceFile) {\n var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n if (content != null) {\n if (aRelativePath != null) {\n sourceFile = util.join(aRelativePath, sourceFile);\n }\n node.setSourceContent(sourceFile, content);\n }\n });\n\n return node;\n\n function addMappingWithCode(mapping, code) {\n if (mapping === null || mapping.source === undefined) {\n node.add(code);\n } else {\n var source = aRelativePath\n ? util.join(aRelativePath, mapping.source)\n : mapping.source;\n node.add(new SourceNode(mapping.originalLine,\n mapping.originalColumn,\n source,\n code,\n mapping.name));\n }\n }\n };\n\n/**\n * Add a chunk of generated JS to this source node.\n *\n * @param aChunk A string snippet of generated JS code, another instance of\n * SourceNode, or an array where each member is one of those things.\n */\nSourceNode.prototype.add = function SourceNode_add(aChunk) {\n if (Array.isArray(aChunk)) {\n aChunk.forEach(function (chunk) {\n this.add(chunk);\n }, this);\n }\n else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n if (aChunk) {\n this.children.push(aChunk);\n }\n }\n else {\n throw new TypeError(\n \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n );\n }\n return this;\n};\n\n/**\n * Add a chunk of generated JS to the beginning of this source node.\n *\n * @param aChunk A string snippet of generated JS code, another instance of\n * SourceNode, or an array where each member is one of those things.\n */\nSourceNode.prototype.prepend = function SourceNode_prepend(aChunk) {\n if (Array.isArray(aChunk)) {\n for (var i = aChunk.length-1; i >= 0; i--) {\n this.prepend(aChunk[i]);\n }\n }\n else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n this.children.unshift(aChunk);\n }\n else {\n throw new TypeError(\n \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n );\n }\n return this;\n};\n\n/**\n * Walk over the tree of JS snippets in this node and its children. The\n * walking function is called once for each snippet of JS and is passed that\n * snippet and the its original associated source's line/column location.\n *\n * @param aFn The traversal function.\n */\nSourceNode.prototype.walk = function SourceNode_walk(aFn) {\n var chunk;\n for (var i = 0, len = this.children.length; i < len; i++) {\n chunk = this.children[i];\n if (chunk[isSourceNode]) {\n chunk.walk(aFn);\n }\n else {\n if (chunk !== '') {\n aFn(chunk, { source: this.source,\n line: this.line,\n column: this.column,\n name: this.name });\n }\n }\n }\n};\n\n/**\n * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between\n * each of `this.children`.\n *\n * @param aSep The separator.\n */\nSourceNode.prototype.join = function SourceNode_join(aSep) {\n var newChildren;\n var i;\n var len = this.children.length;\n if (len > 0) {\n newChildren = [];\n for (i = 0; i < len-1; i++) {\n newChildren.push(this.children[i]);\n newChildren.push(aSep);\n }\n newChildren.push(this.children[i]);\n this.children = newChildren;\n }\n return this;\n};\n\n/**\n * Call String.prototype.replace on the very right-most source snippet. Useful\n * for trimming whitespace from the end of a source node, etc.\n *\n * @param aPattern The pattern to replace.\n * @param aReplacement The thing to replace the pattern with.\n */\nSourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) {\n var lastChild = this.children[this.children.length - 1];\n if (lastChild[isSourceNode]) {\n lastChild.replaceRight(aPattern, aReplacement);\n }\n else if (typeof lastChild === 'string') {\n this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);\n }\n else {\n this.children.push(''.replace(aPattern, aReplacement));\n }\n return this;\n};\n\n/**\n * Set the source content for a source file. This will be added to the SourceMapGenerator\n * in the sourcesContent field.\n *\n * @param aSourceFile The filename of the source file\n * @param aSourceContent The content of the source file\n */\nSourceNode.prototype.setSourceContent =\n function SourceNode_setSourceContent(aSourceFile, aSourceContent) {\n this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;\n };\n\n/**\n * Walk over the tree of SourceNodes. The walking function is called for each\n * source file content and is passed the filename and source content.\n *\n * @param aFn The traversal function.\n */\nSourceNode.prototype.walkSourceContents =\n function SourceNode_walkSourceContents(aFn) {\n for (var i = 0, len = this.children.length; i < len; i++) {\n if (this.children[i][isSourceNode]) {\n this.children[i].walkSourceContents(aFn);\n }\n }\n\n var sources = Object.keys(this.sourceContents);\n for (var i = 0, len = sources.length; i < len; i++) {\n aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);\n }\n };\n\n/**\n * Return the string representation of this source node. Walks over the tree\n * and concatenates all the various snippets together to one string.\n */\nSourceNode.prototype.toString = function SourceNode_toString() {\n var str = \"\";\n this.walk(function (chunk) {\n str += chunk;\n });\n return str;\n};\n\n/**\n * Returns the string representation of this source node along with a source\n * map.\n */\nSourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) {\n var generated = {\n code: \"\",\n line: 1,\n column: 0\n };\n var map = new SourceMapGenerator(aArgs);\n var sourceMappingActive = false;\n var lastOriginalSource = null;\n var lastOriginalLine = null;\n var lastOriginalColumn = null;\n var lastOriginalName = null;\n this.walk(function (chunk, original) {\n generated.code += chunk;\n if (original.source !== null\n && original.line !== null\n && original.column !== null) {\n if(lastOriginalSource !== original.source\n || lastOriginalLine !== original.line\n || lastOriginalColumn !== original.column\n || lastOriginalName !== original.name) {\n map.addMapping({\n source: original.source,\n original: {\n line: original.line,\n column: original.column\n },\n generated: {\n line: generated.line,\n column: generated.column\n },\n name: original.name\n });\n }\n lastOriginalSource = original.source;\n lastOriginalLine = original.line;\n lastOriginalColumn = original.column;\n lastOriginalName = original.name;\n sourceMappingActive = true;\n } else if (sourceMappingActive) {\n map.addMapping({\n generated: {\n line: generated.line,\n column: generated.column\n }\n });\n lastOriginalSource = null;\n sourceMappingActive = false;\n }\n for (var idx = 0, length = chunk.length; idx < length; idx++) {\n if (chunk.charCodeAt(idx) === NEWLINE_CODE) {\n generated.line++;\n generated.column = 0;\n // Mappings end at eol\n if (idx + 1 === length) {\n lastOriginalSource = null;\n sourceMappingActive = false;\n } else if (sourceMappingActive) {\n map.addMapping({\n source: original.source,\n original: {\n line: original.line,\n column: original.column\n },\n generated: {\n line: generated.line,\n column: generated.column\n },\n name: original.name\n });\n }\n } else {\n generated.column++;\n }\n }\n });\n this.walkSourceContents(function (sourceFile, sourceContent) {\n map.setSourceContent(sourceFile, sourceContent);\n });\n\n return { code: generated.code, map: map };\n};\n\nexports.SourceNode = SourceNode;\n","/*\n * Copyright 2009-2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE.txt or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\nexports.SourceMapGenerator = require('./lib/source-map-generator').SourceMapGenerator;\nexports.SourceMapConsumer = require('./lib/source-map-consumer').SourceMapConsumer;\nexports.SourceNode = require('./lib/source-node').SourceNode;\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"],"x_google_ignoreList":[16,17,18,19,20,21,22,23,24,25,26],"mappings":"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"}