@tonyclaw/agent-inspector 2.1.5 → 2.1.6
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-SAn2KFl2.js → CompareDrawer-Djazxhew.js} +1 -1
- package/.output/public/assets/{ProxyViewerContainer-DaiTFf7n.js → ProxyViewerContainer-BC-z9RPh.js} +40 -40
- package/.output/public/assets/{ReplayDialog-CCwz0YUV.js → ReplayDialog-BaD4R6ac.js} +1 -1
- package/.output/public/assets/{RequestAnatomy-DXcC4ydl.js → RequestAnatomy-w6uGdqYp.js} +1 -1
- package/.output/public/assets/{ResponseView-Bh9t9aZF.js → ResponseView-VPed-Yif.js} +1 -1
- package/.output/public/assets/{StreamingChunkSequence-B69M2rr-.js → StreamingChunkSequence-CPB8FgHI.js} +1 -1
- package/.output/public/assets/_sessionId-mnr0O0Ri.js +1 -0
- package/.output/public/assets/index-DH1DjJOl.js +1 -0
- package/.output/public/assets/index-DP4NzCZ5.css +1 -0
- package/.output/public/assets/{main-DZVKUeg6.js → main-CIV3Chb5.js} +2 -2
- package/.output/server/{_sessionId-COVUf_EG.mjs → _sessionId-CIXQGim9.mjs} +2 -2
- package/.output/server/_ssr/{CompareDrawer-DqQHO4tk.mjs → CompareDrawer-_uFgjkB2.mjs} +2 -2
- package/.output/server/_ssr/{ProxyViewerContainer-BEeF4V-C.mjs → ProxyViewerContainer-D8YjQDNj.mjs} +227 -34
- package/.output/server/_ssr/{ReplayDialog-DUZbsd5x.mjs → ReplayDialog-CFwKM7jc.mjs} +3 -3
- package/.output/server/_ssr/{RequestAnatomy-DKuIxoBj.mjs → RequestAnatomy-2Vr84GxT.mjs} +2 -2
- package/.output/server/_ssr/{ResponseView-BB9CYmTJ.mjs → ResponseView-CSBWBHRJ.mjs} +2 -2
- package/.output/server/_ssr/{StreamingChunkSequence-CkY3uTjF.mjs → StreamingChunkSequence-Dr4JApqs.mjs} +2 -2
- package/.output/server/_ssr/{index-CHTchkrO.mjs → index-WnsY1fh_.mjs} +2 -2
- package/.output/server/_ssr/index.mjs +2 -2
- package/.output/server/_ssr/{router-C8DJ5pQZ.mjs → router-sy38X5AX.mjs} +4 -4
- package/.output/server/{_tanstack-start-manifest_v-Z1ffcxDr.mjs → _tanstack-start-manifest_v-Dde-eACV.mjs} +1 -1
- package/.output/server/index.mjs +68 -68
- package/package.json +1 -1
- package/src/components/groups/GroupsDialog.tsx +255 -28
- package/.output/public/assets/_sessionId-6fF5JpyQ.js +0 -1
- package/.output/public/assets/index-Bcq8bZoK.css +0 -1
- package/.output/public/assets/index-DBSbw8Gd.js +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const tsrStartManifest = () => ({ "routes": { "__root__": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/__root.tsx", "children": ["/", "/api/alerts", "/api/config", "/api/groups", "/api/health", "/api/logs", "/api/mcp", "/api/models", "/api/providers", "/api/runs", "/api/sessions", "/proxy/$", "/session/$sessionId", "/api/knowledge/candidates", "/api/knowledge/project-context", "/api/knowledge/search", "/api/knowledge/sessions/$sessionId/candidates"], "preloads": ["/assets/main-
|
|
1
|
+
const tsrStartManifest = () => ({ "routes": { "__root__": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/__root.tsx", "children": ["/", "/api/alerts", "/api/config", "/api/groups", "/api/health", "/api/logs", "/api/mcp", "/api/models", "/api/providers", "/api/runs", "/api/sessions", "/proxy/$", "/session/$sessionId", "/api/knowledge/candidates", "/api/knowledge/project-context", "/api/knowledge/search", "/api/knowledge/sessions/$sessionId/candidates"], "preloads": ["/assets/main-CIV3Chb5.js"], "assets": [] }, "/": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/index.tsx", "assets": [], "preloads": ["/assets/index-DH1DjJOl.js", "/assets/ProxyViewerContainer-BC-z9RPh.js"] }, "/api/alerts": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/alerts.ts", "children": ["/api/alerts/summary"] }, "/api/config": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/config.ts", "children": ["/api/config/paths"] }, "/api/groups": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/groups.ts", "children": ["/api/groups/$groupId"] }, "/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/import", "/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/runs": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/runs.ts", "children": ["/api/runs/$runId"] }, "/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-mnr0O0Ri.js", "/assets/ProxyViewerContainer-BC-z9RPh.js"] }, "/api/alerts/summary": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/alerts.summary.ts" }, "/api/config/paths": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/config.paths.ts" }, "/api/groups/$groupId": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/groups.$groupId.ts", "children": ["/api/groups/$groupId/evidence", "/api/groups/$groupId/sessions"] }, "/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/body", "/api/logs/$id/chunks", "/api/logs/$id/replay"] }, "/api/logs/import": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/logs.import.ts" }, "/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/model-metadata", "/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/runs/$runId": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/runs.$runId.ts", "children": ["/api/runs/$runId/evidence"] }, "/api/groups/$groupId/evidence": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/groups.$groupId.evidence.ts" }, "/api/groups/$groupId/sessions": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/groups.$groupId.sessions.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/body": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/logs.$id.body.ts" }, "/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/model-metadata": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/providers.$providerId.model-metadata.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/runs/$runId/evidence": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/runs.$runId.evidence.ts" }, "/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-CIV3Chb5.js" });
|
|
2
2
|
export {
|
|
3
3
|
tsrStartManifest
|
|
4
4
|
};
|
package/.output/server/index.mjs
CHANGED
|
@@ -35,103 +35,103 @@ const headers = ((m) => function headersRouteRule(event) {
|
|
|
35
35
|
}
|
|
36
36
|
});
|
|
37
37
|
const assets = {
|
|
38
|
-
"/assets/CompareDrawer-SAn2KFl2.js": {
|
|
39
|
-
"type": "text/javascript; charset=utf-8",
|
|
40
|
-
"etag": '"49e8-fT9gnqNapzEUtMqaEOXdyVDpHjs"',
|
|
41
|
-
"mtime": "2026-07-03T08:23:10.087Z",
|
|
42
|
-
"size": 18920,
|
|
43
|
-
"path": "../public/assets/CompareDrawer-SAn2KFl2.js"
|
|
44
|
-
},
|
|
45
38
|
"/assets/alibaba-TTwafVwX.svg": {
|
|
46
39
|
"type": "image/svg+xml",
|
|
47
40
|
"etag": '"171b-6dyV5K8QjiaY35sN9qNprh9zDIs"',
|
|
48
|
-
"mtime": "2026-07-03T08:
|
|
41
|
+
"mtime": "2026-07-03T08:38:18.431Z",
|
|
49
42
|
"size": 5915,
|
|
50
43
|
"path": "../public/assets/alibaba-TTwafVwX.svg"
|
|
51
44
|
},
|
|
45
|
+
"/assets/index-DH1DjJOl.js": {
|
|
46
|
+
"type": "text/javascript; charset=utf-8",
|
|
47
|
+
"etag": '"74-XPYkCkmLf6OHNprOlGZmst3ii/c"',
|
|
48
|
+
"mtime": "2026-07-03T08:38:18.431Z",
|
|
49
|
+
"size": 116,
|
|
50
|
+
"path": "../public/assets/index-DH1DjJOl.js"
|
|
51
|
+
},
|
|
52
|
+
"/assets/CompareDrawer-Djazxhew.js": {
|
|
53
|
+
"type": "text/javascript; charset=utf-8",
|
|
54
|
+
"etag": '"49e8-BgBnUkEs/A9S9UOa70+wREN0qNc"',
|
|
55
|
+
"mtime": "2026-07-03T08:38:18.431Z",
|
|
56
|
+
"size": 18920,
|
|
57
|
+
"path": "../public/assets/CompareDrawer-Djazxhew.js"
|
|
58
|
+
},
|
|
52
59
|
"/assets/minimax-BPMzvuL-.jpeg": {
|
|
53
60
|
"type": "image/jpeg",
|
|
54
61
|
"etag": '"1b06-IwivU89ko5UTMUM1/t7hn4sQK9A"',
|
|
55
|
-
"mtime": "2026-07-03T08:
|
|
62
|
+
"mtime": "2026-07-03T08:38:18.431Z",
|
|
56
63
|
"size": 6918,
|
|
57
64
|
"path": "../public/assets/minimax-BPMzvuL-.jpeg"
|
|
58
65
|
},
|
|
59
|
-
"/assets/
|
|
60
|
-
"type": "text/css; charset=utf-8",
|
|
61
|
-
"etag": '"1e82d-Bo+nRYLQB3/4r6wWrfFE4tW/SHg"',
|
|
62
|
-
"mtime": "2026-07-03T08:23:10.086Z",
|
|
63
|
-
"size": 124973,
|
|
64
|
-
"path": "../public/assets/index-Bcq8bZoK.css"
|
|
65
|
-
},
|
|
66
|
-
"/assets/main-DZVKUeg6.js": {
|
|
66
|
+
"/assets/ResponseView-VPed-Yif.js": {
|
|
67
67
|
"type": "text/javascript; charset=utf-8",
|
|
68
|
-
"etag": '"
|
|
69
|
-
"mtime": "2026-07-03T08:
|
|
70
|
-
"size":
|
|
71
|
-
"path": "../public/assets/
|
|
72
|
-
},
|
|
73
|
-
"/assets/ReplayDialog-CCwz0YUV.js": {
|
|
74
|
-
"type": "text/javascript; charset=utf-8",
|
|
75
|
-
"etag": '"318c-B/NOUXx1S9YfCpX5mQvGVu/Caco"',
|
|
76
|
-
"mtime": "2026-07-03T08:23:10.087Z",
|
|
77
|
-
"size": 12684,
|
|
78
|
-
"path": "../public/assets/ReplayDialog-CCwz0YUV.js"
|
|
68
|
+
"etag": '"30d2-Remim8aO7S0gq3gx4DkhNol2mVs"',
|
|
69
|
+
"mtime": "2026-07-03T08:38:18.432Z",
|
|
70
|
+
"size": 12498,
|
|
71
|
+
"path": "../public/assets/ResponseView-VPed-Yif.js"
|
|
79
72
|
},
|
|
80
|
-
"/assets/RequestAnatomy-
|
|
73
|
+
"/assets/RequestAnatomy-w6uGdqYp.js": {
|
|
81
74
|
"type": "text/javascript; charset=utf-8",
|
|
82
|
-
"etag": '"43f2-
|
|
83
|
-
"mtime": "2026-07-03T08:
|
|
75
|
+
"etag": '"43f2-7s0ubeaphfsGPvrGnsiVPloVCUM"',
|
|
76
|
+
"mtime": "2026-07-03T08:38:18.431Z",
|
|
84
77
|
"size": 17394,
|
|
85
|
-
"path": "../public/assets/RequestAnatomy-
|
|
86
|
-
},
|
|
87
|
-
"/assets/qwen-CONDcHqt.png": {
|
|
88
|
-
"type": "image/png",
|
|
89
|
-
"etag": '"572c3-cdJAPaHdOvFCGzuaQjagdgOu6XE"',
|
|
90
|
-
"mtime": "2026-07-03T08:23:10.086Z",
|
|
91
|
-
"size": 357059,
|
|
92
|
-
"path": "../public/assets/qwen-CONDcHqt.png"
|
|
78
|
+
"path": "../public/assets/RequestAnatomy-w6uGdqYp.js"
|
|
93
79
|
},
|
|
94
|
-
"/assets/
|
|
80
|
+
"/assets/StreamingChunkSequence-CPB8FgHI.js": {
|
|
95
81
|
"type": "text/javascript; charset=utf-8",
|
|
96
|
-
"etag": '"
|
|
97
|
-
"mtime": "2026-07-03T08:
|
|
98
|
-
"size": 12498,
|
|
99
|
-
"path": "../public/assets/ResponseView-Bh9t9aZF.js"
|
|
100
|
-
},
|
|
101
|
-
"/assets/StreamingChunkSequence-B69M2rr-.js": {
|
|
102
|
-
"type": "text/javascript; charset=utf-8",
|
|
103
|
-
"etag": '"d5c-xRWPkPrh/Qvoe2CzFVrPAi9hdRQ"',
|
|
104
|
-
"mtime": "2026-07-03T08:23:10.087Z",
|
|
82
|
+
"etag": '"d5c-GckK+AzsbwALbgplRm1NjeMIsro"',
|
|
83
|
+
"mtime": "2026-07-03T08:38:18.432Z",
|
|
105
84
|
"size": 3420,
|
|
106
|
-
"path": "../public/assets/StreamingChunkSequence-
|
|
107
|
-
},
|
|
108
|
-
"/assets/_sessionId-6fF5JpyQ.js": {
|
|
109
|
-
"type": "text/javascript; charset=utf-8",
|
|
110
|
-
"etag": '"d2-ljKnWbeDMM/Ead+Oqi0HOdiiJc0"',
|
|
111
|
-
"mtime": "2026-07-03T08:23:10.087Z",
|
|
112
|
-
"size": 210,
|
|
113
|
-
"path": "../public/assets/_sessionId-6fF5JpyQ.js"
|
|
85
|
+
"path": "../public/assets/StreamingChunkSequence-CPB8FgHI.js"
|
|
114
86
|
},
|
|
115
87
|
"/assets/zhipuai-BPNAnxo-.svg": {
|
|
116
88
|
"type": "image/svg+xml",
|
|
117
89
|
"etag": '"2bf8-hNaLCTi89nOFCsIIfWpP/jrfo0s"',
|
|
118
|
-
"mtime": "2026-07-03T08:
|
|
90
|
+
"mtime": "2026-07-03T08:38:18.431Z",
|
|
119
91
|
"size": 11256,
|
|
120
92
|
"path": "../public/assets/zhipuai-BPNAnxo-.svg"
|
|
121
93
|
},
|
|
122
|
-
"/assets/
|
|
94
|
+
"/assets/_sessionId-mnr0O0Ri.js": {
|
|
123
95
|
"type": "text/javascript; charset=utf-8",
|
|
124
|
-
"etag": '"
|
|
125
|
-
"mtime": "2026-07-03T08:
|
|
126
|
-
"size":
|
|
127
|
-
"path": "../public/assets/
|
|
96
|
+
"etag": '"d2-8fX6eaLvVng9PCQ65DZet+OU12I"',
|
|
97
|
+
"mtime": "2026-07-03T08:38:18.431Z",
|
|
98
|
+
"size": 210,
|
|
99
|
+
"path": "../public/assets/_sessionId-mnr0O0Ri.js"
|
|
100
|
+
},
|
|
101
|
+
"/assets/index-DP4NzCZ5.css": {
|
|
102
|
+
"type": "text/css; charset=utf-8",
|
|
103
|
+
"etag": '"1eb57-LKub3VNb71B8B8BuFk7Jbg4bu4U"',
|
|
104
|
+
"mtime": "2026-07-03T08:38:18.431Z",
|
|
105
|
+
"size": 125783,
|
|
106
|
+
"path": "../public/assets/index-DP4NzCZ5.css"
|
|
107
|
+
},
|
|
108
|
+
"/assets/ReplayDialog-BaD4R6ac.js": {
|
|
109
|
+
"type": "text/javascript; charset=utf-8",
|
|
110
|
+
"etag": '"318c-vv7692upDQMjsmv8eTib78z3Jbo"',
|
|
111
|
+
"mtime": "2026-07-03T08:38:18.431Z",
|
|
112
|
+
"size": 12684,
|
|
113
|
+
"path": "../public/assets/ReplayDialog-BaD4R6ac.js"
|
|
114
|
+
},
|
|
115
|
+
"/assets/main-CIV3Chb5.js": {
|
|
116
|
+
"type": "text/javascript; charset=utf-8",
|
|
117
|
+
"etag": '"512fd-t4pJOLeOXXlAM58KfA92bW148Yc"',
|
|
118
|
+
"mtime": "2026-07-03T08:38:18.431Z",
|
|
119
|
+
"size": 332541,
|
|
120
|
+
"path": "../public/assets/main-CIV3Chb5.js"
|
|
121
|
+
},
|
|
122
|
+
"/assets/qwen-CONDcHqt.png": {
|
|
123
|
+
"type": "image/png",
|
|
124
|
+
"etag": '"572c3-cdJAPaHdOvFCGzuaQjagdgOu6XE"',
|
|
125
|
+
"mtime": "2026-07-03T08:38:18.431Z",
|
|
126
|
+
"size": 357059,
|
|
127
|
+
"path": "../public/assets/qwen-CONDcHqt.png"
|
|
128
128
|
},
|
|
129
|
-
"/assets/ProxyViewerContainer-
|
|
129
|
+
"/assets/ProxyViewerContainer-BC-z9RPh.js": {
|
|
130
130
|
"type": "text/javascript; charset=utf-8",
|
|
131
|
-
"etag": '"
|
|
132
|
-
"mtime": "2026-07-03T08:
|
|
133
|
-
"size":
|
|
134
|
-
"path": "../public/assets/ProxyViewerContainer-
|
|
131
|
+
"etag": '"c1234-KOvboCBS0P+YrJrlD23VqmaVzJM"',
|
|
132
|
+
"mtime": "2026-07-03T08:38:18.432Z",
|
|
133
|
+
"size": 791092,
|
|
134
|
+
"path": "../public/assets/ProxyViewerContainer-BC-z9RPh.js"
|
|
135
135
|
}
|
|
136
136
|
};
|
|
137
137
|
function readAsset(id) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import { type JSX, useCallback, useEffect, useMemo, useState } from "react";
|
|
1
|
+
import { Fragment, type JSX, useCallback, useEffect, useMemo, useState } from "react";
|
|
2
2
|
import {
|
|
3
3
|
Check,
|
|
4
|
+
ChevronDown,
|
|
5
|
+
ChevronRight,
|
|
4
6
|
Copy,
|
|
5
7
|
Download,
|
|
6
8
|
ExternalLink,
|
|
@@ -175,6 +177,17 @@ function formatTimestamp(value: string): string {
|
|
|
175
177
|
}).format(new Date(millis));
|
|
176
178
|
}
|
|
177
179
|
|
|
180
|
+
function formatNullableTimestamp(value: string | null): string {
|
|
181
|
+
return value === null ? "-" : formatTimestamp(value);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
function formatJsonPreview(value: unknown): string {
|
|
185
|
+
const serialized = JSON.stringify(value);
|
|
186
|
+
const text = serialized === undefined ? String(value) : serialized;
|
|
187
|
+
if (text.length <= 160) return text;
|
|
188
|
+
return `${text.slice(0, 157)}...`;
|
|
189
|
+
}
|
|
190
|
+
|
|
178
191
|
function firstNonEmpty(...values: Array<string | null>): string {
|
|
179
192
|
for (const value of values) {
|
|
180
193
|
if (value !== null && value.trim().length > 0) return value;
|
|
@@ -208,6 +221,17 @@ function latestLog(row: GroupMemberRow): SessionLogSummary | null {
|
|
|
208
221
|
return logs[0] ?? null;
|
|
209
222
|
}
|
|
210
223
|
|
|
224
|
+
function memberSourceLabel(source: GroupMemberRow["source"]): string {
|
|
225
|
+
switch (source) {
|
|
226
|
+
case "export":
|
|
227
|
+
return "fresh export";
|
|
228
|
+
case "evidence":
|
|
229
|
+
return "evidence";
|
|
230
|
+
case "group":
|
|
231
|
+
return "group";
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
211
235
|
function evidenceFor(
|
|
212
236
|
group: InspectorGroup,
|
|
213
237
|
exportResult: GroupEvidenceExportResult | null,
|
|
@@ -889,6 +913,12 @@ function CopyPathRow({ label, value }: { label: string; value: string }): JSX.El
|
|
|
889
913
|
}
|
|
890
914
|
|
|
891
915
|
function MemberTable({ rows }: { rows: GroupMemberRow[] }): JSX.Element {
|
|
916
|
+
const [expandedMemberId, setExpandedMemberId] = useState<string | null>(null);
|
|
917
|
+
|
|
918
|
+
const toggleMember = useCallback((memberId: string) => {
|
|
919
|
+
setExpandedMemberId((current) => (current === memberId ? null : memberId));
|
|
920
|
+
}, []);
|
|
921
|
+
|
|
892
922
|
if (rows.length === 0) {
|
|
893
923
|
return (
|
|
894
924
|
<div className="rounded-md border border-dashed border-border px-3 py-8 text-center text-xs text-muted-foreground">
|
|
@@ -916,9 +946,15 @@ function MemberTable({ rows }: { rows: GroupMemberRow[] }): JSX.Element {
|
|
|
916
946
|
</tr>
|
|
917
947
|
</thead>
|
|
918
948
|
<tbody>
|
|
919
|
-
{rows.map((row) =>
|
|
920
|
-
|
|
921
|
-
|
|
949
|
+
{rows.map((row) => {
|
|
950
|
+
const isExpanded = expandedMemberId === row.member.id;
|
|
951
|
+
return (
|
|
952
|
+
<Fragment key={row.member.id}>
|
|
953
|
+
<MemberRow row={row} isExpanded={isExpanded} onToggleDetails={toggleMember} />
|
|
954
|
+
<MemberDetailsRow row={row} isExpanded={isExpanded} />
|
|
955
|
+
</Fragment>
|
|
956
|
+
);
|
|
957
|
+
})}
|
|
922
958
|
</tbody>
|
|
923
959
|
</table>
|
|
924
960
|
</div>
|
|
@@ -926,7 +962,15 @@ function MemberTable({ rows }: { rows: GroupMemberRow[] }): JSX.Element {
|
|
|
926
962
|
);
|
|
927
963
|
}
|
|
928
964
|
|
|
929
|
-
function MemberRow({
|
|
965
|
+
function MemberRow({
|
|
966
|
+
row,
|
|
967
|
+
isExpanded,
|
|
968
|
+
onToggleDetails,
|
|
969
|
+
}: {
|
|
970
|
+
row: GroupMemberRow;
|
|
971
|
+
isExpanded: boolean;
|
|
972
|
+
onToggleDetails: (memberId: string) => void;
|
|
973
|
+
}): JSX.Element {
|
|
930
974
|
const member = row.member;
|
|
931
975
|
const session = row.exportMember?.session ?? null;
|
|
932
976
|
const log = latestLog(row);
|
|
@@ -939,31 +983,53 @@ function MemberRow({ row }: { row: GroupMemberRow }): JSX.Element {
|
|
|
939
983
|
const sessionLabel = firstNonEmpty(member.label, member.sessionId);
|
|
940
984
|
|
|
941
985
|
return (
|
|
942
|
-
<tr className="border-b border-border last:border-0">
|
|
986
|
+
<tr className="border-b border-border last:border-0 hover:bg-muted/20">
|
|
943
987
|
<td className="max-w-56 px-3 py-2">
|
|
944
|
-
|
|
945
|
-
<
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
className="
|
|
950
|
-
aria-label={`
|
|
951
|
-
title={
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
</a>
|
|
956
|
-
) : (
|
|
957
|
-
<span
|
|
958
|
-
className="inline-flex max-w-full min-w-0 items-center gap-2 font-mono text-xs text-foreground"
|
|
959
|
-
title={`Evidence snapshot for ${sessionLabel}`}
|
|
988
|
+
<div className="flex min-w-0 items-center gap-1.5">
|
|
989
|
+
<Button
|
|
990
|
+
type="button"
|
|
991
|
+
variant="ghost"
|
|
992
|
+
size="icon"
|
|
993
|
+
className="size-6 shrink-0 text-muted-foreground"
|
|
994
|
+
aria-label={isExpanded ? `Hide member ${sessionLabel}` : `Show member ${sessionLabel}`}
|
|
995
|
+
title={isExpanded ? "Hide member details" : "Show member details"}
|
|
996
|
+
onClick={() => {
|
|
997
|
+
onToggleDetails(member.id);
|
|
998
|
+
}}
|
|
960
999
|
>
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
1000
|
+
{isExpanded ? (
|
|
1001
|
+
<ChevronDown className="size-3.5" />
|
|
1002
|
+
) : (
|
|
1003
|
+
<ChevronRight className="size-3.5" />
|
|
1004
|
+
)}
|
|
1005
|
+
</Button>
|
|
1006
|
+
{canOpenLiveSession ? (
|
|
1007
|
+
<a
|
|
1008
|
+
href={sessionPath}
|
|
1009
|
+
target="_blank"
|
|
1010
|
+
rel="noreferrer"
|
|
1011
|
+
className="inline-flex max-w-full min-w-0 items-center gap-2 rounded-sm font-mono text-xs text-primary outline-none hover:underline focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2"
|
|
1012
|
+
aria-label={`Open session ${sessionLabel}`}
|
|
1013
|
+
title={`Open session ${sessionLabel}`}
|
|
1014
|
+
>
|
|
1015
|
+
<span className="min-w-0 truncate">{sessionLabel}</span>
|
|
1016
|
+
<ExternalLink className="size-3 shrink-0 text-muted-foreground" />
|
|
1017
|
+
</a>
|
|
1018
|
+
) : (
|
|
1019
|
+
<span
|
|
1020
|
+
className="inline-flex max-w-full min-w-0 items-center gap-2 font-mono text-xs text-foreground"
|
|
1021
|
+
title={`Evidence snapshot for ${sessionLabel}`}
|
|
1022
|
+
>
|
|
1023
|
+
<span className="min-w-0 truncate">{sessionLabel}</span>
|
|
1024
|
+
<Badge
|
|
1025
|
+
variant="outline"
|
|
1026
|
+
className="shrink-0 border-zinc-200 bg-zinc-50 text-zinc-600"
|
|
1027
|
+
>
|
|
1028
|
+
evidence
|
|
1029
|
+
</Badge>
|
|
1030
|
+
</span>
|
|
1031
|
+
)}
|
|
1032
|
+
</div>
|
|
967
1033
|
<div className="mt-0.5 truncate text-[11px] text-muted-foreground">
|
|
968
1034
|
{displayText(member.agent)}
|
|
969
1035
|
</div>
|
|
@@ -983,3 +1049,164 @@ function MemberRow({ row }: { row: GroupMemberRow }): JSX.Element {
|
|
|
983
1049
|
</tr>
|
|
984
1050
|
);
|
|
985
1051
|
}
|
|
1052
|
+
|
|
1053
|
+
function MemberDetailsRow({
|
|
1054
|
+
row,
|
|
1055
|
+
isExpanded,
|
|
1056
|
+
}: {
|
|
1057
|
+
row: GroupMemberRow;
|
|
1058
|
+
isExpanded: boolean;
|
|
1059
|
+
}): JSX.Element | null {
|
|
1060
|
+
if (!isExpanded) return null;
|
|
1061
|
+
|
|
1062
|
+
const member = row.member;
|
|
1063
|
+
const exportMember = row.exportMember;
|
|
1064
|
+
const session = exportMember?.session ?? null;
|
|
1065
|
+
const run = exportMember?.run ?? null;
|
|
1066
|
+
const metadataEntries = Object.entries(member.metadata);
|
|
1067
|
+
|
|
1068
|
+
return (
|
|
1069
|
+
<tr className="border-b border-border bg-muted/10">
|
|
1070
|
+
<td colSpan={7} className="px-3 pb-4 pt-2">
|
|
1071
|
+
<div className="space-y-3 rounded-md border border-border bg-background p-3">
|
|
1072
|
+
<div className="grid gap-2 sm:grid-cols-2 lg:grid-cols-4">
|
|
1073
|
+
<MemberDetailItem label="Source" value={memberSourceLabel(row.source)} />
|
|
1074
|
+
<MemberDetailItem label="Member ID" value={member.id} mono />
|
|
1075
|
+
<MemberDetailItem label="Session ID" value={member.sessionId} mono />
|
|
1076
|
+
<MemberDetailItem label="Run ID" value={run?.id ?? member.runId ?? "-"} mono />
|
|
1077
|
+
<MemberDetailItem label="Created" value={formatTimestamp(member.addedAt)} />
|
|
1078
|
+
<MemberDetailItem label="Updated" value={formatTimestamp(member.updatedAt)} />
|
|
1079
|
+
<MemberDetailItem
|
|
1080
|
+
label="Session created"
|
|
1081
|
+
value={formatNullableTimestamp(session?.createdAt ?? null)}
|
|
1082
|
+
/>
|
|
1083
|
+
<MemberDetailItem
|
|
1084
|
+
label="Session updated"
|
|
1085
|
+
value={formatNullableTimestamp(session?.updatedAt ?? null)}
|
|
1086
|
+
/>
|
|
1087
|
+
</div>
|
|
1088
|
+
|
|
1089
|
+
{session === null ? (
|
|
1090
|
+
<div className="rounded-md border border-dashed border-border px-3 py-2 text-xs text-muted-foreground">
|
|
1091
|
+
No session snapshot is available for this member.
|
|
1092
|
+
</div>
|
|
1093
|
+
) : (
|
|
1094
|
+
<div className="grid gap-2 sm:grid-cols-2 lg:grid-cols-4">
|
|
1095
|
+
<MemberDetailItem label="Log coverage" value={session.logCoverage} />
|
|
1096
|
+
<MemberDetailItem label="Runtime" value={displayText(session.runtimeMode)} />
|
|
1097
|
+
<MemberDetailItem label="Requests" value={formatNumber(session.requestCount)} mono />
|
|
1098
|
+
<MemberDetailItem label="Errors" value={formatNumber(session.errorCount)} mono />
|
|
1099
|
+
<MemberDetailItem
|
|
1100
|
+
label="Input tokens"
|
|
1101
|
+
value={formatNumber(session.tokenUsage.input)}
|
|
1102
|
+
mono
|
|
1103
|
+
/>
|
|
1104
|
+
<MemberDetailItem
|
|
1105
|
+
label="Output tokens"
|
|
1106
|
+
value={formatNumber(session.tokenUsage.output)}
|
|
1107
|
+
mono
|
|
1108
|
+
/>
|
|
1109
|
+
<MemberDetailItem
|
|
1110
|
+
label="Cache read"
|
|
1111
|
+
value={formatNumber(session.tokenUsage.cacheRead)}
|
|
1112
|
+
mono
|
|
1113
|
+
/>
|
|
1114
|
+
<MemberDetailItem
|
|
1115
|
+
label="Total tokens"
|
|
1116
|
+
value={formatNumber(session.tokenUsage.total)}
|
|
1117
|
+
mono
|
|
1118
|
+
/>
|
|
1119
|
+
</div>
|
|
1120
|
+
)}
|
|
1121
|
+
|
|
1122
|
+
<LatestLogsPreview logs={session?.latestLogs ?? []} />
|
|
1123
|
+
<MemberMetadata entries={metadataEntries} />
|
|
1124
|
+
</div>
|
|
1125
|
+
</td>
|
|
1126
|
+
</tr>
|
|
1127
|
+
);
|
|
1128
|
+
}
|
|
1129
|
+
|
|
1130
|
+
function MemberDetailItem({
|
|
1131
|
+
label,
|
|
1132
|
+
value,
|
|
1133
|
+
mono = false,
|
|
1134
|
+
}: {
|
|
1135
|
+
label: string;
|
|
1136
|
+
value: string;
|
|
1137
|
+
mono?: boolean;
|
|
1138
|
+
}): JSX.Element {
|
|
1139
|
+
return (
|
|
1140
|
+
<div className="min-w-0">
|
|
1141
|
+
<div className="text-[11px] font-medium uppercase tracking-wide text-muted-foreground">
|
|
1142
|
+
{label}
|
|
1143
|
+
</div>
|
|
1144
|
+
<div
|
|
1145
|
+
className={cn("truncate text-xs text-foreground", mono ? "font-mono" : "")}
|
|
1146
|
+
title={value}
|
|
1147
|
+
>
|
|
1148
|
+
{value}
|
|
1149
|
+
</div>
|
|
1150
|
+
</div>
|
|
1151
|
+
);
|
|
1152
|
+
}
|
|
1153
|
+
|
|
1154
|
+
function LatestLogsPreview({ logs }: { logs: SessionLogSummary[] }): JSX.Element {
|
|
1155
|
+
const visibleLogs = logs.slice(0, 5);
|
|
1156
|
+
|
|
1157
|
+
if (visibleLogs.length === 0) {
|
|
1158
|
+
return (
|
|
1159
|
+
<div className="rounded-md border border-dashed border-border px-3 py-2 text-xs text-muted-foreground">
|
|
1160
|
+
No latest logs in this snapshot.
|
|
1161
|
+
</div>
|
|
1162
|
+
);
|
|
1163
|
+
}
|
|
1164
|
+
|
|
1165
|
+
return (
|
|
1166
|
+
<div className="overflow-hidden rounded-md border border-border">
|
|
1167
|
+
<div className="border-b border-border bg-muted/30 px-3 py-2 text-[11px] font-semibold uppercase tracking-wide text-muted-foreground">
|
|
1168
|
+
Latest logs
|
|
1169
|
+
</div>
|
|
1170
|
+
<div className="divide-y divide-border">
|
|
1171
|
+
{visibleLogs.map((log) => (
|
|
1172
|
+
<div
|
|
1173
|
+
key={log.id}
|
|
1174
|
+
className="grid gap-2 px-3 py-2 text-xs sm:grid-cols-[72px_1fr_88px_88px]"
|
|
1175
|
+
>
|
|
1176
|
+
<span className="font-mono text-muted-foreground">#{log.id}</span>
|
|
1177
|
+
<span className="min-w-0 truncate">
|
|
1178
|
+
{displayText(log.model)} · {log.apiFormat} · {log.path}
|
|
1179
|
+
</span>
|
|
1180
|
+
<span className="font-mono text-muted-foreground">{formatMs(log.firstChunkMs)}</span>
|
|
1181
|
+
<span className="font-mono text-muted-foreground">{formatMs(log.latencyMs)}</span>
|
|
1182
|
+
</div>
|
|
1183
|
+
))}
|
|
1184
|
+
</div>
|
|
1185
|
+
</div>
|
|
1186
|
+
);
|
|
1187
|
+
}
|
|
1188
|
+
|
|
1189
|
+
function MemberMetadata({ entries }: { entries: Array<[string, unknown]> }): JSX.Element | null {
|
|
1190
|
+
if (entries.length === 0) return null;
|
|
1191
|
+
|
|
1192
|
+
return (
|
|
1193
|
+
<div className="overflow-hidden rounded-md border border-border">
|
|
1194
|
+
<div className="border-b border-border bg-muted/30 px-3 py-2 text-[11px] font-semibold uppercase tracking-wide text-muted-foreground">
|
|
1195
|
+
Metadata
|
|
1196
|
+
</div>
|
|
1197
|
+
<div className="grid gap-x-3 gap-y-2 p-3 text-xs sm:grid-cols-2">
|
|
1198
|
+
{entries.map(([key, value]) => {
|
|
1199
|
+
const preview = formatJsonPreview(value);
|
|
1200
|
+
return (
|
|
1201
|
+
<div key={key} className="min-w-0">
|
|
1202
|
+
<span className="mr-2 text-muted-foreground">{key}</span>
|
|
1203
|
+
<span className="font-mono text-foreground" title={preview}>
|
|
1204
|
+
{preview}
|
|
1205
|
+
</span>
|
|
1206
|
+
</div>
|
|
1207
|
+
);
|
|
1208
|
+
})}
|
|
1209
|
+
</div>
|
|
1210
|
+
</div>
|
|
1211
|
+
);
|
|
1212
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{R as s,j as e}from"./main-DZVKUeg6.js";import{P as i}from"./ProxyViewerContainer-DaiTFf7n.js";function t(){const{sessionId:o}=s.useParams();return e.jsx(i,{initialSessionId:o},o)}export{t as component};
|