@tonyclaw/agent-inspector 3.0.5 → 3.0.7

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 (42) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/assets/{CompareDrawer-Co-35_Xw.js → CompareDrawer-C0Kbsm-Q.js} +1 -1
  3. package/.output/public/assets/ProxyViewerContainer-p-rpYyiF.js +106 -0
  4. package/.output/public/assets/{ReplayDialog-DghbvKdy.js → ReplayDialog-CM3dhP8v.js} +1 -1
  5. package/.output/public/assets/{RequestAnatomy-CRXE5v8X.js → RequestAnatomy-fa0JXy5p.js} +1 -1
  6. package/.output/public/assets/{ResponseView-CzxoQRjp.js → ResponseView-Bq6sC7Ay.js} +2 -2
  7. package/.output/public/assets/{StreamingChunkSequence-DnFyF_Hr.js → StreamingChunkSequence-CGOun3Df.js} +1 -1
  8. package/.output/public/assets/{_sessionId-DHRhWzKe.js → _sessionId-D5fYH2C0.js} +1 -1
  9. package/.output/public/assets/{index-Dl1oki9E.js → index-BEsqvywM.js} +1 -1
  10. package/.output/public/assets/index-C29Olfzt.js +1 -0
  11. package/.output/public/assets/index-DgANE0r3.css +1 -0
  12. package/.output/public/assets/{json-viewer-B84f7oiG.js → json-viewer-B0QRbMSf.js} +1 -1
  13. package/.output/public/assets/{main-DViDnJ9X.js → main-CuKZD7n0.js} +2 -2
  14. package/.output/server/_libs/lucide-react.mjs +292 -203
  15. package/.output/server/{_sessionId-C43vEAWe.mjs → _sessionId-DdBTK3qm.mjs} +3 -3
  16. package/.output/server/_ssr/{CompareDrawer-DOL6q0jD.mjs → CompareDrawer-m82cVZ73.mjs} +4 -4
  17. package/.output/server/_ssr/{ProxyViewerContainer-S9izw3ND.mjs → ProxyViewerContainer-7geuf78f.mjs} +366 -37
  18. package/.output/server/_ssr/{ReplayDialog-tqthwJh0.mjs → ReplayDialog-B8RlWLLH.mjs} +4 -4
  19. package/.output/server/_ssr/{RequestAnatomy-CgWDjFPR.mjs → RequestAnatomy-BE7pmwpv.mjs} +2 -2
  20. package/.output/server/_ssr/{ResponseView-Dk8Op622.mjs → ResponseView-D-sDsdQr.mjs} +3 -3
  21. package/.output/server/_ssr/{StreamingChunkSequence-AlS7PK8f.mjs → StreamingChunkSequence-DU_hThJr.mjs} +2 -2
  22. package/.output/server/_ssr/{index-BGwvMN2M.mjs → index-D0sV8UbE.mjs} +2 -2
  23. package/.output/server/_ssr/index.mjs +2 -2
  24. package/.output/server/_ssr/{json-viewer-CKHkh5U3.mjs → json-viewer-CaDh1zrw.mjs} +3 -3
  25. package/.output/server/_ssr/{router-BJMaHkr1.mjs → router-Zh2iZ_u0.mjs} +357 -146
  26. package/.output/server/_tanstack-start-manifest_v-LCE-2AaF.mjs +4 -0
  27. package/.output/server/index.mjs +71 -71
  28. package/package.json +1 -1
  29. package/src/components/ProxyViewer.tsx +32 -14
  30. package/src/components/alerts/AlertsDialog.tsx +3 -3
  31. package/src/components/ecosystem/AgentLabDialog.tsx +381 -0
  32. package/src/components/groups/GroupsDialog.tsx +3 -3
  33. package/src/components/providers/ImportWizardDialog.tsx +1 -1
  34. package/src/components/providers/ProviderCard.tsx +4 -4
  35. package/src/components/proxy-viewer/CompareDrawer.tsx +1 -1
  36. package/src/components/proxy-viewer/ConversationHeader.tsx +2 -2
  37. package/src/lib/ecosystemContract.ts +47 -0
  38. package/src/routes/api/ecosystem.packages.ts +263 -0
  39. package/.output/public/assets/ProxyViewerContainer-DPv1rBo7.js +0 -106
  40. package/.output/public/assets/index-D8cruW0P.css +0 -1
  41. package/.output/public/assets/index-DZyTpd2w.js +0 -1
  42. package/.output/server/_tanstack-start-manifest_v-C_HvRzgP.mjs +0 -4
@@ -1,6 +1,6 @@
1
1
  import { j as jsxRuntimeExports, r as reactExports } from "./_libs/react.mjs";
2
- import { P as ProxyViewerContainer } from "./_ssr/ProxyViewerContainer-S9izw3ND.mjs";
3
- import { R as Route$B } from "./_ssr/router-BJMaHkr1.mjs";
2
+ import { P as ProxyViewerContainer } from "./_ssr/ProxyViewerContainer-7geuf78f.mjs";
3
+ import { R as Route$C } from "./_ssr/router-Zh2iZ_u0.mjs";
4
4
  import "./_libs/jszip.mjs";
5
5
  import "./_libs/modelcontextprotocol__server.mjs";
6
6
  import "./_libs/swr.mjs";
@@ -118,7 +118,7 @@ import "./_libs/pako.mjs";
118
118
  function SessionViewerRoute() {
119
119
  const {
120
120
  sessionId
121
- } = Route$B.useParams();
121
+ } = Route$C.useParams();
122
122
  return /* @__PURE__ */ jsxRuntimeExports.jsx(ClientOnlySessionViewer, { sessionId });
123
123
  }
124
124
  function ClientOnlySessionViewer({
@@ -1,9 +1,9 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "../_libs/react.mjs";
2
- import { g as getLogFormatAdapter, r as resolveLogFormat, a as getConversationId, c as cn, B as Badge, f as formatTokens, b as copyTextToClipboard, L as LazyJsonViewerFromString } from "./ProxyViewerContainer-S9izw3ND.mjs";
3
- import "./router-BJMaHkr1.mjs";
2
+ import { g as getLogFormatAdapter, r as resolveLogFormat, a as getConversationId, c as cn, B as Badge, f as formatTokens, b as copyTextToClipboard, L as LazyJsonViewerFromString } from "./ProxyViewerContainer-7geuf78f.mjs";
3
+ import "./router-Zh2iZ_u0.mjs";
4
4
  import "../_libs/modelcontextprotocol__server.mjs";
5
5
  import "../_libs/jszip.mjs";
6
- import { X, ao as Rows3, ap as Columns2, Q as Minus, P as Plus, K as Pencil, h as ChevronRight, aq as Equal, b as Check, e as Copy } from "../_libs/lucide-react.mjs";
6
+ import { X, av as Rows3, aw as Columns2, a2 as Minus, P as Plus, Z as Pencil, h as ChevronRight, ax as Equal, b as Check, e as Copy } from "../_libs/lucide-react.mjs";
7
7
  import "../_libs/swr.mjs";
8
8
  import "../_libs/use-sync-external-store.mjs";
9
9
  import "../_libs/dequal.mjs";
@@ -696,7 +696,7 @@ function SideSummary({
696
696
  "#",
697
697
  displayNumber
698
698
  ] }),
699
- log.model !== null && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono text-muted-foreground truncate", children: log.model })
699
+ log.model !== null && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono leading-snug text-muted-foreground", children: log.model })
700
700
  ] }),
701
701
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-3 text-muted-foreground font-mono", children: [
702
702
  log.cacheCreationInputTokens !== null && log.cacheCreationInputTokens > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-emerald-400", children: [
@@ -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 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, t as maskApiKey, u as PATH_V1_MESSAGES, v as PATH_V1_CHAT_COMPLETIONS, w as PATH_V1_RESPONSES, r as providerHasContextMetadata, 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, x as findProviderModelMetadata, y as previewUpstreamUrl, K as KnowledgeCandidateSchema, J as isPlainRecord, k as stripClaudeCodeBillingHeader, L as LogBodyChunkSchema } from "./router-BJMaHkr1.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, t as maskApiKey, u as PATH_V1_MESSAGES, v as PATH_V1_CHAT_COMPLETIONS, w as PATH_V1_RESPONSES, r as providerHasContextMetadata, 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, x as findProviderModelMetadata, y as previewUpstreamUrl, K as KnowledgeCandidateSchema, J as isPlainRecord, k as stripClaudeCodeBillingHeader, L as LogBodyChunkSchema } from "./router-Zh2iZ_u0.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";
@@ -9,7 +9,7 @@ import { c as cva } from "../_libs/class-variance-authority.mjs";
9
9
  import { u as useWindowVirtualizer, a as useVirtualizer } from "../_libs/tanstack__react-virtual.mjs";
10
10
  import { d as diffJson, a as diffLines } from "../_libs/diff.mjs";
11
11
  import { R as Root2, T as Trigger, I as Icon, V as Value, P as Portal, C as Content2, a as Viewport, b as Item, c as ItemIndicator, d as ItemText, S as ScrollUpButton, e as ScrollDownButton } from "../_libs/radix-ui__react-select.mjs";
12
- import { T as TriangleAlert, C as CircleCheck, X, I as Info, a as ChevronDown, b as Check, R as RefreshCw, c as Trash2, S as Search, U as Upload, D as Download, F as FileBraces, P as Plus, A as ArrowLeft, d as ChevronUp, e as Copy, f as ChevronsLeft, g as ChevronLeft, h as ChevronRight, i as ChevronsRight, j as Clapperboard, k as Flag, l as Siren, m as Timer, G as Gauge, L as LoaderCircle, n as Layers, o as Settings, M as Monitor, p as Scan, q as CircleAlert, r as Terminal, s as ArrowUpRight, t as ArrowDownRight, u as Cpu, v as FolderOpen, B as Bell, w as Clock3, x as ShieldAlert, E as EyeOff, y as Eye, z as ExternalLink, H as Clock, J as RotateCw, K as Pencil, N as MessageSquare, Z as Zap, W as Wrench, O as Brain, Q as Minus, V as CircleCheckBig, Y as CircleQuestionMark, _ as Server, $ as Lock, a0 as Wifi, a1 as WifiOff, a2 as CircleX, a3 as ShieldCheck, a4 as Save, a5 as FileSearch, a6 as CloudUpload, a7 as OctagonAlert, a8 as Radio, a9 as Globe, aa as FileTerminal, ab as ChevronsUp, ac as ChevronsDown, ad as FileDiff, ae as History, af as RotateCcw, ag as GitCompareArrows, ah as ArrowUp, ai as ArrowDown, aj as Ellipsis, ak as CodeXml, al as Blocks, am as MousePointerClick, an as FileText, ao as Rows3, ap as Columns2 } from "../_libs/lucide-react.mjs";
12
+ import { T as TriangleAlert, C as CircleCheck, X, I as Info, a as ChevronDown, b as Check, R as RefreshCw, c as Trash2, S as Search, U as Upload, D as Download, F as FileBraces, P as Plus, A as ArrowLeft, d as ChevronUp, e as Copy, f as ChevronsLeft, g as ChevronLeft, h as ChevronRight, i as ChevronsRight, j as Clapperboard, k as Flag, l as Siren, m as Timer, G as Gauge, L as LoaderCircle, n as Layers, o as FlaskConical, p as Sparkles, q as Activity, B as Beaker, N as Network, r as Terminal, s as Settings, M as Monitor, t as Rocket, u as PackageCheck, v as Scan, w as CircleAlert, x as ArrowUpRight, y as ArrowDownRight, z as Cpu, E as FolderOpen, H as Bell, J as Clock3, K as ShieldAlert, O as EyeOff, Q as Eye, V as ExternalLink, W as Clock, Y as RotateCw, Z as Pencil, _ as MessageSquare, $ as Zap, a0 as Wrench, a1 as Brain, a2 as Minus, a3 as CircleCheckBig, a4 as CircleQuestionMark, a5 as Server, a6 as Lock, a7 as Wifi, a8 as WifiOff, a9 as CircleX, aa as ShieldCheck, ab as Save, ac as FileSearch, ad as CloudUpload, ae as OctagonAlert, af as Radio, ag as Globe, ah as FileTerminal, ai as ChevronsUp, aj as ChevronsDown, ak as FileDiff, al as History, am as RotateCcw, an as GitCompareArrows, ao as ArrowUp, ap as ArrowDown, aq as Ellipsis, ar as CodeXml, as as Blocks, at as MousePointerClick, au as FileText, av as Rows3, aw as Columns2 } from "../_libs/lucide-react.mjs";
13
13
  import { u as union, d as object, a as array, l as literal, b as string, n as number, c as boolean, _ as _enum } from "../_libs/zod.mjs";
14
14
  import { S as Slot } from "../_libs/radix-ui__react-slot.mjs";
15
15
  import { R as Root2$1, L as List, T as Trigger$2, C as Content$1 } from "../_libs/radix-ui__react-tabs.mjs";
@@ -1611,11 +1611,11 @@ function ConversationHeader({
1611
1611
  showClientIdentity && clientDisplayLabel !== null && clientDisplayLabel !== "" && /* @__PURE__ */ jsxRuntimeExports.jsxs(
1612
1612
  "span",
1613
1613
  {
1614
- 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",
1614
+ className: "bg-white/[0.045] inline-flex min-h-6 shrink-0 flex-wrap items-center gap-1 rounded-md px-1.5 py-0.5 text-xs text-muted-foreground",
1615
1615
  title: clientTooltip ?? clientDisplayLabel,
1616
1616
  children: [
1617
1617
  /* @__PURE__ */ jsxRuntimeExports.jsx(ClientLogo, { client: clientApp, className: "size-4 shrink-0" }),
1618
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate font-mono tabular-nums", children: clientDisplayLabel })
1618
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono leading-snug tabular-nums", children: clientDisplayLabel })
1619
1619
  ]
1620
1620
  }
1621
1621
  ),
@@ -2306,27 +2306,27 @@ function useCopyFeedback(text) {
2306
2306
  return { copied, copy };
2307
2307
  }
2308
2308
  const LazyCompareDrawer = reactExports.lazy(
2309
- () => import("./CompareDrawer-DOL6q0jD.mjs").then((m) => ({ default: m.CompareDrawer }))
2309
+ () => import("./CompareDrawer-m82cVZ73.mjs").then((m) => ({ default: m.CompareDrawer }))
2310
2310
  );
2311
2311
  const LazyReplayDialog = reactExports.lazy(
2312
- () => import("./ReplayDialog-tqthwJh0.mjs").then((m) => ({ default: m.ReplayDialog }))
2312
+ () => import("./ReplayDialog-B8RlWLLH.mjs").then((m) => ({ default: m.ReplayDialog }))
2313
2313
  );
2314
2314
  const LazyRequestAnatomy = reactExports.lazy(
2315
- () => import("./RequestAnatomy-CgWDjFPR.mjs").then((m) => ({ default: m.RequestAnatomy }))
2315
+ () => import("./RequestAnatomy-BE7pmwpv.mjs").then((m) => ({ default: m.RequestAnatomy }))
2316
2316
  );
2317
2317
  const LazyResponseView = reactExports.lazy(
2318
- () => import("./ResponseView-Dk8Op622.mjs").then((m) => ({ default: m.ResponseView }))
2318
+ () => import("./ResponseView-D-sDsdQr.mjs").then((m) => ({ default: m.ResponseView }))
2319
2319
  );
2320
2320
  const LazyStreamingChunkSequence = reactExports.lazy(
2321
- () => import("./StreamingChunkSequence-AlS7PK8f.mjs").then((m) => ({
2321
+ () => import("./StreamingChunkSequence-DU_hThJr.mjs").then((m) => ({
2322
2322
  default: m.StreamingChunkSequence
2323
2323
  }))
2324
2324
  );
2325
2325
  const LazyJsonViewer = reactExports.lazy(
2326
- () => import("./json-viewer-CKHkh5U3.mjs").then((m) => ({ default: m.JsonViewer }))
2326
+ () => import("./json-viewer-CaDh1zrw.mjs").then((m) => ({ default: m.JsonViewer }))
2327
2327
  );
2328
2328
  const LazyJsonViewerFromString = reactExports.lazy(
2329
- () => import("./json-viewer-CKHkh5U3.mjs").then((m) => ({ default: m.JsonViewerFromString }))
2329
+ () => import("./json-viewer-CaDh1zrw.mjs").then((m) => ({ default: m.JsonViewerFromString }))
2330
2330
  );
2331
2331
  const HIGHLIGHT_DURATION_MS = 1200;
2332
2332
  const MAX_HIGHLIGHT_ATTEMPTS = 12;
@@ -6556,7 +6556,7 @@ function AlertList({
6556
6556
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: cn("text-xs font-semibold", severityText(alert.severity)), children: severityLabel(alert.severity) }),
6557
6557
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate text-xs text-muted-foreground", children: categoryLabel(alert.category) })
6558
6558
  ] }),
6559
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mt-1 truncate text-sm font-semibold", children: alert.title }),
6559
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mt-1 text-sm font-semibold leading-snug", children: alert.title }),
6560
6560
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mt-1 line-clamp-2 text-xs text-muted-foreground", children: alert.message })
6561
6561
  ] }),
6562
6562
  alert.count > 1 ? /* @__PURE__ */ jsxRuntimeExports.jsxs(Badge, { variant: "outline", className: "shrink-0", children: [
@@ -6564,8 +6564,8 @@ function AlertList({
6564
6564
  formatCount(alert.count)
6565
6565
  ] }) : null
6566
6566
  ] }),
6567
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-2 flex min-w-0 items-center justify-between gap-2 text-[11px] text-muted-foreground", children: [
6568
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate", children: providerModel$1(alert) }),
6567
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-2 flex min-w-0 items-start justify-between gap-2 text-[11px] text-muted-foreground", children: [
6568
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "min-w-0 leading-snug", children: providerModel$1(alert) }),
6569
6569
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "shrink-0", children: formatTimestamp$1(alert.lastSeenAt) })
6570
6570
  ] })
6571
6571
  ]
@@ -7380,7 +7380,7 @@ function GroupList({
7380
7380
  ),
7381
7381
  children: [
7382
7382
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex min-w-0 items-center justify-between gap-2", children: [
7383
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "min-w-0 truncate text-sm font-medium", children: group.title }),
7383
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "min-w-0 text-sm font-medium leading-snug", children: group.title }),
7384
7384
  /* @__PURE__ */ jsxRuntimeExports.jsx(Badge, { variant: "outline", className: statusClassName(group.status), children: statusLabel(group.status) })
7385
7385
  ] }),
7386
7386
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-1 flex items-center gap-2 text-muted-foreground", children: [
@@ -7429,7 +7429,7 @@ function GroupDetails({
7429
7429
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex min-w-0 flex-col gap-3 sm:flex-row sm:items-start sm:justify-between", children: [
7430
7430
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "min-w-0 space-y-1", children: [
7431
7431
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex min-w-0 flex-wrap items-center gap-2", children: [
7432
- /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "min-w-0 truncate text-base font-semibold", children: group.title }),
7432
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "min-w-0 text-base font-semibold leading-snug", children: group.title }),
7433
7433
  /* @__PURE__ */ jsxRuntimeExports.jsx(Badge, { variant: "outline", className: statusClassName(group.status), children: statusLabel(group.status) }),
7434
7434
  /* @__PURE__ */ jsxRuntimeExports.jsx(Badge, { variant: "outline", children: group.kind })
7435
7435
  ] }),
@@ -7787,7 +7787,7 @@ function MemberRow({
7787
7787
  ] }),
7788
7788
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mt-0.5 truncate text-[11px] text-muted-foreground", children: displayText(member.agent) })
7789
7789
  ] }),
7790
- /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "max-w-52 px-3 py-2", children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "block truncate", children: providerModel(member) }) }),
7790
+ /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "max-w-52 px-3 py-2", children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "block whitespace-normal leading-snug", children: providerModel(member) }) }),
7791
7791
  /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "px-3 py-2", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Badge, { variant: "outline", className: statusClassName(member.status), children: statusLabel(member.status) }) }),
7792
7792
  /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "px-3 py-2 font-mono", children: requests === null ? "-" : formatNumber(requests) }),
7793
7793
  /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "px-3 py-2 font-mono", children: errors === null ? "-" : formatNumber(errors) }),
@@ -8177,7 +8177,7 @@ function ImportWizardDialog({
8177
8177
  })(),
8178
8178
  p.alreadyExists && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[10px] text-muted-foreground", children: "Already added" })
8179
8179
  ] }),
8180
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-xs text-muted-foreground mt-1 truncate", children: [
8180
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-1 text-xs leading-snug text-muted-foreground", children: [
8181
8181
  p.models.slice(0, 4).join(", "),
8182
8182
  p.models.length > 4 ? ` +${p.models.length - 4} more` : ""
8183
8183
  ] }),
@@ -8693,13 +8693,13 @@ function ProviderCard({
8693
8693
  {
8694
8694
  className: `flex flex-col gap-3 rounded-[8px] border border-border bg-card p-4 shadow-sm transition-all duration-500 ${isHighlighted === true ? "ring-2 ring-primary shadow-md" : ""}`,
8695
8695
  children: [
8696
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-start justify-between gap-2", children: [
8696
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-wrap items-start justify-between gap-2", children: [
8697
8697
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "min-w-0 space-y-1", children: [
8698
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex min-w-0 items-center gap-2", children: [
8699
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate font-medium", children: provider.name }),
8698
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex min-w-0 flex-wrap items-center gap-2", children: [
8699
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-medium leading-snug", children: provider.name }),
8700
8700
  providerSourceBadge
8701
8701
  ] }),
8702
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "truncate text-xs text-muted-foreground", children: compactModelLabel(provider) })
8702
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-xs leading-snug text-muted-foreground", children: compactModelLabel(provider) })
8703
8703
  ] }),
8704
8704
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex shrink-0 items-center gap-2", children: [
8705
8705
  /* @__PURE__ */ jsxRuntimeExports.jsx(
@@ -11116,6 +11116,322 @@ function ProxySettingsTab() {
11116
11116
  ] })
11117
11117
  ] });
11118
11118
  }
11119
+ const EcosystemPackageStateSchema = _enum([
11120
+ "installed",
11121
+ "update-available",
11122
+ "available",
11123
+ "planned",
11124
+ "unknown"
11125
+ ]);
11126
+ const EcosystemPackageSchema = object({
11127
+ id: string(),
11128
+ name: string(),
11129
+ npmName: string(),
11130
+ capability: string(),
11131
+ description: string(),
11132
+ workflow: string(),
11133
+ installCommand: string(),
11134
+ state: EcosystemPackageStateSchema,
11135
+ installedVersion: string().nullable(),
11136
+ latestVersion: string().nullable(),
11137
+ primary: boolean()
11138
+ });
11139
+ const EcosystemRunnerPresetSchema = object({
11140
+ id: string(),
11141
+ name: string(),
11142
+ validatedVersion: string(),
11143
+ binary: string(),
11144
+ modelFlag: string(),
11145
+ variantFlag: string().nullable(),
11146
+ tools: array(string()),
11147
+ logDir: string(),
11148
+ skillsDir: string(),
11149
+ agentsDir: string()
11150
+ });
11151
+ const EcosystemPackagesResponseSchema = object({
11152
+ checkedAt: string(),
11153
+ packages: array(EcosystemPackageSchema),
11154
+ runnerPresets: array(EcosystemRunnerPresetSchema)
11155
+ });
11156
+ const WORKFLOWS = [
11157
+ {
11158
+ id: "observe",
11159
+ title: "Observe",
11160
+ label: "Live",
11161
+ description: "Capture IDE, process, session, turn, request, response, tools, and providers.",
11162
+ metric: "Inspector core",
11163
+ icon: Activity
11164
+ },
11165
+ {
11166
+ id: "replay",
11167
+ title: "Replay",
11168
+ label: "Ready",
11169
+ description: "Promote real logs into repeatable replay evidence without losing the raw context.",
11170
+ metric: "Session asset",
11171
+ icon: RefreshCw
11172
+ },
11173
+ {
11174
+ id: "evaluate",
11175
+ title: "Evaluate",
11176
+ label: "Next",
11177
+ description: "Use eval-harness to turn sessions into regression cases and provider bakeoffs.",
11178
+ metric: "Eval loop",
11179
+ icon: Beaker
11180
+ },
11181
+ {
11182
+ id: "connect",
11183
+ title: "Connect",
11184
+ label: "MCP",
11185
+ description: "Expose Inspector state to coding agents as queryable context and durable evidence.",
11186
+ metric: "/api/mcp",
11187
+ icon: Network
11188
+ }
11189
+ ];
11190
+ async function fetchEcosystemPackages(url) {
11191
+ return fetchJson(
11192
+ url,
11193
+ EcosystemPackagesResponseSchema,
11194
+ void 0,
11195
+ (response) => `Failed to load ecosystem packages: ${String(response.status)}`
11196
+ );
11197
+ }
11198
+ function stateLabel(state) {
11199
+ switch (state) {
11200
+ case "installed":
11201
+ return "Installed";
11202
+ case "update-available":
11203
+ return "Update";
11204
+ case "available":
11205
+ return "Available";
11206
+ case "planned":
11207
+ return "Planned";
11208
+ case "unknown":
11209
+ return "Unknown";
11210
+ }
11211
+ }
11212
+ function stateClassName(state) {
11213
+ switch (state) {
11214
+ case "installed":
11215
+ return "border-emerald-400/20 bg-emerald-400/8 text-emerald-200";
11216
+ case "update-available":
11217
+ return "border-amber-400/20 bg-amber-400/8 text-amber-200";
11218
+ case "available":
11219
+ return "border-sky-400/20 bg-sky-400/8 text-sky-200";
11220
+ case "planned":
11221
+ return "border-white/10 bg-white/[0.04] text-white/55";
11222
+ case "unknown":
11223
+ return "border-white/10 bg-white/[0.04] text-white/45";
11224
+ }
11225
+ }
11226
+ function versionLabel(pkg) {
11227
+ if (pkg.installedVersion !== null && pkg.latestVersion !== null) {
11228
+ if (pkg.installedVersion === pkg.latestVersion) return `v${pkg.installedVersion}`;
11229
+ return `v${pkg.installedVersion} -> v${pkg.latestVersion}`;
11230
+ }
11231
+ if (pkg.installedVersion !== null) return `v${pkg.installedVersion}`;
11232
+ if (pkg.latestVersion !== null) return `latest v${pkg.latestVersion}`;
11233
+ return "not published";
11234
+ }
11235
+ function PackageStatusCard({ pkg }) {
11236
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "rounded-lg bg-white/[0.025] p-3 shadow-[inset_0_0_0_1px_rgba(255,255,255,0.055)]", children: [
11237
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-wrap items-start justify-between gap-3", children: [
11238
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "min-w-0", children: [
11239
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex min-w-0 items-start gap-2", children: [
11240
+ /* @__PURE__ */ jsxRuntimeExports.jsx(PackageCheck, { className: "size-4 shrink-0 text-white/55" }),
11241
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm font-semibold leading-snug", children: pkg.name })
11242
+ ] }),
11243
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mt-1 break-all font-mono text-[11px] leading-snug text-white/35", children: pkg.npmName })
11244
+ ] }),
11245
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Badge, { className: cn("shrink-0", stateClassName(pkg.state)), variant: "outline", children: stateLabel(pkg.state) })
11246
+ ] }),
11247
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mt-3 text-xs leading-5 text-muted-foreground", children: pkg.description }),
11248
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-3 flex flex-wrap items-center gap-2 text-[11px]", children: [
11249
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "rounded bg-white/[0.035] px-2 py-1 font-mono text-white/50", children: versionLabel(pkg) }),
11250
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "rounded bg-white/[0.035] px-2 py-1 text-white/45", children: pkg.capability }),
11251
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "rounded bg-white/[0.035] px-2 py-1 font-mono text-white/35", children: pkg.installCommand })
11252
+ ] })
11253
+ ] });
11254
+ }
11255
+ function WorkflowTile({ workflow }) {
11256
+ const Icon2 = workflow.icon;
11257
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "rounded-lg bg-white/[0.025] p-3 shadow-[inset_0_0_0_1px_rgba(255,255,255,0.055)]", children: [
11258
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-start justify-between gap-3", children: [
11259
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex min-w-0 items-center gap-2", children: [
11260
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Icon2, { className: "size-4 shrink-0 text-cyan-200/75" }),
11261
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm font-semibold", children: workflow.title })
11262
+ ] }),
11263
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "rounded bg-white/[0.04] px-2 py-0.5 font-mono text-[10px] text-white/45", children: workflow.label })
11264
+ ] }),
11265
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mt-2 min-h-10 text-xs leading-5 text-muted-foreground", children: workflow.description }),
11266
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mt-3 font-mono text-[11px] text-white/35", children: workflow.metric })
11267
+ ] });
11268
+ }
11269
+ function buildSessionCommand(sessionId) {
11270
+ if (sessionId === null) {
11271
+ return 'npx @tonyclaw/eval-harness inspector-smoke --title "TonyClaw Lab smoke" --latest-log-limit 5';
11272
+ }
11273
+ return `npx @tonyclaw/eval-harness inspector-smoke --title "TonyClaw Lab smoke ${sessionId}" --latest-log-limit 5`;
11274
+ }
11275
+ function RunnerPresetCard({ preset }) {
11276
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "rounded-lg bg-white/[0.025] p-3 shadow-[inset_0_0_0_1px_rgba(255,255,255,0.055)]", children: [
11277
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-wrap items-start justify-between gap-3", children: [
11278
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "min-w-0", children: [
11279
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex min-w-0 items-start gap-2", children: [
11280
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Rocket, { className: "size-4 shrink-0 text-cyan-200/75" }),
11281
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm font-semibold leading-snug", children: preset.name })
11282
+ ] }),
11283
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-1 break-all font-mono text-[11px] leading-snug text-white/35", children: [
11284
+ preset.binary,
11285
+ " ",
11286
+ preset.modelFlag,
11287
+ preset.variantFlag !== null ? ` ${preset.variantFlag}` : ""
11288
+ ] })
11289
+ ] }),
11290
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Badge, { variant: "outline", className: "border-white/10 bg-white/[0.04] text-white/55", children: [
11291
+ "v",
11292
+ preset.validatedVersion
11293
+ ] })
11294
+ ] }),
11295
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-3 grid grid-cols-2 gap-2 text-[11px]", children: [
11296
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "rounded bg-black/15 px-2 py-1 text-white/45", children: [
11297
+ "logs/",
11298
+ preset.logDir
11299
+ ] }),
11300
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "rounded bg-black/15 px-2 py-1 text-white/45", children: preset.tools.join(", ") }),
11301
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "rounded bg-black/15 px-2 py-1 font-mono text-white/35", children: preset.skillsDir }),
11302
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "rounded bg-black/15 px-2 py-1 font-mono text-white/35", children: preset.agentsDir })
11303
+ ] })
11304
+ ] });
11305
+ }
11306
+ function AgentLabDialog({ currentSessionId, logCount }) {
11307
+ const [open, setOpen] = reactExports.useState(false);
11308
+ const [copied, setCopied] = reactExports.useState(false);
11309
+ const [copiedPresets, setCopiedPresets] = reactExports.useState(false);
11310
+ const response = useSWR("/api/ecosystem/packages", fetchEcosystemPackages, {
11311
+ revalidateOnFocus: false,
11312
+ revalidateIfStale: false
11313
+ });
11314
+ const packages = response.data?.packages ?? [];
11315
+ const runnerPresets = response.data?.runnerPresets ?? [];
11316
+ const installedCount = reactExports.useMemo(
11317
+ () => packages.filter((pkg) => pkg.state === "installed" || pkg.state === "update-available").length,
11318
+ [packages]
11319
+ );
11320
+ const sessionCommand = buildSessionCommand(currentSessionId);
11321
+ const presetsCommand = "npx @tonyclaw/eval-harness runner-presets";
11322
+ const copySessionCommand = () => {
11323
+ void copyTextToClipboard(sessionCommand).then(() => {
11324
+ setCopied(true);
11325
+ window.setTimeout(() => setCopied(false), 1200);
11326
+ });
11327
+ };
11328
+ const copyPresetsCommand = () => {
11329
+ void copyTextToClipboard(presetsCommand).then(() => {
11330
+ setCopiedPresets(true);
11331
+ window.setTimeout(() => setCopiedPresets(false), 1200);
11332
+ });
11333
+ };
11334
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(Dialog, { open, onOpenChange: setOpen, children: [
11335
+ /* @__PURE__ */ jsxRuntimeExports.jsx(DialogTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
11336
+ Button,
11337
+ {
11338
+ variant: "ghost",
11339
+ size: "icon",
11340
+ className: INSPECTOR_ICON_TRIGGER_CLASS,
11341
+ "aria-label": "TonyClaw Lab",
11342
+ title: "TonyClaw Lab",
11343
+ children: [
11344
+ /* @__PURE__ */ jsxRuntimeExports.jsx(FlaskConical, { className: "size-4" }),
11345
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "sr-only", children: "TonyClaw Lab" })
11346
+ ]
11347
+ }
11348
+ ) }),
11349
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogContent, { className: "flex max-h-[84vh] max-w-5xl flex-col overflow-hidden", children: [
11350
+ /* @__PURE__ */ jsxRuntimeExports.jsx(DialogHeader, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogTitle, { className: "flex items-center gap-2", children: [
11351
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Sparkles, { className: "size-4 text-cyan-200/80" }),
11352
+ "TonyClaw Lab"
11353
+ ] }) }),
11354
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "overflow-y-auto pr-2", children: [
11355
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid gap-3 lg:grid-cols-[1.1fr_0.9fr]", children: [
11356
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("section", { className: "rounded-lg bg-white/[0.025] p-4 shadow-[inset_0_0_0_1px_rgba(255,255,255,0.055)]", children: [
11357
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-wrap items-start justify-between gap-3", children: [
11358
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
11359
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm font-semibold", children: "Session asset pipeline" }),
11360
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mt-1 max-w-2xl text-xs leading-5 text-muted-foreground", children: "Treat captured traffic as durable assets: observe it, replay it, evaluate it, and expose it back to agents through MCP." })
11361
+ ] }),
11362
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Badge, { variant: "outline", className: "border-cyan-300/20 bg-cyan-300/8 text-cyan-100", children: [
11363
+ String(installedCount),
11364
+ "/",
11365
+ String(packages.length),
11366
+ " packages"
11367
+ ] })
11368
+ ] }),
11369
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mt-4 grid gap-3 sm:grid-cols-2", children: WORKFLOWS.map((workflow) => /* @__PURE__ */ jsxRuntimeExports.jsx(WorkflowTile, { workflow }, workflow.id)) })
11370
+ ] }),
11371
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("section", { className: "rounded-lg bg-white/[0.025] p-4 shadow-[inset_0_0_0_1px_rgba(255,255,255,0.055)]", children: [
11372
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-start justify-between gap-3", children: [
11373
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
11374
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm font-semibold", children: "Current session" }),
11375
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mt-1 text-xs text-muted-foreground", children: currentSessionId === null ? "MCP smoke command" : currentSessionId })
11376
+ ] }),
11377
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Badge, { variant: "outline", className: "border-white/10 bg-white/[0.04] text-white/55", children: [
11378
+ String(logCount),
11379
+ " logs"
11380
+ ] })
11381
+ ] }),
11382
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mt-4 rounded-md bg-black/20 p-3 font-mono text-[11px] leading-5 text-white/55 shadow-[inset_0_0_0_1px_rgba(255,255,255,0.045)]", children: sessionCommand }),
11383
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-3 flex flex-wrap items-center gap-2", children: [
11384
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Button, { size: "sm", variant: "secondary", onClick: copySessionCommand, children: [
11385
+ copied ? /* @__PURE__ */ jsxRuntimeExports.jsx(Check, { className: "size-3.5" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(Copy, { className: "size-3.5" }),
11386
+ copied ? "Copied" : "Copy"
11387
+ ] }),
11388
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Button, { size: "sm", variant: "outline", onClick: copyPresetsCommand, children: [
11389
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Beaker, { className: "size-3.5" }),
11390
+ copiedPresets ? "Presets copied" : "Runner Presets"
11391
+ ] })
11392
+ ] })
11393
+ ] })
11394
+ ] }),
11395
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("section", { className: "mt-3", children: [
11396
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mb-2 flex items-center justify-between gap-3", children: [
11397
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm font-semibold", children: "Runner presets" }),
11398
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "hidden items-center gap-1 font-mono text-[11px] text-muted-foreground sm:flex", children: [
11399
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Terminal, { className: "size-3.5" }),
11400
+ presetsCommand
11401
+ ] })
11402
+ ] }),
11403
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid gap-3 md:grid-cols-2 xl:grid-cols-4", children: [
11404
+ runnerPresets.map((preset) => /* @__PURE__ */ jsxRuntimeExports.jsx(RunnerPresetCard, { preset }, preset.id)),
11405
+ response.isLoading && runnerPresets.length === 0 && [0, 1, 2, 3].map((index) => /* @__PURE__ */ jsxRuntimeExports.jsx(
11406
+ "div",
11407
+ {
11408
+ className: "h-32 animate-pulse rounded-lg bg-white/[0.025] shadow-[inset_0_0_0_1px_rgba(255,255,255,0.055)]"
11409
+ },
11410
+ index
11411
+ ))
11412
+ ] })
11413
+ ] }),
11414
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("section", { className: "mt-3", children: [
11415
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mb-2 flex items-center justify-between gap-3", children: [
11416
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm font-semibold", children: "TonyClaw packages" }),
11417
+ response.isLoading && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "font-mono text-[11px] text-muted-foreground", children: "checking npm..." })
11418
+ ] }),
11419
+ response.error !== void 0 && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "rounded-lg bg-red-500/8 p-3 text-xs text-red-100 shadow-[inset_0_0_0_1px_rgba(248,113,113,0.16)]", children: "Package status is temporarily unavailable." }),
11420
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid gap-3 md:grid-cols-3", children: [
11421
+ packages.map((pkg) => /* @__PURE__ */ jsxRuntimeExports.jsx(PackageStatusCard, { pkg }, pkg.id)),
11422
+ response.isLoading && packages.length === 0 && [0, 1, 2].map((index) => /* @__PURE__ */ jsxRuntimeExports.jsx(
11423
+ "div",
11424
+ {
11425
+ className: "h-36 animate-pulse rounded-lg bg-white/[0.025] shadow-[inset_0_0_0_1px_rgba(255,255,255,0.055)]"
11426
+ },
11427
+ index
11428
+ ))
11429
+ ] })
11430
+ ] })
11431
+ ] })
11432
+ ] })
11433
+ ] });
11434
+ }
11119
11435
  function computeCacheTrends(groups) {
11120
11436
  const result = /* @__PURE__ */ new Map();
11121
11437
  for (const group of groups) {
@@ -13508,16 +13824,18 @@ function CrabFamily({
13508
13824
  }
13509
13825
  function BrandHeader({
13510
13826
  compact,
13511
- crabEntrancePhase
13827
+ crabEntrancePhase,
13828
+ currentSessionId,
13829
+ logCount
13512
13830
  }) {
13513
13831
  if (compact) {
13514
13832
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-white/[0.035] shadow-[inset_0_1px_0_rgba(255,255,255,0.045),0_16px_44px_rgba(0,0,0,0.18)] rounded-[8px] p-3", children: [
13515
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-start justify-between gap-3", children: [
13516
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex min-w-0 items-start gap-2", children: [
13833
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-wrap items-start justify-between gap-3", children: [
13834
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex min-w-fit items-start gap-2", children: [
13517
13835
  /* @__PURE__ */ jsxRuntimeExports.jsx(CrabFamily, { compact: true, entrancePhase: crabEntrancePhase }),
13518
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "min-w-0", children: [
13519
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex min-w-0 items-baseline gap-2", children: [
13520
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate text-base font-bold", children: "Inspector" }),
13836
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "min-w-fit", children: [
13837
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex min-w-fit flex-wrap items-baseline gap-x-2 gap-y-0.5", children: [
13838
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "whitespace-nowrap text-base font-bold", children: "Agent Inspector" }),
13521
13839
  /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "hidden shrink-0 font-mono text-[11px] font-semibold text-muted-foreground sm:inline", children: [
13522
13840
  "v",
13523
13841
  packageJson.version
@@ -13529,19 +13847,20 @@ function BrandHeader({
13529
13847
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex shrink-0 items-center gap-1", children: [
13530
13848
  /* @__PURE__ */ jsxRuntimeExports.jsx(AlertsDialog, {}),
13531
13849
  /* @__PURE__ */ jsxRuntimeExports.jsx(GroupsDialog, {}),
13850
+ /* @__PURE__ */ jsxRuntimeExports.jsx(AgentLabDialog, { currentSessionId, logCount }),
13532
13851
  /* @__PURE__ */ jsxRuntimeExports.jsx(SettingsDialog, {})
13533
13852
  ] })
13534
13853
  ] }),
13535
13854
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mt-2 hidden sm:block", children: /* @__PURE__ */ jsxRuntimeExports.jsx(McpReadyBadge, {}) })
13536
13855
  ] });
13537
13856
  }
13538
- return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-[1fr_auto_1fr] items-start gap-3 pb-6", children: [
13539
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", {}),
13540
- /* @__PURE__ */ jsxRuntimeExports.jsxs("h1", { className: "flex min-w-0 flex-col items-center gap-2 text-center", children: [
13541
- /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "flex max-w-[calc(100vw-7rem)] items-end gap-2 whitespace-nowrap", children: [
13857
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-wrap items-start justify-between gap-x-4 gap-y-3 pb-6", children: [
13858
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "min-w-10 flex-1", "aria-hidden": "true" }),
13859
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("h1", { className: "flex min-w-fit flex-col items-center gap-2 text-center", children: [
13860
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "flex max-w-full flex-wrap items-end justify-center gap-x-2 gap-y-1", children: [
13542
13861
  /* @__PURE__ */ jsxRuntimeExports.jsx(CrabFamily, { compact: false, entrancePhase: crabEntrancePhase }),
13543
- /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "flex min-w-0 items-baseline gap-2 pl-1", children: [
13544
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate text-lg font-bold", children: "Agent Inspector" }),
13862
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "flex min-w-fit flex-wrap items-baseline justify-center gap-x-2 gap-y-0.5 pl-1", children: [
13863
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "whitespace-nowrap text-lg font-bold", children: "Agent Inspector" }),
13545
13864
  /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "shrink-0 font-mono text-xs font-semibold text-muted-foreground", children: [
13546
13865
  "v",
13547
13866
  packageJson.version
@@ -13550,12 +13869,13 @@ function BrandHeader({
13550
13869
  /* @__PURE__ */ jsxRuntimeExports.jsx(Plus, { className: "size-4 shrink-0 text-muted-foreground/70", "aria-hidden": "true" }),
13551
13870
  /* @__PURE__ */ jsxRuntimeExports.jsx(McpLogo, { className: "size-10 shrink-0" })
13552
13871
  ] }),
13553
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "max-w-[calc(100vw-7rem)] text-sm font-semibold text-muted-foreground", children: "Local First. Evidence First." }),
13872
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "max-w-full text-sm font-semibold text-muted-foreground", children: "Local First. Evidence First." }),
13554
13873
  /* @__PURE__ */ jsxRuntimeExports.jsx(McpReadyBadge, {})
13555
13874
  ] }),
13556
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "justify-self-end flex items-center gap-1", children: [
13875
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-1 justify-end gap-1", children: [
13557
13876
  /* @__PURE__ */ jsxRuntimeExports.jsx(AlertsDialog, {}),
13558
13877
  /* @__PURE__ */ jsxRuntimeExports.jsx(GroupsDialog, {}),
13878
+ /* @__PURE__ */ jsxRuntimeExports.jsx(AgentLabDialog, { currentSessionId, logCount }),
13559
13879
  /* @__PURE__ */ jsxRuntimeExports.jsx(SettingsDialog, {})
13560
13880
  ] })
13561
13881
  ] });
@@ -14019,10 +14339,19 @@ function ProxyViewer({
14019
14339
  },
14020
14340
  [onSessionChange]
14021
14341
  );
14342
+ const labSessionId = pinnedSessionId !== void 0 ? pinnedSessionId : selectedSession === "__all__" ? null : selectedSession;
14022
14343
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-background min-h-screen w-full text-foreground", children: [
14023
14344
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid min-h-screen w-full grid-cols-1 lg:grid-cols-[minmax(0,1fr)_340px] xl:grid-cols-[minmax(0,1fr)_360px]", children: [
14024
14345
  /* @__PURE__ */ jsxRuntimeExports.jsx("aside", { className: "bg-background/95 order-1 border-b border-white/[0.045] lg:sticky lg:top-0 lg:order-2 lg:h-screen lg:overflow-y-auto lg:border-b-0 lg:border-l lg:border-white/[0.055]", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-4 p-4", children: [
14025
- /* @__PURE__ */ jsxRuntimeExports.jsx(BrandHeader, { compact: true, crabEntrancePhase }),
14346
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
14347
+ BrandHeader,
14348
+ {
14349
+ compact: true,
14350
+ crabEntrancePhase,
14351
+ currentSessionId: labSessionId,
14352
+ logCount: logs.length
14353
+ }
14354
+ ),
14026
14355
  /* @__PURE__ */ jsxRuntimeExports.jsxs(SidebarPanel, { label: "Session", children: [
14027
14356
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-2 gap-2", children: [
14028
14357
  /* @__PURE__ */ jsxRuntimeExports.jsx(SidebarMetric, { label: "Requests", value: logs.length }),
@@ -1,10 +1,10 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "../_libs/react.mjs";
2
- import { u as useProviders, D as Dialog, d as DialogContent, e as DialogHeader, h as DialogTitle, T as Tabs, i as TabsList, j as TabsTrigger, k as TabsContent, l as Button, m as TooltipProvider, n as Tooltip, o as TooltipTrigger, p as TooltipContent, q as dispatchLogFocusRequest } from "./ProxyViewerContainer-S9izw3ND.mjs";
3
- import { ResponseView } from "./ResponseView-Dk8Op622.mjs";
4
- import { C as CapturedLogSchema } from "./router-BJMaHkr1.mjs";
2
+ import { u as useProviders, D as Dialog, d as DialogContent, e as DialogHeader, h as DialogTitle, T as Tabs, i as TabsList, j as TabsTrigger, k as TabsContent, l as Button, m as TooltipProvider, n as Tooltip, o as TooltipTrigger, p as TooltipContent, q as dispatchLogFocusRequest } from "./ProxyViewerContainer-7geuf78f.mjs";
3
+ import { ResponseView } from "./ResponseView-D-sDsdQr.mjs";
4
+ import { C as CapturedLogSchema } from "./router-Zh2iZ_u0.mjs";
5
5
  import "../_libs/jszip.mjs";
6
6
  import "../_libs/modelcontextprotocol__server.mjs";
7
- import { af as RotateCcw, ar as Braces, as as Minimize2 } from "../_libs/lucide-react.mjs";
7
+ import { am as RotateCcw, ay as Braces, az as Minimize2 } from "../_libs/lucide-react.mjs";
8
8
  import { d as object, n as number, a as array, c as boolean, b as string } from "../_libs/zod.mjs";
9
9
  import "../_libs/swr.mjs";
10
10
  import "../_libs/use-sync-external-store.mjs";