@sleep2agi/agent-network-dashboard 0.5.3-preview.22 → 0.5.3-preview.220

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 (358) 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/090el2nj92~9k.js +1 -0
  143. package/.next/static/chunks/0bdnkx3fvtw2t.js +4 -0
  144. package/.next/static/chunks/0febdempmtc5e.js +1 -0
  145. package/.next/static/chunks/0jjd-epm-pvht.css +2 -0
  146. package/.next/static/chunks/{0l440-mv.tqcj.js → 0ua3qnri0i81x.js} +1 -1
  147. package/.next/trace +2 -2
  148. package/.next/trace-build +1 -1
  149. package/app/components/TopoGraph.tsx +5378 -176
  150. package/app/globals.css +373 -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-envelope-breath-test.mjs +103 -0
  189. package/scripts/topo-crescent-recede-test.mjs +111 -0
  190. package/scripts/topo-dense-alias-chat-halo-test.mjs +73 -0
  191. package/scripts/topo-dense-alias-halo-layers-test.mjs +80 -0
  192. package/scripts/topo-edge-badge-circle-brightness-test.mjs +82 -0
  193. package/scripts/topo-edge-badge-circle-hot-pulse-test.mjs +100 -0
  194. package/scripts/topo-edge-badge-digit-halo-layers-test.mjs +107 -0
  195. package/scripts/topo-edge-badge-endpoint-gate-test.mjs +94 -0
  196. package/scripts/topo-edge-badge-halo-layers-test.mjs +85 -0
  197. package/scripts/topo-edge-badge-hot-pulse-test.mjs +92 -0
  198. package/scripts/topo-edge-badge-hover-glow-test.mjs +90 -0
  199. package/scripts/topo-edge-badge-text-brightness-test.mjs +83 -0
  200. package/scripts/topo-edge-chat-gate-test.mjs +71 -0
  201. package/scripts/topo-edge-flow-rail-halo-layers-test.mjs +89 -0
  202. package/scripts/topo-edge-particle-brightness-test.mjs +82 -0
  203. package/scripts/topo-edge-particle-halo-layers-test.mjs +91 -0
  204. package/scripts/topo-edge-pill-glow-test.mjs +67 -0
  205. package/scripts/topo-edge-pin-halo-test.mjs +99 -0
  206. package/scripts/topo-edge-visible-brightness-test.mjs +84 -0
  207. package/scripts/topo-edge-visible-halo-layers-test.mjs +87 -0
  208. package/scripts/topo-endpoint-ring-brightness-test.mjs +83 -0
  209. package/scripts/topo-endpoint-ring-flow-halo-test.mjs +107 -0
  210. package/scripts/topo-endpoint-ring-halo-layers-test.mjs +100 -0
  211. package/scripts/topo-filter-pill-glow-test.mjs +90 -0
  212. package/scripts/topo-filter-pill-halo-layers-test.mjs +27 -0
  213. package/scripts/topo-flow-arrow-brightness-test.mjs +82 -0
  214. package/scripts/topo-flow-rail-brightness-test.mjs +80 -0
  215. package/scripts/topo-fullscreen-attr-test.mjs +73 -0
  216. package/scripts/topo-fullscreen-brightness-test.mjs +84 -0
  217. package/scripts/topo-fullscreen-icon-rotate-test.mjs +93 -0
  218. package/scripts/topo-grid-content-bottom-attr-test.mjs +72 -0
  219. package/scripts/topo-group-box-brightness-test.mjs +84 -0
  220. package/scripts/topo-group-box-halo-layers-test.mjs +91 -0
  221. package/scripts/topo-group-chat-gate-test.mjs +77 -0
  222. package/scripts/topo-group-label-brightness-test.mjs +84 -0
  223. package/scripts/topo-group-label-halo-layers-test.mjs +78 -0
  224. package/scripts/topo-group-label-hover-glow-test.mjs +86 -0
  225. package/scripts/topo-group-label-member-alias-hover-test.mjs +125 -0
  226. package/scripts/topo-group-pill-glow-test.mjs +76 -0
  227. package/scripts/topo-group-tint-brightness-test.mjs +82 -0
  228. package/scripts/topo-halo-chat-gate-test.mjs +72 -0
  229. package/scripts/topo-hover-detail-halo-test.mjs +76 -0
  230. package/scripts/topo-hub-core-brightness-test.mjs +82 -0
  231. package/scripts/topo-hub-core-halo-layers-test.mjs +81 -0
  232. package/scripts/topo-hub-digit-brightness-test.mjs +79 -0
  233. package/scripts/topo-hub-digit-halo-layers-test.mjs +76 -0
  234. package/scripts/topo-hub-digit-ls-test.mjs +119 -0
  235. package/scripts/topo-hub-halo-brightness-test.mjs +80 -0
  236. package/scripts/topo-hub-halo-glow-test.mjs +96 -0
  237. package/scripts/topo-hub-halo-halo-layers-test.mjs +76 -0
  238. package/scripts/topo-hub-highlight-amplify-test.mjs +139 -0
  239. package/scripts/topo-hub-highlight-brightness-test.mjs +84 -0
  240. package/scripts/topo-hub-highlight-fill-transition-test.mjs +84 -0
  241. package/scripts/topo-hub-highlight-glow-test.mjs +99 -0
  242. package/scripts/topo-hub-highlight-halo-layers-test.mjs +78 -0
  243. package/scripts/topo-hub-highlight-r-test.mjs +112 -0
  244. package/scripts/topo-hub-highlight-recede-test.mjs +5 -1
  245. package/scripts/topo-hub-highlight-theme-fill-test.mjs +83 -0
  246. package/scripts/topo-hub-hover-ring-brightness-test.mjs +79 -0
  247. package/scripts/topo-hub-hover-ring-glow-test.mjs +97 -0
  248. package/scripts/topo-hub-hover-ring-halo-layers-test.mjs +71 -0
  249. package/scripts/topo-hub-idle-breath-test.mjs +6 -7
  250. package/scripts/topo-hub-spoke-brightness-test.mjs +77 -0
  251. package/scripts/topo-hub-spoke-glow-test.mjs +112 -0
  252. package/scripts/topo-hub-spoke-halo-layers-test.mjs +97 -0
  253. package/scripts/topo-hub-spoke-self-filter-test.mjs +119 -0
  254. package/scripts/topo-kicker-breath-test.mjs +100 -0
  255. package/scripts/topo-kicker-halo-layers-test.mjs +82 -0
  256. package/scripts/topo-label-card-brightness-test.mjs +81 -0
  257. package/scripts/topo-layout-hover-fw-test.mjs +98 -0
  258. package/scripts/topo-layout-toggle-brightness-test.mjs +94 -0
  259. package/scripts/topo-layout-toggle-halo-layers-test.mjs +95 -0
  260. package/scripts/topo-legend-count-brightness-test.mjs +80 -0
  261. package/scripts/topo-legend-count-halo-layers-test.mjs +79 -0
  262. package/scripts/topo-legend-count-letter-spacing-test.mjs +108 -0
  263. package/scripts/topo-legend-label-fw-test.mjs +107 -0
  264. package/scripts/topo-legend-panel-title-breath-test.mjs +86 -0
  265. package/scripts/topo-legend-pin-ring-brightness-test.mjs +82 -0
  266. package/scripts/topo-legend-pin-ring-halo-layers-test.mjs +71 -0
  267. package/scripts/topo-legend-row-count-brightness-test.mjs +85 -0
  268. package/scripts/topo-legend-row-label-glow-test.mjs +102 -0
  269. package/scripts/topo-legend-swatch-glow-test.mjs +109 -0
  270. package/scripts/topo-legend-swatch-member-alias-match-test.mjs +139 -0
  271. package/scripts/topo-legend-tint-brightness-test.mjs +83 -0
  272. package/scripts/topo-legend-trio-halo-layers-test.mjs +22 -0
  273. package/scripts/topo-minimap-container-halo-test.mjs +82 -0
  274. package/scripts/topo-minimap-dot-chat-gate-test.mjs +81 -0
  275. package/scripts/topo-minimap-hover-glow-test.mjs +109 -0
  276. package/scripts/topo-minimap-viewport-brightness-test.mjs +84 -0
  277. package/scripts/topo-minimap-viewport-halo-layers-test.mjs +24 -0
  278. package/scripts/topo-more-footer-brightness-test.mjs +94 -0
  279. package/scripts/topo-node-alias-brightness-test.mjs +84 -0
  280. package/scripts/topo-node-avatar-halo-layers-test.mjs +25 -0
  281. package/scripts/topo-node-hover-ring-halo-layers-test.mjs +70 -0
  282. package/scripts/topo-node-label-card-halo-test.mjs +76 -0
  283. package/scripts/topo-node-sub-text-brightness-test.mjs +88 -0
  284. package/scripts/topo-nodesize-brightness-test.mjs +82 -0
  285. package/scripts/topo-nodesize-halo-layers-test.mjs +89 -0
  286. package/scripts/topo-nodesize-hover-fw-test.mjs +99 -0
  287. package/scripts/topo-orphan-label-opacity-test.mjs +98 -0
  288. package/scripts/topo-panel-count-halo-layers-test.mjs +91 -0
  289. package/scripts/topo-panel-count-hover-ls-test.mjs +87 -0
  290. package/scripts/topo-panel-rect-halo-test.mjs +90 -0
  291. package/scripts/topo-panel-row-brightness-test.mjs +116 -0
  292. package/scripts/topo-panel-title-brightness-test.mjs +98 -0
  293. package/scripts/topo-panel-title-glow-test.mjs +111 -0
  294. package/scripts/topo-panel-titles-halo-layers-test.mjs +23 -0
  295. package/scripts/topo-pill-x-rotate-test.mjs +96 -0
  296. package/scripts/topo-pip-brightness-test.mjs +85 -0
  297. package/scripts/topo-pressure-bar-halo-layers-test.mjs +19 -0
  298. package/scripts/topo-pressure-seg-glow-test.mjs +92 -0
  299. package/scripts/topo-pressure-seg-member-alias-match-test.mjs +133 -0
  300. package/scripts/topo-pressure-seg-motion-test.mjs +101 -0
  301. package/scripts/topo-recent-count-brightness-test.mjs +84 -0
  302. package/scripts/topo-recent-more-fw-test.mjs +126 -0
  303. package/scripts/topo-recent-more-halo-layers-test.mjs +90 -0
  304. package/scripts/topo-recent-panel-hot-pulse-test.mjs +105 -0
  305. package/scripts/topo-recent-panel-title-breath-test.mjs +91 -0
  306. package/scripts/topo-recent-pip-halo-layers-test.mjs +82 -0
  307. package/scripts/topo-recent-row-chat-gate-test.mjs +75 -0
  308. package/scripts/topo-recent-row-content-lift-test.mjs +140 -0
  309. package/scripts/topo-recent-row-fw-test.mjs +115 -0
  310. package/scripts/topo-recent-row-text-glow-test.mjs +86 -0
  311. package/scripts/topo-recent-row-text-halo-layers-test.mjs +67 -0
  312. package/scripts/topo-recent-tint-brightness-test.mjs +80 -0
  313. package/scripts/topo-recent-ts-brightness-test.mjs +86 -0
  314. package/scripts/topo-reduced-motion-attr-test.mjs +69 -0
  315. package/scripts/topo-reset-brightness-test.mjs +83 -0
  316. package/scripts/topo-reset-icon-hover-scale-test.mjs +102 -0
  317. package/scripts/topo-runtime-badge-brightness-test.mjs +78 -0
  318. package/scripts/topo-runtime-badge-glow-test.mjs +108 -0
  319. package/scripts/topo-runtime-badge-halo-layers-test.mjs +87 -0
  320. package/scripts/topo-runtime-badge-rotate-test.mjs +85 -0
  321. package/scripts/topo-section-title-breath-test.mjs +83 -0
  322. package/scripts/topo-section-title-halo-layers-test.mjs +88 -0
  323. package/scripts/topo-spoke-chat-gate-test.mjs +72 -0
  324. package/scripts/topo-starfield-hue-test.mjs +109 -0
  325. package/scripts/topo-status-pin-pill-halo-layers-test.mjs +17 -0
  326. package/scripts/topo-status-ring-brightness-test.mjs +84 -0
  327. package/scripts/topo-status-ring-chat-gate-test.mjs +72 -0
  328. package/scripts/topo-status-ring-halo-layers-test.mjs +105 -0
  329. package/scripts/topo-status-ring-status-halo-test.mjs +110 -0
  330. package/scripts/topo-sub-text-chat-brightness-test.mjs +81 -0
  331. package/scripts/topo-title-block-envelope-breath-test.mjs +87 -0
  332. package/scripts/topo-titleblock-h2-hover-fw-test.mjs +109 -0
  333. package/scripts/topo-titleblock-h2-hover-tracking-test.mjs +128 -0
  334. package/scripts/topo-titleblock-kicker-hover-test.mjs +134 -0
  335. package/scripts/topo-vendor-chip-glow-test.mjs +97 -0
  336. package/scripts/topo-vendor-chip-halo-layers-test.mjs +18 -0
  337. package/scripts/topo-vendor-chip-pin-halo-test.mjs +88 -0
  338. package/scripts/topo-vendor-count-suffix-halo-layers-test.mjs +79 -0
  339. package/scripts/topo-vendor-distribution-wrapper-halo-test.mjs +93 -0
  340. package/scripts/topo-vendor-letter-halo-layers-test.mjs +93 -0
  341. package/scripts/topo-vendor-pill-glow-test.mjs +98 -0
  342. package/scripts/topo-watermark-breath-test.mjs +100 -0
  343. package/scripts/topo-watermark-envelope-breath-test.mjs +88 -0
  344. package/scripts/topo-watermark-recede-test.mjs +114 -0
  345. package/scripts/topo-working-online-chip-halo-layers-test.mjs +94 -0
  346. package/scripts/topo-zoom-buttons-brightness-test.mjs +94 -0
  347. package/scripts/topo-zoom-in-out-halo-layers-test.mjs +97 -0
  348. package/scripts/topo-zoom-level-breath-test.mjs +87 -0
  349. package/scripts/topo-zoom-level-brightness-test.mjs +83 -0
  350. package/scripts/topo-zoom-level-color-test.mjs +105 -0
  351. package/scripts/topo-zoom-level-halo-layers-test.mjs +78 -0
  352. package/.next/static/chunks/0g2t4ytep_laz.js +0 -4
  353. package/.next/static/chunks/0m.1mvl~t.avc.css +0 -2
  354. package/.next/static/chunks/0zm6yg97ubkp5.js +0 -1
  355. package/.next/static/chunks/1867gm.v~vka2.js +0 -1
  356. /package/.next/static/{oGQapRVlgbDN-Wxb5B4gq → Q5dzAC2O1le81YYmwsgi2}/_buildManifest.js +0 -0
  357. /package/.next/static/{oGQapRVlgbDN-Wxb5B4gq → Q5dzAC2O1le81YYmwsgi2}/_clientMiddlewareManifest.js +0 -0
  358. /package/.next/static/{oGQapRVlgbDN-Wxb5B4gq → Q5dzAC2O1le81YYmwsgi2}/_ssgManifest.js +0 -0
@@ -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,88 @@
1
+ /* Round 704 — brand watermark wrapper envelope breath at 15s. Slowest
2
+ * tier in respiratory rolodex. Nested respiration: inner "sleep2agi"
3
+ * text breathes at 6s (R519); this wrapper envelope at 15s creates
4
+ * fast-inner / slow-outer layered effect. Focal-recede gate via
5
+ * [data-topo-brand-watermark-recede="true"] → animation: none.
6
+ */
7
+ import { chromium } from 'playwright';
8
+ import { readFileSync } from 'node:fs';
9
+
10
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
11
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
12
+
13
+ const browser = await chromium.launch({ headless: true });
14
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
15
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
16
+ await ctx.addInitScript(() => {
17
+ try {
18
+ localStorage.setItem('anet-theme', 'cyber');
19
+ localStorage.setItem('anet-topo-layout', 'ring');
20
+ sessionStorage.setItem('anet_v3_auth', '1');
21
+ } catch {}
22
+ });
23
+ await ctx.route('**/api/hub/status*', async (route) => {
24
+ const r = await route.fetch();
25
+ const b = await r.json();
26
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
27
+ const mk = (alias) => ({
28
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
29
+ network_id: nid, project_dir: null,
30
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
31
+ });
32
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
33
+ });
34
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
35
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
36
+ const page = await ctx.newPage();
37
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
38
+ await page.waitForSelector('[data-topo-brand-watermark-wrapper]', { timeout: 15000, state: 'attached' });
39
+ await page.waitForTimeout(300);
40
+
41
+ const runtimeState = await page.evaluate(() => {
42
+ const g = document.querySelector('[data-topo-brand-watermark-wrapper]');
43
+ if (!g) return null;
44
+ const cs = getComputedStyle(g);
45
+ return {
46
+ has_class: g.classList.contains('anet-topo-brand-watermark-envelope-breath'),
47
+ breath_attr: g.getAttribute('data-topo-brand-watermark-envelope-breath'),
48
+ recede_attr: g.getAttribute('data-topo-brand-watermark-recede'),
49
+ anim_name: cs.animationName,
50
+ anim_duration: cs.animationDuration,
51
+ anim_iter: cs.animationIterationCount,
52
+ };
53
+ });
54
+
55
+ await browser.close();
56
+
57
+ const cssSrc = readFileSync('/home/vansin/agent-network-dashboard/app/globals.css', 'utf8');
58
+ const tsxSrc = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
59
+
60
+ const cssKeyframes = /@keyframes anet-topo-brand-watermark-envelope-breath-kf\s*\{[\s\S]*?0%, 100%\s*\{\s*opacity:\s*1;\s*\}[\s\S]*?50%\s*\{\s*opacity:\s*0\.85;/.test(cssSrc);
61
+ const cssRule = /\.anet-topo-brand-watermark-envelope-breath\s*\{[\s\S]*?animation:\s*anet-topo-brand-watermark-envelope-breath-kf\s+15s\s+ease-in-out\s+infinite/.test(cssSrc);
62
+ const cssRecedeGate = /\.anet-topo-brand-watermark-envelope-breath\[data-topo-brand-watermark-recede="true"\]\s*\{\s*animation:\s*none/.test(cssSrc);
63
+ const cssReducedMotion = /prefers-reduced-motion:\s*reduce\s*\)\s*\{\s*\.anet-topo-brand-watermark-envelope-breath\s*\{\s*animation:\s*none/.test(cssSrc);
64
+ const tsxClass = /className="anet-topo-brand-watermark-envelope-breath"/.test(tsxSrc);
65
+ const tsxAttr = /data-topo-brand-watermark-envelope-breath="15s"/.test(tsxSrc);
66
+
67
+ const runtimeAnim = runtimeState?.anim_name === 'anet-topo-brand-watermark-envelope-breath-kf' || runtimeState?.anim_name === 'none';
68
+ const runtimeDuration = runtimeState?.anim_duration === '15s' || runtimeState?.anim_name === 'none';
69
+
70
+ const results = {
71
+ wrapper_present: !!runtimeState,
72
+ has_breath_class: runtimeState?.has_class === true,
73
+ breath_attr_15s: runtimeState?.breath_attr === '15s',
74
+ rest_not_recede: runtimeState?.recede_attr === 'false',
75
+ runtime_anim_ok: runtimeAnim,
76
+ runtime_duration_ok: runtimeDuration,
77
+ css_keyframes: cssKeyframes,
78
+ css_rule: cssRule,
79
+ css_recede_gate: cssRecedeGate,
80
+ css_reduced_motion: cssReducedMotion,
81
+ tsx_class: tsxClass,
82
+ tsx_breath_attr: tsxAttr,
83
+ };
84
+ const ok = Object.values(results).every(Boolean);
85
+ console.log(`${ok ? '✅' : '❌'} R704 brand watermark wrapper envelope breath (15s, recede-gated — slowest tier):`,
86
+ JSON.stringify(results, null, 2),
87
+ `\n runtime: ${JSON.stringify(runtimeState)}`);
88
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,114 @@
1
+ /* Round 525 verification: brand watermark gains focal-recede on
2
+ * non-hub canvas hover — extends R507/R508 focal-recede pattern to
3
+ * 3rd anchor.
4
+ *
5
+ * Test phases:
6
+ * 1. rest: wrapper opacity=1, recede attr='false'
7
+ * 2. hover an alias (non-hub canvas surface): wrapper opacity=0.7,
8
+ * recede attr='true'
9
+ * 3. mouseleave: wrapper opacity returns to 1
10
+ * 4. SMIL <animate> still mounted on inner text (R519 preserved)
11
+ * 5. source-side regex confirms wrapper opacity ternary + attr
12
+ */
13
+ import { chromium } from 'playwright';
14
+ import { readFileSync } from 'node:fs';
15
+
16
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
17
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
18
+
19
+ const browser = await chromium.launch({ headless: true });
20
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
21
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
22
+ await ctx.addInitScript(() => {
23
+ try {
24
+ localStorage.setItem('anet-theme', 'cyber');
25
+ localStorage.setItem('anet-topo-layout', 'ring');
26
+ sessionStorage.setItem('anet_v3_auth', '1');
27
+ } catch {}
28
+ });
29
+ await ctx.route('**/api/hub/status*', async (route) => {
30
+ const r = await route.fetch();
31
+ const b = await r.json();
32
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
33
+ const mk = (alias) => ({
34
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
35
+ network_id: nid, project_dir: null,
36
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
37
+ });
38
+ await route.fulfill({ response: r, json: { ...b, sessions: [
39
+ mk('alpha·1'), mk('alpha·2'), mk('alpha·3'),
40
+ ] } });
41
+ });
42
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
43
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
44
+ const page = await ctx.newPage();
45
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
46
+ await page.waitForSelector('[data-topo-brand-watermark-wrapper]', { timeout: 15000 });
47
+ await page.waitForTimeout(800);
48
+
49
+ // Phase 1: rest
50
+ const rest = await page.evaluate(() => {
51
+ const w = document.querySelector('[data-topo-brand-watermark-wrapper]');
52
+ const t = document.querySelector('[data-topo-brand-watermark]');
53
+ const animate = t?.querySelector('animate');
54
+ return {
55
+ wOpacity: w?.getAttribute('opacity'),
56
+ wRecede: w?.getAttribute('data-topo-brand-watermark-recede'),
57
+ hasAnimate: !!animate,
58
+ textContent: t?.textContent?.trim() || null,
59
+ };
60
+ });
61
+
62
+ // Phase 2: trigger focal-recede via hoveredStatus by hovering the
63
+ // legend `idle` row's label. setHoveredStatus is one of the recede
64
+ // gate vars; the label is a stable hover target (HTML+SVG safe per
65
+ // R518 test path).
66
+ await page.hover('[data-legend-row-label="idle"]');
67
+ await page.waitForTimeout(400);
68
+ const hover = await page.evaluate(() => {
69
+ const w = document.querySelector('[data-topo-brand-watermark-wrapper]');
70
+ return {
71
+ wOpacity: w?.getAttribute('opacity'),
72
+ wRecede: w?.getAttribute('data-topo-brand-watermark-recede'),
73
+ };
74
+ });
75
+
76
+ // Phase 3: physical mouse move far away from any hover target
77
+ await page.mouse.move(900, 50);
78
+ await page.waitForTimeout(400);
79
+ const leave = await page.evaluate(() => {
80
+ const w = document.querySelector('[data-topo-brand-watermark-wrapper]');
81
+ return {
82
+ wOpacity: w?.getAttribute('opacity'),
83
+ wRecede: w?.getAttribute('data-topo-brand-watermark-recede'),
84
+ };
85
+ });
86
+
87
+ await browser.close();
88
+
89
+ // Source regex
90
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
91
+ const sourceWiredOpacity =
92
+ /opacity=\{\(hoveredAlias \|\| hoveredEdgeKey \|\| hoveredGroupLabel \|\|\s*hoveredStatus \|\| hoveredVendor\) && !hoveredHub \? 0\.7 : 1\}/.test(src);
93
+ const sourceWiredAttr =
94
+ /data-topo-brand-watermark-recede=\{\s*\(hoveredAlias \|\| hoveredEdgeKey \|\| hoveredGroupLabel \|\|\s*hoveredStatus \|\| hoveredVendor\) && !hoveredHub \? 'true' : 'false'\s*\}/.test(src);
95
+
96
+ const results = {
97
+ rest_wrapper_opacity_1: rest?.wOpacity === '1',
98
+ rest_recede_false: rest?.wRecede === 'false',
99
+ rest_has_animate: rest?.hasAnimate === true, // R519 SMIL preserved
100
+ rest_text_content: rest?.textContent === 'sleep2agi',
101
+ hover_wrapper_opacity_07: hover?.wOpacity === '0.7',
102
+ hover_recede_true: hover?.wRecede === 'true',
103
+ leave_wrapper_opacity_1: leave?.wOpacity === '1',
104
+ leave_recede_false: leave?.wRecede === 'false',
105
+ source_opacity_wired: sourceWiredOpacity,
106
+ source_attr_wired: sourceWiredAttr,
107
+ };
108
+ const ok = Object.values(results).every(Boolean);
109
+ console.log(`${ok ? '✅' : '❌'} R525 watermark focal-recede:`,
110
+ JSON.stringify(results, null, 2),
111
+ '\n rest:', JSON.stringify(rest),
112
+ '\n hover:', JSON.stringify(hover),
113
+ '\n leave:', JSON.stringify(leave));
114
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,94 @@
1
+ /* Round 687 — working + online chips extend from 4 hover axes (bg/
2
+ * border swap + translate-y + active scale) to add multi-layer halo
3
+ * paint axis. Per-tier tints — green-400 #4ade80 for working chip,
4
+ * cyan-300 #67e8f9 for online chip — match the existing pinnedStatus
5
+ * boxShadow inset rings. 2+4 stride, alpha 80/40. Sibling extension
6
+ * to R686 active-links chip; closes chip-row left-side trio
7
+ * (working + online + active-links) at halo-axis parity.
8
+ *
9
+ * Source assertions:
10
+ * - working chip filter: pal green-400 #4ade80 80/40 2+4 stride
11
+ * - online chip filter: pal cyan-300 #67e8f9 80/40 2+4 stride
12
+ * - both halo-layers attrs toggle '2' ↔ '0' on respective gates
13
+ *
14
+ * Runtime assertions:
15
+ * - both chips present
16
+ * - rest halo-layers='0' on both
17
+ * - mock sessions ensure both chips are interactive (workingCount + onlineNodes > 0)
18
+ */
19
+ import { chromium } from 'playwright';
20
+ import { readFileSync } from 'node:fs';
21
+
22
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
23
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
24
+
25
+ const browser = await chromium.launch({ headless: true });
26
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
27
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
28
+ await ctx.addInitScript(() => {
29
+ try {
30
+ localStorage.setItem('anet-theme', 'cyber');
31
+ localStorage.setItem('anet-topo-layout', 'ring');
32
+ sessionStorage.setItem('anet_v3_auth', '1');
33
+ } catch {}
34
+ });
35
+ await ctx.route('**/api/hub/status*', async (route) => {
36
+ const r = await route.fetch();
37
+ const b = await r.json();
38
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
39
+ const mk = (alias, status) => ({
40
+ alias, status, model: 'claude-opus-4', runtime: 'claude-code-cli',
41
+ network_id: nid, project_dir: null,
42
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
43
+ });
44
+ await route.fulfill({ response: r, json: { ...b, sessions: [
45
+ mk('a·1', 'working'),
46
+ mk('a·2', 'idle'),
47
+ mk('a·3', 'idle'),
48
+ ] } });
49
+ });
50
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
51
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
52
+ const page = await ctx.newPage();
53
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
54
+ await page.waitForSelector('[data-working-chip]', { timeout: 15000, state: 'attached' });
55
+ await page.waitForTimeout(300);
56
+
57
+ const runtimeState = await page.evaluate(() => {
58
+ const working = document.querySelector('[data-working-chip]');
59
+ const online = document.querySelector('[data-online-chip]');
60
+ return {
61
+ working_present: !!working,
62
+ online_present: !!online,
63
+ working_halo: working?.getAttribute('data-working-chip-halo-layers'),
64
+ online_halo: online?.getAttribute('data-online-chip-halo-layers'),
65
+ working_click: working?.getAttribute('data-working-chip-clickable'),
66
+ online_click: online?.getAttribute('data-online-chip-clickable'),
67
+ };
68
+ });
69
+
70
+ await browser.close();
71
+
72
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
73
+ const sourceWorkingFilter = /filter: hoveredStatus === 'working' && workingCount > 0\s*\?\s*'drop-shadow\(0 0 2px #4ade8080\) drop-shadow\(0 0 4px #4ade8040\)'/.test(src);
74
+ const sourceOnlineFilter = /filter: \(hoveredStatus === 'working' \|\| hoveredStatus === 'idle'\) && onlineNodes\.length > 0\s*\?\s*'drop-shadow\(0 0 2px #67e8f980\) drop-shadow\(0 0 4px #67e8f940\)'/.test(src);
75
+ const sourceWorkingAttr = /data-working-chip-halo-layers=\{hoveredStatus === 'working' && workingCount > 0 \? '2' : '0'\}/.test(src);
76
+ const sourceOnlineAttr = /data-online-chip-halo-layers=\{\(hoveredStatus === 'working' \|\| hoveredStatus === 'idle'\) && onlineNodes\.length > 0 \? '2' : '0'\}/.test(src);
77
+
78
+ const results = {
79
+ working_present: runtimeState.working_present,
80
+ online_present: runtimeState.online_present,
81
+ rest_working_layers_0: runtimeState.working_halo === '0',
82
+ rest_online_layers_0: runtimeState.online_halo === '0',
83
+ working_interactive: runtimeState.working_click === 'true',
84
+ online_interactive: runtimeState.online_click === 'true',
85
+ source_working_filter: sourceWorkingFilter,
86
+ source_online_filter: sourceOnlineFilter,
87
+ source_working_attr: sourceWorkingAttr,
88
+ source_online_attr: sourceOnlineAttr,
89
+ };
90
+ const ok = Object.values(results).every(Boolean);
91
+ console.log(`${ok ? '✅' : '❌'} R687 working+online chip multi-layer halo (closes chip-row left-side trio):`,
92
+ JSON.stringify(results, null, 2),
93
+ `\n runtime: ${JSON.stringify(runtimeState)}`);
94
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,94 @@
1
+ /* Round 596 verification: chrome zoom +/- segmented buttons
2
+ * gain hover:brightness-[1.15] via Tailwind class. 35th + 36th
3
+ * anchors in per-element brightness family (4th + 5th HTML).
4
+ * Paired-anchor round closing the zoom control trio.
5
+ *
6
+ * Test phases:
7
+ * 1. mock nodes → chrome zoom buttons render
8
+ * 2. rest: filter='none' (CSS hover-only, no React state)
9
+ * 3. computed transition-property contains 'filter'
10
+ * 4. source: hover:brightness-[1.15] in className + arbitrary
11
+ * transition-property includes filter
12
+ */
13
+ import { chromium } from 'playwright';
14
+ import { readFileSync } from 'node:fs';
15
+
16
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
17
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
18
+
19
+ const browser = await chromium.launch({ headless: true });
20
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
21
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
22
+ await ctx.addInitScript(() => {
23
+ try {
24
+ localStorage.setItem('anet-theme', 'cyber');
25
+ localStorage.setItem('anet-topo-layout', 'ring');
26
+ sessionStorage.setItem('anet_v3_auth', '1');
27
+ } catch {}
28
+ });
29
+ await ctx.route('**/api/hub/status*', async (route) => {
30
+ const r = await route.fetch();
31
+ const b = await r.json();
32
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
33
+ const mk = (alias) => ({
34
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
35
+ network_id: nid, project_dir: null,
36
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
37
+ });
38
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
39
+ });
40
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
41
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
42
+ const page = await ctx.newPage();
43
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
44
+ await page.waitForSelector('[data-topo-chrome-zoom-out]', { timeout: 15000, state: 'attached' });
45
+ await page.waitForTimeout(500);
46
+
47
+ const rest = await page.evaluate(() => {
48
+ const zoomOut = document.querySelector('[data-topo-chrome-zoom-out]');
49
+ const zoomIn = document.querySelector('[data-topo-chrome-zoom-in]');
50
+ if (!zoomOut || !zoomIn) return null;
51
+ return {
52
+ zoomOut: {
53
+ filter: getComputedStyle(zoomOut).filter,
54
+ transitionProperty: getComputedStyle(zoomOut).transitionProperty,
55
+ brightnessHoverAttr: zoomOut.getAttribute('data-topo-chrome-zoom-out-brightness-hover'),
56
+ ariaLabel: zoomOut.getAttribute('aria-label'),
57
+ },
58
+ zoomIn: {
59
+ filter: getComputedStyle(zoomIn).filter,
60
+ transitionProperty: getComputedStyle(zoomIn).transitionProperty,
61
+ brightnessHoverAttr: zoomIn.getAttribute('data-topo-chrome-zoom-in-brightness-hover'),
62
+ ariaLabel: zoomIn.getAttribute('aria-label'),
63
+ },
64
+ };
65
+ });
66
+
67
+ await browser.close();
68
+
69
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
70
+ const sourceOutFilter = /data-topo-chrome-zoom-out[\s\S]*?hover:brightness-\[1\.15\]/.test(src);
71
+ const sourceInFilter = /data-topo-chrome-zoom-in[\s\S]*?hover:brightness-\[1\.15\]/.test(src);
72
+ const sourceOutTransition = /data-topo-chrome-zoom-out[\s\S]*?\[transition-property:color,background-color,transform,filter\]/.test(src);
73
+ const sourceInTransition = /data-topo-chrome-zoom-in[\s\S]*?\[transition-property:color,background-color,transform,filter\]/.test(src);
74
+
75
+ const results = {
76
+ both_buttons_present: !!rest,
77
+ out_rest_filter_none: rest?.zoomOut.filter === 'none',
78
+ in_rest_filter_none: rest?.zoomIn.filter === 'none',
79
+ out_hover_attr: rest?.zoomOut.brightnessHoverAttr === '1.15',
80
+ in_hover_attr: rest?.zoomIn.brightnessHoverAttr === '1.15',
81
+ out_aria_zoom_out: /zoom out/i.test(rest?.zoomOut.ariaLabel || ''),
82
+ in_aria_zoom_in: /zoom in/i.test(rest?.zoomIn.ariaLabel || ''),
83
+ out_transition_filter: /filter/.test(rest?.zoomOut.transitionProperty || ''),
84
+ in_transition_filter: /filter/.test(rest?.zoomIn.transitionProperty || ''),
85
+ source_out_filter: sourceOutFilter,
86
+ source_in_filter: sourceInFilter,
87
+ source_out_transition: sourceOutTransition,
88
+ source_in_transition: sourceInTransition,
89
+ };
90
+ const ok = Object.values(results).every(Boolean);
91
+ console.log(`${ok ? '✅' : '❌'} R596 zoom +/- brightness (35+36th anchors, zoom trio closure):`,
92
+ JSON.stringify(results, null, 2),
93
+ `\n rest: ${JSON.stringify(rest)}`);
94
+ process.exit(ok ? 0 : 1);