@sleep2agi/agent-network-dashboard 0.5.3-preview.18 → 0.5.3-preview.181

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 (322) 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 +7 -7
  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 +2 -2
  15. package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  16. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  17. package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  18. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  19. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  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 +2 -2
  24. package/.next/server/app/admin.segments/_full.segment.rsc +2 -2
  25. package/.next/server/app/admin.segments/_head.segment.rsc +1 -1
  26. package/.next/server/app/admin.segments/_index.segment.rsc +2 -2
  27. package/.next/server/app/admin.segments/_tree.segment.rsc +2 -2
  28. package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +1 -1
  29. package/.next/server/app/admin.segments/admin.segment.rsc +1 -1
  30. package/.next/server/app/index.html +2 -2
  31. package/.next/server/app/index.rsc +3 -3
  32. package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  33. package/.next/server/app/index.segments/_full.segment.rsc +3 -3
  34. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  35. package/.next/server/app/index.segments/_index.segment.rsc +2 -2
  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 +3 -3
  40. package/.next/server/app/login.segments/_full.segment.rsc +3 -3
  41. package/.next/server/app/login.segments/_head.segment.rsc +1 -1
  42. package/.next/server/app/login.segments/_index.segment.rsc +2 -2
  43. package/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  44. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  45. package/.next/server/app/login.segments/login.segment.rsc +1 -1
  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 +2 -2
  49. package/.next/server/app/logs.segments/_full.segment.rsc +2 -2
  50. package/.next/server/app/logs.segments/_head.segment.rsc +1 -1
  51. package/.next/server/app/logs.segments/_index.segment.rsc +2 -2
  52. package/.next/server/app/logs.segments/_tree.segment.rsc +2 -2
  53. package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +1 -1
  54. package/.next/server/app/logs.segments/logs.segment.rsc +1 -1
  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 +2 -2
  58. package/.next/server/app/messages.segments/_full.segment.rsc +2 -2
  59. package/.next/server/app/messages.segments/_head.segment.rsc +1 -1
  60. package/.next/server/app/messages.segments/_index.segment.rsc +2 -2
  61. package/.next/server/app/messages.segments/_tree.segment.rsc +2 -2
  62. package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +1 -1
  63. package/.next/server/app/messages.segments/messages.segment.rsc +1 -1
  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 +2 -2
  67. package/.next/server/app/node.segments/_full.segment.rsc +2 -2
  68. package/.next/server/app/node.segments/_head.segment.rsc +1 -1
  69. package/.next/server/app/node.segments/_index.segment.rsc +2 -2
  70. package/.next/server/app/node.segments/_tree.segment.rsc +2 -2
  71. package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +1 -1
  72. package/.next/server/app/node.segments/node.segment.rsc +1 -1
  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 +2 -2
  76. package/.next/server/app/nodes.segments/_full.segment.rsc +2 -2
  77. package/.next/server/app/nodes.segments/_head.segment.rsc +1 -1
  78. package/.next/server/app/nodes.segments/_index.segment.rsc +2 -2
  79. package/.next/server/app/nodes.segments/_tree.segment.rsc +2 -2
  80. package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +1 -1
  81. package/.next/server/app/nodes.segments/nodes.segment.rsc +1 -1
  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 +2 -2
  86. package/.next/server/app/server-logs.segments/_full.segment.rsc +2 -2
  87. package/.next/server/app/server-logs.segments/_head.segment.rsc +1 -1
  88. package/.next/server/app/server-logs.segments/_index.segment.rsc +2 -2
  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 +1 -1
  91. package/.next/server/app/server-logs.segments/server-logs.segment.rsc +1 -1
  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 +2 -2
  95. package/.next/server/app/settings/networks.segments/_full.segment.rsc +2 -2
  96. package/.next/server/app/settings/networks.segments/_head.segment.rsc +1 -1
  97. package/.next/server/app/settings/networks.segments/_index.segment.rsc +2 -2
  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 +1 -1
  100. package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +1 -1
  101. package/.next/server/app/settings/networks.segments/settings.segment.rsc +1 -1
  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 +2 -2
  106. package/.next/server/app/settings/tokens.segments/_full.segment.rsc +2 -2
  107. package/.next/server/app/settings/tokens.segments/_head.segment.rsc +1 -1
  108. package/.next/server/app/settings/tokens.segments/_index.segment.rsc +2 -2
  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 +1 -1
  111. package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +1 -1
  112. package/.next/server/app/settings/tokens.segments/settings.segment.rsc +1 -1
  113. package/.next/server/app/settings.html +2 -2
  114. package/.next/server/app/settings.rsc +3 -3
  115. package/.next/server/app/settings.segments/_full.segment.rsc +3 -3
  116. package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  117. package/.next/server/app/settings.segments/_index.segment.rsc +2 -2
  118. package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  119. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +2 -2
  120. package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  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 +2 -2
  125. package/.next/server/app/tasks.segments/_full.segment.rsc +2 -2
  126. package/.next/server/app/tasks.segments/_head.segment.rsc +1 -1
  127. package/.next/server/app/tasks.segments/_index.segment.rsc +2 -2
  128. package/.next/server/app/tasks.segments/_tree.segment.rsc +2 -2
  129. package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +1 -1
  130. package/.next/server/app/tasks.segments/tasks.segment.rsc +1 -1
  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/middleware-build-manifest.js +3 -3
  140. package/.next/server/pages/404.html +2 -2
  141. package/.next/server/pages/500.html +1 -1
  142. package/.next/static/chunks/0-8bxlg9uqt.w.css +2 -0
  143. package/.next/static/chunks/05hk317799_zi.js +1 -0
  144. package/.next/static/chunks/0chpuxik8zz52.js +1 -0
  145. package/.next/static/chunks/{0ha~3ah2r1rb1.js → 0jb6h4syeiiaj.js} +1 -1
  146. package/.next/static/chunks/0k.pw37g2bgyt.js +4 -0
  147. package/.next/trace +2 -2
  148. package/.next/trace-build +1 -1
  149. package/app/components/TopoGraph.tsx +4600 -174
  150. package/app/globals.css +58 -7
  151. package/package.json +4 -4
  152. package/scripts/topo-active-chrome-hover-text-test.mjs +107 -0
  153. package/scripts/topo-alias-chat-brightness-test.mjs +79 -0
  154. package/scripts/topo-alias-text-halo-layers-test.mjs +98 -0
  155. package/scripts/topo-avatar-chat-gate-test.mjs +77 -0
  156. package/scripts/topo-avatar-drop-shadow-test.mjs +86 -0
  157. package/scripts/topo-avatar-fallback-hover-test.mjs +104 -0
  158. package/scripts/topo-avatar-fallback-rotate-test.mjs +92 -0
  159. package/scripts/topo-avatar-rotate-test.mjs +85 -0
  160. package/scripts/topo-avatar-scale-test.mjs +89 -0
  161. package/scripts/topo-badge-chat-gate-test.mjs +74 -0
  162. package/scripts/topo-brand-drop-shadow-test.mjs +71 -0
  163. package/scripts/topo-brand-logo-breath-test.mjs +102 -0
  164. package/scripts/topo-brand-logo-hover-brightness-test.mjs +105 -0
  165. package/scripts/topo-brand-logo-hover-rotate-test.mjs +93 -0
  166. package/scripts/topo-brand-logo-hover-test.mjs +85 -0
  167. package/scripts/topo-card-chat-brightness-test.mjs +86 -0
  168. package/scripts/topo-chat-ring-breath-curve-test.mjs +114 -0
  169. package/scripts/topo-chat-ring-brightness-test.mjs +80 -0
  170. package/scripts/topo-chat-ring-halo-layers-test.mjs +100 -0
  171. package/scripts/topo-chat-ring-r-breath-test.mjs +121 -0
  172. package/scripts/topo-chat-ring-status-halo-test.mjs +106 -0
  173. package/scripts/topo-chat-ring-sw-breath-test.mjs +123 -0
  174. package/scripts/topo-chip-row-digit-ls-test.mjs +135 -0
  175. package/scripts/topo-chip-row-member-alias-lit-test.mjs +154 -0
  176. package/scripts/topo-chip-row-tier-glow-brightness-test.mjs +99 -0
  177. package/scripts/topo-chip-row-unit-hover-tracking-test.mjs +124 -0
  178. package/scripts/topo-chrome-control-halo-layers-test.mjs +22 -0
  179. package/scripts/topo-click-ripple-glow-test.mjs +86 -0
  180. package/scripts/topo-click-ripple-halo-layers-test.mjs +79 -0
  181. package/scripts/topo-click-ripple-sw-test.mjs +110 -0
  182. package/scripts/topo-cluster-count-attr-test.mjs +80 -0
  183. package/scripts/topo-crescent-breath-test.mjs +104 -0
  184. package/scripts/topo-crescent-recede-test.mjs +111 -0
  185. package/scripts/topo-edge-badge-circle-brightness-test.mjs +82 -0
  186. package/scripts/topo-edge-badge-circle-hot-pulse-test.mjs +100 -0
  187. package/scripts/topo-edge-badge-endpoint-gate-test.mjs +94 -0
  188. package/scripts/topo-edge-badge-halo-layers-test.mjs +85 -0
  189. package/scripts/topo-edge-badge-hot-pulse-test.mjs +92 -0
  190. package/scripts/topo-edge-badge-hover-glow-test.mjs +90 -0
  191. package/scripts/topo-edge-badge-text-brightness-test.mjs +83 -0
  192. package/scripts/topo-edge-chat-gate-test.mjs +71 -0
  193. package/scripts/topo-edge-particle-brightness-test.mjs +82 -0
  194. package/scripts/topo-edge-pill-glow-test.mjs +67 -0
  195. package/scripts/topo-edge-visible-brightness-test.mjs +84 -0
  196. package/scripts/topo-endpoint-ring-brightness-test.mjs +83 -0
  197. package/scripts/topo-endpoint-ring-flow-halo-test.mjs +107 -0
  198. package/scripts/topo-endpoint-ring-halo-layers-test.mjs +100 -0
  199. package/scripts/topo-filter-pill-glow-test.mjs +90 -0
  200. package/scripts/topo-filter-pill-halo-layers-test.mjs +27 -0
  201. package/scripts/topo-flow-arrow-brightness-test.mjs +82 -0
  202. package/scripts/topo-flow-rail-brightness-test.mjs +80 -0
  203. package/scripts/topo-freshness-chip-fade-test.mjs +105 -0
  204. package/scripts/topo-fullscreen-attr-test.mjs +73 -0
  205. package/scripts/topo-fullscreen-brightness-test.mjs +84 -0
  206. package/scripts/topo-fullscreen-icon-rotate-test.mjs +93 -0
  207. package/scripts/topo-grid-content-bottom-attr-test.mjs +72 -0
  208. package/scripts/topo-group-box-brightness-test.mjs +84 -0
  209. package/scripts/topo-group-chat-gate-test.mjs +77 -0
  210. package/scripts/topo-group-label-brightness-test.mjs +84 -0
  211. package/scripts/topo-group-label-halo-layers-test.mjs +78 -0
  212. package/scripts/topo-group-label-hover-glow-test.mjs +86 -0
  213. package/scripts/topo-group-label-member-alias-hover-test.mjs +125 -0
  214. package/scripts/topo-group-pill-glow-test.mjs +76 -0
  215. package/scripts/topo-group-tint-brightness-test.mjs +82 -0
  216. package/scripts/topo-halo-chat-gate-test.mjs +72 -0
  217. package/scripts/topo-hub-core-brightness-test.mjs +82 -0
  218. package/scripts/topo-hub-digit-brightness-test.mjs +79 -0
  219. package/scripts/topo-hub-digit-halo-layers-test.mjs +76 -0
  220. package/scripts/topo-hub-digit-ls-test.mjs +119 -0
  221. package/scripts/topo-hub-halo-brightness-test.mjs +80 -0
  222. package/scripts/topo-hub-halo-glow-test.mjs +96 -0
  223. package/scripts/topo-hub-halo-halo-layers-test.mjs +76 -0
  224. package/scripts/topo-hub-highlight-amplify-test.mjs +139 -0
  225. package/scripts/topo-hub-highlight-brightness-test.mjs +84 -0
  226. package/scripts/topo-hub-highlight-fill-transition-test.mjs +84 -0
  227. package/scripts/topo-hub-highlight-glow-test.mjs +99 -0
  228. package/scripts/topo-hub-highlight-halo-layers-test.mjs +78 -0
  229. package/scripts/topo-hub-highlight-r-test.mjs +112 -0
  230. package/scripts/topo-hub-highlight-recede-test.mjs +144 -0
  231. package/scripts/topo-hub-highlight-theme-fill-test.mjs +83 -0
  232. package/scripts/topo-hub-hover-ring-brightness-test.mjs +79 -0
  233. package/scripts/topo-hub-hover-ring-glow-test.mjs +97 -0
  234. package/scripts/topo-hub-hover-ring-halo-layers-test.mjs +71 -0
  235. package/scripts/topo-hub-idle-breath-test.mjs +7 -2
  236. package/scripts/topo-hub-recede-test.mjs +124 -0
  237. package/scripts/topo-hub-spoke-brightness-test.mjs +77 -0
  238. package/scripts/topo-hub-spoke-glow-test.mjs +112 -0
  239. package/scripts/topo-hub-spoke-halo-layers-test.mjs +97 -0
  240. package/scripts/topo-hub-spoke-self-filter-test.mjs +119 -0
  241. package/scripts/topo-label-card-brightness-test.mjs +81 -0
  242. package/scripts/topo-layout-hover-fw-test.mjs +98 -0
  243. package/scripts/topo-layout-toggle-brightness-test.mjs +94 -0
  244. package/scripts/topo-legend-count-brightness-test.mjs +80 -0
  245. package/scripts/topo-legend-count-letter-spacing-test.mjs +108 -0
  246. package/scripts/topo-legend-label-fw-test.mjs +107 -0
  247. package/scripts/topo-legend-pin-ring-brightness-test.mjs +82 -0
  248. package/scripts/topo-legend-pin-ring-halo-layers-test.mjs +71 -0
  249. package/scripts/topo-legend-row-count-brightness-test.mjs +85 -0
  250. package/scripts/topo-legend-row-label-glow-test.mjs +102 -0
  251. package/scripts/topo-legend-swatch-glow-test.mjs +109 -0
  252. package/scripts/topo-legend-swatch-member-alias-match-test.mjs +139 -0
  253. package/scripts/topo-legend-tint-brightness-test.mjs +83 -0
  254. package/scripts/topo-legend-trio-halo-layers-test.mjs +22 -0
  255. package/scripts/topo-minimap-dot-chat-gate-test.mjs +81 -0
  256. package/scripts/topo-minimap-hover-glow-test.mjs +109 -0
  257. package/scripts/topo-minimap-viewport-brightness-test.mjs +84 -0
  258. package/scripts/topo-minimap-viewport-halo-layers-test.mjs +24 -0
  259. package/scripts/topo-more-footer-brightness-test.mjs +94 -0
  260. package/scripts/topo-node-alias-brightness-test.mjs +84 -0
  261. package/scripts/topo-node-avatar-halo-layers-test.mjs +25 -0
  262. package/scripts/topo-node-hover-ring-halo-layers-test.mjs +70 -0
  263. package/scripts/topo-node-sub-text-brightness-test.mjs +88 -0
  264. package/scripts/topo-nodesize-brightness-test.mjs +82 -0
  265. package/scripts/topo-nodesize-hover-fw-test.mjs +99 -0
  266. package/scripts/topo-orphan-fill-opacity-test.mjs +91 -0
  267. package/scripts/topo-orphan-label-opacity-test.mjs +98 -0
  268. package/scripts/topo-panel-count-hover-ls-test.mjs +87 -0
  269. package/scripts/topo-panel-row-brightness-test.mjs +116 -0
  270. package/scripts/topo-panel-title-brightness-test.mjs +98 -0
  271. package/scripts/topo-panel-title-glow-test.mjs +111 -0
  272. package/scripts/topo-panel-titles-halo-layers-test.mjs +23 -0
  273. package/scripts/topo-pill-x-rotate-test.mjs +96 -0
  274. package/scripts/topo-pip-brightness-test.mjs +85 -0
  275. package/scripts/topo-pressure-bar-halo-layers-test.mjs +19 -0
  276. package/scripts/topo-pressure-seg-glow-test.mjs +92 -0
  277. package/scripts/topo-pressure-seg-member-alias-match-test.mjs +133 -0
  278. package/scripts/topo-pressure-seg-motion-test.mjs +101 -0
  279. package/scripts/topo-recent-count-brightness-test.mjs +84 -0
  280. package/scripts/topo-recent-more-fw-test.mjs +126 -0
  281. package/scripts/topo-recent-panel-hot-pulse-test.mjs +105 -0
  282. package/scripts/topo-recent-pip-halo-layers-test.mjs +82 -0
  283. package/scripts/topo-recent-row-chat-gate-test.mjs +75 -0
  284. package/scripts/topo-recent-row-content-lift-test.mjs +140 -0
  285. package/scripts/topo-recent-row-fw-test.mjs +115 -0
  286. package/scripts/topo-recent-row-text-glow-test.mjs +86 -0
  287. package/scripts/topo-recent-row-text-halo-layers-test.mjs +67 -0
  288. package/scripts/topo-recent-tint-brightness-test.mjs +80 -0
  289. package/scripts/topo-recent-ts-brightness-test.mjs +86 -0
  290. package/scripts/topo-reduced-motion-attr-test.mjs +69 -0
  291. package/scripts/topo-reset-brightness-test.mjs +83 -0
  292. package/scripts/topo-reset-icon-hover-scale-test.mjs +102 -0
  293. package/scripts/topo-runtime-badge-brightness-test.mjs +78 -0
  294. package/scripts/topo-runtime-badge-glow-test.mjs +108 -0
  295. package/scripts/topo-runtime-badge-halo-layers-test.mjs +87 -0
  296. package/scripts/topo-runtime-badge-rotate-test.mjs +85 -0
  297. package/scripts/topo-spoke-chat-gate-test.mjs +72 -0
  298. package/scripts/topo-starfield-hue-test.mjs +109 -0
  299. package/scripts/topo-status-pin-pill-halo-layers-test.mjs +17 -0
  300. package/scripts/topo-status-ring-brightness-test.mjs +84 -0
  301. package/scripts/topo-status-ring-chat-gate-test.mjs +72 -0
  302. package/scripts/topo-status-ring-halo-layers-test.mjs +105 -0
  303. package/scripts/topo-status-ring-status-halo-test.mjs +110 -0
  304. package/scripts/topo-sub-text-chat-brightness-test.mjs +81 -0
  305. package/scripts/topo-titleblock-h2-hover-fw-test.mjs +109 -0
  306. package/scripts/topo-titleblock-h2-hover-tracking-test.mjs +128 -0
  307. package/scripts/topo-titleblock-kicker-hover-test.mjs +134 -0
  308. package/scripts/topo-vendor-chip-glow-test.mjs +97 -0
  309. package/scripts/topo-vendor-chip-halo-layers-test.mjs +18 -0
  310. package/scripts/topo-vendor-pill-glow-test.mjs +98 -0
  311. package/scripts/topo-watermark-breath-test.mjs +100 -0
  312. package/scripts/topo-watermark-recede-test.mjs +114 -0
  313. package/scripts/topo-zoom-buttons-brightness-test.mjs +94 -0
  314. package/scripts/topo-zoom-level-brightness-test.mjs +83 -0
  315. package/scripts/topo-zoom-level-color-test.mjs +105 -0
  316. package/.next/static/chunks/0m.1mvl~t.avc.css +0 -2
  317. package/.next/static/chunks/0r19pt1ihol7g.js +0 -1
  318. package/.next/static/chunks/0u4p3l2hq_1kj.js +0 -4
  319. package/.next/static/chunks/0z6a3b81h8btk.js +0 -1
  320. /package/.next/static/{dLzRHfUo59WgRQX9Mbfuk → yS4qco8meQiV57CZRx0Uc}/_buildManifest.js +0 -0
  321. /package/.next/static/{dLzRHfUo59WgRQX9Mbfuk → yS4qco8meQiV57CZRx0Uc}/_clientMiddlewareManifest.js +0 -0
  322. /package/.next/static/{dLzRHfUo59WgRQX9Mbfuk → yS4qco8meQiV57CZRx0Uc}/_ssgManifest.js +0 -0
@@ -0,0 +1,100 @@
1
+ /* Round 519 verification: brand watermark gains ambient SMIL breath
2
+ * animation — 呼吸感 family 3rd anchor.
3
+ *
4
+ * Test phases:
5
+ * 1. default (motion enabled): data-topo-brand-watermark-breath='true'
6
+ * + <animate> child mounted inside the <text>
7
+ * + animate values='0.32;0.48;0.32', dur='6s', repeatCount='indefinite'
8
+ * 2. prefers-reduced-motion: data-topo-brand-watermark-breath='false'
9
+ * + NO <animate> child (gated out at JSX level)
10
+ * 3. source-side regex confirms SMIL gate + values + duration
11
+ * 4. zero-overlap is gated separately by topo-overlap-test.mjs
12
+ */
13
+ import { chromium } from 'playwright';
14
+ import { readFileSync } from 'node:fs';
15
+
16
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
17
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
18
+
19
+ async function probe(reducedMotion) {
20
+ const browser = await chromium.launch({ headless: true });
21
+ const ctx = await browser.newContext({
22
+ viewport: { width: 1500, height: 1200 },
23
+ reducedMotion: reducedMotion ? 'reduce' : 'no-preference',
24
+ });
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')] } });
43
+ });
44
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
45
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
46
+ const page = await ctx.newPage();
47
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
48
+ await page.waitForSelector('[data-topo-brand-watermark]', { timeout: 15000 });
49
+ await page.waitForTimeout(800);
50
+ const probe = await page.evaluate(() => {
51
+ const el = document.querySelector('[data-topo-brand-watermark]');
52
+ if (!el) return null;
53
+ const animate = el.querySelector('animate');
54
+ return {
55
+ attrBreath: el.getAttribute('data-topo-brand-watermark-breath'),
56
+ hasAnimate: !!animate,
57
+ attrName: animate?.getAttribute('attributeName') || null,
58
+ values: animate?.getAttribute('values') || null,
59
+ dur: animate?.getAttribute('dur') || null,
60
+ repeatCount: animate?.getAttribute('repeatCount') || null,
61
+ textContent: el.textContent?.trim() || null,
62
+ opacity: el.getAttribute('opacity'),
63
+ };
64
+ });
65
+ await browser.close();
66
+ return probe;
67
+ }
68
+
69
+ const normal = await probe(false);
70
+ const reduced = await probe(true);
71
+
72
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
73
+ const sourceWiredGate =
74
+ /\{!reducedMotion && \(\s*<animate attributeName="opacity" values="0\.32;0\.48;0\.32" dur="6s" repeatCount="indefinite" \/>\s*\)\}/.test(src);
75
+ const sourceWiredAttr =
76
+ /data-topo-brand-watermark-breath=\{reducedMotion \? 'false' : 'true'\}/.test(src);
77
+
78
+ const results = {
79
+ // Phase 1: motion enabled
80
+ normal_attr_true: normal?.attrBreath === 'true',
81
+ normal_has_animate: normal?.hasAnimate === true,
82
+ normal_attr_name_opacity: normal?.attrName === 'opacity',
83
+ normal_values_correct: normal?.values === '0.32;0.48;0.32',
84
+ normal_dur_6s: normal?.dur === '6s',
85
+ normal_repeat_indefinite: normal?.repeatCount === 'indefinite',
86
+ normal_text_content: normal?.textContent === 'sleep2agi',
87
+ normal_static_opacity_04: normal?.opacity === '0.4',
88
+ // Phase 2: prefers-reduced-motion
89
+ reduced_attr_false: reduced?.attrBreath === 'false',
90
+ reduced_no_animate: reduced?.hasAnimate === false,
91
+ reduced_text_content: reduced?.textContent === 'sleep2agi',
92
+ // Phase 3: source regex
93
+ source_animate_gated: sourceWiredGate,
94
+ source_attr_wired: sourceWiredAttr,
95
+ };
96
+ const ok = Object.values(results).every(Boolean);
97
+ console.log(`${ok ? '✅' : '❌'} R519 watermark breath:`, JSON.stringify(results, null, 2),
98
+ '\n normal:', JSON.stringify(normal),
99
+ '\n reduced:', JSON.stringify(reduced));
100
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,114 @@
1
+ /* Round 525 verification: brand watermark gains focal-recede on
2
+ * non-hub canvas hover — extends R507/R508 focal-recede pattern to
3
+ * 3rd anchor.
4
+ *
5
+ * Test phases:
6
+ * 1. rest: wrapper opacity=1, recede attr='false'
7
+ * 2. hover an alias (non-hub canvas surface): wrapper opacity=0.7,
8
+ * recede attr='true'
9
+ * 3. mouseleave: wrapper opacity returns to 1
10
+ * 4. SMIL <animate> still mounted on inner text (R519 preserved)
11
+ * 5. source-side regex confirms wrapper opacity ternary + attr
12
+ */
13
+ import { chromium } from 'playwright';
14
+ import { readFileSync } from 'node:fs';
15
+
16
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
17
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
18
+
19
+ const browser = await chromium.launch({ headless: true });
20
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
21
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
22
+ await ctx.addInitScript(() => {
23
+ try {
24
+ localStorage.setItem('anet-theme', 'cyber');
25
+ localStorage.setItem('anet-topo-layout', 'ring');
26
+ sessionStorage.setItem('anet_v3_auth', '1');
27
+ } catch {}
28
+ });
29
+ await ctx.route('**/api/hub/status*', async (route) => {
30
+ const r = await route.fetch();
31
+ const b = await r.json();
32
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
33
+ const mk = (alias) => ({
34
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
35
+ network_id: nid, project_dir: null,
36
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
37
+ });
38
+ await route.fulfill({ response: r, json: { ...b, sessions: [
39
+ mk('alpha·1'), mk('alpha·2'), mk('alpha·3'),
40
+ ] } });
41
+ });
42
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
43
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
44
+ const page = await ctx.newPage();
45
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
46
+ await page.waitForSelector('[data-topo-brand-watermark-wrapper]', { timeout: 15000 });
47
+ await page.waitForTimeout(800);
48
+
49
+ // Phase 1: rest
50
+ const rest = await page.evaluate(() => {
51
+ const w = document.querySelector('[data-topo-brand-watermark-wrapper]');
52
+ const t = document.querySelector('[data-topo-brand-watermark]');
53
+ const animate = t?.querySelector('animate');
54
+ return {
55
+ wOpacity: w?.getAttribute('opacity'),
56
+ wRecede: w?.getAttribute('data-topo-brand-watermark-recede'),
57
+ hasAnimate: !!animate,
58
+ textContent: t?.textContent?.trim() || null,
59
+ };
60
+ });
61
+
62
+ // Phase 2: trigger focal-recede via hoveredStatus by hovering the
63
+ // legend `idle` row's label. setHoveredStatus is one of the recede
64
+ // gate vars; the label is a stable hover target (HTML+SVG safe per
65
+ // R518 test path).
66
+ await page.hover('[data-legend-row-label="idle"]');
67
+ await page.waitForTimeout(400);
68
+ const hover = await page.evaluate(() => {
69
+ const w = document.querySelector('[data-topo-brand-watermark-wrapper]');
70
+ return {
71
+ wOpacity: w?.getAttribute('opacity'),
72
+ wRecede: w?.getAttribute('data-topo-brand-watermark-recede'),
73
+ };
74
+ });
75
+
76
+ // Phase 3: physical mouse move far away from any hover target
77
+ await page.mouse.move(900, 50);
78
+ await page.waitForTimeout(400);
79
+ const leave = await page.evaluate(() => {
80
+ const w = document.querySelector('[data-topo-brand-watermark-wrapper]');
81
+ return {
82
+ wOpacity: w?.getAttribute('opacity'),
83
+ wRecede: w?.getAttribute('data-topo-brand-watermark-recede'),
84
+ };
85
+ });
86
+
87
+ await browser.close();
88
+
89
+ // Source regex
90
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
91
+ const sourceWiredOpacity =
92
+ /opacity=\{\(hoveredAlias \|\| hoveredEdgeKey \|\| hoveredGroupLabel \|\|\s*hoveredStatus \|\| hoveredVendor\) && !hoveredHub \? 0\.7 : 1\}/.test(src);
93
+ const sourceWiredAttr =
94
+ /data-topo-brand-watermark-recede=\{\s*\(hoveredAlias \|\| hoveredEdgeKey \|\| hoveredGroupLabel \|\|\s*hoveredStatus \|\| hoveredVendor\) && !hoveredHub \? 'true' : 'false'\s*\}/.test(src);
95
+
96
+ const results = {
97
+ rest_wrapper_opacity_1: rest?.wOpacity === '1',
98
+ rest_recede_false: rest?.wRecede === 'false',
99
+ rest_has_animate: rest?.hasAnimate === true, // R519 SMIL preserved
100
+ rest_text_content: rest?.textContent === 'sleep2agi',
101
+ hover_wrapper_opacity_07: hover?.wOpacity === '0.7',
102
+ hover_recede_true: hover?.wRecede === 'true',
103
+ leave_wrapper_opacity_1: leave?.wOpacity === '1',
104
+ leave_recede_false: leave?.wRecede === 'false',
105
+ source_opacity_wired: sourceWiredOpacity,
106
+ source_attr_wired: sourceWiredAttr,
107
+ };
108
+ const ok = Object.values(results).every(Boolean);
109
+ console.log(`${ok ? '✅' : '❌'} R525 watermark focal-recede:`,
110
+ JSON.stringify(results, null, 2),
111
+ '\n rest:', JSON.stringify(rest),
112
+ '\n hover:', JSON.stringify(hover),
113
+ '\n leave:', JSON.stringify(leave));
114
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,94 @@
1
+ /* Round 596 verification: chrome zoom +/- segmented buttons
2
+ * gain hover:brightness-[1.15] via Tailwind class. 35th + 36th
3
+ * anchors in per-element brightness family (4th + 5th HTML).
4
+ * Paired-anchor round closing the zoom control trio.
5
+ *
6
+ * Test phases:
7
+ * 1. mock nodes → chrome zoom buttons render
8
+ * 2. rest: filter='none' (CSS hover-only, no React state)
9
+ * 3. computed transition-property contains 'filter'
10
+ * 4. source: hover:brightness-[1.15] in className + arbitrary
11
+ * transition-property includes filter
12
+ */
13
+ import { chromium } from 'playwright';
14
+ import { readFileSync } from 'node:fs';
15
+
16
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
17
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
18
+
19
+ const browser = await chromium.launch({ headless: true });
20
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
21
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
22
+ await ctx.addInitScript(() => {
23
+ try {
24
+ localStorage.setItem('anet-theme', 'cyber');
25
+ localStorage.setItem('anet-topo-layout', 'ring');
26
+ sessionStorage.setItem('anet_v3_auth', '1');
27
+ } catch {}
28
+ });
29
+ await ctx.route('**/api/hub/status*', async (route) => {
30
+ const r = await route.fetch();
31
+ const b = await r.json();
32
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
33
+ const mk = (alias) => ({
34
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
35
+ network_id: nid, project_dir: null,
36
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
37
+ });
38
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
39
+ });
40
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
41
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
42
+ const page = await ctx.newPage();
43
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
44
+ await page.waitForSelector('[data-topo-chrome-zoom-out]', { timeout: 15000, state: 'attached' });
45
+ await page.waitForTimeout(500);
46
+
47
+ const rest = await page.evaluate(() => {
48
+ const zoomOut = document.querySelector('[data-topo-chrome-zoom-out]');
49
+ const zoomIn = document.querySelector('[data-topo-chrome-zoom-in]');
50
+ if (!zoomOut || !zoomIn) return null;
51
+ return {
52
+ zoomOut: {
53
+ filter: getComputedStyle(zoomOut).filter,
54
+ transitionProperty: getComputedStyle(zoomOut).transitionProperty,
55
+ brightnessHoverAttr: zoomOut.getAttribute('data-topo-chrome-zoom-out-brightness-hover'),
56
+ ariaLabel: zoomOut.getAttribute('aria-label'),
57
+ },
58
+ zoomIn: {
59
+ filter: getComputedStyle(zoomIn).filter,
60
+ transitionProperty: getComputedStyle(zoomIn).transitionProperty,
61
+ brightnessHoverAttr: zoomIn.getAttribute('data-topo-chrome-zoom-in-brightness-hover'),
62
+ ariaLabel: zoomIn.getAttribute('aria-label'),
63
+ },
64
+ };
65
+ });
66
+
67
+ await browser.close();
68
+
69
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
70
+ const sourceOutFilter = /data-topo-chrome-zoom-out[\s\S]*?hover:brightness-\[1\.15\]/.test(src);
71
+ const sourceInFilter = /data-topo-chrome-zoom-in[\s\S]*?hover:brightness-\[1\.15\]/.test(src);
72
+ const sourceOutTransition = /data-topo-chrome-zoom-out[\s\S]*?\[transition-property:color,background-color,transform,filter\]/.test(src);
73
+ const sourceInTransition = /data-topo-chrome-zoom-in[\s\S]*?\[transition-property:color,background-color,transform,filter\]/.test(src);
74
+
75
+ const results = {
76
+ both_buttons_present: !!rest,
77
+ out_rest_filter_none: rest?.zoomOut.filter === 'none',
78
+ in_rest_filter_none: rest?.zoomIn.filter === 'none',
79
+ out_hover_attr: rest?.zoomOut.brightnessHoverAttr === '1.15',
80
+ in_hover_attr: rest?.zoomIn.brightnessHoverAttr === '1.15',
81
+ out_aria_zoom_out: /zoom out/i.test(rest?.zoomOut.ariaLabel || ''),
82
+ in_aria_zoom_in: /zoom in/i.test(rest?.zoomIn.ariaLabel || ''),
83
+ out_transition_filter: /filter/.test(rest?.zoomOut.transitionProperty || ''),
84
+ in_transition_filter: /filter/.test(rest?.zoomIn.transitionProperty || ''),
85
+ source_out_filter: sourceOutFilter,
86
+ source_in_filter: sourceInFilter,
87
+ source_out_transition: sourceOutTransition,
88
+ source_in_transition: sourceInTransition,
89
+ };
90
+ const ok = Object.values(results).every(Boolean);
91
+ console.log(`${ok ? '✅' : '❌'} R596 zoom +/- brightness (35+36th anchors, zoom trio closure):`,
92
+ JSON.stringify(results, null, 2),
93
+ `\n rest: ${JSON.stringify(rest)}`);
94
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,83 @@
1
+ /* Round 593 verification: chrome zoom-level readout <span>
2
+ * gains filter brightness(1.15) on hoveredZoomLevel. 32nd
3
+ * anchor in per-element brightness family, FIRST HTML-element
4
+ * brightness anchor outside the SVG canvas.
5
+ *
6
+ * Test phases:
7
+ * 1. mock nodes → chrome strip renders with zoom-level span
8
+ * 2. rest (no hover): filter='none', brightness-attr='1'
9
+ * 3. transition-property contains 'filter'
10
+ * 4. source: filter conditional + data-attr + transition extension
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-topo-chrome-zoom-level-brightness]', { timeout: 15000, state: 'attached' });
44
+ await page.waitForTimeout(500);
45
+
46
+ const rest = await page.evaluate(() => {
47
+ const el = document.querySelector('[data-topo-chrome-zoom-level-brightness]');
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-topo-chrome-zoom-level-brightness'),
54
+ hoverAttr: el.getAttribute('data-topo-chrome-zoom-level-hover'),
55
+ colorAttr: el.getAttribute('data-topo-chrome-zoom-level-color'),
56
+ textContent: el.textContent,
57
+ };
58
+ });
59
+
60
+ await browser.close();
61
+
62
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
63
+ const sourceFilter = /filter: hoveredZoomLevel \? 'brightness\(1\.15\)' : undefined/.test(src);
64
+ const sourceAttr = /data-topo-chrome-zoom-level-brightness=\{hoveredZoomLevel \? '1\.15' : '1'\}/.test(src);
65
+ const sourceTransition = /transition: 'color 200ms ease-out, border-color 200ms ease-out, letter-spacing 200ms ease-out, font-weight 200ms ease-out, filter 200ms ease-out'/.test(src);
66
+
67
+ const results = {
68
+ span_present: !!rest,
69
+ rest_filter_none: rest?.filter === 'none',
70
+ rest_brightness_1: rest?.brightnessAttr === '1',
71
+ rest_hover_false: rest?.hoverAttr === 'false',
72
+ rest_color_text: rest?.colorAttr === 'text',
73
+ text_has_percent: /\d+%/.test(rest?.textContent || ''),
74
+ transition_has_filter: /filter/.test(rest?.transitionProperty || ''),
75
+ source_filter: sourceFilter,
76
+ source_attr: sourceAttr,
77
+ source_transition: sourceTransition,
78
+ };
79
+ const ok = Object.values(results).every(Boolean);
80
+ console.log(`${ok ? '✅' : '❌'} R593 zoom-level brightness (32nd anchor, first HTML-element):`,
81
+ JSON.stringify(results, null, 2),
82
+ `\n rest: ${JSON.stringify(rest)}`);
83
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,105 @@
1
+ /* Round 517 verification: chrome zoom-level readout gains a 3rd hover
2
+ * axis — color brighten from pal.legendText → pal.legendHeadline.
3
+ *
4
+ * Test phases:
5
+ * 1. rest: data-topo-chrome-zoom-level-color = 'text'
6
+ * + computed color matches pal.legendText (cyber: #94a3b8)
7
+ * 2. hover: data-topo-chrome-zoom-level-color = 'headline'
8
+ * + computed color matches pal.legendHeadline (cyber: #e5e7eb)
9
+ * + R347 letterSpacing still spreads (0.5px)
10
+ * + R420 fontWeight still lifts (600)
11
+ * 3. source-side regex confirms the color ternary wiring
12
+ */
13
+ import { chromium } from 'playwright';
14
+ import { readFileSync } from 'node:fs';
15
+
16
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
17
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
18
+
19
+ const browser = await chromium.launch({ headless: true });
20
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
21
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
22
+ await ctx.addInitScript(() => {
23
+ try {
24
+ localStorage.setItem('anet-theme', 'cyber');
25
+ localStorage.setItem('anet-topo-layout', 'ring');
26
+ sessionStorage.setItem('anet_v3_auth', '1');
27
+ } catch {}
28
+ });
29
+ await ctx.route('**/api/hub/status*', async (route) => {
30
+ const r = await route.fetch();
31
+ const b = await r.json();
32
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
33
+ const mk = (alias) => ({
34
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
35
+ network_id: nid, project_dir: null,
36
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
37
+ });
38
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1')] } });
39
+ });
40
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
41
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
42
+ const page = await ctx.newPage();
43
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
44
+ await page.waitForSelector('[data-topo-chrome-zoom-level]', { timeout: 15000 });
45
+ await page.waitForTimeout(800);
46
+
47
+ // Phase 1: rest
48
+ const rest = await page.evaluate(() => {
49
+ const el = document.querySelector('[data-topo-chrome-zoom-level]');
50
+ if (!el) return null;
51
+ const cs = getComputedStyle(el);
52
+ return {
53
+ attrColor: el.getAttribute('data-topo-chrome-zoom-level-color'),
54
+ attrHover: el.getAttribute('data-topo-chrome-zoom-level-hover'),
55
+ color: cs.color,
56
+ letterSpacing: cs.letterSpacing,
57
+ fontWeight: cs.fontWeight,
58
+ };
59
+ });
60
+
61
+ // Phase 2: hover
62
+ await page.hover('[data-topo-chrome-zoom-level]');
63
+ await page.waitForTimeout(350); // 200ms transition + slack
64
+ const hover = await page.evaluate(() => {
65
+ const el = document.querySelector('[data-topo-chrome-zoom-level]');
66
+ if (!el) return null;
67
+ const cs = getComputedStyle(el);
68
+ return {
69
+ attrColor: el.getAttribute('data-topo-chrome-zoom-level-color'),
70
+ attrHover: el.getAttribute('data-topo-chrome-zoom-level-hover'),
71
+ color: cs.color,
72
+ letterSpacing: cs.letterSpacing,
73
+ fontWeight: cs.fontWeight,
74
+ };
75
+ });
76
+
77
+ // Phase 3: source regex
78
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
79
+ const sourceWired =
80
+ /color: hoveredZoomLevel \? pal\.legendHeadline : pal\.legendText,/.test(src) &&
81
+ /data-topo-chrome-zoom-level-color=\{hoveredZoomLevel \? 'headline' : 'text'\}/.test(src);
82
+
83
+ await browser.close();
84
+
85
+ // pal.legendText cyber = #94a3b8 → rgb(148, 163, 184)
86
+ // pal.legendHeadline cyber = #e5e7eb → rgb(229, 231, 235)
87
+ const restColor = 'rgb(148, 163, 184)';
88
+ const hoverColor = 'rgb(229, 231, 235)';
89
+
90
+ const results = {
91
+ rest_attr_text: rest?.attrColor === 'text',
92
+ rest_attr_hover_false: rest?.attrHover === 'false',
93
+ rest_color_legendText: rest?.color === restColor,
94
+ rest_letter_spacing_0: rest?.letterSpacing === '0px' || rest?.letterSpacing === 'normal',
95
+ hover_attr_headline: hover?.attrColor === 'headline',
96
+ hover_attr_hover_true: hover?.attrHover === 'true',
97
+ hover_color_legendHead: hover?.color === hoverColor,
98
+ hover_letter_spacing_5: hover?.letterSpacing === '0.5px',
99
+ hover_font_weight_600: hover?.fontWeight === '600',
100
+ source_wired: sourceWired,
101
+ };
102
+ const ok = Object.values(results).every(Boolean);
103
+ console.log(`${ok ? '✅' : '❌'} R517 zoom-level 3-axis hover:`, JSON.stringify(results, null, 2),
104
+ '\n rest:', JSON.stringify(rest), '\n hover:', JSON.stringify(hover));
105
+ process.exit(ok ? 0 : 1);