@tonyclaw/agent-inspector 2.1.4 → 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-BihEPd3v.js → CompareDrawer-Djazxhew.js} +1 -1
- package/.output/public/assets/{ProxyViewerContainer-DYqXb6WW.js → ProxyViewerContainer-BC-z9RPh.js} +40 -40
- package/.output/public/assets/{ReplayDialog-DnX-6kY8.js → ReplayDialog-BaD4R6ac.js} +1 -1
- package/.output/public/assets/{RequestAnatomy-CIkHAxZO.js → RequestAnatomy-w6uGdqYp.js} +1 -1
- package/.output/public/assets/{ResponseView-BFc8jjZM.js → ResponseView-VPed-Yif.js} +1 -1
- package/.output/public/assets/{StreamingChunkSequence-p8qkpF6K.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-xlSdu7_I.js → main-CIV3Chb5.js} +2 -2
- package/.output/server/{_sessionId-CwVQgxoK.mjs → _sessionId-CIXQGim9.mjs} +2 -2
- package/.output/server/_ssr/{CompareDrawer-Br9Ec0ah.mjs → CompareDrawer-_uFgjkB2.mjs} +2 -2
- package/.output/server/_ssr/{ProxyViewerContainer-Oe5Tr3C2.mjs → ProxyViewerContainer-D8YjQDNj.mjs} +240 -28
- package/.output/server/_ssr/{ReplayDialog-C1_QsoA-.mjs → ReplayDialog-CFwKM7jc.mjs} +3 -3
- package/.output/server/_ssr/{RequestAnatomy-cn08QSoz.mjs → RequestAnatomy-2Vr84GxT.mjs} +2 -2
- package/.output/server/_ssr/{ResponseView-CIqUCCTG.mjs → ResponseView-CSBWBHRJ.mjs} +2 -2
- package/.output/server/_ssr/{StreamingChunkSequence-0MhVWD2F.mjs → StreamingChunkSequence-Dr4JApqs.mjs} +2 -2
- package/.output/server/_ssr/{index-jpnI5ghp.mjs → index-WnsY1fh_.mjs} +2 -2
- package/.output/server/_ssr/index.mjs +2 -2
- package/.output/server/_ssr/{router-SSOn7c09.mjs → router-sy38X5AX.mjs} +6 -4
- package/.output/server/{_tanstack-start-manifest_v-BCgy_9er.mjs → _tanstack-start-manifest_v-Dde-eACV.mjs} +1 -1
- package/.output/server/index.mjs +50 -50
- package/package.json +1 -1
- package/src/components/groups/GroupsDialog.tsx +274 -19
- package/src/lib/groupContract.ts +1 -0
- package/src/services/groups.ts +1 -0
- package/.output/public/assets/_sessionId-Csx4T_y6.js +0 -1
- package/.output/public/assets/index-Bcq8bZoK.css +0 -1
- package/.output/public/assets/index-KMuh-31x.js +0 -1
|
@@ -65,7 +65,7 @@ import "../_libs/immediate.mjs";
|
|
|
65
65
|
import "../_libs/setimmediate.mjs";
|
|
66
66
|
import "../_libs/pako.mjs";
|
|
67
67
|
const faviconSvg = "data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20role='img'%20aria-label='Agent%20Inspector'%3e%3cg%20fill='none'%20stroke='%23f59e0b'%20stroke-width='1.5'%20stroke-linecap='round'%20stroke-linejoin='round'%20%3e%3cpath%20d='M5%2013%20C5%209%208%207%2012%207%20C16%207%2019%209%2019%2013%20C19%2016%2016%2018%2012%2018%20C8%2018%205%2016%205%2013%20Z'%20/%3e%3cpath%20d='M5%2011%20C3.5%209.5%201.5%2010%202%2012.5%20C2.5%2014%204%2013.5%205%2012.5'%20/%3e%3cpath%20d='M19%2011%20C20.5%209.5%2022.5%2010%2022%2012.5%20C21.5%2014%2020%2013.5%2019%2012.5'%20/%3e%3cline%20x1='10'%20y1='7'%20x2='9.5'%20y2='5'%20/%3e%3cline%20x1='14'%20y1='7'%20x2='14.5'%20y2='5'%20/%3e%3cline%20x1='6.5'%20y1='16'%20x2='4.5'%20y2='19.5'%20/%3e%3cline%20x1='9'%20y1='17.5'%20x2='8'%20y2='20.5'%20/%3e%3cline%20x1='15'%20y1='17.5'%20x2='16'%20y2='20.5'%20/%3e%3cline%20x1='17.5'%20y1='16'%20x2='19.5'%20y2='19.5'%20/%3e%3c/g%3e%3ccircle%20cx='9.5'%20cy='4.5'%20r='0.9'%20fill='%23f59e0b'%20/%3e%3ccircle%20cx='14.5'%20cy='4.5'%20r='0.9'%20fill='%23f59e0b'%20/%3e%3c/svg%3e";
|
|
68
|
-
const appCss = "/assets/index-
|
|
68
|
+
const appCss = "/assets/index-DP4NzCZ5.css";
|
|
69
69
|
const Route$D = createRootRoute({
|
|
70
70
|
head: () => ({
|
|
71
71
|
meta: [
|
|
@@ -108,7 +108,7 @@ function RootDocument({ children }) {
|
|
|
108
108
|
] })
|
|
109
109
|
] });
|
|
110
110
|
}
|
|
111
|
-
const $$splitComponentImporter$1 = () => import("./index-
|
|
111
|
+
const $$splitComponentImporter$1 = () => import("./index-WnsY1fh_.mjs");
|
|
112
112
|
const Route$C = createFileRoute("/")({
|
|
113
113
|
component: lazyRouteComponent($$splitComponentImporter$1, "component")
|
|
114
114
|
});
|
|
@@ -151,7 +151,7 @@ function decodeSessionIdFromPath(encoded) {
|
|
|
151
151
|
function getSessionPath(sessionId) {
|
|
152
152
|
return `/session/${encodeSessionIdForPath(sessionId)}`;
|
|
153
153
|
}
|
|
154
|
-
const $$splitComponentImporter = () => import("../_sessionId-
|
|
154
|
+
const $$splitComponentImporter = () => import("../_sessionId-CIXQGim9.mjs");
|
|
155
155
|
const Route$B = createFileRoute("/session/$sessionId")({
|
|
156
156
|
component: lazyRouteComponent($$splitComponentImporter, "component"),
|
|
157
157
|
parseParams: (params) => ({
|
|
@@ -7158,6 +7158,7 @@ const InspectorGroupEvidenceSummarySchema = object({
|
|
|
7158
7158
|
const GroupEvidenceReadResponseSchema = object({
|
|
7159
7159
|
group: InspectorGroupSchema,
|
|
7160
7160
|
evidence: InspectorGroupEvidenceSchema,
|
|
7161
|
+
members: array(InspectorGroupExportMemberSchema).nullable(),
|
|
7161
7162
|
markdown: string(),
|
|
7162
7163
|
summary: InspectorGroupEvidenceSummarySchema.nullable(),
|
|
7163
7164
|
report: EvidenceReportSchema.nullable()
|
|
@@ -7925,7 +7926,7 @@ const Route$w = createFileRoute("/api/models")({
|
|
|
7925
7926
|
}
|
|
7926
7927
|
}
|
|
7927
7928
|
});
|
|
7928
|
-
const version = "2.1.
|
|
7929
|
+
const version = "2.1.6";
|
|
7929
7930
|
const packageJson = {
|
|
7930
7931
|
version
|
|
7931
7932
|
};
|
|
@@ -8351,6 +8352,7 @@ function readInspectorGroupEvidence(groupId) {
|
|
|
8351
8352
|
return serviceOk({
|
|
8352
8353
|
group,
|
|
8353
8354
|
evidence: group.evidence,
|
|
8355
|
+
members: document?.members ?? null,
|
|
8354
8356
|
markdown,
|
|
8355
8357
|
summary: document?.summary ?? null,
|
|
8356
8358
|
report: document?.jenkinsReport ?? null
|
|
@@ -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
|
@@ -38,100 +38,100 @@ const assets = {
|
|
|
38
38
|
"/assets/alibaba-TTwafVwX.svg": {
|
|
39
39
|
"type": "image/svg+xml",
|
|
40
40
|
"etag": '"171b-6dyV5K8QjiaY35sN9qNprh9zDIs"',
|
|
41
|
-
"mtime": "2026-07-
|
|
41
|
+
"mtime": "2026-07-03T08:38:18.431Z",
|
|
42
42
|
"size": 5915,
|
|
43
43
|
"path": "../public/assets/alibaba-TTwafVwX.svg"
|
|
44
44
|
},
|
|
45
|
-
"/assets/index-
|
|
45
|
+
"/assets/index-DH1DjJOl.js": {
|
|
46
46
|
"type": "text/javascript; charset=utf-8",
|
|
47
|
-
"etag": '"74-
|
|
48
|
-
"mtime": "2026-07-
|
|
47
|
+
"etag": '"74-XPYkCkmLf6OHNprOlGZmst3ii/c"',
|
|
48
|
+
"mtime": "2026-07-03T08:38:18.431Z",
|
|
49
49
|
"size": 116,
|
|
50
|
-
"path": "../public/assets/index-
|
|
50
|
+
"path": "../public/assets/index-DH1DjJOl.js"
|
|
51
51
|
},
|
|
52
|
-
"/assets/CompareDrawer-
|
|
52
|
+
"/assets/CompareDrawer-Djazxhew.js": {
|
|
53
53
|
"type": "text/javascript; charset=utf-8",
|
|
54
|
-
"etag": '"49e8-
|
|
55
|
-
"mtime": "2026-07-
|
|
54
|
+
"etag": '"49e8-BgBnUkEs/A9S9UOa70+wREN0qNc"',
|
|
55
|
+
"mtime": "2026-07-03T08:38:18.431Z",
|
|
56
56
|
"size": 18920,
|
|
57
|
-
"path": "../public/assets/CompareDrawer-
|
|
57
|
+
"path": "../public/assets/CompareDrawer-Djazxhew.js"
|
|
58
58
|
},
|
|
59
59
|
"/assets/minimax-BPMzvuL-.jpeg": {
|
|
60
60
|
"type": "image/jpeg",
|
|
61
61
|
"etag": '"1b06-IwivU89ko5UTMUM1/t7hn4sQK9A"',
|
|
62
|
-
"mtime": "2026-07-
|
|
62
|
+
"mtime": "2026-07-03T08:38:18.431Z",
|
|
63
63
|
"size": 6918,
|
|
64
64
|
"path": "../public/assets/minimax-BPMzvuL-.jpeg"
|
|
65
65
|
},
|
|
66
|
-
"/assets/
|
|
67
|
-
"type": "text/css; charset=utf-8",
|
|
68
|
-
"etag": '"1e82d-Bo+nRYLQB3/4r6wWrfFE4tW/SHg"',
|
|
69
|
-
"mtime": "2026-07-03T07:52:18.057Z",
|
|
70
|
-
"size": 124973,
|
|
71
|
-
"path": "../public/assets/index-Bcq8bZoK.css"
|
|
72
|
-
},
|
|
73
|
-
"/assets/RequestAnatomy-CIkHAxZO.js": {
|
|
66
|
+
"/assets/ResponseView-VPed-Yif.js": {
|
|
74
67
|
"type": "text/javascript; charset=utf-8",
|
|
75
|
-
"etag": '"
|
|
76
|
-
"mtime": "2026-07-
|
|
77
|
-
"size":
|
|
78
|
-
"path": "../public/assets/
|
|
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/
|
|
73
|
+
"/assets/RequestAnatomy-w6uGdqYp.js": {
|
|
81
74
|
"type": "text/javascript; charset=utf-8",
|
|
82
|
-
"etag": '"
|
|
83
|
-
"mtime": "2026-07-
|
|
84
|
-
"size":
|
|
85
|
-
"path": "../public/assets/
|
|
75
|
+
"etag": '"43f2-7s0ubeaphfsGPvrGnsiVPloVCUM"',
|
|
76
|
+
"mtime": "2026-07-03T08:38:18.431Z",
|
|
77
|
+
"size": 17394,
|
|
78
|
+
"path": "../public/assets/RequestAnatomy-w6uGdqYp.js"
|
|
86
79
|
},
|
|
87
|
-
"/assets/StreamingChunkSequence-
|
|
80
|
+
"/assets/StreamingChunkSequence-CPB8FgHI.js": {
|
|
88
81
|
"type": "text/javascript; charset=utf-8",
|
|
89
|
-
"etag": '"d5c-
|
|
90
|
-
"mtime": "2026-07-
|
|
82
|
+
"etag": '"d5c-GckK+AzsbwALbgplRm1NjeMIsro"',
|
|
83
|
+
"mtime": "2026-07-03T08:38:18.432Z",
|
|
91
84
|
"size": 3420,
|
|
92
|
-
"path": "../public/assets/StreamingChunkSequence-
|
|
85
|
+
"path": "../public/assets/StreamingChunkSequence-CPB8FgHI.js"
|
|
93
86
|
},
|
|
94
87
|
"/assets/zhipuai-BPNAnxo-.svg": {
|
|
95
88
|
"type": "image/svg+xml",
|
|
96
89
|
"etag": '"2bf8-hNaLCTi89nOFCsIIfWpP/jrfo0s"',
|
|
97
|
-
"mtime": "2026-07-
|
|
90
|
+
"mtime": "2026-07-03T08:38:18.431Z",
|
|
98
91
|
"size": 11256,
|
|
99
92
|
"path": "../public/assets/zhipuai-BPNAnxo-.svg"
|
|
100
93
|
},
|
|
101
|
-
"/assets/_sessionId-
|
|
94
|
+
"/assets/_sessionId-mnr0O0Ri.js": {
|
|
102
95
|
"type": "text/javascript; charset=utf-8",
|
|
103
|
-
"etag": '"d2-
|
|
104
|
-
"mtime": "2026-07-
|
|
96
|
+
"etag": '"d2-8fX6eaLvVng9PCQ65DZet+OU12I"',
|
|
97
|
+
"mtime": "2026-07-03T08:38:18.431Z",
|
|
105
98
|
"size": 210,
|
|
106
|
-
"path": "../public/assets/_sessionId-
|
|
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
107
|
},
|
|
108
|
-
"/assets/ReplayDialog-
|
|
108
|
+
"/assets/ReplayDialog-BaD4R6ac.js": {
|
|
109
109
|
"type": "text/javascript; charset=utf-8",
|
|
110
|
-
"etag": '"318c-
|
|
111
|
-
"mtime": "2026-07-
|
|
110
|
+
"etag": '"318c-vv7692upDQMjsmv8eTib78z3Jbo"',
|
|
111
|
+
"mtime": "2026-07-03T08:38:18.431Z",
|
|
112
112
|
"size": 12684,
|
|
113
|
-
"path": "../public/assets/ReplayDialog-
|
|
113
|
+
"path": "../public/assets/ReplayDialog-BaD4R6ac.js"
|
|
114
114
|
},
|
|
115
|
-
"/assets/main-
|
|
115
|
+
"/assets/main-CIV3Chb5.js": {
|
|
116
116
|
"type": "text/javascript; charset=utf-8",
|
|
117
|
-
"etag": '"512fd-
|
|
118
|
-
"mtime": "2026-07-
|
|
117
|
+
"etag": '"512fd-t4pJOLeOXXlAM58KfA92bW148Yc"',
|
|
118
|
+
"mtime": "2026-07-03T08:38:18.431Z",
|
|
119
119
|
"size": 332541,
|
|
120
|
-
"path": "../public/assets/main-
|
|
120
|
+
"path": "../public/assets/main-CIV3Chb5.js"
|
|
121
121
|
},
|
|
122
122
|
"/assets/qwen-CONDcHqt.png": {
|
|
123
123
|
"type": "image/png",
|
|
124
124
|
"etag": '"572c3-cdJAPaHdOvFCGzuaQjagdgOu6XE"',
|
|
125
|
-
"mtime": "2026-07-
|
|
125
|
+
"mtime": "2026-07-03T08:38:18.431Z",
|
|
126
126
|
"size": 357059,
|
|
127
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-
|
|
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,
|
|
@@ -44,6 +46,7 @@ type GroupSummary = {
|
|
|
44
46
|
type GroupMemberRow = {
|
|
45
47
|
member: InspectorGroupMember;
|
|
46
48
|
exportMember: InspectorGroupExportMember | null;
|
|
49
|
+
source: "group" | "export" | "evidence";
|
|
47
50
|
};
|
|
48
51
|
|
|
49
52
|
export function groupDeletePath(groupId: string, deleteEvidence: boolean): string {
|
|
@@ -89,15 +92,29 @@ export function summarizeGroup(group: InspectorGroup): GroupSummary {
|
|
|
89
92
|
export function buildGroupMemberRows(
|
|
90
93
|
group: InspectorGroup,
|
|
91
94
|
exportResult: GroupEvidenceExportResult | null,
|
|
95
|
+
evidenceResponse: GroupEvidenceReadResponse | null = null,
|
|
92
96
|
): GroupMemberRow[] {
|
|
93
97
|
if (exportResult !== null && exportResult.group.id === group.id) {
|
|
94
98
|
return exportResult.members.map((exportMember) => ({
|
|
95
99
|
member: exportMember.member,
|
|
96
100
|
exportMember,
|
|
101
|
+
source: "export",
|
|
97
102
|
}));
|
|
98
103
|
}
|
|
99
104
|
|
|
100
|
-
|
|
105
|
+
if (
|
|
106
|
+
evidenceResponse !== null &&
|
|
107
|
+
evidenceResponse.group.id === group.id &&
|
|
108
|
+
evidenceResponse.members !== null
|
|
109
|
+
) {
|
|
110
|
+
return evidenceResponse.members.map((exportMember) => ({
|
|
111
|
+
member: exportMember.member,
|
|
112
|
+
exportMember,
|
|
113
|
+
source: "evidence",
|
|
114
|
+
}));
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return group.members.map((member) => ({ member, exportMember: null, source: "group" }));
|
|
101
118
|
}
|
|
102
119
|
|
|
103
120
|
function statusClassName(status: InspectorGroup["status"] | MemberStatus): string {
|
|
@@ -160,6 +177,17 @@ function formatTimestamp(value: string): string {
|
|
|
160
177
|
}).format(new Date(millis));
|
|
161
178
|
}
|
|
162
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
|
+
|
|
163
191
|
function firstNonEmpty(...values: Array<string | null>): string {
|
|
164
192
|
for (const value of values) {
|
|
165
193
|
if (value !== null && value.trim().length > 0) return value;
|
|
@@ -193,6 +221,17 @@ function latestLog(row: GroupMemberRow): SessionLogSummary | null {
|
|
|
193
221
|
return logs[0] ?? null;
|
|
194
222
|
}
|
|
195
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
|
+
|
|
196
235
|
function evidenceFor(
|
|
197
236
|
group: InspectorGroup,
|
|
198
237
|
exportResult: GroupEvidenceExportResult | null,
|
|
@@ -553,7 +592,7 @@ function GroupDetails({
|
|
|
553
592
|
const exportedSummary = exportSummaryFor(group, exportResult, evidenceResponse);
|
|
554
593
|
const evidenceReport = evidenceReportFor(group, exportResult, evidenceResponse);
|
|
555
594
|
const evidence = evidenceFor(group, exportResult);
|
|
556
|
-
const rows = buildGroupMemberRows(group, exportResult);
|
|
595
|
+
const rows = buildGroupMemberRows(group, exportResult, evidenceResponse);
|
|
557
596
|
const isExporting = exportingGroupId === group.id;
|
|
558
597
|
const isDeleting = deletingGroupId === group.id;
|
|
559
598
|
const isConfirmingDelete = deleteTarget?.id === group.id;
|
|
@@ -874,6 +913,12 @@ function CopyPathRow({ label, value }: { label: string; value: string }): JSX.El
|
|
|
874
913
|
}
|
|
875
914
|
|
|
876
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
|
+
|
|
877
922
|
if (rows.length === 0) {
|
|
878
923
|
return (
|
|
879
924
|
<div className="rounded-md border border-dashed border-border px-3 py-8 text-center text-xs text-muted-foreground">
|
|
@@ -901,9 +946,15 @@ function MemberTable({ rows }: { rows: GroupMemberRow[] }): JSX.Element {
|
|
|
901
946
|
</tr>
|
|
902
947
|
</thead>
|
|
903
948
|
<tbody>
|
|
904
|
-
{rows.map((row) =>
|
|
905
|
-
|
|
906
|
-
|
|
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
|
+
})}
|
|
907
958
|
</tbody>
|
|
908
959
|
</table>
|
|
909
960
|
</div>
|
|
@@ -911,11 +962,20 @@ function MemberTable({ rows }: { rows: GroupMemberRow[] }): JSX.Element {
|
|
|
911
962
|
);
|
|
912
963
|
}
|
|
913
964
|
|
|
914
|
-
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 {
|
|
915
974
|
const member = row.member;
|
|
916
975
|
const session = row.exportMember?.session ?? null;
|
|
917
976
|
const log = latestLog(row);
|
|
918
977
|
const sessionPath = session?.inspectorPath ?? getSessionPath(member.sessionId);
|
|
978
|
+
const canOpenLiveSession = row.source !== "evidence";
|
|
919
979
|
const requests = session?.requestCount ?? null;
|
|
920
980
|
const errors = session?.errorCount ?? null;
|
|
921
981
|
const tokens = session?.tokenUsage.total ?? null;
|
|
@@ -923,19 +983,53 @@ function MemberRow({ row }: { row: GroupMemberRow }): JSX.Element {
|
|
|
923
983
|
const sessionLabel = firstNonEmpty(member.label, member.sessionId);
|
|
924
984
|
|
|
925
985
|
return (
|
|
926
|
-
<tr className="border-b border-border last:border-0">
|
|
986
|
+
<tr className="border-b border-border last:border-0 hover:bg-muted/20">
|
|
927
987
|
<td className="max-w-56 px-3 py-2">
|
|
928
|
-
<
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
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
|
+
}}
|
|
999
|
+
>
|
|
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>
|
|
939
1033
|
<div className="mt-0.5 truncate text-[11px] text-muted-foreground">
|
|
940
1034
|
{displayText(member.agent)}
|
|
941
1035
|
</div>
|
|
@@ -955,3 +1049,164 @@ function MemberRow({ row }: { row: GroupMemberRow }): JSX.Element {
|
|
|
955
1049
|
</tr>
|
|
956
1050
|
);
|
|
957
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
|
+
}
|
package/src/lib/groupContract.ts
CHANGED
|
@@ -126,6 +126,7 @@ export const InspectorGroupEvidenceSummarySchema = z.object({
|
|
|
126
126
|
export const GroupEvidenceReadResponseSchema = z.object({
|
|
127
127
|
group: InspectorGroupSchema,
|
|
128
128
|
evidence: InspectorGroupEvidenceSchema,
|
|
129
|
+
members: z.array(InspectorGroupExportMemberSchema).nullable(),
|
|
129
130
|
markdown: z.string(),
|
|
130
131
|
summary: InspectorGroupEvidenceSummarySchema.nullable(),
|
|
131
132
|
report: EvidenceReportSchema.nullable(),
|