@tonyclaw/agent-inspector 2.0.6 → 2.0.8

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 (43) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/assets/CompareDrawer-Djb4XFZS.js +1 -0
  3. package/.output/public/assets/ProxyViewerContainer-CWdkPZsJ.js +114 -0
  4. package/.output/public/assets/ReplayDialog-DBPMIs2I.js +1 -0
  5. package/.output/public/assets/RequestAnatomy-FBfRNQN7.js +1 -0
  6. package/.output/public/assets/ResponseView-Db4pJL7U.js +1 -0
  7. package/.output/public/assets/StreamingChunkSequence-BH175O6R.js +1 -0
  8. package/.output/public/assets/_sessionId-3ipVoQtW.js +1 -0
  9. package/.output/public/assets/index-Bo1dGS4R.css +1 -0
  10. package/.output/public/assets/index-CJgaCJo8.js +1 -0
  11. package/.output/public/assets/{main-CKnTJ4-O.js → main-CwhqfJqM.js} +8 -8
  12. package/.output/server/_libs/lucide-react.mjs +170 -108
  13. package/.output/server/_libs/radix-ui__react-collapsible.mjs +2 -2
  14. package/.output/server/{_sessionId-B-x9fRY3.mjs → _sessionId-DzBy9gLa.mjs} +58 -5
  15. package/.output/server/_ssr/{CompareDrawer-BQVNsAY2.mjs → CompareDrawer-C5NBvE2e.mjs} +9 -8
  16. package/.output/server/_ssr/{ProxyViewerContainer-CYm2Dw19.mjs → ProxyViewerContainer-DiZjOTQT.mjs} +857 -32
  17. package/.output/server/_ssr/{ReplayDialog-CaMQBc79.mjs → ReplayDialog-EpvTwFvp.mjs} +7 -8
  18. package/.output/server/_ssr/{RequestAnatomy--P5arRH2.mjs → RequestAnatomy-DaQjhixp.mjs} +512 -7
  19. package/.output/server/_ssr/{ResponseView-RtFwNvgD.mjs → ResponseView-D8tGHCGY.mjs} +5 -74
  20. package/.output/server/_ssr/{StreamingChunkSequence-B5HPkzab.mjs → StreamingChunkSequence-DGQnb1QE.mjs} +8 -7
  21. package/.output/server/_ssr/{index-CZIKZU43.mjs → index-N25hqa7t.mjs} +58 -5
  22. package/.output/server/_ssr/index.mjs +2 -2
  23. package/.output/server/_ssr/{router-DGPt3MUc.mjs → router-Bf0m6F0G.mjs} +22 -6
  24. package/.output/server/{_tanstack-start-manifest_v-BzH4pNaI.mjs → _tanstack-start-manifest_v-DlAyJ5DB.mjs} +1 -1
  25. package/.output/server/index.mjs +61 -68
  26. package/package.json +1 -1
  27. package/src/components/proxy-viewer/LogEntry.tsx +17 -2
  28. package/src/components/proxy-viewer/RequestToolsPanel.tsx +292 -0
  29. package/src/components/proxy-viewer/anatomy/RequestAnatomy.tsx +197 -1
  30. package/src/components/proxy-viewer/anatomy/contextIntelligence.ts +414 -0
  31. package/src/components/proxy-viewer/requestTools.ts +213 -0
  32. package/src/routes/__root.tsx +27 -0
  33. package/.output/public/assets/CompareDrawer-DDmqSAfl.js +0 -1
  34. package/.output/public/assets/ProxyViewerContainer-Cxpdziwd.js +0 -101
  35. package/.output/public/assets/ReplayDialog-Bt5DGzlh.js +0 -1
  36. package/.output/public/assets/RequestAnatomy-BxX3_N9S.js +0 -1
  37. package/.output/public/assets/ResponseView-Bl_5S9gZ.js +0 -1
  38. package/.output/public/assets/StreamingChunkSequence-RJMwNf6F.js +0 -1
  39. package/.output/public/assets/_sessionId-b4isaoDp.js +0 -1
  40. package/.output/public/assets/index-BZ4x5UI6.js +0 -1
  41. package/.output/public/assets/index-C624DUk9.css +0 -1
  42. package/.output/public/assets/json-viewer-CRL_gWEZ.js +0 -14
  43. package/.output/server/_ssr/json-viewer-d4obyRaA.mjs +0 -515
@@ -1,14 +1,11 @@
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 "./ProxyViewerContainer-CYm2Dw19.mjs";
3
- import { JsonViewer } from "./json-viewer-d4obyRaA.mjs";
4
- import "./router-DGPt3MUc.mjs";
2
+ import { g as getLogFormatAdapter, f as formatTokens, c as cn, p as getStatusCategory, B as Badge, C as Collapsible, q as CollapsibleTrigger, s as CollapsibleContent, S as ScrollArea, t as JsonViewer, v as safeJsonValue } from "./ProxyViewerContainer-DiZjOTQT.mjs";
3
+ import "./router-Bf0m6F0G.mjs";
5
4
  import "../_libs/modelcontextprotocol__server.mjs";
6
5
  import "../_libs/jszip.mjs";
7
- import { Z as Zap, j as TriangleAlert, a5 as CircleStop, B as Brain, b as ChevronDown, f as ChevronRight, T as Terminal } from "../_libs/lucide-react.mjs";
6
+ import { Z as Zap, j as TriangleAlert, ab as CircleStop, B as Brain, b as ChevronDown, f as ChevronRight, T as Terminal } from "../_libs/lucide-react.mjs";
8
7
  import { M as Markdown } from "../_libs/react-markdown.mjs";
9
8
  import { R as Root } from "../_libs/radix-ui__react-separator.mjs";
10
- import { R as Root$1, C as CollapsibleTrigger$1, a as CollapsibleContent$1 } from "../_libs/radix-ui__react-collapsible.mjs";
11
- import { R as Root$2, V as Viewport, C as Corner, S as ScrollAreaScrollbar, a as ScrollAreaThumb } from "../_libs/radix-ui__react-scroll-area.mjs";
12
9
  import "../_libs/swr.mjs";
13
10
  import "../_libs/use-sync-external-store.mjs";
14
11
  import "../_libs/dequal.mjs";
@@ -64,6 +61,8 @@ import "../_libs/zod.mjs";
64
61
  import "../_libs/radix-ui__react-tooltip.mjs";
65
62
  import "../_libs/radix-ui__react-tabs.mjs";
66
63
  import "../_libs/radix-ui__react-roving-focus.mjs";
64
+ import "../_libs/radix-ui__react-collapsible.mjs";
65
+ import "../_libs/radix-ui__react-scroll-area.mjs";
67
66
  import "../_libs/tanstack__react-router.mjs";
68
67
  import "../_libs/tiny-warning.mjs";
69
68
  import "../_libs/tanstack__router-core.mjs";
@@ -191,74 +190,6 @@ function Separator({
191
190
  }
192
191
  );
193
192
  }
194
- function Collapsible({
195
- ...props
196
- }) {
197
- return /* @__PURE__ */ jsxRuntimeExports.jsx(Root$1, { "data-slot": "collapsible", ...props });
198
- }
199
- function CollapsibleTrigger({
200
- ...props
201
- }) {
202
- return /* @__PURE__ */ jsxRuntimeExports.jsx(CollapsibleTrigger$1, { "data-slot": "collapsible-trigger", ...props });
203
- }
204
- function CollapsibleContent({
205
- ...props
206
- }) {
207
- return /* @__PURE__ */ jsxRuntimeExports.jsx(CollapsibleContent$1, { "data-slot": "collapsible-content", ...props });
208
- }
209
- function ScrollArea({
210
- className,
211
- children,
212
- ...props
213
- }) {
214
- return /* @__PURE__ */ jsxRuntimeExports.jsxs(
215
- Root$2,
216
- {
217
- "data-slot": "scroll-area",
218
- className: cn("relative", className),
219
- ...props,
220
- children: [
221
- /* @__PURE__ */ jsxRuntimeExports.jsx(
222
- Viewport,
223
- {
224
- "data-slot": "scroll-area-viewport",
225
- className: "focus-visible:ring-ring/50 size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:outline-1",
226
- children
227
- }
228
- ),
229
- /* @__PURE__ */ jsxRuntimeExports.jsx(ScrollBar, {}),
230
- /* @__PURE__ */ jsxRuntimeExports.jsx(Corner, {})
231
- ]
232
- }
233
- );
234
- }
235
- function ScrollBar({
236
- className,
237
- orientation = "vertical",
238
- ...props
239
- }) {
240
- return /* @__PURE__ */ jsxRuntimeExports.jsx(
241
- ScrollAreaScrollbar,
242
- {
243
- "data-slot": "scroll-area-scrollbar",
244
- orientation,
245
- className: cn(
246
- "flex touch-none p-px transition-colors select-none",
247
- orientation === "vertical" && "h-full w-2.5 border-l border-l-transparent",
248
- orientation === "horizontal" && "h-2.5 flex-col border-t border-t-transparent",
249
- className
250
- ),
251
- ...props,
252
- children: /* @__PURE__ */ jsxRuntimeExports.jsx(
253
- ScrollAreaThumb,
254
- {
255
- "data-slot": "scroll-area-thumb",
256
- className: "bg-border relative flex-1 rounded-full"
257
- }
258
- )
259
- }
260
- );
261
- }
262
193
  const THINKING_TAG_REGEX = /<think>([\s\S]*?)<\/think>/gi;
263
194
  const THINKING_TAG_REGEX_SINGLE = /<think>([\s\S]*?)<\/think>/i;
264
195
  function extractThinkingFromContent(text) {
@@ -1,7 +1,6 @@
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 "./ProxyViewerContainer-CYm2Dw19.mjs";
3
- import { JsonViewer } from "./json-viewer-d4obyRaA.mjs";
4
- import "./router-DGPt3MUc.mjs";
2
+ import { k as TooltipProvider, l as Tooltip, m as TooltipTrigger, B as Badge, n as TooltipContent, t as JsonViewer } from "./ProxyViewerContainer-DiZjOTQT.mjs";
3
+ import "./router-Bf0m6F0G.mjs";
5
4
  import "../_libs/modelcontextprotocol__server.mjs";
6
5
  import "../_libs/jszip.mjs";
7
6
  import { b as ChevronDown, f as ChevronRight, L as LoaderCircle } from "../_libs/lucide-react.mjs";
@@ -56,10 +55,6 @@ import "../_libs/radix-ui__react-arrow.mjs";
56
55
  import "../_libs/radix-ui__react-use-size.mjs";
57
56
  import "../_libs/radix-ui__react-use-previous.mjs";
58
57
  import "../_libs/@radix-ui/react-visually-hidden+[...].mjs";
59
- import "../_libs/zod.mjs";
60
- import "../_libs/radix-ui__react-tooltip.mjs";
61
- import "../_libs/radix-ui__react-tabs.mjs";
62
- import "../_libs/radix-ui__react-roving-focus.mjs";
63
58
  import "../_libs/react-markdown.mjs";
64
59
  import "../_libs/devlop.mjs";
65
60
  import "../_libs/unified.mjs";
@@ -114,6 +109,12 @@ import "../_libs/inline-style-parser.mjs";
114
109
  import "../_libs/hast-util-whitespace.mjs";
115
110
  import "../_libs/estree-util-is-identifier-name.mjs";
116
111
  import "../_libs/html-url-attributes.mjs";
112
+ import "../_libs/zod.mjs";
113
+ import "../_libs/radix-ui__react-tooltip.mjs";
114
+ import "../_libs/radix-ui__react-tabs.mjs";
115
+ import "../_libs/radix-ui__react-roving-focus.mjs";
116
+ import "../_libs/radix-ui__react-collapsible.mjs";
117
+ import "../_libs/radix-ui__react-scroll-area.mjs";
117
118
  import "../_libs/tanstack__react-router.mjs";
118
119
  import "../_libs/tiny-warning.mjs";
119
120
  import "../_libs/tanstack__router-core.mjs";
@@ -1,6 +1,6 @@
1
- import { P as ProxyViewerContainer } from "./ProxyViewerContainer-CYm2Dw19.mjs";
1
+ import { P as ProxyViewerContainer } from "./ProxyViewerContainer-DiZjOTQT.mjs";
2
2
  import "../_libs/react.mjs";
3
- import "./router-DGPt3MUc.mjs";
3
+ import "./router-Bf0m6F0G.mjs";
4
4
  import "../_libs/modelcontextprotocol__server.mjs";
5
5
  import "../_libs/jszip.mjs";
6
6
  import "../_libs/swr.mjs";
@@ -55,10 +55,66 @@ import "../_libs/radix-ui__react-use-size.mjs";
55
55
  import "../_libs/radix-ui__react-use-previous.mjs";
56
56
  import "../_libs/@radix-ui/react-visually-hidden+[...].mjs";
57
57
  import "../_libs/lucide-react.mjs";
58
+ import "../_libs/react-markdown.mjs";
59
+ import "../_libs/devlop.mjs";
60
+ import "../_libs/unified.mjs";
61
+ import "../_libs/bail.mjs";
62
+ import "../_libs/extend.mjs";
63
+ import "../_libs/is-plain-obj.mjs";
64
+ import "../_libs/trough.mjs";
65
+ import "../_libs/vfile.mjs";
66
+ import "../_libs/vfile-message.mjs";
67
+ import "../_libs/unist-util-stringify-position.mjs";
68
+ import "node:process";
69
+ import "node:path";
70
+ import "node:url";
71
+ import "../_libs/remark-parse.mjs";
72
+ import "../_libs/mdast-util-from-markdown.mjs";
73
+ import "../_libs/micromark-util-decode-numeric-character-reference+[...].mjs";
74
+ import "../_libs/micromark-util-decode-string.mjs";
75
+ import "../_libs/decode-named-character-reference+[...].mjs";
76
+ import "../_libs/character-entities.mjs";
77
+ import "../_libs/micromark-util-normalize-identifier+[...].mjs";
78
+ import "../_libs/micromark.mjs";
79
+ import "../_libs/micromark-util-combine-extensions+[...].mjs";
80
+ import "../_libs/micromark-util-chunked.mjs";
81
+ import "../_libs/micromark-factory-space.mjs";
82
+ import "../_libs/micromark-util-character.mjs";
83
+ import "../_libs/micromark-core-commonmark.mjs";
84
+ import "../_libs/micromark-util-classify-character+[...].mjs";
85
+ import "../_libs/micromark-util-resolve-all.mjs";
86
+ import "../_libs/micromark-util-subtokenize.mjs";
87
+ import "../_libs/micromark-factory-destination.mjs";
88
+ import "../_libs/micromark-factory-label.mjs";
89
+ import "../_libs/micromark-factory-title.mjs";
90
+ import "../_libs/micromark-factory-whitespace.mjs";
91
+ import "../_libs/micromark-util-html-tag-name.mjs";
92
+ import "../_libs/mdast-util-to-string.mjs";
93
+ import "../_libs/remark-rehype.mjs";
94
+ import "../_libs/mdast-util-to-hast.mjs";
95
+ import "../_libs/ungap__structured-clone.mjs";
96
+ import "../_libs/micromark-util-sanitize-uri.mjs";
97
+ import "../_libs/unist-util-position.mjs";
98
+ import "../_libs/trim-lines.mjs";
99
+ import "../_libs/unist-util-visit.mjs";
100
+ import "../_libs/unist-util-visit-parents.mjs";
101
+ import "../_libs/unist-util-is.mjs";
102
+ import "../_libs/hast-util-to-jsx-runtime.mjs";
103
+ import "../_libs/comma-separated-tokens.mjs";
104
+ import "../_libs/property-information.mjs";
105
+ import "../_libs/space-separated-tokens.mjs";
106
+ import "../_libs/style-to-js.mjs";
107
+ import "../_libs/style-to-object.mjs";
108
+ import "../_libs/inline-style-parser.mjs";
109
+ import "../_libs/hast-util-whitespace.mjs";
110
+ import "../_libs/estree-util-is-identifier-name.mjs";
111
+ import "../_libs/html-url-attributes.mjs";
58
112
  import "../_libs/zod.mjs";
59
113
  import "../_libs/radix-ui__react-tooltip.mjs";
60
114
  import "../_libs/radix-ui__react-tabs.mjs";
61
115
  import "../_libs/radix-ui__react-roving-focus.mjs";
116
+ import "../_libs/radix-ui__react-collapsible.mjs";
117
+ import "../_libs/radix-ui__react-scroll-area.mjs";
62
118
  import "../_libs/tanstack__react-router.mjs";
63
119
  import "../_libs/tiny-warning.mjs";
64
120
  import "../_libs/tanstack__router-core.mjs";
@@ -73,12 +129,9 @@ import "../_libs/isbot.mjs";
73
129
  import "node:fs";
74
130
  import "node:fs/promises";
75
131
  import "node:buffer";
76
- import "node:path";
77
132
  import "node:child_process";
78
- import "node:url";
79
133
  import "../_libs/conf.mjs";
80
134
  import "node:util";
81
- import "node:process";
82
135
  import "node:crypto";
83
136
  import "node:assert";
84
137
  import "../_libs/dot-prop.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-BzH4pNaI.mjs");
201
+ const { tsrStartManifest } = await import("../_tanstack-start-manifest_v-DlAyJ5DB.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-DGPt3MUc.mjs").then((n) => n.i);
770
+ const routerEntry = await import("./router-Bf0m6F0G.mjs").then((n) => n.i);
771
771
  const startEntry = await import("./start-HYkvq4Ni.mjs");
772
772
  return { startEntry, routerEntry };
773
773
  }
@@ -49,7 +49,7 @@ import "../_libs/mimic-function.mjs";
49
49
  import "../_libs/semver.mjs";
50
50
  import "../_libs/uint8array-extras.mjs";
51
51
  const faviconSvg = "data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2064%2064'%20role='img'%20aria-label='Agent%20Inspector'%3e%3crect%20width='64'%20height='64'%20rx='14'%20fill='%23111827'%20/%3e%3cg%20fill='none'%20stroke='%23f59e0b'%20stroke-width='4.2'%20stroke-linecap='round'%20stroke-linejoin='round'%3e%3cpath%20fill='%23f59e0b'%20d='M15%2036c0-11%207-18%2017-18s17%207%2017%2018c0%208-7%2013-17%2013s-17-5-17-13z'%20/%3e%3cpath%20d='M16%2031c-6-5-12-3-12%204%200%205%206%206%2011%202'%20/%3e%3cpath%20d='M48%2031c6-5%2012-3%2012%204%200%205-6%206-11%202'%20/%3e%3cpath%20d='M27%2019l-3-7'%20/%3e%3cpath%20d='M37%2019l3-7'%20/%3e%3cpath%20d='M19%2045l-6%209'%20/%3e%3cpath%20d='M27%2048l-3%209'%20/%3e%3cpath%20d='M37%2048l3%209'%20/%3e%3cpath%20d='M45%2045l6%209'%20/%3e%3c/g%3e%3cpath%20d='M14%2047l9-8%208%209c-5%203.5-12%203-17-1z'%20fill='%232f6b3f'%20opacity='.95'%20/%3e%3cpath%20d='M18%2046l5-5%205%206c-3%201.6-7%201.4-10-1z'%20fill='%236fb36f'%20opacity='.95'%20/%3e%3cpath%20d='M23%2041v10'%20fill='none'%20stroke='%23d6b45f'%20stroke-width='1.6'%20stroke-linecap='round'%20/%3e%3ccircle%20cx='31'%20cy='48'%20r='1.8'%20fill='%23c2412d'%20/%3e%3cpath%20d='M24%2044l13-11%2014%2013c-8%205.8-18%205.3-27-2z'%20fill='%232f6b3f'%20opacity='.97'%20/%3e%3cpath%20d='M30%2043l7-7%209%209c-5%202.7-11%202.5-16-2z'%20fill='%236fb36f'%20opacity='.95'%20/%3e%3cpath%20d='M37%2036v14'%20fill='none'%20stroke='%23d6b45f'%20stroke-width='2'%20stroke-linecap='round'%20/%3e%3cpath%20d='M30%2043c5-2%2011-1.5%2016%202'%20fill='none'%20stroke='%239fca78'%20stroke-width='1.8'%20stroke-linecap='round'%20/%3e%3ccircle%20cx='51'%20cy='46'%20r='2'%20fill='%23c2412d'%20/%3e%3cpath%20d='M40%2050l8-8%207%208c-4.2%203.2-10%203-15%200z'%20fill='%232f6b3f'%20opacity='.95'%20/%3e%3cpath%20d='M43%2049l5-5%204.5%205.5c-3%201.5-6%201.2-9.5-.5z'%20fill='%236fb36f'%20opacity='.95'%20/%3e%3cpath%20d='M48%2044v9'%20fill='none'%20stroke='%23d6b45f'%20stroke-width='1.5'%20stroke-linecap='round'%20/%3e%3ccircle%20cx='55'%20cy='50'%20r='1.7'%20fill='%23c2412d'%20/%3e%3ccircle%20cx='24'%20cy='11'%20r='3.2'%20fill='%23f59e0b'%20/%3e%3ccircle%20cx='40'%20cy='11'%20r='3.2'%20fill='%23f59e0b'%20/%3e%3ccircle%20cx='25'%20cy='34'%20r='2.1'%20fill='%23111827'%20/%3e%3ccircle%20cx='39'%20cy='34'%20r='2.1'%20fill='%23111827'%20/%3e%3c/svg%3e";
52
- const appCss = "/assets/index-C624DUk9.css";
52
+ const appCss = "/assets/index-Bo1dGS4R.css";
53
53
  const Route$r = createRootRoute({
54
54
  head: () => ({
55
55
  meta: [
@@ -62,11 +62,27 @@ const Route$r = createRootRoute({
62
62
  { rel: "icon", type: "image/svg+xml", href: faviconSvg }
63
63
  ]
64
64
  }),
65
- component: RootComponent
65
+ component: RootComponent,
66
+ notFoundComponent: RootNotFoundComponent
66
67
  });
67
68
  function RootComponent() {
68
69
  return /* @__PURE__ */ jsxRuntimeExports.jsx(RootDocument, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(Outlet, {}) });
69
70
  }
71
+ function RootNotFoundComponent() {
72
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(RootDocument, { children: /* @__PURE__ */ jsxRuntimeExports.jsx("main", { className: "min-h-screen bg-background text-foreground", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mx-auto flex min-h-screen w-full max-w-3xl flex-col justify-center px-6 py-16", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "border-border/70 bg-card/60 rounded-lg border p-8 shadow-sm", children: [
73
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-muted-foreground font-mono text-xs uppercase tracking-wider", children: "404" }),
74
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "mt-3 text-2xl font-semibold", children: "Page not found" }),
75
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-muted-foreground mt-3 max-w-xl text-sm leading-6", children: "This route is not part of the Agent Inspector UI or API surface." }),
76
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
77
+ "a",
78
+ {
79
+ href: "/",
80
+ className: "bg-primary text-primary-foreground hover:bg-primary/90 mt-6 inline-flex h-9 items-center justify-center rounded-md px-4 text-sm font-medium transition-colors",
81
+ children: "Open Agent Inspector"
82
+ }
83
+ )
84
+ ] }) }) }) });
85
+ }
70
86
  function RootDocument({ children }) {
71
87
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("html", { lang: "en", className: "dark", children: [
72
88
  /* @__PURE__ */ jsxRuntimeExports.jsx("head", { children: /* @__PURE__ */ jsxRuntimeExports.jsx(HeadContent, {}) }),
@@ -76,7 +92,7 @@ function RootDocument({ children }) {
76
92
  ] })
77
93
  ] });
78
94
  }
79
- const $$splitComponentImporter$1 = () => import("./index-CZIKZU43.mjs");
95
+ const $$splitComponentImporter$1 = () => import("./index-N25hqa7t.mjs");
80
96
  const Route$q = createFileRoute("/")({
81
97
  component: lazyRouteComponent($$splitComponentImporter$1, "component")
82
98
  });
@@ -119,7 +135,7 @@ function decodeSessionIdFromPath(encoded) {
119
135
  function getSessionPath(sessionId) {
120
136
  return `/session/${encodeSessionIdForPath(sessionId)}`;
121
137
  }
122
- const $$splitComponentImporter = () => import("../_sessionId-B-x9fRY3.mjs");
138
+ const $$splitComponentImporter = () => import("../_sessionId-DzBy9gLa.mjs");
123
139
  const Route$p = createFileRoute("/session/$sessionId")({
124
140
  component: lazyRouteComponent($$splitComponentImporter, "component"),
125
141
  parseParams: (params) => ({
@@ -6658,7 +6674,7 @@ export {
6658
6674
  DEFAULT_TIME_DISPLAY_FORMAT as a,
6659
6675
  RuntimeConfigSchema as b,
6660
6676
  AnthropicRequestSchema as c,
6661
- safeGetOwnProperty as d,
6677
+ stripClaudeCodeBillingHeader as d,
6662
6678
  createPendingProviderTestResults as e,
6663
6679
  createFailedProviderTestResults as f,
6664
6680
  getSessionPath as g,
@@ -6666,5 +6682,5 @@ export {
6666
6682
  router as i,
6667
6683
  parseOpenAIResponse as p,
6668
6684
  requestFormatForPath as r,
6669
- stripClaudeCodeBillingHeader as s
6685
+ safeGetOwnProperty as s
6670
6686
  };
@@ -1,4 +1,4 @@
1
- const tsrStartManifest = () => ({ "routes": { "__root__": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/__root.tsx", "children": ["/", "/api/config", "/api/health", "/api/logs", "/api/mcp", "/api/models", "/api/providers", "/api/sessions", "/proxy/$", "/session/$sessionId", "/api/knowledge/candidates", "/api/knowledge/project-context", "/api/knowledge/search", "/api/knowledge/sessions/$sessionId/candidates"], "preloads": ["/assets/main-CKnTJ4-O.js"], "assets": [] }, "/": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/index.tsx", "assets": [], "preloads": ["/assets/index-BZ4x5UI6.js", "/assets/ProxyViewerContainer-Cxpdziwd.js"] }, "/api/config": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/config.ts", "children": ["/api/config/paths"] }, "/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/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/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-b4isaoDp.js", "/assets/ProxyViewerContainer-Cxpdziwd.js"] }, "/api/config/paths": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/config.paths.ts" }, "/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/chunks", "/api/logs/$id/replay"] }, "/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/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/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/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/test": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/providers.$providerId.test.ts", "children": ["/api/providers/$providerId/test/log"] }, "/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-CKnTJ4-O.js" });
1
+ const tsrStartManifest = () => ({ "routes": { "__root__": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/__root.tsx", "children": ["/", "/api/config", "/api/health", "/api/logs", "/api/mcp", "/api/models", "/api/providers", "/api/sessions", "/proxy/$", "/session/$sessionId", "/api/knowledge/candidates", "/api/knowledge/project-context", "/api/knowledge/search", "/api/knowledge/sessions/$sessionId/candidates"], "preloads": ["/assets/main-CwhqfJqM.js"], "assets": [] }, "/": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/index.tsx", "assets": [], "preloads": ["/assets/index-CJgaCJo8.js", "/assets/ProxyViewerContainer-CWdkPZsJ.js"] }, "/api/config": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/config.ts", "children": ["/api/config/paths"] }, "/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/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/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-3ipVoQtW.js", "/assets/ProxyViewerContainer-CWdkPZsJ.js"] }, "/api/config/paths": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/config.paths.ts" }, "/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/chunks", "/api/logs/$id/replay"] }, "/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/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/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/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/test": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/providers.$providerId.test.ts", "children": ["/api/providers/$providerId/test/log"] }, "/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-CwhqfJqM.js" });
2
2
  export {
3
3
  tsrStartManifest
4
4
  };
@@ -38,107 +38,100 @@ const assets = {
38
38
  "/assets/alibaba-TTwafVwX.svg": {
39
39
  "type": "image/svg+xml",
40
40
  "etag": '"171b-6dyV5K8QjiaY35sN9qNprh9zDIs"',
41
- "mtime": "2026-06-21T03:27:09.298Z",
41
+ "mtime": "2026-06-23T00:48:08.639Z",
42
42
  "size": 5915,
43
43
  "path": "../public/assets/alibaba-TTwafVwX.svg"
44
44
  },
45
- "/assets/CompareDrawer-DDmqSAfl.js": {
45
+ "/assets/index-CJgaCJo8.js": {
46
46
  "type": "text/javascript; charset=utf-8",
47
- "etag": '"4a25-ax+lNTJqeO5Uw5iRn0IINDghlL8"',
48
- "mtime": "2026-06-21T03:27:09.300Z",
49
- "size": 18981,
50
- "path": "../public/assets/CompareDrawer-DDmqSAfl.js"
51
- },
52
- "/assets/index-BZ4x5UI6.js": {
53
- "type": "text/javascript; charset=utf-8",
54
- "etag": '"74-I7Q+PS5hgyBfKRdQxaKtu+fOxCI"',
55
- "mtime": "2026-06-21T03:27:09.300Z",
47
+ "etag": '"74-6qvnmISkog5p5/pvGrwRvVnlQD4"',
48
+ "mtime": "2026-06-23T00:48:08.639Z",
56
49
  "size": 116,
57
- "path": "../public/assets/index-BZ4x5UI6.js"
58
- },
59
- "/assets/index-C624DUk9.css": {
60
- "type": "text/css; charset=utf-8",
61
- "etag": '"17b64-fA2ShN0vgWgtCNH7S8ke3+06+1g"',
62
- "mtime": "2026-06-21T03:27:09.300Z",
63
- "size": 97124,
64
- "path": "../public/assets/index-C624DUk9.css"
65
- },
66
- "/assets/ReplayDialog-Bt5DGzlh.js": {
67
- "type": "text/javascript; charset=utf-8",
68
- "etag": '"2383-209uDqfCNP9kp/Eo1OJGkQf5K7o"',
69
- "mtime": "2026-06-21T03:27:09.300Z",
70
- "size": 9091,
71
- "path": "../public/assets/ReplayDialog-Bt5DGzlh.js"
72
- },
73
- "/assets/RequestAnatomy-BxX3_N9S.js": {
74
- "type": "text/javascript; charset=utf-8",
75
- "etag": '"21df-RsC1hle1XaaRP0DDNQAtrI26Ohw"',
76
- "mtime": "2026-06-21T03:27:09.300Z",
77
- "size": 8671,
78
- "path": "../public/assets/RequestAnatomy-BxX3_N9S.js"
50
+ "path": "../public/assets/index-CJgaCJo8.js"
79
51
  },
80
52
  "/assets/minimax-BPMzvuL-.jpeg": {
81
53
  "type": "image/jpeg",
82
54
  "etag": '"1b06-IwivU89ko5UTMUM1/t7hn4sQK9A"',
83
- "mtime": "2026-06-21T03:27:09.300Z",
55
+ "mtime": "2026-06-23T00:48:08.639Z",
84
56
  "size": 6918,
85
57
  "path": "../public/assets/minimax-BPMzvuL-.jpeg"
86
58
  },
87
- "/assets/json-viewer-CRL_gWEZ.js": {
59
+ "/assets/index-Bo1dGS4R.css": {
60
+ "type": "text/css; charset=utf-8",
61
+ "etag": '"193d5-fkJLOBIU3M1KTA3n4iL7ijIR5tQ"',
62
+ "mtime": "2026-06-23T00:48:08.639Z",
63
+ "size": 103381,
64
+ "path": "../public/assets/index-Bo1dGS4R.css"
65
+ },
66
+ "/assets/CompareDrawer-Djb4XFZS.js": {
88
67
  "type": "text/javascript; charset=utf-8",
89
- "etag": '"1e653-xRVAXa9/k/0cz9lZfPZsShTfToA"',
90
- "mtime": "2026-06-21T03:27:09.301Z",
91
- "size": 124499,
92
- "path": "../public/assets/json-viewer-CRL_gWEZ.js"
68
+ "etag": '"49fe-pznTOv+MMFRbS/BX9TfHAnGiok0"',
69
+ "mtime": "2026-06-23T00:48:08.639Z",
70
+ "size": 18942,
71
+ "path": "../public/assets/CompareDrawer-Djb4XFZS.js"
93
72
  },
94
- "/assets/StreamingChunkSequence-RJMwNf6F.js": {
73
+ "/assets/main-CwhqfJqM.js": {
95
74
  "type": "text/javascript; charset=utf-8",
96
- "etag": '"d82-23sq9u+7FJWOVlw2ZwY9VyBv1us"',
97
- "mtime": "2026-06-21T03:27:09.300Z",
98
- "size": 3458,
99
- "path": "../public/assets/StreamingChunkSequence-RJMwNf6F.js"
75
+ "etag": '"51726-qVbs2qbA513grk8p9/KMn4PGqgk"',
76
+ "mtime": "2026-06-23T00:48:08.639Z",
77
+ "size": 333606,
78
+ "path": "../public/assets/main-CwhqfJqM.js"
100
79
  },
101
- "/assets/ResponseView-Bl_5S9gZ.js": {
80
+ "/assets/ReplayDialog-DBPMIs2I.js": {
102
81
  "type": "text/javascript; charset=utf-8",
103
- "etag": '"6aab-UCFRuWGhCGLKb2s5NCp1phbPUzQ"',
104
- "mtime": "2026-06-21T03:27:09.300Z",
105
- "size": 27307,
106
- "path": "../public/assets/ResponseView-Bl_5S9gZ.js"
82
+ "etag": '"2361-5jth9isxe9qJDoue9YT48Duur+w"',
83
+ "mtime": "2026-06-23T00:48:08.639Z",
84
+ "size": 9057,
85
+ "path": "../public/assets/ReplayDialog-DBPMIs2I.js"
86
+ },
87
+ "/assets/RequestAnatomy-FBfRNQN7.js": {
88
+ "type": "text/javascript; charset=utf-8",
89
+ "etag": '"438f-d1hToPfSWy/yglcTSVZmqhw6sPs"',
90
+ "mtime": "2026-06-23T00:48:08.639Z",
91
+ "size": 17295,
92
+ "path": "../public/assets/RequestAnatomy-FBfRNQN7.js"
93
+ },
94
+ "/assets/ResponseView-Db4pJL7U.js": {
95
+ "type": "text/javascript; charset=utf-8",
96
+ "etag": '"30c5-qy6J0XN6/3GV385DLW8wrRN5vmM"',
97
+ "mtime": "2026-06-23T00:48:08.639Z",
98
+ "size": 12485,
99
+ "path": "../public/assets/ResponseView-Db4pJL7U.js"
107
100
  },
108
101
  "/assets/zhipuai-BPNAnxo-.svg": {
109
102
  "type": "image/svg+xml",
110
103
  "etag": '"2bf8-hNaLCTi89nOFCsIIfWpP/jrfo0s"',
111
- "mtime": "2026-06-21T03:27:09.298Z",
104
+ "mtime": "2026-06-23T00:48:08.639Z",
112
105
  "size": 11256,
113
106
  "path": "../public/assets/zhipuai-BPNAnxo-.svg"
114
107
  },
115
- "/assets/_sessionId-b4isaoDp.js": {
116
- "type": "text/javascript; charset=utf-8",
117
- "etag": '"d2-p8zHXMHP91ArIYS6WLwFbKor58Y"',
118
- "mtime": "2026-06-21T03:27:09.300Z",
119
- "size": 210,
120
- "path": "../public/assets/_sessionId-b4isaoDp.js"
121
- },
122
- "/assets/main-CKnTJ4-O.js": {
108
+ "/assets/StreamingChunkSequence-BH175O6R.js": {
123
109
  "type": "text/javascript; charset=utf-8",
124
- "etag": '"5138c-MlPN81hCf/6HY5xIpWbk5sw0drc"',
125
- "mtime": "2026-06-21T03:27:09.300Z",
126
- "size": 332684,
127
- "path": "../public/assets/main-CKnTJ4-O.js"
110
+ "etag": '"d5a-xXaxHLvuFWxj4Xuo8eT8wfx8vC4"',
111
+ "mtime": "2026-06-23T00:48:08.639Z",
112
+ "size": 3418,
113
+ "path": "../public/assets/StreamingChunkSequence-BH175O6R.js"
128
114
  },
129
115
  "/assets/qwen-CONDcHqt.png": {
130
116
  "type": "image/png",
131
117
  "etag": '"572c3-cdJAPaHdOvFCGzuaQjagdgOu6XE"',
132
- "mtime": "2026-06-21T03:27:09.300Z",
118
+ "mtime": "2026-06-23T00:48:08.639Z",
133
119
  "size": 357059,
134
120
  "path": "../public/assets/qwen-CONDcHqt.png"
135
121
  },
136
- "/assets/ProxyViewerContainer-Cxpdziwd.js": {
122
+ "/assets/_sessionId-3ipVoQtW.js": {
123
+ "type": "text/javascript; charset=utf-8",
124
+ "etag": '"d2-nFYnu19OBrYGuMoYXu2+NgVBGhw"',
125
+ "mtime": "2026-06-23T00:48:08.639Z",
126
+ "size": 210,
127
+ "path": "../public/assets/_sessionId-3ipVoQtW.js"
128
+ },
129
+ "/assets/ProxyViewerContainer-CWdkPZsJ.js": {
137
130
  "type": "text/javascript; charset=utf-8",
138
- "etag": '"7d8f5-2o+HRUWRh8QXo5PbcEDo+/1GGt0"',
139
- "mtime": "2026-06-21T03:27:09.300Z",
140
- "size": 514293,
141
- "path": "../public/assets/ProxyViewerContainer-Cxpdziwd.js"
131
+ "etag": '"a2370-RA5+avpa6Zk/W44RGYNOrpe1PtI"',
132
+ "mtime": "2026-06-23T00:48:08.639Z",
133
+ "size": 664432,
134
+ "path": "../public/assets/ProxyViewerContainer-CWdkPZsJ.js"
142
135
  }
143
136
  };
144
137
  function readAsset(id) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tonyclaw/agent-inspector",
3
- "version": "2.0.6",
3
+ "version": "2.0.8",
4
4
  "type": "module",
5
5
  "description": "Agent observability and knowledge capture layer for AI coding tools.",
6
6
  "license": "MIT",
@@ -22,6 +22,7 @@ import type { AnatomySegment } from "./anatomy/types";
22
22
  import { useAnatomyJump } from "./anatomy/useAnatomyJump";
23
23
  import { computeHeadersDiff, computeRequestDiff, DiffView } from "./diff";
24
24
  import { LogEntryHeader } from "./LogEntryHeader";
25
+ import { RequestTools } from "./RequestToolsPanel";
25
26
  import type { CacheTrendEntry } from "./cacheTrend";
26
27
  import { getLogFormatAdapter, resolveLogFormat } from "./log-formats";
27
28
  import {
@@ -29,6 +30,7 @@ import {
29
30
  shouldShowRawRequestTab,
30
31
  shouldShowRequestDiffButton,
31
32
  } from "./logEntryVisibility";
33
+ import { parseRequestTools } from "./requestTools";
32
34
 
33
35
  /**
34
36
  * Lightweight fallback for lazy-loaded tabs. Renders an empty 1px-tall row so
@@ -139,6 +141,10 @@ export const LogEntry = memo(function ({
139
141
  () => adapter.analyzeRequest(log.rawRequestBody),
140
142
  [adapter, log.rawRequestBody],
141
143
  );
144
+ const responseAnalysis = useMemo(
145
+ () => adapter.analyzeResponse(log.responseText),
146
+ [adapter, log.responseText],
147
+ );
142
148
  const strippedRequestBody = useMemo(() => {
143
149
  if (!strip || resolvedFormat !== "anthropic" || log.rawRequestBody === null) {
144
150
  return null;
@@ -275,6 +281,10 @@ export const LogEntry = memo(function ({
275
281
  : null,
276
282
  [adapter, requestExpansion.parsedData],
277
283
  );
284
+ const requestTools = useMemo(
285
+ () => parseRequestTools(requestExpansion.parsedData),
286
+ [requestExpansion.parsedData],
287
+ );
278
288
  const anatomyPaths = useMemo(() => {
279
289
  if (anatomySegments === null) return undefined;
280
290
  return new Set(anatomySegments.map((s) => s.path));
@@ -316,11 +326,11 @@ export const LogEntry = memo(function ({
316
326
  <TabsList className="mx-4 mt-2">
317
327
  {viewMode === "full" && <TabsTrigger value="raw-headers">Raw Headers</TabsTrigger>}
318
328
  {viewMode === "full" && <TabsTrigger value="headers">Headers</TabsTrigger>}
329
+ {anatomySegments !== null && <TabsTrigger value="anatomy">Context</TabsTrigger>}
319
330
  {shouldShowRawRequestTab(resolvedFormat, viewMode, strip) && (
320
331
  <TabsTrigger value="raw-request">Raw Request</TabsTrigger>
321
332
  )}
322
333
  <TabsTrigger value="request">Request</TabsTrigger>
323
- {anatomySegments !== null && <TabsTrigger value="anatomy">Context</TabsTrigger>}
324
334
  {viewMode === "full" && <TabsTrigger value="raw">Raw Response</TabsTrigger>}
325
335
  <TabsTrigger value="parsed">Response</TabsTrigger>
326
336
  </TabsList>
@@ -352,6 +362,10 @@ export const LogEntry = memo(function ({
352
362
  <TabsContent value="request">
353
363
  {activeTab === "request" && (
354
364
  <div className="px-4 pt-1 pb-3">
365
+ <RequestTools
366
+ summary={requestTools}
367
+ calledToolNames={responseAnalysis.toolNames ?? []}
368
+ />
355
369
  {/* All tab actions (Copy, Expand, Diff with Raw, Diff with
356
370
  Previous) live in the log header. The body is just
357
371
  the diff or JSON view, depending on toggle state. */}
@@ -391,8 +405,9 @@ export const LogEntry = memo(function ({
391
405
  {activeTab === "anatomy" && (
392
406
  <Suspense fallback={<TabFallback />}>
393
407
  <LazyRequestAnatomy
394
- parsed={null}
408
+ parsed={requestExpansion.parsedData}
395
409
  inputTokens={log.inputTokens ?? null}
410
+ model={log.model}
396
411
  segments={anatomySegments}
397
412
  onSegmentActivate={jumpToAnatomySegment}
398
413
  />