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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (360) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +3 -3
  3. package/.next/diagnostics/route-bundle-stats.json +32 -32
  4. package/.next/fallback-build-manifest.json +3 -3
  5. package/.next/server/app/_global-error.html +1 -1
  6. package/.next/server/app/_global-error.rsc +1 -1
  7. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  8. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  12. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  13. package/.next/server/app/_not-found.html +2 -2
  14. package/.next/server/app/_not-found.rsc +12 -12
  15. package/.next/server/app/_not-found.segments/_full.segment.rsc +12 -12
  16. package/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
  17. package/.next/server/app/_not-found.segments/_index.segment.rsc +7 -7
  18. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  19. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  20. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  21. package/.next/server/app/admin/page_client-reference-manifest.js +1 -1
  22. package/.next/server/app/admin.html +2 -2
  23. package/.next/server/app/admin.rsc +14 -14
  24. package/.next/server/app/admin.segments/_full.segment.rsc +14 -14
  25. package/.next/server/app/admin.segments/_head.segment.rsc +4 -4
  26. package/.next/server/app/admin.segments/_index.segment.rsc +7 -7
  27. package/.next/server/app/admin.segments/_tree.segment.rsc +2 -2
  28. package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +4 -4
  29. package/.next/server/app/admin.segments/admin.segment.rsc +3 -3
  30. package/.next/server/app/index.html +2 -2
  31. package/.next/server/app/index.rsc +14 -14
  32. package/.next/server/app/index.segments/__PAGE__.segment.rsc +4 -4
  33. package/.next/server/app/index.segments/_full.segment.rsc +14 -14
  34. package/.next/server/app/index.segments/_head.segment.rsc +4 -4
  35. package/.next/server/app/index.segments/_index.segment.rsc +7 -7
  36. package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  37. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  38. package/.next/server/app/login.html +2 -2
  39. package/.next/server/app/login.rsc +14 -14
  40. package/.next/server/app/login.segments/_full.segment.rsc +14 -14
  41. package/.next/server/app/login.segments/_head.segment.rsc +4 -4
  42. package/.next/server/app/login.segments/_index.segment.rsc +7 -7
  43. package/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  44. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +4 -4
  45. package/.next/server/app/login.segments/login.segment.rsc +3 -3
  46. package/.next/server/app/logs/page_client-reference-manifest.js +1 -1
  47. package/.next/server/app/logs.html +2 -2
  48. package/.next/server/app/logs.rsc +14 -14
  49. package/.next/server/app/logs.segments/_full.segment.rsc +14 -14
  50. package/.next/server/app/logs.segments/_head.segment.rsc +4 -4
  51. package/.next/server/app/logs.segments/_index.segment.rsc +7 -7
  52. package/.next/server/app/logs.segments/_tree.segment.rsc +2 -2
  53. package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +4 -4
  54. package/.next/server/app/logs.segments/logs.segment.rsc +3 -3
  55. package/.next/server/app/messages/page_client-reference-manifest.js +1 -1
  56. package/.next/server/app/messages.html +2 -2
  57. package/.next/server/app/messages.rsc +14 -14
  58. package/.next/server/app/messages.segments/_full.segment.rsc +14 -14
  59. package/.next/server/app/messages.segments/_head.segment.rsc +4 -4
  60. package/.next/server/app/messages.segments/_index.segment.rsc +7 -7
  61. package/.next/server/app/messages.segments/_tree.segment.rsc +2 -2
  62. package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +4 -4
  63. package/.next/server/app/messages.segments/messages.segment.rsc +3 -3
  64. package/.next/server/app/node/page_client-reference-manifest.js +1 -1
  65. package/.next/server/app/node.html +2 -2
  66. package/.next/server/app/node.rsc +14 -14
  67. package/.next/server/app/node.segments/_full.segment.rsc +14 -14
  68. package/.next/server/app/node.segments/_head.segment.rsc +4 -4
  69. package/.next/server/app/node.segments/_index.segment.rsc +7 -7
  70. package/.next/server/app/node.segments/_tree.segment.rsc +2 -2
  71. package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +4 -4
  72. package/.next/server/app/node.segments/node.segment.rsc +3 -3
  73. package/.next/server/app/nodes/page_client-reference-manifest.js +1 -1
  74. package/.next/server/app/nodes.html +2 -2
  75. package/.next/server/app/nodes.rsc +14 -14
  76. package/.next/server/app/nodes.segments/_full.segment.rsc +14 -14
  77. package/.next/server/app/nodes.segments/_head.segment.rsc +4 -4
  78. package/.next/server/app/nodes.segments/_index.segment.rsc +7 -7
  79. package/.next/server/app/nodes.segments/_tree.segment.rsc +2 -2
  80. package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +4 -4
  81. package/.next/server/app/nodes.segments/nodes.segment.rsc +3 -3
  82. package/.next/server/app/page_client-reference-manifest.js +1 -1
  83. package/.next/server/app/server-logs/page_client-reference-manifest.js +1 -1
  84. package/.next/server/app/server-logs.html +2 -2
  85. package/.next/server/app/server-logs.rsc +14 -14
  86. package/.next/server/app/server-logs.segments/_full.segment.rsc +14 -14
  87. package/.next/server/app/server-logs.segments/_head.segment.rsc +4 -4
  88. package/.next/server/app/server-logs.segments/_index.segment.rsc +7 -7
  89. package/.next/server/app/server-logs.segments/_tree.segment.rsc +2 -2
  90. package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +4 -4
  91. package/.next/server/app/server-logs.segments/server-logs.segment.rsc +3 -3
  92. package/.next/server/app/settings/networks/page_client-reference-manifest.js +1 -1
  93. package/.next/server/app/settings/networks.html +2 -2
  94. package/.next/server/app/settings/networks.rsc +14 -14
  95. package/.next/server/app/settings/networks.segments/_full.segment.rsc +14 -14
  96. package/.next/server/app/settings/networks.segments/_head.segment.rsc +4 -4
  97. package/.next/server/app/settings/networks.segments/_index.segment.rsc +7 -7
  98. package/.next/server/app/settings/networks.segments/_tree.segment.rsc +2 -2
  99. package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +4 -4
  100. package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +3 -3
  101. package/.next/server/app/settings/networks.segments/settings.segment.rsc +3 -3
  102. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  103. package/.next/server/app/settings/tokens/page_client-reference-manifest.js +1 -1
  104. package/.next/server/app/settings/tokens.html +2 -2
  105. package/.next/server/app/settings/tokens.rsc +14 -14
  106. package/.next/server/app/settings/tokens.segments/_full.segment.rsc +14 -14
  107. package/.next/server/app/settings/tokens.segments/_head.segment.rsc +4 -4
  108. package/.next/server/app/settings/tokens.segments/_index.segment.rsc +7 -7
  109. package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +2 -2
  110. package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +4 -4
  111. package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +3 -3
  112. package/.next/server/app/settings/tokens.segments/settings.segment.rsc +3 -3
  113. package/.next/server/app/settings.html +2 -2
  114. package/.next/server/app/settings.rsc +14 -14
  115. package/.next/server/app/settings.segments/_full.segment.rsc +14 -14
  116. package/.next/server/app/settings.segments/_head.segment.rsc +4 -4
  117. package/.next/server/app/settings.segments/_index.segment.rsc +7 -7
  118. package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  119. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +4 -4
  120. package/.next/server/app/settings.segments/settings.segment.rsc +3 -3
  121. package/.next/server/app/tasks/[id]/page_client-reference-manifest.js +1 -1
  122. package/.next/server/app/tasks/page_client-reference-manifest.js +1 -1
  123. package/.next/server/app/tasks.html +2 -2
  124. package/.next/server/app/tasks.rsc +14 -14
  125. package/.next/server/app/tasks.segments/_full.segment.rsc +14 -14
  126. package/.next/server/app/tasks.segments/_head.segment.rsc +4 -4
  127. package/.next/server/app/tasks.segments/_index.segment.rsc +7 -7
  128. package/.next/server/app/tasks.segments/_tree.segment.rsc +2 -2
  129. package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +4 -4
  130. package/.next/server/app/tasks.segments/tasks.segment.rsc +3 -3
  131. package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js +1 -1
  132. package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js.map +1 -1
  133. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js +4 -4
  134. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js.map +1 -1
  135. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js +1 -1
  136. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js.map +1 -1
  137. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js +1 -1
  138. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js.map +1 -1
  139. package/.next/server/chunks/ssr/agent-network-dashboard_app_components_0mvyi-4._.js +1 -1
  140. package/.next/server/chunks/ssr/agent-network-dashboard_app_components_0mvyi-4._.js.map +1 -1
  141. package/.next/server/middleware-build-manifest.js +3 -3
  142. package/.next/server/pages/404.html +2 -2
  143. package/.next/server/pages/500.html +1 -1
  144. package/.next/static/chunks/{05zlv0iopwd40.js → 01he.jfmupx6b.js} +1 -1
  145. package/.next/static/chunks/047xfmz-_yklx.js +1 -0
  146. package/.next/static/chunks/08.zg.lu3fwqw.js +4 -0
  147. package/.next/static/chunks/0_c5~297u5j0p.js +1 -0
  148. package/.next/static/chunks/{03a4--7ncekmk.js → 0v4-5tng.uh.7.js} +2 -2
  149. package/.next/static/chunks/17if82x7mcn4j.css +2 -0
  150. package/.next/trace +2 -2
  151. package/.next/trace-build +1 -1
  152. package/app/components/ServersDrawer.tsx +16 -3
  153. package/app/components/TopoGraph.tsx +5343 -182
  154. package/app/globals.css +228 -6
  155. package/package.json +4 -4
  156. package/scripts/p157-servers-copy-test.mjs +95 -0
  157. package/scripts/topo-active-chrome-hover-text-test.mjs +107 -0
  158. package/scripts/topo-active-links-chip-halo-layers-test.mjs +81 -0
  159. package/scripts/topo-alias-chat-brightness-test.mjs +79 -0
  160. package/scripts/topo-alias-glow-test.mjs +121 -0
  161. package/scripts/topo-alias-text-halo-layers-test.mjs +98 -0
  162. package/scripts/topo-avatar-brightness-test.mjs +116 -0
  163. package/scripts/topo-avatar-chat-gate-test.mjs +77 -0
  164. package/scripts/topo-avatar-drop-shadow-test.mjs +86 -0
  165. package/scripts/topo-avatar-fallback-hover-test.mjs +104 -0
  166. package/scripts/topo-avatar-fallback-rotate-test.mjs +92 -0
  167. package/scripts/topo-avatar-rotate-test.mjs +85 -0
  168. package/scripts/topo-avatar-scale-test.mjs +89 -0
  169. package/scripts/topo-badge-chat-gate-test.mjs +74 -0
  170. package/scripts/topo-brand-drop-shadow-test.mjs +71 -0
  171. package/scripts/topo-brand-logo-breath-test.mjs +102 -0
  172. package/scripts/topo-brand-logo-halo-layers-test.mjs +85 -0
  173. package/scripts/topo-brand-logo-hover-brightness-test.mjs +105 -0
  174. package/scripts/topo-brand-logo-hover-rotate-test.mjs +93 -0
  175. package/scripts/topo-brand-logo-hover-test.mjs +85 -0
  176. package/scripts/topo-card-chat-brightness-test.mjs +86 -0
  177. package/scripts/topo-chat-ring-breath-curve-test.mjs +114 -0
  178. package/scripts/topo-chat-ring-brightness-test.mjs +80 -0
  179. package/scripts/topo-chat-ring-halo-layers-test.mjs +100 -0
  180. package/scripts/topo-chat-ring-r-breath-test.mjs +121 -0
  181. package/scripts/topo-chat-ring-status-halo-test.mjs +106 -0
  182. package/scripts/topo-chat-ring-sw-breath-test.mjs +123 -0
  183. package/scripts/topo-chip-row-digit-ls-test.mjs +135 -0
  184. package/scripts/topo-chip-row-member-alias-lit-test.mjs +154 -0
  185. package/scripts/topo-chip-row-press-test.mjs +93 -0
  186. package/scripts/topo-chip-row-tier-glow-brightness-test.mjs +99 -0
  187. package/scripts/topo-chip-row-unit-hover-tracking-test.mjs +124 -0
  188. package/scripts/topo-chrome-control-halo-layers-test.mjs +22 -0
  189. package/scripts/topo-chrome-press-fullstrip-test.mjs +105 -0
  190. package/scripts/topo-chrome-press-scale-test.mjs +100 -0
  191. package/scripts/topo-click-ripple-glow-test.mjs +86 -0
  192. package/scripts/topo-click-ripple-halo-layers-test.mjs +79 -0
  193. package/scripts/topo-click-ripple-sw-test.mjs +110 -0
  194. package/scripts/topo-cluster-count-attr-test.mjs +80 -0
  195. package/scripts/topo-crescent-breath-test.mjs +104 -0
  196. package/scripts/topo-crescent-recede-test.mjs +111 -0
  197. package/scripts/topo-dense-alias-halo-layers-test.mjs +80 -0
  198. package/scripts/topo-edge-badge-circle-brightness-test.mjs +82 -0
  199. package/scripts/topo-edge-badge-circle-hot-pulse-test.mjs +100 -0
  200. package/scripts/topo-edge-badge-digit-halo-layers-test.mjs +107 -0
  201. package/scripts/topo-edge-badge-endpoint-gate-test.mjs +94 -0
  202. package/scripts/topo-edge-badge-halo-layers-test.mjs +85 -0
  203. package/scripts/topo-edge-badge-hot-pulse-test.mjs +92 -0
  204. package/scripts/topo-edge-badge-hover-glow-test.mjs +90 -0
  205. package/scripts/topo-edge-badge-text-brightness-test.mjs +83 -0
  206. package/scripts/topo-edge-chat-gate-test.mjs +71 -0
  207. package/scripts/topo-edge-flow-rail-halo-layers-test.mjs +89 -0
  208. package/scripts/topo-edge-particle-brightness-test.mjs +82 -0
  209. package/scripts/topo-edge-particle-halo-layers-test.mjs +91 -0
  210. package/scripts/topo-edge-pill-glow-test.mjs +67 -0
  211. package/scripts/topo-edge-visible-brightness-test.mjs +84 -0
  212. package/scripts/topo-edge-visible-halo-layers-test.mjs +87 -0
  213. package/scripts/topo-endpoint-ring-brightness-test.mjs +83 -0
  214. package/scripts/topo-endpoint-ring-flow-halo-test.mjs +107 -0
  215. package/scripts/topo-endpoint-ring-halo-layers-test.mjs +100 -0
  216. package/scripts/topo-filter-pill-glow-test.mjs +90 -0
  217. package/scripts/topo-filter-pill-halo-layers-test.mjs +27 -0
  218. package/scripts/topo-filter-pills-press-test.mjs +96 -0
  219. package/scripts/topo-fleet-density-tier-test.mjs +84 -0
  220. package/scripts/topo-flow-arrow-brightness-test.mjs +82 -0
  221. package/scripts/topo-flow-rail-brightness-test.mjs +80 -0
  222. package/scripts/topo-focus-outline-transition-test.mjs +107 -0
  223. package/scripts/topo-freshness-chip-fade-test.mjs +105 -0
  224. package/scripts/topo-fullscreen-attr-test.mjs +73 -0
  225. package/scripts/topo-fullscreen-brightness-test.mjs +84 -0
  226. package/scripts/topo-fullscreen-icon-rotate-test.mjs +93 -0
  227. package/scripts/topo-grid-content-bottom-attr-test.mjs +72 -0
  228. package/scripts/topo-group-box-brightness-test.mjs +84 -0
  229. package/scripts/topo-group-box-halo-layers-test.mjs +91 -0
  230. package/scripts/topo-group-chat-gate-test.mjs +77 -0
  231. package/scripts/topo-group-label-brightness-test.mjs +84 -0
  232. package/scripts/topo-group-label-halo-layers-test.mjs +78 -0
  233. package/scripts/topo-group-label-hover-glow-test.mjs +86 -0
  234. package/scripts/topo-group-label-member-alias-hover-test.mjs +125 -0
  235. package/scripts/topo-group-pill-glow-test.mjs +76 -0
  236. package/scripts/topo-group-tint-brightness-test.mjs +82 -0
  237. package/scripts/topo-halo-chat-gate-test.mjs +72 -0
  238. package/scripts/topo-hub-core-brightness-test.mjs +82 -0
  239. package/scripts/topo-hub-core-halo-layers-test.mjs +81 -0
  240. package/scripts/topo-hub-digit-brightness-test.mjs +79 -0
  241. package/scripts/topo-hub-digit-halo-layers-test.mjs +76 -0
  242. package/scripts/topo-hub-digit-ls-test.mjs +119 -0
  243. package/scripts/topo-hub-halo-brightness-test.mjs +80 -0
  244. package/scripts/topo-hub-halo-glow-test.mjs +96 -0
  245. package/scripts/topo-hub-halo-halo-layers-test.mjs +76 -0
  246. package/scripts/topo-hub-highlight-amplify-test.mjs +139 -0
  247. package/scripts/topo-hub-highlight-brightness-test.mjs +84 -0
  248. package/scripts/topo-hub-highlight-fill-transition-test.mjs +84 -0
  249. package/scripts/topo-hub-highlight-glow-test.mjs +99 -0
  250. package/scripts/topo-hub-highlight-halo-layers-test.mjs +78 -0
  251. package/scripts/topo-hub-highlight-r-test.mjs +112 -0
  252. package/scripts/topo-hub-highlight-recede-test.mjs +144 -0
  253. package/scripts/topo-hub-highlight-theme-fill-test.mjs +83 -0
  254. package/scripts/topo-hub-hover-ring-brightness-test.mjs +79 -0
  255. package/scripts/topo-hub-hover-ring-glow-test.mjs +97 -0
  256. package/scripts/topo-hub-hover-ring-halo-layers-test.mjs +71 -0
  257. package/scripts/topo-hub-idle-breath-test.mjs +109 -0
  258. package/scripts/topo-hub-recede-test.mjs +124 -0
  259. package/scripts/topo-hub-spoke-brightness-test.mjs +77 -0
  260. package/scripts/topo-hub-spoke-glow-test.mjs +112 -0
  261. package/scripts/topo-hub-spoke-halo-layers-test.mjs +97 -0
  262. package/scripts/topo-hub-spoke-self-filter-test.mjs +119 -0
  263. package/scripts/topo-kicker-halo-layers-test.mjs +82 -0
  264. package/scripts/topo-label-card-brightness-test.mjs +81 -0
  265. package/scripts/topo-layout-hover-fw-test.mjs +98 -0
  266. package/scripts/topo-layout-toggle-brightness-test.mjs +94 -0
  267. package/scripts/topo-layout-toggle-halo-layers-test.mjs +95 -0
  268. package/scripts/topo-legend-count-brightness-test.mjs +80 -0
  269. package/scripts/topo-legend-count-halo-layers-test.mjs +79 -0
  270. package/scripts/topo-legend-count-letter-spacing-test.mjs +108 -0
  271. package/scripts/topo-legend-label-fw-test.mjs +107 -0
  272. package/scripts/topo-legend-pin-ring-brightness-test.mjs +82 -0
  273. package/scripts/topo-legend-pin-ring-halo-layers-test.mjs +71 -0
  274. package/scripts/topo-legend-row-count-brightness-test.mjs +85 -0
  275. package/scripts/topo-legend-row-label-glow-test.mjs +102 -0
  276. package/scripts/topo-legend-swatch-glow-test.mjs +109 -0
  277. package/scripts/topo-legend-swatch-member-alias-match-test.mjs +139 -0
  278. package/scripts/topo-legend-tint-brightness-test.mjs +83 -0
  279. package/scripts/topo-legend-trio-halo-layers-test.mjs +22 -0
  280. package/scripts/topo-minimap-dot-chat-gate-test.mjs +81 -0
  281. package/scripts/topo-minimap-hover-glow-test.mjs +109 -0
  282. package/scripts/topo-minimap-viewport-brightness-test.mjs +84 -0
  283. package/scripts/topo-minimap-viewport-halo-layers-test.mjs +24 -0
  284. package/scripts/topo-more-footer-brightness-test.mjs +94 -0
  285. package/scripts/topo-node-alias-brightness-test.mjs +84 -0
  286. package/scripts/topo-node-avatar-halo-layers-test.mjs +25 -0
  287. package/scripts/topo-node-hover-ring-halo-layers-test.mjs +70 -0
  288. package/scripts/topo-node-sub-text-brightness-test.mjs +88 -0
  289. package/scripts/topo-nodesize-brightness-test.mjs +82 -0
  290. package/scripts/topo-nodesize-halo-layers-test.mjs +89 -0
  291. package/scripts/topo-nodesize-hover-fw-test.mjs +99 -0
  292. package/scripts/topo-orphan-box-dash-test.mjs +89 -0
  293. package/scripts/topo-orphan-fill-opacity-test.mjs +91 -0
  294. package/scripts/topo-orphan-label-italic-test.mjs +90 -0
  295. package/scripts/topo-orphan-label-opacity-test.mjs +98 -0
  296. package/scripts/topo-panel-count-halo-layers-test.mjs +91 -0
  297. package/scripts/topo-panel-count-hover-ls-test.mjs +87 -0
  298. package/scripts/topo-panel-row-brightness-test.mjs +116 -0
  299. package/scripts/topo-panel-title-brightness-test.mjs +98 -0
  300. package/scripts/topo-panel-title-glow-test.mjs +111 -0
  301. package/scripts/topo-panel-titles-halo-layers-test.mjs +23 -0
  302. package/scripts/topo-pill-x-rotate-test.mjs +96 -0
  303. package/scripts/topo-pinned-aspect-test.mjs +89 -0
  304. package/scripts/topo-pip-brightness-test.mjs +85 -0
  305. package/scripts/topo-pressure-bar-halo-layers-test.mjs +19 -0
  306. package/scripts/topo-pressure-seg-glow-test.mjs +92 -0
  307. package/scripts/topo-pressure-seg-member-alias-match-test.mjs +133 -0
  308. package/scripts/topo-pressure-seg-motion-test.mjs +101 -0
  309. package/scripts/topo-recent-count-brightness-test.mjs +84 -0
  310. package/scripts/topo-recent-hot-pulse-test.mjs +102 -0
  311. package/scripts/topo-recent-more-fw-test.mjs +126 -0
  312. package/scripts/topo-recent-more-halo-layers-test.mjs +90 -0
  313. package/scripts/topo-recent-panel-hot-pulse-test.mjs +105 -0
  314. package/scripts/topo-recent-pip-halo-layers-test.mjs +82 -0
  315. package/scripts/topo-recent-row-chat-gate-test.mjs +75 -0
  316. package/scripts/topo-recent-row-content-lift-test.mjs +140 -0
  317. package/scripts/topo-recent-row-fw-test.mjs +115 -0
  318. package/scripts/topo-recent-row-text-glow-test.mjs +86 -0
  319. package/scripts/topo-recent-row-text-halo-layers-test.mjs +67 -0
  320. package/scripts/topo-recent-tint-brightness-test.mjs +80 -0
  321. package/scripts/topo-recent-ts-brightness-test.mjs +86 -0
  322. package/scripts/topo-reduced-motion-attr-test.mjs +69 -0
  323. package/scripts/topo-reset-brightness-test.mjs +83 -0
  324. package/scripts/topo-reset-icon-hover-scale-test.mjs +102 -0
  325. package/scripts/topo-runtime-badge-brightness-test.mjs +78 -0
  326. package/scripts/topo-runtime-badge-glow-test.mjs +108 -0
  327. package/scripts/topo-runtime-badge-halo-layers-test.mjs +87 -0
  328. package/scripts/topo-runtime-badge-rotate-test.mjs +85 -0
  329. package/scripts/topo-section-title-halo-layers-test.mjs +88 -0
  330. package/scripts/topo-spoke-chat-gate-test.mjs +72 -0
  331. package/scripts/topo-starfield-hue-test.mjs +109 -0
  332. package/scripts/topo-status-pin-pill-halo-layers-test.mjs +17 -0
  333. package/scripts/topo-status-ring-brightness-test.mjs +84 -0
  334. package/scripts/topo-status-ring-chat-gate-test.mjs +72 -0
  335. package/scripts/topo-status-ring-halo-layers-test.mjs +105 -0
  336. package/scripts/topo-status-ring-status-halo-test.mjs +110 -0
  337. package/scripts/topo-sub-text-chat-brightness-test.mjs +81 -0
  338. package/scripts/topo-svg-focus-transition-test.mjs +105 -0
  339. package/scripts/topo-titleblock-h2-hover-fw-test.mjs +109 -0
  340. package/scripts/topo-titleblock-h2-hover-tracking-test.mjs +128 -0
  341. package/scripts/topo-titleblock-kicker-hover-test.mjs +134 -0
  342. package/scripts/topo-vendor-activelinks-press-test.mjs +100 -0
  343. package/scripts/topo-vendor-chip-glow-test.mjs +97 -0
  344. package/scripts/topo-vendor-chip-halo-layers-test.mjs +18 -0
  345. package/scripts/topo-vendor-letter-halo-layers-test.mjs +93 -0
  346. package/scripts/topo-vendor-pill-glow-test.mjs +98 -0
  347. package/scripts/topo-watermark-breath-test.mjs +100 -0
  348. package/scripts/topo-watermark-recede-test.mjs +114 -0
  349. package/scripts/topo-zoom-buttons-brightness-test.mjs +94 -0
  350. package/scripts/topo-zoom-in-out-halo-layers-test.mjs +97 -0
  351. package/scripts/topo-zoom-level-brightness-test.mjs +83 -0
  352. package/scripts/topo-zoom-level-color-test.mjs +105 -0
  353. package/scripts/topo-zoom-level-halo-layers-test.mjs +78 -0
  354. package/.next/static/chunks/0a4hmfvj-81x5.css +0 -2
  355. package/.next/static/chunks/0a~3lmgl2.3sm.js +0 -4
  356. package/.next/static/chunks/0w_zjois27-bj.js +0 -1
  357. package/.next/static/chunks/11vp-~kvgz81f.js +0 -1
  358. /package/.next/static/{AQG7LOsK4d0T0j2nFonEh → N193Pg2TkoL0c6mKNfKm_}/_buildManifest.js +0 -0
  359. /package/.next/static/{AQG7LOsK4d0T0j2nFonEh → N193Pg2TkoL0c6mKNfKm_}/_clientMiddlewareManifest.js +0 -0
  360. /package/.next/static/{AQG7LOsK4d0T0j2nFonEh → N193Pg2TkoL0c6mKNfKm_}/_ssgManifest.js +0 -0
@@ -0,0 +1,84 @@
1
+ /* Round 587 verification: group box gains stacked
2
+ * brightness(1.15) on hover/pin. 26th anchor in per-element
3
+ * brightness family, 19th in stacked-filter sub-pattern.
4
+ * Stacks with R142 url(#topo-groupbox-lift) SVG filter.
5
+ *
6
+ * Test phases:
7
+ * 1. mock 2 nodes with prefix-group alias → grid layout
8
+ * renders group box
9
+ * 2. rest (not hovered, not pinned): filter='none' computed,
10
+ * brightness-attr='1', pinned='false'
11
+ * 3. transition-property contains 'filter'
12
+ * 4. source: filter conditional stack + data-attr
13
+ */
14
+ import { chromium } from 'playwright';
15
+ import { readFileSync } from 'node:fs';
16
+
17
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
18
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
19
+
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(() => {
24
+ try {
25
+ localStorage.setItem('anet-theme', 'cyber');
26
+ localStorage.setItem('anet-topo-layout', 'grid');
27
+ sessionStorage.setItem('anet_v3_auth', '1');
28
+ } catch {}
29
+ });
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) => ({
35
+ alias, status: 'idle', 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
+ // Two prefix groups so grid layout produces visible group boxes
40
+ await route.fulfill({ response: r, json: { ...b, sessions: [
41
+ mk('alpha·1'), mk('alpha·2'), mk('beta·1'), mk('beta·2'),
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-group-box-brightness]', { timeout: 15000, state: 'attached' });
49
+ await page.waitForTimeout(500);
50
+
51
+ const rest = await page.evaluate(() => {
52
+ const el = document.querySelector('[data-group-box-brightness]');
53
+ if (!el) return null;
54
+ const cs = getComputedStyle(el);
55
+ return {
56
+ filter: cs.filter,
57
+ transitionProperty: cs.transitionProperty,
58
+ brightnessAttr: el.getAttribute('data-group-box-brightness'),
59
+ pinnedAttr: el.getAttribute('data-group-box-pinned'),
60
+ liftedAttr: el.getAttribute('data-group-box-lifted'),
61
+ };
62
+ });
63
+
64
+ await browser.close();
65
+
66
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
67
+ const sourceFilter = /filter: \(isPinned \|\| isHovered\)\s*\?\s*'url\(#topo-groupbox-lift\) brightness\(1\.15\)'\s*:\s*undefined/.test(src);
68
+ const sourceAttr = /data-group-box-brightness=\{\(isPinned \|\| isHovered\) \? '1\.15' : '1'\}/.test(src);
69
+
70
+ const results = {
71
+ box_present: !!rest,
72
+ rest_filter_none: rest?.filter === 'none',
73
+ rest_brightness_1: rest?.brightnessAttr === '1',
74
+ rest_pinned_false: rest?.pinnedAttr === 'false',
75
+ rest_lifted_false: rest?.liftedAttr === 'false',
76
+ transition_has_filter: /filter/.test(rest?.transitionProperty || ''),
77
+ source_filter: sourceFilter,
78
+ source_attr: sourceAttr,
79
+ };
80
+ const ok = Object.values(results).every(Boolean);
81
+ console.log(`${ok ? '✅' : '❌'} R587 group-box brightness (26th anchor, group-cluster scope):`,
82
+ JSON.stringify(results, null, 2),
83
+ `\n rest: ${JSON.stringify(rest)}`);
84
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,91 @@
1
+ /* Round 682 — group cluster box (grid-layout prefix-group rect)
2
+ * extends filter chain from `url(#topo-groupbox-lift) brightness(1.15)`
3
+ * to ADD 2-layer drop-shadow at pal.legendAccent tint between the SVG
4
+ * elevation filter and the brightness — chain becomes:
5
+ * url(#topo-groupbox-lift)
6
+ * drop-shadow(0 0 3px ${pal.legendAccent}80)
7
+ * drop-shadow(0 0 6px ${pal.legendAccent}40)
8
+ * brightness(1.15)
9
+ *
10
+ * Cluster box and its R648 label now glow in lockstep when the group
11
+ * is pinned or hovered. 41st anchor — first group-CLUSTER anchor.
12
+ *
13
+ * Source assertions:
14
+ * - filter chain has url(#topo-groupbox-lift) + 2 drop-shadows at
15
+ * pal.legendAccent + brightness(1.15)
16
+ * - data-group-box-halo-layers attr toggles '2' ↔ '0'
17
+ *
18
+ * Runtime assertions:
19
+ * - group cluster boxes present in grid layout (≥3 prefix groups)
20
+ * - rest: halo-layers='0' on all
21
+ * - gate consistency: brightness ↔ halo-layers
22
+ */
23
+ import { chromium } from 'playwright';
24
+ import { readFileSync } from 'node:fs';
25
+
26
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
27
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
28
+
29
+ const browser = await chromium.launch({ headless: true });
30
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
31
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
32
+ await ctx.addInitScript(() => {
33
+ try {
34
+ localStorage.setItem('anet-theme', 'cyber');
35
+ localStorage.setItem('anet-topo-layout', 'grid'); // grid layout for cluster boxes
36
+ sessionStorage.setItem('anet_v3_auth', '1');
37
+ } catch {}
38
+ });
39
+ await ctx.route('**/api/hub/status*', async (route) => {
40
+ const r = await route.fetch();
41
+ const b = await r.json();
42
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
43
+ const mk = (alias) => ({
44
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
45
+ network_id: nid, project_dir: null,
46
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
47
+ });
48
+ // 3 prefix groups (a·X, b·X, c·X) so cluster boxes render
49
+ await route.fulfill({ response: r, json: { ...b, sessions: [
50
+ mk('a·1'), mk('a·2'),
51
+ mk('b·1'), mk('b·2'),
52
+ mk('c·1'), mk('c·2'),
53
+ ] } });
54
+ });
55
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
56
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
57
+ const page = await ctx.newPage();
58
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
59
+ await page.waitForSelector('[data-group-box-halo-layers]', { timeout: 15000, state: 'attached' });
60
+ await page.waitForTimeout(500);
61
+
62
+ const restState = await page.evaluate(() => {
63
+ return Array.from(document.querySelectorAll('[data-group-box-halo-layers]')).map(el => ({
64
+ layers: el.getAttribute('data-group-box-halo-layers'),
65
+ brightness: el.getAttribute('data-group-box-brightness'),
66
+ }));
67
+ });
68
+
69
+ await browser.close();
70
+
71
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
72
+ const sourceFilter = /\? `url\(#topo-groupbox-lift\) drop-shadow\(0 0 3px \$\{pal\.legendAccent\}80\) drop-shadow\(0 0 6px \$\{pal\.legendAccent\}40\) brightness\(1\.15\)`/.test(src);
73
+ const sourceAttr = /data-group-box-halo-layers=\{\(isPinned \|\| isHovered\) \? '2' : '0'\}/.test(src);
74
+
75
+ const allConsistent = restState.every(e =>
76
+ (e.brightness === '1' && e.layers === '0') ||
77
+ (e.brightness === '1.15' && e.layers === '2')
78
+ );
79
+
80
+ const results = {
81
+ boxes_present: restState.length >= 3,
82
+ rest_all_layers_zero: restState.every(e => e.layers === '0'),
83
+ rest_gate_consistent: allConsistent,
84
+ source_filter: sourceFilter,
85
+ source_layers_attr: sourceAttr,
86
+ };
87
+ const ok = Object.values(results).every(Boolean);
88
+ console.log(`${ok ? '✅' : '❌'} R682 group cluster box multi-layer halo (first group-CLUSTER anchor):`,
89
+ JSON.stringify(results, null, 2),
90
+ `\n count: ${restState.length}, sample: ${JSON.stringify(restState.slice(0, 3))}`);
91
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,77 @@
1
+ /* Round 626 — extend activeGroup precedence to include chatGroup
2
+ * (the prefix-group containing chatAlias). Single-line gate
3
+ * cascades group cluster's hover treatments to chat partner's
4
+ * group. 12th anchor in chat-target-gated brightness family.
5
+ *
6
+ * Test phases:
7
+ * 1. mock 2 prefix-group nodes (alpha · 1/2 + beta · 1/2) →
8
+ * grid layout renders group boxes
9
+ * 2. rest (no hover, no pin, no chat): group box at idle
10
+ * state — brightness '1', lifted 'false'
11
+ * 3. source: activeGroup declaration includes chatGroup term
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', 'grid');
26
+ sessionStorage.setItem('anet_v3_auth', '1');
27
+ } catch {}
28
+ });
29
+ await ctx.route('**/api/hub/status*', async (route) => {
30
+ const r = await route.fetch();
31
+ const b = await r.json();
32
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
33
+ const mk = (alias) => ({
34
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
35
+ network_id: nid, project_dir: null,
36
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
37
+ });
38
+ await route.fulfill({ response: r, json: { ...b, sessions: [
39
+ mk('alpha·1'), mk('alpha·2'), mk('beta·1'), mk('beta·2'),
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-group-box-brightness]', { timeout: 15000, state: 'attached' });
47
+ await page.waitForTimeout(500);
48
+
49
+ const rest = await page.evaluate(() => {
50
+ const el = document.querySelector('[data-group-box-brightness]');
51
+ if (!el) return null;
52
+ return {
53
+ brightnessAttr: el.getAttribute('data-group-box-brightness'),
54
+ liftedAttr: el.getAttribute('data-group-box-lifted'),
55
+ pinnedAttr: el.getAttribute('data-group-box-pinned'),
56
+ };
57
+ });
58
+
59
+ await browser.close();
60
+
61
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
62
+ const sourceChatGroup = /const chatGroupKey = chatAlias \? \(groupKeys\[chatAlias\] \?\? chatAlias\) : null/.test(src);
63
+ const sourceActiveGroup = /const isHovered = activeGroup === box\.key \|\| chatGroupKey === box\.key/.test(src);
64
+
65
+ const results = {
66
+ box_present: !!rest,
67
+ rest_brightness_1: rest?.brightnessAttr === '1',
68
+ rest_lifted_false: rest?.liftedAttr === 'false',
69
+ rest_pinned_false: rest?.pinnedAttr === 'false',
70
+ source_chat_group: sourceChatGroup,
71
+ source_active_group_w_chat: sourceActiveGroup,
72
+ };
73
+ const ok = Object.values(results).every(Boolean);
74
+ console.log(`${ok ? '✅' : '❌'} R626 group activeGroup chat-target precedence (chat-gated family 12th anchor):`,
75
+ JSON.stringify(results, null, 2),
76
+ `\n rest: ${JSON.stringify(rest)}`);
77
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,84 @@
1
+ /* Round 571 verification: group-label parent text gains stacked
2
+ * filter brightness(1.15) on top of R479/R538 drop-shadow on
3
+ * isPinned || isHovered. 8th anchor in per-element brightness
4
+ * family.
5
+ *
6
+ * Test phases:
7
+ * 1. mock 6 'alpha·' prefix → 1 prefix group renders in grid
8
+ * 2. rest: filter='none', brightness-attr='1', glow='false'
9
+ * 3. source-side regex confirms stacked filter expression
10
+ * (drop-shadow + brightness) at both isPinned and isHovered
11
+ * branches
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', 'grid');
26
+ sessionStorage.setItem('anet_v3_auth', '1');
27
+ } catch {}
28
+ });
29
+ await ctx.route('**/api/hub/status*', async (route) => {
30
+ const r = await route.fetch();
31
+ const b = await r.json();
32
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
33
+ const mk = (alias) => ({
34
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
35
+ network_id: nid, project_dir: null,
36
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
37
+ });
38
+ await route.fulfill({ response: r, json: { ...b, sessions: [
39
+ mk('alpha·1'), mk('alpha·2'), mk('alpha·3'),
40
+ mk('alpha·4'), mk('alpha·5'), mk('alpha·6'),
41
+ ] } });
42
+ });
43
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
44
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
45
+ const page = await ctx.newPage();
46
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
47
+ await page.waitForSelector('[data-group-label="alpha·"]', { timeout: 15000 });
48
+ await page.waitForTimeout(500);
49
+
50
+ const rest = await page.evaluate(() => {
51
+ const el = document.querySelector('[data-group-label="alpha·"]');
52
+ if (!el) return null;
53
+ const cs = getComputedStyle(el);
54
+ return {
55
+ filter: cs.filter,
56
+ transitionProperty: cs.transitionProperty,
57
+ brightnessAttr: el.getAttribute('data-group-label-brightness'),
58
+ glowAttr: el.getAttribute('data-group-label-glow'),
59
+ pinnedAttr: el.getAttribute('data-group-label-pinned'),
60
+ };
61
+ });
62
+
63
+ await browser.close();
64
+
65
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
66
+ const sourcePinFilter = /filter: isPinned\s*\?\s*`drop-shadow\(0 0 3px \$\{pal\.legendAccent\}80\) brightness\(1\.15\)`/.test(src);
67
+ const sourceHoverFilter = /isHovered\s*\?\s*`drop-shadow\(0 0 3px \$\{pal\.legendAccent\}4d\) brightness\(1\.15\)`/.test(src);
68
+ const sourceAttr = /data-group-label-brightness=\{\(isPinned \|\| isHovered\) \? '1\.15' : '1'\}/.test(src);
69
+
70
+ const results = {
71
+ rest_filter_none: rest?.filter === 'none',
72
+ rest_brightness_1: rest?.brightnessAttr === '1',
73
+ rest_glow_false: rest?.glowAttr === 'false',
74
+ rest_pinned_false: rest?.pinnedAttr === 'false',
75
+ transition_has_filter: /filter/.test(rest?.transitionProperty || ''),
76
+ source_pin_filter: sourcePinFilter,
77
+ source_hover_filter: sourceHoverFilter,
78
+ source_attr: sourceAttr,
79
+ };
80
+ const ok = Object.values(results).every(Boolean);
81
+ console.log(`${ok ? '✅' : '❌'} R571 group-label parent text brightness stacked w/ drop-shadow (8th anchor):`,
82
+ JSON.stringify(results, null, 2),
83
+ `\n rest: ${JSON.stringify(rest)}`);
84
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,78 @@
1
+ /* Round 648 — group-label drop-shadow gains a SECOND outer layer
2
+ * on both pin + hover branches. 2nd panel-tier anchor in the
3
+ * multi-layer halo family (after R647 freshness pip).
4
+ *
5
+ * Test phases:
6
+ * 1. mock 2 prefix-group nodes (alpha · 1/2) in grid layout
7
+ * → group box + label render
8
+ * 2. rest: group label halo-layers='0', no filter
9
+ * 3. source: pin branch + hover branch both stack 2 drop-shadows
10
+ */
11
+ import { chromium } from 'playwright';
12
+ import { readFileSync } from 'node:fs';
13
+
14
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
15
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
16
+
17
+ const browser = await chromium.launch({ headless: true });
18
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
19
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
20
+ await ctx.addInitScript(() => {
21
+ try {
22
+ localStorage.setItem('anet-theme', 'cyber');
23
+ localStorage.setItem('anet-topo-layout', 'grid');
24
+ sessionStorage.setItem('anet_v3_auth', '1');
25
+ } catch {}
26
+ });
27
+ await ctx.route('**/api/hub/status*', async (route) => {
28
+ const r = await route.fetch();
29
+ const b = await r.json();
30
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
31
+ const mk = (alias) => ({
32
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
33
+ network_id: nid, project_dir: null,
34
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
35
+ });
36
+ await route.fulfill({ response: r, json: { ...b, sessions: [
37
+ mk('alpha·1'), mk('alpha·2'),
38
+ ] } });
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-group-label-halo-layers]', { timeout: 15000, state: 'attached' });
45
+ await page.waitForTimeout(500);
46
+
47
+ const rest = await page.evaluate(() => {
48
+ const el = document.querySelector('[data-group-label-halo-layers]');
49
+ if (!el) return null;
50
+ const cs = getComputedStyle(el);
51
+ return {
52
+ layers: el.getAttribute('data-group-label-halo-layers'),
53
+ pinned: el.getAttribute('data-group-label-pinned'),
54
+ filter: cs.filter,
55
+ };
56
+ });
57
+
58
+ await browser.close();
59
+
60
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
61
+ const sourcePinBranch = /`drop-shadow\(0 0 3px \$\{pal\.legendAccent\}80\) drop-shadow\(0 0 6px \$\{pal\.legendAccent\}40\) brightness\(1\.15\)`/.test(src);
62
+ const sourceHoverBranch = /`drop-shadow\(0 0 3px \$\{pal\.legendAccent\}4d\) drop-shadow\(0 0 6px \$\{pal\.legendAccent\}26\) brightness\(1\.15\)`/.test(src);
63
+ const sourceLayersAttr = /data-group-label-halo-layers=\{\(isPinned \|\| isHovered\) \? '2' : '0'\}/.test(src);
64
+
65
+ const results = {
66
+ rest_present: !!rest,
67
+ rest_layers_0: rest?.layers === '0',
68
+ rest_pinned_false: rest?.pinned === 'false',
69
+ rest_filter_none: rest?.filter === 'none' || !(/drop-shadow/.test(rest?.filter || '')),
70
+ source_pin_branch: sourcePinBranch,
71
+ source_hover_branch: sourceHoverBranch,
72
+ source_layers_attr: sourceLayersAttr,
73
+ };
74
+ const ok = Object.values(results).every(Boolean);
75
+ console.log(`${ok ? '✅' : '❌'} R648 group-label multi-layer halo (panel-tier 2nd anchor):`,
76
+ JSON.stringify(results, null, 2),
77
+ `\n rest: ${JSON.stringify(rest)}`);
78
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,86 @@
1
+ /* Round 538 verification: group label drop-shadow extends from pin-only
2
+ * (R479) to ALSO fire on hover, with 2-tier alpha ladder (pin: 80 hex /
3
+ * hover: 4d hex).
4
+ *
5
+ * Test strategy: source-canonical (group labels only render in grid
6
+ * layout AND group hover via Playwright is impractical for the same
7
+ * SVG-deep reasons as edge-hover R534). Rest probe + source regex
8
+ * covers the wiring.
9
+ *
10
+ * Test phases:
11
+ * 1. rest grid (group label visible): glow attr='false', filter='none'
12
+ * 2. source-side regex confirms:
13
+ * - filter ternary: pin > hover > undefined with 80/4d alpha
14
+ * - 3-value attr ('pin' | 'hover' | 'false')
15
+ */
16
+ import { chromium } from 'playwright';
17
+ import { readFileSync } from 'node:fs';
18
+
19
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
20
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
21
+
22
+ const browser = await chromium.launch({ headless: true });
23
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
24
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
25
+ await ctx.addInitScript(() => {
26
+ try {
27
+ localStorage.setItem('anet-theme', 'cyber');
28
+ localStorage.setItem('anet-topo-layout', 'grid'); // grid for group labels
29
+ sessionStorage.setItem('anet_v3_auth', '1');
30
+ } catch {}
31
+ });
32
+ await ctx.route('**/api/hub/status*', async (route) => {
33
+ const r = await route.fetch();
34
+ const b = await r.json();
35
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
36
+ const mk = (alias, status) => ({
37
+ alias, status, model: 'claude-opus-4', runtime: 'claude-code-cli',
38
+ network_id: nid, project_dir: null,
39
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
40
+ });
41
+ // Two prefix-groups so groupBoxes render
42
+ await route.fulfill({ response: r, json: { ...b, sessions: [
43
+ mk('alpha·1', 'working'), mk('alpha·2', 'working'),
44
+ mk('beta·1', 'idle'), mk('beta·2', 'idle'),
45
+ ] } });
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-group-label-glow]', { timeout: 15000 });
52
+ await page.waitForTimeout(800);
53
+
54
+ const rest = await page.evaluate(() => {
55
+ const el = document.querySelector('[data-group-label-glow]');
56
+ if (!el) return null;
57
+ const cs = getComputedStyle(el);
58
+ return {
59
+ glowAttr: el.getAttribute('data-group-label-glow'),
60
+ pinnedAttr: el.getAttribute('data-group-label-pinned'),
61
+ filter: cs.filter,
62
+ transition: cs.transition,
63
+ };
64
+ });
65
+
66
+ await browser.close();
67
+
68
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
69
+ const sourceFilterTernary =
70
+ /filter: isPinned\s+\? `drop-shadow\(0 0 3px \$\{pal\.legendAccent\}80\)`\s+: isHovered\s+\? `drop-shadow\(0 0 3px \$\{pal\.legendAccent\}4d\)`\s+: undefined,/.test(src);
71
+ const sourceAttrTernary =
72
+ /data-group-label-glow=\{isPinned \? 'pin' : isHovered \? 'hover' : 'false'\}/.test(src);
73
+
74
+ const results = {
75
+ rest_glow_false: rest?.glowAttr === 'false',
76
+ rest_pinned_false: rest?.pinnedAttr === 'false',
77
+ rest_filter_none: rest?.filter === 'none' || rest?.filter === '',
78
+ rest_transition_has_filter: /\bfilter\b/.test(rest?.transition || ''),
79
+ source_filter_ternary: sourceFilterTernary,
80
+ source_attr_ternary: sourceAttrTernary,
81
+ };
82
+ const ok = Object.values(results).every(Boolean);
83
+ console.log(`${ok ? '✅' : '❌'} R538 group-label hover-glow (source-canonical):`,
84
+ JSON.stringify(results, null, 2),
85
+ '\n rest:', JSON.stringify(rest));
86
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,125 @@
1
+ /* Round 561 verification: group-label opacity lifts to 1.0 when
2
+ * operator hovers a NODE ALIAS that's a member of this group.
3
+ * 4th anchor in the inspection-overrides-encoding family.
4
+ *
5
+ * Mock: 3 'alpha-' prefix sessions (1 group) + 3 standalone
6
+ * (orphan band). Hover the alpha-1 node → group 'alpha·' label
7
+ * should lift opacity 0.55 → 1.0.
8
+ *
9
+ * Test phases:
10
+ * 1. confirm grid layout active
11
+ * 2. rest: group 'alpha·' opacity = 0.55
12
+ * 3. hover a node from alpha group → 'alpha·' opacity = 1.0,
13
+ * member-alias-hovered attr = 'true'
14
+ * 4. orphan group should NOT lift (its members aren't hovered)
15
+ * 5. source-side regex confirms wiring
16
+ */
17
+ import { chromium } from 'playwright';
18
+ import { readFileSync } from 'node:fs';
19
+
20
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
21
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
22
+
23
+ const browser = await chromium.launch({ headless: true });
24
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
25
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
26
+ await ctx.addInitScript(() => {
27
+ try {
28
+ localStorage.setItem('anet-theme', 'cyber');
29
+ localStorage.setItem('anet-topo-layout', 'grid');
30
+ sessionStorage.setItem('anet_v3_auth', '1');
31
+ } catch {}
32
+ });
33
+ await ctx.route('**/api/hub/status*', async (route) => {
34
+ const r = await route.fetch();
35
+ const b = await r.json();
36
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
37
+ const mk = (alias, status = 'idle') => ({
38
+ alias, status, model: 'claude-opus-4', runtime: 'claude-code-cli',
39
+ network_id: nid, project_dir: null,
40
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
41
+ });
42
+ // alpha-group has WORKING members → ants run at rest. Hovering a
43
+ // member alias should keep ants running (R561 refined gate).
44
+ await route.fulfill({ response: r, json: { ...b, sessions: [
45
+ mk('alpha·1', 'working'), mk('alpha·2', 'working'), mk('alpha·3'),
46
+ mk('foo'), mk('bar'), mk('baz'),
47
+ ] } });
48
+ });
49
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
50
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
51
+ const page = await ctx.newPage();
52
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
53
+ await page.waitForSelector('[data-group-label]', { timeout: 15000 });
54
+ await page.waitForTimeout(500);
55
+
56
+ const probeGroups = async () => {
57
+ return page.evaluate(() => {
58
+ const els = Array.from(document.querySelectorAll('[data-group-label]'));
59
+ return els.map(el => {
60
+ // Find the matching outer <g> with data-group-box-live to read the
61
+ // ants-gate refinement. The box rect sits within the same parent
62
+ // group as the label — both nest under the per-band <g> in the
63
+ // groupBoxes.map() loop.
64
+ const parent = el.closest('g')?.parentElement || null;
65
+ const boxRect = parent?.querySelector('[data-group-box-live]') || null;
66
+ return {
67
+ key: el.getAttribute('data-group-label'),
68
+ orphan: el.getAttribute('data-group-label-orphan') === 'true',
69
+ opacityAttr: el.getAttribute('data-group-label-opacity'),
70
+ computedOpacity: getComputedStyle(el).opacity,
71
+ memberAliasHovered: el.getAttribute('data-group-label-member-alias-hovered') === 'true',
72
+ boxLive: boxRect?.getAttribute('data-group-box-live'),
73
+ };
74
+ });
75
+ });
76
+ };
77
+
78
+ const restGroups = await probeGroups();
79
+
80
+ // Hover a node from the alpha group.
81
+ await page.hover('g[data-node="alpha·1"]');
82
+ await page.waitForTimeout(400);
83
+ const hoverGroups = await probeGroups();
84
+
85
+ await browser.close();
86
+
87
+ const restAlpha = restGroups.find(g => g.key === 'alpha·');
88
+ const restOrphan = restGroups.find(g => g.orphan);
89
+ const hoverAlpha = hoverGroups.find(g => g.key === 'alpha·');
90
+ const hoverOrphan = hoverGroups.find(g => g.orphan);
91
+
92
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
93
+ const sourceFlag = /const isMemberAliasHovered = !!hoveredAlias && groupKeys\[hoveredAlias\] === box\.key;/.test(src);
94
+ const sourceOpacity = /opacity=\{isPinned \|\| isHovered \|\| isMemberAliasHovered \? 1 : box\.isOrphan \? 0\.4 : 0\.55\}/.test(src);
95
+ const sourceAttr = /data-group-label-member-alias-hovered=/.test(src);
96
+
97
+ const results = {
98
+ alpha_present: !!restAlpha,
99
+ orphan_present: !!restOrphan,
100
+ rest_alpha_opacity_0_55: restAlpha?.computedOpacity === '0.55',
101
+ rest_alpha_attr_not_hovered: restAlpha?.memberAliasHovered === false,
102
+ rest_orphan_opacity_0_4: restOrphan?.computedOpacity === '0.4',
103
+ hover_alpha_opacity_1: hoverAlpha?.computedOpacity === '1',
104
+ hover_alpha_attr_hovered: hoverAlpha?.memberAliasHovered === true,
105
+ hover_orphan_opacity_unchanged: hoverOrphan?.computedOpacity === '0.4',
106
+ hover_orphan_attr_not_hovered: hoverOrphan?.memberAliasHovered === false,
107
+ // R561 ants-gate refinement: alpha group has working members.
108
+ // Rest: ants run ('true'). Pre-R561 hovering a member alias
109
+ // halted ants ('false'); R561 keeps them running on member-alias
110
+ // hover ('true'). Direct label hover would still halt — not
111
+ // exercised here.
112
+ rest_alpha_ants_running: restAlpha?.boxLive === 'true',
113
+ hover_alpha_ants_keep_running: hoverAlpha?.boxLive === 'true',
114
+ source_flag: sourceFlag,
115
+ source_opacity: sourceOpacity,
116
+ source_attr: sourceAttr,
117
+ };
118
+ const ok = Object.values(results).every(Boolean);
119
+ console.log(`${ok ? '✅' : '❌'} R561 group-label member-alias-hover opacity lift (4th anchor in inspection-overrides-encoding):`,
120
+ JSON.stringify(results, null, 2),
121
+ '\n rest alpha:', JSON.stringify(restAlpha),
122
+ '\n rest orphan:', JSON.stringify(restOrphan),
123
+ '\n hover alpha:', JSON.stringify(hoverAlpha),
124
+ '\n hover orphan:', JSON.stringify(hoverOrphan));
125
+ process.exit(ok ? 0 : 1);