@tonyclaw/agent-inspector 2.0.39 → 2.0.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/assets/CompareDrawer-DCg6S2cl.js +1 -0
  3. package/.output/public/assets/ProxyViewerContainer-DsU6QETm.js +115 -0
  4. package/.output/public/assets/{ReplayDialog-B58TbTtY.js → ReplayDialog-ClVgjSDE.js} +1 -1
  5. package/.output/public/assets/{RequestAnatomy-d4P6JNiP.js → RequestAnatomy-BhqvLQp9.js} +1 -1
  6. package/.output/public/assets/ResponseView-BZAJoK6B.js +1 -0
  7. package/.output/public/assets/StreamingChunkSequence-CaORmoKX.js +1 -0
  8. package/.output/public/assets/_sessionId-BHqywvM3.js +1 -0
  9. package/.output/public/assets/index-B_LPYuM0.js +1 -0
  10. package/.output/public/assets/{main-DK9PoBjx.js → main-CI3HFEcV.js} +2 -2
  11. package/.output/server/{_sessionId-DjarbXpT.mjs → _sessionId-DQ0ljHQ8.mjs} +2 -2
  12. package/.output/server/_ssr/{CompareDrawer-C5Z6AlUk.mjs → CompareDrawer-nkVa9epn.mjs} +4 -3
  13. package/.output/server/_ssr/{ProxyViewerContainer-4pXsBywn.mjs → ProxyViewerContainer-CXA7iH3H.mjs} +140 -45
  14. package/.output/server/_ssr/{ReplayDialog-w1vc1p5e.mjs → ReplayDialog-CK71-ucq.mjs} +3 -3
  15. package/.output/server/_ssr/{RequestAnatomy-2HaBhsNV.mjs → RequestAnatomy-DDCUJJ3X.mjs} +2 -2
  16. package/.output/server/_ssr/{ResponseView-SO_Y_W85.mjs → ResponseView-C6ZA7V3B.mjs} +2 -2
  17. package/.output/server/_ssr/{StreamingChunkSequence-CXEa2DkO.mjs → StreamingChunkSequence-DW5v_o6G.mjs} +2 -2
  18. package/.output/server/_ssr/{index-DuCGt4a2.mjs → index-Ckex98yq.mjs} +2 -2
  19. package/.output/server/_ssr/index.mjs +2 -2
  20. package/.output/server/_ssr/{router-D0BaSzkZ.mjs → router-ChJIVv7-.mjs} +434 -6
  21. package/.output/server/{_tanstack-start-manifest_v-6N4SODyd.mjs → _tanstack-start-manifest_v-CJ4__weU.mjs} +1 -1
  22. package/.output/server/index.mjs +62 -62
  23. package/package.json +1 -1
  24. package/src/components/ProxyViewer.tsx +5 -2
  25. package/src/components/providers/ProviderCard.tsx +6 -3
  26. package/src/components/providers/ProviderForm.tsx +6 -3
  27. package/src/components/providers/ProvidersPanel.tsx +6 -1
  28. package/src/components/providers/SettingsDialog.tsx +5 -2
  29. package/src/components/proxy-viewer/CompareDrawer.tsx +3 -1
  30. package/src/components/proxy-viewer/LogEntry.tsx +23 -6
  31. package/src/components/proxy-viewer/LogEntryHeader.tsx +20 -0
  32. package/src/components/proxy-viewer/useCopyFeedback.ts +3 -1
  33. package/src/components/ui/json-viewer.tsx +7 -2
  34. package/src/contracts/log.ts +1 -0
  35. package/src/lib/clipboard.ts +67 -0
  36. package/src/proxy/logFinalizer.ts +58 -0
  37. package/src/proxy/logSearch.ts +1 -0
  38. package/src/proxy/toolSchemaWarnings.ts +515 -0
  39. package/.output/public/assets/CompareDrawer-Jfe6M6DQ.js +0 -1
  40. package/.output/public/assets/ProxyViewerContainer-CQKV0Bqq.js +0 -115
  41. package/.output/public/assets/ResponseView-Bum1a3tG.js +0 -1
  42. package/.output/public/assets/StreamingChunkSequence-CjBDp5E9.js +0 -1
  43. package/.output/public/assets/_sessionId-BupV2gtf.js +0 -1
  44. package/.output/public/assets/index-DHSww5em.js +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, v as packageJson, i as GroupEvidenceExportResultSchema, j as DeleteInspectorGroupResponseSchema, d as RuntimeConfigSchema, P as ProviderConfigSchema, f as apiFormatForPath, n as createPendingProviderTestResults, o as ProviderTestResultsSchema, q as createFailedProviderTestResults, M as MAX_SLOW_RESPONSE_THRESHOLD_SECONDS, r as MAX_PROVIDER_TEST_TIMEOUT_SECONDS, T as TimeDisplayFormatSchema, m as maskApiKey, k as providerHasContextMetadata, l as findProviderModelMetadata, g as getSessionPath, p as parseOpenAIResponse, O as OpenAIRequestSchema, A as AnthropicResponseSchema$1, e as AnthropicRequestSchema, s as safeGetOwnProperty, t as resolveProviderContextWindow, K as KnowledgeCandidateSchema, h as stripClaudeCodeBillingHeader, u as isPlainRecord, G as GroupEvidenceReadResponseSchema, I as InspectorGroupsListResponseSchema } from "./router-D0BaSzkZ.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, v as packageJson, i as GroupEvidenceExportResultSchema, j as DeleteInspectorGroupResponseSchema, d as RuntimeConfigSchema, P as ProviderConfigSchema, f as apiFormatForPath, n as createPendingProviderTestResults, o as ProviderTestResultsSchema, q as createFailedProviderTestResults, M as MAX_SLOW_RESPONSE_THRESHOLD_SECONDS, r as MAX_PROVIDER_TEST_TIMEOUT_SECONDS, T as TimeDisplayFormatSchema, m as maskApiKey, k as providerHasContextMetadata, l as findProviderModelMetadata, g as getSessionPath, p as parseOpenAIResponse, O as OpenAIRequestSchema, A as AnthropicResponseSchema$1, e as AnthropicRequestSchema, s as safeGetOwnProperty, t as resolveProviderContextWindow, K as KnowledgeCandidateSchema, h as stripClaudeCodeBillingHeader, u as isPlainRecord, G as GroupEvidenceReadResponseSchema, I as InspectorGroupsListResponseSchema } from "./router-ChJIVv7-.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";
@@ -414,6 +414,61 @@ async function exportLogsAsZip(logs, mode = "redacted") {
414
414
  URL.revokeObjectURL(url);
415
415
  return { ok: true };
416
416
  }
417
+ function restoreSelection(selection, ranges) {
418
+ if (selection === null) return;
419
+ selection.removeAllRanges();
420
+ for (const range of ranges) {
421
+ selection.addRange(range);
422
+ }
423
+ }
424
+ function readSelectionRanges(selection) {
425
+ if (selection === null) return [];
426
+ const ranges = [];
427
+ for (let index = 0; index < selection.rangeCount; index++) {
428
+ ranges.push(selection.getRangeAt(index));
429
+ }
430
+ return ranges;
431
+ }
432
+ function copyWithTextareaFallback(text) {
433
+ if (typeof document === "undefined") return false;
434
+ const activeElement = document.activeElement;
435
+ const selection = document.getSelection();
436
+ const ranges = readSelectionRanges(selection);
437
+ const textarea = document.createElement("textarea");
438
+ textarea.value = text;
439
+ textarea.setAttribute("readonly", "");
440
+ textarea.style.position = "fixed";
441
+ textarea.style.top = "0";
442
+ textarea.style.left = "-9999px";
443
+ textarea.style.opacity = "0";
444
+ document.body.appendChild(textarea);
445
+ textarea.focus();
446
+ textarea.select();
447
+ textarea.setSelectionRange(0, text.length);
448
+ let copied = false;
449
+ try {
450
+ copied = document.execCommand("copy");
451
+ } catch {
452
+ } finally {
453
+ document.body.removeChild(textarea);
454
+ restoreSelection(selection, ranges);
455
+ if (typeof HTMLElement !== "undefined" && activeElement instanceof HTMLElement) {
456
+ activeElement.focus({ preventScroll: true });
457
+ }
458
+ }
459
+ return copied;
460
+ }
461
+ async function copyTextToClipboard(text) {
462
+ const clipboard = globalThis.navigator?.clipboard;
463
+ if (clipboard !== void 0) {
464
+ try {
465
+ await clipboard.writeText(text);
466
+ return true;
467
+ } catch {
468
+ }
469
+ }
470
+ return copyWithTextareaFallback(text);
471
+ }
417
472
  function formatTimestamp$1(iso, format) {
418
473
  switch (format) {
419
474
  case "full":
@@ -1870,7 +1925,8 @@ function useCopyFeedback(text) {
1870
1925
  (event) => {
1871
1926
  event.stopPropagation();
1872
1927
  if (text === null) return;
1873
- void window.navigator.clipboard.writeText(text).then(() => {
1928
+ void copyTextToClipboard(text).then((success) => {
1929
+ if (!success) return;
1874
1930
  setCopied(true);
1875
1931
  if (timerRef.current !== null) clearTimeout(timerRef.current);
1876
1932
  timerRef.current = setTimeout(() => setCopied(false), 2e3);
@@ -1881,19 +1937,19 @@ function useCopyFeedback(text) {
1881
1937
  return { copied, copy };
1882
1938
  }
1883
1939
  const LazyCompareDrawer = reactExports.lazy(
1884
- () => import("./CompareDrawer-C5Z6AlUk.mjs").then((m) => ({ default: m.CompareDrawer }))
1940
+ () => import("./CompareDrawer-nkVa9epn.mjs").then((m) => ({ default: m.CompareDrawer }))
1885
1941
  );
1886
1942
  const LazyReplayDialog = reactExports.lazy(
1887
- () => import("./ReplayDialog-w1vc1p5e.mjs").then((m) => ({ default: m.ReplayDialog }))
1943
+ () => import("./ReplayDialog-CK71-ucq.mjs").then((m) => ({ default: m.ReplayDialog }))
1888
1944
  );
1889
1945
  const LazyRequestAnatomy = reactExports.lazy(
1890
- () => import("./RequestAnatomy-2HaBhsNV.mjs").then((m) => ({ default: m.RequestAnatomy }))
1946
+ () => import("./RequestAnatomy-DDCUJJ3X.mjs").then((m) => ({ default: m.RequestAnatomy }))
1891
1947
  );
1892
1948
  const LazyResponseView = reactExports.lazy(
1893
- () => import("./ResponseView-SO_Y_W85.mjs").then((m) => ({ default: m.ResponseView }))
1949
+ () => import("./ResponseView-C6ZA7V3B.mjs").then((m) => ({ default: m.ResponseView }))
1894
1950
  );
1895
1951
  const LazyStreamingChunkSequence = reactExports.lazy(
1896
- () => import("./StreamingChunkSequence-CXEa2DkO.mjs").then((m) => ({
1952
+ () => import("./StreamingChunkSequence-DW5v_o6G.mjs").then((m) => ({
1897
1953
  default: m.StreamingChunkSequence
1898
1954
  }))
1899
1955
  );
@@ -2336,6 +2392,7 @@ const LogEntryHeader = reactExports.memo(function({
2336
2392
  const tokensPerSecond = log.tokensPerSecond ?? null;
2337
2393
  const firstChunkLabel = firstChunkMs === null ? null : formatElapsed$3(firstChunkMs);
2338
2394
  const tokenRateLabel = tokensPerSecond === null || tokensPerSecond <= 0 ? null : formatTokenRate$1(tokensPerSecond);
2395
+ const warningCount = log.warnings?.length ?? 0;
2339
2396
  return /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipProvider, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
2340
2397
  "div",
2341
2398
  {
@@ -2384,6 +2441,20 @@ const LogEntryHeader = reactExports.memo(function({
2384
2441
  ]
2385
2442
  }
2386
2443
  ),
2444
+ warningCount > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs(Tooltip, { children: [
2445
+ /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
2446
+ Badge,
2447
+ {
2448
+ variant: "outline",
2449
+ className: "text-[10px] px-1.5 py-0 h-5 font-mono tabular-nums gap-1 bg-amber-500/15 text-amber-400 border-amber-500/25",
2450
+ children: [
2451
+ /* @__PURE__ */ jsxRuntimeExports.jsx(TriangleAlert, { className: "size-3", "aria-label": "Tool schema warnings" }),
2452
+ warningCount
2453
+ ]
2454
+ }
2455
+ ) }),
2456
+ /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipContent, { children: warningCount === 1 ? "1 tool schema warning" : `${warningCount} tool schema warnings` })
2457
+ ] }),
2387
2458
  log.elapsedMs !== null && /* @__PURE__ */ jsxRuntimeExports.jsxs(Tooltip, { children: [
2388
2459
  /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
2389
2460
  "span",
@@ -2721,7 +2792,8 @@ function CopyValueButton({ value }) {
2721
2792
  const [copied, setCopied] = reactExports.useState(false);
2722
2793
  function handleCopy(e) {
2723
2794
  e.stopPropagation();
2724
- void window.navigator.clipboard.writeText(JSON.stringify(value, null, 2)).then(() => {
2795
+ void copyTextToClipboard(JSON.stringify(value, null, 2)).then((success) => {
2796
+ if (!success) return;
2725
2797
  setCopied(true);
2726
2798
  setTimeout(() => {
2727
2799
  setCopied(false);
@@ -2734,6 +2806,7 @@ function CopyValueButton({ value }) {
2734
2806
  type: "button",
2735
2807
  onClick: handleCopy,
2736
2808
  className: "inline-flex items-center gap-1 text-[10px] text-muted-foreground hover:text-foreground transition-colors",
2809
+ "aria-label": copied ? "Copied JSON" : "Copy JSON",
2737
2810
  title: "Copy JSON",
2738
2811
  children: copied ? /* @__PURE__ */ jsxRuntimeExports.jsx(Check, { className: "size-3 text-green-500" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(Copy, { className: "size-3" })
2739
2812
  }
@@ -2743,7 +2816,8 @@ function CopyButton({ value }) {
2743
2816
  const [copied, setCopied] = reactExports.useState(false);
2744
2817
  function handleCopy(e) {
2745
2818
  e.stopPropagation();
2746
- void window.navigator.clipboard.writeText(JSON.stringify(value, null, 2)).then(() => {
2819
+ void copyTextToClipboard(JSON.stringify(value, null, 2)).then((success) => {
2820
+ if (!success) return;
2747
2821
  setCopied(true);
2748
2822
  setTimeout(() => {
2749
2823
  setCopied(false);
@@ -2756,6 +2830,7 @@ function CopyButton({ value }) {
2756
2830
  type: "button",
2757
2831
  onClick: handleCopy,
2758
2832
  className: "opacity-0 group-hover/row:opacity-100 hover:bg-muted p-0.5 rounded transition-opacity shrink-0",
2833
+ "aria-label": copied ? "Copied JSON value" : "Copy JSON value",
2759
2834
  title: "Copy to clipboard",
2760
2835
  children: copied ? /* @__PURE__ */ jsxRuntimeExports.jsx(Check, { className: "size-3 text-green-500" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(Copy, { className: "size-3 text-muted-foreground" })
2761
2836
  }
@@ -3612,6 +3687,7 @@ const LogEntry = reactExports.memo(function({
3612
3687
  () => parseRequestTools(requestExpansion.parsedData),
3613
3688
  [requestExpansion.parsedData]
3614
3689
  );
3690
+ const warnings = log.warnings ?? [];
3615
3691
  const anatomyPaths = reactExports.useMemo(() => {
3616
3692
  if (anatomySegments === null) return void 0;
3617
3693
  return new Set(anatomySegments.map((s) => s.path));
@@ -3623,9 +3699,12 @@ const LogEntry = reactExports.memo(function({
3623
3699
  if (activeTab !== "request") setActiveTab("request");
3624
3700
  }
3625
3701
  });
3626
- reactExports.useEffect(() => {
3627
- if (!expanded) return;
3628
- setActiveTab(anatomySegments !== null ? "anatomy" : "request");
3702
+ const handleToggleExpanded = reactExports.useCallback(() => {
3703
+ const nextExpanded = !expanded;
3704
+ if (nextExpanded) {
3705
+ setActiveTab(anatomySegments !== null ? "anatomy" : "request");
3706
+ }
3707
+ setExpanded(nextExpanded);
3629
3708
  }, [anatomySegments, expanded]);
3630
3709
  reactExports.useEffect(() => {
3631
3710
  const handleLogFocusRequest = (event) => {
@@ -3649,7 +3728,7 @@ const LogEntry = reactExports.memo(function({
3649
3728
  messageCount: requestAnalysis.messageCount,
3650
3729
  toolCount: requestAnalysis.toolCount,
3651
3730
  expanded,
3652
- onToggle: () => setExpanded(!expanded),
3731
+ onToggle: handleToggleExpanded,
3653
3732
  cacheTrend,
3654
3733
  slowResponseThresholdSeconds,
3655
3734
  timeDisplayFormat,
@@ -3679,6 +3758,13 @@ const LogEntry = reactExports.memo(function({
3679
3758
  }
3680
3759
  ) }) : /* @__PURE__ */ jsxRuntimeExports.jsx("pre", { className: "font-mono text-xs whitespace-pre-wrap break-words", children: log.rawRequestBody }) }) }),
3681
3760
  /* @__PURE__ */ jsxRuntimeExports.jsx(TabsContent, { value: "request", children: activeTab === "request" && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "px-4 pt-1 pb-3", children: [
3761
+ warnings.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mb-3 rounded border border-amber-500/30 bg-amber-500/10 p-3 text-xs", children: [
3762
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 font-semibold text-amber-300", children: [
3763
+ /* @__PURE__ */ jsxRuntimeExports.jsx(TriangleAlert, { className: "size-3.5" }),
3764
+ "Tool schema warnings"
3765
+ ] }),
3766
+ /* @__PURE__ */ jsxRuntimeExports.jsx("ul", { className: "mt-2 space-y-1 text-muted-foreground", children: warnings.map((warning) => /* @__PURE__ */ jsxRuntimeExports.jsx("li", { children: warning }, warning)) })
3767
+ ] }),
3682
3768
  /* @__PURE__ */ jsxRuntimeExports.jsx(
3683
3769
  RequestTools,
3684
3770
  {
@@ -6709,10 +6795,11 @@ function ProviderCard({
6709
6795
  const [copied, setCopied] = reactExports.useState(false);
6710
6796
  const [showModelResults, setShowModelResults] = reactExports.useState(false);
6711
6797
  function handleCopy() {
6712
- navigator.clipboard.writeText(provider.apiKey).catch(() => {
6798
+ void copyTextToClipboard(provider.apiKey).then((success) => {
6799
+ if (!success) return;
6800
+ setCopied(true);
6801
+ setTimeout(() => setCopied(false), 2e3);
6713
6802
  });
6714
- setCopied(true);
6715
- setTimeout(() => setCopied(false), 2e3);
6716
6803
  }
6717
6804
  const docsUrl = provider.apiDocsUrl ?? Object.entries(KNOWN_PROVIDER_DOCS).find(
6718
6805
  ([keyword]) => provider.name.toLowerCase().includes(keyword)
@@ -7169,10 +7256,11 @@ function ProviderForm({ provider, onSubmit, onCancel }) {
7169
7256
  const suggestedModels = isMiniMax ? MINIMAX_MODELS : isZhipu ? ZHIPU_MODELS : isAlibaba ? ALIBABA_MODELS : [];
7170
7257
  const hasContextMetadata = provider?.modelMetadata?.some((metadata) => metadata.contextWindow !== void 0) ?? false;
7171
7258
  function handleCopy() {
7172
- navigator.clipboard.writeText(apiKey).catch(() => {
7259
+ void copyTextToClipboard(apiKey).then((success) => {
7260
+ if (!success) return;
7261
+ setCopied(true);
7262
+ setTimeout(() => setCopied(false), 2e3);
7173
7263
  });
7174
- setCopied(true);
7175
- setTimeout(() => setCopied(false), 2e3);
7176
7264
  }
7177
7265
  reactExports.useEffect(() => {
7178
7266
  if (provider) {
@@ -8229,12 +8317,14 @@ function ProvidersPanel({
8229
8317
  {
8230
8318
  type: "button",
8231
8319
  onClick: () => {
8232
- void window.navigator.clipboard.writeText(configPath).then(() => {
8320
+ void copyTextToClipboard(configPath).then((success) => {
8321
+ if (!success) return;
8233
8322
  setConfigPathCopied(true);
8234
8323
  setTimeout(() => setConfigPathCopied(false), 2e3);
8235
8324
  });
8236
8325
  },
8237
8326
  className: "shrink-0 ml-auto text-muted-foreground hover:text-foreground transition-colors",
8327
+ "aria-label": configPathCopied ? "Copied config file path" : "Copy config file path",
8238
8328
  children: configPathCopied ? /* @__PURE__ */ jsxRuntimeExports.jsx(Check, { className: "size-3 text-green-500" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(Copy, { className: "size-3" })
8239
8329
  }
8240
8330
  ) }),
@@ -8433,7 +8523,8 @@ function StorageSettingsTab() {
8433
8523
  void refresh();
8434
8524
  }, [refresh]);
8435
8525
  const handleCopy = reactExports.useCallback((id, value) => {
8436
- void window.navigator.clipboard.writeText(value).then(() => {
8526
+ void copyTextToClipboard(value).then((success) => {
8527
+ if (!success) return;
8437
8528
  setCopiedId(id);
8438
8529
  setTimeout(() => setCopiedId(null), 1600);
8439
8530
  });
@@ -8567,7 +8658,8 @@ function OnboardingSettingsTab() {
8567
8658
  [origin]
8568
8659
  );
8569
8660
  const handleCopy = reactExports.useCallback((id, value) => {
8570
- void window.navigator.clipboard.writeText(value).then(() => {
8661
+ void copyTextToClipboard(value).then((success) => {
8662
+ if (!success) return;
8571
8663
  setCopiedId(id);
8572
8664
  setTimeout(() => setCopiedId(null), 1600);
8573
8665
  });
@@ -10151,7 +10243,8 @@ function openLogContext(logId) {
10151
10243
  function CopyableCommand({ command }) {
10152
10244
  const [copied, setCopied] = reactExports.useState(false);
10153
10245
  const handleCopy = reactExports.useCallback(() => {
10154
- void window.navigator.clipboard.writeText(command).then(() => {
10246
+ void copyTextToClipboard(command).then((success) => {
10247
+ if (!success) return;
10155
10248
  setCopied(true);
10156
10249
  setTimeout(() => setCopied(false), 2e3);
10157
10250
  });
@@ -10409,7 +10502,8 @@ function SessionContextBar({
10409
10502
  );
10410
10503
  const userAgent = reactExports.useMemo(() => getFirstUserAgent(logs), [logs]);
10411
10504
  const handleCopyLink = reactExports.useCallback(() => {
10412
- void window.navigator.clipboard.writeText(window.location.href).then(() => {
10505
+ void copyTextToClipboard(window.location.href).then((success) => {
10506
+ if (!success) return;
10413
10507
  setCopied(true);
10414
10508
  setTimeout(() => setCopied(false), 2e3);
10415
10509
  });
@@ -11070,36 +11164,37 @@ export {
11070
11164
  Badge as B,
11071
11165
  CONTEXT_USAGE_THRESHOLDS as C,
11072
11166
  Dialog as D,
11073
- safeJsonValue as E,
11167
+ JsonViewer as E,
11168
+ safeJsonValue as F,
11074
11169
  JsonViewerFromString as J,
11075
11170
  ProxyViewerContainer as P,
11076
11171
  ROLE_COLOR_CLASSES as R,
11077
11172
  SegmentBar as S,
11078
11173
  Tabs as T,
11079
11174
  getConversationId as a,
11080
- DialogContent as b,
11175
+ copyTextToClipboard as b,
11081
11176
  cn as c,
11082
- DialogHeader as d,
11083
- DialogTitle as e,
11177
+ DialogContent as d,
11178
+ DialogHeader as e,
11084
11179
  formatTokens as f,
11085
11180
  getLogFormatAdapter as g,
11086
- TabsList as h,
11087
- TabsTrigger as i,
11088
- TabsContent as j,
11089
- Button as k,
11090
- TooltipProvider as l,
11091
- Tooltip as m,
11092
- TooltipTrigger as n,
11093
- TooltipContent as o,
11094
- dispatchLogFocusRequest as p,
11095
- analyzeContextIntelligence as q,
11181
+ DialogTitle as h,
11182
+ TabsList as i,
11183
+ TabsTrigger as j,
11184
+ TabsContent as k,
11185
+ Button as l,
11186
+ TooltipProvider as m,
11187
+ Tooltip as n,
11188
+ TooltipTrigger as o,
11189
+ TooltipContent as p,
11190
+ dispatchLogFocusRequest as q,
11096
11191
  resolveLogFormat as r,
11097
- formatContextWindowTokens as s,
11098
- getStatusCategory as t,
11192
+ analyzeContextIntelligence as s,
11193
+ formatContextWindowTokens as t,
11099
11194
  useProviders as u,
11100
- Collapsible as v,
11101
- CollapsibleTrigger as w,
11102
- CollapsibleContent as x,
11103
- ScrollArea as y,
11104
- JsonViewer as z
11195
+ getStatusCategory as v,
11196
+ Collapsible as w,
11197
+ CollapsibleTrigger as x,
11198
+ CollapsibleContent as y,
11199
+ ScrollArea as z
11105
11200
  };
@@ -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, b as DialogContent, d as DialogHeader, e as DialogTitle, T as Tabs, h as TabsList, i as TabsTrigger, j as TabsContent, k as Button, l as TooltipProvider, m as Tooltip, n as TooltipTrigger, o as TooltipContent, p as dispatchLogFocusRequest } from "./ProxyViewerContainer-4pXsBywn.mjs";
3
- import { ResponseView } from "./ResponseView-SO_Y_W85.mjs";
4
- import { C as CapturedLogSchema } from "./router-D0BaSzkZ.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-CXA7iH3H.mjs";
3
+ import { ResponseView } from "./ResponseView-C6ZA7V3B.mjs";
4
+ import { C as CapturedLogSchema } from "./router-ChJIVv7-.mjs";
5
5
  import "../_libs/jszip.mjs";
6
6
  import "../_libs/modelcontextprotocol__server.mjs";
7
7
  import { V as RotateCcw, ae as Braces, af 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, q as analyzeContextIntelligence, f as formatTokens, l as TooltipProvider, c as cn, m as Tooltip, n as TooltipTrigger, o as TooltipContent, S as SegmentBar, R as ROLE_COLOR_CLASSES, A as ANATOMY_ROLE_LABELS, s as formatContextWindowTokens, C as CONTEXT_USAGE_THRESHOLDS } from "./ProxyViewerContainer-4pXsBywn.mjs";
3
- import "./router-D0BaSzkZ.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-CXA7iH3H.mjs";
3
+ import "./router-ChJIVv7-.mjs";
4
4
  import "../_libs/modelcontextprotocol__server.mjs";
5
5
  import "../_libs/jszip.mjs";
6
6
  import { ag as Info, c as ChevronDown, l 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, t as getStatusCategory, B as Badge, v as Collapsible, w as CollapsibleTrigger, x as CollapsibleContent, y as ScrollArea, z as JsonViewer, E as safeJsonValue } from "./ProxyViewerContainer-4pXsBywn.mjs";
3
- import "./router-D0BaSzkZ.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 JsonViewer, F as safeJsonValue } from "./ProxyViewerContainer-CXA7iH3H.mjs";
3
+ import "./router-ChJIVv7-.mjs";
4
4
  import "../_libs/modelcontextprotocol__server.mjs";
5
5
  import "../_libs/jszip.mjs";
6
6
  import { Z as Zap, q as TriangleAlert, ah as CircleStop, B as Brain, c as ChevronDown, l as ChevronRight, f 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 { l as TooltipProvider, m as Tooltip, n as TooltipTrigger, B as Badge, o as TooltipContent, z as JsonViewer } from "./ProxyViewerContainer-4pXsBywn.mjs";
3
- import "./router-D0BaSzkZ.mjs";
2
+ import { m as TooltipProvider, n as Tooltip, o as TooltipTrigger, B as Badge, p as TooltipContent, E as JsonViewer } from "./ProxyViewerContainer-CXA7iH3H.mjs";
3
+ import "./router-ChJIVv7-.mjs";
4
4
  import "../_libs/modelcontextprotocol__server.mjs";
5
5
  import "../_libs/jszip.mjs";
6
6
  import { c as ChevronDown, l as ChevronRight, a as LoaderCircle } from "../_libs/lucide-react.mjs";
@@ -1,6 +1,6 @@
1
- import { P as ProxyViewerContainer } from "./ProxyViewerContainer-4pXsBywn.mjs";
1
+ import { P as ProxyViewerContainer } from "./ProxyViewerContainer-CXA7iH3H.mjs";
2
2
  import "../_libs/react.mjs";
3
- import "./router-D0BaSzkZ.mjs";
3
+ import "./router-ChJIVv7-.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-6N4SODyd.mjs");
201
+ const { tsrStartManifest } = await import("../_tanstack-start-manifest_v-CJ4__weU.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-D0BaSzkZ.mjs").then((n) => n.w);
779
+ const routerEntry = await import("./router-ChJIVv7-.mjs").then((n) => n.w);
780
780
  const startEntry = await import("./start-HYkvq4Ni.mjs");
781
781
  return { startEntry, routerEntry };
782
782
  }