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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (339) 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/{0bh3bd_k4cou9.js → 01he.jfmupx6b.js} +1 -1
  143. package/.next/static/chunks/047xfmz-_yklx.js +1 -0
  144. package/.next/static/chunks/08.zg.lu3fwqw.js +4 -0
  145. package/.next/static/chunks/0_c5~297u5j0p.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 +4959 -176
  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-row-digit-ls-test.mjs +135 -0
  177. package/scripts/topo-chip-row-member-alias-lit-test.mjs +154 -0
  178. package/scripts/topo-chip-row-tier-glow-brightness-test.mjs +99 -0
  179. package/scripts/topo-chip-row-unit-hover-tracking-test.mjs +124 -0
  180. package/scripts/topo-chrome-control-halo-layers-test.mjs +22 -0
  181. package/scripts/topo-click-ripple-glow-test.mjs +86 -0
  182. package/scripts/topo-click-ripple-halo-layers-test.mjs +79 -0
  183. package/scripts/topo-click-ripple-sw-test.mjs +110 -0
  184. package/scripts/topo-cluster-count-attr-test.mjs +80 -0
  185. package/scripts/topo-crescent-breath-test.mjs +104 -0
  186. package/scripts/topo-crescent-recede-test.mjs +111 -0
  187. package/scripts/topo-dense-alias-halo-layers-test.mjs +80 -0
  188. package/scripts/topo-edge-badge-circle-brightness-test.mjs +82 -0
  189. package/scripts/topo-edge-badge-circle-hot-pulse-test.mjs +100 -0
  190. package/scripts/topo-edge-badge-digit-halo-layers-test.mjs +107 -0
  191. package/scripts/topo-edge-badge-endpoint-gate-test.mjs +94 -0
  192. package/scripts/topo-edge-badge-halo-layers-test.mjs +85 -0
  193. package/scripts/topo-edge-badge-hot-pulse-test.mjs +92 -0
  194. package/scripts/topo-edge-badge-hover-glow-test.mjs +90 -0
  195. package/scripts/topo-edge-badge-text-brightness-test.mjs +83 -0
  196. package/scripts/topo-edge-chat-gate-test.mjs +71 -0
  197. package/scripts/topo-edge-flow-rail-halo-layers-test.mjs +89 -0
  198. package/scripts/topo-edge-particle-brightness-test.mjs +82 -0
  199. package/scripts/topo-edge-particle-halo-layers-test.mjs +91 -0
  200. package/scripts/topo-edge-pill-glow-test.mjs +67 -0
  201. package/scripts/topo-edge-visible-brightness-test.mjs +84 -0
  202. package/scripts/topo-edge-visible-halo-layers-test.mjs +87 -0
  203. package/scripts/topo-endpoint-ring-brightness-test.mjs +83 -0
  204. package/scripts/topo-endpoint-ring-flow-halo-test.mjs +107 -0
  205. package/scripts/topo-endpoint-ring-halo-layers-test.mjs +100 -0
  206. package/scripts/topo-filter-pill-glow-test.mjs +90 -0
  207. package/scripts/topo-filter-pill-halo-layers-test.mjs +27 -0
  208. package/scripts/topo-flow-arrow-brightness-test.mjs +82 -0
  209. package/scripts/topo-flow-rail-brightness-test.mjs +80 -0
  210. package/scripts/topo-fullscreen-attr-test.mjs +73 -0
  211. package/scripts/topo-fullscreen-brightness-test.mjs +84 -0
  212. package/scripts/topo-fullscreen-icon-rotate-test.mjs +93 -0
  213. package/scripts/topo-grid-content-bottom-attr-test.mjs +72 -0
  214. package/scripts/topo-group-box-brightness-test.mjs +84 -0
  215. package/scripts/topo-group-box-halo-layers-test.mjs +91 -0
  216. package/scripts/topo-group-chat-gate-test.mjs +77 -0
  217. package/scripts/topo-group-label-brightness-test.mjs +84 -0
  218. package/scripts/topo-group-label-halo-layers-test.mjs +78 -0
  219. package/scripts/topo-group-label-hover-glow-test.mjs +86 -0
  220. package/scripts/topo-group-label-member-alias-hover-test.mjs +125 -0
  221. package/scripts/topo-group-pill-glow-test.mjs +76 -0
  222. package/scripts/topo-group-tint-brightness-test.mjs +82 -0
  223. package/scripts/topo-halo-chat-gate-test.mjs +72 -0
  224. package/scripts/topo-hub-core-brightness-test.mjs +82 -0
  225. package/scripts/topo-hub-core-halo-layers-test.mjs +81 -0
  226. package/scripts/topo-hub-digit-brightness-test.mjs +79 -0
  227. package/scripts/topo-hub-digit-halo-layers-test.mjs +76 -0
  228. package/scripts/topo-hub-digit-ls-test.mjs +119 -0
  229. package/scripts/topo-hub-halo-brightness-test.mjs +80 -0
  230. package/scripts/topo-hub-halo-glow-test.mjs +96 -0
  231. package/scripts/topo-hub-halo-halo-layers-test.mjs +76 -0
  232. package/scripts/topo-hub-highlight-amplify-test.mjs +139 -0
  233. package/scripts/topo-hub-highlight-brightness-test.mjs +84 -0
  234. package/scripts/topo-hub-highlight-fill-transition-test.mjs +84 -0
  235. package/scripts/topo-hub-highlight-glow-test.mjs +99 -0
  236. package/scripts/topo-hub-highlight-halo-layers-test.mjs +78 -0
  237. package/scripts/topo-hub-highlight-r-test.mjs +112 -0
  238. package/scripts/topo-hub-highlight-recede-test.mjs +144 -0
  239. package/scripts/topo-hub-highlight-theme-fill-test.mjs +83 -0
  240. package/scripts/topo-hub-hover-ring-brightness-test.mjs +79 -0
  241. package/scripts/topo-hub-hover-ring-glow-test.mjs +97 -0
  242. package/scripts/topo-hub-hover-ring-halo-layers-test.mjs +71 -0
  243. package/scripts/topo-hub-idle-breath-test.mjs +7 -2
  244. package/scripts/topo-hub-recede-test.mjs +124 -0
  245. package/scripts/topo-hub-spoke-brightness-test.mjs +77 -0
  246. package/scripts/topo-hub-spoke-glow-test.mjs +112 -0
  247. package/scripts/topo-hub-spoke-halo-layers-test.mjs +97 -0
  248. package/scripts/topo-hub-spoke-self-filter-test.mjs +119 -0
  249. package/scripts/topo-kicker-halo-layers-test.mjs +82 -0
  250. package/scripts/topo-label-card-brightness-test.mjs +81 -0
  251. package/scripts/topo-layout-hover-fw-test.mjs +98 -0
  252. package/scripts/topo-layout-toggle-brightness-test.mjs +94 -0
  253. package/scripts/topo-layout-toggle-halo-layers-test.mjs +95 -0
  254. package/scripts/topo-legend-count-brightness-test.mjs +80 -0
  255. package/scripts/topo-legend-count-halo-layers-test.mjs +79 -0
  256. package/scripts/topo-legend-count-letter-spacing-test.mjs +108 -0
  257. package/scripts/topo-legend-label-fw-test.mjs +107 -0
  258. package/scripts/topo-legend-pin-ring-brightness-test.mjs +82 -0
  259. package/scripts/topo-legend-pin-ring-halo-layers-test.mjs +71 -0
  260. package/scripts/topo-legend-row-count-brightness-test.mjs +85 -0
  261. package/scripts/topo-legend-row-label-glow-test.mjs +102 -0
  262. package/scripts/topo-legend-swatch-glow-test.mjs +109 -0
  263. package/scripts/topo-legend-swatch-member-alias-match-test.mjs +139 -0
  264. package/scripts/topo-legend-tint-brightness-test.mjs +83 -0
  265. package/scripts/topo-legend-trio-halo-layers-test.mjs +22 -0
  266. package/scripts/topo-minimap-dot-chat-gate-test.mjs +81 -0
  267. package/scripts/topo-minimap-hover-glow-test.mjs +109 -0
  268. package/scripts/topo-minimap-viewport-brightness-test.mjs +84 -0
  269. package/scripts/topo-minimap-viewport-halo-layers-test.mjs +24 -0
  270. package/scripts/topo-more-footer-brightness-test.mjs +94 -0
  271. package/scripts/topo-node-alias-brightness-test.mjs +84 -0
  272. package/scripts/topo-node-avatar-halo-layers-test.mjs +25 -0
  273. package/scripts/topo-node-hover-ring-halo-layers-test.mjs +70 -0
  274. package/scripts/topo-node-sub-text-brightness-test.mjs +88 -0
  275. package/scripts/topo-nodesize-brightness-test.mjs +82 -0
  276. package/scripts/topo-nodesize-halo-layers-test.mjs +89 -0
  277. package/scripts/topo-nodesize-hover-fw-test.mjs +99 -0
  278. package/scripts/topo-orphan-label-opacity-test.mjs +98 -0
  279. package/scripts/topo-panel-count-halo-layers-test.mjs +91 -0
  280. package/scripts/topo-panel-count-hover-ls-test.mjs +87 -0
  281. package/scripts/topo-panel-row-brightness-test.mjs +116 -0
  282. package/scripts/topo-panel-title-brightness-test.mjs +98 -0
  283. package/scripts/topo-panel-title-glow-test.mjs +111 -0
  284. package/scripts/topo-panel-titles-halo-layers-test.mjs +23 -0
  285. package/scripts/topo-pill-x-rotate-test.mjs +96 -0
  286. package/scripts/topo-pip-brightness-test.mjs +85 -0
  287. package/scripts/topo-pressure-bar-halo-layers-test.mjs +19 -0
  288. package/scripts/topo-pressure-seg-glow-test.mjs +92 -0
  289. package/scripts/topo-pressure-seg-member-alias-match-test.mjs +133 -0
  290. package/scripts/topo-pressure-seg-motion-test.mjs +101 -0
  291. package/scripts/topo-recent-count-brightness-test.mjs +84 -0
  292. package/scripts/topo-recent-more-fw-test.mjs +126 -0
  293. package/scripts/topo-recent-more-halo-layers-test.mjs +90 -0
  294. package/scripts/topo-recent-panel-hot-pulse-test.mjs +105 -0
  295. package/scripts/topo-recent-pip-halo-layers-test.mjs +82 -0
  296. package/scripts/topo-recent-row-chat-gate-test.mjs +75 -0
  297. package/scripts/topo-recent-row-content-lift-test.mjs +140 -0
  298. package/scripts/topo-recent-row-fw-test.mjs +115 -0
  299. package/scripts/topo-recent-row-text-glow-test.mjs +86 -0
  300. package/scripts/topo-recent-row-text-halo-layers-test.mjs +67 -0
  301. package/scripts/topo-recent-tint-brightness-test.mjs +80 -0
  302. package/scripts/topo-recent-ts-brightness-test.mjs +86 -0
  303. package/scripts/topo-reduced-motion-attr-test.mjs +69 -0
  304. package/scripts/topo-reset-brightness-test.mjs +83 -0
  305. package/scripts/topo-reset-icon-hover-scale-test.mjs +102 -0
  306. package/scripts/topo-runtime-badge-brightness-test.mjs +78 -0
  307. package/scripts/topo-runtime-badge-glow-test.mjs +108 -0
  308. package/scripts/topo-runtime-badge-halo-layers-test.mjs +87 -0
  309. package/scripts/topo-runtime-badge-rotate-test.mjs +85 -0
  310. package/scripts/topo-section-title-halo-layers-test.mjs +88 -0
  311. package/scripts/topo-spoke-chat-gate-test.mjs +72 -0
  312. package/scripts/topo-starfield-hue-test.mjs +109 -0
  313. package/scripts/topo-status-pin-pill-halo-layers-test.mjs +17 -0
  314. package/scripts/topo-status-ring-brightness-test.mjs +84 -0
  315. package/scripts/topo-status-ring-chat-gate-test.mjs +72 -0
  316. package/scripts/topo-status-ring-halo-layers-test.mjs +105 -0
  317. package/scripts/topo-status-ring-status-halo-test.mjs +110 -0
  318. package/scripts/topo-sub-text-chat-brightness-test.mjs +81 -0
  319. package/scripts/topo-titleblock-h2-hover-fw-test.mjs +109 -0
  320. package/scripts/topo-titleblock-h2-hover-tracking-test.mjs +128 -0
  321. package/scripts/topo-titleblock-kicker-hover-test.mjs +134 -0
  322. package/scripts/topo-vendor-chip-glow-test.mjs +97 -0
  323. package/scripts/topo-vendor-chip-halo-layers-test.mjs +18 -0
  324. package/scripts/topo-vendor-letter-halo-layers-test.mjs +93 -0
  325. package/scripts/topo-vendor-pill-glow-test.mjs +98 -0
  326. package/scripts/topo-watermark-breath-test.mjs +100 -0
  327. package/scripts/topo-watermark-recede-test.mjs +114 -0
  328. package/scripts/topo-zoom-buttons-brightness-test.mjs +94 -0
  329. package/scripts/topo-zoom-in-out-halo-layers-test.mjs +97 -0
  330. package/scripts/topo-zoom-level-brightness-test.mjs +83 -0
  331. package/scripts/topo-zoom-level-color-test.mjs +105 -0
  332. package/scripts/topo-zoom-level-halo-layers-test.mjs +78 -0
  333. package/.next/static/chunks/0.s1q59.w46yn.js +0 -4
  334. package/.next/static/chunks/06f643qjk~ayp.js +0 -1
  335. package/.next/static/chunks/0m-5_1vuw.lxb.js +0 -1
  336. package/.next/static/chunks/0m.1mvl~t.avc.css +0 -2
  337. /package/.next/static/{D60rGoeOKUed7uGrc-7wS → N193Pg2TkoL0c6mKNfKm_}/_buildManifest.js +0 -0
  338. /package/.next/static/{D60rGoeOKUed7uGrc-7wS → N193Pg2TkoL0c6mKNfKm_}/_clientMiddlewareManifest.js +0 -0
  339. /package/.next/static/{D60rGoeOKUed7uGrc-7wS → N193Pg2TkoL0c6mKNfKm_}/_ssgManifest.js +0 -0
@@ -0,0 +1,109 @@
1
+ /* Round 540 verification: minimap viewport gains drop-shadow glow on
2
+ * hover, with hover precedence over R481 zoom-state glow. 2-tier alpha
3
+ * ladder (hover 99 / zoom 80).
4
+ *
5
+ * Test strategy: minimap is only visible when canvas is zoomed or
6
+ * panned (default view returns null). Trigger zoom via the chrome
7
+ * zoom-in button, verify zoom-state glow renders, then hover the
8
+ * minimap container and verify hover precedence + alpha distinction
9
+ * via the data-attr. Source regex covers the ternary wiring.
10
+ *
11
+ * Test phases:
12
+ * 1. trigger zoom > 1.5 via chrome zoom-in clicks
13
+ * 2. minimap visible, viewport glow attr = 'zoom'
14
+ * 3. hover minimap container: viewport glow = 'hover'
15
+ * 4. source-side regex confirms 3-value attr + filter ternary
16
+ */
17
+ import { chromium } from 'playwright';
18
+ import { readFileSync } from 'node:fs';
19
+
20
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
21
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
22
+
23
+ const browser = await chromium.launch({ headless: true });
24
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
25
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
26
+ await ctx.addInitScript(() => {
27
+ try {
28
+ localStorage.setItem('anet-theme', 'cyber');
29
+ localStorage.setItem('anet-topo-layout', '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: [
43
+ mk('a·1'), mk('a·2'), mk('a·3'),
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-topo-chrome-zoom-in]', { timeout: 15000 });
51
+ await page.waitForTimeout(500);
52
+
53
+ // Phase 1: click zoom-in until zoom > 1.5 (1.2^3 = 1.728)
54
+ for (let i = 0; i < 3; i++) {
55
+ await page.click('[data-topo-chrome-zoom-in]');
56
+ await page.waitForTimeout(150);
57
+ }
58
+ await page.waitForTimeout(500);
59
+
60
+ // Minimap should now be visible
61
+ await page.waitForSelector('[data-topo-minimap-viewport]', { timeout: 5000 });
62
+
63
+ // Phase 2: zoom-state read
64
+ const zoomState = await page.evaluate(() => {
65
+ const el = document.querySelector('[data-topo-minimap-viewport]');
66
+ if (!el) return null;
67
+ const cs = getComputedStyle(el);
68
+ return {
69
+ glow: el.getAttribute('data-topo-minimap-viewport-glow'),
70
+ filter: cs.filter,
71
+ };
72
+ });
73
+
74
+ // Phase 3: hover minimap container
75
+ await page.hover('[data-topo-minimap]');
76
+ await page.waitForTimeout(400);
77
+ const hoverState = await page.evaluate(() => {
78
+ const el = document.querySelector('[data-topo-minimap-viewport]');
79
+ if (!el) return null;
80
+ const cs = getComputedStyle(el);
81
+ return {
82
+ glow: el.getAttribute('data-topo-minimap-viewport-glow'),
83
+ filter: cs.filter,
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 sourceFilterTernary =
92
+ /filter: hoveredMinimap\s+\? `drop-shadow\(0 0 2px \$\{pal\.legendAccent\}99\)`\s+: view\.zoom > 1\.5\s+\? `drop-shadow\(0 0 2px \$\{pal\.legendAccent\}80\)`\s+: undefined,/.test(src);
93
+ const sourceAttrTernary =
94
+ /data-topo-minimap-viewport-glow=\{hoveredMinimap \? 'hover' : view\.zoom > 1\.5 \? 'zoom' : 'false'\}/.test(src);
95
+
96
+ const results = {
97
+ zoom_glow_zoom: zoomState?.glow === 'zoom',
98
+ zoom_filter_drop_shadow: /drop-shadow/.test(zoomState?.filter || ''),
99
+ hover_glow_hover: hoverState?.glow === 'hover',
100
+ hover_filter_drop_shadow: /drop-shadow/.test(hoverState?.filter || ''),
101
+ source_filter_ternary: sourceFilterTernary,
102
+ source_attr_ternary: sourceAttrTernary,
103
+ };
104
+ const ok = Object.values(results).every(Boolean);
105
+ console.log(`${ok ? '✅' : '❌'} R540 minimap viewport hover-glow:`,
106
+ JSON.stringify(results, null, 2),
107
+ '\n zoom:', JSON.stringify(zoomState),
108
+ '\n hover:', JSON.stringify(hoverState));
109
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,84 @@
1
+ /* Round 627 — minimap viewport rect stacks brightness(1.15) onto
2
+ * existing hover + zoom>1.5 drop-shadow filters. Banked R582/R583
3
+ * stacked-filter pattern at minimap chrome scope.
4
+ *
5
+ * Test phases:
6
+ * 1. mock nodes → minimap viewport renders
7
+ * 2. rest (no hover, zoom=1): filter='none', brightness-attr='1',
8
+ * glow='false'
9
+ * 3. computed transition-property contains 'filter'
10
+ * 4. source: stacked filter strings include both drop-shadow
11
+ * AND brightness in both gates
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
+ // Minimap may only render when canvas is zoomed/panned. Verify source
45
+ // patterns are correct first; runtime state is best-effort.
46
+ await page.waitForTimeout(1000);
47
+
48
+ const rest = await page.evaluate(() => {
49
+ const el = document.querySelector('[data-topo-minimap-viewport]');
50
+ if (!el) return null;
51
+ const cs = getComputedStyle(el);
52
+ return {
53
+ filter: cs.filter,
54
+ transitionProperty: cs.transitionProperty,
55
+ brightnessAttr: el.getAttribute('data-topo-minimap-viewport-brightness'),
56
+ glowAttr: el.getAttribute('data-topo-minimap-viewport-glow'),
57
+ hoverAttr: el.getAttribute('data-topo-minimap-viewport-hover'),
58
+ };
59
+ });
60
+
61
+ await browser.close();
62
+
63
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
64
+ const sourceHoverStack = /`drop-shadow\(0 0 2px \$\{pal\.legendAccent\}99\) brightness\(1\.15\)`/.test(src);
65
+ const sourceZoomStack = /`drop-shadow\(0 0 2px \$\{pal\.legendAccent\}80\) brightness\(1\.15\)`/.test(src);
66
+ const sourceAttr = /data-topo-minimap-viewport-brightness=\{\(hoveredMinimap \|\| view\.zoom > 1\.5\) \? '1\.15' : '1'\}/.test(src);
67
+
68
+ const results = {
69
+ // viewport_present: !!rest, // minimap is conditional; skip runtime check
70
+ source_hover_stack: sourceHoverStack,
71
+ source_zoom_stack: sourceZoomStack,
72
+ source_attr: sourceAttr,
73
+ // If viewport renders, also check rest state
74
+ ...(rest ? {
75
+ rest_filter_none_or_glow: rest.filter === 'none' || /drop-shadow/.test(rest.filter || ''),
76
+ rest_brightness_present: rest.brightnessAttr === '1' || rest.brightnessAttr === '1.15',
77
+ transition_has_filter: /filter/.test(rest.transitionProperty || ''),
78
+ } : {}),
79
+ };
80
+ const ok = Object.values(results).every(Boolean);
81
+ console.log(`${ok ? '✅' : '❌'} R627 minimap viewport stacked brightness (minimap chrome scope):`,
82
+ JSON.stringify(results, null, 2),
83
+ `\n rest: ${JSON.stringify(rest)}`);
84
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,24 @@
1
+ /* Round 655 — minimap viewport rect filter gains a SECOND outer
2
+ * drop-shadow on both hover + zoom>1.5 branches. 14th anchor in
3
+ * multi-layer halo family (1st minimap-tier anchor).
4
+ *
5
+ * Test phases:
6
+ * 1. minimap only renders when zoom != 1 OR pan != 0; this test
7
+ * only verifies source patterns (runtime check best-effort)
8
+ */
9
+ import { readFileSync } from 'node:fs';
10
+
11
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
12
+ const sourceHoverBranch = /`drop-shadow\(0 0 2px \$\{pal\.legendAccent\}99\) drop-shadow\(0 0 4px \$\{pal\.legendAccent\}4c\) brightness\(1\.15\)`/.test(src);
13
+ const sourceZoomBranch = /`drop-shadow\(0 0 2px \$\{pal\.legendAccent\}80\) drop-shadow\(0 0 4px \$\{pal\.legendAccent\}40\) brightness\(1\.15\)`/.test(src);
14
+ const sourceLayersAttr = /data-topo-minimap-viewport-halo-layers=\{\(hoveredMinimap \|\| view\.zoom > 1\.5\) \? '2' : '0'\}/.test(src);
15
+
16
+ const results = {
17
+ source_hover_branch: sourceHoverBranch,
18
+ source_zoom_branch: sourceZoomBranch,
19
+ source_layers_attr: sourceLayersAttr,
20
+ };
21
+ const ok = Object.values(results).every(Boolean);
22
+ console.log(`${ok ? '✅' : '❌'} R655 minimap viewport multi-layer halo (1st minimap-tier anchor):`,
23
+ JSON.stringify(results, null, 2));
24
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,94 @@
1
+ /* Round 592 verification: +N more flows footer <text> gains
2
+ * filter brightness(1.15) on hoveredRecentMore. 31st anchor
3
+ * in per-element brightness family. Closes 6-axis hover
4
+ * signature on the panel's primary nav affordance.
5
+ *
6
+ * Test phases:
7
+ * 1. mock 5 flow messages → footer renders ("+ 2 more flows")
8
+ * 2. rest (no hover): 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
+
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: new Date(Date.now() - 60 * 1000).toISOString(),
35
+ updated_at: new Date(Date.now() - 60 * 1000).toISOString(),
36
+ last_seen_at: new Date(Date.now() - 60 * 1000).toISOString(),
37
+ });
38
+ await route.fulfill({ response: r, json: { ...b, sessions: [
39
+ mk('a·1'), mk('a·2'), mk('a·3'), mk('a·4'),
40
+ mk('b·1'), mk('b·2'),
41
+ ] } });
42
+ });
43
+ // 5 flowLinks → footer "+2 more flows"
44
+ const now = Date.now();
45
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [
46
+ { from_alias: 'a·1', to_alias: 'a·2', content: 'm1', created_at: new Date(now - 10*1000).toISOString() },
47
+ { from_alias: 'a·2', to_alias: 'a·3', content: 'm2', created_at: new Date(now - 20*1000).toISOString() },
48
+ { from_alias: 'a·3', to_alias: 'a·4', content: 'm3', created_at: new Date(now - 30*1000).toISOString() },
49
+ { from_alias: 'b·1', to_alias: 'b·2', content: 'm4', created_at: new Date(now - 40*1000).toISOString() },
50
+ { from_alias: 'a·1', to_alias: 'b·1', content: 'm5', created_at: new Date(now - 50*1000).toISOString() },
51
+ ] } }));
52
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
53
+ const page = await ctx.newPage();
54
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
55
+ await page.waitForSelector('[data-recent-panel-more-brightness]', { timeout: 15000, state: 'attached' });
56
+ await page.waitForTimeout(500);
57
+
58
+ const rest = await page.evaluate(() => {
59
+ const el = document.querySelector('[data-recent-panel-more-brightness]');
60
+ if (!el) return null;
61
+ const cs = getComputedStyle(el);
62
+ return {
63
+ filter: cs.filter,
64
+ transitionProperty: cs.transitionProperty,
65
+ brightnessAttr: el.getAttribute('data-recent-panel-more-brightness'),
66
+ hoveredAttr: el.getAttribute('data-recent-panel-more-hovered'),
67
+ moreAttr: el.getAttribute('data-recent-panel-more'),
68
+ textContent: el.textContent,
69
+ };
70
+ });
71
+
72
+ await browser.close();
73
+
74
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
75
+ const sourceFilter = /filter: hoveredRecentMore \? 'brightness\(1\.15\)' : undefined/.test(src);
76
+ const sourceAttr = /data-recent-panel-more-brightness=\{hoveredRecentMore \? '1\.15' : '1'\}/.test(src);
77
+ const sourceTransition = /transition: 'opacity 200ms ease-out, fill 200ms ease-out, letter-spacing 200ms ease-out, font-weight 200ms ease-out, filter 200ms ease-out'/.test(src);
78
+
79
+ const results = {
80
+ footer_present: !!rest,
81
+ rest_filter_none: rest?.filter === 'none',
82
+ rest_brightness_1: rest?.brightnessAttr === '1',
83
+ rest_hovered_false: rest?.hoveredAttr === 'false',
84
+ more_count_2: rest?.moreAttr === '2',
85
+ transition_has_filter: /filter/.test(rest?.transitionProperty || ''),
86
+ source_filter: sourceFilter,
87
+ source_attr: sourceAttr,
88
+ source_transition: sourceTransition,
89
+ };
90
+ const ok = Object.values(results).every(Boolean);
91
+ console.log(`${ok ? '✅' : '❌'} R592 more-footer brightness (31st anchor, 6-axis hover signature):`,
92
+ JSON.stringify(results, null, 2),
93
+ `\n rest: ${JSON.stringify(rest)}`);
94
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,84 @@
1
+ /* Round 564 verification: per-node alias text gains stacked filter
2
+ * brightness(1.15) on top of R500 drop-shadow on hover. Mirrors
3
+ * R542 pressure-seg pattern.
4
+ *
5
+ * Test phases:
6
+ * 1. rest: filter = 'none', brightness-attr = '1'
7
+ * 2. hover: filter contains BOTH drop-shadow AND brightness(1.15);
8
+ * brightness-attr = '1.15'
9
+ * 3. source-side regex confirms stacked filter expression
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: 'working', 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-node-alias-text="a·1"]', { timeout: 15000 });
43
+ await page.waitForTimeout(500);
44
+
45
+ const aliasSel = '[data-node-alias-text="a·1"]';
46
+ const probe = () => page.evaluate((s) => {
47
+ const el = document.querySelector(s);
48
+ if (!el) return null;
49
+ const cs = getComputedStyle(el);
50
+ return {
51
+ filter: cs.filter,
52
+ glowAttr: el.getAttribute('data-node-alias-glow'),
53
+ brightnessAttr: el.getAttribute('data-node-alias-brightness'),
54
+ };
55
+ }, aliasSel);
56
+
57
+ const rest = await probe();
58
+ await page.hover('g[data-node="a·1"]');
59
+ await page.waitForTimeout(400);
60
+ const hover = await probe();
61
+
62
+ await browser.close();
63
+
64
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
65
+ const sourceFilter = /filter: !reducedMotion && hoveredAlias === session\.alias\s*\?\s*`drop-shadow\(0 0 2px \$\{status\.text\}80\) brightness\(1\.15\)`/.test(src);
66
+ const sourceAttr = /data-node-alias-brightness=\{!reducedMotion && hoveredAlias === session\.alias \? '1\.15' : '1'\}/.test(src);
67
+
68
+ const results = {
69
+ rest_filter_none: rest?.filter === 'none',
70
+ rest_glow_false: rest?.glowAttr === 'false',
71
+ rest_brightness_1: rest?.brightnessAttr === '1',
72
+ hover_filter_has_dropshadow: /drop-shadow\(/.test(hover?.filter || ''),
73
+ hover_filter_has_brightness: /brightness\(1\.15\)/.test(hover?.filter || ''),
74
+ hover_glow_true: hover?.glowAttr === 'true',
75
+ hover_brightness_1_15: hover?.brightnessAttr === '1.15',
76
+ source_filter: sourceFilter,
77
+ source_attr: sourceAttr,
78
+ };
79
+ const ok = Object.values(results).every(Boolean);
80
+ console.log(`${ok ? '✅' : '❌'} R564 per-node alias text brightness(1.15) stacked on R500 drop-shadow:`,
81
+ JSON.stringify(results, null, 2),
82
+ `\n rest: ${JSON.stringify(rest)}`,
83
+ `\n hover: ${JSON.stringify(hover)}`);
84
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,25 @@
1
+ /* Round 658 — node avatar drop-shadow (3 variants: image + monogram
2
+ * + prefix-group fallback) gains a SECOND outer drop-shadow at 8px
3
+ * + 0x4c alpha (half R605 inner 0x99). 17th anchor in multi-layer
4
+ * halo family — first per-node-avatar anchor (extends across all
5
+ * 3 avatar variants in one sweep).
6
+ *
7
+ * Test: source-only verification — all 3 R605-family filter sites
8
+ * now stack 2 drop-shadows.
9
+ */
10
+ import { readFileSync } from 'node:fs';
11
+
12
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
13
+ const pattern = /\? `drop-shadow\(0 0 4px \$\{pal\.legendAccent\}99\) drop-shadow\(0 0 8px \$\{pal\.legendAccent\}4c\) brightness\(1\.15\)`/g;
14
+ const matches = (src.match(pattern) || []).length;
15
+
16
+ const results = {
17
+ // 3 R605-family avatar branches (image, monogram, prefix-group fallback)
18
+ // all stack 2 drop-shadows now:
19
+ source_three_anchors: matches === 3,
20
+ };
21
+ const ok = Object.values(results).every(Boolean);
22
+ console.log(`${ok ? '✅' : '❌'} R658 node avatar multi-layer halo (3 variants in one sweep):`,
23
+ JSON.stringify(results, null, 2),
24
+ `\n matches: ${matches}`);
25
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,70 @@
1
+ /* Round 666 — per-node hover ring (r=radius+12) gains stroke-tinted
2
+ * drop-shadow halo on hoveredAlias match. 25th anchor in multi-layer
3
+ * halo family (1st per-node-hover-ring anchor).
4
+ *
5
+ * Test phases:
6
+ * 1. mock 2 idle nodes
7
+ * 2. rest: all hover rings halo-layers='0'
8
+ * 3. source: filter expression uses status.primary tint at 0x80 + 0x40
9
+ * with 2+4 stride
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-node-hover-ring]', { timeout: 15000, state: 'attached' });
43
+ await page.waitForTimeout(500);
44
+
45
+ const restRings = await page.evaluate(() => {
46
+ return Array.from(document.querySelectorAll('[data-node-hover-ring]')).map(el => ({
47
+ alias: el.getAttribute('data-node-hover-ring'),
48
+ layers: el.getAttribute('data-node-hover-ring-halo-layers'),
49
+ }));
50
+ });
51
+
52
+ await browser.close();
53
+
54
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
55
+ const sourceFilter = /`drop-shadow\(0 0 2px \$\{status\.primary\}80\) drop-shadow\(0 0 4px \$\{status\.primary\}40\)`/.test(src);
56
+ const sourceLayersAttr = /data-node-hover-ring-halo-layers=\{hoveredAlias === session\.alias \? '2' : '0'\}/.test(src);
57
+
58
+ const restAllZero = restRings.every(r => r.layers === '0');
59
+
60
+ const results = {
61
+ rings_present: restRings.length >= 2,
62
+ rest_all_zero: restAllZero,
63
+ source_filter: sourceFilter,
64
+ source_layers_attr: sourceLayersAttr,
65
+ };
66
+ const ok = Object.values(results).every(Boolean);
67
+ console.log(`${ok ? '✅' : '❌'} R666 per-node hover ring multi-layer halo (1st per-node-hover-ring anchor):`,
68
+ JSON.stringify(results, null, 2),
69
+ `\n rest: ${JSON.stringify(restRings)}`);
70
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,88 @@
1
+ /* Round 567 verification: node sub-text gains filter brightness(1.15)
2
+ * on hover. Joins R501/R558/R564 per-node hover-brightness family
3
+ * at 6th anchor.
4
+ *
5
+ * Test phases:
6
+ * 1. rest: filter='none', brightness-attr='1'
7
+ * 2. hover the node group → filter='brightness(1.15)';
8
+ * brightness-attr='1.15'
9
+ * 3. transition-property contains 'filter'
10
+ * 4. source-side regex confirms wiring
11
+ */
12
+ import { chromium } from 'playwright';
13
+ import { readFileSync } from 'node:fs';
14
+
15
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
16
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
17
+
18
+ const browser = await chromium.launch({ headless: true });
19
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
20
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
21
+ await ctx.addInitScript(() => {
22
+ try {
23
+ localStorage.setItem('anet-theme', 'cyber');
24
+ localStorage.setItem('anet-topo-layout', 'ring');
25
+ sessionStorage.setItem('anet_v3_auth', '1');
26
+ } catch {}
27
+ });
28
+ await ctx.route('**/api/hub/status*', async (route) => {
29
+ const r = await route.fetch();
30
+ const b = await r.json();
31
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
32
+ const mk = (alias) => ({
33
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
34
+ network_id: nid, project_dir: null,
35
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
36
+ });
37
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
38
+ });
39
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
40
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
41
+ const page = await ctx.newPage();
42
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
43
+ await page.waitForSelector('[data-node-sub-text="a·1"]', { timeout: 15000 });
44
+ await page.waitForTimeout(500);
45
+
46
+ const subSel = '[data-node-sub-text="a·1"]';
47
+ const probe = () => page.evaluate((s) => {
48
+ const el = document.querySelector(s);
49
+ if (!el) return null;
50
+ const cs = getComputedStyle(el);
51
+ return {
52
+ filter: cs.filter,
53
+ transitionProperty: cs.transitionProperty,
54
+ brightnessAttr: el.getAttribute('data-node-sub-text-brightness'),
55
+ hoveredAttr: el.getAttribute('data-node-sub-text-hovered'),
56
+ };
57
+ }, subSel);
58
+
59
+ const rest = await probe();
60
+ await page.hover('g[data-node="a·1"]');
61
+ await page.waitForTimeout(400);
62
+ const hover = await probe();
63
+
64
+ await browser.close();
65
+
66
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
67
+ const sourceFilter = /filter: !reducedMotion && hoveredAlias === session\.alias\s*\?\s*'brightness\(1\.15\)'\s*:\s*undefined/.test(src);
68
+ const sourceAttr = /data-node-sub-text-brightness=\{!reducedMotion && hoveredAlias === session\.alias \? '1\.15' : '1'\}/.test(src);
69
+ const sourceTransition = /transition: 'fill 300ms ease-out, letter-spacing 200ms ease-out, filter 200ms ease-out'/.test(src);
70
+
71
+ const results = {
72
+ rest_filter_none: rest?.filter === 'none',
73
+ rest_brightness_1: rest?.brightnessAttr === '1',
74
+ rest_hovered_false: rest?.hoveredAttr === 'false',
75
+ hover_filter_1_15: /brightness\(1\.15\)/.test(hover?.filter || ''),
76
+ hover_brightness_1_15: hover?.brightnessAttr === '1.15',
77
+ hover_hovered_true: hover?.hoveredAttr === 'true',
78
+ transition_has_filter: /filter/.test(rest?.transitionProperty || ''),
79
+ source_filter: sourceFilter,
80
+ source_attr: sourceAttr,
81
+ source_transition: sourceTransition,
82
+ };
83
+ const ok = Object.values(results).every(Boolean);
84
+ console.log(`${ok ? '✅' : '❌'} R567 node sub-text brightness(1.15) on hover:`,
85
+ JSON.stringify(results, null, 2),
86
+ `\n rest: ${JSON.stringify(rest)}`,
87
+ `\n hover: ${JSON.stringify(hover)}`);
88
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,82 @@
1
+ /* Round 598 verification: nodeSize S/M/L segmented buttons gain
2
+ * hover:brightness-[1.15]. 39+40+41st anchors (8+9+10th HTML).
3
+ * 3-anchor sibling edit closing the FINAL segmented chrome
4
+ * control at brightness parity (R596 zoom + R597 layout +
5
+ * R598 nodeSize = full segmented coverage 8/8 buttons).
6
+ *
7
+ * Test phases:
8
+ * 1. mock nodes → chrome strip renders S + M + L buttons
9
+ * 2. rest: filter='none', brightness-hover-attr='1.15' on all 3
10
+ * 3. computed transition-property contains 'filter' on all 3
11
+ * 4. source: hover:brightness-[1.15] + arbitrary
12
+ * [transition-property:...,filter] in className
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-topo-chrome-nodesize="S"]', { timeout: 15000, state: 'attached' });
46
+ await page.waitForTimeout(500);
47
+
48
+ const rest = await page.evaluate(() => {
49
+ const els = ['S','M','L'].map(k => document.querySelector(`[data-topo-chrome-nodesize="${k}"]`));
50
+ if (els.some(e => !e)) return null;
51
+ return els.map(el => ({
52
+ key: el.getAttribute('data-topo-chrome-nodesize'),
53
+ filter: getComputedStyle(el).filter,
54
+ transitionProperty: getComputedStyle(el).transitionProperty,
55
+ brightnessHoverAttr: el.getAttribute('data-topo-chrome-nodesize-brightness-hover'),
56
+ textContent: el.textContent,
57
+ }));
58
+ });
59
+
60
+ await browser.close();
61
+
62
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
63
+ const sourceFilter = /hover:brightness-\[1\.15\][^"]*\}\$\{idx > 0 \? 'border-l'/.test(src) ||
64
+ /hover:brightness-\[1\.15\]/.test(src.split('data-topo-chrome-nodesize=\\{lbl\\}')[1] || src);
65
+ const sourceTransition = /\[transition-property:color,background-color,transform,font-weight,filter\]/.test(src);
66
+ const sourceAttr = /data-topo-chrome-nodesize-brightness-hover="1\.15"/.test(src);
67
+
68
+ const results = {
69
+ all_three_present: !!rest && rest.length === 3,
70
+ rest_filter_all_none: !!rest && rest.every(r => r.filter === 'none'),
71
+ hover_attr_all_115: !!rest && rest.every(r => r.brightnessHoverAttr === '1.15'),
72
+ labels_S_M_L: !!rest && rest.map(r => r.textContent).join('') === 'SML',
73
+ transition_all_filter: !!rest && rest.every(r => /filter/.test(r.transitionProperty || '')),
74
+ source_filter_class: /hover:brightness-\[1\.15\]/.test(src),
75
+ source_transition: sourceTransition,
76
+ source_attr: sourceAttr,
77
+ };
78
+ const ok = Object.values(results).every(Boolean);
79
+ console.log(`${ok ? '✅' : '❌'} R598 nodeSize S/M/L brightness (39+40+41st anchors, all-segmented-closed):`,
80
+ JSON.stringify(results, null, 2),
81
+ `\n rest: ${JSON.stringify(rest)}`);
82
+ process.exit(ok ? 0 : 1);