@nice-code/action 0.2.18 → 0.3.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.
@@ -1957,7 +1957,7 @@ class ActionDevtoolsCore {
1957
1957
  }
1958
1958
  }
1959
1959
  // src/devtools/browser/NiceActionDevtools.tsx
1960
- import { useEffect as useEffect3, useMemo as useMemo2, useRef, useState as useState9 } from "react";
1960
+ import { useEffect as useEffect4, useMemo as useMemo3, useState as useState9 } from "react";
1961
1961
 
1962
1962
  // src/devtools/core/devtools_colors.ts
1963
1963
  var DEVTOOL_COLOR_SEMANTIC_ERROR = "#FF5C5C";
@@ -2068,7 +2068,7 @@ var SEMANTIC_COLORS = {
2068
2068
  };
2069
2069
 
2070
2070
  // src/devtools/browser/components/action_detail/ActionDetailPanel.tsx
2071
- import { useMemo, useState as useState6 } from "react";
2071
+ import { useMemo, useState as useState7 } from "react";
2072
2072
 
2073
2073
  // src/devtools/browser/ui_util/size.ts
2074
2074
  function getSizeValue(size) {
@@ -2392,7 +2392,13 @@ function NiceErrorDisplay({
2392
2392
  }
2393
2393
 
2394
2394
  // src/devtools/browser/components/StackTraceSection.tsx
2395
- import { useEffect, useState as useState2 } from "react";
2395
+ import { ExternalLink } from "lucide-react";
2396
+ import { useEffect, useRef, useState as useState2 } from "react";
2397
+
2398
+ // src/devtools/browser/devtools_storage.ts
2399
+ import { createTypedWebLocalStorage } from "@nice-code/util";
2400
+ var devtools_storage = createTypedWebLocalStorage(window.localStorage, "nice-action-devtools::");
2401
+ devtools_storage.updateJsonWithDef("runtimeToProjectFilePath", {}, (prev) => prev);
2396
2402
 
2397
2403
  // ../../node_modules/.bun/source-map-js@1.2.1/node_modules/source-map-js/source-map.js
2398
2404
  var $SourceMapGenerator = require_source_map_generator().SourceMapGenerator;
@@ -2507,7 +2513,7 @@ async function resolveSourceMapPositions(frames) {
2507
2513
  const resolved = await resolveCompiledPosition(frame.file, frame.line, frame.col ?? 0);
2508
2514
  if (resolved == null)
2509
2515
  return frame;
2510
- return { ...frame, file: resolved.file, line: resolved.line, col: resolved.col };
2516
+ return { ...frame, originalFile: frame.file, file: resolved.file, line: resolved.line, col: resolved.col };
2511
2517
  }));
2512
2518
  }
2513
2519
  function formatFrameFile(file) {
@@ -2525,7 +2531,299 @@ function formatFrameFile(file) {
2525
2531
  const tail = filtered.slice(-4);
2526
2532
  return tail.join("/") || file;
2527
2533
  }
2528
- function countUserFrames(stack) {
2534
+ function getOriginUrl(frame) {
2535
+ const candidate = frame.originalFile ?? frame.file;
2536
+ if (candidate == null)
2537
+ return null;
2538
+ try {
2539
+ new URL(candidate);
2540
+ return candidate;
2541
+ } catch {
2542
+ return null;
2543
+ }
2544
+ }
2545
+ function frameNeedsProjectRoot(frame) {
2546
+ if (frame.isInternal)
2547
+ return false;
2548
+ const originUrl = getOriginUrl(frame);
2549
+ if (originUrl == null)
2550
+ return false;
2551
+ const path = new URL(originUrl).pathname.split("?")[0] ?? "";
2552
+ return !path.startsWith("/@fs/");
2553
+ }
2554
+ function buildVscodeUrl(frame, projectRoot) {
2555
+ if (frame.line == null)
2556
+ return null;
2557
+ const originUrl = getOriginUrl(frame);
2558
+ if (originUrl != null) {
2559
+ let path = new URL(originUrl).pathname.split("?")[0] ?? "";
2560
+ if (path.startsWith("/@fs/")) {
2561
+ path = path.slice(5);
2562
+ if (/^\/[a-zA-Z]:\//.test(path))
2563
+ path = path.slice(1);
2564
+ return `vscode://file/${path}:${frame.line}:${frame.col ?? 1}`;
2565
+ }
2566
+ if (projectRoot == null)
2567
+ return null;
2568
+ const normalRoot2 = projectRoot.replace(/[/\\]+$/, "").replace(/\\/g, "/");
2569
+ return `vscode://file/${normalRoot2}${path}:${frame.line}:${frame.col ?? 1}`;
2570
+ }
2571
+ const filePath = frame.file;
2572
+ if (filePath == null)
2573
+ return null;
2574
+ const normalPath = filePath.replace(/\\/g, "/");
2575
+ if (/^[a-zA-Z]:\//.test(normalPath)) {
2576
+ return `vscode://file/${normalPath}:${frame.line}:${frame.col ?? 1}`;
2577
+ }
2578
+ if (/^\/[a-zA-Z]:\//.test(normalPath)) {
2579
+ return `vscode://file/${normalPath.slice(1)}:${frame.line}:${frame.col ?? 1}`;
2580
+ }
2581
+ if (normalPath.startsWith("/")) {
2582
+ if (projectRoot == null)
2583
+ return null;
2584
+ const normalRoot2 = projectRoot.replace(/[/\\]+$/, "").replace(/\\/g, "/");
2585
+ return `vscode://file/${normalRoot2}${normalPath}:${frame.line}:${frame.col ?? 1}`;
2586
+ }
2587
+ if (projectRoot == null)
2588
+ return null;
2589
+ const normalRoot = projectRoot.replace(/[/\\]+$/, "").replace(/\\/g, "/");
2590
+ return `vscode://file/${normalRoot}/${normalPath}:${frame.line}:${frame.col ?? 1}`;
2591
+ }
2592
+ function ProjectRootSetupModal({
2593
+ envId,
2594
+ currentValue,
2595
+ onSave,
2596
+ onCancel
2597
+ }) {
2598
+ const [value, setValue] = useState2(currentValue);
2599
+ const inputRef = useRef(null);
2600
+ useEffect(() => {
2601
+ inputRef.current?.focus();
2602
+ inputRef.current?.select();
2603
+ }, []);
2604
+ useEffect(() => {
2605
+ const handler = (e) => {
2606
+ if (e.key === "Escape")
2607
+ onCancel();
2608
+ };
2609
+ window.addEventListener("keydown", handler);
2610
+ return () => window.removeEventListener("keydown", handler);
2611
+ }, [onCancel]);
2612
+ const handleSubmit = (e) => {
2613
+ e.preventDefault();
2614
+ const trimmed = value.trim();
2615
+ if (trimmed !== "")
2616
+ onSave(trimmed);
2617
+ };
2618
+ return /* @__PURE__ */ jsxDEV4("div", {
2619
+ style: {
2620
+ position: "fixed",
2621
+ inset: 0,
2622
+ zIndex: 2147483647,
2623
+ display: "flex",
2624
+ alignItems: "center",
2625
+ justifyContent: "center"
2626
+ },
2627
+ children: [
2628
+ /* @__PURE__ */ jsxDEV4("div", {
2629
+ onClick: onCancel,
2630
+ style: { position: "absolute", inset: 0, background: "rgba(0, 0, 0, 0.72)" }
2631
+ }, undefined, false, undefined, this),
2632
+ /* @__PURE__ */ jsxDEV4("form", {
2633
+ onSubmit: handleSubmit,
2634
+ style: {
2635
+ position: "relative",
2636
+ background: DEVTOOL_TOOLTIP_BACKGROUND,
2637
+ border: `1px solid ${DEVTOOL_TOOLTIP_BORDER}`,
2638
+ borderRadius: "8px",
2639
+ width: "420px",
2640
+ maxWidth: "90vw",
2641
+ boxShadow: "0 8px 32px rgba(0, 0, 0, 0.8)",
2642
+ overflow: "hidden",
2643
+ display: "flex",
2644
+ flexDirection: "column"
2645
+ },
2646
+ children: [
2647
+ /* @__PURE__ */ jsxDEV4("div", {
2648
+ style: {
2649
+ background: DEVTOOL_TOOLTIP_TITLE_BACKGROUND,
2650
+ borderBottom: `1px solid ${DEVTOOL_TOOLTIP_BORDER}`,
2651
+ padding: "10px 14px"
2652
+ },
2653
+ children: [
2654
+ /* @__PURE__ */ jsxDEV4("div", {
2655
+ style: {
2656
+ color: DEVTOOL_COLOR_TEXT_EMPHASIS,
2657
+ fontSize: "12px",
2658
+ fontWeight: 600,
2659
+ marginBottom: "2px"
2660
+ },
2661
+ children: "Set project root"
2662
+ }, undefined, false, undefined, this),
2663
+ /* @__PURE__ */ jsxDEV4("div", {
2664
+ style: { color: DEVTOOL_COLOR_TEXT_MUTED, fontSize: "10px" },
2665
+ children: [
2666
+ "Runtime:",
2667
+ " ",
2668
+ /* @__PURE__ */ jsxDEV4("span", {
2669
+ style: {
2670
+ color: DEVTOOL_COLOR_SEMANTIC_SYSTEM,
2671
+ fontFamily: "ui-monospace, 'Cascadia Code', 'Source Code Pro', monospace"
2672
+ },
2673
+ children: envId
2674
+ }, undefined, false, undefined, this)
2675
+ ]
2676
+ }, undefined, true, undefined, this)
2677
+ ]
2678
+ }, undefined, true, undefined, this),
2679
+ /* @__PURE__ */ jsxDEV4("div", {
2680
+ style: { padding: "14px", display: "flex", flexDirection: "column", gap: "8px" },
2681
+ children: [
2682
+ /* @__PURE__ */ jsxDEV4("div", {
2683
+ style: { color: DEVTOOL_COLOR_TEXT_MUTED, fontSize: "10px", lineHeight: 1.4 },
2684
+ children: [
2685
+ "Provide the absolute path to this project's root so that root-relative source file paths (e.g.",
2686
+ " ",
2687
+ /* @__PURE__ */ jsxDEV4("span", {
2688
+ style: {
2689
+ fontFamily: "ui-monospace, 'Cascadia Code', 'Source Code Pro', monospace"
2690
+ },
2691
+ children: "src/App.tsx"
2692
+ }, undefined, false, undefined, this),
2693
+ ") can be opened in VS Code."
2694
+ ]
2695
+ }, undefined, true, undefined, this),
2696
+ /* @__PURE__ */ jsxDEV4("input", {
2697
+ ref: inputRef,
2698
+ value,
2699
+ onChange: (e) => setValue(e.currentTarget.value),
2700
+ placeholder: "e.g. C:/d/nice-code/packages/demo-frontend",
2701
+ style: {
2702
+ background: DEVTOOL_STACK_TRACE_BACKGROUND,
2703
+ border: `1px solid ${DEVTOOL_TOOLTIP_BORDER}`,
2704
+ borderRadius: "4px",
2705
+ color: DEVTOOL_COLOR_TEXT_SECONDARY,
2706
+ fontSize: "11px",
2707
+ fontFamily: "ui-monospace, 'Cascadia Code', 'Source Code Pro', monospace",
2708
+ padding: "7px 9px",
2709
+ outline: "none",
2710
+ width: "100%",
2711
+ boxSizing: "border-box"
2712
+ }
2713
+ }, undefined, false, undefined, this)
2714
+ ]
2715
+ }, undefined, true, undefined, this),
2716
+ /* @__PURE__ */ jsxDEV4("div", {
2717
+ style: {
2718
+ display: "flex",
2719
+ justifyContent: "flex-end",
2720
+ gap: "8px",
2721
+ padding: "10px 14px",
2722
+ borderTop: `1px solid ${DEVTOOL_PANEL_BORDER}`
2723
+ },
2724
+ children: [
2725
+ /* @__PURE__ */ jsxDEV4("button", {
2726
+ type: "button",
2727
+ onClick: onCancel,
2728
+ style: {
2729
+ background: "transparent",
2730
+ border: `1px solid ${DEVTOOL_PANEL_BORDER}`,
2731
+ borderRadius: "4px",
2732
+ color: DEVTOOL_COLOR_TEXT_MUTED,
2733
+ fontSize: "11px",
2734
+ padding: "5px 12px",
2735
+ cursor: "pointer"
2736
+ },
2737
+ children: "Cancel"
2738
+ }, undefined, false, undefined, this),
2739
+ /* @__PURE__ */ jsxDEV4("button", {
2740
+ type: "submit",
2741
+ disabled: value.trim() === "",
2742
+ style: {
2743
+ background: `${DEVTOOL_COLOR_SEMANTIC_SYSTEM}22`,
2744
+ border: `1px solid ${DEVTOOL_COLOR_SEMANTIC_SYSTEM}66`,
2745
+ borderRadius: "4px",
2746
+ color: DEVTOOL_COLOR_SEMANTIC_SYSTEM,
2747
+ fontSize: "11px",
2748
+ padding: "5px 12px",
2749
+ cursor: value.trim() === "" ? "not-allowed" : "pointer",
2750
+ opacity: value.trim() === "" ? 0.5 : 1
2751
+ },
2752
+ children: "Save"
2753
+ }, undefined, false, undefined, this)
2754
+ ]
2755
+ }, undefined, true, undefined, this)
2756
+ ]
2757
+ }, undefined, true, undefined, this)
2758
+ ]
2759
+ }, undefined, true, undefined, this);
2760
+ }
2761
+ function OpenInVscodeButton({
2762
+ frame,
2763
+ projectRoot,
2764
+ onNeedSetup
2765
+ }) {
2766
+ const [hovered, setHovered] = useState2(false);
2767
+ const needsSetup = frameNeedsProjectRoot(frame) && projectRoot == null;
2768
+ const url = buildVscodeUrl(frame, projectRoot);
2769
+ if (frame.file == null || frame.line == null)
2770
+ return null;
2771
+ if (!needsSetup && url == null)
2772
+ return null;
2773
+ const baseStyle = {
2774
+ position: "absolute",
2775
+ bottom: "3px",
2776
+ right: "4px",
2777
+ display: "flex",
2778
+ alignItems: "center",
2779
+ justifyContent: "center",
2780
+ width: "16px",
2781
+ height: "16px",
2782
+ opacity: hovered ? 0.85 : 0.25,
2783
+ transition: "opacity 0.15s ease",
2784
+ cursor: "pointer",
2785
+ flexShrink: 0
2786
+ };
2787
+ if (needsSetup) {
2788
+ return /* @__PURE__ */ jsxDEV4("button", {
2789
+ onClick: (e) => {
2790
+ e.stopPropagation();
2791
+ onNeedSetup();
2792
+ },
2793
+ onMouseEnter: () => setHovered(true),
2794
+ onMouseLeave: () => setHovered(false),
2795
+ title: "Set project root to open in VS Code",
2796
+ style: {
2797
+ ...baseStyle,
2798
+ color: DEVTOOL_COLOR_SEMANTIC_WARNING,
2799
+ background: "none",
2800
+ border: "none",
2801
+ padding: 0
2802
+ },
2803
+ children: /* @__PURE__ */ jsxDEV4(ExternalLink, {
2804
+ size: 10,
2805
+ strokeWidth: 1.8
2806
+ }, undefined, false, undefined, this)
2807
+ }, undefined, false, undefined, this);
2808
+ }
2809
+ return /* @__PURE__ */ jsxDEV4("a", {
2810
+ href: url,
2811
+ onClick: (e) => e.stopPropagation(),
2812
+ onMouseEnter: () => setHovered(true),
2813
+ onMouseLeave: () => setHovered(false),
2814
+ title: "Open in VS Code",
2815
+ style: {
2816
+ ...baseStyle,
2817
+ color: DEVTOOL_COLOR_TEXT_SECONDARY,
2818
+ textDecoration: "none"
2819
+ },
2820
+ children: /* @__PURE__ */ jsxDEV4(ExternalLink, {
2821
+ size: 10,
2822
+ strokeWidth: 1.8
2823
+ }, undefined, false, undefined, this)
2824
+ }, undefined, false, undefined, this);
2825
+ }
2826
+ function countUserFrames(_runtime, stack) {
2529
2827
  if (stack == null)
2530
2828
  return 0;
2531
2829
  return parseStackFrames(stack).filter((f) => !f.isInternal).length;
@@ -2534,10 +2832,16 @@ function StackTraceSection({
2534
2832
  label,
2535
2833
  stack,
2536
2834
  color = DEVTOOL_COLOR_SEMANTIC_SYSTEM,
2835
+ runtime,
2537
2836
  minFrameCount
2538
2837
  }) {
2539
2838
  const [showAll, setShowAll] = useState2(false);
2540
2839
  const [resolvedFrames, setResolvedFrames] = useState2(null);
2840
+ const [projectRootMap, setProjectRootMap] = useState2({});
2841
+ const [showSetupModal, setShowSetupModal] = useState2(false);
2842
+ useEffect(() => {
2843
+ devtools_storage.getJsonOrDef("runtimeToProjectFilePath", {}).then((map) => setProjectRootMap(map));
2844
+ }, []);
2541
2845
  useEffect(() => {
2542
2846
  if (stack == null)
2543
2847
  return;
@@ -2561,6 +2865,16 @@ function StackTraceSection({
2561
2865
  const phantomFrameCount = !showAll ? Math.max(0, (minFrameCount ?? 0) - displayFrames.length) : 0;
2562
2866
  if (allFrames.length === 0)
2563
2867
  return null;
2868
+ const runtimeKey = `envId[${runtime.envId}]`;
2869
+ const projectRoot = projectRootMap[runtimeKey] ?? null;
2870
+ const handleSaveProjectRoot = (path) => {
2871
+ setProjectRootMap((prev) => ({ ...prev, [runtimeKey]: path }));
2872
+ setShowSetupModal(false);
2873
+ devtools_storage.updateJsonWithDef("runtimeToProjectFilePath", {}, (prev) => ({
2874
+ ...prev,
2875
+ [runtimeKey]: path
2876
+ }));
2877
+ };
2564
2878
  return /* @__PURE__ */ jsxDEV4("div", {
2565
2879
  children: [
2566
2880
  /* @__PURE__ */ jsxDEV4("div", {
@@ -2592,7 +2906,12 @@ function StackTraceSection({
2592
2906
  },
2593
2907
  children: [
2594
2908
  displayFrames.length === 0 ? /* @__PURE__ */ jsxDEV4("div", {
2595
- style: { padding: "6px 10px", color: DEVTOOL_COLOR_TEXT_MUTED, fontSize: "10px", fontStyle: "italic" },
2909
+ style: {
2910
+ padding: "6px 10px",
2911
+ color: DEVTOOL_COLOR_TEXT_MUTED,
2912
+ fontSize: "10px",
2913
+ fontStyle: "italic"
2914
+ },
2596
2915
  children: "no user frames captured"
2597
2916
  }, undefined, false, undefined, this) : displayFrames.map((frame, idx) => {
2598
2917
  const displayFile = formatFrameFile(frame.file);
@@ -2604,10 +2923,12 @@ function StackTraceSection({
2604
2923
  return /* @__PURE__ */ jsxDEV4("div", {
2605
2924
  title: titleStr,
2606
2925
  style: {
2926
+ position: "relative",
2607
2927
  display: "flex",
2608
2928
  flexDirection: "row",
2609
2929
  gap: "0.5em",
2610
2930
  padding: "4px",
2931
+ paddingRight: "22px",
2611
2932
  borderBottom: `1px solid ${DEVTOOL_LIST_BASE_BACKGROUND}`
2612
2933
  },
2613
2934
  children: [
@@ -2684,7 +3005,12 @@ function StackTraceSection({
2684
3005
  ]
2685
3006
  }, undefined, true, undefined, this)
2686
3007
  ]
2687
- }, undefined, true, undefined, this)
3008
+ }, undefined, true, undefined, this),
3009
+ /* @__PURE__ */ jsxDEV4(OpenInVscodeButton, {
3010
+ frame,
3011
+ projectRoot,
3012
+ onNeedSetup: () => setShowSetupModal(true)
3013
+ }, undefined, false, undefined, this)
2688
3014
  ]
2689
3015
  }, frame.raw, true, undefined, this);
2690
3016
  }),
@@ -2719,7 +3045,13 @@ function StackTraceSection({
2719
3045
  ]
2720
3046
  }, `phantom-${i}`, true, undefined, this))
2721
3047
  ]
2722
- }, undefined, true, undefined, this)
3048
+ }, undefined, true, undefined, this),
3049
+ showSetupModal && /* @__PURE__ */ jsxDEV4(ProjectRootSetupModal, {
3050
+ envId: runtime.envId,
3051
+ currentValue: projectRoot ?? "",
3052
+ onSave: handleSaveProjectRoot,
3053
+ onCancel: () => setShowSetupModal(false)
3054
+ }, undefined, false, undefined, this)
2723
3055
  ]
2724
3056
  }, undefined, true, undefined, this);
2725
3057
  }
@@ -2732,7 +3064,8 @@ function FullErrorContent({
2732
3064
  label,
2733
3065
  error,
2734
3066
  errorStack,
2735
- color
3067
+ color,
3068
+ runtime
2736
3069
  }) {
2737
3070
  return /* @__PURE__ */ jsxDEV5(Fragment, {
2738
3071
  children: [
@@ -2746,6 +3079,7 @@ function FullErrorContent({
2746
3079
  color
2747
3080
  }, undefined, false, undefined, this),
2748
3081
  /* @__PURE__ */ jsxDEV5(StackTraceSection, {
3082
+ runtime,
2749
3083
  label: "Error Stack",
2750
3084
  stack: errorStack,
2751
3085
  color
@@ -2813,6 +3147,7 @@ function ActionErrorDisplay({
2813
3147
  color
2814
3148
  }, undefined, false, undefined, this);
2815
3149
  return /* @__PURE__ */ jsxDEV5(FullErrorContent, {
3150
+ runtime: entry.meta.originClient,
2816
3151
  label: "Action Error",
2817
3152
  error,
2818
3153
  errorStack,
@@ -2827,6 +3162,7 @@ function ActionErrorDisplay({
2827
3162
  color
2828
3163
  }, undefined, false, undefined, this);
2829
3164
  return /* @__PURE__ */ jsxDEV5(FullErrorContent, {
3165
+ runtime: entry.meta.originClient,
2830
3166
  label: "Error",
2831
3167
  error,
2832
3168
  errorStack,
@@ -2852,6 +3188,7 @@ function ActionErrorDisplay({
2852
3188
  color
2853
3189
  }, undefined, false, undefined, this)),
2854
3190
  /* @__PURE__ */ jsxDEV5(StackTraceSection, {
3191
+ runtime: entry.meta.originClient,
2855
3192
  label: "Abort Stack",
2856
3193
  stack: errorStack,
2857
3194
  color
@@ -2862,6 +3199,9 @@ function ActionErrorDisplay({
2862
3199
  return null;
2863
3200
  }
2864
3201
 
3202
+ // src/devtools/browser/components/DomainChip.tsx
3203
+ import { Component } from "lucide-react";
3204
+
2865
3205
  // src/devtools/browser/components/Chip.tsx
2866
3206
  import { useState as useState3 } from "react";
2867
3207
 
@@ -2970,6 +3310,8 @@ function Chip({
2970
3310
  onMouseEnter: hasTooltip ? (e) => setAnchor(e.currentTarget.getBoundingClientRect()) : undefined,
2971
3311
  onMouseLeave: hasTooltip ? () => setAnchor(null) : undefined,
2972
3312
  style: {
3313
+ display: "flex",
3314
+ alignItems: "center",
2973
3315
  color: resolvedColor,
2974
3316
  fontSize,
2975
3317
  background: DEVTOOL_LIST_BASE_BACKGROUND,
@@ -2991,13 +3333,73 @@ function Chip({
2991
3333
  }, undefined, true, undefined, this);
2992
3334
  }
2993
3335
 
2994
- // src/devtools/browser/components/DomainChip.tsx
3336
+ // src/devtools/browser/components/Icon.tsx
3337
+ import { useState as useState4 } from "react";
2995
3338
  import { jsxDEV as jsxDEV8, Fragment as Fragment3 } from "react/jsx-dev-runtime";
2996
- function DomainHierarchyContent({ allDomains }) {
3339
+ var ICON_SIZE_EM = {
3340
+ ["sm" /* sm */]: 1,
3341
+ ["md" /* md */]: 1.2,
3342
+ ["lg" /* lg */]: 1.6
3343
+ };
3344
+ var BASE_ICON_SIDE_LENGTH_EM = 1.5;
3345
+ var ICON_GAP_EM = 0.3;
3346
+ function Icon({
3347
+ icon: IconComponent,
3348
+ color,
3349
+ size = "md" /* md */,
3350
+ subtle = false,
3351
+ tooltip,
3352
+ style
3353
+ }) {
3354
+ const [anchor, setAnchor] = useState4(null);
3355
+ const hasTooltip = tooltip != null;
3356
+ const colorEntry = SEMANTIC_COLORS[color];
3357
+ const resolvedColor = subtle ? colorEntry.subtle?.color ?? colorEntry.color : colorEntry.color;
3358
+ const finalIcons = Array.isArray(IconComponent) ? IconComponent : [IconComponent];
3359
+ const fullIconWidthEm = (finalIcons.length - 1) * ICON_GAP_EM + finalIcons.length * BASE_ICON_SIDE_LENGTH_EM * getSizeValue(size);
3360
+ const iconSideLengthEm = `${BASE_ICON_SIDE_LENGTH_EM * getSizeValue(size)}em`;
2997
3361
  return /* @__PURE__ */ jsxDEV8(Fragment3, {
3362
+ children: [
3363
+ /* @__PURE__ */ jsxDEV8("div", {
3364
+ onMouseEnter: hasTooltip ? (e) => setAnchor(e.currentTarget.getBoundingClientRect()) : undefined,
3365
+ onMouseLeave: hasTooltip ? () => setAnchor(null) : undefined,
3366
+ style: {
3367
+ borderRadius: "0.4em",
3368
+ width: `${fullIconWidthEm}em`,
3369
+ height: iconSideLengthEm,
3370
+ padding: "0.15em",
3371
+ display: "flex",
3372
+ alignItems: "center",
3373
+ justifyContent: "center",
3374
+ background: "rgba(0,0,0,0.4)",
3375
+ color: resolvedColor,
3376
+ flexShrink: 0,
3377
+ cursor: hasTooltip ? "default" : undefined,
3378
+ ...style
3379
+ },
3380
+ children: /* @__PURE__ */ jsxDEV8("div", {
3381
+ style: { display: "flex", alignItems: "center", gap: `${ICON_GAP_EM}em` },
3382
+ children: finalIcons.map((Comp, i) => /* @__PURE__ */ jsxDEV8(Comp, {
3383
+ size: iconSideLengthEm,
3384
+ strokeWidth: 2.3
3385
+ }, `${Comp.name}-${i}`, false, undefined, this))
3386
+ }, undefined, false, undefined, this)
3387
+ }, undefined, false, undefined, this),
3388
+ anchor != null && hasTooltip && /* @__PURE__ */ jsxDEV8(Tooltip, {
3389
+ anchor,
3390
+ config: tooltip
3391
+ }, undefined, false, undefined, this)
3392
+ ]
3393
+ }, undefined, true, undefined, this);
3394
+ }
3395
+
3396
+ // src/devtools/browser/components/DomainChip.tsx
3397
+ import { jsxDEV as jsxDEV9, Fragment as Fragment4 } from "react/jsx-dev-runtime";
3398
+ function DomainHierarchyContent({ allDomains }) {
3399
+ return /* @__PURE__ */ jsxDEV9(Fragment4, {
2998
3400
  children: allDomains.map((d, i) => {
2999
3401
  const isCurrent = i === allDomains.length - 1;
3000
- return /* @__PURE__ */ jsxDEV8("div", {
3402
+ return /* @__PURE__ */ jsxDEV9("div", {
3001
3403
  style: {
3002
3404
  display: "flex",
3003
3405
  alignItems: "center",
@@ -3006,7 +3408,7 @@ function DomainHierarchyContent({ allDomains }) {
3006
3408
  paddingTop: i > 0 ? "0.1rem" : undefined
3007
3409
  },
3008
3410
  children: [
3009
- /* @__PURE__ */ jsxDEV8("span", {
3411
+ /* @__PURE__ */ jsxDEV9("span", {
3010
3412
  style: {
3011
3413
  fontSize: "0.8rem",
3012
3414
  height: "0.6em",
@@ -3019,7 +3421,7 @@ function DomainHierarchyContent({ allDomains }) {
3019
3421
  },
3020
3422
  children: "⬢"
3021
3423
  }, undefined, false, undefined, this),
3022
- /* @__PURE__ */ jsxDEV8("span", {
3424
+ /* @__PURE__ */ jsxDEV9("span", {
3023
3425
  style: {
3024
3426
  color: isCurrent ? DEVTOOL_COLOR_SEMANTIC_SYSTEM : "#4b5563",
3025
3427
  fontSize: "0.7rem",
@@ -3033,44 +3435,63 @@ function DomainHierarchyContent({ allDomains }) {
3033
3435
  }, undefined, false, undefined, this);
3034
3436
  }
3035
3437
  function DomainChip({
3438
+ compact = false,
3036
3439
  subtle = false,
3037
3440
  domain,
3038
3441
  allDomains,
3039
3442
  size
3040
3443
  }) {
3041
- return /* @__PURE__ */ jsxDEV8(Chip, {
3444
+ if (compact) {
3445
+ return /* @__PURE__ */ jsxDEV9(Icon, {
3446
+ icon: Component,
3447
+ color: "domain" /* domain */,
3448
+ tooltip: {
3449
+ content: /* @__PURE__ */ jsxDEV9(DomainHierarchyContent, {
3450
+ allDomains
3451
+ }, undefined, false, undefined, this),
3452
+ title: "Action Domain",
3453
+ align: "edge"
3454
+ }
3455
+ }, undefined, false, undefined, this);
3456
+ }
3457
+ return /* @__PURE__ */ jsxDEV9(Chip, {
3042
3458
  color: "domain" /* domain */,
3043
3459
  subtle,
3044
3460
  size,
3045
3461
  rounded: true,
3046
3462
  tooltip: {
3047
- content: /* @__PURE__ */ jsxDEV8(DomainHierarchyContent, {
3463
+ content: /* @__PURE__ */ jsxDEV9(DomainHierarchyContent, {
3048
3464
  allDomains
3049
3465
  }, undefined, false, undefined, this),
3050
3466
  title: "Action Domain",
3051
3467
  align: "edge"
3052
3468
  },
3053
- style: { display: "flex", alignItems: "center", gap: "0.4em" },
3054
- children: [
3055
- /* @__PURE__ */ jsxDEV8("span", {
3056
- style: {
3057
- height: "0.6em",
3058
- width: "0.6em",
3059
- display: "flex",
3060
- alignItems: "center",
3061
- justifyContent: "center"
3062
- },
3063
- children: "⬢"
3064
- }, undefined, false, undefined, this),
3065
- /* @__PURE__ */ jsxDEV8("span", {
3066
- children: domain
3067
- }, undefined, false, undefined, this)
3068
- ]
3069
- }, undefined, true, undefined, this);
3469
+ children: /* @__PURE__ */ jsxDEV9("div", {
3470
+ style: { display: "flex", alignItems: "center", gap: "0.4em" },
3471
+ children: [
3472
+ /* @__PURE__ */ jsxDEV9("span", {
3473
+ style: {
3474
+ height: "1.2em",
3475
+ width: "1.2em",
3476
+ display: "flex",
3477
+ alignItems: "center",
3478
+ justifyContent: "center"
3479
+ },
3480
+ children: /* @__PURE__ */ jsxDEV9(Component, {
3481
+ height: "1.2em",
3482
+ width: "1.2em"
3483
+ }, undefined, false, undefined, this)
3484
+ }, undefined, false, undefined, this),
3485
+ /* @__PURE__ */ jsxDEV9("span", {
3486
+ children: domain
3487
+ }, undefined, false, undefined, this)
3488
+ ]
3489
+ }, undefined, true, undefined, this)
3490
+ }, undefined, false, undefined, this);
3070
3491
  }
3071
3492
 
3072
3493
  // src/devtools/browser/components/HandlerChips.tsx
3073
- import { jsxDEV as jsxDEV9, Fragment as Fragment4 } from "react/jsx-dev-runtime";
3494
+ import { jsxDEV as jsxDEV10, Fragment as Fragment5 } from "react/jsx-dev-runtime";
3074
3495
  function getExternalLabel(hop) {
3075
3496
  if (hop.handlerType !== "external")
3076
3497
  return null;
@@ -3081,15 +3502,15 @@ function HandlerChips({ entry, size, subtle }) {
3081
3502
  const localEnvId = firstHop != null ? firstHop.runtime.envId : null;
3082
3503
  const externalLabel = firstHop != null ? getExternalLabel(firstHop) : null;
3083
3504
  const firstHopIsLocal = firstHop != null && firstHop.handlerType === "local";
3084
- return /* @__PURE__ */ jsxDEV9(Fragment4, {
3505
+ return /* @__PURE__ */ jsxDEV10(Fragment5, {
3085
3506
  children: [
3086
- localEnvId != null && (firstHopIsLocal || externalLabel == null) && /* @__PURE__ */ jsxDEV9(Chip, {
3507
+ localEnvId != null && (firstHopIsLocal || externalLabel == null) && /* @__PURE__ */ jsxDEV10(Chip, {
3087
3508
  color: "handler_local" /* handler_local */,
3088
3509
  size,
3089
3510
  subtle,
3090
3511
  children: localEnvId
3091
3512
  }, undefined, false, undefined, this),
3092
- externalLabel != null && /* @__PURE__ */ jsxDEV9(Chip, {
3513
+ externalLabel != null && /* @__PURE__ */ jsxDEV10(Chip, {
3093
3514
  color: "handler_external" /* handler_external */,
3094
3515
  size,
3095
3516
  subtle,
@@ -3100,15 +3521,15 @@ function HandlerChips({ entry, size, subtle }) {
3100
3521
  }
3101
3522
 
3102
3523
  // src/devtools/browser/components/RunningTimer.tsx
3103
- import { useEffect as useEffect2, useState as useState4 } from "react";
3104
- import { jsxDEV as jsxDEV10, Fragment as Fragment5 } from "react/jsx-dev-runtime";
3524
+ import { useEffect as useEffect2, useState as useState5 } from "react";
3525
+ import { jsxDEV as jsxDEV11, Fragment as Fragment6 } from "react/jsx-dev-runtime";
3105
3526
  function RunningTimer({ startTime }) {
3106
- const [elapsed, setElapsed] = useState4(() => Date.now() - startTime);
3527
+ const [elapsed, setElapsed] = useState5(() => Date.now() - startTime);
3107
3528
  useEffect2(() => {
3108
3529
  const interval = setInterval(() => setElapsed(Date.now() - startTime), 100);
3109
3530
  return () => clearInterval(interval);
3110
3531
  }, [startTime]);
3111
- return /* @__PURE__ */ jsxDEV10(Fragment5, {
3532
+ return /* @__PURE__ */ jsxDEV11(Fragment6, {
3112
3533
  children: [
3113
3534
  elapsed,
3114
3535
  "ms"
@@ -3117,15 +3538,15 @@ function RunningTimer({ startTime }) {
3117
3538
  }
3118
3539
  function DurationDisplay({ entry }) {
3119
3540
  const d = formatDuration(entry);
3120
- return /* @__PURE__ */ jsxDEV10(Fragment5, {
3121
- children: d ?? /* @__PURE__ */ jsxDEV10(RunningTimer, {
3541
+ return /* @__PURE__ */ jsxDEV11(Fragment6, {
3542
+ children: d ?? /* @__PURE__ */ jsxDEV11(RunningTimer, {
3122
3543
  startTime: entry.startTime
3123
3544
  }, undefined, false, undefined, this)
3124
3545
  }, undefined, false, undefined, this);
3125
3546
  }
3126
3547
 
3127
3548
  // src/devtools/browser/components/CallStackSection.tsx
3128
- import { jsxDEV as jsxDEV11 } from "react/jsx-dev-runtime";
3549
+ import { jsxDEV as jsxDEV12 } from "react/jsx-dev-runtime";
3129
3550
  function getCalledLabel(entry) {
3130
3551
  const firstHop = entry.meta.routing[0];
3131
3552
  if (firstHop == null)
@@ -3153,7 +3574,7 @@ function CallStackLink({
3153
3574
  const symbol = STATUS_SYMBOL[entry.status];
3154
3575
  const labelColor = entryRole === "caller" ? DEVTOOL_COLOR_TEXT_SECONDARY : getCalledColor(entry);
3155
3576
  const label = entryRole === "caller" ? "↑ from" : getCalledLabel(entry);
3156
- return /* @__PURE__ */ jsxDEV11("div", {
3577
+ return /* @__PURE__ */ jsxDEV12("div", {
3157
3578
  onClick,
3158
3579
  style: {
3159
3580
  background: isFocused ? DEVTOOL_SECTION_BACKGROUND : DEVTOOL_DETAIL_HEADER_BACKGROUND,
@@ -3167,21 +3588,21 @@ function CallStackLink({
3167
3588
  cursor: "pointer"
3168
3589
  },
3169
3590
  children: [
3170
- /* @__PURE__ */ jsxDEV11("span", {
3591
+ /* @__PURE__ */ jsxDEV12("span", {
3171
3592
  style: { display: "flex", alignItems: "center", gap: "1em", flexShrink: 0 },
3172
3593
  children: [
3173
- /* @__PURE__ */ jsxDEV11("span", {
3594
+ /* @__PURE__ */ jsxDEV12("span", {
3174
3595
  style: { color, fontSize: "10px", flexShrink: 0 },
3175
3596
  children: symbol
3176
3597
  }, undefined, false, undefined, this),
3177
- /* @__PURE__ */ jsxDEV11("span", {
3598
+ /* @__PURE__ */ jsxDEV12("span", {
3178
3599
  style: { color: labelColor, fontSize: "9px", flexShrink: 0 },
3179
3600
  children: label
3180
3601
  }, undefined, false, undefined, this),
3181
- /* @__PURE__ */ jsxDEV11("span", {
3602
+ /* @__PURE__ */ jsxDEV12("span", {
3182
3603
  style: { display: "flex", alignItems: "center", gap: "5px" },
3183
3604
  children: [
3184
- /* @__PURE__ */ jsxDEV11("span", {
3605
+ /* @__PURE__ */ jsxDEV12("span", {
3185
3606
  style: {
3186
3607
  color: DEVTOOL_COLOR_TEXT_SECONDARY,
3187
3608
  fontSize: "11px",
@@ -3191,7 +3612,7 @@ function CallStackLink({
3191
3612
  },
3192
3613
  children: entry.actionId
3193
3614
  }, undefined, false, undefined, this),
3194
- /* @__PURE__ */ jsxDEV11(DomainChip, {
3615
+ /* @__PURE__ */ jsxDEV12(DomainChip, {
3195
3616
  domain: entry.domain,
3196
3617
  allDomains: entry.allDomains,
3197
3618
  size: "sm" /* sm */
@@ -3200,14 +3621,14 @@ function CallStackLink({
3200
3621
  }, undefined, true, undefined, this)
3201
3622
  ]
3202
3623
  }, undefined, true, undefined, this),
3203
- /* @__PURE__ */ jsxDEV11("span", {
3624
+ /* @__PURE__ */ jsxDEV12("span", {
3204
3625
  style: {
3205
3626
  color: DEVTOOL_COLOR_TEXT_FAINT,
3206
3627
  fontSize: "10px",
3207
3628
  textAlign: "right",
3208
3629
  whiteSpace: "nowrap"
3209
3630
  },
3210
- children: /* @__PURE__ */ jsxDEV11(DurationDisplay, {
3631
+ children: /* @__PURE__ */ jsxDEV12(DurationDisplay, {
3211
3632
  entry
3212
3633
  }, undefined, false, undefined, this)
3213
3634
  }, undefined, false, undefined, this)
@@ -3223,15 +3644,15 @@ function CallStackSection({
3223
3644
  }) {
3224
3645
  if (parent == null && childEntries.length === 0)
3225
3646
  return null;
3226
- return /* @__PURE__ */ jsxDEV11("div", {
3647
+ return /* @__PURE__ */ jsxDEV12("div", {
3227
3648
  children: [
3228
- parent != null && /* @__PURE__ */ jsxDEV11(CallStackLink, {
3649
+ parent != null && /* @__PURE__ */ jsxDEV12(CallStackLink, {
3229
3650
  entry: parent,
3230
3651
  entryRole: "caller",
3231
3652
  isFocused: false,
3232
3653
  onClick: () => onSelectParent(parent.cuid)
3233
3654
  }, undefined, false, undefined, this),
3234
- childEntries.map((child) => /* @__PURE__ */ jsxDEV11(CallStackLink, {
3655
+ childEntries.map((child) => /* @__PURE__ */ jsxDEV12(CallStackLink, {
3235
3656
  entry: child,
3236
3657
  entryRole: "called",
3237
3658
  isFocused: focusedChildCuid === child.cuid,
@@ -3242,7 +3663,7 @@ function CallStackSection({
3242
3663
  }
3243
3664
 
3244
3665
  // src/devtools/browser/components/ChildDispatchChips.tsx
3245
- import { jsxDEV as jsxDEV12 } from "react/jsx-dev-runtime";
3666
+ import { jsxDEV as jsxDEV13 } from "react/jsx-dev-runtime";
3246
3667
  function ChildDispatchChips({
3247
3668
  childRouteItems,
3248
3669
  size = "sm" /* sm */
@@ -3262,12 +3683,12 @@ function ChildDispatchChips({
3262
3683
  group.transports.push(transport);
3263
3684
  }
3264
3685
  }
3265
- return /* @__PURE__ */ jsxDEV12("div", {
3686
+ return /* @__PURE__ */ jsxDEV13("div", {
3266
3687
  style: { display: "flex", alignItems: "center", gap: "4px", flexWrap: "wrap" },
3267
3688
  children: Array.from(groups.values()).map((group) => {
3268
3689
  const transportStr = group.transports.length > 0 ? group.transports.join(", ") : "ext";
3269
3690
  const label = group.hasClient ? `${transportStr} → ${group.runtimeId}` : `→ ${transportStr}`;
3270
- return /* @__PURE__ */ jsxDEV12(Chip, {
3691
+ return /* @__PURE__ */ jsxDEV13(Chip, {
3271
3692
  color: "handler_external" /* handler_external */,
3272
3693
  size,
3273
3694
  children: label
@@ -3277,20 +3698,20 @@ function ChildDispatchChips({
3277
3698
  }
3278
3699
 
3279
3700
  // src/devtools/browser/components/MetaSection.tsx
3280
- import { useState as useState5 } from "react";
3281
- import { jsxDEV as jsxDEV13 } from "react/jsx-dev-runtime";
3701
+ import { useState as useState6 } from "react";
3702
+ import { jsxDEV as jsxDEV14 } from "react/jsx-dev-runtime";
3282
3703
  function MetaChip({ label, value }) {
3283
- return /* @__PURE__ */ jsxDEV13("span", {
3704
+ return /* @__PURE__ */ jsxDEV14("span", {
3284
3705
  style: { whiteSpace: "nowrap" },
3285
3706
  children: [
3286
- /* @__PURE__ */ jsxDEV13("span", {
3707
+ /* @__PURE__ */ jsxDEV14("span", {
3287
3708
  style: { color: DEVTOOL_COLOR_TEXT_MUTED },
3288
3709
  children: [
3289
3710
  label,
3290
3711
  " "
3291
3712
  ]
3292
3713
  }, undefined, true, undefined, this),
3293
- /* @__PURE__ */ jsxDEV13("span", {
3714
+ /* @__PURE__ */ jsxDEV14("span", {
3294
3715
  style: { color: DEVTOOL_COLOR_TEXT_SECONDARY },
3295
3716
  children: value
3296
3717
  }, undefined, false, undefined, this)
@@ -3298,7 +3719,7 @@ function MetaChip({ label, value }) {
3298
3719
  }, undefined, true, undefined, this);
3299
3720
  }
3300
3721
  function MetaSection({ entry }) {
3301
- const [expanded, setExpanded] = useState5(false);
3722
+ const [expanded, setExpanded] = useState6(false);
3302
3723
  const { meta, cuid } = entry;
3303
3724
  const expandedRows = [
3304
3725
  { label: "cuid", value: cuid },
@@ -3306,9 +3727,9 @@ function MetaSection({ entry }) {
3306
3727
  ...meta.originClient.perId != null ? [{ label: "perId", value: meta.originClient.perId }] : [],
3307
3728
  ...meta.originClient.insId != null ? [{ label: "insId", value: meta.originClient.insId }] : []
3308
3729
  ];
3309
- return /* @__PURE__ */ jsxDEV13("div", {
3730
+ return /* @__PURE__ */ jsxDEV14("div", {
3310
3731
  children: [
3311
- /* @__PURE__ */ jsxDEV13("div", {
3732
+ /* @__PURE__ */ jsxDEV14("div", {
3312
3733
  style: {
3313
3734
  display: "flex",
3314
3735
  alignItems: "center",
@@ -3316,7 +3737,7 @@ function MetaSection({ entry }) {
3316
3737
  marginBottom: "3px"
3317
3738
  },
3318
3739
  children: [
3319
- /* @__PURE__ */ jsxDEV13("div", {
3740
+ /* @__PURE__ */ jsxDEV14("div", {
3320
3741
  style: {
3321
3742
  color: DEVTOOL_COLOR_SEMANTIC_SYSTEM,
3322
3743
  fontSize: "10px",
@@ -3325,13 +3746,13 @@ function MetaSection({ entry }) {
3325
3746
  },
3326
3747
  children: "Meta"
3327
3748
  }, undefined, false, undefined, this),
3328
- /* @__PURE__ */ jsxDEV13("span", {
3749
+ /* @__PURE__ */ jsxDEV14("span", {
3329
3750
  style: { color: DEVTOOL_COLOR_TEXT_FAINT, fontSize: "11px" },
3330
3751
  children: expanded ? "▾" : "▸"
3331
3752
  }, undefined, false, undefined, this)
3332
3753
  ]
3333
3754
  }, undefined, true, undefined, this),
3334
- expanded ? /* @__PURE__ */ jsxDEV13("div", {
3755
+ expanded ? /* @__PURE__ */ jsxDEV14("div", {
3335
3756
  onClick: () => setExpanded(false),
3336
3757
  style: {
3337
3758
  background: DEVTOOL_SECTION_BACKGROUND,
@@ -3339,7 +3760,7 @@ function MetaSection({ entry }) {
3339
3760
  overflow: "hidden",
3340
3761
  cursor: "pointer"
3341
3762
  },
3342
- children: expandedRows.map(({ label, value }, i) => /* @__PURE__ */ jsxDEV13("div", {
3763
+ children: expandedRows.map(({ label, value }, i) => /* @__PURE__ */ jsxDEV14("div", {
3343
3764
  style: {
3344
3765
  display: "grid",
3345
3766
  gridTemplateColumns: "52px 1fr",
@@ -3349,11 +3770,11 @@ function MetaSection({ entry }) {
3349
3770
  alignItems: "start"
3350
3771
  },
3351
3772
  children: [
3352
- /* @__PURE__ */ jsxDEV13("span", {
3773
+ /* @__PURE__ */ jsxDEV14("span", {
3353
3774
  style: { textAlign: "left", color: DEVTOOL_COLOR_TEXT_MUTED, fontSize: "10px", paddingTop: "1px" },
3354
3775
  children: label
3355
3776
  }, undefined, false, undefined, this),
3356
- /* @__PURE__ */ jsxDEV13("span", {
3777
+ /* @__PURE__ */ jsxDEV14("span", {
3357
3778
  style: {
3358
3779
  textAlign: "left",
3359
3780
  color: DEVTOOL_COLOR_TEXT_SECONDARY,
@@ -3364,7 +3785,7 @@ function MetaSection({ entry }) {
3364
3785
  }, undefined, false, undefined, this)
3365
3786
  ]
3366
3787
  }, label, true, undefined, this))
3367
- }, undefined, false, undefined, this) : /* @__PURE__ */ jsxDEV13("div", {
3788
+ }, undefined, false, undefined, this) : /* @__PURE__ */ jsxDEV14("div", {
3368
3789
  onClick: () => setExpanded(true),
3369
3790
  style: {
3370
3791
  background: DEVTOOL_SECTION_BACKGROUND,
@@ -3378,19 +3799,19 @@ function MetaSection({ entry }) {
3378
3799
  cursor: "pointer"
3379
3800
  },
3380
3801
  children: [
3381
- /* @__PURE__ */ jsxDEV13(MetaChip, {
3802
+ /* @__PURE__ */ jsxDEV14(MetaChip, {
3382
3803
  label: "cuid",
3383
3804
  value: `…${cuid.slice(-8)}`
3384
3805
  }, undefined, false, undefined, this),
3385
- /* @__PURE__ */ jsxDEV13(MetaChip, {
3806
+ /* @__PURE__ */ jsxDEV14(MetaChip, {
3386
3807
  label: "runtime",
3387
3808
  value: meta.originClient.envId
3388
3809
  }, undefined, false, undefined, this),
3389
- meta.originClient.perId != null && /* @__PURE__ */ jsxDEV13(MetaChip, {
3810
+ meta.originClient.perId != null && /* @__PURE__ */ jsxDEV14(MetaChip, {
3390
3811
  label: "perId",
3391
3812
  value: meta.originClient.perId.length > 10 ? `${meta.originClient.perId.slice(0, 10)}…` : meta.originClient.perId
3392
3813
  }, undefined, false, undefined, this),
3393
- meta.originClient.insId != null && /* @__PURE__ */ jsxDEV13(MetaChip, {
3814
+ meta.originClient.insId != null && /* @__PURE__ */ jsxDEV14(MetaChip, {
3394
3815
  label: "insId",
3395
3816
  value: meta.originClient.insId.length > 10 ? `${meta.originClient.insId.slice(0, 10)}…` : meta.originClient.insId
3396
3817
  }, undefined, false, undefined, this)
@@ -3401,7 +3822,7 @@ function MetaSection({ entry }) {
3401
3822
  }
3402
3823
 
3403
3824
  // src/devtools/browser/components/RoutingSection.tsx
3404
- import { jsxDEV as jsxDEV14 } from "react/jsx-dev-runtime";
3825
+ import { jsxDEV as jsxDEV15 } from "react/jsx-dev-runtime";
3405
3826
  function RoutingSection({
3406
3827
  entry,
3407
3828
  minHopCount = 0
@@ -3411,12 +3832,12 @@ function RoutingSection({
3411
3832
  const phantomCount = Math.max(0, minHopCount - hopCount);
3412
3833
  if (hopCount === 0 && phantomCount === 0)
3413
3834
  return null;
3414
- return /* @__PURE__ */ jsxDEV14("div", {
3835
+ return /* @__PURE__ */ jsxDEV15("div", {
3415
3836
  children: [
3416
- /* @__PURE__ */ jsxDEV14(SectionLabel, {
3837
+ /* @__PURE__ */ jsxDEV15(SectionLabel, {
3417
3838
  label: hopCount > 0 ? `Routing · ${hopCount} hop${hopCount !== 1 ? "s" : ""}` : "Routing"
3418
3839
  }, undefined, false, undefined, this),
3419
- /* @__PURE__ */ jsxDEV14("div", {
3840
+ /* @__PURE__ */ jsxDEV15("div", {
3420
3841
  style: { display: "flex", flexDirection: "column", gap: "2px" },
3421
3842
  children: [
3422
3843
  meta.routing.map((hop, i) => {
@@ -3425,7 +3846,7 @@ function RoutingSection({
3425
3846
  const badgeColor = isLocal ? DEVTOOL_COLOR_SEMANTIC_SUCCESS : DEVTOOL_COLOR_SEMANTIC_WARNING;
3426
3847
  const badgeText = isLocal ? "● exec" : `→ ${hop.transport ?? "ext"}`;
3427
3848
  const runtimeTitle = [hop.runtime.perId, hop.runtime.insId].filter(Boolean).join(" · ") || undefined;
3428
- return /* @__PURE__ */ jsxDEV14("div", {
3849
+ return /* @__PURE__ */ jsxDEV15("div", {
3429
3850
  style: {
3430
3851
  background: DEVTOOL_SECTION_BACKGROUND,
3431
3852
  borderRadius: "4px",
@@ -3438,14 +3859,14 @@ function RoutingSection({
3438
3859
  padding: "4px 8px"
3439
3860
  },
3440
3861
  children: [
3441
- /* @__PURE__ */ jsxDEV14("span", {
3862
+ /* @__PURE__ */ jsxDEV15("span", {
3442
3863
  style: { display: "flex", flexDirection: "row", alignItems: "center", gap: "10px" },
3443
3864
  children: [
3444
- /* @__PURE__ */ jsxDEV14("span", {
3865
+ /* @__PURE__ */ jsxDEV15("span", {
3445
3866
  style: { color: DEVTOOL_COLOR_TEXT_FAINT, fontSize: "10px", width: "16px", textAlign: "right" },
3446
3867
  children: i + 1
3447
3868
  }, undefined, false, undefined, this),
3448
- /* @__PURE__ */ jsxDEV14("span", {
3869
+ /* @__PURE__ */ jsxDEV15("span", {
3449
3870
  title: runtimeTitle,
3450
3871
  style: {
3451
3872
  color: DEVTOOL_COLOR_TEXT_SECONDARY,
@@ -3459,11 +3880,11 @@ function RoutingSection({
3459
3880
  }, undefined, false, undefined, this)
3460
3881
  ]
3461
3882
  }, undefined, true, undefined, this),
3462
- /* @__PURE__ */ jsxDEV14("span", {
3883
+ /* @__PURE__ */ jsxDEV15("span", {
3463
3884
  style: { color: badgeColor, fontSize: "10px", whiteSpace: "nowrap" },
3464
3885
  children: badgeText
3465
3886
  }, undefined, false, undefined, this),
3466
- /* @__PURE__ */ jsxDEV14("span", {
3887
+ /* @__PURE__ */ jsxDEV15("span", {
3467
3888
  style: {
3468
3889
  display: "flex",
3469
3890
  alignItems: "center",
@@ -3472,7 +3893,7 @@ function RoutingSection({
3472
3893
  overflow: "hidden"
3473
3894
  },
3474
3895
  children: [
3475
- /* @__PURE__ */ jsxDEV14("span", {
3896
+ /* @__PURE__ */ jsxDEV15("span", {
3476
3897
  style: {
3477
3898
  color: DEVTOOL_COLOR_TEXT_MUTED,
3478
3899
  fontSize: "10px",
@@ -3482,7 +3903,7 @@ function RoutingSection({
3482
3903
  },
3483
3904
  children: hop.handlerClient != null ? `↳ ${hop.handlerClient.envId}` : ""
3484
3905
  }, undefined, false, undefined, this),
3485
- /* @__PURE__ */ jsxDEV14("span", {
3906
+ /* @__PURE__ */ jsxDEV15("span", {
3486
3907
  style: { color: DEVTOOL_COLOR_TEXT_FAINT, fontSize: "10px", flexShrink: 0, marginLeft: "auto" },
3487
3908
  children: [
3488
3909
  "+",
@@ -3495,7 +3916,7 @@ function RoutingSection({
3495
3916
  ]
3496
3917
  }, `${hop.time}-${hop.runtime.envId}`, true, undefined, this);
3497
3918
  }),
3498
- Array.from({ length: phantomCount }, (_, i) => `routing-phantom-${hopCount + i}`).map((key) => /* @__PURE__ */ jsxDEV14("div", {
3919
+ Array.from({ length: phantomCount }, (_, i) => `routing-phantom-${hopCount + i}`).map((key) => /* @__PURE__ */ jsxDEV15("div", {
3499
3920
  "aria-hidden": "true",
3500
3921
  style: {
3501
3922
  visibility: "hidden",
@@ -3508,24 +3929,24 @@ function RoutingSection({
3508
3929
  padding: "4px 8px"
3509
3930
  },
3510
3931
  children: [
3511
- /* @__PURE__ */ jsxDEV14("span", {
3932
+ /* @__PURE__ */ jsxDEV15("span", {
3512
3933
  style: { display: "flex", flexDirection: "row", alignItems: "center", gap: "10px" },
3513
3934
  children: [
3514
- /* @__PURE__ */ jsxDEV14("span", {
3935
+ /* @__PURE__ */ jsxDEV15("span", {
3515
3936
  style: { fontSize: "10px", width: "16px" },
3516
3937
  children: "0"
3517
3938
  }, undefined, false, undefined, this),
3518
- /* @__PURE__ */ jsxDEV14("span", {
3939
+ /* @__PURE__ */ jsxDEV15("span", {
3519
3940
  style: { fontSize: "11px" },
3520
3941
  children: "placeholder"
3521
3942
  }, undefined, false, undefined, this)
3522
3943
  ]
3523
3944
  }, undefined, true, undefined, this),
3524
- /* @__PURE__ */ jsxDEV14("span", {
3945
+ /* @__PURE__ */ jsxDEV15("span", {
3525
3946
  style: { fontSize: "10px" },
3526
3947
  children: "placeholder"
3527
3948
  }, undefined, false, undefined, this),
3528
- /* @__PURE__ */ jsxDEV14("span", {}, undefined, false, undefined, this)
3949
+ /* @__PURE__ */ jsxDEV15("span", {}, undefined, false, undefined, this)
3529
3950
  ]
3530
3951
  }, key, true, undefined, this))
3531
3952
  ]
@@ -3535,7 +3956,7 @@ function RoutingSection({
3535
3956
  }
3536
3957
 
3537
3958
  // src/devtools/browser/components/action_detail/ActionDetailPanel.tsx
3538
- import { jsxDEV as jsxDEV15 } from "react/jsx-dev-runtime";
3959
+ import { jsxDEV as jsxDEV16 } from "react/jsx-dev-runtime";
3539
3960
  var STATUS_BADGE_LABEL = {
3540
3961
  running: "RUNNING",
3541
3962
  success: "SUCCESS",
@@ -3566,7 +3987,7 @@ function DetailHeader({
3566
3987
  const color = STATUS_COLOR[entry.status];
3567
3988
  const StatusIconComponent = STATUS_ICON[entry.status];
3568
3989
  const timestamp = formatTimestamp(entry.startTime);
3569
- return /* @__PURE__ */ jsxDEV15("div", {
3990
+ return /* @__PURE__ */ jsxDEV16("div", {
3570
3991
  onClick: !isActive ? onClick : undefined,
3571
3992
  style: {
3572
3993
  padding: "0.5em 1em",
@@ -3580,13 +4001,13 @@ function DetailHeader({
3580
4001
  gap: "1em",
3581
4002
  cursor: isActive ? "default" : "pointer"
3582
4003
  },
3583
- children: /* @__PURE__ */ jsxDEV15("div", {
4004
+ children: /* @__PURE__ */ jsxDEV16("div", {
3584
4005
  style: { flex: 1, minWidth: 0, display: "flex", flexDirection: "column", gap: "0.5em" },
3585
4006
  children: [
3586
- /* @__PURE__ */ jsxDEV15("div", {
4007
+ /* @__PURE__ */ jsxDEV16("div", {
3587
4008
  style: { display: "flex", alignItems: "center", minWidth: 0, gap: "0.5em" },
3588
4009
  children: [
3589
- /* @__PURE__ */ jsxDEV15("span", {
4010
+ /* @__PURE__ */ jsxDEV16("span", {
3590
4011
  style: {
3591
4012
  color,
3592
4013
  flexShrink: 0,
@@ -3594,12 +4015,12 @@ function DetailHeader({
3594
4015
  alignItems: "center",
3595
4016
  animation: entry.status === "running" ? "__nice-action-pulse 1.2s ease-in-out infinite" : undefined
3596
4017
  },
3597
- children: /* @__PURE__ */ jsxDEV15(StatusIconComponent, {
4018
+ children: /* @__PURE__ */ jsxDEV16(StatusIconComponent, {
3598
4019
  size: 20,
3599
4020
  strokeWidth: 1.75
3600
4021
  }, undefined, false, undefined, this)
3601
4022
  }, undefined, false, undefined, this),
3602
- /* @__PURE__ */ jsxDEV15("span", {
4023
+ /* @__PURE__ */ jsxDEV16("span", {
3603
4024
  style: {
3604
4025
  color: DEVTOOL_COLOR_TEXT_EMPHASIS,
3605
4026
  fontSize: "1.2em",
@@ -3613,7 +4034,7 @@ function DetailHeader({
3613
4034
  },
3614
4035
  children: entry.actionId
3615
4036
  }, undefined, false, undefined, this),
3616
- /* @__PURE__ */ jsxDEV15("span", {
4037
+ /* @__PURE__ */ jsxDEV16("span", {
3617
4038
  style: {
3618
4039
  flexShrink: 0,
3619
4040
  padding: "2px 9px",
@@ -3628,14 +4049,14 @@ function DetailHeader({
3628
4049
  },
3629
4050
  children: STATUS_BADGE_LABEL[entry.status]
3630
4051
  }, undefined, false, undefined, this),
3631
- /* @__PURE__ */ jsxDEV15(DomainChip, {
4052
+ /* @__PURE__ */ jsxDEV16(DomainChip, {
3632
4053
  domain: entry.domain,
3633
4054
  allDomains: entry.allDomains,
3634
4055
  size: "md" /* md */
3635
4056
  }, undefined, false, undefined, this)
3636
4057
  ]
3637
4058
  }, undefined, true, undefined, this),
3638
- /* @__PURE__ */ jsxDEV15("div", {
4059
+ /* @__PURE__ */ jsxDEV16("div", {
3639
4060
  style: {
3640
4061
  display: "flex",
3641
4062
  alignItems: "center",
@@ -3643,7 +4064,7 @@ function DetailHeader({
3643
4064
  gap: "8px"
3644
4065
  },
3645
4066
  children: [
3646
- /* @__PURE__ */ jsxDEV15("div", {
4067
+ /* @__PURE__ */ jsxDEV16("div", {
3647
4068
  style: {
3648
4069
  display: "flex",
3649
4070
  alignItems: "center",
@@ -3652,20 +4073,20 @@ function DetailHeader({
3652
4073
  overflow: "hidden"
3653
4074
  },
3654
4075
  children: [
3655
- /* @__PURE__ */ jsxDEV15(HandlerChips, {
4076
+ /* @__PURE__ */ jsxDEV16(HandlerChips, {
3656
4077
  entry,
3657
4078
  size: "md" /* md */
3658
4079
  }, undefined, false, undefined, this),
3659
- /* @__PURE__ */ jsxDEV15(ChildDispatchChips, {
4080
+ /* @__PURE__ */ jsxDEV16(ChildDispatchChips, {
3660
4081
  childRouteItems: childExternalRouteItems,
3661
4082
  size: "md" /* md */
3662
4083
  }, undefined, false, undefined, this)
3663
4084
  ]
3664
4085
  }, undefined, true, undefined, this),
3665
- /* @__PURE__ */ jsxDEV15("div", {
4086
+ /* @__PURE__ */ jsxDEV16("div", {
3666
4087
  style: { display: "flex", alignItems: "center", gap: "8px", flexShrink: 0 },
3667
4088
  children: [
3668
- /* @__PURE__ */ jsxDEV15("span", {
4089
+ /* @__PURE__ */ jsxDEV16("span", {
3669
4090
  style: {
3670
4091
  color: DEVTOOL_COLOR_SEMANTIC_METADATA,
3671
4092
  fontSize: "10px",
@@ -3674,9 +4095,9 @@ function DetailHeader({
3674
4095
  },
3675
4096
  children: timestamp
3676
4097
  }, undefined, false, undefined, this),
3677
- /* @__PURE__ */ jsxDEV15("span", {
4098
+ /* @__PURE__ */ jsxDEV16("span", {
3678
4099
  style: { color, fontSize: "12px", fontWeight: "500" },
3679
- children: /* @__PURE__ */ jsxDEV15(DurationDisplay, {
4100
+ children: /* @__PURE__ */ jsxDEV16(DurationDisplay, {
3680
4101
  entry
3681
4102
  }, undefined, false, undefined, this)
3682
4103
  }, undefined, false, undefined, this)
@@ -3694,10 +4115,10 @@ function ActionDetailPanel({
3694
4115
  childEntries,
3695
4116
  onSelectEntry
3696
4117
  }) {
3697
- const [focusedChildCuid, setFocusedChildCuid] = useState6(null);
4118
+ const [focusedChildCuid, setFocusedChildCuid] = useState7(null);
3698
4119
  const focusedEntry = focusedChildCuid != null ? childEntries.find((e) => e.cuid === focusedChildCuid) ?? entry : entry;
3699
4120
  const maxRoutingHops = Math.max(entry.meta.routing.length, ...childEntries.map((e) => e.meta.routing.length), 0);
3700
- const maxCallSiteFrames = Math.max(countUserFrames(entry.callSite), ...childEntries.map((e) => countUserFrames(e.callSite)), 0);
4121
+ const maxCallSiteFrames = Math.max(countUserFrames(entry.meta.originClient, entry.callSite), ...childEntries.map((e) => countUserFrames(e.meta.originClient, e.callSite)), 0);
3701
4122
  const childExternalRouteItems = useMemo(() => {
3702
4123
  const seen = new Set;
3703
4124
  const result = [];
@@ -3716,7 +4137,7 @@ function ActionDetailPanel({
3716
4137
  const handleFocusChild = (cuid) => {
3717
4138
  setFocusedChildCuid((prev) => prev === cuid ? null : cuid);
3718
4139
  };
3719
- return /* @__PURE__ */ jsxDEV15("div", {
4140
+ return /* @__PURE__ */ jsxDEV16("div", {
3720
4141
  style: {
3721
4142
  flex: 1,
3722
4143
  display: "flex",
@@ -3726,20 +4147,20 @@ function ActionDetailPanel({
3726
4147
  background: DEVTOOL_DETAIL_BASE_BACKGROUND
3727
4148
  },
3728
4149
  children: [
3729
- /* @__PURE__ */ jsxDEV15(DetailHeader, {
4150
+ /* @__PURE__ */ jsxDEV16(DetailHeader, {
3730
4151
  entry,
3731
4152
  isActive: focusedChildCuid === null,
3732
4153
  onClick: () => setFocusedChildCuid(null),
3733
4154
  childExternalRouteItems
3734
4155
  }, undefined, false, undefined, this),
3735
- /* @__PURE__ */ jsxDEV15(CallStackSection, {
4156
+ /* @__PURE__ */ jsxDEV16(CallStackSection, {
3736
4157
  parent,
3737
4158
  childEntries,
3738
4159
  focusedChildCuid,
3739
4160
  onFocusChild: handleFocusChild,
3740
4161
  onSelectParent: onSelectEntry
3741
4162
  }, undefined, false, undefined, this),
3742
- /* @__PURE__ */ jsxDEV15("div", {
4163
+ /* @__PURE__ */ jsxDEV16("div", {
3743
4164
  style: {
3744
4165
  flex: 1,
3745
4166
  overflowY: "auto",
@@ -3750,36 +4171,37 @@ function ActionDetailPanel({
3750
4171
  gap: "8px"
3751
4172
  },
3752
4173
  children: [
3753
- focusedEntry.input !== undefined ? /* @__PURE__ */ jsxDEV15(DetailSection, {
4174
+ focusedEntry.input !== undefined ? /* @__PURE__ */ jsxDEV16(DetailSection, {
3754
4175
  label: "Input",
3755
4176
  value: focusedEntry.input
3756
- }, undefined, false, undefined, this) : /* @__PURE__ */ jsxDEV15(DetailSection, {
4177
+ }, undefined, false, undefined, this) : /* @__PURE__ */ jsxDEV16(DetailSection, {
3757
4178
  label: "Input",
3758
4179
  value: "No input required or given"
3759
4180
  }, undefined, false, undefined, this),
3760
- focusedEntry.status === "success" && /* @__PURE__ */ jsxDEV15(DetailSection, {
4181
+ focusedEntry.status === "success" && /* @__PURE__ */ jsxDEV16(DetailSection, {
3761
4182
  label: "Output",
3762
4183
  value: focusedEntry.output,
3763
4184
  color: DEVTOOL_COLOR_SEMANTIC_SUCCESS
3764
4185
  }, undefined, false, undefined, this),
3765
- (focusedEntry.status === "action-error" || focusedEntry.status === "failed" || focusedEntry.status === "aborted") && /* @__PURE__ */ jsxDEV15(ActionErrorDisplay, {
4186
+ (focusedEntry.status === "action-error" || focusedEntry.status === "failed" || focusedEntry.status === "aborted") && /* @__PURE__ */ jsxDEV16(ActionErrorDisplay, {
3766
4187
  entry: focusedEntry
3767
4188
  }, undefined, false, undefined, this),
3768
- focusedEntry.progressUpdates.length > 0 && /* @__PURE__ */ jsxDEV15(DetailSection, {
4189
+ focusedEntry.progressUpdates.length > 0 && /* @__PURE__ */ jsxDEV16(DetailSection, {
3769
4190
  label: `Progress (${focusedEntry.progressUpdates.length})`,
3770
4191
  value: focusedEntry.progressUpdates
3771
4192
  }, undefined, false, undefined, this),
3772
- /* @__PURE__ */ jsxDEV15(StackTraceSection, {
4193
+ /* @__PURE__ */ jsxDEV16(StackTraceSection, {
4194
+ runtime: entry.meta.originClient,
3773
4195
  label: "Dispatch Site",
3774
4196
  stack: focusedEntry.callSite,
3775
4197
  color: DEVTOOL_COLOR_TEXT_SECONDARY,
3776
4198
  minFrameCount: maxCallSiteFrames
3777
4199
  }, undefined, false, undefined, this),
3778
- /* @__PURE__ */ jsxDEV15(RoutingSection, {
4200
+ /* @__PURE__ */ jsxDEV16(RoutingSection, {
3779
4201
  entry: focusedEntry,
3780
4202
  minHopCount: maxRoutingHops
3781
4203
  }, undefined, false, undefined, this),
3782
- /* @__PURE__ */ jsxDEV15(MetaSection, {
4204
+ /* @__PURE__ */ jsxDEV16(MetaSection, {
3783
4205
  entry: focusedEntry
3784
4206
  }, undefined, false, undefined, this)
3785
4207
  ]
@@ -3788,72 +4210,18 @@ function ActionDetailPanel({
3788
4210
  }, undefined, true, undefined, this);
3789
4211
  }
3790
4212
 
4213
+ // src/devtools/browser/components/action_list/ActionList.tsx
4214
+ import { useEffect as useEffect3, useMemo as useMemo2, useRef as useRef2 } from "react";
4215
+
3791
4216
  // src/devtools/browser/components/action_list/ActionEntryRow.tsx
3792
- import { Box, CircleX as CircleX2, Variable } from "lucide-react";
3793
- import { Fragment as Fragment7, useState as useState8 } from "react";
4217
+ import { Box as Box2, CircleX as CircleX3, Variable as Variable2 } from "lucide-react";
4218
+ import { Fragment as Fragment8, useState as useState8 } from "react";
3794
4219
 
3795
- // src/devtools/browser/components/Icon.tsx
3796
- import { useState as useState7 } from "react";
3797
- import { jsxDEV as jsxDEV16, Fragment as Fragment6 } from "react/jsx-dev-runtime";
3798
- var ICON_SIZE_PX = {
3799
- ["sm" /* sm */]: 13,
3800
- ["md" /* md */]: 16,
3801
- ["lg" /* lg */]: 18
3802
- };
3803
- function Icon({
3804
- icon: IconComponent,
3805
- color,
3806
- size = "md" /* md */,
3807
- subtle = false,
3808
- tooltip,
3809
- style
3810
- }) {
3811
- const [anchor, setAnchor] = useState7(null);
3812
- const hasTooltip = tooltip != null;
3813
- const colorEntry = SEMANTIC_COLORS[color];
3814
- const resolvedColor = subtle ? colorEntry.subtle?.color ?? colorEntry.color : colorEntry.color;
3815
- return /* @__PURE__ */ jsxDEV16(Fragment6, {
3816
- children: [
3817
- /* @__PURE__ */ jsxDEV16("div", {
3818
- onMouseEnter: hasTooltip ? (e) => setAnchor(e.currentTarget.getBoundingClientRect()) : undefined,
3819
- onMouseLeave: hasTooltip ? () => setAnchor(null) : undefined,
3820
- style: {
3821
- borderRadius: "0.4em",
3822
- height: `${1.65 * getSizeValue(size)}em`,
3823
- width: `${1.65 * getSizeValue(size)}em`,
3824
- display: "flex",
3825
- alignItems: "center",
3826
- justifyContent: "center",
3827
- background: "rgba(0,0,0,0.4)",
3828
- color: resolvedColor,
3829
- flexShrink: 0,
3830
- cursor: hasTooltip ? "default" : undefined,
3831
- ...style
3832
- },
3833
- children: /* @__PURE__ */ jsxDEV16(IconComponent, {
3834
- size: ICON_SIZE_PX[size],
3835
- strokeWidth: 1.5
3836
- }, undefined, false, undefined, this)
3837
- }, undefined, false, undefined, this),
3838
- anchor != null && hasTooltip && /* @__PURE__ */ jsxDEV16(Tooltip, {
3839
- anchor,
3840
- config: tooltip
3841
- }, undefined, false, undefined, this)
3842
- ]
3843
- }, undefined, true, undefined, this);
3844
- }
4220
+ // src/devtools/browser/components/action_list/ActionInputAndOutputChip.tsx
4221
+ import { Box, CircleX as CircleX2, Sprout, Variable } from "lucide-react";
3845
4222
 
3846
- // src/devtools/browser/components/action_list/ActionEntryRow.tsx
3847
- import { jsxDEV as jsxDEV17, Fragment as Fragment8 } from "react/jsx-dev-runtime";
3848
- function getLatestChipColor(status) {
3849
- if (status === "failed")
3850
- return "failed" /* failed */;
3851
- if (status === "action-error")
3852
- return "action_error" /* action_error */;
3853
- if (status === "aborted")
3854
- return "aborted" /* aborted */;
3855
- return "success" /* success */;
3856
- }
4223
+ // src/devtools/browser/components/action_list/IoTooltipContent.tsx
4224
+ import { jsxDEV as jsxDEV17, Fragment as Fragment7 } from "react/jsx-dev-runtime";
3857
4225
  var JSON_TOKEN_RE2 = /("(?:\\.|[^"\\])*")(\s*:)?|(-?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?)|(\btrue\b|\bfalse\b|\bnull\b|\bundefined\b)|([{}[\],])/g;
3858
4226
  function renderColoredJson2(text) {
3859
4227
  const nodes = [];
@@ -3925,6 +4293,84 @@ function IoTooltipContent({ value }) {
3925
4293
  children: renderColoredJson2(text)
3926
4294
  }, undefined, false, undefined, this);
3927
4295
  }
4296
+
4297
+ // src/devtools/browser/components/action_list/ActionInputAndOutputChip.tsx
4298
+ import { jsxDEV as jsxDEV18 } from "react/jsx-dev-runtime";
4299
+ var ActionInputAndOutputChip = ({
4300
+ entry,
4301
+ breakReasons,
4302
+ subtle,
4303
+ size
4304
+ }) => {
4305
+ const firstHop = entry.meta.routing[0];
4306
+ const localEnvId = firstHop != null ? firstHop.runtime.envId : null;
4307
+ const externalLabel = firstHop != null ? getExternalLabel(firstHop) : null;
4308
+ const firstHopIsLocal = firstHop != null && firstHop.handlerType === "local";
4309
+ const isLocal = localEnvId != null && (firstHopIsLocal || externalLabel == null);
4310
+ const color = isLocal ? "handler_local" /* handler_local */ : "handler_external" /* handler_external */;
4311
+ const isNewInput = breakReasons.includes("new_input" /* new_input */);
4312
+ const isNewOutput = breakReasons.includes("new_output" /* new_output */);
4313
+ const hasError = entry.error != null || entry.abortReason != null;
4314
+ return /* @__PURE__ */ jsxDEV18(Chip, {
4315
+ color,
4316
+ size,
4317
+ subtle,
4318
+ children: /* @__PURE__ */ jsxDEV18("div", {
4319
+ style: { display: "flex", alignItems: "center", gap: "0.4em" },
4320
+ children: [
4321
+ /* @__PURE__ */ jsxDEV18(Icon, {
4322
+ icon: isNewInput ? [Sprout, Variable] : Variable,
4323
+ color,
4324
+ subtle: subtle || entry.input === undefined,
4325
+ tooltip: {
4326
+ content: entry.input !== undefined ? /* @__PURE__ */ jsxDEV18(IoTooltipContent, {
4327
+ value: entry.input
4328
+ }, undefined, false, undefined, this) : /* @__PURE__ */ jsxDEV18("span", {
4329
+ style: { color: DEVTOOL_COLOR_TEXT_MUTED, fontSize: "10px" },
4330
+ children: "No input required or given"
4331
+ }, undefined, false, undefined, this),
4332
+ title: isNewInput ? "New Input" : "Input"
4333
+ }
4334
+ }, undefined, false, undefined, this),
4335
+ isLocal ? localEnvId : externalLabel,
4336
+ entry.status === "success" && entry.output !== undefined && /* @__PURE__ */ jsxDEV18(Icon, {
4337
+ icon: isNewOutput ? [Sprout, Box] : Box,
4338
+ color: !hasError ? color : "default" /* default */,
4339
+ tooltip: {
4340
+ content: /* @__PURE__ */ jsxDEV18(IoTooltipContent, {
4341
+ value: entry.output
4342
+ }, undefined, false, undefined, this),
4343
+ title: isNewOutput ? "New Output" : "Output"
4344
+ }
4345
+ }, undefined, false, undefined, this),
4346
+ (entry.error != null || entry.abortReason != null) && /* @__PURE__ */ jsxDEV18(Icon, {
4347
+ icon: CircleX2,
4348
+ color: entry.status === "aborted" ? "aborted" /* aborted */ : "error" /* error */,
4349
+ tooltip: {
4350
+ content: /* @__PURE__ */ jsxDEV18(ActionErrorDisplay, {
4351
+ entry,
4352
+ compact: true
4353
+ }, undefined, false, undefined, this),
4354
+ title: entry.status === "aborted" ? "Aborted" : "Error",
4355
+ maxWidth: 340
4356
+ }
4357
+ }, undefined, false, undefined, this)
4358
+ ]
4359
+ }, undefined, true, undefined, this)
4360
+ }, undefined, false, undefined, this);
4361
+ };
4362
+
4363
+ // src/devtools/browser/components/action_list/ActionEntryRow.tsx
4364
+ import { jsxDEV as jsxDEV19, Fragment as Fragment9 } from "react/jsx-dev-runtime";
4365
+ function getLatestChipColor(status) {
4366
+ if (status === "failed")
4367
+ return "failed" /* failed */;
4368
+ if (status === "action-error")
4369
+ return "action_error" /* action_error */;
4370
+ if (status === "aborted")
4371
+ return "aborted" /* aborted */;
4372
+ return "success" /* success */;
4373
+ }
3928
4374
  function GroupDotTooltip({
3929
4375
  entry,
3930
4376
  index,
@@ -3937,14 +4383,14 @@ function GroupDotTooltip({
3937
4383
  const deltaMs = refTime - entry.startTime;
3938
4384
  const relStr = index === 0 ? "latest run" : `−${formatRelativeAge(deltaMs)} from latest`;
3939
4385
  const durationStr = entry.endTime != null ? `${entry.endTime - entry.startTime}ms` : "running…";
3940
- return /* @__PURE__ */ jsxDEV17(Tooltip, {
4386
+ return /* @__PURE__ */ jsxDEV19(Tooltip, {
3941
4387
  anchor,
3942
4388
  config: {
3943
4389
  align: "center",
3944
4390
  maxWidth: 240,
3945
- content: /* @__PURE__ */ jsxDEV17(Fragment8, {
4391
+ content: /* @__PURE__ */ jsxDEV19(Fragment9, {
3946
4392
  children: [
3947
- /* @__PURE__ */ jsxDEV17("div", {
4393
+ /* @__PURE__ */ jsxDEV19("div", {
3948
4394
  style: { color: dotColor, marginBottom: "1px" },
3949
4395
  children: [
3950
4396
  symbol,
@@ -3954,15 +4400,15 @@ function GroupDotTooltip({
3954
4400
  total
3955
4401
  ]
3956
4402
  }, undefined, true, undefined, this),
3957
- /* @__PURE__ */ jsxDEV17("div", {
4403
+ /* @__PURE__ */ jsxDEV19("div", {
3958
4404
  style: { color: DEVTOOL_COLOR_TEXT_SECONDARY },
3959
4405
  children: formatTimestamp(entry.startTime)
3960
4406
  }, undefined, false, undefined, this),
3961
- /* @__PURE__ */ jsxDEV17("div", {
4407
+ /* @__PURE__ */ jsxDEV19("div", {
3962
4408
  style: { color: DEVTOOL_COLOR_TEXT_MUTED },
3963
4409
  children: durationStr
3964
4410
  }, undefined, false, undefined, this),
3965
- index > 0 && /* @__PURE__ */ jsxDEV17("div", {
4411
+ index > 0 && /* @__PURE__ */ jsxDEV19("div", {
3966
4412
  style: {
3967
4413
  color: DEVTOOL_COLOR_TEXT_MUTED,
3968
4414
  marginTop: "3px",
@@ -3987,9 +4433,9 @@ function GroupDot({
3987
4433
  const [anchor, setAnchor] = useState8(null);
3988
4434
  const dotColor = STATUS_COLOR[entry.status];
3989
4435
  const hovered = anchor != null;
3990
- return /* @__PURE__ */ jsxDEV17(Fragment8, {
4436
+ return /* @__PURE__ */ jsxDEV19(Fragment9, {
3991
4437
  children: [
3992
- /* @__PURE__ */ jsxDEV17("button", {
4438
+ /* @__PURE__ */ jsxDEV19("button", {
3993
4439
  "data-cuid": entry.cuid,
3994
4440
  onClick: (e) => {
3995
4441
  e.stopPropagation();
@@ -4011,7 +4457,7 @@ function GroupDot({
4011
4457
  transition: "transform 0.1s ease, opacity 0.1s ease, border-color 0.1s ease"
4012
4458
  }
4013
4459
  }, undefined, false, undefined, this),
4014
- hovered && anchor != null && /* @__PURE__ */ jsxDEV17(GroupDotTooltip, {
4460
+ hovered && anchor != null && /* @__PURE__ */ jsxDEV19(GroupDotTooltip, {
4015
4461
  entry,
4016
4462
  index,
4017
4463
  total,
@@ -4034,12 +4480,10 @@ function ActionEntryRow({
4034
4480
  selectedGroupCuid,
4035
4481
  onSelectGroupEntry
4036
4482
  }) {
4037
- const statusSemantic = STATUS_THING[entry.status];
4038
- const statusIcon = STATUS_ICON[entry.status];
4039
4483
  const timestamp = formatTimestamp(entry.startTime);
4040
4484
  const hasGroup = groupEntries != null && groupEntries.length > 1;
4041
- const hasBottomContent = childEntries != null && childEntries.length > 0 || (breakReasons?.some((r) => r !== "new input" && r !== "new output") ?? false) || entry.error != null || entry.abortReason != null;
4042
- return /* @__PURE__ */ jsxDEV17("div", {
4485
+ const hasBottomContent = childEntries != null && childEntries.length > 0 || (breakReasons?.some((r) => r !== "new_input" /* new_input */ && r !== "new_output" /* new_output */) ?? false) || entry.error != null || entry.abortReason != null;
4486
+ return /* @__PURE__ */ jsxDEV19("div", {
4043
4487
  "data-cuid": entry.cuid,
4044
4488
  onClick,
4045
4489
  style: {
@@ -4047,7 +4491,7 @@ function ActionEntryRow({
4047
4491
  display: "flex",
4048
4492
  flexDirection: "column",
4049
4493
  gap: "5px",
4050
- padding: "10px 12px",
4494
+ padding: "0.5em 0.6em",
4051
4495
  cursor: "pointer",
4052
4496
  background: isSelected ? DEVTOOL_LIST_HEADER_SELECTED_BACKGROUND : "transparent",
4053
4497
  border: `1px solid ${DEVTOOL_PANEL_BORDER}`,
@@ -4056,7 +4500,7 @@ function ActionEntryRow({
4056
4500
  margin: "2px 4px"
4057
4501
  },
4058
4502
  children: [
4059
- /* @__PURE__ */ jsxDEV17("div", {
4503
+ /* @__PURE__ */ jsxDEV19("div", {
4060
4504
  style: {
4061
4505
  position: "absolute",
4062
4506
  left: "2em",
@@ -4068,23 +4512,24 @@ function ActionEntryRow({
4068
4512
  zIndex: 0
4069
4513
  }
4070
4514
  }, undefined, false, undefined, this),
4071
- /* @__PURE__ */ jsxDEV17("div", {
4515
+ /* @__PURE__ */ jsxDEV19("div", {
4072
4516
  style: { display: "flex", alignItems: "center", gap: "8px" },
4073
4517
  children: [
4074
- /* @__PURE__ */ jsxDEV17("div", {
4518
+ /* @__PURE__ */ jsxDEV19("div", {
4075
4519
  style: {
4076
4520
  position: "relative",
4077
4521
  zIndex: 1,
4078
4522
  flexShrink: 0,
4079
- minWidth: "4em",
4523
+ minWidth: "3.4em",
4080
4524
  display: "flex",
4081
4525
  alignItems: "center",
4082
4526
  justifyContent: "flex-start"
4083
4527
  },
4084
- children: isLatest ? /* @__PURE__ */ jsxDEV17(Chip, {
4528
+ children: isLatest ? /* @__PURE__ */ jsxDEV19(Chip, {
4529
+ size: "sm" /* sm */,
4085
4530
  color: getLatestChipColor(entry.status),
4086
4531
  children: "latest"
4087
- }, undefined, false, undefined, this) : /* @__PURE__ */ jsxDEV17(Chip, {
4532
+ }, undefined, false, undefined, this) : /* @__PURE__ */ jsxDEV19(Chip, {
4088
4533
  size: "sm" /* sm */,
4089
4534
  color: getLatestChipColor(entry.status),
4090
4535
  children: [
@@ -4093,13 +4538,14 @@ function ActionEntryRow({
4093
4538
  ]
4094
4539
  }, undefined, true, undefined, this)
4095
4540
  }, undefined, false, undefined, this),
4096
- /* @__PURE__ */ jsxDEV17("div", {
4541
+ /* @__PURE__ */ jsxDEV19("div", {
4097
4542
  style: { flex: 1, minWidth: 0, display: "flex", alignItems: "center", gap: "0.5em" },
4098
4543
  children: [
4099
- /* @__PURE__ */ jsxDEV17("span", {
4544
+ /* @__PURE__ */ jsxDEV19("span", {
4100
4545
  style: {
4101
4546
  color: DEVTOOL_COLOR_TEXT_SECONDARY,
4102
- fontSize: "1.1em",
4547
+ fontSize: "1em",
4548
+ fontWeight: 400,
4103
4549
  fontFamily: "ui-monospace, 'Cascadia Code', 'Source Code Pro', monospace",
4104
4550
  overflow: "hidden",
4105
4551
  textOverflow: "ellipsis",
@@ -4109,51 +4555,14 @@ function ActionEntryRow({
4109
4555
  },
4110
4556
  children: entry.actionId
4111
4557
  }, undefined, false, undefined, this),
4112
- /* @__PURE__ */ jsxDEV17(DomainChip, {
4113
- domain: entry.domain,
4114
- allDomains: entry.allDomains
4115
- }, undefined, false, undefined, this),
4116
- /* @__PURE__ */ jsxDEV17(Icon, {
4117
- icon: Variable,
4118
- color: entry.input !== undefined ? "io_input" /* io_input */ : "default" /* default */,
4119
- subtle: entry.input === undefined,
4120
- tooltip: {
4121
- content: entry.input !== undefined ? /* @__PURE__ */ jsxDEV17(IoTooltipContent, {
4122
- value: entry.input
4123
- }, undefined, false, undefined, this) : /* @__PURE__ */ jsxDEV17("span", {
4124
- style: { color: DEVTOOL_COLOR_TEXT_MUTED, fontSize: "10px" },
4125
- children: "No input required or given"
4126
- }, undefined, false, undefined, this),
4127
- title: "Input"
4128
- }
4129
- }, undefined, false, undefined, this),
4130
- /* @__PURE__ */ jsxDEV17(HandlerChips, {
4131
- entry,
4132
- size: "sm" /* sm */
4133
- }, undefined, false, undefined, this),
4134
- entry.status === "success" && entry.output !== undefined && /* @__PURE__ */ jsxDEV17(Icon, {
4135
- icon: Box,
4136
- color: "io_output" /* io_output */,
4137
- tooltip: { content: /* @__PURE__ */ jsxDEV17(IoTooltipContent, {
4138
- value: entry.output
4139
- }, undefined, false, undefined, this), title: "Output" }
4558
+ /* @__PURE__ */ jsxDEV19(ActionInputAndOutputChip, {
4559
+ breakReasons,
4560
+ entry
4140
4561
  }, undefined, false, undefined, this),
4141
- (entry.error != null || entry.abortReason != null) && /* @__PURE__ */ jsxDEV17(Icon, {
4142
- icon: CircleX2,
4143
- color: entry.status === "aborted" ? "aborted" /* aborted */ : "error" /* error */,
4144
- tooltip: {
4145
- content: /* @__PURE__ */ jsxDEV17(ActionErrorDisplay, {
4146
- entry,
4147
- compact: true
4148
- }, undefined, false, undefined, this),
4149
- title: entry.status === "aborted" ? "Aborted" : "Error",
4150
- maxWidth: 340
4151
- }
4152
- }, undefined, false, undefined, this),
4153
- /* @__PURE__ */ jsxDEV17("div", {
4562
+ /* @__PURE__ */ jsxDEV19("div", {
4154
4563
  style: { flex: 1 }
4155
4564
  }, undefined, false, undefined, this),
4156
- /* @__PURE__ */ jsxDEV17("span", {
4565
+ /* @__PURE__ */ jsxDEV19("span", {
4157
4566
  style: {
4158
4567
  color: DEVTOOL_COLOR_SEMANTIC_METADATA,
4159
4568
  fontSize: "10px",
@@ -4163,9 +4572,9 @@ function ActionEntryRow({
4163
4572
  },
4164
4573
  children: timestamp
4165
4574
  }, undefined, false, undefined, this),
4166
- /* @__PURE__ */ jsxDEV17("span", {
4575
+ /* @__PURE__ */ jsxDEV19("span", {
4167
4576
  style: { color: DEVTOOL_COLOR_SEMANTIC_WARNING, fontSize: "11px", flexShrink: 0 },
4168
- children: /* @__PURE__ */ jsxDEV17(DurationDisplay, {
4577
+ children: /* @__PURE__ */ jsxDEV19(DurationDisplay, {
4169
4578
  entry
4170
4579
  }, undefined, false, undefined, this)
4171
4580
  }, undefined, false, undefined, this)
@@ -4173,7 +4582,7 @@ function ActionEntryRow({
4173
4582
  }, undefined, true, undefined, this)
4174
4583
  ]
4175
4584
  }, undefined, true, undefined, this),
4176
- hasBottomContent && /* @__PURE__ */ jsxDEV17("div", {
4585
+ hasBottomContent && /* @__PURE__ */ jsxDEV19("div", {
4177
4586
  style: {
4178
4587
  display: "flex",
4179
4588
  flexWrap: "wrap",
@@ -4182,33 +4591,35 @@ function ActionEntryRow({
4182
4591
  paddingLeft: "4.5em"
4183
4592
  },
4184
4593
  children: [
4185
- childEntries?.map((child) => /* @__PURE__ */ jsxDEV17(Fragment7, {
4594
+ childEntries?.map((child) => /* @__PURE__ */ jsxDEV19(Fragment8, {
4186
4595
  children: [
4187
- /* @__PURE__ */ jsxDEV17(Icon, {
4188
- icon: Variable,
4596
+ /* @__PURE__ */ jsxDEV19(Icon, {
4597
+ size: "sm" /* sm */,
4598
+ icon: Variable2,
4189
4599
  color: "io_input" /* io_input */,
4190
4600
  subtle: true,
4191
4601
  tooltip: {
4192
- content: child.input !== undefined ? /* @__PURE__ */ jsxDEV17(IoTooltipContent, {
4602
+ content: child.input !== undefined ? /* @__PURE__ */ jsxDEV19(IoTooltipContent, {
4193
4603
  value: child.input
4194
- }, undefined, false, undefined, this) : /* @__PURE__ */ jsxDEV17("span", {
4604
+ }, undefined, false, undefined, this) : /* @__PURE__ */ jsxDEV19("span", {
4195
4605
  style: { color: DEVTOOL_COLOR_TEXT_MUTED, fontSize: "10px" },
4196
4606
  children: "No input required or given"
4197
4607
  }, undefined, false, undefined, this),
4198
4608
  title: `Input · ${child.actionId}`
4199
4609
  }
4200
4610
  }, undefined, false, undefined, this),
4201
- /* @__PURE__ */ jsxDEV17(HandlerChips, {
4611
+ /* @__PURE__ */ jsxDEV19(HandlerChips, {
4202
4612
  entry: child,
4203
4613
  size: "sm" /* sm */,
4204
4614
  subtle: true
4205
4615
  }, undefined, false, undefined, this),
4206
- child.status === "success" && child.output !== undefined && /* @__PURE__ */ jsxDEV17(Icon, {
4207
- icon: Box,
4616
+ child.status === "success" && child.output !== undefined && /* @__PURE__ */ jsxDEV19(Icon, {
4617
+ size: "sm" /* sm */,
4618
+ icon: Box2,
4208
4619
  color: "io_output" /* io_output */,
4209
4620
  subtle: true,
4210
4621
  tooltip: {
4211
- content: /* @__PURE__ */ jsxDEV17(IoTooltipContent, {
4622
+ content: /* @__PURE__ */ jsxDEV19(IoTooltipContent, {
4212
4623
  value: child.output
4213
4624
  }, undefined, false, undefined, this),
4214
4625
  title: `Output · ${child.actionId}`
@@ -4216,17 +4627,17 @@ function ActionEntryRow({
4216
4627
  }, undefined, false, undefined, this)
4217
4628
  ]
4218
4629
  }, child.actionId, true, undefined, this)),
4219
- breakReasons?.filter((r) => r !== "new input" && r !== "new output").map((reason) => /* @__PURE__ */ jsxDEV17(Chip, {
4630
+ breakReasons?.filter((r) => r !== "new_input" /* new_input */ && r !== "new_output" /* new_output */).map((reason) => /* @__PURE__ */ jsxDEV19(Chip, {
4220
4631
  color: "default" /* default */,
4221
4632
  subtle: true,
4222
4633
  children: reason
4223
4634
  }, reason, false, undefined, this)),
4224
- (childEntries?.length ?? 0) > 0 && (entry.error != null || entry.abortReason != null) && /* @__PURE__ */ jsxDEV17(Icon, {
4225
- icon: CircleX2,
4635
+ (childEntries?.length ?? 0) > 0 && (entry.error != null || entry.abortReason != null) && /* @__PURE__ */ jsxDEV19(Icon, {
4636
+ icon: CircleX3,
4226
4637
  color: entry.status === "aborted" ? "aborted" /* aborted */ : "error" /* error */,
4227
4638
  subtle: true,
4228
4639
  tooltip: {
4229
- content: /* @__PURE__ */ jsxDEV17(ActionErrorDisplay, {
4640
+ content: /* @__PURE__ */ jsxDEV19(ActionErrorDisplay, {
4230
4641
  entry,
4231
4642
  compact: true
4232
4643
  }, undefined, false, undefined, this),
@@ -4236,7 +4647,7 @@ function ActionEntryRow({
4236
4647
  }, undefined, false, undefined, this)
4237
4648
  ]
4238
4649
  }, undefined, true, undefined, this),
4239
- hasGroup && /* @__PURE__ */ jsxDEV17("div", {
4650
+ hasGroup && /* @__PURE__ */ jsxDEV19("div", {
4240
4651
  style: {
4241
4652
  display: "flex",
4242
4653
  flexWrap: "wrap",
@@ -4245,7 +4656,7 @@ function ActionEntryRow({
4245
4656
  paddingLeft: "4.6em",
4246
4657
  paddingBottom: "2px"
4247
4658
  },
4248
- children: groupEntries.map((e, i) => /* @__PURE__ */ jsxDEV17(GroupDot, {
4659
+ children: groupEntries.map((e, i) => /* @__PURE__ */ jsxDEV19(GroupDot, {
4249
4660
  entry: e,
4250
4661
  index: i,
4251
4662
  total: groupEntries.length,
@@ -4258,8 +4669,124 @@ function ActionEntryRow({
4258
4669
  }, undefined, true, undefined, this);
4259
4670
  }
4260
4671
 
4672
+ // src/devtools/browser/components/action_list/ActionList.tsx
4673
+ import { jsxDEV as jsxDEV20 } from "react/jsx-dev-runtime";
4674
+ function getBreakReasons(current, previous) {
4675
+ const reasons = [];
4676
+ const inputChanged = current.inputHash != null && previous.inputHash != null ? current.inputHash !== previous.inputHash : safeStringify(current.input, 0) !== safeStringify(previous.input, 0);
4677
+ if (inputChanged)
4678
+ reasons.push("new_input" /* new_input */);
4679
+ const outputChanged = current.outputHash != null && previous.outputHash != null && current.outputHash !== previous.outputHash;
4680
+ if (outputChanged)
4681
+ reasons.push("new_output" /* new_output */);
4682
+ return reasons;
4683
+ }
4684
+ function getGroupChildEntries(group, childEntriesMap) {
4685
+ const seen = new Set;
4686
+ const result = [];
4687
+ for (const e of [group.representative, ...group.rest]) {
4688
+ for (const child of childEntriesMap.get(e.cuid) ?? []) {
4689
+ if (!seen.has(child.actionId)) {
4690
+ seen.add(child.actionId);
4691
+ result.push(child);
4692
+ }
4693
+ }
4694
+ }
4695
+ return result.length > 0 ? result.sort((a, b) => a.startTime - b.startTime) : undefined;
4696
+ }
4697
+ function getFlatItemKey(item) {
4698
+ const oldestCuid = item.group.rest[item.group.rest.length - 1]?.cuid ?? item.group.representative.cuid;
4699
+ return `g:${oldestCuid}`;
4700
+ }
4701
+ function ActionList({
4702
+ groups,
4703
+ selectedCuid,
4704
+ onGroupClick,
4705
+ onSubClick,
4706
+ childEntriesMap,
4707
+ style
4708
+ }) {
4709
+ const containerRef = useRef2(null);
4710
+ const latestTime = groups[0]?.representative.startTime;
4711
+ const flatItems = useMemo2(() => {
4712
+ return groups.map((group, gi) => {
4713
+ const prevGroup = groups[gi + 1];
4714
+ let breakReasons = [];
4715
+ if (prevGroup != null && prevGroup.representative.actionId === group.representative.actionId && prevGroup.representative.domain === group.representative.domain) {
4716
+ const reasons = getBreakReasons(group.representative, prevGroup.representative);
4717
+ if (reasons.length > 0)
4718
+ breakReasons = reasons;
4719
+ }
4720
+ return { group, groupIndex: gi, breakReasons };
4721
+ });
4722
+ }, [groups]);
4723
+ const prevSelectedRef = useRef2(selectedCuid);
4724
+ useEffect3(() => {
4725
+ if (selectedCuid === prevSelectedRef.current)
4726
+ return;
4727
+ prevSelectedRef.current = selectedCuid;
4728
+ if (selectedCuid == null)
4729
+ return;
4730
+ let repCuid = selectedCuid;
4731
+ for (const item of flatItems) {
4732
+ if (item.group.rest.some((e) => e.cuid === selectedCuid)) {
4733
+ repCuid = item.group.representative.cuid;
4734
+ break;
4735
+ }
4736
+ }
4737
+ containerRef.current?.querySelector(`[data-cuid="${repCuid}"]`)?.scrollIntoView({ block: "nearest" });
4738
+ }, [selectedCuid, flatItems]);
4739
+ if (groups.length === 0) {
4740
+ return /* @__PURE__ */ jsxDEV20("div", {
4741
+ style,
4742
+ children: /* @__PURE__ */ jsxDEV20("div", {
4743
+ style: { padding: "24px", textAlign: "center", color: DEVTOOL_COLOR_TEXT_MUTED },
4744
+ children: "No actions recorded yet"
4745
+ }, undefined, false, undefined, this)
4746
+ }, undefined, false, undefined, this);
4747
+ }
4748
+ return /* @__PURE__ */ jsxDEV20("div", {
4749
+ ref: containerRef,
4750
+ style,
4751
+ children: flatItems.map((item) => {
4752
+ const key = getFlatItemKey(item);
4753
+ const { group } = item;
4754
+ return /* @__PURE__ */ jsxDEV20("div", {
4755
+ style: {
4756
+ borderBottom: `1px solid ${DEVTOOL_LIST_GROUP_DIVIDER}`,
4757
+ position: "relative",
4758
+ overflow: "hidden"
4759
+ },
4760
+ children: [
4761
+ /* @__PURE__ */ jsxDEV20("div", {
4762
+ style: {
4763
+ position: "absolute",
4764
+ inset: 0,
4765
+ pointerEvents: "none",
4766
+ background: "linear-gradient(90deg, transparent 0%, rgba(148, 210, 255, 0.13) 50%, transparent 100%)",
4767
+ animation: "__nice-action-shine 0.65s ease-out forwards"
4768
+ }
4769
+ }, group.representative.cuid, false, undefined, this),
4770
+ /* @__PURE__ */ jsxDEV20(ActionEntryRow, {
4771
+ entry: group.representative,
4772
+ isSelected: selectedCuid === group.representative.cuid || group.rest.some((e) => e.cuid === selectedCuid),
4773
+ isLatest: item.groupIndex === 0,
4774
+ latestTime,
4775
+ childEntries: getGroupChildEntries(group, childEntriesMap),
4776
+ breakReasons: item.breakReasons,
4777
+ groupEntries: group.rest.length > 0 ? [group.representative, ...group.rest] : undefined,
4778
+ selectedGroupCuid: selectedCuid,
4779
+ onSelectGroupEntry: (cuid) => onSubClick(cuid, selectedCuid === cuid),
4780
+ onClick: () => onGroupClick(group)
4781
+ }, undefined, false, undefined, this)
4782
+ ]
4783
+ }, key, true, undefined, this);
4784
+ })
4785
+ }, undefined, false, undefined, this);
4786
+ }
4787
+
4261
4788
  // src/devtools/browser/components/PanelChrome.tsx
4262
- import { jsxDEV as jsxDEV18 } from "react/jsx-dev-runtime";
4789
+ import { jsxDEV as jsxDEV21 } from "react/jsx-dev-runtime";
4263
4790
  var DOCKED_SIZE_MIN = 140;
4264
4791
  var POSITION_GRID = [
4265
4792
  ["top-left", "dock-top", "top-right"],
@@ -4283,7 +4810,7 @@ function PanelHeader({
4283
4810
  onClose,
4284
4811
  onClear
4285
4812
  }) {
4286
- return /* @__PURE__ */ jsxDEV18("div", {
4813
+ return /* @__PURE__ */ jsxDEV21("div", {
4287
4814
  style: {
4288
4815
  display: "flex",
4289
4816
  alignItems: "center",
@@ -4294,18 +4821,18 @@ function PanelHeader({
4294
4821
  flexShrink: 0
4295
4822
  },
4296
4823
  children: [
4297
- /* @__PURE__ */ jsxDEV18("span", {
4824
+ /* @__PURE__ */ jsxDEV21("span", {
4298
4825
  style: { color: DEVTOOL_COLOR_SEMANTIC_SYSTEM, fontWeight: "bold", fontSize: "11px" },
4299
4826
  children: "⚡ nice-action devtools"
4300
4827
  }, undefined, false, undefined, this),
4301
- /* @__PURE__ */ jsxDEV18("div", {
4828
+ /* @__PURE__ */ jsxDEV21("div", {
4302
4829
  style: { display: "flex", gap: "10px", alignItems: "center" },
4303
4830
  children: [
4304
- /* @__PURE__ */ jsxDEV18(PositionPicker, {
4831
+ /* @__PURE__ */ jsxDEV21(PositionPicker, {
4305
4832
  position,
4306
4833
  onChange: onPositionChange
4307
4834
  }, undefined, false, undefined, this),
4308
- onClear != null && /* @__PURE__ */ jsxDEV18("button", {
4835
+ onClear != null && /* @__PURE__ */ jsxDEV21("button", {
4309
4836
  onClick: onClear,
4310
4837
  style: {
4311
4838
  background: "none",
@@ -4317,7 +4844,7 @@ function PanelHeader({
4317
4844
  },
4318
4845
  children: "clear"
4319
4846
  }, undefined, false, undefined, this),
4320
- /* @__PURE__ */ jsxDEV18("button", {
4847
+ /* @__PURE__ */ jsxDEV21("button", {
4321
4848
  onClick: onClose,
4322
4849
  style: {
4323
4850
  background: "none",
@@ -4339,18 +4866,18 @@ function PositionPicker({
4339
4866
  position,
4340
4867
  onChange
4341
4868
  }) {
4342
- return /* @__PURE__ */ jsxDEV18("div", {
4869
+ return /* @__PURE__ */ jsxDEV21("div", {
4343
4870
  title: "Move / dock panel",
4344
4871
  style: { display: "grid", gridTemplateColumns: "repeat(3, 9px)", gap: "2px", padding: "2px" },
4345
4872
  children: POSITION_GRID.flat().map((pos) => {
4346
4873
  if (pos == null)
4347
- return /* @__PURE__ */ jsxDEV18("div", {
4874
+ return /* @__PURE__ */ jsxDEV21("div", {
4348
4875
  style: { width: "9px", height: "9px" }
4349
4876
  }, "center-empty", false, undefined, this);
4350
4877
  const isDock = pos.startsWith("dock-");
4351
4878
  const isTopBottom = pos === "dock-top" || pos === "dock-bottom";
4352
4879
  const isActive = pos === position;
4353
- return /* @__PURE__ */ jsxDEV18("div", {
4880
+ return /* @__PURE__ */ jsxDEV21("div", {
4354
4881
  title: pos,
4355
4882
  onClick: () => onChange(pos),
4356
4883
  style: {
@@ -4361,7 +4888,7 @@ function PositionPicker({
4361
4888
  justifyContent: "center",
4362
4889
  cursor: "pointer"
4363
4890
  },
4364
- children: /* @__PURE__ */ jsxDEV18("div", {
4891
+ children: /* @__PURE__ */ jsxDEV21("div", {
4365
4892
  style: {
4366
4893
  width: isDock ? isTopBottom ? "9px" : "3px" : "7px",
4367
4894
  height: isDock ? isTopBottom ? "3px" : "9px" : "7px",
@@ -4397,7 +4924,7 @@ function ResizeHandle({
4397
4924
  window.addEventListener("mouseup", onUp);
4398
4925
  };
4399
4926
  const edgeStyle = dockSide === "bottom" ? { top: 0, left: 0, right: 0, height: "5px", cursor: "ns-resize" } : dockSide === "top" ? { bottom: 0, left: 0, right: 0, height: "5px", cursor: "ns-resize" } : dockSide === "right" ? { top: 0, bottom: 0, left: 0, width: "5px", cursor: "ew-resize" } : { top: 0, bottom: 0, right: 0, width: "5px", cursor: "ew-resize" };
4400
- return /* @__PURE__ */ jsxDEV18("div", {
4927
+ return /* @__PURE__ */ jsxDEV21("div", {
4401
4928
  onMouseDown,
4402
4929
  style: {
4403
4930
  position: "absolute",
@@ -4409,7 +4936,7 @@ function ResizeHandle({
4409
4936
  }
4410
4937
 
4411
4938
  // src/devtools/browser/NiceActionDevtools.tsx
4412
- import { jsxDEV as jsxDEV19, Fragment as Fragment9 } from "react/jsx-dev-runtime";
4939
+ import { jsxDEV as jsxDEV22, Fragment as Fragment10 } from "react/jsx-dev-runtime";
4413
4940
  if (typeof document !== "undefined" && !document.getElementById("__nice-action-devtools-styles")) {
4414
4941
  const style = document.createElement("style");
4415
4942
  style.id = "__nice-action-devtools-styles";
@@ -4502,7 +5029,7 @@ function groupEntries(entries) {
4502
5029
  }
4503
5030
  function NiceActionDevtools(props) {
4504
5031
  if (false) {}
4505
- return /* @__PURE__ */ jsxDEV19(NiceActionDevtools_Panel, {
5032
+ return /* @__PURE__ */ jsxDEV22(NiceActionDevtools_Panel, {
4506
5033
  ...props
4507
5034
  }, undefined, false, undefined, this);
4508
5035
  }
@@ -4514,13 +5041,13 @@ function NiceActionDevtools_Panel({
4514
5041
  const [prefs, setPrefsRaw] = useState9(() => readPrefs(defaultPosition, initialOpen));
4515
5042
  const [entries, setEntries] = useState9([]);
4516
5043
  const [selectedCuid, setSelectedCuid] = useState9(null);
4517
- useEffect3(() => core.subscribe(setEntries), [core]);
4518
- const groups = useMemo2(() => {
5044
+ useEffect4(() => core.subscribe(setEntries), [core]);
5045
+ const groups = useMemo3(() => {
4519
5046
  const byCuid = new Map(entries.map((e) => [e.cuid, e]));
4520
5047
  const roots = entries.filter((e) => e.status !== "running" && (e.parentCuid == null || !byCuid.has(e.parentCuid)));
4521
5048
  return groupEntries(roots);
4522
5049
  }, [entries]);
4523
- const childEntriesMap = useMemo2(() => {
5050
+ const childEntriesMap = useMemo3(() => {
4524
5051
  const map = new Map;
4525
5052
  for (const entry of entries) {
4526
5053
  if (entry.parentCuid == null)
@@ -4556,7 +5083,7 @@ function NiceActionDevtools_Panel({
4556
5083
  const dockedSize = isHorizDock ? dockedHeight : dockedWidth;
4557
5084
  const selectedEntry = selectedCuid != null ? entries.find((e) => e.cuid === selectedCuid) : null;
4558
5085
  const runningCount = entries.filter((e) => e.status === "running").length;
4559
- useEffect3(() => {
5086
+ useEffect4(() => {
4560
5087
  const sides = ["top", "bottom", "left", "right"];
4561
5088
  const clearAll = () => {
4562
5089
  sides.forEach((s) => {
@@ -4595,7 +5122,7 @@ function NiceActionDevtools_Panel({
4595
5122
  fontSize: "12px"
4596
5123
  };
4597
5124
  if (!isOpen) {
4598
- return /* @__PURE__ */ jsxDEV19("button", {
5125
+ return /* @__PURE__ */ jsxDEV22("button", {
4599
5126
  onClick: () => setPrefs({ isOpen: true }),
4600
5127
  style: {
4601
5128
  ...baseStyle,
@@ -4610,7 +5137,7 @@ function NiceActionDevtools_Panel({
4610
5137
  },
4611
5138
  children: [
4612
5139
  "⚡ actions",
4613
- runningCount > 0 && /* @__PURE__ */ jsxDEV19("span", {
5140
+ runningCount > 0 && /* @__PURE__ */ jsxDEV22("span", {
4614
5141
  style: {
4615
5142
  marginLeft: "6px",
4616
5143
  color: DEVTOOL_COLOR_SEMANTIC_SYSTEM,
@@ -4683,16 +5210,16 @@ function NiceActionDevtools_Panel({
4683
5210
  },
4684
5211
  childEntriesMap
4685
5212
  };
4686
- return /* @__PURE__ */ jsxDEV19("div", {
5213
+ return /* @__PURE__ */ jsxDEV22("div", {
4687
5214
  id: "__nice-action-devtools-panel",
4688
5215
  style: panelStyle,
4689
5216
  children: [
4690
- dockSide != null && /* @__PURE__ */ jsxDEV19(ResizeHandle, {
5217
+ dockSide != null && /* @__PURE__ */ jsxDEV22(ResizeHandle, {
4691
5218
  dockSide,
4692
5219
  dockedSize,
4693
5220
  onChange: (size) => setPrefs(isHorizDock ? { dockedHeight: size } : { dockedWidth: size })
4694
5221
  }, undefined, false, undefined, this),
4695
- /* @__PURE__ */ jsxDEV19(PanelHeader, {
5222
+ /* @__PURE__ */ jsxDEV22(PanelHeader, {
4696
5223
  position,
4697
5224
  onPositionChange: (p) => setPrefs({ position: p }),
4698
5225
  onClose: () => setPrefs({ isOpen: false }),
@@ -4701,17 +5228,17 @@ function NiceActionDevtools_Panel({
4701
5228
  setSelectedCuid(null);
4702
5229
  } : undefined
4703
5230
  }, undefined, false, undefined, this),
4704
- isHorizDock ? /* @__PURE__ */ jsxDEV19("div", {
5231
+ isHorizDock ? /* @__PURE__ */ jsxDEV22("div", {
4705
5232
  style: { flex: 1, display: "flex", overflow: "hidden" },
4706
5233
  children: [
4707
- /* @__PURE__ */ jsxDEV19("div", {
5234
+ /* @__PURE__ */ jsxDEV22("div", {
4708
5235
  style: { position: "relative", width: "340px", flexShrink: 0 },
4709
5236
  children: [
4710
- /* @__PURE__ */ jsxDEV19(ActionList, {
5237
+ /* @__PURE__ */ jsxDEV22(ActionList, {
4711
5238
  ...virtualListProps,
4712
5239
  style: { width: "100%", height: "100%", overflowY: "auto" }
4713
5240
  }, undefined, false, undefined, this),
4714
- /* @__PURE__ */ jsxDEV19("div", {
5241
+ /* @__PURE__ */ jsxDEV22("div", {
4715
5242
  style: {
4716
5243
  position: "absolute",
4717
5244
  top: 0,
@@ -4724,7 +5251,7 @@ function NiceActionDevtools_Panel({
4724
5251
  }, undefined, false, undefined, this)
4725
5252
  ]
4726
5253
  }, undefined, true, undefined, this),
4727
- /* @__PURE__ */ jsxDEV19("div", {
5254
+ /* @__PURE__ */ jsxDEV22("div", {
4728
5255
  style: {
4729
5256
  flex: 1,
4730
5257
  display: "flex",
@@ -4733,12 +5260,12 @@ function NiceActionDevtools_Panel({
4733
5260
  borderLeft: `1px solid ${DEVTOOL_PANEL_DIVIDER_BORDER}`,
4734
5261
  boxShadow: "inset 18px 0 36px -14px rgba(0,0,0,0.8)"
4735
5262
  },
4736
- children: selectedEntry != null ? /* @__PURE__ */ jsxDEV19(ActionDetailPanel, {
5263
+ children: selectedEntry != null ? /* @__PURE__ */ jsxDEV22(ActionDetailPanel, {
4737
5264
  entry: selectedEntry,
4738
5265
  parent: selectedEntryParent,
4739
5266
  childEntries: selectedEntryChildren,
4740
5267
  onSelectEntry: (cuid) => setSelectedCuid(cuid)
4741
- }, selectedEntry.cuid, false, undefined, this) : /* @__PURE__ */ jsxDEV19("div", {
5268
+ }, selectedEntry.cuid, false, undefined, this) : /* @__PURE__ */ jsxDEV22("div", {
4742
5269
  style: {
4743
5270
  padding: "24px",
4744
5271
  textAlign: "center",
@@ -4749,16 +5276,16 @@ function NiceActionDevtools_Panel({
4749
5276
  }, undefined, false, undefined, this)
4750
5277
  }, undefined, false, undefined, this)
4751
5278
  ]
4752
- }, undefined, true, undefined, this) : /* @__PURE__ */ jsxDEV19(Fragment9, {
5279
+ }, undefined, true, undefined, this) : /* @__PURE__ */ jsxDEV22(Fragment10, {
4753
5280
  children: [
4754
- /* @__PURE__ */ jsxDEV19("div", {
5281
+ /* @__PURE__ */ jsxDEV22("div", {
4755
5282
  style: { position: "relative", flex: 1, minHeight: "80px" },
4756
5283
  children: [
4757
- /* @__PURE__ */ jsxDEV19(ActionList, {
5284
+ /* @__PURE__ */ jsxDEV22(ActionList, {
4758
5285
  ...virtualListProps,
4759
5286
  style: { overflowY: "auto", height: "100%" }
4760
5287
  }, undefined, false, undefined, this),
4761
- selectedEntry != null && /* @__PURE__ */ jsxDEV19("div", {
5288
+ selectedEntry != null && /* @__PURE__ */ jsxDEV22("div", {
4762
5289
  style: {
4763
5290
  position: "absolute",
4764
5291
  bottom: 0,
@@ -4771,7 +5298,7 @@ function NiceActionDevtools_Panel({
4771
5298
  }, undefined, false, undefined, this)
4772
5299
  ]
4773
5300
  }, undefined, true, undefined, this),
4774
- selectedEntry != null && /* @__PURE__ */ jsxDEV19("div", {
5301
+ selectedEntry != null && /* @__PURE__ */ jsxDEV22("div", {
4775
5302
  style: {
4776
5303
  flexShrink: 0,
4777
5304
  maxHeight: "55%",
@@ -4781,7 +5308,7 @@ function NiceActionDevtools_Panel({
4781
5308
  borderTop: `1px solid ${DEVTOOL_PANEL_DIVIDER_BORDER}`,
4782
5309
  boxShadow: "inset 0 18px 36px -14px rgba(0,0,0,0.8)"
4783
5310
  },
4784
- children: /* @__PURE__ */ jsxDEV19(ActionDetailPanel, {
5311
+ children: /* @__PURE__ */ jsxDEV22(ActionDetailPanel, {
4785
5312
  entry: selectedEntry,
4786
5313
  parent: selectedEntryParent,
4787
5314
  childEntries: selectedEntryChildren,
@@ -4793,119 +5320,6 @@ function NiceActionDevtools_Panel({
4793
5320
  ]
4794
5321
  }, undefined, true, undefined, this);
4795
5322
  }
4796
- function getBreakReasons(current, previous) {
4797
- const reasons = [];
4798
- const inputChanged = current.inputHash != null && previous.inputHash != null ? current.inputHash !== previous.inputHash : safeStringify(current.input, 0) !== safeStringify(previous.input, 0);
4799
- if (inputChanged)
4800
- reasons.push("new input");
4801
- const outputChanged = current.outputHash != null && previous.outputHash != null && current.outputHash !== previous.outputHash;
4802
- if (outputChanged)
4803
- reasons.push("new output");
4804
- return reasons;
4805
- }
4806
- function getGroupChildEntries(group, childEntriesMap) {
4807
- const seen = new Set;
4808
- const result = [];
4809
- for (const e of [group.representative, ...group.rest]) {
4810
- for (const child of childEntriesMap.get(e.cuid) ?? []) {
4811
- if (!seen.has(child.actionId)) {
4812
- seen.add(child.actionId);
4813
- result.push(child);
4814
- }
4815
- }
4816
- }
4817
- return result.length > 0 ? result.sort((a, b) => a.startTime - b.startTime) : undefined;
4818
- }
4819
- function getFlatItemKey(item) {
4820
- const oldestCuid = item.group.rest[item.group.rest.length - 1]?.cuid ?? item.group.representative.cuid;
4821
- return `g:${oldestCuid}`;
4822
- }
4823
- function ActionList({
4824
- groups,
4825
- selectedCuid,
4826
- onGroupClick,
4827
- onSubClick,
4828
- childEntriesMap,
4829
- style
4830
- }) {
4831
- const containerRef = useRef(null);
4832
- const latestTime = groups[0]?.representative.startTime;
4833
- const flatItems = useMemo2(() => {
4834
- return groups.map((group, gi) => {
4835
- const prevGroup = groups[gi + 1];
4836
- let breakReasons;
4837
- if (prevGroup != null && prevGroup.representative.actionId === group.representative.actionId && prevGroup.representative.domain === group.representative.domain) {
4838
- const reasons = getBreakReasons(group.representative, prevGroup.representative);
4839
- if (reasons.length > 0)
4840
- breakReasons = reasons;
4841
- }
4842
- return { group, groupIndex: gi, breakReasons };
4843
- });
4844
- }, [groups]);
4845
- const prevSelectedRef = useRef(selectedCuid);
4846
- useEffect3(() => {
4847
- if (selectedCuid === prevSelectedRef.current)
4848
- return;
4849
- prevSelectedRef.current = selectedCuid;
4850
- if (selectedCuid == null)
4851
- return;
4852
- let repCuid = selectedCuid;
4853
- for (const item of flatItems) {
4854
- if (item.group.rest.some((e) => e.cuid === selectedCuid)) {
4855
- repCuid = item.group.representative.cuid;
4856
- break;
4857
- }
4858
- }
4859
- containerRef.current?.querySelector(`[data-cuid="${repCuid}"]`)?.scrollIntoView({ block: "nearest" });
4860
- }, [selectedCuid, flatItems]);
4861
- if (groups.length === 0) {
4862
- return /* @__PURE__ */ jsxDEV19("div", {
4863
- style,
4864
- children: /* @__PURE__ */ jsxDEV19("div", {
4865
- style: { padding: "24px", textAlign: "center", color: DEVTOOL_COLOR_TEXT_MUTED },
4866
- children: "No actions recorded yet"
4867
- }, undefined, false, undefined, this)
4868
- }, undefined, false, undefined, this);
4869
- }
4870
- return /* @__PURE__ */ jsxDEV19("div", {
4871
- ref: containerRef,
4872
- style,
4873
- children: flatItems.map((item) => {
4874
- const key = getFlatItemKey(item);
4875
- const { group } = item;
4876
- return /* @__PURE__ */ jsxDEV19("div", {
4877
- style: {
4878
- borderBottom: `1px solid ${DEVTOOL_LIST_GROUP_DIVIDER}`,
4879
- position: "relative",
4880
- overflow: "hidden"
4881
- },
4882
- children: [
4883
- /* @__PURE__ */ jsxDEV19("div", {
4884
- style: {
4885
- position: "absolute",
4886
- inset: 0,
4887
- pointerEvents: "none",
4888
- background: "linear-gradient(90deg, transparent 0%, rgba(148, 210, 255, 0.13) 50%, transparent 100%)",
4889
- animation: "__nice-action-shine 0.65s ease-out forwards"
4890
- }
4891
- }, group.representative.cuid, false, undefined, this),
4892
- /* @__PURE__ */ jsxDEV19(ActionEntryRow, {
4893
- entry: group.representative,
4894
- isSelected: selectedCuid === group.representative.cuid || group.rest.some((e) => e.cuid === selectedCuid),
4895
- isLatest: item.groupIndex === 0,
4896
- latestTime,
4897
- childEntries: getGroupChildEntries(group, childEntriesMap),
4898
- breakReasons: item.breakReasons,
4899
- groupEntries: group.rest.length > 0 ? [group.representative, ...group.rest] : undefined,
4900
- selectedGroupCuid: selectedCuid,
4901
- onSelectGroupEntry: (cuid) => onSubClick(cuid, selectedCuid === cuid),
4902
- onClick: () => onGroupClick(group)
4903
- }, undefined, false, undefined, this)
4904
- ]
4905
- }, key, true, undefined, this);
4906
- })
4907
- }, undefined, false, undefined, this);
4908
- }
4909
5323
  export {
4910
5324
  NiceActionDevtools,
4911
5325
  ActionDevtoolsCore