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

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 (340) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +3 -3
  3. package/.next/diagnostics/route-bundle-stats.json +7 -7
  4. package/.next/fallback-build-manifest.json +3 -3
  5. package/.next/server/app/_global-error.html +1 -1
  6. package/.next/server/app/_global-error.rsc +1 -1
  7. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  8. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  12. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  13. package/.next/server/app/_not-found.html +2 -2
  14. package/.next/server/app/_not-found.rsc +2 -2
  15. package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  16. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  17. package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  18. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  19. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  20. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  21. package/.next/server/app/admin/page_client-reference-manifest.js +1 -1
  22. package/.next/server/app/admin.html +2 -2
  23. package/.next/server/app/admin.rsc +2 -2
  24. package/.next/server/app/admin.segments/_full.segment.rsc +2 -2
  25. package/.next/server/app/admin.segments/_head.segment.rsc +1 -1
  26. package/.next/server/app/admin.segments/_index.segment.rsc +2 -2
  27. package/.next/server/app/admin.segments/_tree.segment.rsc +2 -2
  28. package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +1 -1
  29. package/.next/server/app/admin.segments/admin.segment.rsc +1 -1
  30. package/.next/server/app/index.html +2 -2
  31. package/.next/server/app/index.rsc +3 -3
  32. package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  33. package/.next/server/app/index.segments/_full.segment.rsc +3 -3
  34. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  35. package/.next/server/app/index.segments/_index.segment.rsc +2 -2
  36. package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  37. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  38. package/.next/server/app/login.html +2 -2
  39. package/.next/server/app/login.rsc +3 -3
  40. package/.next/server/app/login.segments/_full.segment.rsc +3 -3
  41. package/.next/server/app/login.segments/_head.segment.rsc +1 -1
  42. package/.next/server/app/login.segments/_index.segment.rsc +2 -2
  43. package/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  44. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  45. package/.next/server/app/login.segments/login.segment.rsc +1 -1
  46. package/.next/server/app/logs/page_client-reference-manifest.js +1 -1
  47. package/.next/server/app/logs.html +2 -2
  48. package/.next/server/app/logs.rsc +2 -2
  49. package/.next/server/app/logs.segments/_full.segment.rsc +2 -2
  50. package/.next/server/app/logs.segments/_head.segment.rsc +1 -1
  51. package/.next/server/app/logs.segments/_index.segment.rsc +2 -2
  52. package/.next/server/app/logs.segments/_tree.segment.rsc +2 -2
  53. package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +1 -1
  54. package/.next/server/app/logs.segments/logs.segment.rsc +1 -1
  55. package/.next/server/app/messages/page_client-reference-manifest.js +1 -1
  56. package/.next/server/app/messages.html +2 -2
  57. package/.next/server/app/messages.rsc +2 -2
  58. package/.next/server/app/messages.segments/_full.segment.rsc +2 -2
  59. package/.next/server/app/messages.segments/_head.segment.rsc +1 -1
  60. package/.next/server/app/messages.segments/_index.segment.rsc +2 -2
  61. package/.next/server/app/messages.segments/_tree.segment.rsc +2 -2
  62. package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +1 -1
  63. package/.next/server/app/messages.segments/messages.segment.rsc +1 -1
  64. package/.next/server/app/node/page_client-reference-manifest.js +1 -1
  65. package/.next/server/app/node.html +2 -2
  66. package/.next/server/app/node.rsc +2 -2
  67. package/.next/server/app/node.segments/_full.segment.rsc +2 -2
  68. package/.next/server/app/node.segments/_head.segment.rsc +1 -1
  69. package/.next/server/app/node.segments/_index.segment.rsc +2 -2
  70. package/.next/server/app/node.segments/_tree.segment.rsc +2 -2
  71. package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +1 -1
  72. package/.next/server/app/node.segments/node.segment.rsc +1 -1
  73. package/.next/server/app/nodes/page_client-reference-manifest.js +1 -1
  74. package/.next/server/app/nodes.html +2 -2
  75. package/.next/server/app/nodes.rsc +2 -2
  76. package/.next/server/app/nodes.segments/_full.segment.rsc +2 -2
  77. package/.next/server/app/nodes.segments/_head.segment.rsc +1 -1
  78. package/.next/server/app/nodes.segments/_index.segment.rsc +2 -2
  79. package/.next/server/app/nodes.segments/_tree.segment.rsc +2 -2
  80. package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +1 -1
  81. package/.next/server/app/nodes.segments/nodes.segment.rsc +1 -1
  82. package/.next/server/app/page_client-reference-manifest.js +1 -1
  83. package/.next/server/app/server-logs/page_client-reference-manifest.js +1 -1
  84. package/.next/server/app/server-logs.html +2 -2
  85. package/.next/server/app/server-logs.rsc +2 -2
  86. package/.next/server/app/server-logs.segments/_full.segment.rsc +2 -2
  87. package/.next/server/app/server-logs.segments/_head.segment.rsc +1 -1
  88. package/.next/server/app/server-logs.segments/_index.segment.rsc +2 -2
  89. package/.next/server/app/server-logs.segments/_tree.segment.rsc +2 -2
  90. package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +1 -1
  91. package/.next/server/app/server-logs.segments/server-logs.segment.rsc +1 -1
  92. package/.next/server/app/settings/networks/page_client-reference-manifest.js +1 -1
  93. package/.next/server/app/settings/networks.html +2 -2
  94. package/.next/server/app/settings/networks.rsc +2 -2
  95. package/.next/server/app/settings/networks.segments/_full.segment.rsc +2 -2
  96. package/.next/server/app/settings/networks.segments/_head.segment.rsc +1 -1
  97. package/.next/server/app/settings/networks.segments/_index.segment.rsc +2 -2
  98. package/.next/server/app/settings/networks.segments/_tree.segment.rsc +2 -2
  99. package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +1 -1
  100. package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +1 -1
  101. package/.next/server/app/settings/networks.segments/settings.segment.rsc +1 -1
  102. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  103. package/.next/server/app/settings/tokens/page_client-reference-manifest.js +1 -1
  104. package/.next/server/app/settings/tokens.html +2 -2
  105. package/.next/server/app/settings/tokens.rsc +2 -2
  106. package/.next/server/app/settings/tokens.segments/_full.segment.rsc +2 -2
  107. package/.next/server/app/settings/tokens.segments/_head.segment.rsc +1 -1
  108. package/.next/server/app/settings/tokens.segments/_index.segment.rsc +2 -2
  109. package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +2 -2
  110. package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +1 -1
  111. package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +1 -1
  112. package/.next/server/app/settings/tokens.segments/settings.segment.rsc +1 -1
  113. package/.next/server/app/settings.html +2 -2
  114. package/.next/server/app/settings.rsc +3 -3
  115. package/.next/server/app/settings.segments/_full.segment.rsc +3 -3
  116. package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  117. package/.next/server/app/settings.segments/_index.segment.rsc +2 -2
  118. package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  119. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +2 -2
  120. package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  121. package/.next/server/app/tasks/[id]/page_client-reference-manifest.js +1 -1
  122. package/.next/server/app/tasks/page_client-reference-manifest.js +1 -1
  123. package/.next/server/app/tasks.html +2 -2
  124. package/.next/server/app/tasks.rsc +2 -2
  125. package/.next/server/app/tasks.segments/_full.segment.rsc +2 -2
  126. package/.next/server/app/tasks.segments/_head.segment.rsc +1 -1
  127. package/.next/server/app/tasks.segments/_index.segment.rsc +2 -2
  128. package/.next/server/app/tasks.segments/_tree.segment.rsc +2 -2
  129. package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +1 -1
  130. package/.next/server/app/tasks.segments/tasks.segment.rsc +1 -1
  131. package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js +1 -1
  132. package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js.map +1 -1
  133. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js +4 -4
  134. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js.map +1 -1
  135. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js +1 -1
  136. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js.map +1 -1
  137. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js +1 -1
  138. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js.map +1 -1
  139. package/.next/server/middleware-build-manifest.js +3 -3
  140. package/.next/server/pages/404.html +2 -2
  141. package/.next/server/pages/500.html +1 -1
  142. package/.next/static/chunks/{0bh3bd_k4cou9.js → 08.p955zvm-z-.js} +1 -1
  143. package/.next/static/chunks/0a3myvz04olik.js +1 -0
  144. package/.next/static/chunks/0mdrwmj6j8tr9.js +1 -0
  145. package/.next/static/chunks/0xxjzk4uj.8js.js +4 -0
  146. package/.next/static/chunks/17if82x7mcn4j.css +2 -0
  147. package/.next/trace +2 -2
  148. package/.next/trace-build +1 -1
  149. package/app/components/TopoGraph.tsx +4990 -178
  150. package/app/globals.css +144 -7
  151. package/package.json +4 -4
  152. package/scripts/topo-active-chrome-hover-text-test.mjs +107 -0
  153. package/scripts/topo-active-links-chip-halo-layers-test.mjs +81 -0
  154. package/scripts/topo-alias-chat-brightness-test.mjs +79 -0
  155. package/scripts/topo-alias-text-halo-layers-test.mjs +98 -0
  156. package/scripts/topo-avatar-chat-gate-test.mjs +77 -0
  157. package/scripts/topo-avatar-drop-shadow-test.mjs +86 -0
  158. package/scripts/topo-avatar-fallback-hover-test.mjs +104 -0
  159. package/scripts/topo-avatar-fallback-rotate-test.mjs +92 -0
  160. package/scripts/topo-avatar-rotate-test.mjs +85 -0
  161. package/scripts/topo-avatar-scale-test.mjs +89 -0
  162. package/scripts/topo-badge-chat-gate-test.mjs +74 -0
  163. package/scripts/topo-brand-drop-shadow-test.mjs +71 -0
  164. package/scripts/topo-brand-logo-breath-test.mjs +102 -0
  165. package/scripts/topo-brand-logo-halo-layers-test.mjs +85 -0
  166. package/scripts/topo-brand-logo-hover-brightness-test.mjs +105 -0
  167. package/scripts/topo-brand-logo-hover-rotate-test.mjs +93 -0
  168. package/scripts/topo-brand-logo-hover-test.mjs +85 -0
  169. package/scripts/topo-card-chat-brightness-test.mjs +86 -0
  170. package/scripts/topo-chat-ring-breath-curve-test.mjs +114 -0
  171. package/scripts/topo-chat-ring-brightness-test.mjs +80 -0
  172. package/scripts/topo-chat-ring-halo-layers-test.mjs +100 -0
  173. package/scripts/topo-chat-ring-r-breath-test.mjs +121 -0
  174. package/scripts/topo-chat-ring-status-halo-test.mjs +106 -0
  175. package/scripts/topo-chat-ring-sw-breath-test.mjs +123 -0
  176. package/scripts/topo-chip-row-digit-ls-test.mjs +135 -0
  177. package/scripts/topo-chip-row-member-alias-lit-test.mjs +154 -0
  178. package/scripts/topo-chip-row-tier-glow-brightness-test.mjs +99 -0
  179. package/scripts/topo-chip-row-unit-hover-tracking-test.mjs +124 -0
  180. package/scripts/topo-chrome-control-halo-layers-test.mjs +22 -0
  181. package/scripts/topo-click-ripple-glow-test.mjs +86 -0
  182. package/scripts/topo-click-ripple-halo-layers-test.mjs +79 -0
  183. package/scripts/topo-click-ripple-sw-test.mjs +110 -0
  184. package/scripts/topo-cluster-count-attr-test.mjs +80 -0
  185. package/scripts/topo-crescent-breath-test.mjs +104 -0
  186. package/scripts/topo-crescent-recede-test.mjs +111 -0
  187. package/scripts/topo-dense-alias-halo-layers-test.mjs +80 -0
  188. package/scripts/topo-edge-badge-circle-brightness-test.mjs +82 -0
  189. package/scripts/topo-edge-badge-circle-hot-pulse-test.mjs +100 -0
  190. package/scripts/topo-edge-badge-digit-halo-layers-test.mjs +107 -0
  191. package/scripts/topo-edge-badge-endpoint-gate-test.mjs +94 -0
  192. package/scripts/topo-edge-badge-halo-layers-test.mjs +85 -0
  193. package/scripts/topo-edge-badge-hot-pulse-test.mjs +92 -0
  194. package/scripts/topo-edge-badge-hover-glow-test.mjs +90 -0
  195. package/scripts/topo-edge-badge-text-brightness-test.mjs +83 -0
  196. package/scripts/topo-edge-chat-gate-test.mjs +71 -0
  197. package/scripts/topo-edge-flow-rail-halo-layers-test.mjs +89 -0
  198. package/scripts/topo-edge-particle-brightness-test.mjs +82 -0
  199. package/scripts/topo-edge-particle-halo-layers-test.mjs +91 -0
  200. package/scripts/topo-edge-pill-glow-test.mjs +67 -0
  201. package/scripts/topo-edge-visible-brightness-test.mjs +84 -0
  202. package/scripts/topo-edge-visible-halo-layers-test.mjs +87 -0
  203. package/scripts/topo-endpoint-ring-brightness-test.mjs +83 -0
  204. package/scripts/topo-endpoint-ring-flow-halo-test.mjs +107 -0
  205. package/scripts/topo-endpoint-ring-halo-layers-test.mjs +100 -0
  206. package/scripts/topo-filter-pill-glow-test.mjs +90 -0
  207. package/scripts/topo-filter-pill-halo-layers-test.mjs +27 -0
  208. package/scripts/topo-flow-arrow-brightness-test.mjs +82 -0
  209. package/scripts/topo-flow-rail-brightness-test.mjs +80 -0
  210. package/scripts/topo-fullscreen-attr-test.mjs +73 -0
  211. package/scripts/topo-fullscreen-brightness-test.mjs +84 -0
  212. package/scripts/topo-fullscreen-icon-rotate-test.mjs +93 -0
  213. package/scripts/topo-grid-content-bottom-attr-test.mjs +72 -0
  214. package/scripts/topo-group-box-brightness-test.mjs +84 -0
  215. package/scripts/topo-group-box-halo-layers-test.mjs +91 -0
  216. package/scripts/topo-group-chat-gate-test.mjs +77 -0
  217. package/scripts/topo-group-label-brightness-test.mjs +84 -0
  218. package/scripts/topo-group-label-halo-layers-test.mjs +78 -0
  219. package/scripts/topo-group-label-hover-glow-test.mjs +86 -0
  220. package/scripts/topo-group-label-member-alias-hover-test.mjs +125 -0
  221. package/scripts/topo-group-pill-glow-test.mjs +76 -0
  222. package/scripts/topo-group-tint-brightness-test.mjs +82 -0
  223. package/scripts/topo-halo-chat-gate-test.mjs +72 -0
  224. package/scripts/topo-hub-core-brightness-test.mjs +82 -0
  225. package/scripts/topo-hub-core-halo-layers-test.mjs +81 -0
  226. package/scripts/topo-hub-digit-brightness-test.mjs +79 -0
  227. package/scripts/topo-hub-digit-halo-layers-test.mjs +76 -0
  228. package/scripts/topo-hub-digit-ls-test.mjs +119 -0
  229. package/scripts/topo-hub-halo-brightness-test.mjs +80 -0
  230. package/scripts/topo-hub-halo-glow-test.mjs +96 -0
  231. package/scripts/topo-hub-halo-halo-layers-test.mjs +76 -0
  232. package/scripts/topo-hub-highlight-amplify-test.mjs +139 -0
  233. package/scripts/topo-hub-highlight-brightness-test.mjs +84 -0
  234. package/scripts/topo-hub-highlight-fill-transition-test.mjs +84 -0
  235. package/scripts/topo-hub-highlight-glow-test.mjs +99 -0
  236. package/scripts/topo-hub-highlight-halo-layers-test.mjs +78 -0
  237. package/scripts/topo-hub-highlight-r-test.mjs +112 -0
  238. package/scripts/topo-hub-highlight-recede-test.mjs +144 -0
  239. package/scripts/topo-hub-highlight-theme-fill-test.mjs +83 -0
  240. package/scripts/topo-hub-hover-ring-brightness-test.mjs +79 -0
  241. package/scripts/topo-hub-hover-ring-glow-test.mjs +97 -0
  242. package/scripts/topo-hub-hover-ring-halo-layers-test.mjs +71 -0
  243. package/scripts/topo-hub-idle-breath-test.mjs +7 -2
  244. package/scripts/topo-hub-recede-test.mjs +124 -0
  245. package/scripts/topo-hub-spoke-brightness-test.mjs +77 -0
  246. package/scripts/topo-hub-spoke-glow-test.mjs +112 -0
  247. package/scripts/topo-hub-spoke-halo-layers-test.mjs +97 -0
  248. package/scripts/topo-hub-spoke-self-filter-test.mjs +119 -0
  249. package/scripts/topo-kicker-halo-layers-test.mjs +82 -0
  250. package/scripts/topo-label-card-brightness-test.mjs +81 -0
  251. package/scripts/topo-layout-hover-fw-test.mjs +98 -0
  252. package/scripts/topo-layout-toggle-brightness-test.mjs +94 -0
  253. package/scripts/topo-layout-toggle-halo-layers-test.mjs +95 -0
  254. package/scripts/topo-legend-count-brightness-test.mjs +80 -0
  255. package/scripts/topo-legend-count-halo-layers-test.mjs +79 -0
  256. package/scripts/topo-legend-count-letter-spacing-test.mjs +108 -0
  257. package/scripts/topo-legend-label-fw-test.mjs +107 -0
  258. package/scripts/topo-legend-pin-ring-brightness-test.mjs +82 -0
  259. package/scripts/topo-legend-pin-ring-halo-layers-test.mjs +71 -0
  260. package/scripts/topo-legend-row-count-brightness-test.mjs +85 -0
  261. package/scripts/topo-legend-row-label-glow-test.mjs +102 -0
  262. package/scripts/topo-legend-swatch-glow-test.mjs +109 -0
  263. package/scripts/topo-legend-swatch-member-alias-match-test.mjs +139 -0
  264. package/scripts/topo-legend-tint-brightness-test.mjs +83 -0
  265. package/scripts/topo-legend-trio-halo-layers-test.mjs +22 -0
  266. package/scripts/topo-minimap-dot-chat-gate-test.mjs +81 -0
  267. package/scripts/topo-minimap-hover-glow-test.mjs +109 -0
  268. package/scripts/topo-minimap-viewport-brightness-test.mjs +84 -0
  269. package/scripts/topo-minimap-viewport-halo-layers-test.mjs +24 -0
  270. package/scripts/topo-more-footer-brightness-test.mjs +94 -0
  271. package/scripts/topo-node-alias-brightness-test.mjs +84 -0
  272. package/scripts/topo-node-avatar-halo-layers-test.mjs +25 -0
  273. package/scripts/topo-node-hover-ring-halo-layers-test.mjs +70 -0
  274. package/scripts/topo-node-sub-text-brightness-test.mjs +88 -0
  275. package/scripts/topo-nodesize-brightness-test.mjs +82 -0
  276. package/scripts/topo-nodesize-halo-layers-test.mjs +89 -0
  277. package/scripts/topo-nodesize-hover-fw-test.mjs +99 -0
  278. package/scripts/topo-orphan-label-opacity-test.mjs +98 -0
  279. package/scripts/topo-panel-count-halo-layers-test.mjs +91 -0
  280. package/scripts/topo-panel-count-hover-ls-test.mjs +87 -0
  281. package/scripts/topo-panel-row-brightness-test.mjs +116 -0
  282. package/scripts/topo-panel-title-brightness-test.mjs +98 -0
  283. package/scripts/topo-panel-title-glow-test.mjs +111 -0
  284. package/scripts/topo-panel-titles-halo-layers-test.mjs +23 -0
  285. package/scripts/topo-pill-x-rotate-test.mjs +96 -0
  286. package/scripts/topo-pip-brightness-test.mjs +85 -0
  287. package/scripts/topo-pressure-bar-halo-layers-test.mjs +19 -0
  288. package/scripts/topo-pressure-seg-glow-test.mjs +92 -0
  289. package/scripts/topo-pressure-seg-member-alias-match-test.mjs +133 -0
  290. package/scripts/topo-pressure-seg-motion-test.mjs +101 -0
  291. package/scripts/topo-recent-count-brightness-test.mjs +84 -0
  292. package/scripts/topo-recent-more-fw-test.mjs +126 -0
  293. package/scripts/topo-recent-more-halo-layers-test.mjs +90 -0
  294. package/scripts/topo-recent-panel-hot-pulse-test.mjs +105 -0
  295. package/scripts/topo-recent-pip-halo-layers-test.mjs +82 -0
  296. package/scripts/topo-recent-row-chat-gate-test.mjs +75 -0
  297. package/scripts/topo-recent-row-content-lift-test.mjs +140 -0
  298. package/scripts/topo-recent-row-fw-test.mjs +115 -0
  299. package/scripts/topo-recent-row-text-glow-test.mjs +86 -0
  300. package/scripts/topo-recent-row-text-halo-layers-test.mjs +67 -0
  301. package/scripts/topo-recent-tint-brightness-test.mjs +80 -0
  302. package/scripts/topo-recent-ts-brightness-test.mjs +86 -0
  303. package/scripts/topo-reduced-motion-attr-test.mjs +69 -0
  304. package/scripts/topo-reset-brightness-test.mjs +83 -0
  305. package/scripts/topo-reset-icon-hover-scale-test.mjs +102 -0
  306. package/scripts/topo-runtime-badge-brightness-test.mjs +78 -0
  307. package/scripts/topo-runtime-badge-glow-test.mjs +108 -0
  308. package/scripts/topo-runtime-badge-halo-layers-test.mjs +87 -0
  309. package/scripts/topo-runtime-badge-rotate-test.mjs +85 -0
  310. package/scripts/topo-section-title-halo-layers-test.mjs +88 -0
  311. package/scripts/topo-spoke-chat-gate-test.mjs +72 -0
  312. package/scripts/topo-starfield-hue-test.mjs +109 -0
  313. package/scripts/topo-status-pin-pill-halo-layers-test.mjs +17 -0
  314. package/scripts/topo-status-ring-brightness-test.mjs +84 -0
  315. package/scripts/topo-status-ring-chat-gate-test.mjs +72 -0
  316. package/scripts/topo-status-ring-halo-layers-test.mjs +105 -0
  317. package/scripts/topo-status-ring-status-halo-test.mjs +110 -0
  318. package/scripts/topo-sub-text-chat-brightness-test.mjs +81 -0
  319. package/scripts/topo-titleblock-h2-hover-fw-test.mjs +109 -0
  320. package/scripts/topo-titleblock-h2-hover-tracking-test.mjs +128 -0
  321. package/scripts/topo-titleblock-kicker-hover-test.mjs +134 -0
  322. package/scripts/topo-vendor-chip-glow-test.mjs +97 -0
  323. package/scripts/topo-vendor-chip-halo-layers-test.mjs +18 -0
  324. package/scripts/topo-vendor-letter-halo-layers-test.mjs +93 -0
  325. package/scripts/topo-vendor-pill-glow-test.mjs +98 -0
  326. package/scripts/topo-watermark-breath-test.mjs +100 -0
  327. package/scripts/topo-watermark-recede-test.mjs +114 -0
  328. package/scripts/topo-working-online-chip-halo-layers-test.mjs +94 -0
  329. package/scripts/topo-zoom-buttons-brightness-test.mjs +94 -0
  330. package/scripts/topo-zoom-in-out-halo-layers-test.mjs +97 -0
  331. package/scripts/topo-zoom-level-brightness-test.mjs +83 -0
  332. package/scripts/topo-zoom-level-color-test.mjs +105 -0
  333. package/scripts/topo-zoom-level-halo-layers-test.mjs +78 -0
  334. package/.next/static/chunks/0.s1q59.w46yn.js +0 -4
  335. package/.next/static/chunks/06f643qjk~ayp.js +0 -1
  336. package/.next/static/chunks/0m-5_1vuw.lxb.js +0 -1
  337. package/.next/static/chunks/0m.1mvl~t.avc.css +0 -2
  338. /package/.next/static/{D60rGoeOKUed7uGrc-7wS → IANqjY6wNx4TFsHE-0g9m}/_buildManifest.js +0 -0
  339. /package/.next/static/{D60rGoeOKUed7uGrc-7wS → IANqjY6wNx4TFsHE-0g9m}/_clientMiddlewareManifest.js +0 -0
  340. /package/.next/static/{D60rGoeOKUed7uGrc-7wS → IANqjY6wNx4TFsHE-0g9m}/_ssgManifest.js +0 -0
@@ -0,0 +1,102 @@
1
+ /* Round 553 verification: title-block brand logo gains subtle idle
2
+ * opacity breath (0.92 ↔ 1, 5s cycle). 5th anchor in the 呼吸感
3
+ * breath family.
4
+ *
5
+ * Test phases:
6
+ * 1. brand-logo className contains 'anet-topo-brand-logo-breath'
7
+ * 2. data-topo-brand-logo-breath="true" attr present
8
+ * 3. computed animation-name === 'anet-topo-brand-logo-breath-kf'
9
+ * (paused or running)
10
+ * 4. computed animation-duration === '5s'
11
+ * 5. source-side regex confirms keyframe + class + componentJSX
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')] } });
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-brand-logo]', { timeout: 15000 });
45
+ await page.waitForTimeout(500);
46
+
47
+ const sel = '[data-topo-brand-logo]';
48
+ const probe = await page.evaluate((s) => {
49
+ const el = document.querySelector(s);
50
+ if (!el) return null;
51
+ const cs = getComputedStyle(el);
52
+ return {
53
+ breathAttr: el.getAttribute('data-topo-brand-logo-breath'),
54
+ hasBreathClass: el.classList.contains('anet-topo-brand-logo-breath'),
55
+ animationName: cs.animationName,
56
+ animationDuration: cs.animationDuration,
57
+ animationIterationCount: cs.animationIterationCount,
58
+ animationTimingFunction: cs.animationTimingFunction,
59
+ // Sample opacity twice across ~1.5s to confirm it's actually changing
60
+ opacityNow: parseFloat(cs.opacity),
61
+ };
62
+ }, sel);
63
+
64
+ // Sample opacity at 3 timepoints across the 5s breath cycle
65
+ await page.waitForTimeout(500);
66
+ const opacity_t1 = await page.evaluate((s) => parseFloat(getComputedStyle(document.querySelector(s)).opacity), sel);
67
+ await page.waitForTimeout(900);
68
+ const opacity_t2 = await page.evaluate((s) => parseFloat(getComputedStyle(document.querySelector(s)).opacity), sel);
69
+ await page.waitForTimeout(900);
70
+ const opacity_t3 = await page.evaluate((s) => parseFloat(getComputedStyle(document.querySelector(s)).opacity), sel);
71
+
72
+ await browser.close();
73
+
74
+ const css = readFileSync('/home/vansin/agent-network-dashboard/app/globals.css', 'utf8');
75
+ const tsx = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
76
+ const sourceKeyframe = /@keyframes anet-topo-brand-logo-breath-kf/.test(css);
77
+ const sourceClass = /\.anet-topo-brand-logo-breath\s*\{[^}]*animation: anet-topo-brand-logo-breath-kf 5s ease-in-out infinite/.test(css);
78
+ const sourceComponent = /\!reducedMotion \? ' anet-topo-brand-logo-breath' : ''/.test(tsx);
79
+ const sourceAttr = /data-topo-brand-logo-breath=\{!reducedMotion \? 'true' : 'false'\}/.test(tsx);
80
+
81
+ // Opacity should oscillate; not all 3 samples identical
82
+ const opacityVaries = new Set([opacity_t1, opacity_t2, opacity_t3].map(o => o.toFixed(3))).size > 1;
83
+
84
+ const results = {
85
+ breath_attr: probe?.breathAttr === 'true',
86
+ has_breath_class: probe?.hasBreathClass === true,
87
+ animation_name_match: probe?.animationName === 'anet-topo-brand-logo-breath-kf',
88
+ animation_duration_5s: probe?.animationDuration === '5s',
89
+ animation_iteration_infinite: probe?.animationIterationCount === 'infinite',
90
+ animation_timing_ease_in_out: probe?.animationTimingFunction === 'ease-in-out',
91
+ opacity_varies_over_time: opacityVaries,
92
+ source_keyframe: sourceKeyframe,
93
+ source_class: sourceClass,
94
+ source_component: sourceComponent,
95
+ source_attr: sourceAttr,
96
+ };
97
+ const ok = Object.values(results).every(Boolean);
98
+ console.log(`${ok ? '✅' : '❌'} R553 brand-logo idle breath (5th anchor in 呼吸感 family):`,
99
+ JSON.stringify(results, null, 2),
100
+ '\n probe:', JSON.stringify(probe),
101
+ `\n opacity samples: ${opacity_t1.toFixed(3)} → ${opacity_t2.toFixed(3)} → ${opacity_t3.toFixed(3)}`);
102
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,85 @@
1
+ /* Round 683 — brand 书生 logo extends single-layer drop-shadow hover
2
+ * (R604, Tailwind `hover:drop-shadow-[0_0_8px_currentColor]`) to the
3
+ * multi-layer halo family by replacing the Tailwind utility with a
4
+ * custom CSS class `.anet-topo-brand-logo-mark` that applies near 8px
5
+ * + far 16px (2× blur stride) drop-shadow at currentColor (inherits
6
+ * teal #0d9488 / cyan #67e8f9 per inline style.color) + brightness(1.10)
7
+ * via `:hover` pseudo-class — no React state needed.
8
+ *
9
+ * Source assertions:
10
+ * - globals.css: .anet-topo-brand-logo-mark:hover with 2 drop-shadow
11
+ * - TopoGraph.tsx: className includes anet-topo-brand-logo-mark
12
+ * - TopoGraph.tsx: hover:drop-shadow / hover:brightness REMOVED from
13
+ * the className (replaced by the CSS class)
14
+ *
15
+ * Runtime assertions:
16
+ * - brand logo SVG present in /login or root (renders pre-auth too)
17
+ * - className contains anet-topo-brand-logo-mark
18
+ * - data-topo-brand-logo-halo-layers="2" attr present
19
+ */
20
+ import { chromium } from 'playwright';
21
+ import { readFileSync } from 'node:fs';
22
+
23
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
24
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
25
+
26
+ const browser = await chromium.launch({ headless: true });
27
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
28
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
29
+ await ctx.addInitScript(() => {
30
+ try {
31
+ localStorage.setItem('anet-theme', 'cyber');
32
+ localStorage.setItem('anet-topo-layout', 'ring');
33
+ sessionStorage.setItem('anet_v3_auth', '1');
34
+ } catch {}
35
+ });
36
+ await ctx.route('**/api/hub/status*', async (route) => {
37
+ const r = await route.fetch();
38
+ const b = await r.json();
39
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
40
+ const mk = (alias) => ({
41
+ alias, status: 'idle', model: 'claude-opus-4', 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: [mk('a·1'), mk('a·2')] } });
46
+ });
47
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
48
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
49
+ const page = await ctx.newPage();
50
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
51
+ await page.waitForSelector('[data-topo-brand-logo]', { timeout: 15000, state: 'attached' });
52
+ await page.waitForTimeout(300);
53
+
54
+ const runtimeState = await page.evaluate(() => {
55
+ const el = document.querySelector('[data-topo-brand-logo]');
56
+ return el ? {
57
+ haloLayers: el.getAttribute('data-topo-brand-logo-halo-layers'),
58
+ classes: el.getAttribute('class'),
59
+ } : null;
60
+ });
61
+
62
+ await browser.close();
63
+
64
+ const tsxSrc = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
65
+ const cssSrc = readFileSync('/home/vansin/agent-network-dashboard/app/globals.css', 'utf8');
66
+
67
+ const cssClassDefined = /\.anet-topo-brand-logo-mark:hover\s*\{[\s\S]*?drop-shadow\(0 0 8px currentColor\)[\s\S]*?drop-shadow\(0 0 16px currentColor\)[\s\S]*?brightness\(1\.10\)/.test(cssSrc);
68
+ const tsxClassAdded = /className=\{`anet-topo-brand-logo-mark/.test(tsxSrc);
69
+ const tailwindRemoved = !/hover:brightness-110 hover:drop-shadow-\[0_0_8px_currentColor\]/.test(tsxSrc);
70
+ const hasHaloAttr = /data-topo-brand-logo-halo-layers="2"/.test(tsxSrc);
71
+
72
+ const results = {
73
+ brand_logo_present: !!runtimeState,
74
+ has_class_runtime: !!runtimeState?.classes && /anet-topo-brand-logo-mark/.test(runtimeState.classes),
75
+ halo_layers_runtime: runtimeState?.haloLayers === '2',
76
+ css_class_defined: cssClassDefined,
77
+ tsx_class_added: tsxClassAdded,
78
+ tsx_tailwind_removed: tailwindRemoved,
79
+ tsx_halo_attr: hasHaloAttr,
80
+ };
81
+ const ok = Object.values(results).every(Boolean);
82
+ console.log(`${ok ? '✅' : '❌'} R683 brand logo multi-layer halo (first brand-mark anchor):`,
83
+ JSON.stringify(results, null, 2),
84
+ `\n runtime: ${JSON.stringify(runtimeState)}`);
85
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,105 @@
1
+ /* Round 557 verification: title-block brand logo gains 4th hover
2
+ * axis — hover:brightness-110 (filter). Composes with R548 scale +
3
+ * R549 rotate + R553 idle breath.
4
+ *
5
+ * Test phases:
6
+ * 1. rest: filter = 'none' (no brightness on idle, breath uses opacity)
7
+ * 2. hover: filter contains 'brightness(1.1)' (or similar)
8
+ * 3. data-attr present
9
+ * 4. source: className contains hover:brightness-110 and
10
+ * transition-[transform,filter]
11
+ *
12
+ * R553 breath uses opacity, NOT filter — so filter stays clean at
13
+ * rest. On hover, Tailwind adds filter: brightness(1.1).
14
+ */
15
+ import { chromium } from 'playwright';
16
+ import { readFileSync } from 'node:fs';
17
+
18
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
19
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
20
+
21
+ const browser = await chromium.launch({ headless: true });
22
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
23
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
24
+ await ctx.addInitScript(() => {
25
+ try {
26
+ localStorage.setItem('anet-theme', 'cyber');
27
+ localStorage.setItem('anet-topo-layout', 'ring');
28
+ sessionStorage.setItem('anet_v3_auth', '1');
29
+ } catch {}
30
+ });
31
+ await ctx.route('**/api/hub/status*', async (route) => {
32
+ const r = await route.fetch();
33
+ const b = await r.json();
34
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
35
+ const mk = (alias) => ({
36
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
37
+ network_id: nid, project_dir: null,
38
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
39
+ });
40
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1')] } });
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-logo]', { timeout: 15000 });
47
+ await page.waitForTimeout(500);
48
+
49
+ const sel = '[data-topo-brand-logo]';
50
+ const rest = await page.evaluate((s) => {
51
+ const el = document.querySelector(s);
52
+ if (!el) return null;
53
+ const cs = getComputedStyle(el);
54
+ return {
55
+ filter: cs.filter,
56
+ transitionProperty: cs.transitionProperty,
57
+ transitionDuration: cs.transitionDuration,
58
+ hoverBrightnessAttr: el.getAttribute('data-topo-brand-logo-hover-brightness'),
59
+ };
60
+ }, sel);
61
+
62
+ await page.hover(sel);
63
+ await page.waitForTimeout(400);
64
+ const hover = await page.evaluate((s) => {
65
+ const el = document.querySelector(s);
66
+ if (!el) return null;
67
+ const cs = getComputedStyle(el);
68
+ return {
69
+ filter: cs.filter,
70
+ scale: cs.scale,
71
+ rotate: cs.rotate,
72
+ };
73
+ }, sel);
74
+
75
+ await browser.close();
76
+
77
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
78
+ const sourceClassname = /hover:brightness-110/.test(src);
79
+ const sourceTransition = /transition-\[transform,filter\] duration-200 ease-out hover:scale-105 hover:rotate-6 hover:brightness-110/.test(src);
80
+ const sourceAttr = /data-topo-brand-logo-hover-brightness="1\.1"/.test(src);
81
+
82
+ const results = {
83
+ rest_filter_none: rest?.filter === 'none',
84
+ rest_brightness_attr: rest?.hoverBrightnessAttr === '1.1',
85
+ // Computed filter on hover should contain brightness(1.1) — handle
86
+ // both raw and serialized forms.
87
+ hover_filter_brightness: /brightness\(1\.1\)/.test(hover?.filter || ''),
88
+ hover_scale_still_105: hover?.scale === '1.05',
89
+ hover_rotate_still_6: hover?.rotate === '6deg',
90
+ transition_has_transform: /transform/.test(rest?.transitionProperty || ''),
91
+ transition_has_filter: /filter/.test(rest?.transitionProperty || ''),
92
+ // 3 axes (color + transform + filter) → '0.2s, 0.2s, 0.2s'
93
+ transition_duration: /^0\.2s(,\s*0\.2s)*$/.test(rest?.transitionDuration || ''),
94
+ source_classname: sourceClassname,
95
+ source_transition_list: sourceTransition,
96
+ source_attr: sourceAttr,
97
+ };
98
+ const ok = Object.values(results).every(Boolean);
99
+ console.log(`${ok ? '✅' : '❌'} R557 brand-logo hover:brightness-110 (4th axis):`,
100
+ JSON.stringify(results, null, 2),
101
+ `\n rest filter: ${rest?.filter}`,
102
+ `\n hover filter: ${hover?.filter}`,
103
+ `\n hover scale: ${hover?.scale}, rotate: ${hover?.rotate}`,
104
+ `\n transition: ${rest?.transitionProperty}`);
105
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,93 @@
1
+ /* Round 549 verification: title-block brand logo gains hover:rotate-6
2
+ * paired with R548's hover:scale-105. Banked R547 Tailwind 4 pattern —
3
+ * probe BOTH cs.scale AND cs.rotate (individual CSS properties, not
4
+ * combined transform).
5
+ *
6
+ * Test phases:
7
+ * 1. rest: scale='none' (or '1'), rotate='none' (or '0deg')
8
+ * 2. hover: scale='1.05', rotate='6deg'
9
+ * 3. source-side regex confirms className + data-attr wired
10
+ */
11
+ import { chromium } from 'playwright';
12
+ import { readFileSync } from 'node:fs';
13
+
14
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
15
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
16
+
17
+ const browser = await chromium.launch({ headless: true });
18
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
19
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
20
+ await ctx.addInitScript(() => {
21
+ try {
22
+ localStorage.setItem('anet-theme', 'cyber');
23
+ localStorage.setItem('anet-topo-layout', 'ring');
24
+ sessionStorage.setItem('anet_v3_auth', '1');
25
+ } catch {}
26
+ });
27
+ await ctx.route('**/api/hub/status*', async (route) => {
28
+ const r = await route.fetch();
29
+ const b = await r.json();
30
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
31
+ const mk = (alias) => ({
32
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
33
+ network_id: nid, project_dir: null,
34
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
35
+ });
36
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1')] } });
37
+ });
38
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
39
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
40
+ const page = await ctx.newPage();
41
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
42
+ await page.waitForSelector('[data-topo-brand-logo]', { timeout: 15000 });
43
+ await page.waitForTimeout(500);
44
+
45
+ const sel = '[data-topo-brand-logo]';
46
+ const rest = await page.evaluate((s) => {
47
+ const el = document.querySelector(s);
48
+ if (!el) return null;
49
+ const cs = getComputedStyle(el);
50
+ return {
51
+ attrScale: el.getAttribute('data-topo-brand-logo-hover-scale'),
52
+ attrRotate: el.getAttribute('data-topo-brand-logo-hover-rotate'),
53
+ scale: cs.scale,
54
+ rotate: cs.rotate,
55
+ };
56
+ }, sel);
57
+
58
+ await page.hover(sel);
59
+ await page.waitForTimeout(400);
60
+ const hover = await page.evaluate((s) => {
61
+ const el = document.querySelector(s);
62
+ if (!el) return null;
63
+ const cs = getComputedStyle(el);
64
+ return { scale: cs.scale, rotate: cs.rotate };
65
+ }, sel);
66
+
67
+ await browser.close();
68
+
69
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
70
+ const sourceClassNameWired =
71
+ /className="shrink-0 transition-transform duration-200 ease-out hover:scale-105 hover:rotate-6 transform-gpu"/.test(src);
72
+ const sourceScaleAttrWired =
73
+ /data-topo-brand-logo-hover-scale="1\.05"/.test(src);
74
+ const sourceRotateAttrWired =
75
+ /data-topo-brand-logo-hover-rotate="6deg"/.test(src);
76
+
77
+ const results = {
78
+ rest_scale_idle: rest?.scale === 'none' || rest?.scale === '1',
79
+ rest_rotate_idle: rest?.rotate === 'none' || rest?.rotate === '0deg',
80
+ rest_attr_scale_105: rest?.attrScale === '1.05',
81
+ rest_attr_rotate_6deg: rest?.attrRotate === '6deg',
82
+ hover_scale_105: hover?.scale === '1.05',
83
+ hover_rotate_6deg: hover?.rotate === '6deg',
84
+ source_classname: sourceClassNameWired,
85
+ source_scale_attr: sourceScaleAttrWired,
86
+ source_rotate_attr: sourceRotateAttrWired,
87
+ };
88
+ const ok = Object.values(results).every(Boolean);
89
+ console.log(`${ok ? '✅' : '❌'} R549 brand-logo hover-rotate-6 (paired with R548 scale-105):`,
90
+ JSON.stringify(results, null, 2),
91
+ '\n rest:', JSON.stringify(rest),
92
+ '\n hover:', JSON.stringify(hover));
93
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,85 @@
1
+ /* Round 548 verification: title-block brand logo gains hover:scale-105
2
+ * delight gesture. Banked R547 Tailwind 4 pattern — probe cs.scale not
3
+ * cs.transform.
4
+ *
5
+ * Test phases:
6
+ * 1. rest: scale='none'
7
+ * 2. hover: scale='1.05'
8
+ * 3. source-side regex confirms className + data-attr wired
9
+ */
10
+ import { chromium } from 'playwright';
11
+ import { readFileSync } from 'node:fs';
12
+
13
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
14
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
15
+
16
+ const browser = await chromium.launch({ headless: true });
17
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
18
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
19
+ await ctx.addInitScript(() => {
20
+ try {
21
+ localStorage.setItem('anet-theme', 'cyber');
22
+ localStorage.setItem('anet-topo-layout', 'ring');
23
+ sessionStorage.setItem('anet_v3_auth', '1');
24
+ } catch {}
25
+ });
26
+ await ctx.route('**/api/hub/status*', async (route) => {
27
+ const r = await route.fetch();
28
+ const b = await r.json();
29
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
30
+ const mk = (alias) => ({
31
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
32
+ network_id: nid, project_dir: null,
33
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
34
+ });
35
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1')] } });
36
+ });
37
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
38
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
39
+ const page = await ctx.newPage();
40
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
41
+ await page.waitForSelector('[data-topo-brand-logo]', { timeout: 15000 });
42
+ await page.waitForTimeout(500);
43
+
44
+ const sel = '[data-topo-brand-logo]';
45
+ const rest = await page.evaluate((s) => {
46
+ const el = document.querySelector(s);
47
+ if (!el) return null;
48
+ const cs = getComputedStyle(el);
49
+ return {
50
+ attrScale: el.getAttribute('data-topo-brand-logo-hover-scale'),
51
+ scale: cs.scale,
52
+ rotate: cs.rotate,
53
+ };
54
+ }, sel);
55
+
56
+ await page.hover(sel);
57
+ await page.waitForTimeout(400);
58
+ const hover = await page.evaluate((s) => {
59
+ const el = document.querySelector(s);
60
+ if (!el) return null;
61
+ const cs = getComputedStyle(el);
62
+ return { scale: cs.scale };
63
+ }, sel);
64
+
65
+ await browser.close();
66
+
67
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
68
+ const sourceClassNameWired =
69
+ /className="shrink-0 transition-transform duration-200 ease-out hover:scale-105 transform-gpu"/.test(src);
70
+ const sourceAttrWired =
71
+ /data-topo-brand-logo-hover-scale="1\.05"/.test(src);
72
+
73
+ const results = {
74
+ rest_scale_none: rest?.scale === 'none' || rest?.scale === '1',
75
+ rest_attr_scale_105: rest?.attrScale === '1.05',
76
+ hover_scale_105: hover?.scale === '1.05',
77
+ source_classname: sourceClassNameWired,
78
+ source_attr: sourceAttrWired,
79
+ };
80
+ const ok = Object.values(results).every(Boolean);
81
+ console.log(`${ok ? '✅' : '❌'} R548 brand-logo hover-scale:`,
82
+ JSON.stringify(results, null, 2),
83
+ '\n rest:', JSON.stringify(rest),
84
+ '\n hover:', JSON.stringify(hover));
85
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,86 @@
1
+ /* Round 618 — extend label card hover treatments (stroke +
2
+ * filter brightness) gate from hover-only to (hover || chat-
3
+ * target). 4th anchor in chat-target-gated brightness family.
4
+ *
5
+ * Test phases:
6
+ * 1. mock 2 idle nodes → label cards render
7
+ * 2. rest (no hover, no chat): rest filter (shallow DS, NO
8
+ * brightness), brightness-attr='1', elevation='idle',
9
+ * chat-target='false'
10
+ * 3. computed transition-property contains 'filter'
11
+ * 4. source: stroke + filter conditionals include BOTH hover
12
+ * AND chat gates joined by `||`
13
+ */
14
+ import { chromium } from 'playwright';
15
+ import { readFileSync } from 'node:fs';
16
+
17
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
18
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
19
+
20
+ const browser = await chromium.launch({ headless: true });
21
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
22
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
23
+ await ctx.addInitScript(() => {
24
+ try {
25
+ localStorage.setItem('anet-theme', 'cyber');
26
+ localStorage.setItem('anet-topo-layout', 'ring');
27
+ sessionStorage.setItem('anet_v3_auth', '1');
28
+ } catch {}
29
+ });
30
+ await ctx.route('**/api/hub/status*', async (route) => {
31
+ const r = await route.fetch();
32
+ const b = await r.json();
33
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
34
+ const mk = (alias) => ({
35
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
36
+ network_id: nid, project_dir: null,
37
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
38
+ });
39
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
40
+ });
41
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
42
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
43
+ const page = await ctx.newPage();
44
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
45
+ await page.waitForSelector('[data-node-label-card-chat-target]', { timeout: 15000, state: 'attached' });
46
+ await page.waitForTimeout(500);
47
+
48
+ const rest = await page.evaluate(() => {
49
+ const el = document.querySelector('[data-node-label-card-chat-target]');
50
+ if (!el) return null;
51
+ const cs = getComputedStyle(el);
52
+ return {
53
+ filter: cs.filter,
54
+ transitionProperty: cs.transitionProperty,
55
+ brightnessAttr: el.getAttribute('data-node-label-card-brightness'),
56
+ elevationAttr: el.getAttribute('data-node-label-card-elevation'),
57
+ chatTargetAttr: el.getAttribute('data-node-label-card-chat-target'),
58
+ };
59
+ });
60
+
61
+ await browser.close();
62
+
63
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
64
+ const sourceFilterOr = /filter: !reducedMotion && \(hoveredAlias === session\.alias \|\| chatAlias === session\.alias\)\s*\?\s*\(isLight/.test(src);
65
+ const sourceStrokeOr = /stroke=\{!reducedMotion && \(hoveredAlias === session\.alias \|\| chatAlias === session\.alias\)/.test(src);
66
+ const sourceAttrOr = /data-node-label-card-brightness=\{!reducedMotion && \(hoveredAlias === session\.alias \|\| chatAlias === session\.alias\) \? '1\.15' : '1'\}/.test(src);
67
+ const sourceChatAttr = /data-node-label-card-chat-target=\{chatAlias === session\.alias \? 'true' : 'false'\}/.test(src);
68
+
69
+ const results = {
70
+ card_present: !!rest,
71
+ rest_has_drop_shadow: /drop-shadow/.test(rest?.filter || ''),
72
+ rest_no_brightness: !/brightness/.test(rest?.filter || ''),
73
+ rest_brightness_1: rest?.brightnessAttr === '1',
74
+ rest_elevation_idle: rest?.elevationAttr === 'idle',
75
+ rest_chat_target_false: rest?.chatTargetAttr === 'false',
76
+ transition_has_filter: /filter/.test(rest?.transitionProperty || ''),
77
+ source_filter_or: sourceFilterOr,
78
+ source_stroke_or: sourceStrokeOr,
79
+ source_attr_or: sourceAttrOr,
80
+ source_chat_attr: sourceChatAttr,
81
+ };
82
+ const ok = Object.values(results).every(Boolean);
83
+ console.log(`${ok ? '✅' : '❌'} R618 card chat-target brightness (chat-gated family 4th anchor):`,
84
+ JSON.stringify(results, null, 2),
85
+ `\n rest: ${JSON.stringify(rest)}`);
86
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,114 @@
1
+ /* Round 641 — chat-target ring 3-axis breath SMIL animates gain
2
+ * canonical CSS ease-in-out keySplines (0.42 0 0.58 1, twice for
3
+ * both halves). All three animates (opacity, stroke-width, r)
4
+ * share the same curve so the breath settles at endpoints
5
+ * and accelerates through midpoints — heart-rest organic feel.
6
+ *
7
+ * Test phases:
8
+ * 1. mock 2 idle nodes, no chat → ring at rest, breath-curve='none'
9
+ * 2. click a·1 → 3 animates concurrently with:
10
+ * - calcMode='spline'
11
+ * - keyTimes='0;0.5;1'
12
+ * - keySplines='0.42 0 0.58 1;0.42 0 0.58 1'
13
+ * 3. breath-curve attr === 'ease-in-out'
14
+ * 4. source: all 3 animates carry the new attrs
15
+ */
16
+ import { chromium } from 'playwright';
17
+ import { readFileSync } from 'node:fs';
18
+
19
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
20
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
21
+
22
+ const browser = await chromium.launch({ headless: true });
23
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
24
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
25
+ await ctx.addInitScript(() => {
26
+ try {
27
+ localStorage.setItem('anet-theme', 'cyber');
28
+ localStorage.setItem('anet-topo-layout', 'ring');
29
+ sessionStorage.setItem('anet_v3_auth', '1');
30
+ } catch {}
31
+ });
32
+ await ctx.route('**/api/hub/status*', async (route) => {
33
+ const r = await route.fetch();
34
+ const b = await r.json();
35
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
36
+ const mk = (alias) => ({
37
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
38
+ network_id: nid, project_dir: null,
39
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
40
+ });
41
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
42
+ });
43
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
44
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
45
+ const page = await ctx.newPage();
46
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
47
+ await page.waitForSelector('[data-chat-target-ring]', { timeout: 15000, state: 'attached' });
48
+ await page.waitForTimeout(500);
49
+
50
+ const rest = await page.evaluate(() => {
51
+ const el = document.querySelector('[data-chat-target-ring]');
52
+ if (!el) return null;
53
+ return {
54
+ curve: el.getAttribute('data-chat-target-ring-breath-curve'),
55
+ active: el.getAttribute('data-chat-target-active'),
56
+ };
57
+ });
58
+
59
+ await page.click('[data-node="a·1"]', { force: true });
60
+ await page.waitForTimeout(400);
61
+
62
+ const active = await page.evaluate(() => {
63
+ const node = document.querySelector('[data-node="a·1"]');
64
+ if (!node) return null;
65
+ const ring = node.querySelector('[data-chat-target-ring]');
66
+ if (!ring) return null;
67
+ const animates = Array.from(ring.querySelectorAll('animate'));
68
+ return {
69
+ curve: ring.getAttribute('data-chat-target-ring-breath-curve'),
70
+ active: ring.getAttribute('data-chat-target-active'),
71
+ animateAttrs: animates.map(a => ({
72
+ attr: a.getAttribute('attributeName'),
73
+ calc: a.getAttribute('calcMode'),
74
+ kt: a.getAttribute('keyTimes'),
75
+ ks: a.getAttribute('keySplines'),
76
+ })),
77
+ };
78
+ });
79
+
80
+ await browser.close();
81
+
82
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
83
+ // Each of the 3 animates should carry the same spline attrs
84
+ const splineAttrPattern = /calcMode="spline"\s+keyTimes="0;0\.5;1"\s+keySplines="0\.42 0 0\.58 1;0\.42 0 0\.58 1"/g;
85
+ const splineMatches = (src.match(splineAttrPattern) || []).length;
86
+ const sourceCurveAttr = /data-chat-target-ring-breath-curve=\{!reducedMotion && isChat \? 'ease-in-out' : 'none'\}/.test(src);
87
+
88
+ const allHaveSpline = active?.animateAttrs?.length === 3 && active.animateAttrs.every(a =>
89
+ a.calc === 'spline' &&
90
+ a.kt === '0;0.5;1' &&
91
+ a.ks === '0.42 0 0.58 1;0.42 0 0.58 1'
92
+ );
93
+
94
+ const results = {
95
+ rest_curve_none: rest?.curve === 'none',
96
+ active_curve_ease: active?.curve === 'ease-in-out',
97
+ active_animate_count_3: active?.animateAttrs?.length === 3,
98
+ active_all_have_spline: allHaveSpline,
99
+ active_has_opacity: active?.animateAttrs?.some(a => a.attr === 'opacity'),
100
+ active_has_sw: active?.animateAttrs?.some(a => a.attr === 'stroke-width'),
101
+ active_has_r: active?.animateAttrs?.some(a => a.attr === 'r'),
102
+ // Multiple SMIL ease-in-out splines exist across the file (R243 active-
103
+ // pulse, R244 hub-halo, plus 3 new chat-target ring animates). Assert
104
+ // count >= 3 — runtime block already verifies the 3 chat-target ring
105
+ // animates carry the exact attrs.
106
+ source_at_least_3_splines: splineMatches >= 3,
107
+ source_curve_attr: sourceCurveAttr,
108
+ };
109
+ const ok = Object.values(results).every(Boolean);
110
+ console.log(`${ok ? '✅' : '❌'} R641 chat-target ring 3-axis breath ease-in-out keySplines:`,
111
+ JSON.stringify(results, null, 2),
112
+ `\n rest: ${JSON.stringify(rest)}`,
113
+ `\n active: ${JSON.stringify(active)}`);
114
+ process.exit(ok ? 0 : 1);