@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.
- package/.output/nitro.json +1 -1
- package/.output/public/assets/{CompareDrawer-B9sLBHw5.js → CompareDrawer-Fqqw5Lci.js} +1 -1
- package/.output/public/assets/{ProxyViewerContainer-DbWjc_BE.js → ProxyViewerContainer-CP_RzwW9.js} +31 -31
- package/.output/public/assets/{ReplayDialog-D9I9W9n3.js → ReplayDialog-hYhz_i6W.js} +1 -1
- package/.output/public/assets/{RequestAnatomy-DGXK_Rii.js → RequestAnatomy-CTuWbtwC.js} +1 -1
- package/.output/public/assets/{ResponseView-df_JzwsS.js → ResponseView-CsZ7S5Gv.js} +2 -2
- package/.output/public/assets/{StreamingChunkSequence-i3DM5IKL.js → StreamingChunkSequence-PIbJMotU.js} +1 -1
- package/.output/public/assets/_sessionId-CUGA9qU3.js +1 -0
- package/.output/public/assets/{index-Dqc2r1ea.js → index-F7mynwuH.js} +1 -1
- package/.output/public/assets/index-G4dTUobw.js +1 -0
- package/.output/public/assets/index-gvYkgMPF.css +1 -0
- package/.output/public/assets/{json-viewer-D3QWQlSB.js → json-viewer-DCXtNmmD.js} +1 -1
- package/.output/public/assets/{main-ZhxhOCmF.js → main-BJZf7_Ib.js} +2 -2
- package/.output/server/{_sessionId-YFrP0lZP.mjs → _sessionId-DjSHDNh8.mjs} +2 -2
- package/.output/server/_ssr/{CompareDrawer-qC3adEeq.mjs → CompareDrawer-Dal52IFo.mjs} +2 -2
- package/.output/server/_ssr/{ProxyViewerContainer-DCZIJC2b.mjs → ProxyViewerContainer-CVqFZGff.mjs} +1923 -1918
- package/.output/server/_ssr/{ReplayDialog-CvX4XYCi.mjs → ReplayDialog-BOEgdMes.mjs} +3 -3
- package/.output/server/_ssr/{RequestAnatomy-HQfrxjO1.mjs → RequestAnatomy-gch7_vCV.mjs} +2 -2
- package/.output/server/_ssr/{ResponseView-QSlSD11e.mjs → ResponseView-lEWPy-H4.mjs} +2 -2
- package/.output/server/_ssr/{StreamingChunkSequence-DTAiwlnI.mjs → StreamingChunkSequence-DnudbJ1O.mjs} +2 -2
- package/.output/server/_ssr/{index-D_EzfXaN.mjs → index-Cza8zDrW.mjs} +2 -2
- package/.output/server/_ssr/index.mjs +2 -2
- package/.output/server/_ssr/{json-viewer-CrIX0e0Q.mjs → json-viewer-C2lIVEX3.mjs} +2 -2
- package/.output/server/_ssr/{router-__o2wrfO.mjs → router-bF9uzd1k.mjs} +545 -22
- package/.output/server/{_tanstack-start-manifest_v-DbqyLpsI.mjs → _tanstack-start-manifest_v-ErvW-mtr.mjs} +1 -1
- package/.output/server/index.mjs +70 -70
- package/package.json +1 -1
- package/src/components/proxy-viewer/ThreadConnector.tsx +72 -88
- package/src/components/proxy-viewer/TurnGroup.tsx +1 -0
- package/src/mcp/server.ts +275 -0
- package/src/mcp/toolHandlers.ts +380 -3
- package/src/proxy/logSearch.ts +3 -0
- package/src/proxy/store.ts +40 -15
- package/src/routes/api/logs.ts +8 -2
- package/.output/public/assets/_sessionId-CTpCHdFh.js +0 -1
- package/.output/public/assets/index-Blqvndcn.js +0 -1
- 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-
|
|
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
|
};
|
package/.output/server/index.mjs
CHANGED
|
@@ -35,117 +35,117 @@ const headers = ((m) => function headersRouteRule(event) {
|
|
|
35
35
|
}
|
|
36
36
|
});
|
|
37
37
|
const assets = {
|
|
38
|
-
"/assets/
|
|
39
|
-
"type": "
|
|
40
|
-
"etag": '"
|
|
41
|
-
"mtime": "2026-07-
|
|
42
|
-
"size":
|
|
43
|
-
"path": "../public/assets/
|
|
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-
|
|
45
|
+
"/assets/CompareDrawer-Fqqw5Lci.js": {
|
|
46
46
|
"type": "text/javascript; charset=utf-8",
|
|
47
|
-
"etag": '"4bbf-
|
|
48
|
-
"mtime": "2026-07-
|
|
47
|
+
"etag": '"4bbf-d+KiMwQK8csZD6MZwqm5WH3tl0Y"',
|
|
48
|
+
"mtime": "2026-07-06T03:16:09.580Z",
|
|
49
49
|
"size": 19391,
|
|
50
|
-
"path": "../public/assets/CompareDrawer-
|
|
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-
|
|
52
|
+
"/assets/json-viewer-DCXtNmmD.js": {
|
|
60
53
|
"type": "text/javascript; charset=utf-8",
|
|
61
|
-
"etag": '"1ae6-
|
|
62
|
-
"mtime": "2026-07-
|
|
54
|
+
"etag": '"1ae6-xXyRZMiLYae+0u65mVJT2bBjIGw"',
|
|
55
|
+
"mtime": "2026-07-06T03:16:09.581Z",
|
|
63
56
|
"size": 6886,
|
|
64
|
-
"path": "../public/assets/json-viewer-
|
|
57
|
+
"path": "../public/assets/json-viewer-DCXtNmmD.js"
|
|
65
58
|
},
|
|
66
|
-
"/assets/index-
|
|
59
|
+
"/assets/index-F7mynwuH.js": {
|
|
67
60
|
"type": "text/javascript; charset=utf-8",
|
|
68
|
-
"etag": '"1cd2c-
|
|
69
|
-
"mtime": "2026-07-
|
|
61
|
+
"etag": '"1cd2c-9hK4Mmn22geAPkEXOQqANliuMiA"',
|
|
62
|
+
"mtime": "2026-07-06T03:16:09.581Z",
|
|
70
63
|
"size": 118060,
|
|
71
|
-
"path": "../public/assets/index-
|
|
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-
|
|
90
|
+
"mtime": "2026-07-06T03:16:09.580Z",
|
|
77
91
|
"size": 6918,
|
|
78
92
|
"path": "../public/assets/minimax-BPMzvuL-.jpeg"
|
|
79
93
|
},
|
|
80
|
-
"/assets/
|
|
94
|
+
"/assets/RequestAnatomy-CTuWbtwC.js": {
|
|
81
95
|
"type": "text/javascript; charset=utf-8",
|
|
82
|
-
"etag": '"
|
|
83
|
-
"mtime": "2026-07-
|
|
84
|
-
"size":
|
|
85
|
-
"path": "../public/assets/
|
|
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-
|
|
101
|
+
"/assets/main-BJZf7_Ib.js": {
|
|
88
102
|
"type": "text/javascript; charset=utf-8",
|
|
89
|
-
"etag": '"512fd-
|
|
90
|
-
"mtime": "2026-07-
|
|
103
|
+
"etag": '"512fd-EJOXBMERSrzfgsfzj0SamtIRX6k"',
|
|
104
|
+
"mtime": "2026-07-06T03:16:09.580Z",
|
|
91
105
|
"size": 332541,
|
|
92
|
-
"path": "../public/assets/main-
|
|
106
|
+
"path": "../public/assets/main-BJZf7_Ib.js"
|
|
93
107
|
},
|
|
94
|
-
"/assets/
|
|
108
|
+
"/assets/ResponseView-CsZ7S5Gv.js": {
|
|
95
109
|
"type": "text/javascript; charset=utf-8",
|
|
96
|
-
"etag": '"
|
|
97
|
-
"mtime": "2026-07-
|
|
98
|
-
"size":
|
|
99
|
-
"path": "../public/assets/
|
|
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/
|
|
115
|
+
"/assets/StreamingChunkSequence-PIbJMotU.js": {
|
|
102
116
|
"type": "text/javascript; charset=utf-8",
|
|
103
|
-
"etag": '"
|
|
104
|
-
"mtime": "2026-07-
|
|
105
|
-
"size":
|
|
106
|
-
"path": "../public/assets/
|
|
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-
|
|
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-
|
|
129
|
+
"/assets/_sessionId-CUGA9qU3.js": {
|
|
116
130
|
"type": "text/javascript; charset=utf-8",
|
|
117
|
-
"etag": '"d2-
|
|
118
|
-
"mtime": "2026-07-
|
|
131
|
+
"etag": '"d2-EbzgICXvZ7UjgIxAGZVoJ8zc0C4"',
|
|
132
|
+
"mtime": "2026-07-06T03:16:09.580Z",
|
|
119
133
|
"size": 210,
|
|
120
|
-
"path": "../public/assets/_sessionId-
|
|
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-
|
|
139
|
+
"mtime": "2026-07-06T03:16:09.580Z",
|
|
133
140
|
"size": 357059,
|
|
134
141
|
"path": "../public/assets/qwen-CONDcHqt.png"
|
|
135
142
|
},
|
|
136
|
-
"/assets/
|
|
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": '"
|
|
146
|
-
"mtime": "2026-07-
|
|
147
|
-
"size":
|
|
148
|
-
"path": "../public/assets/ProxyViewerContainer-
|
|
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,7 @@
|
|
|
1
|
-
import type
|
|
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
|
-
/**
|
|
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
|
|
35
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
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 && (
|