@sleep2agi/agent-network-dashboard 0.5.3-preview.22 → 0.5.3-preview.221

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 (359) 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/{0l440-mv.tqcj.js → 01y2e_k826-.6.js} +1 -1
  143. package/.next/static/chunks/0l2u50d_2k5uz.js +4 -0
  144. package/.next/static/chunks/0u-m.q18hv~8~.js +1 -0
  145. package/.next/static/chunks/10~rut8fhur6w.css +2 -0
  146. package/.next/static/chunks/14_qeodw_r83j.js +1 -0
  147. package/.next/trace +2 -2
  148. package/.next/trace-build +1 -1
  149. package/app/components/TopoGraph.tsx +5425 -177
  150. package/app/globals.css +405 -7
  151. package/package.json +4 -4
  152. package/scripts/topo-active-chrome-hover-text-test.mjs +107 -0
  153. package/scripts/topo-active-links-chip-halo-layers-test.mjs +81 -0
  154. package/scripts/topo-alias-chat-brightness-test.mjs +79 -0
  155. package/scripts/topo-alias-text-halo-layers-test.mjs +98 -0
  156. package/scripts/topo-avatar-chat-gate-test.mjs +77 -0
  157. package/scripts/topo-avatar-drop-shadow-test.mjs +86 -0
  158. package/scripts/topo-avatar-fallback-hover-test.mjs +104 -0
  159. package/scripts/topo-avatar-fallback-rotate-test.mjs +92 -0
  160. package/scripts/topo-avatar-rotate-test.mjs +85 -0
  161. package/scripts/topo-avatar-scale-test.mjs +89 -0
  162. package/scripts/topo-badge-chat-gate-test.mjs +74 -0
  163. package/scripts/topo-brand-drop-shadow-test.mjs +71 -0
  164. package/scripts/topo-brand-logo-breath-test.mjs +102 -0
  165. package/scripts/topo-brand-logo-halo-layers-test.mjs +85 -0
  166. package/scripts/topo-brand-logo-hover-brightness-test.mjs +105 -0
  167. package/scripts/topo-brand-logo-hover-rotate-test.mjs +93 -0
  168. package/scripts/topo-brand-logo-hover-test.mjs +85 -0
  169. package/scripts/topo-card-chat-brightness-test.mjs +86 -0
  170. package/scripts/topo-chat-ring-breath-curve-test.mjs +114 -0
  171. package/scripts/topo-chat-ring-brightness-test.mjs +80 -0
  172. package/scripts/topo-chat-ring-halo-layers-test.mjs +100 -0
  173. package/scripts/topo-chat-ring-r-breath-test.mjs +121 -0
  174. package/scripts/topo-chat-ring-status-halo-test.mjs +106 -0
  175. package/scripts/topo-chat-ring-sw-breath-test.mjs +123 -0
  176. package/scripts/topo-chip-pin-halo-test.mjs +85 -0
  177. package/scripts/topo-chip-row-digit-ls-test.mjs +135 -0
  178. package/scripts/topo-chip-row-member-alias-lit-test.mjs +154 -0
  179. package/scripts/topo-chip-row-tier-glow-brightness-test.mjs +99 -0
  180. package/scripts/topo-chip-row-unit-hover-tracking-test.mjs +124 -0
  181. package/scripts/topo-chrome-control-halo-layers-test.mjs +22 -0
  182. package/scripts/topo-chrome-layout-trailer-breath-test.mjs +86 -0
  183. package/scripts/topo-chrome-wrapper-halo-test.mjs +83 -0
  184. package/scripts/topo-click-ripple-glow-test.mjs +86 -0
  185. package/scripts/topo-click-ripple-halo-layers-test.mjs +79 -0
  186. package/scripts/topo-click-ripple-sw-test.mjs +110 -0
  187. package/scripts/topo-cluster-count-attr-test.mjs +80 -0
  188. package/scripts/topo-crescent-breath-test.mjs +104 -0
  189. package/scripts/topo-crescent-envelope-breath-test.mjs +103 -0
  190. package/scripts/topo-crescent-recede-test.mjs +111 -0
  191. package/scripts/topo-dense-alias-chat-halo-test.mjs +73 -0
  192. package/scripts/topo-dense-alias-halo-layers-test.mjs +80 -0
  193. package/scripts/topo-edge-badge-circle-brightness-test.mjs +82 -0
  194. package/scripts/topo-edge-badge-circle-hot-pulse-test.mjs +100 -0
  195. package/scripts/topo-edge-badge-digit-halo-layers-test.mjs +107 -0
  196. package/scripts/topo-edge-badge-endpoint-gate-test.mjs +94 -0
  197. package/scripts/topo-edge-badge-halo-layers-test.mjs +85 -0
  198. package/scripts/topo-edge-badge-hot-pulse-test.mjs +92 -0
  199. package/scripts/topo-edge-badge-hover-glow-test.mjs +90 -0
  200. package/scripts/topo-edge-badge-text-brightness-test.mjs +83 -0
  201. package/scripts/topo-edge-chat-gate-test.mjs +71 -0
  202. package/scripts/topo-edge-flow-rail-halo-layers-test.mjs +89 -0
  203. package/scripts/topo-edge-particle-brightness-test.mjs +82 -0
  204. package/scripts/topo-edge-particle-halo-layers-test.mjs +91 -0
  205. package/scripts/topo-edge-pill-glow-test.mjs +67 -0
  206. package/scripts/topo-edge-pin-halo-test.mjs +99 -0
  207. package/scripts/topo-edge-visible-brightness-test.mjs +84 -0
  208. package/scripts/topo-edge-visible-halo-layers-test.mjs +87 -0
  209. package/scripts/topo-endpoint-ring-brightness-test.mjs +83 -0
  210. package/scripts/topo-endpoint-ring-flow-halo-test.mjs +107 -0
  211. package/scripts/topo-endpoint-ring-halo-layers-test.mjs +100 -0
  212. package/scripts/topo-filter-pill-glow-test.mjs +90 -0
  213. package/scripts/topo-filter-pill-halo-layers-test.mjs +27 -0
  214. package/scripts/topo-flow-arrow-brightness-test.mjs +82 -0
  215. package/scripts/topo-flow-rail-brightness-test.mjs +80 -0
  216. package/scripts/topo-fullscreen-attr-test.mjs +73 -0
  217. package/scripts/topo-fullscreen-brightness-test.mjs +84 -0
  218. package/scripts/topo-fullscreen-icon-rotate-test.mjs +93 -0
  219. package/scripts/topo-grid-content-bottom-attr-test.mjs +72 -0
  220. package/scripts/topo-group-box-brightness-test.mjs +84 -0
  221. package/scripts/topo-group-box-halo-layers-test.mjs +91 -0
  222. package/scripts/topo-group-chat-gate-test.mjs +77 -0
  223. package/scripts/topo-group-label-brightness-test.mjs +84 -0
  224. package/scripts/topo-group-label-halo-layers-test.mjs +78 -0
  225. package/scripts/topo-group-label-hover-glow-test.mjs +86 -0
  226. package/scripts/topo-group-label-member-alias-hover-test.mjs +125 -0
  227. package/scripts/topo-group-pill-glow-test.mjs +76 -0
  228. package/scripts/topo-group-tint-brightness-test.mjs +82 -0
  229. package/scripts/topo-halo-chat-gate-test.mjs +72 -0
  230. package/scripts/topo-hover-detail-halo-test.mjs +76 -0
  231. package/scripts/topo-hub-core-brightness-test.mjs +82 -0
  232. package/scripts/topo-hub-core-halo-layers-test.mjs +81 -0
  233. package/scripts/topo-hub-digit-brightness-test.mjs +79 -0
  234. package/scripts/topo-hub-digit-halo-layers-test.mjs +76 -0
  235. package/scripts/topo-hub-digit-ls-test.mjs +119 -0
  236. package/scripts/topo-hub-halo-brightness-test.mjs +80 -0
  237. package/scripts/topo-hub-halo-glow-test.mjs +96 -0
  238. package/scripts/topo-hub-halo-halo-layers-test.mjs +76 -0
  239. package/scripts/topo-hub-highlight-amplify-test.mjs +139 -0
  240. package/scripts/topo-hub-highlight-brightness-test.mjs +84 -0
  241. package/scripts/topo-hub-highlight-fill-transition-test.mjs +84 -0
  242. package/scripts/topo-hub-highlight-glow-test.mjs +99 -0
  243. package/scripts/topo-hub-highlight-halo-layers-test.mjs +78 -0
  244. package/scripts/topo-hub-highlight-r-test.mjs +112 -0
  245. package/scripts/topo-hub-highlight-recede-test.mjs +5 -1
  246. package/scripts/topo-hub-highlight-theme-fill-test.mjs +83 -0
  247. package/scripts/topo-hub-hover-ring-brightness-test.mjs +79 -0
  248. package/scripts/topo-hub-hover-ring-glow-test.mjs +97 -0
  249. package/scripts/topo-hub-hover-ring-halo-layers-test.mjs +71 -0
  250. package/scripts/topo-hub-idle-breath-test.mjs +6 -7
  251. package/scripts/topo-hub-spoke-brightness-test.mjs +77 -0
  252. package/scripts/topo-hub-spoke-glow-test.mjs +112 -0
  253. package/scripts/topo-hub-spoke-halo-layers-test.mjs +97 -0
  254. package/scripts/topo-hub-spoke-self-filter-test.mjs +119 -0
  255. package/scripts/topo-kicker-breath-test.mjs +100 -0
  256. package/scripts/topo-kicker-halo-layers-test.mjs +82 -0
  257. package/scripts/topo-label-card-brightness-test.mjs +81 -0
  258. package/scripts/topo-layout-hover-fw-test.mjs +98 -0
  259. package/scripts/topo-layout-toggle-brightness-test.mjs +94 -0
  260. package/scripts/topo-layout-toggle-halo-layers-test.mjs +95 -0
  261. package/scripts/topo-legend-count-brightness-test.mjs +80 -0
  262. package/scripts/topo-legend-count-halo-layers-test.mjs +79 -0
  263. package/scripts/topo-legend-count-letter-spacing-test.mjs +108 -0
  264. package/scripts/topo-legend-label-fw-test.mjs +107 -0
  265. package/scripts/topo-legend-panel-title-breath-test.mjs +86 -0
  266. package/scripts/topo-legend-pin-ring-brightness-test.mjs +82 -0
  267. package/scripts/topo-legend-pin-ring-halo-layers-test.mjs +71 -0
  268. package/scripts/topo-legend-row-count-brightness-test.mjs +85 -0
  269. package/scripts/topo-legend-row-label-glow-test.mjs +102 -0
  270. package/scripts/topo-legend-swatch-glow-test.mjs +109 -0
  271. package/scripts/topo-legend-swatch-member-alias-match-test.mjs +139 -0
  272. package/scripts/topo-legend-tint-brightness-test.mjs +83 -0
  273. package/scripts/topo-legend-trio-halo-layers-test.mjs +22 -0
  274. package/scripts/topo-minimap-container-halo-test.mjs +82 -0
  275. package/scripts/topo-minimap-dot-chat-gate-test.mjs +81 -0
  276. package/scripts/topo-minimap-hover-glow-test.mjs +109 -0
  277. package/scripts/topo-minimap-viewport-brightness-test.mjs +84 -0
  278. package/scripts/topo-minimap-viewport-halo-layers-test.mjs +24 -0
  279. package/scripts/topo-more-footer-brightness-test.mjs +94 -0
  280. package/scripts/topo-node-alias-brightness-test.mjs +84 -0
  281. package/scripts/topo-node-avatar-halo-layers-test.mjs +25 -0
  282. package/scripts/topo-node-hover-ring-halo-layers-test.mjs +70 -0
  283. package/scripts/topo-node-label-card-halo-test.mjs +76 -0
  284. package/scripts/topo-node-sub-text-brightness-test.mjs +88 -0
  285. package/scripts/topo-nodesize-brightness-test.mjs +82 -0
  286. package/scripts/topo-nodesize-halo-layers-test.mjs +89 -0
  287. package/scripts/topo-nodesize-hover-fw-test.mjs +99 -0
  288. package/scripts/topo-orphan-label-opacity-test.mjs +98 -0
  289. package/scripts/topo-panel-count-halo-layers-test.mjs +91 -0
  290. package/scripts/topo-panel-count-hover-ls-test.mjs +87 -0
  291. package/scripts/topo-panel-rect-halo-test.mjs +90 -0
  292. package/scripts/topo-panel-row-brightness-test.mjs +116 -0
  293. package/scripts/topo-panel-title-brightness-test.mjs +98 -0
  294. package/scripts/topo-panel-title-glow-test.mjs +111 -0
  295. package/scripts/topo-panel-titles-halo-layers-test.mjs +23 -0
  296. package/scripts/topo-pill-x-rotate-test.mjs +96 -0
  297. package/scripts/topo-pip-brightness-test.mjs +85 -0
  298. package/scripts/topo-pressure-bar-halo-layers-test.mjs +19 -0
  299. package/scripts/topo-pressure-seg-glow-test.mjs +92 -0
  300. package/scripts/topo-pressure-seg-member-alias-match-test.mjs +133 -0
  301. package/scripts/topo-pressure-seg-motion-test.mjs +101 -0
  302. package/scripts/topo-recent-count-brightness-test.mjs +84 -0
  303. package/scripts/topo-recent-more-fw-test.mjs +126 -0
  304. package/scripts/topo-recent-more-halo-layers-test.mjs +90 -0
  305. package/scripts/topo-recent-panel-hot-pulse-test.mjs +105 -0
  306. package/scripts/topo-recent-panel-title-breath-test.mjs +91 -0
  307. package/scripts/topo-recent-pip-halo-layers-test.mjs +82 -0
  308. package/scripts/topo-recent-row-chat-gate-test.mjs +75 -0
  309. package/scripts/topo-recent-row-content-lift-test.mjs +140 -0
  310. package/scripts/topo-recent-row-fw-test.mjs +115 -0
  311. package/scripts/topo-recent-row-text-glow-test.mjs +86 -0
  312. package/scripts/topo-recent-row-text-halo-layers-test.mjs +67 -0
  313. package/scripts/topo-recent-tint-brightness-test.mjs +80 -0
  314. package/scripts/topo-recent-ts-brightness-test.mjs +86 -0
  315. package/scripts/topo-reduced-motion-attr-test.mjs +69 -0
  316. package/scripts/topo-reset-brightness-test.mjs +83 -0
  317. package/scripts/topo-reset-icon-hover-scale-test.mjs +102 -0
  318. package/scripts/topo-runtime-badge-brightness-test.mjs +78 -0
  319. package/scripts/topo-runtime-badge-glow-test.mjs +108 -0
  320. package/scripts/topo-runtime-badge-halo-layers-test.mjs +87 -0
  321. package/scripts/topo-runtime-badge-rotate-test.mjs +85 -0
  322. package/scripts/topo-section-title-breath-test.mjs +83 -0
  323. package/scripts/topo-section-title-halo-layers-test.mjs +88 -0
  324. package/scripts/topo-spoke-chat-gate-test.mjs +72 -0
  325. package/scripts/topo-starfield-hue-test.mjs +109 -0
  326. package/scripts/topo-status-pin-pill-halo-layers-test.mjs +17 -0
  327. package/scripts/topo-status-ring-brightness-test.mjs +84 -0
  328. package/scripts/topo-status-ring-chat-gate-test.mjs +72 -0
  329. package/scripts/topo-status-ring-halo-layers-test.mjs +105 -0
  330. package/scripts/topo-status-ring-status-halo-test.mjs +110 -0
  331. package/scripts/topo-sub-text-chat-brightness-test.mjs +81 -0
  332. package/scripts/topo-title-block-envelope-breath-test.mjs +87 -0
  333. package/scripts/topo-titleblock-h2-hover-fw-test.mjs +109 -0
  334. package/scripts/topo-titleblock-h2-hover-tracking-test.mjs +128 -0
  335. package/scripts/topo-titleblock-kicker-hover-test.mjs +134 -0
  336. package/scripts/topo-vendor-chip-glow-test.mjs +97 -0
  337. package/scripts/topo-vendor-chip-halo-layers-test.mjs +18 -0
  338. package/scripts/topo-vendor-chip-pin-halo-test.mjs +88 -0
  339. package/scripts/topo-vendor-count-suffix-halo-layers-test.mjs +79 -0
  340. package/scripts/topo-vendor-distribution-wrapper-halo-test.mjs +93 -0
  341. package/scripts/topo-vendor-letter-halo-layers-test.mjs +93 -0
  342. package/scripts/topo-vendor-pill-glow-test.mjs +98 -0
  343. package/scripts/topo-watermark-breath-test.mjs +100 -0
  344. package/scripts/topo-watermark-envelope-breath-test.mjs +88 -0
  345. package/scripts/topo-watermark-recede-test.mjs +114 -0
  346. package/scripts/topo-working-online-chip-halo-layers-test.mjs +94 -0
  347. package/scripts/topo-zoom-buttons-brightness-test.mjs +94 -0
  348. package/scripts/topo-zoom-in-out-halo-layers-test.mjs +97 -0
  349. package/scripts/topo-zoom-level-breath-test.mjs +87 -0
  350. package/scripts/topo-zoom-level-brightness-test.mjs +83 -0
  351. package/scripts/topo-zoom-level-color-test.mjs +105 -0
  352. package/scripts/topo-zoom-level-halo-layers-test.mjs +78 -0
  353. package/.next/static/chunks/0g2t4ytep_laz.js +0 -4
  354. package/.next/static/chunks/0m.1mvl~t.avc.css +0 -2
  355. package/.next/static/chunks/0zm6yg97ubkp5.js +0 -1
  356. package/.next/static/chunks/1867gm.v~vka2.js +0 -1
  357. /package/.next/static/{oGQapRVlgbDN-Wxb5B4gq → 1PfQhDLU997pzw51rqEG8}/_buildManifest.js +0 -0
  358. /package/.next/static/{oGQapRVlgbDN-Wxb5B4gq → 1PfQhDLU997pzw51rqEG8}/_clientMiddlewareManifest.js +0 -0
  359. /package/.next/static/{oGQapRVlgbDN-Wxb5B4gq → 1PfQhDLU997pzw51rqEG8}/_ssgManifest.js +0 -0
@@ -0,0 +1,112 @@
1
+ /* Round 529 verification: hub-highlight gains geometric amplify
2
+ * r 5.5 → 6 on hub-hover — focal-amplify family 3rd anchor.
3
+ *
4
+ * Test phases (workingCount === 0 so highlight renders visibly):
5
+ * 1. rest: data-topo-hub-highlight-radius = 5.5,
6
+ * computed r ≈ 5.5px (CSS property),
7
+ * hovered attr = 'false'
8
+ * 2. hover hub (via page.mouse.move to highlight bbox):
9
+ * data-topo-hub-highlight-radius = 6,
10
+ * computed r ≈ 6px,
11
+ * hovered attr = 'true'
12
+ * 3. transition list includes `r 200ms ease-out`
13
+ * 4. source-side regex confirms highlightR ternary + style.r wiring
14
+ */
15
+ import { chromium } from 'playwright';
16
+ import { readFileSync } from 'node:fs';
17
+
18
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
19
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
20
+
21
+ const browser = await chromium.launch({ headless: true });
22
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
23
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
24
+ await ctx.addInitScript(() => {
25
+ try {
26
+ localStorage.setItem('anet-theme', 'cyber');
27
+ localStorage.setItem('anet-topo-layout', 'ring');
28
+ sessionStorage.setItem('anet_v3_auth', '1');
29
+ } catch {}
30
+ });
31
+ await ctx.route('**/api/hub/status*', async (route) => {
32
+ const r = await route.fetch();
33
+ const b = await r.json();
34
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
35
+ const mk = (alias) => ({
36
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
37
+ network_id: nid, project_dir: null,
38
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
39
+ });
40
+ // workingCount=0 (all idle) so highlight is visible
41
+ await route.fulfill({ response: r, json: { ...b, sessions: [
42
+ mk('alpha·1'), mk('alpha·2'), mk('alpha·3'),
43
+ ] } });
44
+ });
45
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
46
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
47
+ const page = await ctx.newPage();
48
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
49
+ await page.waitForSelector('[data-topo-hub-highlight]', { timeout: 15000 });
50
+ await page.waitForTimeout(800);
51
+
52
+ const restRead = async () => page.evaluate(() => {
53
+ const el = document.querySelector('[data-topo-hub-highlight]');
54
+ if (!el) return null;
55
+ const cs = getComputedStyle(el);
56
+ return {
57
+ attrR: el.getAttribute('data-topo-hub-highlight-radius'),
58
+ attrHovered: el.getAttribute('data-topo-hub-highlight-hovered'),
59
+ attrVisible: el.getAttribute('data-topo-hub-highlight-visible'),
60
+ cssR: cs.r, // computed CSS `r` value
61
+ transition: cs.transition,
62
+ };
63
+ });
64
+
65
+ // Phase 1: rest
66
+ const rest = await restRead();
67
+
68
+ // Phase 2: hover hub (via mouse.move to highlight bbox center —
69
+ // banked path from R527 hub-digit-ls test)
70
+ const bbox = await page.locator('[data-topo-hub-highlight]').first().boundingBox();
71
+ if (bbox) {
72
+ await page.mouse.move(bbox.x + bbox.width / 2, bbox.y + bbox.height / 2);
73
+ }
74
+ await page.waitForTimeout(400);
75
+ const hover = await restRead();
76
+
77
+ await browser.close();
78
+
79
+ // Source regex
80
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
81
+ const sourceHighlightRTernary =
82
+ /const highlightR = !reducedMotion && hoveredHub \? 6 : 5\.5;/.test(src);
83
+ const sourceStyleR =
84
+ /r: `\$\{highlightR\}px`,/.test(src);
85
+ const sourceTransitionR =
86
+ /transition: 'opacity 300ms ease-out, fill 200ms ease-out, r 200ms ease-out'/.test(src);
87
+ const sourceAttrDynamic =
88
+ /data-topo-hub-highlight-radius=\{highlightR\}/.test(src);
89
+
90
+ const approxEq = (a, b, tol = 0.1) => Math.abs(a - b) < tol;
91
+
92
+ const results = {
93
+ rest_attr_55: rest?.attrR === '5.5',
94
+ rest_hovered_false: rest?.attrHovered === 'false',
95
+ rest_visible_true: rest?.attrVisible === 'true', // workingCount=0
96
+ rest_css_r_55: approxEq(parseFloat(rest?.cssR || '0'), 5.5),
97
+ rest_transition_has_r: /\br\b/.test(rest?.transition || '') ||
98
+ /\b(r 200ms|r 0\.2s)/.test(rest?.transition || ''),
99
+ hover_attr_6: hover?.attrR === '6',
100
+ hover_hovered_true: hover?.attrHovered === 'true',
101
+ hover_css_r_6: approxEq(parseFloat(hover?.cssR || '0'), 6),
102
+ source_highlightR_ternary: sourceHighlightRTernary,
103
+ source_style_r: sourceStyleR,
104
+ source_transition_r: sourceTransitionR,
105
+ source_attr_dynamic: sourceAttrDynamic,
106
+ };
107
+ const ok = Object.values(results).every(Boolean);
108
+ console.log(`${ok ? '✅' : '❌'} R529 hub-highlight hover r:`,
109
+ JSON.stringify(results, null, 2),
110
+ '\n rest:', JSON.stringify(rest),
111
+ '\n hover:', JSON.stringify(hover));
112
+ process.exit(ok ? 0 : 1);
@@ -109,7 +109,11 @@ await browser.close();
109
109
  const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
110
110
  const sourceIIFE = /const hubRecede = !!\(\(hoveredAlias \|\| hoveredEdgeKey \|\| hoveredGroupLabel/.test(src);
111
111
  const sourceOpacityMultiplier = /const resolvedOpacity = hubRecede \? baseOpacity \* 0\.85 : baseOpacity;/.test(src);
112
- const sourceBreathGate = /const breathActive = !reducedMotion && workingCount === 0 && !hubRecede;/.test(src);
112
+ // R511 extension: breathActive now also halts on hoveredHub (hub-hover
113
+ // amplify state added to the 3-state opacity ladder). Regex updated to
114
+ // match the extended formula. Runtime DOM contract (rest = breath true)
115
+ // unchanged.
116
+ const sourceBreathGate = /const breathActive = !reducedMotion && workingCount === 0 && !hubRecede && !hoveredHub;/.test(src);
113
117
  const sourceAnimateGate = /\{breathActive && \(\s*<animate/.test(src);
114
118
 
115
119
  const approxEq = (a, b) => Math.abs(parseFloat(a) - b) < 0.01;
@@ -0,0 +1,83 @@
1
+ /* Round 509 verification: hub-highlight circle fill switches per theme.
2
+ * dark/cyber theme: #d1fae5 (emerald-100, pale)
3
+ * light theme: #10b981 (emerald-600, vibrant)
4
+ *
5
+ * Fixes a light-theme contrast issue where pale emerald-100 on a
6
+ * pale background rendered the dim disc effectively invisible.
7
+ *
8
+ * Test scenarios:
9
+ * 1. cyber theme — fill resolves to #d1fae5 (or rgb equivalent)
10
+ * 2. light theme — fill resolves to #10b981 (or rgb equivalent)
11
+ * 3. source-side ternary wired
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(theme) {
20
+ const browser = await chromium.launch({ headless: true });
21
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
22
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
23
+ await ctx.addInitScript((t) => {
24
+ try {
25
+ localStorage.setItem('anet-theme', t);
26
+ localStorage.setItem('anet-topo-layout', 'ring');
27
+ sessionStorage.setItem('anet_v3_auth', '1');
28
+ } catch {}
29
+ }, theme);
30
+ await ctx.route('**/api/hub/status*', async (route) => {
31
+ const r = await route.fetch();
32
+ const b = await r.json();
33
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
34
+ const mk = (alias, status) => ({
35
+ alias, status, model: 'claude-opus-4', runtime: 'claude-code-cli',
36
+ network_id: nid, project_dir: null,
37
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
38
+ });
39
+ // idle fleet so hub-highlight is visible
40
+ await route.fulfill({ response: r, json: { ...b, sessions: [
41
+ mk('alpha·a1', 'idle'),
42
+ ] } });
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-hub-highlight]', { timeout: 15000 });
49
+ await page.waitForTimeout(1500);
50
+ const result = await page.evaluate(() => {
51
+ const circle = document.querySelector('[data-topo-hub-highlight]');
52
+ if (!circle) return null;
53
+ return {
54
+ fill_attr: circle.getAttribute('fill'),
55
+ computed_fill: window.getComputedStyle(circle).fill,
56
+ };
57
+ });
58
+ await browser.close();
59
+ return result;
60
+ }
61
+
62
+ const cyber = await probe('cyber');
63
+ const light = await probe('light');
64
+
65
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
66
+ const sourceWired = /fill=\{isLight \? '#10b981' : '#d1fae5'\}/.test(src);
67
+
68
+ // fill_attr is the actual SVG attribute value (literal '#d1fae5' or '#10b981')
69
+ // computed_fill is browser-normalized ('rgb(...)' typically)
70
+ const cyberHexMatch = cyber && cyber.fill_attr === '#d1fae5';
71
+ const lightHexMatch = light && light.fill_attr === '#10b981';
72
+
73
+ const results = {
74
+ cyber_fill_d1fae5: cyberHexMatch,
75
+ light_fill_10b981: lightHexMatch,
76
+ themes_differ: cyber && light && cyber.fill_attr !== light.fill_attr,
77
+ source_wired: sourceWired,
78
+ };
79
+ const ok = Object.values(results).every(Boolean);
80
+ console.log(`${ok ? '✅' : '❌'} R509 hub-highlight theme fill:`, JSON.stringify(results),
81
+ '\n cyber:', JSON.stringify(cyber),
82
+ '\n light:', JSON.stringify(light));
83
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,79 @@
1
+ /* Round 579 verification: hub-hover-ring stacks brightness(1.15)
2
+ * onto R535 hub-hover drop-shadow. 18th anchor in per-element
3
+ * brightness family.
4
+ *
5
+ * Test phases:
6
+ * 1. rest: filter='none' (ring opacity=0 when not hovered),
7
+ * brightness-attr='1'
8
+ * 2. source: both theme filter expressions stack brightness
9
+ */
10
+ import { chromium } from 'playwright';
11
+ import { readFileSync } from 'node:fs';
12
+
13
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
14
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
15
+
16
+ const browser = await chromium.launch({ headless: true });
17
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
18
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
19
+ await ctx.addInitScript(() => {
20
+ try {
21
+ localStorage.setItem('anet-theme', 'cyber');
22
+ localStorage.setItem('anet-topo-layout', 'ring');
23
+ sessionStorage.setItem('anet_v3_auth', '1');
24
+ } catch {}
25
+ });
26
+ await ctx.route('**/api/hub/status*', async (route) => {
27
+ const r = await route.fetch();
28
+ const b = await r.json();
29
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
30
+ const mk = (alias) => ({
31
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
32
+ network_id: nid, project_dir: null,
33
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
34
+ });
35
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1')] } });
36
+ });
37
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
38
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
39
+ const page = await ctx.newPage();
40
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
41
+ await page.waitForSelector('[data-topo-hub-hover-ring]', { timeout: 15000 });
42
+ await page.waitForTimeout(500);
43
+
44
+ const rest = await page.evaluate(() => {
45
+ const el = document.querySelector('[data-topo-hub-hover-ring]');
46
+ if (!el) return null;
47
+ const cs = getComputedStyle(el);
48
+ return {
49
+ filter: cs.filter,
50
+ transitionProperty: cs.transitionProperty,
51
+ brightnessAttr: el.getAttribute('data-topo-hub-hover-ring-brightness'),
52
+ glowAttr: el.getAttribute('data-topo-hub-hover-ring-glow'),
53
+ opacityAttr: el.getAttribute('data-topo-hub-hover-ring-opacity'),
54
+ };
55
+ });
56
+
57
+ await browser.close();
58
+
59
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
60
+ const sourceLightFilter = /'drop-shadow\(0 0 3px rgba\(16, 185, 129, 0\.5\)\) brightness\(1\.15\)'/.test(src);
61
+ const sourceCyberFilter = /'drop-shadow\(0 0 3px rgba\(52, 211, 153, 0\.5\)\) brightness\(1\.15\)'/.test(src);
62
+ const sourceAttr = /data-topo-hub-hover-ring-brightness=\{!reducedMotion && hoveredHub \? '1\.15' : '1'\}/.test(src);
63
+
64
+ const results = {
65
+ ring_present: !!rest,
66
+ rest_filter_none: rest?.filter === 'none',
67
+ rest_brightness_1: rest?.brightnessAttr === '1',
68
+ rest_glow_false: rest?.glowAttr === 'false',
69
+ rest_opacity_0: rest?.opacityAttr === '0',
70
+ transition_has_filter: /filter/.test(rest?.transitionProperty || ''),
71
+ source_light_filter: sourceLightFilter,
72
+ source_cyber_filter: sourceCyberFilter,
73
+ source_attr: sourceAttr,
74
+ };
75
+ const ok = Object.values(results).every(Boolean);
76
+ console.log(`${ok ? '✅' : '❌'} R579 hub-hover-ring stacked brightness (18th anchor, hub-cluster closure 4/5):`,
77
+ JSON.stringify(results, null, 2),
78
+ `\n rest: ${JSON.stringify(rest)}`);
79
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,97 @@
1
+ /* Round 535 verification: hub hover-ring gains drop-shadow glow on
2
+ * hub-hover — completes hub-cluster glow quartet (digit + disc +
3
+ * spokes + ring).
4
+ *
5
+ * Test phases:
6
+ * 1. rest: glow attr='false', filter='none', opacity=0
7
+ * 2. hover hub (mouse.move to hub center bbox): glow='true',
8
+ * filter has cyber emerald-400 drop-shadow, opacity > 0
9
+ * 3. transition list includes 'filter 200ms ease-out'
10
+ * 4. source-side regex confirms filter ternary + transition wiring
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-hub-hover-ring]', { timeout: 15000 });
44
+ await page.waitForTimeout(800);
45
+
46
+ const restRead = async () => page.evaluate(() => {
47
+ const el = document.querySelector('[data-topo-hub-hover-ring]');
48
+ if (!el) return null;
49
+ const cs = getComputedStyle(el);
50
+ return {
51
+ glowAttr: el.getAttribute('data-topo-hub-hover-ring-glow'),
52
+ opacity: el.getAttribute('opacity'),
53
+ filter: cs.filter,
54
+ transition: cs.transition,
55
+ };
56
+ });
57
+
58
+ // Phase 1: rest
59
+ const rest = await restRead();
60
+
61
+ // Phase 2: hover hub via hub-highlight bbox (banked R527 path)
62
+ const hubBbox = await page.locator('[data-topo-hub-highlight]').first().boundingBox();
63
+ if (hubBbox) {
64
+ await page.mouse.move(hubBbox.x + hubBbox.width / 2, hubBbox.y + hubBbox.height / 2);
65
+ }
66
+ await page.waitForTimeout(400);
67
+ const hover = await restRead();
68
+
69
+ await browser.close();
70
+
71
+ // Source regex
72
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
73
+ const sourceFilterTernary =
74
+ /filter: !reducedMotion && hoveredHub\s+\? \(isLight\s+\? 'drop-shadow\(0 0 3px rgba\(16, 185, 129, 0\.5\)\)'\s+: 'drop-shadow\(0 0 3px rgba\(52, 211, 153, 0\.5\)\)'\)\s+: undefined,/.test(src);
75
+ const sourceAttrWired =
76
+ /data-topo-hub-hover-ring-glow=\{!reducedMotion && hoveredHub \? 'true' : 'false'\}/.test(src);
77
+ const sourceTransitionExt =
78
+ /transition: 'opacity 180ms ease-out, r 180ms ease-out, stroke 200ms ease-out, filter 200ms ease-out'/.test(src);
79
+
80
+ const results = {
81
+ rest_glow_false: rest?.glowAttr === 'false',
82
+ rest_opacity_0: rest?.opacity === '0',
83
+ rest_filter_none: rest?.filter === 'none' || rest?.filter === '',
84
+ rest_transition_has_filter: /\bfilter\b/.test(rest?.transition || ''),
85
+ hover_glow_true: hover?.glowAttr === 'true',
86
+ hover_opacity_visible: parseFloat(hover?.opacity || '0') > 0,
87
+ hover_filter_drop_shadow: /drop-shadow\(.+52,?\s*211,?\s*153/.test(hover?.filter || ''), // cyber emerald-400
88
+ source_filter_ternary: sourceFilterTernary,
89
+ source_attr_wired: sourceAttrWired,
90
+ source_transition_ext: sourceTransitionExt,
91
+ };
92
+ const ok = Object.values(results).every(Boolean);
93
+ console.log(`${ok ? '✅' : '❌'} R535 hub-hover-ring glow:`,
94
+ JSON.stringify(results, null, 2),
95
+ '\n rest:', JSON.stringify(rest),
96
+ '\n hover:', JSON.stringify(hover));
97
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,71 @@
1
+ /* Round 653 — hub-hover-ring drop-shadow gains a SECOND outer
2
+ * layer at 6px blur + 0.25 alpha. 12th anchor in multi-layer halo
3
+ * family (4th hub-cluster anchor after R650 digit + R651 halo +
4
+ * R652 highlight).
5
+ */
6
+ import { chromium } from 'playwright';
7
+ import { readFileSync } from 'node:fs';
8
+
9
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
10
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
11
+
12
+ const browser = await chromium.launch({ headless: true });
13
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
14
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
15
+ await ctx.addInitScript(() => {
16
+ try {
17
+ localStorage.setItem('anet-theme', 'cyber');
18
+ localStorage.setItem('anet-topo-layout', 'ring');
19
+ sessionStorage.setItem('anet_v3_auth', '1');
20
+ } catch {}
21
+ });
22
+ await ctx.route('**/api/hub/status*', async (route) => {
23
+ const r = await route.fetch();
24
+ const b = await r.json();
25
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
26
+ const mk = (alias) => ({
27
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
28
+ network_id: nid, project_dir: null,
29
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
30
+ });
31
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
32
+ });
33
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
34
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
35
+ const page = await ctx.newPage();
36
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
37
+ await page.waitForSelector('[data-topo-hub-hover-ring-halo-layers]', { timeout: 15000, state: 'attached' });
38
+ await page.waitForTimeout(500);
39
+
40
+ const rest = await page.evaluate(() => {
41
+ const el = document.querySelector('[data-topo-hub-hover-ring-halo-layers]');
42
+ if (!el) return null;
43
+ const cs = getComputedStyle(el);
44
+ return {
45
+ layers: el.getAttribute('data-topo-hub-hover-ring-halo-layers'),
46
+ glow: el.getAttribute('data-topo-hub-hover-ring-glow'),
47
+ filter: cs.filter,
48
+ };
49
+ });
50
+
51
+ await browser.close();
52
+
53
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
54
+ const sourceLight = /'drop-shadow\(0 0 3px rgba\(16, 185, 129, 0\.5\)\) drop-shadow\(0 0 6px rgba\(16, 185, 129, 0\.25\)\) brightness\(1\.15\)'/.test(src);
55
+ const sourceCyber = /'drop-shadow\(0 0 3px rgba\(52, 211, 153, 0\.5\)\) drop-shadow\(0 0 6px rgba\(52, 211, 153, 0\.25\)\) brightness\(1\.15\)'/.test(src);
56
+ const sourceLayersAttr = /data-topo-hub-hover-ring-halo-layers=\{!reducedMotion && hoveredHub \? '2' : '0'\}/.test(src);
57
+
58
+ const results = {
59
+ rest_present: !!rest,
60
+ rest_layers_0: rest?.layers === '0',
61
+ rest_glow_false: rest?.glow === 'false',
62
+ rest_filter_no_drop_shadow: !/drop-shadow/.test(rest?.filter || ''),
63
+ source_light_filter: sourceLight,
64
+ source_cyber_filter: sourceCyber,
65
+ source_layers_attr: sourceLayersAttr,
66
+ };
67
+ const ok = Object.values(results).every(Boolean);
68
+ console.log(`${ok ? '✅' : '❌'} R653 hub-hover-ring multi-layer halo (4th hub-cluster anchor):`,
69
+ JSON.stringify(results, null, 2),
70
+ `\n rest: ${JSON.stringify(rest)}`);
71
+ process.exit(ok ? 0 : 1);
@@ -74,13 +74,12 @@ const idleA11y = await probe({ sessions: [{ alias: 'a·1', status: 'idle' }], re
74
74
  const busy = await probe({ sessions: [{ alias: 'a·1', status: 'working' }], reducedMotion: false });
75
75
 
76
76
  const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
77
- // R508 refactor: the hub-highlight rendering was hoisted into an IIFE
78
- // so digit + highlight share a single `hubRecede` gate. The R497 source
79
- // formula now lives inside the IIFE: `breathActive = !reducedMotion &&
80
- // workingCount === 0 && !hubRecede` AND `breath_attr` uses `breathActive`.
81
- // Update regex anchors to match the new structure. Runtime DOM contract
82
- // (idle visible, busy invisible, a11y no-animate) unchanged.
83
- const sourceWired = /const breathActive = !reducedMotion && workingCount === 0 && !hubRecede;[\s\S]*?\{breathActive && \(\s*<animate attributeName="opacity" values="0\.85;1;0\.85" dur="4s" repeatCount="indefinite"/.test(src);
77
+ // R508 refactor: IIFE with `breathActive` const.
78
+ // R511 extension: breathActive also gates on !hoveredHub (hub-hover
79
+ // amplifies highlight to 1.0; breath halts during the lift). Regex
80
+ // updated to match. Runtime DOM contract (idle visible/busy invisible/
81
+ // a11y no-animate) unchanged.
82
+ const sourceWired = /const breathActive = !reducedMotion && workingCount === 0 && !hubRecede && !hoveredHub;[\s\S]*?\{breathActive && \(\s*<animate attributeName="opacity" values="0\.85;1;0\.85" dur="4s" repeatCount="indefinite"/.test(src);
84
83
  const breathAttrWired = /data-topo-hub-highlight-breath=\{breathActive \? 'true' : 'false'\}/.test(src);
85
84
 
86
85
  const results = {
@@ -0,0 +1,77 @@
1
+ /* Round 580 (65-round milestone) verification: hub-spokes stack
2
+ * brightness(1.15) onto R533 hub-hover drop-shadow. 19th anchor
3
+ * in per-element brightness family. CLOSES hub-cluster
4
+ * brightness at 5/5 concentric elements.
5
+ *
6
+ * Test phases:
7
+ * 1. rest: spoke filter='none' (no hub-hover), brightness-attr='1'
8
+ * 2. source: both theme filter expressions stack brightness
9
+ */
10
+ import { chromium } from 'playwright';
11
+ import { readFileSync } from 'node:fs';
12
+
13
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
14
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
15
+
16
+ const browser = await chromium.launch({ headless: true });
17
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
18
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
19
+ await ctx.addInitScript(() => {
20
+ try {
21
+ localStorage.setItem('anet-theme', 'cyber');
22
+ localStorage.setItem('anet-topo-layout', 'ring');
23
+ sessionStorage.setItem('anet_v3_auth', '1');
24
+ } catch {}
25
+ });
26
+ await ctx.route('**/api/hub/status*', async (route) => {
27
+ const r = await route.fetch();
28
+ const b = await r.json();
29
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
30
+ const mk = (alias) => ({
31
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
32
+ network_id: nid, project_dir: null,
33
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
34
+ });
35
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
36
+ });
37
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
38
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
39
+ const page = await ctx.newPage();
40
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
41
+ await page.waitForSelector('[data-topo-hub-spoke-active]', { timeout: 15000, state: 'attached' });
42
+ await page.waitForTimeout(500);
43
+
44
+ const rest = await page.evaluate(() => {
45
+ const el = document.querySelector('[data-topo-hub-spoke-active]');
46
+ if (!el) return null;
47
+ const cs = getComputedStyle(el);
48
+ return {
49
+ filter: cs.filter,
50
+ transitionProperty: cs.transitionProperty,
51
+ brightnessAttr: el.getAttribute('data-topo-hub-spoke-brightness'),
52
+ glowAttr: el.getAttribute('data-topo-hub-spoke-glow'),
53
+ };
54
+ });
55
+
56
+ await browser.close();
57
+
58
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
59
+ const sourceLightFilter = /'drop-shadow\(0 0 1\.5px rgba\(13, 148, 136, 0\.4\)\) brightness\(1\.15\)'/.test(src);
60
+ const sourceCyberFilter = /'drop-shadow\(0 0 1\.5px rgba\(34, 211, 238, 0\.4\)\) brightness\(1\.15\)'/.test(src);
61
+ const sourceAttr = /data-topo-hub-spoke-brightness=\{!reducedMotion && hoveredHub \? '1\.15' : '1'\}/.test(src);
62
+
63
+ const results = {
64
+ spoke_present: !!rest,
65
+ rest_filter_none: rest?.filter === 'none',
66
+ rest_brightness_1: rest?.brightnessAttr === '1',
67
+ rest_glow_false: rest?.glowAttr === 'false',
68
+ transition_has_filter: /filter/.test(rest?.transitionProperty || ''),
69
+ source_light_filter: sourceLightFilter,
70
+ source_cyber_filter: sourceCyberFilter,
71
+ source_attr: sourceAttr,
72
+ };
73
+ const ok = Object.values(results).every(Boolean);
74
+ console.log(`${ok ? '✅' : '❌'} R580 hub-spoke stacked brightness (19th anchor, hub-cluster 5/5 closure, 65-round milestone):`,
75
+ JSON.stringify(results, null, 2),
76
+ `\n rest: ${JSON.stringify(rest)}`);
77
+ process.exit(ok ? 0 : 1);