@tonyclaw/agent-inspector 2.0.5 → 2.0.7

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 (49) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/assets/CompareDrawer-BhRYPp6T.js +1 -0
  3. package/.output/public/assets/ProxyViewerContainer-BHq0dkQG.js +114 -0
  4. package/.output/public/assets/ReplayDialog-Ch0gwg6B.js +1 -0
  5. package/.output/public/assets/RequestAnatomy-CKbvIgaN.js +1 -0
  6. package/.output/public/assets/ResponseView-hRLar32x.js +1 -0
  7. package/.output/public/assets/StreamingChunkSequence-DCJ_gUHa.js +1 -0
  8. package/.output/public/assets/_sessionId-BJTz6t5l.js +1 -0
  9. package/.output/public/assets/index-Cf9U0Ekq.js +1 -0
  10. package/.output/public/assets/index-DTdv7nzl.css +1 -0
  11. package/.output/public/assets/{main-2NlGzgOe.js → main-BlDtK0Nn.js} +2 -2
  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-DWCTasJU.mjs → _sessionId-Dy7rsLS4.mjs} +58 -5
  15. package/.output/server/_ssr/{CompareDrawer-DhrN1uC2.mjs → CompareDrawer-CkVX-ARV.mjs} +9 -8
  16. package/.output/server/_ssr/{ProxyViewerContainer-DRl51s_n.mjs → ProxyViewerContainer-B5a9p3j5.mjs} +856 -32
  17. package/.output/server/_ssr/{ReplayDialog-BQT_ygxC.mjs → ReplayDialog-hXY6H9fB.mjs} +7 -8
  18. package/.output/server/_ssr/RequestAnatomy-B6MS7VvA.mjs +576 -0
  19. package/.output/server/_ssr/{ResponseView-e0kL2C3x.mjs → ResponseView-ByjxwUnp.mjs} +5 -74
  20. package/.output/server/_ssr/{StreamingChunkSequence-BJG-m7xs.mjs → StreamingChunkSequence-C5Kb8siT.mjs} +8 -7
  21. package/.output/server/_ssr/{index-Dea3OeRw.mjs → index-BZXtj42m.mjs} +58 -5
  22. package/.output/server/_ssr/index.mjs +2 -2
  23. package/.output/server/_ssr/{router-Dl7oh0zx.mjs → router-CVQaVF_3.mjs} +5 -5
  24. package/.output/server/{_tanstack-start-manifest_v-m-FJNBVf.mjs → _tanstack-start-manifest_v-Bpe5ZC56.mjs} +1 -1
  25. package/.output/server/index.mjs +58 -65
  26. package/package.json +1 -1
  27. package/src/components/proxy-viewer/LogEntry.tsx +18 -4
  28. package/src/components/proxy-viewer/LogEntryHeader.tsx +3 -3
  29. package/src/components/proxy-viewer/RequestToolsPanel.tsx +292 -0
  30. package/src/components/proxy-viewer/anatomy/RequestAnatomy.tsx +196 -45
  31. package/src/components/proxy-viewer/anatomy/SegmentBar.tsx +92 -67
  32. package/src/components/proxy-viewer/anatomy/types.ts +15 -13
  33. package/src/components/proxy-viewer/log-formats/anthropic.ts +1 -1
  34. package/src/components/proxy-viewer/log-formats/openai.ts +1 -1
  35. package/src/components/proxy-viewer/log-formats/types.ts +1 -1
  36. package/src/components/proxy-viewer/requestTools.ts +213 -0
  37. package/src/components/ui/json-viewer.tsx +1 -1
  38. package/.output/public/assets/CompareDrawer-3nRwtk8J.js +0 -1
  39. package/.output/public/assets/ProxyViewerContainer-CbW5VRER.js +0 -101
  40. package/.output/public/assets/ReplayDialog-Cl62N9PI.js +0 -1
  41. package/.output/public/assets/RequestAnatomy-DgQWGvjs.js +0 -1
  42. package/.output/public/assets/ResponseView-Cvc-ct4E.js +0 -1
  43. package/.output/public/assets/StreamingChunkSequence-BCQaCAIe.js +0 -1
  44. package/.output/public/assets/_sessionId-CcD_aLGq.js +0 -1
  45. package/.output/public/assets/index-B_dffD3u.js +0 -1
  46. package/.output/public/assets/index-CX796gvi.css +0 -1
  47. package/.output/public/assets/json-viewer-IXejqXB0.js +0 -14
  48. package/.output/server/_ssr/RequestAnatomy-DS2tZOgq.mjs +0 -353
  49. package/.output/server/_ssr/json-viewer-DDU55MLK.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-DRl51s_n.mjs";
3
- import { JsonViewer } from "./json-viewer-DDU55MLK.mjs";
4
- import "./router-Dl7oh0zx.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-B5a9p3j5.mjs";
3
+ import "./router-CVQaVF_3.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-DRl51s_n.mjs";
3
- import { JsonViewer } from "./json-viewer-DDU55MLK.mjs";
4
- import "./router-Dl7oh0zx.mjs";
2
+ import { k as TooltipProvider, l as Tooltip, m as TooltipTrigger, B as Badge, n as TooltipContent, t as JsonViewer } from "./ProxyViewerContainer-B5a9p3j5.mjs";
3
+ import "./router-CVQaVF_3.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-DRl51s_n.mjs";
1
+ import { P as ProxyViewerContainer } from "./ProxyViewerContainer-B5a9p3j5.mjs";
2
2
  import "../_libs/react.mjs";
3
- import "./router-Dl7oh0zx.mjs";
3
+ import "./router-CVQaVF_3.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-m-FJNBVf.mjs");
201
+ const { tsrStartManifest } = await import("../_tanstack-start-manifest_v-Bpe5ZC56.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-Dl7oh0zx.mjs").then((n) => n.i);
770
+ const routerEntry = await import("./router-CVQaVF_3.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-CX796gvi.css";
52
+ const appCss = "/assets/index-DTdv7nzl.css";
53
53
  const Route$r = createRootRoute({
54
54
  head: () => ({
55
55
  meta: [
@@ -76,7 +76,7 @@ function RootDocument({ children }) {
76
76
  ] })
77
77
  ] });
78
78
  }
79
- const $$splitComponentImporter$1 = () => import("./index-Dea3OeRw.mjs");
79
+ const $$splitComponentImporter$1 = () => import("./index-BZXtj42m.mjs");
80
80
  const Route$q = createFileRoute("/")({
81
81
  component: lazyRouteComponent($$splitComponentImporter$1, "component")
82
82
  });
@@ -119,7 +119,7 @@ function decodeSessionIdFromPath(encoded) {
119
119
  function getSessionPath(sessionId) {
120
120
  return `/session/${encodeSessionIdForPath(sessionId)}`;
121
121
  }
122
- const $$splitComponentImporter = () => import("../_sessionId-DWCTasJU.mjs");
122
+ const $$splitComponentImporter = () => import("../_sessionId-Dy7rsLS4.mjs");
123
123
  const Route$p = createFileRoute("/session/$sessionId")({
124
124
  component: lazyRouteComponent($$splitComponentImporter, "component"),
125
125
  parseParams: (params) => ({
@@ -6658,7 +6658,7 @@ export {
6658
6658
  DEFAULT_TIME_DISPLAY_FORMAT as a,
6659
6659
  RuntimeConfigSchema as b,
6660
6660
  AnthropicRequestSchema as c,
6661
- safeGetOwnProperty as d,
6661
+ stripClaudeCodeBillingHeader as d,
6662
6662
  createPendingProviderTestResults as e,
6663
6663
  createFailedProviderTestResults as f,
6664
6664
  getSessionPath as g,
@@ -6666,5 +6666,5 @@ export {
6666
6666
  router as i,
6667
6667
  parseOpenAIResponse as p,
6668
6668
  requestFormatForPath as r,
6669
- stripClaudeCodeBillingHeader as s
6669
+ safeGetOwnProperty as s
6670
6670
  };
@@ -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-2NlGzgOe.js"], "assets": [] }, "/": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/index.tsx", "assets": [], "preloads": ["/assets/index-B_dffD3u.js", "/assets/ProxyViewerContainer-CbW5VRER.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-CcD_aLGq.js", "/assets/ProxyViewerContainer-CbW5VRER.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-2NlGzgOe.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-BlDtK0Nn.js"], "assets": [] }, "/": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/index.tsx", "assets": [], "preloads": ["/assets/index-Cf9U0Ekq.js", "/assets/ProxyViewerContainer-BHq0dkQG.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-BJTz6t5l.js", "/assets/ProxyViewerContainer-BHq0dkQG.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-BlDtK0Nn.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-21T02:55:38.892Z",
41
+ "mtime": "2026-06-22T08:00:19.450Z",
42
42
  "size": 5915,
43
43
  "path": "../public/assets/alibaba-TTwafVwX.svg"
44
44
  },
45
+ "/assets/index-Cf9U0Ekq.js": {
46
+ "type": "text/javascript; charset=utf-8",
47
+ "etag": '"74-xEOmMI8UrD1JoLsCUcOURuvg1RI"',
48
+ "mtime": "2026-06-22T08:00:19.450Z",
49
+ "size": 116,
50
+ "path": "../public/assets/index-Cf9U0Ekq.js"
51
+ },
52
+ "/assets/CompareDrawer-BhRYPp6T.js": {
53
+ "type": "text/javascript; charset=utf-8",
54
+ "etag": '"49fe-PMQYhnaFlcJwZxqT6Vpg/f0JQTM"',
55
+ "mtime": "2026-06-22T08:00:19.451Z",
56
+ "size": 18942,
57
+ "path": "../public/assets/CompareDrawer-BhRYPp6T.js"
58
+ },
45
59
  "/assets/minimax-BPMzvuL-.jpeg": {
46
60
  "type": "image/jpeg",
47
61
  "etag": '"1b06-IwivU89ko5UTMUM1/t7hn4sQK9A"',
48
- "mtime": "2026-06-21T02:55:38.892Z",
62
+ "mtime": "2026-06-22T08:00:19.450Z",
49
63
  "size": 6918,
50
64
  "path": "../public/assets/minimax-BPMzvuL-.jpeg"
51
65
  },
52
- "/assets/CompareDrawer-3nRwtk8J.js": {
53
- "type": "text/javascript; charset=utf-8",
54
- "etag": '"4a25-urgvq4zVkJNkh48bDzRCZpmV0XU"',
55
- "mtime": "2026-06-21T02:55:38.893Z",
56
- "size": 18981,
57
- "path": "../public/assets/CompareDrawer-3nRwtk8J.js"
58
- },
59
- "/assets/index-B_dffD3u.js": {
60
- "type": "text/javascript; charset=utf-8",
61
- "etag": '"74-G34R32wRb35yFy01Xx5+tisQpbk"',
62
- "mtime": "2026-06-21T02:55:38.892Z",
63
- "size": 116,
64
- "path": "../public/assets/index-B_dffD3u.js"
65
- },
66
- "/assets/index-CX796gvi.css": {
66
+ "/assets/index-DTdv7nzl.css": {
67
67
  "type": "text/css; charset=utf-8",
68
- "etag": '"17a41-dqXsKD+MttGurME/qf9nmjJckRY"',
69
- "mtime": "2026-06-21T02:55:38.892Z",
70
- "size": 96833,
71
- "path": "../public/assets/index-CX796gvi.css"
68
+ "etag": '"18983-TRWmqsHw7W8cvkbG8DLftLqrfdk"',
69
+ "mtime": "2026-06-22T08:00:19.450Z",
70
+ "size": 100739,
71
+ "path": "../public/assets/index-DTdv7nzl.css"
72
72
  },
73
- "/assets/json-viewer-IXejqXB0.js": {
73
+ "/assets/main-BlDtK0Nn.js": {
74
74
  "type": "text/javascript; charset=utf-8",
75
- "etag": '"1e653-JGlILG827/WNy4+hkJi+2gTndaU"',
76
- "mtime": "2026-06-21T02:55:38.893Z",
77
- "size": 124499,
78
- "path": "../public/assets/json-viewer-IXejqXB0.js"
75
+ "etag": '"5138c-ij2nRLRbIl6cPFBzJLHVSsai1cQ"',
76
+ "mtime": "2026-06-22T08:00:19.450Z",
77
+ "size": 332684,
78
+ "path": "../public/assets/main-BlDtK0Nn.js"
79
79
  },
80
- "/assets/ResponseView-Cvc-ct4E.js": {
80
+ "/assets/ReplayDialog-Ch0gwg6B.js": {
81
81
  "type": "text/javascript; charset=utf-8",
82
- "etag": '"6aab-UwVVOTtKRLo51GriiJxR9m6Feak"',
83
- "mtime": "2026-06-21T02:55:38.893Z",
84
- "size": 27307,
85
- "path": "../public/assets/ResponseView-Cvc-ct4E.js"
82
+ "etag": '"2361-9kpJuXbOb9cGd0DdpQzWtIgsmxA"',
83
+ "mtime": "2026-06-22T08:00:19.451Z",
84
+ "size": 9057,
85
+ "path": "../public/assets/ReplayDialog-Ch0gwg6B.js"
86
86
  },
87
- "/assets/ReplayDialog-Cl62N9PI.js": {
87
+ "/assets/StreamingChunkSequence-DCJ_gUHa.js": {
88
88
  "type": "text/javascript; charset=utf-8",
89
- "etag": '"2383-flKSjr0F8tecuRkIDNpAYjivJcI"',
90
- "mtime": "2026-06-21T02:55:38.893Z",
91
- "size": 9091,
92
- "path": "../public/assets/ReplayDialog-Cl62N9PI.js"
89
+ "etag": '"d5a-6yxw99IEj6YNxQ5KDZBaoDdLnuc"',
90
+ "mtime": "2026-06-22T08:00:19.452Z",
91
+ "size": 3418,
92
+ "path": "../public/assets/StreamingChunkSequence-DCJ_gUHa.js"
93
93
  },
94
- "/assets/RequestAnatomy-DgQWGvjs.js": {
94
+ "/assets/RequestAnatomy-CKbvIgaN.js": {
95
95
  "type": "text/javascript; charset=utf-8",
96
- "etag": '"1426-61x287FrHKfb80GSEu4faAyIsQQ"',
97
- "mtime": "2026-06-21T02:55:38.893Z",
98
- "size": 5158,
99
- "path": "../public/assets/RequestAnatomy-DgQWGvjs.js"
96
+ "etag": '"21df-6Gc0zWlW2mnPWrccJEuLrGd6Dyc"',
97
+ "mtime": "2026-06-22T08:00:19.451Z",
98
+ "size": 8671,
99
+ "path": "../public/assets/RequestAnatomy-CKbvIgaN.js"
100
100
  },
101
- "/assets/StreamingChunkSequence-BCQaCAIe.js": {
101
+ "/assets/ResponseView-hRLar32x.js": {
102
102
  "type": "text/javascript; charset=utf-8",
103
- "etag": '"d82-mxAzpHhDD3SrHO5SmP2+22ql54A"',
104
- "mtime": "2026-06-21T02:55:38.893Z",
105
- "size": 3458,
106
- "path": "../public/assets/StreamingChunkSequence-BCQaCAIe.js"
103
+ "etag": '"30c5-dfn2k+6jf56jyWWG5aOTnuM6tzM"',
104
+ "mtime": "2026-06-22T08:00:19.452Z",
105
+ "size": 12485,
106
+ "path": "../public/assets/ResponseView-hRLar32x.js"
107
107
  },
108
- "/assets/ProxyViewerContainer-CbW5VRER.js": {
108
+ "/assets/_sessionId-BJTz6t5l.js": {
109
109
  "type": "text/javascript; charset=utf-8",
110
- "etag": '"7d8fb-FLtU4XIXbbkqJROwzR9ncAvk86E"',
111
- "mtime": "2026-06-21T02:55:38.893Z",
112
- "size": 514299,
113
- "path": "../public/assets/ProxyViewerContainer-CbW5VRER.js"
110
+ "etag": '"d2-9Vn7vkBxIyXzmcuMuxvTdhm9y50"',
111
+ "mtime": "2026-06-22T08:00:19.450Z",
112
+ "size": 210,
113
+ "path": "../public/assets/_sessionId-BJTz6t5l.js"
114
114
  },
115
115
  "/assets/qwen-CONDcHqt.png": {
116
116
  "type": "image/png",
117
117
  "etag": '"572c3-cdJAPaHdOvFCGzuaQjagdgOu6XE"',
118
- "mtime": "2026-06-21T02:55:38.892Z",
118
+ "mtime": "2026-06-22T08:00:19.450Z",
119
119
  "size": 357059,
120
120
  "path": "../public/assets/qwen-CONDcHqt.png"
121
121
  },
122
122
  "/assets/zhipuai-BPNAnxo-.svg": {
123
123
  "type": "image/svg+xml",
124
124
  "etag": '"2bf8-hNaLCTi89nOFCsIIfWpP/jrfo0s"',
125
- "mtime": "2026-06-21T02:55:38.892Z",
125
+ "mtime": "2026-06-22T08:00:19.450Z",
126
126
  "size": 11256,
127
127
  "path": "../public/assets/zhipuai-BPNAnxo-.svg"
128
128
  },
129
- "/assets/main-2NlGzgOe.js": {
129
+ "/assets/ProxyViewerContainer-BHq0dkQG.js": {
130
130
  "type": "text/javascript; charset=utf-8",
131
- "etag": '"5138c-nIshtdU9NYoVXvBBEN1D74xi9gk"',
132
- "mtime": "2026-06-21T02:55:38.892Z",
133
- "size": 332684,
134
- "path": "../public/assets/main-2NlGzgOe.js"
135
- },
136
- "/assets/_sessionId-CcD_aLGq.js": {
137
- "type": "text/javascript; charset=utf-8",
138
- "etag": '"d2-ELNVvbTmYkGjU2wEF0iGQm6YfmM"',
139
- "mtime": "2026-06-21T02:55:38.892Z",
140
- "size": 210,
141
- "path": "../public/assets/_sessionId-CcD_aLGq.js"
131
+ "etag": '"a2352-gdvRbHXbPGRttPU1DgQ7eHEkZDE"',
132
+ "mtime": "2026-06-22T08:00:19.451Z",
133
+ "size": 664402,
134
+ "path": "../public/assets/ProxyViewerContainer-BHq0dkQG.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.5",
3
+ "version": "2.0.7",
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;
@@ -177,7 +183,7 @@ export const LogEntry = memo(function ({
177
183
  const responseCopy = useCopyFeedback(log.responseText);
178
184
 
179
185
  // Per-tab action bundles consumed by the header. The header renders the
180
- // entry whose key matches `activeTab`. Tabs without an entry (Anatomy,
186
+ // entry whose key matches `activeTab`. Tabs without an entry (Context,
181
187
  // Parsed Response) render no header buttons.
182
188
  const tabActions: HeaderTabActions = useMemo(
183
189
  () => ({
@@ -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">Anatomy</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. */}
@@ -359,7 +373,7 @@ export const LogEntry = memo(function ({
359
373
  <RequestDiffContent
360
374
  rawBody={log.rawRequestBody}
361
375
  displayedBody={displayedRequestBody}
362
- emptyLabel="No transformation applied raw and sent request bodies are identical."
376
+ emptyLabel="No transformation applied; raw and sent request bodies are identical."
363
377
  />
364
378
  ) : (
365
379
  <div ref={requestJsonRef}>
@@ -424,7 +438,7 @@ export const LogEntry = memo(function ({
424
438
  <HeadersDiffContent
425
439
  rawHeaders={log.rawHeaders}
426
440
  headers={log.headers}
427
- emptyLabel="No transformation applied raw and processed headers are identical."
441
+ emptyLabel="No transformation applied; raw and processed headers are identical."
428
442
  />
429
443
  ) : log.headers && Object.keys(log.headers).length > 0 ? (
430
444
  <div className="space-y-1 font-mono text-xs">
@@ -92,7 +92,7 @@ export type HeaderTabAction = {
92
92
  };
93
93
 
94
94
  /**
95
- * Tab actions keyed by Tabs value. Tabs without an entry (Anatomy, Parsed
95
+ * Tab actions keyed by Tabs value. Tabs without an entry (Context, Parsed
96
96
  * Response) leave the corresponding key unset, so the header renders no
97
97
  * action buttons for them. Typed as a record (rather than a `Partial<...>`
98
98
  * union) so the per-tab lookup in the header is type-safe.
@@ -109,14 +109,14 @@ export type LogEntryHeaderProps = {
109
109
  onToggle: () => void;
110
110
  /** Per-log cache token trend (creation + read) relative to the previous log
111
111
  * in the same conversation group. When `undefined` or a field is `null`,
112
- * the corresponding cache span renders as it did before no arrow.
112
+ * the corresponding cache span renders as it did before: no arrow.
113
113
  */
114
114
  cacheTrend?: { creation: CacheTrend | null; read: CacheTrend | null } | null;
115
115
  /** Currently-active tab value (matches the `Tabs` value prop). The header
116
116
  * uses this to pick the right entry from `tabActions`. */
117
117
  activeTab?: string;
118
118
  /** Per-tab Copy + Expand-all actions. Only tabs with an entry will show
119
- * buttons when active. Tabs without an entry (Anatomy, Parsed Response)
119
+ * buttons when active. Tabs without an entry (Context, Parsed Response)
120
120
  * render no header buttons. */
121
121
  tabActions?: HeaderTabActions;
122
122
  /** Re-send this request to the provider. Rendered in the header row when