@tonyclaw/agent-inspector 3.0.1 → 3.0.3

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-BgcAk1te.js → CompareDrawer-CufpM7_P.js} +1 -1
  3. package/.output/public/assets/{ProxyViewerContainer-7b_uwvT7.js → ProxyViewerContainer-Dppr2zGE.js} +26 -26
  4. package/.output/public/assets/{ReplayDialog-7Pvhjbjk.js → ReplayDialog-ClDmxv57.js} +1 -1
  5. package/.output/public/assets/{RequestAnatomy-BX-UKYQg.js → RequestAnatomy-DcuIghmp.js} +1 -1
  6. package/.output/public/assets/{ResponseView-zFxGX8xH.js → ResponseView-C7Tl47j3.js} +2 -2
  7. package/.output/public/assets/{StreamingChunkSequence-DzXzVtBF.js → StreamingChunkSequence-DBK_R540.js} +1 -1
  8. package/.output/public/assets/{_sessionId-CmsUOEIS.js → _sessionId-D8Ke-EcI.js} +1 -1
  9. package/.output/public/assets/index-BskTYcAH.css +1 -0
  10. package/.output/public/assets/{index-DXR7RB48.js → index-CpWH7b2O.js} +1 -1
  11. package/.output/public/assets/index-DRHfTEM5.js +1 -0
  12. package/.output/public/assets/{json-viewer-CiMN_9sG.js → json-viewer-BEifdKM_.js} +1 -1
  13. package/.output/public/assets/{main-Ba9x64uY.js → main-DDfExS3_.js} +2 -2
  14. package/.output/server/{_sessionId-B8GZtC4P.mjs → _sessionId-Di7z893V.mjs} +2 -2
  15. package/.output/server/_ssr/{CompareDrawer-SBDtZDAp.mjs → CompareDrawer-ABv-8FMB.mjs} +2 -2
  16. package/.output/server/_ssr/{ProxyViewerContainer-B__2O0zh.mjs → ProxyViewerContainer-CGX-1aUr.mjs} +56 -103
  17. package/.output/server/_ssr/{ReplayDialog-D0u1VHz_.mjs → ReplayDialog-DD31ftzG.mjs} +3 -3
  18. package/.output/server/_ssr/{RequestAnatomy-ClvQ3RFh.mjs → RequestAnatomy-54kNHAjH.mjs} +2 -2
  19. package/.output/server/_ssr/{ResponseView-B4UAvUym.mjs → ResponseView-CRnibtlX.mjs} +2 -2
  20. package/.output/server/_ssr/{StreamingChunkSequence-D_aiGGzz.mjs → StreamingChunkSequence-Cb5WGfMm.mjs} +2 -2
  21. package/.output/server/_ssr/{index-DuWacKr6.mjs → index-BJ-8DomR.mjs} +2 -2
  22. package/.output/server/_ssr/index.mjs +2 -2
  23. package/.output/server/_ssr/{json-viewer-CmNMVinH.mjs → json-viewer-DB5188I7.mjs} +2 -2
  24. package/.output/server/_ssr/{router-BP46kVrE.mjs → router-BKf70uDr.mjs} +4 -4
  25. package/.output/server/{_tanstack-start-manifest_v-DltuTRfm.mjs → _tanstack-start-manifest_v-DUuf3Rgf.mjs} +1 -1
  26. package/.output/server/index.mjs +65 -65
  27. package/package.json +1 -1
  28. package/src/assets/IDE/claudecode-color.svg +1 -0
  29. package/src/assets/IDE/codex-color.svg +1 -0
  30. package/src/assets/IDE/opencode.svg +1 -0
  31. package/src/assets/IDE/xiaomimimo.svg +1 -0
  32. package/src/assets/logos/opencode.svg +4 -4
  33. package/src/components/ProxyViewerContainer.tsx +26 -31
  34. package/src/components/clients/ClientLogo.tsx +14 -52
  35. package/src/components/proxy-viewer/LogEntryHeader.tsx +1 -7
  36. package/.output/public/assets/index-MfTE52Ty.js +0 -1
  37. package/.output/public/assets/index-Tq5s9NV0.css +0 -1
@@ -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-07T00:47:56.086Z",
41
+ "mtime": "2026-07-07T01:44:02.393Z",
42
42
  "size": 5915,
43
43
  "path": "../public/assets/alibaba-TTwafVwX.svg"
44
44
  },
45
- "/assets/CompareDrawer-BgcAk1te.js": {
45
+ "/assets/index-DRHfTEM5.js": {
46
46
  "type": "text/javascript; charset=utf-8",
47
- "etag": '"4bbf-gA9nBXsloTEIMhmM3ql/4qNmhOs"',
48
- "mtime": "2026-07-07T00:47:56.086Z",
49
- "size": 19391,
50
- "path": "../public/assets/CompareDrawer-BgcAk1te.js"
47
+ "etag": '"74-jyecrF7gPSmV9Dyyu+Pk06C0BLQ"',
48
+ "mtime": "2026-07-07T01:44:02.395Z",
49
+ "size": 116,
50
+ "path": "../public/assets/index-DRHfTEM5.js"
51
51
  },
52
- "/assets/index-DXR7RB48.js": {
52
+ "/assets/CompareDrawer-CufpM7_P.js": {
53
53
  "type": "text/javascript; charset=utf-8",
54
- "etag": '"1cd2c-3SEnnZb993yst8Dzg9UbKuoON3A"',
55
- "mtime": "2026-07-07T00:47:56.086Z",
56
- "size": 118060,
57
- "path": "../public/assets/index-DXR7RB48.js"
54
+ "etag": '"4bbf-em8bNnyNj0hLG9FAPAh3pm1NamQ"',
55
+ "mtime": "2026-07-07T01:44:02.395Z",
56
+ "size": 19391,
57
+ "path": "../public/assets/CompareDrawer-CufpM7_P.js"
58
58
  },
59
- "/assets/json-viewer-CiMN_9sG.js": {
59
+ "/assets/json-viewer-BEifdKM_.js": {
60
60
  "type": "text/javascript; charset=utf-8",
61
- "etag": '"1ae6-uMTpz3tfSXntmUuk5MzHyqBxhWI"',
62
- "mtime": "2026-07-07T00:47:56.086Z",
61
+ "etag": '"1ae6-hBRa+PN4SE41cHLcLLaiFotv3hw"',
62
+ "mtime": "2026-07-07T01:44:02.395Z",
63
63
  "size": 6886,
64
- "path": "../public/assets/json-viewer-CiMN_9sG.js"
65
- },
66
- "/assets/index-Tq5s9NV0.css": {
67
- "type": "text/css; charset=utf-8",
68
- "etag": '"22408-MQKT02eqQudVEj/DozyiEJoTl6E"',
69
- "mtime": "2026-07-07T00:47:56.086Z",
70
- "size": 140296,
71
- "path": "../public/assets/index-Tq5s9NV0.css"
64
+ "path": "../public/assets/json-viewer-BEifdKM_.js"
72
65
  },
73
66
  "/assets/minimax-BPMzvuL-.jpeg": {
74
67
  "type": "image/jpeg",
75
68
  "etag": '"1b06-IwivU89ko5UTMUM1/t7hn4sQK9A"',
76
- "mtime": "2026-07-07T00:47:56.084Z",
69
+ "mtime": "2026-07-07T01:44:02.393Z",
77
70
  "size": 6918,
78
71
  "path": "../public/assets/minimax-BPMzvuL-.jpeg"
79
72
  },
80
- "/assets/index-MfTE52Ty.js": {
73
+ "/assets/index-CpWH7b2O.js": {
81
74
  "type": "text/javascript; charset=utf-8",
82
- "etag": '"74-xI8cgjppS3YpgGFVqBj/+DUVe/4"',
83
- "mtime": "2026-07-07T00:47:56.086Z",
84
- "size": 116,
85
- "path": "../public/assets/index-MfTE52Ty.js"
75
+ "etag": '"1cd2c-aSuLfDqSevdOh9lCun2exVgUC8g"',
76
+ "mtime": "2026-07-07T01:44:02.395Z",
77
+ "size": 118060,
78
+ "path": "../public/assets/index-CpWH7b2O.js"
86
79
  },
87
- "/assets/ReplayDialog-7Pvhjbjk.js": {
80
+ "/assets/ReplayDialog-ClDmxv57.js": {
88
81
  "type": "text/javascript; charset=utf-8",
89
- "etag": '"31d6-WfysEtvfuOApCBk5olHqKk8rMfU"',
90
- "mtime": "2026-07-07T00:47:56.086Z",
82
+ "etag": '"31d6-1qLOktXViz+VBb0ZfFD90XKgcAg"',
83
+ "mtime": "2026-07-07T01:44:02.395Z",
91
84
  "size": 12758,
92
- "path": "../public/assets/ReplayDialog-7Pvhjbjk.js"
85
+ "path": "../public/assets/ReplayDialog-ClDmxv57.js"
93
86
  },
94
- "/assets/main-Ba9x64uY.js": {
87
+ "/assets/index-BskTYcAH.css": {
88
+ "type": "text/css; charset=utf-8",
89
+ "etag": '"21f46-4U6JUUNvf584Sc99yswqBqMf3z4"',
90
+ "mtime": "2026-07-07T01:44:02.395Z",
91
+ "size": 139078,
92
+ "path": "../public/assets/index-BskTYcAH.css"
93
+ },
94
+ "/assets/RequestAnatomy-DcuIghmp.js": {
95
95
  "type": "text/javascript; charset=utf-8",
96
- "etag": '"512fd-xrDcMUYYndBJtS06eXJ9QM25lz4"',
97
- "mtime": "2026-07-07T00:47:56.086Z",
98
- "size": 332541,
99
- "path": "../public/assets/main-Ba9x64uY.js"
96
+ "etag": '"43f2-M8tZkzI/U1tJmMy7UUxJqYQZ0T0"',
97
+ "mtime": "2026-07-07T01:44:02.395Z",
98
+ "size": 17394,
99
+ "path": "../public/assets/RequestAnatomy-DcuIghmp.js"
100
+ },
101
+ "/assets/ResponseView-C7Tl47j3.js": {
102
+ "type": "text/javascript; charset=utf-8",
103
+ "etag": '"47fa-SmStPX5iOJs5uBOW3NqjjFXAHR0"',
104
+ "mtime": "2026-07-07T01:44:02.395Z",
105
+ "size": 18426,
106
+ "path": "../public/assets/ResponseView-C7Tl47j3.js"
100
107
  },
101
- "/assets/StreamingChunkSequence-DzXzVtBF.js": {
108
+ "/assets/StreamingChunkSequence-DBK_R540.js": {
102
109
  "type": "text/javascript; charset=utf-8",
103
- "etag": '"dd6-FSNaNigsd1X+gyqALfVxeG2s4fo"',
104
- "mtime": "2026-07-07T00:47:56.086Z",
110
+ "etag": '"dd6-/eeU62I8t6P7rkzCj6gV8SwwUnU"',
111
+ "mtime": "2026-07-07T01:44:02.395Z",
105
112
  "size": 3542,
106
- "path": "../public/assets/StreamingChunkSequence-DzXzVtBF.js"
113
+ "path": "../public/assets/StreamingChunkSequence-DBK_R540.js"
107
114
  },
108
115
  "/assets/zhipuai-BPNAnxo-.svg": {
109
116
  "type": "image/svg+xml",
110
117
  "etag": '"2bf8-hNaLCTi89nOFCsIIfWpP/jrfo0s"',
111
- "mtime": "2026-07-07T00:47:56.086Z",
118
+ "mtime": "2026-07-07T01:44:02.393Z",
112
119
  "size": 11256,
113
120
  "path": "../public/assets/zhipuai-BPNAnxo-.svg"
114
121
  },
115
- "/assets/RequestAnatomy-BX-UKYQg.js": {
122
+ "/assets/_sessionId-D8Ke-EcI.js": {
116
123
  "type": "text/javascript; charset=utf-8",
117
- "etag": '"43f2-Zq3l43VsakNoYmpaf2yidbFacQg"',
118
- "mtime": "2026-07-07T00:47:56.086Z",
119
- "size": 17394,
120
- "path": "../public/assets/RequestAnatomy-BX-UKYQg.js"
121
- },
122
- "/assets/ResponseView-zFxGX8xH.js": {
123
- "type": "text/javascript; charset=utf-8",
124
- "etag": '"47fa-7HB1lxdpkTuo7BEzpS+JAr6zRjM"',
125
- "mtime": "2026-07-07T00:47:56.086Z",
126
- "size": 18426,
127
- "path": "../public/assets/ResponseView-zFxGX8xH.js"
124
+ "etag": '"36c-bhrib21DhX/XQPRM4CpLNweOg+A"',
125
+ "mtime": "2026-07-07T01:44:02.395Z",
126
+ "size": 876,
127
+ "path": "../public/assets/_sessionId-D8Ke-EcI.js"
128
128
  },
129
- "/assets/_sessionId-CmsUOEIS.js": {
129
+ "/assets/main-DDfExS3_.js": {
130
130
  "type": "text/javascript; charset=utf-8",
131
- "etag": '"36c-oBFmeA36vW57pay3tX7/Tm7ZnGI"',
132
- "mtime": "2026-07-07T00:47:56.086Z",
133
- "size": 876,
134
- "path": "../public/assets/_sessionId-CmsUOEIS.js"
131
+ "etag": '"512fd-0ATXdrVxw9X+97bDd2uILfeMEAs"',
132
+ "mtime": "2026-07-07T01:44:02.395Z",
133
+ "size": 332541,
134
+ "path": "../public/assets/main-DDfExS3_.js"
135
135
  },
136
136
  "/assets/qwen-CONDcHqt.png": {
137
137
  "type": "image/png",
138
138
  "etag": '"572c3-cdJAPaHdOvFCGzuaQjagdgOu6XE"',
139
- "mtime": "2026-07-07T00:47:56.086Z",
139
+ "mtime": "2026-07-07T01:44:02.393Z",
140
140
  "size": 357059,
141
141
  "path": "../public/assets/qwen-CONDcHqt.png"
142
142
  },
143
- "/assets/ProxyViewerContainer-7b_uwvT7.js": {
143
+ "/assets/ProxyViewerContainer-Dppr2zGE.js": {
144
144
  "type": "text/javascript; charset=utf-8",
145
- "etag": '"aef11-9vtbsodrImAt3S4nrgSZgSQRdnc"',
146
- "mtime": "2026-07-07T00:47:56.086Z",
147
- "size": 716561,
148
- "path": "../public/assets/ProxyViewerContainer-7b_uwvT7.js"
145
+ "etag": '"b0044-77SZ4hiJB2hNWaQZFl4OePguEv0"',
146
+ "mtime": "2026-07-07T01:44:02.395Z",
147
+ "size": 720964,
148
+ "path": "../public/assets/ProxyViewerContainer-Dppr2zGE.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": "3.0.1",
3
+ "version": "3.0.3",
4
4
  "type": "module",
5
5
  "description": "Agent observability and knowledge capture layer for AI coding tools.",
6
6
  "license": "MIT",
@@ -0,0 +1 @@
1
+ <svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Claude Code</title><path clip-rule="evenodd" d="M20.998 10.949H24v3.102h-3v3.028h-1.487V20H18v-2.921h-1.487V20H15v-2.921H9V20H7.488v-2.921H6V20H4.487v-2.921H3V14.05H0V10.95h3V5h17.998v5.949zM6 10.949h1.488V8.102H6v2.847zm10.51 0H18V8.102h-1.49v2.847z" fill="#D97757" fill-rule="evenodd"></path></svg>
@@ -0,0 +1 @@
1
+ <svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Codex</title><path d="M19.503 0H4.496A4.496 4.496 0 000 4.496v15.007A4.496 4.496 0 004.496 24h15.007A4.496 4.496 0 0024 19.503V4.496A4.496 4.496 0 0019.503 0z" fill="#fff"></path><path d="M9.064 3.344a4.578 4.578 0 012.285-.312c1 .115 1.891.54 2.673 1.275.01.01.024.017.037.021a.09.09 0 00.043 0 4.55 4.55 0 013.046.275l.047.022.116.057a4.581 4.581 0 012.188 2.399c.209.51.313 1.041.315 1.595a4.24 4.24 0 01-.134 1.223.123.123 0 00.03.115c.594.607.988 1.33 1.183 2.17.289 1.425-.007 2.71-.887 3.854l-.136.166a4.548 4.548 0 01-2.201 1.388.123.123 0 00-.081.076c-.191.551-.383 1.023-.74 1.494-.9 1.187-2.222 1.846-3.711 1.838-1.187-.006-2.239-.44-3.157-1.302a.107.107 0 00-.105-.024c-.388.125-.78.143-1.204.138a4.441 4.441 0 01-1.945-.466 4.544 4.544 0 01-1.61-1.335c-.152-.202-.303-.392-.414-.617a5.81 5.81 0 01-.37-.961 4.582 4.582 0 01-.014-2.298.124.124 0 00.006-.056.085.085 0 00-.027-.048 4.467 4.467 0 01-1.034-1.651 3.896 3.896 0 01-.251-1.192 5.189 5.189 0 01.141-1.6c.337-1.112.982-1.985 1.933-2.618.212-.141.413-.251.601-.33.215-.089.43-.164.646-.227a.098.098 0 00.065-.066 4.51 4.51 0 01.829-1.615 4.535 4.535 0 011.837-1.388zm3.482 10.565a.637.637 0 000 1.272h3.636a.637.637 0 100-1.272h-3.636zM8.462 9.23a.637.637 0 00-1.106.631l1.272 2.224-1.266 2.136a.636.636 0 101.095.649l1.454-2.455a.636.636 0 00.005-.64L8.462 9.23z" fill="url(#lobe-icons-codex-_R_0_)"></path><defs><linearGradient gradientUnits="userSpaceOnUse" id="lobe-icons-codex-_R_0_" x1="12" x2="12" y1="3" y2="21"><stop stop-color="#B1A7FF"></stop><stop offset=".5" stop-color="#7A9DFF"></stop><stop offset="1" stop-color="#3941FF"></stop></linearGradient></defs></svg>
@@ -0,0 +1 @@
1
+ <svg fill="currentColor" fill-rule="evenodd" height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>opencode</title><path d="M16 6H8v12h8V6zm4 16H4V2h16v20z"></path></svg>
@@ -0,0 +1 @@
1
+ <svg fill="currentColor" fill-rule="evenodd" height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>XiaomiMiMo</title><path d="M.958 15.936a.459.459 0 01.459.44v2.729a.46.46 0 01-.918 0v-2.729a.459.459 0 01.459-.44zm4.814-2.035a.46.46 0 01.553.45v4.754a.458.458 0 11-.918 0V15.48L3.74 17.202a.462.462 0 01-.655.016.462.462 0 01-.065-.082L.628 14.67a.459.459 0 01.658-.637l2.124 2.187 2.127-2.188a.46.46 0 01.235-.13zm2.068.004a.46.46 0 01.458.445v4.755a.46.46 0 01-.458.458.459.459 0 01-.458-.458V14.35a.459.459 0 01.458-.445zm1.973 2.014a.46.46 0 01.46.457v2.729a.46.46 0 01-.784.324.46.46 0 01-.134-.324v-2.729a.46.46 0 01.458-.458zm.002-2.045a.458.458 0 01.328.157l2.127 2.19 2.125-2.19a.459.459 0 01.784.318v4.756a.46.46 0 01-.455.458.46.46 0 01-.458-.458V15.48l-1.667 1.723a.46.46 0 01-.65.008l-.005-.005c0-.002-.002-.002-.004-.003l-2.455-2.534a.46.46 0 01-.008-.667.461.461 0 01.338-.128zm6.797 1.206a.46.46 0 01.53.651A1.966 1.966 0 0019.81 18.4a.462.462 0 01.623.18.46.46 0 01-.181.624 2.863 2.863 0 01-1.38.353l-.142-.004a2.88 2.88 0 01-2.393-4.263.461.461 0 01.274-.21zm.864-.931a2.884 2.884 0 013.915 3.914.46.46 0 01-.402.24l-.057-.004a.458.458 0 01-.164-.055.46.46 0 01-.182-.622 1.967 1.967 0 00-2.669-2.67.459.459 0 11-.441-.803zM9.59 6.368c1.481 0 1.696 1.202 1.696 1.654v2.648h-.917v-.432c-.26.346-.792.535-1.36.535-.133 0-1.289-.03-1.384-1.136-.082-.932.675-1.61 2.053-1.61h.691c0-.563-.367-.886-.983-.886-.44.013-.864.174-1.2.458l-.36-.664c.484-.379 1.012-.567 1.764-.567zm4.427.1c1.263 0 2.082.97 2.083 2.15 0 1.181-.824 2.154-2.083 2.154-1.26 0-2.084-.972-2.084-2.152 0-1.18.82-2.153 2.084-2.153zm6.801.015c.68 0 1.202.465 1.197 1.548v2.642H21.1V8.29c0-.312-.002-.98-.63-.98s-.628.667-.628.838v2.524h-.89V8.148c0-.17-.001-.838-.63-.838-.628 0-.628.668-.628.98v2.383h-.917v-4.03h.917V7a1.22 1.22 0 01.947-.516c.398 0 .76.193.982.686a1.321 1.321 0 011.195-.686zm-18.093.872l1.457-1.772H5.32L3.311 8.07l2.14 2.602H4.24L2.725 8.796 1.21 10.672H0L2.138 8.07.13 5.583h1.138l1.458 1.772zm4.149 3.317h-.916V6.644h.916v4.028zm16.99 0h-.916V6.644h.916v4.028zM9.925 8.71c-1.055 0-1.359.412-1.326.742.032.329.324.537.757.537a1.013 1.013 0 001.014-.968l.002-.31h-.447zM14.018 7.3c-.663 0-1.184.487-1.184 1.32 0 .832.52 1.32 1.184 1.32.662 0 1.182-.49 1.182-1.32 0-.832-.52-1.32-1.182-1.32zM6.417 5.001a.568.568 0 01.587.582.588.588 0 01-1.175 0A.57.57 0 016.417 5zm16.991 0a.57.57 0 01.592.582.588.588 0 01-1.174 0 .57.57 0 01.357-.542.572.572 0 01.225-.04z"></path></svg>
@@ -1,4 +1,4 @@
1
- <svg fill="currentColor" fillRule="evenodd" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
2
- <title>OpenCode</title>
3
- <path d="M16 6H8v12h8V6zm4 16H4V2h16v20z"/>
4
- </svg>
1
+ <svg fill="currentColor" fillRule="evenodd" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
2
+ <title>OpenCode</title>
3
+ <path d="M16 6H8v12h8V6zm4 16H4V2h16v20z"/>
4
+ </svg>
@@ -113,7 +113,6 @@ export function filterLogs(
113
113
  const DEBOUNCE_MS = 100;
114
114
  const HASH_SCROLL_ATTEMPTS = 12;
115
115
  const HASH_HIGHLIGHT_MS = 1800;
116
- const MAX_CLIENT_LOGS = 500;
117
116
  const SESSION_PAGE_LIMIT = 100;
118
117
 
119
118
  function buildLogsStreamUrl(sessionId: string | undefined): string {
@@ -160,9 +159,19 @@ function buildLogIndex(logs: readonly CapturedLog[]): Map<number, number> {
160
159
  return idx;
161
160
  }
162
161
 
163
- function trimClientLogs(logs: CapturedLog[]): CapturedLog[] {
164
- if (logs.length <= MAX_CLIENT_LOGS) return logs;
165
- return logs.slice(logs.length - MAX_CLIENT_LOGS);
162
+ export function mergeLogsById(
163
+ previousLogs: readonly CapturedLog[],
164
+ incomingLogs: readonly CapturedLog[],
165
+ ): CapturedLog[] {
166
+ if (incomingLogs.length === 0) return [...previousLogs];
167
+ const byId = new Map<number, CapturedLog>();
168
+ for (const log of previousLogs) {
169
+ byId.set(log.id, log);
170
+ }
171
+ for (const log of incomingLogs) {
172
+ byId.set(log.id, log);
173
+ }
174
+ return [...byId.values()].sort((left, right) => left.id - right.id);
166
175
  }
167
176
 
168
177
  export function ProxyViewerContainer({
@@ -227,25 +236,9 @@ export function ProxyViewerContainer({
227
236
 
228
237
  startLogTransition(() => {
229
238
  setAllLogs((prev) => {
230
- const next = [...prev];
231
- for (const log of updates) {
232
- const indexedPosition = logIndexRef.current.get(log.id);
233
- if (indexedPosition !== undefined && next[indexedPosition]?.id === log.id) {
234
- next[indexedPosition] = log;
235
- continue;
236
- }
237
-
238
- const existingPosition = next.findIndex((entry) => entry.id === log.id);
239
- if (existingPosition >= 0) {
240
- next[existingPosition] = log;
241
- continue;
242
- }
243
-
244
- next.push(log);
245
- }
246
- const trimmed = trimClientLogs(next);
247
- logIndexRef.current = buildLogIndex(trimmed);
248
- return trimmed;
239
+ const next = mergeLogsById(prev, updates);
240
+ logIndexRef.current = buildLogIndex(next);
241
+ return next;
249
242
  });
250
243
  });
251
244
  }, [startLogTransition]);
@@ -288,9 +281,11 @@ export function ProxyViewerContainer({
288
281
  }
289
282
  pendingUpdatesRef.current = [];
290
283
 
291
- const nextLogs = trimClientLogs(update.logs);
292
- logIndexRef.current = buildLogIndex(nextLogs);
293
- setAllLogs(nextLogs);
284
+ setAllLogs((prev) => {
285
+ const nextLogs = mergeLogsById(prev, update.logs);
286
+ logIndexRef.current = buildLogIndex(nextLogs);
287
+ return nextLogs;
288
+ });
294
289
  setStreamInitialized(true);
295
290
  dismissToast();
296
291
  } else if (update.type === "update") {
@@ -517,12 +512,12 @@ export function ProxyViewerContainer({
517
512
 
518
513
  setAllLogs((prev) => {
519
514
  const importedIds = new Set(result.logs.map((log) => log.id));
520
- const next = [...prev.filter((log) => !importedIds.has(log.id)), ...result.logs].sort(
521
- (left, right) => left.id - right.id,
515
+ const next = mergeLogsById(
516
+ prev.filter((log) => !importedIds.has(log.id)),
517
+ result.logs,
522
518
  );
523
- const trimmed = trimClientLogs(next);
524
- logIndexRef.current = buildLogIndex(trimmed);
525
- return trimmed;
519
+ logIndexRef.current = buildLogIndex(next);
520
+ return next;
526
521
  });
527
522
  setSelectedSession(result.sessionId);
528
523
  setSelectedModel("__all__");
@@ -1,5 +1,9 @@
1
1
  import type { JSX } from "react";
2
2
  import { cn } from "../../lib/utils";
3
+ import ClaudeCodeLogoSvg from "../../assets/IDE/claudecode-color.svg";
4
+ import CodexLogoSvg from "../../assets/IDE/codex-color.svg";
5
+ import OpenCodeLogoSvg from "../../assets/IDE/opencode.svg";
6
+ import MiMoCodeLogoSvg from "../../assets/IDE/xiaomimimo.svg";
3
7
 
4
8
  export type ClientApp = "codex" | "opencode" | "mimo-code" | "claude-code" | "unknown";
5
9
 
@@ -56,53 +60,12 @@ export function clientAppLabel(client: ClientApp): string | null {
56
60
  }
57
61
  }
58
62
 
59
- function CodexMark(): JSX.Element {
60
- return (
61
- <svg viewBox="0 0 24 24" className="size-full" aria-hidden="true">
62
- <circle cx="12" cy="12" r="8" fill="none" stroke="currentColor" strokeWidth="2.2" />
63
- <path
64
- d="M14.8 8.6a4.8 4.8 0 1 0 0 6.8"
65
- fill="none"
66
- stroke="currentColor"
67
- strokeLinecap="round"
68
- strokeWidth="2.2"
69
- />
70
- </svg>
71
- );
72
- }
73
-
74
- function OpenCodeMark(): JSX.Element {
75
- return (
76
- <svg viewBox="0 0 24 24" className="size-full" aria-hidden="true">
77
- <path d="M7 4h10v16H7z" fill="none" stroke="currentColor" strokeWidth="2.2" />
78
- <path d="M10 8h4M10 12h4M10 16h2" stroke="currentColor" strokeLinecap="round" />
79
- </svg>
80
- );
81
- }
82
-
83
- function MiMoCodeMark(): JSX.Element {
84
- return (
85
- <svg viewBox="0 0 24 24" className="size-full" aria-hidden="true">
86
- <path
87
- d="M5 18V6h3.2l3.8 6.1L15.8 6H19v12h-3V11.3l-3.1 5h-1.8L8 11.3V18z"
88
- fill="currentColor"
89
- />
90
- </svg>
91
- );
92
- }
93
-
94
- function ClaudeCodeMark(): JSX.Element {
95
- return (
96
- <svg viewBox="0 0 24 24" className="size-full" aria-hidden="true">
97
- <path
98
- fill="currentColor"
99
- fillRule="evenodd"
100
- clipRule="evenodd"
101
- d="M21 10.95h3v3.1h-3v3.03h-1.49V20H18v-2.92h-1.49V20H15v-2.92H9V20H7.49v-2.92H6V20H4.49v-2.92H3v-3.03H0v-3.1h3V5h18v5.95zM6 10.95h1.49V8.1H6v2.85zm10.51 0H18V8.1h-1.49v2.85z"
102
- />
103
- </svg>
104
- );
105
- }
63
+ const CLIENT_LOGOS: Record<Exclude<ClientApp, "unknown">, string> = {
64
+ codex: CodexLogoSvg,
65
+ opencode: OpenCodeLogoSvg,
66
+ "mimo-code": MiMoCodeLogoSvg,
67
+ "claude-code": ClaudeCodeLogoSvg,
68
+ };
106
69
 
107
70
  export function ClientLogo({
108
71
  client,
@@ -111,22 +74,21 @@ export function ClientLogo({
111
74
  client: ClientApp;
112
75
  className?: string;
113
76
  }): JSX.Element | null {
77
+ if (client === "unknown") return null;
114
78
  const label = clientAppLabel(client);
115
79
  if (label === null) return null;
80
+ const logoSrc = CLIENT_LOGOS[client];
116
81
 
117
82
  return (
118
83
  <span
119
84
  className={cn(
120
- "border border-border bg-muted/40 inline-flex size-6 shrink-0 items-center justify-center rounded-md p-1 text-cyan-100",
85
+ "border border-border bg-muted/40 inline-flex size-6 shrink-0 items-center justify-center rounded-md p-0.5",
121
86
  className,
122
87
  )}
123
88
  aria-label={label}
124
89
  title={label}
125
90
  >
126
- {client === "codex" && <CodexMark />}
127
- {client === "opencode" && <OpenCodeMark />}
128
- {client === "mimo-code" && <MiMoCodeMark />}
129
- {client === "claude-code" && <ClaudeCodeMark />}
91
+ <img src={logoSrc} alt="" className="size-full object-contain" aria-hidden="true" />
130
92
  </span>
131
93
  );
132
94
  }
@@ -44,24 +44,19 @@ const STATUS_CUE_CLASSES: Record<
44
44
  StatusCategory,
45
45
  {
46
46
  frame: string;
47
- dot: string;
48
47
  }
49
48
  > = {
50
49
  success: {
51
50
  frame: "border-cyan-200/15 bg-white/[0.04] text-slate-100",
52
- dot: "bg-cyan-200/80 shadow-[0_0_14px_rgba(125,211,252,0.65)]",
53
51
  },
54
52
  client_error: {
55
53
  frame: "border-amber-300/25 bg-amber-300/[0.08] text-amber-100",
56
- dot: "bg-amber-200 shadow-[0_0_14px_rgba(252,211,77,0.8)]",
57
54
  },
58
55
  server_error: {
59
56
  frame: "border-rose-300/25 bg-rose-300/[0.08] text-rose-100",
60
- dot: "bg-rose-300 shadow-[0_0_14px_rgba(253,164,175,0.8)]",
61
57
  },
62
58
  pending: {
63
59
  frame: "border-cyan-300/25 bg-cyan-300/[0.08] text-cyan-100",
64
- dot: "bg-cyan-200 shadow-[0_0_14px_rgba(103,232,249,0.8)]",
65
60
  },
66
61
  };
67
62
 
@@ -247,11 +242,10 @@ export const LogEntryHeader = memo(function ({
247
242
  {/* Request ID */}
248
243
  <span
249
244
  className={cn(
250
- "inline-flex h-8 shrink-0 items-center gap-2 rounded-md px-2 font-mono",
245
+ "inline-flex h-8 shrink-0 items-center rounded-md px-2 font-mono",
251
246
  statusCue.frame,
252
247
  )}
253
248
  >
254
- <span className={cn("size-1.5 rounded-full", statusCue.dot)} aria-hidden="true" />
255
249
  <span className="text-xs font-semibold tabular-nums" title={`Log ID ${String(log.id)}`}>
256
250
  #{displayNumber}
257
251
  </span>
@@ -1 +0,0 @@
1
- import{P as o}from"./ProxyViewerContainer-7b_uwvT7.js";import"./main-Ba9x64uY.js";const r=o;export{r as component};