@tonyclaw/agent-inspector 2.1.21 → 2.1.22
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-Pii_cIqn.js → CompareDrawer-B-I_z_oJ.js} +1 -1
- package/.output/public/assets/ProxyViewerContainer-ygSGJ4EB.js +106 -0
- package/.output/public/assets/{ReplayDialog-BqnYC8ze.js → ReplayDialog-ofqVRdc-.js} +1 -1
- package/.output/public/assets/{RequestAnatomy-I8iBshz1.js → RequestAnatomy-lyPjHWzS.js} +1 -1
- package/.output/public/assets/{ResponseView-wZzskUas.js → ResponseView-BL263es5.js} +2 -2
- package/.output/public/assets/{StreamingChunkSequence-BrSx21IQ.js → StreamingChunkSequence-CIn2xdVv.js} +1 -1
- package/.output/public/assets/_sessionId-KmeAKZJw.js +1 -0
- package/.output/public/assets/index-DFEiGFKE.js +1 -0
- package/.output/public/assets/{index-Dw-jXKKY.js → index-M6p8Q0LA.js} +1 -1
- package/.output/public/assets/index-bXU6y_wh.css +1 -0
- package/.output/public/assets/{json-viewer-D5mzV0oV.js → json-viewer-VR9OOnl8.js} +1 -1
- package/.output/public/assets/{main-B7OIQMeA.js → main-C9gW57P6.js} +2 -2
- package/.output/server/_libs/lucide-react.mjs +42 -42
- package/.output/server/{_sessionId-DeU_JdSX.mjs → _sessionId-CBwwWBFg.mjs} +18 -3
- package/.output/server/_ssr/{CompareDrawer-DgDbG4oF.mjs → CompareDrawer-Dw6CL_qf.mjs} +3 -3
- package/.output/server/_ssr/{ProxyViewerContainer-BOszhOJD.mjs → ProxyViewerContainer-BX4RgrZU.mjs} +112 -33
- package/.output/server/_ssr/{ReplayDialog-Cj4gWQv5.mjs → ReplayDialog-DS9K_cof.mjs} +4 -4
- package/.output/server/_ssr/{RequestAnatomy-CVzNAA03.mjs → RequestAnatomy-B2JsAL49.mjs} +2 -2
- package/.output/server/_ssr/{ResponseView-DLNpai6P.mjs → ResponseView-C3LQSg2c.mjs} +3 -3
- package/.output/server/_ssr/{StreamingChunkSequence-BiH8EEQB.mjs → StreamingChunkSequence-O1Ti-7Pk.mjs} +2 -2
- package/.output/server/_ssr/{index-DaWXoUgf.mjs → index-BZ2ijzyu.mjs} +2 -2
- package/.output/server/_ssr/index.mjs +2 -2
- package/.output/server/_ssr/{json-viewer-CqqNYbmS.mjs → json-viewer-BRMmlvXb.mjs} +3 -3
- package/.output/server/_ssr/{router-Di7D0Bcm.mjs → router-DlGZ0qLz.mjs} +4 -4
- package/.output/server/{_tanstack-start-manifest_v-BR0YvW29.mjs → _tanstack-start-manifest_v-CYvWDgeN.mjs} +1 -1
- package/.output/server/index.mjs +71 -71
- package/package.json +1 -1
- package/src/components/ProxyViewer.tsx +71 -15
- package/src/components/ProxyViewerContainer.tsx +1 -1
- package/src/components/proxy-viewer/ConversationGroupList.tsx +23 -7
- package/src/components/proxy-viewer/ConversationHeader.tsx +14 -7
- package/src/routes/session/$sessionId.tsx +27 -1
- package/.output/public/assets/ProxyViewerContainer-BxselkhN.js +0 -106
- package/.output/public/assets/_sessionId-ByxbBMbE.js +0 -1
- package/.output/public/assets/index-BjzVMXJq.css +0 -1
- package/.output/public/assets/index-DRCRDo_E.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-C9gW57P6.js"], "assets": [] }, "/": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/index.tsx", "assets": [], "preloads": ["/assets/index-DFEiGFKE.js", "/assets/ProxyViewerContainer-ygSGJ4EB.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-KmeAKZJw.js", "/assets/ProxyViewerContainer-ygSGJ4EB.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-C9gW57P6.js" });
|
|
2
2
|
export {
|
|
3
3
|
tsrStartManifest
|
|
4
4
|
};
|
package/.output/server/index.mjs
CHANGED
|
@@ -38,114 +38,114 @@ const assets = {
|
|
|
38
38
|
"/assets/alibaba-TTwafVwX.svg": {
|
|
39
39
|
"type": "image/svg+xml",
|
|
40
40
|
"etag": '"171b-6dyV5K8QjiaY35sN9qNprh9zDIs"',
|
|
41
|
-
"mtime": "2026-07-06T08:
|
|
41
|
+
"mtime": "2026-07-06T08:42:14.499Z",
|
|
42
42
|
"size": 5915,
|
|
43
43
|
"path": "../public/assets/alibaba-TTwafVwX.svg"
|
|
44
44
|
},
|
|
45
|
-
"/assets/
|
|
45
|
+
"/assets/CompareDrawer-B-I_z_oJ.js": {
|
|
46
46
|
"type": "text/javascript; charset=utf-8",
|
|
47
|
-
"etag": '"
|
|
48
|
-
"mtime": "2026-07-06T08:
|
|
49
|
-
"size":
|
|
50
|
-
"path": "../public/assets/
|
|
51
|
-
},
|
|
52
|
-
"/assets/index-Dw-jXKKY.js": {
|
|
53
|
-
"type": "text/javascript; charset=utf-8",
|
|
54
|
-
"etag": '"1cd2c-qf0ccCcShwlpGimq6sOIhXqC/KY"',
|
|
55
|
-
"mtime": "2026-07-06T08:04:09.445Z",
|
|
56
|
-
"size": 118060,
|
|
57
|
-
"path": "../public/assets/index-Dw-jXKKY.js"
|
|
47
|
+
"etag": '"4bbf-boMYNxH3OYElTxrB6f+S8JpJhEU"',
|
|
48
|
+
"mtime": "2026-07-06T08:42:14.500Z",
|
|
49
|
+
"size": 19391,
|
|
50
|
+
"path": "../public/assets/CompareDrawer-B-I_z_oJ.js"
|
|
58
51
|
},
|
|
59
|
-
"/assets/
|
|
52
|
+
"/assets/json-viewer-VR9OOnl8.js": {
|
|
60
53
|
"type": "text/javascript; charset=utf-8",
|
|
61
|
-
"etag": '"
|
|
62
|
-
"mtime": "2026-07-06T08:
|
|
63
|
-
"size":
|
|
64
|
-
"path": "../public/assets/
|
|
54
|
+
"etag": '"1ae6-q2HRnhbr4RmbtnJRlXqA3AA5pn0"',
|
|
55
|
+
"mtime": "2026-07-06T08:42:14.500Z",
|
|
56
|
+
"size": 6886,
|
|
57
|
+
"path": "../public/assets/json-viewer-VR9OOnl8.js"
|
|
65
58
|
},
|
|
66
|
-
"/assets/index-
|
|
59
|
+
"/assets/index-DFEiGFKE.js": {
|
|
67
60
|
"type": "text/javascript; charset=utf-8",
|
|
68
|
-
"etag": '"74-
|
|
69
|
-
"mtime": "2026-07-06T08:
|
|
61
|
+
"etag": '"74-qVbgeAxjdS6pAIAlbzvrFevVSso"',
|
|
62
|
+
"mtime": "2026-07-06T08:42:14.500Z",
|
|
70
63
|
"size": 116,
|
|
71
|
-
"path": "../public/assets/index-
|
|
64
|
+
"path": "../public/assets/index-DFEiGFKE.js"
|
|
72
65
|
},
|
|
73
|
-
"/assets/index-
|
|
74
|
-
"type": "text/
|
|
75
|
-
"etag": '"
|
|
76
|
-
"mtime": "2026-07-06T08:
|
|
77
|
-
"size":
|
|
78
|
-
"path": "../public/assets/index-
|
|
66
|
+
"/assets/index-M6p8Q0LA.js": {
|
|
67
|
+
"type": "text/javascript; charset=utf-8",
|
|
68
|
+
"etag": '"1cd2c-dKmvWl4iX4kQEQiFVvEkD2o9yeo"',
|
|
69
|
+
"mtime": "2026-07-06T08:42:14.500Z",
|
|
70
|
+
"size": 118060,
|
|
71
|
+
"path": "../public/assets/index-M6p8Q0LA.js"
|
|
79
72
|
},
|
|
80
73
|
"/assets/minimax-BPMzvuL-.jpeg": {
|
|
81
74
|
"type": "image/jpeg",
|
|
82
75
|
"etag": '"1b06-IwivU89ko5UTMUM1/t7hn4sQK9A"',
|
|
83
|
-
"mtime": "2026-07-06T08:
|
|
76
|
+
"mtime": "2026-07-06T08:42:14.499Z",
|
|
84
77
|
"size": 6918,
|
|
85
78
|
"path": "../public/assets/minimax-BPMzvuL-.jpeg"
|
|
86
79
|
},
|
|
87
|
-
"/assets/
|
|
88
|
-
"type": "text/javascript; charset=utf-8",
|
|
89
|
-
"etag": '"dd6-IWeACKaGgb4U4nokqp1reXLkggk"',
|
|
90
|
-
"mtime": "2026-07-06T08:04:09.445Z",
|
|
91
|
-
"size": 3542,
|
|
92
|
-
"path": "../public/assets/StreamingChunkSequence-BrSx21IQ.js"
|
|
93
|
-
},
|
|
94
|
-
"/assets/main-B7OIQMeA.js": {
|
|
80
|
+
"/assets/main-C9gW57P6.js": {
|
|
95
81
|
"type": "text/javascript; charset=utf-8",
|
|
96
|
-
"etag": '"512fd-
|
|
97
|
-
"mtime": "2026-07-06T08:
|
|
82
|
+
"etag": '"512fd-Qkx6OXZVaW68qCJzUwcgoV0n85s"',
|
|
83
|
+
"mtime": "2026-07-06T08:42:14.499Z",
|
|
98
84
|
"size": 332541,
|
|
99
|
-
"path": "../public/assets/main-
|
|
85
|
+
"path": "../public/assets/main-C9gW57P6.js"
|
|
100
86
|
},
|
|
101
|
-
"/assets/ReplayDialog-
|
|
87
|
+
"/assets/ReplayDialog-ofqVRdc-.js": {
|
|
102
88
|
"type": "text/javascript; charset=utf-8",
|
|
103
|
-
"etag": '"31d6-
|
|
104
|
-
"mtime": "2026-07-06T08:
|
|
89
|
+
"etag": '"31d6-1x+H2vdKEwKrpalZioFQypNeHQk"',
|
|
90
|
+
"mtime": "2026-07-06T08:42:14.500Z",
|
|
105
91
|
"size": 12758,
|
|
106
|
-
"path": "../public/assets/ReplayDialog-
|
|
92
|
+
"path": "../public/assets/ReplayDialog-ofqVRdc-.js"
|
|
93
|
+
},
|
|
94
|
+
"/assets/index-bXU6y_wh.css": {
|
|
95
|
+
"type": "text/css; charset=utf-8",
|
|
96
|
+
"etag": '"21894-+/BIDNcJdO1E5wKWMCSoJKkp5xY"',
|
|
97
|
+
"mtime": "2026-07-06T08:42:14.499Z",
|
|
98
|
+
"size": 137364,
|
|
99
|
+
"path": "../public/assets/index-bXU6y_wh.css"
|
|
107
100
|
},
|
|
108
|
-
"/assets/RequestAnatomy-
|
|
101
|
+
"/assets/RequestAnatomy-lyPjHWzS.js": {
|
|
109
102
|
"type": "text/javascript; charset=utf-8",
|
|
110
|
-
"etag": '"43f2-
|
|
111
|
-
"mtime": "2026-07-06T08:
|
|
103
|
+
"etag": '"43f2-dm2JSsxHwTjClZaY75s6pB3OCRE"',
|
|
104
|
+
"mtime": "2026-07-06T08:42:14.500Z",
|
|
112
105
|
"size": 17394,
|
|
113
|
-
"path": "../public/assets/RequestAnatomy-
|
|
106
|
+
"path": "../public/assets/RequestAnatomy-lyPjHWzS.js"
|
|
114
107
|
},
|
|
115
|
-
"/assets/
|
|
116
|
-
"type": "
|
|
117
|
-
"etag": '"
|
|
118
|
-
"mtime": "2026-07-06T08:
|
|
119
|
-
"size":
|
|
120
|
-
"path": "../public/assets/
|
|
108
|
+
"/assets/StreamingChunkSequence-CIn2xdVv.js": {
|
|
109
|
+
"type": "text/javascript; charset=utf-8",
|
|
110
|
+
"etag": '"dd6-1z9xyDwQxM73GFtieH0lBUQMPeo"',
|
|
111
|
+
"mtime": "2026-07-06T08:42:14.500Z",
|
|
112
|
+
"size": 3542,
|
|
113
|
+
"path": "../public/assets/StreamingChunkSequence-CIn2xdVv.js"
|
|
114
|
+
},
|
|
115
|
+
"/assets/ResponseView-BL263es5.js": {
|
|
116
|
+
"type": "text/javascript; charset=utf-8",
|
|
117
|
+
"etag": '"3fbb-YhzY74QAmiktBkyeD8ZWACFw+Rc"',
|
|
118
|
+
"mtime": "2026-07-06T08:42:14.500Z",
|
|
119
|
+
"size": 16315,
|
|
120
|
+
"path": "../public/assets/ResponseView-BL263es5.js"
|
|
121
121
|
},
|
|
122
|
-
"/assets/_sessionId-
|
|
122
|
+
"/assets/_sessionId-KmeAKZJw.js": {
|
|
123
123
|
"type": "text/javascript; charset=utf-8",
|
|
124
|
-
"etag": '"
|
|
125
|
-
"mtime": "2026-07-06T08:
|
|
126
|
-
"size":
|
|
127
|
-
"path": "../public/assets/_sessionId-
|
|
124
|
+
"etag": '"36c-l3ljkLbVkD0313o3NVfJSSh4zLI"',
|
|
125
|
+
"mtime": "2026-07-06T08:42:14.499Z",
|
|
126
|
+
"size": 876,
|
|
127
|
+
"path": "../public/assets/_sessionId-KmeAKZJw.js"
|
|
128
128
|
},
|
|
129
129
|
"/assets/zhipuai-BPNAnxo-.svg": {
|
|
130
130
|
"type": "image/svg+xml",
|
|
131
131
|
"etag": '"2bf8-hNaLCTi89nOFCsIIfWpP/jrfo0s"',
|
|
132
|
-
"mtime": "2026-07-06T08:
|
|
132
|
+
"mtime": "2026-07-06T08:42:14.499Z",
|
|
133
133
|
"size": 11256,
|
|
134
134
|
"path": "../public/assets/zhipuai-BPNAnxo-.svg"
|
|
135
135
|
},
|
|
136
|
-
"/assets/
|
|
137
|
-
"type": "
|
|
138
|
-
"etag": '"
|
|
139
|
-
"mtime": "2026-07-06T08:
|
|
140
|
-
"size":
|
|
141
|
-
"path": "../public/assets/
|
|
136
|
+
"/assets/qwen-CONDcHqt.png": {
|
|
137
|
+
"type": "image/png",
|
|
138
|
+
"etag": '"572c3-cdJAPaHdOvFCGzuaQjagdgOu6XE"',
|
|
139
|
+
"mtime": "2026-07-06T08:42:14.500Z",
|
|
140
|
+
"size": 357059,
|
|
141
|
+
"path": "../public/assets/qwen-CONDcHqt.png"
|
|
142
142
|
},
|
|
143
|
-
"/assets/ProxyViewerContainer-
|
|
143
|
+
"/assets/ProxyViewerContainer-ygSGJ4EB.js": {
|
|
144
144
|
"type": "text/javascript; charset=utf-8",
|
|
145
|
-
"etag": '"
|
|
146
|
-
"mtime": "2026-07-06T08:
|
|
147
|
-
"size":
|
|
148
|
-
"path": "../public/assets/ProxyViewerContainer-
|
|
145
|
+
"etag": '"aec2b-qUHkR4rnnxAag/CXPZQmFBfa3hA"',
|
|
146
|
+
"mtime": "2026-07-06T08:42:14.500Z",
|
|
147
|
+
"size": 715819,
|
|
148
|
+
"path": "../public/assets/ProxyViewerContainer-ygSGJ4EB.js"
|
|
149
149
|
}
|
|
150
150
|
};
|
|
151
151
|
function readAsset(id) {
|
package/package.json
CHANGED
|
@@ -27,10 +27,12 @@ import {
|
|
|
27
27
|
Gauge,
|
|
28
28
|
Flag,
|
|
29
29
|
Plus,
|
|
30
|
+
Search,
|
|
30
31
|
Siren,
|
|
31
32
|
Timer,
|
|
32
33
|
Trash2,
|
|
33
34
|
Upload,
|
|
35
|
+
X,
|
|
34
36
|
} from "lucide-react";
|
|
35
37
|
|
|
36
38
|
import type { CapturedLog } from "../contracts";
|
|
@@ -963,8 +965,13 @@ export function formatPaginationStatus({
|
|
|
963
965
|
const last = logs[logs.length - 1];
|
|
964
966
|
const range =
|
|
965
967
|
first === undefined || last === undefined ? "Current page" : `#${first.id}-#${last.id}`;
|
|
966
|
-
|
|
967
|
-
|
|
968
|
+
if (pagination.total === null) {
|
|
969
|
+
return `Showing ${logs.length} logs (${range})`;
|
|
970
|
+
}
|
|
971
|
+
if (pagination.total <= logs.length) {
|
|
972
|
+
return `Showing all ${pagination.total} logs`;
|
|
973
|
+
}
|
|
974
|
+
return `Showing ${logs.length} of ${pagination.total} logs (${range})`;
|
|
968
975
|
}
|
|
969
976
|
|
|
970
977
|
function LogPaginationButton({
|
|
@@ -1823,6 +1830,11 @@ export function ProxyViewer({
|
|
|
1823
1830
|
const comparisonPredecessors = useMemo(() => buildValidPredecessors(groups), [groups]);
|
|
1824
1831
|
const exportActionVisibility = getExportActionVisibility(captureMode, logs.length);
|
|
1825
1832
|
const isPinnedSessionPage = pinnedSessionId !== undefined;
|
|
1833
|
+
const sessionInputValue = selectedSession === "__all__" ? "" : selectedSession;
|
|
1834
|
+
const sessionSelectValue =
|
|
1835
|
+
selectedSession === "__all__" || sessions.includes(selectedSession)
|
|
1836
|
+
? selectedSession
|
|
1837
|
+
: "__typed__";
|
|
1826
1838
|
const activeScopeLabel =
|
|
1827
1839
|
hasSessionContext && sessionContextScope !== null
|
|
1828
1840
|
? truncateSessionId(sessionContextScope.label)
|
|
@@ -1847,6 +1859,20 @@ export function ProxyViewer({
|
|
|
1847
1859
|
},
|
|
1848
1860
|
[comparisonPredecessors],
|
|
1849
1861
|
);
|
|
1862
|
+
const handleSessionInputChange = useCallback(
|
|
1863
|
+
(event: ChangeEvent<HTMLInputElement>) => {
|
|
1864
|
+
const value = event.currentTarget.value.trim();
|
|
1865
|
+
onSessionChange(value === "" ? "__all__" : value);
|
|
1866
|
+
},
|
|
1867
|
+
[onSessionChange],
|
|
1868
|
+
);
|
|
1869
|
+
const handleSessionSelectChange = useCallback(
|
|
1870
|
+
(value: string) => {
|
|
1871
|
+
if (value === "__typed__") return;
|
|
1872
|
+
onSessionChange(value);
|
|
1873
|
+
},
|
|
1874
|
+
[onSessionChange],
|
|
1875
|
+
);
|
|
1850
1876
|
|
|
1851
1877
|
return (
|
|
1852
1878
|
<div className="bg-background min-h-screen w-full text-foreground">
|
|
@@ -1904,19 +1930,49 @@ export function ProxyViewer({
|
|
|
1904
1930
|
<SidebarPanel label="Filters">
|
|
1905
1931
|
<div className="space-y-2">
|
|
1906
1932
|
{!hideSessionFilter && (
|
|
1907
|
-
|
|
1908
|
-
<
|
|
1909
|
-
<
|
|
1910
|
-
|
|
1911
|
-
|
|
1912
|
-
|
|
1913
|
-
|
|
1914
|
-
|
|
1915
|
-
|
|
1916
|
-
|
|
1917
|
-
|
|
1918
|
-
|
|
1919
|
-
|
|
1933
|
+
<>
|
|
1934
|
+
<div className="relative">
|
|
1935
|
+
<Search className="pointer-events-none absolute left-2.5 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground" />
|
|
1936
|
+
<input
|
|
1937
|
+
type="search"
|
|
1938
|
+
value={sessionInputValue}
|
|
1939
|
+
onChange={handleSessionInputChange}
|
|
1940
|
+
placeholder="Paste session ID"
|
|
1941
|
+
className="border border-input bg-background hover:bg-accent focus-visible:ring-ring h-9 w-full rounded-md px-8 font-mono text-xs text-foreground outline-none transition-colors placeholder:font-sans placeholder:text-muted-foreground focus-visible:ring-1"
|
|
1942
|
+
aria-label="Filter by session ID"
|
|
1943
|
+
title="Filter by exact session ID"
|
|
1944
|
+
/>
|
|
1945
|
+
{sessionInputValue !== "" && (
|
|
1946
|
+
<button
|
|
1947
|
+
type="button"
|
|
1948
|
+
onClick={() => onSessionChange("__all__")}
|
|
1949
|
+
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"
|
|
1950
|
+
aria-label="Clear session filter"
|
|
1951
|
+
title="Clear session filter"
|
|
1952
|
+
>
|
|
1953
|
+
<X className="size-3.5" />
|
|
1954
|
+
</button>
|
|
1955
|
+
)}
|
|
1956
|
+
</div>
|
|
1957
|
+
<Select value={sessionSelectValue} onValueChange={handleSessionSelectChange}>
|
|
1958
|
+
<SelectTrigger className="border border-input bg-background hover:bg-accent hover:text-accent-foreground h-9 w-full text-xs">
|
|
1959
|
+
<SelectValue placeholder="All sessions" />
|
|
1960
|
+
</SelectTrigger>
|
|
1961
|
+
<SelectContent>
|
|
1962
|
+
<SelectItem value="__all__">All sessions</SelectItem>
|
|
1963
|
+
{sessionSelectValue === "__typed__" && (
|
|
1964
|
+
<SelectItem value="__typed__">
|
|
1965
|
+
Typed: {truncateSessionId(selectedSession)}
|
|
1966
|
+
</SelectItem>
|
|
1967
|
+
)}
|
|
1968
|
+
{sessions.map((s) => (
|
|
1969
|
+
<SelectItem key={s} value={s}>
|
|
1970
|
+
{truncateSessionId(s)}
|
|
1971
|
+
</SelectItem>
|
|
1972
|
+
))}
|
|
1973
|
+
</SelectContent>
|
|
1974
|
+
</Select>
|
|
1975
|
+
</>
|
|
1920
1976
|
)}
|
|
1921
1977
|
<Select value={selectedModel} onValueChange={onModelChange}>
|
|
1922
1978
|
<SelectTrigger className="border border-input bg-background hover:bg-accent hover:text-accent-foreground h-9 w-full text-xs">
|
|
@@ -97,7 +97,7 @@ function extractModels(logs: CapturedLog[]): string[] {
|
|
|
97
97
|
* pass through. Returns the input array reference when no log matches the
|
|
98
98
|
* filter, so referential equality is preserved for empty results.
|
|
99
99
|
*/
|
|
100
|
-
function filterLogs(
|
|
100
|
+
export function filterLogs(
|
|
101
101
|
logs: CapturedLog[],
|
|
102
102
|
selectedSession: string,
|
|
103
103
|
selectedModel: string,
|
|
@@ -57,6 +57,10 @@ export function hasPendingLogs(logs: readonly CapturedLog[]): boolean {
|
|
|
57
57
|
return logs.some((log) => log.responseStatus === null);
|
|
58
58
|
}
|
|
59
59
|
|
|
60
|
+
export function countPendingTurns(logs: readonly CapturedLog[]): number {
|
|
61
|
+
return logs.filter((log) => log.responseStatus === null).length;
|
|
62
|
+
}
|
|
63
|
+
|
|
60
64
|
export function findConversationGroupIndexForLog(
|
|
61
65
|
groups: readonly ConversationGroupData[],
|
|
62
66
|
logId: number,
|
|
@@ -281,11 +285,21 @@ function SummaryChip({
|
|
|
281
285
|
);
|
|
282
286
|
}
|
|
283
287
|
|
|
284
|
-
function
|
|
288
|
+
function PendingTurnBadge({
|
|
289
|
+
count,
|
|
290
|
+
label = "Turn open",
|
|
291
|
+
}: {
|
|
292
|
+
count: number;
|
|
293
|
+
label?: string;
|
|
294
|
+
}): JSX.Element {
|
|
285
295
|
return (
|
|
286
|
-
<span
|
|
296
|
+
<span
|
|
297
|
+
className="inline-flex h-6 shrink-0 items-center gap-1.5 rounded-md bg-amber-300/[0.10] px-1.5 font-mono text-[10px] uppercase tracking-[0.14em] text-amber-100/90 ring-1 ring-amber-200/10"
|
|
298
|
+
title={`${count} turn${count !== 1 ? "s" : ""} not finished yet`}
|
|
299
|
+
>
|
|
287
300
|
<Loader2 className="size-3 animate-spin" />
|
|
288
301
|
{label}
|
|
302
|
+
{count > 1 && <span className="tabular-nums">x{count}</span>}
|
|
289
303
|
</span>
|
|
290
304
|
);
|
|
291
305
|
}
|
|
@@ -296,7 +310,7 @@ function LoadingSweep(): JSX.Element {
|
|
|
296
310
|
className="pointer-events-none absolute inset-x-3 bottom-0 h-px overflow-hidden rounded-full bg-white/[0.06]"
|
|
297
311
|
aria-hidden="true"
|
|
298
312
|
>
|
|
299
|
-
<span className="absolute inset-y-0 left-0 w-1/3 animate-pulse rounded-full bg-
|
|
313
|
+
<span className="absolute inset-y-0 left-0 w-1/3 animate-pulse rounded-full bg-amber-200/65 shadow-[0_0_14px_rgba(252,211,77,0.32)]" />
|
|
300
314
|
</span>
|
|
301
315
|
);
|
|
302
316
|
}
|
|
@@ -370,7 +384,8 @@ function IdeGroupSection({
|
|
|
370
384
|
const totals = tokenTotals(group.logs);
|
|
371
385
|
const sessionCount = countSessions(group.processes);
|
|
372
386
|
const logCount = group.logs.length;
|
|
373
|
-
const
|
|
387
|
+
const pendingTurnCount = countPendingTurns(group.logs);
|
|
388
|
+
const isWorking = pendingTurnCount > 0;
|
|
374
389
|
|
|
375
390
|
return (
|
|
376
391
|
<section
|
|
@@ -405,7 +420,7 @@ function IdeGroupSection({
|
|
|
405
420
|
<span className="rounded bg-cyan-300/[0.06] px-1.5 py-0.5 font-mono text-[10px] uppercase tracking-[0.16em] text-cyan-100/75">
|
|
406
421
|
IDE
|
|
407
422
|
</span>
|
|
408
|
-
{isWorking && <
|
|
423
|
+
{isWorking && <PendingTurnBadge count={pendingTurnCount} label="Turn open" />}
|
|
409
424
|
</span>
|
|
410
425
|
<span className="mt-1 flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-muted-foreground">
|
|
411
426
|
<span>
|
|
@@ -463,7 +478,8 @@ function ProcessGroupSection({
|
|
|
463
478
|
const projectLabel = shortProjectPath(group.clientProjectFolder);
|
|
464
479
|
const sessionCount = group.sessions.length;
|
|
465
480
|
const logCount = group.logs.length;
|
|
466
|
-
const
|
|
481
|
+
const pendingTurnCount = countPendingTurns(group.logs);
|
|
482
|
+
const isWorking = pendingTurnCount > 0;
|
|
467
483
|
const processLabel =
|
|
468
484
|
group.clientPid !== null && group.clientPid !== undefined
|
|
469
485
|
? `PID ${group.clientPid}`
|
|
@@ -488,7 +504,7 @@ function ProcessGroupSection({
|
|
|
488
504
|
<span className="font-mono text-xs font-semibold tabular-nums text-slate-100">
|
|
489
505
|
{processLabel}
|
|
490
506
|
</span>
|
|
491
|
-
{isWorking && <
|
|
507
|
+
{isWorking && <PendingTurnBadge count={pendingTurnCount} label="Turn open" />}
|
|
492
508
|
{projectLabel !== null && (
|
|
493
509
|
<span
|
|
494
510
|
className="inline-flex min-w-0 items-center gap-1 text-xs text-muted-foreground"
|
|
@@ -49,6 +49,18 @@ function HeaderMetric({
|
|
|
49
49
|
);
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
+
function PendingTurnBadge(): JSX.Element {
|
|
53
|
+
return (
|
|
54
|
+
<span
|
|
55
|
+
className="inline-flex h-6 shrink-0 items-center gap-1.5 rounded-md bg-amber-300/[0.10] px-1.5 font-mono text-[10px] uppercase tracking-[0.14em] text-amber-100/90 ring-1 ring-amber-200/10"
|
|
56
|
+
title="This session has a turn that has not finished yet"
|
|
57
|
+
>
|
|
58
|
+
<Loader2 className="size-3 animate-spin" />
|
|
59
|
+
Turn open
|
|
60
|
+
</span>
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
|
|
52
64
|
export type ConversationHeaderProps = {
|
|
53
65
|
conversationId: string;
|
|
54
66
|
startTime: string;
|
|
@@ -234,12 +246,7 @@ export function ConversationHeader({
|
|
|
234
246
|
</span>
|
|
235
247
|
)}
|
|
236
248
|
|
|
237
|
-
{isLoading &&
|
|
238
|
-
<span className="inline-flex h-6 shrink-0 items-center gap-1.5 rounded-md bg-cyan-300/[0.08] px-1.5 font-mono text-[10px] uppercase tracking-[0.14em] text-cyan-100/85">
|
|
239
|
-
<Loader2 className="size-3 animate-spin" />
|
|
240
|
-
Working
|
|
241
|
-
</span>
|
|
242
|
-
)}
|
|
249
|
+
{isLoading && <PendingTurnBadge />}
|
|
243
250
|
</span>
|
|
244
251
|
|
|
245
252
|
<span className="mt-1.5 flex min-w-0 flex-wrap items-center gap-1.5">
|
|
@@ -307,7 +314,7 @@ export function ConversationHeader({
|
|
|
307
314
|
className="pointer-events-none absolute inset-x-3 bottom-0 h-px overflow-hidden rounded-full bg-white/[0.06]"
|
|
308
315
|
aria-hidden="true"
|
|
309
316
|
>
|
|
310
|
-
<span className="absolute inset-y-0 left-0 w-1/3 animate-pulse rounded-full bg-
|
|
317
|
+
<span className="absolute inset-y-0 left-0 w-1/3 animate-pulse rounded-full bg-amber-200/65 shadow-[0_0_14px_rgba(252,211,77,0.32)]" />
|
|
311
318
|
</span>
|
|
312
319
|
)}
|
|
313
320
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { createFileRoute } from "@tanstack/react-router";
|
|
2
|
+
import { useEffect, useState, type JSX } from "react";
|
|
2
3
|
import { ProxyViewerContainer } from "../../components/ProxyViewerContainer";
|
|
3
4
|
import { decodeSessionIdFromPath, encodeSessionIdForPath } from "../../lib/sessionUrl";
|
|
4
5
|
|
|
@@ -17,7 +18,32 @@ export const Route = createFileRoute("/session/$sessionId")({
|
|
|
17
18
|
}),
|
|
18
19
|
});
|
|
19
20
|
|
|
20
|
-
function SessionViewerRoute():
|
|
21
|
+
function SessionViewerRoute(): JSX.Element {
|
|
21
22
|
const { sessionId } = Route.useParams();
|
|
23
|
+
return <ClientOnlySessionViewer sessionId={sessionId} />;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function ClientOnlySessionViewer({ sessionId }: { sessionId: string }): JSX.Element {
|
|
27
|
+
const [mounted, setMounted] = useState(false);
|
|
28
|
+
|
|
29
|
+
useEffect(() => {
|
|
30
|
+
setMounted(true);
|
|
31
|
+
}, []);
|
|
32
|
+
|
|
33
|
+
if (!mounted) {
|
|
34
|
+
return (
|
|
35
|
+
<main className="min-h-screen bg-background text-foreground">
|
|
36
|
+
<div className="mx-auto flex min-h-screen w-full max-w-2xl flex-col justify-center px-6 py-16 text-center">
|
|
37
|
+
<div className="border border-border bg-card shadow-sm rounded-[8px] px-4 py-8">
|
|
38
|
+
<p className="text-sm font-medium text-muted-foreground">Loading session data...</p>
|
|
39
|
+
<p className="mt-3 inline-block max-w-full rounded bg-muted px-3 py-1 font-mono text-xs break-all text-muted-foreground">
|
|
40
|
+
{sessionId}
|
|
41
|
+
</p>
|
|
42
|
+
</div>
|
|
43
|
+
</div>
|
|
44
|
+
</main>
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
|
|
22
48
|
return <ProxyViewerContainer key={sessionId} initialSessionId={sessionId} />;
|
|
23
49
|
}
|