@nice-code/action 0.6.3 → 0.8.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.
Files changed (41) hide show
  1. package/build/devtools/browser/index.js +590 -1246
  2. package/build/devtools/server/index.js +7 -1
  3. package/build/index.js +1257 -972
  4. package/build/types/ActionRuntime/ActionRuntime.d.ts +23 -1
  5. package/build/types/ActionRuntime/Handler/ExternalClient/Transport/Transport.types.d.ts +6 -0
  6. package/build/types/ActionRuntime/Handler/ExternalClient/Transport/WebSocket/WebSocketConnection.d.ts +2 -1
  7. package/build/types/ActionRuntime/Handler/ExternalClient/Transport/WebSocket/secureWsChannel.d.ts +63 -0
  8. package/build/types/ActionRuntime/Handler/Server/ActionServerHandler.d.ts +64 -1
  9. package/build/types/ActionRuntime/Handler/Server/WsConnectionStateStore.d.ts +61 -0
  10. package/build/types/ActionRuntime/Handler/Server/createActionFetchHandler.d.ts +40 -0
  11. package/build/types/ActionRuntime/Handler/Server/createSecureActionServer.d.ts +71 -0
  12. package/build/types/devtools/browser/NiceActionDevtools.d.ts +1 -1
  13. package/build/types/devtools/browser/components/ActionErrorDisplay.d.ts +1 -1
  14. package/build/types/devtools/browser/components/CallStackSection.d.ts +1 -1
  15. package/build/types/devtools/browser/components/ChildDispatchChips.d.ts +1 -1
  16. package/build/types/devtools/browser/components/Chip.d.ts +1 -1
  17. package/build/types/devtools/browser/components/DetailSection.d.ts +1 -1
  18. package/build/types/devtools/browser/components/DomainChip.d.ts +1 -1
  19. package/build/types/devtools/browser/components/HandlerChips.d.ts +1 -1
  20. package/build/types/devtools/browser/components/Icon.d.ts +1 -1
  21. package/build/types/devtools/browser/components/MetaSection.d.ts +1 -1
  22. package/build/types/devtools/browser/components/NiceErrorDisplay.d.ts +2 -2
  23. package/build/types/devtools/browser/components/OriginChip.d.ts +1 -1
  24. package/build/types/devtools/browser/components/RoutingSection.d.ts +1 -1
  25. package/build/types/devtools/browser/components/RunningTimer.d.ts +2 -2
  26. package/build/types/devtools/browser/components/SectionLabel.d.ts +1 -4
  27. package/build/types/devtools/browser/components/StackTraceSection.d.ts +1 -1
  28. package/build/types/devtools/browser/components/Tooltip.d.ts +1 -24
  29. package/build/types/devtools/browser/components/action_detail/ActionDetailPanel.d.ts +1 -1
  30. package/build/types/devtools/browser/components/action_list/ActionEntryRow.d.ts +1 -1
  31. package/build/types/devtools/browser/components/action_list/ActionInputAndOutputChip.d.ts +1 -1
  32. package/build/types/devtools/browser/components/action_list/ActionList.d.ts +1 -1
  33. package/build/types/devtools/browser/components/action_list/IoTooltipContent.d.ts +1 -4
  34. package/build/types/devtools/browser/components/utils.d.ts +1 -3
  35. package/build/types/devtools/core/ActionDevtools.types.d.ts +1 -1
  36. package/build/types/devtools/core/ActionDevtoolsCore.d.ts +4 -1
  37. package/build/types/devtools/core/devtools_colors.d.ts +1 -26
  38. package/build/types/index.d.ts +5 -1
  39. package/package.json +33 -29
  40. package/build/types/devtools/browser/components/PanelChrome.d.ts +0 -41
  41. package/build/types/devtools/browser/devtools_dock.d.ts +0 -54
@@ -1871,7 +1871,10 @@ function extractMeta(context) {
1871
1871
  class ActionDevtoolsCore {
1872
1872
  _entries = [];
1873
1873
  _listeners = new Set;
1874
- constructor(_options = {}) {}
1874
+ _maxEntries;
1875
+ constructor(options = {}) {
1876
+ this._maxEntries = options.maxEntries ?? 500;
1877
+ }
1875
1878
  attachToDomain(domain) {
1876
1879
  return domain.addActionListener((update) => {
1877
1880
  const { runningAction, type, time } = update;
@@ -1891,6 +1894,9 @@ class ActionDevtoolsCore {
1891
1894
  callSite: runningAction.callSite
1892
1895
  };
1893
1896
  this._entries = [entry, ...this._entries];
1897
+ if (this._entries.length > this._maxEntries) {
1898
+ this._entries.length = this._maxEntries;
1899
+ }
1894
1900
  this._notify();
1895
1901
  } else if (type === "progress" /* progress */) {
1896
1902
  this._updateEntry(runningAction.cuid, (e) => ({
@@ -1971,44 +1977,68 @@ class ActionDevtoolsCore {
1971
1977
  }
1972
1978
  }
1973
1979
  // src/devtools/browser/NiceActionDevtools.tsx
1974
- import { useEffect as useEffect4, useId, useMemo as useMemo3, useReducer, useState as useState12 } from "react";
1980
+ import {
1981
+ DevtoolsLauncher,
1982
+ FollowLatestToggles,
1983
+ getDevtoolsDockCoordinator,
1984
+ getDockSide,
1985
+ PanelHeader,
1986
+ ResizeHandle,
1987
+ SplitHandle
1988
+ } from "nice-devtools-shared";
1989
+ import { useEffect as useEffect3, useId, useMemo as useMemo3, useReducer, useState as useState10 } from "react";
1975
1990
 
1976
1991
  // src/devtools/core/devtools_colors.ts
1977
- var DEVTOOL_COLOR_SEMANTIC_ERROR = "#FF5C5C";
1978
- var DEVTOOL_COLOR_SEMANTIC_SUCCESS = "#A3E635";
1979
- var DEVTOOL_COLOR_SEMANTIC_SYSTEM = "#38BDF8";
1980
- var DEVTOOL_COLOR_SEMANTIC_WARNING = "#FB923C";
1981
- var DEVTOOL_COLOR_SEMANTIC_METADATA = "#A1A1AA";
1992
+ import {
1993
+ DEVTOOL_COLOR_SEMANTIC_ERROR,
1994
+ DEVTOOL_COLOR_SEMANTIC_METADATA,
1995
+ DEVTOOL_COLOR_SEMANTIC_SUCCESS,
1996
+ DEVTOOL_COLOR_SEMANTIC_SYSTEM,
1997
+ DEVTOOL_COLOR_SEMANTIC_WARNING,
1998
+ DEVTOOL_COLOR_TEXT_FAINT,
1999
+ DEVTOOL_COLOR_TEXT_MUTED,
2000
+ DEVTOOL_SECTION_BACKGROUND
2001
+ } from "nice-devtools-shared";
2002
+ import {
2003
+ DEVTOOL_COLOR_SEMANTIC_ERROR as DEVTOOL_COLOR_SEMANTIC_ERROR2,
2004
+ DEVTOOL_COLOR_SEMANTIC_METADATA as DEVTOOL_COLOR_SEMANTIC_METADATA2,
2005
+ DEVTOOL_COLOR_SEMANTIC_SUCCESS as DEVTOOL_COLOR_SEMANTIC_SUCCESS2,
2006
+ DEVTOOL_COLOR_SEMANTIC_SYSTEM as DEVTOOL_COLOR_SEMANTIC_SYSTEM2,
2007
+ DEVTOOL_COLOR_SEMANTIC_WARNING as DEVTOOL_COLOR_SEMANTIC_WARNING2,
2008
+ DEVTOOL_COLOR_TEXT_EMPHASIS,
2009
+ DEVTOOL_COLOR_TEXT_FAINT as DEVTOOL_COLOR_TEXT_FAINT2,
2010
+ DEVTOOL_COLOR_TEXT_MUTED as DEVTOOL_COLOR_TEXT_MUTED2,
2011
+ DEVTOOL_COLOR_TEXT_SECONDARY,
2012
+ DEVTOOL_DETAIL_BASE_BACKGROUND,
2013
+ DEVTOOL_DETAIL_HEADER_BACKGROUND,
2014
+ DEVTOOL_ERROR_BACKGROUND,
2015
+ DEVTOOL_JSON_KEY,
2016
+ DEVTOOL_JSON_KEYWORD,
2017
+ DEVTOOL_JSON_NUMBER,
2018
+ DEVTOOL_JSON_PUNCTUATION,
2019
+ DEVTOOL_JSON_STRING,
2020
+ DEVTOOL_LIST_BASE_BACKGROUND,
2021
+ DEVTOOL_LIST_SELECTED_BACKGROUND,
2022
+ DEVTOOL_PANEL_BORDER,
2023
+ DEVTOOL_PANEL_DIVIDER_BORDER,
2024
+ DEVTOOL_SECTION_BACKGROUND as DEVTOOL_SECTION_BACKGROUND2,
2025
+ DEVTOOL_SECTION_STRING_BACKGROUND,
2026
+ DEVTOOL_TOOLTIP_BACKGROUND,
2027
+ DEVTOOL_TOOLTIP_BORDER,
2028
+ DEVTOOL_TOOLTIP_TITLE_BACKGROUND,
2029
+ DEVTOOL_TOOLTIP_TITLE_BOTTOM_BORDER,
2030
+ MONO_FONT,
2031
+ SANS_FONT
2032
+ } from "nice-devtools-shared";
1982
2033
  var DEVTOOL_COLOR_HANDLER_LOCAL_TEXT = "#34bb89";
1983
2034
  var DEVTOOL_COLOR_HANDLER_LOCAL_BORDER = "#144427";
1984
2035
  var DEVTOOL_COLOR_HANDLER_EXTERNAL_TEXT = "#cfa12a";
1985
2036
  var DEVTOOL_COLOR_HANDLER_EXTERNAL_BORDER = "#723917";
1986
- var DEVTOOL_COLOR_TEXT_EMPHASIS = "#f1f5f9";
1987
- var DEVTOOL_COLOR_TEXT_SECONDARY = "#cbd5e1";
1988
- var DEVTOOL_COLOR_TEXT_MUTED = "#64748b";
1989
- var DEVTOOL_COLOR_TEXT_FAINT = "#334155";
1990
- var DEVTOOL_LIST_BASE_BACKGROUND = "#0f172a";
1991
2037
  var DEVTOOL_LIST_HEADER_SELECTED_BACKGROUND = "#1d2942";
1992
2038
  var DEVTOOL_LIST_GROUP_DIVIDER = "#101109";
1993
- var DEVTOOL_DETAIL_BASE_BACKGROUND = "#0d1729";
1994
- var DEVTOOL_DETAIL_HEADER_BACKGROUND = "#131f35";
1995
- var DEVTOOL_SECTION_BACKGROUND = "#1e293b";
1996
- var DEVTOOL_SECTION_STRING_BACKGROUND = "#0d131f";
1997
2039
  var DEVTOOL_STACK_TRACE_BACKGROUND = "#040a13";
1998
- var DEVTOOL_PANEL_BORDER = "#1e293b";
1999
- var DEVTOOL_PANEL_DIVIDER_BORDER = "#1d3352";
2000
- var DEVTOOL_ERROR_BACKGROUND = "#1e0a0a";
2001
2040
  var DEVTOOL_ERROR_BADGE_BACKGROUND = "#2d0f0f";
2002
- var DEVTOOL_TOOLTIP_BACKGROUND = "#0c1526";
2003
- var DEVTOOL_TOOLTIP_TITLE_BACKGROUND = "#101b2e";
2004
- var DEVTOOL_TOOLTIP_TITLE_BOTTOM_BORDER = "#211f5f";
2005
- var DEVTOOL_TOOLTIP_BORDER = "#312e81";
2006
2041
  var DEVTOOL_COLOR_CALL_STACK_DIVIDER = "#0a1120";
2007
- var DEVTOOL_JSON_KEY = "#a5b4fc";
2008
- var DEVTOOL_JSON_STRING = "#fbbf24";
2009
- var DEVTOOL_JSON_NUMBER = "#34d399";
2010
- var DEVTOOL_JSON_KEYWORD = "#a78bfa";
2011
- var DEVTOOL_JSON_PUNCTUATION = "#475569";
2012
2042
  var DEVTOOL_STACK_FRAME_USER_NUMBER = "#64748b";
2013
2043
  var DEVTOOL_STACK_FRAME_USER_FUNCTION = "#e2e8f0";
2014
2044
  var DEVTOOL_STACK_FRAME_USER_FOLDER = "#596b83";
@@ -2087,7 +2117,7 @@ var SEMANTIC_COLORS = {
2087
2117
  };
2088
2118
 
2089
2119
  // src/devtools/browser/components/action_detail/ActionDetailPanel.tsx
2090
- import { useMemo, useState as useState8 } from "react";
2120
+ import { useMemo, useState as useState7 } from "react";
2091
2121
 
2092
2122
  // src/devtools/browser/ui_util/size.ts
2093
2123
  function getSizeValue(size) {
@@ -2104,150 +2134,16 @@ function getSizeValue(size) {
2104
2134
  }
2105
2135
 
2106
2136
  // src/devtools/browser/components/DetailSection.tsx
2137
+ import { renderColoredJson, safeStringify } from "nice-devtools-shared";
2107
2138
  import { useState } from "react";
2108
2139
 
2109
2140
  // src/devtools/browser/components/SectionLabel.tsx
2110
- import { jsx } from "react/jsx-runtime";
2111
- function SectionLabel({
2112
- label,
2113
- color = DEVTOOL_COLOR_SEMANTIC_SYSTEM
2114
- }) {
2115
- return /* @__PURE__ */ jsx("div", {
2116
- style: {
2117
- color,
2118
- fontSize: "0.85em",
2119
- marginBottom: "3px",
2120
- textTransform: "uppercase",
2121
- letterSpacing: "0.05em",
2122
- fontWeight: 500,
2123
- textAlign: "left"
2124
- },
2125
- children: label
2126
- });
2127
- }
2128
-
2129
- // src/devtools/browser/components/utils.ts
2130
- import { Circle, CircleAlert, CircleCheck, CircleX, Loader2 } from "lucide-react";
2131
- var STATUS_COLOR = {
2132
- running: DEVTOOL_COLOR_SEMANTIC_SYSTEM,
2133
- success: DEVTOOL_COLOR_SEMANTIC_SUCCESS,
2134
- "action-error": DEVTOOL_COLOR_SEMANTIC_WARNING,
2135
- failed: DEVTOOL_COLOR_SEMANTIC_ERROR,
2136
- aborted: DEVTOOL_COLOR_SEMANTIC_METADATA
2137
- };
2138
- var STATUS_THING = {
2139
- running: "running_action" /* running_action */,
2140
- success: "success" /* success */,
2141
- "action-error": "action_error" /* action_error */,
2142
- failed: "failed" /* failed */,
2143
- aborted: "aborted" /* aborted */
2144
- };
2145
- var STATUS_SYMBOL = {
2146
- running: "●",
2147
- success: "✓",
2148
- "action-error": "!",
2149
- failed: "✗",
2150
- aborted: "○"
2151
- };
2152
- var STATUS_ICON = {
2153
- running: Loader2,
2154
- success: CircleCheck,
2155
- "action-error": CircleAlert,
2156
- failed: CircleX,
2157
- aborted: Circle
2158
- };
2159
- function getInboundOrigin(entry) {
2160
- const origin = entry.meta.originClient;
2161
- if (origin == null || origin.envId === "unknown" || origin.envId === "_unset_")
2162
- return null;
2163
- const local = entry.meta.routing[0]?.runtime;
2164
- if (local == null)
2165
- return null;
2166
- const sameRuntime = origin.envId === local.envId && (origin.perId ?? null) === (local.perId ?? null) && (origin.insId ?? null) === (local.insId ?? null);
2167
- return sameRuntime ? null : origin;
2168
- }
2169
- function safeStringify(value, indent = 2) {
2170
- if (value === undefined)
2171
- return "undefined";
2172
- if (value === null)
2173
- return "null";
2174
- try {
2175
- return JSON.stringify(value, null, indent);
2176
- } catch {
2177
- return String(value);
2178
- }
2179
- }
2180
- function formatRelativeAge(ms) {
2181
- if (ms < 1000)
2182
- return `${ms}ms`;
2183
- if (ms < 60000)
2184
- return `${(ms / 1000).toFixed(1)}s`;
2185
- return `${Math.floor(ms / 60000)}m`;
2186
- }
2187
- function formatDuration(entry) {
2188
- return entry.endTime != null ? `${entry.endTime - entry.startTime}ms` : null;
2189
- }
2190
- function formatTimestamp(startTime) {
2191
- return new Date(startTime).toLocaleTimeString([], {
2192
- hour: "2-digit",
2193
- minute: "2-digit",
2194
- second: "2-digit",
2195
- hour12: false
2196
- });
2197
- }
2141
+ import { SectionLabel } from "nice-devtools-shared";
2198
2142
 
2199
2143
  // src/devtools/browser/components/DetailSection.tsx
2200
- import { jsx as jsx2, jsxs } from "react/jsx-runtime";
2144
+ import { jsx, jsxs } from "react/jsx-runtime";
2201
2145
  var COMPACT_CHAR_LIMIT = 120;
2202
2146
  var MONO = "ui-monospace, 'Cascadia Code', 'Source Code Pro', monospace";
2203
- var JSON_TOKEN_RE = /("(?:\\.|[^"\\])*")(\s*:)?|(-?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?)|(\btrue\b|\bfalse\b|\bnull\b|\bundefined\b)|([{}[\],])/g;
2204
- function renderColoredJson(text) {
2205
- const nodes = [];
2206
- let last = 0;
2207
- let i = 0;
2208
- JSON_TOKEN_RE.lastIndex = 0;
2209
- for (let m = JSON_TOKEN_RE.exec(text);m !== null; m = JSON_TOKEN_RE.exec(text)) {
2210
- if (m.index > last)
2211
- nodes.push(text.slice(last, m.index));
2212
- const [, str, colon, num, kw, punct] = m;
2213
- if (str != null) {
2214
- if (colon != null) {
2215
- nodes.push(/* @__PURE__ */ jsx2("span", {
2216
- style: { color: DEVTOOL_JSON_KEY },
2217
- children: str
2218
- }, i++));
2219
- nodes.push(/* @__PURE__ */ jsx2("span", {
2220
- style: { color: DEVTOOL_JSON_PUNCTUATION },
2221
- children: colon
2222
- }, i++));
2223
- } else {
2224
- nodes.push(/* @__PURE__ */ jsx2("span", {
2225
- style: { color: DEVTOOL_JSON_STRING },
2226
- children: str
2227
- }, i++));
2228
- }
2229
- } else if (num != null) {
2230
- nodes.push(/* @__PURE__ */ jsx2("span", {
2231
- style: { color: DEVTOOL_JSON_NUMBER },
2232
- children: num
2233
- }, i++));
2234
- } else if (kw != null) {
2235
- nodes.push(/* @__PURE__ */ jsx2("span", {
2236
- style: { color: DEVTOOL_JSON_KEYWORD },
2237
- children: kw
2238
- }, i++));
2239
- } else if (punct != null) {
2240
- nodes.push(/* @__PURE__ */ jsx2("span", {
2241
- style: { color: DEVTOOL_JSON_PUNCTUATION },
2242
- children: punct
2243
- }, i++));
2244
- }
2245
- last = JSON_TOKEN_RE.lastIndex;
2246
- }
2247
- if (last < text.length)
2248
- nodes.push(text.slice(last));
2249
- return nodes;
2250
- }
2251
2147
  function tryParseJson(s) {
2252
2148
  try {
2253
2149
  return JSON.parse(s);
@@ -2258,7 +2154,7 @@ function tryParseJson(s) {
2258
2154
  function DetailSection({
2259
2155
  label,
2260
2156
  value,
2261
- color = DEVTOOL_COLOR_SEMANTIC_SYSTEM
2157
+ color = DEVTOOL_COLOR_SEMANTIC_SYSTEM2
2262
2158
  }) {
2263
2159
  const parsedFromString = typeof value === "string" ? tryParseJson(value) : null;
2264
2160
  const isPlainString = typeof value === "string" && parsedFromString === null;
@@ -2268,7 +2164,7 @@ function DetailSection({
2268
2164
  const compactJson = isPlainString ? value : safeStringify(effectiveValue, 0);
2269
2165
  const canExpand = fullJson !== compactJson || compactJson.length > COMPACT_CHAR_LIMIT;
2270
2166
  const compactDisplay = compactJson.length > COMPACT_CHAR_LIMIT ? `${compactJson.slice(0, COMPACT_CHAR_LIMIT)}…` : compactJson;
2271
- const baseStyle = isPlainString ? { background: DEVTOOL_SECTION_STRING_BACKGROUND, color: DEVTOOL_COLOR_TEXT_MUTED } : { background: DEVTOOL_SECTION_BACKGROUND, color: DEVTOOL_COLOR_TEXT_SECONDARY };
2167
+ const baseStyle = isPlainString ? { background: DEVTOOL_SECTION_STRING_BACKGROUND, color: DEVTOOL_COLOR_TEXT_MUTED2 } : { background: DEVTOOL_SECTION_BACKGROUND2, color: DEVTOOL_COLOR_TEXT_SECONDARY };
2272
2168
  return /* @__PURE__ */ jsxs("div", {
2273
2169
  children: [
2274
2170
  /* @__PURE__ */ jsxs("div", {
@@ -2279,17 +2175,17 @@ function DetailSection({
2279
2175
  marginBottom: "3px"
2280
2176
  },
2281
2177
  children: [
2282
- /* @__PURE__ */ jsx2(SectionLabel, {
2178
+ /* @__PURE__ */ jsx(SectionLabel, {
2283
2179
  label,
2284
2180
  color
2285
2181
  }),
2286
- canExpand && /* @__PURE__ */ jsx2("span", {
2287
- style: { color: DEVTOOL_COLOR_TEXT_FAINT, fontSize: "11px" },
2182
+ canExpand && /* @__PURE__ */ jsx("span", {
2183
+ style: { color: DEVTOOL_COLOR_TEXT_FAINT2, fontSize: "11px" },
2288
2184
  children: expanded ? "▾" : "▸"
2289
2185
  })
2290
2186
  ]
2291
2187
  }),
2292
- expanded ? /* @__PURE__ */ jsx2("div", {
2188
+ expanded ? /* @__PURE__ */ jsx("div", {
2293
2189
  onClick: canExpand ? () => setExpanded(false) : undefined,
2294
2190
  style: {
2295
2191
  margin: 0,
@@ -2306,7 +2202,7 @@ function DetailSection({
2306
2202
  ...baseStyle
2307
2203
  },
2308
2204
  children: isPlainString ? fullJson : renderColoredJson(fullJson)
2309
- }) : /* @__PURE__ */ jsx2("div", {
2205
+ }) : /* @__PURE__ */ jsx("div", {
2310
2206
  onClick: canExpand ? () => setExpanded(true) : undefined,
2311
2207
  style: {
2312
2208
  padding: "5px 8px",
@@ -2327,7 +2223,7 @@ function DetailSection({
2327
2223
  }
2328
2224
 
2329
2225
  // src/devtools/browser/components/NiceErrorDisplay.tsx
2330
- import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
2226
+ import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
2331
2227
  var MONO2 = "ui-monospace, 'Cascadia Code', 'Source Code Pro', monospace";
2332
2228
  var SANS = "ui-sans-serif, system-ui, -apple-system, sans-serif";
2333
2229
  function isNiceErrorJson(value) {
@@ -2340,15 +2236,15 @@ function NiceErrorBody({ error }) {
2340
2236
  return /* @__PURE__ */ jsxs2("div", {
2341
2237
  style: {
2342
2238
  background: DEVTOOL_ERROR_BACKGROUND,
2343
- border: `1px solid ${DEVTOOL_COLOR_SEMANTIC_ERROR}`,
2239
+ border: `1px solid ${DEVTOOL_COLOR_SEMANTIC_ERROR2}`,
2344
2240
  borderRadius: "4px",
2345
2241
  overflow: "hidden"
2346
2242
  },
2347
2243
  children: [
2348
- /* @__PURE__ */ jsx3("div", {
2244
+ /* @__PURE__ */ jsx2("div", {
2349
2245
  style: {
2350
2246
  padding: "12px 14px",
2351
- color: DEVTOOL_COLOR_SEMANTIC_ERROR,
2247
+ color: DEVTOOL_COLOR_SEMANTIC_ERROR2,
2352
2248
  fontSize: "1em",
2353
2249
  fontWeight: "700",
2354
2250
  lineHeight: "1.45",
@@ -2369,9 +2265,9 @@ function NiceErrorBody({ error }) {
2369
2265
  background: DEVTOOL_ERROR_BADGE_BACKGROUND
2370
2266
  },
2371
2267
  children: [
2372
- error.ids.map((id) => /* @__PURE__ */ jsx3("span", {
2268
+ error.ids.map((id) => /* @__PURE__ */ jsx2("span", {
2373
2269
  style: {
2374
- color: DEVTOOL_COLOR_SEMANTIC_ERROR,
2270
+ color: DEVTOOL_COLOR_SEMANTIC_ERROR2,
2375
2271
  fontFamily: MONO2,
2376
2272
  fontSize: "11px",
2377
2273
  fontWeight: "600"
@@ -2379,23 +2275,23 @@ function NiceErrorBody({ error }) {
2379
2275
  children: id
2380
2276
  }, id)),
2381
2277
  /* @__PURE__ */ jsxs2("span", {
2382
- style: { color: DEVTOOL_COLOR_TEXT_MUTED, fontSize: "10px", fontFamily: SANS },
2278
+ style: { color: DEVTOOL_COLOR_TEXT_MUTED2, fontSize: "10px", fontFamily: SANS },
2383
2279
  children: [
2384
2280
  "domain:",
2385
2281
  " ",
2386
- /* @__PURE__ */ jsx3("span", {
2387
- style: { color: DEVTOOL_COLOR_TEXT_MUTED, fontFamily: MONO2 },
2282
+ /* @__PURE__ */ jsx2("span", {
2283
+ style: { color: DEVTOOL_COLOR_TEXT_MUTED2, fontFamily: MONO2 },
2388
2284
  children: error.def.domain
2389
2285
  })
2390
2286
  ]
2391
2287
  }),
2392
2288
  /* @__PURE__ */ jsxs2("span", {
2393
- style: { color: DEVTOOL_COLOR_TEXT_MUTED, fontSize: "10px", fontFamily: SANS },
2289
+ style: { color: DEVTOOL_COLOR_TEXT_MUTED2, fontSize: "10px", fontFamily: SANS },
2394
2290
  children: [
2395
2291
  "http:",
2396
2292
  " ",
2397
- /* @__PURE__ */ jsx3("span", {
2398
- style: { color: DEVTOOL_COLOR_TEXT_MUTED, fontFamily: MONO2 },
2293
+ /* @__PURE__ */ jsx2("span", {
2294
+ style: { color: DEVTOOL_COLOR_TEXT_MUTED2, fontFamily: MONO2 },
2399
2295
  children: error.httpStatusCode
2400
2296
  })
2401
2297
  ]
@@ -2412,11 +2308,11 @@ function NiceErrorDisplay({
2412
2308
  }) {
2413
2309
  return /* @__PURE__ */ jsxs2("div", {
2414
2310
  children: [
2415
- /* @__PURE__ */ jsx3(SectionLabel, {
2311
+ /* @__PURE__ */ jsx2(SectionLabel, {
2416
2312
  label,
2417
2313
  color
2418
2314
  }),
2419
- /* @__PURE__ */ jsx3(NiceErrorBody, {
2315
+ /* @__PURE__ */ jsx2(NiceErrorBody, {
2420
2316
  error
2421
2317
  })
2422
2318
  ]
@@ -2496,7 +2392,7 @@ async function resolveCompiledPosition(fileUrl, line, col) {
2496
2392
  }
2497
2393
 
2498
2394
  // src/devtools/browser/components/StackTraceSection.tsx
2499
- import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
2395
+ import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
2500
2396
  var INTERNAL_PATTERNS = [
2501
2397
  "/nice-action/",
2502
2398
  "@nice-code/action",
@@ -2666,7 +2562,7 @@ function ProjectRootSetupModal({
2666
2562
  justifyContent: "center"
2667
2563
  },
2668
2564
  children: [
2669
- /* @__PURE__ */ jsx4("div", {
2565
+ /* @__PURE__ */ jsx3("div", {
2670
2566
  onClick: onCancel,
2671
2567
  style: { position: "absolute", inset: 0, background: "rgba(0, 0, 0, 0.72)" }
2672
2568
  }),
@@ -2692,7 +2588,7 @@ function ProjectRootSetupModal({
2692
2588
  padding: "10px 14px"
2693
2589
  },
2694
2590
  children: [
2695
- /* @__PURE__ */ jsx4("div", {
2591
+ /* @__PURE__ */ jsx3("div", {
2696
2592
  style: {
2697
2593
  color: DEVTOOL_COLOR_TEXT_EMPHASIS,
2698
2594
  fontSize: "12px",
@@ -2702,13 +2598,13 @@ function ProjectRootSetupModal({
2702
2598
  children: "Set project root"
2703
2599
  }),
2704
2600
  /* @__PURE__ */ jsxs3("div", {
2705
- style: { color: DEVTOOL_COLOR_TEXT_MUTED, fontSize: "10px" },
2601
+ style: { color: DEVTOOL_COLOR_TEXT_MUTED2, fontSize: "10px" },
2706
2602
  children: [
2707
2603
  "Runtime:",
2708
2604
  " ",
2709
- /* @__PURE__ */ jsx4("span", {
2605
+ /* @__PURE__ */ jsx3("span", {
2710
2606
  style: {
2711
- color: DEVTOOL_COLOR_SEMANTIC_SYSTEM,
2607
+ color: DEVTOOL_COLOR_SEMANTIC_SYSTEM2,
2712
2608
  fontFamily: "ui-monospace, 'Cascadia Code', 'Source Code Pro', monospace"
2713
2609
  },
2714
2610
  children: envId
@@ -2721,11 +2617,11 @@ function ProjectRootSetupModal({
2721
2617
  style: { padding: "14px", display: "flex", flexDirection: "column", gap: "8px" },
2722
2618
  children: [
2723
2619
  /* @__PURE__ */ jsxs3("div", {
2724
- style: { color: DEVTOOL_COLOR_TEXT_MUTED, fontSize: "10px", lineHeight: 1.4 },
2620
+ style: { color: DEVTOOL_COLOR_TEXT_MUTED2, fontSize: "10px", lineHeight: 1.4 },
2725
2621
  children: [
2726
2622
  "Provide the absolute path to this project's root so that root-relative source file paths (e.g.",
2727
2623
  " ",
2728
- /* @__PURE__ */ jsx4("span", {
2624
+ /* @__PURE__ */ jsx3("span", {
2729
2625
  style: {
2730
2626
  fontFamily: "ui-monospace, 'Cascadia Code', 'Source Code Pro', monospace"
2731
2627
  },
@@ -2734,7 +2630,7 @@ function ProjectRootSetupModal({
2734
2630
  ") can be opened in VS Code."
2735
2631
  ]
2736
2632
  }),
2737
- /* @__PURE__ */ jsx4("input", {
2633
+ /* @__PURE__ */ jsx3("input", {
2738
2634
  ref: inputRef,
2739
2635
  value,
2740
2636
  onChange: (e) => setValue(e.currentTarget.value),
@@ -2763,28 +2659,28 @@ function ProjectRootSetupModal({
2763
2659
  borderTop: `1px solid ${DEVTOOL_PANEL_BORDER}`
2764
2660
  },
2765
2661
  children: [
2766
- /* @__PURE__ */ jsx4("button", {
2662
+ /* @__PURE__ */ jsx3("button", {
2767
2663
  type: "button",
2768
2664
  onClick: onCancel,
2769
2665
  style: {
2770
2666
  background: "transparent",
2771
2667
  border: `1px solid ${DEVTOOL_PANEL_BORDER}`,
2772
2668
  borderRadius: "4px",
2773
- color: DEVTOOL_COLOR_TEXT_MUTED,
2669
+ color: DEVTOOL_COLOR_TEXT_MUTED2,
2774
2670
  fontSize: "11px",
2775
2671
  padding: "5px 12px",
2776
2672
  cursor: "pointer"
2777
2673
  },
2778
2674
  children: "Cancel"
2779
2675
  }),
2780
- /* @__PURE__ */ jsx4("button", {
2676
+ /* @__PURE__ */ jsx3("button", {
2781
2677
  type: "submit",
2782
2678
  disabled: value.trim() === "",
2783
2679
  style: {
2784
- background: `${DEVTOOL_COLOR_SEMANTIC_SYSTEM}22`,
2785
- border: `1px solid ${DEVTOOL_COLOR_SEMANTIC_SYSTEM}66`,
2680
+ background: `${DEVTOOL_COLOR_SEMANTIC_SYSTEM2}22`,
2681
+ border: `1px solid ${DEVTOOL_COLOR_SEMANTIC_SYSTEM2}66`,
2786
2682
  borderRadius: "4px",
2787
- color: DEVTOOL_COLOR_SEMANTIC_SYSTEM,
2683
+ color: DEVTOOL_COLOR_SEMANTIC_SYSTEM2,
2788
2684
  fontSize: "11px",
2789
2685
  padding: "5px 12px",
2790
2686
  cursor: value.trim() === "" ? "not-allowed" : "pointer",
@@ -2826,7 +2722,7 @@ function OpenInVscodeButton({
2826
2722
  flexShrink: 0
2827
2723
  };
2828
2724
  if (needsSetup) {
2829
- return /* @__PURE__ */ jsx4("button", {
2725
+ return /* @__PURE__ */ jsx3("button", {
2830
2726
  onClick: (e) => {
2831
2727
  e.stopPropagation();
2832
2728
  onNeedSetup();
@@ -2836,18 +2732,18 @@ function OpenInVscodeButton({
2836
2732
  title: "Set project root to open in VS Code",
2837
2733
  style: {
2838
2734
  ...baseStyle,
2839
- color: DEVTOOL_COLOR_SEMANTIC_WARNING,
2735
+ color: DEVTOOL_COLOR_SEMANTIC_WARNING2,
2840
2736
  background: "none",
2841
2737
  border: "none",
2842
2738
  padding: 0
2843
2739
  },
2844
- children: /* @__PURE__ */ jsx4(ExternalLink, {
2740
+ children: /* @__PURE__ */ jsx3(ExternalLink, {
2845
2741
  size: 10,
2846
2742
  strokeWidth: 1.8
2847
2743
  })
2848
2744
  });
2849
2745
  }
2850
- return /* @__PURE__ */ jsx4("a", {
2746
+ return /* @__PURE__ */ jsx3("a", {
2851
2747
  href: url,
2852
2748
  onClick: (e) => e.stopPropagation(),
2853
2749
  onMouseEnter: () => setHovered(true),
@@ -2858,7 +2754,7 @@ function OpenInVscodeButton({
2858
2754
  color: DEVTOOL_COLOR_TEXT_SECONDARY,
2859
2755
  textDecoration: "none"
2860
2756
  },
2861
- children: /* @__PURE__ */ jsx4(ExternalLink, {
2757
+ children: /* @__PURE__ */ jsx3(ExternalLink, {
2862
2758
  size: 10,
2863
2759
  strokeWidth: 1.8
2864
2760
  })
@@ -2872,7 +2768,7 @@ function countUserFrames(_runtime, stack) {
2872
2768
  function StackTraceSection({
2873
2769
  label,
2874
2770
  stack,
2875
- color = DEVTOOL_COLOR_SEMANTIC_SYSTEM,
2771
+ color = DEVTOOL_COLOR_SEMANTIC_SYSTEM2,
2876
2772
  runtime,
2877
2773
  minFrameCount
2878
2774
  }) {
@@ -2926,12 +2822,12 @@ function StackTraceSection({
2926
2822
  marginBottom: "3px"
2927
2823
  },
2928
2824
  children: [
2929
- /* @__PURE__ */ jsx4(SectionLabel, {
2825
+ /* @__PURE__ */ jsx3(SectionLabel, {
2930
2826
  label,
2931
2827
  color
2932
2828
  }),
2933
- hasInternalFrames && /* @__PURE__ */ jsx4("span", {
2934
- style: { color: DEVTOOL_COLOR_TEXT_MUTED, fontSize: "9px" },
2829
+ hasInternalFrames && /* @__PURE__ */ jsx3("span", {
2830
+ style: { color: DEVTOOL_COLOR_TEXT_MUTED2, fontSize: "9px" },
2935
2831
  children: !showAll ? "user only" : `all (${allFrames.length})`
2936
2832
  })
2937
2833
  ]
@@ -2946,10 +2842,10 @@ function StackTraceSection({
2946
2842
  cursor: "pointer"
2947
2843
  },
2948
2844
  children: [
2949
- displayFrames.length === 0 ? /* @__PURE__ */ jsx4("div", {
2845
+ displayFrames.length === 0 ? /* @__PURE__ */ jsx3("div", {
2950
2846
  style: {
2951
2847
  padding: "6px 10px",
2952
- color: DEVTOOL_COLOR_TEXT_MUTED,
2848
+ color: DEVTOOL_COLOR_TEXT_MUTED2,
2953
2849
  fontSize: "10px",
2954
2850
  fontStyle: "italic"
2955
2851
  },
@@ -2973,7 +2869,7 @@ function StackTraceSection({
2973
2869
  borderBottom: `1px solid ${DEVTOOL_LIST_BASE_BACKGROUND}`
2974
2870
  },
2975
2871
  children: [
2976
- /* @__PURE__ */ jsx4("span", {
2872
+ /* @__PURE__ */ jsx3("span", {
2977
2873
  style: {
2978
2874
  color: isUser ? DEVTOOL_STACK_FRAME_USER_NUMBER : DEVTOOL_STACK_FRAME_INTERNAL_NUMBER,
2979
2875
  fontSize: "10px",
@@ -2992,9 +2888,9 @@ function StackTraceSection({
2992
2888
  lineHeight: 1.2
2993
2889
  },
2994
2890
  children: [
2995
- /* @__PURE__ */ jsx4("div", {
2891
+ /* @__PURE__ */ jsx3("div", {
2996
2892
  style: { display: "flex", alignItems: "center" },
2997
- children: /* @__PURE__ */ jsx4("span", {
2893
+ children: /* @__PURE__ */ jsx3("span", {
2998
2894
  style: {
2999
2895
  color: isUser ? DEVTOOL_STACK_FRAME_USER_FUNCTION : DEVTOOL_STACK_FRAME_INTERNAL_FUNCTION,
3000
2896
  fontSize: "12px",
@@ -3009,7 +2905,7 @@ function StackTraceSection({
3009
2905
  /* @__PURE__ */ jsxs3("div", {
3010
2906
  style: { display: "flex", alignItems: "baseline", overflow: "hidden" },
3011
2907
  children: [
3012
- folderPrefix !== "" && /* @__PURE__ */ jsx4("span", {
2908
+ folderPrefix !== "" && /* @__PURE__ */ jsx3("span", {
3013
2909
  style: {
3014
2910
  color: isUser ? DEVTOOL_STACK_FRAME_USER_FOLDER : DEVTOOL_STACK_FRAME_INTERNAL_FOLDER,
3015
2911
  fontSize: "10px",
@@ -3021,7 +2917,7 @@ function StackTraceSection({
3021
2917
  },
3022
2918
  children: folderPrefix
3023
2919
  }),
3024
- /* @__PURE__ */ jsx4("span", {
2920
+ /* @__PURE__ */ jsx3("span", {
3025
2921
  style: {
3026
2922
  color: isUser ? DEVTOOL_STACK_FRAME_USER_FILE : DEVTOOL_STACK_FRAME_INTERNAL_FILE,
3027
2923
  fontSize: "10px",
@@ -3047,7 +2943,7 @@ function StackTraceSection({
3047
2943
  })
3048
2944
  ]
3049
2945
  }),
3050
- /* @__PURE__ */ jsx4(OpenInVscodeButton, {
2946
+ /* @__PURE__ */ jsx3(OpenInVscodeButton, {
3051
2947
  frame,
3052
2948
  projectRoot,
3053
2949
  onNeedSetup: () => setShowSetupModal(true)
@@ -3066,18 +2962,18 @@ function StackTraceSection({
3066
2962
  borderBottom: `1px solid ${DEVTOOL_LIST_BASE_BACKGROUND}`
3067
2963
  },
3068
2964
  children: [
3069
- /* @__PURE__ */ jsx4("span", {
2965
+ /* @__PURE__ */ jsx3("span", {
3070
2966
  style: { fontSize: "10px", minWidth: "10px", flexShrink: 0 },
3071
2967
  children: "0"
3072
2968
  }),
3073
2969
  /* @__PURE__ */ jsxs3("div", {
3074
2970
  style: { display: "flex", flexDirection: "column", gap: "0.15em", lineHeight: 1.2 },
3075
2971
  children: [
3076
- /* @__PURE__ */ jsx4("div", {
2972
+ /* @__PURE__ */ jsx3("div", {
3077
2973
  style: { fontSize: "12px" },
3078
2974
  children: "placeholder"
3079
2975
  }),
3080
- /* @__PURE__ */ jsx4("div", {
2976
+ /* @__PURE__ */ jsx3("div", {
3081
2977
  style: { fontSize: "10px" },
3082
2978
  children: "placeholder/file.ts:1"
3083
2979
  })
@@ -3087,7 +2983,7 @@ function StackTraceSection({
3087
2983
  }, `phantom-${i}`))
3088
2984
  ]
3089
2985
  }),
3090
- showSetupModal && /* @__PURE__ */ jsx4(ProjectRootSetupModal, {
2986
+ showSetupModal && /* @__PURE__ */ jsx3(ProjectRootSetupModal, {
3091
2987
  envId: runtime.envId,
3092
2988
  currentValue: projectRoot ?? "",
3093
2989
  onSave: handleSaveProjectRoot,
@@ -3098,7 +2994,7 @@ function StackTraceSection({
3098
2994
  }
3099
2995
 
3100
2996
  // src/devtools/browser/components/ActionErrorDisplay.tsx
3101
- import { jsx as jsx5, jsxs as jsxs4, Fragment } from "react/jsx-runtime";
2997
+ import { jsx as jsx4, jsxs as jsxs4, Fragment } from "react/jsx-runtime";
3102
2998
  var MONO3 = "ui-monospace, 'Cascadia Code', 'Source Code Pro', monospace";
3103
2999
  var SANS2 = "ui-sans-serif, system-ui, -apple-system, sans-serif";
3104
3000
  function FullErrorContent({
@@ -3110,16 +3006,16 @@ function FullErrorContent({
3110
3006
  }) {
3111
3007
  return /* @__PURE__ */ jsxs4(Fragment, {
3112
3008
  children: [
3113
- isNiceErrorJson(error) ? /* @__PURE__ */ jsx5(NiceErrorDisplay, {
3009
+ isNiceErrorJson(error) ? /* @__PURE__ */ jsx4(NiceErrorDisplay, {
3114
3010
  error,
3115
3011
  label,
3116
3012
  color
3117
- }) : /* @__PURE__ */ jsx5(DetailSection, {
3013
+ }) : /* @__PURE__ */ jsx4(DetailSection, {
3118
3014
  label,
3119
3015
  value: error,
3120
3016
  color
3121
3017
  }),
3122
- /* @__PURE__ */ jsx5(StackTraceSection, {
3018
+ /* @__PURE__ */ jsx4(StackTraceSection, {
3123
3019
  runtime,
3124
3020
  label: "Error Stack",
3125
3021
  stack: errorStack,
@@ -3139,7 +3035,7 @@ function CompactErrorContent({ value, color }) {
3139
3035
  minWidth: 0
3140
3036
  },
3141
3037
  children: [
3142
- /* @__PURE__ */ jsx5("div", {
3038
+ /* @__PURE__ */ jsx4("div", {
3143
3039
  style: {
3144
3040
  color,
3145
3041
  fontFamily: SANS2,
@@ -3161,7 +3057,7 @@ function CompactErrorContent({ value, color }) {
3161
3057
  minWidth: 0
3162
3058
  },
3163
3059
  children: [
3164
- value.ids.map((id) => /* @__PURE__ */ jsx5("span", {
3060
+ value.ids.map((id) => /* @__PURE__ */ jsx4("span", {
3165
3061
  style: {
3166
3062
  color,
3167
3063
  fontFamily: MONO3,
@@ -3172,9 +3068,9 @@ function CompactErrorContent({ value, color }) {
3172
3068
  },
3173
3069
  children: id
3174
3070
  }, id)),
3175
- /* @__PURE__ */ jsx5("span", {
3071
+ /* @__PURE__ */ jsx4("span", {
3176
3072
  style: {
3177
- color: DEVTOOL_COLOR_TEXT_MUTED,
3073
+ color: DEVTOOL_COLOR_TEXT_MUTED2,
3178
3074
  fontFamily: MONO3,
3179
3075
  fontSize: "10px",
3180
3076
  wordBreak: "break-word",
@@ -3190,7 +3086,7 @@ function CompactErrorContent({ value, color }) {
3190
3086
  const text = typeof value === "string" ? value : value != null ? String(value) : null;
3191
3087
  if (text == null)
3192
3088
  return null;
3193
- return /* @__PURE__ */ jsx5("div", {
3089
+ return /* @__PURE__ */ jsx4("div", {
3194
3090
  style: {
3195
3091
  color,
3196
3092
  fontFamily: SANS2,
@@ -3208,13 +3104,13 @@ function ActionErrorDisplay({
3208
3104
  }) {
3209
3105
  const { status, error, abortReason, errorStack } = entry;
3210
3106
  if (status === "action-error") {
3211
- const color = DEVTOOL_COLOR_SEMANTIC_ERROR;
3107
+ const color = DEVTOOL_COLOR_SEMANTIC_ERROR2;
3212
3108
  if (compact)
3213
- return /* @__PURE__ */ jsx5(CompactErrorContent, {
3109
+ return /* @__PURE__ */ jsx4(CompactErrorContent, {
3214
3110
  value: error,
3215
3111
  color
3216
3112
  });
3217
- return /* @__PURE__ */ jsx5(FullErrorContent, {
3113
+ return /* @__PURE__ */ jsx4(FullErrorContent, {
3218
3114
  runtime: entry.meta.originClient,
3219
3115
  label: "Action Error",
3220
3116
  error,
@@ -3223,13 +3119,13 @@ function ActionErrorDisplay({
3223
3119
  });
3224
3120
  }
3225
3121
  if (status === "failed") {
3226
- const color = DEVTOOL_COLOR_SEMANTIC_ERROR;
3122
+ const color = DEVTOOL_COLOR_SEMANTIC_ERROR2;
3227
3123
  if (compact)
3228
- return /* @__PURE__ */ jsx5(CompactErrorContent, {
3124
+ return /* @__PURE__ */ jsx4(CompactErrorContent, {
3229
3125
  value: error,
3230
3126
  color
3231
3127
  });
3232
- return /* @__PURE__ */ jsx5(FullErrorContent, {
3128
+ return /* @__PURE__ */ jsx4(FullErrorContent, {
3233
3129
  runtime: entry.meta.originClient,
3234
3130
  label: "Error",
3235
3131
  error,
@@ -3238,24 +3134,24 @@ function ActionErrorDisplay({
3238
3134
  });
3239
3135
  }
3240
3136
  if (status === "aborted") {
3241
- const color = DEVTOOL_COLOR_SEMANTIC_METADATA;
3137
+ const color = DEVTOOL_COLOR_SEMANTIC_METADATA2;
3242
3138
  if (compact)
3243
- return /* @__PURE__ */ jsx5(CompactErrorContent, {
3139
+ return /* @__PURE__ */ jsx4(CompactErrorContent, {
3244
3140
  value: abortReason,
3245
3141
  color
3246
3142
  });
3247
3143
  return /* @__PURE__ */ jsxs4(Fragment, {
3248
3144
  children: [
3249
- abortReason != null && (isNiceErrorJson(abortReason) ? /* @__PURE__ */ jsx5(NiceErrorDisplay, {
3145
+ abortReason != null && (isNiceErrorJson(abortReason) ? /* @__PURE__ */ jsx4(NiceErrorDisplay, {
3250
3146
  error: abortReason,
3251
3147
  label: "Abort Reason",
3252
3148
  color
3253
- }) : /* @__PURE__ */ jsx5(DetailSection, {
3149
+ }) : /* @__PURE__ */ jsx4(DetailSection, {
3254
3150
  label: "Abort Reason",
3255
3151
  value: abortReason,
3256
3152
  color
3257
3153
  })),
3258
- /* @__PURE__ */ jsx5(StackTraceSection, {
3154
+ /* @__PURE__ */ jsx4(StackTraceSection, {
3259
3155
  runtime: entry.meta.originClient,
3260
3156
  label: "Abort Stack",
3261
3157
  stack: errorStack,
@@ -3271,114 +3167,13 @@ function ActionErrorDisplay({
3271
3167
  import { Component } from "lucide-react";
3272
3168
 
3273
3169
  // src/devtools/browser/components/Chip.tsx
3274
- import { useState as useState4 } from "react";
3170
+ import { useState as useState3 } from "react";
3275
3171
 
3276
3172
  // src/devtools/browser/components/Tooltip.tsx
3277
- import { useState as useState3 } from "react";
3278
- import { jsx as jsx6, jsxs as jsxs5, Fragment as Fragment2 } from "react/jsx-runtime";
3279
- function Tooltip({
3280
- anchor,
3281
- config,
3282
- children
3283
- }) {
3284
- const resolvedTitle = config?.title;
3285
- const resolvedAlign = config?.align;
3286
- const resolvedMaxWidth = config?.maxWidth ?? 400;
3287
- const resolvedContent = config != null ? config.content : children;
3288
- const showAbove = anchor.top >= window.innerHeight - anchor.bottom;
3289
- const gap = 6;
3290
- const screenMargin = 16;
3291
- const top = showAbove ? Math.round(anchor.top - gap) : Math.round(anchor.bottom + gap);
3292
- const maxHeight = showAbove ? Math.round(anchor.top - gap - screenMargin) : Math.round(window.innerHeight - anchor.bottom - gap - screenMargin);
3293
- let left;
3294
- let right;
3295
- let transform;
3296
- if (resolvedAlign === "center") {
3297
- const halfMax = resolvedMaxWidth != null ? resolvedMaxWidth / 2 : 120;
3298
- const center = Math.round(anchor.left + anchor.width / 2);
3299
- left = Math.max(halfMax + screenMargin, Math.min(center, window.innerWidth - halfMax - screenMargin));
3300
- transform = showAbove ? "translateX(-50%) translateY(-100%)" : "translateX(-50%)";
3301
- } else {
3302
- const anchorMidX = anchor.left + anchor.width / 2;
3303
- if (anchorMidX <= window.innerWidth / 2) {
3304
- left = Math.max(screenMargin, anchor.left);
3305
- } else {
3306
- right = Math.max(screenMargin, window.innerWidth - anchor.right);
3307
- }
3308
- if (showAbove)
3309
- transform = "translateY(-100%)";
3310
- }
3311
- return /* @__PURE__ */ jsxs5("div", {
3312
- style: {
3313
- position: "fixed",
3314
- left,
3315
- right,
3316
- top,
3317
- transform,
3318
- zIndex: 2147483647,
3319
- background: DEVTOOL_TOOLTIP_BACKGROUND,
3320
- border: `1px solid ${DEVTOOL_TOOLTIP_BORDER}`,
3321
- borderRadius: "5px",
3322
- boxShadow: "0 4px 20px rgba(0,0,0,0.6)",
3323
- pointerEvents: "none",
3324
- maxWidth: resolvedMaxWidth != null ? `${resolvedMaxWidth}px` : undefined,
3325
- maxHeight: `${maxHeight}px`,
3326
- overflowY: "auto",
3327
- overflowX: "hidden",
3328
- whiteSpace: "normal",
3329
- wordBreak: "break-word",
3330
- overflowWrap: "anywhere"
3331
- },
3332
- children: [
3333
- resolvedTitle != null && /* @__PURE__ */ jsx6("div", {
3334
- style: {
3335
- background: DEVTOOL_TOOLTIP_TITLE_BACKGROUND,
3336
- padding: "6px 8px",
3337
- alignSelf: "start",
3338
- textAlign: "left",
3339
- color: DEVTOOL_COLOR_TEXT_SECONDARY,
3340
- fontSize: "0.75rem",
3341
- fontWeight: 600,
3342
- paddingBottom: "4px",
3343
- marginBottom: "4px",
3344
- borderBottom: `1px solid ${DEVTOOL_TOOLTIP_TITLE_BOTTOM_BORDER}`
3345
- },
3346
- children: resolvedTitle
3347
- }),
3348
- /* @__PURE__ */ jsx6("div", {
3349
- style: {
3350
- padding: "6px 8px"
3351
- },
3352
- children: resolvedContent
3353
- })
3354
- ]
3355
- });
3356
- }
3357
- function HoverTooltip({
3358
- config,
3359
- children,
3360
- style
3361
- }) {
3362
- const [anchor, setAnchor] = useState3(null);
3363
- const enabled = config != null;
3364
- return /* @__PURE__ */ jsxs5(Fragment2, {
3365
- children: [
3366
- /* @__PURE__ */ jsx6("span", {
3367
- onMouseEnter: enabled ? (e) => setAnchor(e.currentTarget.getBoundingClientRect()) : undefined,
3368
- onMouseLeave: enabled ? () => setAnchor(null) : undefined,
3369
- style: { ...style, cursor: enabled ? "default" : style?.cursor },
3370
- children
3371
- }),
3372
- enabled && anchor != null && config != null && /* @__PURE__ */ jsx6(Tooltip, {
3373
- anchor,
3374
- config
3375
- })
3376
- ]
3377
- });
3378
- }
3173
+ import { HoverTooltip, Tooltip } from "nice-devtools-shared";
3379
3174
 
3380
3175
  // src/devtools/browser/components/Chip.tsx
3381
- import { jsx as jsx7, jsxs as jsxs6, Fragment as Fragment3 } from "react/jsx-runtime";
3176
+ import { jsx as jsx5, jsxs as jsxs5, Fragment as Fragment2 } from "react/jsx-runtime";
3382
3177
  var CHIP_SIZE_STYLES = {
3383
3178
  ["sm" /* sm */]: { fontSize: "0.8em", padding: "1px 3px" },
3384
3179
  ["md" /* md */]: { fontSize: "0.9em", padding: "1px 4px" },
@@ -3392,15 +3187,15 @@ function Chip({
3392
3187
  tooltip,
3393
3188
  children
3394
3189
  }) {
3395
- const [anchor, setAnchor] = useState4(null);
3190
+ const [anchor, setAnchor] = useState3(null);
3396
3191
  const hasTooltip = tooltip != null;
3397
3192
  const { fontSize, padding } = CHIP_SIZE_STYLES[size];
3398
3193
  const colorEntry = SEMANTIC_COLORS[color];
3399
3194
  const resolvedColor = subtle ? colorEntry.subtle?.color ?? colorEntry.color : colorEntry.color;
3400
3195
  const resolvedBorderColor = subtle ? colorEntry.subtle?.borderColor ?? "transparent" : colorEntry.borderColor;
3401
- return /* @__PURE__ */ jsxs6(Fragment3, {
3196
+ return /* @__PURE__ */ jsxs5(Fragment2, {
3402
3197
  children: [
3403
- /* @__PURE__ */ jsx7("span", {
3198
+ /* @__PURE__ */ jsx5("span", {
3404
3199
  onMouseEnter: hasTooltip ? (e) => setAnchor(e.currentTarget.getBoundingClientRect()) : undefined,
3405
3200
  onMouseLeave: hasTooltip ? () => setAnchor(null) : undefined,
3406
3201
  style: {
@@ -3418,7 +3213,7 @@ function Chip({
3418
3213
  },
3419
3214
  children
3420
3215
  }),
3421
- anchor != null && hasTooltip && /* @__PURE__ */ jsx7(Tooltip, {
3216
+ anchor != null && hasTooltip && /* @__PURE__ */ jsx5(Tooltip, {
3422
3217
  anchor,
3423
3218
  config: tooltip
3424
3219
  })
@@ -3427,8 +3222,8 @@ function Chip({
3427
3222
  }
3428
3223
 
3429
3224
  // src/devtools/browser/components/Icon.tsx
3430
- import { useState as useState5 } from "react";
3431
- import { jsx as jsx8, jsxs as jsxs7, Fragment as Fragment4 } from "react/jsx-runtime";
3225
+ import { useState as useState4 } from "react";
3226
+ import { jsx as jsx6, jsxs as jsxs6, Fragment as Fragment3 } from "react/jsx-runtime";
3432
3227
  var BASE_ICON_SIDE_LENGTH_EM = 1.6;
3433
3228
  var ICON_GAP_EM = 0.3;
3434
3229
  function Icon({
@@ -3440,16 +3235,16 @@ function Icon({
3440
3235
  style,
3441
3236
  noBackground = false
3442
3237
  }) {
3443
- const [anchor, setAnchor] = useState5(null);
3238
+ const [anchor, setAnchor] = useState4(null);
3444
3239
  const hasTooltip = tooltip != null;
3445
3240
  const colorEntry = SEMANTIC_COLORS[color];
3446
3241
  const resolvedColor = subtle ? colorEntry.subtle?.color ?? colorEntry.color : colorEntry.color;
3447
3242
  const finalIcons = Array.isArray(IconComponent) ? IconComponent : [IconComponent];
3448
3243
  const fullIconWidthEm = (finalIcons.length - 1) * ICON_GAP_EM + finalIcons.length * BASE_ICON_SIDE_LENGTH_EM * getSizeValue(size);
3449
3244
  const iconSideLengthEm = `${BASE_ICON_SIDE_LENGTH_EM * getSizeValue(size)}em`;
3450
- return /* @__PURE__ */ jsxs7(Fragment4, {
3245
+ return /* @__PURE__ */ jsxs6(Fragment3, {
3451
3246
  children: [
3452
- /* @__PURE__ */ jsx8("div", {
3247
+ /* @__PURE__ */ jsx6("div", {
3453
3248
  onMouseEnter: hasTooltip ? (e) => setAnchor(e.currentTarget.getBoundingClientRect()) : undefined,
3454
3249
  onMouseLeave: hasTooltip ? () => setAnchor(null) : undefined,
3455
3250
  style: {
@@ -3466,15 +3261,15 @@ function Icon({
3466
3261
  cursor: hasTooltip ? "default" : undefined,
3467
3262
  ...style
3468
3263
  },
3469
- children: /* @__PURE__ */ jsx8("div", {
3264
+ children: /* @__PURE__ */ jsx6("div", {
3470
3265
  style: { display: "flex", alignItems: "center", gap: `${ICON_GAP_EM}em` },
3471
- children: finalIcons.map((Comp, i) => /* @__PURE__ */ jsx8(Comp, {
3266
+ children: finalIcons.map((Comp, i) => /* @__PURE__ */ jsx6(Comp, {
3472
3267
  size: iconSideLengthEm,
3473
3268
  strokeWidth: 2.6
3474
3269
  }, `${Comp.name}-${i}`))
3475
3270
  })
3476
3271
  }),
3477
- anchor != null && hasTooltip && /* @__PURE__ */ jsx8(Tooltip, {
3272
+ anchor != null && hasTooltip && /* @__PURE__ */ jsx6(Tooltip, {
3478
3273
  anchor,
3479
3274
  config: tooltip
3480
3275
  })
@@ -3483,12 +3278,12 @@ function Icon({
3483
3278
  }
3484
3279
 
3485
3280
  // src/devtools/browser/components/DomainChip.tsx
3486
- import { jsx as jsx9, jsxs as jsxs8, Fragment as Fragment5 } from "react/jsx-runtime";
3281
+ import { jsx as jsx7, jsxs as jsxs7, Fragment as Fragment4 } from "react/jsx-runtime";
3487
3282
  function DomainHierarchyContent({ allDomains }) {
3488
- return /* @__PURE__ */ jsx9(Fragment5, {
3283
+ return /* @__PURE__ */ jsx7(Fragment4, {
3489
3284
  children: allDomains.map((d, i) => {
3490
3285
  const isCurrent = i === allDomains.length - 1;
3491
- return /* @__PURE__ */ jsxs8("div", {
3286
+ return /* @__PURE__ */ jsxs7("div", {
3492
3287
  style: {
3493
3288
  display: "flex",
3494
3289
  alignItems: "center",
@@ -3497,22 +3292,22 @@ function DomainHierarchyContent({ allDomains }) {
3497
3292
  paddingTop: i > 0 ? "0.1rem" : undefined
3498
3293
  },
3499
3294
  children: [
3500
- /* @__PURE__ */ jsx9("span", {
3295
+ /* @__PURE__ */ jsx7("span", {
3501
3296
  style: {
3502
3297
  fontSize: "0.8rem",
3503
3298
  height: "0.6em",
3504
3299
  width: "0.6em",
3505
3300
  overflow: "hidden",
3506
- color: isCurrent ? DEVTOOL_COLOR_SEMANTIC_SYSTEM : "#3730a3",
3301
+ color: isCurrent ? DEVTOOL_COLOR_SEMANTIC_SYSTEM2 : "#3730a3",
3507
3302
  display: "flex",
3508
3303
  alignItems: "center",
3509
3304
  justifyContent: "center"
3510
3305
  },
3511
3306
  children: "⬢"
3512
3307
  }),
3513
- /* @__PURE__ */ jsx9("span", {
3308
+ /* @__PURE__ */ jsx7("span", {
3514
3309
  style: {
3515
- color: isCurrent ? DEVTOOL_COLOR_SEMANTIC_SYSTEM : "#4b5563",
3310
+ color: isCurrent ? DEVTOOL_COLOR_SEMANTIC_SYSTEM2 : "#4b5563",
3516
3311
  fontSize: "0.7rem",
3517
3312
  fontWeight: isCurrent ? 500 : undefined
3518
3313
  },
@@ -3531,11 +3326,11 @@ function DomainChip({
3531
3326
  size
3532
3327
  }) {
3533
3328
  if (compact) {
3534
- return /* @__PURE__ */ jsx9(Icon, {
3329
+ return /* @__PURE__ */ jsx7(Icon, {
3535
3330
  icon: Component,
3536
3331
  color: "domain" /* domain */,
3537
3332
  tooltip: {
3538
- content: /* @__PURE__ */ jsx9(DomainHierarchyContent, {
3333
+ content: /* @__PURE__ */ jsx7(DomainHierarchyContent, {
3539
3334
  allDomains
3540
3335
  }),
3541
3336
  title: "Action Domain",
@@ -3543,22 +3338,22 @@ function DomainChip({
3543
3338
  }
3544
3339
  });
3545
3340
  }
3546
- return /* @__PURE__ */ jsx9(Chip, {
3341
+ return /* @__PURE__ */ jsx7(Chip, {
3547
3342
  color: "domain" /* domain */,
3548
3343
  subtle,
3549
3344
  size,
3550
3345
  rounded: true,
3551
3346
  tooltip: {
3552
- content: /* @__PURE__ */ jsx9(DomainHierarchyContent, {
3347
+ content: /* @__PURE__ */ jsx7(DomainHierarchyContent, {
3553
3348
  allDomains
3554
3349
  }),
3555
3350
  title: "Action Domain",
3556
3351
  align: "edge"
3557
3352
  },
3558
- children: /* @__PURE__ */ jsxs8("div", {
3353
+ children: /* @__PURE__ */ jsxs7("div", {
3559
3354
  style: { display: "flex", alignItems: "center", gap: "0.4em" },
3560
3355
  children: [
3561
- /* @__PURE__ */ jsx9("span", {
3356
+ /* @__PURE__ */ jsx7("span", {
3562
3357
  style: {
3563
3358
  height: "1.2em",
3564
3359
  width: "1.2em",
@@ -3566,12 +3361,12 @@ function DomainChip({
3566
3361
  alignItems: "center",
3567
3362
  justifyContent: "center"
3568
3363
  },
3569
- children: /* @__PURE__ */ jsx9(Component, {
3364
+ children: /* @__PURE__ */ jsx7(Component, {
3570
3365
  height: "1.2em",
3571
3366
  width: "1.2em"
3572
3367
  })
3573
3368
  }),
3574
- /* @__PURE__ */ jsx9("span", {
3369
+ /* @__PURE__ */ jsx7("span", {
3575
3370
  children: domain
3576
3371
  })
3577
3372
  ]
@@ -3580,7 +3375,7 @@ function DomainChip({
3580
3375
  }
3581
3376
 
3582
3377
  // src/devtools/browser/components/HandlerChips.tsx
3583
- import { jsx as jsx10, jsxs as jsxs9, Fragment as Fragment6 } from "react/jsx-runtime";
3378
+ import { jsx as jsx8, jsxs as jsxs8, Fragment as Fragment5 } from "react/jsx-runtime";
3584
3379
  function getExternalLabel(hop) {
3585
3380
  if (hop.handlerType !== "external")
3586
3381
  return null;
@@ -3595,16 +3390,16 @@ function getTransportTooltipForHops(hops) {
3595
3390
  return;
3596
3391
  return {
3597
3392
  title: "Transport",
3598
- content: /* @__PURE__ */ jsx10("div", {
3393
+ content: /* @__PURE__ */ jsx8("div", {
3599
3394
  style: { display: "flex", flexDirection: "column", gap: "6px", fontSize: "11px" },
3600
- children: lines.map((line) => /* @__PURE__ */ jsxs9("div", {
3395
+ children: lines.map((line) => /* @__PURE__ */ jsxs8("div", {
3601
3396
  style: { display: "flex", flexDirection: "column", gap: "2px" },
3602
3397
  children: [
3603
- line.summary != null && /* @__PURE__ */ jsx10("span", {
3398
+ line.summary != null && /* @__PURE__ */ jsx8("span", {
3604
3399
  children: line.summary
3605
3400
  }),
3606
- line.url != null && line.url !== line.summary && /* @__PURE__ */ jsx10("span", {
3607
- style: { color: DEVTOOL_COLOR_TEXT_MUTED, wordBreak: "break-all" },
3401
+ line.url != null && line.url !== line.summary && /* @__PURE__ */ jsx8("span", {
3402
+ style: { color: DEVTOOL_COLOR_TEXT_MUTED2, wordBreak: "break-all" },
3608
3403
  children: line.url
3609
3404
  })
3610
3405
  ]
@@ -3617,15 +3412,15 @@ function HandlerChips({ entry, size, subtle }) {
3617
3412
  const localEnvId = firstHop != null ? firstHop.runtime.envId : null;
3618
3413
  const externalLabel = firstHop != null ? getExternalLabel(firstHop) : null;
3619
3414
  const firstHopIsLocal = firstHop != null && firstHop.handlerType === "local";
3620
- return /* @__PURE__ */ jsxs9(Fragment6, {
3415
+ return /* @__PURE__ */ jsxs8(Fragment5, {
3621
3416
  children: [
3622
- localEnvId != null && (firstHopIsLocal || externalLabel == null) && /* @__PURE__ */ jsx10(Chip, {
3417
+ localEnvId != null && (firstHopIsLocal || externalLabel == null) && /* @__PURE__ */ jsx8(Chip, {
3623
3418
  color: "handler_local" /* handler_local */,
3624
3419
  size,
3625
3420
  subtle,
3626
3421
  children: localEnvId
3627
3422
  }),
3628
- externalLabel != null && /* @__PURE__ */ jsx10(Chip, {
3423
+ externalLabel != null && /* @__PURE__ */ jsx8(Chip, {
3629
3424
  color: "handler_external" /* handler_external */,
3630
3425
  size,
3631
3426
  subtle,
@@ -3637,15 +3432,62 @@ function HandlerChips({ entry, size, subtle }) {
3637
3432
  }
3638
3433
 
3639
3434
  // src/devtools/browser/components/RunningTimer.tsx
3640
- import { useEffect as useEffect2, useState as useState6 } from "react";
3641
- import { jsx as jsx11, jsxs as jsxs10, Fragment as Fragment7 } from "react/jsx-runtime";
3435
+ import { useEffect as useEffect2, useState as useState5 } from "react";
3436
+
3437
+ // src/devtools/browser/components/utils.ts
3438
+ import { Circle, CircleAlert, CircleCheck, CircleX, Loader2 } from "lucide-react";
3439
+ import { formatRelativeAge, formatTimestamp, safeStringify as safeStringify2 } from "nice-devtools-shared";
3440
+ var STATUS_COLOR = {
3441
+ running: DEVTOOL_COLOR_SEMANTIC_SYSTEM2,
3442
+ success: DEVTOOL_COLOR_SEMANTIC_SUCCESS2,
3443
+ "action-error": DEVTOOL_COLOR_SEMANTIC_WARNING2,
3444
+ failed: DEVTOOL_COLOR_SEMANTIC_ERROR2,
3445
+ aborted: DEVTOOL_COLOR_SEMANTIC_METADATA2
3446
+ };
3447
+ var STATUS_THING = {
3448
+ running: "running_action" /* running_action */,
3449
+ success: "success" /* success */,
3450
+ "action-error": "action_error" /* action_error */,
3451
+ failed: "failed" /* failed */,
3452
+ aborted: "aborted" /* aborted */
3453
+ };
3454
+ var STATUS_SYMBOL = {
3455
+ running: "●",
3456
+ success: "✓",
3457
+ "action-error": "!",
3458
+ failed: "✗",
3459
+ aborted: "○"
3460
+ };
3461
+ var STATUS_ICON = {
3462
+ running: Loader2,
3463
+ success: CircleCheck,
3464
+ "action-error": CircleAlert,
3465
+ failed: CircleX,
3466
+ aborted: Circle
3467
+ };
3468
+ function getInboundOrigin(entry) {
3469
+ const origin = entry.meta.originClient;
3470
+ if (origin == null || origin.envId === "unknown" || origin.envId === "_unset_")
3471
+ return null;
3472
+ const local = entry.meta.routing[0]?.runtime;
3473
+ if (local == null)
3474
+ return null;
3475
+ const sameRuntime = origin.envId === local.envId && (origin.perId ?? null) === (local.perId ?? null) && (origin.insId ?? null) === (local.insId ?? null);
3476
+ return sameRuntime ? null : origin;
3477
+ }
3478
+ function formatDuration(entry) {
3479
+ return entry.endTime != null ? `${entry.endTime - entry.startTime}ms` : null;
3480
+ }
3481
+
3482
+ // src/devtools/browser/components/RunningTimer.tsx
3483
+ import { jsx as jsx9, jsxs as jsxs9, Fragment as Fragment6 } from "react/jsx-runtime";
3642
3484
  function RunningTimer({ startTime }) {
3643
- const [elapsed, setElapsed] = useState6(() => Date.now() - startTime);
3485
+ const [elapsed, setElapsed] = useState5(() => Date.now() - startTime);
3644
3486
  useEffect2(() => {
3645
3487
  const interval = setInterval(() => setElapsed(Date.now() - startTime), 100);
3646
3488
  return () => clearInterval(interval);
3647
3489
  }, [startTime]);
3648
- return /* @__PURE__ */ jsxs10(Fragment7, {
3490
+ return /* @__PURE__ */ jsxs9(Fragment6, {
3649
3491
  children: [
3650
3492
  elapsed,
3651
3493
  "ms"
@@ -3654,15 +3496,15 @@ function RunningTimer({ startTime }) {
3654
3496
  }
3655
3497
  function DurationDisplay({ entry }) {
3656
3498
  const d = formatDuration(entry);
3657
- return /* @__PURE__ */ jsx11(Fragment7, {
3658
- children: d ?? /* @__PURE__ */ jsx11(RunningTimer, {
3499
+ return /* @__PURE__ */ jsx9(Fragment6, {
3500
+ children: d ?? /* @__PURE__ */ jsx9(RunningTimer, {
3659
3501
  startTime: entry.startTime
3660
3502
  })
3661
3503
  });
3662
3504
  }
3663
3505
 
3664
3506
  // src/devtools/browser/components/CallStackSection.tsx
3665
- import { jsx as jsx12, jsxs as jsxs11 } from "react/jsx-runtime";
3507
+ import { jsx as jsx10, jsxs as jsxs10 } from "react/jsx-runtime";
3666
3508
  function getCalledLabel(entry) {
3667
3509
  const firstHop = entry.meta.routing[0];
3668
3510
  if (firstHop == null)
@@ -3675,7 +3517,7 @@ function getCalledLabel(entry) {
3675
3517
  function getCalledColor(entry) {
3676
3518
  const firstHop = entry.meta.routing[0];
3677
3519
  if (firstHop == null)
3678
- return DEVTOOL_COLOR_SEMANTIC_SYSTEM;
3520
+ return DEVTOOL_COLOR_SEMANTIC_SYSTEM2;
3679
3521
  if (firstHop.handlerType === "local")
3680
3522
  return DEVTOOL_COLOR_HANDLER_LOCAL_TEXT;
3681
3523
  return DEVTOOL_COLOR_HANDLER_EXTERNAL_TEXT;
@@ -3692,12 +3534,12 @@ function CallStackLink({
3692
3534
  const label = entryRole === "caller" ? "↑ from" : getCalledLabel(entry);
3693
3535
  const firstHop = entry.meta.routing[0];
3694
3536
  const transportTooltip = entryRole === "called" && firstHop != null ? getTransportTooltip(firstHop) : undefined;
3695
- return /* @__PURE__ */ jsxs11("div", {
3537
+ return /* @__PURE__ */ jsxs10("div", {
3696
3538
  onClick,
3697
3539
  style: {
3698
- background: isFocused ? DEVTOOL_SECTION_BACKGROUND : DEVTOOL_DETAIL_HEADER_BACKGROUND,
3540
+ background: isFocused ? DEVTOOL_SECTION_BACKGROUND2 : DEVTOOL_DETAIL_HEADER_BACKGROUND,
3699
3541
  borderBottom: `1px solid ${DEVTOOL_COLOR_CALL_STACK_DIVIDER}`,
3700
- borderLeft: isFocused ? `2px solid ${DEVTOOL_COLOR_SEMANTIC_SYSTEM}` : "2px solid transparent",
3542
+ borderLeft: isFocused ? `2px solid ${DEVTOOL_COLOR_SEMANTIC_SYSTEM2}` : "2px solid transparent",
3701
3543
  padding: "5px 12px 5px 10px",
3702
3544
  display: "grid",
3703
3545
  gridTemplateColumns: "1fr 1fr",
@@ -3706,25 +3548,25 @@ function CallStackLink({
3706
3548
  cursor: "pointer"
3707
3549
  },
3708
3550
  children: [
3709
- /* @__PURE__ */ jsxs11("span", {
3551
+ /* @__PURE__ */ jsxs10("span", {
3710
3552
  style: { display: "flex", alignItems: "center", gap: "1em", flexShrink: 0 },
3711
3553
  children: [
3712
- /* @__PURE__ */ jsx12("span", {
3554
+ /* @__PURE__ */ jsx10("span", {
3713
3555
  style: { color, fontSize: "10px", flexShrink: 0 },
3714
3556
  children: symbol
3715
3557
  }),
3716
- /* @__PURE__ */ jsx12(HoverTooltip, {
3558
+ /* @__PURE__ */ jsx10(HoverTooltip, {
3717
3559
  config: transportTooltip,
3718
3560
  style: { flexShrink: 0, display: "flex" },
3719
- children: /* @__PURE__ */ jsx12("span", {
3561
+ children: /* @__PURE__ */ jsx10("span", {
3720
3562
  style: { color: labelColor, fontSize: "9px" },
3721
3563
  children: label
3722
3564
  })
3723
3565
  }),
3724
- /* @__PURE__ */ jsxs11("span", {
3566
+ /* @__PURE__ */ jsxs10("span", {
3725
3567
  style: { display: "flex", alignItems: "center", gap: "5px" },
3726
3568
  children: [
3727
- /* @__PURE__ */ jsx12("span", {
3569
+ /* @__PURE__ */ jsx10("span", {
3728
3570
  style: {
3729
3571
  color: DEVTOOL_COLOR_TEXT_SECONDARY,
3730
3572
  fontSize: "11px",
@@ -3734,7 +3576,7 @@ function CallStackLink({
3734
3576
  },
3735
3577
  children: entry.actionId
3736
3578
  }),
3737
- /* @__PURE__ */ jsx12(DomainChip, {
3579
+ /* @__PURE__ */ jsx10(DomainChip, {
3738
3580
  domain: entry.domain,
3739
3581
  allDomains: entry.allDomains,
3740
3582
  size: "sm" /* sm */
@@ -3743,14 +3585,14 @@ function CallStackLink({
3743
3585
  })
3744
3586
  ]
3745
3587
  }),
3746
- /* @__PURE__ */ jsx12("span", {
3588
+ /* @__PURE__ */ jsx10("span", {
3747
3589
  style: {
3748
- color: DEVTOOL_COLOR_TEXT_FAINT,
3590
+ color: DEVTOOL_COLOR_TEXT_FAINT2,
3749
3591
  fontSize: "10px",
3750
3592
  textAlign: "right",
3751
3593
  whiteSpace: "nowrap"
3752
3594
  },
3753
- children: /* @__PURE__ */ jsx12(DurationDisplay, {
3595
+ children: /* @__PURE__ */ jsx10(DurationDisplay, {
3754
3596
  entry
3755
3597
  })
3756
3598
  })
@@ -3766,15 +3608,15 @@ function CallStackSection({
3766
3608
  }) {
3767
3609
  if (parent == null && childEntries.length === 0)
3768
3610
  return null;
3769
- return /* @__PURE__ */ jsxs11("div", {
3611
+ return /* @__PURE__ */ jsxs10("div", {
3770
3612
  children: [
3771
- parent != null && /* @__PURE__ */ jsx12(CallStackLink, {
3613
+ parent != null && /* @__PURE__ */ jsx10(CallStackLink, {
3772
3614
  entry: parent,
3773
3615
  entryRole: "caller",
3774
3616
  isFocused: false,
3775
3617
  onClick: () => onSelectParent(parent.cuid)
3776
3618
  }),
3777
- childEntries.map((child) => /* @__PURE__ */ jsx12(CallStackLink, {
3619
+ childEntries.map((child) => /* @__PURE__ */ jsx10(CallStackLink, {
3778
3620
  entry: child,
3779
3621
  entryRole: "called",
3780
3622
  isFocused: focusedChildCuid === child.cuid,
@@ -3785,7 +3627,7 @@ function CallStackSection({
3785
3627
  }
3786
3628
 
3787
3629
  // src/devtools/browser/components/ChildDispatchChips.tsx
3788
- import { jsx as jsx13 } from "react/jsx-runtime";
3630
+ import { jsx as jsx11 } from "react/jsx-runtime";
3789
3631
  function ChildDispatchChips({
3790
3632
  childRouteItems,
3791
3633
  size = "sm" /* sm */
@@ -3806,12 +3648,12 @@ function ChildDispatchChips({
3806
3648
  group.transports.push(transport);
3807
3649
  }
3808
3650
  }
3809
- return /* @__PURE__ */ jsx13("div", {
3651
+ return /* @__PURE__ */ jsx11("div", {
3810
3652
  style: { display: "flex", alignItems: "center", gap: "4px", flexWrap: "wrap" },
3811
3653
  children: Array.from(groups.values()).map((group) => {
3812
3654
  const transportStr = group.transports.length > 0 ? group.transports.join(", ") : "ext";
3813
3655
  const label = group.hasClient ? `${transportStr} → ${group.runtimeId}` : `→ ${transportStr}`;
3814
- return /* @__PURE__ */ jsx13(Chip, {
3656
+ return /* @__PURE__ */ jsx11(Chip, {
3815
3657
  color: "handler_external" /* handler_external */,
3816
3658
  size,
3817
3659
  tooltip: getTransportTooltipForHops(group.hops),
@@ -3822,20 +3664,20 @@ function ChildDispatchChips({
3822
3664
  }
3823
3665
 
3824
3666
  // src/devtools/browser/components/MetaSection.tsx
3825
- import { useState as useState7 } from "react";
3826
- import { jsx as jsx14, jsxs as jsxs12 } from "react/jsx-runtime";
3667
+ import { useState as useState6 } from "react";
3668
+ import { jsx as jsx12, jsxs as jsxs11 } from "react/jsx-runtime";
3827
3669
  function MetaChip({ label, value }) {
3828
- return /* @__PURE__ */ jsxs12("span", {
3670
+ return /* @__PURE__ */ jsxs11("span", {
3829
3671
  style: { whiteSpace: "nowrap" },
3830
3672
  children: [
3831
- /* @__PURE__ */ jsxs12("span", {
3832
- style: { color: DEVTOOL_COLOR_TEXT_MUTED },
3673
+ /* @__PURE__ */ jsxs11("span", {
3674
+ style: { color: DEVTOOL_COLOR_TEXT_MUTED2 },
3833
3675
  children: [
3834
3676
  label,
3835
3677
  " "
3836
3678
  ]
3837
3679
  }),
3838
- /* @__PURE__ */ jsx14("span", {
3680
+ /* @__PURE__ */ jsx12("span", {
3839
3681
  style: { color: DEVTOOL_COLOR_TEXT_SECONDARY },
3840
3682
  children: value
3841
3683
  })
@@ -3843,7 +3685,7 @@ function MetaChip({ label, value }) {
3843
3685
  });
3844
3686
  }
3845
3687
  function MetaSection({ entry }) {
3846
- const [expanded, setExpanded] = useState7(false);
3688
+ const [expanded, setExpanded] = useState6(false);
3847
3689
  const { meta, cuid } = entry;
3848
3690
  const expandedRows = [
3849
3691
  { label: "cuid", value: cuid },
@@ -3851,9 +3693,9 @@ function MetaSection({ entry }) {
3851
3693
  ...meta.originClient.perId != null ? [{ label: "perId", value: meta.originClient.perId }] : [],
3852
3694
  ...meta.originClient.insId != null ? [{ label: "insId", value: meta.originClient.insId }] : []
3853
3695
  ];
3854
- return /* @__PURE__ */ jsxs12("div", {
3696
+ return /* @__PURE__ */ jsxs11("div", {
3855
3697
  children: [
3856
- /* @__PURE__ */ jsxs12("div", {
3698
+ /* @__PURE__ */ jsxs11("div", {
3857
3699
  style: {
3858
3700
  display: "flex",
3859
3701
  alignItems: "center",
@@ -3861,30 +3703,30 @@ function MetaSection({ entry }) {
3861
3703
  marginBottom: "3px"
3862
3704
  },
3863
3705
  children: [
3864
- /* @__PURE__ */ jsx14("div", {
3706
+ /* @__PURE__ */ jsx12("div", {
3865
3707
  style: {
3866
- color: DEVTOOL_COLOR_SEMANTIC_SYSTEM,
3708
+ color: DEVTOOL_COLOR_SEMANTIC_SYSTEM2,
3867
3709
  fontSize: "10px",
3868
3710
  textTransform: "uppercase",
3869
3711
  letterSpacing: "0.05em"
3870
3712
  },
3871
3713
  children: "Meta"
3872
3714
  }),
3873
- /* @__PURE__ */ jsx14("span", {
3874
- style: { color: DEVTOOL_COLOR_TEXT_FAINT, fontSize: "11px" },
3715
+ /* @__PURE__ */ jsx12("span", {
3716
+ style: { color: DEVTOOL_COLOR_TEXT_FAINT2, fontSize: "11px" },
3875
3717
  children: expanded ? "▾" : "▸"
3876
3718
  })
3877
3719
  ]
3878
3720
  }),
3879
- expanded ? /* @__PURE__ */ jsx14("div", {
3721
+ expanded ? /* @__PURE__ */ jsx12("div", {
3880
3722
  onClick: () => setExpanded(false),
3881
3723
  style: {
3882
- background: DEVTOOL_SECTION_BACKGROUND,
3724
+ background: DEVTOOL_SECTION_BACKGROUND2,
3883
3725
  borderRadius: "4px",
3884
3726
  overflow: "hidden",
3885
3727
  cursor: "pointer"
3886
3728
  },
3887
- children: expandedRows.map(({ label, value }, i) => /* @__PURE__ */ jsxs12("div", {
3729
+ children: expandedRows.map(({ label, value }, i) => /* @__PURE__ */ jsxs11("div", {
3888
3730
  style: {
3889
3731
  display: "grid",
3890
3732
  gridTemplateColumns: "52px 1fr",
@@ -3894,16 +3736,16 @@ function MetaSection({ entry }) {
3894
3736
  alignItems: "start"
3895
3737
  },
3896
3738
  children: [
3897
- /* @__PURE__ */ jsx14("span", {
3739
+ /* @__PURE__ */ jsx12("span", {
3898
3740
  style: {
3899
3741
  textAlign: "left",
3900
- color: DEVTOOL_COLOR_TEXT_MUTED,
3742
+ color: DEVTOOL_COLOR_TEXT_MUTED2,
3901
3743
  fontSize: "10px",
3902
3744
  paddingTop: "1px"
3903
3745
  },
3904
3746
  children: label
3905
3747
  }),
3906
- /* @__PURE__ */ jsx14("span", {
3748
+ /* @__PURE__ */ jsx12("span", {
3907
3749
  style: {
3908
3750
  textAlign: "left",
3909
3751
  color: DEVTOOL_COLOR_TEXT_SECONDARY,
@@ -3914,10 +3756,10 @@ function MetaSection({ entry }) {
3914
3756
  })
3915
3757
  ]
3916
3758
  }, label))
3917
- }) : /* @__PURE__ */ jsxs12("div", {
3759
+ }) : /* @__PURE__ */ jsxs11("div", {
3918
3760
  onClick: () => setExpanded(true),
3919
3761
  style: {
3920
- background: DEVTOOL_SECTION_BACKGROUND,
3762
+ background: DEVTOOL_SECTION_BACKGROUND2,
3921
3763
  borderRadius: "4px",
3922
3764
  padding: "5px 8px",
3923
3765
  fontSize: "11px",
@@ -3928,19 +3770,19 @@ function MetaSection({ entry }) {
3928
3770
  cursor: "pointer"
3929
3771
  },
3930
3772
  children: [
3931
- /* @__PURE__ */ jsx14(MetaChip, {
3773
+ /* @__PURE__ */ jsx12(MetaChip, {
3932
3774
  label: "cuid",
3933
3775
  value: `…${cuid.slice(-8)}`
3934
3776
  }),
3935
- /* @__PURE__ */ jsx14(MetaChip, {
3777
+ /* @__PURE__ */ jsx12(MetaChip, {
3936
3778
  label: "runtime",
3937
3779
  value: meta.originClient.envId
3938
3780
  }),
3939
- meta.originClient.perId != null && /* @__PURE__ */ jsx14(MetaChip, {
3781
+ meta.originClient.perId != null && /* @__PURE__ */ jsx12(MetaChip, {
3940
3782
  label: "perId",
3941
3783
  value: meta.originClient.perId.length > 10 ? `${meta.originClient.perId.slice(0, 10)}…` : meta.originClient.perId
3942
3784
  }),
3943
- meta.originClient.insId != null && /* @__PURE__ */ jsx14(MetaChip, {
3785
+ meta.originClient.insId != null && /* @__PURE__ */ jsx12(MetaChip, {
3944
3786
  label: "insId",
3945
3787
  value: meta.originClient.insId.length > 10 ? `${meta.originClient.insId.slice(0, 10)}…` : meta.originClient.insId
3946
3788
  })
@@ -3951,34 +3793,34 @@ function MetaSection({ entry }) {
3951
3793
  }
3952
3794
 
3953
3795
  // src/devtools/browser/components/OriginChip.tsx
3954
- import { jsx as jsx15, jsxs as jsxs13 } from "react/jsx-runtime";
3796
+ import { jsx as jsx13, jsxs as jsxs12 } from "react/jsx-runtime";
3955
3797
  function OriginChip({
3956
3798
  origin,
3957
3799
  size = "md" /* md */,
3958
3800
  subtle
3959
3801
  }) {
3960
- return /* @__PURE__ */ jsx15(Chip, {
3802
+ return /* @__PURE__ */ jsx13(Chip, {
3961
3803
  color: "origin" /* origin */,
3962
3804
  size,
3963
3805
  subtle,
3964
3806
  tooltip: {
3965
3807
  title: "Received from",
3966
- content: /* @__PURE__ */ jsxs13("div", {
3808
+ content: /* @__PURE__ */ jsxs12("div", {
3967
3809
  style: { display: "flex", flexDirection: "column", gap: "2px", fontSize: "11px" },
3968
3810
  children: [
3969
- /* @__PURE__ */ jsxs13("span", {
3811
+ /* @__PURE__ */ jsxs12("span", {
3970
3812
  children: [
3971
3813
  "env ",
3972
3814
  origin.envId
3973
3815
  ]
3974
3816
  }),
3975
- origin.perId != null && /* @__PURE__ */ jsxs13("span", {
3817
+ origin.perId != null && /* @__PURE__ */ jsxs12("span", {
3976
3818
  children: [
3977
3819
  "perId ",
3978
3820
  origin.perId
3979
3821
  ]
3980
3822
  }),
3981
- origin.insId != null && /* @__PURE__ */ jsxs13("span", {
3823
+ origin.insId != null && /* @__PURE__ */ jsxs12("span", {
3982
3824
  children: [
3983
3825
  "insId ",
3984
3826
  origin.insId
@@ -3992,7 +3834,7 @@ function OriginChip({
3992
3834
  }
3993
3835
 
3994
3836
  // src/devtools/browser/components/RoutingSection.tsx
3995
- import { jsx as jsx16, jsxs as jsxs14 } from "react/jsx-runtime";
3837
+ import { jsx as jsx14, jsxs as jsxs13 } from "react/jsx-runtime";
3996
3838
  function RoutingSection({
3997
3839
  entry,
3998
3840
  minHopCount = 0
@@ -4002,24 +3844,24 @@ function RoutingSection({
4002
3844
  const phantomCount = Math.max(0, minHopCount - hopCount);
4003
3845
  if (hopCount === 0 && phantomCount === 0)
4004
3846
  return null;
4005
- return /* @__PURE__ */ jsxs14("div", {
3847
+ return /* @__PURE__ */ jsxs13("div", {
4006
3848
  children: [
4007
- /* @__PURE__ */ jsx16(SectionLabel, {
3849
+ /* @__PURE__ */ jsx14(SectionLabel, {
4008
3850
  label: hopCount > 0 ? `Routing · ${hopCount} hop${hopCount !== 1 ? "s" : ""}` : "Routing"
4009
3851
  }),
4010
- /* @__PURE__ */ jsxs14("div", {
3852
+ /* @__PURE__ */ jsxs13("div", {
4011
3853
  style: { display: "flex", flexDirection: "column", gap: "2px" },
4012
3854
  children: [
4013
3855
  meta.routing.map((hop, i) => {
4014
3856
  const isLocal = hop.handlerType === "local";
4015
3857
  const isLast = i === hopCount - 1 && phantomCount === 0;
4016
- const badgeColor = isLocal ? DEVTOOL_COLOR_SEMANTIC_SUCCESS : DEVTOOL_COLOR_SEMANTIC_WARNING;
3858
+ const badgeColor = isLocal ? DEVTOOL_COLOR_SEMANTIC_SUCCESS2 : DEVTOOL_COLOR_SEMANTIC_WARNING2;
4017
3859
  const badgeText = isLocal ? "● exec" : `→ ${hop.transportSummary ?? hop.transport ?? "ext"}`;
4018
3860
  const transportTooltip = isLocal ? undefined : getTransportTooltip(hop);
4019
3861
  const runtimeTitle = [hop.runtime.perId, hop.runtime.insId].filter(Boolean).join(" · ") || undefined;
4020
- return /* @__PURE__ */ jsxs14("div", {
3862
+ return /* @__PURE__ */ jsxs13("div", {
4021
3863
  style: {
4022
- background: DEVTOOL_SECTION_BACKGROUND,
3864
+ background: DEVTOOL_SECTION_BACKGROUND2,
4023
3865
  borderRadius: "4px",
4024
3866
  overflow: "hidden",
4025
3867
  display: "grid",
@@ -4030,19 +3872,19 @@ function RoutingSection({
4030
3872
  padding: "4px 8px"
4031
3873
  },
4032
3874
  children: [
4033
- /* @__PURE__ */ jsxs14("span", {
3875
+ /* @__PURE__ */ jsxs13("span", {
4034
3876
  style: { display: "flex", flexDirection: "row", alignItems: "center", gap: "10px" },
4035
3877
  children: [
4036
- /* @__PURE__ */ jsx16("span", {
3878
+ /* @__PURE__ */ jsx14("span", {
4037
3879
  style: {
4038
- color: DEVTOOL_COLOR_TEXT_FAINT,
3880
+ color: DEVTOOL_COLOR_TEXT_FAINT2,
4039
3881
  fontSize: "10px",
4040
3882
  width: "16px",
4041
3883
  textAlign: "right"
4042
3884
  },
4043
3885
  children: i + 1
4044
3886
  }),
4045
- /* @__PURE__ */ jsx16("span", {
3887
+ /* @__PURE__ */ jsx14("span", {
4046
3888
  title: runtimeTitle,
4047
3889
  style: {
4048
3890
  color: DEVTOOL_COLOR_TEXT_SECONDARY,
@@ -4056,10 +3898,10 @@ function RoutingSection({
4056
3898
  })
4057
3899
  ]
4058
3900
  }),
4059
- /* @__PURE__ */ jsx16(HoverTooltip, {
3901
+ /* @__PURE__ */ jsx14(HoverTooltip, {
4060
3902
  config: transportTooltip,
4061
3903
  style: { display: "block", minWidth: 0, overflow: "hidden" },
4062
- children: /* @__PURE__ */ jsx16("span", {
3904
+ children: /* @__PURE__ */ jsx14("span", {
4063
3905
  style: {
4064
3906
  color: badgeColor,
4065
3907
  fontSize: "10px",
@@ -4071,7 +3913,7 @@ function RoutingSection({
4071
3913
  children: badgeText
4072
3914
  })
4073
3915
  }),
4074
- /* @__PURE__ */ jsxs14("span", {
3916
+ /* @__PURE__ */ jsxs13("span", {
4075
3917
  style: {
4076
3918
  display: "flex",
4077
3919
  alignItems: "center",
@@ -4080,9 +3922,9 @@ function RoutingSection({
4080
3922
  overflow: "hidden"
4081
3923
  },
4082
3924
  children: [
4083
- /* @__PURE__ */ jsx16("span", {
3925
+ /* @__PURE__ */ jsx14("span", {
4084
3926
  style: {
4085
- color: DEVTOOL_COLOR_TEXT_MUTED,
3927
+ color: DEVTOOL_COLOR_TEXT_MUTED2,
4086
3928
  fontSize: "10px",
4087
3929
  whiteSpace: "nowrap",
4088
3930
  overflow: "hidden",
@@ -4090,9 +3932,9 @@ function RoutingSection({
4090
3932
  },
4091
3933
  children: hop.handlerClient != null ? `↳ ${hop.handlerClient.envId}` : ""
4092
3934
  }),
4093
- /* @__PURE__ */ jsxs14("span", {
3935
+ /* @__PURE__ */ jsxs13("span", {
4094
3936
  style: {
4095
- color: DEVTOOL_COLOR_TEXT_FAINT,
3937
+ color: DEVTOOL_COLOR_TEXT_FAINT2,
4096
3938
  fontSize: "10px",
4097
3939
  flexShrink: 0,
4098
3940
  marginLeft: "auto"
@@ -4108,11 +3950,11 @@ function RoutingSection({
4108
3950
  ]
4109
3951
  }, `${hop.time}-${hop.runtime.envId}`);
4110
3952
  }),
4111
- Array.from({ length: phantomCount }, (_, i) => `routing-phantom-${hopCount + i}`).map((key) => /* @__PURE__ */ jsxs14("div", {
3953
+ Array.from({ length: phantomCount }, (_, i) => `routing-phantom-${hopCount + i}`).map((key) => /* @__PURE__ */ jsxs13("div", {
4112
3954
  "aria-hidden": "true",
4113
3955
  style: {
4114
3956
  visibility: "hidden",
4115
- background: DEVTOOL_SECTION_BACKGROUND,
3957
+ background: DEVTOOL_SECTION_BACKGROUND2,
4116
3958
  borderRadius: "4px",
4117
3959
  display: "grid",
4118
3960
  gridTemplateColumns: "30% 1fr 30%",
@@ -4121,24 +3963,24 @@ function RoutingSection({
4121
3963
  padding: "4px 8px"
4122
3964
  },
4123
3965
  children: [
4124
- /* @__PURE__ */ jsxs14("span", {
3966
+ /* @__PURE__ */ jsxs13("span", {
4125
3967
  style: { display: "flex", flexDirection: "row", alignItems: "center", gap: "10px" },
4126
3968
  children: [
4127
- /* @__PURE__ */ jsx16("span", {
3969
+ /* @__PURE__ */ jsx14("span", {
4128
3970
  style: { fontSize: "10px", width: "16px" },
4129
3971
  children: "0"
4130
3972
  }),
4131
- /* @__PURE__ */ jsx16("span", {
3973
+ /* @__PURE__ */ jsx14("span", {
4132
3974
  style: { fontSize: "11px" },
4133
3975
  children: "placeholder"
4134
3976
  })
4135
3977
  ]
4136
3978
  }),
4137
- /* @__PURE__ */ jsx16("span", {
3979
+ /* @__PURE__ */ jsx14("span", {
4138
3980
  style: { fontSize: "10px" },
4139
3981
  children: "placeholder"
4140
3982
  }),
4141
- /* @__PURE__ */ jsx16("span", {})
3983
+ /* @__PURE__ */ jsx14("span", {})
4142
3984
  ]
4143
3985
  }, key))
4144
3986
  ]
@@ -4148,7 +3990,7 @@ function RoutingSection({
4148
3990
  }
4149
3991
 
4150
3992
  // src/devtools/browser/components/action_detail/ActionDetailPanel.tsx
4151
- import { jsx as jsx17, jsxs as jsxs15 } from "react/jsx-runtime";
3993
+ import { jsx as jsx15, jsxs as jsxs14 } from "react/jsx-runtime";
4152
3994
  var STATUS_BADGE_LABEL = {
4153
3995
  running: "RUNNING",
4154
3996
  success: "SUCCESS",
@@ -4159,9 +4001,9 @@ var STATUS_BADGE_LABEL = {
4159
4001
  var STATUS_BADGE_BG = {
4160
4002
  running: STATUS_COLOR.running,
4161
4003
  success: STATUS_COLOR.success,
4162
- "action-error": DEVTOOL_COLOR_SEMANTIC_ERROR,
4163
- failed: DEVTOOL_COLOR_SEMANTIC_ERROR,
4164
- aborted: DEVTOOL_COLOR_SEMANTIC_METADATA
4004
+ "action-error": DEVTOOL_COLOR_SEMANTIC_ERROR2,
4005
+ failed: DEVTOOL_COLOR_SEMANTIC_ERROR2,
4006
+ aborted: DEVTOOL_COLOR_SEMANTIC_METADATA2
4165
4007
  };
4166
4008
  var STATUS_BADGE_TEXT_COLOR = {
4167
4009
  running: "#0f172a",
@@ -4180,11 +4022,11 @@ function DetailHeader({
4180
4022
  const StatusIconComponent = STATUS_ICON[entry.status];
4181
4023
  const timestamp = formatTimestamp(entry.startTime);
4182
4024
  const inboundOrigin = getInboundOrigin(entry);
4183
- return /* @__PURE__ */ jsx17("div", {
4025
+ return /* @__PURE__ */ jsx15("div", {
4184
4026
  onClick: !isActive ? onClick : undefined,
4185
4027
  style: {
4186
4028
  padding: "0.5em 1em",
4187
- background: isActive ? DEVTOOL_SECTION_BACKGROUND : DEVTOOL_DETAIL_HEADER_BACKGROUND,
4029
+ background: isActive ? DEVTOOL_SECTION_BACKGROUND2 : DEVTOOL_DETAIL_HEADER_BACKGROUND,
4188
4030
  borderBottom: `1px solid ${DEVTOOL_LIST_BASE_BACKGROUND}`,
4189
4031
  borderLeft: isActive ? `2px solid ${color}` : "2px solid transparent",
4190
4032
  flexShrink: 0,
@@ -4194,13 +4036,13 @@ function DetailHeader({
4194
4036
  gap: "1em",
4195
4037
  cursor: isActive ? "default" : "pointer"
4196
4038
  },
4197
- children: /* @__PURE__ */ jsxs15("div", {
4039
+ children: /* @__PURE__ */ jsxs14("div", {
4198
4040
  style: { flex: 1, minWidth: 0, display: "flex", flexDirection: "column", gap: "0.5em" },
4199
4041
  children: [
4200
- /* @__PURE__ */ jsxs15("div", {
4042
+ /* @__PURE__ */ jsxs14("div", {
4201
4043
  style: { display: "flex", alignItems: "center", minWidth: 0, gap: "0.5em" },
4202
4044
  children: [
4203
- /* @__PURE__ */ jsx17("span", {
4045
+ /* @__PURE__ */ jsx15("span", {
4204
4046
  style: {
4205
4047
  color,
4206
4048
  flexShrink: 0,
@@ -4208,12 +4050,12 @@ function DetailHeader({
4208
4050
  alignItems: "center",
4209
4051
  animation: entry.status === "running" ? "__nice-action-pulse 1.2s ease-in-out infinite" : undefined
4210
4052
  },
4211
- children: /* @__PURE__ */ jsx17(StatusIconComponent, {
4053
+ children: /* @__PURE__ */ jsx15(StatusIconComponent, {
4212
4054
  size: 20,
4213
4055
  strokeWidth: 1.75
4214
4056
  })
4215
4057
  }),
4216
- /* @__PURE__ */ jsx17("span", {
4058
+ /* @__PURE__ */ jsx15("span", {
4217
4059
  style: {
4218
4060
  color: DEVTOOL_COLOR_TEXT_EMPHASIS,
4219
4061
  fontSize: "1.2em",
@@ -4227,7 +4069,7 @@ function DetailHeader({
4227
4069
  },
4228
4070
  children: entry.actionId
4229
4071
  }),
4230
- /* @__PURE__ */ jsx17("span", {
4072
+ /* @__PURE__ */ jsx15("span", {
4231
4073
  style: {
4232
4074
  flexShrink: 0,
4233
4075
  padding: "2px 9px",
@@ -4242,14 +4084,14 @@ function DetailHeader({
4242
4084
  },
4243
4085
  children: STATUS_BADGE_LABEL[entry.status]
4244
4086
  }),
4245
- /* @__PURE__ */ jsx17(DomainChip, {
4087
+ /* @__PURE__ */ jsx15(DomainChip, {
4246
4088
  domain: entry.domain,
4247
4089
  allDomains: entry.allDomains,
4248
4090
  size: "md" /* md */
4249
4091
  })
4250
4092
  ]
4251
4093
  }),
4252
- /* @__PURE__ */ jsxs15("div", {
4094
+ /* @__PURE__ */ jsxs14("div", {
4253
4095
  style: {
4254
4096
  display: "flex",
4255
4097
  alignItems: "center",
@@ -4257,7 +4099,7 @@ function DetailHeader({
4257
4099
  gap: "8px"
4258
4100
  },
4259
4101
  children: [
4260
- /* @__PURE__ */ jsxs15("div", {
4102
+ /* @__PURE__ */ jsxs14("div", {
4261
4103
  style: {
4262
4104
  display: "flex",
4263
4105
  alignItems: "center",
@@ -4266,35 +4108,35 @@ function DetailHeader({
4266
4108
  overflow: "hidden"
4267
4109
  },
4268
4110
  children: [
4269
- inboundOrigin != null && /* @__PURE__ */ jsx17(OriginChip, {
4111
+ inboundOrigin != null && /* @__PURE__ */ jsx15(OriginChip, {
4270
4112
  origin: inboundOrigin,
4271
4113
  size: "md" /* md */
4272
4114
  }),
4273
- /* @__PURE__ */ jsx17(HandlerChips, {
4115
+ /* @__PURE__ */ jsx15(HandlerChips, {
4274
4116
  entry,
4275
4117
  size: "md" /* md */
4276
4118
  }),
4277
- /* @__PURE__ */ jsx17(ChildDispatchChips, {
4119
+ /* @__PURE__ */ jsx15(ChildDispatchChips, {
4278
4120
  childRouteItems: childExternalRouteItems,
4279
4121
  size: "md" /* md */
4280
4122
  })
4281
4123
  ]
4282
4124
  }),
4283
- /* @__PURE__ */ jsxs15("div", {
4125
+ /* @__PURE__ */ jsxs14("div", {
4284
4126
  style: { display: "flex", alignItems: "center", gap: "8px", flexShrink: 0 },
4285
4127
  children: [
4286
- /* @__PURE__ */ jsx17("span", {
4128
+ /* @__PURE__ */ jsx15("span", {
4287
4129
  style: {
4288
- color: DEVTOOL_COLOR_SEMANTIC_METADATA,
4130
+ color: DEVTOOL_COLOR_SEMANTIC_METADATA2,
4289
4131
  fontSize: "10px",
4290
4132
  letterSpacing: "0.02em",
4291
4133
  fontFamily: "ui-sans-serif, system-ui, sans-serif"
4292
4134
  },
4293
4135
  children: timestamp
4294
4136
  }),
4295
- /* @__PURE__ */ jsx17("span", {
4137
+ /* @__PURE__ */ jsx15("span", {
4296
4138
  style: { color, fontSize: "12px", fontWeight: "500" },
4297
- children: /* @__PURE__ */ jsx17(DurationDisplay, {
4139
+ children: /* @__PURE__ */ jsx15(DurationDisplay, {
4298
4140
  entry
4299
4141
  })
4300
4142
  })
@@ -4312,7 +4154,7 @@ function ActionDetailPanel({
4312
4154
  childEntries,
4313
4155
  onSelectEntry
4314
4156
  }) {
4315
- const [focusedChildCuid, setFocusedChildCuid] = useState8(null);
4157
+ const [focusedChildCuid, setFocusedChildCuid] = useState7(null);
4316
4158
  const focusedEntry = focusedChildCuid != null ? childEntries.find((e) => e.cuid === focusedChildCuid) ?? entry : entry;
4317
4159
  const maxRoutingHops = Math.max(entry.meta.routing.length, ...childEntries.map((e) => e.meta.routing.length), 0);
4318
4160
  const maxCallSiteFrames = Math.max(countUserFrames(entry.meta.originClient, entry.callSite), ...childEntries.map((e) => countUserFrames(e.meta.originClient, e.callSite)), 0);
@@ -4334,7 +4176,7 @@ function ActionDetailPanel({
4334
4176
  const handleFocusChild = (cuid) => {
4335
4177
  setFocusedChildCuid((prev) => prev === cuid ? null : cuid);
4336
4178
  };
4337
- return /* @__PURE__ */ jsxs15("div", {
4179
+ return /* @__PURE__ */ jsxs14("div", {
4338
4180
  style: {
4339
4181
  flex: 1,
4340
4182
  display: "flex",
@@ -4344,20 +4186,20 @@ function ActionDetailPanel({
4344
4186
  background: DEVTOOL_DETAIL_BASE_BACKGROUND
4345
4187
  },
4346
4188
  children: [
4347
- /* @__PURE__ */ jsx17(DetailHeader, {
4189
+ /* @__PURE__ */ jsx15(DetailHeader, {
4348
4190
  entry,
4349
4191
  isActive: focusedChildCuid === null,
4350
4192
  onClick: () => setFocusedChildCuid(null),
4351
4193
  childExternalRouteItems
4352
4194
  }),
4353
- /* @__PURE__ */ jsx17(CallStackSection, {
4195
+ /* @__PURE__ */ jsx15(CallStackSection, {
4354
4196
  parent,
4355
4197
  childEntries,
4356
4198
  focusedChildCuid,
4357
4199
  onFocusChild: handleFocusChild,
4358
4200
  onSelectParent: onSelectEntry
4359
4201
  }),
4360
- /* @__PURE__ */ jsxs15("div", {
4202
+ /* @__PURE__ */ jsxs14("div", {
4361
4203
  style: {
4362
4204
  flex: 1,
4363
4205
  overflowY: "auto",
@@ -4368,37 +4210,37 @@ function ActionDetailPanel({
4368
4210
  gap: "8px"
4369
4211
  },
4370
4212
  children: [
4371
- focusedEntry.input !== undefined ? /* @__PURE__ */ jsx17(DetailSection, {
4213
+ focusedEntry.input !== undefined ? /* @__PURE__ */ jsx15(DetailSection, {
4372
4214
  label: "Input",
4373
4215
  value: focusedEntry.input
4374
- }) : /* @__PURE__ */ jsx17(DetailSection, {
4216
+ }) : /* @__PURE__ */ jsx15(DetailSection, {
4375
4217
  label: "Input",
4376
4218
  value: "No input required or given"
4377
4219
  }),
4378
- focusedEntry.status === "success" && /* @__PURE__ */ jsx17(DetailSection, {
4220
+ focusedEntry.status === "success" && /* @__PURE__ */ jsx15(DetailSection, {
4379
4221
  label: "Output",
4380
4222
  value: focusedEntry.output,
4381
- color: DEVTOOL_COLOR_SEMANTIC_SUCCESS
4223
+ color: DEVTOOL_COLOR_SEMANTIC_SUCCESS2
4382
4224
  }),
4383
- (focusedEntry.status === "action-error" || focusedEntry.status === "failed" || focusedEntry.status === "aborted") && /* @__PURE__ */ jsx17(ActionErrorDisplay, {
4225
+ (focusedEntry.status === "action-error" || focusedEntry.status === "failed" || focusedEntry.status === "aborted") && /* @__PURE__ */ jsx15(ActionErrorDisplay, {
4384
4226
  entry: focusedEntry
4385
4227
  }),
4386
- focusedEntry.progressUpdates.length > 0 && /* @__PURE__ */ jsx17(DetailSection, {
4228
+ focusedEntry.progressUpdates.length > 0 && /* @__PURE__ */ jsx15(DetailSection, {
4387
4229
  label: `Progress (${focusedEntry.progressUpdates.length})`,
4388
4230
  value: focusedEntry.progressUpdates
4389
4231
  }),
4390
- /* @__PURE__ */ jsx17(StackTraceSection, {
4232
+ /* @__PURE__ */ jsx15(StackTraceSection, {
4391
4233
  runtime: entry.meta.originClient,
4392
4234
  label: "Dispatch Site",
4393
4235
  stack: focusedEntry.callSite,
4394
4236
  color: DEVTOOL_COLOR_TEXT_SECONDARY,
4395
4237
  minFrameCount: maxCallSiteFrames
4396
4238
  }),
4397
- /* @__PURE__ */ jsx17(RoutingSection, {
4239
+ /* @__PURE__ */ jsx15(RoutingSection, {
4398
4240
  entry: focusedEntry,
4399
4241
  minHopCount: maxRoutingHops
4400
4242
  }),
4401
- /* @__PURE__ */ jsx17(MetaSection, {
4243
+ /* @__PURE__ */ jsx15(MetaSection, {
4402
4244
  entry: focusedEntry
4403
4245
  })
4404
4246
  ]
@@ -4408,66 +4250,20 @@ function ActionDetailPanel({
4408
4250
  }
4409
4251
 
4410
4252
  // src/devtools/browser/components/action_list/ActionList.tsx
4411
- import { useEffect as useEffect3, useMemo as useMemo2, useRef as useRef2 } from "react";
4253
+ import { DevtoolsVirtualList } from "nice-devtools-shared";
4254
+ import { useMemo as useMemo2, useRef as useRef2 } from "react";
4412
4255
 
4413
4256
  // src/devtools/browser/components/action_list/ActionEntryRow.tsx
4414
4257
  import { CircleX as CircleX3, PackageCheck as PackageCheck2, Variable as Variable2 } from "lucide-react";
4415
- import { Fragment as Fragment9, useState as useState10 } from "react";
4258
+ import { Fragment as Fragment7, useState as useState9 } from "react";
4416
4259
 
4417
4260
  // src/devtools/browser/components/action_list/ActionInputAndOutputChip.tsx
4418
4261
  import { CircleX as CircleX2, PackageCheck, Sparkle, Variable } from "lucide-react";
4419
- import { useState as useState9 } from "react";
4262
+ import { useState as useState8 } from "react";
4420
4263
 
4421
4264
  // src/devtools/browser/components/action_list/IoTooltipContent.tsx
4422
- import { jsx as jsx18, Fragment as Fragment8 } from "react/jsx-runtime";
4423
- var JSON_TOKEN_RE2 = /("(?:\\.|[^"\\])*")(\s*:)?|(-?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?)|(\btrue\b|\bfalse\b|\bnull\b|\bundefined\b)|([{}[\],])/g;
4424
- function renderColoredJson2(text) {
4425
- const nodes = [];
4426
- let last = 0;
4427
- let i = 0;
4428
- JSON_TOKEN_RE2.lastIndex = 0;
4429
- for (let m = JSON_TOKEN_RE2.exec(text);m !== null; m = JSON_TOKEN_RE2.exec(text)) {
4430
- if (m.index > last)
4431
- nodes.push(text.slice(last, m.index));
4432
- const [, str, colon, num, kw, punct] = m;
4433
- if (str != null) {
4434
- if (colon != null) {
4435
- nodes.push(/* @__PURE__ */ jsx18("span", {
4436
- style: { color: DEVTOOL_JSON_KEY },
4437
- children: str
4438
- }, i++));
4439
- nodes.push(/* @__PURE__ */ jsx18("span", {
4440
- style: { color: DEVTOOL_JSON_PUNCTUATION },
4441
- children: colon
4442
- }, i++));
4443
- } else {
4444
- nodes.push(/* @__PURE__ */ jsx18("span", {
4445
- style: { color: DEVTOOL_JSON_STRING },
4446
- children: str
4447
- }, i++));
4448
- }
4449
- } else if (num != null) {
4450
- nodes.push(/* @__PURE__ */ jsx18("span", {
4451
- style: { color: DEVTOOL_JSON_NUMBER },
4452
- children: num
4453
- }, i++));
4454
- } else if (kw != null) {
4455
- nodes.push(/* @__PURE__ */ jsx18("span", {
4456
- style: { color: DEVTOOL_JSON_KEYWORD },
4457
- children: kw
4458
- }, i++));
4459
- } else if (punct != null) {
4460
- nodes.push(/* @__PURE__ */ jsx18("span", {
4461
- style: { color: DEVTOOL_JSON_PUNCTUATION },
4462
- children: punct
4463
- }, i++));
4464
- }
4465
- last = JSON_TOKEN_RE2.lastIndex;
4466
- }
4467
- if (last < text.length)
4468
- nodes.push(text.slice(last));
4469
- return nodes;
4470
- }
4265
+ import { renderColoredJson as renderColoredJson2, safeStringify as safeStringify3 } from "nice-devtools-shared";
4266
+ import { jsx as jsx16 } from "react/jsx-runtime";
4471
4267
  function stripOuterBraces(json) {
4472
4268
  const lines = json.split(`
4473
4269
  `);
@@ -4478,8 +4274,8 @@ function stripOuterBraces(json) {
4478
4274
  return json;
4479
4275
  }
4480
4276
  function IoTooltipContent({ value }) {
4481
- const text = stripOuterBraces(safeStringify(value, 2));
4482
- return /* @__PURE__ */ jsx18("div", {
4277
+ const text = stripOuterBraces(safeStringify3(value, 2));
4278
+ return /* @__PURE__ */ jsx16("div", {
4483
4279
  style: {
4484
4280
  fontFamily: "ui-monospace, 'Cascadia Code', 'Source Code Pro', monospace",
4485
4281
  fontSize: "10px",
@@ -4493,7 +4289,7 @@ function IoTooltipContent({ value }) {
4493
4289
  }
4494
4290
 
4495
4291
  // src/devtools/browser/components/action_list/ActionInputAndOutputChip.tsx
4496
- import { jsx as jsx19, jsxs as jsxs16 } from "react/jsx-runtime";
4292
+ import { jsx as jsx17, jsxs as jsxs15 } from "react/jsx-runtime";
4497
4293
  var ActionInputAndOutputChip = ({
4498
4294
  entry,
4499
4295
  breakReasons,
@@ -4507,86 +4303,94 @@ var ActionInputAndOutputChip = ({
4507
4303
  const isLocal = localEnvId != null && (firstHopIsLocal || externalLabel == null);
4508
4304
  const color = isLocal ? "handler_local" /* handler_local */ : "handler_external" /* handler_external */;
4509
4305
  const transportTooltip = firstHop != null ? getTransportTooltip(firstHop) : undefined;
4510
- const [labelAnchor, setLabelAnchor] = useState9(null);
4306
+ const [labelAnchor, setLabelAnchor] = useState8(null);
4511
4307
  const isNewInput = breakReasons.includes("new_input" /* new_input */);
4512
4308
  const isNewOutput = breakReasons.includes("new_output" /* new_output */);
4513
4309
  const hasError = entry.error != null || entry.abortReason != null;
4514
4310
  const sizeNum = getSizeValue(size);
4515
4311
  const newIconSizeEm = `${sizeNum * 0.9}em`;
4516
4312
  const label = `${(isLocal ? localEnvId : externalLabel) ?? "unknown"}`;
4517
- const newSparkleComp = /* @__PURE__ */ jsx19("div", {
4313
+ const newSparkleComp = /* @__PURE__ */ jsx17("div", {
4518
4314
  style: {
4519
4315
  opacity: 0.9,
4520
4316
  alignSelf: "start",
4521
4317
  marginLeft: "-0.6em"
4522
4318
  },
4523
- children: /* @__PURE__ */ jsx19(Sparkle, {
4319
+ children: /* @__PURE__ */ jsx17(Sparkle, {
4524
4320
  strokeWidth: "0.2em",
4525
4321
  color: "rgba(243, 250, 140, 1)",
4526
4322
  width: newIconSizeEm,
4527
4323
  height: newIconSizeEm
4528
4324
  })
4529
4325
  });
4530
- return /* @__PURE__ */ jsx19(Chip, {
4326
+ return /* @__PURE__ */ jsx17(Chip, {
4531
4327
  color,
4532
4328
  size,
4533
4329
  subtle,
4534
- children: /* @__PURE__ */ jsxs16("div", {
4330
+ children: /* @__PURE__ */ jsxs15("div", {
4535
4331
  style: { display: "flex", alignItems: "center", gap: "0.4em" },
4536
4332
  children: [
4537
- /* @__PURE__ */ jsx19(Icon, {
4333
+ /* @__PURE__ */ jsx17(Icon, {
4538
4334
  noBackground: true,
4539
4335
  icon: Variable,
4540
4336
  color,
4541
4337
  subtle: subtle || entry.input === undefined,
4542
4338
  tooltip: {
4543
- content: entry.input !== undefined ? /* @__PURE__ */ jsx19(IoTooltipContent, {
4339
+ content: entry.input !== undefined ? /* @__PURE__ */ jsx17(IoTooltipContent, {
4544
4340
  value: entry.input
4545
- }) : /* @__PURE__ */ jsx19("span", {
4546
- style: { color: DEVTOOL_COLOR_TEXT_MUTED, fontSize: "10px" },
4341
+ }) : /* @__PURE__ */ jsx17("span", {
4342
+ style: { color: DEVTOOL_COLOR_TEXT_MUTED2, fontSize: "10px" },
4547
4343
  children: "No input required or given"
4548
4344
  }),
4549
4345
  title: isNewInput ? "New Input" : "Input"
4550
4346
  }
4551
4347
  }),
4552
4348
  isNewInput && newSparkleComp,
4553
- /* @__PURE__ */ jsx19("span", {
4349
+ /* @__PURE__ */ jsx17("span", {
4554
4350
  style: { opacity: 0.6 },
4555
4351
  color,
4556
4352
  children: "→"
4557
4353
  }),
4558
- /* @__PURE__ */ jsx19("span", {
4559
- style: { opacity: 0.8, cursor: transportTooltip != null ? "default" : undefined },
4354
+ /* @__PURE__ */ jsx17("span", {
4355
+ title: transportTooltip == null ? label : undefined,
4356
+ style: {
4357
+ opacity: 0.8,
4358
+ cursor: transportTooltip != null ? "default" : undefined,
4359
+ overflow: "hidden",
4360
+ textOverflow: "ellipsis",
4361
+ whiteSpace: "nowrap",
4362
+ maxWidth: "14ch"
4363
+ },
4560
4364
  onMouseEnter: transportTooltip != null ? (e) => setLabelAnchor(e.currentTarget.getBoundingClientRect()) : undefined,
4561
4365
  onMouseLeave: transportTooltip != null ? () => setLabelAnchor(null) : undefined,
4562
4366
  children: label
4563
4367
  }),
4564
- labelAnchor != null && transportTooltip != null && /* @__PURE__ */ jsx19(Tooltip, {
4368
+ labelAnchor != null && transportTooltip != null && /* @__PURE__ */ jsx17(Tooltip, {
4565
4369
  anchor: labelAnchor,
4566
4370
  config: transportTooltip
4567
4371
  }),
4568
- /* @__PURE__ */ jsx19("span", {
4372
+ /* @__PURE__ */ jsx17("span", {
4569
4373
  style: { opacity: 0.6 },
4570
4374
  color,
4571
4375
  children: "→"
4572
4376
  }),
4573
- entry.status === "success" && entry.output !== undefined && /* @__PURE__ */ jsx19(Icon, {
4377
+ entry.status === "success" && entry.output !== undefined && /* @__PURE__ */ jsx17(Icon, {
4574
4378
  noBackground: true,
4575
4379
  icon: PackageCheck,
4576
4380
  color: !hasError ? color : "default" /* default */,
4577
4381
  tooltip: {
4578
- content: /* @__PURE__ */ jsx19(IoTooltipContent, {
4382
+ content: /* @__PURE__ */ jsx17(IoTooltipContent, {
4579
4383
  value: entry.output
4580
4384
  }),
4581
4385
  title: isNewOutput ? "New Output" : "Output"
4582
4386
  }
4583
4387
  }),
4584
- (entry.error != null || entry.abortReason != null) && /* @__PURE__ */ jsx19(Icon, {
4388
+ (entry.error != null || entry.abortReason != null) && /* @__PURE__ */ jsx17(Icon, {
4585
4389
  noBackground: true,
4586
4390
  icon: CircleX2,
4587
4391
  color: entry.status === "aborted" ? "aborted" /* aborted */ : "error" /* error */,
4588
4392
  tooltip: {
4589
- content: /* @__PURE__ */ jsx19(ActionErrorDisplay, {
4393
+ content: /* @__PURE__ */ jsx17(ActionErrorDisplay, {
4590
4394
  entry,
4591
4395
  compact: true
4592
4396
  }),
@@ -4601,7 +4405,7 @@ var ActionInputAndOutputChip = ({
4601
4405
  };
4602
4406
 
4603
4407
  // src/devtools/browser/components/action_list/ActionEntryRow.tsx
4604
- import { jsx as jsx20, jsxs as jsxs17, Fragment as Fragment10 } from "react/jsx-runtime";
4408
+ import { jsx as jsx18, jsxs as jsxs16, Fragment as Fragment8 } from "react/jsx-runtime";
4605
4409
  var MAX_GROUP_DOTS = 5;
4606
4410
  function getLatestChipColor(status) {
4607
4411
  if (status === "failed")
@@ -4624,14 +4428,14 @@ function GroupDotTooltip({
4624
4428
  const deltaMs = refTime - entry.startTime;
4625
4429
  const relStr = index === 0 ? "latest run" : `−${formatRelativeAge(deltaMs)} from latest`;
4626
4430
  const durationStr = entry.endTime != null ? `${entry.endTime - entry.startTime}ms` : "running…";
4627
- return /* @__PURE__ */ jsx20(Tooltip, {
4431
+ return /* @__PURE__ */ jsx18(Tooltip, {
4628
4432
  anchor,
4629
4433
  config: {
4630
4434
  align: "center",
4631
4435
  maxWidth: 240,
4632
- content: /* @__PURE__ */ jsxs17(Fragment10, {
4436
+ content: /* @__PURE__ */ jsxs16(Fragment8, {
4633
4437
  children: [
4634
- /* @__PURE__ */ jsxs17("div", {
4438
+ /* @__PURE__ */ jsxs16("div", {
4635
4439
  style: { color: dotColor, marginBottom: "1px" },
4636
4440
  children: [
4637
4441
  symbol,
@@ -4641,20 +4445,20 @@ function GroupDotTooltip({
4641
4445
  total
4642
4446
  ]
4643
4447
  }),
4644
- /* @__PURE__ */ jsx20("div", {
4448
+ /* @__PURE__ */ jsx18("div", {
4645
4449
  style: { color: DEVTOOL_COLOR_TEXT_SECONDARY },
4646
4450
  children: formatTimestamp(entry.startTime)
4647
4451
  }),
4648
- /* @__PURE__ */ jsx20("div", {
4649
- style: { color: DEVTOOL_COLOR_TEXT_MUTED },
4452
+ /* @__PURE__ */ jsx18("div", {
4453
+ style: { color: DEVTOOL_COLOR_TEXT_MUTED2 },
4650
4454
  children: durationStr
4651
4455
  }),
4652
- index > 0 && /* @__PURE__ */ jsx20("div", {
4456
+ index > 0 && /* @__PURE__ */ jsx18("div", {
4653
4457
  style: {
4654
- color: DEVTOOL_COLOR_TEXT_MUTED,
4458
+ color: DEVTOOL_COLOR_TEXT_MUTED2,
4655
4459
  marginTop: "3px",
4656
4460
  paddingTop: "3px",
4657
- borderTop: `1px solid ${DEVTOOL_SECTION_BACKGROUND}`
4461
+ borderTop: `1px solid ${DEVTOOL_SECTION_BACKGROUND2}`
4658
4462
  },
4659
4463
  children: relStr
4660
4464
  })
@@ -4671,12 +4475,12 @@ function GroupDot({
4671
4475
  isActive,
4672
4476
  onSelect
4673
4477
  }) {
4674
- const [anchor, setAnchor] = useState10(null);
4478
+ const [anchor, setAnchor] = useState9(null);
4675
4479
  const dotColor = STATUS_COLOR[entry.status];
4676
4480
  const hovered = anchor != null;
4677
- return /* @__PURE__ */ jsxs17(Fragment10, {
4481
+ return /* @__PURE__ */ jsxs16(Fragment8, {
4678
4482
  children: [
4679
- /* @__PURE__ */ jsx20("button", {
4483
+ /* @__PURE__ */ jsx18("button", {
4680
4484
  "data-cuid": entry.cuid,
4681
4485
  onClick: (e) => {
4682
4486
  e.stopPropagation();
@@ -4698,7 +4502,7 @@ function GroupDot({
4698
4502
  transition: "transform 0.1s ease, opacity 0.1s ease, border-color 0.1s ease"
4699
4503
  }
4700
4504
  }),
4701
- hovered && anchor != null && /* @__PURE__ */ jsx20(GroupDotTooltip, {
4505
+ hovered && anchor != null && /* @__PURE__ */ jsx18(GroupDotTooltip, {
4702
4506
  entry,
4703
4507
  index,
4704
4508
  total,
@@ -4728,7 +4532,7 @@ function ActionEntryRow({
4728
4532
  const nonIoBreakReasons = breakReasons?.filter((r) => r !== "new_input" /* new_input */ && r !== "new_output" /* new_output */) ?? [];
4729
4533
  const hasBottomError = entry.error != null || entry.abortReason != null;
4730
4534
  const hasBottomContent = externalChildEntries.length > 0 || nonIoBreakReasons.length > 0;
4731
- return /* @__PURE__ */ jsxs17("div", {
4535
+ return /* @__PURE__ */ jsxs16("div", {
4732
4536
  "data-cuid": entry.cuid,
4733
4537
  onClick,
4734
4538
  style: {
@@ -4745,22 +4549,22 @@ function ActionEntryRow({
4745
4549
  margin: "2px 4px"
4746
4550
  },
4747
4551
  children: [
4748
- /* @__PURE__ */ jsx20("div", {
4552
+ /* @__PURE__ */ jsx18("div", {
4749
4553
  style: {
4750
4554
  position: "absolute",
4751
4555
  left: "2em",
4752
4556
  top: 0,
4753
4557
  bottom: 0,
4754
4558
  width: "1px",
4755
- background: `${DEVTOOL_COLOR_SEMANTIC_METADATA}28`,
4559
+ background: `${DEVTOOL_COLOR_SEMANTIC_METADATA2}28`,
4756
4560
  pointerEvents: "none",
4757
4561
  zIndex: 0
4758
4562
  }
4759
4563
  }),
4760
- /* @__PURE__ */ jsxs17("div", {
4564
+ /* @__PURE__ */ jsxs16("div", {
4761
4565
  style: { display: "flex", alignItems: "center", gap: "8px" },
4762
4566
  children: [
4763
- /* @__PURE__ */ jsx20("div", {
4567
+ /* @__PURE__ */ jsxs16("div", {
4764
4568
  style: {
4765
4569
  position: "relative",
4766
4570
  zIndex: 1,
@@ -4770,91 +4574,90 @@ function ActionEntryRow({
4770
4574
  alignItems: "center",
4771
4575
  justifyContent: "flex-start"
4772
4576
  },
4773
- children: isLatest ? /* @__PURE__ */ jsx20(Chip, {
4774
- size: "sm" /* sm */,
4775
- color: getLatestChipColor(entry.status),
4776
- children: "latest"
4777
- }) : /* @__PURE__ */ jsxs17(Chip, {
4778
- size: "sm" /* sm */,
4779
- color: getLatestChipColor(entry.status),
4780
- children: [
4781
- "+",
4782
- latestTime != null ? formatRelativeAge(latestTime - entry.startTime) : "?"
4783
- ]
4784
- })
4785
- }),
4786
- /* @__PURE__ */ jsxs17("div", {
4787
- style: { flex: 1, minWidth: 0, display: "flex", alignItems: "center", gap: "0.5em" },
4788
4577
  children: [
4789
- /* @__PURE__ */ jsx20("span", {
4790
- style: {
4791
- color: DEVTOOL_COLOR_TEXT_SECONDARY,
4792
- fontSize: "1em",
4793
- fontWeight: 400,
4794
- fontFamily: "ui-monospace, 'Cascadia Code', 'Source Code Pro', monospace",
4795
- overflow: "hidden",
4796
- textOverflow: "ellipsis",
4797
- whiteSpace: "nowrap",
4798
- flexShrink: 1,
4799
- minWidth: "3em"
4800
- },
4801
- children: entry.actionId
4802
- }),
4803
- inboundOrigin != null && /* @__PURE__ */ jsx20(OriginChip, {
4804
- origin: inboundOrigin,
4578
+ isLatest ? /* @__PURE__ */ jsx18(Chip, {
4805
4579
  size: "sm" /* sm */,
4806
- subtle: true
4807
- }),
4808
- /* @__PURE__ */ jsx20(ActionInputAndOutputChip, {
4809
- breakReasons,
4810
- entry
4811
- }),
4812
- /* @__PURE__ */ jsx20("div", {
4813
- style: { flex: 1 }
4580
+ color: getLatestChipColor(entry.status),
4581
+ children: "latest"
4582
+ }) : /* @__PURE__ */ jsxs16(Chip, {
4583
+ size: "sm" /* sm */,
4584
+ color: getLatestChipColor(entry.status),
4585
+ children: [
4586
+ "+",
4587
+ latestTime != null ? formatRelativeAge(latestTime - entry.startTime) : "?"
4588
+ ]
4814
4589
  }),
4815
- /* @__PURE__ */ jsxs17("div", {
4590
+ /* @__PURE__ */ jsx18("span", {
4816
4591
  style: {
4817
- display: "flex",
4818
- flexDirection: "column",
4819
- alignItems: "end",
4820
- gap: "0.35em",
4821
- marginTop: "-0.2em",
4822
- marginRight: "-0.2em"
4592
+ position: "absolute",
4593
+ top: "100%",
4594
+ left: 0,
4595
+ marginTop: "5px",
4596
+ color: DEVTOOL_COLOR_SEMANTIC_METADATA2,
4597
+ fontSize: "10px",
4598
+ lineHeight: "1em",
4599
+ letterSpacing: "0.02em",
4600
+ fontFamily: "ui-sans-serif, system-ui, sans-serif",
4601
+ opacity: 0.7,
4602
+ paddingLeft: "0.1em",
4603
+ whiteSpace: "nowrap"
4823
4604
  },
4824
- children: [
4825
- /* @__PURE__ */ jsx20("span", {
4826
- style: {
4827
- display: "flex",
4828
- color: DEVTOOL_COLOR_SEMANTIC_METADATA,
4829
- fontSize: "10px",
4830
- lineHeight: "1em",
4831
- letterSpacing: "0.02em",
4832
- fontFamily: "ui-sans-serif, system-ui, sans-serif",
4833
- flexShrink: 0,
4834
- opacity: 0.7
4835
- },
4836
- children: timestamp
4837
- }),
4838
- /* @__PURE__ */ jsx20("span", {
4839
- style: {
4840
- display: "flex",
4841
- color: DEVTOOL_COLOR_SEMANTIC_WARNING,
4842
- lineHeight: "1em",
4843
- fontSize: "11px",
4844
- opacity: 0.9,
4845
- flexShrink: 0
4846
- },
4847
- children: /* @__PURE__ */ jsx20(DurationDisplay, {
4848
- entry
4849
- })
4850
- })
4851
- ]
4605
+ children: timestamp
4852
4606
  })
4853
4607
  ]
4608
+ }),
4609
+ /* @__PURE__ */ jsx18("span", {
4610
+ title: entry.actionId,
4611
+ style: {
4612
+ flex: 1,
4613
+ minWidth: 0,
4614
+ color: DEVTOOL_COLOR_TEXT_SECONDARY,
4615
+ fontSize: "1em",
4616
+ fontWeight: 400,
4617
+ fontFamily: "ui-monospace, 'Cascadia Code', 'Source Code Pro', monospace",
4618
+ overflow: "hidden",
4619
+ textOverflow: "ellipsis",
4620
+ whiteSpace: "nowrap"
4621
+ },
4622
+ children: entry.actionId
4623
+ }),
4624
+ /* @__PURE__ */ jsx18("span", {
4625
+ style: {
4626
+ color: DEVTOOL_COLOR_SEMANTIC_WARNING2,
4627
+ lineHeight: "1em",
4628
+ fontSize: "11px",
4629
+ opacity: 0.9,
4630
+ flexShrink: 0,
4631
+ fontFamily: "ui-sans-serif, system-ui, sans-serif"
4632
+ },
4633
+ children: /* @__PURE__ */ jsx18(DurationDisplay, {
4634
+ entry
4635
+ })
4854
4636
  })
4855
4637
  ]
4856
4638
  }),
4857
- hasBottomContent && /* @__PURE__ */ jsxs17("div", {
4639
+ /* @__PURE__ */ jsxs16("div", {
4640
+ style: {
4641
+ display: "flex",
4642
+ alignItems: "center",
4643
+ gap: "0.4em",
4644
+ paddingLeft: "4.5em",
4645
+ minWidth: 0
4646
+ },
4647
+ children: [
4648
+ inboundOrigin != null && /* @__PURE__ */ jsx18(OriginChip, {
4649
+ origin: inboundOrigin,
4650
+ size: "sm" /* sm */,
4651
+ subtle: true
4652
+ }),
4653
+ /* @__PURE__ */ jsx18(ActionInputAndOutputChip, {
4654
+ breakReasons,
4655
+ entry,
4656
+ size: "sm" /* sm */
4657
+ })
4658
+ ]
4659
+ }),
4660
+ hasBottomContent && /* @__PURE__ */ jsxs16("div", {
4858
4661
  style: {
4859
4662
  display: "flex",
4860
4663
  flexWrap: "wrap",
@@ -4863,35 +4666,35 @@ function ActionEntryRow({
4863
4666
  paddingLeft: "4.5em"
4864
4667
  },
4865
4668
  children: [
4866
- externalChildEntries.map((child) => /* @__PURE__ */ jsxs17(Fragment9, {
4669
+ externalChildEntries.map((child) => /* @__PURE__ */ jsxs16(Fragment7, {
4867
4670
  children: [
4868
- /* @__PURE__ */ jsx20(Icon, {
4671
+ /* @__PURE__ */ jsx18(Icon, {
4869
4672
  size: "sm" /* sm */,
4870
4673
  icon: Variable2,
4871
4674
  color: "io_input" /* io_input */,
4872
4675
  subtle: true,
4873
4676
  tooltip: {
4874
- content: child.input !== undefined ? /* @__PURE__ */ jsx20(IoTooltipContent, {
4677
+ content: child.input !== undefined ? /* @__PURE__ */ jsx18(IoTooltipContent, {
4875
4678
  value: child.input
4876
- }) : /* @__PURE__ */ jsx20("span", {
4877
- style: { color: DEVTOOL_COLOR_TEXT_MUTED, fontSize: "10px" },
4679
+ }) : /* @__PURE__ */ jsx18("span", {
4680
+ style: { color: DEVTOOL_COLOR_TEXT_MUTED2, fontSize: "10px" },
4878
4681
  children: "No input required or given"
4879
4682
  }),
4880
4683
  title: `Input · ${child.actionId}`
4881
4684
  }
4882
4685
  }),
4883
- /* @__PURE__ */ jsx20(HandlerChips, {
4686
+ /* @__PURE__ */ jsx18(HandlerChips, {
4884
4687
  entry: child,
4885
4688
  size: "sm" /* sm */,
4886
4689
  subtle: true
4887
4690
  }),
4888
- child.status === "success" && child.output !== undefined && /* @__PURE__ */ jsx20(Icon, {
4691
+ child.status === "success" && child.output !== undefined && /* @__PURE__ */ jsx18(Icon, {
4889
4692
  size: "sm" /* sm */,
4890
4693
  icon: PackageCheck2,
4891
4694
  color: "io_output" /* io_output */,
4892
4695
  subtle: true,
4893
4696
  tooltip: {
4894
- content: /* @__PURE__ */ jsx20(IoTooltipContent, {
4697
+ content: /* @__PURE__ */ jsx18(IoTooltipContent, {
4895
4698
  value: child.output
4896
4699
  }),
4897
4700
  title: `Output · ${child.actionId}`
@@ -4899,18 +4702,18 @@ function ActionEntryRow({
4899
4702
  })
4900
4703
  ]
4901
4704
  }, child.actionId)),
4902
- nonIoBreakReasons.map((reason) => /* @__PURE__ */ jsx20(Chip, {
4705
+ nonIoBreakReasons.map((reason) => /* @__PURE__ */ jsx18(Chip, {
4903
4706
  color: "default" /* default */,
4904
4707
  subtle: true,
4905
4708
  children: reason
4906
4709
  }, reason)),
4907
- externalChildEntries.length > 0 && hasBottomError && /* @__PURE__ */ jsx20(Icon, {
4710
+ externalChildEntries.length > 0 && hasBottomError && /* @__PURE__ */ jsx18(Icon, {
4908
4711
  size: "sm" /* sm */,
4909
4712
  icon: CircleX3,
4910
4713
  color: entry.status === "aborted" ? "aborted" /* aborted */ : "error" /* error */,
4911
4714
  subtle: true,
4912
4715
  tooltip: {
4913
- content: /* @__PURE__ */ jsx20(ActionErrorDisplay, {
4716
+ content: /* @__PURE__ */ jsx18(ActionErrorDisplay, {
4914
4717
  entry,
4915
4718
  compact: true
4916
4719
  }),
@@ -4920,7 +4723,7 @@ function ActionEntryRow({
4920
4723
  })
4921
4724
  ]
4922
4725
  }),
4923
- hasGroup && /* @__PURE__ */ jsxs17("div", {
4726
+ hasGroup && /* @__PURE__ */ jsxs16("div", {
4924
4727
  style: {
4925
4728
  display: "flex",
4926
4729
  flexWrap: "wrap",
@@ -4930,7 +4733,7 @@ function ActionEntryRow({
4930
4733
  paddingBottom: "2px"
4931
4734
  },
4932
4735
  children: [
4933
- groupEntries.slice(0, MAX_GROUP_DOTS).map((e, i) => /* @__PURE__ */ jsx20(GroupDot, {
4736
+ groupEntries.slice(0, MAX_GROUP_DOTS).map((e, i) => /* @__PURE__ */ jsx18(GroupDot, {
4934
4737
  entry: e,
4935
4738
  index: i,
4936
4739
  total: groupEntries.length,
@@ -4938,7 +4741,7 @@ function ActionEntryRow({
4938
4741
  isActive: selectedGroupCuid === e.cuid,
4939
4742
  onSelect: () => onSelectGroupEntry?.(e.cuid)
4940
4743
  }, e.cuid)),
4941
- groupEntries.length > MAX_GROUP_DOTS && /* @__PURE__ */ jsxs17("span", {
4744
+ groupEntries.length > MAX_GROUP_DOTS && /* @__PURE__ */ jsxs16("span", {
4942
4745
  style: {
4943
4746
  fontSize: "0.7em",
4944
4747
  opacity: 0.5,
@@ -4957,10 +4760,10 @@ function ActionEntryRow({
4957
4760
  }
4958
4761
 
4959
4762
  // src/devtools/browser/components/action_list/ActionList.tsx
4960
- import { jsx as jsx21, jsxs as jsxs18 } from "react/jsx-runtime";
4763
+ import { jsx as jsx19, jsxs as jsxs17, Fragment as Fragment9 } from "react/jsx-runtime";
4961
4764
  function getBreakReasons(current, previous) {
4962
4765
  const reasons = [];
4963
- const inputChanged = current.inputHash != null && previous.inputHash != null ? current.inputHash !== previous.inputHash : safeStringify(current.input, 0) !== safeStringify(previous.input, 0);
4766
+ const inputChanged = current.inputHash != null && previous.inputHash != null ? current.inputHash !== previous.inputHash : safeStringify2(current.input, 0) !== safeStringify2(previous.input, 0);
4964
4767
  if (inputChanged)
4965
4768
  reasons.push("new_input" /* new_input */);
4966
4769
  const outputChanged = current.outputHash != null && previous.outputHash != null && current.outputHash !== previous.outputHash;
@@ -4993,7 +4796,6 @@ function ActionList({
4993
4796
  childEntriesMap,
4994
4797
  style
4995
4798
  }) {
4996
- const containerRef = useRef2(null);
4997
4799
  const latestTime = groups[0]?.representative.startTime;
4998
4800
  const flatItems = useMemo2(() => {
4999
4801
  return groups.map((group, gi) => {
@@ -5007,477 +4809,78 @@ function ActionList({
5007
4809
  return { group, groupIndex: gi, breakReasons };
5008
4810
  });
5009
4811
  }, [groups]);
5010
- const prevSelectedRef = useRef2(selectedCuid);
5011
- useEffect3(() => {
5012
- if (selectedCuid === prevSelectedRef.current)
5013
- return;
5014
- prevSelectedRef.current = selectedCuid;
4812
+ const prevRepCuidsRef = useRef2(null);
4813
+ const newRepCuids = useMemo2(() => {
4814
+ const current = new Set(flatItems.map((i) => i.group.representative.cuid));
4815
+ const prev = prevRepCuidsRef.current;
4816
+ const result = new Set;
4817
+ if (prev != null) {
4818
+ for (const c of current)
4819
+ if (!prev.has(c))
4820
+ result.add(c);
4821
+ }
4822
+ prevRepCuidsRef.current = current;
4823
+ return result;
4824
+ }, [flatItems]);
4825
+ const selectedAnchorKey = useMemo2(() => {
5015
4826
  if (selectedCuid == null)
5016
- return;
5017
- let repCuid = selectedCuid;
5018
- for (const item of flatItems) {
5019
- if (item.group.rest.some((e) => e.cuid === selectedCuid)) {
5020
- repCuid = item.group.representative.cuid;
5021
- break;
5022
- }
5023
- }
5024
- containerRef.current?.querySelector(`[data-cuid="${repCuid}"]`)?.scrollIntoView({ block: "nearest" });
5025
- }, [selectedCuid, flatItems]);
5026
- if (groups.length === 0) {
5027
- return /* @__PURE__ */ jsx21("div", {
4827
+ return null;
4828
+ const item = flatItems.find((i) => i.group.representative.cuid === selectedCuid || i.group.rest.some((e) => e.cuid === selectedCuid));
4829
+ return item != null ? getFlatItemKey(item) : null;
4830
+ }, [flatItems, selectedCuid]);
4831
+ return /* @__PURE__ */ jsx19(DevtoolsVirtualList, {
4832
+ items: flatItems,
4833
+ getItemKey: getFlatItemKey,
4834
+ selectedKey: selectedAnchorKey,
4835
+ estimateSize: 64,
4836
+ overscan: 8,
4837
+ style,
4838
+ rowStyle: { borderBottom: `1px solid ${DEVTOOL_LIST_GROUP_DIVIDER}`, overflow: "hidden" },
4839
+ empty: /* @__PURE__ */ jsx19("div", {
5028
4840
  style,
5029
- children: /* @__PURE__ */ jsx21("div", {
5030
- style: { padding: "24px", textAlign: "center", color: DEVTOOL_COLOR_TEXT_MUTED },
4841
+ children: /* @__PURE__ */ jsx19("div", {
4842
+ style: { padding: "24px", textAlign: "center", color: DEVTOOL_COLOR_TEXT_MUTED2 },
5031
4843
  children: "No actions recorded yet"
5032
4844
  })
5033
- });
5034
- }
5035
- return /* @__PURE__ */ jsxs18("div", {
5036
- ref: containerRef,
5037
- style,
5038
- children: [
5039
- flatItems.map((item) => {
5040
- const key = getFlatItemKey(item);
5041
- const { group } = item;
5042
- return /* @__PURE__ */ jsxs18("div", {
5043
- style: {
5044
- borderBottom: `1px solid ${DEVTOOL_LIST_GROUP_DIVIDER}`,
5045
- position: "relative",
5046
- overflow: "hidden"
5047
- },
5048
- children: [
5049
- /* @__PURE__ */ jsx21("div", {
5050
- style: {
5051
- position: "absolute",
5052
- inset: 0,
5053
- pointerEvents: "none",
5054
- background: "linear-gradient(90deg, transparent 0%, rgba(148, 210, 255, 0.13) 50%, transparent 100%)",
5055
- animation: "__nice-action-shine 0.65s ease-out forwards"
5056
- }
5057
- }, group.representative.cuid),
5058
- /* @__PURE__ */ jsx21(ActionEntryRow, {
5059
- entry: group.representative,
5060
- isSelected: selectedCuid === group.representative.cuid || group.rest.some((e) => e.cuid === selectedCuid),
5061
- isLatest: item.groupIndex === 0,
5062
- latestTime,
5063
- childEntries: getGroupChildEntries(group, childEntriesMap),
5064
- breakReasons: item.breakReasons,
5065
- groupEntries: group.rest.length > 0 ? [group.representative, ...group.rest] : undefined,
5066
- selectedGroupCuid: selectedCuid,
5067
- onSelectGroupEntry: (cuid) => onSubClick(cuid, selectedCuid === cuid),
5068
- onClick: () => onGroupClick(group)
5069
- })
5070
- ]
5071
- }, key);
5072
- }),
5073
- /* @__PURE__ */ jsx21("div", {
5074
- style: { padding: "24px", textAlign: "center", color: DEVTOOL_COLOR_TEXT_MUTED },
5075
- children: "Start of action history"
5076
- })
5077
- ]
5078
- });
5079
- }
5080
-
5081
- // src/devtools/browser/components/PanelChrome.tsx
5082
- import { useState as useState11 } from "react";
5083
- import { jsx as jsx22, jsxs as jsxs19 } from "react/jsx-runtime";
5084
- var MONO_FONT = "ui-monospace, 'Cascadia Code', 'Source Code Pro', monospace";
5085
- var SANS_FONT = "ui-sans-serif, system-ui, sans-serif";
5086
- var DOCKED_SIZE_MIN = 140;
5087
- var POSITION_GRID = [
5088
- { key: "tl", pos: null },
5089
- { key: "tc", pos: "dock-top" },
5090
- { key: "tr", pos: null },
5091
- { key: "ml", pos: "dock-left" },
5092
- { key: "mc", pos: null },
5093
- { key: "mr", pos: "dock-right" },
5094
- { key: "bl", pos: null },
5095
- { key: "bc", pos: "dock-bottom" },
5096
- { key: "br", pos: null }
5097
- ];
5098
- function getDockSide(pos) {
5099
- switch (pos) {
5100
- case "dock-top":
5101
- return "top";
5102
- case "dock-left":
5103
- return "left";
5104
- case "dock-right":
5105
- return "right";
5106
- default:
5107
- return "bottom";
5108
- }
5109
- }
5110
- function PanelHeader({
5111
- position,
5112
- onPositionChange,
5113
- onClose,
5114
- onClear,
5115
- openOthers
5116
- }) {
5117
- return /* @__PURE__ */ jsxs19("div", {
5118
- style: {
5119
- display: "flex",
5120
- alignItems: "center",
5121
- justifyContent: "space-between",
5122
- padding: "8px 12px",
5123
- gap: "10px",
5124
- background: DEVTOOL_SECTION_BACKGROUND,
5125
- borderBottom: `1px solid ${DEVTOOL_LIST_BASE_BACKGROUND}`,
5126
- flexShrink: 0
5127
- },
5128
- children: [
5129
- /* @__PURE__ */ jsxs19("div", {
5130
- style: { display: "flex", alignItems: "center", gap: "8px", minWidth: 0 },
4845
+ }),
4846
+ footer: /* @__PURE__ */ jsx19("div", {
4847
+ style: { padding: "24px", textAlign: "center", color: DEVTOOL_COLOR_TEXT_MUTED2 },
4848
+ children: "Start of action history"
4849
+ }),
4850
+ renderItem: (item) => {
4851
+ const { group } = item;
4852
+ const shine = newRepCuids.has(group.representative.cuid);
4853
+ return /* @__PURE__ */ jsxs17(Fragment9, {
5131
4854
  children: [
5132
- /* @__PURE__ */ jsx22("span", {
5133
- style: {
5134
- color: DEVTOOL_COLOR_SEMANTIC_SYSTEM,
5135
- fontWeight: "bold",
5136
- fontSize: "11px",
5137
- whiteSpace: "nowrap"
5138
- },
5139
- children: "⚡ action"
5140
- }),
5141
- openOthers?.map((item) => /* @__PURE__ */ jsxs19("button", {
5142
- onClick: item.onOpen,
5143
- title: `Open ${item.label} devtools`,
4855
+ shine && /* @__PURE__ */ jsx19("div", {
5144
4856
  style: {
5145
- display: "flex",
5146
- alignItems: "center",
5147
- gap: "4px",
5148
- background: DEVTOOL_LIST_BASE_BACKGROUND,
5149
- border: `1px solid ${DEVTOOL_COLOR_TEXT_FAINT}`,
5150
- borderRadius: "999px",
5151
- color: DEVTOOL_COLOR_TEXT_MUTED,
5152
- cursor: "pointer",
5153
- fontSize: "10px",
5154
- padding: "1px 7px 1px 6px",
5155
- fontFamily: SANS_FONT,
5156
- whiteSpace: "nowrap"
5157
- },
5158
- children: [
5159
- /* @__PURE__ */ jsx22("span", {
5160
- children: item.icon
5161
- }),
5162
- /* @__PURE__ */ jsx22("span", {
5163
- children: item.label
5164
- }),
5165
- item.badge != null && /* @__PURE__ */ jsx22("span", {
5166
- style: { color: DEVTOOL_COLOR_SEMANTIC_SYSTEM },
5167
- children: item.badge
5168
- })
5169
- ]
5170
- }, item.id))
5171
- ]
5172
- }),
5173
- /* @__PURE__ */ jsxs19("div", {
5174
- style: { display: "flex", gap: "10px", alignItems: "center" },
5175
- children: [
5176
- /* @__PURE__ */ jsx22(PositionPicker, {
5177
- position,
5178
- onChange: onPositionChange
5179
- }),
5180
- onClear != null && /* @__PURE__ */ jsx22("button", {
5181
- onClick: onClear,
5182
- style: {
5183
- background: "none",
5184
- border: "none",
5185
- color: DEVTOOL_COLOR_TEXT_MUTED,
5186
- cursor: "pointer",
5187
- fontSize: "11px",
5188
- padding: "0"
5189
- },
5190
- children: "clear"
4857
+ position: "absolute",
4858
+ inset: 0,
4859
+ pointerEvents: "none",
4860
+ background: "linear-gradient(90deg, transparent 0%, rgba(148, 210, 255, 0.13) 50%, transparent 100%)",
4861
+ animation: "__nice-action-shine 0.65s ease-out forwards"
4862
+ }
5191
4863
  }),
5192
- /* @__PURE__ */ jsx22("button", {
5193
- onClick: onClose,
5194
- style: {
5195
- background: "none",
5196
- border: "none",
5197
- color: DEVTOOL_COLOR_TEXT_MUTED,
5198
- cursor: "pointer",
5199
- fontSize: "16px",
5200
- padding: "0",
5201
- lineHeight: "1"
5202
- },
5203
- children: "×"
4864
+ /* @__PURE__ */ jsx19(ActionEntryRow, {
4865
+ entry: group.representative,
4866
+ isSelected: selectedCuid === group.representative.cuid || group.rest.some((e) => e.cuid === selectedCuid),
4867
+ isLatest: item.groupIndex === 0,
4868
+ latestTime,
4869
+ childEntries: getGroupChildEntries(group, childEntriesMap),
4870
+ breakReasons: item.breakReasons,
4871
+ groupEntries: group.rest.length > 0 ? [group.representative, ...group.rest] : undefined,
4872
+ selectedGroupCuid: selectedCuid,
4873
+ onSelectGroupEntry: (cuid) => onSubClick(cuid, selectedCuid === cuid),
4874
+ onClick: () => onGroupClick(group)
5204
4875
  })
5205
4876
  ]
5206
- })
5207
- ]
5208
- });
5209
- }
5210
- function PositionPicker({
5211
- position,
5212
- onChange
5213
- }) {
5214
- return /* @__PURE__ */ jsx22("div", {
5215
- title: "Move / dock panel",
5216
- style: { display: "grid", gridTemplateColumns: "repeat(3, 9px)", gap: "2px", padding: "2px" },
5217
- children: POSITION_GRID.map(({ key, pos }) => {
5218
- if (pos == null)
5219
- return /* @__PURE__ */ jsx22("div", {
5220
- style: { width: "9px", height: "9px" }
5221
- }, key);
5222
- const isTopBottom = pos === "dock-top" || pos === "dock-bottom";
5223
- const isActive = pos === position;
5224
- return /* @__PURE__ */ jsx22("div", {
5225
- title: pos,
5226
- onClick: () => onChange(pos),
5227
- style: {
5228
- width: "9px",
5229
- height: "9px",
5230
- display: "flex",
5231
- alignItems: "center",
5232
- justifyContent: "center",
5233
- cursor: "pointer"
5234
- },
5235
- children: /* @__PURE__ */ jsx22("div", {
5236
- style: {
5237
- width: isTopBottom ? "9px" : "3px",
5238
- height: isTopBottom ? "3px" : "9px",
5239
- borderRadius: "1px",
5240
- background: isActive ? DEVTOOL_COLOR_SEMANTIC_SYSTEM : DEVTOOL_COLOR_TEXT_FAINT
5241
- }
5242
- })
5243
- }, key);
5244
- })
5245
- });
5246
- }
5247
- function ResizeHandle({
5248
- dockSide,
5249
- dockedSize,
5250
- onChange
5251
- }) {
5252
- const isHoriz = dockSide === "left" || dockSide === "right";
5253
- const onMouseDown = (e) => {
5254
- e.preventDefault();
5255
- const startCoord = isHoriz ? e.clientX : e.clientY;
5256
- const startSize = dockedSize;
5257
- const maxSize = isHoriz ? window.innerWidth * 0.85 : window.innerHeight * 0.85;
5258
- const sign = dockSide === "bottom" || dockSide === "right" ? -1 : 1;
5259
- const onMove = (me) => {
5260
- const delta = (isHoriz ? me.clientX : me.clientY) - startCoord;
5261
- onChange(Math.max(DOCKED_SIZE_MIN, Math.min(maxSize, startSize + sign * delta)));
5262
- };
5263
- const onUp = () => {
5264
- window.removeEventListener("mousemove", onMove);
5265
- window.removeEventListener("mouseup", onUp);
5266
- };
5267
- window.addEventListener("mousemove", onMove);
5268
- window.addEventListener("mouseup", onUp);
5269
- };
5270
- 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" };
5271
- return /* @__PURE__ */ jsx22("div", {
5272
- onMouseDown,
5273
- style: {
5274
- position: "absolute",
5275
- zIndex: 10,
5276
- background: "transparent",
5277
- ...edgeStyle
5278
- }
5279
- });
5280
- }
5281
- var SPLIT_RATIO_MIN = 0.15;
5282
- var SPLIT_RATIO_MAX = 0.85;
5283
- function SplitHandle({
5284
- horizontal,
5285
- onRatioChange
5286
- }) {
5287
- const [hovered, setHovered] = useState11(false);
5288
- const onMouseDown = (e) => {
5289
- e.preventDefault();
5290
- const container = e.currentTarget.parentElement;
5291
- if (container == null)
5292
- return;
5293
- const onMove = (me) => {
5294
- const rect = container.getBoundingClientRect();
5295
- const ratio = horizontal ? (rect.right - me.clientX) / rect.width : (rect.bottom - me.clientY) / rect.height;
5296
- onRatioChange(Math.max(SPLIT_RATIO_MIN, Math.min(SPLIT_RATIO_MAX, ratio)));
5297
- };
5298
- const onUp = () => {
5299
- window.removeEventListener("mousemove", onMove);
5300
- window.removeEventListener("mouseup", onUp);
5301
- };
5302
- window.addEventListener("mousemove", onMove);
5303
- window.addEventListener("mouseup", onUp);
5304
- };
5305
- return /* @__PURE__ */ jsx22("div", {
5306
- onMouseDown,
5307
- onMouseEnter: () => setHovered(true),
5308
- onMouseLeave: () => setHovered(false),
5309
- style: {
5310
- flex: "0 0 5px",
5311
- alignSelf: "stretch",
5312
- cursor: horizontal ? "ew-resize" : "ns-resize",
5313
- background: hovered ? DEVTOOL_COLOR_SEMANTIC_SYSTEM : "transparent",
5314
- opacity: hovered ? 0.6 : 1,
5315
- zIndex: 5
4877
+ });
5316
4878
  }
5317
4879
  });
5318
4880
  }
5319
- function DevtoolsLauncher({ items }) {
5320
- return /* @__PURE__ */ jsx22("div", {
5321
- style: {
5322
- position: "fixed",
5323
- bottom: "16px",
5324
- right: "16px",
5325
- zIndex: 2147483647,
5326
- display: "flex",
5327
- fontFamily: MONO_FONT,
5328
- fontSize: "12px"
5329
- },
5330
- children: /* @__PURE__ */ jsx22("div", {
5331
- style: {
5332
- display: "flex",
5333
- background: DEVTOOL_SECTION_BACKGROUND,
5334
- border: `1px solid ${DEVTOOL_COLOR_TEXT_FAINT}`,
5335
- borderRadius: "6px",
5336
- overflow: "hidden",
5337
- boxShadow: "0 8px 24px rgba(0,0,0,0.35)"
5338
- },
5339
- children: items.map((item, i) => /* @__PURE__ */ jsxs19("button", {
5340
- onClick: item.onOpen,
5341
- style: {
5342
- display: "flex",
5343
- alignItems: "center",
5344
- gap: "5px",
5345
- background: "transparent",
5346
- color: DEVTOOL_COLOR_TEXT_SECONDARY,
5347
- border: "none",
5348
- borderLeft: i > 0 ? `1px solid ${DEVTOOL_COLOR_TEXT_FAINT}` : "none",
5349
- cursor: "pointer",
5350
- padding: "6px 11px",
5351
- fontFamily: MONO_FONT,
5352
- fontSize: "12px",
5353
- lineHeight: "1.5"
5354
- },
5355
- children: [
5356
- /* @__PURE__ */ jsx22("span", {
5357
- children: item.icon
5358
- }),
5359
- /* @__PURE__ */ jsx22("span", {
5360
- children: item.label
5361
- }),
5362
- item.badge != null && /* @__PURE__ */ jsx22("span", {
5363
- style: { color: DEVTOOL_COLOR_SEMANTIC_SYSTEM },
5364
- children: item.badge
5365
- })
5366
- ]
5367
- }, item.id))
5368
- })
5369
- });
5370
- }
5371
-
5372
- // src/devtools/browser/devtools_dock.ts
5373
- var GLOBAL_KEY = "__NICE_DEVTOOLS_DOCK__";
5374
- var VERSION = 4;
5375
- function createCoordinator() {
5376
- const panels = new Map;
5377
- const listeners = new Set;
5378
- function toRef(panel) {
5379
- return {
5380
- id: panel.id,
5381
- label: panel.label,
5382
- icon: panel.icon,
5383
- badge: panel.badge,
5384
- onOpen: panel.onOpen
5385
- };
5386
- }
5387
- function applyBodyMargins() {
5388
- if (typeof document === "undefined")
5389
- return;
5390
- const margins = { top: 0, bottom: 0, left: 0, right: 0 };
5391
- for (const panel of panels.values()) {
5392
- if (panel.open)
5393
- margins[panel.side] += panel.size;
5394
- }
5395
- const sides = ["top", "bottom", "left", "right"];
5396
- for (const side of sides) {
5397
- if (margins[side] > 0) {
5398
- document.body.style.setProperty(`margin-${side}`, `${margins[side]}px`);
5399
- } else {
5400
- document.body.style.removeProperty(`margin-${side}`);
5401
- }
5402
- }
5403
- }
5404
- function notify() {
5405
- applyBodyMargins();
5406
- for (const listener of listeners)
5407
- listener();
5408
- }
5409
- return {
5410
- version: VERSION,
5411
- register(panel) {
5412
- panels.set(panel.id, { ...panel });
5413
- notify();
5414
- return () => {
5415
- panels.delete(panel.id);
5416
- notify();
5417
- };
5418
- },
5419
- update(id, next) {
5420
- const existing = panels.get(id);
5421
- if (existing == null)
5422
- return;
5423
- if (existing.side === next.side && existing.size === next.size && existing.open === next.open && existing.badge === next.badge) {
5424
- return;
5425
- }
5426
- panels.set(id, { ...existing, ...next });
5427
- notify();
5428
- },
5429
- getView(id) {
5430
- const list = [...panels.values()];
5431
- const anyOpen = list.some((p) => p.open);
5432
- const firstId = list.length > 0 ? list[0].id : null;
5433
- let dockOffset = 0;
5434
- let stacked = false;
5435
- const self = panels.get(id);
5436
- if (self != null && self.open) {
5437
- let seenSelf = false;
5438
- for (const panel of list) {
5439
- if (panel.id === id) {
5440
- seenSelf = true;
5441
- continue;
5442
- }
5443
- if (panel.open && panel.side === self.side) {
5444
- stacked = true;
5445
- if (!seenSelf)
5446
- dockOffset += panel.size;
5447
- }
5448
- }
5449
- }
5450
- return {
5451
- dockOffset,
5452
- stacked,
5453
- anyOpen,
5454
- isPrimary: id === firstId,
5455
- devtools: list.map(toRef),
5456
- otherClosed: list.filter((p) => !p.open && p.id !== id).map(toRef)
5457
- };
5458
- },
5459
- subscribe(listener) {
5460
- listeners.add(listener);
5461
- return () => {
5462
- listeners.delete(listener);
5463
- };
5464
- }
5465
- };
5466
- }
5467
- function getDevtoolsDockCoordinator() {
5468
- if (typeof window === "undefined")
5469
- return createCoordinator();
5470
- const host = window;
5471
- const existing = host[GLOBAL_KEY];
5472
- if (existing != null && existing.version === VERSION)
5473
- return existing;
5474
- const created = createCoordinator();
5475
- host[GLOBAL_KEY] = created;
5476
- return created;
5477
- }
5478
4881
 
5479
4882
  // src/devtools/browser/NiceActionDevtools.tsx
5480
- import { jsx as jsx23, jsxs as jsxs20, Fragment as Fragment11 } from "react/jsx-runtime";
4883
+ import { jsx as jsx20, jsxs as jsxs18, Fragment as Fragment10 } from "react/jsx-runtime";
5481
4884
  if (typeof document !== "undefined" && !document.getElementById("__nice-action-devtools-styles")) {
5482
4885
  const style = document.createElement("style");
5483
4886
  style.id = "__nice-action-devtools-styles";
@@ -5509,14 +4912,21 @@ if (typeof document !== "undefined" && !document.getElementById("__nice-action-d
5509
4912
  #__nice-action-devtools-panel ::-webkit-scrollbar-corner {
5510
4913
  background: transparent;
5511
4914
  }
4915
+ /* Shield the panel's native form controls from the host app's global element
4916
+ styles (e.g. a bare \`input {}\`/\`button {}\` rule). \`all: revert\` drops them
4917
+ to the UA baseline the panel is authored against; the panel's own inline
4918
+ styles still win, so its look is unchanged across any host. */
4919
+ #__nice-action-devtools-panel input,
4920
+ #__nice-action-devtools-panel button,
4921
+ #__nice-action-devtools-panel select,
4922
+ #__nice-action-devtools-panel textarea { all: revert; font-family: inherit; }
5512
4923
  `;
5513
4924
  document.head?.appendChild(style);
5514
4925
  }
5515
4926
  var PREFS_KEY = "__nice-action-devtools-prefs";
5516
4927
  var DOCKED_HEIGHT_DEFAULT = 320;
5517
- var DOCKED_WIDTH_DEFAULT = 420;
4928
+ var DOCKED_WIDTH_DEFAULT = 330;
5518
4929
  var DETAIL_RATIO_DEFAULT = 0.5;
5519
- var SANS_FONT2 = "ui-sans-serif, system-ui, sans-serif";
5520
4930
  var DOCK_POSITIONS = ["dock-bottom", "dock-top", "dock-left", "dock-right"];
5521
4931
  function isDockPosition(value) {
5522
4932
  return typeof value === "string" && DOCK_POSITIONS.includes(value);
@@ -5561,7 +4971,7 @@ function getHandlerKey(entry) {
5561
4971
  function entriesShareActionInput(a, b) {
5562
4972
  if (a.actionId !== b.actionId || a.domain !== b.domain)
5563
4973
  return false;
5564
- return a.inputHash != null && b.inputHash != null ? a.inputHash === b.inputHash : safeStringify(a.input, 0) === safeStringify(b.input, 0);
4974
+ return a.inputHash != null && b.inputHash != null ? a.inputHash === b.inputHash : safeStringify2(a.input, 0) === safeStringify2(b.input, 0);
5565
4975
  }
5566
4976
  function canGroupWith(a, b) {
5567
4977
  if (!entriesShareActionInput(a, b))
@@ -5592,19 +5002,19 @@ function NiceActionDevtools({ forceEnable, ...props }) {
5592
5002
  if (!forceEnable && process["env"]["NODE_ENV"] !== "development") {
5593
5003
  return null;
5594
5004
  }
5595
- return /* @__PURE__ */ jsx23(NiceActionDevtools_Panel, {
5005
+ return /* @__PURE__ */ jsx20(NiceActionDevtools_Panel, {
5596
5006
  ...props
5597
5007
  });
5598
5008
  }
5599
5009
  function NiceActionDevtools_Panel({
5600
5010
  core,
5601
- position: defaultPosition = "dock-bottom",
5011
+ position: defaultPosition = "dock-right",
5602
5012
  initialOpen = false
5603
5013
  }) {
5604
- const [prefs, setPrefsRaw] = useState12(() => readPrefs(defaultPosition, initialOpen));
5605
- const [entries, setEntries] = useState12([]);
5606
- const [selectedCuid, setSelectedCuid] = useState12(null);
5607
- useEffect4(() => core.subscribe(setEntries), [core]);
5014
+ const [prefs, setPrefsRaw] = useState10(() => readPrefs(defaultPosition, initialOpen));
5015
+ const [entries, setEntries] = useState10([]);
5016
+ const [selectedCuid, setSelectedCuid] = useState10(null);
5017
+ useEffect3(() => core.subscribe(setEntries), [core]);
5608
5018
  const groups = useMemo3(() => {
5609
5019
  const byCuid = new Map(entries.map((e) => [e.cuid, e]));
5610
5020
  const roots = entries.filter((e) => e.parentCuid == null || !byCuid.has(e.parentCuid));
@@ -5626,16 +5036,24 @@ function NiceActionDevtools_Panel({
5626
5036
  const setPrefs = (update) => {
5627
5037
  setPrefsRaw((prev) => ({ ...prev, ...update }));
5628
5038
  };
5629
- useEffect4(() => {
5039
+ useEffect3(() => {
5630
5040
  const timer = setTimeout(() => writePrefs(prefs), 250);
5631
5041
  return () => clearTimeout(timer);
5632
5042
  }, [prefs]);
5633
- const { position, isOpen, dockedHeight, dockedWidth, detailRatio, stayOnLatest, followLatestOnSelect } = prefs;
5043
+ const {
5044
+ position,
5045
+ isOpen,
5046
+ dockedHeight,
5047
+ dockedWidth,
5048
+ detailRatio,
5049
+ stayOnLatest,
5050
+ followLatestOnSelect
5051
+ } = prefs;
5634
5052
  const dockSide = getDockSide(position);
5635
5053
  const isHorizDock = dockSide === "top" || dockSide === "bottom";
5636
5054
  const dockedSize = isHorizDock ? dockedHeight : dockedWidth;
5637
5055
  const latestCuid = groups.length > 0 ? groups[0].representative.cuid : null;
5638
- useEffect4(() => {
5056
+ useEffect3(() => {
5639
5057
  if (stayOnLatest && latestCuid != null)
5640
5058
  setSelectedCuid(latestCuid);
5641
5059
  }, [stayOnLatest, latestCuid]);
@@ -5664,7 +5082,7 @@ function NiceActionDevtools_Panel({
5664
5082
  const panelId = useId();
5665
5083
  const [, bumpView] = useReducer((n) => n + 1, 0);
5666
5084
  const badge = runningCount > 0 ? `${runningCount}●` : undefined;
5667
- useEffect4(() => {
5085
+ useEffect3(() => {
5668
5086
  const unregister = dock.register({
5669
5087
  id: panelId,
5670
5088
  label: "actions",
@@ -5681,7 +5099,7 @@ function NiceActionDevtools_Panel({
5681
5099
  unsubscribe();
5682
5100
  };
5683
5101
  }, [dock, panelId]);
5684
- useEffect4(() => {
5102
+ useEffect3(() => {
5685
5103
  dock.update(panelId, { side: dockSide, size: dockedSize, open: isOpen, badge });
5686
5104
  }, [dock, panelId, dockSide, dockedSize, isOpen, badge]);
5687
5105
  const view = dock.getView(panelId);
@@ -5693,7 +5111,7 @@ function NiceActionDevtools_Panel({
5693
5111
  };
5694
5112
  if (!isOpen) {
5695
5113
  if (view.isPrimary && !view.anyOpen) {
5696
- return /* @__PURE__ */ jsx23(DevtoolsLauncher, {
5114
+ return /* @__PURE__ */ jsx20(DevtoolsLauncher, {
5697
5115
  items: view.devtools
5698
5116
  });
5699
5117
  }
@@ -5745,16 +5163,17 @@ function NiceActionDevtools_Panel({
5745
5163
  },
5746
5164
  childEntriesMap
5747
5165
  };
5748
- return /* @__PURE__ */ jsxs20("div", {
5166
+ return /* @__PURE__ */ jsxs18("div", {
5749
5167
  id: "__nice-action-devtools-panel",
5750
5168
  style: panelStyle,
5751
5169
  children: [
5752
- /* @__PURE__ */ jsx23(ResizeHandle, {
5170
+ /* @__PURE__ */ jsx20(ResizeHandle, {
5753
5171
  dockSide,
5754
5172
  dockedSize,
5755
5173
  onChange: (size) => setPrefs(isHorizDock ? { dockedHeight: size } : { dockedWidth: size })
5756
5174
  }),
5757
- /* @__PURE__ */ jsx23(PanelHeader, {
5175
+ /* @__PURE__ */ jsx20(PanelHeader, {
5176
+ title: "⚡ action",
5758
5177
  position,
5759
5178
  onPositionChange: (p) => setPrefs({ position: p }),
5760
5179
  onClose: () => setPrefs({ isOpen: false }),
@@ -5764,7 +5183,7 @@ function NiceActionDevtools_Panel({
5764
5183
  } : undefined,
5765
5184
  openOthers: view.otherClosed
5766
5185
  }),
5767
- /* @__PURE__ */ jsxs20("div", {
5186
+ /* @__PURE__ */ jsxs18("div", {
5768
5187
  style: {
5769
5188
  flex: 1,
5770
5189
  display: "flex",
@@ -5773,7 +5192,7 @@ function NiceActionDevtools_Panel({
5773
5192
  minHeight: 0
5774
5193
  },
5775
5194
  children: [
5776
- /* @__PURE__ */ jsxs20("div", {
5195
+ /* @__PURE__ */ jsxs18("div", {
5777
5196
  style: {
5778
5197
  flexGrow: selectedEntry != null ? 1 - detailRatio : 1,
5779
5198
  flexShrink: 1,
@@ -5785,7 +5204,8 @@ function NiceActionDevtools_Panel({
5785
5204
  overflow: "hidden"
5786
5205
  },
5787
5206
  children: [
5788
- /* @__PURE__ */ jsx23(FollowToggles, {
5207
+ /* @__PURE__ */ jsx20(FollowLatestToggles, {
5208
+ noun: "action",
5789
5209
  stayOnLatest,
5790
5210
  onStayOnLatestChange: (next) => setPrefs({ stayOnLatest: next }),
5791
5211
  followLatestOnSelect,
@@ -5797,19 +5217,19 @@ function NiceActionDevtools_Panel({
5797
5217
  }
5798
5218
  }
5799
5219
  }),
5800
- /* @__PURE__ */ jsx23(ActionList, {
5220
+ /* @__PURE__ */ jsx20(ActionList, {
5801
5221
  ...virtualListProps,
5802
5222
  style: { width: "100%", flex: 1, minHeight: 0, overflowY: "auto" }
5803
5223
  })
5804
5224
  ]
5805
5225
  }),
5806
- selectedEntry != null && /* @__PURE__ */ jsxs20(Fragment11, {
5226
+ selectedEntry != null && /* @__PURE__ */ jsxs18(Fragment10, {
5807
5227
  children: [
5808
- /* @__PURE__ */ jsx23(SplitHandle, {
5228
+ /* @__PURE__ */ jsx20(SplitHandle, {
5809
5229
  horizontal: isHorizDock,
5810
5230
  onRatioChange: (ratio) => setPrefs({ detailRatio: ratio })
5811
5231
  }),
5812
- /* @__PURE__ */ jsx23("div", {
5232
+ /* @__PURE__ */ jsx20("div", {
5813
5233
  style: {
5814
5234
  flexGrow: detailRatio,
5815
5235
  flexShrink: 1,
@@ -5827,7 +5247,7 @@ function NiceActionDevtools_Panel({
5827
5247
  boxShadow: "inset 0 18px 36px -14px rgba(0,0,0,0.8)"
5828
5248
  }
5829
5249
  },
5830
- children: /* @__PURE__ */ jsx23(ActionDetailPanel, {
5250
+ children: /* @__PURE__ */ jsx20(ActionDetailPanel, {
5831
5251
  entry: selectedEntry,
5832
5252
  parent: selectedEntryParent,
5833
5253
  childEntries: selectedEntryChildren,
@@ -5841,82 +5261,6 @@ function NiceActionDevtools_Panel({
5841
5261
  ]
5842
5262
  });
5843
5263
  }
5844
- function FollowToggles({
5845
- stayOnLatest,
5846
- onStayOnLatestChange,
5847
- followLatestOnSelect,
5848
- onFollowLatestOnSelectChange
5849
- }) {
5850
- return /* @__PURE__ */ jsxs20("div", {
5851
- style: {
5852
- display: "flex",
5853
- flexDirection: "column",
5854
- flexShrink: 0,
5855
- paddingBottom: "3px",
5856
- background: DEVTOOL_SECTION_BACKGROUND,
5857
- borderBottom: `1px solid ${DEVTOOL_LIST_BASE_BACKGROUND}`
5858
- },
5859
- children: [
5860
- /* @__PURE__ */ jsx23(ToggleLabel, {
5861
- title: "Auto-select the most recent action so the detail pane keeps showing the latest as new actions land",
5862
- checked: stayOnLatest,
5863
- onChange: onStayOnLatestChange,
5864
- children: "Follow latest"
5865
- }),
5866
- /* @__PURE__ */ jsxs20("div", {
5867
- style: { display: "flex", alignItems: "center", paddingLeft: "12px", marginTop: "-4px" },
5868
- children: [
5869
- /* @__PURE__ */ jsx23("span", {
5870
- "aria-hidden": true,
5871
- style: {
5872
- color: DEVTOOL_COLOR_TEXT_MUTED,
5873
- fontFamily: SANS_FONT2,
5874
- fontSize: "10px",
5875
- lineHeight: 1
5876
- },
5877
- children: "└"
5878
- }),
5879
- /* @__PURE__ */ jsx23(ToggleLabel, {
5880
- title: "When you click the latest action, turn 'Follow latest' back on so the view resumes tracking new actions. Turn this off to pin exactly to the action you click instead.",
5881
- checked: followLatestOnSelect,
5882
- onChange: onFollowLatestOnSelectChange,
5883
- children: "clicking latest re-follows"
5884
- })
5885
- ]
5886
- })
5887
- ]
5888
- });
5889
- }
5890
- function ToggleLabel({
5891
- checked,
5892
- onChange,
5893
- title,
5894
- children
5895
- }) {
5896
- return /* @__PURE__ */ jsxs20("label", {
5897
- title,
5898
- style: {
5899
- display: "flex",
5900
- alignItems: "center",
5901
- gap: "6px",
5902
- padding: "5px 10px",
5903
- cursor: "pointer",
5904
- userSelect: "none",
5905
- color: checked ? DEVTOOL_COLOR_TEXT_SECONDARY : DEVTOOL_COLOR_TEXT_MUTED,
5906
- fontSize: "10px",
5907
- fontFamily: SANS_FONT2
5908
- },
5909
- children: [
5910
- /* @__PURE__ */ jsx23("input", {
5911
- type: "checkbox",
5912
- checked,
5913
- onChange: (e) => onChange(e.target.checked),
5914
- style: { accentColor: DEVTOOL_COLOR_SEMANTIC_SYSTEM, cursor: "pointer", margin: 0 }
5915
- }),
5916
- children
5917
- ]
5918
- });
5919
- }
5920
5264
  export {
5921
5265
  NiceActionDevtools,
5922
5266
  ActionDevtoolsCore