@tonyclaw/llm-inspector 1.16.5 → 1.17.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 (37) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/assets/{CompareDrawer-C1w4KUGZ.js → CompareDrawer-BhXCLr7m.js} +1 -1
  3. package/.output/public/assets/{ReplayDialog-DR2Sgq_g.js → ReplayDialog-CzRPSXwa.js} +1 -1
  4. package/.output/public/assets/{RequestAnatomy-DAre35kj.js → RequestAnatomy-lMQonao2.js} +1 -1
  5. package/.output/public/assets/{ResponseView-ackes7_g.js → ResponseView-Bt0vngo0.js} +1 -1
  6. package/.output/public/assets/{StreamingChunkSequence-GrXwIGKA.js → StreamingChunkSequence-Dq9XY2E9.js} +1 -1
  7. package/.output/public/assets/index-B4nxi_tZ.js +101 -0
  8. package/.output/public/assets/index-DoGvsnbA.css +1 -0
  9. package/.output/public/assets/{json-viewer-C_QUhGeu.js → json-viewer-C8ttTXtv.js} +1 -1
  10. package/.output/public/assets/{main-CDMdNDY_.js → main-Dgme52Fp.js} +1 -1
  11. package/.output/server/_libs/lucide-react.mjs +6 -6
  12. package/.output/server/_ssr/{CompareDrawer-ftkJxyk6.mjs → CompareDrawer-D-Nj8wmx.mjs} +4 -4
  13. package/.output/server/_ssr/{ReplayDialog-DcmE3lj5.mjs → ReplayDialog-DcucC22E.mjs} +4 -4
  14. package/.output/server/_ssr/{RequestAnatomy-rK_LNMdG.mjs → RequestAnatomy-aL8GAcW2.mjs} +2 -2
  15. package/.output/server/_ssr/{ResponseView-CbQ4n-aJ.mjs → ResponseView-BHgpoGaF.mjs} +4 -4
  16. package/.output/server/_ssr/{StreamingChunkSequence-84FZkIzv.mjs → StreamingChunkSequence-DrT7StyS.mjs} +3 -3
  17. package/.output/server/_ssr/{index-CDjLoMsk.mjs → index-nUG0H1oS.mjs} +146 -29
  18. package/.output/server/_ssr/index.mjs +2 -2
  19. package/.output/server/_ssr/{json-viewer-B-qpM5xC.mjs → json-viewer-DLsDT0RE.mjs} +2 -2
  20. package/.output/server/_ssr/{router-BrdjOUEW.mjs → router-DG_jmXCF.mjs} +20 -6
  21. package/.output/server/{_tanstack-start-manifest_v-DmOZEcJ3.mjs → _tanstack-start-manifest_v-D0JtrQPv.mjs} +1 -1
  22. package/.output/server/index.mjs +54 -54
  23. package/package.json +1 -1
  24. package/src/components/ProxyViewer.tsx +6 -1
  25. package/src/components/ProxyViewerContainer.tsx +2 -1
  26. package/src/components/providers/SettingsDialog.tsx +52 -1
  27. package/src/components/proxy-viewer/ConversationGroup.tsx +4 -0
  28. package/src/components/proxy-viewer/LogEntry.tsx +4 -0
  29. package/src/components/proxy-viewer/LogEntryHeader.tsx +34 -4
  30. package/src/components/proxy-viewer/TurnGroup.tsx +36 -7
  31. package/src/lib/runtimeConfig.ts +9 -0
  32. package/src/lib/useOnboarding.ts +7 -1
  33. package/src/lib/useStripConfig.ts +33 -2
  34. package/src/proxy/config.ts +17 -7
  35. package/src/routes/api/config.ts +7 -0
  36. package/.output/public/assets/index-BGzHFOEX.css +0 -1
  37. package/.output/public/assets/index-DX88k9br.js +0 -101
@@ -444,12 +444,12 @@ export {
444
444
  ChevronRight as f,
445
445
  User as g,
446
446
  Clock as h,
447
- Eye as i,
448
- ExternalLink as j,
449
- Pencil as k,
450
- Minus as l,
451
- CircleCheckBig as m,
452
- TriangleAlert as n,
447
+ TriangleAlert as i,
448
+ Eye as j,
449
+ ExternalLink as k,
450
+ Pencil as l,
451
+ Minus as m,
452
+ CircleCheckBig as n,
453
453
  Globe as o,
454
454
  Radio as p,
455
455
  ChevronsUp as q,
@@ -1,10 +1,10 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "../_libs/react.mjs";
2
- import { g as getLogFormatAdapter, r as resolveLogFormat, a as getConversationId, c as cn, B as Badge, f as formatTokens } from "./index-CDjLoMsk.mjs";
3
- import { JsonViewerFromString } from "./json-viewer-B-qpM5xC.mjs";
4
- import "./router-BrdjOUEW.mjs";
2
+ import { g as getLogFormatAdapter, r as resolveLogFormat, a as getConversationId, c as cn, B as Badge, f as formatTokens } from "./index-nUG0H1oS.mjs";
3
+ import { JsonViewerFromString } from "./json-viewer-DLsDT0RE.mjs";
4
+ import "./router-DG_jmXCF.mjs";
5
5
  import "../_libs/modelcontextprotocol__server.mjs";
6
6
  import "../_libs/jszip.mjs";
7
- import { X, B as Rows3, H as Columns2, l as Minus, P as Plus, k as Pencil, f as ChevronRight, I as Equal, C as Check, c as Copy } from "../_libs/lucide-react.mjs";
7
+ import { X, B as Rows3, H as Columns2, m as Minus, P as Plus, l as Pencil, f as ChevronRight, I as Equal, C as Check, c as Copy } from "../_libs/lucide-react.mjs";
8
8
  import "../_libs/swr.mjs";
9
9
  import "../_libs/use-sync-external-store.mjs";
10
10
  import "../_libs/dequal.mjs";
@@ -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-CDjLoMsk.mjs";
3
- import { ResponseView } from "./ResponseView-CbQ4n-aJ.mjs";
4
- import "./router-BrdjOUEW.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-nUG0H1oS.mjs";
3
+ import { ResponseView } from "./ResponseView-BHgpoGaF.mjs";
4
+ import "./router-DG_jmXCF.mjs";
5
5
  import "../_libs/modelcontextprotocol__server.mjs";
6
6
  import "../_libs/jszip.mjs";
7
- import "./json-viewer-B-qpM5xC.mjs";
7
+ import "./json-viewer-DLsDT0RE.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";
@@ -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-CDjLoMsk.mjs";
3
- import "./router-BrdjOUEW.mjs";
2
+ import { k as TooltipProvider, f as formatTokens, c as cn, l as Tooltip, m as TooltipTrigger, n as TooltipContent } from "./index-nUG0H1oS.mjs";
3
+ import "./router-DG_jmXCF.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,10 +1,10 @@
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-CDjLoMsk.mjs";
3
- import { JsonViewer } from "./json-viewer-B-qpM5xC.mjs";
4
- import "./router-BrdjOUEW.mjs";
2
+ import { g as getLogFormatAdapter, f as formatTokens, c as cn, p as getStatusCategory, B as Badge, s as safeJsonValue } from "./index-nUG0H1oS.mjs";
3
+ import { JsonViewer } from "./json-viewer-DLsDT0RE.mjs";
4
+ import "./router-DG_jmXCF.mjs";
5
5
  import "../_libs/modelcontextprotocol__server.mjs";
6
6
  import "../_libs/jszip.mjs";
7
- import { Z as Zap, n as TriangleAlert, K as CircleStop, N as Brain, a as ChevronDown, f as ChevronRight, Q as Terminal } from "../_libs/lucide-react.mjs";
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";
8
8
  import { M as Markdown } from "../_libs/react-markdown.mjs";
9
9
  import { R as Root } from "../_libs/radix-ui__react-separator.mjs";
10
10
  import { R as Root$1, C as CollapsibleTrigger$1, a as CollapsibleContent$1 } from "../_libs/radix-ui__react-collapsible.mjs";
@@ -1,7 +1,7 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "../_libs/react.mjs";
2
- import { k as TooltipProvider, l as Tooltip, m as TooltipTrigger, B as Badge, n as TooltipContent } from "./index-CDjLoMsk.mjs";
3
- import { JsonViewer } from "./json-viewer-B-qpM5xC.mjs";
4
- import "./router-BrdjOUEW.mjs";
2
+ import { k as TooltipProvider, l as Tooltip, m as TooltipTrigger, B as Badge, n as TooltipContent } from "./index-nUG0H1oS.mjs";
3
+ import { JsonViewer } from "./json-viewer-DLsDT0RE.mjs";
4
+ import "./router-DG_jmXCF.mjs";
5
5
  import "../_libs/modelcontextprotocol__server.mjs";
6
6
  import "../_libs/jszip.mjs";
7
7
  import { a as ChevronDown, f as ChevronRight, L as LoaderCircle } from "../_libs/lucide-react.mjs";
@@ -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, R as RuntimeConfigSchema, r as requestFormatForPath, c as createPendingProviderTestResults, P as ProviderTestResultsSchema, b as createFailedProviderTestResults, d as ProviderConfigSchema, s as stripClaudeCodeBillingHeader, p as parseOpenAIResponse, O as OpenAIRequestSchema, A as AnthropicResponseSchema$1, a as AnthropicRequestSchema } from "./router-BrdjOUEW.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-DG_jmXCF.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 { 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, E as EyeOff, i as Eye, j as ExternalLink, R as RotateCw, k as Pencil, G as GitCompareArrows, l as Minus, m as CircleCheckBig, O as OctagonAlert, n as TriangleAlert, 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, 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";
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";
@@ -165,12 +165,30 @@ function useStripConfig() {
165
165
  );
166
166
  const { mutate: globalMutate } = useSWRConfig();
167
167
  const strip = response.data?.stripClaudeCodeBillingHeader ?? false;
168
+ const slowResponseThresholdSeconds = response.data?.slowResponseThresholdSeconds ?? DEFAULT_SLOW_RESPONSE_THRESHOLD_SECONDS;
169
+ const optimisticConfig = (patch) => ({
170
+ stripClaudeCodeBillingHeader: response.data?.stripClaudeCodeBillingHeader ?? false,
171
+ hasSeenOnboarding: response.data?.hasSeenOnboarding ?? false,
172
+ slowResponseThresholdSeconds: response.data?.slowResponseThresholdSeconds ?? DEFAULT_SLOW_RESPONSE_THRESHOLD_SECONDS,
173
+ ...patch
174
+ });
168
175
  const setStrip = async (next) => {
169
176
  await globalMutate(
170
177
  STRIP_CONFIG_SWR_KEY,
171
178
  setRuntimeConfig({ stripClaudeCodeBillingHeader: next }),
172
179
  {
173
- optimisticData: { stripClaudeCodeBillingHeader: next },
180
+ optimisticData: optimisticConfig({ stripClaudeCodeBillingHeader: next }),
181
+ rollbackOnError: true,
182
+ revalidate: false
183
+ }
184
+ );
185
+ };
186
+ const setSlowResponseThresholdSeconds = async (next) => {
187
+ await globalMutate(
188
+ STRIP_CONFIG_SWR_KEY,
189
+ setRuntimeConfig({ slowResponseThresholdSeconds: next }),
190
+ {
191
+ optimisticData: optimisticConfig({ slowResponseThresholdSeconds: next }),
174
192
  rollbackOnError: true,
175
193
  revalidate: false
176
194
  }
@@ -178,9 +196,11 @@ function useStripConfig() {
178
196
  };
179
197
  return {
180
198
  strip,
199
+ slowResponseThresholdSeconds,
181
200
  isLoading: response.isLoading,
182
201
  isError: response.error !== void 0,
183
- setStrip
202
+ setStrip,
203
+ setSlowResponseThresholdSeconds
184
204
  };
185
205
  }
186
206
  const ONBOARDING_SWR_KEY = "/api/config";
@@ -219,7 +239,8 @@ function useOnboarding() {
219
239
  await globalMutate(ONBOARDING_SWR_KEY, patchRuntimeConfig({ hasSeenOnboarding: true }), {
220
240
  optimisticData: {
221
241
  stripClaudeCodeBillingHeader: response.data?.stripClaudeCodeBillingHeader ?? false,
222
- hasSeenOnboarding: true
242
+ hasSeenOnboarding: true,
243
+ slowResponseThresholdSeconds: response.data?.slowResponseThresholdSeconds ?? DEFAULT_SLOW_RESPONSE_THRESHOLD_SECONDS
223
244
  },
224
245
  rollbackOnError: true,
225
246
  revalidate: false
@@ -335,10 +356,6 @@ async function exportLogsAsZip(logs) {
335
356
  document.body.removeChild(anchor);
336
357
  URL.revokeObjectURL(url);
337
358
  }
338
- const version = "1.16.5";
339
- const packageJson = {
340
- version
341
- };
342
359
  function cn(...inputs) {
343
360
  return twMerge(clsx(inputs));
344
361
  }
@@ -353,6 +370,10 @@ function getStatusCategory(status) {
353
370
  if (status >= 500) return "server_error";
354
371
  return "pending";
355
372
  }
373
+ const version = "1.17.1";
374
+ const packageJson = {
375
+ version
376
+ };
356
377
  const badgeVariants = cva(
357
378
  "inline-flex items-center justify-center rounded-full border border-transparent px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden",
358
379
  {
@@ -1402,27 +1423,27 @@ function TabsContent({
1402
1423
  );
1403
1424
  }
1404
1425
  const LazyCompareDrawer = reactExports.lazy(
1405
- () => import("./CompareDrawer-ftkJxyk6.mjs").then((m) => ({ default: m.CompareDrawer }))
1426
+ () => import("./CompareDrawer-D-Nj8wmx.mjs").then((m) => ({ default: m.CompareDrawer }))
1406
1427
  );
1407
1428
  const LazyReplayDialog = reactExports.lazy(
1408
- () => import("./ReplayDialog-DcmE3lj5.mjs").then((m) => ({ default: m.ReplayDialog }))
1429
+ () => import("./ReplayDialog-DcucC22E.mjs").then((m) => ({ default: m.ReplayDialog }))
1409
1430
  );
1410
1431
  const LazyRequestAnatomy = reactExports.lazy(
1411
- () => import("./RequestAnatomy-rK_LNMdG.mjs").then((m) => ({ default: m.RequestAnatomy }))
1432
+ () => import("./RequestAnatomy-aL8GAcW2.mjs").then((m) => ({ default: m.RequestAnatomy }))
1412
1433
  );
1413
1434
  const LazyResponseView = reactExports.lazy(
1414
- () => import("./ResponseView-CbQ4n-aJ.mjs").then((m) => ({ default: m.ResponseView }))
1435
+ () => import("./ResponseView-BHgpoGaF.mjs").then((m) => ({ default: m.ResponseView }))
1415
1436
  );
1416
1437
  const LazyStreamingChunkSequence = reactExports.lazy(
1417
- () => import("./StreamingChunkSequence-84FZkIzv.mjs").then((m) => ({
1438
+ () => import("./StreamingChunkSequence-DrT7StyS.mjs").then((m) => ({
1418
1439
  default: m.StreamingChunkSequence
1419
1440
  }))
1420
1441
  );
1421
1442
  const LazyJsonViewer = reactExports.lazy(
1422
- () => import("./json-viewer-B-qpM5xC.mjs").then((m) => ({ default: m.JsonViewer }))
1443
+ () => import("./json-viewer-DLsDT0RE.mjs").then((m) => ({ default: m.JsonViewer }))
1423
1444
  );
1424
1445
  const LazyJsonViewerFromString = reactExports.lazy(
1425
- () => import("./json-viewer-B-qpM5xC.mjs").then((m) => ({ default: m.JsonViewerFromString }))
1446
+ () => import("./json-viewer-DLsDT0RE.mjs").then((m) => ({ default: m.JsonViewerFromString }))
1426
1447
  );
1427
1448
  const HIGHLIGHT_DURATION_MS = 1200;
1428
1449
  const MAX_HIGHLIGHT_ATTEMPTS = 12;
@@ -1845,9 +1866,11 @@ const LogEntryHeader = reactExports.memo(function({
1845
1866
  onCopyRequest,
1846
1867
  requestCopied = false,
1847
1868
  onToggleRequestExpansion,
1848
- requestExpansionState = null
1869
+ requestExpansionState = null,
1870
+ slowResponseThresholdSeconds = 0
1849
1871
  }) {
1850
1872
  const statusCategory = getStatusCategory(log.responseStatus);
1873
+ const isSlowResponse = log.elapsedMs !== null && slowResponseThresholdSeconds > 0 && log.elapsedMs > slowResponseThresholdSeconds * 1e3;
1851
1874
  const hasTokens = log.inputTokens !== null || log.outputTokens !== null;
1852
1875
  const toolNamesJoined = reactExports.useMemo(() => responseToolNames?.join(", ") ?? null, [responseToolNames]);
1853
1876
  return /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipProvider, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
@@ -1875,6 +1898,10 @@ const LogEntryHeader = reactExports.memo(function({
1875
1898
  "#",
1876
1899
  log.id
1877
1900
  ] }),
1901
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "flex items-center gap-1 text-muted-foreground text-xs shrink-0", children: [
1902
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Clock, { className: "size-3" }),
1903
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono tabular-nums", children: log.timestamp })
1904
+ ] }),
1878
1905
  log.model !== null && /* @__PURE__ */ jsxRuntimeExports.jsxs(Tooltip, { children: [
1879
1906
  /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "shrink-0", children: /* @__PURE__ */ jsxRuntimeExports.jsx(ProviderLogo, { provider: detectProvider(log.model), className: "size-4" }) }) }),
1880
1907
  /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipContent, { children: log.model })
@@ -1893,9 +1920,24 @@ const LogEntryHeader = reactExports.memo(function({
1893
1920
  ]
1894
1921
  }
1895
1922
  ),
1896
- log.elapsedMs !== null && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "flex items-center gap-1 text-muted-foreground text-xs shrink-0", children: [
1897
- /* @__PURE__ */ jsxRuntimeExports.jsx(Clock, { className: "size-3" }),
1898
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono tabular-nums", children: formatElapsed$1(log.elapsedMs) })
1923
+ log.elapsedMs !== null && /* @__PURE__ */ jsxRuntimeExports.jsxs(Tooltip, { children: [
1924
+ /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
1925
+ "span",
1926
+ {
1927
+ className: cn(
1928
+ "flex items-center gap-1 text-xs shrink-0",
1929
+ isSlowResponse ? "text-amber-400" : "text-muted-foreground"
1930
+ ),
1931
+ children: [
1932
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Clock, { className: "size-3" }),
1933
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono tabular-nums", children: formatElapsed$1(log.elapsedMs) }),
1934
+ isSlowResponse && /* @__PURE__ */ jsxRuntimeExports.jsx(TriangleAlert, { className: "size-3", "aria-label": "Slow response" })
1935
+ ]
1936
+ }
1937
+ ) }),
1938
+ /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipContent, { children: isSlowResponse ? `Slow response: ${formatElapsed$1(log.elapsedMs)} exceeds ${formatElapsed$1(
1939
+ slowResponseThresholdSeconds * 1e3
1940
+ )}` : "Elapsed response time" })
1899
1941
  ] }),
1900
1942
  hasTokens && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "flex items-center gap-1 text-xs shrink-0", children: [
1901
1943
  /* @__PURE__ */ jsxRuntimeExports.jsx(Zap, { className: "size-3 text-muted-foreground" }),
@@ -2451,6 +2493,7 @@ const LogEntry = reactExports.memo(function({
2451
2493
  log,
2452
2494
  viewMode = "simple",
2453
2495
  strip,
2496
+ slowResponseThresholdSeconds,
2454
2497
  cacheTrend = null,
2455
2498
  onCompareWithPrevious
2456
2499
  }) {
@@ -2510,6 +2553,7 @@ const LogEntry = reactExports.memo(function({
2510
2553
  onToggle: () => setExpanded(!expanded),
2511
2554
  responseToolNames: responseAnalysis.toolNames,
2512
2555
  cacheTrend,
2556
+ slowResponseThresholdSeconds,
2513
2557
  onReplay: onCompareWithPrevious === void 0 ? void 0 : () => {
2514
2558
  setReplayOpen(true);
2515
2559
  },
@@ -2834,6 +2878,7 @@ const TurnGroup = reactExports.memo(function TurnGroup2({
2834
2878
  entries,
2835
2879
  viewMode,
2836
2880
  strip,
2881
+ slowResponseThresholdSeconds,
2837
2882
  cacheTrends,
2838
2883
  onCompareWithPrevious,
2839
2884
  comparisonPredecessors,
@@ -2897,6 +2942,7 @@ const TurnGroup = reactExports.memo(function TurnGroup2({
2897
2942
  const StartCrab = reactExports.useMemo(() => getCrabVariant(entries[0]?.log.id ?? 0), [entries]);
2898
2943
  const EndCrab = reactExports.useMemo(() => getCrabVariant(entries[lastIdx]?.log.id ?? 0), [entries, lastIdx]);
2899
2944
  const bgClass = turnIndex % 2 === 0 ? "bg-muted/10" : "bg-muted/25";
2945
+ const aggregateIsSlow = aggregate.hasElapsed && slowResponseThresholdSeconds > 0 && aggregate.totalElapsed > slowResponseThresholdSeconds * 1e3;
2900
2946
  const [layoutVersion, setLayoutVersion] = reactExports.useState(0);
2901
2947
  const containerRef = reactExports.useRef(null);
2902
2948
  reactExports.useEffect(() => {
@@ -3017,10 +3063,25 @@ const TurnGroup = reactExports.memo(function TurnGroup2({
3017
3063
  entries.length > 1 ? "s" : ""
3018
3064
  ] }),
3019
3065
  uniqueProviders.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "flex items-center gap-0.5 shrink-0", children: uniqueProviders.map((p) => /* @__PURE__ */ jsxRuntimeExports.jsx(ProviderLogo, { provider: p, className: "size-4" }, p)) }),
3020
- aggregate.hasElapsed && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "flex items-center gap-1 text-muted-foreground shrink-0", children: [
3021
- /* @__PURE__ */ jsxRuntimeExports.jsx(Clock, { className: "size-3" }),
3022
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono tabular-nums", children: formatElapsed(aggregate.totalElapsed) })
3023
- ] }),
3066
+ aggregate.hasElapsed && /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipProvider, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Tooltip, { children: [
3067
+ /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
3068
+ "span",
3069
+ {
3070
+ className: cn(
3071
+ "flex items-center gap-1 shrink-0",
3072
+ aggregateIsSlow ? "text-amber-400" : "text-muted-foreground"
3073
+ ),
3074
+ children: [
3075
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Clock, { className: "size-3" }),
3076
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono tabular-nums", children: formatElapsed(aggregate.totalElapsed) }),
3077
+ aggregateIsSlow && /* @__PURE__ */ jsxRuntimeExports.jsx(TriangleAlert, { className: "size-3", "aria-label": "Slow response" })
3078
+ ]
3079
+ }
3080
+ ) }),
3081
+ /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipContent, { children: aggregateIsSlow ? `Slow response: ${formatElapsed(
3082
+ aggregate.totalElapsed
3083
+ )} exceeds ${formatElapsed(slowResponseThresholdSeconds * 1e3)}` : "Total elapsed response time" })
3084
+ ] }) }),
3024
3085
  aggregate.hasTokens && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "flex items-center gap-1 shrink-0", children: [
3025
3086
  /* @__PURE__ */ jsxRuntimeExports.jsx(Zap, { className: "size-3 text-muted-foreground" }),
3026
3087
  /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "font-mono tabular-nums", children: [
@@ -3069,6 +3130,7 @@ const TurnGroup = reactExports.memo(function TurnGroup2({
3069
3130
  log,
3070
3131
  viewMode,
3071
3132
  strip,
3133
+ slowResponseThresholdSeconds,
3072
3134
  cacheTrend: cacheTrends?.get(log.id) ?? null,
3073
3135
  onCompareWithPrevious: comparisonPredecessors.has(log.id) ? onCompareWithPrevious : void 0
3074
3136
  }
@@ -3092,6 +3154,7 @@ const ConversationGroup = reactExports.memo(function({
3092
3154
  group,
3093
3155
  viewMode = "simple",
3094
3156
  strip,
3157
+ slowResponseThresholdSeconds,
3095
3158
  cacheTrends,
3096
3159
  onCompareWithPrevious,
3097
3160
  comparisonPredecessors,
@@ -3131,6 +3194,7 @@ const ConversationGroup = reactExports.memo(function({
3131
3194
  entries: tg.entries,
3132
3195
  viewMode,
3133
3196
  strip,
3197
+ slowResponseThresholdSeconds,
3134
3198
  cacheTrends,
3135
3199
  onCompareWithPrevious,
3136
3200
  comparisonPredecessors,
@@ -4919,7 +4983,13 @@ function SettingsDialog() {
4919
4983
  ] });
4920
4984
  }
4921
4985
  function ProxySettingsTab() {
4922
- const { strip, isLoading, setStrip } = useStripConfig();
4986
+ const {
4987
+ strip,
4988
+ slowResponseThresholdSeconds,
4989
+ isLoading,
4990
+ setStrip,
4991
+ setSlowResponseThresholdSeconds
4992
+ } = useStripConfig();
4923
4993
  const [error, setError] = reactExports.useState(null);
4924
4994
  const [pending, setPending] = reactExports.useState(false);
4925
4995
  const handleToggle = reactExports.useCallback(
@@ -4936,6 +5006,20 @@ function ProxySettingsTab() {
4936
5006
  },
4937
5007
  [setStrip]
4938
5008
  );
5009
+ const handleThresholdChange = reactExports.useCallback(
5010
+ async (next) => {
5011
+ setError(null);
5012
+ setPending(true);
5013
+ try {
5014
+ await setSlowResponseThresholdSeconds(next);
5015
+ } catch (err) {
5016
+ setError(err instanceof Error ? err.message : String(err));
5017
+ } finally {
5018
+ setPending(false);
5019
+ }
5020
+ },
5021
+ [setSlowResponseThresholdSeconds]
5022
+ );
4939
5023
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-4", children: [
4940
5024
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1", children: [
4941
5025
  /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-sm font-semibold", children: "Claude Code billing header" }),
@@ -4965,6 +5049,36 @@ function ProxySettingsTab() {
4965
5049
  ),
4966
5050
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-sm", children: isLoading ? "Loading…" : strip ? "Stripping enabled" : "Stripping disabled" })
4967
5051
  ] }),
5052
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1", children: [
5053
+ /* @__PURE__ */ jsxRuntimeExports.jsx("label", { htmlFor: "slow-response-threshold", className: "text-sm font-semibold", children: "Slow response threshold" }),
5054
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-xs text-muted-foreground", children: [
5055
+ "Logs whose elapsed time exceeds this many seconds show a warning icon next to the duration. Set to ",
5056
+ /* @__PURE__ */ jsxRuntimeExports.jsx("code", { children: "0" }),
5057
+ " to disable the indicator."
5058
+ ] }),
5059
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [
5060
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
5061
+ "input",
5062
+ {
5063
+ id: "slow-response-threshold",
5064
+ type: "number",
5065
+ min: 0,
5066
+ max: MAX_SLOW_RESPONSE_THRESHOLD_SECONDS,
5067
+ step: 1,
5068
+ value: slowResponseThresholdSeconds,
5069
+ disabled: isLoading || pending,
5070
+ onChange: (e) => {
5071
+ const next = Number(e.currentTarget.value);
5072
+ if (!Number.isInteger(next)) return;
5073
+ if (next < 0 || next > MAX_SLOW_RESPONSE_THRESHOLD_SECONDS) return;
5074
+ void handleThresholdChange(next);
5075
+ },
5076
+ className: "h-8 w-24 rounded-md border border-input bg-transparent px-2 text-sm font-mono disabled:cursor-not-allowed disabled:opacity-50"
5077
+ }
5078
+ ),
5079
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs text-muted-foreground", children: "seconds" })
5080
+ ] })
5081
+ ] }),
4968
5082
  error !== null && /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-xs text-destructive", children: [
4969
5083
  "Failed to save: ",
4970
5084
  error
@@ -5214,7 +5328,8 @@ function ProxyViewer({
5214
5328
  onClearGroup,
5215
5329
  viewMode,
5216
5330
  onViewModeChange,
5217
- strip
5331
+ strip,
5332
+ slowResponseThresholdSeconds
5218
5333
  }) {
5219
5334
  const { totalIn, totalOut } = reactExports.useMemo(() => computeTokenSummary(logs), [logs]);
5220
5335
  const [exporting, setExporting] = reactExports.useState(false);
@@ -5344,7 +5459,7 @@ function ProxyViewer({
5344
5459
  logs.length,
5345
5460
  " request",
5346
5461
  logs.length !== 1 ? "s" : "",
5347
- totalIn > 0 || totalOut > 0 ? ` · ${totalIn.toLocaleString()} in / ${totalOut.toLocaleString()} out` : ""
5462
+ totalIn > 0 || totalOut > 0 ? ` · ${formatTokens(totalIn)} in / ${formatTokens(totalOut)} out` : ""
5348
5463
  ] }),
5349
5464
  logs.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx(
5350
5465
  "button",
@@ -5389,6 +5504,7 @@ function ProxyViewer({
5389
5504
  group,
5390
5505
  viewMode,
5391
5506
  strip,
5507
+ slowResponseThresholdSeconds,
5392
5508
  cacheTrends,
5393
5509
  onCompareWithPrevious: handleCompareWithPrevious,
5394
5510
  comparisonPredecessors,
@@ -5589,7 +5705,7 @@ function ProxyViewerContainer() {
5589
5705
  }
5590
5706
  })();
5591
5707
  }, []);
5592
- const { strip } = useStripConfig();
5708
+ const { strip, slowResponseThresholdSeconds } = useStripConfig();
5593
5709
  return /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
5594
5710
  error !== null && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "fixed top-4 right-4 bg-destructive text-destructive-foreground px-4 py-2 rounded-md text-sm z-50", children: error }),
5595
5711
  /* @__PURE__ */ jsxRuntimeExports.jsx(OnboardingBanner, {}),
@@ -5607,7 +5723,8 @@ function ProxyViewerContainer() {
5607
5723
  onClearGroup: handleClearGroup,
5608
5724
  viewMode,
5609
5725
  onViewModeChange: setViewMode,
5610
- strip
5726
+ strip,
5727
+ slowResponseThresholdSeconds
5611
5728
  }
5612
5729
  )
5613
5730
  ] });
@@ -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-DmOZEcJ3.mjs");
201
+ const { tsrStartManifest } = await import("../_tanstack-start-manifest_v-D0JtrQPv.mjs");
202
202
  const startManifest = tsrStartManifest();
203
203
  const rootRoute = startManifest.routes[rootRouteId] = startManifest.routes[rootRouteId] || {};
204
204
  rootRoute.assets = rootRoute.assets || [];
@@ -767,7 +767,7 @@ let entriesPromise;
767
767
  let baseManifestPromise;
768
768
  let cachedFinalManifestPromise;
769
769
  async function loadEntries() {
770
- const routerEntry = await import("./router-BrdjOUEW.mjs").then((n) => n.e);
770
+ const routerEntry = await import("./router-DG_jmXCF.mjs").then((n) => n.e);
771
771
  const startEntry = await import("./start-HYkvq4Ni.mjs");
772
772
  return { startEntry, routerEntry };
773
773
  }
@@ -1,6 +1,6 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "../_libs/react.mjs";
2
- import { q as parseJsonText, c as cn, k as TooltipProvider, l as Tooltip, m as TooltipTrigger, n as TooltipContent } from "./index-CDjLoMsk.mjs";
3
- import "./router-BrdjOUEW.mjs";
2
+ import { q as parseJsonText, c as cn, k as TooltipProvider, l as Tooltip, m as TooltipTrigger, n as TooltipContent } from "./index-nUG0H1oS.mjs";
3
+ import "./router-DG_jmXCF.mjs";
4
4
  import "../_libs/modelcontextprotocol__server.mjs";
5
5
  import "../_libs/jszip.mjs";
6
6
  import { C as Check, c as Copy, a as ChevronDown, f as ChevronRight, r as ChevronsDown } from "../_libs/lucide-react.mjs";
@@ -46,7 +46,7 @@ import "../_libs/debounce-fn.mjs";
46
46
  import "../_libs/mimic-function.mjs";
47
47
  import "../_libs/semver.mjs";
48
48
  import "../_libs/uint8array-extras.mjs";
49
- const appCss = "/assets/index-BGzHFOEX.css";
49
+ const appCss = "/assets/index-DoGvsnbA.css";
50
50
  const Route$k = createRootRoute({
51
51
  head: () => ({
52
52
  meta: [
@@ -70,7 +70,7 @@ function RootDocument({ children }) {
70
70
  ] })
71
71
  ] });
72
72
  }
73
- const $$splitComponentImporter = () => import("./index-CDjLoMsk.mjs").then((n) => n.t);
73
+ const $$splitComponentImporter = () => import("./index-nUG0H1oS.mjs").then((n) => n.t);
74
74
  const Route$j = createFileRoute("/")({
75
75
  component: lazyRouteComponent($$splitComponentImporter, "component")
76
76
  });
@@ -2158,9 +2158,12 @@ async function getClientInfo(request) {
2158
2158
  inflight.set(port, promise);
2159
2159
  return promise;
2160
2160
  }
2161
+ const DEFAULT_SLOW_RESPONSE_THRESHOLD_SECONDS = 10;
2162
+ const MAX_SLOW_RESPONSE_THRESHOLD_SECONDS = 600;
2161
2163
  const RuntimeConfigSchema = object({
2162
2164
  stripClaudeCodeBillingHeader: boolean(),
2163
- hasSeenOnboarding: boolean().default(false)
2165
+ hasSeenOnboarding: boolean().default(false),
2166
+ slowResponseThresholdSeconds: number().int().min(0).max(MAX_SLOW_RESPONSE_THRESHOLD_SECONDS).default(DEFAULT_SLOW_RESPONSE_THRESHOLD_SECONDS)
2164
2167
  });
2165
2168
  function getConfigFilePath() {
2166
2169
  return join(getDataDir(), "config.json");
@@ -2190,9 +2193,17 @@ function resolveInitialConfig() {
2190
2193
  }
2191
2194
  }
2192
2195
  if (process.env["LLM_INSPECTOR_STRIP_CLAUDE_CODE_BILLING_HEADER"] === "1") {
2193
- return { stripClaudeCodeBillingHeader: true, hasSeenOnboarding: false };
2196
+ return {
2197
+ stripClaudeCodeBillingHeader: true,
2198
+ hasSeenOnboarding: false,
2199
+ slowResponseThresholdSeconds: DEFAULT_SLOW_RESPONSE_THRESHOLD_SECONDS
2200
+ };
2194
2201
  }
2195
- return { stripClaudeCodeBillingHeader: false, hasSeenOnboarding: false };
2202
+ return {
2203
+ stripClaudeCodeBillingHeader: false,
2204
+ hasSeenOnboarding: false,
2205
+ slowResponseThresholdSeconds: DEFAULT_SLOW_RESPONSE_THRESHOLD_SECONDS
2206
+ };
2196
2207
  }
2197
2208
  function getConfig() {
2198
2209
  return currentConfig;
@@ -3279,7 +3290,8 @@ const Route$c = createFileRoute("/api/health")({
3279
3290
  });
3280
3291
  const RuntimeConfigPatchSchema = object({
3281
3292
  stripClaudeCodeBillingHeader: boolean().optional(),
3282
- hasSeenOnboarding: boolean().optional()
3293
+ hasSeenOnboarding: boolean().optional(),
3294
+ slowResponseThresholdSeconds: number().int().min(0).max(MAX_SLOW_RESPONSE_THRESHOLD_SECONDS).optional()
3283
3295
  }).strict().refine((v) => Object.keys(v).length > 0, {
3284
3296
  message: "At least one field must be provided"
3285
3297
  });
@@ -5016,6 +5028,8 @@ const router = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProper
5016
5028
  export {
5017
5029
  AnthropicResponseSchema$1 as A,
5018
5030
  CapturedLogSchema as C,
5031
+ DEFAULT_SLOW_RESPONSE_THRESHOLD_SECONDS as D,
5032
+ MAX_SLOW_RESPONSE_THRESHOLD_SECONDS as M,
5019
5033
  OpenAIRequestSchema as O,
5020
5034
  ProviderTestResultsSchema as P,
5021
5035
  RuntimeConfigSchema as R,
@@ -1,4 +1,4 @@
1
- const tsrStartManifest = () => ({ "routes": { "__root__": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/__root.tsx", "children": ["/", "/api/config", "/api/health", "/api/logs", "/api/mcp", "/api/models", "/api/providers", "/api/sessions", "/proxy/$"], "preloads": ["/assets/main-CDMdNDY_.js"], "assets": [] }, "/": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/index.tsx", "assets": [], "preloads": ["/assets/index-DX88k9br.js"] }, "/api/config": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/config.ts", "children": ["/api/config/paths"] }, "/api/health": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/health.ts" }, "/api/logs": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/logs.ts", "children": ["/api/logs/$id", "/api/logs/stream"] }, "/api/mcp": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/mcp.ts" }, "/api/models": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/models.ts" }, "/api/providers": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/providers.ts", "children": ["/api/providers/$providerId", "/api/providers/export", "/api/providers/import", "/api/providers/scan"] }, "/api/sessions": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/sessions.ts" }, "/proxy/$": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/proxy/$.ts" }, "/api/config/paths": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/config.paths.ts" }, "/api/logs/$id": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/logs.$id.ts", "children": ["/api/logs/$id/chunks", "/api/logs/$id/replay"] }, "/api/logs/stream": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/logs.stream.ts" }, "/api/providers/$providerId": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/providers.$providerId.ts", "children": ["/api/providers/$providerId/test"] }, "/api/providers/export": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/providers.export.ts" }, "/api/providers/import": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/providers.import.ts" }, "/api/providers/scan": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/providers.scan.ts" }, "/api/logs/$id/chunks": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/logs.$id.chunks.ts" }, "/api/logs/$id/replay": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/logs.$id.replay.ts" }, "/api/providers/$providerId/test": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/providers.$providerId.test.ts", "children": ["/api/providers/$providerId/test/log"] }, "/api/providers/$providerId/test/log": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/providers.$providerId.test.log.ts" } }, "clientEntry": "/assets/main-CDMdNDY_.js" });
1
+ const tsrStartManifest = () => ({ "routes": { "__root__": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/__root.tsx", "children": ["/", "/api/config", "/api/health", "/api/logs", "/api/mcp", "/api/models", "/api/providers", "/api/sessions", "/proxy/$"], "preloads": ["/assets/main-Dgme52Fp.js"], "assets": [] }, "/": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/index.tsx", "assets": [], "preloads": ["/assets/index-B4nxi_tZ.js"] }, "/api/config": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/config.ts", "children": ["/api/config/paths"] }, "/api/health": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/health.ts" }, "/api/logs": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/logs.ts", "children": ["/api/logs/$id", "/api/logs/stream"] }, "/api/mcp": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/mcp.ts" }, "/api/models": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/models.ts" }, "/api/providers": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/providers.ts", "children": ["/api/providers/$providerId", "/api/providers/export", "/api/providers/import", "/api/providers/scan"] }, "/api/sessions": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/sessions.ts" }, "/proxy/$": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/proxy/$.ts" }, "/api/config/paths": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/config.paths.ts" }, "/api/logs/$id": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/logs.$id.ts", "children": ["/api/logs/$id/chunks", "/api/logs/$id/replay"] }, "/api/logs/stream": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/logs.stream.ts" }, "/api/providers/$providerId": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/providers.$providerId.ts", "children": ["/api/providers/$providerId/test"] }, "/api/providers/export": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/providers.export.ts" }, "/api/providers/import": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/providers.import.ts" }, "/api/providers/scan": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/providers.scan.ts" }, "/api/logs/$id/chunks": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/logs.$id.chunks.ts" }, "/api/logs/$id/replay": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/logs.$id.replay.ts" }, "/api/providers/$providerId/test": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/providers.$providerId.test.ts", "children": ["/api/providers/$providerId/test/log"] }, "/api/providers/$providerId/test/log": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/providers.$providerId.test.log.ts" } }, "clientEntry": "/assets/main-Dgme52Fp.js" });
2
2
  export {
3
3
  tsrStartManifest
4
4
  };