@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.
- package/.output/nitro.json +1 -1
- package/.output/public/assets/{CompareDrawer-BcEd6V-V.js → CompareDrawer-Ccrrcx1j.js} +1 -1
- package/.output/public/assets/ProxyViewerContainer-DLqClc9A.js +106 -0
- package/.output/public/assets/{ReplayDialog-BNpC0548.js → ReplayDialog-C7axhr-l.js} +1 -1
- package/.output/public/assets/{RequestAnatomy-Ds1uRLVB.js → RequestAnatomy-WOptg8j_.js} +1 -1
- package/.output/public/assets/{ResponseView-7KPVqKl5.js → ResponseView-CSAcxh_M.js} +2 -2
- package/.output/public/assets/{StreamingChunkSequence-BHQT261s.js → StreamingChunkSequence-DJS5KhPx.js} +1 -1
- package/.output/public/assets/_sessionId-DUSalzKH.js +1 -0
- package/.output/public/assets/index-BPpA21dY.css +1 -0
- package/.output/public/assets/index-Bt0Az2I2.js +1 -0
- package/.output/public/assets/{index-DjKt8XKe.js → index-DMPNh46t.js} +1 -1
- package/.output/public/assets/{json-viewer-CkCu-rka.js → json-viewer-inX5QSa3.js} +1 -1
- package/.output/public/assets/{main-DpD1N0S8.js → main-aCAKYGSD.js} +2 -2
- package/.output/server/_libs/lucide-react.mjs +207 -171
- package/.output/server/{_sessionId-DF9Sy8cP.mjs → _sessionId-C0fhvQnn.mjs} +2 -2
- package/.output/server/_ssr/{CompareDrawer-BoxztaO7.mjs → CompareDrawer-CO-Ti5sg.mjs} +3 -3
- package/.output/server/_ssr/{ProxyViewerContainer-CRBkqFlJ.mjs → ProxyViewerContainer-N4J7uBCX.mjs} +807 -386
- package/.output/server/_ssr/{ReplayDialog-Cc1dyDuK.mjs → ReplayDialog-J1VxC0In.mjs} +4 -4
- package/.output/server/_ssr/{RequestAnatomy-CMGSsz5Z.mjs → RequestAnatomy-DBH-F3rq.mjs} +3 -3
- package/.output/server/_ssr/{ResponseView-Cp10DM1D.mjs → ResponseView-DLFwV7Hd.mjs} +3 -3
- package/.output/server/_ssr/{StreamingChunkSequence-B1VGxy3A.mjs → StreamingChunkSequence-BywmuND0.mjs} +3 -3
- package/.output/server/_ssr/{index-47XVPghS.mjs → index-CStymIc0.mjs} +2 -2
- package/.output/server/_ssr/index.mjs +2 -2
- package/.output/server/_ssr/{json-viewer-zDE2rrmJ.mjs → json-viewer-DlQu0N1x.mjs} +3 -3
- package/.output/server/_ssr/{router-DVeuZFqI.mjs → router-CQ4Zxhmr.mjs} +112 -46
- package/.output/server/{_tanstack-start-manifest_v-Bp8JxtPW.mjs → _tanstack-start-manifest_v-BHeJBGfo.mjs} +1 -1
- package/.output/server/index.mjs +72 -72
- package/package.json +1 -1
- package/src/components/ProxyViewer.tsx +146 -105
- package/src/components/ProxyViewerContainer.tsx +77 -67
- package/src/components/alerts/AlertsDialog.tsx +2 -1
- package/src/components/clients/ClientLogo.tsx +1 -1
- package/src/components/groups/GroupsDialog.tsx +19 -1
- package/src/components/providers/ProviderCard.tsx +1 -1
- package/src/components/providers/ProviderForm.tsx +18 -18
- package/src/components/providers/ProviderLogo.tsx +6 -1
- package/src/components/providers/ProvidersPanel.tsx +6 -6
- package/src/components/providers/SettingsDialog.tsx +13 -6
- package/src/components/proxy-viewer/AgentTraceSummary.tsx +6 -6
- package/src/components/proxy-viewer/ConversationGroup.tsx +43 -32
- package/src/components/proxy-viewer/ConversationGroupList.tsx +452 -89
- package/src/components/proxy-viewer/ConversationHeader.tsx +44 -32
- package/src/components/proxy-viewer/LogEntry.tsx +21 -17
- package/src/components/proxy-viewer/LogEntryHeader.tsx +38 -45
- package/src/components/proxy-viewer/ProviderLogoStack.tsx +2 -2
- package/src/components/proxy-viewer/RequestToolsPanel.tsx +9 -9
- package/src/components/proxy-viewer/ThreadConnector.tsx +4 -4
- package/src/components/proxy-viewer/TurnGroup.tsx +16 -11
- package/src/components/proxy-viewer/TurnGroupList.tsx +3 -0
- package/src/components/proxy-viewer/viewerState.ts +0 -4
- package/src/components/ui/icon-trigger.ts +2 -0
- package/src/components/ui/transient-toast.tsx +104 -0
- package/src/lib/sessionInfoContract.ts +4 -0
- package/src/mcp/server.ts +71 -27
- package/src/mcp/toolHandlers.ts +23 -4
- package/src/proxy/formats/openai/alibabaProvider.ts +0 -4
- package/src/proxy/sessionInfo.ts +31 -2
- package/src/proxy/sessionSupervisor.ts +20 -1
- package/src/proxy/store.ts +1 -1
- package/src/routes/api/providers.$providerId.test.log.ts +8 -4
- package/styles/globals.css +180 -180
- package/.output/public/assets/ProxyViewerContainer-h851qWNp.js +0 -106
- package/.output/public/assets/_sessionId-DWePGjnS.js +0 -1
- package/.output/public/assets/index-CI1-G8ua.js +0 -1
- 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="
|
|
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="
|
|
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
|
|
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
|
|
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="
|
|
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="
|
|
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
|
|
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
|
-
/**
|
|
29
|
-
|
|
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
|
-
|
|
108
|
-
|
|
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(
|
|
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
|
|
160
|
+
}, [group.logs, setExpanded]);
|
|
151
161
|
|
|
152
162
|
return (
|
|
153
163
|
<div className="mb-2">
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
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
|
-
{
|
|
184
|
+
{expanded && (
|
|
175
185
|
<div>
|
|
176
186
|
<AgentTraceSummary
|
|
177
187
|
logs={group.logs}
|
|
178
188
|
scopeId={group.conversationId}
|
|
179
189
|
slowResponseThresholdSeconds={slowResponseThresholdSeconds}
|
|
180
|
-
showRollupMetrics={
|
|
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
|
)}
|