@sleep2agi/agent-network-dashboard 0.5.3-preview.2 → 0.5.3-preview.200

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 (360) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +3 -3
  3. package/.next/diagnostics/route-bundle-stats.json +32 -32
  4. package/.next/fallback-build-manifest.json +3 -3
  5. package/.next/server/app/_global-error.html +1 -1
  6. package/.next/server/app/_global-error.rsc +1 -1
  7. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  8. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  12. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  13. package/.next/server/app/_not-found.html +2 -2
  14. package/.next/server/app/_not-found.rsc +12 -12
  15. package/.next/server/app/_not-found.segments/_full.segment.rsc +12 -12
  16. package/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
  17. package/.next/server/app/_not-found.segments/_index.segment.rsc +7 -7
  18. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  19. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  20. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  21. package/.next/server/app/admin/page_client-reference-manifest.js +1 -1
  22. package/.next/server/app/admin.html +2 -2
  23. package/.next/server/app/admin.rsc +14 -14
  24. package/.next/server/app/admin.segments/_full.segment.rsc +14 -14
  25. package/.next/server/app/admin.segments/_head.segment.rsc +4 -4
  26. package/.next/server/app/admin.segments/_index.segment.rsc +7 -7
  27. package/.next/server/app/admin.segments/_tree.segment.rsc +2 -2
  28. package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +4 -4
  29. package/.next/server/app/admin.segments/admin.segment.rsc +3 -3
  30. package/.next/server/app/index.html +2 -2
  31. package/.next/server/app/index.rsc +14 -14
  32. package/.next/server/app/index.segments/__PAGE__.segment.rsc +4 -4
  33. package/.next/server/app/index.segments/_full.segment.rsc +14 -14
  34. package/.next/server/app/index.segments/_head.segment.rsc +4 -4
  35. package/.next/server/app/index.segments/_index.segment.rsc +7 -7
  36. package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  37. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  38. package/.next/server/app/login.html +2 -2
  39. package/.next/server/app/login.rsc +14 -14
  40. package/.next/server/app/login.segments/_full.segment.rsc +14 -14
  41. package/.next/server/app/login.segments/_head.segment.rsc +4 -4
  42. package/.next/server/app/login.segments/_index.segment.rsc +7 -7
  43. package/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  44. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +4 -4
  45. package/.next/server/app/login.segments/login.segment.rsc +3 -3
  46. package/.next/server/app/logs/page_client-reference-manifest.js +1 -1
  47. package/.next/server/app/logs.html +2 -2
  48. package/.next/server/app/logs.rsc +14 -14
  49. package/.next/server/app/logs.segments/_full.segment.rsc +14 -14
  50. package/.next/server/app/logs.segments/_head.segment.rsc +4 -4
  51. package/.next/server/app/logs.segments/_index.segment.rsc +7 -7
  52. package/.next/server/app/logs.segments/_tree.segment.rsc +2 -2
  53. package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +4 -4
  54. package/.next/server/app/logs.segments/logs.segment.rsc +3 -3
  55. package/.next/server/app/messages/page_client-reference-manifest.js +1 -1
  56. package/.next/server/app/messages.html +2 -2
  57. package/.next/server/app/messages.rsc +14 -14
  58. package/.next/server/app/messages.segments/_full.segment.rsc +14 -14
  59. package/.next/server/app/messages.segments/_head.segment.rsc +4 -4
  60. package/.next/server/app/messages.segments/_index.segment.rsc +7 -7
  61. package/.next/server/app/messages.segments/_tree.segment.rsc +2 -2
  62. package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +4 -4
  63. package/.next/server/app/messages.segments/messages.segment.rsc +3 -3
  64. package/.next/server/app/node/page_client-reference-manifest.js +1 -1
  65. package/.next/server/app/node.html +2 -2
  66. package/.next/server/app/node.rsc +14 -14
  67. package/.next/server/app/node.segments/_full.segment.rsc +14 -14
  68. package/.next/server/app/node.segments/_head.segment.rsc +4 -4
  69. package/.next/server/app/node.segments/_index.segment.rsc +7 -7
  70. package/.next/server/app/node.segments/_tree.segment.rsc +2 -2
  71. package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +4 -4
  72. package/.next/server/app/node.segments/node.segment.rsc +3 -3
  73. package/.next/server/app/nodes/page_client-reference-manifest.js +1 -1
  74. package/.next/server/app/nodes.html +2 -2
  75. package/.next/server/app/nodes.rsc +14 -14
  76. package/.next/server/app/nodes.segments/_full.segment.rsc +14 -14
  77. package/.next/server/app/nodes.segments/_head.segment.rsc +4 -4
  78. package/.next/server/app/nodes.segments/_index.segment.rsc +7 -7
  79. package/.next/server/app/nodes.segments/_tree.segment.rsc +2 -2
  80. package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +4 -4
  81. package/.next/server/app/nodes.segments/nodes.segment.rsc +3 -3
  82. package/.next/server/app/page_client-reference-manifest.js +1 -1
  83. package/.next/server/app/server-logs/page_client-reference-manifest.js +1 -1
  84. package/.next/server/app/server-logs.html +2 -2
  85. package/.next/server/app/server-logs.rsc +14 -14
  86. package/.next/server/app/server-logs.segments/_full.segment.rsc +14 -14
  87. package/.next/server/app/server-logs.segments/_head.segment.rsc +4 -4
  88. package/.next/server/app/server-logs.segments/_index.segment.rsc +7 -7
  89. package/.next/server/app/server-logs.segments/_tree.segment.rsc +2 -2
  90. package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +4 -4
  91. package/.next/server/app/server-logs.segments/server-logs.segment.rsc +3 -3
  92. package/.next/server/app/settings/networks/page_client-reference-manifest.js +1 -1
  93. package/.next/server/app/settings/networks.html +2 -2
  94. package/.next/server/app/settings/networks.rsc +14 -14
  95. package/.next/server/app/settings/networks.segments/_full.segment.rsc +14 -14
  96. package/.next/server/app/settings/networks.segments/_head.segment.rsc +4 -4
  97. package/.next/server/app/settings/networks.segments/_index.segment.rsc +7 -7
  98. package/.next/server/app/settings/networks.segments/_tree.segment.rsc +2 -2
  99. package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +4 -4
  100. package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +3 -3
  101. package/.next/server/app/settings/networks.segments/settings.segment.rsc +3 -3
  102. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  103. package/.next/server/app/settings/tokens/page_client-reference-manifest.js +1 -1
  104. package/.next/server/app/settings/tokens.html +2 -2
  105. package/.next/server/app/settings/tokens.rsc +14 -14
  106. package/.next/server/app/settings/tokens.segments/_full.segment.rsc +14 -14
  107. package/.next/server/app/settings/tokens.segments/_head.segment.rsc +4 -4
  108. package/.next/server/app/settings/tokens.segments/_index.segment.rsc +7 -7
  109. package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +2 -2
  110. package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +4 -4
  111. package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +3 -3
  112. package/.next/server/app/settings/tokens.segments/settings.segment.rsc +3 -3
  113. package/.next/server/app/settings.html +2 -2
  114. package/.next/server/app/settings.rsc +14 -14
  115. package/.next/server/app/settings.segments/_full.segment.rsc +14 -14
  116. package/.next/server/app/settings.segments/_head.segment.rsc +4 -4
  117. package/.next/server/app/settings.segments/_index.segment.rsc +7 -7
  118. package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  119. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +4 -4
  120. package/.next/server/app/settings.segments/settings.segment.rsc +3 -3
  121. package/.next/server/app/tasks/[id]/page_client-reference-manifest.js +1 -1
  122. package/.next/server/app/tasks/page_client-reference-manifest.js +1 -1
  123. package/.next/server/app/tasks.html +2 -2
  124. package/.next/server/app/tasks.rsc +14 -14
  125. package/.next/server/app/tasks.segments/_full.segment.rsc +14 -14
  126. package/.next/server/app/tasks.segments/_head.segment.rsc +4 -4
  127. package/.next/server/app/tasks.segments/_index.segment.rsc +7 -7
  128. package/.next/server/app/tasks.segments/_tree.segment.rsc +2 -2
  129. package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +4 -4
  130. package/.next/server/app/tasks.segments/tasks.segment.rsc +3 -3
  131. package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js +1 -1
  132. package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js.map +1 -1
  133. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js +4 -4
  134. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js.map +1 -1
  135. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js +1 -1
  136. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js.map +1 -1
  137. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js +1 -1
  138. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js.map +1 -1
  139. package/.next/server/chunks/ssr/agent-network-dashboard_app_components_0mvyi-4._.js +1 -1
  140. package/.next/server/chunks/ssr/agent-network-dashboard_app_components_0mvyi-4._.js.map +1 -1
  141. package/.next/server/middleware-build-manifest.js +3 -3
  142. package/.next/server/pages/404.html +2 -2
  143. package/.next/server/pages/500.html +1 -1
  144. package/.next/static/chunks/{05zlv0iopwd40.js → 01he.jfmupx6b.js} +1 -1
  145. package/.next/static/chunks/047xfmz-_yklx.js +1 -0
  146. package/.next/static/chunks/08.zg.lu3fwqw.js +4 -0
  147. package/.next/static/chunks/0_c5~297u5j0p.js +1 -0
  148. package/.next/static/chunks/{03a4--7ncekmk.js → 0v4-5tng.uh.7.js} +2 -2
  149. package/.next/static/chunks/17if82x7mcn4j.css +2 -0
  150. package/.next/trace +2 -2
  151. package/.next/trace-build +1 -1
  152. package/app/components/ServersDrawer.tsx +16 -3
  153. package/app/components/TopoGraph.tsx +5343 -182
  154. package/app/globals.css +228 -6
  155. package/package.json +4 -4
  156. package/scripts/p157-servers-copy-test.mjs +95 -0
  157. package/scripts/topo-active-chrome-hover-text-test.mjs +107 -0
  158. package/scripts/topo-active-links-chip-halo-layers-test.mjs +81 -0
  159. package/scripts/topo-alias-chat-brightness-test.mjs +79 -0
  160. package/scripts/topo-alias-glow-test.mjs +121 -0
  161. package/scripts/topo-alias-text-halo-layers-test.mjs +98 -0
  162. package/scripts/topo-avatar-brightness-test.mjs +116 -0
  163. package/scripts/topo-avatar-chat-gate-test.mjs +77 -0
  164. package/scripts/topo-avatar-drop-shadow-test.mjs +86 -0
  165. package/scripts/topo-avatar-fallback-hover-test.mjs +104 -0
  166. package/scripts/topo-avatar-fallback-rotate-test.mjs +92 -0
  167. package/scripts/topo-avatar-rotate-test.mjs +85 -0
  168. package/scripts/topo-avatar-scale-test.mjs +89 -0
  169. package/scripts/topo-badge-chat-gate-test.mjs +74 -0
  170. package/scripts/topo-brand-drop-shadow-test.mjs +71 -0
  171. package/scripts/topo-brand-logo-breath-test.mjs +102 -0
  172. package/scripts/topo-brand-logo-halo-layers-test.mjs +85 -0
  173. package/scripts/topo-brand-logo-hover-brightness-test.mjs +105 -0
  174. package/scripts/topo-brand-logo-hover-rotate-test.mjs +93 -0
  175. package/scripts/topo-brand-logo-hover-test.mjs +85 -0
  176. package/scripts/topo-card-chat-brightness-test.mjs +86 -0
  177. package/scripts/topo-chat-ring-breath-curve-test.mjs +114 -0
  178. package/scripts/topo-chat-ring-brightness-test.mjs +80 -0
  179. package/scripts/topo-chat-ring-halo-layers-test.mjs +100 -0
  180. package/scripts/topo-chat-ring-r-breath-test.mjs +121 -0
  181. package/scripts/topo-chat-ring-status-halo-test.mjs +106 -0
  182. package/scripts/topo-chat-ring-sw-breath-test.mjs +123 -0
  183. package/scripts/topo-chip-row-digit-ls-test.mjs +135 -0
  184. package/scripts/topo-chip-row-member-alias-lit-test.mjs +154 -0
  185. package/scripts/topo-chip-row-press-test.mjs +93 -0
  186. package/scripts/topo-chip-row-tier-glow-brightness-test.mjs +99 -0
  187. package/scripts/topo-chip-row-unit-hover-tracking-test.mjs +124 -0
  188. package/scripts/topo-chrome-control-halo-layers-test.mjs +22 -0
  189. package/scripts/topo-chrome-press-fullstrip-test.mjs +105 -0
  190. package/scripts/topo-chrome-press-scale-test.mjs +100 -0
  191. package/scripts/topo-click-ripple-glow-test.mjs +86 -0
  192. package/scripts/topo-click-ripple-halo-layers-test.mjs +79 -0
  193. package/scripts/topo-click-ripple-sw-test.mjs +110 -0
  194. package/scripts/topo-cluster-count-attr-test.mjs +80 -0
  195. package/scripts/topo-crescent-breath-test.mjs +104 -0
  196. package/scripts/topo-crescent-recede-test.mjs +111 -0
  197. package/scripts/topo-dense-alias-halo-layers-test.mjs +80 -0
  198. package/scripts/topo-edge-badge-circle-brightness-test.mjs +82 -0
  199. package/scripts/topo-edge-badge-circle-hot-pulse-test.mjs +100 -0
  200. package/scripts/topo-edge-badge-digit-halo-layers-test.mjs +107 -0
  201. package/scripts/topo-edge-badge-endpoint-gate-test.mjs +94 -0
  202. package/scripts/topo-edge-badge-halo-layers-test.mjs +85 -0
  203. package/scripts/topo-edge-badge-hot-pulse-test.mjs +92 -0
  204. package/scripts/topo-edge-badge-hover-glow-test.mjs +90 -0
  205. package/scripts/topo-edge-badge-text-brightness-test.mjs +83 -0
  206. package/scripts/topo-edge-chat-gate-test.mjs +71 -0
  207. package/scripts/topo-edge-flow-rail-halo-layers-test.mjs +89 -0
  208. package/scripts/topo-edge-particle-brightness-test.mjs +82 -0
  209. package/scripts/topo-edge-particle-halo-layers-test.mjs +91 -0
  210. package/scripts/topo-edge-pill-glow-test.mjs +67 -0
  211. package/scripts/topo-edge-visible-brightness-test.mjs +84 -0
  212. package/scripts/topo-edge-visible-halo-layers-test.mjs +87 -0
  213. package/scripts/topo-endpoint-ring-brightness-test.mjs +83 -0
  214. package/scripts/topo-endpoint-ring-flow-halo-test.mjs +107 -0
  215. package/scripts/topo-endpoint-ring-halo-layers-test.mjs +100 -0
  216. package/scripts/topo-filter-pill-glow-test.mjs +90 -0
  217. package/scripts/topo-filter-pill-halo-layers-test.mjs +27 -0
  218. package/scripts/topo-filter-pills-press-test.mjs +96 -0
  219. package/scripts/topo-fleet-density-tier-test.mjs +84 -0
  220. package/scripts/topo-flow-arrow-brightness-test.mjs +82 -0
  221. package/scripts/topo-flow-rail-brightness-test.mjs +80 -0
  222. package/scripts/topo-focus-outline-transition-test.mjs +107 -0
  223. package/scripts/topo-freshness-chip-fade-test.mjs +105 -0
  224. package/scripts/topo-fullscreen-attr-test.mjs +73 -0
  225. package/scripts/topo-fullscreen-brightness-test.mjs +84 -0
  226. package/scripts/topo-fullscreen-icon-rotate-test.mjs +93 -0
  227. package/scripts/topo-grid-content-bottom-attr-test.mjs +72 -0
  228. package/scripts/topo-group-box-brightness-test.mjs +84 -0
  229. package/scripts/topo-group-box-halo-layers-test.mjs +91 -0
  230. package/scripts/topo-group-chat-gate-test.mjs +77 -0
  231. package/scripts/topo-group-label-brightness-test.mjs +84 -0
  232. package/scripts/topo-group-label-halo-layers-test.mjs +78 -0
  233. package/scripts/topo-group-label-hover-glow-test.mjs +86 -0
  234. package/scripts/topo-group-label-member-alias-hover-test.mjs +125 -0
  235. package/scripts/topo-group-pill-glow-test.mjs +76 -0
  236. package/scripts/topo-group-tint-brightness-test.mjs +82 -0
  237. package/scripts/topo-halo-chat-gate-test.mjs +72 -0
  238. package/scripts/topo-hub-core-brightness-test.mjs +82 -0
  239. package/scripts/topo-hub-core-halo-layers-test.mjs +81 -0
  240. package/scripts/topo-hub-digit-brightness-test.mjs +79 -0
  241. package/scripts/topo-hub-digit-halo-layers-test.mjs +76 -0
  242. package/scripts/topo-hub-digit-ls-test.mjs +119 -0
  243. package/scripts/topo-hub-halo-brightness-test.mjs +80 -0
  244. package/scripts/topo-hub-halo-glow-test.mjs +96 -0
  245. package/scripts/topo-hub-halo-halo-layers-test.mjs +76 -0
  246. package/scripts/topo-hub-highlight-amplify-test.mjs +139 -0
  247. package/scripts/topo-hub-highlight-brightness-test.mjs +84 -0
  248. package/scripts/topo-hub-highlight-fill-transition-test.mjs +84 -0
  249. package/scripts/topo-hub-highlight-glow-test.mjs +99 -0
  250. package/scripts/topo-hub-highlight-halo-layers-test.mjs +78 -0
  251. package/scripts/topo-hub-highlight-r-test.mjs +112 -0
  252. package/scripts/topo-hub-highlight-recede-test.mjs +144 -0
  253. package/scripts/topo-hub-highlight-theme-fill-test.mjs +83 -0
  254. package/scripts/topo-hub-hover-ring-brightness-test.mjs +79 -0
  255. package/scripts/topo-hub-hover-ring-glow-test.mjs +97 -0
  256. package/scripts/topo-hub-hover-ring-halo-layers-test.mjs +71 -0
  257. package/scripts/topo-hub-idle-breath-test.mjs +109 -0
  258. package/scripts/topo-hub-recede-test.mjs +124 -0
  259. package/scripts/topo-hub-spoke-brightness-test.mjs +77 -0
  260. package/scripts/topo-hub-spoke-glow-test.mjs +112 -0
  261. package/scripts/topo-hub-spoke-halo-layers-test.mjs +97 -0
  262. package/scripts/topo-hub-spoke-self-filter-test.mjs +119 -0
  263. package/scripts/topo-kicker-halo-layers-test.mjs +82 -0
  264. package/scripts/topo-label-card-brightness-test.mjs +81 -0
  265. package/scripts/topo-layout-hover-fw-test.mjs +98 -0
  266. package/scripts/topo-layout-toggle-brightness-test.mjs +94 -0
  267. package/scripts/topo-layout-toggle-halo-layers-test.mjs +95 -0
  268. package/scripts/topo-legend-count-brightness-test.mjs +80 -0
  269. package/scripts/topo-legend-count-halo-layers-test.mjs +79 -0
  270. package/scripts/topo-legend-count-letter-spacing-test.mjs +108 -0
  271. package/scripts/topo-legend-label-fw-test.mjs +107 -0
  272. package/scripts/topo-legend-pin-ring-brightness-test.mjs +82 -0
  273. package/scripts/topo-legend-pin-ring-halo-layers-test.mjs +71 -0
  274. package/scripts/topo-legend-row-count-brightness-test.mjs +85 -0
  275. package/scripts/topo-legend-row-label-glow-test.mjs +102 -0
  276. package/scripts/topo-legend-swatch-glow-test.mjs +109 -0
  277. package/scripts/topo-legend-swatch-member-alias-match-test.mjs +139 -0
  278. package/scripts/topo-legend-tint-brightness-test.mjs +83 -0
  279. package/scripts/topo-legend-trio-halo-layers-test.mjs +22 -0
  280. package/scripts/topo-minimap-dot-chat-gate-test.mjs +81 -0
  281. package/scripts/topo-minimap-hover-glow-test.mjs +109 -0
  282. package/scripts/topo-minimap-viewport-brightness-test.mjs +84 -0
  283. package/scripts/topo-minimap-viewport-halo-layers-test.mjs +24 -0
  284. package/scripts/topo-more-footer-brightness-test.mjs +94 -0
  285. package/scripts/topo-node-alias-brightness-test.mjs +84 -0
  286. package/scripts/topo-node-avatar-halo-layers-test.mjs +25 -0
  287. package/scripts/topo-node-hover-ring-halo-layers-test.mjs +70 -0
  288. package/scripts/topo-node-sub-text-brightness-test.mjs +88 -0
  289. package/scripts/topo-nodesize-brightness-test.mjs +82 -0
  290. package/scripts/topo-nodesize-halo-layers-test.mjs +89 -0
  291. package/scripts/topo-nodesize-hover-fw-test.mjs +99 -0
  292. package/scripts/topo-orphan-box-dash-test.mjs +89 -0
  293. package/scripts/topo-orphan-fill-opacity-test.mjs +91 -0
  294. package/scripts/topo-orphan-label-italic-test.mjs +90 -0
  295. package/scripts/topo-orphan-label-opacity-test.mjs +98 -0
  296. package/scripts/topo-panel-count-halo-layers-test.mjs +91 -0
  297. package/scripts/topo-panel-count-hover-ls-test.mjs +87 -0
  298. package/scripts/topo-panel-row-brightness-test.mjs +116 -0
  299. package/scripts/topo-panel-title-brightness-test.mjs +98 -0
  300. package/scripts/topo-panel-title-glow-test.mjs +111 -0
  301. package/scripts/topo-panel-titles-halo-layers-test.mjs +23 -0
  302. package/scripts/topo-pill-x-rotate-test.mjs +96 -0
  303. package/scripts/topo-pinned-aspect-test.mjs +89 -0
  304. package/scripts/topo-pip-brightness-test.mjs +85 -0
  305. package/scripts/topo-pressure-bar-halo-layers-test.mjs +19 -0
  306. package/scripts/topo-pressure-seg-glow-test.mjs +92 -0
  307. package/scripts/topo-pressure-seg-member-alias-match-test.mjs +133 -0
  308. package/scripts/topo-pressure-seg-motion-test.mjs +101 -0
  309. package/scripts/topo-recent-count-brightness-test.mjs +84 -0
  310. package/scripts/topo-recent-hot-pulse-test.mjs +102 -0
  311. package/scripts/topo-recent-more-fw-test.mjs +126 -0
  312. package/scripts/topo-recent-more-halo-layers-test.mjs +90 -0
  313. package/scripts/topo-recent-panel-hot-pulse-test.mjs +105 -0
  314. package/scripts/topo-recent-pip-halo-layers-test.mjs +82 -0
  315. package/scripts/topo-recent-row-chat-gate-test.mjs +75 -0
  316. package/scripts/topo-recent-row-content-lift-test.mjs +140 -0
  317. package/scripts/topo-recent-row-fw-test.mjs +115 -0
  318. package/scripts/topo-recent-row-text-glow-test.mjs +86 -0
  319. package/scripts/topo-recent-row-text-halo-layers-test.mjs +67 -0
  320. package/scripts/topo-recent-tint-brightness-test.mjs +80 -0
  321. package/scripts/topo-recent-ts-brightness-test.mjs +86 -0
  322. package/scripts/topo-reduced-motion-attr-test.mjs +69 -0
  323. package/scripts/topo-reset-brightness-test.mjs +83 -0
  324. package/scripts/topo-reset-icon-hover-scale-test.mjs +102 -0
  325. package/scripts/topo-runtime-badge-brightness-test.mjs +78 -0
  326. package/scripts/topo-runtime-badge-glow-test.mjs +108 -0
  327. package/scripts/topo-runtime-badge-halo-layers-test.mjs +87 -0
  328. package/scripts/topo-runtime-badge-rotate-test.mjs +85 -0
  329. package/scripts/topo-section-title-halo-layers-test.mjs +88 -0
  330. package/scripts/topo-spoke-chat-gate-test.mjs +72 -0
  331. package/scripts/topo-starfield-hue-test.mjs +109 -0
  332. package/scripts/topo-status-pin-pill-halo-layers-test.mjs +17 -0
  333. package/scripts/topo-status-ring-brightness-test.mjs +84 -0
  334. package/scripts/topo-status-ring-chat-gate-test.mjs +72 -0
  335. package/scripts/topo-status-ring-halo-layers-test.mjs +105 -0
  336. package/scripts/topo-status-ring-status-halo-test.mjs +110 -0
  337. package/scripts/topo-sub-text-chat-brightness-test.mjs +81 -0
  338. package/scripts/topo-svg-focus-transition-test.mjs +105 -0
  339. package/scripts/topo-titleblock-h2-hover-fw-test.mjs +109 -0
  340. package/scripts/topo-titleblock-h2-hover-tracking-test.mjs +128 -0
  341. package/scripts/topo-titleblock-kicker-hover-test.mjs +134 -0
  342. package/scripts/topo-vendor-activelinks-press-test.mjs +100 -0
  343. package/scripts/topo-vendor-chip-glow-test.mjs +97 -0
  344. package/scripts/topo-vendor-chip-halo-layers-test.mjs +18 -0
  345. package/scripts/topo-vendor-letter-halo-layers-test.mjs +93 -0
  346. package/scripts/topo-vendor-pill-glow-test.mjs +98 -0
  347. package/scripts/topo-watermark-breath-test.mjs +100 -0
  348. package/scripts/topo-watermark-recede-test.mjs +114 -0
  349. package/scripts/topo-zoom-buttons-brightness-test.mjs +94 -0
  350. package/scripts/topo-zoom-in-out-halo-layers-test.mjs +97 -0
  351. package/scripts/topo-zoom-level-brightness-test.mjs +83 -0
  352. package/scripts/topo-zoom-level-color-test.mjs +105 -0
  353. package/scripts/topo-zoom-level-halo-layers-test.mjs +78 -0
  354. package/.next/static/chunks/0a4hmfvj-81x5.css +0 -2
  355. package/.next/static/chunks/0a~3lmgl2.3sm.js +0 -4
  356. package/.next/static/chunks/0w_zjois27-bj.js +0 -1
  357. package/.next/static/chunks/11vp-~kvgz81f.js +0 -1
  358. /package/.next/static/{AQG7LOsK4d0T0j2nFonEh → N193Pg2TkoL0c6mKNfKm_}/_buildManifest.js +0 -0
  359. /package/.next/static/{AQG7LOsK4d0T0j2nFonEh → N193Pg2TkoL0c6mKNfKm_}/_clientMiddlewareManifest.js +0 -0
  360. /package/.next/static/{AQG7LOsK4d0T0j2nFonEh → N193Pg2TkoL0c6mKNfKm_}/_ssgManifest.js +0 -0
package/app/globals.css CHANGED
@@ -863,6 +863,29 @@ body {
863
863
  transform-box: fill-box;
864
864
  }
865
865
 
866
+ /* Round 498 — recent-signal row hot-count subtle pulse (信息密度 +
867
+ 呼吸感 themes). When a row's edge count crosses the hot threshold
868
+ (≥ 10), the existing R127/R320/R445 amber-fill + fw-700 typography
869
+ already calls attention; R498 adds a slow 3s opacity breath (0.85 ↔
870
+ 1.0) on the digit so the hot tspans gently pulse — at-a-glance scan
871
+ of the panel reads "high-traffic lane right here" with motion in
872
+ addition to color+weight. 3s cycle is deliberate: faster (1-2s)
873
+ would compete with the working-status halo cadence; slower (5s+)
874
+ would lose the "alive" signal. Amplitude 15% (matches R497 hub-
875
+ highlight breath idiom).
876
+ prefers-reduced-motion handled by the R29 blanket override
877
+ (animation-duration: 0.001ms !important) — no per-class guard
878
+ needed. The component-side gate (`!reducedMotion && isHot`)
879
+ ensures the className is only applied when both conditions hold,
880
+ so even without the blanket the no-motion preference is respected. */
881
+ @keyframes anet-recent-hot-pulse-kf {
882
+ 0%, 100% { opacity: 0.85; }
883
+ 50% { opacity: 1; }
884
+ }
885
+ .anet-recent-hot-pulse {
886
+ animation: anet-recent-hot-pulse-kf 3s ease-in-out infinite;
887
+ }
888
+
866
889
  /* Round 36 — current-step ring pulse on TaskDrawer timeline. Halo gently
867
890
  breathes around the active step's dot so users can spot "task is here". */
868
891
  @keyframes anet-current-step-pulse-kf {
@@ -900,10 +923,72 @@ body {
900
923
  and doesn't fight box-shadow, so we use it here. `currentColor`
901
924
  inherits the chip's own accent (green for working, cyan for online,
902
925
  per-vendor for letters, etc.). Only fires on :focus-visible
903
- (keyboard) — mouse focus stays unstyled. */
904
- .anet-topo-chip-focus:focus-visible {
905
- outline: 2px solid currentColor;
926
+ (keyboard) — mouse focus stays unstyled.
927
+ Round 490 / Loop — focus outline transitions on color rather than
928
+ hard-cutting. Pre-R490 the keyboard focus ring snapped in/out
929
+ instantly (no `transition` declaration), while every other hover/
930
+ pin state on the same chip eased through the Hero D 200ms ease-out
931
+ vocabulary (R459-R475 cluster + R489 hover ring). Keyboard users
932
+ tabbing through chips saw discontinuous focus jumps — pointer
933
+ users saw smooth motion. R490 unifies the two by holding a
934
+ permanent transparent outline (no painted footprint, no layout
935
+ shift — `outline` is drawn outside the border-box and doesn't
936
+ trigger reflow) and transitioning ONLY outline-color when focus
937
+ arrives/leaves. The cyber-theme dark canvas keyboard nav now
938
+ reads as one motion vocabulary with pointer hover. */
939
+ .anet-topo-chip-focus {
940
+ outline: 2px solid transparent;
906
941
  outline-offset: 1px;
942
+ /* R490 (revised) — Tailwind utility classes on the chips (transition-
943
+ colors / transition-transform / duration-200) set their own
944
+ `transition-property` list at the same selector specificity (0,1,0),
945
+ and since Tailwind's stylesheet loads after globals.css they win
946
+ the cascade — without `!important` my outline-color transition is
947
+ ignored. The unified list below replaces Tailwind's narrower list
948
+ with a superset (color, bg, border, opacity, box-shadow, transform
949
+ all preserved) plus `outline-color` for R490. All at 200ms ease-
950
+ out, matching the chip-row's existing Tailwind duration-200 ease-
951
+ out so visible animations on the chip are unchanged.
952
+
953
+ Round 524 / Loop — CORRECTION + bug fix.
954
+ R490's original 'trade-off' note read:
955
+ 'chips with inline style.transition (R210 pressure-bar
956
+ segments at 220ms width / 150ms boxShadow / 150ms filter)
957
+ keep their inline value because inline style wins over class
958
+ rules regardless of !important.'
959
+ That was WRONG about CSS cascade. Per the spec, `!important`
960
+ author declarations DO override normal-priority inline-style
961
+ declarations. So R490's transition-property list silently
962
+ dropped every inline transition that targeted a property NOT
963
+ in this class's list — including R165's width 220ms tween on
964
+ the pressure-bar segments AND R210's filter brightness(1.2)
965
+ hover on those same segments. Both motion polishes have been
966
+ silently broken (snapping instead of easing) since R490
967
+ landed; banked as test-craft lesson in R523.
968
+ R524 fixes by extending the transition-property list to
969
+ include `width` and `filter` so the pressure-bar segments
970
+ (and any future chip-focus surface with width/filter motion)
971
+ animate per the class's unified 200ms ease-out. The cadence
972
+ shift (R165's 220ms → 200ms, R210's 150ms → 200ms) loses 20-
973
+ 50ms of intent precision but slots into the dashboard's
974
+ uniform 200ms motion vocabulary the rest of the chip family
975
+ already uses — net visible improvement (motion was DEAD,
976
+ now eases at 200ms; that's a strictly better state than
977
+ snapping).
978
+ Other chip-focus surfaces (filter pills, online/working
979
+ chips, minimap container, "+N more" footer's <g>) don't
980
+ change width or filter at runtime, so adding these
981
+ properties to the list is a no-op for them. */
982
+ transition-property:
983
+ outline-color, color, background-color, border-color,
984
+ text-decoration-color, fill, stroke, opacity, box-shadow, transform,
985
+ width, filter
986
+ !important;
987
+ transition-duration: 200ms !important;
988
+ transition-timing-function: ease-out !important;
989
+ }
990
+ .anet-topo-chip-focus:focus-visible {
991
+ outline-color: currentColor;
907
992
  }
908
993
 
909
994
  /* R156 — focus-visible outline for SVG-side TopoGraph interactives.
@@ -914,10 +999,35 @@ body {
914
999
  R144/R151/R152). Browser default focus outline on SVG is hard
915
1000
  to spot against the canvas; explicit cyan-300 ring matches the
916
1001
  dashboard's legendAccent. 2-px outline-offset gives breathing
917
- room around the painted bounding box. */
918
- .anet-topo-svg-focus:focus-visible {
919
- outline: 2px solid #67e8f9;
1002
+ room around the painted bounding box.
1003
+ Round 491 / Loop — SVG-side counterpart to R490's chip-focus
1004
+ outline-color transition. Pre-R491 keyboard focus on SVG g
1005
+ elements (recent rows, legend rows, group labels, edge badges,
1006
+ nodes, "+N more") snapped instantly; HTML chips (post-R490) now
1007
+ ease through 200ms ease-out but SVG g still hard-cut. Same
1008
+ baseline-transparent + transition-outline-color recipe brings
1009
+ the SVG canvas into the unified keyboard motion vocabulary —
1010
+ keyboard users tabbing between chip-row and SVG canvas see
1011
+ ONE smooth fade timing instead of HTML-smooth-then-SVG-snap.
1012
+ The cyan-300 (#67e8f9) target color matches R156's original
1013
+ choice (legendAccent visual identity); only the transition
1014
+ timing is new.
1015
+ Note on cascade: SVG g elements rarely carry Tailwind
1016
+ transition-* utility classes (Tailwind defaults are HTML-
1017
+ centric), so the (0,1,0) specificity of .anet-topo-svg-focus
1018
+ typically wins without !important. Adding !important defensively
1019
+ anyway since the React component may add future inline styles
1020
+ or Tailwind classes. Same trade-off as R490 (inline
1021
+ style.transition still wins if added). */
1022
+ .anet-topo-svg-focus {
1023
+ outline: 2px solid transparent;
920
1024
  outline-offset: 2px;
1025
+ transition-property: outline-color !important;
1026
+ transition-duration: 200ms !important;
1027
+ transition-timing-function: ease-out !important;
1028
+ }
1029
+ .anet-topo-svg-focus:focus-visible {
1030
+ outline-color: #67e8f9;
921
1031
  }
922
1032
 
923
1033
  /* Round 46 — animated dashed spokes flowing from hub outward. Each spoke
@@ -964,6 +1074,118 @@ body {
964
1074
  animation-iteration-count: infinite;
965
1075
  }
966
1076
 
1077
+ /* Round 553 — title-block brand logo subtle idle breath.
1078
+ 5th anchor in the 呼吸感 breath family — cadence ladder:
1079
+ row hot 3s
1080
+ hub idle 4s
1081
+ brand logo 5s ← this round
1082
+ watermark 6s
1083
+ crescent 7s
1084
+ Pure opacity breath (0.92 ↔ 1, ~8% delta) on the title-block
1085
+ crescent SVG so the brand mark reads as a "living mark" at
1086
+ rest. Composes cleanly with R548 hover:scale-105 +
1087
+ R549 hover:rotate-6 (independent properties: opacity vs
1088
+ scale/rotate; the moon keeps breathing as it lifts on hover).
1089
+ prefers-reduced-motion handled by R29 blanket override —
1090
+ animation-duration → 0.001ms neutralises the keyframe without
1091
+ killing the static opacity baseline. Component-side gate also
1092
+ applied (`!reducedMotion` toggles the className) as canonical
1093
+ TopoGraph breath pattern (sibling to R130 hub idle / R519
1094
+ watermark / R326 crescent breath gates). */
1095
+ @keyframes anet-topo-brand-logo-breath-kf {
1096
+ 0%, 100% { opacity: 1; }
1097
+ 50% { opacity: 0.92; }
1098
+ }
1099
+ .anet-topo-brand-logo-breath {
1100
+ animation: anet-topo-brand-logo-breath-kf 5s ease-in-out infinite;
1101
+ }
1102
+
1103
+ /* Round 683 — brand 书生 logo extends single-layer drop-shadow hover
1104
+ (R604, Tailwind `hover:drop-shadow-[0_0_8px_currentColor]`) to the
1105
+ multi-layer halo family vocabulary: near 8px + far 16px (2× blur
1106
+ stride) at currentColor (inherits inline style.color = teal #0d9488
1107
+ / cyan #67e8f9), stacked with brightness(1.10). Matches R642-R667
1108
+ 0.5×-falloff convention by using currentColor for both layers —
1109
+ the same hue at native alpha layers up because drop-shadow alpha
1110
+ accumulates additively when stacked.
1111
+ Pure CSS `:hover` so no new React state needed; the SVG element
1112
+ listens via its own pseudo-class. Inline transition list already
1113
+ covers `filter 200ms ease-out` (R557) so the multi-layer halo eases
1114
+ under the same cadence. Tailwind v4 utility composition for multi-
1115
+ drop-shadow doesn't work cleanly (per R659 detour note), so dropping
1116
+ the utility classes (`hover:brightness-110`, `hover:drop-shadow-[...]`)
1117
+ in favor of an explicit CSS rule that wins over the cascade.
1118
+ 42nd anchor in multi-layer halo family — first brand-mark anchor. */
1119
+ .anet-topo-brand-logo-mark:hover {
1120
+ filter: drop-shadow(0 0 8px currentColor)
1121
+ drop-shadow(0 0 16px currentColor)
1122
+ brightness(1.10);
1123
+ }
1124
+
1125
+ /* Round 684 — title-block H2 "Command mesh" gains multi-layer halo
1126
+ via the wrapper's `:hover` (sibling pattern to R683 brand logo —
1127
+ both lift together when ANY surface in the title-block cluster
1128
+ is hovered, including the brand logo, kicker, or H2 itself).
1129
+ Pre-R684 the H2 had only 2 typographic hover axes (R554 tracking-
1130
+ tighter + R556 font-bold) via group-hover Tailwind utilities; the
1131
+ paint axis was untouched. R684 adds the multi-layer halo paint
1132
+ axis to the H2's hover signature — same near + far layered glow
1133
+ vocabulary the 42 other surfaces in the family share.
1134
+ Stride: 4 + 8px (2× blur stride at h2 scale, text-lg = 18px —
1135
+ smaller than brand logo's 8+16 since the H2 is text not graphic).
1136
+ Tint: currentColor — inherits the H2's resolved fill color
1137
+ (white on cyber, darker on light theme overrides).
1138
+ No brightness multiply — H2 text-white is already near-peak
1139
+ luminance on cyber; adding brightness would push past saturation.
1140
+ The selector targets the H2 via its data-attr `data-topo-section-
1141
+ title` nested under the title-block wrapper's group container
1142
+ (`data-topo-section-titleblock-group`). Inline `transition-
1143
+ [letter-spacing,font-weight]` on the H2 doesn't include filter,
1144
+ so the halo would snap on. Add a transition rule here so the
1145
+ halo eases under the same 200ms cadence as the existing 2 axes —
1146
+ keeps the cluster's hover gesture motion-coherent.
1147
+ 43rd anchor in multi-layer halo family — sibling to R683 brand
1148
+ logo, closing the title-block cluster's paint-axis halo at the
1149
+ H2 element scope. */
1150
+ [data-topo-section-titleblock-group]:hover [data-topo-section-title] {
1151
+ filter: drop-shadow(0 0 4px currentColor)
1152
+ drop-shadow(0 0 8px currentColor);
1153
+ }
1154
+ [data-topo-section-title] {
1155
+ transition: letter-spacing 200ms ease-out,
1156
+ font-weight 200ms ease-out,
1157
+ filter 200ms ease-out;
1158
+ }
1159
+
1160
+ /* Round 685 — kicker "Network Topology" gains multi-layer halo via
1161
+ the title-block wrapper's `:hover`, closing the title-block trio
1162
+ at 3/3 paint-axis halo (logo R683 + H2 R684 + kicker R685). Pre-
1163
+ R685 the kicker had only 2 hover axes (R555 tracking-spread +
1164
+ color lift gray-500 → gray-400); the paint axis was untouched.
1165
+ R685 adds 2-layer drop-shadow at 2 + 4px stride (2× blur stride
1166
+ at kicker scale — text-xs = 12px, smaller than H2's 4+8 and
1167
+ logo's 8+16). currentColor inherits the kicker's resolved fill
1168
+ (gray-500 rest / gray-400 hover post-R555) so the halo paints
1169
+ in the same hue as the text.
1170
+ Selector targets the kicker via `data-topo-section-kicker` data-
1171
+ attr (already present on the kicker div). Sibling rule + transition
1172
+ pattern to R684 H2; both fire on the wrapper's :hover and ease at
1173
+ 200ms.
1174
+ When the user hovers the title cluster, ALL 3 surfaces (logo +
1175
+ H2 + kicker) glow simultaneously — cluster reads as one
1176
+ coherent hover unit, paint axis CLOSED across all surfaces.
1177
+ 44th anchor in multi-layer halo family — completes title-block
1178
+ trio 3/3. */
1179
+ [data-topo-section-titleblock-group]:hover [data-topo-section-kicker] {
1180
+ filter: drop-shadow(0 0 2px currentColor)
1181
+ drop-shadow(0 0 4px currentColor);
1182
+ }
1183
+ [data-topo-section-kicker] {
1184
+ transition: letter-spacing 200ms ease-out,
1185
+ color 200ms ease-out,
1186
+ filter 200ms ease-out;
1187
+ }
1188
+
967
1189
  /* ─────────────────────────────────────────────────────────────────────
968
1190
  Round 29 — prefers-reduced-motion a11y sweep
969
1191
 
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@sleep2agi/agent-network-dashboard",
3
- "version": "0.5.3-preview.2",
4
- "description": "Agent Network Dashboard Web UI for managing AI Agent networks",
3
+ "version": "0.5.3-preview.200",
4
+ "description": "Agent Network Dashboard \u2014 Web UI for managing AI Agent networks",
5
5
  "scripts": {
6
6
  "dev": "next dev",
7
7
  "build": "next build",
8
8
  "start": "next start",
9
9
  "lint": "eslint",
10
- "prepublishOnly": "[ -f .next/BUILD_ID ] || (echo 'prepublishOnly: .next/BUILD_ID missing run npm run build first (see commit 05c1ebf body for R224 chunk-500 root cause)' >&2 && exit 1)"
10
+ "prepublishOnly": "[ -f .next/BUILD_ID ] || (echo 'prepublishOnly: .next/BUILD_ID missing \u2014 run npm run build first (see commit 05c1ebf body for R224 chunk-500 root cause)' >&2 && exit 1)"
11
11
  },
12
12
  "bin": {
13
13
  "agent-network-dashboard": "./bin/start.js"
@@ -44,4 +44,4 @@
44
44
  "tailwindcss": "^4",
45
45
  "typescript": "^5"
46
46
  }
47
- }
47
+ }
@@ -0,0 +1,95 @@
1
+ /* #157 fix verification (v0.10.8 lean ship — Fix #1 only per 通信龙 5573).
2
+ *
3
+ * Pre-fix the Servers panel showed:
4
+ * "agent rollup pending hub ≥ 0.8.2-preview"
5
+ * "disk metric pending hub ≥ 0.8.2-preview"
6
+ * commhub-server@0.8.2 is LIVE on prod but still doesn't ship `agents[]`
7
+ * or `disk_*` — the version-pinned text was misleading.
8
+ *
9
+ * Post-fix:
10
+ * "agent rollup not reported by hub"
11
+ * "disk metric not reported by hub"
12
+ * + data-server-agents-missing + data-server-disk-missing test attrs.
13
+ *
14
+ * Test:
15
+ * 1. Open dashboard, expand Servers drawer (localStorage flag)
16
+ * 2. Expand first server card (localStorage flag)
17
+ * 3. Assert visible copy lacks "0.8.2-preview"
18
+ * 4. Assert test-surface attrs present
19
+ * 5. Source-side regex confirms new copy + attrs wired
20
+ */
21
+ import { chromium } from 'playwright';
22
+ import { readFileSync } from 'node:fs';
23
+
24
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
25
+
26
+ const browser = await chromium.launch({ headless: true });
27
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
28
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
29
+ await ctx.addInitScript(() => {
30
+ try {
31
+ localStorage.setItem('anet-theme', 'cyber');
32
+ sessionStorage.setItem('anet_v3_auth', '1');
33
+ // Force servers drawer open
34
+ localStorage.setItem('anet-servers-drawer', '1');
35
+ } catch {}
36
+ });
37
+ const page = await ctx.newPage();
38
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
39
+ await page.waitForTimeout(3500); // wait for SWR fetch + servers to render
40
+
41
+ // Expand first server card by clicking it
42
+ const firstCard = await page.$('[data-server-host], [data-server-card], button:has-text("iZ")');
43
+ // Simpler: just probe the drawer body text after expansion attempt
44
+ await page.evaluate(() => {
45
+ const buttons = Array.from(document.querySelectorAll('button'));
46
+ // Find server card expand toggles by their host text
47
+ const candidates = buttons.filter(b => /iZ|elaine/.test(b.textContent || ''));
48
+ if (candidates[0]) candidates[0].click();
49
+ });
50
+ await page.waitForTimeout(800);
51
+
52
+ const probe = await page.evaluate(() => {
53
+ // Probe drawer body for the placeholder text
54
+ const drawer = document.querySelector('[data-servers-body]') || document.body;
55
+ const text = drawer.textContent || '';
56
+ const agentsMissing = document.querySelectorAll('[data-server-agents-missing="true"]');
57
+ const diskMissing = document.querySelectorAll('[data-server-disk-missing="true"]');
58
+ return {
59
+ body_text_excerpt: text.slice(0, 1500),
60
+ has_stale_copy: /0\.8\.2-preview/.test(text),
61
+ has_new_agents_copy: /agent rollup not reported by hub/.test(text),
62
+ has_new_disk_copy: /disk metric not reported by hub/.test(text),
63
+ agents_missing_count: agentsMissing.length,
64
+ disk_missing_count: diskMissing.length,
65
+ };
66
+ });
67
+
68
+ await browser.close();
69
+
70
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/ServersDrawer.tsx', 'utf8');
71
+ // The OLD strings should be gone from rendered text. The comment block keeps the
72
+ // historical "0.8.2-preview" reference for audit — that's OK because comments
73
+ // don't render. So source check: look for the NEW visible strings AND the test
74
+ // attrs, not for the absence of "0.8.2-preview".
75
+ const sourceNewAgentsCopy = /agent rollup not reported by hub/.test(src);
76
+ const sourceNewDiskCopy = /disk metric not reported by hub/.test(src);
77
+ const sourceAgentsAttr = /data-server-agents-missing="true"/.test(src);
78
+ const sourceDiskAttr = /data-server-disk-missing="true"/.test(src);
79
+
80
+ const results = {
81
+ dom_no_stale_copy: !probe.has_stale_copy,
82
+ dom_new_agents_copy: probe.has_new_agents_copy,
83
+ dom_new_disk_copy: probe.has_new_disk_copy,
84
+ agents_attr_present: probe.agents_missing_count > 0,
85
+ disk_attr_present: probe.disk_missing_count > 0,
86
+ source_new_agents: sourceNewAgentsCopy,
87
+ source_new_disk: sourceNewDiskCopy,
88
+ source_agents_attr: sourceAgentsAttr,
89
+ source_disk_attr: sourceDiskAttr,
90
+ };
91
+ const ok = Object.values(results).every(Boolean);
92
+ console.log(`${ok ? '✅' : '❌'} #157 servers copy fix:`, JSON.stringify(results),
93
+ '\n agents_missing_count:', probe.agents_missing_count, ' disk_missing_count:', probe.disk_missing_count,
94
+ '\n body_excerpt:', probe.body_text_excerpt.replace(/\s+/g, ' ').slice(0, 400));
95
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,107 @@
1
+ /* Round 552 verification: chrome active-variant buttons gain
2
+ * hover:text-cyan-200 lift. Coordinated 4-anchor edit:
3
+ * Ring | Grid | S/M/L | Fullscreen
4
+ *
5
+ * Test phases:
6
+ * 1. Pick an active button (Ring is active by default in ring layout)
7
+ * 2. Read rest text color (cyan-300 = rgb(103, 232, 249))
8
+ * 3. Hover → text color = cyan-200 (rgb(165, 243, 252))
9
+ * 4. Verify bg also deepened (cyan-500/20)
10
+ * 5. Source-side regex: 4 occurrences of the new className substring
11
+ */
12
+ import { chromium } from 'playwright';
13
+ import { readFileSync } from 'node:fs';
14
+
15
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
16
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
17
+
18
+ const browser = await chromium.launch({ headless: true });
19
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
20
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
21
+ await ctx.addInitScript(() => {
22
+ try {
23
+ localStorage.setItem('anet-theme', 'cyber');
24
+ localStorage.setItem('anet-topo-layout', 'ring');
25
+ sessionStorage.setItem('anet_v3_auth', '1');
26
+ } catch {}
27
+ });
28
+ await ctx.route('**/api/hub/status*', async (route) => {
29
+ const r = await route.fetch();
30
+ const b = await r.json();
31
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
32
+ const mk = (alias) => ({
33
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
34
+ network_id: nid, project_dir: null,
35
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
36
+ });
37
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1')] } });
38
+ });
39
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
40
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
41
+ const page = await ctx.newPage();
42
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
43
+ await page.waitForSelector('[data-topo-chrome-layout="ring"]', { timeout: 15000 });
44
+ await page.waitForTimeout(500);
45
+
46
+ // Ring is active in ring layout
47
+ const sel = '[data-topo-chrome-layout="ring"]';
48
+ const rest = await page.evaluate((s) => {
49
+ const el = document.querySelector(s);
50
+ if (!el) return null;
51
+ const cs = getComputedStyle(el);
52
+ return {
53
+ color: cs.color,
54
+ bg: cs.backgroundColor,
55
+ activeAttr: el.getAttribute('data-topo-chrome-layout-active'),
56
+ };
57
+ }, sel);
58
+
59
+ await page.hover(sel);
60
+ await page.waitForTimeout(400);
61
+ const hover = await page.evaluate((s) => {
62
+ const el = document.querySelector(s);
63
+ if (!el) return null;
64
+ const cs = getComputedStyle(el);
65
+ return { color: cs.color, bg: cs.backgroundColor };
66
+ }, sel);
67
+
68
+ await browser.close();
69
+
70
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
71
+ // New active-variant substring must appear 4× (Ring, Grid, S/M/L, Fullscreen)
72
+ const occurrences = (src.match(/bg-cyan-500\/15 text-cyan-300 font-medium hover:bg-cyan-500\/20 hover:text-cyan-200 active:bg-cyan-500\/25/g) || []).length;
73
+
74
+ // Tailwind v4 emits cyan-300 / cyan-200 in lab() / oklab() color
75
+ // space, not legacy rgb(). Parse the L (lightness) component and
76
+ // verify hover L > rest L (cyan-200 is lighter than cyan-300).
77
+ // Bg uses oklab with alpha; rest alpha = 0.15 (cyan-500/15), hover
78
+ // alpha = 0.2 (cyan-500/20).
79
+ const parseLab = (s) => {
80
+ const m = (s || '').match(/lab\(([0-9.]+)\s/) || (s || '').match(/oklab\(([0-9.]+)\s/);
81
+ return m ? parseFloat(m[1]) : NaN;
82
+ };
83
+ const parseAlpha = (s) => {
84
+ const m = (s || '').match(/\/\s*([0-9.]+)\)/);
85
+ return m ? parseFloat(m[1]) : NaN;
86
+ };
87
+ const restL = parseLab(rest?.color);
88
+ const hoverL = parseLab(hover?.color);
89
+ const restBgA = parseAlpha(rest?.bg);
90
+ const hoverBgA = parseAlpha(hover?.bg);
91
+
92
+ const results = {
93
+ active_attr: rest?.activeAttr === 'true',
94
+ rest_text_parsed: !Number.isNaN(restL),
95
+ hover_text_parsed: !Number.isNaN(hoverL),
96
+ hover_text_lighter_than_rest: hoverL > restL + 3, // cyan-200 L≈91 > cyan-300 L≈85
97
+ rest_bg_alpha_0_15: Math.abs(restBgA - 0.15) < 0.01,
98
+ hover_bg_alpha_0_20: Math.abs(hoverBgA - 0.20) < 0.01,
99
+ source_4_occurrences: occurrences === 4,
100
+ };
101
+ const ok = Object.values(results).every(Boolean);
102
+ console.log(`${ok ? '✅' : '❌'} R552 chrome active-variant hover:text-cyan-200 (4 anchors):`,
103
+ JSON.stringify(results, null, 2),
104
+ '\n rest:', JSON.stringify(rest),
105
+ '\n hover:', JSON.stringify(hover),
106
+ '\n source occurrences:', occurrences);
107
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,81 @@
1
+ /* Round 686 — active-links chip extends from 4+ hover axes (bg/text/
2
+ * border swap + translate-y) to add multi-layer halo paint axis.
3
+ * Inline filter conditional on hoveredActiveLinks state (existing,
4
+ * line 1098) gates 2-layer drop-shadow at pal.legendAccent tint with
5
+ * 2+4 stride, alpha 80/40. 45th anchor — first active-links anchor.
6
+ *
7
+ * Source assertions:
8
+ * - filter chain uses pal.legendAccent at 80/40 with 2+4 stride,
9
+ * gated on hoveredActiveLinks && isInteractive
10
+ * - data-active-links-chip-halo-layers attr toggles '2' ↔ '0'
11
+ *
12
+ * Runtime assertions:
13
+ * - active-links chip present (renders when sessions exist)
14
+ * - rest halo-layers='0'
15
+ * - chip is interactive when flowLinks > 0 (mock messages create flows)
16
+ */
17
+ import { chromium } from 'playwright';
18
+ import { readFileSync } from 'node:fs';
19
+
20
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
21
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
22
+
23
+ const browser = await chromium.launch({ headless: true });
24
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
25
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
26
+ await ctx.addInitScript(() => {
27
+ try {
28
+ localStorage.setItem('anet-theme', 'cyber');
29
+ localStorage.setItem('anet-topo-layout', 'ring');
30
+ sessionStorage.setItem('anet_v3_auth', '1');
31
+ } catch {}
32
+ });
33
+ await ctx.route('**/api/hub/status*', async (route) => {
34
+ const r = await route.fetch();
35
+ const b = await r.json();
36
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
37
+ const mk = (alias) => ({
38
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
39
+ network_id: nid, project_dir: null,
40
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
41
+ });
42
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2'), mk('a·3')] } });
43
+ });
44
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [
45
+ { id: 'm1', from_alias: 'a·1', to_alias: 'a·2', kind: 'message', content: 'p', network_id: 'default', created_at: fresh },
46
+ { id: 'm2', from_alias: 'a·2', to_alias: 'a·3', kind: 'task', content: 'p2', network_id: 'default', created_at: fresh },
47
+ ] } }));
48
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
49
+ const page = await ctx.newPage();
50
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
51
+ await page.waitForSelector('[data-active-links-chip]', { timeout: 15000, state: 'attached' });
52
+ await page.waitForTimeout(300);
53
+
54
+ const runtimeState = await page.evaluate(() => {
55
+ const chip = document.querySelector('[data-active-links-chip]');
56
+ return chip ? {
57
+ halo_layers: chip.getAttribute('data-active-links-chip-halo-layers'),
58
+ interactive: chip.getAttribute('data-active-links-clickable'),
59
+ flow_count: chip.getAttribute('data-active-links-flow-count'),
60
+ } : null;
61
+ });
62
+
63
+ await browser.close();
64
+
65
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
66
+ const sourceFilter = /filter: hoveredActiveLinks && isInteractive\s*\?\s*`drop-shadow\(0 0 2px \$\{pal\.legendAccent\}80\) drop-shadow\(0 0 4px \$\{pal\.legendAccent\}40\)`\s*: undefined/.test(src);
67
+ const sourceAttr = /data-active-links-chip-halo-layers=\{hoveredActiveLinks && isInteractive \? '2' : '0'\}/.test(src);
68
+
69
+ const results = {
70
+ chip_present: !!runtimeState,
71
+ rest_layers_zero: runtimeState?.halo_layers === '0',
72
+ is_interactive: runtimeState?.interactive === 'true',
73
+ has_flows: runtimeState && parseInt(runtimeState.flow_count, 10) >= 1,
74
+ source_filter: sourceFilter,
75
+ source_layers_attr: sourceAttr,
76
+ };
77
+ const ok = Object.values(results).every(Boolean);
78
+ console.log(`${ok ? '✅' : '❌'} R686 active-links chip multi-layer halo (first active-links anchor):`,
79
+ JSON.stringify(results, null, 2),
80
+ `\n runtime: ${JSON.stringify(runtimeState)}`);
81
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,79 @@
1
+ /* Round 616 — alias text brightness gate extends from hover-only
2
+ * to (hover || chat-target). 2nd anchor in chat-target-gated
3
+ * brightness family (sibling to R615 chat ring).
4
+ *
5
+ * Test phases:
6
+ * 1. mock 2 idle nodes → alias text renders
7
+ * 2. rest (no hover, no chat): filter='none', brightness-attr='1'
8
+ * 3. computed transition-property contains 'filter'
9
+ * 4. source: filter conditional includes BOTH hover AND chat
10
+ * gates, joined by `||`
11
+ */
12
+ import { chromium } from 'playwright';
13
+ import { readFileSync } from 'node:fs';
14
+
15
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
16
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
17
+
18
+ const browser = await chromium.launch({ headless: true });
19
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
20
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
21
+ await ctx.addInitScript(() => {
22
+ try {
23
+ localStorage.setItem('anet-theme', 'cyber');
24
+ localStorage.setItem('anet-topo-layout', 'ring');
25
+ sessionStorage.setItem('anet_v3_auth', '1');
26
+ } catch {}
27
+ });
28
+ await ctx.route('**/api/hub/status*', async (route) => {
29
+ const r = await route.fetch();
30
+ const b = await r.json();
31
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
32
+ const mk = (alias) => ({
33
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
34
+ network_id: nid, project_dir: null,
35
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
36
+ });
37
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
38
+ });
39
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
40
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
41
+ const page = await ctx.newPage();
42
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
43
+ await page.waitForSelector('[data-node-alias-text]', { timeout: 15000, state: 'attached' });
44
+ await page.waitForTimeout(500);
45
+
46
+ const rest = await page.evaluate(() => {
47
+ const el = document.querySelector('[data-node-alias-text]');
48
+ if (!el) return null;
49
+ const cs = getComputedStyle(el);
50
+ return {
51
+ filter: cs.filter,
52
+ transitionProperty: cs.transitionProperty,
53
+ brightnessAttr: el.getAttribute('data-node-alias-brightness'),
54
+ hoveredAttr: el.getAttribute('data-node-alias-hovered'),
55
+ chatTargetAttr: el.getAttribute('data-node-alias-chat-target'),
56
+ };
57
+ });
58
+
59
+ await browser.close();
60
+
61
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
62
+ const sourceFilter = /filter: !reducedMotion && \(hoveredAlias === session\.alias \|\| chatAlias === session\.alias\)\s*\?\s*`drop-shadow\(0 0 2px \$\{status\.text\}80\) brightness\(1\.15\)`\s*:\s*undefined/.test(src);
63
+ const sourceAttr = /data-node-alias-brightness=\{!reducedMotion && \(hoveredAlias === session\.alias \|\| chatAlias === session\.alias\) \? '1\.15' : '1'\}/.test(src);
64
+
65
+ const results = {
66
+ alias_present: !!rest,
67
+ rest_filter_none: rest?.filter === 'none',
68
+ rest_brightness_1: rest?.brightnessAttr === '1',
69
+ rest_hovered_false: rest?.hoveredAttr === 'false',
70
+ rest_chat_target_false: rest?.chatTargetAttr === 'false',
71
+ transition_has_filter: /filter/.test(rest?.transitionProperty || ''),
72
+ source_filter_or_gate: sourceFilter,
73
+ source_attr_or_gate: sourceAttr,
74
+ };
75
+ const ok = Object.values(results).every(Boolean);
76
+ console.log(`${ok ? '✅' : '❌'} R616 alias chat-target brightness (chat-gated family 2/N):`,
77
+ JSON.stringify(results, null, 2),
78
+ `\n rest: ${JSON.stringify(rest)}`);
79
+ process.exit(ok ? 0 : 1);