@tonyclaw/agent-inspector 2.1.15 → 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 (65) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/assets/{CompareDrawer-BcEd6V-V.js → CompareDrawer-Ccrrcx1j.js} +1 -1
  3. package/.output/public/assets/ProxyViewerContainer-DLqClc9A.js +106 -0
  4. package/.output/public/assets/{ReplayDialog-BNpC0548.js → ReplayDialog-C7axhr-l.js} +1 -1
  5. package/.output/public/assets/{RequestAnatomy-Ds1uRLVB.js → RequestAnatomy-WOptg8j_.js} +1 -1
  6. package/.output/public/assets/{ResponseView-7KPVqKl5.js → ResponseView-CSAcxh_M.js} +2 -2
  7. package/.output/public/assets/{StreamingChunkSequence-BHQT261s.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-DjKt8XKe.js → index-DMPNh46t.js} +1 -1
  12. package/.output/public/assets/{json-viewer-CkCu-rka.js → json-viewer-inX5QSa3.js} +1 -1
  13. package/.output/public/assets/{main-DpD1N0S8.js → main-aCAKYGSD.js} +2 -2
  14. package/.output/server/_libs/lucide-react.mjs +207 -171
  15. package/.output/server/{_sessionId-DF9Sy8cP.mjs → _sessionId-C0fhvQnn.mjs} +2 -2
  16. package/.output/server/_ssr/{CompareDrawer-BoxztaO7.mjs → CompareDrawer-CO-Ti5sg.mjs} +3 -3
  17. package/.output/server/_ssr/{ProxyViewerContainer-CRBkqFlJ.mjs → ProxyViewerContainer-N4J7uBCX.mjs} +807 -386
  18. package/.output/server/_ssr/{ReplayDialog-Cc1dyDuK.mjs → ReplayDialog-J1VxC0In.mjs} +4 -4
  19. package/.output/server/_ssr/{RequestAnatomy-CMGSsz5Z.mjs → RequestAnatomy-DBH-F3rq.mjs} +3 -3
  20. package/.output/server/_ssr/{ResponseView-Cp10DM1D.mjs → ResponseView-DLFwV7Hd.mjs} +3 -3
  21. package/.output/server/_ssr/{StreamingChunkSequence-B1VGxy3A.mjs → StreamingChunkSequence-BywmuND0.mjs} +3 -3
  22. package/.output/server/_ssr/{index-47XVPghS.mjs → index-CStymIc0.mjs} +2 -2
  23. package/.output/server/_ssr/index.mjs +2 -2
  24. package/.output/server/_ssr/{json-viewer-zDE2rrmJ.mjs → json-viewer-DlQu0N1x.mjs} +3 -3
  25. package/.output/server/_ssr/{router-DVeuZFqI.mjs → router-CQ4Zxhmr.mjs} +112 -46
  26. package/.output/server/{_tanstack-start-manifest_v-Bp8JxtPW.mjs → _tanstack-start-manifest_v-BHeJBGfo.mjs} +1 -1
  27. package/.output/server/index.mjs +72 -72
  28. package/package.json +1 -1
  29. package/src/components/ProxyViewer.tsx +146 -105
  30. package/src/components/ProxyViewerContainer.tsx +77 -67
  31. package/src/components/alerts/AlertsDialog.tsx +2 -1
  32. package/src/components/clients/ClientLogo.tsx +1 -1
  33. package/src/components/groups/GroupsDialog.tsx +19 -1
  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 +6 -6
  40. package/src/components/proxy-viewer/ConversationGroup.tsx +43 -32
  41. package/src/components/proxy-viewer/ConversationGroupList.tsx +452 -89
  42. package/src/components/proxy-viewer/ConversationHeader.tsx +44 -32
  43. package/src/components/proxy-viewer/LogEntry.tsx +21 -17
  44. package/src/components/proxy-viewer/LogEntryHeader.tsx +38 -45
  45. package/src/components/proxy-viewer/ProviderLogoStack.tsx +2 -2
  46. package/src/components/proxy-viewer/RequestToolsPanel.tsx +9 -9
  47. package/src/components/proxy-viewer/ThreadConnector.tsx +4 -4
  48. package/src/components/proxy-viewer/TurnGroup.tsx +16 -11
  49. package/src/components/proxy-viewer/TurnGroupList.tsx +3 -0
  50. package/src/components/proxy-viewer/viewerState.ts +0 -4
  51. package/src/components/ui/icon-trigger.ts +2 -0
  52. package/src/components/ui/transient-toast.tsx +104 -0
  53. package/src/lib/sessionInfoContract.ts +4 -0
  54. package/src/mcp/server.ts +71 -27
  55. package/src/mcp/toolHandlers.ts +23 -4
  56. package/src/proxy/formats/openai/alibabaProvider.ts +0 -4
  57. package/src/proxy/sessionInfo.ts +31 -2
  58. package/src/proxy/sessionSupervisor.ts +20 -1
  59. package/src/proxy/store.ts +1 -1
  60. package/src/routes/api/providers.$providerId.test.log.ts +8 -4
  61. package/styles/globals.css +180 -180
  62. package/.output/public/assets/ProxyViewerContainer-h851qWNp.js +0 -106
  63. package/.output/public/assets/_sessionId-DWePGjnS.js +0 -1
  64. package/.output/public/assets/index-CI1-G8ua.js +0 -1
  65. package/.output/public/assets/index-DdhFqPsI.css +0 -1
@@ -392,7 +392,7 @@ function CandidateItem({
392
392
 
393
393
  if (editing) {
394
394
  return (
395
- <div className="rounded-md border border-border/80 bg-background/60 px-2.5 py-2">
395
+ <div className="border border-border bg-card shadow-sm rounded-[8px] px-2.5 py-2">
396
396
  <div className="grid gap-2">
397
397
  <div className="flex flex-wrap items-center gap-2">
398
398
  <select
@@ -404,7 +404,7 @@ function CandidateItem({
404
404
  );
405
405
  if (parsed.success) setDraftType(parsed.data);
406
406
  }}
407
- className="h-7 rounded-md border border-input bg-background px-2 text-xs"
407
+ className="border border-input bg-background hover:bg-accent hover:text-accent-foreground h-7 rounded-md px-2 text-xs"
408
408
  aria-label="Candidate type"
409
409
  >
410
410
  <option value="episode">episode</option>
@@ -416,7 +416,7 @@ function CandidateItem({
416
416
  value={draftTitle}
417
417
  disabled={isUpdating}
418
418
  onChange={(event) => setDraftTitle(event.currentTarget.value)}
419
- className="h-7 min-w-[220px] flex-1 rounded-md border border-input bg-background px-2 text-xs"
419
+ className="border border-input bg-background hover:bg-accent hover:text-accent-foreground h-7 min-w-[220px] flex-1 rounded-md px-2 text-xs"
420
420
  aria-label="Candidate title"
421
421
  />
422
422
  </div>
@@ -424,14 +424,14 @@ function CandidateItem({
424
424
  value={draftContent}
425
425
  disabled={isUpdating}
426
426
  onChange={(event) => setDraftContent(event.currentTarget.value)}
427
- className="min-h-28 rounded-md border border-input bg-background px-2 py-1.5 font-mono text-[11px] leading-relaxed"
427
+ className="border border-input bg-background hover:bg-accent hover:text-accent-foreground min-h-28 rounded-md px-2 py-1.5 font-mono text-[11px] leading-relaxed"
428
428
  aria-label="Candidate content"
429
429
  />
430
430
  <input
431
431
  value={draftTags}
432
432
  disabled={isUpdating}
433
433
  onChange={(event) => setDraftTags(event.currentTarget.value)}
434
- className="h-7 rounded-md border border-input bg-background px-2 text-xs"
434
+ className="border border-input bg-background hover:bg-accent hover:text-accent-foreground h-7 rounded-md px-2 text-xs"
435
435
  aria-label="Candidate tags"
436
436
  />
437
437
  <div className="flex flex-wrap items-center gap-2">
@@ -794,7 +794,7 @@ export function AgentTraceSummary({
794
794
  if (logs.length === 0) return null;
795
795
 
796
796
  return (
797
- <section className="mb-2 rounded-lg border border-border bg-muted/10 px-3 py-2">
797
+ <section className="border border-border bg-card shadow-sm mb-2 rounded-[8px] px-3 py-2">
798
798
  <div className="flex flex-wrap items-center gap-x-3 gap-y-2 text-xs">
799
799
  {showRollupMetrics && (
800
800
  <span className="inline-flex items-center gap-1.5 font-semibold text-foreground">
@@ -8,7 +8,7 @@ import { TurnGroupList } from "./TurnGroupList";
8
8
  import { AgentTraceSummary } from "./AgentTraceSummary";
9
9
  import type { CacheTrendEntry } from "./cacheTrend";
10
10
  import { LOG_FOCUS_REQUEST_EVENT, readLogFocusRequest } from "./logFocus";
11
- import { buildTurnGroups, shouldRenderConversationContent } from "./viewerState";
11
+ import { buildTurnGroups } from "./viewerState";
12
12
 
13
13
  export type ConversationGroupProps = {
14
14
  group: ConversationGroupData;
@@ -25,14 +25,18 @@ export type ConversationGroupProps = {
25
25
  /** Callback to open CompareDrawer with a log and its immediate predecessor. */
26
26
  onCompareWithPrevious: (log: CapturedLog) => void;
27
27
  comparisonPredecessors: Map<number, CapturedLog>;
28
- /** When true, skip the group header and render content directly. */
29
- standalone?: boolean;
30
- /** When true, the route-level session context already shows rollup metrics. */
31
- hasPinnedSessionContext?: boolean;
28
+ /** Initial expansion state. Single-session pages use this to show logs under the session header. */
29
+ defaultExpanded?: boolean;
32
30
  /** Controls whether timestamps render as compact local time or full ISO strings. */
33
31
  timeDisplayFormat: TimeDisplayFormat;
34
32
  /** Clear all logs that belong to this group. */
35
33
  onClearGroup: (ids: number[]) => void;
34
+ /** Show IDE identity in the session header. */
35
+ showClientIdentity?: boolean;
36
+ /** Show process/project metadata in the session header. */
37
+ showProcessMetadata?: boolean;
38
+ /** Show client PID/project metadata on individual log rows. */
39
+ showLogClientMetadata?: boolean;
36
40
  /** Optional controlled expansion state used by virtualized lists. */
37
41
  expanded?: boolean;
38
42
  /** Optional controlled expansion setter used by virtualized lists. */
@@ -104,13 +108,15 @@ export const ConversationGroup = memo(function ({
104
108
  onCompareWithPrevious,
105
109
  comparisonPredecessors,
106
110
  onClearGroup,
107
- standalone = false,
108
- hasPinnedSessionContext = false,
111
+ showClientIdentity = true,
112
+ showProcessMetadata = true,
113
+ showLogClientMetadata = true,
114
+ defaultExpanded = false,
109
115
  timeDisplayFormat,
110
116
  expanded: controlledExpanded,
111
117
  onExpandedChange,
112
118
  }: ConversationGroupProps): JSX.Element {
113
- const [internalExpanded, setInternalExpanded] = useState(false);
119
+ const [internalExpanded, setInternalExpanded] = useState(defaultExpanded);
114
120
  const expanded = controlledExpanded ?? internalExpanded;
115
121
  const setExpanded = useCallback(
116
122
  (nextExpanded: boolean) => {
@@ -122,12 +128,17 @@ export const ConversationGroup = memo(function ({
122
128
  },
123
129
  [onExpandedChange],
124
130
  );
131
+
132
+ useEffect(() => {
133
+ if (!defaultExpanded || controlledExpanded !== undefined) return;
134
+ setInternalExpanded(true);
135
+ }, [controlledExpanded, defaultExpanded]);
136
+
125
137
  const stats = useMemo(() => computeStats(group.logs), [group.logs]);
126
138
  const providers = useMemo(() => collectProviders(group.logs), [group.logs]);
127
139
  const startTime = group.logs[0]?.timestamp ?? new Date().toISOString();
128
140
  const endTime = group.logs[group.logs.length - 1]?.timestamp ?? new Date().toISOString();
129
141
  const isLoading = group.logs.some((log) => log.responseStatus === null);
130
- const showTraceRollupMetrics = standalone && !hasPinnedSessionContext;
131
142
  const clientPid = useMemo(() => getFirstClientPid(group.logs), [group.logs]);
132
143
  const clientProjectFolder = useMemo(() => getFirstClientProjectFolder(group.logs), [group.logs]);
133
144
 
@@ -136,7 +147,6 @@ export const ConversationGroup = memo(function ({
136
147
 
137
148
  useEffect(() => {
138
149
  const handleLogFocusRequest = (event: Event): void => {
139
- if (standalone) return;
140
150
  const request = readLogFocusRequest(event);
141
151
  if (request === null) return;
142
152
  if (!group.logs.some((log) => log.id === request.logId)) return;
@@ -147,37 +157,37 @@ export const ConversationGroup = memo(function ({
147
157
  return () => {
148
158
  window.removeEventListener(LOG_FOCUS_REQUEST_EVENT, handleLogFocusRequest);
149
159
  };
150
- }, [group.logs, setExpanded, standalone]);
160
+ }, [group.logs, setExpanded]);
151
161
 
152
162
  return (
153
163
  <div className="mb-2">
154
- {!standalone && (
155
- <ConversationHeader
156
- conversationId={group.conversationId}
157
- startTime={startTime}
158
- endTime={endTime}
159
- totalCalls={group.logs.length}
160
- totalInputTokens={stats.totalInputTokens}
161
- totalOutputTokens={stats.totalOutputTokens}
162
- expanded={expanded}
163
- onToggle={() => setExpanded(!expanded)}
164
- providers={providers}
165
- isLoading={isLoading}
166
- userAgent={group.logs[0]?.userAgent ?? null}
167
- clientPid={clientPid}
168
- clientProjectFolder={clientProjectFolder}
169
- timeDisplayFormat={timeDisplayFormat}
170
- onClear={() => onClearGroup(group.logs.map((l) => l.id))}
171
- />
172
- )}
164
+ <ConversationHeader
165
+ conversationId={group.conversationId}
166
+ startTime={startTime}
167
+ endTime={endTime}
168
+ totalCalls={group.logs.length}
169
+ totalInputTokens={stats.totalInputTokens}
170
+ totalOutputTokens={stats.totalOutputTokens}
171
+ expanded={expanded}
172
+ onToggle={() => setExpanded(!expanded)}
173
+ providers={providers}
174
+ isLoading={isLoading}
175
+ userAgent={group.logs[0]?.userAgent ?? null}
176
+ clientPid={clientPid}
177
+ clientProjectFolder={clientProjectFolder}
178
+ showClientIdentity={showClientIdentity}
179
+ showProcessMetadata={showProcessMetadata}
180
+ timeDisplayFormat={timeDisplayFormat}
181
+ onClear={() => onClearGroup(group.logs.map((l) => l.id))}
182
+ />
173
183
 
174
- {shouldRenderConversationContent(standalone, expanded) && (
184
+ {expanded && (
175
185
  <div>
176
186
  <AgentTraceSummary
177
187
  logs={group.logs}
178
188
  scopeId={group.conversationId}
179
189
  slowResponseThresholdSeconds={slowResponseThresholdSeconds}
180
- showRollupMetrics={showTraceRollupMetrics}
190
+ showRollupMetrics={false}
181
191
  timeDisplayFormat={timeDisplayFormat}
182
192
  />
183
193
  <TurnGroupList
@@ -189,6 +199,7 @@ export const ConversationGroup = memo(function ({
189
199
  cacheTrends={cacheTrends}
190
200
  onCompareWithPrevious={onCompareWithPrevious}
191
201
  comparisonPredecessors={comparisonPredecessors}
202
+ showLogClientMetadata={showLogClientMetadata}
192
203
  />
193
204
  </div>
194
205
  )}