@tonyclaw/agent-inspector 3.0.4 → 3.0.5

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 (32) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/assets/{CompareDrawer-Bs2kzUSp.js → CompareDrawer-Co-35_Xw.js} +1 -1
  3. package/.output/public/assets/{ProxyViewerContainer-BUnlrfiS.js → ProxyViewerContainer-DPv1rBo7.js} +28 -28
  4. package/.output/public/assets/{ReplayDialog-B6xy7pl5.js → ReplayDialog-DghbvKdy.js} +1 -1
  5. package/.output/public/assets/{RequestAnatomy-BSvSmpCO.js → RequestAnatomy-CRXE5v8X.js} +1 -1
  6. package/.output/public/assets/{ResponseView-BFnUva7Z.js → ResponseView-CzxoQRjp.js} +2 -2
  7. package/.output/public/assets/{StreamingChunkSequence-u7ZaJOqn.js → StreamingChunkSequence-DnFyF_Hr.js} +1 -1
  8. package/.output/public/assets/{_sessionId-CH4nsMOA.js → _sessionId-DHRhWzKe.js} +1 -1
  9. package/.output/public/assets/index-D8cruW0P.css +1 -0
  10. package/.output/public/assets/index-DZyTpd2w.js +1 -0
  11. package/.output/public/assets/{index-B5HS6AxR.js → index-Dl1oki9E.js} +1 -1
  12. package/.output/public/assets/{json-viewer-5Tj5vkqe.js → json-viewer-B84f7oiG.js} +1 -1
  13. package/.output/public/assets/{main-ChxZWG8K.js → main-DViDnJ9X.js} +2 -2
  14. package/.output/server/_libs/lucide-react.mjs +2 -2
  15. package/.output/server/{_sessionId-B3r-VBdM.mjs → _sessionId-C43vEAWe.mjs} +2 -2
  16. package/.output/server/_ssr/{CompareDrawer-DAYrKHKe.mjs → CompareDrawer-DOL6q0jD.mjs} +2 -2
  17. package/.output/server/_ssr/{ProxyViewerContainer-CYmNmQK9.mjs → ProxyViewerContainer-S9izw3ND.mjs} +262 -146
  18. package/.output/server/_ssr/{ReplayDialog-CdKvdXxk.mjs → ReplayDialog-tqthwJh0.mjs} +3 -3
  19. package/.output/server/_ssr/{RequestAnatomy-BtmTUq7O.mjs → RequestAnatomy-CgWDjFPR.mjs} +2 -2
  20. package/.output/server/_ssr/{ResponseView-DuD_z5hd.mjs → ResponseView-Dk8Op622.mjs} +2 -2
  21. package/.output/server/_ssr/{StreamingChunkSequence-DpIV2wt_.mjs → StreamingChunkSequence-AlS7PK8f.mjs} +2 -2
  22. package/.output/server/_ssr/{index-B4_8vH8k.mjs → index-BGwvMN2M.mjs} +2 -2
  23. package/.output/server/_ssr/index.mjs +2 -2
  24. package/.output/server/_ssr/{json-viewer-gcNJEB7y.mjs → json-viewer-CKHkh5U3.mjs} +2 -2
  25. package/.output/server/_ssr/{router-CYjIsElo.mjs → router-BJMaHkr1.mjs} +9 -9
  26. package/.output/server/{_tanstack-start-manifest_v-BRdOxY6q.mjs → _tanstack-start-manifest_v-C_HvRzgP.mjs} +1 -1
  27. package/.output/server/index.mjs +65 -65
  28. package/package.json +1 -1
  29. package/src/components/providers/ProviderCard.tsx +342 -206
  30. package/src/lib/stopReason.ts +4 -0
  31. package/.output/public/assets/index-BqVL284D.js +0 -1
  32. package/.output/public/assets/index-DJW6qbnH.css +0 -1
@@ -1,5 +1,5 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports, a as React } from "../_libs/react.mjs";
2
- import { I as InspectorGroupsListResponseSchema, C as CapturedLogSchema, D as DEFAULT_CAPTURE_MODE, a as DEFAULT_SLOW_RESPONSE_THRESHOLD_SECONDS, b as DEFAULT_PROVIDER_TEST_TIMEOUT_SECONDS, c as DEFAULT_TIME_DISPLAY_FORMAT, d as RuntimeConfigSchema, p as packageJson, P as ProviderConfigSchema, i as apiFormatForPath, n as DeleteInspectorGroupsResponseSchema, o as GroupEvidenceExportResultSchema, q as DeleteInspectorGroupResponseSchema, z as createPendingProviderTestResults, B as ProviderTestResultsSchema, E as createFailedProviderTestResults, M as MAX_SLOW_RESPONSE_THRESHOLD_SECONDS, F as MAX_PROVIDER_TEST_TIMEOUT_SECONDS, T as TimeDisplayFormatSchema, l as AlertSummarySchema, m as AlertListResponseSchema, G as GroupEvidenceReadResponseSchema, u as maskApiKey, v as PATH_V1_MESSAGES, w as PATH_V1_CHAT_COMPLETIONS, x as PATH_V1_RESPONSES, r as providerHasContextMetadata, t as findProviderModelMetadata, f as parseOpenAIResponse, g as parseOpenAIResponsesResponse, O as OpenAIRequestSchema, h as OpenAIResponsesRequestSchema, A as AnthropicResponseSchema$1, e as AnthropicRequestSchema, s as safeGetOwnProperty, H as resolveProviderContextWindow, j as getSessionPath, y as previewUpstreamUrl, K as KnowledgeCandidateSchema, J as isPlainRecord, k as stripClaudeCodeBillingHeader, L as LogBodyChunkSchema } from "./router-CYjIsElo.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";
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 RotateCw, J as Clock, 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 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";
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";
@@ -530,6 +530,8 @@ function normalizeAnthropicStopReason(value) {
530
530
  case "end_turn":
531
531
  case "tool_use":
532
532
  return value;
533
+ case "max_tokens":
534
+ return "length";
533
535
  default:
534
536
  return null;
535
537
  }
@@ -539,6 +541,8 @@ function normalizeOpenAIFinishReason(value) {
539
541
  case "stop":
540
542
  case "length":
541
543
  return value;
544
+ case "max_tokens":
545
+ return "length";
542
546
  default:
543
547
  return null;
544
548
  }
@@ -2302,27 +2306,27 @@ function useCopyFeedback(text) {
2302
2306
  return { copied, copy };
2303
2307
  }
2304
2308
  const LazyCompareDrawer = reactExports.lazy(
2305
- () => import("./CompareDrawer-DAYrKHKe.mjs").then((m) => ({ default: m.CompareDrawer }))
2309
+ () => import("./CompareDrawer-DOL6q0jD.mjs").then((m) => ({ default: m.CompareDrawer }))
2306
2310
  );
2307
2311
  const LazyReplayDialog = reactExports.lazy(
2308
- () => import("./ReplayDialog-CdKvdXxk.mjs").then((m) => ({ default: m.ReplayDialog }))
2312
+ () => import("./ReplayDialog-tqthwJh0.mjs").then((m) => ({ default: m.ReplayDialog }))
2309
2313
  );
2310
2314
  const LazyRequestAnatomy = reactExports.lazy(
2311
- () => import("./RequestAnatomy-BtmTUq7O.mjs").then((m) => ({ default: m.RequestAnatomy }))
2315
+ () => import("./RequestAnatomy-CgWDjFPR.mjs").then((m) => ({ default: m.RequestAnatomy }))
2312
2316
  );
2313
2317
  const LazyResponseView = reactExports.lazy(
2314
- () => import("./ResponseView-DuD_z5hd.mjs").then((m) => ({ default: m.ResponseView }))
2318
+ () => import("./ResponseView-Dk8Op622.mjs").then((m) => ({ default: m.ResponseView }))
2315
2319
  );
2316
2320
  const LazyStreamingChunkSequence = reactExports.lazy(
2317
- () => import("./StreamingChunkSequence-DpIV2wt_.mjs").then((m) => ({
2321
+ () => import("./StreamingChunkSequence-AlS7PK8f.mjs").then((m) => ({
2318
2322
  default: m.StreamingChunkSequence
2319
2323
  }))
2320
2324
  );
2321
2325
  const LazyJsonViewer = reactExports.lazy(
2322
- () => import("./json-viewer-gcNJEB7y.mjs").then((m) => ({ default: m.JsonViewer }))
2326
+ () => import("./json-viewer-CKHkh5U3.mjs").then((m) => ({ default: m.JsonViewer }))
2323
2327
  );
2324
2328
  const LazyJsonViewerFromString = reactExports.lazy(
2325
- () => import("./json-viewer-gcNJEB7y.mjs").then((m) => ({ default: m.JsonViewerFromString }))
2329
+ () => import("./json-viewer-CKHkh5U3.mjs").then((m) => ({ default: m.JsonViewerFromString }))
2326
2330
  );
2327
2331
  const HIGHLIGHT_DURATION_MS = 1200;
2328
2332
  const MAX_HIGHLIGHT_ATTEMPTS = 12;
@@ -8361,6 +8365,119 @@ function ProviderTestCoverage({ provider }) {
8361
8365
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "non-stream + stream" })
8362
8366
  ] });
8363
8367
  }
8368
+ function configuredFormatResults(provider, testResults) {
8369
+ if (testResults === void 0) return [];
8370
+ const results = [];
8371
+ if (providerHasEndpoint(provider.anthropicBaseUrl)) {
8372
+ results.push(testResults.anthropic);
8373
+ }
8374
+ if (providerHasEndpoint(provider.openaiBaseUrl)) {
8375
+ results.push(testResults.openaiChat);
8376
+ }
8377
+ if (providerHasEndpoint(provider.openaiResponsesBaseUrl)) {
8378
+ results.push(testResults.openaiResponses);
8379
+ }
8380
+ return results;
8381
+ }
8382
+ function summarizeTestResults(provider, testResults) {
8383
+ const summary = { total: 0, passed: 0, failed: 0, testing: 0 };
8384
+ for (const results of configuredFormatResults(provider, testResults)) {
8385
+ for (const state of [results.nonStreaming, results.streaming]) {
8386
+ if (isNotConfiguredState(state)) continue;
8387
+ summary.total += 1;
8388
+ if (hasSuccessField(state)) {
8389
+ if (state.success) {
8390
+ summary.passed += 1;
8391
+ } else {
8392
+ summary.failed += 1;
8393
+ }
8394
+ } else {
8395
+ summary.testing += 1;
8396
+ }
8397
+ }
8398
+ }
8399
+ return summary;
8400
+ }
8401
+ function ProviderTestPill({
8402
+ provider,
8403
+ testResults,
8404
+ isTesting
8405
+ }) {
8406
+ const targets = providerTestTargets(provider);
8407
+ const summary = summarizeTestResults(provider, testResults);
8408
+ if (isTesting) {
8409
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "inline-flex items-center gap-1 rounded border border-cyan-300/25 bg-cyan-300/[0.08] px-2 py-1 text-xs text-cyan-100", children: [
8410
+ /* @__PURE__ */ jsxRuntimeExports.jsx(RotateCw, { className: "size-3 animate-spin" }),
8411
+ "Testing"
8412
+ ] });
8413
+ }
8414
+ if (targets.length === 0) {
8415
+ return /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "rounded border border-border/70 bg-muted/20 px-2 py-1 text-xs text-muted-foreground", children: "No endpoint" });
8416
+ }
8417
+ if (testResults === void 0 || summary.total === 0) {
8418
+ return /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "rounded border border-border/70 bg-muted/20 px-2 py-1 text-xs text-muted-foreground", children: "Not tested" });
8419
+ }
8420
+ if (summary.failed > 0) {
8421
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "inline-flex items-center gap-1 rounded border border-red-400/25 bg-red-500/[0.08] px-2 py-1 text-xs text-red-200", children: [
8422
+ /* @__PURE__ */ jsxRuntimeExports.jsx(CircleAlert, { className: "size-3" }),
8423
+ summary.passed,
8424
+ "/",
8425
+ summary.total,
8426
+ " passed"
8427
+ ] });
8428
+ }
8429
+ if (summary.testing > 0 || summary.passed < summary.total) {
8430
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "rounded border border-amber-300/25 bg-amber-400/[0.08] px-2 py-1 text-xs text-amber-100", children: [
8431
+ "Partial ",
8432
+ summary.passed,
8433
+ "/",
8434
+ summary.total
8435
+ ] });
8436
+ }
8437
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "inline-flex items-center gap-1 rounded border border-cyan-300/25 bg-cyan-300/[0.08] px-2 py-1 text-xs text-cyan-100", children: [
8438
+ /* @__PURE__ */ jsxRuntimeExports.jsx(CircleCheckBig, { className: "size-3" }),
8439
+ "OK ",
8440
+ summary.passed,
8441
+ "/",
8442
+ summary.total
8443
+ ] });
8444
+ }
8445
+ function compactModelLabel(provider) {
8446
+ const models = provider.models ?? [];
8447
+ if (models.length === 0) return "No models configured";
8448
+ const visible = models.slice(0, 2).join(", ");
8449
+ const hiddenCount = models.length - 2;
8450
+ return hiddenCount > 0 ? `${visible} +${hiddenCount} more` : visible;
8451
+ }
8452
+ function ModelChip({ provider, model }) {
8453
+ const metadata = findProviderModelMetadata(provider, model);
8454
+ const sourceLink = getModelSourceLink(metadata?.sourceUrl);
8455
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "inline-flex items-center gap-1 rounded bg-muted px-1.5 py-0.5 text-xs text-muted-foreground", children: [
8456
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: model }),
8457
+ metadata !== null && metadata.contextWindow !== void 0 && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono text-foreground/80", children: formatContextWindowTokens(metadata.contextWindow) }),
8458
+ sourceLink !== null && /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipProvider, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Tooltip, { children: [
8459
+ /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
8460
+ "a",
8461
+ {
8462
+ href: sourceLink.url,
8463
+ target: "_blank",
8464
+ rel: "noopener noreferrer",
8465
+ className: "inline-flex items-center gap-0.5 rounded border border-border/70 bg-background/70 px-1 font-mono text-[10px] leading-4 text-muted-foreground transition-colors hover:text-foreground",
8466
+ "aria-label": sourceLink.title,
8467
+ children: sourceLink.label
8468
+ }
8469
+ ) }),
8470
+ /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipContent, { children: sourceLink.title })
8471
+ ] }) })
8472
+ ] });
8473
+ }
8474
+ function modelResultsLabel(testResults) {
8475
+ const models = testResults?.models;
8476
+ if (models === void 0) return null;
8477
+ const count = Object.keys(models).length;
8478
+ if (count === 0) return null;
8479
+ return `${count} model${count === 1 ? "" : "s"} tested`;
8480
+ }
8364
8481
  function getErrorIcon(type) {
8365
8482
  const iconProps = { className: "size-3", strokeWidth: 2 };
8366
8483
  switch (type) {
@@ -8547,6 +8664,7 @@ function ProviderCard({
8547
8664
  }) {
8548
8665
  const [showApiKey, setShowApiKey] = reactExports.useState(false);
8549
8666
  const [copied, setCopied] = reactExports.useState(false);
8667
+ const [showDetails, setShowDetails] = reactExports.useState(false);
8550
8668
  const [showModelResults, setShowModelResults] = reactExports.useState(false);
8551
8669
  function handleCopy() {
8552
8670
  void copyTextToClipboard(provider.apiKey).then((success) => {
@@ -8561,6 +8679,8 @@ function ProviderCard({
8561
8679
  const hasContextMetadata = providerHasContextMetadata(provider);
8562
8680
  const canRefreshMetadata = provider.modelMetadataUrl !== void 0 && provider.modelMetadataUrl.trim() !== "";
8563
8681
  const metadataImportLabel = canRefreshMetadata ? "Refresh" : "Import defaults";
8682
+ const isTestingValue = isTesting ?? false;
8683
+ const testedModelsLabel = modelResultsLabel(testResults);
8564
8684
  const providerSourceBadge = provider.source === "company" ? /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipProvider, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Tooltip, { children: [
8565
8685
  /* @__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" }) }),
8566
8686
  /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipContent, { children: "Company-provided API key" })
@@ -8571,65 +8691,53 @@ function ProviderCard({
8571
8691
  return /* @__PURE__ */ jsxRuntimeExports.jsxs(
8572
8692
  "div",
8573
8693
  {
8574
- className: `border border-border bg-card shadow-sm flex flex-col gap-3 rounded-[8px] p-4 transition-all duration-500 ${isHighlighted === true ? "ring-2 ring-primary shadow-md" : ""}`,
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" : ""}`,
8575
8695
  children: [
8576
8696
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-start justify-between gap-2", children: [
8577
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 min-w-0", children: [
8578
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-medium truncate", children: provider.name }),
8579
- providerSourceBadge,
8580
- providerSourceBadge === null && provider.source === "company" && /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipProvider, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Tooltip, { children: [
8581
- /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs px-1.5 py-0.5 rounded bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400 shrink-0", children: "公司" }) }),
8582
- /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipContent, { children: "Company-provided API key" })
8583
- ] }) }),
8584
- providerSourceBadge === null && provider.source === "personal" && /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipProvider, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Tooltip, { children: [
8585
- /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs px-1.5 py-0.5 rounded bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400 shrink-0", children: "个人" }) }),
8586
- /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipContent, { children: "Your personal API key" })
8587
- ] }) })
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 }),
8700
+ providerSourceBadge
8701
+ ] }),
8702
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "truncate text-xs text-muted-foreground", children: compactModelLabel(provider) })
8588
8703
  ] }),
8589
- docsUrl !== void 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs(
8590
- "a",
8591
- {
8592
- href: docsUrl,
8593
- target: "_blank",
8594
- rel: "noopener noreferrer",
8595
- className: "text-muted-foreground hover:text-foreground transition-colors flex items-center gap-1 text-xs",
8596
- title: "View API documentation",
8597
- children: [
8598
- /* @__PURE__ */ jsxRuntimeExports.jsx(ExternalLink, { className: "size-3" }),
8599
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "sr-only", children: "Docs" })
8600
- ]
8601
- }
8602
- )
8704
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex shrink-0 items-center gap-2", children: [
8705
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
8706
+ ProviderTestPill,
8707
+ {
8708
+ provider,
8709
+ testResults,
8710
+ isTesting: isTestingValue
8711
+ }
8712
+ ),
8713
+ docsUrl !== void 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs(
8714
+ "a",
8715
+ {
8716
+ href: docsUrl,
8717
+ target: "_blank",
8718
+ rel: "noopener noreferrer",
8719
+ className: "flex items-center gap-1 text-xs text-muted-foreground transition-colors hover:text-foreground",
8720
+ title: "View API documentation",
8721
+ children: [
8722
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ExternalLink, { className: "size-3" }),
8723
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "sr-only", children: "Docs" })
8724
+ ]
8725
+ }
8726
+ )
8727
+ ] })
8728
+ ] }),
8729
+ /* @__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: [
8730
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ProviderTestCoverage, { provider }),
8731
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [
8732
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Key configured" }),
8733
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: provider.authHeader === "x-api-key" ? "x-api-key" : "Bearer" }),
8734
+ testedModelsLabel !== null && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: testedModelsLabel }),
8735
+ testResults?.testedAt !== void 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "inline-flex items-center gap-1", children: [
8736
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Clock, { className: "size-3" }),
8737
+ formatTimeAgo(testResults.testedAt)
8738
+ ] })
8739
+ ] })
8603
8740
  ] }),
8604
- provider.models !== void 0 && provider.models.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex flex-wrap gap-1", children: provider.models.map((m) => {
8605
- const metadata = findProviderModelMetadata(provider, m);
8606
- const sourceLink = getModelSourceLink(metadata?.sourceUrl);
8607
- return /* @__PURE__ */ jsxRuntimeExports.jsxs(
8608
- "span",
8609
- {
8610
- className: "inline-flex items-center gap-1 text-xs px-1.5 py-0.5 rounded bg-muted text-muted-foreground",
8611
- children: [
8612
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: m }),
8613
- metadata !== null && metadata.contextWindow !== void 0 && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono text-foreground/80", children: formatContextWindowTokens(metadata.contextWindow) }),
8614
- sourceLink !== null && /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipProvider, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Tooltip, { children: [
8615
- /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
8616
- "a",
8617
- {
8618
- href: sourceLink.url,
8619
- target: "_blank",
8620
- rel: "noopener noreferrer",
8621
- className: "inline-flex items-center gap-0.5 rounded border border-border/70 bg-background/70 px-1 font-mono text-[10px] leading-4 text-muted-foreground transition-colors hover:text-foreground",
8622
- "aria-label": sourceLink.title,
8623
- children: sourceLink.label
8624
- }
8625
- ) }),
8626
- /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipContent, { children: sourceLink.title })
8627
- ] }) })
8628
- ]
8629
- },
8630
- m
8631
- );
8632
- }) }),
8633
8741
  !hasContextMetadata && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between gap-2 rounded-md border border-amber-500/25 bg-amber-500/6 px-2 py-1.5 text-xs text-muted-foreground", children: [
8634
8742
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Context window metadata missing" }),
8635
8743
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex shrink-0 items-center gap-1", children: [
@@ -8661,98 +8769,106 @@ function ProviderCard({
8661
8769
  )
8662
8770
  ] })
8663
8771
  ] }),
8664
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [
8665
- /* @__PURE__ */ jsxRuntimeExports.jsx("code", { className: "text-xs text-muted-foreground bg-muted px-2 py-1 rounded flex-1 truncate", children: showApiKey ? provider.apiKey : maskApiKey(provider.apiKey) }),
8666
- /* @__PURE__ */ jsxRuntimeExports.jsx(
8667
- "button",
8772
+ showDetails && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-3 border-t border-border/60 pt-3", children: [
8773
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [
8774
+ /* @__PURE__ */ jsxRuntimeExports.jsx("code", { className: "flex-1 truncate rounded bg-muted px-2 py-1 text-xs text-muted-foreground", children: showApiKey ? provider.apiKey : maskApiKey(provider.apiKey) }),
8775
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
8776
+ "button",
8777
+ {
8778
+ type: "button",
8779
+ onClick: () => setShowApiKey((s) => !s),
8780
+ className: "p-1 text-muted-foreground transition-colors hover:text-foreground",
8781
+ "aria-label": showApiKey ? "Hide API key" : "Show API key",
8782
+ children: showApiKey ? /* @__PURE__ */ jsxRuntimeExports.jsx(EyeOff, { className: "size-4" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(Eye, { className: "size-4" })
8783
+ }
8784
+ ),
8785
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
8786
+ "button",
8787
+ {
8788
+ type: "button",
8789
+ onClick: handleCopy,
8790
+ className: "p-1 text-muted-foreground transition-colors hover:text-foreground",
8791
+ "aria-label": "Copy API key",
8792
+ children: copied ? /* @__PURE__ */ jsxRuntimeExports.jsx(Check, { className: "size-4 text-cyan-300" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(Copy, { className: "size-4" })
8793
+ }
8794
+ )
8795
+ ] }),
8796
+ 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)) }),
8797
+ providerHasEndpoint(provider.anthropicBaseUrl) && /* @__PURE__ */ jsxRuntimeExports.jsx(
8798
+ ProviderEndpointSummary,
8668
8799
  {
8669
- type: "button",
8670
- onClick: () => setShowApiKey((s) => !s),
8671
- className: "text-muted-foreground hover:text-foreground transition-colors p-1",
8672
- "aria-label": showApiKey ? "Hide API key" : "Show API key",
8673
- children: showApiKey ? /* @__PURE__ */ jsxRuntimeExports.jsx(EyeOff, { className: "size-4" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(Eye, { className: "size-4" })
8800
+ label: "Anthropic",
8801
+ baseUrl: provider.anthropicBaseUrl,
8802
+ endpoint: PATH_V1_MESSAGES,
8803
+ providerName: provider.name,
8804
+ children: testResults !== void 0 && /* @__PURE__ */ jsxRuntimeExports.jsx(ProviderFormatTestStatus, { results: testResults.anthropic })
8674
8805
  }
8675
8806
  ),
8676
- /* @__PURE__ */ jsxRuntimeExports.jsx(
8677
- "button",
8807
+ providerHasEndpoint(provider.openaiBaseUrl) && /* @__PURE__ */ jsxRuntimeExports.jsx(
8808
+ ProviderEndpointSummary,
8678
8809
  {
8679
- type: "button",
8680
- onClick: handleCopy,
8681
- className: "text-muted-foreground hover:text-foreground transition-colors p-1",
8682
- "aria-label": "Copy API key",
8683
- children: copied ? /* @__PURE__ */ jsxRuntimeExports.jsx(Check, { className: "size-4 text-cyan-300" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(Copy, { className: "size-4" })
8810
+ label: "Chat",
8811
+ baseUrl: provider.openaiBaseUrl,
8812
+ endpoint: PATH_V1_CHAT_COMPLETIONS,
8813
+ providerName: provider.name,
8814
+ children: testResults !== void 0 && /* @__PURE__ */ jsxRuntimeExports.jsx(ProviderFormatTestStatus, { results: testResults.openaiChat })
8684
8815
  }
8685
- )
8686
- ] }),
8687
- providerHasEndpoint(provider.anthropicBaseUrl) && /* @__PURE__ */ jsxRuntimeExports.jsx(
8688
- ProviderEndpointSummary,
8689
- {
8690
- label: "Test: Anthropic",
8691
- baseUrl: provider.anthropicBaseUrl,
8692
- endpoint: PATH_V1_MESSAGES,
8693
- providerName: provider.name,
8694
- children: testResults !== void 0 && /* @__PURE__ */ jsxRuntimeExports.jsx(ProviderFormatTestStatus, { results: testResults.anthropic })
8695
- }
8696
- ),
8697
- providerHasEndpoint(provider.openaiBaseUrl) && /* @__PURE__ */ jsxRuntimeExports.jsx(
8698
- ProviderEndpointSummary,
8699
- {
8700
- label: "Test: Chat",
8701
- baseUrl: provider.openaiBaseUrl,
8702
- endpoint: PATH_V1_CHAT_COMPLETIONS,
8703
- providerName: provider.name,
8704
- children: testResults !== void 0 && /* @__PURE__ */ jsxRuntimeExports.jsx(ProviderFormatTestStatus, { results: testResults.openaiChat })
8705
- }
8706
- ),
8707
- providerHasEndpoint(provider.openaiResponsesBaseUrl) && /* @__PURE__ */ jsxRuntimeExports.jsx(
8708
- ProviderEndpointSummary,
8709
- {
8710
- label: "Test: Responses",
8711
- baseUrl: provider.openaiResponsesBaseUrl,
8712
- endpoint: PATH_V1_RESPONSES,
8713
- providerName: provider.name,
8714
- children: testResults !== void 0 && /* @__PURE__ */ jsxRuntimeExports.jsx(ProviderFormatTestStatus, { results: testResults.openaiResponses })
8715
- }
8716
- ),
8717
- testResults?.testedAt !== void 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-xs text-muted-foreground flex items-center gap-1", children: [
8718
- /* @__PURE__ */ jsxRuntimeExports.jsx(Clock, { className: "size-3" }),
8719
- /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { children: [
8720
- "Tested ",
8721
- formatTimeAgo(testResults.testedAt)
8816
+ ),
8817
+ providerHasEndpoint(provider.openaiResponsesBaseUrl) && /* @__PURE__ */ jsxRuntimeExports.jsx(
8818
+ ProviderEndpointSummary,
8819
+ {
8820
+ label: "Responses",
8821
+ baseUrl: provider.openaiResponsesBaseUrl,
8822
+ endpoint: PATH_V1_RESPONSES,
8823
+ providerName: provider.name,
8824
+ children: testResults !== void 0 && /* @__PURE__ */ jsxRuntimeExports.jsx(ProviderFormatTestStatus, { results: testResults.openaiResponses })
8825
+ }
8826
+ ),
8827
+ testResults?.models !== void 0 && Object.keys(testResults.models).length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
8828
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
8829
+ "button",
8830
+ {
8831
+ type: "button",
8832
+ onClick: () => setShowModelResults((value) => !value),
8833
+ className: "flex items-center gap-1 text-xs text-muted-foreground transition-colors hover:text-foreground",
8834
+ children: [
8835
+ showModelResults ? /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronDown, { className: "size-3" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronRight, { className: "size-3" }),
8836
+ "Model Test Results (",
8837
+ Object.keys(testResults.models).length,
8838
+ ")"
8839
+ ]
8840
+ }
8841
+ ),
8842
+ showModelResults && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mt-2 overflow-x-auto", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("table", { className: "w-full border-collapse text-xs", children: [
8843
+ /* @__PURE__ */ jsxRuntimeExports.jsx("thead", { children: /* @__PURE__ */ jsxRuntimeExports.jsxs("tr", { className: "border-b border-border", children: [
8844
+ /* @__PURE__ */ jsxRuntimeExports.jsx("th", { className: "px-2 py-1 text-left font-medium text-muted-foreground", children: "Model" }),
8845
+ providerHasEndpoint(provider.anthropicBaseUrl) && /* @__PURE__ */ jsxRuntimeExports.jsx("th", { className: "px-2 py-1 text-left font-medium text-muted-foreground", children: "Anthropic" }),
8846
+ providerHasEndpoint(provider.openaiBaseUrl) && /* @__PURE__ */ jsxRuntimeExports.jsx("th", { className: "px-2 py-1 text-left font-medium text-muted-foreground", children: "Chat" }),
8847
+ providerHasEndpoint(provider.openaiResponsesBaseUrl) && /* @__PURE__ */ jsxRuntimeExports.jsx("th", { className: "px-2 py-1 text-left font-medium text-muted-foreground", children: "Responses" })
8848
+ ] }) }),
8849
+ /* @__PURE__ */ jsxRuntimeExports.jsx("tbody", { children: Object.entries(testResults.models).map(([modelName, modelResult]) => /* @__PURE__ */ jsxRuntimeExports.jsxs("tr", { className: "border-b border-border/50 last:border-0", children: [
8850
+ /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "px-2 py-1 font-medium", children: modelName }),
8851
+ providerHasEndpoint(provider.anthropicBaseUrl) && /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "px-2 py-1 align-top", children: /* @__PURE__ */ jsxRuntimeExports.jsx(ProviderFormatTestStatus, { results: modelResult.anthropic }) }),
8852
+ providerHasEndpoint(provider.openaiBaseUrl) && /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "px-2 py-1 align-top", children: /* @__PURE__ */ jsxRuntimeExports.jsx(ProviderFormatTestStatus, { results: modelResult.openaiChat }) }),
8853
+ providerHasEndpoint(provider.openaiResponsesBaseUrl) && /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "px-2 py-1 align-top", children: /* @__PURE__ */ jsxRuntimeExports.jsx(ProviderFormatTestStatus, { results: modelResult.openaiResponses }) })
8854
+ ] }, modelName)) })
8855
+ ] }) })
8722
8856
  ] })
8723
8857
  ] }),
8724
- testResults?.models !== void 0 && Object.keys(testResults.models).length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "border-t pt-2", children: [
8858
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-2 border-t pt-1 sm:flex-row sm:items-center sm:justify-between", children: [
8725
8859
  /* @__PURE__ */ jsxRuntimeExports.jsxs(
8726
8860
  "button",
8727
8861
  {
8728
8862
  type: "button",
8729
- onClick: () => setShowModelResults((value) => !value),
8730
- className: "text-xs text-muted-foreground hover:text-foreground transition-colors flex items-center gap-1",
8863
+ onClick: () => setShowDetails((value) => !value),
8864
+ className: "inline-flex items-center gap-1 text-xs text-muted-foreground transition-colors hover:text-foreground",
8865
+ "aria-expanded": showDetails,
8731
8866
  children: [
8732
- showModelResults ? /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronDown, { className: "size-3" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronRight, { className: "size-3" }),
8733
- "Model Test Results (",
8734
- Object.keys(testResults.models).length,
8735
- ")"
8867
+ showDetails ? /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronDown, { className: "size-3" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronRight, { className: "size-3" }),
8868
+ "Details"
8736
8869
  ]
8737
8870
  }
8738
8871
  ),
8739
- showModelResults && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mt-2 overflow-x-auto", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("table", { className: "w-full text-xs border-collapse", children: [
8740
- /* @__PURE__ */ jsxRuntimeExports.jsx("thead", { children: /* @__PURE__ */ jsxRuntimeExports.jsxs("tr", { className: "border-b border-border", children: [
8741
- /* @__PURE__ */ jsxRuntimeExports.jsx("th", { className: "text-left py-1 px-2 font-medium text-muted-foreground", children: "Model" }),
8742
- provider.anthropicBaseUrl !== void 0 && provider.anthropicBaseUrl !== "" && /* @__PURE__ */ jsxRuntimeExports.jsx("th", { className: "text-left py-1 px-2 font-medium text-muted-foreground", children: "Anthropic" }),
8743
- provider.openaiBaseUrl !== void 0 && provider.openaiBaseUrl !== "" && /* @__PURE__ */ jsxRuntimeExports.jsx("th", { className: "text-left py-1 px-2 font-medium text-muted-foreground", children: "Chat" }),
8744
- provider.openaiResponsesBaseUrl !== void 0 && provider.openaiResponsesBaseUrl !== "" && /* @__PURE__ */ jsxRuntimeExports.jsx("th", { className: "text-left py-1 px-2 font-medium text-muted-foreground", children: "Responses" })
8745
- ] }) }),
8746
- /* @__PURE__ */ jsxRuntimeExports.jsx("tbody", { children: Object.entries(testResults.models).map(([modelName, modelResult]) => /* @__PURE__ */ jsxRuntimeExports.jsxs("tr", { className: "border-b border-border/50 last:border-0", children: [
8747
- /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "py-1 px-2 font-medium", children: modelName }),
8748
- provider.anthropicBaseUrl !== void 0 && provider.anthropicBaseUrl !== "" && /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "py-1 px-2 align-top", children: /* @__PURE__ */ jsxRuntimeExports.jsx(ProviderFormatTestStatus, { results: modelResult.anthropic }) }),
8749
- provider.openaiBaseUrl !== void 0 && provider.openaiBaseUrl !== "" && /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "py-1 px-2 align-top", children: /* @__PURE__ */ jsxRuntimeExports.jsx(ProviderFormatTestStatus, { results: modelResult.openaiChat }) }),
8750
- provider.openaiResponsesBaseUrl !== void 0 && provider.openaiResponsesBaseUrl !== "" && /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "py-1 px-2 align-top", children: /* @__PURE__ */ jsxRuntimeExports.jsx(ProviderFormatTestStatus, { results: modelResult.openaiResponses }) })
8751
- ] }, modelName)) })
8752
- ] }) })
8753
- ] }),
8754
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-2 pt-1 border-t sm:flex-row sm:items-center sm:justify-between", children: [
8755
- /* @__PURE__ */ jsxRuntimeExports.jsx(ProviderTestCoverage, { provider }),
8756
8872
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex gap-2", children: [
8757
8873
  onTest !== void 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs(
8758
8874
  Button,
@@ -8761,10 +8877,10 @@ function ProviderCard({
8761
8877
  size: "sm",
8762
8878
  onClick: () => onTest(provider.id),
8763
8879
  className: "text-xs h-7 gap-1",
8764
- disabled: isTesting ?? false,
8880
+ disabled: isTestingValue,
8765
8881
  children: [
8766
- /* @__PURE__ */ jsxRuntimeExports.jsx(RotateCw, { className: `size-3 ${isTesting ?? false ? "animate-spin" : ""}` }),
8767
- isTesting ?? false ? testingTimeLeft !== void 0 ? `Testing (${testingTimeLeft}s)` : "Testing..." : "Test"
8882
+ /* @__PURE__ */ jsxRuntimeExports.jsx(RotateCw, { className: `size-3 ${isTestingValue ? "animate-spin" : ""}` }),
8883
+ isTestingValue ? testingTimeLeft !== void 0 ? `Testing (${testingTimeLeft}s)` : "Testing..." : "Test"
8768
8884
  ]
8769
8885
  }
8770
8886
  ),
@@ -8775,7 +8891,7 @@ function ProviderCard({
8775
8891
  size: "sm",
8776
8892
  onClick: () => onEdit(provider),
8777
8893
  className: "text-xs h-7 gap-1",
8778
- disabled: isTesting ?? false,
8894
+ disabled: isTestingValue,
8779
8895
  children: [
8780
8896
  /* @__PURE__ */ jsxRuntimeExports.jsx(Pencil, { className: "size-3" }),
8781
8897
  "Edit"
@@ -8789,7 +8905,7 @@ function ProviderCard({
8789
8905
  size: "sm",
8790
8906
  onClick: () => onDelete(provider.id),
8791
8907
  className: "text-xs h-7 gap-1 text-destructive hover:text-destructive",
8792
- disabled: isTesting ?? false,
8908
+ disabled: isTestingValue,
8793
8909
  children: [
8794
8910
  /* @__PURE__ */ jsxRuntimeExports.jsx(Trash2, { className: "size-3" }),
8795
8911
  "Delete"
@@ -1,7 +1,7 @@
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-CYmNmQK9.mjs";
3
- import { ResponseView } from "./ResponseView-DuD_z5hd.mjs";
4
- import { C as CapturedLogSchema } from "./router-CYjIsElo.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";
5
5
  import "../_libs/jszip.mjs";
6
6
  import "../_libs/modelcontextprotocol__server.mjs";
7
7
  import { af as RotateCcw, ar as Braces, as as Minimize2 } from "../_libs/lucide-react.mjs";
@@ -1,6 +1,6 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "../_libs/react.mjs";
2
- import { u as useProviders, s as analyzeContextIntelligence, f as formatTokens, m as TooltipProvider, c as cn, n as Tooltip, o as TooltipTrigger, p as TooltipContent, S as SegmentBar, R as ROLE_COLOR_CLASSES, A as ANATOMY_ROLE_LABELS, t as formatContextWindowTokens, C as CONTEXT_USAGE_THRESHOLDS } from "./ProxyViewerContainer-CYmNmQK9.mjs";
3
- import "./router-CYjIsElo.mjs";
2
+ import { u as useProviders, s as analyzeContextIntelligence, f as formatTokens, m as TooltipProvider, c as cn, n as Tooltip, o as TooltipTrigger, p as TooltipContent, S as SegmentBar, R as ROLE_COLOR_CLASSES, A as ANATOMY_ROLE_LABELS, t as formatContextWindowTokens, C as CONTEXT_USAGE_THRESHOLDS } from "./ProxyViewerContainer-S9izw3ND.mjs";
3
+ import "./router-BJMaHkr1.mjs";
4
4
  import "../_libs/modelcontextprotocol__server.mjs";
5
5
  import "../_libs/jszip.mjs";
6
6
  import { I as Info, a as ChevronDown, h as ChevronRight } from "../_libs/lucide-react.mjs";
@@ -1,6 +1,6 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "../_libs/react.mjs";
2
- import { g as getLogFormatAdapter, f as formatTokens, c as cn, v as getStatusCategory, B as Badge, w as Collapsible, x as CollapsibleTrigger, y as CollapsibleContent, z as ScrollArea, E as LazyJsonViewer, F as safeJsonValue } from "./ProxyViewerContainer-CYmNmQK9.mjs";
3
- import { s as safeGetOwnProperty } from "./router-CYjIsElo.mjs";
2
+ import { g as getLogFormatAdapter, f as formatTokens, c as cn, v as getStatusCategory, B as Badge, w as Collapsible, x as CollapsibleTrigger, y as CollapsibleContent, z as ScrollArea, E as LazyJsonViewer, F as safeJsonValue } from "./ProxyViewerContainer-S9izw3ND.mjs";
3
+ import { s as safeGetOwnProperty } from "./router-BJMaHkr1.mjs";
4
4
  import "../_libs/jszip.mjs";
5
5
  import "../_libs/modelcontextprotocol__server.mjs";
6
6
  import { Z as Zap, T as TriangleAlert, at as CircleStop, O as Brain, a as ChevronDown, h as ChevronRight, r as Terminal } from "../_libs/lucide-react.mjs";
@@ -1,6 +1,6 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "../_libs/react.mjs";
2
- import { m as TooltipProvider, n as Tooltip, o as TooltipTrigger, B as Badge, p as TooltipContent, E as LazyJsonViewer } from "./ProxyViewerContainer-CYmNmQK9.mjs";
3
- import "./router-CYjIsElo.mjs";
2
+ import { m as TooltipProvider, n as Tooltip, o as TooltipTrigger, B as Badge, p as TooltipContent, E as LazyJsonViewer } from "./ProxyViewerContainer-S9izw3ND.mjs";
3
+ import "./router-BJMaHkr1.mjs";
4
4
  import "../_libs/modelcontextprotocol__server.mjs";
5
5
  import "../_libs/jszip.mjs";
6
6
  import { a as ChevronDown, h as ChevronRight, L as LoaderCircle } from "../_libs/lucide-react.mjs";
@@ -1,6 +1,6 @@
1
- import { P as ProxyViewerContainer } from "./ProxyViewerContainer-CYmNmQK9.mjs";
1
+ import { P as ProxyViewerContainer } from "./ProxyViewerContainer-S9izw3ND.mjs";
2
2
  import "../_libs/react.mjs";
3
- import "./router-CYjIsElo.mjs";
3
+ import "./router-BJMaHkr1.mjs";
4
4
  import "../_libs/modelcontextprotocol__server.mjs";
5
5
  import "../_libs/jszip.mjs";
6
6
  import "../_libs/swr.mjs";
@@ -198,7 +198,7 @@ function getResponse() {
198
198
  return event.res;
199
199
  }
200
200
  async function getStartManifest(matchedRoutes) {
201
- const { tsrStartManifest } = await import("../_tanstack-start-manifest_v-BRdOxY6q.mjs");
201
+ const { tsrStartManifest } = await import("../_tanstack-start-manifest_v-C_HvRzgP.mjs");
202
202
  const startManifest = tsrStartManifest();
203
203
  const rootRoute = startManifest.routes[rootRouteId] = startManifest.routes[rootRouteId] || {};
204
204
  rootRoute.assets = rootRoute.assets || [];
@@ -776,7 +776,7 @@ let entriesPromise;
776
776
  let baseManifestPromise;
777
777
  let cachedFinalManifestPromise;
778
778
  async function loadEntries() {
779
- const routerEntry = await import("./router-CYjIsElo.mjs").then((n) => n.N);
779
+ const routerEntry = await import("./router-BJMaHkr1.mjs").then((n) => n.N);
780
780
  const startEntry = await import("./start-HYkvq4Ni.mjs");
781
781
  return { startEntry, routerEntry };
782
782
  }