@tonyclaw/llm-inspector 1.18.0 → 1.18.1

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 (40) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/assets/CompareDrawer-CAhlM_Gq.js +1 -0
  3. package/.output/public/assets/ProxyViewerContainer--miVHNPZ.js +101 -0
  4. package/.output/public/assets/ReplayDialog-Bqu2f5HE.js +1 -0
  5. package/.output/public/assets/RequestAnatomy-CpVNH0CD.js +1 -0
  6. package/.output/public/assets/ResponseView-B_Gg37Lr.js +1 -0
  7. package/.output/public/assets/StreamingChunkSequence-E2M_SS1A.js +1 -0
  8. package/.output/public/assets/_sessionId-P9LgC1bF.js +1 -0
  9. package/.output/public/assets/index-C0wv3YP9.css +1 -0
  10. package/.output/public/assets/index-kboKku6a.js +1 -0
  11. package/.output/public/assets/{json-viewer-D-z1r1Pp.js → json-viewer-DqhA-ODG.js} +1 -1
  12. package/.output/public/assets/{main-CZJ63sQh.js → main-DpH7JlHv.js} +8 -7
  13. package/.output/server/_libs/lucide-react.mjs +3 -3
  14. package/.output/server/_sessionId-DcJ0RDNl.mjs +122 -0
  15. package/.output/server/_ssr/{CompareDrawer-BJr-913n.mjs → CompareDrawer-DajC3x7u.mjs} +55 -55
  16. package/.output/server/_ssr/{index-C7I_Qgt0.mjs → ProxyViewerContainer-C2dnFXoC.mjs} +87 -139
  17. package/.output/server/_ssr/{ReplayDialog-BwmToGuR.mjs → ReplayDialog-BnCLuA5z.mjs} +56 -56
  18. package/.output/server/_ssr/{RequestAnatomy-BmMiPRPB.mjs → RequestAnatomy-OHE3iT-f.mjs} +2 -2
  19. package/.output/server/_ssr/{ResponseView-ZB9-8Raw.mjs → ResponseView-NPshHwOv.mjs} +3 -3
  20. package/.output/server/_ssr/{StreamingChunkSequence-DWm4CQWC.mjs → StreamingChunkSequence-BfukoR7F.mjs} +55 -55
  21. package/.output/server/_ssr/index-CF8M0tsv.mjs +117 -0
  22. package/.output/server/_ssr/index.mjs +2 -2
  23. package/.output/server/_ssr/{json-viewer-D9XETzwp.mjs → json-viewer-CHBa-Oas.mjs} +2 -2
  24. package/.output/server/_ssr/{router-711KpGkz.mjs → router-B5hOtKSn.mjs} +64 -22
  25. package/.output/server/_tanstack-start-manifest_v-CFyWvIH6.mjs +4 -0
  26. package/.output/server/index.mjs +73 -59
  27. package/package.json +1 -1
  28. package/src/components/ProxyViewer.tsx +44 -18
  29. package/src/components/ProxyViewerContainer.tsx +18 -2
  30. package/src/components/proxy-viewer/ConversationGroup.tsx +1 -8
  31. package/src/components/proxy-viewer/ConversationHeader.tsx +47 -4
  32. package/src/routes/session/$sessionId.tsx +75 -0
  33. package/.output/public/assets/CompareDrawer-BpwZCB6M.js +0 -1
  34. package/.output/public/assets/ReplayDialog-Clratkzl.js +0 -1
  35. package/.output/public/assets/RequestAnatomy-EtiX0r_G.js +0 -1
  36. package/.output/public/assets/ResponseView-CJqxo-EN.js +0 -1
  37. package/.output/public/assets/StreamingChunkSequence-BIbRqQiV.js +0 -1
  38. package/.output/public/assets/index-B-0F9n1w.js +0 -101
  39. package/.output/public/assets/index-DoGvsnbA.css +0 -1
  40. package/.output/server/_tanstack-start-manifest_v-noQw0Vmw.mjs +0 -4
@@ -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_SLOW_RESPONSE_THRESHOLD_SECONDS, R as RuntimeConfigSchema, r as requestFormatForPath, c as createPendingProviderTestResults, P as ProviderTestResultsSchema, b as createFailedProviderTestResults, M as MAX_SLOW_RESPONSE_THRESHOLD_SECONDS, d as ProviderConfigSchema, s as stripClaudeCodeBillingHeader, p as parseOpenAIResponse, O as OpenAIRequestSchema, A as AnthropicResponseSchema$1, a as AnthropicRequestSchema } from "./router-711KpGkz.mjs";
2
+ import { C as CapturedLogSchema, D as DEFAULT_SLOW_RESPONSE_THRESHOLD_SECONDS, a as RuntimeConfigSchema, r as requestFormatForPath, c as createPendingProviderTestResults, P as ProviderTestResultsSchema, d as createFailedProviderTestResults, M as MAX_SLOW_RESPONSE_THRESHOLD_SECONDS, e as ProviderConfigSchema, s as stripClaudeCodeBillingHeader, p as parseOpenAIResponse, O as OpenAIRequestSchema, A as AnthropicResponseSchema$1, b as AnthropicRequestSchema } from "./router-B5hOtKSn.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,107 +9,11 @@ import { R as Root, T as Trigger$1, C as Content, a as Close, b as Title, P as P
9
9
  import { d as diffJson, a as diffLines } from "../_libs/diff.mjs";
10
10
  import { u as useVirtualizer } from "../_libs/tanstack__react-virtual.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 { C as Check, X, D as Download, S as Settings, a as ChevronDown, U as Upload, b as Scan, P as Plus, c as Copy, d as CircleAlert, e as ChevronUp, L as LoaderCircle, f as ChevronRight, g as User, h as Clock, M as MessageSquare, Z as Zap, T as Trash2, i as TriangleAlert, E as EyeOff, j as Eye, k as ExternalLink, R as RotateCw, l as Pencil, G as GitCompareArrows, m as Minus, n as CircleCheckBig, O as OctagonAlert, W as Wrench, o as Globe, F as FileTerminal, p as Radio, q as ChevronsUp, r as ChevronsDown, s as RotateCcw, t as CircleQuestionMark, u as Server, v as Gauge, w as Lock, x as Wifi, y as WifiOff, A as ArrowUp, z as ArrowDown, B as Rows3, H as Columns2 } from "../_libs/lucide-react.mjs";
12
+ import { C as Check, X, D as Download, S as Settings, a as ChevronDown, U as Upload, b as Scan, P as Plus, c as Copy, d as CircleAlert, e as ChevronUp, L as LoaderCircle, f as ChevronRight, g as User, h as Clock, M as MessageSquare, Z as Zap, E as ExternalLink, T as Trash2, i as TriangleAlert, j as EyeOff, k as Eye, R as RotateCw, l as Pencil, G as GitCompareArrows, m as Minus, n as CircleCheckBig, O as OctagonAlert, W as Wrench, o as Globe, F as FileTerminal, p as Radio, q as ChevronsUp, r as ChevronsDown, s as RotateCcw, t as CircleQuestionMark, u as Server, v as Gauge, w as Lock, x as Wifi, y as WifiOff, A as ArrowUp, z as ArrowDown, B as Rows3, H 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 { R as Root2$1, L as List, T as Trigger$2, C as Content$1 } from "../_libs/radix-ui__react-tabs.mjs";
15
15
  import { P as Provider, R as Root3, T as Trigger$3, a as Portal$2, C as Content2$1, A as Arrow2 } from "../_libs/radix-ui__react-tooltip.mjs";
16
16
  import { S as Slot } from "../_libs/radix-ui__react-slot.mjs";
17
- import "../_libs/tanstack__react-router.mjs";
18
- import "../_libs/tiny-warning.mjs";
19
- import "../_libs/tanstack__router-core.mjs";
20
- import "../_libs/cookie-es.mjs";
21
- import "../_libs/tanstack__history.mjs";
22
- import "../_libs/tiny-invariant.mjs";
23
- import "../_libs/seroval.mjs";
24
- import "../_libs/seroval-plugins.mjs";
25
- import "node:stream/web";
26
- import "node:stream";
27
- import "../_libs/react-dom.mjs";
28
- import "util";
29
- import "async_hooks";
30
- import "stream";
31
- import "crypto";
32
- import "../_libs/isbot.mjs";
33
- import "node:fs";
34
- import "node:fs/promises";
35
- import "node:buffer";
36
- import "node:path";
37
- import "../_libs/conf.mjs";
38
- import "node:util";
39
- import "node:process";
40
- import "node:crypto";
41
- import "node:assert";
42
- import "../_libs/dot-prop.mjs";
43
- import "../_libs/env-paths.mjs";
44
- import "node:os";
45
- import "../_libs/atomically.mjs";
46
- import "../_libs/stubborn-fs.mjs";
47
- import "../_libs/stubborn-utils.mjs";
48
- import "../_libs/when-exit.mjs";
49
- import "../_libs/ajv.mjs";
50
- import "../_libs/fast-deep-equal.mjs";
51
- import "../_libs/json-schema-traverse.mjs";
52
- import "../_libs/fast-uri.mjs";
53
- import "../_libs/ajv-formats.mjs";
54
- import "../_libs/debounce-fn.mjs";
55
- import "../_libs/mimic-function.mjs";
56
- import "../_libs/semver.mjs";
57
- import "../_libs/uint8array-extras.mjs";
58
- import "node:child_process";
59
- import "node:worker_threads";
60
- import "../_libs/modelcontextprotocol__server.mjs";
61
- import "../_libs/use-sync-external-store.mjs";
62
- import "../_libs/dequal.mjs";
63
- import "../_libs/readable-stream.mjs";
64
- import "events";
65
- import "node:string_decoder";
66
- import "../_libs/process-nextick-args.mjs";
67
- import "../_libs/isarray.mjs";
68
- import "../_libs/safe-buffer.mjs";
69
- import "buffer";
70
- import "../_libs/core-util-is.mjs";
71
- import "../_libs/inherits.mjs";
72
- import "../_libs/util-deprecate.mjs";
73
- import "../_libs/lie.mjs";
74
- import "../_libs/immediate.mjs";
75
- import "../_libs/setimmediate.mjs";
76
- import "../_libs/pako.mjs";
77
- import "../_libs/radix-ui__primitive.mjs";
78
- import "../_libs/radix-ui__react-compose-refs.mjs";
79
- import "../_libs/radix-ui__react-context.mjs";
80
- import "../_libs/radix-ui__react-id.mjs";
81
- import "../_libs/@radix-ui/react-use-layout-effect+[...].mjs";
82
- import "../_libs/@radix-ui/react-use-controllable-state+[...].mjs";
83
- import "../_libs/@radix-ui/react-dismissable-layer+[...].mjs";
84
- import "../_libs/radix-ui__react-primitive.mjs";
85
- import "../_libs/@radix-ui/react-use-callback-ref+[...].mjs";
86
- import "../_libs/@radix-ui/react-use-escape-keydown+[...].mjs";
87
- import "../_libs/radix-ui__react-focus-scope.mjs";
88
- import "../_libs/radix-ui__react-portal.mjs";
89
- import "../_libs/radix-ui__react-presence.mjs";
90
- import "../_libs/radix-ui__react-focus-guards.mjs";
91
- import "../_libs/react-remove-scroll.mjs";
92
- import "tslib";
93
- import "../_libs/react-remove-scroll-bar.mjs";
94
- import "../_libs/react-style-singleton.mjs";
95
- import "../_libs/get-nonce.mjs";
96
- import "../_libs/use-sidecar.mjs";
97
- import "../_libs/use-callback-ref.mjs";
98
- import "../_libs/aria-hidden.mjs";
99
- import "../_libs/tanstack__virtual-core.mjs";
100
- import "../_libs/radix-ui__number.mjs";
101
- import "../_libs/radix-ui__react-collection.mjs";
102
- import "../_libs/radix-ui__react-direction.mjs";
103
- import "../_libs/radix-ui__react-popper.mjs";
104
- import "../_libs/floating-ui__react-dom.mjs";
105
- import "../_libs/floating-ui__dom.mjs";
106
- import "../_libs/floating-ui__core.mjs";
107
- import "../_libs/floating-ui__utils.mjs";
108
- import "../_libs/radix-ui__react-arrow.mjs";
109
- import "../_libs/radix-ui__react-use-size.mjs";
110
- import "../_libs/radix-ui__react-use-previous.mjs";
111
- import "../_libs/@radix-ui/react-visually-hidden+[...].mjs";
112
- import "../_libs/radix-ui__react-roving-focus.mjs";
113
17
  const ApiErrorSchema = object({
114
18
  error: string()
115
19
  });
@@ -371,7 +275,7 @@ function getStatusCategory(status) {
371
275
  if (status >= 500) return "server_error";
372
276
  return "pending";
373
277
  }
374
- const version = "1.18.0";
278
+ const version = "1.18.1";
375
279
  const packageJson = {
376
280
  version
377
281
  };
@@ -590,6 +494,20 @@ function ConversationHeader({
590
494
  if (onClear === void 0) return;
591
495
  setConfirmOpen(true);
592
496
  };
497
+ const handleOpenInNewTab = reactExports.useCallback(
498
+ (e) => {
499
+ e.stopPropagation();
500
+ let encoded;
501
+ try {
502
+ encoded = btoa(conversationId).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
503
+ } catch {
504
+ encoded = encodeURIComponent(conversationId);
505
+ }
506
+ const url = `/session/${encoded}`;
507
+ window.open(url, "_blank", "noopener,noreferrer");
508
+ },
509
+ [conversationId]
510
+ );
593
511
  return /* @__PURE__ */ jsxRuntimeExports.jsxs(
594
512
  "div",
595
513
  {
@@ -619,7 +537,7 @@ function ConversationHeader({
619
537
  {
620
538
  className: "text-purple-400/90 font-mono text-xs font-semibold shrink-0",
621
539
  title: conversationId,
622
- children: conversationId.length > 24 ? conversationId.slice(0, 12) + "…" + conversationId.slice(-12) : conversationId
540
+ children: conversationId.startsWith("PID:") || conversationId.includes("|") ? conversationId : conversationId.length > 24 ? conversationId.slice(0, 12) + "…" + conversationId.slice(-12) : conversationId
623
541
  }
624
542
  ),
625
543
  userAgent !== null && userAgent !== void 0 && userAgent !== "" && /* @__PURE__ */ jsxRuntimeExports.jsxs(
@@ -671,6 +589,22 @@ function ConversationHeader({
671
589
  ] })
672
590
  ] }),
673
591
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "flex-1 min-w-0" }),
592
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
593
+ "button",
594
+ {
595
+ type: "button",
596
+ onClick: handleOpenInNewTab,
597
+ onKeyDown: (e) => {
598
+ if (e.key === "Enter" || e.key === " ") {
599
+ handleOpenInNewTab(e);
600
+ }
601
+ },
602
+ "aria-label": `Open session ${conversationId} in a new tab`,
603
+ title: "Open this session in a new tab",
604
+ className: "text-muted-foreground hover:text-foreground transition-colors shrink-0 inline-flex items-center justify-center size-8 rounded hover:bg-muted cursor-pointer",
605
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(ExternalLink, { className: "size-3.5" })
606
+ }
607
+ ),
674
608
  onClear !== void 0 && /* @__PURE__ */ jsxRuntimeExports.jsx(
675
609
  "button",
676
610
  {
@@ -1120,8 +1054,8 @@ const crabVariants = [
1120
1054
  Crab11,
1121
1055
  Crab12
1122
1056
  ];
1123
- function getCrabVariant(index2) {
1124
- return crabVariants[Math.abs(index2) % crabVariants.length] ?? Crab1;
1057
+ function getCrabVariant(index) {
1058
+ return crabVariants[Math.abs(index) % crabVariants.length] ?? Crab1;
1125
1059
  }
1126
1060
  function getInteriorCrabVariantIndex(seed) {
1127
1061
  const interiorCount = crabVariants.length - 2;
@@ -1424,27 +1358,27 @@ function TabsContent({
1424
1358
  );
1425
1359
  }
1426
1360
  const LazyCompareDrawer = reactExports.lazy(
1427
- () => import("./CompareDrawer-BJr-913n.mjs").then((m) => ({ default: m.CompareDrawer }))
1361
+ () => import("./CompareDrawer-DajC3x7u.mjs").then((m) => ({ default: m.CompareDrawer }))
1428
1362
  );
1429
1363
  const LazyReplayDialog = reactExports.lazy(
1430
- () => import("./ReplayDialog-BwmToGuR.mjs").then((m) => ({ default: m.ReplayDialog }))
1364
+ () => import("./ReplayDialog-BnCLuA5z.mjs").then((m) => ({ default: m.ReplayDialog }))
1431
1365
  );
1432
1366
  const LazyRequestAnatomy = reactExports.lazy(
1433
- () => import("./RequestAnatomy-BmMiPRPB.mjs").then((m) => ({ default: m.RequestAnatomy }))
1367
+ () => import("./RequestAnatomy-OHE3iT-f.mjs").then((m) => ({ default: m.RequestAnatomy }))
1434
1368
  );
1435
1369
  const LazyResponseView = reactExports.lazy(
1436
- () => import("./ResponseView-ZB9-8Raw.mjs").then((m) => ({ default: m.ResponseView }))
1370
+ () => import("./ResponseView-NPshHwOv.mjs").then((m) => ({ default: m.ResponseView }))
1437
1371
  );
1438
1372
  const LazyStreamingChunkSequence = reactExports.lazy(
1439
- () => import("./StreamingChunkSequence-DWm4CQWC.mjs").then((m) => ({
1373
+ () => import("./StreamingChunkSequence-BfukoR7F.mjs").then((m) => ({
1440
1374
  default: m.StreamingChunkSequence
1441
1375
  }))
1442
1376
  );
1443
1377
  const LazyJsonViewer = reactExports.lazy(
1444
- () => import("./json-viewer-D9XETzwp.mjs").then((m) => ({ default: m.JsonViewer }))
1378
+ () => import("./json-viewer-CHBa-Oas.mjs").then((m) => ({ default: m.JsonViewer }))
1445
1379
  );
1446
1380
  const LazyJsonViewerFromString = reactExports.lazy(
1447
- () => import("./json-viewer-D9XETzwp.mjs").then((m) => ({ default: m.JsonViewerFromString }))
1381
+ () => import("./json-viewer-CHBa-Oas.mjs").then((m) => ({ default: m.JsonViewerFromString }))
1448
1382
  );
1449
1383
  const HIGHLIGHT_DURATION_MS = 1200;
1450
1384
  const MAX_HIGHLIGHT_ATTEMPTS = 12;
@@ -2244,12 +2178,12 @@ const anthropicLogFormatAdapter = {
2244
2178
  }
2245
2179
  }
2246
2180
  if (Array.isArray(body.messages)) {
2247
- body.messages.forEach((message, index2) => {
2181
+ body.messages.forEach((message, index) => {
2248
2182
  if (message === null || typeof message !== "object") return;
2249
2183
  const m = message;
2250
2184
  const role = m.role === "user" || m.role === "assistant" ? m.role : "user";
2251
2185
  const text = contentToText$1(m.content);
2252
- segments.push(segment$1(role, `[${index2}] ${role}`, text, `/messages/${index2}`));
2186
+ segments.push(segment$1(role, `[${index}] ${role}`, text, `/messages/${index}`));
2253
2187
  });
2254
2188
  }
2255
2189
  if (Array.isArray(body.tools) && body.tools.length > 0) {
@@ -2350,12 +2284,12 @@ const openAILogFormatAdapter = {
2350
2284
  const body = parsed;
2351
2285
  const segments = [];
2352
2286
  if (Array.isArray(body.messages)) {
2353
- body.messages.forEach((message, index2) => {
2287
+ body.messages.forEach((message, index) => {
2354
2288
  if (message === null || typeof message !== "object") return;
2355
2289
  const m = message;
2356
2290
  const role = m.role === "user" || m.role === "assistant" || m.role === "system" || m.role === "tool" ? m.role : "user";
2357
2291
  const text = messageToText(m);
2358
- segments.push(segment(role, `[${index2}] ${role}`, text, `/messages/${index2}`));
2292
+ segments.push(segment(role, `[${index}] ${role}`, text, `/messages/${index}`));
2359
2293
  });
2360
2294
  }
2361
2295
  if (Array.isArray(body.tools) && body.tools.length > 0) {
@@ -2859,9 +2793,9 @@ function buildTurnGroups(logs) {
2859
2793
  function buildValidPredecessors(groups) {
2860
2794
  const predecessors = /* @__PURE__ */ new Map();
2861
2795
  for (const group of groups) {
2862
- for (let index2 = 1; index2 < group.logs.length; index2 += 1) {
2863
- const current = group.logs[index2];
2864
- const previous = group.logs[index2 - 1];
2796
+ for (let index = 1; index < group.logs.length; index += 1) {
2797
+ const current = group.logs[index];
2798
+ const previous = group.logs[index - 1];
2865
2799
  if (current === void 0 || previous === void 0) continue;
2866
2800
  const currentFormat = resolveLogFormat(current);
2867
2801
  const previousFormat = resolveLogFormat(previous);
@@ -3166,12 +3100,11 @@ const ConversationGroup = reactExports.memo(function({
3166
3100
  const mixed = hasMixedApiFormat(group.logs);
3167
3101
  const isLoading = group.logs.some((log) => log.responseStatus === null);
3168
3102
  const turnGroups = reactExports.useMemo(() => buildTurnGroups(group.logs), [group.logs]);
3169
- const displayId = group.conversationId.startsWith("PID:") || group.conversationId.includes("|") ? group.conversationId : group.conversationId.length > 24 ? group.conversationId.slice(0, 12) + "…" + group.conversationId.slice(-12) : group.conversationId;
3170
3103
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mb-2", children: [
3171
3104
  !standalone && /* @__PURE__ */ jsxRuntimeExports.jsx(
3172
3105
  ConversationHeader,
3173
3106
  {
3174
- conversationId: displayId,
3107
+ conversationId: group.conversationId,
3175
3108
  startTime,
3176
3109
  endTime,
3177
3110
  totalCalls: group.logs.length,
@@ -3489,13 +3422,13 @@ function ImportWizardDialog({
3489
3422
  scan();
3490
3423
  }
3491
3424
  }, [open, scan]);
3492
- const toggleProvider = reactExports.useCallback((index2) => {
3425
+ const toggleProvider = reactExports.useCallback((index) => {
3493
3426
  setSelected((prev) => {
3494
3427
  const next = new Set(prev);
3495
- if (next.has(index2)) {
3496
- next.delete(index2);
3428
+ if (next.has(index)) {
3429
+ next.delete(index);
3497
3430
  } else {
3498
- next.add(index2);
3431
+ next.add(index);
3499
3432
  }
3500
3433
  return next;
3501
3434
  });
@@ -4020,10 +3953,10 @@ function ProviderForm({ provider, onSubmit, onCancel }) {
4020
3953
  const modelRowRefs = reactExports.useRef([]);
4021
3954
  reactExports.useEffect(() => {
4022
3955
  if (openModelDropdown === null) return;
4023
- const index2 = openModelDropdown;
3956
+ const index = openModelDropdown;
4024
3957
  function handleClick(e) {
4025
3958
  if (!(e.target instanceof Node)) return;
4026
- const ref = modelRowRefs.current[index2];
3959
+ const ref = modelRowRefs.current[index];
4027
3960
  if (ref !== null && ref !== void 0 && !ref.contains(e.target)) {
4028
3961
  setOpenModelDropdown(null);
4029
3962
  }
@@ -5132,8 +5065,8 @@ function focusAndScroll(el) {
5132
5065
  el.focus({ preventScroll: true });
5133
5066
  el.scrollIntoView({ block: "nearest", behavior: "smooth" });
5134
5067
  }
5135
- function safeItemAt(items, index2) {
5136
- const el = items[index2];
5068
+ function safeItemAt(items, index) {
5069
+ const el = items[index];
5137
5070
  return el ?? null;
5138
5071
  }
5139
5072
  function isEditableTarget(target) {
@@ -5327,7 +5260,8 @@ function ProxyViewer({
5327
5260
  viewMode,
5328
5261
  onViewModeChange,
5329
5262
  strip,
5330
- slowResponseThresholdSeconds
5263
+ slowResponseThresholdSeconds,
5264
+ hideSessionFilter = false
5331
5265
  }) {
5332
5266
  const { totalIn, totalOut } = reactExports.useMemo(() => computeTokenSummary(logs), [logs]);
5333
5267
  const [exporting, setExporting] = reactExports.useState(false);
@@ -5418,7 +5352,7 @@ function ProxyViewer({
5418
5352
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "ml-auto", children: /* @__PURE__ */ jsxRuntimeExports.jsx(SettingsDialog, {}) })
5419
5353
  ] }),
5420
5354
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-3 mb-4", children: [
5421
- /* @__PURE__ */ jsxRuntimeExports.jsxs(Select, { value: selectedSession, onValueChange: onSessionChange, children: [
5355
+ !hideSessionFilter && /* @__PURE__ */ jsxRuntimeExports.jsxs(Select, { value: selectedSession, onValueChange: onSessionChange, children: [
5422
5356
  /* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { className: "flex-1 max-w-[350px] text-xs", children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, { placeholder: "All sessions" }) }),
5423
5357
  /* @__PURE__ */ jsxRuntimeExports.jsxs(SelectContent, { children: [
5424
5358
  /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: "__all__", children: "All sessions" }),
@@ -5486,7 +5420,23 @@ function ProxyViewer({
5486
5420
  }
5487
5421
  )
5488
5422
  ] }),
5489
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { children: logs.length === 0 ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center text-muted-foreground py-16 space-y-4", children: [
5423
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { children: logs.length === 0 ? selectedSession !== "__all__" ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center text-muted-foreground py-16 space-y-4", children: [
5424
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm font-medium", children: "Session not found" }),
5425
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs font-mono bg-muted px-3 py-1 rounded inline-block max-w-[500px] break-all", children: truncateSessionId(selectedSession) }),
5426
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-xs", children: [
5427
+ "This session may have been cleared or never existed.",
5428
+ " ",
5429
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
5430
+ "button",
5431
+ {
5432
+ type: "button",
5433
+ onClick: () => onSessionChange("__all__"),
5434
+ className: "underline hover:text-foreground transition-colors",
5435
+ children: "Show all sessions"
5436
+ }
5437
+ )
5438
+ ] })
5439
+ ] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center text-muted-foreground py-16 space-y-4", children: [
5490
5440
  /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm", children: "No requests captured yet." }),
5491
5441
  /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs", children: "Route AI coding tools through the proxy:" }),
5492
5442
  /* @__PURE__ */ jsxRuntimeExports.jsx(CopyableCommand, { command: "LLM_BASE_URL=http://localhost:25947/proxy <your-tool>" })
@@ -5549,9 +5499,11 @@ function filterLogs(logs, selectedSession, selectedModel) {
5549
5499
  });
5550
5500
  }
5551
5501
  const DEBOUNCE_MS = 50;
5552
- function ProxyViewerContainer() {
5502
+ function ProxyViewerContainer({
5503
+ initialSessionId
5504
+ } = {}) {
5553
5505
  const [allLogs, setAllLogs] = reactExports.useState([]);
5554
- const [selectedSession, setSelectedSession] = reactExports.useState("__all__");
5506
+ const [selectedSession, setSelectedSession] = reactExports.useState(initialSessionId ?? "__all__");
5555
5507
  const [selectedModel, setSelectedModel] = reactExports.useState("__all__");
5556
5508
  const [viewMode, setViewMode] = reactExports.useState("simple");
5557
5509
  const [error, setError] = reactExports.useState(null);
@@ -5722,19 +5674,16 @@ function ProxyViewerContainer() {
5722
5674
  viewMode,
5723
5675
  onViewModeChange: setViewMode,
5724
5676
  strip,
5725
- slowResponseThresholdSeconds
5677
+ slowResponseThresholdSeconds,
5678
+ hideSessionFilter: initialSessionId !== void 0
5726
5679
  }
5727
5680
  )
5728
5681
  ] });
5729
5682
  }
5730
- const SplitComponent = ProxyViewerContainer;
5731
- const index = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
5732
- __proto__: null,
5733
- component: SplitComponent
5734
- }, Symbol.toStringTag, { value: "Module" }));
5735
5683
  export {
5736
5684
  Badge as B,
5737
5685
  Dialog as D,
5686
+ ProxyViewerContainer as P,
5738
5687
  Tabs as T,
5739
5688
  getConversationId as a,
5740
5689
  DialogContent as b,
@@ -5754,6 +5703,5 @@ export {
5754
5703
  getStatusCategory as p,
5755
5704
  parseJsonText as q,
5756
5705
  resolveLogFormat as r,
5757
- safeJsonValue as s,
5758
- index as t
5706
+ safeJsonValue as s
5759
5707
  };
@@ -1,10 +1,10 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "../_libs/react.mjs";
2
- import { 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 TooltipProvider, l as Tooltip, m as TooltipTrigger, n as TooltipContent, o as Button } from "./index-C7I_Qgt0.mjs";
3
- import { ResponseView } from "./ResponseView-ZB9-8Raw.mjs";
4
- import "./router-711KpGkz.mjs";
2
+ import { 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 TooltipProvider, l as Tooltip, m as TooltipTrigger, n as TooltipContent, o as Button } from "./ProxyViewerContainer-C2dnFXoC.mjs";
3
+ import { ResponseView } from "./ResponseView-NPshHwOv.mjs";
4
+ import "./router-B5hOtKSn.mjs";
5
5
  import "../_libs/modelcontextprotocol__server.mjs";
6
6
  import "../_libs/jszip.mjs";
7
- import "./json-viewer-D9XETzwp.mjs";
7
+ import "./json-viewer-CHBa-Oas.mjs";
8
8
  import { s as RotateCcw } from "../_libs/lucide-react.mjs";
9
9
  import { d as object, c as boolean, n as number, b as string } from "../_libs/zod.mjs";
10
10
  import "../_libs/swr.mjs";
@@ -61,58 +61,6 @@ import "../_libs/@radix-ui/react-visually-hidden+[...].mjs";
61
61
  import "../_libs/radix-ui__react-tabs.mjs";
62
62
  import "../_libs/radix-ui__react-roving-focus.mjs";
63
63
  import "../_libs/radix-ui__react-tooltip.mjs";
64
- import "../_libs/tanstack__react-router.mjs";
65
- import "../_libs/tiny-warning.mjs";
66
- import "../_libs/tanstack__router-core.mjs";
67
- import "../_libs/cookie-es.mjs";
68
- import "../_libs/tanstack__history.mjs";
69
- import "../_libs/tiny-invariant.mjs";
70
- import "../_libs/seroval.mjs";
71
- import "../_libs/seroval-plugins.mjs";
72
- import "node:stream/web";
73
- import "node:stream";
74
- import "../_libs/isbot.mjs";
75
- import "node:fs";
76
- import "node:fs/promises";
77
- import "node:buffer";
78
- import "node:path";
79
- import "../_libs/conf.mjs";
80
- import "node:util";
81
- import "node:process";
82
- import "node:crypto";
83
- import "node:assert";
84
- import "../_libs/dot-prop.mjs";
85
- import "../_libs/env-paths.mjs";
86
- import "node:os";
87
- import "../_libs/atomically.mjs";
88
- import "../_libs/stubborn-fs.mjs";
89
- import "../_libs/stubborn-utils.mjs";
90
- import "../_libs/when-exit.mjs";
91
- import "../_libs/ajv.mjs";
92
- import "../_libs/fast-deep-equal.mjs";
93
- import "../_libs/json-schema-traverse.mjs";
94
- import "../_libs/fast-uri.mjs";
95
- import "../_libs/ajv-formats.mjs";
96
- import "../_libs/debounce-fn.mjs";
97
- import "../_libs/mimic-function.mjs";
98
- import "../_libs/semver.mjs";
99
- import "../_libs/uint8array-extras.mjs";
100
- import "node:child_process";
101
- import "node:worker_threads";
102
- import "../_libs/readable-stream.mjs";
103
- import "events";
104
- import "node:string_decoder";
105
- import "../_libs/process-nextick-args.mjs";
106
- import "../_libs/isarray.mjs";
107
- import "../_libs/safe-buffer.mjs";
108
- import "buffer";
109
- import "../_libs/core-util-is.mjs";
110
- import "../_libs/inherits.mjs";
111
- import "../_libs/util-deprecate.mjs";
112
- import "../_libs/lie.mjs";
113
- import "../_libs/immediate.mjs";
114
- import "../_libs/setimmediate.mjs";
115
- import "../_libs/pako.mjs";
116
64
  import "../_libs/react-markdown.mjs";
117
65
  import "../_libs/devlop.mjs";
118
66
  import "../_libs/unified.mjs";
@@ -123,6 +71,8 @@ import "../_libs/trough.mjs";
123
71
  import "../_libs/vfile.mjs";
124
72
  import "../_libs/vfile-message.mjs";
125
73
  import "../_libs/unist-util-stringify-position.mjs";
74
+ import "node:process";
75
+ import "node:path";
126
76
  import "node:url";
127
77
  import "../_libs/remark-parse.mjs";
128
78
  import "../_libs/mdast-util-from-markdown.mjs";
@@ -168,6 +118,56 @@ import "../_libs/html-url-attributes.mjs";
168
118
  import "../_libs/radix-ui__react-separator.mjs";
169
119
  import "../_libs/radix-ui__react-collapsible.mjs";
170
120
  import "../_libs/radix-ui__react-scroll-area.mjs";
121
+ import "../_libs/tanstack__react-router.mjs";
122
+ import "../_libs/tiny-warning.mjs";
123
+ import "../_libs/tanstack__router-core.mjs";
124
+ import "../_libs/cookie-es.mjs";
125
+ import "../_libs/tanstack__history.mjs";
126
+ import "../_libs/tiny-invariant.mjs";
127
+ import "../_libs/seroval.mjs";
128
+ import "../_libs/seroval-plugins.mjs";
129
+ import "node:stream/web";
130
+ import "node:stream";
131
+ import "../_libs/isbot.mjs";
132
+ import "node:fs";
133
+ import "node:fs/promises";
134
+ import "node:buffer";
135
+ import "../_libs/conf.mjs";
136
+ import "node:util";
137
+ import "node:crypto";
138
+ import "node:assert";
139
+ import "../_libs/dot-prop.mjs";
140
+ import "../_libs/env-paths.mjs";
141
+ import "node:os";
142
+ import "../_libs/atomically.mjs";
143
+ import "../_libs/stubborn-fs.mjs";
144
+ import "../_libs/stubborn-utils.mjs";
145
+ import "../_libs/when-exit.mjs";
146
+ import "../_libs/ajv.mjs";
147
+ import "../_libs/fast-deep-equal.mjs";
148
+ import "../_libs/json-schema-traverse.mjs";
149
+ import "../_libs/fast-uri.mjs";
150
+ import "../_libs/ajv-formats.mjs";
151
+ import "../_libs/debounce-fn.mjs";
152
+ import "../_libs/mimic-function.mjs";
153
+ import "../_libs/semver.mjs";
154
+ import "../_libs/uint8array-extras.mjs";
155
+ import "node:child_process";
156
+ import "node:worker_threads";
157
+ import "../_libs/readable-stream.mjs";
158
+ import "events";
159
+ import "node:string_decoder";
160
+ import "../_libs/process-nextick-args.mjs";
161
+ import "../_libs/isarray.mjs";
162
+ import "../_libs/safe-buffer.mjs";
163
+ import "buffer";
164
+ import "../_libs/core-util-is.mjs";
165
+ import "../_libs/inherits.mjs";
166
+ import "../_libs/util-deprecate.mjs";
167
+ import "../_libs/lie.mjs";
168
+ import "../_libs/immediate.mjs";
169
+ import "../_libs/setimmediate.mjs";
170
+ import "../_libs/pako.mjs";
171
171
  const ReplayResultSchema = object({
172
172
  success: boolean(),
173
173
  error: string().optional(),
@@ -1,6 +1,6 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "../_libs/react.mjs";
2
- import { k as TooltipProvider, f as formatTokens, c as cn, l as Tooltip, m as TooltipTrigger, n as TooltipContent } from "./index-C7I_Qgt0.mjs";
3
- import "./router-711KpGkz.mjs";
2
+ import { k as TooltipProvider, f as formatTokens, c as cn, l as Tooltip, m as TooltipTrigger, n as TooltipContent } from "./ProxyViewerContainer-C2dnFXoC.mjs";
3
+ import "./router-B5hOtKSn.mjs";
4
4
  import "../_libs/modelcontextprotocol__server.mjs";
5
5
  import "../_libs/jszip.mjs";
6
6
  import { J as Info } from "../_libs/lucide-react.mjs";
@@ -1,7 +1,7 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "../_libs/react.mjs";
2
- import { g as getLogFormatAdapter, f as formatTokens, c as cn, p as getStatusCategory, B as Badge, s as safeJsonValue } from "./index-C7I_Qgt0.mjs";
3
- import { JsonViewer } from "./json-viewer-D9XETzwp.mjs";
4
- import "./router-711KpGkz.mjs";
2
+ import { g as getLogFormatAdapter, f as formatTokens, c as cn, p as getStatusCategory, B as Badge, s as safeJsonValue } from "./ProxyViewerContainer-C2dnFXoC.mjs";
3
+ import { JsonViewer } from "./json-viewer-CHBa-Oas.mjs";
4
+ import "./router-B5hOtKSn.mjs";
5
5
  import "../_libs/modelcontextprotocol__server.mjs";
6
6
  import "../_libs/jszip.mjs";
7
7
  import { Z as Zap, i as TriangleAlert, K as CircleStop, N as Brain, a as ChevronDown, f as ChevronRight, Q as Terminal } from "../_libs/lucide-react.mjs";