@tonyclaw/agent-inspector 2.1.20 → 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.
Files changed (37) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/assets/{CompareDrawer-BRCSDHn3.js → CompareDrawer-B-I_z_oJ.js} +1 -1
  3. package/.output/public/assets/ProxyViewerContainer-ygSGJ4EB.js +106 -0
  4. package/.output/public/assets/{ReplayDialog-Dkez3vxu.js → ReplayDialog-ofqVRdc-.js} +1 -1
  5. package/.output/public/assets/{RequestAnatomy-CHBODGDF.js → RequestAnatomy-lyPjHWzS.js} +1 -1
  6. package/.output/public/assets/{ResponseView-Dk2dJY-B.js → ResponseView-BL263es5.js} +2 -2
  7. package/.output/public/assets/{StreamingChunkSequence-gZpqWwKK.js → StreamingChunkSequence-CIn2xdVv.js} +1 -1
  8. package/.output/public/assets/_sessionId-KmeAKZJw.js +1 -0
  9. package/.output/public/assets/index-DFEiGFKE.js +1 -0
  10. package/.output/public/assets/{index-B1-V3HCD.js → index-M6p8Q0LA.js} +1 -1
  11. package/.output/public/assets/index-bXU6y_wh.css +1 -0
  12. package/.output/public/assets/{json-viewer-CtvzeDPb.js → json-viewer-VR9OOnl8.js} +1 -1
  13. package/.output/public/assets/{main-CgmDEMGA.js → main-C9gW57P6.js} +2 -2
  14. package/.output/server/_libs/lucide-react.mjs +42 -42
  15. package/.output/server/{_sessionId-CbsSRLSa.mjs → _sessionId-CBwwWBFg.mjs} +18 -3
  16. package/.output/server/_ssr/{CompareDrawer-BiSslksi.mjs → CompareDrawer-Dw6CL_qf.mjs} +3 -3
  17. package/.output/server/_ssr/{ProxyViewerContainer-DIN2AjhM.mjs → ProxyViewerContainer-BX4RgrZU.mjs} +140 -21
  18. package/.output/server/_ssr/{ReplayDialog-DzoWpTis.mjs → ReplayDialog-DS9K_cof.mjs} +4 -4
  19. package/.output/server/_ssr/{RequestAnatomy-D2tbgAPn.mjs → RequestAnatomy-B2JsAL49.mjs} +2 -2
  20. package/.output/server/_ssr/{ResponseView-BFP7zo8Z.mjs → ResponseView-C3LQSg2c.mjs} +3 -3
  21. package/.output/server/_ssr/{StreamingChunkSequence-BfiRZW_k.mjs → StreamingChunkSequence-O1Ti-7Pk.mjs} +2 -2
  22. package/.output/server/_ssr/{index-OlcgE4Tl.mjs → index-BZ2ijzyu.mjs} +2 -2
  23. package/.output/server/_ssr/index.mjs +2 -2
  24. package/.output/server/_ssr/{json-viewer-DmhEr-jg.mjs → json-viewer-BRMmlvXb.mjs} +3 -3
  25. package/.output/server/_ssr/{router-BMdwHLHh.mjs → router-DlGZ0qLz.mjs} +4 -4
  26. package/.output/server/{_tanstack-start-manifest_v-CL4qjwkQ.mjs → _tanstack-start-manifest_v-CYvWDgeN.mjs} +1 -1
  27. package/.output/server/index.mjs +69 -69
  28. package/package.json +1 -1
  29. package/src/components/ProxyViewer.tsx +71 -15
  30. package/src/components/ProxyViewerContainer.tsx +1 -1
  31. package/src/components/proxy-viewer/ConversationGroupList.tsx +52 -3
  32. package/src/components/proxy-viewer/ConversationHeader.tsx +24 -1
  33. package/src/routes/session/$sessionId.tsx +27 -1
  34. package/.output/public/assets/ProxyViewerContainer-v5Lmx35X.js +0 -106
  35. package/.output/public/assets/_sessionId-DziA4ZD4.js +0 -1
  36. package/.output/public/assets/index-ChgjUix0.css +0 -1
  37. package/.output/public/assets/index-DkHcxpXi.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-CgmDEMGA.js"], "assets": [] }, "/": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/index.tsx", "assets": [], "preloads": ["/assets/index-DkHcxpXi.js", "/assets/ProxyViewerContainer-v5Lmx35X.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-DziA4ZD4.js", "/assets/ProxyViewerContainer-v5Lmx35X.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-CgmDEMGA.js" });
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
  };
@@ -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-06T03:43:22.271Z",
41
+ "mtime": "2026-07-06T08:42:14.499Z",
42
42
  "size": 5915,
43
43
  "path": "../public/assets/alibaba-TTwafVwX.svg"
44
44
  },
45
- "/assets/json-viewer-CtvzeDPb.js": {
45
+ "/assets/CompareDrawer-B-I_z_oJ.js": {
46
46
  "type": "text/javascript; charset=utf-8",
47
- "etag": '"1ae6-bbvT41UcoSu8MQ3zSi3/DzMj/Xo"',
48
- "mtime": "2026-07-06T03:43:22.272Z",
49
- "size": 6886,
50
- "path": "../public/assets/json-viewer-CtvzeDPb.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"
51
51
  },
52
- "/assets/index-DkHcxpXi.js": {
52
+ "/assets/json-viewer-VR9OOnl8.js": {
53
53
  "type": "text/javascript; charset=utf-8",
54
- "etag": '"74-X6xp31nh4dZkyQGwRXnHNIYrEqo"',
55
- "mtime": "2026-07-06T03:43:22.271Z",
56
- "size": 116,
57
- "path": "../public/assets/index-DkHcxpXi.js"
54
+ "etag": '"1ae6-q2HRnhbr4RmbtnJRlXqA3AA5pn0"',
55
+ "mtime": "2026-07-06T08:42:14.500Z",
56
+ "size": 6886,
57
+ "path": "../public/assets/json-viewer-VR9OOnl8.js"
58
58
  },
59
- "/assets/CompareDrawer-BRCSDHn3.js": {
59
+ "/assets/index-DFEiGFKE.js": {
60
60
  "type": "text/javascript; charset=utf-8",
61
- "etag": '"4bbf-8c6mdlj2RQ47taoxuucIDo8mFQ8"',
62
- "mtime": "2026-07-06T03:43:22.272Z",
63
- "size": 19391,
64
- "path": "../public/assets/CompareDrawer-BRCSDHn3.js"
61
+ "etag": '"74-qVbgeAxjdS6pAIAlbzvrFevVSso"',
62
+ "mtime": "2026-07-06T08:42:14.500Z",
63
+ "size": 116,
64
+ "path": "../public/assets/index-DFEiGFKE.js"
65
65
  },
66
- "/assets/index-B1-V3HCD.js": {
66
+ "/assets/index-M6p8Q0LA.js": {
67
67
  "type": "text/javascript; charset=utf-8",
68
- "etag": '"1cd2c-htrNk+OJhSya0rbaR5sIwzkp3UM"',
69
- "mtime": "2026-07-06T03:43:22.272Z",
68
+ "etag": '"1cd2c-dKmvWl4iX4kQEQiFVvEkD2o9yeo"',
69
+ "mtime": "2026-07-06T08:42:14.500Z",
70
70
  "size": 118060,
71
- "path": "../public/assets/index-B1-V3HCD.js"
71
+ "path": "../public/assets/index-M6p8Q0LA.js"
72
72
  },
73
73
  "/assets/minimax-BPMzvuL-.jpeg": {
74
74
  "type": "image/jpeg",
75
75
  "etag": '"1b06-IwivU89ko5UTMUM1/t7hn4sQK9A"',
76
- "mtime": "2026-07-06T03:43:22.271Z",
76
+ "mtime": "2026-07-06T08:42:14.499Z",
77
77
  "size": 6918,
78
78
  "path": "../public/assets/minimax-BPMzvuL-.jpeg"
79
79
  },
80
- "/assets/index-ChgjUix0.css": {
81
- "type": "text/css; charset=utf-8",
82
- "etag": '"212a0-Dw5mR7yd82+ILdqMgXoMBMt6hq4"',
83
- "mtime": "2026-07-06T03:43:22.271Z",
84
- "size": 135840,
85
- "path": "../public/assets/index-ChgjUix0.css"
80
+ "/assets/main-C9gW57P6.js": {
81
+ "type": "text/javascript; charset=utf-8",
82
+ "etag": '"512fd-Qkx6OXZVaW68qCJzUwcgoV0n85s"',
83
+ "mtime": "2026-07-06T08:42:14.499Z",
84
+ "size": 332541,
85
+ "path": "../public/assets/main-C9gW57P6.js"
86
86
  },
87
- "/assets/ReplayDialog-Dkez3vxu.js": {
87
+ "/assets/ReplayDialog-ofqVRdc-.js": {
88
88
  "type": "text/javascript; charset=utf-8",
89
- "etag": '"31d6-dVfEJR60cWAXP0HlCExJxLhEzGQ"',
90
- "mtime": "2026-07-06T03:43:22.272Z",
89
+ "etag": '"31d6-1x+H2vdKEwKrpalZioFQypNeHQk"',
90
+ "mtime": "2026-07-06T08:42:14.500Z",
91
91
  "size": 12758,
92
- "path": "../public/assets/ReplayDialog-Dkez3vxu.js"
92
+ "path": "../public/assets/ReplayDialog-ofqVRdc-.js"
93
93
  },
94
- "/assets/ResponseView-Dk2dJY-B.js": {
95
- "type": "text/javascript; charset=utf-8",
96
- "etag": '"3fbb-6UX4A+JtyjnePCf1z1VZuEdQ0C8"',
97
- "mtime": "2026-07-06T03:43:22.272Z",
98
- "size": 16315,
99
- "path": "../public/assets/ResponseView-Dk2dJY-B.js"
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"
100
100
  },
101
- "/assets/RequestAnatomy-CHBODGDF.js": {
101
+ "/assets/RequestAnatomy-lyPjHWzS.js": {
102
102
  "type": "text/javascript; charset=utf-8",
103
- "etag": '"43f2-xKKEN4NCpqOXJI4uXmr59dBkdv4"',
104
- "mtime": "2026-07-06T03:43:22.272Z",
103
+ "etag": '"43f2-dm2JSsxHwTjClZaY75s6pB3OCRE"',
104
+ "mtime": "2026-07-06T08:42:14.500Z",
105
105
  "size": 17394,
106
- "path": "../public/assets/RequestAnatomy-CHBODGDF.js"
106
+ "path": "../public/assets/RequestAnatomy-lyPjHWzS.js"
107
107
  },
108
- "/assets/main-CgmDEMGA.js": {
108
+ "/assets/StreamingChunkSequence-CIn2xdVv.js": {
109
109
  "type": "text/javascript; charset=utf-8",
110
- "etag": '"512fd-MY9A8NqvB/UwL688OrlT4bCrRNg"',
111
- "mtime": "2026-07-06T03:43:22.271Z",
112
- "size": 332541,
113
- "path": "../public/assets/main-CgmDEMGA.js"
110
+ "etag": '"dd6-1z9xyDwQxM73GFtieH0lBUQMPeo"',
111
+ "mtime": "2026-07-06T08:42:14.500Z",
112
+ "size": 3542,
113
+ "path": "../public/assets/StreamingChunkSequence-CIn2xdVv.js"
114
114
  },
115
- "/assets/_sessionId-DziA4ZD4.js": {
115
+ "/assets/ResponseView-BL263es5.js": {
116
116
  "type": "text/javascript; charset=utf-8",
117
- "etag": '"d2-wlyaZDHIbsvwnEDFot6MtHoOilY"',
118
- "mtime": "2026-07-06T03:43:22.271Z",
119
- "size": 210,
120
- "path": "../public/assets/_sessionId-DziA4ZD4.js"
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/qwen-CONDcHqt.png": {
123
- "type": "image/png",
124
- "etag": '"572c3-cdJAPaHdOvFCGzuaQjagdgOu6XE"',
125
- "mtime": "2026-07-06T03:43:22.271Z",
126
- "size": 357059,
127
- "path": "../public/assets/qwen-CONDcHqt.png"
122
+ "/assets/_sessionId-KmeAKZJw.js": {
123
+ "type": "text/javascript; charset=utf-8",
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-06T03:43:22.271Z",
132
+ "mtime": "2026-07-06T08:42:14.499Z",
133
133
  "size": 11256,
134
134
  "path": "../public/assets/zhipuai-BPNAnxo-.svg"
135
135
  },
136
- "/assets/StreamingChunkSequence-gZpqWwKK.js": {
137
- "type": "text/javascript; charset=utf-8",
138
- "etag": '"dd6-4TByjpofN6+LEoXCJarpy4Gq3EI"',
139
- "mtime": "2026-07-06T03:43:22.272Z",
140
- "size": 3542,
141
- "path": "../public/assets/StreamingChunkSequence-gZpqWwKK.js"
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-v5Lmx35X.js": {
143
+ "/assets/ProxyViewerContainer-ygSGJ4EB.js": {
144
144
  "type": "text/javascript; charset=utf-8",
145
- "etag": '"ae027-e8sH3cKk1w5M2T32Xlncxf3nGrE"',
146
- "mtime": "2026-07-06T03:43:22.272Z",
147
- "size": 712743,
148
- "path": "../public/assets/ProxyViewerContainer-v5Lmx35X.js"
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tonyclaw/agent-inspector",
3
- "version": "2.1.20",
3
+ "version": "2.1.22",
4
4
  "type": "module",
5
5
  "description": "Agent observability and knowledge capture layer for AI coding tools.",
6
6
  "license": "MIT",
@@ -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
- const total = pagination.total === null ? "logs" : `${pagination.total} logs`;
967
- return `Showing ${range} of ${total}`;
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
- <Select value={selectedSession} onValueChange={onSessionChange}>
1908
- <SelectTrigger className="border border-input bg-background hover:bg-accent hover:text-accent-foreground h-9 w-full text-xs">
1909
- <SelectValue placeholder="All sessions" />
1910
- </SelectTrigger>
1911
- <SelectContent>
1912
- <SelectItem value="__all__">All sessions</SelectItem>
1913
- {sessions.map((s) => (
1914
- <SelectItem key={s} value={s}>
1915
- {truncateSessionId(s)}
1916
- </SelectItem>
1917
- ))}
1918
- </SelectContent>
1919
- </Select>
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,
@@ -1,5 +1,5 @@
1
1
  import { type JSX, useCallback, useMemo, useState } from "react";
2
- import { ChevronDown, ChevronRight, Cpu, FolderOpen, Monitor } from "lucide-react";
2
+ import { ChevronDown, ChevronRight, Cpu, FolderOpen, Loader2, Monitor } from "lucide-react";
3
3
  import type { CapturedLog } from "../../contracts";
4
4
  import { cn, formatTokens } from "../../lib/utils";
5
5
  import { ClientLogo, clientAppLabel, detectClientApp, type ClientApp } from "../clients/ClientLogo";
@@ -53,6 +53,14 @@ export function shouldVirtualizeConversationGroups(groupCount: number): boolean
53
53
  return groupCount > VIRTUALIZE_GROUP_THRESHOLD;
54
54
  }
55
55
 
56
+ export function hasPendingLogs(logs: readonly CapturedLog[]): boolean {
57
+ return logs.some((log) => log.responseStatus === null);
58
+ }
59
+
60
+ export function countPendingTurns(logs: readonly CapturedLog[]): number {
61
+ return logs.filter((log) => log.responseStatus === null).length;
62
+ }
63
+
56
64
  export function findConversationGroupIndexForLog(
57
65
  groups: readonly ConversationGroupData[],
58
66
  logId: number,
@@ -277,6 +285,36 @@ function SummaryChip({
277
285
  );
278
286
  }
279
287
 
288
+ function PendingTurnBadge({
289
+ count,
290
+ label = "Turn open",
291
+ }: {
292
+ count: number;
293
+ label?: string;
294
+ }): JSX.Element {
295
+ return (
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
+ >
300
+ <Loader2 className="size-3 animate-spin" />
301
+ {label}
302
+ {count > 1 && <span className="tabular-nums">x{count}</span>}
303
+ </span>
304
+ );
305
+ }
306
+
307
+ function LoadingSweep(): JSX.Element {
308
+ return (
309
+ <span
310
+ className="pointer-events-none absolute inset-x-3 bottom-0 h-px overflow-hidden rounded-full bg-white/[0.06]"
311
+ aria-hidden="true"
312
+ >
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)]" />
314
+ </span>
315
+ );
316
+ }
317
+
280
318
  export function ConversationGroupList({
281
319
  groups,
282
320
  ...groupProps
@@ -346,10 +384,15 @@ function IdeGroupSection({
346
384
  const totals = tokenTotals(group.logs);
347
385
  const sessionCount = countSessions(group.processes);
348
386
  const logCount = group.logs.length;
387
+ const pendingTurnCount = countPendingTurns(group.logs);
388
+ const isWorking = pendingTurnCount > 0;
349
389
 
350
390
  return (
351
391
  <section
352
- className={cn("bg-card/75 shadow-sm relative isolate rounded-[8px]")}
392
+ className={cn(
393
+ "bg-card/75 shadow-sm relative isolate overflow-hidden rounded-[8px]",
394
+ isWorking && "bg-card/85",
395
+ )}
353
396
  data-ide-group={group.id}
354
397
  >
355
398
  <button
@@ -377,6 +420,7 @@ function IdeGroupSection({
377
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">
378
421
  IDE
379
422
  </span>
423
+ {isWorking && <PendingTurnBadge count={pendingTurnCount} label="Turn open" />}
380
424
  </span>
381
425
  <span className="mt-1 flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-muted-foreground">
382
426
  <span>
@@ -400,6 +444,7 @@ function IdeGroupSection({
400
444
  {collapsed ? <ChevronRight className="size-4" /> : <ChevronDown className="size-4" />}
401
445
  </span>
402
446
  </button>
447
+ {isWorking && <LoadingSweep />}
403
448
 
404
449
  {!collapsed && (
405
450
  <div className="space-y-3 px-3 pb-3 pt-2 sm:px-4">
@@ -433,6 +478,8 @@ function ProcessGroupSection({
433
478
  const projectLabel = shortProjectPath(group.clientProjectFolder);
434
479
  const sessionCount = group.sessions.length;
435
480
  const logCount = group.logs.length;
481
+ const pendingTurnCount = countPendingTurns(group.logs);
482
+ const isWorking = pendingTurnCount > 0;
436
483
  const processLabel =
437
484
  group.clientPid !== null && group.clientPid !== undefined
438
485
  ? `PID ${group.clientPid}`
@@ -441,7 +488,7 @@ function ProcessGroupSection({
441
488
  return (
442
489
  <section className="relative pl-5">
443
490
  <span className="absolute bottom-1 left-2 top-1 w-px bg-white/[0.055]" aria-hidden="true" />
444
- <div className="bg-black/[0.10] overflow-hidden rounded-[8px]">
491
+ <div className="bg-black/[0.10] relative overflow-hidden rounded-[8px]">
445
492
  <button
446
493
  type="button"
447
494
  className="flex w-full min-w-0 items-center gap-3 px-3 py-2.5 text-left transition-colors hover:bg-white/[0.035] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-cyan-300/40"
@@ -457,6 +504,7 @@ function ProcessGroupSection({
457
504
  <span className="font-mono text-xs font-semibold tabular-nums text-slate-100">
458
505
  {processLabel}
459
506
  </span>
507
+ {isWorking && <PendingTurnBadge count={pendingTurnCount} label="Turn open" />}
460
508
  {projectLabel !== null && (
461
509
  <span
462
510
  className="inline-flex min-w-0 items-center gap-1 text-xs text-muted-foreground"
@@ -486,6 +534,7 @@ function ProcessGroupSection({
486
534
  {collapsed ? <ChevronRight className="size-4" /> : <ChevronDown className="size-4" />}
487
535
  </span>
488
536
  </button>
537
+ {isWorking && <LoadingSweep />}
489
538
 
490
539
  {!collapsed && (
491
540
  <div className="space-y-2 p-2 pt-1 sm:p-3 sm:pt-2">
@@ -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;
@@ -150,7 +162,7 @@ export function ConversationHeader({
150
162
  data-nav-id={`conv-${conversationId}`}
151
163
  data-nav-action={expanded ? "collapse" : "expand"}
152
164
  className={cn(
153
- "bg-card/80 shadow-sm flex cursor-pointer items-start gap-3 rounded-[8px] px-3 py-2.5 transition-colors",
165
+ "bg-card/80 shadow-sm relative flex cursor-pointer items-start gap-3 overflow-hidden rounded-[8px] px-3 py-2.5 transition-colors",
154
166
  "hover:bg-card",
155
167
  "select-none",
156
168
  "sticky top-0 z-10 mb-2",
@@ -233,6 +245,8 @@ export function ConversationHeader({
233
245
  <span className="truncate font-mono tabular-nums">{clientDisplayLabel}</span>
234
246
  </span>
235
247
  )}
248
+
249
+ {isLoading && <PendingTurnBadge />}
236
250
  </span>
237
251
 
238
252
  <span className="mt-1.5 flex min-w-0 flex-wrap items-center gap-1.5">
@@ -295,6 +309,15 @@ export function ConversationHeader({
295
309
  </span>
296
310
  </span>
297
311
 
312
+ {isLoading && (
313
+ <span
314
+ className="pointer-events-none absolute inset-x-3 bottom-0 h-px overflow-hidden rounded-full bg-white/[0.06]"
315
+ aria-hidden="true"
316
+ >
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)]" />
318
+ </span>
319
+ )}
320
+
298
321
  <ConfirmDialog
299
322
  open={confirmOpen}
300
323
  onOpenChange={setConfirmOpen}
@@ -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(): React.JSX.Element {
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
  }