@tonyclaw/agent-inspector 2.1.14 → 2.1.16

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 (70) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/assets/CompareDrawer-Ccrrcx1j.js +1 -0
  3. package/.output/public/assets/ProxyViewerContainer-DLqClc9A.js +106 -0
  4. package/.output/public/assets/ReplayDialog-C7axhr-l.js +1 -0
  5. package/.output/public/assets/{RequestAnatomy-BNahe83D.js → RequestAnatomy-WOptg8j_.js} +1 -1
  6. package/.output/public/assets/{ResponseView-DSOnGqi6.js → ResponseView-CSAcxh_M.js} +2 -2
  7. package/.output/public/assets/{StreamingChunkSequence-BEKTDklB.js → StreamingChunkSequence-DJS5KhPx.js} +1 -1
  8. package/.output/public/assets/_sessionId-DUSalzKH.js +1 -0
  9. package/.output/public/assets/index-BPpA21dY.css +1 -0
  10. package/.output/public/assets/index-Bt0Az2I2.js +1 -0
  11. package/.output/public/assets/{index-DWOkqdCa.js → index-DMPNh46t.js} +1 -1
  12. package/.output/public/assets/{json-viewer-C2JpgcW0.js → json-viewer-inX5QSa3.js} +1 -1
  13. package/.output/public/assets/{main-CSONBwwn.js → main-aCAKYGSD.js} +2 -2
  14. package/.output/server/_libs/lucide-react.mjs +224 -194
  15. package/.output/server/{_sessionId-CPAa37n5.mjs → _sessionId-C0fhvQnn.mjs} +2 -2
  16. package/.output/server/_ssr/{CompareDrawer-ceW5VxMo.mjs → CompareDrawer-CO-Ti5sg.mjs} +36 -15
  17. package/.output/server/_ssr/{ProxyViewerContainer-CDfEE_w-.mjs → ProxyViewerContainer-N4J7uBCX.mjs} +1153 -494
  18. package/.output/server/_ssr/{ReplayDialog-V0s_eEbR.mjs → ReplayDialog-J1VxC0In.mjs} +14 -7
  19. package/.output/server/_ssr/{RequestAnatomy-f1ccwR9d.mjs → RequestAnatomy-DBH-F3rq.mjs} +3 -3
  20. package/.output/server/_ssr/{ResponseView-BIRrqG4H.mjs → ResponseView-DLFwV7Hd.mjs} +3 -3
  21. package/.output/server/_ssr/{StreamingChunkSequence-V3JFjCgX.mjs → StreamingChunkSequence-BywmuND0.mjs} +3 -3
  22. package/.output/server/_ssr/{index-DsykulzS.mjs → index-CStymIc0.mjs} +2 -2
  23. package/.output/server/_ssr/index.mjs +2 -2
  24. package/.output/server/_ssr/{json-viewer-Dcnm0Ivf.mjs → json-viewer-DlQu0N1x.mjs} +3 -3
  25. package/.output/server/_ssr/{router-4bdm6Mt2.mjs → router-CQ4Zxhmr.mjs} +118 -47
  26. package/.output/server/{_tanstack-start-manifest_v-Xp4CO64V.mjs → _tanstack-start-manifest_v-BHeJBGfo.mjs} +1 -1
  27. package/.output/server/index.mjs +75 -75
  28. package/package.json +1 -1
  29. package/src/components/ProxyViewer.tsx +174 -107
  30. package/src/components/ProxyViewerContainer.tsx +77 -67
  31. package/src/components/alerts/AlertsDialog.tsx +2 -1
  32. package/src/components/clients/ClientLogo.tsx +132 -0
  33. package/src/components/groups/GroupsDialog.tsx +37 -14
  34. package/src/components/providers/ProviderCard.tsx +1 -1
  35. package/src/components/providers/ProviderForm.tsx +18 -18
  36. package/src/components/providers/ProviderLogo.tsx +6 -1
  37. package/src/components/providers/ProvidersPanel.tsx +6 -6
  38. package/src/components/providers/SettingsDialog.tsx +13 -6
  39. package/src/components/proxy-viewer/AgentTraceSummary.tsx +62 -29
  40. package/src/components/proxy-viewer/CompareDrawer.tsx +38 -8
  41. package/src/components/proxy-viewer/ConversationGroup.tsx +43 -32
  42. package/src/components/proxy-viewer/ConversationGroupList.tsx +452 -89
  43. package/src/components/proxy-viewer/ConversationHeader.tsx +65 -61
  44. package/src/components/proxy-viewer/LogEntry.tsx +31 -18
  45. package/src/components/proxy-viewer/LogEntryHeader.tsx +42 -49
  46. package/src/components/proxy-viewer/ProviderLogoStack.tsx +60 -0
  47. package/src/components/proxy-viewer/ReplayDialog.tsx +8 -2
  48. package/src/components/proxy-viewer/RequestToolsPanel.tsx +9 -9
  49. package/src/components/proxy-viewer/ThreadConnector.tsx +22 -11
  50. package/src/components/proxy-viewer/TurnGroup.tsx +30 -36
  51. package/src/components/proxy-viewer/TurnGroupList.tsx +3 -0
  52. package/src/components/proxy-viewer/viewerState.ts +5 -6
  53. package/src/components/ui/icon-trigger.ts +2 -0
  54. package/src/components/ui/transient-toast.tsx +104 -0
  55. package/src/lib/sessionInfoContract.ts +5 -0
  56. package/src/lib/stopReason.ts +48 -16
  57. package/src/mcp/server.ts +71 -27
  58. package/src/mcp/toolHandlers.ts +23 -4
  59. package/src/proxy/formats/openai/alibabaProvider.ts +0 -4
  60. package/src/proxy/sessionInfo.ts +36 -3
  61. package/src/proxy/sessionSupervisor.ts +20 -1
  62. package/src/proxy/store.ts +1 -1
  63. package/src/routes/api/providers.$providerId.test.log.ts +8 -4
  64. package/styles/globals.css +180 -180
  65. package/.output/public/assets/CompareDrawer-DjgjIFx7.js +0 -1
  66. package/.output/public/assets/ProxyViewerContainer-CWUQZLYy.js +0 -106
  67. package/.output/public/assets/ReplayDialog-CU0Tbb2c.js +0 -1
  68. package/.output/public/assets/_sessionId-Cif8JZdn.js +0 -1
  69. package/.output/public/assets/index-D_WfwzUi.js +0 -1
  70. package/.output/public/assets/index-DtLuQrs0.css +0 -1
@@ -1,10 +1,10 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "../_libs/react.mjs";
2
- import { u as useProviders, D as Dialog, d as DialogContent, e as DialogHeader, h as DialogTitle, T as Tabs, i as TabsList, j as TabsTrigger, k as TabsContent, l as Button, m as TooltipProvider, n as Tooltip, o as TooltipTrigger, p as TooltipContent, q as dispatchLogFocusRequest } from "./ProxyViewerContainer-CDfEE_w-.mjs";
3
- import { ResponseView } from "./ResponseView-BIRrqG4H.mjs";
4
- import { C as CapturedLogSchema } from "./router-4bdm6Mt2.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-N4J7uBCX.mjs";
3
+ import { ResponseView } from "./ResponseView-DLFwV7Hd.mjs";
4
+ import { C as CapturedLogSchema } from "./router-CQ4Zxhmr.mjs";
5
5
  import "../_libs/jszip.mjs";
6
6
  import "../_libs/modelcontextprotocol__server.mjs";
7
- import { aa as RotateCcw, an as Braces, ao as Minimize2 } from "../_libs/lucide-react.mjs";
7
+ import { ac as RotateCcw, ap as Braces, aq as Minimize2 } from "../_libs/lucide-react.mjs";
8
8
  import { d as object, n as number, a as array, c as boolean, b as string } from "../_libs/zod.mjs";
9
9
  import "../_libs/swr.mjs";
10
10
  import "../_libs/use-sync-external-store.mjs";
@@ -315,7 +315,12 @@ function ReplayComparisonTable({
315
315
  ))
316
316
  ] });
317
317
  }
318
- function ReplayDialog({ log, open, onOpenChange }) {
318
+ function ReplayDialog({
319
+ log,
320
+ displayNumber,
321
+ open,
322
+ onOpenChange
323
+ }) {
319
324
  const { providers } = useProviders();
320
325
  const originalBody = log.rawRequestBody ?? "{}";
321
326
  const [modifiedBody, setModifiedBody] = reactExports.useState(() => {
@@ -442,8 +447,10 @@ function ReplayDialog({ log, open, onOpenChange }) {
442
447
  return /* @__PURE__ */ jsxRuntimeExports.jsx(Dialog, { open, onOpenChange: handleClose, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogContent, { className: "max-w-4xl max-h-[85vh] overflow-auto", children: [
443
448
  /* @__PURE__ */ jsxRuntimeExports.jsx(DialogHeader, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogTitle, { className: "flex items-center gap-2", children: [
444
449
  /* @__PURE__ */ jsxRuntimeExports.jsx(RotateCcw, { className: "size-4" }),
445
- "Replay Request #",
446
- log.id
450
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { title: `Log ID ${String(log.id)}`, children: [
451
+ "Replay Request #",
452
+ displayNumber
453
+ ] })
447
454
  ] }) }),
448
455
  /* @__PURE__ */ jsxRuntimeExports.jsxs(Tabs, { defaultValue: "modified", children: [
449
456
  /* @__PURE__ */ jsxRuntimeExports.jsxs(TabsList, { children: [
@@ -1,9 +1,9 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "../_libs/react.mjs";
2
- import { u as useProviders, s as analyzeContextIntelligence, f as formatTokens, m as TooltipProvider, c as cn, n as Tooltip, o as TooltipTrigger, p as TooltipContent, S as SegmentBar, R as ROLE_COLOR_CLASSES, A as ANATOMY_ROLE_LABELS, t as formatContextWindowTokens, C as CONTEXT_USAGE_THRESHOLDS } from "./ProxyViewerContainer-CDfEE_w-.mjs";
3
- import "./router-4bdm6Mt2.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-N4J7uBCX.mjs";
3
+ import "./router-CQ4Zxhmr.mjs";
4
4
  import "../_libs/modelcontextprotocol__server.mjs";
5
5
  import "../_libs/jszip.mjs";
6
- import { I as Info, C as ChevronDown, f as ChevronRight } from "../_libs/lucide-react.mjs";
6
+ import { I as Info, a as ChevronDown, h as ChevronRight } from "../_libs/lucide-react.mjs";
7
7
  import "../_libs/swr.mjs";
8
8
  import "../_libs/use-sync-external-store.mjs";
9
9
  import "../_libs/dequal.mjs";
@@ -1,9 +1,9 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "../_libs/react.mjs";
2
- import { g as getLogFormatAdapter, f as formatTokens, c as cn, v as getStatusCategory, B as Badge, w as Collapsible, x as CollapsibleTrigger, y as CollapsibleContent, z as ScrollArea, E as LazyJsonViewer, F as safeJsonValue } from "./ProxyViewerContainer-CDfEE_w-.mjs";
3
- import { s as safeGetOwnProperty } from "./router-4bdm6Mt2.mjs";
2
+ import { g as getLogFormatAdapter, f as formatTokens, c as cn, v as getStatusCategory, B as Badge, w as Collapsible, x as CollapsibleTrigger, y as CollapsibleContent, z as ScrollArea, E as LazyJsonViewer, F as safeJsonValue } from "./ProxyViewerContainer-N4J7uBCX.mjs";
3
+ import { s as safeGetOwnProperty } from "./router-CQ4Zxhmr.mjs";
4
4
  import "../_libs/jszip.mjs";
5
5
  import "../_libs/modelcontextprotocol__server.mjs";
6
- import { Z as Zap, r as TriangleAlert, ap as CircleStop, B as Brain, C as ChevronDown, f as ChevronRight, m as Terminal } from "../_libs/lucide-react.mjs";
6
+ import { Z as Zap, T as TriangleAlert, ar as CircleStop, J as Brain, a as ChevronDown, h as ChevronRight, o as Terminal } from "../_libs/lucide-react.mjs";
7
7
  import { R as Root } from "../_libs/radix-ui__react-separator.mjs";
8
8
  import "../_libs/swr.mjs";
9
9
  import "../_libs/use-sync-external-store.mjs";
@@ -1,9 +1,9 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "../_libs/react.mjs";
2
- import { m as TooltipProvider, n as Tooltip, o as TooltipTrigger, B as Badge, p as TooltipContent, E as LazyJsonViewer } from "./ProxyViewerContainer-CDfEE_w-.mjs";
3
- import "./router-4bdm6Mt2.mjs";
2
+ import { m as TooltipProvider, n as Tooltip, o as TooltipTrigger, B as Badge, p as TooltipContent, E as LazyJsonViewer } from "./ProxyViewerContainer-N4J7uBCX.mjs";
3
+ import "./router-CQ4Zxhmr.mjs";
4
4
  import "../_libs/modelcontextprotocol__server.mjs";
5
5
  import "../_libs/jszip.mjs";
6
- import { C as ChevronDown, f as ChevronRight, L as LoaderCircle } from "../_libs/lucide-react.mjs";
6
+ import { a as ChevronDown, h as ChevronRight, L as LoaderCircle } from "../_libs/lucide-react.mjs";
7
7
  import "../_libs/swr.mjs";
8
8
  import "../_libs/use-sync-external-store.mjs";
9
9
  import "../_libs/dequal.mjs";
@@ -1,6 +1,6 @@
1
- import { P as ProxyViewerContainer } from "./ProxyViewerContainer-CDfEE_w-.mjs";
1
+ import { P as ProxyViewerContainer } from "./ProxyViewerContainer-N4J7uBCX.mjs";
2
2
  import "../_libs/react.mjs";
3
- import "./router-4bdm6Mt2.mjs";
3
+ import "./router-CQ4Zxhmr.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-Xp4CO64V.mjs");
201
+ const { tsrStartManifest } = await import("../_tanstack-start-manifest_v-BHeJBGfo.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-4bdm6Mt2.mjs").then((n) => n.E);
779
+ const routerEntry = await import("./router-CQ4Zxhmr.mjs").then((n) => n.E);
780
780
  const startEntry = await import("./start-HYkvq4Ni.mjs");
781
781
  return { startEntry, routerEntry };
782
782
  }
@@ -1,9 +1,9 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "../_libs/react.mjs";
2
- import { G as parseJsonText, c as cn, m as TooltipProvider, n as Tooltip, o as TooltipTrigger, p as TooltipContent, b as copyTextToClipboard } from "./ProxyViewerContainer-CDfEE_w-.mjs";
3
- import "./router-4bdm6Mt2.mjs";
2
+ import { G as parseJsonText, c as cn, m as TooltipProvider, n as Tooltip, o as TooltipTrigger, p as TooltipContent, b as copyTextToClipboard } from "./ProxyViewerContainer-N4J7uBCX.mjs";
3
+ import "./router-CQ4Zxhmr.mjs";
4
4
  import "../_libs/modelcontextprotocol__server.mjs";
5
5
  import "../_libs/jszip.mjs";
6
- import { a as Check, c as Copy, C as ChevronDown, f as ChevronRight, a7 as ChevronsDown } from "../_libs/lucide-react.mjs";
6
+ import { b as Check, e as Copy, a as ChevronDown, h as ChevronRight, a9 as ChevronsDown } from "../_libs/lucide-react.mjs";
7
7
  import "../_libs/swr.mjs";
8
8
  import "../_libs/use-sync-external-store.mjs";
9
9
  import "../_libs/dequal.mjs";
@@ -65,7 +65,7 @@ import "../_libs/immediate.mjs";
65
65
  import "../_libs/setimmediate.mjs";
66
66
  import "../_libs/pako.mjs";
67
67
  const faviconSvg = "data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20role='img'%20aria-label='Agent%20Inspector'%3e%3cg%20fill='none'%20stroke='%23f59e0b'%20stroke-width='1.5'%20stroke-linecap='round'%20stroke-linejoin='round'%20%3e%3cpath%20d='M5%2013%20C5%209%208%207%2012%207%20C16%207%2019%209%2019%2013%20C19%2016%2016%2018%2012%2018%20C8%2018%205%2016%205%2013%20Z'%20/%3e%3cpath%20d='M5%2011%20C3.5%209.5%201.5%2010%202%2012.5%20C2.5%2014%204%2013.5%205%2012.5'%20/%3e%3cpath%20d='M19%2011%20C20.5%209.5%2022.5%2010%2022%2012.5%20C21.5%2014%2020%2013.5%2019%2012.5'%20/%3e%3cline%20x1='10'%20y1='7'%20x2='9.5'%20y2='5'%20/%3e%3cline%20x1='14'%20y1='7'%20x2='14.5'%20y2='5'%20/%3e%3cline%20x1='6.5'%20y1='16'%20x2='4.5'%20y2='19.5'%20/%3e%3cline%20x1='9'%20y1='17.5'%20x2='8'%20y2='20.5'%20/%3e%3cline%20x1='15'%20y1='17.5'%20x2='16'%20y2='20.5'%20/%3e%3cline%20x1='17.5'%20y1='16'%20x2='19.5'%20y2='19.5'%20/%3e%3c/g%3e%3ccircle%20cx='9.5'%20cy='4.5'%20r='0.9'%20fill='%23f59e0b'%20/%3e%3ccircle%20cx='14.5'%20cy='4.5'%20r='0.9'%20fill='%23f59e0b'%20/%3e%3c/svg%3e";
68
- const appCss = "/assets/index-DtLuQrs0.css";
68
+ const appCss = "/assets/index-BPpA21dY.css";
69
69
  const Route$D = createRootRoute({
70
70
  head: () => ({
71
71
  meta: [
@@ -108,7 +108,7 @@ function RootDocument({ children }) {
108
108
  ] })
109
109
  ] });
110
110
  }
111
- const $$splitComponentImporter$1 = () => import("./index-DsykulzS.mjs");
111
+ const $$splitComponentImporter$1 = () => import("./index-CStymIc0.mjs");
112
112
  const Route$C = createFileRoute("/")({
113
113
  component: lazyRouteComponent($$splitComponentImporter$1, "component")
114
114
  });
@@ -151,7 +151,7 @@ function decodeSessionIdFromPath(encoded) {
151
151
  function getSessionPath(sessionId) {
152
152
  return `/session/${encodeSessionIdForPath(sessionId)}`;
153
153
  }
154
- const $$splitComponentImporter = () => import("../_sessionId-CPAa37n5.mjs");
154
+ const $$splitComponentImporter = () => import("../_sessionId-C0fhvQnn.mjs");
155
155
  const Route$B = createFileRoute("/session/$sessionId")({
156
156
  component: lazyRouteComponent($$splitComponentImporter, "component"),
157
157
  parseParams: (params) => ({
@@ -1849,7 +1849,10 @@ function buildSessionLogSummary(log) {
1849
1849
  cacheCreate: log.cacheCreationInputTokens,
1850
1850
  cacheRead: log.cacheReadInputTokens
1851
1851
  },
1852
- sessionId: normalizeString(log.sessionId)
1852
+ sessionId: normalizeString(log.sessionId),
1853
+ userAgent: normalizeString(log.userAgent),
1854
+ clientPid: log.clientPid ?? null,
1855
+ clientProjectFolder: normalizeString(log.clientProjectFolder)
1853
1856
  };
1854
1857
  }
1855
1858
  function nonNegativeInteger(value) {
@@ -1895,6 +1898,27 @@ function collectSortedValues$1(values) {
1895
1898
  }
1896
1899
  return [...set].sort();
1897
1900
  }
1901
+ function firstSummaryUserAgent(summaries) {
1902
+ for (const summary of summaries) {
1903
+ const value = normalizeString(summary.userAgent);
1904
+ if (value !== null) return value;
1905
+ }
1906
+ return null;
1907
+ }
1908
+ function firstSummaryClientPid(summaries) {
1909
+ for (const summary of summaries) {
1910
+ const value = summary.clientPid;
1911
+ if (value !== null && value !== void 0) return value;
1912
+ }
1913
+ return null;
1914
+ }
1915
+ function firstSummaryProjectFolder(summaries) {
1916
+ for (const summary of summaries) {
1917
+ const value = normalizeString(summary.clientProjectFolder);
1918
+ if (value !== null) return value;
1919
+ }
1920
+ return null;
1921
+ }
1898
1922
  function countCompletedLogs(summaries) {
1899
1923
  let count = 0;
1900
1924
  for (const summary of summaries) {
@@ -1943,6 +1967,10 @@ function buildSessionInfo(input) {
1943
1967
  const inspectorPath = getSessionPath(input.sessionId);
1944
1968
  const apiPath = buildApiPath(input.sessionId);
1945
1969
  const compactLogsPath = buildCompactLogsPath(input.sessionId);
1970
+ const latestLogs = summaries.slice(0, latestLogLimit).map((summary, index) => ({
1971
+ ...summary,
1972
+ sessionLogNumber: Math.max(1, requestCount - index)
1973
+ }));
1946
1974
  return {
1947
1975
  id: input.sessionId,
1948
1976
  status: deriveSessionStatus({
@@ -1973,8 +2001,9 @@ function buildSessionInfo(input) {
1973
2001
  tokenUsage,
1974
2002
  lastLogId: input.snapshot?.lastLogId ?? latestLog?.id ?? null,
1975
2003
  lastModel: normalizeString(input.snapshot?.lastModel) ?? latestLog?.model ?? null,
1976
- clientPid: input.snapshot?.clientPid ?? null,
1977
- clientProjectFolder: normalizeString(input.snapshot?.clientProjectFolder),
2004
+ clientUserAgent: firstSummaryUserAgent(summaries),
2005
+ clientPid: input.snapshot?.clientPid ?? firstSummaryClientPid(summaries),
2006
+ clientProjectFolder: normalizeString(input.snapshot?.clientProjectFolder) ?? firstSummaryProjectFolder(summaries),
1978
2007
  inspectorPath,
1979
2008
  inspectorUrl: buildAbsoluteUrl(input.baseUrl, inspectorPath),
1980
2009
  apiPath,
@@ -1982,7 +2011,7 @@ function buildSessionInfo(input) {
1982
2011
  compactLogsPath,
1983
2012
  compactLogsUrl: buildAbsoluteUrl(input.baseUrl, compactLogsPath),
1984
2013
  latestLogLimit,
1985
- latestLogs: summaries.slice(0, latestLogLimit)
2014
+ latestLogs
1986
2015
  };
1987
2016
  }
1988
2017
  const DEFAULT_UPSTREAM$1 = "https://api.anthropic.com";
@@ -2504,6 +2533,14 @@ function normalizeExplicitSessionId(sessionId) {
2504
2533
  const trimmed = sessionId.trim();
2505
2534
  return trimmed.length > 0 ? trimmed : null;
2506
2535
  }
2536
+ function buildProviderTestSessionId(providerId) {
2537
+ const normalizedProviderId = normalizeExplicitSessionId(providerId);
2538
+ if (normalizedProviderId === null) return PROVIDER_TEST_SESSION_ID;
2539
+ return `${PROVIDER_TEST_SESSION_ID}:${normalizedProviderId}`;
2540
+ }
2541
+ function isProviderTestSessionId(sessionId) {
2542
+ return sessionId === PROVIDER_TEST_SESSION_ID || sessionId.startsWith(`${PROVIDER_TEST_SESSION_ID}:`);
2543
+ }
2507
2544
  function buildClientSessionId(clientInfo) {
2508
2545
  const projectFolder = normalizeExplicitSessionId(clientInfo.projectFolder);
2509
2546
  if (clientInfo.pid !== null) {
@@ -2521,10 +2558,16 @@ function buildClientSessionId(clientInfo) {
2521
2558
  return { id: null, source: null };
2522
2559
  }
2523
2560
  function resolveSessionIdentity(input) {
2561
+ const explicit = normalizeExplicitSessionId(input.explicitSessionId);
2524
2562
  if (input.isTest === true) {
2563
+ if (explicit !== null) {
2564
+ return {
2565
+ id: explicit,
2566
+ source: isProviderTestSessionId(explicit) ? "provider-test" : "explicit"
2567
+ };
2568
+ }
2525
2569
  return { id: PROVIDER_TEST_SESSION_ID, source: "provider-test" };
2526
2570
  }
2527
- const explicit = normalizeExplicitSessionId(input.explicitSessionId);
2528
2571
  if (explicit !== null) {
2529
2572
  return { id: explicit, source: "explicit" };
2530
2573
  }
@@ -4618,9 +4661,6 @@ const alibabaProvider = {
4618
4661
  name: "alibaba",
4619
4662
  matches(model) {
4620
4663
  const m = model.toLowerCase().replace(/\s+/g, "-");
4621
- if (m.startsWith("glm-5")) {
4622
- return true;
4623
- }
4624
4664
  if (m.startsWith("qwen")) {
4625
4665
  return true;
4626
4666
  }
@@ -7483,6 +7523,7 @@ const SessionTokenUsageSchema = object({
7483
7523
  });
7484
7524
  const SessionLogSummarySchema = object({
7485
7525
  id: number().int().positive(),
7526
+ sessionLogNumber: number().int().positive().optional(),
7486
7527
  timestamp: string(),
7487
7528
  provider: string().nullable(),
7488
7529
  model: string().nullable(),
@@ -7503,7 +7544,10 @@ const SessionLogSummarySchema = object({
7503
7544
  cacheCreate: number().nullable(),
7504
7545
  cacheRead: number().nullable()
7505
7546
  }),
7506
- sessionId: string().nullable()
7547
+ sessionId: string().nullable(),
7548
+ userAgent: string().nullable().optional(),
7549
+ clientPid: number().nullable().optional(),
7550
+ clientProjectFolder: string().nullable().optional()
7507
7551
  });
7508
7552
  const SessionInfoSchema = object({
7509
7553
  id: string(),
@@ -7527,6 +7571,7 @@ const SessionInfoSchema = object({
7527
7571
  tokenUsage: SessionTokenUsageSchema,
7528
7572
  lastLogId: number().nullable(),
7529
7573
  lastModel: string().nullable(),
7574
+ clientUserAgent: string().nullable().optional(),
7530
7575
  clientPid: number().nullable(),
7531
7576
  clientProjectFolder: string().nullable(),
7532
7577
  inspectorPath: string(),
@@ -8971,7 +9016,7 @@ const Route$w = createFileRoute("/api/models")({
8971
9016
  }
8972
9017
  }
8973
9018
  });
8974
- const version = "2.1.14";
9019
+ const version = "2.1.16";
8975
9020
  const packageJson = {
8976
9021
  version
8977
9022
  };
@@ -9681,7 +9726,10 @@ function buildLogSummary(log) {
9681
9726
  cacheRead: log.cacheReadInputTokens
9682
9727
  },
9683
9728
  sessionId: log.sessionId,
9729
+ userAgent: log.userAgent ?? null,
9684
9730
  clientPid: log.clientPid ?? null,
9731
+ clientCwd: log.clientCwd ?? null,
9732
+ clientProjectFolder: log.clientProjectFolder ?? null,
9685
9733
  lastUserMessagePreview: extractLastUserMessagePreview(log),
9686
9734
  responsePreview: extractResponsePreview(log),
9687
9735
  hasChunks: log.streamingChunks !== void 0 && log.streamingChunks !== null || log.streamingChunksPath !== null && log.streamingChunksPath !== void 0,
@@ -10051,21 +10099,31 @@ async function replayLogImpl(callApi2, args) {
10051
10099
  }
10052
10100
  return textJson(await replayRes.json());
10053
10101
  }
10102
+ function normalizedProviderModels(input) {
10103
+ const modelList = input.models ?? [];
10104
+ const models = modelList.map((model2) => model2.trim()).filter((model2) => model2 !== "");
10105
+ if (models.length > 0) return models;
10106
+ const model = input.model?.trim();
10107
+ return model !== void 0 && model !== "" ? [model] : [];
10108
+ }
10054
10109
  async function addProviderImpl(callApi2, provider) {
10110
+ const models = normalizedProviderModels(provider);
10055
10111
  const res = await callApi2("/api/providers", {
10056
10112
  method: "POST",
10057
10113
  headers: { "content-type": "application/json" },
10058
- body: JSON.stringify(provider)
10114
+ body: JSON.stringify({ ...provider, models })
10059
10115
  });
10060
10116
  if (!res.ok) return toolError(`POST /api/providers returned ${res.status}`);
10061
10117
  return textJson(await res.json());
10062
10118
  }
10063
10119
  async function updateProviderImpl(callApi2, input) {
10064
10120
  const { id, ...patch } = input;
10121
+ const models = patch.models !== void 0 || patch.model !== void 0 ? normalizedProviderModels(patch) : void 0;
10122
+ const body = models === void 0 ? patch : { ...patch, models };
10065
10123
  const res = await callApi2(`/api/providers/${encodeURIComponent(id)}`, {
10066
10124
  method: "PUT",
10067
10125
  headers: { "content-type": "application/json" },
10068
- body: JSON.stringify(patch)
10126
+ body: JSON.stringify(body)
10069
10127
  });
10070
10128
  if (!res.ok) return toolError(`PUT /api/providers/${id} returned ${res.status}`);
10071
10129
  return textJson(await res.json());
@@ -10297,13 +10355,46 @@ Parameters:
10297
10355
  Returns: array of "thick summary" objects, each containing:
10298
10356
  - id, timestamp, provider, model, apiFormat, method, path, status, isStreaming,
10299
10357
  hasError, latencyMs, tokens { input, output, cacheCreate, cacheRead },
10300
- sessionId, clientPid,
10358
+ sessionId, userAgent, clientPid, clientCwd, clientProjectFolder,
10301
10359
  - lastUserMessagePreview (string|null, ≤500 chars) — first text block of the last user message, parsed via the format-specific schema (NOT a raw body slice)
10302
10360
  - responsePreview (string|null, ≤500 chars) — first text block of the assistant response
10303
10361
  - hasChunks, hasRawRequestBody (booleans)
10304
10362
 
10305
10363
  Either preview field is null when the body is unknown format, unparseable, or the relevant content is non-text (e.g., image-only).`;
10306
10364
  const PROVIDER_WRITE_WARNING = "⚠ This tool mutates provider configuration. Confirm with the user before invoking.";
10365
+ const AddProviderInputSchema = object({
10366
+ name: string().min(1).describe("Provider display name."),
10367
+ apiKey: string().min(1).describe("Plaintext provider API key."),
10368
+ format: _enum(["anthropic", "openai"]).optional().describe("Primary API family. Use openai for Chat Completions or Responses providers."),
10369
+ model: string().min(1).optional().describe("Legacy single-model input. Prefer models for new clients."),
10370
+ models: array(string().min(1)).min(1).optional().describe("Provider model names."),
10371
+ anthropicBaseUrl: string().optional().describe("Anthropic-compatible base or exact /v1/messages endpoint."),
10372
+ openaiBaseUrl: string().optional().describe("OpenAI Chat Completions base or exact /v1/chat/completions endpoint."),
10373
+ openaiResponsesBaseUrl: string().optional().describe(
10374
+ "OpenAI Responses base or exact /v1/responses endpoint. MiniMax default endpoint is https://api.minimaxi.com/v1/responses."
10375
+ ),
10376
+ authHeader: _enum(["bearer", "x-api-key"]).optional(),
10377
+ apiDocsUrl: string().optional()
10378
+ }).refine(
10379
+ (input) => input.model !== void 0 || input.models !== void 0 && input.models.length > 0,
10380
+ { message: "Provide models or legacy model." }
10381
+ );
10382
+ const UpdateProviderInputSchema = object({
10383
+ id: string().describe("The provider id to update."),
10384
+ name: string().min(1).optional(),
10385
+ apiKey: string().min(1).optional(),
10386
+ format: _enum(["anthropic", "openai"]).optional(),
10387
+ model: string().min(1).optional().describe("Legacy single-model input. Prefer models."),
10388
+ models: array(string().min(1)).optional().describe("Replace provider model names."),
10389
+ baseUrl: string().min(1).optional().describe("Legacy route URL retained for old configs; prefer format-specific URL fields."),
10390
+ authHeader: _enum(["bearer", "x-api-key"]).optional(),
10391
+ anthropicBaseUrl: string().optional().describe("Anthropic-compatible base or exact /v1/messages endpoint."),
10392
+ openaiBaseUrl: string().optional().describe("OpenAI Chat Completions base or exact /v1/chat/completions endpoint."),
10393
+ openaiResponsesBaseUrl: string().optional().describe(
10394
+ "OpenAI Responses base or exact /v1/responses endpoint. MiniMax default endpoint is https://api.minimaxi.com/v1/responses."
10395
+ ),
10396
+ apiDocsUrl: string().optional()
10397
+ });
10307
10398
  const LogResourceListResponseSchema = object({
10308
10399
  logs: array(object({ id: number().int().positive() }))
10309
10400
  });
@@ -10974,18 +11065,8 @@ function registerTools(server) {
10974
11065
  title: "Add a new LLM provider",
10975
11066
  description: `${PROVIDER_WRITE_WARNING}
10976
11067
 
10977
- Persists a new provider to <dataDir>/providers.json. Required fields: name, apiKey, format (anthropic|openai), model. Optional: baseUrl, authHeader (default: bearer), apiDocsUrl.`,
10978
- inputSchema: object({
10979
- name: string().min(1),
10980
- apiKey: string().min(1),
10981
- format: _enum(["anthropic", "openai"]),
10982
- model: string().min(1),
10983
- anthropicBaseUrl: string().optional(),
10984
- openaiBaseUrl: string().optional(),
10985
- openaiResponsesBaseUrl: string().optional(),
10986
- authHeader: _enum(["bearer", "x-api-key"]).optional(),
10987
- apiDocsUrl: string().optional()
10988
- })
11068
+ Persists a new provider to <dataDir>/providers.json. Required fields: name, apiKey, and models (or legacy model). Chat Completions and Responses can use different upstream URLs: set openaiBaseUrl for /v1/chat/completions and openaiResponsesBaseUrl for /v1/responses. The URL builder accepts either a base URL such as https://api.minimaxi.com or an exact endpoint such as https://api.minimaxi.com/v1/responses.`,
11069
+ inputSchema: AddProviderInputSchema
10989
11070
  },
10990
11071
  (provider) => safeWriteCall("inspector_add_provider", () => addProviderImpl(callApi, provider))
10991
11072
  );
@@ -10995,20 +11076,8 @@ Persists a new provider to <dataDir>/providers.json. Required fields: name, apiK
10995
11076
  title: "Update an existing provider",
10996
11077
  description: `${PROVIDER_WRITE_WARNING} Updating with nonsense values effectively soft-deletes a provider. Confirm with the user before invoking.
10997
11078
 
10998
- PATCH-style update: only the fields you supply are changed. Returns the updated ProviderConfig.`,
10999
- inputSchema: object({
11000
- id: string().describe("The provider id to update."),
11001
- name: string().min(1).optional(),
11002
- apiKey: string().min(1).optional(),
11003
- format: _enum(["anthropic", "openai"]).optional(),
11004
- model: string().min(1).optional(),
11005
- baseUrl: string().min(1).optional(),
11006
- authHeader: _enum(["bearer", "x-api-key"]).optional(),
11007
- anthropicBaseUrl: string().optional(),
11008
- openaiBaseUrl: string().optional(),
11009
- openaiResponsesBaseUrl: string().optional(),
11010
- apiDocsUrl: string().optional()
11011
- })
11079
+ PATCH-style update: only the fields you supply are changed. Use models to update the configured model list. For OpenAI-compatible providers, openaiBaseUrl targets /v1/chat/completions and openaiResponsesBaseUrl targets /v1/responses, and those endpoints may be different.`,
11080
+ inputSchema: UpdateProviderInputSchema
11012
11081
  },
11013
11082
  (input) => safeWriteCall("inspector_update_provider", () => updateProviderImpl(callApi, input))
11014
11083
  );
@@ -15695,7 +15764,7 @@ function getResultTokensPerSecond(result) {
15695
15764
  totalStreamMs: getResultTotalStreamMs(result)
15696
15765
  });
15697
15766
  }
15698
- async function logModelResults(displayName, providerName, anthropicUrl, openaiUrl, modelResults, captureFullDetails) {
15767
+ async function logModelResults(displayName, providerName, providerSessionId, anthropicUrl, openaiUrl, modelResults, captureFullDetails) {
15699
15768
  const usageModel = getModelUsageName(displayName, providerName);
15700
15769
  if (anthropicUrl !== void 0) {
15701
15770
  const nsResult = modelResults.anthropic.nonStreaming;
@@ -15709,7 +15778,7 @@ async function logModelResults(displayName, providerName, anthropicUrl, openaiUr
15709
15778
  method: "POST",
15710
15779
  path: "/v1/messages",
15711
15780
  model: nonStreamingResult.model ?? displayName,
15712
- sessionId: null,
15781
+ sessionId: providerSessionId,
15713
15782
  rawRequestBody: requestBody,
15714
15783
  responseStatus: getResultResponseStatus(nonStreamingResult),
15715
15784
  responseText: getResultResponseText(nonStreamingResult),
@@ -15737,7 +15806,7 @@ async function logModelResults(displayName, providerName, anthropicUrl, openaiUr
15737
15806
  method: "POST",
15738
15807
  path: "/v1/messages",
15739
15808
  model: streamingResult.model ?? displayName,
15740
- sessionId: null,
15809
+ sessionId: providerSessionId,
15741
15810
  rawRequestBody: streamingRequestBody,
15742
15811
  responseStatus: getResultResponseStatus(streamingResult),
15743
15812
  responseText: getResultResponseText(streamingResult),
@@ -15772,7 +15841,7 @@ async function logModelResults(displayName, providerName, anthropicUrl, openaiUr
15772
15841
  method: "POST",
15773
15842
  path: "/v1/chat/completions",
15774
15843
  model: nonStreamingResult.model ?? displayName,
15775
- sessionId: null,
15844
+ sessionId: providerSessionId,
15776
15845
  rawRequestBody: requestBody,
15777
15846
  responseStatus: getResultResponseStatus(nonStreamingResult),
15778
15847
  responseText: getResultResponseText(nonStreamingResult),
@@ -15800,7 +15869,7 @@ async function logModelResults(displayName, providerName, anthropicUrl, openaiUr
15800
15869
  method: "POST",
15801
15870
  path: "/v1/chat/completions",
15802
15871
  model: streamingResult.model ?? displayName,
15803
- sessionId: null,
15872
+ sessionId: providerSessionId,
15804
15873
  rawRequestBody: streamingRequestBody,
15805
15874
  responseStatus: getResultResponseStatus(streamingResult),
15806
15875
  responseText: getResultResponseText(streamingResult),
@@ -15846,6 +15915,7 @@ const Route$2 = createFileRoute("/api/providers/$providerId/test/log")({
15846
15915
  );
15847
15916
  }
15848
15917
  const results = parsed.data;
15918
+ const providerSessionId = buildProviderTestSessionId(params.providerId);
15849
15919
  const captureFullDetails = getConfig().captureMode === "full";
15850
15920
  const anthropicUrl = provider.anthropicBaseUrl !== void 0 && provider.anthropicBaseUrl.length > 0 ? provider.anthropicBaseUrl : void 0;
15851
15921
  const openaiUrl = provider.openaiBaseUrl !== void 0 && provider.openaiBaseUrl.length > 0 ? provider.openaiBaseUrl : void 0;
@@ -15856,6 +15926,7 @@ const Route$2 = createFileRoute("/api/providers/$providerId/test/log")({
15856
15926
  logModelResults(
15857
15927
  modelName,
15858
15928
  provider.name,
15929
+ providerSessionId,
15859
15930
  anthropicUrl,
15860
15931
  openaiUrl,
15861
15932
  modelResult,
@@ -1,4 +1,4 @@
1
- const tsrStartManifest = () => ({ "routes": { "__root__": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/__root.tsx", "children": ["/", "/api/alerts", "/api/config", "/api/groups", "/api/health", "/api/logs", "/api/mcp", "/api/models", "/api/providers", "/api/runs", "/api/sessions", "/proxy/$", "/session/$sessionId", "/api/knowledge/candidates", "/api/knowledge/project-context", "/api/knowledge/search", "/api/knowledge/sessions/$sessionId/candidates"], "preloads": ["/assets/main-CSONBwwn.js"], "assets": [] }, "/": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/index.tsx", "assets": [], "preloads": ["/assets/index-D_WfwzUi.js", "/assets/ProxyViewerContainer-CWUQZLYy.js"] }, "/api/alerts": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/alerts.ts", "children": ["/api/alerts/summary"] }, "/api/config": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/config.ts", "children": ["/api/config/paths"] }, "/api/groups": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/groups.ts", "children": ["/api/groups/$groupId"] }, "/api/health": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/health.ts" }, "/api/logs": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/logs.ts", "children": ["/api/logs/$id", "/api/logs/import", "/api/logs/stream"] }, "/api/mcp": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/mcp.ts" }, "/api/models": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/models.ts" }, "/api/providers": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/providers.ts", "children": ["/api/providers/$providerId", "/api/providers/export", "/api/providers/import", "/api/providers/scan"] }, "/api/runs": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/runs.ts", "children": ["/api/runs/$runId"] }, "/api/sessions": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/sessions.ts" }, "/proxy/$": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/proxy/$.ts" }, "/session/$sessionId": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/session/$sessionId.tsx", "assets": [], "preloads": ["/assets/_sessionId-Cif8JZdn.js", "/assets/ProxyViewerContainer-CWUQZLYy.js"] }, "/api/alerts/summary": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/alerts.summary.ts" }, "/api/config/paths": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/config.paths.ts" }, "/api/groups/$groupId": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/groups.$groupId.ts", "children": ["/api/groups/$groupId/evidence", "/api/groups/$groupId/sessions"] }, "/api/knowledge/candidates": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/knowledge.candidates.ts", "children": ["/api/knowledge/candidates/$candidateId"] }, "/api/knowledge/project-context": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/knowledge.project-context.ts" }, "/api/knowledge/search": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/knowledge.search.ts" }, "/api/logs/$id": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/logs.$id.ts", "children": ["/api/logs/$id/body", "/api/logs/$id/chunks", "/api/logs/$id/replay"] }, "/api/logs/import": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/logs.import.ts" }, "/api/logs/stream": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/logs.stream.ts" }, "/api/providers/$providerId": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/providers.$providerId.ts", "children": ["/api/providers/$providerId/model-metadata", "/api/providers/$providerId/test"] }, "/api/providers/export": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/providers.export.ts" }, "/api/providers/import": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/providers.import.ts" }, "/api/providers/scan": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/providers.scan.ts" }, "/api/runs/$runId": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/runs.$runId.ts", "children": ["/api/runs/$runId/evidence"] }, "/api/groups/$groupId/evidence": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/groups.$groupId.evidence.ts" }, "/api/groups/$groupId/sessions": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/groups.$groupId.sessions.ts" }, "/api/knowledge/candidates/$candidateId": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/knowledge.candidates.$candidateId.ts", "children": ["/api/knowledge/candidates/$candidateId/promote"] }, "/api/logs/$id/body": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/logs.$id.body.ts" }, "/api/logs/$id/chunks": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/logs.$id.chunks.ts" }, "/api/logs/$id/replay": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/logs.$id.replay.ts" }, "/api/providers/$providerId/model-metadata": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/providers.$providerId.model-metadata.ts" }, "/api/providers/$providerId/test": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/providers.$providerId.test.ts", "children": ["/api/providers/$providerId/test/log"] }, "/api/runs/$runId/evidence": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/runs.$runId.evidence.ts" }, "/api/knowledge/candidates/$candidateId/promote": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/knowledge.candidates.$candidateId.promote.ts" }, "/api/knowledge/sessions/$sessionId/candidates": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/knowledge.sessions.$sessionId.candidates.ts" }, "/api/providers/$providerId/test/log": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/providers.$providerId.test.log.ts" } }, "clientEntry": "/assets/main-CSONBwwn.js" });
1
+ const tsrStartManifest = () => ({ "routes": { "__root__": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/__root.tsx", "children": ["/", "/api/alerts", "/api/config", "/api/groups", "/api/health", "/api/logs", "/api/mcp", "/api/models", "/api/providers", "/api/runs", "/api/sessions", "/proxy/$", "/session/$sessionId", "/api/knowledge/candidates", "/api/knowledge/project-context", "/api/knowledge/search", "/api/knowledge/sessions/$sessionId/candidates"], "preloads": ["/assets/main-aCAKYGSD.js"], "assets": [] }, "/": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/index.tsx", "assets": [], "preloads": ["/assets/index-Bt0Az2I2.js", "/assets/ProxyViewerContainer-DLqClc9A.js"] }, "/api/alerts": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/alerts.ts", "children": ["/api/alerts/summary"] }, "/api/config": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/config.ts", "children": ["/api/config/paths"] }, "/api/groups": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/groups.ts", "children": ["/api/groups/$groupId"] }, "/api/health": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/health.ts" }, "/api/logs": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/logs.ts", "children": ["/api/logs/$id", "/api/logs/import", "/api/logs/stream"] }, "/api/mcp": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/mcp.ts" }, "/api/models": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/models.ts" }, "/api/providers": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/providers.ts", "children": ["/api/providers/$providerId", "/api/providers/export", "/api/providers/import", "/api/providers/scan"] }, "/api/runs": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/runs.ts", "children": ["/api/runs/$runId"] }, "/api/sessions": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/sessions.ts" }, "/proxy/$": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/proxy/$.ts" }, "/session/$sessionId": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/session/$sessionId.tsx", "assets": [], "preloads": ["/assets/_sessionId-DUSalzKH.js", "/assets/ProxyViewerContainer-DLqClc9A.js"] }, "/api/alerts/summary": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/alerts.summary.ts" }, "/api/config/paths": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/config.paths.ts" }, "/api/groups/$groupId": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/groups.$groupId.ts", "children": ["/api/groups/$groupId/evidence", "/api/groups/$groupId/sessions"] }, "/api/knowledge/candidates": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/knowledge.candidates.ts", "children": ["/api/knowledge/candidates/$candidateId"] }, "/api/knowledge/project-context": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/knowledge.project-context.ts" }, "/api/knowledge/search": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/knowledge.search.ts" }, "/api/logs/$id": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/logs.$id.ts", "children": ["/api/logs/$id/body", "/api/logs/$id/chunks", "/api/logs/$id/replay"] }, "/api/logs/import": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/logs.import.ts" }, "/api/logs/stream": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/logs.stream.ts" }, "/api/providers/$providerId": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/providers.$providerId.ts", "children": ["/api/providers/$providerId/model-metadata", "/api/providers/$providerId/test"] }, "/api/providers/export": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/providers.export.ts" }, "/api/providers/import": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/providers.import.ts" }, "/api/providers/scan": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/providers.scan.ts" }, "/api/runs/$runId": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/runs.$runId.ts", "children": ["/api/runs/$runId/evidence"] }, "/api/groups/$groupId/evidence": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/groups.$groupId.evidence.ts" }, "/api/groups/$groupId/sessions": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/groups.$groupId.sessions.ts" }, "/api/knowledge/candidates/$candidateId": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/knowledge.candidates.$candidateId.ts", "children": ["/api/knowledge/candidates/$candidateId/promote"] }, "/api/logs/$id/body": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/logs.$id.body.ts" }, "/api/logs/$id/chunks": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/logs.$id.chunks.ts" }, "/api/logs/$id/replay": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/logs.$id.replay.ts" }, "/api/providers/$providerId/model-metadata": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/providers.$providerId.model-metadata.ts" }, "/api/providers/$providerId/test": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/providers.$providerId.test.ts", "children": ["/api/providers/$providerId/test/log"] }, "/api/runs/$runId/evidence": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/runs.$runId.evidence.ts" }, "/api/knowledge/candidates/$candidateId/promote": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/knowledge.candidates.$candidateId.promote.ts" }, "/api/knowledge/sessions/$sessionId/candidates": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/knowledge.sessions.$sessionId.candidates.ts" }, "/api/providers/$providerId/test/log": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/providers.$providerId.test.log.ts" } }, "clientEntry": "/assets/main-aCAKYGSD.js" });
2
2
  export {
3
3
  tsrStartManifest
4
4
  };