@sleep2agi/agent-network-dashboard 0.5.3-preview.26 → 0.5.3-preview.260

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 (393) 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/[root-of-the-server]__0tx8s8i._.js +1 -1
  132. package/.next/server/chunks/[root-of-the-server]__0tx8s8i._.js.map +1 -1
  133. package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js +1 -1
  134. package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js.map +1 -1
  135. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js +4 -4
  136. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js.map +1 -1
  137. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js +1 -1
  138. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js.map +1 -1
  139. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js +1 -1
  140. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.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/083elibefsefi.js +4 -0
  145. package/.next/static/chunks/{05uydm8okqgqe.js → 0p142v5va508~.js} +1 -1
  146. package/.next/static/chunks/0u8v68gl7g6j1.js +1 -0
  147. package/.next/static/chunks/11sahbo6ikg8g.js +1 -0
  148. package/.next/static/chunks/16-7qr7qx9zrz.css +2 -0
  149. package/.next/trace +2 -2
  150. package/.next/trace-build +1 -1
  151. package/app/api/hub/servers/route.ts +3 -29
  152. package/app/components/TopoGraph.tsx +6143 -180
  153. package/app/globals.css +897 -7
  154. package/app/lib/serverDedupe.ts +122 -0
  155. package/package.json +1 -1
  156. package/scripts/p157-rc2-dedup-test.mjs +110 -0
  157. package/scripts/topo-a11y-titles-catalog-test.mjs +132 -0
  158. package/scripts/topo-active-chrome-hover-text-test.mjs +107 -0
  159. package/scripts/topo-active-links-chip-halo-layers-test.mjs +81 -0
  160. package/scripts/topo-alias-chat-brightness-test.mjs +79 -0
  161. package/scripts/topo-alias-text-halo-layers-test.mjs +98 -0
  162. package/scripts/topo-animation-temporal-modes-catalog-test.mjs +144 -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-canvas-desc-a11y-test.mjs +87 -0
  177. package/scripts/topo-canvas-entrance-animation-test.mjs +117 -0
  178. package/scripts/topo-canvas-scan-beam-diagonal-test.mjs +148 -0
  179. package/scripts/topo-canvas-scan-beam-test.mjs +109 -0
  180. package/scripts/topo-canvas-scan-beam-vertical-test.mjs +123 -0
  181. package/scripts/topo-card-chat-brightness-test.mjs +86 -0
  182. package/scripts/topo-chat-ring-breath-curve-test.mjs +114 -0
  183. package/scripts/topo-chat-ring-brightness-test.mjs +80 -0
  184. package/scripts/topo-chat-ring-halo-layers-test.mjs +100 -0
  185. package/scripts/topo-chat-ring-r-breath-test.mjs +121 -0
  186. package/scripts/topo-chat-ring-status-halo-test.mjs +106 -0
  187. package/scripts/topo-chat-ring-sw-breath-test.mjs +123 -0
  188. package/scripts/topo-chip-pin-halo-test.mjs +85 -0
  189. package/scripts/topo-chip-row-digit-ls-test.mjs +135 -0
  190. package/scripts/topo-chip-row-member-alias-lit-test.mjs +154 -0
  191. package/scripts/topo-chip-row-tier-glow-brightness-test.mjs +99 -0
  192. package/scripts/topo-chip-row-unit-hover-tracking-test.mjs +124 -0
  193. package/scripts/topo-chrome-control-halo-layers-test.mjs +22 -0
  194. package/scripts/topo-chrome-fullscreen-breath-test.mjs +121 -0
  195. package/scripts/topo-chrome-layout-trailer-breath-test.mjs +86 -0
  196. package/scripts/topo-chrome-nodesize-trailer-breath-test.mjs +86 -0
  197. package/scripts/topo-chrome-reset-breath-test.mjs +115 -0
  198. package/scripts/topo-chrome-strip-entrance-animation-test.mjs +115 -0
  199. package/scripts/topo-chrome-wrapper-halo-test.mjs +83 -0
  200. package/scripts/topo-chrome-zoom-wrapper-breath-test.mjs +85 -0
  201. package/scripts/topo-click-ripple-glow-test.mjs +86 -0
  202. package/scripts/topo-click-ripple-halo-layers-test.mjs +79 -0
  203. package/scripts/topo-click-ripple-sw-test.mjs +110 -0
  204. package/scripts/topo-crescent-breath-test.mjs +104 -0
  205. package/scripts/topo-crescent-envelope-breath-test.mjs +103 -0
  206. package/scripts/topo-crescent-recede-test.mjs +111 -0
  207. package/scripts/topo-dense-alias-chat-halo-test.mjs +73 -0
  208. package/scripts/topo-dense-alias-halo-layers-test.mjs +80 -0
  209. package/scripts/topo-dual-axis-surfaces-catalog-test.mjs +94 -0
  210. package/scripts/topo-edge-badge-circle-brightness-test.mjs +82 -0
  211. package/scripts/topo-edge-badge-circle-hot-pulse-test.mjs +100 -0
  212. package/scripts/topo-edge-badge-digit-halo-layers-test.mjs +107 -0
  213. package/scripts/topo-edge-badge-endpoint-gate-test.mjs +94 -0
  214. package/scripts/topo-edge-badge-halo-layers-test.mjs +85 -0
  215. package/scripts/topo-edge-badge-hot-pulse-test.mjs +92 -0
  216. package/scripts/topo-edge-badge-hover-glow-test.mjs +90 -0
  217. package/scripts/topo-edge-badge-text-brightness-test.mjs +83 -0
  218. package/scripts/topo-edge-chat-gate-test.mjs +71 -0
  219. package/scripts/topo-edge-flow-rail-halo-layers-test.mjs +89 -0
  220. package/scripts/topo-edge-particle-brightness-test.mjs +82 -0
  221. package/scripts/topo-edge-particle-halo-layers-test.mjs +91 -0
  222. package/scripts/topo-edge-pill-glow-test.mjs +67 -0
  223. package/scripts/topo-edge-pin-halo-test.mjs +99 -0
  224. package/scripts/topo-edge-visible-brightness-test.mjs +84 -0
  225. package/scripts/topo-edge-visible-halo-layers-test.mjs +87 -0
  226. package/scripts/topo-endpoint-ring-brightness-test.mjs +83 -0
  227. package/scripts/topo-endpoint-ring-flow-halo-test.mjs +107 -0
  228. package/scripts/topo-endpoint-ring-halo-layers-test.mjs +100 -0
  229. package/scripts/topo-filter-pill-glow-test.mjs +90 -0
  230. package/scripts/topo-filter-pill-halo-layers-test.mjs +27 -0
  231. package/scripts/topo-flow-arrow-brightness-test.mjs +82 -0
  232. package/scripts/topo-flow-rail-brightness-test.mjs +80 -0
  233. package/scripts/topo-fullscreen-attr-test.mjs +73 -0
  234. package/scripts/topo-fullscreen-brightness-test.mjs +84 -0
  235. package/scripts/topo-fullscreen-icon-rotate-test.mjs +93 -0
  236. package/scripts/topo-grid-content-bottom-attr-test.mjs +72 -0
  237. package/scripts/topo-group-box-brightness-test.mjs +84 -0
  238. package/scripts/topo-group-box-halo-layers-test.mjs +91 -0
  239. package/scripts/topo-group-chat-gate-test.mjs +77 -0
  240. package/scripts/topo-group-label-brightness-test.mjs +84 -0
  241. package/scripts/topo-group-label-halo-layers-test.mjs +78 -0
  242. package/scripts/topo-group-label-hover-glow-test.mjs +86 -0
  243. package/scripts/topo-group-label-member-alias-hover-test.mjs +125 -0
  244. package/scripts/topo-group-pill-glow-test.mjs +76 -0
  245. package/scripts/topo-group-tint-brightness-test.mjs +82 -0
  246. package/scripts/topo-h2-dual-axis-breath-test.mjs +92 -0
  247. package/scripts/topo-h2-triple-axis-breath-test.mjs +142 -0
  248. package/scripts/topo-halo-chat-gate-test.mjs +72 -0
  249. package/scripts/topo-hover-detail-halo-test.mjs +76 -0
  250. package/scripts/topo-hub-a11y-title-test.mjs +95 -0
  251. package/scripts/topo-hub-core-brightness-test.mjs +82 -0
  252. package/scripts/topo-hub-core-halo-layers-test.mjs +81 -0
  253. package/scripts/topo-hub-digit-brightness-test.mjs +79 -0
  254. package/scripts/topo-hub-digit-halo-layers-test.mjs +76 -0
  255. package/scripts/topo-hub-digit-ls-test.mjs +119 -0
  256. package/scripts/topo-hub-halo-brightness-test.mjs +80 -0
  257. package/scripts/topo-hub-halo-glow-test.mjs +96 -0
  258. package/scripts/topo-hub-halo-halo-layers-test.mjs +76 -0
  259. package/scripts/topo-hub-highlight-brightness-test.mjs +84 -0
  260. package/scripts/topo-hub-highlight-glow-test.mjs +99 -0
  261. package/scripts/topo-hub-highlight-halo-layers-test.mjs +78 -0
  262. package/scripts/topo-hub-highlight-r-test.mjs +112 -0
  263. package/scripts/topo-hub-hover-ring-brightness-test.mjs +79 -0
  264. package/scripts/topo-hub-hover-ring-glow-test.mjs +97 -0
  265. package/scripts/topo-hub-hover-ring-halo-layers-test.mjs +71 -0
  266. package/scripts/topo-hub-spoke-brightness-test.mjs +77 -0
  267. package/scripts/topo-hub-spoke-glow-test.mjs +112 -0
  268. package/scripts/topo-hub-spoke-halo-layers-test.mjs +97 -0
  269. package/scripts/topo-hub-spoke-self-filter-test.mjs +119 -0
  270. package/scripts/topo-kicker-breath-test.mjs +100 -0
  271. package/scripts/topo-kicker-dual-axis-breath-test.mjs +81 -0
  272. package/scripts/topo-kicker-halo-layers-test.mjs +82 -0
  273. package/scripts/topo-kicker-triple-axis-breath-test.mjs +124 -0
  274. package/scripts/topo-label-card-brightness-test.mjs +81 -0
  275. package/scripts/topo-layout-hover-fw-test.mjs +98 -0
  276. package/scripts/topo-layout-toggle-brightness-test.mjs +94 -0
  277. package/scripts/topo-layout-toggle-halo-layers-test.mjs +95 -0
  278. package/scripts/topo-legend-count-brightness-test.mjs +80 -0
  279. package/scripts/topo-legend-count-halo-layers-test.mjs +79 -0
  280. package/scripts/topo-legend-count-letter-spacing-test.mjs +108 -0
  281. package/scripts/topo-legend-label-fw-test.mjs +107 -0
  282. package/scripts/topo-legend-panel-title-breath-test.mjs +86 -0
  283. package/scripts/topo-legend-pin-ring-brightness-test.mjs +82 -0
  284. package/scripts/topo-legend-pin-ring-halo-layers-test.mjs +71 -0
  285. package/scripts/topo-legend-row-count-brightness-test.mjs +85 -0
  286. package/scripts/topo-legend-row-label-glow-test.mjs +102 -0
  287. package/scripts/topo-legend-swatch-glow-test.mjs +109 -0
  288. package/scripts/topo-legend-swatch-member-alias-match-test.mjs +139 -0
  289. package/scripts/topo-legend-tint-brightness-test.mjs +83 -0
  290. package/scripts/topo-legend-trio-halo-layers-test.mjs +22 -0
  291. package/scripts/topo-minimap-container-halo-test.mjs +82 -0
  292. package/scripts/topo-minimap-dot-chat-gate-test.mjs +81 -0
  293. package/scripts/topo-minimap-hover-glow-test.mjs +109 -0
  294. package/scripts/topo-minimap-viewport-brightness-test.mjs +84 -0
  295. package/scripts/topo-minimap-viewport-halo-layers-test.mjs +24 -0
  296. package/scripts/topo-more-footer-brightness-test.mjs +94 -0
  297. package/scripts/topo-node-alias-brightness-test.mjs +84 -0
  298. package/scripts/topo-node-avatar-halo-layers-test.mjs +25 -0
  299. package/scripts/topo-node-hover-ring-halo-layers-test.mjs +70 -0
  300. package/scripts/topo-node-label-card-halo-test.mjs +76 -0
  301. package/scripts/topo-node-sub-text-brightness-test.mjs +88 -0
  302. package/scripts/topo-nodesize-brightness-test.mjs +82 -0
  303. package/scripts/topo-nodesize-halo-layers-test.mjs +89 -0
  304. package/scripts/topo-nodesize-hover-fw-test.mjs +99 -0
  305. package/scripts/topo-orphan-label-opacity-test.mjs +98 -0
  306. package/scripts/topo-panel-count-halo-layers-test.mjs +91 -0
  307. package/scripts/topo-panel-count-hover-ls-test.mjs +87 -0
  308. package/scripts/topo-panel-rect-halo-test.mjs +90 -0
  309. package/scripts/topo-panel-row-brightness-test.mjs +116 -0
  310. package/scripts/topo-panel-title-brightness-test.mjs +98 -0
  311. package/scripts/topo-panel-title-glow-test.mjs +111 -0
  312. package/scripts/topo-panel-titles-dual-axis-breath-test.mjs +94 -0
  313. package/scripts/topo-panel-titles-halo-layers-test.mjs +23 -0
  314. package/scripts/topo-panel-titles-triple-axis-breath-test.mjs +161 -0
  315. package/scripts/topo-pill-x-rotate-test.mjs +96 -0
  316. package/scripts/topo-pip-brightness-test.mjs +85 -0
  317. package/scripts/topo-pressure-bar-halo-layers-test.mjs +19 -0
  318. package/scripts/topo-pressure-seg-glow-test.mjs +92 -0
  319. package/scripts/topo-pressure-seg-member-alias-match-test.mjs +133 -0
  320. package/scripts/topo-pressure-seg-motion-test.mjs +101 -0
  321. package/scripts/topo-r717-scan-beam-pair-pattern-test.mjs +100 -0
  322. package/scripts/topo-r717-triple-axis-pair-pattern-test.mjs +113 -0
  323. package/scripts/topo-r717-triple-axis-tier-pattern-test.mjs +117 -0
  324. package/scripts/topo-recent-count-brightness-test.mjs +84 -0
  325. package/scripts/topo-recent-more-fw-test.mjs +126 -0
  326. package/scripts/topo-recent-more-halo-layers-test.mjs +90 -0
  327. package/scripts/topo-recent-panel-hot-pulse-test.mjs +105 -0
  328. package/scripts/topo-recent-panel-title-breath-test.mjs +91 -0
  329. package/scripts/topo-recent-pip-halo-layers-test.mjs +82 -0
  330. package/scripts/topo-recent-row-chat-gate-test.mjs +75 -0
  331. package/scripts/topo-recent-row-content-lift-test.mjs +140 -0
  332. package/scripts/topo-recent-row-fw-test.mjs +115 -0
  333. package/scripts/topo-recent-row-text-glow-test.mjs +86 -0
  334. package/scripts/topo-recent-row-text-halo-layers-test.mjs +67 -0
  335. package/scripts/topo-recent-tint-brightness-test.mjs +80 -0
  336. package/scripts/topo-recent-ts-brightness-test.mjs +86 -0
  337. package/scripts/topo-reduced-motion-attr-test.mjs +69 -0
  338. package/scripts/topo-reset-brightness-test.mjs +83 -0
  339. package/scripts/topo-reset-icon-hover-scale-test.mjs +102 -0
  340. package/scripts/topo-respiratory-axis-count-stats-test.mjs +154 -0
  341. package/scripts/topo-respiratory-patterns-catalog-test.mjs +112 -0
  342. package/scripts/topo-respiratory-rolodex-test.mjs +83 -0
  343. package/scripts/topo-respiratory-tiers-catalog-test.mjs +119 -0
  344. package/scripts/topo-respiratory-triple-axis-surfaces-catalog-test.mjs +127 -0
  345. package/scripts/topo-runtime-badge-brightness-test.mjs +78 -0
  346. package/scripts/topo-runtime-badge-glow-test.mjs +108 -0
  347. package/scripts/topo-runtime-badge-halo-layers-test.mjs +87 -0
  348. package/scripts/topo-runtime-badge-rotate-test.mjs +85 -0
  349. package/scripts/topo-section-title-breath-test.mjs +83 -0
  350. package/scripts/topo-section-title-halo-layers-test.mjs +88 -0
  351. package/scripts/topo-spoke-chat-gate-test.mjs +72 -0
  352. package/scripts/topo-starfield-hue-test.mjs +109 -0
  353. package/scripts/topo-status-pin-pill-halo-layers-test.mjs +17 -0
  354. package/scripts/topo-status-ring-brightness-test.mjs +84 -0
  355. package/scripts/topo-status-ring-chat-gate-test.mjs +72 -0
  356. package/scripts/topo-status-ring-halo-layers-test.mjs +105 -0
  357. package/scripts/topo-status-ring-status-halo-test.mjs +110 -0
  358. package/scripts/topo-sub-text-chat-brightness-test.mjs +81 -0
  359. package/scripts/topo-svg-title-a11y-r731-test.mjs +93 -0
  360. package/scripts/topo-svg-title-a11y-test.mjs +88 -0
  361. package/scripts/topo-title-block-entrance-animation-test.mjs +127 -0
  362. package/scripts/topo-title-block-envelope-breath-test.mjs +87 -0
  363. package/scripts/topo-titleblock-h2-hover-fw-test.mjs +109 -0
  364. package/scripts/topo-titleblock-h2-hover-tracking-test.mjs +128 -0
  365. package/scripts/topo-titleblock-kicker-hover-test.mjs +134 -0
  366. package/scripts/topo-vendor-chip-glow-test.mjs +97 -0
  367. package/scripts/topo-vendor-chip-halo-layers-test.mjs +18 -0
  368. package/scripts/topo-vendor-chip-pin-halo-test.mjs +88 -0
  369. package/scripts/topo-vendor-count-suffix-halo-layers-test.mjs +79 -0
  370. package/scripts/topo-vendor-distribution-wrapper-halo-test.mjs +93 -0
  371. package/scripts/topo-vendor-letter-halo-layers-test.mjs +93 -0
  372. package/scripts/topo-vendor-pill-glow-test.mjs +98 -0
  373. package/scripts/topo-watermark-breath-test.mjs +100 -0
  374. package/scripts/topo-watermark-dual-axis-breath-test.mjs +88 -0
  375. package/scripts/topo-watermark-envelope-breath-test.mjs +88 -0
  376. package/scripts/topo-watermark-recede-test.mjs +114 -0
  377. package/scripts/topo-watermark-triple-axis-breath-test.mjs +129 -0
  378. package/scripts/topo-working-online-chip-halo-layers-test.mjs +94 -0
  379. package/scripts/topo-zoom-buttons-brightness-test.mjs +94 -0
  380. package/scripts/topo-zoom-in-out-halo-layers-test.mjs +97 -0
  381. package/scripts/topo-zoom-level-breath-test.mjs +87 -0
  382. package/scripts/topo-zoom-level-brightness-test.mjs +83 -0
  383. package/scripts/topo-zoom-level-color-test.mjs +105 -0
  384. package/scripts/topo-zoom-level-dual-axis-breath-test.mjs +83 -0
  385. package/scripts/topo-zoom-level-halo-layers-test.mjs +78 -0
  386. package/scripts/topo-zoom-level-triple-axis-breath-test.mjs +148 -0
  387. package/.next/static/chunks/0b57cx-~yee9s.js +0 -1
  388. package/.next/static/chunks/0c5ux9rrl-j.a.js +0 -4
  389. package/.next/static/chunks/0ixrbcha76lse.js +0 -1
  390. package/.next/static/chunks/0m.1mvl~t.avc.css +0 -2
  391. /package/.next/static/{fAHTff4Obp5vYwjZIWEvA → wz1T-LhLDalz691PpN3E7}/_buildManifest.js +0 -0
  392. /package/.next/static/{fAHTff4Obp5vYwjZIWEvA → wz1T-LhLDalz691PpN3E7}/_clientMiddlewareManifest.js +0 -0
  393. /package/.next/static/{fAHTff4Obp5vYwjZIWEvA → wz1T-LhLDalz691PpN3E7}/_ssgManifest.js +0 -0
@@ -0,0 +1,86 @@
1
+ /* Round 701 — legend panel title at-rest SVG opacity breath, sibling
2
+ * to R700 recent-panel-title breath. Closes the panel-pair breath
3
+ * symmetry — both panel titles now share the 8s cadence.
4
+ *
5
+ * Source assertions:
6
+ * - TopoGraph.tsx has data-legend-panel-title-breath="..." attr
7
+ * - TopoGraph.tsx <animate> with values "0.78;1;0.78" dur="8s" inside legend title
8
+ *
9
+ * Runtime assertions:
10
+ * - legend title element present
11
+ * - data-legend-panel-title-breath='8s' at rest (!pinnedStatus)
12
+ * - <animate> child element present at rest with dur="8s"
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', 'ring');
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
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
40
+ });
41
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
42
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
43
+ const page = await ctx.newPage();
44
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
45
+ await page.waitForSelector('[data-legend-panel-title]', { timeout: 15000, state: 'attached' });
46
+ await page.waitForTimeout(300);
47
+
48
+ const runtimeState = await page.evaluate(() => {
49
+ const title = document.querySelector('[data-legend-panel-title]');
50
+ if (!title) return null;
51
+ const animate = title.querySelector('animate[attributeName="opacity"]');
52
+ return {
53
+ title_present: true,
54
+ breath_attr: title.getAttribute('data-legend-panel-title-breath'),
55
+ active_attr: title.getAttribute('data-legend-panel-title-active'),
56
+ animate_present: !!animate,
57
+ animate_dur: animate?.getAttribute('dur'),
58
+ animate_values: animate?.getAttribute('values'),
59
+ animate_repeat: animate?.getAttribute('repeatCount'),
60
+ };
61
+ });
62
+
63
+ await browser.close();
64
+
65
+ const tsxSrc = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
66
+ const tsxBreathAttr = /data-legend-panel-title-breath=\{!reducedMotion && !pinnedStatus \? '8s' : 'off'\}/.test(tsxSrc);
67
+ // Look for the second animate element after legend (R700 has one for recent, R701 has the same line for legend)
68
+ const allAnimates = tsxSrc.match(/<animate attributeName="opacity" values="0\.78;1;0\.78" dur="8s" repeatCount="indefinite" \/>/g) || [];
69
+ const tsxAnimateCount = allAnimates.length;
70
+
71
+ const results = {
72
+ title_present: !!runtimeState?.title_present,
73
+ rest_breath_8s: runtimeState?.breath_attr === '8s',
74
+ rest_not_active: runtimeState?.active_attr === 'false',
75
+ animate_child_present: runtimeState?.animate_present === true,
76
+ animate_dur_8s: runtimeState?.animate_dur === '8s',
77
+ animate_values_correct: runtimeState?.animate_values === '0.78;1;0.78',
78
+ animate_repeat_indef: runtimeState?.animate_repeat === 'indefinite',
79
+ tsx_breath_attr: tsxBreathAttr,
80
+ tsx_animate_count_2: tsxAnimateCount === 2, // R700 + R701
81
+ };
82
+ const ok = Object.values(results).every(Boolean);
83
+ console.log(`${ok ? '✅' : '❌'} R701 legend-panel-title at-rest SVG breath (panel-pair breath symmetry closed):`,
84
+ JSON.stringify(results, null, 2),
85
+ `\n runtime: ${JSON.stringify(runtimeState)} animate_count: ${tsxAnimateCount}`);
86
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,82 @@
1
+ /* Round 607 — legend pin-ring stacks brightness(1.15) onto
2
+ * R477's pin-gated drop-shadow. Pin-gated brightness family
3
+ * extends to 3rd anchor (R571 group label + R587 group box +
4
+ * R607 legend pin-ring).
5
+ *
6
+ * Test phases:
7
+ * 1. mock 2 nodes → legend rows render
8
+ * 2. rest: pin-ring opacity=0 (no pin), filter='none',
9
+ * brightness-attr='1'
10
+ * 3. computed transition-property contains 'filter'
11
+ * 4. source: stacked filter conditional + data-attr
12
+ */
13
+ import { chromium } from 'playwright';
14
+ import { readFileSync } from 'node:fs';
15
+
16
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
17
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
18
+
19
+ const browser = await chromium.launch({ headless: true });
20
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
21
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
22
+ await ctx.addInitScript(() => {
23
+ try {
24
+ localStorage.setItem('anet-theme', 'cyber');
25
+ localStorage.setItem('anet-topo-layout', 'ring');
26
+ sessionStorage.setItem('anet_v3_auth', '1');
27
+ } catch {}
28
+ });
29
+ await ctx.route('**/api/hub/status*', async (route) => {
30
+ const r = await route.fetch();
31
+ const b = await r.json();
32
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
33
+ const mk = (alias) => ({
34
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
35
+ network_id: nid, project_dir: null,
36
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
37
+ });
38
+ await route.fulfill({ response: r, json: { ...b, sessions: [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-legend-pin-ring-brightness]', { timeout: 15000, state: 'attached' });
45
+ await page.waitForTimeout(500);
46
+
47
+ const rest = await page.evaluate(() => {
48
+ const el = document.querySelector('[data-legend-pin-ring-brightness]');
49
+ if (!el) return null;
50
+ const cs = getComputedStyle(el);
51
+ return {
52
+ filter: cs.filter,
53
+ opacity: cs.opacity,
54
+ transitionProperty: cs.transitionProperty,
55
+ brightnessAttr: el.getAttribute('data-legend-pin-ring-brightness'),
56
+ glowAttr: el.getAttribute('data-legend-pin-ring-glow'),
57
+ pinnedAttr: el.getAttribute('data-legend-pin-ring-pinned'),
58
+ };
59
+ });
60
+
61
+ await browser.close();
62
+
63
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
64
+ const sourceFilter = /filter: isPinned\s*\?\s*`drop-shadow\(0 0 3px \$\{row\.fill\}88\) brightness\(1\.15\)`\s*:\s*undefined/.test(src);
65
+ const sourceAttr = /data-legend-pin-ring-brightness=\{isPinned \? '1\.15' : '1'\}/.test(src);
66
+
67
+ const results = {
68
+ pin_ring_present: !!rest,
69
+ rest_filter_none: rest?.filter === 'none',
70
+ rest_opacity_zero: parseFloat(rest?.opacity || '1') === 0,
71
+ rest_brightness_1: rest?.brightnessAttr === '1',
72
+ rest_glow_false: rest?.glowAttr === 'false',
73
+ rest_pinned_false: rest?.pinnedAttr === 'false',
74
+ transition_has_filter: /filter/.test(rest?.transitionProperty || ''),
75
+ source_filter: sourceFilter,
76
+ source_attr: sourceAttr,
77
+ };
78
+ const ok = Object.values(results).every(Boolean);
79
+ console.log(`${ok ? '✅' : '❌'} R607 legend pin-ring brightness (pin-gated family 3rd anchor):`,
80
+ JSON.stringify(results, null, 2),
81
+ `\n rest: ${JSON.stringify(rest)}`);
82
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,71 @@
1
+ /* Round 649 — legend pin-ring drop-shadow gains a SECOND outer
2
+ * layer. 3rd panel-tier anchor in the multi-layer halo family
3
+ * (after R647 freshness pip + R648 group label).
4
+ *
5
+ * Test phases:
6
+ * 1. mock 2 nodes → legend renders with pin-rings
7
+ * 2. rest: pin-rings halo-layers='0', opacity=0
8
+ * 3. source: filter expression stacks 2 drop-shadows with
9
+ * row.fill tint at 0x88 + 0x44 alpha
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', 'ring');
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: [mk('a·1'), mk('a·2')] } });
37
+ });
38
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
39
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
40
+ const page = await ctx.newPage();
41
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
42
+ await page.waitForSelector('[data-legend-pin-ring-halo-layers]', { timeout: 15000, state: 'attached' });
43
+ await page.waitForTimeout(500);
44
+
45
+ const rest = await page.evaluate(() => {
46
+ return Array.from(document.querySelectorAll('[data-legend-pin-ring-halo-layers]')).map(el => ({
47
+ layers: el.getAttribute('data-legend-pin-ring-halo-layers'),
48
+ pinned: el.getAttribute('data-legend-pin-ring-pinned'),
49
+ opacity: el.getAttribute('opacity'),
50
+ }));
51
+ });
52
+
53
+ await browser.close();
54
+
55
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
56
+ const sourceFilter = /`drop-shadow\(0 0 3px \$\{row\.fill\}88\) drop-shadow\(0 0 6px \$\{row\.fill\}44\) brightness\(1\.15\)`/.test(src);
57
+ const sourceLayersAttr = /data-legend-pin-ring-halo-layers=\{isPinned \? '2' : '0'\}/.test(src);
58
+
59
+ const restAllZero = rest.every(r => r.layers === '0' && r.pinned === 'false' && r.opacity === '0');
60
+
61
+ const results = {
62
+ rings_present: rest.length >= 3,
63
+ rest_all_zero: restAllZero,
64
+ source_filter: sourceFilter,
65
+ source_layers_attr: sourceLayersAttr,
66
+ };
67
+ const ok = Object.values(results).every(Boolean);
68
+ console.log(`${ok ? '✅' : '❌'} R649 legend pin-ring multi-layer halo (panel-tier 3rd anchor):`,
69
+ JSON.stringify(results, null, 2),
70
+ `\n rest: ${JSON.stringify(rest)}`);
71
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,85 @@
1
+ /* Round 590 verification: legend-row count <text> gains
2
+ * filter brightness(1.15) on (hoveredStatus===row.key ||
3
+ * isPinned). 29th anchor in per-element brightness family.
4
+ * Closes legend-row label↔count brightness parity.
5
+ *
6
+ * Test phases:
7
+ * 1. mock nodes → legend rows render (working/idle/offline)
8
+ * 2. rest: filter='none', brightness-attr='1'
9
+ * 3. transition-property contains 'filter'
10
+ * 4. source: filter conditional + data-attr + transition extension
11
+ */
12
+ import { chromium } from 'playwright';
13
+ import { readFileSync } from 'node:fs';
14
+
15
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
16
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
17
+
18
+ const browser = await chromium.launch({ headless: true });
19
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
20
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
21
+ await ctx.addInitScript(() => {
22
+ try {
23
+ localStorage.setItem('anet-theme', 'cyber');
24
+ localStorage.setItem('anet-topo-layout', 'ring');
25
+ sessionStorage.setItem('anet_v3_auth', '1');
26
+ } catch {}
27
+ });
28
+ await ctx.route('**/api/hub/status*', async (route) => {
29
+ const r = await route.fetch();
30
+ const b = await r.json();
31
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
32
+ const mk = (alias) => ({
33
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
34
+ network_id: nid, project_dir: null,
35
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
36
+ });
37
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
38
+ });
39
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
40
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
41
+ const page = await ctx.newPage();
42
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
43
+ await page.waitForSelector('[data-legend-count-brightness]', { timeout: 15000, state: 'attached' });
44
+ await page.waitForTimeout(500);
45
+
46
+ const rest = await page.evaluate(() => {
47
+ const els = document.querySelectorAll('[data-legend-count-brightness]');
48
+ if (!els.length) return null;
49
+ const el = els[0];
50
+ const cs = getComputedStyle(el);
51
+ return {
52
+ count: els.length,
53
+ filter: cs.filter,
54
+ transitionProperty: cs.transitionProperty,
55
+ brightnessAttr: el.getAttribute('data-legend-count-brightness'),
56
+ pinnedAttr: el.getAttribute('data-legend-count-pinned'),
57
+ fillAttr: el.getAttribute('data-legend-count-fill'),
58
+ textContent: el.textContent,
59
+ };
60
+ });
61
+
62
+ await browser.close();
63
+
64
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
65
+ const sourceFilter = /filter: \(hoveredStatus === row\.key \|\| isPinned\)\s*\?\s*'brightness\(1\.15\)'\s*:\s*undefined/.test(src);
66
+ const sourceAttr = /data-legend-count-brightness=\{\(hoveredStatus === row\.key \|\| isPinned\) \? '1\.15' : '1'\}/.test(src);
67
+ const sourceTransition = /transition: 'opacity 200ms ease-out, fill 200ms ease-out, font-weight 200ms ease-out, letter-spacing 200ms ease-out, filter 200ms ease-out'/.test(src);
68
+
69
+ const results = {
70
+ count_present: !!rest,
71
+ count_ge_3: (rest?.count ?? 0) >= 3, // working/idle/offline rows
72
+ rest_filter_none: rest?.filter === 'none',
73
+ rest_brightness_1: rest?.brightnessAttr === '1',
74
+ rest_pinned_false: rest?.pinnedAttr === 'false',
75
+ rest_fill_neutral: rest?.fillAttr === 'neutral',
76
+ transition_has_filter: /filter/.test(rest?.transitionProperty || ''),
77
+ source_filter: sourceFilter,
78
+ source_attr: sourceAttr,
79
+ source_transition: sourceTransition,
80
+ };
81
+ const ok = Object.values(results).every(Boolean);
82
+ console.log(`${ok ? '✅' : '❌'} R590 legend-row-count brightness (29th anchor, legend-row label↔count parity):`,
83
+ JSON.stringify(results, null, 2),
84
+ `\n rest: ${JSON.stringify(rest)}`);
85
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,102 @@
1
+ /* Round 569 verification: legend-row label gains drop-shadow glow
2
+ * on (hoveredStatus === row.key || isPinned). Mirror of R568
3
+ * recent-row text pattern at the sibling legend-row label scope.
4
+ * 18th anchor in drop-shadow family.
5
+ *
6
+ * Test phases:
7
+ * 1. rest: filter='none' on all 3 legend-row labels
8
+ * (working/idle/offline), glow-attr='false'
9
+ * 2. click pressure-seg working → pinnedStatus='working' →
10
+ * working legend-row label glow-attr='true', filter contains
11
+ * drop-shadow with cyan rgba
12
+ * 3. transition-property contains 'filter'
13
+ * 4. source-side regex confirms wiring
14
+ */
15
+ import { chromium } from 'playwright';
16
+ import { readFileSync } from 'node:fs';
17
+
18
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
19
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
20
+
21
+ const browser = await chromium.launch({ headless: true });
22
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
23
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
24
+ await ctx.addInitScript(() => {
25
+ try {
26
+ localStorage.setItem('anet-theme', 'cyber');
27
+ localStorage.setItem('anet-topo-layout', 'ring');
28
+ sessionStorage.setItem('anet_v3_auth', '1');
29
+ } catch {}
30
+ });
31
+ await ctx.route('**/api/hub/status*', async (route) => {
32
+ const r = await route.fetch();
33
+ const b = await r.json();
34
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
35
+ const mk = (alias, status) => ({
36
+ alias, status, model: 'claude-opus-4', runtime: 'claude-code-cli',
37
+ network_id: nid, project_dir: null,
38
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
39
+ });
40
+ await route.fulfill({ response: r, json: { ...b, sessions: [
41
+ mk('alpha·1', 'working'),
42
+ mk('alpha·2', 'idle'),
43
+ mk('alpha·3', 'offline'),
44
+ ] } });
45
+ });
46
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
47
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
48
+ const page = await ctx.newPage();
49
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
50
+ await page.waitForSelector('[data-legend-row-label="working"]', { timeout: 15000 });
51
+ await page.waitForTimeout(500);
52
+
53
+ const probe = (k) => page.evaluate((key) => {
54
+ const el = document.querySelector(`[data-legend-row-label="${key}"]`);
55
+ if (!el) return null;
56
+ const cs = getComputedStyle(el);
57
+ return {
58
+ filter: cs.filter,
59
+ transitionProperty: cs.transitionProperty,
60
+ glowAttr: el.getAttribute('data-legend-row-label-glow'),
61
+ pinnedAttr: el.getAttribute('data-legend-row-label-pinned'),
62
+ };
63
+ }, k);
64
+
65
+ const restWorking = await probe('working');
66
+ const restIdle = await probe('idle');
67
+ const restOffline = await probe('offline');
68
+
69
+ // Click pressure-seg working → sets pinnedStatus='working' →
70
+ // working legend-row label should glow.
71
+ await page.click('[data-pressure-seg="working"]');
72
+ await page.waitForTimeout(400);
73
+ const pinnedWorking = await probe('working');
74
+ const pinnedIdle = await probe('idle');
75
+
76
+ await browser.close();
77
+
78
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
79
+ const sourceFilter = /filter: \(hoveredStatus === row\.key \|\| isPinned\)\s*\?\s*`drop-shadow\(0 0 2px \$\{pal\.legendAccent\}80\)`\s*:\s*undefined/.test(src);
80
+ const sourceTransition = /transition: 'fill 200ms ease-out, letter-spacing 200ms ease-out, font-weight 200ms ease-out, filter 200ms ease-out'/.test(src);
81
+ const sourceGlowAttr = /data-legend-row-label-glow=\{\(hoveredStatus === row\.key \|\| isPinned\) \? 'true' : 'false'\}/.test(src);
82
+
83
+ const results = {
84
+ rest_working_filter_none: restWorking?.filter === 'none',
85
+ rest_idle_filter_none: restIdle?.filter === 'none',
86
+ rest_offline_filter_none: restOffline?.filter === 'none',
87
+ rest_working_glow_false: restWorking?.glowAttr === 'false',
88
+ pinned_working_glow_true: pinnedWorking?.glowAttr === 'true',
89
+ pinned_working_filter: /drop-shadow\(/.test(pinnedWorking?.filter || ''),
90
+ pinned_idle_glow_false: pinnedIdle?.glowAttr === 'false',
91
+ transition_has_filter: /filter/.test(restWorking?.transitionProperty || ''),
92
+ source_filter: sourceFilter,
93
+ source_transition: sourceTransition,
94
+ source_glow_attr: sourceGlowAttr,
95
+ };
96
+ const ok = Object.values(results).every(Boolean);
97
+ console.log(`${ok ? '✅' : '❌'} R569 legend-row label drop-shadow glow (18th anchor, R568 sibling):`,
98
+ JSON.stringify(results, null, 2),
99
+ '\n rest working:', JSON.stringify(restWorking),
100
+ '\n pinned working:', JSON.stringify(pinnedWorking),
101
+ '\n pinned idle (unchanged):', JSON.stringify(pinnedIdle));
102
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,109 @@
1
+ /* Round 537 verification: legend swatch gains drop-shadow glow on
2
+ * hover/pin using its own row.fill color — drop-shadow family 13th
3
+ * anchor.
4
+ *
5
+ * Test phases:
6
+ * 1. rest: data-legend-swatch-glow='false', filter='none'
7
+ * 2. hover legend 'idle' row label (banked R518 path): swatch's glow
8
+ * attr='true', filter matches drop-shadow with the idle row fill
9
+ * (cyber #2dd4bf teal-400)
10
+ * 3. mouseleave: returns to 'false'/'none'
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, status) => ({
34
+ alias, status, 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', 'idle'), mk('a·2', 'idle'), mk('a·3', 'working'),
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-legend-swatch="idle"]', { timeout: 15000 });
47
+ await page.waitForTimeout(800);
48
+
49
+ const sel = '[data-legend-swatch="idle"]';
50
+
51
+ const restRead = async () => page.evaluate((sel) => {
52
+ const el = document.querySelector(sel);
53
+ if (!el) return null;
54
+ const cs = getComputedStyle(el);
55
+ return {
56
+ glowAttr: el.getAttribute('data-legend-swatch-glow'),
57
+ state: el.getAttribute('data-legend-swatch-state'),
58
+ filter: cs.filter,
59
+ transition: cs.transition,
60
+ };
61
+ }, sel);
62
+
63
+ // Phase 1: rest
64
+ const rest = await restRead();
65
+
66
+ // Phase 2: hover the legend 'idle' row label — sibling row hover sets
67
+ // hoveredStatus='idle' which is the same gate as the swatch's hover.
68
+ await page.hover('[data-legend-row-label="idle"]');
69
+ await page.waitForTimeout(400);
70
+ const hover = await restRead();
71
+
72
+ // Phase 3: mouseleave
73
+ await page.mouse.move(50, 50);
74
+ await page.waitForTimeout(400);
75
+ const leave = await restRead();
76
+
77
+ await browser.close();
78
+
79
+ // Source regex
80
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
81
+ const sourceFilterTernary =
82
+ /filter: \(isRowHovered \|\| isPinned\)\s+\? `drop-shadow\(0 0 3px \$\{row\.fill\}99\)`\s+: undefined,/.test(src);
83
+ const sourceAttrWired =
84
+ /data-legend-swatch-glow=\{\(isRowHovered \|\| isPinned\) \? 'true' : 'false'\}/.test(src);
85
+ const sourceTransitionExt =
86
+ /transition: 'r 150ms ease-out, filter 150ms ease-out',/.test(src);
87
+
88
+ const results = {
89
+ rest_glow_false: rest?.glowAttr === 'false',
90
+ rest_state_idle: rest?.state === 'idle',
91
+ rest_filter_none: rest?.filter === 'none' || rest?.filter === '',
92
+ rest_transition_has_filter: /\bfilter\b/.test(rest?.transition || ''),
93
+ hover_glow_true: hover?.glowAttr === 'true',
94
+ hover_state_hover: hover?.state === 'hover',
95
+ hover_filter_drop_shadow: /drop-shadow/.test(hover?.filter || ''),
96
+ hover_filter_has_teal: /rgba?\(45,?\s*212,?\s*191/.test(hover?.filter || ''), // cyber idle teal-400 #2dd4bf (computed as rgba(...))
97
+ leave_glow_false: leave?.glowAttr === 'false',
98
+ leave_filter_none: leave?.filter === 'none' || leave?.filter === '',
99
+ source_filter_ternary: sourceFilterTernary,
100
+ source_attr_wired: sourceAttrWired,
101
+ source_transition_ext: sourceTransitionExt,
102
+ };
103
+ const ok = Object.values(results).every(Boolean);
104
+ console.log(`${ok ? '✅' : '❌'} R537 legend-swatch glow:`,
105
+ JSON.stringify(results, null, 2),
106
+ '\n rest:', JSON.stringify(rest),
107
+ '\n hover:', JSON.stringify(hover),
108
+ '\n leave:', JSON.stringify(leave));
109
+ process.exit(ok ? 0 : 1);