@tonyclaw/agent-inspector 3.0.9 → 3.0.11

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 (38) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/assets/{CompareDrawer-CJKL4LMm.js → CompareDrawer-gb4FHIDP.js} +1 -1
  3. package/.output/public/assets/ProxyViewerContainer-yqasBIbY.js +106 -0
  4. package/.output/public/assets/{ReplayDialog-BYanl-a_.js → ReplayDialog-uXfMIorn.js} +1 -1
  5. package/.output/public/assets/{RequestAnatomy-DvPz1jqE.js → RequestAnatomy-NqGFn7lk.js} +1 -1
  6. package/.output/public/assets/{ResponseView-sZnxp9GN.js → ResponseView-BWSWdjPl.js} +2 -2
  7. package/.output/public/assets/{StreamingChunkSequence-G-tiYiBd.js → StreamingChunkSequence-qeCLglzr.js} +1 -1
  8. package/.output/public/assets/{_sessionId-_hDcsmXq.js → _sessionId-COT-xg31.js} +1 -1
  9. package/.output/public/assets/index-BIgsQvaF.css +1 -0
  10. package/.output/public/assets/{index-SuOSQb2_.js → index-CKVD6xzC.js} +1 -1
  11. package/.output/public/assets/index-swjqFLcG.js +1 -0
  12. package/.output/public/assets/{json-viewer-yQdhgjaw.js → json-viewer-ux5usy0f.js} +1 -1
  13. package/.output/public/assets/{main-CgjcDxjR.js → main-BM5Sp2nO.js} +2 -2
  14. package/.output/server/_libs/lucide-react.mjs +2 -2
  15. package/.output/server/{_sessionId-BGISf2En.mjs → _sessionId-8D0eTdRJ.mjs} +2 -2
  16. package/.output/server/_ssr/{CompareDrawer-s-UF9gW3.mjs → CompareDrawer-Hcs0aQWl.mjs} +3 -3
  17. package/.output/server/_ssr/{ProxyViewerContainer-C0Sbz9ED.mjs → ProxyViewerContainer-D2CkbvcS.mjs} +185 -246
  18. package/.output/server/_ssr/{ReplayDialog-DvS8gvJr.mjs → ReplayDialog-O2R9y9xD.mjs} +3 -3
  19. package/.output/server/_ssr/{RequestAnatomy-BwhWglJL.mjs → RequestAnatomy-DkvrjK-3.mjs} +2 -2
  20. package/.output/server/_ssr/{ResponseView-wBVreqQf.mjs → ResponseView-CPcMs3Um.mjs} +2 -2
  21. package/.output/server/_ssr/{StreamingChunkSequence-Dr6eg-MJ.mjs → StreamingChunkSequence-FlBdqDP3.mjs} +2 -2
  22. package/.output/server/_ssr/{index-B98Wia1X.mjs → index-ChG0L62e.mjs} +2 -2
  23. package/.output/server/_ssr/index.mjs +2 -2
  24. package/.output/server/_ssr/{json-viewer-D7L8y0FH.mjs → json-viewer-Bb1g2nec.mjs} +2 -2
  25. package/.output/server/_ssr/{router-g9mo0nWT.mjs → router-840N-dk9.mjs} +21 -12
  26. package/.output/server/{_tanstack-start-manifest_v-CbGc-o50.mjs → _tanstack-start-manifest_v-Qi0D1Tl0.mjs} +1 -1
  27. package/.output/server/index.mjs +70 -70
  28. package/package.json +1 -1
  29. package/src/components/ProxyViewerContainer.tsx +10 -2
  30. package/src/components/providers/ProviderCard.tsx +98 -136
  31. package/src/components/providers/ProvidersPanel.tsx +61 -106
  32. package/src/components/providers/SettingsDialog.tsx +17 -22
  33. package/src/components/proxy-viewer/LogEntryHeader.tsx +17 -43
  34. package/src/components/ui/tooltip.tsx +1 -1
  35. package/src/routes/api/logs.ts +14 -5
  36. package/.output/public/assets/ProxyViewerContainer-DBUy29O-.js +0 -106
  37. package/.output/public/assets/index-DAPAWsAd.js +0 -1
  38. package/.output/public/assets/index-DspnLqUW.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 { 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, l as AlertSummarySchema, m as AlertListResponseSchema, I as InspectorGroupsListResponseSchema, G as GroupEvidenceReadResponseSchema, 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, 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-g9mo0nWT.mjs";
2
+ import { 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, l as AlertSummarySchema, m as AlertListResponseSchema, I as InspectorGroupsListResponseSchema, G as GroupEvidenceReadResponseSchema, 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, t as maskApiKey, v as PATH_V1_MESSAGES, w as PATH_V1_CHAT_COMPLETIONS, x 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, u as findProviderModelMetadata, y as previewUpstreamUrl, K as KnowledgeCandidateSchema, J as isPlainRecord, k as stripClaudeCodeBillingHeader, L as LogBodyChunkSchema } from "./router-840N-dk9.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 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";
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 CircleCheckBig, a3 as Minus, 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, n as number, c as boolean, b as string, _ 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";
@@ -1074,7 +1074,7 @@ function ProviderLogo({
1074
1074
  }
1075
1075
  }
1076
1076
  function TooltipProvider({
1077
- delayDuration = 0,
1077
+ delayDuration = 600,
1078
1078
  ...props
1079
1079
  }) {
1080
1080
  return /* @__PURE__ */ jsxRuntimeExports.jsx(
@@ -2546,27 +2546,27 @@ function useCopyFeedback(text) {
2546
2546
  return { copied, copy };
2547
2547
  }
2548
2548
  const LazyCompareDrawer = reactExports.lazy(
2549
- () => import("./CompareDrawer-s-UF9gW3.mjs").then((m) => ({ default: m.CompareDrawer }))
2549
+ () => import("./CompareDrawer-Hcs0aQWl.mjs").then((m) => ({ default: m.CompareDrawer }))
2550
2550
  );
2551
2551
  const LazyReplayDialog = reactExports.lazy(
2552
- () => import("./ReplayDialog-DvS8gvJr.mjs").then((m) => ({ default: m.ReplayDialog }))
2552
+ () => import("./ReplayDialog-O2R9y9xD.mjs").then((m) => ({ default: m.ReplayDialog }))
2553
2553
  );
2554
2554
  const LazyRequestAnatomy = reactExports.lazy(
2555
- () => import("./RequestAnatomy-BwhWglJL.mjs").then((m) => ({ default: m.RequestAnatomy }))
2555
+ () => import("./RequestAnatomy-DkvrjK-3.mjs").then((m) => ({ default: m.RequestAnatomy }))
2556
2556
  );
2557
2557
  const LazyResponseView = reactExports.lazy(
2558
- () => import("./ResponseView-wBVreqQf.mjs").then((m) => ({ default: m.ResponseView }))
2558
+ () => import("./ResponseView-CPcMs3Um.mjs").then((m) => ({ default: m.ResponseView }))
2559
2559
  );
2560
2560
  const LazyStreamingChunkSequence = reactExports.lazy(
2561
- () => import("./StreamingChunkSequence-Dr6eg-MJ.mjs").then((m) => ({
2561
+ () => import("./StreamingChunkSequence-FlBdqDP3.mjs").then((m) => ({
2562
2562
  default: m.StreamingChunkSequence
2563
2563
  }))
2564
2564
  );
2565
2565
  const LazyJsonViewer = reactExports.lazy(
2566
- () => import("./json-viewer-D7L8y0FH.mjs").then((m) => ({ default: m.JsonViewer }))
2566
+ () => import("./json-viewer-Bb1g2nec.mjs").then((m) => ({ default: m.JsonViewer }))
2567
2567
  );
2568
2568
  const LazyJsonViewerFromString = reactExports.lazy(
2569
- () => import("./json-viewer-D7L8y0FH.mjs").then((m) => ({ default: m.JsonViewerFromString }))
2569
+ () => import("./json-viewer-Bb1g2nec.mjs").then((m) => ({ default: m.JsonViewerFromString }))
2570
2570
  );
2571
2571
  const HIGHLIGHT_DURATION_MS = 1200;
2572
2572
  const MAX_HIGHLIGHT_ATTEMPTS = 12;
@@ -3105,7 +3105,7 @@ const LogEntryHeader = reactExports.memo(function({
3105
3105
  const warningCount = log.warnings?.length ?? 0;
3106
3106
  const hasClientPid = log.clientPid !== null && log.clientPid !== void 0;
3107
3107
  const hasClientProjectFolder = log.clientProjectFolder !== null && log.clientProjectFolder !== void 0 && log.clientProjectFolder !== "";
3108
- const hasClientCwd = log.clientCwd !== null && log.clientCwd !== void 0 && log.clientCwd !== "";
3108
+ log.clientCwd !== null && log.clientCwd !== void 0 && log.clientCwd !== "";
3109
3109
  const statusCue = STATUS_CUE_CLASSES[statusCategory];
3110
3110
  const statusLabel2 = statusCueLabel(statusCategory, log.responseStatus);
3111
3111
  const showStatusBadge = statusCategory !== "success" || log.responseStatus !== 200;
@@ -3204,22 +3204,16 @@ const LogEntryHeader = reactExports.memo(function({
3204
3204
  /* @__PURE__ */ jsxRuntimeExports.jsx(Clock, { className: "size-3" }),
3205
3205
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono tabular-nums", children: formatElapsed$3(log.elapsedMs) })
3206
3206
  ] })),
3207
- log.streaming && firstChunkLabel !== null && /* @__PURE__ */ jsxRuntimeExports.jsxs(Tooltip, { children: [
3208
- /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: cn(TELEMETRY_CHIP_CLASS, "shrink-0 text-cyan-300"), children: [
3209
- /* @__PURE__ */ jsxRuntimeExports.jsx(Radio, { className: "size-3" }),
3210
- /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "font-mono tabular-nums", children: [
3211
- "first ",
3212
- firstChunkLabel
3213
- ] })
3214
- ] }) }),
3215
- /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipContent, { children: "Time to first streaming chunk" })
3207
+ log.streaming && firstChunkLabel !== null && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: cn(TELEMETRY_CHIP_CLASS, "shrink-0 text-cyan-300"), children: [
3208
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Radio, { className: "size-3" }),
3209
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "font-mono tabular-nums", children: [
3210
+ "first ",
3211
+ firstChunkLabel
3212
+ ] })
3216
3213
  ] }),
3217
- log.streaming && tokenRateLabel !== null && /* @__PURE__ */ jsxRuntimeExports.jsxs(Tooltip, { children: [
3218
- /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: cn(TELEMETRY_CHIP_CLASS, "shrink-0 text-cyan-300"), children: [
3219
- /* @__PURE__ */ jsxRuntimeExports.jsx(Gauge, { className: "size-3" }),
3220
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono tabular-nums", children: tokenRateLabel })
3221
- ] }) }),
3222
- /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipContent, { children: "Output token throughput after first chunk" })
3214
+ log.streaming && tokenRateLabel !== null && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: cn(TELEMETRY_CHIP_CLASS, "shrink-0 text-cyan-300"), children: [
3215
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Gauge, { className: "size-3" }),
3216
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono tabular-nums", children: tokenRateLabel })
3223
3217
  ] }),
3224
3218
  hasTokens && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: cn(TELEMETRY_CHIP_CLASS, "min-w-0 sm:shrink-0"), children: [
3225
3219
  /* @__PURE__ */ jsxRuntimeExports.jsx(Zap, { className: "size-3 text-muted-foreground" }),
@@ -3286,26 +3280,14 @@ const LogEntryHeader = reactExports.memo(function({
3286
3280
  ]
3287
3281
  }
3288
3282
  ),
3289
- showClientMetadata && (hasClientPid || hasClientProjectFolder) && /* @__PURE__ */ jsxRuntimeExports.jsxs(Tooltip, { children: [
3290
- /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
3291
- "span",
3292
- {
3293
- className: cn(TELEMETRY_CHIP_CLASS, "hidden shrink-0 text-purple-300 xl:flex"),
3294
- children: [
3295
- /* @__PURE__ */ jsxRuntimeExports.jsx(FileTerminal, { className: "size-3" }),
3296
- hasClientProjectFolder ? /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono tabular-nums", children: log.clientProjectFolder }) : /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "font-mono tabular-nums", children: [
3297
- "PID ",
3298
- log.clientPid
3299
- ] })
3300
- ]
3301
- }
3302
- ) }),
3303
- /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipContent, { children: hasClientCwd ? `PID: ${log.clientPid ?? "?"} CWD: ${log.clientCwd}` : `Process ID: ${log.clientPid ?? "?"}` })
3283
+ showClientMetadata && (hasClientPid || hasClientProjectFolder) && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: cn(TELEMETRY_CHIP_CLASS, "hidden shrink-0 text-purple-300 xl:flex"), children: [
3284
+ /* @__PURE__ */ jsxRuntimeExports.jsx(FileTerminal, { className: "size-3" }),
3285
+ hasClientProjectFolder ? /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono tabular-nums", children: log.clientProjectFolder }) : /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "font-mono tabular-nums", children: [
3286
+ "PID ",
3287
+ log.clientPid
3288
+ ] })
3304
3289
  ] }),
3305
- showStandaloneStreamingIndicator && /* @__PURE__ */ jsxRuntimeExports.jsxs(Tooltip, { children: [
3306
- /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsx(Radio, { className: "size-3 text-muted-foreground/60 shrink-0" }) }),
3307
- /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipContent, { children: "Request used SSE streaming" })
3308
- ] })
3290
+ showStandaloneStreamingIndicator && /* @__PURE__ */ jsxRuntimeExports.jsx(Radio, { className: "size-3 shrink-0 text-muted-foreground/60" })
3309
3291
  ] }),
3310
3292
  /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "flex shrink-0 items-start gap-1.5", children: [
3311
3293
  expanded && /* @__PURE__ */ jsxRuntimeExports.jsxs(
@@ -8299,33 +8281,12 @@ function ProviderFormatTestStatus({
8299
8281
  ] })
8300
8282
  ] });
8301
8283
  }
8302
- function EndpointDiagnosticLine({
8303
- diagnostic
8304
- }) {
8305
- return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: diagnostic.severity === "warning" ? "text-amber-200" : "text-muted-foreground", children: diagnostic.message });
8306
- }
8307
- function ProviderEndpointSummary({
8284
+ function ProviderFormatStatusBlock({
8308
8285
  label,
8309
- baseUrl,
8310
- endpoint,
8311
- providerName,
8312
8286
  children
8313
8287
  }) {
8314
- const preview = previewUpstreamUrl(baseUrl, endpoint, { providerName });
8315
- return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex min-w-0 flex-col gap-2 border-t border-border/60 pt-2 first:border-t-0 first:pt-0", children: [
8316
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid min-w-0 gap-1 text-xs sm:grid-cols-[104px_minmax(0,1fr)]", children: [
8317
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-medium text-muted-foreground", children: label }),
8318
- /* @__PURE__ */ jsxRuntimeExports.jsx("code", { className: "min-w-0 break-all font-mono text-foreground/80", children: baseUrl }),
8319
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[10px] uppercase text-muted-foreground/80", children: "Final" }),
8320
- /* @__PURE__ */ jsxRuntimeExports.jsx("code", { className: "min-w-0 break-all font-mono text-foreground", children: preview.finalUrl })
8321
- ] }),
8322
- preview.diagnostics.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "space-y-1 text-xs", children: preview.diagnostics.map((diagnostic) => /* @__PURE__ */ jsxRuntimeExports.jsx(
8323
- EndpointDiagnosticLine,
8324
- {
8325
- diagnostic
8326
- },
8327
- `${diagnostic.severity}:${diagnostic.message}`
8328
- )) }),
8288
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "min-w-0 space-y-2 rounded-md border border-border/60 bg-muted/15 p-2", children: [
8289
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-xs font-medium text-foreground/80", children: label }),
8329
8290
  children
8330
8291
  ] });
8331
8292
  }
@@ -8345,22 +8306,38 @@ function providerTestTargets(provider) {
8345
8306
  }
8346
8307
  return targets;
8347
8308
  }
8348
- function ProviderTestCoverage({ provider }) {
8349
- const targets = providerTestTargets(provider);
8350
- if (targets.length === 0) {
8309
+ function CapabilityChip({
8310
+ label,
8311
+ enabled,
8312
+ tone
8313
+ }) {
8314
+ const resolvedTone = tone ?? (enabled ? "active" : "quiet");
8315
+ const className = resolvedTone === "response" && enabled ? "border-sky-300/30 bg-sky-300/[0.09] text-sky-100" : enabled ? "border-border/70 bg-muted/25 text-foreground/80" : "border-border/50 bg-transparent text-muted-foreground/70";
8316
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: `inline-flex items-center gap-1 rounded border px-1.5 py-0.5 ${className}`, children: [
8317
+ enabled ? /* @__PURE__ */ jsxRuntimeExports.jsx(CircleCheckBig, { className: "size-3" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(Minus, { className: "size-3" }),
8318
+ label
8319
+ ] });
8320
+ }
8321
+ function ProviderCapabilitySummary({ provider }) {
8322
+ const hasAnthropic = providerHasEndpoint(provider.anthropicBaseUrl);
8323
+ const hasChat = providerHasEndpoint(provider.openaiBaseUrl);
8324
+ const hasResponses = providerHasEndpoint(provider.openaiResponsesBaseUrl);
8325
+ if (!hasAnthropic && !hasChat && !hasResponses) {
8351
8326
  return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-xs text-muted-foreground", children: "Test requires at least one configured endpoint." });
8352
8327
  }
8353
8328
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex min-w-0 flex-wrap items-center gap-1.5 text-xs text-muted-foreground", children: [
8354
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Test covers" }),
8355
- targets.map((target) => /* @__PURE__ */ jsxRuntimeExports.jsx(
8356
- "span",
8329
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Capabilities" }),
8330
+ hasAnthropic && /* @__PURE__ */ jsxRuntimeExports.jsx(CapabilityChip, { label: "Anthropic", enabled: true }),
8331
+ hasChat && /* @__PURE__ */ jsxRuntimeExports.jsx(CapabilityChip, { label: "OpenAI Chat", enabled: true }),
8332
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
8333
+ CapabilityChip,
8357
8334
  {
8358
- className: "rounded border border-border/70 bg-muted/25 px-1.5 py-0.5 text-foreground/80",
8359
- children: target
8360
- },
8361
- target
8362
- )),
8363
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "non-stream + stream" })
8335
+ label: hasResponses ? "OpenAI Responses" : "No OpenAI Responses",
8336
+ enabled: hasResponses,
8337
+ tone: "response"
8338
+ }
8339
+ ),
8340
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "tested non-stream + stream" })
8364
8341
  ] });
8365
8342
  }
8366
8343
  function configuredFormatResults(provider, testResults) {
@@ -8572,23 +8549,20 @@ function TestStatus({ result }) {
8572
8549
  if (i > 0) displayTiming.push(", ");
8573
8550
  displayTiming.push(timingParts[i]);
8574
8551
  }
8575
- return /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipProvider, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Tooltip, { children: [
8576
- /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-1 text-xs text-cyan-100 shrink-0", children: [
8577
- /* @__PURE__ */ jsxRuntimeExports.jsx(CircleCheckBig, { className: "size-3 text-cyan-300" }),
8578
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Connected" }),
8579
- tokenParts.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-muted-foreground", children: [
8580
- "(",
8581
- displayTokens,
8582
- ")"
8583
- ] }),
8584
- timingParts.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "hidden text-muted-foreground lg:inline", children: [
8585
- "(",
8586
- displayTiming,
8587
- ")"
8588
- ] })
8589
- ] }) }),
8590
- /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipContent, { children: "Connection test passed" })
8591
- ] }) });
8552
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex shrink-0 items-center gap-1 text-xs text-cyan-100", children: [
8553
+ /* @__PURE__ */ jsxRuntimeExports.jsx(CircleCheckBig, { className: "size-3 text-cyan-300" }),
8554
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Connected" }),
8555
+ tokenParts.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-muted-foreground", children: [
8556
+ "(",
8557
+ displayTokens,
8558
+ ")"
8559
+ ] }),
8560
+ timingParts.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "hidden text-muted-foreground lg:inline", children: [
8561
+ "(",
8562
+ displayTiming,
8563
+ ")"
8564
+ ] })
8565
+ ] });
8592
8566
  }
8593
8567
  const error = result.error;
8594
8568
  const errorMessage = error?.message ?? "Connection failed";
@@ -8597,10 +8571,7 @@ function TestStatus({ result }) {
8597
8571
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-1 shrink-0", children: [
8598
8572
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-1 text-xs text-red-600 max-w-[200px]", children: [
8599
8573
  getErrorIcon(errorType),
8600
- /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipProvider, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Tooltip, { children: [
8601
- /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate", children: errorMessage }) }),
8602
- /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipContent, { children: "Connection test failed" })
8603
- ] }) }),
8574
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate", children: errorMessage }),
8604
8575
  hasDetails && /* @__PURE__ */ jsxRuntimeExports.jsxs(
8605
8576
  "button",
8606
8577
  {
@@ -8679,13 +8650,7 @@ function ProviderCard({
8679
8650
  const metadataImportLabel = canRefreshMetadata ? "Refresh" : "Import defaults";
8680
8651
  const isTestingValue = isTesting ?? false;
8681
8652
  const testedModelsLabel = modelResultsLabel(testResults);
8682
- const providerSourceBadge = provider.source === "company" ? /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipProvider, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Tooltip, { children: [
8683
- /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "shrink-0 rounded border border-cyan-300/20 bg-cyan-300/[0.08] px-1.5 py-0.5 text-xs text-cyan-100", children: "Company" }) }),
8684
- /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipContent, { children: "Company-provided API key" })
8685
- ] }) }) : provider.source === "personal" ? /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipProvider, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Tooltip, { children: [
8686
- /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "shrink-0 rounded border border-violet-300/20 bg-violet-300/[0.08] px-1.5 py-0.5 text-xs text-violet-100", children: "Personal" }) }),
8687
- /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipContent, { children: "Your personal API key" })
8688
- ] }) }) : null;
8653
+ const providerSourceBadge = provider.source === "company" ? /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "shrink-0 rounded border border-cyan-300/20 bg-cyan-300/[0.08] px-1.5 py-0.5 text-xs text-cyan-100", children: "Company" }) : provider.source === "personal" ? /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "shrink-0 rounded border border-violet-300/20 bg-violet-300/[0.08] px-1.5 py-0.5 text-xs text-violet-100", children: "Personal" }) : null;
8689
8654
  return /* @__PURE__ */ jsxRuntimeExports.jsxs(
8690
8655
  "div",
8691
8656
  {
@@ -8725,7 +8690,7 @@ function ProviderCard({
8725
8690
  ] })
8726
8691
  ] }),
8727
8692
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-2 text-xs text-muted-foreground sm:flex-row sm:items-center sm:justify-between", children: [
8728
- /* @__PURE__ */ jsxRuntimeExports.jsx(ProviderTestCoverage, { provider }),
8693
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ProviderCapabilitySummary, { provider }),
8729
8694
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [
8730
8695
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Key configured" }),
8731
8696
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: provider.authHeader === "x-api-key" ? "x-api-key" : "Bearer" }),
@@ -8792,36 +8757,21 @@ function ProviderCard({
8792
8757
  )
8793
8758
  ] }),
8794
8759
  provider.models !== void 0 && provider.models.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex flex-wrap gap-1", children: provider.models.map((model) => /* @__PURE__ */ jsxRuntimeExports.jsx(ModelChip, { provider, model }, model)) }),
8795
- providerHasEndpoint(provider.anthropicBaseUrl) && /* @__PURE__ */ jsxRuntimeExports.jsx(
8796
- ProviderEndpointSummary,
8797
- {
8798
- label: "Anthropic",
8799
- baseUrl: provider.anthropicBaseUrl,
8800
- endpoint: PATH_V1_MESSAGES,
8801
- providerName: provider.name,
8802
- children: testResults !== void 0 && /* @__PURE__ */ jsxRuntimeExports.jsx(ProviderFormatTestStatus, { results: testResults.anthropic })
8803
- }
8804
- ),
8805
- providerHasEndpoint(provider.openaiBaseUrl) && /* @__PURE__ */ jsxRuntimeExports.jsx(
8806
- ProviderEndpointSummary,
8807
- {
8808
- label: "Chat",
8809
- baseUrl: provider.openaiBaseUrl,
8810
- endpoint: PATH_V1_CHAT_COMPLETIONS,
8811
- providerName: provider.name,
8812
- children: testResults !== void 0 && /* @__PURE__ */ jsxRuntimeExports.jsx(ProviderFormatTestStatus, { results: testResults.openaiChat })
8813
- }
8814
- ),
8815
- providerHasEndpoint(provider.openaiResponsesBaseUrl) && /* @__PURE__ */ jsxRuntimeExports.jsx(
8816
- ProviderEndpointSummary,
8817
- {
8818
- label: "Responses",
8819
- baseUrl: provider.openaiResponsesBaseUrl,
8820
- endpoint: PATH_V1_RESPONSES,
8821
- providerName: provider.name,
8822
- children: testResults !== void 0 && /* @__PURE__ */ jsxRuntimeExports.jsx(ProviderFormatTestStatus, { results: testResults.openaiResponses })
8823
- }
8824
- ),
8760
+ (providerHasEndpoint(provider.anthropicBaseUrl) || providerHasEndpoint(provider.openaiBaseUrl) || providerHasEndpoint(provider.openaiResponsesBaseUrl)) && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid gap-2 lg:grid-cols-3", children: [
8761
+ providerHasEndpoint(provider.anthropicBaseUrl) && /* @__PURE__ */ jsxRuntimeExports.jsxs(ProviderFormatStatusBlock, { label: "Anthropic", children: [
8762
+ testResults !== void 0 && /* @__PURE__ */ jsxRuntimeExports.jsx(ProviderFormatTestStatus, { results: testResults.anthropic }),
8763
+ testResults === void 0 && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-xs text-muted-foreground", children: "Not tested yet" })
8764
+ ] }),
8765
+ providerHasEndpoint(provider.openaiBaseUrl) && /* @__PURE__ */ jsxRuntimeExports.jsxs(ProviderFormatStatusBlock, { label: "OpenAI Chat", children: [
8766
+ testResults !== void 0 && /* @__PURE__ */ jsxRuntimeExports.jsx(ProviderFormatTestStatus, { results: testResults.openaiChat }),
8767
+ testResults === void 0 && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-xs text-muted-foreground", children: "Not tested yet" })
8768
+ ] }),
8769
+ providerHasEndpoint(provider.openaiResponsesBaseUrl) && /* @__PURE__ */ jsxRuntimeExports.jsxs(ProviderFormatStatusBlock, { label: "OpenAI Responses", children: [
8770
+ testResults !== void 0 && /* @__PURE__ */ jsxRuntimeExports.jsx(ProviderFormatTestStatus, { results: testResults.openaiResponses }),
8771
+ testResults === void 0 && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-xs text-muted-foreground", children: "Not tested yet" })
8772
+ ] }),
8773
+ !providerHasEndpoint(provider.openaiResponsesBaseUrl) && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "min-w-0 rounded-md border border-border/50 bg-transparent p-2 text-xs text-muted-foreground/75", children: "OpenAI Responses not configured" })
8774
+ ] }),
8825
8775
  testResults?.models !== void 0 && Object.keys(testResults.models).length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
8826
8776
  /* @__PURE__ */ jsxRuntimeExports.jsxs(
8827
8777
  "button",
@@ -10244,7 +10194,7 @@ function ProvidersPanel({
10244
10194
  }
10245
10195
  if (showForm || editingProvider) {
10246
10196
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-4", children: [
10247
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "border border-border bg-background/95 shadow-sm sticky top-0 z-10 flex items-center justify-between rounded-[8px] px-3 py-2", children: /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-medium", children: editingProvider ? "Edit Provider" : "Add New Provider" }) }),
10197
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "sticky top-0 z-10 flex items-center justify-between gap-3 rounded-[8px] bg-background/95 px-1 py-1 backdrop-blur", children: /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-medium", children: editingProvider ? "Edit Provider" : "Add New Provider" }) }),
10248
10198
  /* @__PURE__ */ jsxRuntimeExports.jsx(
10249
10199
  ProviderForm,
10250
10200
  {
@@ -10259,41 +10209,35 @@ function ProvidersPanel({
10259
10209
  ] });
10260
10210
  }
10261
10211
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-4", children: [
10262
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "border border-border bg-background/95 shadow-sm sticky top-0 z-10 flex items-center justify-between rounded-[8px] px-3 py-2", children: [
10212
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "sticky top-0 z-10 flex items-center justify-between gap-3 rounded-[8px] bg-background/95 px-1 py-1 backdrop-blur", children: [
10263
10213
  /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-medium", children: "Providers" }),
10264
10214
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [
10265
- /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipProvider, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Tooltip, { children: [
10266
- /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
10267
- Button,
10268
- {
10269
- variant: "outline",
10270
- size: "sm",
10271
- onClick: () => handleExport(),
10272
- className: "gap-1 hover:bg-muted",
10273
- children: [
10274
- /* @__PURE__ */ jsxRuntimeExports.jsx(Download, { className: "size-3" }),
10275
- "Export"
10276
- ]
10277
- }
10278
- ) }),
10279
- /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipContent, { children: "Download providers as JSON for backup or sharing" })
10280
- ] }) }),
10281
- /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipProvider, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Tooltip, { children: [
10282
- /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
10283
- Button,
10284
- {
10285
- variant: "outline",
10286
- size: "sm",
10287
- onClick: handleImportClick,
10288
- className: "gap-1 hover:bg-muted",
10289
- children: [
10290
- /* @__PURE__ */ jsxRuntimeExports.jsx(Upload, { className: "size-3" }),
10291
- "Import"
10292
- ]
10293
- }
10294
- ) }),
10295
- /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipContent, { children: "Import providers from an exported JSON file" })
10296
- ] }) }),
10215
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
10216
+ Button,
10217
+ {
10218
+ variant: "outline",
10219
+ size: "sm",
10220
+ onClick: () => handleExport(),
10221
+ className: "gap-1 hover:bg-muted",
10222
+ children: [
10223
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Download, { className: "size-3" }),
10224
+ "Export"
10225
+ ]
10226
+ }
10227
+ ),
10228
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
10229
+ Button,
10230
+ {
10231
+ variant: "outline",
10232
+ size: "sm",
10233
+ onClick: handleImportClick,
10234
+ className: "gap-1 hover:bg-muted",
10235
+ children: [
10236
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Upload, { className: "size-3" }),
10237
+ "Import"
10238
+ ]
10239
+ }
10240
+ ),
10297
10241
  /* @__PURE__ */ jsxRuntimeExports.jsx(
10298
10242
  "input",
10299
10243
  {
@@ -10304,50 +10248,44 @@ function ProvidersPanel({
10304
10248
  style: { display: "none" }
10305
10249
  }
10306
10250
  ),
10307
- /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipProvider, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Tooltip, { children: [
10308
- /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
10309
- Button,
10310
- {
10311
- variant: "outline",
10312
- size: "sm",
10313
- onClick: () => setShowImportWizard(true),
10314
- className: "gap-1",
10315
- children: [
10316
- /* @__PURE__ */ jsxRuntimeExports.jsx(Scan, { className: "size-3" }),
10317
- "Scan"
10318
- ]
10319
- }
10320
- ) }),
10321
- /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipContent, { children: "Detect and import provider configs from Claude Code and OpenCode" })
10322
- ] }) }),
10251
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
10252
+ Button,
10253
+ {
10254
+ variant: "outline",
10255
+ size: "sm",
10256
+ onClick: () => setShowImportWizard(true),
10257
+ className: "gap-1",
10258
+ children: [
10259
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Scan, { className: "size-3" }),
10260
+ "Scan"
10261
+ ]
10262
+ }
10263
+ ),
10323
10264
  /* @__PURE__ */ jsxRuntimeExports.jsxs(Button, { onClick: () => setShowForm(true), size: "sm", className: "gap-1", children: [
10324
10265
  /* @__PURE__ */ jsxRuntimeExports.jsx(Plus, { className: "size-4" }),
10325
10266
  "Add Provider"
10326
10267
  ] })
10327
10268
  ] })
10328
10269
  ] }),
10329
- configPath !== null && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "border border-border bg-card shadow-sm flex items-center gap-2 rounded-[8px] px-3 py-2 text-xs text-muted-foreground", children: [
10270
+ configPath !== null && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 rounded-[8px] bg-muted/15 px-3 py-2 text-xs text-muted-foreground", children: [
10330
10271
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "shrink-0", children: "Config:" }),
10331
10272
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono truncate", title: configPath, children: configPath }),
10332
- /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipProvider, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Tooltip, { children: [
10333
- /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
10334
- "button",
10335
- {
10336
- type: "button",
10337
- onClick: () => {
10338
- void copyTextToClipboard(configPath).then((success) => {
10339
- if (!success) return;
10340
- setConfigPathCopied(true);
10341
- setTimeout(() => setConfigPathCopied(false), 2e3);
10342
- });
10343
- },
10344
- className: "shrink-0 ml-auto text-muted-foreground hover:text-foreground transition-colors",
10345
- "aria-label": configPathCopied ? "Copied config file path" : "Copy config file path",
10346
- children: configPathCopied ? /* @__PURE__ */ jsxRuntimeExports.jsx(Check, { className: "size-3 text-cyan-300" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(Copy, { className: "size-3" })
10347
- }
10348
- ) }),
10349
- /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipContent, { children: "Copy config file path to clipboard" })
10350
- ] }) })
10273
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
10274
+ "button",
10275
+ {
10276
+ type: "button",
10277
+ onClick: () => {
10278
+ void copyTextToClipboard(configPath).then((success) => {
10279
+ if (!success) return;
10280
+ setConfigPathCopied(true);
10281
+ setTimeout(() => setConfigPathCopied(false), 2e3);
10282
+ });
10283
+ },
10284
+ className: "ml-auto shrink-0 text-muted-foreground transition-colors hover:text-foreground",
10285
+ "aria-label": configPathCopied ? "Copied config file path" : "Copy config file path",
10286
+ children: configPathCopied ? /* @__PURE__ */ jsxRuntimeExports.jsx(Check, { className: "size-3 text-cyan-300" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(Copy, { className: "size-3" })
10287
+ }
10288
+ )
10351
10289
  ] }),
10352
10290
  error !== null && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "border border-border bg-card shadow-sm flex items-center gap-2 rounded-[8px] px-3 py-2 text-sm text-destructive", children: [
10353
10291
  /* @__PURE__ */ jsxRuntimeExports.jsx(CircleAlert, { className: "size-4 shrink-0" }),
@@ -10360,18 +10298,16 @@ function ProvidersPanel({
10360
10298
  "Add Your First Provider"
10361
10299
  ] })
10362
10300
  ] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-3", children: [
10363
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "border border-border bg-muted/40 flex gap-1 rounded-[8px] p-1", children: ["all", "personal", "company"].map((tab) => /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipProvider, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Tooltip, { children: [
10364
- /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
10365
- "button",
10366
- {
10367
- type: "button",
10368
- onClick: () => setSourceFilter(tab),
10369
- className: `px-3 py-2 text-sm font-medium border-b-2 transition-colors ${sourceFilter === tab ? "border-primary text-primary" : "border-transparent text-muted-foreground hover:text-foreground"}`,
10370
- children: tab === "all" ? "All" : tab === "personal" ? "Personal" : "Company"
10371
- }
10372
- ) }),
10373
- /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipContent, { children: tab === "all" ? "Show all providers" : tab === "personal" ? "Providers you configured yourself" : "Providers set by your organization" })
10374
- ] }) }, tab)) }),
10301
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "inline-flex w-fit gap-1 rounded-[8px] bg-muted/20 p-1", children: ["all", "personal", "company"].map((tab) => /* @__PURE__ */ jsxRuntimeExports.jsx(
10302
+ "button",
10303
+ {
10304
+ type: "button",
10305
+ onClick: () => setSourceFilter(tab),
10306
+ className: `rounded-md px-3 py-1.5 text-sm font-medium transition-colors ${sourceFilter === tab ? "bg-background text-foreground shadow-sm" : "text-muted-foreground hover:text-foreground"}`,
10307
+ children: tab === "all" ? "All" : tab === "personal" ? "Personal" : "Company"
10308
+ },
10309
+ tab
10310
+ )) }),
10375
10311
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { ref: listScrollRef, className: "space-y-3", children: filteredProviders.map((provider) => /* @__PURE__ */ jsxRuntimeExports.jsx(
10376
10312
  ProviderCard,
10377
10313
  {
@@ -10471,17 +10407,17 @@ function SettingsDialog() {
10471
10407
  ]
10472
10408
  }
10473
10409
  ) }),
10474
- /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogContent, { className: "max-w-2xl max-h-[80vh] overflow-hidden flex flex-col", children: [
10410
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogContent, { className: "flex max-h-[80vh] max-w-2xl flex-col overflow-hidden", children: [
10475
10411
  /* @__PURE__ */ jsxRuntimeExports.jsx(DialogHeader, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(DialogTitle, { children: "Settings" }) }),
10476
10412
  /* @__PURE__ */ jsxRuntimeExports.jsxs(Tabs, { value: activeTab, onValueChange: setActiveTab, className: "flex-1 overflow-hidden", children: [
10477
- /* @__PURE__ */ jsxRuntimeExports.jsxs(TabsList, { children: [
10413
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(TabsList, { className: "w-full justify-start bg-muted/35", children: [
10478
10414
  /* @__PURE__ */ jsxRuntimeExports.jsx(TabsTrigger, { value: "providers", children: "Providers" }),
10479
10415
  /* @__PURE__ */ jsxRuntimeExports.jsx(TabsTrigger, { value: "proxy", children: "Proxy" }),
10480
10416
  /* @__PURE__ */ jsxRuntimeExports.jsx(TabsTrigger, { value: "storage", children: "Storage" }),
10481
10417
  /* @__PURE__ */ jsxRuntimeExports.jsx(TabsTrigger, { value: "mcp", children: "MCP" }),
10482
10418
  /* @__PURE__ */ jsxRuntimeExports.jsx(TabsTrigger, { value: "onboarding", children: "Onboarding" })
10483
10419
  ] }),
10484
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-4 flex-1 overflow-x-hidden overflow-y-auto pr-3", children: [
10420
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-4 flex-1 overflow-x-hidden overflow-y-auto pr-2", children: [
10485
10421
  /* @__PURE__ */ jsxRuntimeExports.jsx(TabsContent, { value: "providers", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
10486
10422
  ProvidersPanel,
10487
10423
  {
@@ -10561,7 +10497,7 @@ function StorageSettingsTab() {
10561
10497
  }, []);
10562
10498
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-4", children: [
10563
10499
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between gap-3", children: [
10564
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
10500
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "min-w-0", children: [
10565
10501
  /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-sm font-semibold", children: "Log storage" }),
10566
10502
  /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: "Inspect local log and streaming chunk footprint before exporting or clearing sessions." })
10567
10503
  ] }),
@@ -10598,14 +10534,14 @@ function StorageSettingsTab() {
10598
10534
  onCopy: handleCopy
10599
10535
  }
10600
10536
  ),
10601
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "border border-border bg-muted/40 rounded-md px-3 py-2", children: [
10537
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "rounded-md bg-muted/20 px-3 py-2", children: [
10602
10538
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "font-medium", children: "In-memory logs" }),
10603
10539
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-1 font-mono text-muted-foreground", children: [
10604
10540
  stats.memoryCount.toLocaleString(),
10605
10541
  " loaded"
10606
10542
  ] })
10607
10543
  ] }),
10608
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "border border-border bg-muted/40 rounded-md px-3 py-2", children: [
10544
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "rounded-md bg-muted/20 px-3 py-2", children: [
10609
10545
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "font-medium", children: "Log files" }),
10610
10546
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-1 font-mono text-muted-foreground", children: [
10611
10547
  stats.logFileCount.toLocaleString(),
@@ -10613,7 +10549,7 @@ function StorageSettingsTab() {
10613
10549
  formatBytes(stats.logBytes)
10614
10550
  ] })
10615
10551
  ] }),
10616
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "border border-border bg-muted/40 rounded-md px-3 py-2", children: [
10552
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "rounded-md bg-muted/20 px-3 py-2", children: [
10617
10553
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "font-medium", children: "Streaming chunks" }),
10618
10554
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-1 font-mono text-muted-foreground", children: [
10619
10555
  stats.chunkFileCount.toLocaleString(),
@@ -10621,7 +10557,7 @@ function StorageSettingsTab() {
10621
10557
  formatBytes(stats.chunkBytes)
10622
10558
  ] })
10623
10559
  ] }),
10624
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "border border-border bg-muted/40 rounded-md px-3 py-2", children: [
10560
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "rounded-md bg-muted/20 px-3 py-2", children: [
10625
10561
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "font-medium", children: "Session archives" }),
10626
10562
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-1 font-mono text-muted-foreground", children: [
10627
10563
  stats.sessionArchiveFileCount.toLocaleString(),
@@ -10642,7 +10578,7 @@ function CopyableSetupValue({
10642
10578
  onCopy
10643
10579
  }) {
10644
10580
  const copied = copiedId === id;
10645
- return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "border border-border bg-muted/40 min-w-0 rounded-md px-3 py-2", children: [
10581
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "min-w-0 rounded-md border border-border/45 bg-muted/15 px-3 py-2 transition-colors hover:bg-muted/25", children: [
10646
10582
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mb-1 text-xs font-medium text-muted-foreground", children: label }),
10647
10583
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex min-w-0 items-center gap-2", children: [
10648
10584
  /* @__PURE__ */ jsxRuntimeExports.jsx("code", { className: "min-w-0 flex-1 truncate font-mono text-xs text-foreground", children: value }),
@@ -10741,7 +10677,7 @@ function OnboardingSettingsTab() {
10741
10677
  },
10742
10678
  item.id
10743
10679
  )) }),
10744
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid gap-2 rounded-md border border-border bg-background px-3 py-2 text-xs text-muted-foreground", children: [
10680
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid gap-2 rounded-md bg-muted/15 px-3 py-2 text-xs text-muted-foreground", children: [
10745
10681
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [
10746
10682
  /* @__PURE__ */ jsxRuntimeExports.jsx(Check, { className: "size-3.5 text-emerald-500" }),
10747
10683
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Provider test creates a traceable memory probe session." })
@@ -10920,7 +10856,7 @@ args = ["stdio", "--url", "${endpoint}"]`
10920
10856
  /* @__PURE__ */ jsxRuntimeExports.jsx(Terminal, { className: "size-4 text-muted-foreground" }),
10921
10857
  /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-sm font-semibold", children: "MCP access" })
10922
10858
  ] }),
10923
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid gap-2 rounded-md border border-border bg-background px-3 py-2 text-xs text-muted-foreground", children: [
10859
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid gap-2 rounded-md bg-muted/15 px-3 py-2 text-xs text-muted-foreground", children: [
10924
10860
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { children: "Use Streamable HTTP when the client supports URL-based MCP. Use the stdio bridge only for stdio-only clients. Configure one entry for the same Inspector instance." }),
10925
10861
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { children: "If the MCP client runs in another container or host, replace localhost with a reachable host/IP and verify the network path." })
10926
10862
  ] }),
@@ -11011,14 +10947,9 @@ function ProxySettingsTab() {
11011
10947
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1", children: [
11012
10948
  /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-sm font-semibold", children: "Claude Code billing header" }),
11013
10949
  /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-xs text-muted-foreground", children: [
11014
- "When enabled, the proxy strips the synthetic ",
11015
- /* @__PURE__ */ jsxRuntimeExports.jsx("code", { children: "x-anthropic-billing-header" }),
11016
- " text block that Claude Code prepends to the system prompt before forwarding to upstream. Improves prefix-cache hit rates against third-party upstreams. The default at startup is controlled by the ",
11017
- /* @__PURE__ */ jsxRuntimeExports.jsx("code", { children: "AGENT_INSPECTOR_STRIP_CLAUDE_CODE_BILLING_HEADER" }),
11018
- " ",
11019
- "environment variable; your choice is persisted to ",
10950
+ "Strip Claude Code's synthetic billing block before upstream forwarding. This can improve prefix-cache hits with third-party providers and is persisted to ",
11020
10951
  /* @__PURE__ */ jsxRuntimeExports.jsx("code", { children: "config.json" }),
11021
- " and overrides the env var for subsequent requests."
10952
+ "."
11022
10953
  ] })
11023
10954
  ] }),
11024
10955
  /* @__PURE__ */ jsxRuntimeExports.jsxs("label", { className: "flex items-center gap-3", children: [
@@ -11040,9 +10971,9 @@ function ProxySettingsTab() {
11040
10971
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1", children: [
11041
10972
  /* @__PURE__ */ jsxRuntimeExports.jsx("label", { htmlFor: "slow-response-threshold", className: "text-sm font-semibold", children: "Slow response threshold" }),
11042
10973
  /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-xs text-muted-foreground", children: [
11043
- "Logs whose elapsed time exceeds this many seconds show a warning icon next to the duration. Set to ",
10974
+ "Show a slow marker when elapsed time exceeds this many seconds. Use ",
11044
10975
  /* @__PURE__ */ jsxRuntimeExports.jsx("code", { children: "0" }),
11045
- " to disable the indicator."
10976
+ " to disable it."
11046
10977
  ] }),
11047
10978
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [
11048
10979
  /* @__PURE__ */ jsxRuntimeExports.jsx(
@@ -11069,7 +11000,7 @@ function ProxySettingsTab() {
11069
11000
  ] }),
11070
11001
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1", children: [
11071
11002
  /* @__PURE__ */ jsxRuntimeExports.jsx("label", { htmlFor: "provider-test-timeout", className: "text-sm font-semibold", children: "Provider test timeout" }),
11072
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: "Provider Test waits this many seconds per configured model before aborting slow probes. The full test window scales with model count." }),
11003
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: "Abort slow Provider Test probes after this many seconds per model." }),
11073
11004
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [
11074
11005
  /* @__PURE__ */ jsxRuntimeExports.jsx(
11075
11006
  "input",
@@ -11095,7 +11026,7 @@ function ProxySettingsTab() {
11095
11026
  ] }),
11096
11027
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1", children: [
11097
11028
  /* @__PURE__ */ jsxRuntimeExports.jsx("label", { htmlFor: "time-display-format", className: "text-sm font-semibold", children: "Time display" }),
11098
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: "Controls timestamps in session summaries, conversation headers, and log rows." }),
11029
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: "Controls timestamps in session summaries, headers, and log rows." }),
11099
11030
  /* @__PURE__ */ jsxRuntimeExports.jsxs(
11100
11031
  "select",
11101
11032
  {
@@ -15577,12 +15508,20 @@ function ProxyViewerContainer({
15577
15508
  const handleDeleteCurrentView = reactExports.useCallback(
15578
15509
  async (ids) => {
15579
15510
  if (ids.length === 0) return;
15580
- const idSet = new Set(ids);
15511
+ const persistedIds = ids.filter((id) => Number.isInteger(id) && id >= 0);
15512
+ if (persistedIds.length === 0) {
15513
+ showToast({
15514
+ message: "No persisted log records were found for this view.",
15515
+ tone: "error"
15516
+ });
15517
+ return;
15518
+ }
15519
+ const idSet = new Set(persistedIds);
15581
15520
  const removed = allLogs.filter((log) => idSet.has(log.id));
15582
15521
  const result = await fetchJson("/api/logs", DeleteLogsResponseSchema, {
15583
15522
  method: "DELETE",
15584
15523
  headers: { "content-type": "application/json" },
15585
- body: JSON.stringify({ ids })
15524
+ body: JSON.stringify({ ids: persistedIds })
15586
15525
  });
15587
15526
  setAllLogs((prev) => {
15588
15527
  const remaining = prev.filter((log) => !idSet.has(log.id));