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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (348) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +3 -3
  3. package/.next/diagnostics/route-bundle-stats.json +7 -7
  4. package/.next/fallback-build-manifest.json +3 -3
  5. package/.next/server/app/_global-error.html +1 -1
  6. package/.next/server/app/_global-error.rsc +1 -1
  7. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  8. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  12. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  13. package/.next/server/app/_not-found.html +2 -2
  14. package/.next/server/app/_not-found.rsc +2 -2
  15. package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  16. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  17. package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  18. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  19. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  20. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  21. package/.next/server/app/admin/page_client-reference-manifest.js +1 -1
  22. package/.next/server/app/admin.html +2 -2
  23. package/.next/server/app/admin.rsc +2 -2
  24. package/.next/server/app/admin.segments/_full.segment.rsc +2 -2
  25. package/.next/server/app/admin.segments/_head.segment.rsc +1 -1
  26. package/.next/server/app/admin.segments/_index.segment.rsc +2 -2
  27. package/.next/server/app/admin.segments/_tree.segment.rsc +2 -2
  28. package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +1 -1
  29. package/.next/server/app/admin.segments/admin.segment.rsc +1 -1
  30. package/.next/server/app/index.html +2 -2
  31. package/.next/server/app/index.rsc +3 -3
  32. package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  33. package/.next/server/app/index.segments/_full.segment.rsc +3 -3
  34. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  35. package/.next/server/app/index.segments/_index.segment.rsc +2 -2
  36. package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  37. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  38. package/.next/server/app/login.html +2 -2
  39. package/.next/server/app/login.rsc +3 -3
  40. package/.next/server/app/login.segments/_full.segment.rsc +3 -3
  41. package/.next/server/app/login.segments/_head.segment.rsc +1 -1
  42. package/.next/server/app/login.segments/_index.segment.rsc +2 -2
  43. package/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  44. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  45. package/.next/server/app/login.segments/login.segment.rsc +1 -1
  46. package/.next/server/app/logs/page_client-reference-manifest.js +1 -1
  47. package/.next/server/app/logs.html +2 -2
  48. package/.next/server/app/logs.rsc +2 -2
  49. package/.next/server/app/logs.segments/_full.segment.rsc +2 -2
  50. package/.next/server/app/logs.segments/_head.segment.rsc +1 -1
  51. package/.next/server/app/logs.segments/_index.segment.rsc +2 -2
  52. package/.next/server/app/logs.segments/_tree.segment.rsc +2 -2
  53. package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +1 -1
  54. package/.next/server/app/logs.segments/logs.segment.rsc +1 -1
  55. package/.next/server/app/messages/page_client-reference-manifest.js +1 -1
  56. package/.next/server/app/messages.html +2 -2
  57. package/.next/server/app/messages.rsc +2 -2
  58. package/.next/server/app/messages.segments/_full.segment.rsc +2 -2
  59. package/.next/server/app/messages.segments/_head.segment.rsc +1 -1
  60. package/.next/server/app/messages.segments/_index.segment.rsc +2 -2
  61. package/.next/server/app/messages.segments/_tree.segment.rsc +2 -2
  62. package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +1 -1
  63. package/.next/server/app/messages.segments/messages.segment.rsc +1 -1
  64. package/.next/server/app/node/page_client-reference-manifest.js +1 -1
  65. package/.next/server/app/node.html +2 -2
  66. package/.next/server/app/node.rsc +2 -2
  67. package/.next/server/app/node.segments/_full.segment.rsc +2 -2
  68. package/.next/server/app/node.segments/_head.segment.rsc +1 -1
  69. package/.next/server/app/node.segments/_index.segment.rsc +2 -2
  70. package/.next/server/app/node.segments/_tree.segment.rsc +2 -2
  71. package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +1 -1
  72. package/.next/server/app/node.segments/node.segment.rsc +1 -1
  73. package/.next/server/app/nodes/page_client-reference-manifest.js +1 -1
  74. package/.next/server/app/nodes.html +2 -2
  75. package/.next/server/app/nodes.rsc +2 -2
  76. package/.next/server/app/nodes.segments/_full.segment.rsc +2 -2
  77. package/.next/server/app/nodes.segments/_head.segment.rsc +1 -1
  78. package/.next/server/app/nodes.segments/_index.segment.rsc +2 -2
  79. package/.next/server/app/nodes.segments/_tree.segment.rsc +2 -2
  80. package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +1 -1
  81. package/.next/server/app/nodes.segments/nodes.segment.rsc +1 -1
  82. package/.next/server/app/page_client-reference-manifest.js +1 -1
  83. package/.next/server/app/server-logs/page_client-reference-manifest.js +1 -1
  84. package/.next/server/app/server-logs.html +2 -2
  85. package/.next/server/app/server-logs.rsc +2 -2
  86. package/.next/server/app/server-logs.segments/_full.segment.rsc +2 -2
  87. package/.next/server/app/server-logs.segments/_head.segment.rsc +1 -1
  88. package/.next/server/app/server-logs.segments/_index.segment.rsc +2 -2
  89. package/.next/server/app/server-logs.segments/_tree.segment.rsc +2 -2
  90. package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +1 -1
  91. package/.next/server/app/server-logs.segments/server-logs.segment.rsc +1 -1
  92. package/.next/server/app/settings/networks/page_client-reference-manifest.js +1 -1
  93. package/.next/server/app/settings/networks.html +2 -2
  94. package/.next/server/app/settings/networks.rsc +2 -2
  95. package/.next/server/app/settings/networks.segments/_full.segment.rsc +2 -2
  96. package/.next/server/app/settings/networks.segments/_head.segment.rsc +1 -1
  97. package/.next/server/app/settings/networks.segments/_index.segment.rsc +2 -2
  98. package/.next/server/app/settings/networks.segments/_tree.segment.rsc +2 -2
  99. package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +1 -1
  100. package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +1 -1
  101. package/.next/server/app/settings/networks.segments/settings.segment.rsc +1 -1
  102. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  103. package/.next/server/app/settings/tokens/page_client-reference-manifest.js +1 -1
  104. package/.next/server/app/settings/tokens.html +2 -2
  105. package/.next/server/app/settings/tokens.rsc +2 -2
  106. package/.next/server/app/settings/tokens.segments/_full.segment.rsc +2 -2
  107. package/.next/server/app/settings/tokens.segments/_head.segment.rsc +1 -1
  108. package/.next/server/app/settings/tokens.segments/_index.segment.rsc +2 -2
  109. package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +2 -2
  110. package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +1 -1
  111. package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +1 -1
  112. package/.next/server/app/settings/tokens.segments/settings.segment.rsc +1 -1
  113. package/.next/server/app/settings.html +2 -2
  114. package/.next/server/app/settings.rsc +3 -3
  115. package/.next/server/app/settings.segments/_full.segment.rsc +3 -3
  116. package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  117. package/.next/server/app/settings.segments/_index.segment.rsc +2 -2
  118. package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  119. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +2 -2
  120. package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  121. package/.next/server/app/tasks/[id]/page_client-reference-manifest.js +1 -1
  122. package/.next/server/app/tasks/page_client-reference-manifest.js +1 -1
  123. package/.next/server/app/tasks.html +2 -2
  124. package/.next/server/app/tasks.rsc +2 -2
  125. package/.next/server/app/tasks.segments/_full.segment.rsc +2 -2
  126. package/.next/server/app/tasks.segments/_head.segment.rsc +1 -1
  127. package/.next/server/app/tasks.segments/_index.segment.rsc +2 -2
  128. package/.next/server/app/tasks.segments/_tree.segment.rsc +2 -2
  129. package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +1 -1
  130. package/.next/server/app/tasks.segments/tasks.segment.rsc +1 -1
  131. package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js +1 -1
  132. package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js.map +1 -1
  133. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js +4 -4
  134. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js.map +1 -1
  135. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js +1 -1
  136. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js.map +1 -1
  137. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js +1 -1
  138. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js.map +1 -1
  139. package/.next/server/middleware-build-manifest.js +3 -3
  140. package/.next/server/pages/404.html +2 -2
  141. package/.next/server/pages/500.html +1 -1
  142. package/.next/static/chunks/{17-8bizggk6cz.js → 051~.vno73m41.js} +1 -1
  143. package/.next/static/chunks/0_5bx.ra9kap9.js +4 -0
  144. package/.next/static/chunks/0e20d3m55ia2k.js +1 -0
  145. package/.next/static/chunks/0kawbcl2g5q6s.js +1 -0
  146. package/.next/static/chunks/17if82x7mcn4j.css +2 -0
  147. package/.next/trace +2 -2
  148. package/.next/trace-build +1 -1
  149. package/app/components/TopoGraph.tsx +5127 -184
  150. package/app/globals.css +144 -7
  151. package/package.json +4 -4
  152. package/scripts/topo-active-chrome-hover-text-test.mjs +107 -0
  153. package/scripts/topo-active-links-chip-halo-layers-test.mjs +81 -0
  154. package/scripts/topo-alias-chat-brightness-test.mjs +79 -0
  155. package/scripts/topo-alias-text-halo-layers-test.mjs +98 -0
  156. package/scripts/topo-avatar-chat-gate-test.mjs +77 -0
  157. package/scripts/topo-avatar-drop-shadow-test.mjs +86 -0
  158. package/scripts/topo-avatar-fallback-hover-test.mjs +104 -0
  159. package/scripts/topo-avatar-fallback-rotate-test.mjs +92 -0
  160. package/scripts/topo-avatar-rotate-test.mjs +85 -0
  161. package/scripts/topo-avatar-scale-test.mjs +89 -0
  162. package/scripts/topo-badge-chat-gate-test.mjs +74 -0
  163. package/scripts/topo-brand-drop-shadow-test.mjs +71 -0
  164. package/scripts/topo-brand-logo-breath-test.mjs +102 -0
  165. package/scripts/topo-brand-logo-halo-layers-test.mjs +85 -0
  166. package/scripts/topo-brand-logo-hover-brightness-test.mjs +105 -0
  167. package/scripts/topo-brand-logo-hover-rotate-test.mjs +93 -0
  168. package/scripts/topo-brand-logo-hover-test.mjs +85 -0
  169. package/scripts/topo-card-chat-brightness-test.mjs +86 -0
  170. package/scripts/topo-chat-ring-breath-curve-test.mjs +114 -0
  171. package/scripts/topo-chat-ring-brightness-test.mjs +80 -0
  172. package/scripts/topo-chat-ring-halo-layers-test.mjs +100 -0
  173. package/scripts/topo-chat-ring-r-breath-test.mjs +121 -0
  174. package/scripts/topo-chat-ring-status-halo-test.mjs +106 -0
  175. package/scripts/topo-chat-ring-sw-breath-test.mjs +123 -0
  176. package/scripts/topo-chip-pin-halo-test.mjs +85 -0
  177. package/scripts/topo-chip-row-digit-ls-test.mjs +135 -0
  178. package/scripts/topo-chip-row-member-alias-lit-test.mjs +154 -0
  179. package/scripts/topo-chip-row-tier-glow-brightness-test.mjs +99 -0
  180. package/scripts/topo-chip-row-unit-hover-tracking-test.mjs +124 -0
  181. package/scripts/topo-chrome-control-halo-layers-test.mjs +22 -0
  182. package/scripts/topo-click-ripple-glow-test.mjs +86 -0
  183. package/scripts/topo-click-ripple-halo-layers-test.mjs +79 -0
  184. package/scripts/topo-click-ripple-sw-test.mjs +110 -0
  185. package/scripts/topo-cluster-count-attr-test.mjs +80 -0
  186. package/scripts/topo-crescent-breath-test.mjs +104 -0
  187. package/scripts/topo-crescent-recede-test.mjs +111 -0
  188. package/scripts/topo-dense-alias-chat-halo-test.mjs +73 -0
  189. package/scripts/topo-dense-alias-halo-layers-test.mjs +80 -0
  190. package/scripts/topo-edge-badge-circle-brightness-test.mjs +82 -0
  191. package/scripts/topo-edge-badge-circle-hot-pulse-test.mjs +100 -0
  192. package/scripts/topo-edge-badge-digit-halo-layers-test.mjs +107 -0
  193. package/scripts/topo-edge-badge-endpoint-gate-test.mjs +94 -0
  194. package/scripts/topo-edge-badge-halo-layers-test.mjs +85 -0
  195. package/scripts/topo-edge-badge-hot-pulse-test.mjs +92 -0
  196. package/scripts/topo-edge-badge-hover-glow-test.mjs +90 -0
  197. package/scripts/topo-edge-badge-text-brightness-test.mjs +83 -0
  198. package/scripts/topo-edge-chat-gate-test.mjs +71 -0
  199. package/scripts/topo-edge-flow-rail-halo-layers-test.mjs +89 -0
  200. package/scripts/topo-edge-particle-brightness-test.mjs +82 -0
  201. package/scripts/topo-edge-particle-halo-layers-test.mjs +91 -0
  202. package/scripts/topo-edge-pill-glow-test.mjs +67 -0
  203. package/scripts/topo-edge-pin-halo-test.mjs +99 -0
  204. package/scripts/topo-edge-visible-brightness-test.mjs +84 -0
  205. package/scripts/topo-edge-visible-halo-layers-test.mjs +87 -0
  206. package/scripts/topo-endpoint-ring-brightness-test.mjs +83 -0
  207. package/scripts/topo-endpoint-ring-flow-halo-test.mjs +107 -0
  208. package/scripts/topo-endpoint-ring-halo-layers-test.mjs +100 -0
  209. package/scripts/topo-filter-pill-glow-test.mjs +90 -0
  210. package/scripts/topo-filter-pill-halo-layers-test.mjs +27 -0
  211. package/scripts/topo-flow-arrow-brightness-test.mjs +82 -0
  212. package/scripts/topo-flow-rail-brightness-test.mjs +80 -0
  213. package/scripts/topo-fullscreen-attr-test.mjs +73 -0
  214. package/scripts/topo-fullscreen-brightness-test.mjs +84 -0
  215. package/scripts/topo-fullscreen-icon-rotate-test.mjs +93 -0
  216. package/scripts/topo-grid-content-bottom-attr-test.mjs +72 -0
  217. package/scripts/topo-group-box-brightness-test.mjs +84 -0
  218. package/scripts/topo-group-box-halo-layers-test.mjs +91 -0
  219. package/scripts/topo-group-chat-gate-test.mjs +77 -0
  220. package/scripts/topo-group-label-brightness-test.mjs +84 -0
  221. package/scripts/topo-group-label-halo-layers-test.mjs +78 -0
  222. package/scripts/topo-group-label-hover-glow-test.mjs +86 -0
  223. package/scripts/topo-group-label-member-alias-hover-test.mjs +125 -0
  224. package/scripts/topo-group-pill-glow-test.mjs +76 -0
  225. package/scripts/topo-group-tint-brightness-test.mjs +82 -0
  226. package/scripts/topo-halo-chat-gate-test.mjs +72 -0
  227. package/scripts/topo-hover-detail-halo-test.mjs +76 -0
  228. package/scripts/topo-hub-core-brightness-test.mjs +82 -0
  229. package/scripts/topo-hub-core-halo-layers-test.mjs +81 -0
  230. package/scripts/topo-hub-digit-brightness-test.mjs +79 -0
  231. package/scripts/topo-hub-digit-halo-layers-test.mjs +76 -0
  232. package/scripts/topo-hub-digit-ls-test.mjs +119 -0
  233. package/scripts/topo-hub-halo-brightness-test.mjs +80 -0
  234. package/scripts/topo-hub-halo-glow-test.mjs +96 -0
  235. package/scripts/topo-hub-halo-halo-layers-test.mjs +76 -0
  236. package/scripts/topo-hub-highlight-amplify-test.mjs +139 -0
  237. package/scripts/topo-hub-highlight-brightness-test.mjs +84 -0
  238. package/scripts/topo-hub-highlight-fill-transition-test.mjs +84 -0
  239. package/scripts/topo-hub-highlight-glow-test.mjs +99 -0
  240. package/scripts/topo-hub-highlight-halo-layers-test.mjs +78 -0
  241. package/scripts/topo-hub-highlight-r-test.mjs +112 -0
  242. package/scripts/topo-hub-highlight-recede-test.mjs +144 -0
  243. package/scripts/topo-hub-highlight-theme-fill-test.mjs +83 -0
  244. package/scripts/topo-hub-hover-ring-brightness-test.mjs +79 -0
  245. package/scripts/topo-hub-hover-ring-glow-test.mjs +97 -0
  246. package/scripts/topo-hub-hover-ring-halo-layers-test.mjs +71 -0
  247. package/scripts/topo-hub-idle-breath-test.mjs +7 -2
  248. package/scripts/topo-hub-spoke-brightness-test.mjs +77 -0
  249. package/scripts/topo-hub-spoke-glow-test.mjs +112 -0
  250. package/scripts/topo-hub-spoke-halo-layers-test.mjs +97 -0
  251. package/scripts/topo-hub-spoke-self-filter-test.mjs +119 -0
  252. package/scripts/topo-kicker-halo-layers-test.mjs +82 -0
  253. package/scripts/topo-label-card-brightness-test.mjs +81 -0
  254. package/scripts/topo-layout-hover-fw-test.mjs +98 -0
  255. package/scripts/topo-layout-toggle-brightness-test.mjs +94 -0
  256. package/scripts/topo-layout-toggle-halo-layers-test.mjs +95 -0
  257. package/scripts/topo-legend-count-brightness-test.mjs +80 -0
  258. package/scripts/topo-legend-count-halo-layers-test.mjs +79 -0
  259. package/scripts/topo-legend-count-letter-spacing-test.mjs +108 -0
  260. package/scripts/topo-legend-label-fw-test.mjs +107 -0
  261. package/scripts/topo-legend-pin-ring-brightness-test.mjs +82 -0
  262. package/scripts/topo-legend-pin-ring-halo-layers-test.mjs +71 -0
  263. package/scripts/topo-legend-row-count-brightness-test.mjs +85 -0
  264. package/scripts/topo-legend-row-label-glow-test.mjs +102 -0
  265. package/scripts/topo-legend-swatch-glow-test.mjs +109 -0
  266. package/scripts/topo-legend-swatch-member-alias-match-test.mjs +139 -0
  267. package/scripts/topo-legend-tint-brightness-test.mjs +83 -0
  268. package/scripts/topo-legend-trio-halo-layers-test.mjs +22 -0
  269. package/scripts/topo-minimap-container-halo-test.mjs +82 -0
  270. package/scripts/topo-minimap-dot-chat-gate-test.mjs +81 -0
  271. package/scripts/topo-minimap-hover-glow-test.mjs +109 -0
  272. package/scripts/topo-minimap-viewport-brightness-test.mjs +84 -0
  273. package/scripts/topo-minimap-viewport-halo-layers-test.mjs +24 -0
  274. package/scripts/topo-more-footer-brightness-test.mjs +94 -0
  275. package/scripts/topo-node-alias-brightness-test.mjs +84 -0
  276. package/scripts/topo-node-avatar-halo-layers-test.mjs +25 -0
  277. package/scripts/topo-node-hover-ring-halo-layers-test.mjs +70 -0
  278. package/scripts/topo-node-label-card-halo-test.mjs +76 -0
  279. package/scripts/topo-node-sub-text-brightness-test.mjs +88 -0
  280. package/scripts/topo-nodesize-brightness-test.mjs +82 -0
  281. package/scripts/topo-nodesize-halo-layers-test.mjs +89 -0
  282. package/scripts/topo-nodesize-hover-fw-test.mjs +99 -0
  283. package/scripts/topo-orphan-label-opacity-test.mjs +98 -0
  284. package/scripts/topo-panel-count-halo-layers-test.mjs +91 -0
  285. package/scripts/topo-panel-count-hover-ls-test.mjs +87 -0
  286. package/scripts/topo-panel-rect-halo-test.mjs +90 -0
  287. package/scripts/topo-panel-row-brightness-test.mjs +116 -0
  288. package/scripts/topo-panel-title-brightness-test.mjs +98 -0
  289. package/scripts/topo-panel-title-glow-test.mjs +111 -0
  290. package/scripts/topo-panel-titles-halo-layers-test.mjs +23 -0
  291. package/scripts/topo-pill-x-rotate-test.mjs +96 -0
  292. package/scripts/topo-pip-brightness-test.mjs +85 -0
  293. package/scripts/topo-pressure-bar-halo-layers-test.mjs +19 -0
  294. package/scripts/topo-pressure-seg-glow-test.mjs +92 -0
  295. package/scripts/topo-pressure-seg-member-alias-match-test.mjs +133 -0
  296. package/scripts/topo-pressure-seg-motion-test.mjs +101 -0
  297. package/scripts/topo-recent-count-brightness-test.mjs +84 -0
  298. package/scripts/topo-recent-more-fw-test.mjs +126 -0
  299. package/scripts/topo-recent-more-halo-layers-test.mjs +90 -0
  300. package/scripts/topo-recent-panel-hot-pulse-test.mjs +105 -0
  301. package/scripts/topo-recent-pip-halo-layers-test.mjs +82 -0
  302. package/scripts/topo-recent-row-chat-gate-test.mjs +75 -0
  303. package/scripts/topo-recent-row-content-lift-test.mjs +140 -0
  304. package/scripts/topo-recent-row-fw-test.mjs +115 -0
  305. package/scripts/topo-recent-row-text-glow-test.mjs +86 -0
  306. package/scripts/topo-recent-row-text-halo-layers-test.mjs +67 -0
  307. package/scripts/topo-recent-tint-brightness-test.mjs +80 -0
  308. package/scripts/topo-recent-ts-brightness-test.mjs +86 -0
  309. package/scripts/topo-reduced-motion-attr-test.mjs +69 -0
  310. package/scripts/topo-reset-brightness-test.mjs +83 -0
  311. package/scripts/topo-reset-icon-hover-scale-test.mjs +102 -0
  312. package/scripts/topo-runtime-badge-brightness-test.mjs +78 -0
  313. package/scripts/topo-runtime-badge-glow-test.mjs +108 -0
  314. package/scripts/topo-runtime-badge-halo-layers-test.mjs +87 -0
  315. package/scripts/topo-runtime-badge-rotate-test.mjs +85 -0
  316. package/scripts/topo-section-title-halo-layers-test.mjs +88 -0
  317. package/scripts/topo-spoke-chat-gate-test.mjs +72 -0
  318. package/scripts/topo-starfield-hue-test.mjs +109 -0
  319. package/scripts/topo-status-pin-pill-halo-layers-test.mjs +17 -0
  320. package/scripts/topo-status-ring-brightness-test.mjs +84 -0
  321. package/scripts/topo-status-ring-chat-gate-test.mjs +72 -0
  322. package/scripts/topo-status-ring-halo-layers-test.mjs +105 -0
  323. package/scripts/topo-status-ring-status-halo-test.mjs +110 -0
  324. package/scripts/topo-sub-text-chat-brightness-test.mjs +81 -0
  325. package/scripts/topo-titleblock-h2-hover-fw-test.mjs +109 -0
  326. package/scripts/topo-titleblock-h2-hover-tracking-test.mjs +128 -0
  327. package/scripts/topo-titleblock-kicker-hover-test.mjs +134 -0
  328. package/scripts/topo-vendor-chip-glow-test.mjs +97 -0
  329. package/scripts/topo-vendor-chip-halo-layers-test.mjs +18 -0
  330. package/scripts/topo-vendor-chip-pin-halo-test.mjs +88 -0
  331. package/scripts/topo-vendor-count-suffix-halo-layers-test.mjs +79 -0
  332. package/scripts/topo-vendor-letter-halo-layers-test.mjs +93 -0
  333. package/scripts/topo-vendor-pill-glow-test.mjs +98 -0
  334. package/scripts/topo-watermark-breath-test.mjs +100 -0
  335. package/scripts/topo-watermark-recede-test.mjs +114 -0
  336. package/scripts/topo-working-online-chip-halo-layers-test.mjs +94 -0
  337. package/scripts/topo-zoom-buttons-brightness-test.mjs +94 -0
  338. package/scripts/topo-zoom-in-out-halo-layers-test.mjs +97 -0
  339. package/scripts/topo-zoom-level-brightness-test.mjs +83 -0
  340. package/scripts/topo-zoom-level-color-test.mjs +105 -0
  341. package/scripts/topo-zoom-level-halo-layers-test.mjs +78 -0
  342. package/.next/static/chunks/01uyqm4r9qnpt.js +0 -1
  343. package/.next/static/chunks/04m~pbcsq2ej6.js +0 -4
  344. package/.next/static/chunks/0m.1mvl~t.avc.css +0 -2
  345. package/.next/static/chunks/112g_zni~x6_j.js +0 -1
  346. /package/.next/static/{9EnLX9vOfh-hoRKs1_aTC → 3D5_n49X1pW-2zn5wZP3e}/_buildManifest.js +0 -0
  347. /package/.next/static/{9EnLX9vOfh-hoRKs1_aTC → 3D5_n49X1pW-2zn5wZP3e}/_clientMiddlewareManifest.js +0 -0
  348. /package/.next/static/{9EnLX9vOfh-hoRKs1_aTC → 3D5_n49X1pW-2zn5wZP3e}/_ssgManifest.js +0 -0
@@ -0,0 +1,93 @@
1
+ /* Round 676 — vendor letter glyph (the per-vendor brand initial in
2
+ * the distribution chip) gains multi-layer halo on hover using its
3
+ * OWN per-vendor color (v.color) as tint. 35th anchor in family —
4
+ * first per-vendor anchor. Sibling to R671 legend-row count's per-
5
+ * tier row.fill pattern.
6
+ *
7
+ * Source assertions:
8
+ * - filter chain uses v.color at 0x80 + 0x40 with 2+4 stride,
9
+ * gated on hoveredVendor === v.initial
10
+ * - transition list extends with 'filter 200ms ease-out'
11
+ * - data-vendor-letter-glyph-halo-layers attr toggles '2' ↔ '0'
12
+ *
13
+ * Runtime assertions:
14
+ * - vendor letter glyphs present in chip-row distribution chip
15
+ * - rest state: halo-layers='0' on all glyphs
16
+ * - hover gate consistency: hover='true' ↔ halo-layers='2'
17
+ */
18
+ import { chromium } from 'playwright';
19
+ import { readFileSync } from 'node:fs';
20
+
21
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
22
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
23
+
24
+ const browser = await chromium.launch({ headless: true });
25
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
26
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
27
+ await ctx.addInitScript(() => {
28
+ try {
29
+ localStorage.setItem('anet-theme', 'cyber');
30
+ localStorage.setItem('anet-topo-layout', 'ring');
31
+ sessionStorage.setItem('anet_v3_auth', '1');
32
+ } catch {}
33
+ });
34
+ await ctx.route('**/api/hub/status*', async (route) => {
35
+ const r = await route.fetch();
36
+ const b = await r.json();
37
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
38
+ // 3 vendors: Claude (claude-opus-4), GPT (gpt-4o), Gemini (gemini-pro)
39
+ // so the vendor distribution chip surfaces multiple letters
40
+ const mk = (alias, model) => ({
41
+ alias, status: 'idle', model, runtime: 'claude-code-cli',
42
+ network_id: nid, project_dir: null,
43
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
44
+ });
45
+ await route.fulfill({ response: r, json: { ...b, sessions: [
46
+ mk('a·1', 'claude-opus-4'),
47
+ mk('a·2', 'gpt-4o'),
48
+ mk('a·3', 'gemini-pro'),
49
+ mk('a·4', 'claude-opus-4'),
50
+ ] } });
51
+ });
52
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
53
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
54
+ const page = await ctx.newPage();
55
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
56
+ await page.waitForSelector('[data-vendor-letter-glyph]', { timeout: 15000, state: 'attached' });
57
+ await page.waitForTimeout(500);
58
+
59
+ const restState = await page.evaluate(() => {
60
+ return Array.from(document.querySelectorAll('[data-vendor-letter-glyph]')).map(el => ({
61
+ initial: el.getAttribute('data-vendor-letter-glyph'),
62
+ hover: el.getAttribute('data-vendor-letter-glyph-hover'),
63
+ layers: el.getAttribute('data-vendor-letter-glyph-halo-layers'),
64
+ }));
65
+ });
66
+
67
+ await browser.close();
68
+
69
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
70
+ const sourceFilter = /filter: hoveredVendor === v\.initial \? `drop-shadow\(0 0 2px \$\{v\.color\}80\) drop-shadow\(0 0 4px \$\{v\.color\}40\) brightness\(1\.15\)` : undefined/.test(src);
71
+ const sourceLayersAttr = /data-vendor-letter-glyph-halo-layers=\{hoveredVendor === v\.initial \? '2' : '0'\}/.test(src);
72
+ const sourceTransition = /transition: 'transform 200ms ease-out, filter 200ms ease-out'/.test(src);
73
+
74
+ // Gate consistency: hover ↔ layers must agree on every glyph.
75
+ const allConsistent = restState.every(e =>
76
+ (e.hover === 'false' && e.layers === '0') ||
77
+ (e.hover === 'true' && e.layers === '2')
78
+ );
79
+
80
+ const results = {
81
+ glyphs_present: restState.length >= 2,
82
+ rest_all_layers_zero: restState.every(e => e.layers === '0'),
83
+ rest_all_hover_false: restState.every(e => e.hover === 'false'),
84
+ rest_gate_consistent: allConsistent,
85
+ source_filter: sourceFilter,
86
+ source_layers_attr: sourceLayersAttr,
87
+ source_transition: sourceTransition,
88
+ };
89
+ const ok = Object.values(results).every(Boolean);
90
+ console.log(`${ok ? '✅' : '❌'} R676 vendor letter glyph multi-layer halo (per-vendor v.color tint):`,
91
+ JSON.stringify(results, null, 2),
92
+ `\n rest: ${JSON.stringify(restState)}`);
93
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,98 @@
1
+ /* Round 545 verification: vendor filter pill gains vendorColor drop-
2
+ * shadow when rendered. 3rd of 4 pill variants after R543/R544.
3
+ * Source-canonical (banked R544 lesson — pin via UI is impractical for
4
+ * vendor chip surface; setPinnedVendor needs explicit click on vendor
5
+ * letter chip which renders only at vendorDist > 2).
6
+ *
7
+ * Test phases:
8
+ * 1. unpinned (default): no [data-active-filter="vendor"] element
9
+ * 2. source-side regex confirms filter wired with vendorColor via
10
+ * color-mix 60% syntax
11
+ * 3. source-side scoping: filter wiring is INSIDE the vendor-pill block
12
+ * (matched via setPinnedVendor handler proximity)
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, model) => ({
35
+ alias, status: 'idle', model, runtime: 'claude-code-cli',
36
+ network_id: nid, project_dir: null,
37
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
38
+ });
39
+ // 3 vendors so vendor chip renders (vendorDist.length > 2 gate per R281)
40
+ await route.fulfill({ response: r, json: { ...b, sessions: [
41
+ mk('a·1', 'claude-opus-4'),
42
+ mk('a·2', 'gemini-2.5-pro'),
43
+ mk('a·3', 'gpt-4'),
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-vendor-letter]', { timeout: 15000 });
51
+ await page.waitForTimeout(500);
52
+
53
+ const unpinned = await page.evaluate(() =>
54
+ document.querySelector('[data-active-filter="vendor"]') !== null
55
+ );
56
+
57
+ // Phase 2: try to pin via clicking vendor letter chip (HTML element, hoverable)
58
+ await page.click('[data-vendor-letter]');
59
+ await page.waitForTimeout(400);
60
+
61
+ const pillPresent = await page.evaluate(() =>
62
+ document.querySelector('[data-active-filter="vendor"]') !== null
63
+ );
64
+
65
+ let pinned = null;
66
+ if (pillPresent) {
67
+ pinned = await page.evaluate(() => {
68
+ const el = document.querySelector('[data-active-filter="vendor"]');
69
+ if (!el) return null;
70
+ const cs = getComputedStyle(el);
71
+ return {
72
+ inlineFilter: el.style.filter,
73
+ filter: cs.filter,
74
+ };
75
+ });
76
+ }
77
+
78
+ await browser.close();
79
+
80
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
81
+ // Filter wiring: same color-mix pattern as R544 but with vendorColor not pal.legendAccent
82
+ const vendorPillScope = src.match(/onClick=\{\(\) => setPinnedVendor\(null\)\}[\s\S]{0,2500}/)?.[0] || '';
83
+ const sourceFilterScoped =
84
+ /filter: `drop-shadow\(0 0 3px color-mix\(in srgb, \$\{vendorColor\} 60%, transparent\)\)`,/.test(vendorPillScope);
85
+
86
+ const results = {
87
+ unpinned_pill_absent: unpinned === false,
88
+ pinned_pill_present: pillPresent === true,
89
+ pinned_inline_filter: pinned && /drop-shadow/.test(pinned.inlineFilter || ''),
90
+ pinned_computed_filter: pinned && /drop-shadow/.test(pinned.filter || ''),
91
+ source_filter_scoped: sourceFilterScoped,
92
+ };
93
+ const ok = Object.values(results).every(Boolean);
94
+ console.log(`${ok ? '✅' : '❌'} R545 vendor filter pill glow:`,
95
+ JSON.stringify(results, null, 2),
96
+ '\n unpinned absent:', unpinned,
97
+ '\n pinned:', JSON.stringify(pinned));
98
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,100 @@
1
+ /* Round 519 verification: brand watermark gains ambient SMIL breath
2
+ * animation — 呼吸感 family 3rd anchor.
3
+ *
4
+ * Test phases:
5
+ * 1. default (motion enabled): data-topo-brand-watermark-breath='true'
6
+ * + <animate> child mounted inside the <text>
7
+ * + animate values='0.32;0.48;0.32', dur='6s', repeatCount='indefinite'
8
+ * 2. prefers-reduced-motion: data-topo-brand-watermark-breath='false'
9
+ * + NO <animate> child (gated out at JSX level)
10
+ * 3. source-side regex confirms SMIL gate + values + duration
11
+ * 4. zero-overlap is gated separately by topo-overlap-test.mjs
12
+ */
13
+ import { chromium } from 'playwright';
14
+ import { readFileSync } from 'node:fs';
15
+
16
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
17
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
18
+
19
+ async function probe(reducedMotion) {
20
+ const browser = await chromium.launch({ headless: true });
21
+ const ctx = await browser.newContext({
22
+ viewport: { width: 1500, height: 1200 },
23
+ reducedMotion: reducedMotion ? 'reduce' : 'no-preference',
24
+ });
25
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
26
+ await ctx.addInitScript(() => {
27
+ try {
28
+ localStorage.setItem('anet-theme', 'cyber');
29
+ localStorage.setItem('anet-topo-layout', 'ring');
30
+ sessionStorage.setItem('anet_v3_auth', '1');
31
+ } catch {}
32
+ });
33
+ await ctx.route('**/api/hub/status*', async (route) => {
34
+ const r = await route.fetch();
35
+ const b = await r.json();
36
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
37
+ const mk = (alias) => ({
38
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
39
+ network_id: nid, project_dir: null,
40
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
41
+ });
42
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1')] } });
43
+ });
44
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
45
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
46
+ const page = await ctx.newPage();
47
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
48
+ await page.waitForSelector('[data-topo-brand-watermark]', { timeout: 15000 });
49
+ await page.waitForTimeout(800);
50
+ const probe = await page.evaluate(() => {
51
+ const el = document.querySelector('[data-topo-brand-watermark]');
52
+ if (!el) return null;
53
+ const animate = el.querySelector('animate');
54
+ return {
55
+ attrBreath: el.getAttribute('data-topo-brand-watermark-breath'),
56
+ hasAnimate: !!animate,
57
+ attrName: animate?.getAttribute('attributeName') || null,
58
+ values: animate?.getAttribute('values') || null,
59
+ dur: animate?.getAttribute('dur') || null,
60
+ repeatCount: animate?.getAttribute('repeatCount') || null,
61
+ textContent: el.textContent?.trim() || null,
62
+ opacity: el.getAttribute('opacity'),
63
+ };
64
+ });
65
+ await browser.close();
66
+ return probe;
67
+ }
68
+
69
+ const normal = await probe(false);
70
+ const reduced = await probe(true);
71
+
72
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
73
+ const sourceWiredGate =
74
+ /\{!reducedMotion && \(\s*<animate attributeName="opacity" values="0\.32;0\.48;0\.32" dur="6s" repeatCount="indefinite" \/>\s*\)\}/.test(src);
75
+ const sourceWiredAttr =
76
+ /data-topo-brand-watermark-breath=\{reducedMotion \? 'false' : 'true'\}/.test(src);
77
+
78
+ const results = {
79
+ // Phase 1: motion enabled
80
+ normal_attr_true: normal?.attrBreath === 'true',
81
+ normal_has_animate: normal?.hasAnimate === true,
82
+ normal_attr_name_opacity: normal?.attrName === 'opacity',
83
+ normal_values_correct: normal?.values === '0.32;0.48;0.32',
84
+ normal_dur_6s: normal?.dur === '6s',
85
+ normal_repeat_indefinite: normal?.repeatCount === 'indefinite',
86
+ normal_text_content: normal?.textContent === 'sleep2agi',
87
+ normal_static_opacity_04: normal?.opacity === '0.4',
88
+ // Phase 2: prefers-reduced-motion
89
+ reduced_attr_false: reduced?.attrBreath === 'false',
90
+ reduced_no_animate: reduced?.hasAnimate === false,
91
+ reduced_text_content: reduced?.textContent === 'sleep2agi',
92
+ // Phase 3: source regex
93
+ source_animate_gated: sourceWiredGate,
94
+ source_attr_wired: sourceWiredAttr,
95
+ };
96
+ const ok = Object.values(results).every(Boolean);
97
+ console.log(`${ok ? '✅' : '❌'} R519 watermark breath:`, JSON.stringify(results, null, 2),
98
+ '\n normal:', JSON.stringify(normal),
99
+ '\n reduced:', JSON.stringify(reduced));
100
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,114 @@
1
+ /* Round 525 verification: brand watermark gains focal-recede on
2
+ * non-hub canvas hover — extends R507/R508 focal-recede pattern to
3
+ * 3rd anchor.
4
+ *
5
+ * Test phases:
6
+ * 1. rest: wrapper opacity=1, recede attr='false'
7
+ * 2. hover an alias (non-hub canvas surface): wrapper opacity=0.7,
8
+ * recede attr='true'
9
+ * 3. mouseleave: wrapper opacity returns to 1
10
+ * 4. SMIL <animate> still mounted on inner text (R519 preserved)
11
+ * 5. source-side regex confirms wrapper opacity ternary + attr
12
+ */
13
+ import { chromium } from 'playwright';
14
+ import { readFileSync } from 'node:fs';
15
+
16
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
17
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
18
+
19
+ const browser = await chromium.launch({ headless: true });
20
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
21
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
22
+ await ctx.addInitScript(() => {
23
+ try {
24
+ localStorage.setItem('anet-theme', 'cyber');
25
+ localStorage.setItem('anet-topo-layout', 'ring');
26
+ sessionStorage.setItem('anet_v3_auth', '1');
27
+ } catch {}
28
+ });
29
+ await ctx.route('**/api/hub/status*', async (route) => {
30
+ const r = await route.fetch();
31
+ const b = await r.json();
32
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
33
+ const mk = (alias) => ({
34
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
35
+ network_id: nid, project_dir: null,
36
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
37
+ });
38
+ await route.fulfill({ response: r, json: { ...b, sessions: [
39
+ mk('alpha·1'), mk('alpha·2'), mk('alpha·3'),
40
+ ] } });
41
+ });
42
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
43
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
44
+ const page = await ctx.newPage();
45
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
46
+ await page.waitForSelector('[data-topo-brand-watermark-wrapper]', { timeout: 15000 });
47
+ await page.waitForTimeout(800);
48
+
49
+ // Phase 1: rest
50
+ const rest = await page.evaluate(() => {
51
+ const w = document.querySelector('[data-topo-brand-watermark-wrapper]');
52
+ const t = document.querySelector('[data-topo-brand-watermark]');
53
+ const animate = t?.querySelector('animate');
54
+ return {
55
+ wOpacity: w?.getAttribute('opacity'),
56
+ wRecede: w?.getAttribute('data-topo-brand-watermark-recede'),
57
+ hasAnimate: !!animate,
58
+ textContent: t?.textContent?.trim() || null,
59
+ };
60
+ });
61
+
62
+ // Phase 2: trigger focal-recede via hoveredStatus by hovering the
63
+ // legend `idle` row's label. setHoveredStatus is one of the recede
64
+ // gate vars; the label is a stable hover target (HTML+SVG safe per
65
+ // R518 test path).
66
+ await page.hover('[data-legend-row-label="idle"]');
67
+ await page.waitForTimeout(400);
68
+ const hover = await page.evaluate(() => {
69
+ const w = document.querySelector('[data-topo-brand-watermark-wrapper]');
70
+ return {
71
+ wOpacity: w?.getAttribute('opacity'),
72
+ wRecede: w?.getAttribute('data-topo-brand-watermark-recede'),
73
+ };
74
+ });
75
+
76
+ // Phase 3: physical mouse move far away from any hover target
77
+ await page.mouse.move(900, 50);
78
+ await page.waitForTimeout(400);
79
+ const leave = await page.evaluate(() => {
80
+ const w = document.querySelector('[data-topo-brand-watermark-wrapper]');
81
+ return {
82
+ wOpacity: w?.getAttribute('opacity'),
83
+ wRecede: w?.getAttribute('data-topo-brand-watermark-recede'),
84
+ };
85
+ });
86
+
87
+ await browser.close();
88
+
89
+ // Source regex
90
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
91
+ const sourceWiredOpacity =
92
+ /opacity=\{\(hoveredAlias \|\| hoveredEdgeKey \|\| hoveredGroupLabel \|\|\s*hoveredStatus \|\| hoveredVendor\) && !hoveredHub \? 0\.7 : 1\}/.test(src);
93
+ const sourceWiredAttr =
94
+ /data-topo-brand-watermark-recede=\{\s*\(hoveredAlias \|\| hoveredEdgeKey \|\| hoveredGroupLabel \|\|\s*hoveredStatus \|\| hoveredVendor\) && !hoveredHub \? 'true' : 'false'\s*\}/.test(src);
95
+
96
+ const results = {
97
+ rest_wrapper_opacity_1: rest?.wOpacity === '1',
98
+ rest_recede_false: rest?.wRecede === 'false',
99
+ rest_has_animate: rest?.hasAnimate === true, // R519 SMIL preserved
100
+ rest_text_content: rest?.textContent === 'sleep2agi',
101
+ hover_wrapper_opacity_07: hover?.wOpacity === '0.7',
102
+ hover_recede_true: hover?.wRecede === 'true',
103
+ leave_wrapper_opacity_1: leave?.wOpacity === '1',
104
+ leave_recede_false: leave?.wRecede === 'false',
105
+ source_opacity_wired: sourceWiredOpacity,
106
+ source_attr_wired: sourceWiredAttr,
107
+ };
108
+ const ok = Object.values(results).every(Boolean);
109
+ console.log(`${ok ? '✅' : '❌'} R525 watermark focal-recede:`,
110
+ JSON.stringify(results, null, 2),
111
+ '\n rest:', JSON.stringify(rest),
112
+ '\n hover:', JSON.stringify(hover),
113
+ '\n leave:', JSON.stringify(leave));
114
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,94 @@
1
+ /* Round 687 — working + online chips extend from 4 hover axes (bg/
2
+ * border swap + translate-y + active scale) to add multi-layer halo
3
+ * paint axis. Per-tier tints — green-400 #4ade80 for working chip,
4
+ * cyan-300 #67e8f9 for online chip — match the existing pinnedStatus
5
+ * boxShadow inset rings. 2+4 stride, alpha 80/40. Sibling extension
6
+ * to R686 active-links chip; closes chip-row left-side trio
7
+ * (working + online + active-links) at halo-axis parity.
8
+ *
9
+ * Source assertions:
10
+ * - working chip filter: pal green-400 #4ade80 80/40 2+4 stride
11
+ * - online chip filter: pal cyan-300 #67e8f9 80/40 2+4 stride
12
+ * - both halo-layers attrs toggle '2' ↔ '0' on respective gates
13
+ *
14
+ * Runtime assertions:
15
+ * - both chips present
16
+ * - rest halo-layers='0' on both
17
+ * - mock sessions ensure both chips are interactive (workingCount + onlineNodes > 0)
18
+ */
19
+ import { chromium } from 'playwright';
20
+ import { readFileSync } from 'node:fs';
21
+
22
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
23
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
24
+
25
+ const browser = await chromium.launch({ headless: true });
26
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
27
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
28
+ await ctx.addInitScript(() => {
29
+ try {
30
+ localStorage.setItem('anet-theme', 'cyber');
31
+ localStorage.setItem('anet-topo-layout', 'ring');
32
+ sessionStorage.setItem('anet_v3_auth', '1');
33
+ } catch {}
34
+ });
35
+ await ctx.route('**/api/hub/status*', async (route) => {
36
+ const r = await route.fetch();
37
+ const b = await r.json();
38
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
39
+ const mk = (alias, status) => ({
40
+ alias, status, model: 'claude-opus-4', runtime: 'claude-code-cli',
41
+ network_id: nid, project_dir: null,
42
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
43
+ });
44
+ await route.fulfill({ response: r, json: { ...b, sessions: [
45
+ mk('a·1', 'working'),
46
+ mk('a·2', 'idle'),
47
+ mk('a·3', 'idle'),
48
+ ] } });
49
+ });
50
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
51
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
52
+ const page = await ctx.newPage();
53
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
54
+ await page.waitForSelector('[data-working-chip]', { timeout: 15000, state: 'attached' });
55
+ await page.waitForTimeout(300);
56
+
57
+ const runtimeState = await page.evaluate(() => {
58
+ const working = document.querySelector('[data-working-chip]');
59
+ const online = document.querySelector('[data-online-chip]');
60
+ return {
61
+ working_present: !!working,
62
+ online_present: !!online,
63
+ working_halo: working?.getAttribute('data-working-chip-halo-layers'),
64
+ online_halo: online?.getAttribute('data-online-chip-halo-layers'),
65
+ working_click: working?.getAttribute('data-working-chip-clickable'),
66
+ online_click: online?.getAttribute('data-online-chip-clickable'),
67
+ };
68
+ });
69
+
70
+ await browser.close();
71
+
72
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
73
+ const sourceWorkingFilter = /filter: hoveredStatus === 'working' && workingCount > 0\s*\?\s*'drop-shadow\(0 0 2px #4ade8080\) drop-shadow\(0 0 4px #4ade8040\)'/.test(src);
74
+ const sourceOnlineFilter = /filter: \(hoveredStatus === 'working' \|\| hoveredStatus === 'idle'\) && onlineNodes\.length > 0\s*\?\s*'drop-shadow\(0 0 2px #67e8f980\) drop-shadow\(0 0 4px #67e8f940\)'/.test(src);
75
+ const sourceWorkingAttr = /data-working-chip-halo-layers=\{hoveredStatus === 'working' && workingCount > 0 \? '2' : '0'\}/.test(src);
76
+ const sourceOnlineAttr = /data-online-chip-halo-layers=\{\(hoveredStatus === 'working' \|\| hoveredStatus === 'idle'\) && onlineNodes\.length > 0 \? '2' : '0'\}/.test(src);
77
+
78
+ const results = {
79
+ working_present: runtimeState.working_present,
80
+ online_present: runtimeState.online_present,
81
+ rest_working_layers_0: runtimeState.working_halo === '0',
82
+ rest_online_layers_0: runtimeState.online_halo === '0',
83
+ working_interactive: runtimeState.working_click === 'true',
84
+ online_interactive: runtimeState.online_click === 'true',
85
+ source_working_filter: sourceWorkingFilter,
86
+ source_online_filter: sourceOnlineFilter,
87
+ source_working_attr: sourceWorkingAttr,
88
+ source_online_attr: sourceOnlineAttr,
89
+ };
90
+ const ok = Object.values(results).every(Boolean);
91
+ console.log(`${ok ? '✅' : '❌'} R687 working+online chip multi-layer halo (closes chip-row left-side trio):`,
92
+ JSON.stringify(results, null, 2),
93
+ `\n runtime: ${JSON.stringify(runtimeState)}`);
94
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,94 @@
1
+ /* Round 596 verification: chrome zoom +/- segmented buttons
2
+ * gain hover:brightness-[1.15] via Tailwind class. 35th + 36th
3
+ * anchors in per-element brightness family (4th + 5th HTML).
4
+ * Paired-anchor round closing the zoom control trio.
5
+ *
6
+ * Test phases:
7
+ * 1. mock nodes → chrome zoom buttons render
8
+ * 2. rest: filter='none' (CSS hover-only, no React state)
9
+ * 3. computed transition-property contains 'filter'
10
+ * 4. source: hover:brightness-[1.15] in className + arbitrary
11
+ * transition-property includes filter
12
+ */
13
+ import { chromium } from 'playwright';
14
+ import { readFileSync } from 'node:fs';
15
+
16
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
17
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
18
+
19
+ const browser = await chromium.launch({ headless: true });
20
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
21
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
22
+ await ctx.addInitScript(() => {
23
+ try {
24
+ localStorage.setItem('anet-theme', 'cyber');
25
+ localStorage.setItem('anet-topo-layout', 'ring');
26
+ sessionStorage.setItem('anet_v3_auth', '1');
27
+ } catch {}
28
+ });
29
+ await ctx.route('**/api/hub/status*', async (route) => {
30
+ const r = await route.fetch();
31
+ const b = await r.json();
32
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
33
+ const mk = (alias) => ({
34
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
35
+ network_id: nid, project_dir: null,
36
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
37
+ });
38
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
39
+ });
40
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
41
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
42
+ const page = await ctx.newPage();
43
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
44
+ await page.waitForSelector('[data-topo-chrome-zoom-out]', { timeout: 15000, state: 'attached' });
45
+ await page.waitForTimeout(500);
46
+
47
+ const rest = await page.evaluate(() => {
48
+ const zoomOut = document.querySelector('[data-topo-chrome-zoom-out]');
49
+ const zoomIn = document.querySelector('[data-topo-chrome-zoom-in]');
50
+ if (!zoomOut || !zoomIn) return null;
51
+ return {
52
+ zoomOut: {
53
+ filter: getComputedStyle(zoomOut).filter,
54
+ transitionProperty: getComputedStyle(zoomOut).transitionProperty,
55
+ brightnessHoverAttr: zoomOut.getAttribute('data-topo-chrome-zoom-out-brightness-hover'),
56
+ ariaLabel: zoomOut.getAttribute('aria-label'),
57
+ },
58
+ zoomIn: {
59
+ filter: getComputedStyle(zoomIn).filter,
60
+ transitionProperty: getComputedStyle(zoomIn).transitionProperty,
61
+ brightnessHoverAttr: zoomIn.getAttribute('data-topo-chrome-zoom-in-brightness-hover'),
62
+ ariaLabel: zoomIn.getAttribute('aria-label'),
63
+ },
64
+ };
65
+ });
66
+
67
+ await browser.close();
68
+
69
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
70
+ const sourceOutFilter = /data-topo-chrome-zoom-out[\s\S]*?hover:brightness-\[1\.15\]/.test(src);
71
+ const sourceInFilter = /data-topo-chrome-zoom-in[\s\S]*?hover:brightness-\[1\.15\]/.test(src);
72
+ const sourceOutTransition = /data-topo-chrome-zoom-out[\s\S]*?\[transition-property:color,background-color,transform,filter\]/.test(src);
73
+ const sourceInTransition = /data-topo-chrome-zoom-in[\s\S]*?\[transition-property:color,background-color,transform,filter\]/.test(src);
74
+
75
+ const results = {
76
+ both_buttons_present: !!rest,
77
+ out_rest_filter_none: rest?.zoomOut.filter === 'none',
78
+ in_rest_filter_none: rest?.zoomIn.filter === 'none',
79
+ out_hover_attr: rest?.zoomOut.brightnessHoverAttr === '1.15',
80
+ in_hover_attr: rest?.zoomIn.brightnessHoverAttr === '1.15',
81
+ out_aria_zoom_out: /zoom out/i.test(rest?.zoomOut.ariaLabel || ''),
82
+ in_aria_zoom_in: /zoom in/i.test(rest?.zoomIn.ariaLabel || ''),
83
+ out_transition_filter: /filter/.test(rest?.zoomOut.transitionProperty || ''),
84
+ in_transition_filter: /filter/.test(rest?.zoomIn.transitionProperty || ''),
85
+ source_out_filter: sourceOutFilter,
86
+ source_in_filter: sourceInFilter,
87
+ source_out_transition: sourceOutTransition,
88
+ source_in_transition: sourceInTransition,
89
+ };
90
+ const ok = Object.values(results).every(Boolean);
91
+ console.log(`${ok ? '✅' : '❌'} R596 zoom +/- brightness (35+36th anchors, zoom trio closure):`,
92
+ JSON.stringify(results, null, 2),
93
+ `\n rest: ${JSON.stringify(rest)}`);
94
+ process.exit(ok ? 0 : 1);