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

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