@tonyclaw/agent-inspector 2.1.18 → 2.1.20

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 (44) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/assets/{CompareDrawer-Fqqw5Lci.js → CompareDrawer-BRCSDHn3.js} +1 -1
  3. package/.output/public/assets/ProxyViewerContainer-v5Lmx35X.js +106 -0
  4. package/.output/public/assets/{ReplayDialog-hYhz_i6W.js → ReplayDialog-Dkez3vxu.js} +1 -1
  5. package/.output/public/assets/{RequestAnatomy-CTuWbtwC.js → RequestAnatomy-CHBODGDF.js} +1 -1
  6. package/.output/public/assets/{ResponseView-CsZ7S5Gv.js → ResponseView-Dk2dJY-B.js} +2 -2
  7. package/.output/public/assets/{StreamingChunkSequence-PIbJMotU.js → StreamingChunkSequence-gZpqWwKK.js} +1 -1
  8. package/.output/public/assets/_sessionId-DziA4ZD4.js +1 -0
  9. package/.output/public/assets/{index-F7mynwuH.js → index-B1-V3HCD.js} +1 -1
  10. package/.output/public/assets/index-ChgjUix0.css +1 -0
  11. package/.output/public/assets/index-DkHcxpXi.js +1 -0
  12. package/.output/public/assets/{json-viewer-DCXtNmmD.js → json-viewer-CtvzeDPb.js} +1 -1
  13. package/.output/public/assets/{main-BJZf7_Ib.js → main-CgmDEMGA.js} +2 -2
  14. package/.output/server/{_sessionId-DjSHDNh8.mjs → _sessionId-CbsSRLSa.mjs} +2 -2
  15. package/.output/server/_ssr/{CompareDrawer-Dal52IFo.mjs → CompareDrawer-BiSslksi.mjs} +2 -2
  16. package/.output/server/_ssr/{ProxyViewerContainer-CVqFZGff.mjs → ProxyViewerContainer-DIN2AjhM.mjs} +216 -183
  17. package/.output/server/_ssr/{ReplayDialog-BOEgdMes.mjs → ReplayDialog-DzoWpTis.mjs} +3 -3
  18. package/.output/server/_ssr/{RequestAnatomy-gch7_vCV.mjs → RequestAnatomy-D2tbgAPn.mjs} +2 -2
  19. package/.output/server/_ssr/{ResponseView-lEWPy-H4.mjs → ResponseView-BFP7zo8Z.mjs} +2 -2
  20. package/.output/server/_ssr/{StreamingChunkSequence-DnudbJ1O.mjs → StreamingChunkSequence-BfiRZW_k.mjs} +2 -2
  21. package/.output/server/_ssr/{index-Cza8zDrW.mjs → index-OlcgE4Tl.mjs} +2 -2
  22. package/.output/server/_ssr/index.mjs +2 -2
  23. package/.output/server/_ssr/{json-viewer-C2lIVEX3.mjs → json-viewer-DmhEr-jg.mjs} +2 -2
  24. package/.output/server/_ssr/{router-bF9uzd1k.mjs → router-BMdwHLHh.mjs} +80 -21
  25. package/.output/server/{_tanstack-start-manifest_v-ErvW-mtr.mjs → _tanstack-start-manifest_v-CL4qjwkQ.mjs} +1 -1
  26. package/.output/server/index.mjs +77 -77
  27. package/package.json +1 -1
  28. package/src/components/groups/GroupsDialog.tsx +71 -10
  29. package/src/components/proxy-viewer/ConversationGroupList.tsx +11 -11
  30. package/src/components/proxy-viewer/ConversationHeader.tsx +7 -7
  31. package/src/components/proxy-viewer/LogEntry.tsx +15 -26
  32. package/src/components/proxy-viewer/LogEntryHeader.tsx +11 -14
  33. package/src/components/proxy-viewer/RequestToolsPanel.tsx +15 -15
  34. package/src/components/proxy-viewer/ThreadConnector.tsx +3 -3
  35. package/src/components/proxy-viewer/ToolTraceEvents.tsx +1 -1
  36. package/src/components/proxy-viewer/TurnGroup.tsx +10 -14
  37. package/src/lib/groupContract.ts +6 -0
  38. package/src/proxy/groupStore.ts +24 -0
  39. package/src/routes/api/groups.ts +41 -1
  40. package/src/services/groups.ts +8 -0
  41. package/.output/public/assets/ProxyViewerContainer-CP_RzwW9.js +0 -106
  42. package/.output/public/assets/_sessionId-CUGA9qU3.js +0 -1
  43. package/.output/public/assets/index-G4dTUobw.js +0 -1
  44. package/.output/public/assets/index-gvYkgMPF.css +0 -1
@@ -1,5 +1,5 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports, a as React } from "../_libs/react.mjs";
2
- import { I as InspectorGroupsListResponseSchema, C as CapturedLogSchema, D as DEFAULT_CAPTURE_MODE, a as DEFAULT_SLOW_RESPONSE_THRESHOLD_SECONDS, b as DEFAULT_PROVIDER_TEST_TIMEOUT_SECONDS, c as DEFAULT_TIME_DISPLAY_FORMAT, d as RuntimeConfigSchema, p as packageJson, P as ProviderConfigSchema, i as apiFormatForPath, n as GroupEvidenceExportResultSchema, o as DeleteInspectorGroupResponseSchema, y as createPendingProviderTestResults, z as ProviderTestResultsSchema, B as createFailedProviderTestResults, M as MAX_SLOW_RESPONSE_THRESHOLD_SECONDS, E as MAX_PROVIDER_TEST_TIMEOUT_SECONDS, T as TimeDisplayFormatSchema, l as AlertSummarySchema, m as AlertListResponseSchema, G as GroupEvidenceReadResponseSchema, t as maskApiKey, u as PATH_V1_MESSAGES, v as PATH_V1_CHAT_COMPLETIONS, w as PATH_V1_RESPONSES, q as providerHasContextMetadata, r as findProviderModelMetadata, f as parseOpenAIResponse, g as parseOpenAIResponsesResponse, O as OpenAIRequestSchema, h as OpenAIResponsesRequestSchema, A as AnthropicResponseSchema$1, e as AnthropicRequestSchema, s as safeGetOwnProperty, F as resolveProviderContextWindow, j as getSessionPath, x as previewUpstreamUrl, K as KnowledgeCandidateSchema, H as isPlainRecord, k as stripClaudeCodeBillingHeader, L as LogBodyChunkSchema } from "./router-bF9uzd1k.mjs";
2
+ import { I as InspectorGroupsListResponseSchema, C as CapturedLogSchema, D as DEFAULT_CAPTURE_MODE, a as DEFAULT_SLOW_RESPONSE_THRESHOLD_SECONDS, b as DEFAULT_PROVIDER_TEST_TIMEOUT_SECONDS, c as DEFAULT_TIME_DISPLAY_FORMAT, d as RuntimeConfigSchema, p as packageJson, P as ProviderConfigSchema, i as apiFormatForPath, n as DeleteInspectorGroupsResponseSchema, o as GroupEvidenceExportResultSchema, q as DeleteInspectorGroupResponseSchema, z as createPendingProviderTestResults, B as ProviderTestResultsSchema, E as createFailedProviderTestResults, M as MAX_SLOW_RESPONSE_THRESHOLD_SECONDS, F as MAX_PROVIDER_TEST_TIMEOUT_SECONDS, T as TimeDisplayFormatSchema, l as AlertSummarySchema, m as AlertListResponseSchema, G as GroupEvidenceReadResponseSchema, u as maskApiKey, v as PATH_V1_MESSAGES, w as PATH_V1_CHAT_COMPLETIONS, x as PATH_V1_RESPONSES, r as providerHasContextMetadata, t as findProviderModelMetadata, f as parseOpenAIResponse, g as parseOpenAIResponsesResponse, O as OpenAIRequestSchema, h as OpenAIResponsesRequestSchema, A as AnthropicResponseSchema$1, e as AnthropicRequestSchema, s as safeGetOwnProperty, H as resolveProviderContextWindow, j as getSessionPath, y as previewUpstreamUrl, K as KnowledgeCandidateSchema, J as isPlainRecord, k as stripClaudeCodeBillingHeader, L as LogBodyChunkSchema } from "./router-BMdwHLHh.mjs";
3
3
  import { u as useSWR, a as useSWRConfig } from "../_libs/swr.mjs";
4
4
  import { J as JSZip } from "../_libs/jszip.mjs";
5
5
  import { c as clsx } from "../_libs/clsx.mjs";
@@ -1481,7 +1481,7 @@ function resolveLogFormat(log) {
1481
1481
  const pathFormat = apiFormatForPath(log.path);
1482
1482
  return pathFormat === "unknown" ? log.apiFormat : pathFormat;
1483
1483
  }
1484
- const HEADER_ACTION_BUTTON_CLASS$1 = "border border-input bg-background hover:bg-accent hover:text-accent-foreground inline-flex size-8 shrink-0 cursor-pointer items-center justify-center rounded-md text-muted-foreground transition-colors hover:text-foreground";
1484
+ const HEADER_ACTION_BUTTON_CLASS$1 = "bg-white/[0.045] hover:bg-white/[0.075] inline-flex size-8 shrink-0 cursor-pointer items-center justify-center rounded-md text-muted-foreground transition-colors hover:text-foreground";
1485
1485
  function HeaderMetric({
1486
1486
  icon,
1487
1487
  children,
@@ -1492,7 +1492,7 @@ function HeaderMetric({
1492
1492
  "span",
1493
1493
  {
1494
1494
  className: cn(
1495
- "border border-border bg-muted/30 inline-flex h-7 min-w-0 items-center gap-1.5 rounded-md px-2 text-xs text-muted-foreground",
1495
+ "bg-white/[0.045] inline-flex h-7 min-w-0 items-center gap-1.5 rounded-md px-2 text-xs text-muted-foreground",
1496
1496
  className
1497
1497
  ),
1498
1498
  title,
@@ -1556,8 +1556,8 @@ function ConversationHeader({
1556
1556
  "data-nav-id": `conv-${conversationId}`,
1557
1557
  "data-nav-action": expanded ? "collapse" : "expand",
1558
1558
  className: cn(
1559
- "border border-border bg-card shadow-sm flex cursor-pointer items-start gap-3 rounded-[8px] px-3 py-2.5 transition-colors",
1560
- "hover:border-cyan-200/20",
1559
+ "bg-card/80 shadow-sm flex cursor-pointer items-start gap-3 rounded-[8px] px-3 py-2.5 transition-colors",
1560
+ "hover:bg-card",
1561
1561
  "select-none",
1562
1562
  "sticky top-0 z-10 mb-2",
1563
1563
  "focus-visible:ring-1 focus-visible:ring-cyan-300/35 focus-visible:outline-none"
@@ -1609,7 +1609,7 @@ function ConversationHeader({
1609
1609
  !isFallbackConversation && showProcessMetadata && clientPid !== null && clientPid !== void 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs(
1610
1610
  "span",
1611
1611
  {
1612
- className: "border border-border bg-muted/40 shrink-0 rounded px-1.5 py-0.5 font-mono text-xs tabular-nums text-muted-foreground",
1612
+ className: "bg-white/[0.045] shrink-0 rounded px-1.5 py-0.5 font-mono text-xs tabular-nums text-muted-foreground",
1613
1613
  title: `Client process ID ${clientPid}`,
1614
1614
  children: [
1615
1615
  "PID ",
@@ -1628,7 +1628,7 @@ function ConversationHeader({
1628
1628
  showClientIdentity && clientDisplayLabel !== null && clientDisplayLabel !== "" && /* @__PURE__ */ jsxRuntimeExports.jsxs(
1629
1629
  "span",
1630
1630
  {
1631
- className: "border border-border bg-muted/30 inline-flex h-6 max-w-[180px] shrink-0 items-center gap-1 rounded-md px-1.5 text-xs text-muted-foreground",
1631
+ className: "bg-white/[0.045] inline-flex h-6 max-w-[180px] shrink-0 items-center gap-1 rounded-md px-1.5 text-xs text-muted-foreground",
1632
1632
  title: clientTooltip ?? clientDisplayLabel,
1633
1633
  children: [
1634
1634
  /* @__PURE__ */ jsxRuntimeExports.jsx(ClientLogo, { client: clientApp, className: "size-4 shrink-0" }),
@@ -1678,7 +1678,7 @@ function ConversationHeader({
1678
1678
  /* @__PURE__ */ jsxRuntimeExports.jsx(
1679
1679
  "span",
1680
1680
  {
1681
- className: "border border-input bg-background hover:bg-accent hover:text-accent-foreground inline-flex size-8 shrink-0 items-center justify-center rounded-md text-slate-200",
1681
+ className: "bg-white/[0.045] hover:bg-white/[0.075] inline-flex size-8 shrink-0 items-center justify-center rounded-md text-slate-200",
1682
1682
  "aria-hidden": "true",
1683
1683
  children: expanded ? /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronDown, { className: "size-4 shrink-0" }) : isLoading ? /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "size-4 shrink-0 animate-spin" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronRight, { className: "size-4 shrink-0" })
1684
1684
  }
@@ -1959,27 +1959,27 @@ function useCopyFeedback(text) {
1959
1959
  return { copied, copy };
1960
1960
  }
1961
1961
  const LazyCompareDrawer = reactExports.lazy(
1962
- () => import("./CompareDrawer-Dal52IFo.mjs").then((m) => ({ default: m.CompareDrawer }))
1962
+ () => import("./CompareDrawer-BiSslksi.mjs").then((m) => ({ default: m.CompareDrawer }))
1963
1963
  );
1964
1964
  const LazyReplayDialog = reactExports.lazy(
1965
- () => import("./ReplayDialog-BOEgdMes.mjs").then((m) => ({ default: m.ReplayDialog }))
1965
+ () => import("./ReplayDialog-DzoWpTis.mjs").then((m) => ({ default: m.ReplayDialog }))
1966
1966
  );
1967
1967
  const LazyRequestAnatomy = reactExports.lazy(
1968
- () => import("./RequestAnatomy-gch7_vCV.mjs").then((m) => ({ default: m.RequestAnatomy }))
1968
+ () => import("./RequestAnatomy-D2tbgAPn.mjs").then((m) => ({ default: m.RequestAnatomy }))
1969
1969
  );
1970
1970
  const LazyResponseView = reactExports.lazy(
1971
- () => import("./ResponseView-lEWPy-H4.mjs").then((m) => ({ default: m.ResponseView }))
1971
+ () => import("./ResponseView-BFP7zo8Z.mjs").then((m) => ({ default: m.ResponseView }))
1972
1972
  );
1973
1973
  const LazyStreamingChunkSequence = reactExports.lazy(
1974
- () => import("./StreamingChunkSequence-DnudbJ1O.mjs").then((m) => ({
1974
+ () => import("./StreamingChunkSequence-BfiRZW_k.mjs").then((m) => ({
1975
1975
  default: m.StreamingChunkSequence
1976
1976
  }))
1977
1977
  );
1978
1978
  const LazyJsonViewer = reactExports.lazy(
1979
- () => import("./json-viewer-C2lIVEX3.mjs").then((m) => ({ default: m.JsonViewer }))
1979
+ () => import("./json-viewer-DmhEr-jg.mjs").then((m) => ({ default: m.JsonViewer }))
1980
1980
  );
1981
1981
  const LazyJsonViewerFromString = reactExports.lazy(
1982
- () => import("./json-viewer-C2lIVEX3.mjs").then((m) => ({ default: m.JsonViewerFromString }))
1982
+ () => import("./json-viewer-DmhEr-jg.mjs").then((m) => ({ default: m.JsonViewerFromString }))
1983
1983
  );
1984
1984
  const HIGHLIGHT_DURATION_MS = 1200;
1985
1985
  const MAX_HIGHLIGHT_ATTEMPTS = 12;
@@ -2439,10 +2439,10 @@ function Badge({
2439
2439
  );
2440
2440
  }
2441
2441
  const STATUS_BADGE_CLASSES = {
2442
- success: "bg-slate-300/[0.08] text-slate-100 border-slate-300/20",
2443
- client_error: "bg-amber-300/[0.10] text-amber-100 border-amber-300/30",
2444
- server_error: "bg-rose-400/[0.10] text-rose-100 border-rose-300/30",
2445
- pending: "bg-cyan-300/[0.08] text-cyan-100 border-cyan-300/25"
2442
+ success: "bg-slate-300/[0.08] text-slate-100 border-transparent",
2443
+ client_error: "bg-amber-300/[0.10] text-amber-100 border-transparent",
2444
+ server_error: "bg-rose-400/[0.10] text-rose-100 border-transparent",
2445
+ pending: "bg-cyan-300/[0.08] text-cyan-100 border-transparent"
2446
2446
  };
2447
2447
  const STATUS_CUE_CLASSES = {
2448
2448
  success: {
@@ -2462,8 +2462,8 @@ const STATUS_CUE_CLASSES = {
2462
2462
  dot: "bg-cyan-200 shadow-[0_0_14px_rgba(103,232,249,0.8)]"
2463
2463
  }
2464
2464
  };
2465
- const HEADER_ACTION_BUTTON_CLASS = "border border-input bg-background hover:bg-accent hover:text-accent-foreground size-8 text-muted-foreground shadow-none hover:text-cyan-100";
2466
- const TELEMETRY_CHIP_CLASS = "border border-border bg-muted/40 flex h-7 items-center gap-1 rounded-md px-2 text-xs";
2465
+ const HEADER_ACTION_BUTTON_CLASS = "border border-transparent bg-white/[0.045] hover:bg-white/[0.075] size-8 text-muted-foreground shadow-none hover:text-cyan-100";
2466
+ const TELEMETRY_CHIP_CLASS = "bg-white/[0.045] flex h-7 items-center gap-1 rounded-md px-2 text-xs";
2467
2467
  function formatElapsed$3(ms) {
2468
2468
  if (ms < 1e3) return `${ms}ms`;
2469
2469
  return `${(ms / 1e3).toFixed(1)}s`;
@@ -2537,8 +2537,8 @@ const LogEntryHeader = reactExports.memo(function({
2537
2537
  "data-nav-action": expanded ? "collapse" : "expand",
2538
2538
  className: cn(
2539
2539
  "group/header relative isolate flex min-w-0 cursor-pointer items-start gap-2 overflow-hidden px-3 py-2 transition-[background-color,border-color,box-shadow]",
2540
- expanded ? "bg-white/[0.035] shadow-[inset_0_1px_0_rgba(255,255,255,0.10)]" : "bg-transparent hover:bg-white/[0.035]",
2541
- "select-none before:pointer-events-none before:absolute before:inset-x-3 before:top-0 before:h-px before:bg-white/12",
2540
+ expanded ? "bg-white/[0.04]" : "bg-transparent hover:bg-white/[0.035]",
2541
+ "select-none",
2542
2542
  "focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:outline-none"
2543
2543
  ),
2544
2544
  onClick: onToggle,
@@ -2554,7 +2554,7 @@ const LogEntryHeader = reactExports.memo(function({
2554
2554
  "span",
2555
2555
  {
2556
2556
  className: cn(
2557
- "border border-border bg-muted/40 inline-flex h-8 shrink-0 items-center gap-2 rounded-md px-2 font-mono",
2557
+ "inline-flex h-8 shrink-0 items-center gap-2 rounded-md px-2 font-mono",
2558
2558
  statusCue.frame
2559
2559
  ),
2560
2560
  children: [
@@ -2566,7 +2566,7 @@ const LogEntryHeader = reactExports.memo(function({
2566
2566
  ]
2567
2567
  }
2568
2568
  ),
2569
- /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "border border-border bg-muted/40 flex h-7 shrink-0 items-center gap-1 rounded-md px-2 text-xs text-muted-foreground", children: [
2569
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "bg-white/[0.045] flex h-7 shrink-0 items-center gap-1 rounded-md px-2 text-xs text-muted-foreground", children: [
2570
2570
  /* @__PURE__ */ jsxRuntimeExports.jsx(Clock, { className: "size-3" }),
2571
2571
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono tabular-nums", title: log.timestamp, children: formatTimestamp$2(log.timestamp, timeDisplayFormat) })
2572
2572
  ] }),
@@ -2823,7 +2823,7 @@ const LogEntryHeader = reactExports.memo(function({
2823
2823
  /* @__PURE__ */ jsxRuntimeExports.jsx(
2824
2824
  "span",
2825
2825
  {
2826
- className: "border border-input bg-background hover:bg-accent hover:text-accent-foreground inline-flex size-8 shrink-0 items-center justify-center rounded-md text-slate-200",
2826
+ className: "bg-white/[0.045] hover:bg-white/[0.075] inline-flex size-8 shrink-0 items-center justify-center rounded-md text-slate-200",
2827
2827
  "aria-hidden": "true",
2828
2828
  children: expanded ? /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronDown, { className: "size-4 shrink-0" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronRight, { className: "size-4 shrink-0" })
2829
2829
  }
@@ -2911,13 +2911,13 @@ const CATEGORY_LABELS = {
2911
2911
  other: "other"
2912
2912
  };
2913
2913
  const CATEGORY_CLASSES = {
2914
- file: "border-blue-400/20 bg-blue-400/5 text-blue-300",
2915
- shell: "border-teal-400/20 bg-teal-400/5 text-teal-300",
2916
- browser: "border-cyan-400/20 bg-cyan-400/5 text-cyan-300",
2917
- web: "border-sky-400/20 bg-sky-400/5 text-sky-300",
2918
- mcp: "border-violet-400/20 bg-violet-400/5 text-violet-300",
2919
- code: "border-emerald-400/20 bg-emerald-400/5 text-emerald-300",
2920
- other: "border-muted-foreground/20 bg-muted/30 text-muted-foreground"
2914
+ file: "border-transparent bg-blue-400/5 text-blue-300",
2915
+ shell: "border-transparent bg-teal-400/5 text-teal-300",
2916
+ browser: "border-transparent bg-cyan-400/5 text-cyan-300",
2917
+ web: "border-transparent bg-sky-400/5 text-sky-300",
2918
+ mcp: "border-transparent bg-violet-400/5 text-violet-300",
2919
+ code: "border-transparent bg-emerald-400/5 text-emerald-300",
2920
+ other: "border-transparent bg-muted/30 text-muted-foreground"
2921
2921
  };
2922
2922
  function CategoryIcon({ category }) {
2923
2923
  switch (category) {
@@ -2960,7 +2960,7 @@ function ToolRow({ tool, called }) {
2960
2960
  const [open, setOpen] = reactExports.useState(false);
2961
2961
  const nameCopy = useCopyFeedback(tool.name);
2962
2962
  const hasDetails = tool.description !== null || tool.requiredParameters.length > 0 || tool.schema !== null;
2963
- return /* @__PURE__ */ jsxRuntimeExports.jsx(Collapsible, { open, onOpenChange: setOpen, children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "border border-border bg-card shadow-sm rounded-[8px]", children: [
2963
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(Collapsible, { open, onOpenChange: setOpen, children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-white/[0.035] rounded-[8px]", children: [
2964
2964
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex min-w-0 items-center gap-2 px-2.5 py-2", children: [
2965
2965
  /* @__PURE__ */ jsxRuntimeExports.jsxs(
2966
2966
  "button",
@@ -2995,17 +2995,17 @@ function ToolRow({ tool, called }) {
2995
2995
  "button",
2996
2996
  {
2997
2997
  type: "button",
2998
- className: "border border-input bg-background hover:bg-accent hover:text-accent-foreground inline-flex size-7 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
2998
+ className: "bg-white/[0.045] hover:bg-white/[0.075] inline-flex size-7 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
2999
2999
  onClick: nameCopy.copy,
3000
3000
  "aria-label": nameCopy.copied ? "Copied tool name" : "Copy tool name",
3001
3001
  children: nameCopy.copied ? /* @__PURE__ */ jsxRuntimeExports.jsx(Check, { className: "size-3.5 text-emerald-400" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(Copy, { className: "size-3.5" })
3002
3002
  }
3003
3003
  )
3004
3004
  ] }),
3005
- /* @__PURE__ */ jsxRuntimeExports.jsx(CollapsibleContent, { children: open && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-2 border-t border-white/10 bg-white/[0.025] px-2.5 py-2", children: [
3005
+ /* @__PURE__ */ jsxRuntimeExports.jsx(CollapsibleContent, { children: open && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-2 bg-white/[0.025] px-2.5 py-2", children: [
3006
3006
  tool.description !== null && /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs leading-relaxed text-muted-foreground", children: tool.description }),
3007
3007
  /* @__PURE__ */ jsxRuntimeExports.jsx(RequiredParameters, { names: tool.requiredParameters }),
3008
- tool.schema !== null && /* @__PURE__ */ jsxRuntimeExports.jsx(ScrollArea, { className: "border border-border bg-card shadow-sm max-h-64 rounded-[8px] p-2", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
3008
+ tool.schema !== null && /* @__PURE__ */ jsxRuntimeExports.jsx(ScrollArea, { className: "bg-black/[0.16] max-h-64 rounded-[8px] p-2", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
3009
3009
  reactExports.Suspense,
3010
3010
  {
3011
3011
  fallback: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-xs text-muted-foreground", children: "Loading JSON..." }),
@@ -3035,7 +3035,7 @@ const RequestTools = reactExports.memo(function RequestTools2({
3035
3035
  if (summary === null) return null;
3036
3036
  const previewTools = summary.tools.slice(0, 6);
3037
3037
  const hiddenPreviewCount = summary.tools.length - previewTools.length;
3038
- return /* @__PURE__ */ jsxRuntimeExports.jsxs("section", { className: "border border-border bg-card shadow-sm mb-3 overflow-hidden rounded-[8px]", children: [
3038
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("section", { className: "bg-black/[0.10] mb-3 overflow-hidden rounded-[8px]", children: [
3039
3039
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex min-w-0 flex-wrap items-center gap-2 px-3 py-2", children: [
3040
3040
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex min-w-0 flex-1 items-center gap-2", children: [
3041
3041
  /* @__PURE__ */ jsxRuntimeExports.jsx(Wrench, { className: "size-4 shrink-0 text-sky-300/80" }),
@@ -3089,7 +3089,7 @@ const RequestTools = reactExports.memo(function RequestTools2({
3089
3089
  }
3090
3090
  )
3091
3091
  ] }),
3092
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex min-w-0 flex-wrap gap-1.5 border-t border-white/10 bg-white/[0.025] px-3 py-2", children: [
3092
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex min-w-0 flex-wrap gap-1.5 bg-white/[0.025] px-3 py-2", children: [
3093
3093
  previewTools.map((tool) => /* @__PURE__ */ jsxRuntimeExports.jsx(
3094
3094
  Badge,
3095
3095
  {
@@ -3107,8 +3107,8 @@ const RequestTools = reactExports.memo(function RequestTools2({
3107
3107
  hiddenPreviewCount
3108
3108
  ] })
3109
3109
  ] }),
3110
- expanded && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-2 border-t border-white/10 bg-black/10 px-3 py-3", children: [
3111
- /* @__PURE__ */ jsxRuntimeExports.jsxs("label", { className: "border border-input bg-background hover:bg-accent hover:text-accent-foreground flex h-8 items-center gap-2 rounded-md px-2 text-xs", children: [
3110
+ expanded && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-2 bg-black/10 px-3 py-3", children: [
3111
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("label", { className: "bg-white/[0.045] hover:bg-white/[0.075] flex h-8 items-center gap-2 rounded-md px-2 text-xs", children: [
3112
3112
  /* @__PURE__ */ jsxRuntimeExports.jsx(Search, { className: "size-3.5 shrink-0 text-muted-foreground" }),
3113
3113
  /* @__PURE__ */ jsxRuntimeExports.jsx(
3114
3114
  "input",
@@ -3313,7 +3313,7 @@ const FULL_LOG_HYDRATION_TIMEOUT_MS = 15e3;
3313
3313
  const BODY_CHUNK_TIMEOUT_MS = 15e3;
3314
3314
  const BODY_CHUNK_BYTES = 256 * 1024;
3315
3315
  const CHUNKED_BODY_THRESHOLD_BYTES = 1024 * 1024;
3316
- const TAB_TRIGGER_CLASS = "h-9 flex-none rounded-md border border-transparent bg-transparent px-3 text-xs font-semibold text-muted-foreground shadow-none transition-colors hover:border-white/10 hover:bg-white/[0.045] hover:text-foreground data-[state=active]:border-cyan-200/25 data-[state=active]:bg-cyan-300/[0.08] data-[state=active]:text-cyan-100 data-[state=active]:shadow-none";
3316
+ const TAB_TRIGGER_CLASS = "h-9 flex-none rounded-md border border-transparent bg-transparent px-3 text-xs font-semibold text-muted-foreground shadow-none transition-colors hover:bg-white/[0.045] hover:text-foreground data-[state=active]:bg-cyan-300/[0.08] data-[state=active]:text-cyan-100 data-[state=active]:shadow-none";
3317
3317
  function createEmptyBodyPreviewState(totalBytes = null) {
3318
3318
  return {
3319
3319
  status: "idle",
@@ -3395,7 +3395,7 @@ function ExpandedPanel({
3395
3395
  "div",
3396
3396
  {
3397
3397
  className: cn(
3398
- "border border-border bg-card shadow-sm inspector-scrollbar mx-3 mb-3 max-h-[72vh] overflow-auto rounded-[8px] p-3",
3398
+ "bg-black/[0.14] inspector-scrollbar mx-3 mb-3 max-h-[72vh] overflow-auto rounded-[8px] p-3",
3399
3399
  className
3400
3400
  ),
3401
3401
  children
@@ -3403,15 +3403,15 @@ function ExpandedPanel({
3403
3403
  );
3404
3404
  }
3405
3405
  function EmptyState({ children }) {
3406
- return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "border border-border bg-muted/40 rounded-md border-dashed px-3 py-5 text-center text-xs italic text-muted-foreground", children });
3406
+ return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "bg-white/[0.035] rounded-md px-3 py-5 text-center text-xs italic text-muted-foreground", children });
3407
3407
  }
3408
3408
  function RawTextBlock({ children }) {
3409
- return /* @__PURE__ */ jsxRuntimeExports.jsx("pre", { className: "border border-border bg-card shadow-sm inspector-scrollbar max-h-[64vh] overflow-auto whitespace-pre-wrap break-words rounded-[8px] p-3 font-mono text-xs leading-relaxed text-muted-foreground", children });
3409
+ return /* @__PURE__ */ jsxRuntimeExports.jsx("pre", { className: "bg-black/[0.18] inspector-scrollbar max-h-[64vh] overflow-auto whitespace-pre-wrap break-words rounded-[8px] p-3 font-mono text-xs leading-relaxed text-muted-foreground", children });
3410
3410
  }
3411
3411
  const NOTICE_TONE_CLASSES = {
3412
- loading: "border-cyan-400/25 bg-cyan-400/[0.06] text-cyan-100",
3413
- warning: "border-amber-400/25 bg-amber-400/[0.08] text-amber-100",
3414
- danger: "border-rose-400/25 bg-rose-400/[0.08] text-rose-100"
3412
+ loading: "border-transparent bg-cyan-400/[0.06] text-cyan-100",
3413
+ warning: "border-transparent bg-amber-400/[0.08] text-amber-100",
3414
+ danger: "border-transparent bg-rose-400/[0.08] text-rose-100"
3415
3415
  };
3416
3416
  function NoticeBlock({
3417
3417
  tone,
@@ -3473,12 +3473,12 @@ function HeaderRows({
3473
3473
  }) {
3474
3474
  const entries = headers === void 0 ? [] : Object.entries(headers).sort(([left], [right]) => left.localeCompare(right));
3475
3475
  if (entries.length === 0) return /* @__PURE__ */ jsxRuntimeExports.jsx(EmptyState, { children: emptyLabel });
3476
- return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "border border-border bg-card shadow-sm overflow-hidden rounded-[8px] font-mono text-xs", children: entries.map(([key, value]) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
3476
+ return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "bg-black/[0.14] overflow-hidden rounded-[8px] font-mono text-xs", children: entries.map(([key, value]) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
3477
3477
  "div",
3478
3478
  {
3479
- className: "grid min-w-0 grid-cols-[minmax(140px,0.32fr)_minmax(0,1fr)] border-b border-white/10 last:border-b-0",
3479
+ className: "grid min-w-0 grid-cols-[minmax(140px,0.32fr)_minmax(0,1fr)] border-b border-white/[0.055] last:border-b-0",
3480
3480
  children: [
3481
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "min-w-0 truncate border-r border-white/10 bg-white/[0.035] px-2.5 py-2 font-semibold text-cyan-200", children: key }),
3481
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "min-w-0 truncate bg-white/[0.035] px-2.5 py-2 font-semibold text-cyan-200", children: key }),
3482
3482
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "min-w-0 truncate px-2.5 py-2 text-muted-foreground", title: value, children: value })
3483
3483
  ]
3484
3484
  },
@@ -3854,27 +3854,10 @@ const LogEntry = reactExports.memo(function({
3854
3854
  "div",
3855
3855
  {
3856
3856
  className: cn(
3857
- "border border-border bg-card shadow-sm relative mb-2 overflow-hidden rounded-[8px] transition-[background-color,border-color,box-shadow]",
3858
- expanded ? "border-cyan-200/25 shadow-[0_24px_80px_rgba(0,0,0,0.36),0_0_0_1px_rgba(103,232,249,0.05),inset_0_1px_0_rgba(255,255,255,0.14)]" : "hover:border-cyan-200/18"
3857
+ "bg-card/80 relative mb-1.5 overflow-hidden rounded-[8px] transition-[background-color,box-shadow]",
3858
+ expanded ? "bg-card shadow-[0_18px_60px_rgba(0,0,0,0.30),0_0_0_1px_rgba(103,232,249,0.08)]" : "hover:bg-card"
3859
3859
  ),
3860
3860
  children: [
3861
- /* @__PURE__ */ jsxRuntimeExports.jsx(
3862
- "div",
3863
- {
3864
- className: cn(
3865
- "pointer-events-none absolute inset-y-3 left-1 w-px rounded-full",
3866
- expanded ? "bg-cyan-200/55 shadow-[0_0_20px_rgba(103,232,249,0.26)]" : "bg-white/12"
3867
- ),
3868
- "aria-hidden": "true"
3869
- }
3870
- ),
3871
- /* @__PURE__ */ jsxRuntimeExports.jsx(
3872
- "div",
3873
- {
3874
- className: "pointer-events-none absolute inset-x-3 top-0 h-px bg-gradient-to-r from-transparent via-white/15 to-transparent",
3875
- "aria-hidden": "true"
3876
- }
3877
- ),
3878
3861
  /* @__PURE__ */ jsxRuntimeExports.jsx(
3879
3862
  LogEntryHeader,
3880
3863
  {
@@ -3898,7 +3881,7 @@ const LogEntry = reactExports.memo(function({
3898
3881
  expanded && /* @__PURE__ */ jsxRuntimeExports.jsxs(
3899
3882
  "div",
3900
3883
  {
3901
- className: "relative border-t border-white/10 bg-black/[0.18] pt-2",
3884
+ className: "relative bg-black/[0.14] pt-2",
3902
3885
  onClick: (e) => e.stopPropagation(),
3903
3886
  onKeyDown: (e) => e.stopPropagation(),
3904
3887
  children: [
@@ -3914,7 +3897,7 @@ const LogEntry = reactExports.memo(function({
3914
3897
  TabsList,
3915
3898
  {
3916
3899
  variant: "line",
3917
- className: "border border-border bg-muted/40 inspector-scrollbar relative mx-3 h-auto w-[calc(100%-1.5rem)] justify-start overflow-x-auto rounded-[8px] p-1",
3900
+ className: "bg-white/[0.04] inspector-scrollbar relative mx-3 h-auto w-[calc(100%-1.5rem)] justify-start overflow-x-auto rounded-[8px] p-1",
3918
3901
  children: [
3919
3902
  viewMode === "full" && /* @__PURE__ */ jsxRuntimeExports.jsx(TabsTrigger, { className: TAB_TRIGGER_CLASS, value: "raw-headers", children: "Raw Headers" }),
3920
3903
  viewMode === "full" && /* @__PURE__ */ jsxRuntimeExports.jsx(TabsTrigger, { className: TAB_TRIGGER_CLASS, value: "headers", children: "Headers" }),
@@ -4530,7 +4513,7 @@ function ThreadConnector({
4530
4513
  onToggle();
4531
4514
  };
4532
4515
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center w-6 shrink-0 pt-0.5 pb-0.5", children: [
4533
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex justify-center h-[calc(0.75rem-8px)]", children: !isFirst && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-0.5 bg-muted-foreground/30 h-full" }) }),
4516
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex justify-center h-[calc(0.75rem-8px)]", children: !isFirst && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-px bg-muted-foreground/18 h-full" }) }),
4534
4517
  isFusedBoundary ? /* @__PURE__ */ jsxRuntimeExports.jsx(
4535
4518
  "span",
4536
4519
  {
@@ -4597,7 +4580,7 @@ function ThreadConnector({
4597
4580
  {
4598
4581
  className: cn(
4599
4582
  "w-0.5 h-full",
4600
- isPending ? "border-dashed bg-transparent border-l-2 border-muted-foreground/20" : "bg-muted-foreground/30"
4583
+ isPending ? "border-dashed bg-transparent border-l border-muted-foreground/14" : "bg-muted-foreground/18"
4601
4584
  )
4602
4585
  }
4603
4586
  ) })
@@ -4609,7 +4592,7 @@ function ToolTraceEventRow({ event }) {
4609
4592
  return /* @__PURE__ */ jsxRuntimeExports.jsxs(
4610
4593
  "div",
4611
4594
  {
4612
- className: "group/tool-trace flex min-w-0 items-center gap-2 rounded-md border border-border/70 bg-muted/20 px-2.5 py-1.5 text-xs",
4595
+ className: "group/tool-trace flex min-w-0 items-center gap-2 rounded-md bg-white/[0.035] px-2.5 py-1.5 text-xs",
4613
4596
  children: [
4614
4597
  /* @__PURE__ */ jsxRuntimeExports.jsx(Wrench, { className: "size-3.5 shrink-0 text-sky-400/70" }),
4615
4598
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono font-semibold text-foreground/80", children: event.name }),
@@ -4952,7 +4935,7 @@ const TurnGroup = reactExports.memo(function TurnGroup2({
4952
4935
  maxElapsed
4953
4936
  };
4954
4937
  }, [entries, lastIdx]);
4955
- const bgClass = turnIndex % 2 === 0 ? "bg-white/[0.012]" : "bg-cyan-300/[0.012]";
4938
+ const bgClass = turnIndex % 2 === 0 ? "bg-white/[0.008]" : "bg-cyan-300/[0.008]";
4956
4939
  const aggregateIsSlow = aggregate.maxElapsed !== null && slowResponseThresholdSeconds > 0 && aggregate.maxElapsed > slowResponseThresholdSeconds * 1e3;
4957
4940
  const toolEventsByLogId = reactExports.useMemo(() => {
4958
4941
  const events = /* @__PURE__ */ new Map();
@@ -4997,8 +4980,8 @@ const TurnGroup = reactExports.memo(function TurnGroup2({
4997
4980
  "aria-label": collapsed ? void 0 : turnLabel,
4998
4981
  "data-nav-id": collapsed ? void 0 : `turn-${String(firstLogId)}`,
4999
4982
  className: cn(
5000
- "rounded-[8px] border transition-[border-color,box-shadow]",
5001
- isPending ? "border-amber-300/15 shadow-[0_0_0_1px_rgba(252,211,77,0.04)]" : "border-transparent",
4983
+ "rounded-[8px] transition-[background-color,box-shadow]",
4984
+ isPending ? "bg-amber-300/[0.018] shadow-[0_0_0_1px_rgba(252,211,77,0.035)]" : "",
5002
4985
  !collapsed && "focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:outline-none"
5003
4986
  ),
5004
4987
  children: collapsed ? /* @__PURE__ */ jsxRuntimeExports.jsxs(
@@ -5020,14 +5003,14 @@ const TurnGroup = reactExports.memo(function TurnGroup2({
5020
5003
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-5 shrink-0 flex items-start pt-1.5", children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[10px] text-muted-foreground/50 font-mono tabular-nums leading-none select-none", children: turnIndex + 1 }) }),
5021
5004
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "w-6 shrink-0 flex flex-col items-center pt-1.5 pb-1.5", children: [
5022
5005
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex justify-center h-[calc(0.75rem-8px)]" }),
5023
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "size-2 rounded-full border border-cyan-300/45 bg-cyan-300/20" }),
5024
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-1 flex justify-center min-h-0", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-px bg-muted-foreground/25 h-full" }) }),
5006
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "size-2 rounded-full bg-cyan-300/45" }),
5007
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-1 flex justify-center min-h-0", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-px bg-muted-foreground/14 h-full" }) }),
5025
5008
  /* @__PURE__ */ jsxRuntimeExports.jsx(
5026
5009
  "span",
5027
5010
  {
5028
5011
  className: cn(
5029
- "size-2 rounded-full border",
5030
- isComplete ? "border-amber-300/45 bg-amber-300/20" : "border-muted-foreground/30 bg-muted/30"
5012
+ "size-2 rounded-full",
5013
+ isComplete ? "bg-amber-300/45" : "bg-muted-foreground/25"
5031
5014
  )
5032
5015
  }
5033
5016
  )
@@ -5036,8 +5019,8 @@ const TurnGroup = reactExports.memo(function TurnGroup2({
5036
5019
  "div",
5037
5020
  {
5038
5021
  className: cn(
5039
- "flex-1 min-w-0 mb-0.5 rounded-[8px] py-1.5 px-3 flex items-center gap-3 text-xs shadow-[inset_0_1px_0_rgba(255,255,255,0.04)]",
5040
- "border border-border bg-card shadow-sm transition-colors hover:border-cyan-200/20",
5022
+ "flex-1 min-w-0 mb-0.5 rounded-[8px] py-1.5 px-3 flex items-center gap-3 text-xs",
5023
+ "bg-card/80 transition-colors hover:bg-card",
5041
5024
  bgClass
5042
5025
  ),
5043
5026
  children: [
@@ -5099,7 +5082,7 @@ const TurnGroup = reactExports.memo(function TurnGroup2({
5099
5082
  /* @__PURE__ */ jsxRuntimeExports.jsx(
5100
5083
  "span",
5101
5084
  {
5102
- className: "border border-input bg-background inline-flex size-7 shrink-0 items-center justify-center rounded-md text-slate-200",
5085
+ className: "bg-white/[0.045] inline-flex size-7 shrink-0 items-center justify-center rounded-md text-slate-200",
5103
5086
  "aria-hidden": "true",
5104
5087
  children: /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronRight, { className: "size-4 shrink-0" })
5105
5088
  }
@@ -6872,10 +6855,86 @@ function useGroups() {
6872
6855
  mutate: response.mutate
6873
6856
  };
6874
6857
  }
6858
+ const TRANSIENT_TOAST_AUTO_DISMISS_MS = 3e3;
6859
+ function createNextTransientToast(previous, input) {
6860
+ return {
6861
+ id: (previous?.id ?? 0) + 1,
6862
+ message: input.message,
6863
+ tone: input.tone ?? "error"
6864
+ };
6865
+ }
6866
+ function useTransientToast() {
6867
+ const [notice, setNotice] = reactExports.useState(null);
6868
+ const showToast = reactExports.useCallback((input) => {
6869
+ setNotice((previous) => createNextTransientToast(previous, input));
6870
+ }, []);
6871
+ const dismissToast = reactExports.useCallback(() => {
6872
+ setNotice(null);
6873
+ }, []);
6874
+ reactExports.useEffect(() => {
6875
+ if (notice === null) return void 0;
6876
+ const timeout = window.setTimeout(() => {
6877
+ setNotice(null);
6878
+ }, TRANSIENT_TOAST_AUTO_DISMISS_MS);
6879
+ return () => {
6880
+ window.clearTimeout(timeout);
6881
+ };
6882
+ }, [notice]);
6883
+ return { notice, showToast, dismissToast };
6884
+ }
6885
+ function TransientToast({
6886
+ notice,
6887
+ onDismiss
6888
+ }) {
6889
+ if (notice === null) return null;
6890
+ const isError = notice.tone === "error";
6891
+ const Icon2 = isError ? TriangleAlert : CircleCheck;
6892
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
6893
+ "div",
6894
+ {
6895
+ "aria-atomic": "true",
6896
+ "aria-live": "polite",
6897
+ className: "pointer-events-none fixed top-4 right-4 z-[100] w-[min(calc(100vw-2rem),26rem)]",
6898
+ role: "status",
6899
+ children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
6900
+ "div",
6901
+ {
6902
+ className: cn(
6903
+ "pointer-events-auto flex items-start gap-2 rounded-md border px-3 py-2 text-sm shadow-[0_18px_50px_rgba(0,0,0,0.45)] backdrop-blur",
6904
+ isError ? "border-red-400/30 bg-[#16090b]/95 text-red-100" : "border-cyan-300/25 bg-[#071318]/95 text-cyan-100"
6905
+ ),
6906
+ children: [
6907
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
6908
+ Icon2,
6909
+ {
6910
+ className: cn("mt-0.5 size-4 shrink-0", isError ? "text-red-300" : "text-cyan-200")
6911
+ }
6912
+ ),
6913
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "min-w-0 flex-1 break-words leading-5", children: notice.message }),
6914
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
6915
+ "button",
6916
+ {
6917
+ type: "button",
6918
+ className: "inline-flex size-6 shrink-0 items-center justify-center rounded-md text-current/70 transition-colors hover:bg-white/10 hover:text-current",
6919
+ "aria-label": "Dismiss notification",
6920
+ onClick: onDismiss,
6921
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(X, { className: "size-3.5" })
6922
+ }
6923
+ )
6924
+ ]
6925
+ },
6926
+ notice.id
6927
+ )
6928
+ }
6929
+ );
6930
+ }
6875
6931
  function groupDeletePath(groupId, deleteEvidence) {
6876
6932
  const path = `/api/groups/${encodeURIComponent(groupId)}`;
6877
6933
  return deleteEvidence ? `${path}?deleteEvidence=1` : path;
6878
6934
  }
6935
+ function groupsClearPath(deleteEvidence) {
6936
+ return "/api/groups";
6937
+ }
6879
6938
  function summarizeGroup(group) {
6880
6939
  let completedMembers = 0;
6881
6940
  let failedMembers = 0;
@@ -7058,6 +7117,8 @@ function GroupsDialog() {
7058
7117
  const [deleteEvidence, setDeleteEvidence] = reactExports.useState(false);
7059
7118
  const [deletingGroupId, setDeletingGroupId] = reactExports.useState(null);
7060
7119
  const [deleteError, setDeleteError] = reactExports.useState(null);
7120
+ const [clearingGroups, setClearingGroups] = reactExports.useState(false);
7121
+ const { notice, showToast, dismissToast } = useTransientToast();
7061
7122
  const { groups, isLoading, error, mutate } = useGroups();
7062
7123
  const selectedGroup = reactExports.useMemo(
7063
7124
  () => selectedGroupFrom(groups, selectedGroupId),
@@ -7079,6 +7140,43 @@ function GroupsDialog() {
7079
7140
  const handleRefresh = reactExports.useCallback(() => {
7080
7141
  void mutate();
7081
7142
  }, [mutate]);
7143
+ const handleClearGroups = reactExports.useCallback(async () => {
7144
+ if (groups.length === 0 || clearingGroups) return;
7145
+ setClearingGroups(true);
7146
+ setDeleteTarget(null);
7147
+ setDeleteEvidence(false);
7148
+ setDeleteError(null);
7149
+ setExportError(null);
7150
+ try {
7151
+ const response = await fetch(groupsClearPath(false), { method: "DELETE" });
7152
+ if (!response.ok) {
7153
+ showToast({
7154
+ message: await readApiError(
7155
+ response,
7156
+ `Clear failed with status ${String(response.status)}`
7157
+ ),
7158
+ tone: "error"
7159
+ });
7160
+ return;
7161
+ }
7162
+ const parsed = await parseJsonResponse$1(response, DeleteInspectorGroupsResponseSchema);
7163
+ setExportResult(null);
7164
+ setSelectedGroupId(null);
7165
+ await mutate();
7166
+ await mutateEvidence();
7167
+ showToast({
7168
+ message: `Cleared ${formatNumber(parsed.deleted)} group${parsed.deleted === 1 ? "" : "s"}.`,
7169
+ tone: "success"
7170
+ });
7171
+ } catch (err) {
7172
+ showToast({
7173
+ message: err instanceof Error ? err.message : "Unknown error clearing groups",
7174
+ tone: "error"
7175
+ });
7176
+ } finally {
7177
+ setClearingGroups(false);
7178
+ }
7179
+ }, [clearingGroups, groups.length, mutate, mutateEvidence, showToast]);
7082
7180
  const handleExport = reactExports.useCallback(
7083
7181
  async (group) => {
7084
7182
  setExportingGroupId(group.id);
@@ -7155,6 +7253,7 @@ function GroupsDialog() {
7155
7253
  }
7156
7254
  }, [deleteEvidence, deleteTarget, mutate, mutateEvidence]);
7157
7255
  return /* @__PURE__ */ jsxRuntimeExports.jsxs(Dialog, { open, onOpenChange: setOpen, children: [
7256
+ /* @__PURE__ */ jsxRuntimeExports.jsx(TransientToast, { notice, onDismiss: dismissToast }),
7158
7257
  /* @__PURE__ */ jsxRuntimeExports.jsx(DialogTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
7159
7258
  Button,
7160
7259
  {
@@ -7179,20 +7278,27 @@ function GroupsDialog() {
7179
7278
  ] }) }),
7180
7279
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex min-h-0 items-center justify-between gap-3 border-b border-border pb-3", children: [
7181
7280
  /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: "Evaluation batches, model runs, and exported evidence packs." }),
7182
- /* @__PURE__ */ jsxRuntimeExports.jsxs(
7183
- Button,
7184
- {
7185
- type: "button",
7186
- variant: "outline",
7187
- size: "sm",
7188
- className: "shrink-0",
7189
- onClick: handleRefresh,
7190
- children: [
7191
- /* @__PURE__ */ jsxRuntimeExports.jsx(RefreshCw, { className: "size-3.5" }),
7192
- "Refresh"
7193
- ]
7194
- }
7195
- )
7281
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex shrink-0 items-center gap-2", children: [
7282
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
7283
+ Button,
7284
+ {
7285
+ type: "button",
7286
+ variant: "outline",
7287
+ size: "sm",
7288
+ disabled: groups.length === 0 || clearingGroups,
7289
+ onClick: () => void handleClearGroups(),
7290
+ title: "Clear all groups. Session logs and run records stay intact.",
7291
+ children: [
7292
+ clearingGroups ? /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "size-3.5 animate-spin" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(Trash2, { className: "size-3.5" }),
7293
+ "Clear"
7294
+ ]
7295
+ }
7296
+ ),
7297
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Button, { type: "button", variant: "outline", size: "sm", onClick: handleRefresh, children: [
7298
+ /* @__PURE__ */ jsxRuntimeExports.jsx(RefreshCw, { className: "size-3.5" }),
7299
+ "Refresh"
7300
+ ] })
7301
+ ] })
7196
7302
  ] }),
7197
7303
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid min-h-0 flex-1 gap-4 md:grid-cols-[260px_minmax(0,1fr)]", children: [
7198
7304
  /* @__PURE__ */ jsxRuntimeExports.jsx(
@@ -11029,7 +11135,7 @@ function SummaryChip({
11029
11135
  "span",
11030
11136
  {
11031
11137
  className: cn(
11032
- "border border-border bg-muted/40 inline-flex h-7 items-center gap-1 rounded-md px-2 text-xs text-muted-foreground",
11138
+ "bg-white/[0.045] inline-flex h-7 items-center gap-1 rounded-md px-2 text-xs text-muted-foreground",
11033
11139
  className
11034
11140
  ),
11035
11141
  children: [
@@ -11097,7 +11203,7 @@ function IdeGroupSection({
11097
11203
  return /* @__PURE__ */ jsxRuntimeExports.jsxs(
11098
11204
  "section",
11099
11205
  {
11100
- className: cn("border border-border bg-card shadow-sm relative isolate rounded-[8px]"),
11206
+ className: cn("bg-card/75 shadow-sm relative isolate rounded-[8px]"),
11101
11207
  "data-ide-group": group.id,
11102
11208
  children: [
11103
11209
  /* @__PURE__ */ jsxRuntimeExports.jsxs(
@@ -11108,7 +11214,7 @@ function IdeGroupSection({
11108
11214
  onClick: onToggleIde,
11109
11215
  "aria-expanded": !collapsed,
11110
11216
  children: [
11111
- group.client === "unknown" ? /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "border border-border bg-muted/40 inline-flex size-10 shrink-0 items-center justify-center rounded-[8px] text-slate-200", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Monitor, { className: "size-5" }) }) : /* @__PURE__ */ jsxRuntimeExports.jsx(ClientLogo, { client: group.client, className: "size-10 rounded-[8px] text-cyan-100" }),
11217
+ group.client === "unknown" ? /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "bg-white/[0.045] inline-flex size-10 shrink-0 items-center justify-center rounded-[8px] text-slate-200", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Monitor, { className: "size-5" }) }) : /* @__PURE__ */ jsxRuntimeExports.jsx(ClientLogo, { client: group.client, className: "size-10 rounded-[8px] text-cyan-100" }),
11112
11218
  /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "min-w-0 flex-1", children: [
11113
11219
  /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "flex min-w-0 items-center gap-2", children: [
11114
11220
  /* @__PURE__ */ jsxRuntimeExports.jsx(
@@ -11119,7 +11225,7 @@ function IdeGroupSection({
11119
11225
  children: group.label
11120
11226
  }
11121
11227
  ),
11122
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "rounded border border-cyan-200/15 bg-cyan-300/[0.06] px-1.5 py-0.5 font-mono text-[10px] uppercase tracking-[0.16em] text-cyan-100/75", children: "IDE" })
11228
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "rounded bg-cyan-300/[0.06] px-1.5 py-0.5 font-mono text-[10px] uppercase tracking-[0.16em] text-cyan-100/75", children: "IDE" })
11123
11229
  ] }),
11124
11230
  /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "mt-1 flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-muted-foreground", children: [
11125
11231
  /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { children: [
@@ -11143,11 +11249,11 @@ function IdeGroupSection({
11143
11249
  /* @__PURE__ */ jsxRuntimeExports.jsx(SummaryChip, { label: "IN", value: formatTokenCount(totals.inputTokens) }),
11144
11250
  /* @__PURE__ */ jsxRuntimeExports.jsx(SummaryChip, { label: "OUT", value: formatTokenCount(totals.outputTokens) })
11145
11251
  ] }),
11146
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "border border-input bg-background hover:bg-accent hover:text-accent-foreground inline-flex size-8 shrink-0 items-center justify-center rounded-md text-slate-200", children: collapsed ? /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronRight, { className: "size-4" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronDown, { className: "size-4" }) })
11252
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "bg-white/[0.045] hover:bg-white/[0.075] inline-flex size-8 shrink-0 items-center justify-center rounded-md text-slate-200", children: collapsed ? /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronRight, { className: "size-4" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronDown, { className: "size-4" }) })
11147
11253
  ]
11148
11254
  }
11149
11255
  ),
11150
- !collapsed && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "space-y-3 border-t border-white/10 px-3 pb-3 pt-3 sm:px-4", children: group.processes.map((processGroup) => /* @__PURE__ */ jsxRuntimeExports.jsx(
11256
+ !collapsed && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "space-y-3 px-3 pb-3 pt-2 sm:px-4", children: group.processes.map((processGroup) => /* @__PURE__ */ jsxRuntimeExports.jsx(
11151
11257
  ProcessGroupSection,
11152
11258
  {
11153
11259
  group: processGroup,
@@ -11173,8 +11279,8 @@ function ProcessGroupSection({
11173
11279
  const logCount = group.logs.length;
11174
11280
  const processLabel = group.clientPid !== null && group.clientPid !== void 0 ? `PID ${group.clientPid}` : "process";
11175
11281
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("section", { className: "relative pl-5", children: [
11176
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "absolute bottom-0 left-2 top-0 w-px bg-white/12", "aria-hidden": "true" }),
11177
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "border border-border bg-card shadow-sm overflow-hidden rounded-[8px]", children: [
11282
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "absolute bottom-1 left-2 top-1 w-px bg-white/[0.055]", "aria-hidden": "true" }),
11283
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-black/[0.10] overflow-hidden rounded-[8px]", children: [
11178
11284
  /* @__PURE__ */ jsxRuntimeExports.jsxs(
11179
11285
  "button",
11180
11286
  {
@@ -11183,7 +11289,7 @@ function ProcessGroupSection({
11183
11289
  onClick: onToggle,
11184
11290
  "aria-expanded": !collapsed,
11185
11291
  children: [
11186
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "border border-border bg-muted/40 inline-flex size-8 shrink-0 items-center justify-center rounded-md text-amber-100", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Cpu, { className: "size-4" }) }),
11292
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "bg-white/[0.045] inline-flex size-8 shrink-0 items-center justify-center rounded-md text-amber-100", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Cpu, { className: "size-4" }) }),
11187
11293
  /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "min-w-0 flex-1", children: [
11188
11294
  /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "flex min-w-0 flex-wrap items-center gap-x-2 gap-y-1", children: [
11189
11295
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono text-xs font-semibold tabular-nums text-slate-100", children: processLabel }),
@@ -11216,11 +11322,11 @@ function ProcessGroupSection({
11216
11322
  /* @__PURE__ */ jsxRuntimeExports.jsx(SummaryChip, { label: "IN", value: formatTokenCount(totals.inputTokens) }),
11217
11323
  /* @__PURE__ */ jsxRuntimeExports.jsx(SummaryChip, { label: "OUT", value: formatTokenCount(totals.outputTokens) })
11218
11324
  ] }),
11219
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "border border-input bg-background hover:bg-accent hover:text-accent-foreground inline-flex size-7 shrink-0 items-center justify-center rounded-md text-slate-200", children: collapsed ? /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronRight, { className: "size-4" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronDown, { className: "size-4" }) })
11325
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "bg-white/[0.045] hover:bg-white/[0.075] inline-flex size-7 shrink-0 items-center justify-center rounded-md text-slate-200", children: collapsed ? /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronRight, { className: "size-4" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronDown, { className: "size-4" }) })
11220
11326
  ]
11221
11327
  }
11222
11328
  ),
11223
- !collapsed && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "space-y-2 border-t border-white/10 p-2 sm:p-3", children: group.sessions.map((session) => /* @__PURE__ */ jsxRuntimeExports.jsx(
11329
+ !collapsed && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "space-y-2 p-2 pt-1 sm:p-3 sm:pt-2", children: group.sessions.map((session) => /* @__PURE__ */ jsxRuntimeExports.jsx(
11224
11330
  ConversationGroup,
11225
11331
  {
11226
11332
  group: session,
@@ -13886,79 +13992,6 @@ function ProxyViewer({
13886
13992
  ) })
13887
13993
  ] });
13888
13994
  }
13889
- const TRANSIENT_TOAST_AUTO_DISMISS_MS = 3e3;
13890
- function createNextTransientToast(previous, input) {
13891
- return {
13892
- id: (previous?.id ?? 0) + 1,
13893
- message: input.message,
13894
- tone: input.tone ?? "error"
13895
- };
13896
- }
13897
- function useTransientToast() {
13898
- const [notice, setNotice] = reactExports.useState(null);
13899
- const showToast = reactExports.useCallback((input) => {
13900
- setNotice((previous) => createNextTransientToast(previous, input));
13901
- }, []);
13902
- const dismissToast = reactExports.useCallback(() => {
13903
- setNotice(null);
13904
- }, []);
13905
- reactExports.useEffect(() => {
13906
- if (notice === null) return void 0;
13907
- const timeout = window.setTimeout(() => {
13908
- setNotice(null);
13909
- }, TRANSIENT_TOAST_AUTO_DISMISS_MS);
13910
- return () => {
13911
- window.clearTimeout(timeout);
13912
- };
13913
- }, [notice]);
13914
- return { notice, showToast, dismissToast };
13915
- }
13916
- function TransientToast({
13917
- notice,
13918
- onDismiss
13919
- }) {
13920
- if (notice === null) return null;
13921
- const isError = notice.tone === "error";
13922
- const Icon2 = isError ? TriangleAlert : CircleCheck;
13923
- return /* @__PURE__ */ jsxRuntimeExports.jsx(
13924
- "div",
13925
- {
13926
- "aria-atomic": "true",
13927
- "aria-live": "polite",
13928
- className: "pointer-events-none fixed top-4 right-4 z-[100] w-[min(calc(100vw-2rem),26rem)]",
13929
- role: "status",
13930
- children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
13931
- "div",
13932
- {
13933
- className: cn(
13934
- "pointer-events-auto flex items-start gap-2 rounded-md border px-3 py-2 text-sm shadow-[0_18px_50px_rgba(0,0,0,0.45)] backdrop-blur",
13935
- isError ? "border-red-400/30 bg-[#16090b]/95 text-red-100" : "border-cyan-300/25 bg-[#071318]/95 text-cyan-100"
13936
- ),
13937
- children: [
13938
- /* @__PURE__ */ jsxRuntimeExports.jsx(
13939
- Icon2,
13940
- {
13941
- className: cn("mt-0.5 size-4 shrink-0", isError ? "text-red-300" : "text-cyan-200")
13942
- }
13943
- ),
13944
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "min-w-0 flex-1 break-words leading-5", children: notice.message }),
13945
- /* @__PURE__ */ jsxRuntimeExports.jsx(
13946
- "button",
13947
- {
13948
- type: "button",
13949
- className: "inline-flex size-6 shrink-0 items-center justify-center rounded-md text-current/70 transition-colors hover:bg-white/10 hover:text-current",
13950
- "aria-label": "Dismiss notification",
13951
- onClick: onDismiss,
13952
- children: /* @__PURE__ */ jsxRuntimeExports.jsx(X, { className: "size-3.5" })
13953
- }
13954
- )
13955
- ]
13956
- },
13957
- notice.id
13958
- )
13959
- }
13960
- );
13961
- }
13962
13995
  const SSEUpdateSchema = union([
13963
13996
  object({
13964
13997
  type: literal("init"),