@tonyclaw/agent-inspector 2.0.29 → 2.0.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/assets/{CompareDrawer-DcqxlgSQ.js → CompareDrawer-tIUf2EJm.js} +1 -1
  3. package/.output/public/assets/ProxyViewerContainer-BxRaXhKR.js +115 -0
  4. package/.output/public/assets/{ReplayDialog-CBcnPgx1.js → ReplayDialog-D6v1xcuC.js} +1 -1
  5. package/.output/public/assets/{RequestAnatomy-DSgSqCYt.js → RequestAnatomy-D6PniTlx.js} +1 -1
  6. package/.output/public/assets/{ResponseView-CjqzBSoF.js → ResponseView-Sx8PjuvU.js} +1 -1
  7. package/.output/public/assets/{StreamingChunkSequence-DdBBKolI.js → StreamingChunkSequence-D-Rbfnxh.js} +1 -1
  8. package/.output/public/assets/_sessionId-BhNTuZ31.js +1 -0
  9. package/.output/public/assets/index-Byk60-jA.css +1 -0
  10. package/.output/public/assets/index-Kxptlkpg.js +1 -0
  11. package/.output/public/assets/{main-B6OLZCp9.js → main-B1kdhY98.js} +2 -2
  12. package/.output/server/_libs/lucide-react.mjs +159 -134
  13. package/.output/server/{_sessionId-CCfKJJ19.mjs → _sessionId-BceHFKf4.mjs} +3 -3
  14. package/.output/server/_ssr/{CompareDrawer-uaPI5R6e.mjs → CompareDrawer-uSxK5Ei5.mjs} +3 -3
  15. package/.output/server/_ssr/{ProxyViewerContainer-BV2nIxXy.mjs → ProxyViewerContainer-_npQ_f2i.mjs} +566 -17
  16. package/.output/server/_ssr/{ReplayDialog-eE2Hy2Nl.mjs → ReplayDialog-BHAzSLCT.mjs} +4 -4
  17. package/.output/server/_ssr/{RequestAnatomy-B7vwWo57.mjs → RequestAnatomy-DjlZLXBd.mjs} +3 -3
  18. package/.output/server/_ssr/{ResponseView-Bm6Qp8mo.mjs → ResponseView-BuDEJ3fl.mjs} +3 -3
  19. package/.output/server/_ssr/{StreamingChunkSequence-CbAJKJQx.mjs → StreamingChunkSequence-DFcu0bD8.mjs} +3 -3
  20. package/.output/server/_ssr/{index-u14_Aj60.mjs → index-Bw6Fw33c.mjs} +2 -2
  21. package/.output/server/_ssr/index.mjs +2 -2
  22. package/.output/server/_ssr/{router-qgeGUp1k.mjs → router-D90tMCb3.mjs} +1236 -143
  23. package/.output/server/_tanstack-start-manifest_v-BVM4AUlx.mjs +4 -0
  24. package/.output/server/index.mjs +60 -60
  25. package/README.md +24 -1
  26. package/package.json +1 -1
  27. package/src/components/ProxyViewer.tsx +9 -2
  28. package/src/components/groups/GroupsDialog.tsx +732 -0
  29. package/src/lib/groupContract.ts +148 -0
  30. package/src/lib/runContract.ts +2 -0
  31. package/src/lib/useGroupEvidence.ts +33 -0
  32. package/src/lib/useGroups.ts +28 -0
  33. package/src/mcp/server.ts +282 -1
  34. package/src/mcp/toolHandlers.ts +123 -0
  35. package/src/proxy/groupEvidenceExporter.ts +354 -0
  36. package/src/proxy/groupStore.ts +259 -0
  37. package/src/routes/api/groups.$groupId.evidence.ts +74 -0
  38. package/src/routes/api/groups.$groupId.sessions.ts +50 -0
  39. package/src/routes/api/groups.$groupId.ts +50 -0
  40. package/src/routes/api/groups.ts +39 -0
  41. package/.output/public/assets/ProxyViewerContainer-D650kQlv.js +0 -115
  42. package/.output/public/assets/_sessionId-wctOoGh_.js +0 -1
  43. package/.output/public/assets/index-BhQGSdhG.js +0 -1
  44. package/.output/public/assets/index-CwlHPmgL.css +0 -1
  45. package/.output/server/_tanstack-start-manifest_v-BrfUXnre.mjs +0 -4
@@ -0,0 +1,4 @@
1
+ const tsrStartManifest = () => ({ "routes": { "__root__": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/__root.tsx", "children": ["/", "/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-B1kdhY98.js"], "assets": [] }, "/": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/index.tsx", "assets": [], "preloads": ["/assets/index-Kxptlkpg.js", "/assets/ProxyViewerContainer-BxRaXhKR.js"] }, "/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/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-BhNTuZ31.js", "/assets/ProxyViewerContainer-BxRaXhKR.js"] }, "/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/chunks", "/api/logs/$id/replay"] }, "/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/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-B1kdhY98.js" });
2
+ export {
3
+ tsrStartManifest
4
+ };
@@ -35,103 +35,103 @@ const headers = ((m) => function headersRouteRule(event) {
35
35
  }
36
36
  });
37
37
  const assets = {
38
+ "/assets/index-Kxptlkpg.js": {
39
+ "type": "text/javascript; charset=utf-8",
40
+ "etag": '"74-zVU85yxwksDEAlmGvjnynbRJlsg"',
41
+ "mtime": "2026-07-01T02:23:48.450Z",
42
+ "size": 116,
43
+ "path": "../public/assets/index-Kxptlkpg.js"
44
+ },
45
+ "/assets/index-Byk60-jA.css": {
46
+ "type": "text/css; charset=utf-8",
47
+ "etag": '"1ab1a-tPrFGLVNN1Xk1g4iKBR5XFS0VgE"',
48
+ "mtime": "2026-07-01T02:23:48.450Z",
49
+ "size": 109338,
50
+ "path": "../public/assets/index-Byk60-jA.css"
51
+ },
38
52
  "/assets/alibaba-TTwafVwX.svg": {
39
53
  "type": "image/svg+xml",
40
54
  "etag": '"171b-6dyV5K8QjiaY35sN9qNprh9zDIs"',
41
- "mtime": "2026-06-30T09:01:48.556Z",
55
+ "mtime": "2026-07-01T02:23:48.448Z",
42
56
  "size": 5915,
43
57
  "path": "../public/assets/alibaba-TTwafVwX.svg"
44
58
  },
45
- "/assets/index-BhQGSdhG.js": {
59
+ "/assets/CompareDrawer-tIUf2EJm.js": {
46
60
  "type": "text/javascript; charset=utf-8",
47
- "etag": '"74-1e7gU3IOVaEjblxPQfgH61GRjlw"',
48
- "mtime": "2026-06-30T09:01:48.556Z",
49
- "size": 116,
50
- "path": "../public/assets/index-BhQGSdhG.js"
61
+ "etag": '"49fe-O2b82jiqVijsJaEWXyXHfD26ujs"',
62
+ "mtime": "2026-07-01T02:23:48.450Z",
63
+ "size": 18942,
64
+ "path": "../public/assets/CompareDrawer-tIUf2EJm.js"
51
65
  },
52
- "/assets/CompareDrawer-DcqxlgSQ.js": {
66
+ "/assets/ReplayDialog-D6v1xcuC.js": {
53
67
  "type": "text/javascript; charset=utf-8",
54
- "etag": '"49fe-+D2I+/9sd7EYksKARn3HVY2eJf0"',
55
- "mtime": "2026-06-30T09:01:48.556Z",
56
- "size": 18942,
57
- "path": "../public/assets/CompareDrawer-DcqxlgSQ.js"
68
+ "etag": '"318c-clYQ+hDlXIV8AGEUD0khiYhAzmM"',
69
+ "mtime": "2026-07-01T02:23:48.450Z",
70
+ "size": 12684,
71
+ "path": "../public/assets/ReplayDialog-D6v1xcuC.js"
72
+ },
73
+ "/assets/main-B1kdhY98.js": {
74
+ "type": "text/javascript; charset=utf-8",
75
+ "etag": '"51726-il8QGn3n9HZk3cnlzLAvqWtvO8Y"',
76
+ "mtime": "2026-07-01T02:23:48.450Z",
77
+ "size": 333606,
78
+ "path": "../public/assets/main-B1kdhY98.js"
58
79
  },
59
80
  "/assets/minimax-BPMzvuL-.jpeg": {
60
81
  "type": "image/jpeg",
61
82
  "etag": '"1b06-IwivU89ko5UTMUM1/t7hn4sQK9A"',
62
- "mtime": "2026-06-30T09:01:48.556Z",
83
+ "mtime": "2026-07-01T02:23:48.448Z",
63
84
  "size": 6918,
64
85
  "path": "../public/assets/minimax-BPMzvuL-.jpeg"
65
86
  },
66
- "/assets/index-CwlHPmgL.css": {
67
- "type": "text/css; charset=utf-8",
68
- "etag": '"1a3f0-E2f0kOdSBi1RhjoK38+CSij/apg"',
69
- "mtime": "2026-06-30T09:01:48.556Z",
70
- "size": 107504,
71
- "path": "../public/assets/index-CwlHPmgL.css"
72
- },
73
- "/assets/ReplayDialog-CBcnPgx1.js": {
87
+ "/assets/RequestAnatomy-D6PniTlx.js": {
74
88
  "type": "text/javascript; charset=utf-8",
75
- "etag": '"318c-Wq35vSCO67O3pnw6riReoXT9gOg"',
76
- "mtime": "2026-06-30T09:01:48.557Z",
77
- "size": 12684,
78
- "path": "../public/assets/ReplayDialog-CBcnPgx1.js"
79
- },
80
- "/assets/RequestAnatomy-DSgSqCYt.js": {
81
- "type": "text/javascript; charset=utf-8",
82
- "etag": '"4485-rBai6wnmYHf662t3omQFALcwHSw"',
83
- "mtime": "2026-06-30T09:01:48.557Z",
89
+ "etag": '"4485-cUU3kN9eHR4o5pbZQbcY4OqCB50"',
90
+ "mtime": "2026-07-01T02:23:48.450Z",
84
91
  "size": 17541,
85
- "path": "../public/assets/RequestAnatomy-DSgSqCYt.js"
92
+ "path": "../public/assets/RequestAnatomy-D6PniTlx.js"
86
93
  },
87
- "/assets/ResponseView-CjqzBSoF.js": {
94
+ "/assets/StreamingChunkSequence-D-Rbfnxh.js": {
88
95
  "type": "text/javascript; charset=utf-8",
89
- "etag": '"30d0-13nPwe9jIZSSl43vTEhXlswXwn8"',
90
- "mtime": "2026-06-30T09:01:48.557Z",
91
- "size": 12496,
92
- "path": "../public/assets/ResponseView-CjqzBSoF.js"
93
- },
94
- "/assets/StreamingChunkSequence-DdBBKolI.js": {
95
- "type": "text/javascript; charset=utf-8",
96
- "etag": '"d57-9H1QMwesXGWHkYNTPJ/9zDoslX0"',
97
- "mtime": "2026-06-30T09:01:48.557Z",
96
+ "etag": '"d57-a29gzePmbYwiutnSghD7IFULcvE"',
97
+ "mtime": "2026-07-01T02:23:48.450Z",
98
98
  "size": 3415,
99
- "path": "../public/assets/StreamingChunkSequence-DdBBKolI.js"
100
- },
101
- "/assets/_sessionId-wctOoGh_.js": {
102
- "type": "text/javascript; charset=utf-8",
103
- "etag": '"d2-fiIvvYyX9jF4fd1W7HpowwQ2Zj4"',
104
- "mtime": "2026-06-30T09:01:48.556Z",
105
- "size": 210,
106
- "path": "../public/assets/_sessionId-wctOoGh_.js"
99
+ "path": "../public/assets/StreamingChunkSequence-D-Rbfnxh.js"
107
100
  },
108
- "/assets/main-B6OLZCp9.js": {
101
+ "/assets/ResponseView-Sx8PjuvU.js": {
109
102
  "type": "text/javascript; charset=utf-8",
110
- "etag": '"51726-MaBaigWv6OLiiYg6fusFyN758Hw"',
111
- "mtime": "2026-06-30T09:01:48.557Z",
112
- "size": 333606,
113
- "path": "../public/assets/main-B6OLZCp9.js"
103
+ "etag": '"30d0-eVm2iIA3EKpWcIYtelIeobfqtiY"',
104
+ "mtime": "2026-07-01T02:23:48.450Z",
105
+ "size": 12496,
106
+ "path": "../public/assets/ResponseView-Sx8PjuvU.js"
114
107
  },
115
108
  "/assets/zhipuai-BPNAnxo-.svg": {
116
109
  "type": "image/svg+xml",
117
110
  "etag": '"2bf8-hNaLCTi89nOFCsIIfWpP/jrfo0s"',
118
- "mtime": "2026-06-30T09:01:48.556Z",
111
+ "mtime": "2026-07-01T02:23:48.448Z",
119
112
  "size": 11256,
120
113
  "path": "../public/assets/zhipuai-BPNAnxo-.svg"
121
114
  },
115
+ "/assets/_sessionId-BhNTuZ31.js": {
116
+ "type": "text/javascript; charset=utf-8",
117
+ "etag": '"d2-N3jVPi19Muv+Rgqnids/dlwNuhs"',
118
+ "mtime": "2026-07-01T02:23:48.450Z",
119
+ "size": 210,
120
+ "path": "../public/assets/_sessionId-BhNTuZ31.js"
121
+ },
122
122
  "/assets/qwen-CONDcHqt.png": {
123
123
  "type": "image/png",
124
124
  "etag": '"572c3-cdJAPaHdOvFCGzuaQjagdgOu6XE"',
125
- "mtime": "2026-06-30T09:01:48.556Z",
125
+ "mtime": "2026-07-01T02:23:48.448Z",
126
126
  "size": 357059,
127
127
  "path": "../public/assets/qwen-CONDcHqt.png"
128
128
  },
129
- "/assets/ProxyViewerContainer-D650kQlv.js": {
129
+ "/assets/ProxyViewerContainer-BxRaXhKR.js": {
130
130
  "type": "text/javascript; charset=utf-8",
131
- "etag": '"af8bd-kLHfI4KjZ80Xpnq5/VoFdzyBH10"',
132
- "mtime": "2026-06-30T09:01:48.557Z",
133
- "size": 719037,
134
- "path": "../public/assets/ProxyViewerContainer-D650kQlv.js"
131
+ "etag": '"b489b-R0CduB+BYfBdDePPpvc2Nkavq3A"',
132
+ "mtime": "2026-07-01T02:23:48.450Z",
133
+ "size": 739483,
134
+ "path": "../public/assets/ProxyViewerContainer-BxRaXhKR.js"
135
135
  }
136
136
  };
137
137
  function readAsset(id) {
package/README.md CHANGED
@@ -154,7 +154,7 @@ http://localhost:25947/api/mcp
154
154
  Coding agents can use the MCP surface in three ways:
155
155
 
156
156
  - Tools: perform actions such as listing logs, reading bounded log details, testing providers,
157
- creating evaluation runs, and exporting evidence packs.
157
+ creating evaluation runs/groups, attaching sessions, and exporting evidence packs.
158
158
  - Resources: read stable evidence URIs without invoking a tool call.
159
159
  - Prompts: start common analysis/reporting tasks from reusable templates.
160
160
 
@@ -176,6 +176,24 @@ The evaluation-oriented run flow is:
176
176
  <dataDir>/evidence/<runId>/evidence.html
177
177
  ```
178
178
 
179
+ For benchmark or CI systems that spawn multiple coding-agent processes, use a group as the
180
+ outer evaluation artifact:
181
+
182
+ 1. Call `inspector_create_group` once for the evaluation batch.
183
+ 2. Start each OpenCode/Codex process through the proxy with its own model/provider.
184
+ 3. As each process discovers or reports its session id, call `inspector_add_group_session` with
185
+ `groupId`, `sessionId`, and optional `runId`, `provider`, `model`, `agent`, `label`, and
186
+ metadata.
187
+ 4. Call `inspector_update_group` to mark the whole batch `running`, `failed`, `completed`, or
188
+ `cancelled`.
189
+ 5. Call `inspector_export_group_evidence` to write an aggregate provider/model matrix under:
190
+
191
+ ```text
192
+ <dataDir>/evidence/groups/<groupId>/evidence.json
193
+ <dataDir>/evidence/groups/<groupId>/evidence.md
194
+ <dataDir>/evidence/groups/<groupId>/evidence.html
195
+ ```
196
+
179
197
  Useful MCP resource URIs:
180
198
 
181
199
  | Resource | Purpose |
@@ -187,12 +205,17 @@ Useful MCP resource URIs:
187
205
  | `inspector://failures/recent` | Read recent failed/cancelled runs and non-success evidence classifications. |
188
206
  | `inspector://runs/{runId}` | Read one declared run and its evidence paths. |
189
207
  | `inspector://evidence/{runId}` | Read the exported Markdown evidence pack for a run. |
208
+ | `inspector://groups` | List declared evaluation groups. |
209
+ | `inspector://groups/{groupId}` | Read one group, including attached session/run members and evidence paths. |
210
+ | `inspector://groups/{groupId}/sessions` | Read only the attached group member list. |
211
+ | `inspector://groups/{groupId}/evidence` | Read the exported Markdown evidence pack for a group. |
190
212
 
191
213
  Built-in prompt templates help turn captured evidence into user-facing output:
192
214
 
193
215
  - `inspector_analyze_session_failure`: explain why a session failed and cite log evidence.
194
216
  - `inspector_triage_recent_failures`: prioritize recent failed runs and suggest next actions.
195
217
  - `inspector_generate_jenkins_report`: produce a Jenkins-ready Markdown report for a run.
218
+ - `inspector_generate_group_report`: produce a provider/model evaluation report for a group.
196
219
  - `inspector_extract_repro_steps`: extract concise reproduction steps from a session.
197
220
 
198
221
  ## Jenkins And GitCode
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tonyclaw/agent-inspector",
3
- "version": "2.0.29",
3
+ "version": "2.0.31",
4
4
  "type": "module",
5
5
  "description": "Agent observability and knowledge capture layer for AI coding tools.",
6
6
  "license": "MIT",
@@ -15,6 +15,7 @@ import { crabVariants } from "./ui/crab-variants";
15
15
  import { McpLogo } from "./ui/mcp-logo";
16
16
  import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "./ui/select";
17
17
  import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "./ui/tooltip";
18
+ import { GroupsDialog } from "./groups/GroupsDialog";
18
19
  import { SettingsDialog } from "./providers/SettingsDialog";
19
20
  import { computeCacheTrends } from "./proxy-viewer/cacheTrend";
20
21
  import { LazyCompareDrawer } from "./proxy-viewer/lazy";
@@ -38,6 +39,10 @@ function truncateSessionId(id: string): string {
38
39
  return `${id.slice(0, 12)}...${id.slice(-12)}`;
39
40
  }
40
41
 
42
+ export function shouldShowRawExport(captureMode: CaptureMode): boolean {
43
+ return captureMode === "full";
44
+ }
45
+
41
46
  function computeTokenSummary(logs: CapturedLog[]): { totalIn: number; totalOut: number } {
42
47
  let totalIn = 0;
43
48
  let totalOut = 0;
@@ -709,6 +714,7 @@ export function ProxyViewer({
709
714
  );
710
715
  const cacheTrends = useMemo(() => computeCacheTrends(groups), [groups]);
711
716
  const comparisonPredecessors = useMemo(() => buildValidPredecessors(groups), [groups]);
717
+ const showRawExport = shouldShowRawExport(captureMode);
712
718
  const handleCompareWithPrevious = useCallback(
713
719
  (log: CapturedLog) => {
714
720
  const predecessor = comparisonPredecessors.get(log.id);
@@ -788,7 +794,8 @@ export function ProxyViewer({
788
794
  </span>
789
795
  <McpReadyBadge />
790
796
  </h1>
791
- <div className="justify-self-end">
797
+ <div className="justify-self-end flex items-center gap-1">
798
+ <GroupsDialog />
792
799
  <SettingsDialog />
793
800
  </div>
794
801
  </div>
@@ -874,7 +881,7 @@ export function ProxyViewer({
874
881
  : ""}
875
882
  </span>
876
883
  )}
877
- {logs.length > 0 && (
884
+ {logs.length > 0 && showRawExport && (
878
885
  <button
879
886
  type="button"
880
887
  onClick={() => {