@sleep2agi/agent-network-dashboard 0.5.3-preview.21 → 0.5.3-preview.210

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 (348) 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/{17-8bizggk6cz.js → 051~.vno73m41.js} +1 -1
  143. package/.next/static/chunks/0_5bx.ra9kap9.js +4 -0
  144. package/.next/static/chunks/0e20d3m55ia2k.js +1 -0
  145. package/.next/static/chunks/0kawbcl2g5q6s.js +1 -0
  146. package/.next/static/chunks/17if82x7mcn4j.css +2 -0
  147. package/.next/trace +2 -2
  148. package/.next/trace-build +1 -1
  149. package/app/components/TopoGraph.tsx +5127 -184
  150. package/app/globals.css +144 -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-click-ripple-glow-test.mjs +86 -0
  183. package/scripts/topo-click-ripple-halo-layers-test.mjs +79 -0
  184. package/scripts/topo-click-ripple-sw-test.mjs +110 -0
  185. package/scripts/topo-cluster-count-attr-test.mjs +80 -0
  186. package/scripts/topo-crescent-breath-test.mjs +104 -0
  187. package/scripts/topo-crescent-recede-test.mjs +111 -0
  188. package/scripts/topo-dense-alias-chat-halo-test.mjs +73 -0
  189. package/scripts/topo-dense-alias-halo-layers-test.mjs +80 -0
  190. package/scripts/topo-edge-badge-circle-brightness-test.mjs +82 -0
  191. package/scripts/topo-edge-badge-circle-hot-pulse-test.mjs +100 -0
  192. package/scripts/topo-edge-badge-digit-halo-layers-test.mjs +107 -0
  193. package/scripts/topo-edge-badge-endpoint-gate-test.mjs +94 -0
  194. package/scripts/topo-edge-badge-halo-layers-test.mjs +85 -0
  195. package/scripts/topo-edge-badge-hot-pulse-test.mjs +92 -0
  196. package/scripts/topo-edge-badge-hover-glow-test.mjs +90 -0
  197. package/scripts/topo-edge-badge-text-brightness-test.mjs +83 -0
  198. package/scripts/topo-edge-chat-gate-test.mjs +71 -0
  199. package/scripts/topo-edge-flow-rail-halo-layers-test.mjs +89 -0
  200. package/scripts/topo-edge-particle-brightness-test.mjs +82 -0
  201. package/scripts/topo-edge-particle-halo-layers-test.mjs +91 -0
  202. package/scripts/topo-edge-pill-glow-test.mjs +67 -0
  203. package/scripts/topo-edge-pin-halo-test.mjs +99 -0
  204. package/scripts/topo-edge-visible-brightness-test.mjs +84 -0
  205. package/scripts/topo-edge-visible-halo-layers-test.mjs +87 -0
  206. package/scripts/topo-endpoint-ring-brightness-test.mjs +83 -0
  207. package/scripts/topo-endpoint-ring-flow-halo-test.mjs +107 -0
  208. package/scripts/topo-endpoint-ring-halo-layers-test.mjs +100 -0
  209. package/scripts/topo-filter-pill-glow-test.mjs +90 -0
  210. package/scripts/topo-filter-pill-halo-layers-test.mjs +27 -0
  211. package/scripts/topo-flow-arrow-brightness-test.mjs +82 -0
  212. package/scripts/topo-flow-rail-brightness-test.mjs +80 -0
  213. package/scripts/topo-fullscreen-attr-test.mjs +73 -0
  214. package/scripts/topo-fullscreen-brightness-test.mjs +84 -0
  215. package/scripts/topo-fullscreen-icon-rotate-test.mjs +93 -0
  216. package/scripts/topo-grid-content-bottom-attr-test.mjs +72 -0
  217. package/scripts/topo-group-box-brightness-test.mjs +84 -0
  218. package/scripts/topo-group-box-halo-layers-test.mjs +91 -0
  219. package/scripts/topo-group-chat-gate-test.mjs +77 -0
  220. package/scripts/topo-group-label-brightness-test.mjs +84 -0
  221. package/scripts/topo-group-label-halo-layers-test.mjs +78 -0
  222. package/scripts/topo-group-label-hover-glow-test.mjs +86 -0
  223. package/scripts/topo-group-label-member-alias-hover-test.mjs +125 -0
  224. package/scripts/topo-group-pill-glow-test.mjs +76 -0
  225. package/scripts/topo-group-tint-brightness-test.mjs +82 -0
  226. package/scripts/topo-halo-chat-gate-test.mjs +72 -0
  227. package/scripts/topo-hover-detail-halo-test.mjs +76 -0
  228. package/scripts/topo-hub-core-brightness-test.mjs +82 -0
  229. package/scripts/topo-hub-core-halo-layers-test.mjs +81 -0
  230. package/scripts/topo-hub-digit-brightness-test.mjs +79 -0
  231. package/scripts/topo-hub-digit-halo-layers-test.mjs +76 -0
  232. package/scripts/topo-hub-digit-ls-test.mjs +119 -0
  233. package/scripts/topo-hub-halo-brightness-test.mjs +80 -0
  234. package/scripts/topo-hub-halo-glow-test.mjs +96 -0
  235. package/scripts/topo-hub-halo-halo-layers-test.mjs +76 -0
  236. package/scripts/topo-hub-highlight-amplify-test.mjs +139 -0
  237. package/scripts/topo-hub-highlight-brightness-test.mjs +84 -0
  238. package/scripts/topo-hub-highlight-fill-transition-test.mjs +84 -0
  239. package/scripts/topo-hub-highlight-glow-test.mjs +99 -0
  240. package/scripts/topo-hub-highlight-halo-layers-test.mjs +78 -0
  241. package/scripts/topo-hub-highlight-r-test.mjs +112 -0
  242. package/scripts/topo-hub-highlight-recede-test.mjs +144 -0
  243. package/scripts/topo-hub-highlight-theme-fill-test.mjs +83 -0
  244. package/scripts/topo-hub-hover-ring-brightness-test.mjs +79 -0
  245. package/scripts/topo-hub-hover-ring-glow-test.mjs +97 -0
  246. package/scripts/topo-hub-hover-ring-halo-layers-test.mjs +71 -0
  247. package/scripts/topo-hub-idle-breath-test.mjs +7 -2
  248. package/scripts/topo-hub-spoke-brightness-test.mjs +77 -0
  249. package/scripts/topo-hub-spoke-glow-test.mjs +112 -0
  250. package/scripts/topo-hub-spoke-halo-layers-test.mjs +97 -0
  251. package/scripts/topo-hub-spoke-self-filter-test.mjs +119 -0
  252. package/scripts/topo-kicker-halo-layers-test.mjs +82 -0
  253. package/scripts/topo-label-card-brightness-test.mjs +81 -0
  254. package/scripts/topo-layout-hover-fw-test.mjs +98 -0
  255. package/scripts/topo-layout-toggle-brightness-test.mjs +94 -0
  256. package/scripts/topo-layout-toggle-halo-layers-test.mjs +95 -0
  257. package/scripts/topo-legend-count-brightness-test.mjs +80 -0
  258. package/scripts/topo-legend-count-halo-layers-test.mjs +79 -0
  259. package/scripts/topo-legend-count-letter-spacing-test.mjs +108 -0
  260. package/scripts/topo-legend-label-fw-test.mjs +107 -0
  261. package/scripts/topo-legend-pin-ring-brightness-test.mjs +82 -0
  262. package/scripts/topo-legend-pin-ring-halo-layers-test.mjs +71 -0
  263. package/scripts/topo-legend-row-count-brightness-test.mjs +85 -0
  264. package/scripts/topo-legend-row-label-glow-test.mjs +102 -0
  265. package/scripts/topo-legend-swatch-glow-test.mjs +109 -0
  266. package/scripts/topo-legend-swatch-member-alias-match-test.mjs +139 -0
  267. package/scripts/topo-legend-tint-brightness-test.mjs +83 -0
  268. package/scripts/topo-legend-trio-halo-layers-test.mjs +22 -0
  269. package/scripts/topo-minimap-container-halo-test.mjs +82 -0
  270. package/scripts/topo-minimap-dot-chat-gate-test.mjs +81 -0
  271. package/scripts/topo-minimap-hover-glow-test.mjs +109 -0
  272. package/scripts/topo-minimap-viewport-brightness-test.mjs +84 -0
  273. package/scripts/topo-minimap-viewport-halo-layers-test.mjs +24 -0
  274. package/scripts/topo-more-footer-brightness-test.mjs +94 -0
  275. package/scripts/topo-node-alias-brightness-test.mjs +84 -0
  276. package/scripts/topo-node-avatar-halo-layers-test.mjs +25 -0
  277. package/scripts/topo-node-hover-ring-halo-layers-test.mjs +70 -0
  278. package/scripts/topo-node-label-card-halo-test.mjs +76 -0
  279. package/scripts/topo-node-sub-text-brightness-test.mjs +88 -0
  280. package/scripts/topo-nodesize-brightness-test.mjs +82 -0
  281. package/scripts/topo-nodesize-halo-layers-test.mjs +89 -0
  282. package/scripts/topo-nodesize-hover-fw-test.mjs +99 -0
  283. package/scripts/topo-orphan-label-opacity-test.mjs +98 -0
  284. package/scripts/topo-panel-count-halo-layers-test.mjs +91 -0
  285. package/scripts/topo-panel-count-hover-ls-test.mjs +87 -0
  286. package/scripts/topo-panel-rect-halo-test.mjs +90 -0
  287. package/scripts/topo-panel-row-brightness-test.mjs +116 -0
  288. package/scripts/topo-panel-title-brightness-test.mjs +98 -0
  289. package/scripts/topo-panel-title-glow-test.mjs +111 -0
  290. package/scripts/topo-panel-titles-halo-layers-test.mjs +23 -0
  291. package/scripts/topo-pill-x-rotate-test.mjs +96 -0
  292. package/scripts/topo-pip-brightness-test.mjs +85 -0
  293. package/scripts/topo-pressure-bar-halo-layers-test.mjs +19 -0
  294. package/scripts/topo-pressure-seg-glow-test.mjs +92 -0
  295. package/scripts/topo-pressure-seg-member-alias-match-test.mjs +133 -0
  296. package/scripts/topo-pressure-seg-motion-test.mjs +101 -0
  297. package/scripts/topo-recent-count-brightness-test.mjs +84 -0
  298. package/scripts/topo-recent-more-fw-test.mjs +126 -0
  299. package/scripts/topo-recent-more-halo-layers-test.mjs +90 -0
  300. package/scripts/topo-recent-panel-hot-pulse-test.mjs +105 -0
  301. package/scripts/topo-recent-pip-halo-layers-test.mjs +82 -0
  302. package/scripts/topo-recent-row-chat-gate-test.mjs +75 -0
  303. package/scripts/topo-recent-row-content-lift-test.mjs +140 -0
  304. package/scripts/topo-recent-row-fw-test.mjs +115 -0
  305. package/scripts/topo-recent-row-text-glow-test.mjs +86 -0
  306. package/scripts/topo-recent-row-text-halo-layers-test.mjs +67 -0
  307. package/scripts/topo-recent-tint-brightness-test.mjs +80 -0
  308. package/scripts/topo-recent-ts-brightness-test.mjs +86 -0
  309. package/scripts/topo-reduced-motion-attr-test.mjs +69 -0
  310. package/scripts/topo-reset-brightness-test.mjs +83 -0
  311. package/scripts/topo-reset-icon-hover-scale-test.mjs +102 -0
  312. package/scripts/topo-runtime-badge-brightness-test.mjs +78 -0
  313. package/scripts/topo-runtime-badge-glow-test.mjs +108 -0
  314. package/scripts/topo-runtime-badge-halo-layers-test.mjs +87 -0
  315. package/scripts/topo-runtime-badge-rotate-test.mjs +85 -0
  316. package/scripts/topo-section-title-halo-layers-test.mjs +88 -0
  317. package/scripts/topo-spoke-chat-gate-test.mjs +72 -0
  318. package/scripts/topo-starfield-hue-test.mjs +109 -0
  319. package/scripts/topo-status-pin-pill-halo-layers-test.mjs +17 -0
  320. package/scripts/topo-status-ring-brightness-test.mjs +84 -0
  321. package/scripts/topo-status-ring-chat-gate-test.mjs +72 -0
  322. package/scripts/topo-status-ring-halo-layers-test.mjs +105 -0
  323. package/scripts/topo-status-ring-status-halo-test.mjs +110 -0
  324. package/scripts/topo-sub-text-chat-brightness-test.mjs +81 -0
  325. package/scripts/topo-titleblock-h2-hover-fw-test.mjs +109 -0
  326. package/scripts/topo-titleblock-h2-hover-tracking-test.mjs +128 -0
  327. package/scripts/topo-titleblock-kicker-hover-test.mjs +134 -0
  328. package/scripts/topo-vendor-chip-glow-test.mjs +97 -0
  329. package/scripts/topo-vendor-chip-halo-layers-test.mjs +18 -0
  330. package/scripts/topo-vendor-chip-pin-halo-test.mjs +88 -0
  331. package/scripts/topo-vendor-count-suffix-halo-layers-test.mjs +79 -0
  332. package/scripts/topo-vendor-letter-halo-layers-test.mjs +93 -0
  333. package/scripts/topo-vendor-pill-glow-test.mjs +98 -0
  334. package/scripts/topo-watermark-breath-test.mjs +100 -0
  335. package/scripts/topo-watermark-recede-test.mjs +114 -0
  336. package/scripts/topo-working-online-chip-halo-layers-test.mjs +94 -0
  337. package/scripts/topo-zoom-buttons-brightness-test.mjs +94 -0
  338. package/scripts/topo-zoom-in-out-halo-layers-test.mjs +97 -0
  339. package/scripts/topo-zoom-level-brightness-test.mjs +83 -0
  340. package/scripts/topo-zoom-level-color-test.mjs +105 -0
  341. package/scripts/topo-zoom-level-halo-layers-test.mjs +78 -0
  342. package/.next/static/chunks/01uyqm4r9qnpt.js +0 -1
  343. package/.next/static/chunks/04m~pbcsq2ej6.js +0 -4
  344. package/.next/static/chunks/0m.1mvl~t.avc.css +0 -2
  345. package/.next/static/chunks/112g_zni~x6_j.js +0 -1
  346. /package/.next/static/{9EnLX9vOfh-hoRKs1_aTC → 3D5_n49X1pW-2zn5wZP3e}/_buildManifest.js +0 -0
  347. /package/.next/static/{9EnLX9vOfh-hoRKs1_aTC → 3D5_n49X1pW-2zn5wZP3e}/_clientMiddlewareManifest.js +0 -0
  348. /package/.next/static/{9EnLX9vOfh-hoRKs1_aTC → 3D5_n49X1pW-2zn5wZP3e}/_ssgManifest.js +0 -0
@@ -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);
@@ -0,0 +1,112 @@
1
+ /* Round 533 verification: hub spokes gain drop-shadow glow on hub-hover
2
+ * — drop-shadow visual-polish family 9th anchor.
3
+ *
4
+ * Test phases:
5
+ * 1. rest: ALL spokes have data-topo-hub-spoke-glow='false',
6
+ * computed filter='none'
7
+ * 2. hover hub (mouse.move to hub center per R527 banked path):
8
+ * ALL spokes have glow='true', filter matches drop-shadow with
9
+ * cyber cyan-400 hue
10
+ * 3. transition list includes 'filter 250ms ease-out'
11
+ * 4. source-side regex confirms filter ternary + transition 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: [
39
+ mk('a·1'), mk('a·2'), mk('a·3'), mk('a·4'),
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-hub-spoke-glow]', { timeout: 15000 });
47
+ await page.waitForTimeout(800);
48
+
49
+ const readAll = async () => page.evaluate(() => {
50
+ const els = Array.from(document.querySelectorAll('[data-topo-hub-spoke-glow]'));
51
+ return els.map((el) => {
52
+ const cs = getComputedStyle(el);
53
+ return {
54
+ glow: el.getAttribute('data-topo-hub-spoke-glow'),
55
+ filter: cs.filter,
56
+ transition: cs.transition,
57
+ };
58
+ });
59
+ });
60
+
61
+ // Phase 1: rest
62
+ const rest = await readAll();
63
+
64
+ // Phase 2: hover hub (mouse.move to hub center — bbox of hub-highlight
65
+ // or hub spoke origin near canvas center). Use hub-highlight bbox per
66
+ // R527 banked path.
67
+ const hubBbox = await page.locator('[data-topo-hub-highlight]').first().boundingBox();
68
+ if (hubBbox) {
69
+ await page.mouse.move(hubBbox.x + hubBbox.width / 2, hubBbox.y + hubBbox.height / 2);
70
+ }
71
+ await page.waitForTimeout(400);
72
+ const hover = await readAll();
73
+
74
+ await browser.close();
75
+
76
+ // Source regex
77
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
78
+ const sourceFilterTernary =
79
+ /filter: !reducedMotion && hoveredHub\s+\? \(isLight\s+\? 'drop-shadow\(0 0 1\.5px rgba\(13, 148, 136, 0\.4\)\)'\s+: 'drop-shadow\(0 0 1\.5px rgba\(34, 211, 238, 0\.4\)\)'\)\s+: undefined,/.test(src);
80
+ const sourceAttrWired =
81
+ /data-topo-hub-spoke-glow=\{!reducedMotion && hoveredHub \? 'true' : 'false'\}/.test(src);
82
+ const sourceTransitionExt =
83
+ /transition: 'stroke 250ms ease-out, stroke-width 250ms ease-out, opacity 250ms ease-out, filter 250ms ease-out'/.test(src);
84
+
85
+ const restAllFalse = rest.length > 0 && rest.every((s) => s.glow === 'false');
86
+ const restAllFilterNone = rest.length > 0 && rest.every((s) => s.filter === 'none' || s.filter === '');
87
+ const hoverAllTrue = hover.length > 0 && hover.every((s) => s.glow === 'true');
88
+ const hoverAllFilterDS = hover.length > 0 && hover.every((s) =>
89
+ /drop-shadow\(.+34,?\s*211,?\s*238/.test(s.filter || '')
90
+ );
91
+ const restTransitionHasFilter = rest.length > 0 && rest.every((s) =>
92
+ /\bfilter\b/.test(s.transition || '')
93
+ );
94
+
95
+ const results = {
96
+ spokes_present: rest.length >= 3, // 4 nodes → 4 spokes
97
+ rest_all_glow_false: restAllFalse,
98
+ rest_all_filter_none: restAllFilterNone,
99
+ rest_transition_has_filter: restTransitionHasFilter,
100
+ hover_all_glow_true: hoverAllTrue,
101
+ hover_all_filter_drop_shadow: hoverAllFilterDS,
102
+ source_filter_ternary: sourceFilterTernary,
103
+ source_attr_wired: sourceAttrWired,
104
+ source_transition_ext: sourceTransitionExt,
105
+ };
106
+ const ok = Object.values(results).every(Boolean);
107
+ console.log(`${ok ? '✅' : '❌'} R533 hub-spoke hover-glow:`,
108
+ JSON.stringify(results, null, 2),
109
+ '\n spoke count:', rest.length,
110
+ '\n rest sample:', JSON.stringify(rest[0]),
111
+ '\n hover sample:', JSON.stringify(hover[0]));
112
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,97 @@
1
+ /* Round 654 — hub-spoke drop-shadow gains a SECOND outer layer at
2
+ * 3px + 0.2 alpha. CLOSES hub-cluster glow QUINTET at 5/5 multi-
3
+ * layer (R533 was the last single-layer hub element after R650-R653).
4
+ *
5
+ * Test phases:
6
+ * 1. mock 2 nodes → hub-spokes render (one per non-hub node)
7
+ * 2. rest: all spokes halo-layers='0', no drop-shadow filter
8
+ * 3. open chat with a·1 → R636 isHoveredSpoke fires → that spoke
9
+ * gets halo-layers='2', computed filter has 2 drop-shadow
10
+ * substrings with teal/cyan tint (rgba(34,211,238,...) on cyber)
11
+ * 4. source: both light + cyber branches stack 2 drop-shadows
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-hub-spoke-halo-layers]', { timeout: 15000, state: 'attached' });
45
+ await page.waitForTimeout(500);
46
+
47
+ const restSpokes = await page.evaluate(() => {
48
+ return Array.from(document.querySelectorAll('[data-topo-hub-spoke-halo-layers]')).map(el => ({
49
+ layers: el.getAttribute('data-topo-hub-spoke-halo-layers'),
50
+ glow: el.getAttribute('data-topo-hub-spoke-glow'),
51
+ }));
52
+ });
53
+
54
+ // Open chat to fire isHoveredSpoke on a·1's spoke
55
+ await page.click('[data-node="a·1"]', { force: true });
56
+ await page.waitForTimeout(400);
57
+
58
+ const activeState = await page.evaluate(() => {
59
+ return Array.from(document.querySelectorAll('[data-topo-hub-spoke-halo-layers]')).map(el => {
60
+ const cs = getComputedStyle(el);
61
+ return {
62
+ layers: el.getAttribute('data-topo-hub-spoke-halo-layers'),
63
+ glow: el.getAttribute('data-topo-hub-spoke-glow'),
64
+ self: el.getAttribute('data-topo-hub-spoke-brightness-self'),
65
+ filter: cs.filter,
66
+ };
67
+ });
68
+ });
69
+
70
+ await browser.close();
71
+
72
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
73
+ const sourceLight = /'drop-shadow\(0 0 1\.5px rgba\(13, 148, 136, 0\.4\)\) drop-shadow\(0 0 3px rgba\(13, 148, 136, 0\.2\)\) brightness\(1\.15\)'/.test(src);
74
+ const sourceCyber = /'drop-shadow\(0 0 1\.5px rgba\(34, 211, 238, 0\.4\)\) drop-shadow\(0 0 3px rgba\(34, 211, 238, 0\.2\)\) brightness\(1\.15\)'/.test(src);
75
+ const sourceLayersAttr = /data-topo-hub-spoke-halo-layers=\{!reducedMotion && \(hoveredHub \|\| isHoveredSpoke\) \? '2' : '0'\}/.test(src);
76
+
77
+ const restAllZero = restSpokes.every(s => s.layers === '0' && s.glow === 'false');
78
+ const activeSpokes = activeState.filter(s => s.self === 'true');
79
+ const activeAllTwoLayers = activeSpokes.length >= 1
80
+ && activeSpokes.every(s => s.layers === '2'
81
+ && (s.filter?.match(/drop-shadow/g) || []).length === 2);
82
+
83
+ const results = {
84
+ spokes_present: restSpokes.length >= 2,
85
+ rest_all_zero: restAllZero,
86
+ active_exactly_one: activeSpokes.length === 1,
87
+ active_all_two_layers:activeAllTwoLayers,
88
+ source_light: sourceLight,
89
+ source_cyber: sourceCyber,
90
+ source_layers_attr: sourceLayersAttr,
91
+ };
92
+ const ok = Object.values(results).every(Boolean);
93
+ console.log(`${ok ? '✅' : '❌'} R654 hub-spoke multi-layer halo (CLOSES hub-cluster glow QUINTET at 5/5):`,
94
+ JSON.stringify(results, null, 2),
95
+ `\n rest: ${JSON.stringify(restSpokes)}`,
96
+ `\n active: ${JSON.stringify(activeState)}`);
97
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,119 @@
1
+ /* Round 636 — extend hub-spoke filter gate from hub-wide
2
+ * (hoveredHub) to per-spoke (isHoveredSpoke). Closes the 4-axis
3
+ * chat-target focus signature on the hub-spoke surface:
4
+ * R622 opacity 0.50 → 0.70 / 0.80 → 0.95 (per-spoke)
5
+ * R622 stroke-wd 1.00 → 1.25 / 2.25 → 2.50 (per-spoke)
6
+ * R580 drop-shadow halo (hub-wide only — pre-R636)
7
+ * R580 brightness 1.0 → 1.15 (hub-wide only — pre-R636)
8
+ * R636 drop-shadow + brightness ALSO on isHoveredSpoke (per-spoke)
9
+ *
10
+ * Test phases:
11
+ * 1. mock 2 nodes → spokes present, no hover/chat
12
+ * 2. rest: per-spoke brightness-self='false', brightness='1',
13
+ * glow='false'
14
+ * 3. open chat with one node (click) → that node's spoke
15
+ * brightness-self='true', brightness='1.15', glow='true';
16
+ * OTHER spoke stays brightness-self='false', brightness='1'
17
+ * 4. source: filter expression + attrs include
18
+ * (hoveredHub || isHoveredSpoke) OR-chain
19
+ */
20
+ import { chromium } from 'playwright';
21
+ import { readFileSync } from 'node:fs';
22
+
23
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
24
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
25
+
26
+ const browser = await chromium.launch({ headless: true });
27
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
28
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
29
+ await ctx.addInitScript(() => {
30
+ try {
31
+ localStorage.setItem('anet-theme', 'cyber');
32
+ localStorage.setItem('anet-topo-layout', 'ring');
33
+ sessionStorage.setItem('anet_v3_auth', '1');
34
+ } catch {}
35
+ });
36
+ await ctx.route('**/api/hub/status*', async (route) => {
37
+ const r = await route.fetch();
38
+ const b = await r.json();
39
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
40
+ const mk = (alias) => ({
41
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
42
+ network_id: nid, project_dir: null,
43
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
44
+ });
45
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
46
+ });
47
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
48
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
49
+ const page = await ctx.newPage();
50
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
51
+ await page.waitForSelector('[data-topo-hub-spoke-brightness-self]', { timeout: 15000, state: 'attached' });
52
+ await page.waitForTimeout(500);
53
+
54
+ const restPerSpoke = await page.evaluate(() => {
55
+ const spokes = Array.from(document.querySelectorAll('[data-topo-hub-spoke-brightness-self]'));
56
+ return spokes.map(el => ({
57
+ self: el.getAttribute('data-topo-hub-spoke-brightness-self'),
58
+ brightness: el.getAttribute('data-topo-hub-spoke-brightness'),
59
+ glow: el.getAttribute('data-topo-hub-spoke-glow'),
60
+ }));
61
+ });
62
+
63
+ // Open chat with a·1
64
+ await page.click('[data-node="a·1"]', { force: true });
65
+ await page.waitForTimeout(400);
66
+
67
+ const chatPerSpoke = await page.evaluate(() => {
68
+ // Each spoke is paired with its node alias via path key (`hub-${alias}`)
69
+ // — but key isn't queryable. We look at all spokes and find the one
70
+ // whose brightness-self attr is now 'true'.
71
+ const spokes = Array.from(document.querySelectorAll('[data-topo-hub-spoke-brightness-self]'));
72
+ return spokes.map(el => ({
73
+ self: el.getAttribute('data-topo-hub-spoke-brightness-self'),
74
+ brightness: el.getAttribute('data-topo-hub-spoke-brightness'),
75
+ glow: el.getAttribute('data-topo-hub-spoke-glow'),
76
+ }));
77
+ });
78
+
79
+ await browser.close();
80
+
81
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
82
+ const sourceFilterGate = /filter: !reducedMotion && \(hoveredHub \|\| isHoveredSpoke\)\s*\n\s*\?\s*\(isLight/.test(src);
83
+ const sourceBrightnessAttr = /data-topo-hub-spoke-brightness=\{!reducedMotion && \(hoveredHub \|\| isHoveredSpoke\) \? '1\.15' : '1'\}/.test(src);
84
+ const sourceSelfAttr = /data-topo-hub-spoke-brightness-self=\{!reducedMotion && isHoveredSpoke \? 'true' : 'false'\}/.test(src);
85
+ const sourceGlowGate = /data-topo-hub-spoke-glow=\{!reducedMotion && \(hoveredHub \|\| isHoveredSpoke\) \? 'true' : 'false'\}/.test(src);
86
+
87
+ const restAllSelfFalse = restPerSpoke.every(s => s.self === 'false');
88
+ const restAllBrightness1 = restPerSpoke.every(s => s.brightness === '1');
89
+ const restAllGlowFalse = restPerSpoke.every(s => s.glow === 'false');
90
+
91
+ const chatActiveSpokes = chatPerSpoke.filter(s => s.self === 'true');
92
+ const chatIdleSpokes = chatPerSpoke.filter(s => s.self === 'false');
93
+ const chatExactlyOneActive = chatActiveSpokes.length === 1;
94
+ const chatActiveBrightness115 = chatActiveSpokes.every(s => s.brightness === '1.15');
95
+ const chatActiveGlowTrue = chatActiveSpokes.every(s => s.glow === 'true');
96
+ const chatIdleBrightness1 = chatIdleSpokes.every(s => s.brightness === '1');
97
+ const chatIdleGlowFalse = chatIdleSpokes.every(s => s.glow === 'false');
98
+
99
+ const results = {
100
+ spokes_present: restPerSpoke.length >= 2,
101
+ rest_all_self_false: restAllSelfFalse,
102
+ rest_all_brightness_1: restAllBrightness1,
103
+ rest_all_glow_false: restAllGlowFalse,
104
+ chat_exactly_one_active: chatExactlyOneActive,
105
+ chat_active_brightness: chatActiveBrightness115,
106
+ chat_active_glow: chatActiveGlowTrue,
107
+ chat_idle_brightness: chatIdleBrightness1,
108
+ chat_idle_glow_false: chatIdleGlowFalse,
109
+ source_filter_gate: sourceFilterGate,
110
+ source_brightness_attr: sourceBrightnessAttr,
111
+ source_self_attr: sourceSelfAttr,
112
+ source_glow_gate: sourceGlowGate,
113
+ };
114
+ const ok = Object.values(results).every(Boolean);
115
+ console.log(`${ok ? '✅' : '❌'} R636 hub-spoke per-spoke filter (chat-target / hover-self gate):`,
116
+ JSON.stringify(results, null, 2),
117
+ `\n rest: ${JSON.stringify(restPerSpoke)}`,
118
+ `\n chat: ${JSON.stringify(chatPerSpoke)}`);
119
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,82 @@
1
+ /* Round 685 — kicker "Network Topology" extends from 2 hover axes
2
+ * (R555 tracking-spread + color lift) to also include multi-layer
3
+ * halo paint axis. Closes title-block trio 3/3 (logo R683 + H2 R684
4
+ * + kicker R685). CSS descendant rule targets the kicker via data
5
+ * attr; 2+4px stride at currentColor (kicker scale = text-xs 12px).
6
+ *
7
+ * Source assertions:
8
+ * - globals.css has cluster-hover descendant rule for kicker with
9
+ * 2 drop-shadow layers (2+4px)
10
+ * - globals.css has transition rule on kicker including 'filter 200ms'
11
+ * - TopoGraph.tsx kicker has data-topo-section-kicker-halo-layers="2"
12
+ *
13
+ * Runtime assertions:
14
+ * - kicker element present
15
+ * - halo-layers attr = "2"
16
+ * - kicker text = "Network Topology"
17
+ */
18
+ import { chromium } from 'playwright';
19
+ import { readFileSync } from 'node:fs';
20
+
21
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
22
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
23
+
24
+ const browser = await chromium.launch({ headless: true });
25
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
26
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
27
+ await ctx.addInitScript(() => {
28
+ try {
29
+ localStorage.setItem('anet-theme', 'cyber');
30
+ localStorage.setItem('anet-topo-layout', 'ring');
31
+ sessionStorage.setItem('anet_v3_auth', '1');
32
+ } catch {}
33
+ });
34
+ await ctx.route('**/api/hub/status*', async (route) => {
35
+ const r = await route.fetch();
36
+ const b = await r.json();
37
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
38
+ const mk = (alias) => ({
39
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
40
+ network_id: nid, project_dir: null,
41
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
42
+ });
43
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
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-section-kicker]', { timeout: 15000, state: 'attached' });
50
+ await page.waitForTimeout(300);
51
+
52
+ const runtimeState = await page.evaluate(() => {
53
+ const kicker = document.querySelector('[data-topo-section-kicker]');
54
+ return {
55
+ present: !!kicker,
56
+ halo_layers: kicker?.getAttribute('data-topo-section-kicker-halo-layers'),
57
+ text: kicker?.textContent,
58
+ };
59
+ });
60
+
61
+ await browser.close();
62
+
63
+ const tsxSrc = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
64
+ const cssSrc = readFileSync('/home/vansin/agent-network-dashboard/app/globals.css', 'utf8');
65
+
66
+ const cssHoverRule = /\[data-topo-section-titleblock-group\]:hover \[data-topo-section-kicker\]\s*\{[\s\S]*?drop-shadow\(0 0 2px currentColor\)[\s\S]*?drop-shadow\(0 0 4px currentColor\)/.test(cssSrc);
67
+ const cssTransition = /\[data-topo-section-kicker\]\s*\{[\s\S]*?transition:[\s\S]*?filter 200ms/.test(cssSrc);
68
+ const tsxHaloAttr = /data-topo-section-kicker-halo-layers="2"/.test(tsxSrc);
69
+
70
+ const results = {
71
+ kicker_present: runtimeState.present,
72
+ runtime_halo_layers: runtimeState.halo_layers === '2',
73
+ runtime_text: runtimeState.text === 'Network Topology',
74
+ css_hover_rule: cssHoverRule,
75
+ css_transition: cssTransition,
76
+ tsx_halo_attr: tsxHaloAttr,
77
+ };
78
+ const ok = Object.values(results).every(Boolean);
79
+ console.log(`${ok ? '✅' : '❌'} R685 kicker multi-layer halo (closes title-block trio 3/3):`,
80
+ JSON.stringify(results, null, 2),
81
+ `\n runtime: ${JSON.stringify(runtimeState)}`);
82
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,81 @@
1
+ /* Round 613 — per-node label card stacks brightness(1.15)
2
+ * onto R142's hover drop-shadow. 4th paint axis on the card's
3
+ * hover signature. Same banked R582/R583 stacked-filter pattern.
4
+ *
5
+ * Test phases:
6
+ * 1. mock 2 idle nodes → label cards render
7
+ * 2. rest: filter contains rest drop-shadow but NO brightness,
8
+ * brightness-attr='1'
9
+ * 3. computed transition-property contains 'filter'
10
+ * 4. source: stacked filter conditional + data-attr
11
+ */
12
+ import { chromium } from 'playwright';
13
+ import { readFileSync } from 'node:fs';
14
+
15
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
16
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
17
+
18
+ const browser = await chromium.launch({ headless: true });
19
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
20
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
21
+ await ctx.addInitScript(() => {
22
+ try {
23
+ localStorage.setItem('anet-theme', 'cyber');
24
+ localStorage.setItem('anet-topo-layout', 'ring');
25
+ sessionStorage.setItem('anet_v3_auth', '1');
26
+ } catch {}
27
+ });
28
+ await ctx.route('**/api/hub/status*', async (route) => {
29
+ const r = await route.fetch();
30
+ const b = await r.json();
31
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
32
+ const mk = (alias) => ({
33
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
34
+ network_id: nid, project_dir: null,
35
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
36
+ });
37
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
38
+ });
39
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
40
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
41
+ const page = await ctx.newPage();
42
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
43
+ await page.waitForSelector('[data-node-label-card-brightness]', { timeout: 15000, state: 'attached' });
44
+ await page.waitForTimeout(500);
45
+
46
+ const rest = await page.evaluate(() => {
47
+ const el = document.querySelector('[data-node-label-card-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-node-label-card-brightness'),
54
+ elevationAttr: el.getAttribute('data-node-label-card-elevation'),
55
+ };
56
+ });
57
+
58
+ await browser.close();
59
+
60
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
61
+ const sourceCyberStack = /'drop-shadow\(0 4px 12px rgba\(0,0,0,0\.60\)\) brightness\(1\.15\)'/.test(src);
62
+ const sourceLightStack = /'drop-shadow\(0 3px 8px rgba\(15,23,42,0\.20\)\) brightness\(1\.15\)'/.test(src);
63
+ const sourceAttr = /data-node-label-card-brightness=\{!reducedMotion && hoveredAlias === session\.alias \? '1\.15' : '1'\}/.test(src);
64
+
65
+ const results = {
66
+ card_present: !!rest,
67
+ // At rest: rest-tier drop-shadow but no brightness
68
+ rest_has_drop_shadow: /drop-shadow/.test(rest?.filter || ''),
69
+ rest_no_brightness: !/brightness/.test(rest?.filter || ''),
70
+ rest_brightness_1: rest?.brightnessAttr === '1',
71
+ rest_elevation_idle: rest?.elevationAttr === 'idle',
72
+ transition_has_filter: /filter/.test(rest?.transitionProperty || ''),
73
+ source_cyber_stack: sourceCyberStack,
74
+ source_light_stack: sourceLightStack,
75
+ source_attr: sourceAttr,
76
+ };
77
+ const ok = Object.values(results).every(Boolean);
78
+ console.log(`${ok ? '✅' : '❌'} R613 label card stacked brightness (4-axis hover paint signature):`,
79
+ JSON.stringify(results, null, 2),
80
+ `\n rest: ${JSON.stringify(rest)}`);
81
+ process.exit(ok ? 0 : 1);