@tonyclaw/agent-inspector 3.0.34 → 3.0.36
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-hkDPH0fn.js → CompareDrawer-BF8Yk4Nq.js} +1 -1
- package/.output/public/assets/{InspectorPet-CA5p_sKZ.js → InspectorPet-D01knLHJ.js} +1 -1
- package/.output/public/assets/ProxyViewerContainer-CArcMNg_.js +126 -0
- package/.output/public/assets/{ReplayDialog-DYQdKnLy.js → ReplayDialog-NRgCp09o.js} +1 -1
- package/.output/public/assets/{RequestAnatomy-CLWPhe7O.js → RequestAnatomy-BPiUptQ-.js} +1 -1
- package/.output/public/assets/{ResponseView-CmKzB3ef.js → ResponseView-C6oCKVyP.js} +1 -1
- package/.output/public/assets/{StreamingChunkSequence-pUlWbVcB.js → StreamingChunkSequence-B90BNPvD.js} +1 -1
- package/.output/public/assets/{_sessionId-CUxLgyb5.js → _sessionId-B7pqqX6S.js} +1 -1
- package/.output/public/assets/{_sessionId-DHvUgaat.js → _sessionId-c3quqe4s.js} +1 -1
- package/.output/public/assets/index-BQqVblQv.css +1 -0
- package/.output/public/assets/{index-CeoArIMR.js → index-CjODQxYY.js} +1 -1
- package/.output/public/assets/{index-DD2OkbP7.js → index-CmGZ17BL.js} +1 -1
- package/.output/public/assets/{index-sBAb_qFx.js → index-D444FJGM.js} +3 -3
- package/.output/public/assets/{index-4H-j0aS5.js → index-D4Atppe6.js} +1 -1
- package/.output/public/assets/{json-viewer-hDs5IHIL.js → json-viewer-CuYTDXFj.js} +1 -1
- package/.output/public/assets/{jszip.min-DVJw8OAI.js → jszip.min-C-avw0w1.js} +1 -1
- package/.output/server/_libs/lucide-react.mjs +15 -15
- package/.output/server/_libs/radix-ui__react-id.mjs +1 -1
- package/.output/server/_libs/radix-ui__react-select.mjs +7 -7
- package/.output/server/{_sessionId-Ci_EMh_S.mjs → _sessionId-BTazjVlZ.mjs} +1 -1
- package/.output/server/{_sessionId-VR4I9Q9_.mjs → _sessionId-BsDZ3m3b.mjs} +23 -23
- package/.output/server/_ssr/{CompareDrawer-DuqQ0e6l.mjs → CompareDrawer-BMo93_DO.mjs} +24 -24
- package/.output/server/_ssr/{InspectorPet-Bfbhn0ap.mjs → InspectorPet-DApzyYro.mjs} +1 -1
- package/.output/server/_ssr/{ProxyViewerContainer-DmGPK-AE.mjs → ProxyViewerContainer-CiXXtVXH.mjs} +313 -119
- package/.output/server/_ssr/{ReplayDialog-0u4cndNH.mjs → ReplayDialog-B8bP1qUr.mjs} +25 -25
- package/.output/server/_ssr/{RequestAnatomy-Ce-NTi7F.mjs → RequestAnatomy-DkVynjyh.mjs} +23 -23
- package/.output/server/_ssr/{ResponseView-DFRnVFw7.mjs → ResponseView-BAQa0WUP.mjs} +24 -24
- package/.output/server/_ssr/{StreamingChunkSequence-DR-YGqy7.mjs → StreamingChunkSequence-B4_K4_VI.mjs} +23 -23
- package/.output/server/_ssr/{index-BCfDaKgt.mjs → index-BiwG5Sws.mjs} +23 -23
- package/.output/server/_ssr/{index-kmjlky6J.mjs → index-DhjNsApq.mjs} +1 -1
- package/.output/server/_ssr/index.mjs +2 -2
- package/.output/server/_ssr/{json-viewer-BPYmlvZw.mjs → json-viewer-Dlpq5S-r.mjs} +24 -24
- package/.output/server/_ssr/{router-DMdBkU6i.mjs → router-6s7p8rsX.mjs} +11 -11
- package/.output/server/{_tanstack-start-manifest_v-7YTvkFnH.mjs → _tanstack-start-manifest_v-ClIF-cfh.mjs} +1 -1
- package/.output/server/index.mjs +85 -85
- package/package.json +1 -1
- package/src/components/ProxyViewer.tsx +286 -84
- package/src/components/pi-agent/PiAgentPanel.tsx +90 -33
- package/src/services/piAgent.ts +7 -5
- package/.output/public/assets/ProxyViewerContainer-BI8mJZEm.js +0 -126
- package/.output/public/assets/index-D17dU-mX.css +0 -1
package/.output/server/index.mjs
CHANGED
|
@@ -20,149 +20,149 @@ const assets = {
|
|
|
20
20
|
"/assets/agent-inspector-58K1_MsC.ico": {
|
|
21
21
|
"type": "image/vnd.microsoft.icon",
|
|
22
22
|
"etag": '"38fa-ZD8kPABHYjPIkcH82FMY6iZM7fI"',
|
|
23
|
-
"mtime": "2026-07-
|
|
23
|
+
"mtime": "2026-07-14T02:44:56.239Z",
|
|
24
24
|
"size": 14586,
|
|
25
25
|
"path": "../public/assets/agent-inspector-58K1_MsC.ico"
|
|
26
26
|
},
|
|
27
27
|
"/assets/alibaba-TTwafVwX.svg": {
|
|
28
28
|
"type": "image/svg+xml",
|
|
29
29
|
"etag": '"171b-6dyV5K8QjiaY35sN9qNprh9zDIs"',
|
|
30
|
-
"mtime": "2026-07-
|
|
30
|
+
"mtime": "2026-07-14T02:44:56.239Z",
|
|
31
31
|
"size": 5915,
|
|
32
32
|
"path": "../public/assets/alibaba-TTwafVwX.svg"
|
|
33
33
|
},
|
|
34
|
-
"/assets/index-
|
|
34
|
+
"/assets/index-D4Atppe6.js": {
|
|
35
35
|
"type": "text/javascript; charset=utf-8",
|
|
36
|
-
"etag": '"
|
|
37
|
-
"mtime": "2026-07-
|
|
38
|
-
"size":
|
|
39
|
-
"path": "../public/assets/index-
|
|
40
|
-
},
|
|
41
|
-
"/assets/CompareDrawer-hkDPH0fn.js": {
|
|
42
|
-
"type": "text/javascript; charset=utf-8",
|
|
43
|
-
"etag": '"502d-j82GwBVhdwVcb9z/MxlsIrTZXSE"',
|
|
44
|
-
"mtime": "2026-07-14T01:21:45.705Z",
|
|
45
|
-
"size": 20525,
|
|
46
|
-
"path": "../public/assets/CompareDrawer-hkDPH0fn.js"
|
|
36
|
+
"etag": '"9f-D+eRvMqRLb5QR3vMAz0DZLw+A50"',
|
|
37
|
+
"mtime": "2026-07-14T02:44:56.239Z",
|
|
38
|
+
"size": 159,
|
|
39
|
+
"path": "../public/assets/index-D4Atppe6.js"
|
|
47
40
|
},
|
|
48
|
-
"/assets/index-
|
|
41
|
+
"/assets/index-CmGZ17BL.js": {
|
|
49
42
|
"type": "text/javascript; charset=utf-8",
|
|
50
|
-
"etag": '"1cd2d-
|
|
51
|
-
"mtime": "2026-07-
|
|
43
|
+
"etag": '"1cd2d-0pcUF6d6HAJaUrV9kHVsiVQREjs"',
|
|
44
|
+
"mtime": "2026-07-14T02:44:56.239Z",
|
|
52
45
|
"size": 118061,
|
|
53
|
-
"path": "../public/assets/index-
|
|
46
|
+
"path": "../public/assets/index-CmGZ17BL.js"
|
|
54
47
|
},
|
|
55
|
-
"/assets/index-
|
|
48
|
+
"/assets/index-CjODQxYY.js": {
|
|
56
49
|
"type": "text/javascript; charset=utf-8",
|
|
57
|
-
"etag": '"
|
|
58
|
-
"mtime": "2026-07-
|
|
59
|
-
"size":
|
|
60
|
-
"path": "../public/assets/index-
|
|
50
|
+
"etag": '"265-KTSIOcuxU5V5YzdEzDoIWAhykFw"',
|
|
51
|
+
"mtime": "2026-07-14T02:44:56.239Z",
|
|
52
|
+
"size": 613,
|
|
53
|
+
"path": "../public/assets/index-CjODQxYY.js"
|
|
61
54
|
},
|
|
62
|
-
"/assets/index-
|
|
55
|
+
"/assets/index-BQqVblQv.css": {
|
|
63
56
|
"type": "text/css; charset=utf-8",
|
|
64
|
-
"etag": '"
|
|
65
|
-
"mtime": "2026-07-
|
|
66
|
-
"size":
|
|
67
|
-
"path": "../public/assets/index-
|
|
57
|
+
"etag": '"2b0c7-DAZZG+g1Z71NTob4Ki58V+cY8IE"',
|
|
58
|
+
"mtime": "2026-07-14T02:44:56.239Z",
|
|
59
|
+
"size": 176327,
|
|
60
|
+
"path": "../public/assets/index-BQqVblQv.css"
|
|
68
61
|
},
|
|
69
|
-
"/assets/
|
|
62
|
+
"/assets/jszip.min-C-avw0w1.js": {
|
|
70
63
|
"type": "text/javascript; charset=utf-8",
|
|
71
|
-
"etag": '"
|
|
72
|
-
"mtime": "2026-07-
|
|
73
|
-
"size":
|
|
74
|
-
"path": "../public/assets/
|
|
75
|
-
},
|
|
76
|
-
"/assets/index-sBAb_qFx.js": {
|
|
77
|
-
"type": "text/javascript; charset=utf-8",
|
|
78
|
-
"etag": '"5c73b-/pjDaGh7AA9FeJ/lju/zUAOG2So"',
|
|
79
|
-
"mtime": "2026-07-14T01:21:45.705Z",
|
|
80
|
-
"size": 378683,
|
|
81
|
-
"path": "../public/assets/index-sBAb_qFx.js"
|
|
64
|
+
"etag": '"17b79-B5ORObElRCcrSZqbp9zKZAKRDFw"',
|
|
65
|
+
"mtime": "2026-07-14T02:44:56.239Z",
|
|
66
|
+
"size": 97145,
|
|
67
|
+
"path": "../public/assets/jszip.min-C-avw0w1.js"
|
|
82
68
|
},
|
|
83
|
-
"/assets/
|
|
69
|
+
"/assets/json-viewer-CuYTDXFj.js": {
|
|
84
70
|
"type": "text/javascript; charset=utf-8",
|
|
85
|
-
"etag": '"
|
|
86
|
-
"mtime": "2026-07-
|
|
87
|
-
"size":
|
|
88
|
-
"path": "../public/assets/
|
|
71
|
+
"etag": '"1ae2-NlF0Mop+pYLwG1w3RhlEIHd3f6M"',
|
|
72
|
+
"mtime": "2026-07-14T02:44:56.239Z",
|
|
73
|
+
"size": 6882,
|
|
74
|
+
"path": "../public/assets/json-viewer-CuYTDXFj.js"
|
|
89
75
|
},
|
|
90
76
|
"/assets/minimax-BPMzvuL-.jpeg": {
|
|
91
77
|
"type": "image/jpeg",
|
|
92
78
|
"etag": '"1b06-IwivU89ko5UTMUM1/t7hn4sQK9A"',
|
|
93
|
-
"mtime": "2026-07-
|
|
79
|
+
"mtime": "2026-07-14T02:44:56.239Z",
|
|
94
80
|
"size": 6918,
|
|
95
81
|
"path": "../public/assets/minimax-BPMzvuL-.jpeg"
|
|
96
82
|
},
|
|
83
|
+
"/assets/CompareDrawer-BF8Yk4Nq.js": {
|
|
84
|
+
"type": "text/javascript; charset=utf-8",
|
|
85
|
+
"etag": '"502d-+CRLcQPk56apbzopyjIK7OeC+64"',
|
|
86
|
+
"mtime": "2026-07-14T02:44:56.239Z",
|
|
87
|
+
"size": 20525,
|
|
88
|
+
"path": "../public/assets/CompareDrawer-BF8Yk4Nq.js"
|
|
89
|
+
},
|
|
97
90
|
"/assets/qwen-mMn3f5ul.webp": {
|
|
98
91
|
"type": "image/webp",
|
|
99
92
|
"etag": '"1b1a-Tw+b2ynhJQl9WztaK3ajSL85yaU"',
|
|
100
|
-
"mtime": "2026-07-
|
|
93
|
+
"mtime": "2026-07-14T02:44:56.239Z",
|
|
101
94
|
"size": 6938,
|
|
102
95
|
"path": "../public/assets/qwen-mMn3f5ul.webp"
|
|
103
96
|
},
|
|
104
|
-
"/assets/
|
|
97
|
+
"/assets/index-D444FJGM.js": {
|
|
105
98
|
"type": "text/javascript; charset=utf-8",
|
|
106
|
-
"etag": '"
|
|
107
|
-
"mtime": "2026-07-
|
|
108
|
-
"size":
|
|
109
|
-
"path": "../public/assets/
|
|
99
|
+
"etag": '"5c73b-zkVN5YAn6bcio0NCH5Zu7oxkCwg"',
|
|
100
|
+
"mtime": "2026-07-14T02:44:56.239Z",
|
|
101
|
+
"size": 378683,
|
|
102
|
+
"path": "../public/assets/index-D444FJGM.js"
|
|
110
103
|
},
|
|
111
|
-
"/assets/ReplayDialog-
|
|
104
|
+
"/assets/ReplayDialog-NRgCp09o.js": {
|
|
112
105
|
"type": "text/javascript; charset=utf-8",
|
|
113
|
-
"etag": '"3294-
|
|
114
|
-
"mtime": "2026-07-
|
|
106
|
+
"etag": '"3294-kzcFg9LNlXsgRjIa5iHlaZbAVlI"',
|
|
107
|
+
"mtime": "2026-07-14T02:44:56.239Z",
|
|
115
108
|
"size": 12948,
|
|
116
|
-
"path": "../public/assets/ReplayDialog-
|
|
109
|
+
"path": "../public/assets/ReplayDialog-NRgCp09o.js"
|
|
110
|
+
},
|
|
111
|
+
"/assets/RequestAnatomy-BPiUptQ-.js": {
|
|
112
|
+
"type": "text/javascript; charset=utf-8",
|
|
113
|
+
"etag": '"43f3-cO/hDMy+ALC5MMo6P1yyZj88Ipk"',
|
|
114
|
+
"mtime": "2026-07-14T02:44:56.239Z",
|
|
115
|
+
"size": 17395,
|
|
116
|
+
"path": "../public/assets/RequestAnatomy-BPiUptQ-.js"
|
|
117
|
+
},
|
|
118
|
+
"/assets/ResponseView-C6oCKVyP.js": {
|
|
119
|
+
"type": "text/javascript; charset=utf-8",
|
|
120
|
+
"etag": '"44d3-YmDPkb3gUJiajQ+jbXmXrfn1C5M"',
|
|
121
|
+
"mtime": "2026-07-14T02:44:56.239Z",
|
|
122
|
+
"size": 17619,
|
|
123
|
+
"path": "../public/assets/ResponseView-C6oCKVyP.js"
|
|
117
124
|
},
|
|
118
|
-
"/assets/StreamingChunkSequence-
|
|
125
|
+
"/assets/StreamingChunkSequence-B90BNPvD.js": {
|
|
119
126
|
"type": "text/javascript; charset=utf-8",
|
|
120
|
-
"etag": '"e96
|
|
121
|
-
"mtime": "2026-07-
|
|
127
|
+
"etag": '"e96-eBbmQGKi+oHgss6vvW/qKLZgrNU"',
|
|
128
|
+
"mtime": "2026-07-14T02:44:56.239Z",
|
|
122
129
|
"size": 3734,
|
|
123
|
-
"path": "../public/assets/StreamingChunkSequence-
|
|
130
|
+
"path": "../public/assets/StreamingChunkSequence-B90BNPvD.js"
|
|
124
131
|
},
|
|
125
132
|
"/assets/zhipuai-BPNAnxo-.svg": {
|
|
126
133
|
"type": "image/svg+xml",
|
|
127
134
|
"etag": '"2bf8-hNaLCTi89nOFCsIIfWpP/jrfo0s"',
|
|
128
|
-
"mtime": "2026-07-
|
|
135
|
+
"mtime": "2026-07-14T02:44:56.239Z",
|
|
129
136
|
"size": 11256,
|
|
130
137
|
"path": "../public/assets/zhipuai-BPNAnxo-.svg"
|
|
131
138
|
},
|
|
132
|
-
"/assets/
|
|
133
|
-
"type": "text/javascript; charset=utf-8",
|
|
134
|
-
"etag": '"44d3-05qR9H/eXW9ZtOHJhxHUM+wxZ/M"',
|
|
135
|
-
"mtime": "2026-07-14T01:21:45.705Z",
|
|
136
|
-
"size": 17619,
|
|
137
|
-
"path": "../public/assets/ResponseView-CmKzB3ef.js"
|
|
138
|
-
},
|
|
139
|
-
"/assets/_sessionId-CUxLgyb5.js": {
|
|
139
|
+
"/assets/_sessionId-B7pqqX6S.js": {
|
|
140
140
|
"type": "text/javascript; charset=utf-8",
|
|
141
|
-
"etag": '"36d-
|
|
142
|
-
"mtime": "2026-07-
|
|
141
|
+
"etag": '"36d-q6h6VsxlCrCcH/FaDU8jpTNnCIM"',
|
|
142
|
+
"mtime": "2026-07-14T02:44:56.239Z",
|
|
143
143
|
"size": 877,
|
|
144
|
-
"path": "../public/assets/_sessionId-
|
|
144
|
+
"path": "../public/assets/_sessionId-B7pqqX6S.js"
|
|
145
145
|
},
|
|
146
|
-
"/assets/_sessionId-
|
|
146
|
+
"/assets/_sessionId-c3quqe4s.js": {
|
|
147
147
|
"type": "text/javascript; charset=utf-8",
|
|
148
|
-
"etag": '"a2-
|
|
149
|
-
"mtime": "2026-07-
|
|
148
|
+
"etag": '"a2-6qWx+FNRDTotJD3uVbxVOqGMdyg"',
|
|
149
|
+
"mtime": "2026-07-14T02:44:56.239Z",
|
|
150
150
|
"size": 162,
|
|
151
|
-
"path": "../public/assets/_sessionId-
|
|
151
|
+
"path": "../public/assets/_sessionId-c3quqe4s.js"
|
|
152
152
|
},
|
|
153
|
-
"/assets/InspectorPet-
|
|
153
|
+
"/assets/InspectorPet-D01knLHJ.js": {
|
|
154
154
|
"type": "text/javascript; charset=utf-8",
|
|
155
|
-
"etag": '"818f0-
|
|
156
|
-
"mtime": "2026-07-
|
|
155
|
+
"etag": '"818f0-r8VAyeNE92Czne01v4lzux0Md0c"',
|
|
156
|
+
"mtime": "2026-07-14T02:44:56.241Z",
|
|
157
157
|
"size": 530672,
|
|
158
|
-
"path": "../public/assets/InspectorPet-
|
|
158
|
+
"path": "../public/assets/InspectorPet-D01knLHJ.js"
|
|
159
159
|
},
|
|
160
|
-
"/assets/ProxyViewerContainer-
|
|
160
|
+
"/assets/ProxyViewerContainer-CArcMNg_.js": {
|
|
161
161
|
"type": "text/javascript; charset=utf-8",
|
|
162
|
-
"etag": '"
|
|
163
|
-
"mtime": "2026-07-
|
|
164
|
-
"size":
|
|
165
|
-
"path": "../public/assets/ProxyViewerContainer-
|
|
162
|
+
"etag": '"a5c85-A2Kc+m5Wq4OyxE9cc0eSnJ4E0q4"',
|
|
163
|
+
"mtime": "2026-07-14T02:44:56.239Z",
|
|
164
|
+
"size": 679045,
|
|
165
|
+
"path": "../public/assets/ProxyViewerContainer-CArcMNg_.js"
|
|
166
166
|
}
|
|
167
167
|
};
|
|
168
168
|
function readAsset(id) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
type ChangeEvent,
|
|
3
3
|
type JSX,
|
|
4
|
+
type KeyboardEvent,
|
|
4
5
|
type ReactNode,
|
|
5
6
|
useCallback,
|
|
6
7
|
useEffect,
|
|
@@ -115,6 +116,228 @@ function truncateSessionId(id: string): string {
|
|
|
115
116
|
return `${id.slice(0, 12)}...${id.slice(-12)}`;
|
|
116
117
|
}
|
|
117
118
|
|
|
119
|
+
type SessionSearchSuggestion = {
|
|
120
|
+
id: string;
|
|
121
|
+
label: string;
|
|
122
|
+
detail: string;
|
|
123
|
+
kind: "session" | "model" | "all";
|
|
124
|
+
value: string;
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
function normalizeSearchQuery(value: string): string {
|
|
128
|
+
return value.trim().toLowerCase();
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function includesSearchText(value: string | null | undefined, query: string): boolean {
|
|
132
|
+
return value !== null && value !== undefined && value.toLowerCase().includes(query);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function buildSessionSuggestionDetail(sessionId: string, logs: readonly CapturedLog[]): string {
|
|
136
|
+
const scopedLogs = logs.filter((log) => log.sessionId === sessionId);
|
|
137
|
+
if (scopedLogs.length === 0) return "Stored session";
|
|
138
|
+
const models = new Set<string>();
|
|
139
|
+
const providers = new Set<string>();
|
|
140
|
+
for (const log of scopedLogs) {
|
|
141
|
+
if (log.model !== null && log.model !== "") models.add(log.model);
|
|
142
|
+
if (
|
|
143
|
+
log.providerName !== null &&
|
|
144
|
+
log.providerName !== undefined &&
|
|
145
|
+
log.providerName.trim() !== ""
|
|
146
|
+
) {
|
|
147
|
+
providers.add(log.providerName);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
const modelLabel = models.size === 0 ? "unknown model" : [...models].slice(0, 2).join(", ");
|
|
151
|
+
const providerLabel =
|
|
152
|
+
providers.size === 0 ? "unknown provider" : [...providers].slice(0, 2).join(", ");
|
|
153
|
+
return `${String(scopedLogs.length)} req · ${providerLabel} · ${modelLabel}`;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
function sessionMatchesSearchQuery(
|
|
157
|
+
sessionId: string,
|
|
158
|
+
logs: readonly CapturedLog[],
|
|
159
|
+
query: string,
|
|
160
|
+
): boolean {
|
|
161
|
+
if (includesSearchText(sessionId, query)) return true;
|
|
162
|
+
return logs.some(
|
|
163
|
+
(log) =>
|
|
164
|
+
log.sessionId === sessionId &&
|
|
165
|
+
(includesSearchText(log.model, query) ||
|
|
166
|
+
includesSearchText(log.providerName, query) ||
|
|
167
|
+
includesSearchText(log.path, query)),
|
|
168
|
+
);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
function buildSessionSearchSuggestions({
|
|
172
|
+
query,
|
|
173
|
+
sessions,
|
|
174
|
+
models,
|
|
175
|
+
logs,
|
|
176
|
+
}: {
|
|
177
|
+
query: string;
|
|
178
|
+
sessions: readonly string[];
|
|
179
|
+
models: readonly string[];
|
|
180
|
+
logs: readonly CapturedLog[];
|
|
181
|
+
}): SessionSearchSuggestion[] {
|
|
182
|
+
const normalizedQuery = normalizeSearchQuery(query);
|
|
183
|
+
const suggestions: SessionSearchSuggestion[] = [];
|
|
184
|
+
|
|
185
|
+
if (normalizedQuery === "") {
|
|
186
|
+
suggestions.push({
|
|
187
|
+
id: "all",
|
|
188
|
+
label: "All sessions",
|
|
189
|
+
detail: `${String(logs.length)} visible requests`,
|
|
190
|
+
kind: "all",
|
|
191
|
+
value: "__all__",
|
|
192
|
+
});
|
|
193
|
+
for (const session of sessions.slice(0, 5)) {
|
|
194
|
+
suggestions.push({
|
|
195
|
+
id: `session-${session}`,
|
|
196
|
+
label: truncateSessionId(session),
|
|
197
|
+
detail: buildSessionSuggestionDetail(session, logs),
|
|
198
|
+
kind: "session",
|
|
199
|
+
value: session,
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
return suggestions;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
const matchingSessions = sessions.filter((session) =>
|
|
206
|
+
sessionMatchesSearchQuery(session, logs, normalizedQuery),
|
|
207
|
+
);
|
|
208
|
+
for (const session of matchingSessions.slice(0, 5)) {
|
|
209
|
+
suggestions.push({
|
|
210
|
+
id: `session-${session}`,
|
|
211
|
+
label: truncateSessionId(session),
|
|
212
|
+
detail: buildSessionSuggestionDetail(session, logs),
|
|
213
|
+
kind: "session",
|
|
214
|
+
value: session,
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
const matchingModels = models.filter((model) => includesSearchText(model, normalizedQuery));
|
|
219
|
+
for (const model of matchingModels.slice(0, 3)) {
|
|
220
|
+
suggestions.push({
|
|
221
|
+
id: `model-${model}`,
|
|
222
|
+
label: model,
|
|
223
|
+
detail: "Model filter",
|
|
224
|
+
kind: "model",
|
|
225
|
+
value: model,
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
return suggestions.slice(0, 7);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
function buildAssistantQuestionFromSearch(query: string, selectedSession: string): string {
|
|
233
|
+
const trimmed = query.trim();
|
|
234
|
+
const scope =
|
|
235
|
+
selectedSession === "__all__" ? "all visible Inspector sessions" : `session ${selectedSession}`;
|
|
236
|
+
if (trimmed === "") {
|
|
237
|
+
return `Analyze ${scope}. What failed, slowed down, or deserves attention?`;
|
|
238
|
+
}
|
|
239
|
+
return `Search ${scope} for "${trimmed}" and explain the relevant failures, latency, token usage, provider behavior, and evidence.`;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
function SessionSearchBox({
|
|
243
|
+
query,
|
|
244
|
+
suggestions,
|
|
245
|
+
selectedSession,
|
|
246
|
+
selectedModel,
|
|
247
|
+
onQueryChange,
|
|
248
|
+
onApplySuggestion,
|
|
249
|
+
onClear,
|
|
250
|
+
onAskAssistant,
|
|
251
|
+
}: {
|
|
252
|
+
query: string;
|
|
253
|
+
suggestions: readonly SessionSearchSuggestion[];
|
|
254
|
+
selectedSession: string;
|
|
255
|
+
selectedModel: string;
|
|
256
|
+
onQueryChange: (value: string) => void;
|
|
257
|
+
onApplySuggestion: (suggestion: SessionSearchSuggestion) => void;
|
|
258
|
+
onClear: () => void;
|
|
259
|
+
onAskAssistant: () => void;
|
|
260
|
+
}): JSX.Element {
|
|
261
|
+
const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>): void => {
|
|
262
|
+
if (event.key !== "Enter") return;
|
|
263
|
+
const firstSuggestion = suggestions[0];
|
|
264
|
+
if (firstSuggestion === undefined) return;
|
|
265
|
+
event.preventDefault();
|
|
266
|
+
onApplySuggestion(firstSuggestion);
|
|
267
|
+
};
|
|
268
|
+
|
|
269
|
+
return (
|
|
270
|
+
<div className="rounded-xl bg-black/20 p-2 shadow-[inset_0_0_0_1px_rgba(255,255,255,0.055)]">
|
|
271
|
+
<div className="relative">
|
|
272
|
+
<Search className="pointer-events-none absolute left-3 top-1/2 size-3.5 -translate-y-1/2 text-cyan-100/70" />
|
|
273
|
+
<input
|
|
274
|
+
type="search"
|
|
275
|
+
value={query}
|
|
276
|
+
onChange={(event) => onQueryChange(event.currentTarget.value)}
|
|
277
|
+
onKeyDown={handleKeyDown}
|
|
278
|
+
placeholder="Search sessions, models, providers..."
|
|
279
|
+
className="h-10 w-full rounded-full bg-black/30 px-9 pr-9 text-xs text-foreground outline-none shadow-[inset_0_0_0_1px_rgba(103,232,249,0.13)] transition-colors placeholder:text-muted-foreground hover:bg-black/35 focus-visible:ring-1 focus-visible:ring-cyan-200/70"
|
|
280
|
+
aria-label="Search sessions and models"
|
|
281
|
+
/>
|
|
282
|
+
{(query !== "" || selectedSession !== "__all__" || selectedModel !== "__all__") && (
|
|
283
|
+
<button
|
|
284
|
+
type="button"
|
|
285
|
+
onClick={onClear}
|
|
286
|
+
className="absolute right-2 top-1/2 inline-flex size-6 -translate-y-1/2 items-center justify-center rounded-full text-muted-foreground transition-colors hover:bg-white/[0.07] hover:text-foreground focus-visible:ring-1 focus-visible:ring-ring focus-visible:outline-none"
|
|
287
|
+
aria-label="Clear session search"
|
|
288
|
+
title="Clear search"
|
|
289
|
+
>
|
|
290
|
+
<X className="size-3.5" />
|
|
291
|
+
</button>
|
|
292
|
+
)}
|
|
293
|
+
</div>
|
|
294
|
+
|
|
295
|
+
<div className="mt-2 flex flex-wrap gap-1.5">
|
|
296
|
+
<button
|
|
297
|
+
type="button"
|
|
298
|
+
onClick={onAskAssistant}
|
|
299
|
+
className="inline-flex h-7 items-center rounded-full bg-cyan-400/10 px-2.5 text-[11px] font-medium text-cyan-100 shadow-[inset_0_0_0_1px_rgba(103,232,249,0.14)] transition-colors hover:bg-cyan-400/16"
|
|
300
|
+
>
|
|
301
|
+
Ask Assistant
|
|
302
|
+
</button>
|
|
303
|
+
{selectedSession !== "__all__" && (
|
|
304
|
+
<span className="inline-flex h-7 max-w-full items-center rounded-full bg-white/[0.045] px-2.5 font-mono text-[10px] text-muted-foreground">
|
|
305
|
+
session:{truncateSessionId(selectedSession)}
|
|
306
|
+
</span>
|
|
307
|
+
)}
|
|
308
|
+
{selectedModel !== "__all__" && (
|
|
309
|
+
<span className="inline-flex h-7 max-w-full items-center rounded-full bg-white/[0.045] px-2.5 text-[10px] text-muted-foreground">
|
|
310
|
+
model:{selectedModel}
|
|
311
|
+
</span>
|
|
312
|
+
)}
|
|
313
|
+
</div>
|
|
314
|
+
|
|
315
|
+
<div className="mt-2 space-y-1">
|
|
316
|
+
{suggestions.map((suggestion) => (
|
|
317
|
+
<button
|
|
318
|
+
key={suggestion.id}
|
|
319
|
+
type="button"
|
|
320
|
+
onClick={() => onApplySuggestion(suggestion)}
|
|
321
|
+
className="grid w-full grid-cols-[minmax(0,1fr)_auto] items-center gap-2 rounded-lg px-2 py-1.5 text-left transition-colors hover:bg-white/[0.045] focus-visible:ring-1 focus-visible:ring-ring focus-visible:outline-none"
|
|
322
|
+
>
|
|
323
|
+
<span className="min-w-0">
|
|
324
|
+
<span className="block truncate text-[11px] font-medium text-foreground">
|
|
325
|
+
{suggestion.label}
|
|
326
|
+
</span>
|
|
327
|
+
<span className="block truncate text-[10px] text-muted-foreground">
|
|
328
|
+
{suggestion.detail}
|
|
329
|
+
</span>
|
|
330
|
+
</span>
|
|
331
|
+
<span className="rounded-full bg-white/[0.045] px-2 py-0.5 text-[9px] uppercase tracking-[0.12em] text-muted-foreground">
|
|
332
|
+
{suggestion.kind}
|
|
333
|
+
</span>
|
|
334
|
+
</button>
|
|
335
|
+
))}
|
|
336
|
+
</div>
|
|
337
|
+
</div>
|
|
338
|
+
);
|
|
339
|
+
}
|
|
340
|
+
|
|
118
341
|
function buildDisplayNumberByLogId(groups: readonly ConversationGroupData[]): Map<number, number> {
|
|
119
342
|
const result = new Map<number, number>();
|
|
120
343
|
for (const group of groups) {
|
|
@@ -1333,6 +1556,10 @@ export function ProxyViewer({
|
|
|
1333
1556
|
const [detailsPanelStorageLoaded, setDetailsPanelStorageLoaded] = useState(false);
|
|
1334
1557
|
const [petVisible, setPetVisible] = useState(true);
|
|
1335
1558
|
const [petVisibilityStorageLoaded, setPetVisibilityStorageLoaded] = useState(false);
|
|
1559
|
+
const [sessionSearchQuery, setSessionSearchQuery] = useState("");
|
|
1560
|
+
const [assistantSuggestedQuestion, setAssistantSuggestedQuestion] = useState<string | undefined>(
|
|
1561
|
+
undefined,
|
|
1562
|
+
);
|
|
1336
1563
|
const [comparePair, setComparePair] = useState<[CapturedLog, CapturedLog] | null>(null);
|
|
1337
1564
|
const logListRef = useRef<HTMLDivElement>(null);
|
|
1338
1565
|
const logListWrapperRef = useRef<HTMLDivElement>(null);
|
|
@@ -1572,11 +1799,16 @@ export function ProxyViewer({
|
|
|
1572
1799
|
? "Deletes every stored log, streaming chunk, and session archive entry across all sessions."
|
|
1573
1800
|
: "Deletes every stored log, streaming chunk, and session archive entry for this session, including history that is not currently loaded.";
|
|
1574
1801
|
const reloadSessionLabel = logs.length === 0 ? "Load" : "Reload";
|
|
1575
|
-
const
|
|
1576
|
-
|
|
1577
|
-
|
|
1578
|
-
|
|
1579
|
-
|
|
1802
|
+
const sessionSearchSuggestions = useMemo(
|
|
1803
|
+
() =>
|
|
1804
|
+
buildSessionSearchSuggestions({
|
|
1805
|
+
query: sessionSearchQuery,
|
|
1806
|
+
sessions,
|
|
1807
|
+
models,
|
|
1808
|
+
logs,
|
|
1809
|
+
}),
|
|
1810
|
+
[logs, models, sessionSearchQuery, sessions],
|
|
1811
|
+
);
|
|
1580
1812
|
const activeScopeLabel =
|
|
1581
1813
|
hasSessionContext && sessionContextScope !== null
|
|
1582
1814
|
? truncateSessionId(sessionContextScope.label)
|
|
@@ -1603,20 +1835,36 @@ export function ProxyViewer({
|
|
|
1603
1835
|
},
|
|
1604
1836
|
[comparisonPredecessors],
|
|
1605
1837
|
);
|
|
1606
|
-
const
|
|
1607
|
-
(
|
|
1608
|
-
|
|
1609
|
-
|
|
1610
|
-
|
|
1611
|
-
|
|
1612
|
-
|
|
1613
|
-
|
|
1614
|
-
|
|
1615
|
-
|
|
1616
|
-
|
|
1838
|
+
const handleApplySessionSearchSuggestion = useCallback(
|
|
1839
|
+
(suggestion: SessionSearchSuggestion) => {
|
|
1840
|
+
switch (suggestion.kind) {
|
|
1841
|
+
case "all":
|
|
1842
|
+
onSessionChange("__all__");
|
|
1843
|
+
onModelChange("__all__");
|
|
1844
|
+
setSessionSearchQuery("");
|
|
1845
|
+
break;
|
|
1846
|
+
case "session":
|
|
1847
|
+
onSessionChange(suggestion.value);
|
|
1848
|
+
setSessionSearchQuery(suggestion.value);
|
|
1849
|
+
break;
|
|
1850
|
+
case "model":
|
|
1851
|
+
onModelChange(suggestion.value);
|
|
1852
|
+
setSessionSearchQuery(suggestion.value);
|
|
1853
|
+
break;
|
|
1854
|
+
}
|
|
1617
1855
|
},
|
|
1618
|
-
[onSessionChange],
|
|
1856
|
+
[onModelChange, onSessionChange],
|
|
1619
1857
|
);
|
|
1858
|
+
const handleClearSessionSearch = useCallback(() => {
|
|
1859
|
+
setSessionSearchQuery("");
|
|
1860
|
+
onSessionChange("__all__");
|
|
1861
|
+
onModelChange("__all__");
|
|
1862
|
+
}, [onModelChange, onSessionChange]);
|
|
1863
|
+
const handleAskAssistantFromSearch = useCallback(() => {
|
|
1864
|
+
setAssistantSuggestedQuestion(
|
|
1865
|
+
buildAssistantQuestionFromSearch(sessionSearchQuery, selectedSession),
|
|
1866
|
+
);
|
|
1867
|
+
}, [selectedSession, sessionSearchQuery]);
|
|
1620
1868
|
const labSessionId =
|
|
1621
1869
|
pinnedSessionId !== undefined
|
|
1622
1870
|
? pinnedSessionId
|
|
@@ -1715,7 +1963,11 @@ export function ProxyViewer({
|
|
|
1715
1963
|
</div>
|
|
1716
1964
|
</SidebarPanel>
|
|
1717
1965
|
|
|
1718
|
-
<PiAgentPanel
|
|
1966
|
+
<PiAgentPanel
|
|
1967
|
+
currentSessionId={labSessionId}
|
|
1968
|
+
logCount={logs.length}
|
|
1969
|
+
suggestedQuestion={assistantSuggestedQuestion}
|
|
1970
|
+
/>
|
|
1719
1971
|
|
|
1720
1972
|
{hasSessionContext && sessionContextScope !== null && (
|
|
1721
1973
|
<SessionContextBar
|
|
@@ -1736,72 +1988,22 @@ export function ProxyViewer({
|
|
|
1736
1988
|
)}
|
|
1737
1989
|
|
|
1738
1990
|
<SidebarPanel label="Filters">
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
|
|
1742
|
-
|
|
1743
|
-
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
|
|
1747
|
-
|
|
1748
|
-
|
|
1749
|
-
|
|
1750
|
-
|
|
1751
|
-
|
|
1752
|
-
|
|
1753
|
-
|
|
1754
|
-
|
|
1755
|
-
type="button"
|
|
1756
|
-
onClick={() => onSessionChange("__all__")}
|
|
1757
|
-
className="absolute right-1.5 top-1/2 inline-flex size-6 -translate-y-1/2 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-white/[0.06] hover:text-foreground focus-visible:ring-1 focus-visible:ring-ring focus-visible:outline-none"
|
|
1758
|
-
aria-label="Clear session filter"
|
|
1759
|
-
title="Clear session filter"
|
|
1760
|
-
>
|
|
1761
|
-
<X className="size-3.5" />
|
|
1762
|
-
</button>
|
|
1763
|
-
)}
|
|
1764
|
-
</div>
|
|
1765
|
-
<Select value={sessionSelectValue} onValueChange={handleSessionSelectChange}>
|
|
1766
|
-
<SelectTrigger
|
|
1767
|
-
aria-label="Select a session"
|
|
1768
|
-
className="bg-black/25 hover:bg-white/[0.045] h-9 w-full border-0 text-xs text-foreground shadow-[inset_0_0_0_1px_rgba(255,255,255,0.06)]"
|
|
1769
|
-
>
|
|
1770
|
-
<SelectValue placeholder="All sessions" />
|
|
1771
|
-
</SelectTrigger>
|
|
1772
|
-
<SelectContent>
|
|
1773
|
-
<SelectItem value="__all__">All sessions</SelectItem>
|
|
1774
|
-
{sessionSelectValue === "__typed__" && (
|
|
1775
|
-
<SelectItem value="__typed__">
|
|
1776
|
-
Typed: {truncateSessionId(selectedSession)}
|
|
1777
|
-
</SelectItem>
|
|
1778
|
-
)}
|
|
1779
|
-
{sessions.map((s) => (
|
|
1780
|
-
<SelectItem key={s} value={s}>
|
|
1781
|
-
{truncateSessionId(s)}
|
|
1782
|
-
</SelectItem>
|
|
1783
|
-
))}
|
|
1784
|
-
</SelectContent>
|
|
1785
|
-
</Select>
|
|
1786
|
-
</>
|
|
1787
|
-
)}
|
|
1788
|
-
<Select value={selectedModel} onValueChange={onModelChange}>
|
|
1789
|
-
<SelectTrigger
|
|
1790
|
-
aria-label="Select a model"
|
|
1791
|
-
className="bg-black/25 hover:bg-white/[0.045] h-9 w-full border-0 text-xs text-foreground shadow-[inset_0_0_0_1px_rgba(255,255,255,0.06)]"
|
|
1792
|
-
>
|
|
1793
|
-
<SelectValue placeholder="All models" />
|
|
1794
|
-
</SelectTrigger>
|
|
1795
|
-
<SelectContent>
|
|
1796
|
-
<SelectItem value="__all__">All models</SelectItem>
|
|
1797
|
-
{models.map((m) => (
|
|
1798
|
-
<SelectItem key={m} value={m}>
|
|
1799
|
-
{m}
|
|
1800
|
-
</SelectItem>
|
|
1801
|
-
))}
|
|
1802
|
-
</SelectContent>
|
|
1803
|
-
</Select>
|
|
1804
|
-
</div>
|
|
1991
|
+
{hideSessionFilter ? (
|
|
1992
|
+
<p className="text-[11px] leading-5 text-muted-foreground">
|
|
1993
|
+
This session is pinned by the current URL.
|
|
1994
|
+
</p>
|
|
1995
|
+
) : (
|
|
1996
|
+
<SessionSearchBox
|
|
1997
|
+
query={sessionSearchQuery}
|
|
1998
|
+
suggestions={sessionSearchSuggestions}
|
|
1999
|
+
selectedSession={selectedSession}
|
|
2000
|
+
selectedModel={selectedModel}
|
|
2001
|
+
onQueryChange={setSessionSearchQuery}
|
|
2002
|
+
onApplySuggestion={handleApplySessionSearchSuggestion}
|
|
2003
|
+
onClear={handleClearSessionSearch}
|
|
2004
|
+
onAskAssistant={handleAskAssistantFromSearch}
|
|
2005
|
+
/>
|
|
2006
|
+
)}
|
|
1805
2007
|
</SidebarPanel>
|
|
1806
2008
|
</div>
|
|
1807
2009
|
</aside>
|