@tonyclaw/agent-inspector 2.1.17 → 2.1.18

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-B9sLBHw5.js → CompareDrawer-Fqqw5Lci.js} +1 -1
  3. package/.output/public/assets/{ProxyViewerContainer-DbWjc_BE.js → ProxyViewerContainer-CP_RzwW9.js} +31 -31
  4. package/.output/public/assets/{ReplayDialog-D9I9W9n3.js → ReplayDialog-hYhz_i6W.js} +1 -1
  5. package/.output/public/assets/{RequestAnatomy-DGXK_Rii.js → RequestAnatomy-CTuWbtwC.js} +1 -1
  6. package/.output/public/assets/{ResponseView-df_JzwsS.js → ResponseView-CsZ7S5Gv.js} +2 -2
  7. package/.output/public/assets/{StreamingChunkSequence-i3DM5IKL.js → StreamingChunkSequence-PIbJMotU.js} +1 -1
  8. package/.output/public/assets/_sessionId-CUGA9qU3.js +1 -0
  9. package/.output/public/assets/{index-Dqc2r1ea.js → index-F7mynwuH.js} +1 -1
  10. package/.output/public/assets/index-G4dTUobw.js +1 -0
  11. package/.output/public/assets/index-gvYkgMPF.css +1 -0
  12. package/.output/public/assets/{json-viewer-D3QWQlSB.js → json-viewer-DCXtNmmD.js} +1 -1
  13. package/.output/public/assets/{main-ZhxhOCmF.js → main-BJZf7_Ib.js} +2 -2
  14. package/.output/server/{_sessionId-YFrP0lZP.mjs → _sessionId-DjSHDNh8.mjs} +2 -2
  15. package/.output/server/_ssr/{CompareDrawer-qC3adEeq.mjs → CompareDrawer-Dal52IFo.mjs} +2 -2
  16. package/.output/server/_ssr/{ProxyViewerContainer-DCZIJC2b.mjs → ProxyViewerContainer-CVqFZGff.mjs} +1923 -1918
  17. package/.output/server/_ssr/{ReplayDialog-CvX4XYCi.mjs → ReplayDialog-BOEgdMes.mjs} +3 -3
  18. package/.output/server/_ssr/{RequestAnatomy-HQfrxjO1.mjs → RequestAnatomy-gch7_vCV.mjs} +2 -2
  19. package/.output/server/_ssr/{ResponseView-QSlSD11e.mjs → ResponseView-lEWPy-H4.mjs} +2 -2
  20. package/.output/server/_ssr/{StreamingChunkSequence-DTAiwlnI.mjs → StreamingChunkSequence-DnudbJ1O.mjs} +2 -2
  21. package/.output/server/_ssr/{index-D_EzfXaN.mjs → index-Cza8zDrW.mjs} +2 -2
  22. package/.output/server/_ssr/index.mjs +2 -2
  23. package/.output/server/_ssr/{json-viewer-CrIX0e0Q.mjs → json-viewer-C2lIVEX3.mjs} +2 -2
  24. package/.output/server/_ssr/{router-__o2wrfO.mjs → router-bF9uzd1k.mjs} +545 -22
  25. package/.output/server/{_tanstack-start-manifest_v-DbqyLpsI.mjs → _tanstack-start-manifest_v-ErvW-mtr.mjs} +1 -1
  26. package/.output/server/index.mjs +70 -70
  27. package/package.json +1 -1
  28. package/src/components/proxy-viewer/ThreadConnector.tsx +72 -88
  29. package/src/components/proxy-viewer/TurnGroup.tsx +1 -0
  30. package/src/mcp/server.ts +275 -0
  31. package/src/mcp/toolHandlers.ts +380 -3
  32. package/src/proxy/logSearch.ts +3 -0
  33. package/src/proxy/store.ts +40 -15
  34. package/src/routes/api/logs.ts +8 -2
  35. package/.output/public/assets/_sessionId-CTpCHdFh.js +0 -1
  36. package/.output/public/assets/index-Blqvndcn.js +0 -1
  37. package/.output/public/assets/index-Cs79WRQj.css +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-ZhxhOCmF.js"], "assets": [] }, "/": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/index.tsx", "assets": [], "preloads": ["/assets/index-Blqvndcn.js", "/assets/ProxyViewerContainer-DbWjc_BE.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-CTpCHdFh.js", "/assets/ProxyViewerContainer-DbWjc_BE.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-ZhxhOCmF.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-BJZf7_Ib.js"], "assets": [] }, "/": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/index.tsx", "assets": [], "preloads": ["/assets/index-G4dTUobw.js", "/assets/ProxyViewerContainer-CP_RzwW9.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-CUGA9qU3.js", "/assets/ProxyViewerContainer-CP_RzwW9.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-BJZf7_Ib.js" });
2
2
  export {
3
3
  tsrStartManifest
4
4
  };
@@ -35,117 +35,117 @@ const headers = ((m) => function headersRouteRule(event) {
35
35
  }
36
36
  });
37
37
  const assets = {
38
- "/assets/alibaba-TTwafVwX.svg": {
39
- "type": "image/svg+xml",
40
- "etag": '"171b-6dyV5K8QjiaY35sN9qNprh9zDIs"',
41
- "mtime": "2026-07-06T01:51:49.827Z",
42
- "size": 5915,
43
- "path": "../public/assets/alibaba-TTwafVwX.svg"
38
+ "/assets/index-G4dTUobw.js": {
39
+ "type": "text/javascript; charset=utf-8",
40
+ "etag": '"74-G+Wy36aQXMFWtM2juvBC91P1cPo"',
41
+ "mtime": "2026-07-06T03:16:09.580Z",
42
+ "size": 116,
43
+ "path": "../public/assets/index-G4dTUobw.js"
44
44
  },
45
- "/assets/CompareDrawer-B9sLBHw5.js": {
45
+ "/assets/CompareDrawer-Fqqw5Lci.js": {
46
46
  "type": "text/javascript; charset=utf-8",
47
- "etag": '"4bbf-mOJ0EMaKAedd4RKPYjBplzH1us0"',
48
- "mtime": "2026-07-06T01:51:49.827Z",
47
+ "etag": '"4bbf-d+KiMwQK8csZD6MZwqm5WH3tl0Y"',
48
+ "mtime": "2026-07-06T03:16:09.580Z",
49
49
  "size": 19391,
50
- "path": "../public/assets/CompareDrawer-B9sLBHw5.js"
51
- },
52
- "/assets/index-Cs79WRQj.css": {
53
- "type": "text/css; charset=utf-8",
54
- "etag": '"222de-8Pwwfkc74RHkx4a9x2RSdxKMxvk"',
55
- "mtime": "2026-07-06T01:51:49.827Z",
56
- "size": 139998,
57
- "path": "../public/assets/index-Cs79WRQj.css"
50
+ "path": "../public/assets/CompareDrawer-Fqqw5Lci.js"
58
51
  },
59
- "/assets/json-viewer-D3QWQlSB.js": {
52
+ "/assets/json-viewer-DCXtNmmD.js": {
60
53
  "type": "text/javascript; charset=utf-8",
61
- "etag": '"1ae6-O7Q+mkHayIbluV/J6OMUlBSz1/E"',
62
- "mtime": "2026-07-06T01:51:49.827Z",
54
+ "etag": '"1ae6-xXyRZMiLYae+0u65mVJT2bBjIGw"',
55
+ "mtime": "2026-07-06T03:16:09.581Z",
63
56
  "size": 6886,
64
- "path": "../public/assets/json-viewer-D3QWQlSB.js"
57
+ "path": "../public/assets/json-viewer-DCXtNmmD.js"
65
58
  },
66
- "/assets/index-Dqc2r1ea.js": {
59
+ "/assets/index-F7mynwuH.js": {
67
60
  "type": "text/javascript; charset=utf-8",
68
- "etag": '"1cd2c-MUj6v+9GBschHh/SsyN1UByPNE0"',
69
- "mtime": "2026-07-06T01:51:49.827Z",
61
+ "etag": '"1cd2c-9hK4Mmn22geAPkEXOQqANliuMiA"',
62
+ "mtime": "2026-07-06T03:16:09.581Z",
70
63
  "size": 118060,
71
- "path": "../public/assets/index-Dqc2r1ea.js"
64
+ "path": "../public/assets/index-F7mynwuH.js"
65
+ },
66
+ "/assets/alibaba-TTwafVwX.svg": {
67
+ "type": "image/svg+xml",
68
+ "etag": '"171b-6dyV5K8QjiaY35sN9qNprh9zDIs"',
69
+ "mtime": "2026-07-06T03:16:09.580Z",
70
+ "size": 5915,
71
+ "path": "../public/assets/alibaba-TTwafVwX.svg"
72
+ },
73
+ "/assets/index-gvYkgMPF.css": {
74
+ "type": "text/css; charset=utf-8",
75
+ "etag": '"21e71-A0ehAqTWzWPsd1GM1PqrHVOH5uQ"',
76
+ "mtime": "2026-07-06T03:16:09.580Z",
77
+ "size": 138865,
78
+ "path": "../public/assets/index-gvYkgMPF.css"
79
+ },
80
+ "/assets/ReplayDialog-hYhz_i6W.js": {
81
+ "type": "text/javascript; charset=utf-8",
82
+ "etag": '"31d6-OuYMx1ZLYauLqe18liRlIWPThkk"',
83
+ "mtime": "2026-07-06T03:16:09.580Z",
84
+ "size": 12758,
85
+ "path": "../public/assets/ReplayDialog-hYhz_i6W.js"
72
86
  },
73
87
  "/assets/minimax-BPMzvuL-.jpeg": {
74
88
  "type": "image/jpeg",
75
89
  "etag": '"1b06-IwivU89ko5UTMUM1/t7hn4sQK9A"',
76
- "mtime": "2026-07-06T01:51:49.827Z",
90
+ "mtime": "2026-07-06T03:16:09.580Z",
77
91
  "size": 6918,
78
92
  "path": "../public/assets/minimax-BPMzvuL-.jpeg"
79
93
  },
80
- "/assets/index-Blqvndcn.js": {
94
+ "/assets/RequestAnatomy-CTuWbtwC.js": {
81
95
  "type": "text/javascript; charset=utf-8",
82
- "etag": '"74-KumSweCku9x2YG0UbCSDwxEOQb4"',
83
- "mtime": "2026-07-06T01:51:49.827Z",
84
- "size": 116,
85
- "path": "../public/assets/index-Blqvndcn.js"
96
+ "etag": '"43f2-HeCHVsZF7BGYCBIXpjAKkOh4F44"',
97
+ "mtime": "2026-07-06T03:16:09.580Z",
98
+ "size": 17394,
99
+ "path": "../public/assets/RequestAnatomy-CTuWbtwC.js"
86
100
  },
87
- "/assets/main-ZhxhOCmF.js": {
101
+ "/assets/main-BJZf7_Ib.js": {
88
102
  "type": "text/javascript; charset=utf-8",
89
- "etag": '"512fd-NMWv1O63GXKR1aIbooHc2pwfyu4"',
90
- "mtime": "2026-07-06T01:51:49.827Z",
103
+ "etag": '"512fd-EJOXBMERSrzfgsfzj0SamtIRX6k"',
104
+ "mtime": "2026-07-06T03:16:09.580Z",
91
105
  "size": 332541,
92
- "path": "../public/assets/main-ZhxhOCmF.js"
106
+ "path": "../public/assets/main-BJZf7_Ib.js"
93
107
  },
94
- "/assets/ReplayDialog-D9I9W9n3.js": {
108
+ "/assets/ResponseView-CsZ7S5Gv.js": {
95
109
  "type": "text/javascript; charset=utf-8",
96
- "etag": '"31d6-YQGi7nwdceaOJuIfsN92yj+6Fyo"',
97
- "mtime": "2026-07-06T01:51:49.827Z",
98
- "size": 12758,
99
- "path": "../public/assets/ReplayDialog-D9I9W9n3.js"
110
+ "etag": '"3fbb-A01k3vtoURXRqFZpUM7nvhzCzXk"',
111
+ "mtime": "2026-07-06T03:16:09.580Z",
112
+ "size": 16315,
113
+ "path": "../public/assets/ResponseView-CsZ7S5Gv.js"
100
114
  },
101
- "/assets/RequestAnatomy-DGXK_Rii.js": {
115
+ "/assets/StreamingChunkSequence-PIbJMotU.js": {
102
116
  "type": "text/javascript; charset=utf-8",
103
- "etag": '"43f2-30DhTBpZpd4MA5WZnZbfkIQBryQ"',
104
- "mtime": "2026-07-06T01:51:49.827Z",
105
- "size": 17394,
106
- "path": "../public/assets/RequestAnatomy-DGXK_Rii.js"
117
+ "etag": '"dd6-8dNqFVPNQt96Q6ov5fmug8gHPJg"',
118
+ "mtime": "2026-07-06T03:16:09.580Z",
119
+ "size": 3542,
120
+ "path": "../public/assets/StreamingChunkSequence-PIbJMotU.js"
107
121
  },
108
122
  "/assets/zhipuai-BPNAnxo-.svg": {
109
123
  "type": "image/svg+xml",
110
124
  "etag": '"2bf8-hNaLCTi89nOFCsIIfWpP/jrfo0s"',
111
- "mtime": "2026-07-06T01:51:49.827Z",
125
+ "mtime": "2026-07-06T03:16:09.580Z",
112
126
  "size": 11256,
113
127
  "path": "../public/assets/zhipuai-BPNAnxo-.svg"
114
128
  },
115
- "/assets/_sessionId-CTpCHdFh.js": {
129
+ "/assets/_sessionId-CUGA9qU3.js": {
116
130
  "type": "text/javascript; charset=utf-8",
117
- "etag": '"d2-diSV3Oay0m0yeVjsrN5VohJjP9I"',
118
- "mtime": "2026-07-06T01:51:49.827Z",
131
+ "etag": '"d2-EbzgICXvZ7UjgIxAGZVoJ8zc0C4"',
132
+ "mtime": "2026-07-06T03:16:09.580Z",
119
133
  "size": 210,
120
- "path": "../public/assets/_sessionId-CTpCHdFh.js"
121
- },
122
- "/assets/StreamingChunkSequence-i3DM5IKL.js": {
123
- "type": "text/javascript; charset=utf-8",
124
- "etag": '"dd6-sm8l2L9t4HNm1wckJccvuzIjumw"',
125
- "mtime": "2026-07-06T01:51:49.827Z",
126
- "size": 3542,
127
- "path": "../public/assets/StreamingChunkSequence-i3DM5IKL.js"
134
+ "path": "../public/assets/_sessionId-CUGA9qU3.js"
128
135
  },
129
136
  "/assets/qwen-CONDcHqt.png": {
130
137
  "type": "image/png",
131
138
  "etag": '"572c3-cdJAPaHdOvFCGzuaQjagdgOu6XE"',
132
- "mtime": "2026-07-06T01:51:49.827Z",
139
+ "mtime": "2026-07-06T03:16:09.580Z",
133
140
  "size": 357059,
134
141
  "path": "../public/assets/qwen-CONDcHqt.png"
135
142
  },
136
- "/assets/ResponseView-df_JzwsS.js": {
137
- "type": "text/javascript; charset=utf-8",
138
- "etag": '"3fbb-RyW55oha8FJPVc7LwVVvqDHbS2w"',
139
- "mtime": "2026-07-06T01:51:49.827Z",
140
- "size": 16315,
141
- "path": "../public/assets/ResponseView-df_JzwsS.js"
142
- },
143
- "/assets/ProxyViewerContainer-DbWjc_BE.js": {
143
+ "/assets/ProxyViewerContainer-CP_RzwW9.js": {
144
144
  "type": "text/javascript; charset=utf-8",
145
- "etag": '"ae33a-hp/EgU9Iy8Orpyt/O1Z4ej99Zjo"',
146
- "mtime": "2026-07-06T01:51:49.827Z",
147
- "size": 713530,
148
- "path": "../public/assets/ProxyViewerContainer-DbWjc_BE.js"
145
+ "etag": '"ae2dd-gQKBSF7KRrPg0IO5skof4vGzHH0"',
146
+ "mtime": "2026-07-06T03:16:09.581Z",
147
+ "size": 713437,
148
+ "path": "../public/assets/ProxyViewerContainer-CP_RzwW9.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.17",
3
+ "version": "2.1.18",
4
4
  "type": "module",
5
5
  "description": "Agent observability and knowledge capture layer for AI coding tools.",
6
6
  "license": "MIT",
@@ -1,6 +1,7 @@
1
- import type { JSX, KeyboardEvent, MouseEvent } from "react";
1
+ import { type JSX, type KeyboardEvent, type MouseEvent, useMemo } from "react";
2
2
  import { isTurnBoundary, type StopReason } from "../../lib/stopReason";
3
3
  import { cn } from "../../lib/utils";
4
+ import { getCrabVariant, getInteriorCrabVariant } from "../ui/crab-variants";
4
5
 
5
6
  export type ThreadConnectorProps = {
6
7
  stopReason: StopReason;
@@ -10,13 +11,13 @@ export type ThreadConnectorProps = {
10
11
  isTurnStart: boolean;
11
12
  /** True when this entry is the turn's only request. */
12
13
  isOnlyEntry?: boolean;
13
- /** When true the timeline marker is clickable (collapse / expand a turn). */
14
+ /** Seed for crab variant selection (0-11). */
15
+ crabIndex?: number;
16
+ /** When true the crab is clickable (collapse / expand a turn). */
14
17
  collapsible?: boolean;
15
18
  onToggle?: () => void;
16
19
  };
17
20
 
18
- type MarkerTone = "start" | "end" | "fused" | "running" | "idle";
19
-
20
21
  function boundaryTitle(stopReason: StopReason): string {
21
22
  switch (stopReason) {
22
23
  case "end_turn":
@@ -31,77 +32,8 @@ function boundaryTitle(stopReason: StopReason): string {
31
32
  }
32
33
  }
33
34
 
34
- function markerTone({
35
- isFusedBoundary,
36
- isBoundary,
37
- isTurnStart,
38
- isRunning,
39
- }: {
40
- isFusedBoundary: boolean;
41
- isBoundary: boolean;
42
- isTurnStart: boolean;
43
- isRunning: boolean;
44
- }): MarkerTone {
45
- if (isFusedBoundary) return "fused";
46
- if (isBoundary) return "end";
47
- if (isTurnStart) return "start";
48
- if (isRunning) return "running";
49
- return "idle";
50
- }
51
-
52
- function markerClass(tone: MarkerTone, interactive: boolean): string {
53
- const base =
54
- "inline-flex size-3.5 items-center justify-center rounded-full border transition-colors";
55
- const cursor = interactive ? "cursor-pointer hover:border-cyan-200/70 hover:bg-cyan-300/20" : "";
56
-
57
- switch (tone) {
58
- case "start":
59
- return cn(base, cursor, "border-cyan-300/50 bg-cyan-300/12 text-cyan-200");
60
- case "end":
61
- return cn(base, cursor, "border-amber-300/55 bg-amber-300/12 text-amber-200");
62
- case "fused":
63
- return cn(
64
- base,
65
- cursor,
66
- "border-slate-200/50 bg-slate-200/10 text-slate-100 ring-2 ring-cyan-300/15",
67
- );
68
- case "running":
69
- return cn(
70
- base,
71
- cursor,
72
- "border-amber-300/45 bg-amber-300/10 text-amber-200 ring-2 ring-amber-300/10",
73
- );
74
- case "idle":
75
- return cn(base, cursor, "border-muted-foreground/25 bg-muted/30 text-muted-foreground/60");
76
- }
77
- }
78
-
79
- function markerInnerClass(tone: MarkerTone): string {
80
- switch (tone) {
81
- case "running":
82
- return "size-1.5 rounded-full bg-current animate-pulse";
83
- case "idle":
84
- return "size-1 rounded-full bg-current opacity-55";
85
- case "start":
86
- case "end":
87
- case "fused":
88
- return "size-1.5 rounded-full bg-current";
89
- }
90
- }
91
-
92
- function markerTitle(tone: MarkerTone, stopReason: StopReason): string {
93
- switch (tone) {
94
- case "start":
95
- return "Start of turn";
96
- case "end":
97
- return boundaryTitle(stopReason);
98
- case "fused":
99
- return "Single-request turn";
100
- case "running":
101
- return "Processing";
102
- case "idle":
103
- return "Request in turn";
104
- }
35
+ function crabShellClass(interactive: boolean): string {
36
+ return interactive ? "cursor-pointer transition-transform hover:scale-110" : "";
105
37
  }
106
38
 
107
39
  export function ThreadConnector({
@@ -110,22 +42,24 @@ export function ThreadConnector({
110
42
  isFirst,
111
43
  isTurnStart,
112
44
  isOnlyEntry = false,
45
+ crabIndex = 0,
113
46
  collapsible = false,
114
47
  onToggle,
115
48
  }: ThreadConnectorProps): JSX.Element {
116
49
  const isBoundary = isTurnBoundary(stopReason);
117
50
  const isFusedBoundary = isOnlyEntry && isTurnStart && isBoundary;
118
51
  const isRunning = isPending && !isBoundary;
119
- const tone = markerTone({ isFusedBoundary, isBoundary, isTurnStart, isRunning });
120
52
  const interactive = collapsible && onToggle !== undefined;
53
+ const Crab = useMemo(() => getCrabVariant(crabIndex), [crabIndex]);
54
+ const FusedCrab = useMemo(() => getInteriorCrabVariant(crabIndex), [crabIndex]);
121
55
 
122
- const handleMarkerClick = (event: MouseEvent<HTMLSpanElement>): void => {
56
+ const handleCrabClick = (event: MouseEvent<HTMLSpanElement>): void => {
123
57
  if (!interactive || onToggle === undefined) return;
124
58
  event.stopPropagation();
125
59
  onToggle();
126
60
  };
127
61
 
128
- const handleMarkerKeyDown = (event: KeyboardEvent<HTMLSpanElement>): void => {
62
+ const handleCrabKeyDown = (event: KeyboardEvent<HTMLSpanElement>): void => {
129
63
  if (!interactive || onToggle === undefined) return;
130
64
  if (event.key !== "Enter" && event.key !== " ") return;
131
65
  event.preventDefault();
@@ -138,16 +72,66 @@ export function ThreadConnector({
138
72
  {!isFirst && <div className="w-0.5 bg-muted-foreground/30 h-full" />}
139
73
  </div>
140
74
 
141
- <span
142
- role={interactive ? "button" : undefined}
143
- tabIndex={interactive ? 0 : undefined}
144
- title={markerTitle(tone, stopReason)}
145
- className={markerClass(tone, interactive)}
146
- onClick={handleMarkerClick}
147
- onKeyDown={handleMarkerKeyDown}
148
- >
149
- <span className={markerInnerClass(tone)} />
150
- </span>
75
+ {isFusedBoundary ? (
76
+ <span
77
+ role={interactive ? "button" : undefined}
78
+ tabIndex={interactive ? 0 : undefined}
79
+ title="Single-request turn"
80
+ className={crabShellClass(interactive)}
81
+ onClick={handleCrabClick}
82
+ onKeyDown={handleCrabKeyDown}
83
+ >
84
+ <FusedCrab
85
+ className={cn(
86
+ "size-3.5 text-[#80FF00]",
87
+ "animate-crab-settle",
88
+ "drop-shadow-[0_0_4px_rgba(128,255,0,0.5)]",
89
+ )}
90
+ />
91
+ </span>
92
+ ) : isBoundary ? (
93
+ <span
94
+ role={interactive ? "button" : undefined}
95
+ tabIndex={interactive ? 0 : undefined}
96
+ title={boundaryTitle(stopReason)}
97
+ className={crabShellClass(interactive)}
98
+ onClick={handleCrabClick}
99
+ onKeyDown={handleCrabKeyDown}
100
+ >
101
+ <Crab
102
+ className={cn(
103
+ "size-3.5 text-amber-400",
104
+ "animate-crab-settle",
105
+ "drop-shadow-[0_0_4px_rgba(251,191,36,0.5)]",
106
+ )}
107
+ />
108
+ </span>
109
+ ) : isTurnStart ? (
110
+ <span
111
+ role={interactive ? "button" : undefined}
112
+ tabIndex={interactive ? 0 : undefined}
113
+ title="Start of turn"
114
+ className={crabShellClass(interactive)}
115
+ onClick={handleCrabClick}
116
+ onKeyDown={handleCrabKeyDown}
117
+ >
118
+ <Crab
119
+ className={cn(
120
+ "size-3.5 text-emerald-400",
121
+ "animate-crab-appear",
122
+ "drop-shadow-[0_0_4px_rgba(52,211,153,0.5)]",
123
+ )}
124
+ />
125
+ </span>
126
+ ) : isRunning ? (
127
+ <span title="Processing">
128
+ <Crab className={cn("size-3.5 text-amber-300/80", "animate-crab-crawl")} />
129
+ </span>
130
+ ) : (
131
+ <span title="Request in turn">
132
+ <Crab className="size-3.5 text-muted-foreground/40" />
133
+ </span>
134
+ )}
151
135
 
152
136
  <div className="flex-1 flex justify-center min-h-0">
153
137
  {!isBoundary && (
@@ -349,6 +349,7 @@ export const TurnGroup = memo(function TurnGroup({
349
349
  isFirst={visibleIdx === 0}
350
350
  isTurnStart={isTurnStart}
351
351
  isOnlyEntry={isSingleLog}
352
+ crabIndex={log.id % 12}
352
353
  collapsible={collapsible && isTurnStart}
353
354
  onToggle={toggleCollapse}
354
355
  />