@sleep2agi/agent-network-dashboard 0.5.3-preview.16 → 0.5.3-preview.161

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 (304) 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/0-8bxlg9uqt.w.css +2 -0
  143. package/.next/static/chunks/0ajitf72sy568.js +1 -0
  144. package/.next/static/chunks/0kl6fleg9dgog.js +4 -0
  145. package/.next/static/chunks/{07xzde-9s36-x.js → 0r2nogj~b5j7z.js} +1 -1
  146. package/.next/static/chunks/12s07yvcxiqqq.js +1 -0
  147. package/.next/trace +2 -2
  148. package/.next/trace-build +1 -1
  149. package/app/components/TopoGraph.tsx +4401 -174
  150. package/app/globals.css +58 -7
  151. package/package.json +4 -4
  152. package/scripts/topo-active-chrome-hover-text-test.mjs +107 -0
  153. package/scripts/topo-alias-chat-brightness-test.mjs +79 -0
  154. package/scripts/topo-alias-text-halo-layers-test.mjs +98 -0
  155. package/scripts/topo-avatar-chat-gate-test.mjs +77 -0
  156. package/scripts/topo-avatar-drop-shadow-test.mjs +86 -0
  157. package/scripts/topo-avatar-fallback-hover-test.mjs +104 -0
  158. package/scripts/topo-avatar-fallback-rotate-test.mjs +92 -0
  159. package/scripts/topo-avatar-rotate-test.mjs +85 -0
  160. package/scripts/topo-avatar-scale-test.mjs +89 -0
  161. package/scripts/topo-badge-chat-gate-test.mjs +74 -0
  162. package/scripts/topo-brand-drop-shadow-test.mjs +71 -0
  163. package/scripts/topo-brand-logo-breath-test.mjs +102 -0
  164. package/scripts/topo-brand-logo-hover-brightness-test.mjs +105 -0
  165. package/scripts/topo-brand-logo-hover-rotate-test.mjs +93 -0
  166. package/scripts/topo-brand-logo-hover-test.mjs +85 -0
  167. package/scripts/topo-card-chat-brightness-test.mjs +86 -0
  168. package/scripts/topo-chat-ring-breath-curve-test.mjs +114 -0
  169. package/scripts/topo-chat-ring-brightness-test.mjs +80 -0
  170. package/scripts/topo-chat-ring-halo-layers-test.mjs +100 -0
  171. package/scripts/topo-chat-ring-r-breath-test.mjs +121 -0
  172. package/scripts/topo-chat-ring-status-halo-test.mjs +106 -0
  173. package/scripts/topo-chat-ring-sw-breath-test.mjs +123 -0
  174. package/scripts/topo-chip-row-digit-ls-test.mjs +135 -0
  175. package/scripts/topo-chip-row-member-alias-lit-test.mjs +154 -0
  176. package/scripts/topo-chip-row-tier-glow-brightness-test.mjs +99 -0
  177. package/scripts/topo-chip-row-unit-hover-tracking-test.mjs +124 -0
  178. package/scripts/topo-click-ripple-glow-test.mjs +86 -0
  179. package/scripts/topo-click-ripple-sw-test.mjs +110 -0
  180. package/scripts/topo-cluster-count-attr-test.mjs +80 -0
  181. package/scripts/topo-crescent-breath-test.mjs +104 -0
  182. package/scripts/topo-crescent-recede-test.mjs +111 -0
  183. package/scripts/topo-edge-badge-circle-brightness-test.mjs +82 -0
  184. package/scripts/topo-edge-badge-circle-hot-pulse-test.mjs +100 -0
  185. package/scripts/topo-edge-badge-endpoint-gate-test.mjs +94 -0
  186. package/scripts/topo-edge-badge-halo-layers-test.mjs +85 -0
  187. package/scripts/topo-edge-badge-hot-pulse-test.mjs +92 -0
  188. package/scripts/topo-edge-badge-hover-glow-test.mjs +90 -0
  189. package/scripts/topo-edge-badge-text-brightness-test.mjs +83 -0
  190. package/scripts/topo-edge-chat-gate-test.mjs +71 -0
  191. package/scripts/topo-edge-particle-brightness-test.mjs +82 -0
  192. package/scripts/topo-edge-pill-glow-test.mjs +67 -0
  193. package/scripts/topo-edge-visible-brightness-test.mjs +84 -0
  194. package/scripts/topo-endpoint-ring-brightness-test.mjs +83 -0
  195. package/scripts/topo-endpoint-ring-flow-halo-test.mjs +107 -0
  196. package/scripts/topo-endpoint-ring-halo-layers-test.mjs +100 -0
  197. package/scripts/topo-filter-pill-glow-test.mjs +90 -0
  198. package/scripts/topo-flow-arrow-brightness-test.mjs +82 -0
  199. package/scripts/topo-flow-rail-brightness-test.mjs +80 -0
  200. package/scripts/topo-freshness-chip-fade-test.mjs +105 -0
  201. package/scripts/topo-fullscreen-attr-test.mjs +73 -0
  202. package/scripts/topo-fullscreen-brightness-test.mjs +84 -0
  203. package/scripts/topo-fullscreen-icon-rotate-test.mjs +93 -0
  204. package/scripts/topo-grid-content-bottom-attr-test.mjs +72 -0
  205. package/scripts/topo-group-box-brightness-test.mjs +84 -0
  206. package/scripts/topo-group-chat-gate-test.mjs +77 -0
  207. package/scripts/topo-group-label-brightness-test.mjs +84 -0
  208. package/scripts/topo-group-label-hover-glow-test.mjs +86 -0
  209. package/scripts/topo-group-label-member-alias-hover-test.mjs +125 -0
  210. package/scripts/topo-group-pill-glow-test.mjs +76 -0
  211. package/scripts/topo-group-tint-brightness-test.mjs +82 -0
  212. package/scripts/topo-halo-chat-gate-test.mjs +72 -0
  213. package/scripts/topo-hub-core-brightness-test.mjs +82 -0
  214. package/scripts/topo-hub-digit-brightness-test.mjs +79 -0
  215. package/scripts/topo-hub-digit-ls-test.mjs +119 -0
  216. package/scripts/topo-hub-halo-brightness-test.mjs +80 -0
  217. package/scripts/topo-hub-halo-glow-test.mjs +96 -0
  218. package/scripts/topo-hub-highlight-amplify-test.mjs +139 -0
  219. package/scripts/topo-hub-highlight-brightness-test.mjs +84 -0
  220. package/scripts/topo-hub-highlight-fill-transition-test.mjs +84 -0
  221. package/scripts/topo-hub-highlight-glow-test.mjs +99 -0
  222. package/scripts/topo-hub-highlight-r-test.mjs +112 -0
  223. package/scripts/topo-hub-highlight-recede-test.mjs +144 -0
  224. package/scripts/topo-hub-highlight-theme-fill-test.mjs +83 -0
  225. package/scripts/topo-hub-hover-ring-brightness-test.mjs +79 -0
  226. package/scripts/topo-hub-hover-ring-glow-test.mjs +97 -0
  227. package/scripts/topo-hub-idle-breath-test.mjs +7 -2
  228. package/scripts/topo-hub-recede-test.mjs +124 -0
  229. package/scripts/topo-hub-spoke-brightness-test.mjs +77 -0
  230. package/scripts/topo-hub-spoke-glow-test.mjs +112 -0
  231. package/scripts/topo-hub-spoke-self-filter-test.mjs +119 -0
  232. package/scripts/topo-label-card-brightness-test.mjs +81 -0
  233. package/scripts/topo-layout-hover-fw-test.mjs +98 -0
  234. package/scripts/topo-layout-toggle-brightness-test.mjs +94 -0
  235. package/scripts/topo-legend-count-brightness-test.mjs +80 -0
  236. package/scripts/topo-legend-count-letter-spacing-test.mjs +108 -0
  237. package/scripts/topo-legend-label-fw-test.mjs +107 -0
  238. package/scripts/topo-legend-pin-ring-brightness-test.mjs +82 -0
  239. package/scripts/topo-legend-row-count-brightness-test.mjs +85 -0
  240. package/scripts/topo-legend-row-label-glow-test.mjs +102 -0
  241. package/scripts/topo-legend-swatch-glow-test.mjs +109 -0
  242. package/scripts/topo-legend-swatch-member-alias-match-test.mjs +139 -0
  243. package/scripts/topo-legend-tint-brightness-test.mjs +83 -0
  244. package/scripts/topo-minimap-dot-chat-gate-test.mjs +81 -0
  245. package/scripts/topo-minimap-hover-glow-test.mjs +109 -0
  246. package/scripts/topo-minimap-viewport-brightness-test.mjs +84 -0
  247. package/scripts/topo-more-footer-brightness-test.mjs +94 -0
  248. package/scripts/topo-node-alias-brightness-test.mjs +84 -0
  249. package/scripts/topo-node-sub-text-brightness-test.mjs +88 -0
  250. package/scripts/topo-nodesize-brightness-test.mjs +82 -0
  251. package/scripts/topo-nodesize-hover-fw-test.mjs +99 -0
  252. package/scripts/topo-orphan-box-dash-test.mjs +89 -0
  253. package/scripts/topo-orphan-fill-opacity-test.mjs +91 -0
  254. package/scripts/topo-orphan-label-opacity-test.mjs +98 -0
  255. package/scripts/topo-panel-count-hover-ls-test.mjs +87 -0
  256. package/scripts/topo-panel-row-brightness-test.mjs +116 -0
  257. package/scripts/topo-panel-title-brightness-test.mjs +98 -0
  258. package/scripts/topo-panel-title-glow-test.mjs +111 -0
  259. package/scripts/topo-pill-x-rotate-test.mjs +96 -0
  260. package/scripts/topo-pinned-aspect-test.mjs +89 -0
  261. package/scripts/topo-pip-brightness-test.mjs +85 -0
  262. package/scripts/topo-pressure-seg-glow-test.mjs +92 -0
  263. package/scripts/topo-pressure-seg-member-alias-match-test.mjs +133 -0
  264. package/scripts/topo-pressure-seg-motion-test.mjs +101 -0
  265. package/scripts/topo-recent-count-brightness-test.mjs +84 -0
  266. package/scripts/topo-recent-more-fw-test.mjs +126 -0
  267. package/scripts/topo-recent-panel-hot-pulse-test.mjs +105 -0
  268. package/scripts/topo-recent-pip-halo-layers-test.mjs +82 -0
  269. package/scripts/topo-recent-row-chat-gate-test.mjs +75 -0
  270. package/scripts/topo-recent-row-content-lift-test.mjs +140 -0
  271. package/scripts/topo-recent-row-fw-test.mjs +115 -0
  272. package/scripts/topo-recent-row-text-glow-test.mjs +86 -0
  273. package/scripts/topo-recent-tint-brightness-test.mjs +80 -0
  274. package/scripts/topo-recent-ts-brightness-test.mjs +86 -0
  275. package/scripts/topo-reduced-motion-attr-test.mjs +69 -0
  276. package/scripts/topo-reset-brightness-test.mjs +83 -0
  277. package/scripts/topo-reset-icon-hover-scale-test.mjs +102 -0
  278. package/scripts/topo-runtime-badge-brightness-test.mjs +78 -0
  279. package/scripts/topo-runtime-badge-glow-test.mjs +108 -0
  280. package/scripts/topo-runtime-badge-rotate-test.mjs +85 -0
  281. package/scripts/topo-spoke-chat-gate-test.mjs +72 -0
  282. package/scripts/topo-starfield-hue-test.mjs +109 -0
  283. package/scripts/topo-status-ring-brightness-test.mjs +84 -0
  284. package/scripts/topo-status-ring-chat-gate-test.mjs +72 -0
  285. package/scripts/topo-status-ring-halo-layers-test.mjs +105 -0
  286. package/scripts/topo-status-ring-status-halo-test.mjs +110 -0
  287. package/scripts/topo-sub-text-chat-brightness-test.mjs +81 -0
  288. package/scripts/topo-titleblock-h2-hover-fw-test.mjs +109 -0
  289. package/scripts/topo-titleblock-h2-hover-tracking-test.mjs +128 -0
  290. package/scripts/topo-titleblock-kicker-hover-test.mjs +134 -0
  291. package/scripts/topo-vendor-chip-glow-test.mjs +97 -0
  292. package/scripts/topo-vendor-pill-glow-test.mjs +98 -0
  293. package/scripts/topo-watermark-breath-test.mjs +100 -0
  294. package/scripts/topo-watermark-recede-test.mjs +114 -0
  295. package/scripts/topo-zoom-buttons-brightness-test.mjs +94 -0
  296. package/scripts/topo-zoom-level-brightness-test.mjs +83 -0
  297. package/scripts/topo-zoom-level-color-test.mjs +105 -0
  298. package/.next/static/chunks/0c5oi2xfb5f-v.js +0 -1
  299. package/.next/static/chunks/0fbjebg75.xaa.js +0 -1
  300. package/.next/static/chunks/0m.1mvl~t.avc.css +0 -2
  301. package/.next/static/chunks/0rov_~mp_s.55.js +0 -4
  302. /package/.next/static/{RmgW0P1IsJVjZHejw0-fy → _-j4EXl4e0WYx-zl-_JgA}/_buildManifest.js +0 -0
  303. /package/.next/static/{RmgW0P1IsJVjZHejw0-fy → _-j4EXl4e0WYx-zl-_JgA}/_clientMiddlewareManifest.js +0 -0
  304. /package/.next/static/{RmgW0P1IsJVjZHejw0-fy → _-j4EXl4e0WYx-zl-_JgA}/_ssgManifest.js +0 -0
@@ -0,0 +1,76 @@
1
+ /* Round 544 verification: group filter pill gains cyan-accent drop-
2
+ * shadow when rendered (pin-active visual). Sibling to R543 status pill.
3
+ *
4
+ * Test strategy: source-canonical because group-label click via Playwright
5
+ * is impractical (banked R538/R544 lesson — SVG hit-test intercept).
6
+ * Source regex confirms the wiring; rest-state DOM probe confirms pill
7
+ * is absent when unpinned (baseline behavior unchanged).
8
+ *
9
+ * Test phases:
10
+ * 1. unpinned (default): no [data-active-filter="group"] element
11
+ * 2. source-side regex confirms filter wired with pal.legendAccent
12
+ * via color-mix 60% syntax
13
+ */
14
+ import { chromium } from 'playwright';
15
+ import { readFileSync } from 'node:fs';
16
+
17
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
18
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
19
+
20
+ const browser = await chromium.launch({ headless: true });
21
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
22
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
23
+ await ctx.addInitScript(() => {
24
+ try {
25
+ localStorage.setItem('anet-theme', 'cyber');
26
+ localStorage.setItem('anet-topo-layout', 'grid');
27
+ sessionStorage.setItem('anet_v3_auth', '1');
28
+ } catch {}
29
+ });
30
+ await ctx.route('**/api/hub/status*', async (route) => {
31
+ const r = await route.fetch();
32
+ const b = await r.json();
33
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
34
+ const mk = (alias, status) => ({
35
+ alias, status, 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: [
40
+ mk('alpha·1', 'working'), mk('alpha·2', 'working'),
41
+ mk('beta·1', 'idle'), mk('beta·2', 'idle'),
42
+ ] } });
43
+ });
44
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
45
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
46
+ const page = await ctx.newPage();
47
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
48
+ await page.waitForSelector('[data-group-label]', { timeout: 15000 });
49
+ await page.waitForTimeout(500);
50
+
51
+ const unpinned = await page.evaluate(() =>
52
+ document.querySelector('[data-active-filter="group"]') !== null
53
+ );
54
+
55
+ await browser.close();
56
+
57
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
58
+ const sourceFilterWired =
59
+ /filter: `drop-shadow\(0 0 3px color-mix\(in srgb, \$\{pal\.legendAccent\} 60%, transparent\)\)`,/.test(src);
60
+
61
+ // Confirm we edited the GROUP pill specifically (data-active-filter="group")
62
+ // — look for the filter wiring within the group-pill scope by matching
63
+ // the surrounding setPinnedGroup handler.
64
+ const groupPillScope = src.match(/onClick=\{\(\) => setPinnedGroup\(null\)\}[\s\S]{0,2500}/)?.[0] || '';
65
+ const groupPillHasFilter = /filter: `drop-shadow\(0 0 3px color-mix\(in srgb, \$\{pal\.legendAccent\} 60%, transparent\)\)`,/.test(groupPillScope);
66
+
67
+ const results = {
68
+ unpinned_pill_absent: unpinned === false,
69
+ source_filter_wired: sourceFilterWired,
70
+ source_group_pill_scope: groupPillHasFilter,
71
+ };
72
+ const ok = Object.values(results).every(Boolean);
73
+ console.log(`${ok ? '✅' : '❌'} R544 group filter pill glow (source-canonical):`,
74
+ JSON.stringify(results, null, 2),
75
+ '\n unpinned absent:', unpinned);
76
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,82 @@
1
+ /* Round 610 — group label tint rect gains filter brightness(1.15)
2
+ * on (pinnedGroup === box.key || hoveredGroupLabel === box.key).
3
+ * Same gate as the existing fill swap.
4
+ *
5
+ * Test phases:
6
+ * 1. mock 2 prefix-group nodes → grid layout renders tint rects
7
+ * 2. rest: filter='none', brightness-attr='1', tinted='none'
8
+ * 3. computed transition-property contains 'filter'
9
+ * 4. source: filter conditional + data-attr + transition extension
10
+ */
11
+ import { chromium } from 'playwright';
12
+ import { readFileSync } from 'node:fs';
13
+
14
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
15
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
16
+
17
+ const browser = await chromium.launch({ headless: true });
18
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
19
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
20
+ await ctx.addInitScript(() => {
21
+ try {
22
+ localStorage.setItem('anet-theme', 'cyber');
23
+ localStorage.setItem('anet-topo-layout', 'grid');
24
+ sessionStorage.setItem('anet_v3_auth', '1');
25
+ } catch {}
26
+ });
27
+ await ctx.route('**/api/hub/status*', async (route) => {
28
+ const r = await route.fetch();
29
+ const b = await r.json();
30
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
31
+ const mk = (alias) => ({
32
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
33
+ network_id: nid, project_dir: null,
34
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
35
+ });
36
+ await route.fulfill({ response: r, json: { ...b, sessions: [
37
+ mk('alpha·1'), mk('alpha·2'), mk('beta·1'), mk('beta·2'),
38
+ ] } });
39
+ });
40
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
41
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
42
+ const page = await ctx.newPage();
43
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
44
+ await page.waitForSelector('[data-group-label-tint-brightness]', { timeout: 15000, state: 'attached' });
45
+ await page.waitForTimeout(500);
46
+
47
+ const rest = await page.evaluate(() => {
48
+ const el = document.querySelector('[data-group-label-tint-brightness]');
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-group-label-tint-brightness'),
55
+ tintedAttr: el.getAttribute('data-group-label-tinted'),
56
+ transitionAttr: el.getAttribute('data-group-label-tint-transition'),
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 = /filter: \(pinnedGroup === box\.key \|\| hoveredGroupLabel === box\.key\)\s*\?\s*'brightness\(1\.15\)'\s*:\s*undefined/.test(src);
64
+ const sourceAttr = /data-group-label-tint-brightness=\{\(pinnedGroup === box\.key \|\| hoveredGroupLabel === box\.key\) \? '1\.15' : '1'\}/.test(src);
65
+ const sourceTransition = /transition: 'fill 200ms ease-out, opacity 200ms ease-out, x 200ms ease-out, width 200ms ease-out, rx 200ms ease-out, filter 200ms ease-out'/.test(src);
66
+
67
+ const results = {
68
+ tint_present: !!rest,
69
+ rest_filter_none: rest?.filter === 'none',
70
+ rest_brightness_1: rest?.brightnessAttr === '1',
71
+ rest_tinted_none: rest?.tintedAttr === 'none',
72
+ transition_attr: rest?.transitionAttr === '200ms',
73
+ transition_has_filter: /filter/.test(rest?.transitionProperty || ''),
74
+ source_filter: sourceFilter,
75
+ source_attr: sourceAttr,
76
+ source_transition: sourceTransition,
77
+ };
78
+ const ok = Object.values(results).every(Boolean);
79
+ console.log(`${ok ? '✅' : '❌'} R610 group-label tint rect brightness (pin/hover panel tier):`,
80
+ JSON.stringify(results, null, 2),
81
+ `\n rest: ${JSON.stringify(rest)}`);
82
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,72 @@
1
+ /* Round 623 — extend node halo isHaloHovered gate to include
2
+ * chatAlias. Single conceptual change cascades the halo's
3
+ * 4-state opacity tiers (online/offline × hover/rest). 9th
4
+ * anchor in chat-target-gated brightness family.
5
+ *
6
+ * Test phases:
7
+ * 1. mock 2 idle nodes → node halo renders
8
+ * 2. rest (idle, no hover, no chat): halo at rest opacity
9
+ * (online cyber 0.65)
10
+ * 3. source: isHaloHovered declaration uses gate union
11
+ * (hoveredAlias || chatAlias)
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-node-halo-hovered]', { timeout: 15000, state: 'attached' });
45
+ await page.waitForTimeout(500);
46
+
47
+ const rest = await page.evaluate(() => {
48
+ const el = document.querySelector('[data-node-halo-hovered]');
49
+ if (!el) return null;
50
+ return {
51
+ hoveredAttr: el.getAttribute('data-node-halo-hovered'),
52
+ resolvedAttr: el.getAttribute('data-node-halo-resolved-opacity'),
53
+ };
54
+ });
55
+
56
+ await browser.close();
57
+
58
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
59
+ const sourceGate = /const isHaloHovered = !reducedMotion && \(hoveredAlias === session\.alias \|\| chatAlias === session\.alias\)/.test(src);
60
+
61
+ const results = {
62
+ halo_present: !!rest,
63
+ rest_hovered_false: rest?.hoveredAttr === 'false',
64
+ // online cyber rest = 0.65
65
+ rest_opacity_idle: rest?.resolvedAttr === '0.65',
66
+ source_gate_or: sourceGate,
67
+ };
68
+ const ok = Object.values(results).every(Boolean);
69
+ console.log(`${ok ? '✅' : '❌'} R623 node halo chat-target gate (chat-gated family 9th anchor):`,
70
+ JSON.stringify(results, null, 2),
71
+ `\n rest: ${JSON.stringify(rest)}`);
72
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,82 @@
1
+ /* Round 614 — hub-core stacks drop-shadow + brightness on
2
+ * isCoreHovered. Extends hub-cluster brightness coverage to a
3
+ * 6th concentric element (innermost emerald r=10 disc).
4
+ *
5
+ * Test phases:
6
+ * 1. mock 2 idle nodes → hub core renders
7
+ * 2. rest (no hub hover): filter='none', brightness-attr='1',
8
+ * glow-attr='false'
9
+ * 3. computed transition-property contains 'filter'
10
+ * 4. source: stacked filter conditional + data-attrs +
11
+ * transition extension
12
+ */
13
+ import { chromium } from 'playwright';
14
+ import { readFileSync } from 'node:fs';
15
+
16
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
17
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
18
+
19
+ const browser = await chromium.launch({ headless: true });
20
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
21
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
22
+ await ctx.addInitScript(() => {
23
+ try {
24
+ localStorage.setItem('anet-theme', 'cyber');
25
+ localStorage.setItem('anet-topo-layout', 'ring');
26
+ sessionStorage.setItem('anet_v3_auth', '1');
27
+ } catch {}
28
+ });
29
+ await ctx.route('**/api/hub/status*', async (route) => {
30
+ const r = await route.fetch();
31
+ const b = await r.json();
32
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
33
+ const mk = (alias) => ({
34
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
35
+ network_id: nid, project_dir: null,
36
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
37
+ });
38
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
39
+ });
40
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
41
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
42
+ const page = await ctx.newPage();
43
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
44
+ await page.waitForSelector('[data-topo-hub-core]', { timeout: 15000, state: 'attached' });
45
+ await page.waitForTimeout(500);
46
+
47
+ const rest = await page.evaluate(() => {
48
+ const el = document.querySelector('[data-topo-hub-core]');
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-topo-hub-core-brightness'),
55
+ glowAttr: el.getAttribute('data-topo-hub-core-glow'),
56
+ hoveredAttr: el.getAttribute('data-topo-hub-core-hovered'),
57
+ };
58
+ });
59
+
60
+ await browser.close();
61
+
62
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
63
+ const sourceFilterCyber = /'drop-shadow\(0 0 2px rgba\(52, 211, 153, 0\.5\)\) brightness\(1\.15\)'/.test(src);
64
+ const sourceFilterLight = /'drop-shadow\(0 0 2px rgba\(16, 185, 129, 0\.5\)\) brightness\(1\.15\)'/.test(src);
65
+ const sourceAttr = /data-topo-hub-core-brightness=\{isCoreHovered \? '1\.15' : '1'\}/.test(src);
66
+
67
+ const results = {
68
+ core_present: !!rest,
69
+ rest_filter_none: rest?.filter === 'none',
70
+ rest_brightness_1: rest?.brightnessAttr === '1',
71
+ rest_glow_false: rest?.glowAttr === 'false',
72
+ rest_hovered_false: rest?.hoveredAttr === 'false',
73
+ transition_has_filter: /filter/.test(rest?.transitionProperty || ''),
74
+ source_filter_cyber: sourceFilterCyber,
75
+ source_filter_light: sourceFilterLight,
76
+ source_attr: sourceAttr,
77
+ };
78
+ const ok = Object.values(results).every(Boolean);
79
+ console.log(`${ok ? '✅' : '❌'} R614 hub-core stacked brightness (cluster 6/6 concentric):`,
80
+ JSON.stringify(results, null, 2),
81
+ `\n rest: ${JSON.stringify(rest)}`);
82
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,79 @@
1
+ /* Round 575 verification: hub digit stacks brightness(1.15) onto
2
+ * R476 hub-hover drop-shadow. 14th anchor in per-element brightness
3
+ * family.
4
+ *
5
+ * Test phases:
6
+ * 1. mock 2 working sessions → workingCount > 0 → hub digit visible
7
+ * 2. rest: filter='none', brightness-attr='1'
8
+ * 3. source-side regex confirms BOTH theme filter expressions
9
+ * stack brightness(1.15) + data-attr conditional
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-topo-hub-working-count]', { timeout: 15000 });
43
+ await page.waitForTimeout(500);
44
+
45
+ const rest = await page.evaluate(() => {
46
+ const el = document.querySelector('[data-topo-hub-working-count]');
47
+ if (!el) return null;
48
+ const cs = getComputedStyle(el);
49
+ return {
50
+ filter: cs.filter,
51
+ transitionProperty: cs.transitionProperty,
52
+ brightnessAttr: el.getAttribute('data-topo-hub-working-count-brightness'),
53
+ hoveredAttr: el.getAttribute('data-topo-hub-working-count-hovered'),
54
+ visibleAttr: el.getAttribute('data-topo-hub-working-count-visible'),
55
+ };
56
+ });
57
+
58
+ await browser.close();
59
+
60
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
61
+ const sourceLightFilter = /'drop-shadow\(0 0 2px rgba\(16, 185, 129, 0\.6\)\) brightness\(1\.15\)'/.test(src);
62
+ const sourceCyberFilter = /'drop-shadow\(0 0 3px rgba\(52, 211, 153, 0\.6\)\) brightness\(1\.15\)'/.test(src);
63
+ const sourceAttr = /data-topo-hub-working-count-brightness=\{!reducedMotion && hoveredHub \? '1\.15' : '1'\}/.test(src);
64
+
65
+ const results = {
66
+ visible_true: rest?.visibleAttr === 'true',
67
+ rest_filter_none: rest?.filter === 'none',
68
+ rest_brightness_1: rest?.brightnessAttr === '1',
69
+ rest_hovered_false: rest?.hoveredAttr === 'false',
70
+ transition_has_filter: /filter/.test(rest?.transitionProperty || ''),
71
+ source_light_filter: sourceLightFilter,
72
+ source_cyber_filter: sourceCyberFilter,
73
+ source_attr: sourceAttr,
74
+ };
75
+ const ok = Object.values(results).every(Boolean);
76
+ console.log(`${ok ? '✅' : '❌'} R575 hub digit stacked brightness (14th anchor, 60-round milestone):`,
77
+ JSON.stringify(results, null, 2),
78
+ `\n rest: ${JSON.stringify(rest)}`);
79
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,119 @@
1
+ /* Round 527 verification: hub-center workingCount digit gains letter-
2
+ * spacing 0 → 0.3px on hub-hover — focal-amplify family 2nd anchor.
3
+ *
4
+ * Test phases (workingCount > 0 so hub-digit renders):
5
+ * 1. rest: computed letter-spacing=0px (or 'normal'),
6
+ * attr = '0px'
7
+ * 2. hover hub: computed letter-spacing=0.3px, attr='0.3px'
8
+ * 3. mouseleave: returns to 0px / normal
9
+ * 4. transition list includes 'letter-spacing 200ms'
10
+ * 5. source-side regex confirms ternary + transition 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, status) => ({
33
+ alias, status, 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
+ // 2 working so digit shows "2" (visible) — but we test the css
38
+ // letter-spacing regardless of digit count
39
+ await route.fulfill({ response: r, json: { ...b, sessions: [
40
+ mk('a·1', 'working'), mk('a·2', 'working'), mk('a·3', 'idle'),
41
+ ] } });
42
+ });
43
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
44
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
45
+ const page = await ctx.newPage();
46
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
47
+ await page.waitForSelector('[data-topo-hub-working-count]', { timeout: 15000 });
48
+ await page.waitForTimeout(800);
49
+
50
+ const restRead = async () => page.evaluate(() => {
51
+ const el = document.querySelector('[data-topo-hub-working-count]');
52
+ if (!el) return null;
53
+ const cs = getComputedStyle(el);
54
+ return {
55
+ attrLS: el.getAttribute('data-topo-hub-working-count-letter-spacing'),
56
+ attrHovered: el.getAttribute('data-topo-hub-working-count-hovered'),
57
+ letterSpacing: cs.letterSpacing,
58
+ transition: cs.transition,
59
+ };
60
+ });
61
+
62
+ // Phase 1: rest
63
+ const rest = await restRead();
64
+
65
+ // Phase 2: hover the hub — find a hub-related interactive element.
66
+ // hoveredHub is set when the user hovers the hub (R52/R177 family).
67
+ // The hub spoke chip-style group has the onPointerEnter. Search for
68
+ // data-topo-hub-spoke or hub center clickable.
69
+ // Simpler: find the hub container element that triggers hoveredHub.
70
+ // From source, hoveredHub is set somewhere — let me try clicking the
71
+ // hub center area near (cx, cy) = (500, 340) per VIEWBOX 1000×680.
72
+ // But viewport is 1500×1200, so SVG width depends on container.
73
+ // Use locator on the hub digit element itself and walk up to find
74
+ // a hoverable ancestor — the digit's parent <g> typically has the
75
+ // pointer-enter.
76
+ const hubBbox = await page.locator('[data-topo-hub-working-count]').first().boundingBox();
77
+ if (hubBbox) {
78
+ // Hover slightly off-center to ensure we hit the hub group, not just the digit
79
+ await page.mouse.move(hubBbox.x + hubBbox.width / 2, hubBbox.y + hubBbox.height / 2);
80
+ }
81
+ await page.waitForTimeout(400);
82
+ const hover = await restRead();
83
+
84
+ // Phase 3: mouseleave
85
+ await page.mouse.move(50, 50);
86
+ await page.waitForTimeout(400);
87
+ const leave = await restRead();
88
+
89
+ await browser.close();
90
+
91
+ // Source regex
92
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
93
+ const sourceLsTernary =
94
+ /letterSpacing: !reducedMotion && hoveredHub \? '0\.3px' : '0px',/.test(src);
95
+ const sourceAttrWired =
96
+ /data-topo-hub-working-count-letter-spacing=\{!reducedMotion && hoveredHub \? '0\.3px' : '0px'\}/.test(src);
97
+ const sourceTransitionExt =
98
+ /transition: 'transform 200ms ease-out, opacity 300ms ease-out, fill 200ms ease-out, font-weight 200ms ease-out, filter 200ms ease-out, letter-spacing 200ms ease-out'/.test(src);
99
+
100
+ const results = {
101
+ rest_attr_0: rest?.attrLS === '0px',
102
+ rest_hovered_false: rest?.attrHovered === 'false',
103
+ rest_ls_0: rest?.letterSpacing === '0px' || rest?.letterSpacing === 'normal',
104
+ rest_transition_has_ls: /letter-spacing/.test(rest?.transition || ''),
105
+ hover_attr_03: hover?.attrLS === '0.3px',
106
+ hover_hovered_true: hover?.attrHovered === 'true',
107
+ hover_ls_03: hover?.letterSpacing === '0.3px',
108
+ leave_attr_0: leave?.attrLS === '0px',
109
+ source_ls_ternary: sourceLsTernary,
110
+ source_attr_wired: sourceAttrWired,
111
+ source_transition_ext: sourceTransitionExt,
112
+ };
113
+ const ok = Object.values(results).every(Boolean);
114
+ console.log(`${ok ? '✅' : '❌'} R527 hub-digit hover letter-spacing:`,
115
+ JSON.stringify(results, null, 2),
116
+ '\n rest:', JSON.stringify(rest),
117
+ '\n hover:', JSON.stringify(hover),
118
+ '\n leave:', JSON.stringify(leave));
119
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,80 @@
1
+ /* Round 577 verification: hub-halo stacks brightness(1.15) onto
2
+ * R536 hub-hover drop-shadow. 15th anchor in per-element
3
+ * brightness family.
4
+ *
5
+ * Test phases:
6
+ * 1. rest: filter='none', brightness-attr='1'
7
+ * 2. source: both theme filter expressions stack brightness
8
+ */
9
+ import { chromium } from 'playwright';
10
+ import { readFileSync } from 'node:fs';
11
+
12
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
13
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
14
+
15
+ const browser = await chromium.launch({ headless: true });
16
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
17
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
18
+ await ctx.addInitScript(() => {
19
+ try {
20
+ localStorage.setItem('anet-theme', 'cyber');
21
+ localStorage.setItem('anet-topo-layout', 'ring');
22
+ sessionStorage.setItem('anet_v3_auth', '1');
23
+ } catch {}
24
+ });
25
+ await ctx.route('**/api/hub/status*', async (route) => {
26
+ const r = await route.fetch();
27
+ const b = await r.json();
28
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
29
+ const mk = (alias) => ({
30
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
31
+ network_id: nid, project_dir: null,
32
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
33
+ });
34
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1')] } });
35
+ });
36
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
37
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
38
+ const page = await ctx.newPage();
39
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
40
+ await page.waitForSelector('[data-topo-hub-halo-radius]', { timeout: 15000 });
41
+ await page.waitForTimeout(500);
42
+
43
+ const rest = await page.evaluate(() => {
44
+ const el = document.querySelector('[data-topo-hub-halo-radius]');
45
+ if (!el) return null;
46
+ const cs = getComputedStyle(el);
47
+ return {
48
+ filter: cs.filter,
49
+ transitionProperty: cs.transitionProperty,
50
+ brightnessAttr: el.getAttribute('data-topo-hub-halo-brightness'),
51
+ glowAttr: el.getAttribute('data-topo-hub-halo-glow'),
52
+ hoveredAttr: el.getAttribute('data-topo-hub-halo-hovered'),
53
+ radius: el.getAttribute('data-topo-hub-halo-radius'),
54
+ };
55
+ });
56
+
57
+ await browser.close();
58
+
59
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
60
+ const sourceLightFilter = /'drop-shadow\(0 0 2px rgba\(16, 185, 129, 0\.3\)\) brightness\(1\.15\)'/.test(src);
61
+ const sourceCyberFilter = /'drop-shadow\(0 0 2px rgba\(52, 211, 153, 0\.3\)\) brightness\(1\.15\)'/.test(src);
62
+ const sourceAttr = /data-topo-hub-halo-brightness=\{!reducedMotion && hoveredHub \? '1\.15' : '1'\}/.test(src);
63
+
64
+ const results = {
65
+ halo_present: !!rest,
66
+ halo_radius_20: rest?.radius === '20',
67
+ rest_filter_none: rest?.filter === 'none',
68
+ rest_brightness_1: rest?.brightnessAttr === '1',
69
+ rest_glow_false: rest?.glowAttr === 'false',
70
+ rest_hovered_false: rest?.hoveredAttr === 'false',
71
+ transition_has_filter: /filter/.test(rest?.transitionProperty || ''),
72
+ source_light_filter: sourceLightFilter,
73
+ source_cyber_filter: sourceCyberFilter,
74
+ source_attr: sourceAttr,
75
+ };
76
+ const ok = Object.values(results).every(Boolean);
77
+ console.log(`${ok ? '✅' : '❌'} R577 hub-halo stacked brightness (15th anchor, hub-cluster brightness closure):`,
78
+ JSON.stringify(results, null, 2),
79
+ `\n rest: ${JSON.stringify(rest)}`);
80
+ process.exit(ok ? 0 : 1);