@sleep2agi/agent-network-dashboard 0.5.3-preview.26 → 0.5.3-preview.260

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 (393) 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/[root-of-the-server]__0tx8s8i._.js +1 -1
  132. package/.next/server/chunks/[root-of-the-server]__0tx8s8i._.js.map +1 -1
  133. package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js +1 -1
  134. package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js.map +1 -1
  135. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js +4 -4
  136. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js.map +1 -1
  137. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js +1 -1
  138. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js.map +1 -1
  139. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js +1 -1
  140. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js.map +1 -1
  141. package/.next/server/middleware-build-manifest.js +3 -3
  142. package/.next/server/pages/404.html +2 -2
  143. package/.next/server/pages/500.html +1 -1
  144. package/.next/static/chunks/083elibefsefi.js +4 -0
  145. package/.next/static/chunks/{05uydm8okqgqe.js → 0p142v5va508~.js} +1 -1
  146. package/.next/static/chunks/0u8v68gl7g6j1.js +1 -0
  147. package/.next/static/chunks/11sahbo6ikg8g.js +1 -0
  148. package/.next/static/chunks/16-7qr7qx9zrz.css +2 -0
  149. package/.next/trace +2 -2
  150. package/.next/trace-build +1 -1
  151. package/app/api/hub/servers/route.ts +3 -29
  152. package/app/components/TopoGraph.tsx +6143 -180
  153. package/app/globals.css +897 -7
  154. package/app/lib/serverDedupe.ts +122 -0
  155. package/package.json +1 -1
  156. package/scripts/p157-rc2-dedup-test.mjs +110 -0
  157. package/scripts/topo-a11y-titles-catalog-test.mjs +132 -0
  158. package/scripts/topo-active-chrome-hover-text-test.mjs +107 -0
  159. package/scripts/topo-active-links-chip-halo-layers-test.mjs +81 -0
  160. package/scripts/topo-alias-chat-brightness-test.mjs +79 -0
  161. package/scripts/topo-alias-text-halo-layers-test.mjs +98 -0
  162. package/scripts/topo-animation-temporal-modes-catalog-test.mjs +144 -0
  163. package/scripts/topo-avatar-chat-gate-test.mjs +77 -0
  164. package/scripts/topo-avatar-drop-shadow-test.mjs +86 -0
  165. package/scripts/topo-avatar-fallback-hover-test.mjs +104 -0
  166. package/scripts/topo-avatar-fallback-rotate-test.mjs +92 -0
  167. package/scripts/topo-avatar-rotate-test.mjs +85 -0
  168. package/scripts/topo-avatar-scale-test.mjs +89 -0
  169. package/scripts/topo-badge-chat-gate-test.mjs +74 -0
  170. package/scripts/topo-brand-drop-shadow-test.mjs +71 -0
  171. package/scripts/topo-brand-logo-breath-test.mjs +102 -0
  172. package/scripts/topo-brand-logo-halo-layers-test.mjs +85 -0
  173. package/scripts/topo-brand-logo-hover-brightness-test.mjs +105 -0
  174. package/scripts/topo-brand-logo-hover-rotate-test.mjs +93 -0
  175. package/scripts/topo-brand-logo-hover-test.mjs +85 -0
  176. package/scripts/topo-canvas-desc-a11y-test.mjs +87 -0
  177. package/scripts/topo-canvas-entrance-animation-test.mjs +117 -0
  178. package/scripts/topo-canvas-scan-beam-diagonal-test.mjs +148 -0
  179. package/scripts/topo-canvas-scan-beam-test.mjs +109 -0
  180. package/scripts/topo-canvas-scan-beam-vertical-test.mjs +123 -0
  181. package/scripts/topo-card-chat-brightness-test.mjs +86 -0
  182. package/scripts/topo-chat-ring-breath-curve-test.mjs +114 -0
  183. package/scripts/topo-chat-ring-brightness-test.mjs +80 -0
  184. package/scripts/topo-chat-ring-halo-layers-test.mjs +100 -0
  185. package/scripts/topo-chat-ring-r-breath-test.mjs +121 -0
  186. package/scripts/topo-chat-ring-status-halo-test.mjs +106 -0
  187. package/scripts/topo-chat-ring-sw-breath-test.mjs +123 -0
  188. package/scripts/topo-chip-pin-halo-test.mjs +85 -0
  189. package/scripts/topo-chip-row-digit-ls-test.mjs +135 -0
  190. package/scripts/topo-chip-row-member-alias-lit-test.mjs +154 -0
  191. package/scripts/topo-chip-row-tier-glow-brightness-test.mjs +99 -0
  192. package/scripts/topo-chip-row-unit-hover-tracking-test.mjs +124 -0
  193. package/scripts/topo-chrome-control-halo-layers-test.mjs +22 -0
  194. package/scripts/topo-chrome-fullscreen-breath-test.mjs +121 -0
  195. package/scripts/topo-chrome-layout-trailer-breath-test.mjs +86 -0
  196. package/scripts/topo-chrome-nodesize-trailer-breath-test.mjs +86 -0
  197. package/scripts/topo-chrome-reset-breath-test.mjs +115 -0
  198. package/scripts/topo-chrome-strip-entrance-animation-test.mjs +115 -0
  199. package/scripts/topo-chrome-wrapper-halo-test.mjs +83 -0
  200. package/scripts/topo-chrome-zoom-wrapper-breath-test.mjs +85 -0
  201. package/scripts/topo-click-ripple-glow-test.mjs +86 -0
  202. package/scripts/topo-click-ripple-halo-layers-test.mjs +79 -0
  203. package/scripts/topo-click-ripple-sw-test.mjs +110 -0
  204. package/scripts/topo-crescent-breath-test.mjs +104 -0
  205. package/scripts/topo-crescent-envelope-breath-test.mjs +103 -0
  206. package/scripts/topo-crescent-recede-test.mjs +111 -0
  207. package/scripts/topo-dense-alias-chat-halo-test.mjs +73 -0
  208. package/scripts/topo-dense-alias-halo-layers-test.mjs +80 -0
  209. package/scripts/topo-dual-axis-surfaces-catalog-test.mjs +94 -0
  210. package/scripts/topo-edge-badge-circle-brightness-test.mjs +82 -0
  211. package/scripts/topo-edge-badge-circle-hot-pulse-test.mjs +100 -0
  212. package/scripts/topo-edge-badge-digit-halo-layers-test.mjs +107 -0
  213. package/scripts/topo-edge-badge-endpoint-gate-test.mjs +94 -0
  214. package/scripts/topo-edge-badge-halo-layers-test.mjs +85 -0
  215. package/scripts/topo-edge-badge-hot-pulse-test.mjs +92 -0
  216. package/scripts/topo-edge-badge-hover-glow-test.mjs +90 -0
  217. package/scripts/topo-edge-badge-text-brightness-test.mjs +83 -0
  218. package/scripts/topo-edge-chat-gate-test.mjs +71 -0
  219. package/scripts/topo-edge-flow-rail-halo-layers-test.mjs +89 -0
  220. package/scripts/topo-edge-particle-brightness-test.mjs +82 -0
  221. package/scripts/topo-edge-particle-halo-layers-test.mjs +91 -0
  222. package/scripts/topo-edge-pill-glow-test.mjs +67 -0
  223. package/scripts/topo-edge-pin-halo-test.mjs +99 -0
  224. package/scripts/topo-edge-visible-brightness-test.mjs +84 -0
  225. package/scripts/topo-edge-visible-halo-layers-test.mjs +87 -0
  226. package/scripts/topo-endpoint-ring-brightness-test.mjs +83 -0
  227. package/scripts/topo-endpoint-ring-flow-halo-test.mjs +107 -0
  228. package/scripts/topo-endpoint-ring-halo-layers-test.mjs +100 -0
  229. package/scripts/topo-filter-pill-glow-test.mjs +90 -0
  230. package/scripts/topo-filter-pill-halo-layers-test.mjs +27 -0
  231. package/scripts/topo-flow-arrow-brightness-test.mjs +82 -0
  232. package/scripts/topo-flow-rail-brightness-test.mjs +80 -0
  233. package/scripts/topo-fullscreen-attr-test.mjs +73 -0
  234. package/scripts/topo-fullscreen-brightness-test.mjs +84 -0
  235. package/scripts/topo-fullscreen-icon-rotate-test.mjs +93 -0
  236. package/scripts/topo-grid-content-bottom-attr-test.mjs +72 -0
  237. package/scripts/topo-group-box-brightness-test.mjs +84 -0
  238. package/scripts/topo-group-box-halo-layers-test.mjs +91 -0
  239. package/scripts/topo-group-chat-gate-test.mjs +77 -0
  240. package/scripts/topo-group-label-brightness-test.mjs +84 -0
  241. package/scripts/topo-group-label-halo-layers-test.mjs +78 -0
  242. package/scripts/topo-group-label-hover-glow-test.mjs +86 -0
  243. package/scripts/topo-group-label-member-alias-hover-test.mjs +125 -0
  244. package/scripts/topo-group-pill-glow-test.mjs +76 -0
  245. package/scripts/topo-group-tint-brightness-test.mjs +82 -0
  246. package/scripts/topo-h2-dual-axis-breath-test.mjs +92 -0
  247. package/scripts/topo-h2-triple-axis-breath-test.mjs +142 -0
  248. package/scripts/topo-halo-chat-gate-test.mjs +72 -0
  249. package/scripts/topo-hover-detail-halo-test.mjs +76 -0
  250. package/scripts/topo-hub-a11y-title-test.mjs +95 -0
  251. package/scripts/topo-hub-core-brightness-test.mjs +82 -0
  252. package/scripts/topo-hub-core-halo-layers-test.mjs +81 -0
  253. package/scripts/topo-hub-digit-brightness-test.mjs +79 -0
  254. package/scripts/topo-hub-digit-halo-layers-test.mjs +76 -0
  255. package/scripts/topo-hub-digit-ls-test.mjs +119 -0
  256. package/scripts/topo-hub-halo-brightness-test.mjs +80 -0
  257. package/scripts/topo-hub-halo-glow-test.mjs +96 -0
  258. package/scripts/topo-hub-halo-halo-layers-test.mjs +76 -0
  259. package/scripts/topo-hub-highlight-brightness-test.mjs +84 -0
  260. package/scripts/topo-hub-highlight-glow-test.mjs +99 -0
  261. package/scripts/topo-hub-highlight-halo-layers-test.mjs +78 -0
  262. package/scripts/topo-hub-highlight-r-test.mjs +112 -0
  263. package/scripts/topo-hub-hover-ring-brightness-test.mjs +79 -0
  264. package/scripts/topo-hub-hover-ring-glow-test.mjs +97 -0
  265. package/scripts/topo-hub-hover-ring-halo-layers-test.mjs +71 -0
  266. package/scripts/topo-hub-spoke-brightness-test.mjs +77 -0
  267. package/scripts/topo-hub-spoke-glow-test.mjs +112 -0
  268. package/scripts/topo-hub-spoke-halo-layers-test.mjs +97 -0
  269. package/scripts/topo-hub-spoke-self-filter-test.mjs +119 -0
  270. package/scripts/topo-kicker-breath-test.mjs +100 -0
  271. package/scripts/topo-kicker-dual-axis-breath-test.mjs +81 -0
  272. package/scripts/topo-kicker-halo-layers-test.mjs +82 -0
  273. package/scripts/topo-kicker-triple-axis-breath-test.mjs +124 -0
  274. package/scripts/topo-label-card-brightness-test.mjs +81 -0
  275. package/scripts/topo-layout-hover-fw-test.mjs +98 -0
  276. package/scripts/topo-layout-toggle-brightness-test.mjs +94 -0
  277. package/scripts/topo-layout-toggle-halo-layers-test.mjs +95 -0
  278. package/scripts/topo-legend-count-brightness-test.mjs +80 -0
  279. package/scripts/topo-legend-count-halo-layers-test.mjs +79 -0
  280. package/scripts/topo-legend-count-letter-spacing-test.mjs +108 -0
  281. package/scripts/topo-legend-label-fw-test.mjs +107 -0
  282. package/scripts/topo-legend-panel-title-breath-test.mjs +86 -0
  283. package/scripts/topo-legend-pin-ring-brightness-test.mjs +82 -0
  284. package/scripts/topo-legend-pin-ring-halo-layers-test.mjs +71 -0
  285. package/scripts/topo-legend-row-count-brightness-test.mjs +85 -0
  286. package/scripts/topo-legend-row-label-glow-test.mjs +102 -0
  287. package/scripts/topo-legend-swatch-glow-test.mjs +109 -0
  288. package/scripts/topo-legend-swatch-member-alias-match-test.mjs +139 -0
  289. package/scripts/topo-legend-tint-brightness-test.mjs +83 -0
  290. package/scripts/topo-legend-trio-halo-layers-test.mjs +22 -0
  291. package/scripts/topo-minimap-container-halo-test.mjs +82 -0
  292. package/scripts/topo-minimap-dot-chat-gate-test.mjs +81 -0
  293. package/scripts/topo-minimap-hover-glow-test.mjs +109 -0
  294. package/scripts/topo-minimap-viewport-brightness-test.mjs +84 -0
  295. package/scripts/topo-minimap-viewport-halo-layers-test.mjs +24 -0
  296. package/scripts/topo-more-footer-brightness-test.mjs +94 -0
  297. package/scripts/topo-node-alias-brightness-test.mjs +84 -0
  298. package/scripts/topo-node-avatar-halo-layers-test.mjs +25 -0
  299. package/scripts/topo-node-hover-ring-halo-layers-test.mjs +70 -0
  300. package/scripts/topo-node-label-card-halo-test.mjs +76 -0
  301. package/scripts/topo-node-sub-text-brightness-test.mjs +88 -0
  302. package/scripts/topo-nodesize-brightness-test.mjs +82 -0
  303. package/scripts/topo-nodesize-halo-layers-test.mjs +89 -0
  304. package/scripts/topo-nodesize-hover-fw-test.mjs +99 -0
  305. package/scripts/topo-orphan-label-opacity-test.mjs +98 -0
  306. package/scripts/topo-panel-count-halo-layers-test.mjs +91 -0
  307. package/scripts/topo-panel-count-hover-ls-test.mjs +87 -0
  308. package/scripts/topo-panel-rect-halo-test.mjs +90 -0
  309. package/scripts/topo-panel-row-brightness-test.mjs +116 -0
  310. package/scripts/topo-panel-title-brightness-test.mjs +98 -0
  311. package/scripts/topo-panel-title-glow-test.mjs +111 -0
  312. package/scripts/topo-panel-titles-dual-axis-breath-test.mjs +94 -0
  313. package/scripts/topo-panel-titles-halo-layers-test.mjs +23 -0
  314. package/scripts/topo-panel-titles-triple-axis-breath-test.mjs +161 -0
  315. package/scripts/topo-pill-x-rotate-test.mjs +96 -0
  316. package/scripts/topo-pip-brightness-test.mjs +85 -0
  317. package/scripts/topo-pressure-bar-halo-layers-test.mjs +19 -0
  318. package/scripts/topo-pressure-seg-glow-test.mjs +92 -0
  319. package/scripts/topo-pressure-seg-member-alias-match-test.mjs +133 -0
  320. package/scripts/topo-pressure-seg-motion-test.mjs +101 -0
  321. package/scripts/topo-r717-scan-beam-pair-pattern-test.mjs +100 -0
  322. package/scripts/topo-r717-triple-axis-pair-pattern-test.mjs +113 -0
  323. package/scripts/topo-r717-triple-axis-tier-pattern-test.mjs +117 -0
  324. package/scripts/topo-recent-count-brightness-test.mjs +84 -0
  325. package/scripts/topo-recent-more-fw-test.mjs +126 -0
  326. package/scripts/topo-recent-more-halo-layers-test.mjs +90 -0
  327. package/scripts/topo-recent-panel-hot-pulse-test.mjs +105 -0
  328. package/scripts/topo-recent-panel-title-breath-test.mjs +91 -0
  329. package/scripts/topo-recent-pip-halo-layers-test.mjs +82 -0
  330. package/scripts/topo-recent-row-chat-gate-test.mjs +75 -0
  331. package/scripts/topo-recent-row-content-lift-test.mjs +140 -0
  332. package/scripts/topo-recent-row-fw-test.mjs +115 -0
  333. package/scripts/topo-recent-row-text-glow-test.mjs +86 -0
  334. package/scripts/topo-recent-row-text-halo-layers-test.mjs +67 -0
  335. package/scripts/topo-recent-tint-brightness-test.mjs +80 -0
  336. package/scripts/topo-recent-ts-brightness-test.mjs +86 -0
  337. package/scripts/topo-reduced-motion-attr-test.mjs +69 -0
  338. package/scripts/topo-reset-brightness-test.mjs +83 -0
  339. package/scripts/topo-reset-icon-hover-scale-test.mjs +102 -0
  340. package/scripts/topo-respiratory-axis-count-stats-test.mjs +154 -0
  341. package/scripts/topo-respiratory-patterns-catalog-test.mjs +112 -0
  342. package/scripts/topo-respiratory-rolodex-test.mjs +83 -0
  343. package/scripts/topo-respiratory-tiers-catalog-test.mjs +119 -0
  344. package/scripts/topo-respiratory-triple-axis-surfaces-catalog-test.mjs +127 -0
  345. package/scripts/topo-runtime-badge-brightness-test.mjs +78 -0
  346. package/scripts/topo-runtime-badge-glow-test.mjs +108 -0
  347. package/scripts/topo-runtime-badge-halo-layers-test.mjs +87 -0
  348. package/scripts/topo-runtime-badge-rotate-test.mjs +85 -0
  349. package/scripts/topo-section-title-breath-test.mjs +83 -0
  350. package/scripts/topo-section-title-halo-layers-test.mjs +88 -0
  351. package/scripts/topo-spoke-chat-gate-test.mjs +72 -0
  352. package/scripts/topo-starfield-hue-test.mjs +109 -0
  353. package/scripts/topo-status-pin-pill-halo-layers-test.mjs +17 -0
  354. package/scripts/topo-status-ring-brightness-test.mjs +84 -0
  355. package/scripts/topo-status-ring-chat-gate-test.mjs +72 -0
  356. package/scripts/topo-status-ring-halo-layers-test.mjs +105 -0
  357. package/scripts/topo-status-ring-status-halo-test.mjs +110 -0
  358. package/scripts/topo-sub-text-chat-brightness-test.mjs +81 -0
  359. package/scripts/topo-svg-title-a11y-r731-test.mjs +93 -0
  360. package/scripts/topo-svg-title-a11y-test.mjs +88 -0
  361. package/scripts/topo-title-block-entrance-animation-test.mjs +127 -0
  362. package/scripts/topo-title-block-envelope-breath-test.mjs +87 -0
  363. package/scripts/topo-titleblock-h2-hover-fw-test.mjs +109 -0
  364. package/scripts/topo-titleblock-h2-hover-tracking-test.mjs +128 -0
  365. package/scripts/topo-titleblock-kicker-hover-test.mjs +134 -0
  366. package/scripts/topo-vendor-chip-glow-test.mjs +97 -0
  367. package/scripts/topo-vendor-chip-halo-layers-test.mjs +18 -0
  368. package/scripts/topo-vendor-chip-pin-halo-test.mjs +88 -0
  369. package/scripts/topo-vendor-count-suffix-halo-layers-test.mjs +79 -0
  370. package/scripts/topo-vendor-distribution-wrapper-halo-test.mjs +93 -0
  371. package/scripts/topo-vendor-letter-halo-layers-test.mjs +93 -0
  372. package/scripts/topo-vendor-pill-glow-test.mjs +98 -0
  373. package/scripts/topo-watermark-breath-test.mjs +100 -0
  374. package/scripts/topo-watermark-dual-axis-breath-test.mjs +88 -0
  375. package/scripts/topo-watermark-envelope-breath-test.mjs +88 -0
  376. package/scripts/topo-watermark-recede-test.mjs +114 -0
  377. package/scripts/topo-watermark-triple-axis-breath-test.mjs +129 -0
  378. package/scripts/topo-working-online-chip-halo-layers-test.mjs +94 -0
  379. package/scripts/topo-zoom-buttons-brightness-test.mjs +94 -0
  380. package/scripts/topo-zoom-in-out-halo-layers-test.mjs +97 -0
  381. package/scripts/topo-zoom-level-breath-test.mjs +87 -0
  382. package/scripts/topo-zoom-level-brightness-test.mjs +83 -0
  383. package/scripts/topo-zoom-level-color-test.mjs +105 -0
  384. package/scripts/topo-zoom-level-dual-axis-breath-test.mjs +83 -0
  385. package/scripts/topo-zoom-level-halo-layers-test.mjs +78 -0
  386. package/scripts/topo-zoom-level-triple-axis-breath-test.mjs +148 -0
  387. package/.next/static/chunks/0b57cx-~yee9s.js +0 -1
  388. package/.next/static/chunks/0c5ux9rrl-j.a.js +0 -4
  389. package/.next/static/chunks/0ixrbcha76lse.js +0 -1
  390. package/.next/static/chunks/0m.1mvl~t.avc.css +0 -2
  391. /package/.next/static/{fAHTff4Obp5vYwjZIWEvA → wz1T-LhLDalz691PpN3E7}/_buildManifest.js +0 -0
  392. /package/.next/static/{fAHTff4Obp5vYwjZIWEvA → wz1T-LhLDalz691PpN3E7}/_clientMiddlewareManifest.js +0 -0
  393. /package/.next/static/{fAHTff4Obp5vYwjZIWEvA → wz1T-LhLDalz691PpN3E7}/_ssgManifest.js +0 -0
@@ -0,0 +1,99 @@
1
+ /* Round 521 verification: chrome nodeSize S/M/L inactive variant gains
2
+ * hover-fw preview — fw 400 (default) → 500 (font-medium, matches active
3
+ * variant). Extends R270 hover-preview idiom to the typography axis.
4
+ *
5
+ * Test phases:
6
+ * 1. inactive rest: fontWeight = 400, data-attr = '500' (preview target)
7
+ * 2. inactive hover: fontWeight = 500 (preview lands at active fw)
8
+ * 3. active rest: fontWeight = 500 (existing font-medium class)
9
+ * 4. source-side regex confirms hover:font-medium class + attr wiring
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-chrome-nodesize]', { timeout: 15000 });
43
+ await page.waitForTimeout(800);
44
+
45
+ // Find the inactive + active buttons via attrs
46
+ const buttons = await page.evaluate(() => {
47
+ const els = Array.from(document.querySelectorAll('[data-topo-chrome-nodesize]'));
48
+ return els.map((el) => ({
49
+ label: el.getAttribute('data-topo-chrome-nodesize'),
50
+ active: el.getAttribute('data-topo-chrome-nodesize-active'),
51
+ previewAttr: el.getAttribute('data-topo-chrome-nodesize-hover-preview-fw'),
52
+ fw: getComputedStyle(el).fontWeight,
53
+ }));
54
+ });
55
+
56
+ // Find an inactive one. Default nodeScale is M (1) so S + L should be inactive.
57
+ const inactiveLabel = buttons.find(b => b.active === 'false')?.label;
58
+ if (!inactiveLabel) {
59
+ console.log('❌ R521 — no inactive nodeSize button found');
60
+ process.exit(1);
61
+ }
62
+ const inactiveSel = `[data-topo-chrome-nodesize="${inactiveLabel}"]`;
63
+
64
+ // Phase 2: hover the inactive button
65
+ await page.hover(inactiveSel);
66
+ await page.waitForTimeout(350);
67
+ const hoverFw = await page.evaluate((sel) => getComputedStyle(document.querySelector(sel)).fontWeight, inactiveSel);
68
+
69
+ // Phase 3: find active button
70
+ const active = buttons.find(b => b.active === 'true');
71
+
72
+ await browser.close();
73
+
74
+ // Phase 4: source regex
75
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
76
+ const sourceWiredClass = /hover:bg-cyan-500\/5 active:bg-cyan-500\/15 hover:font-medium/.test(src);
77
+ const sourceWiredAttr =
78
+ /data-topo-chrome-nodesize-hover-preview-fw=\{nodeScale === v \? null : '500'\}/.test(src);
79
+ const sourceWiredTransition = /transition-\[font-weight\]/.test(src);
80
+
81
+ const inactiveRest = buttons.find(b => b.label === inactiveLabel);
82
+
83
+ const results = {
84
+ inactive_rest_fw_400: inactiveRest?.fw === '400',
85
+ inactive_rest_attr_500: inactiveRest?.previewAttr === '500',
86
+ inactive_active_attr_false: inactiveRest?.active === 'false',
87
+ inactive_hover_fw_500: hoverFw === '500',
88
+ active_rest_fw_500: active?.fw === '500',
89
+ active_no_preview_attr: active?.previewAttr === null || active?.previewAttr === undefined,
90
+ source_class_wired: sourceWiredClass,
91
+ source_attr_wired: sourceWiredAttr,
92
+ source_transition_wired: sourceWiredTransition,
93
+ };
94
+ const ok = Object.values(results).every(Boolean);
95
+ console.log(`${ok ? '✅' : '❌'} R521 nodeSize hover-fw preview:`,
96
+ JSON.stringify(results, null, 2),
97
+ '\n buttons:', JSON.stringify(buttons),
98
+ '\n inactive(', inactiveLabel, ')hover fw:', hoverFw);
99
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,98 @@
1
+ /* Round 551 verification: orphan band ("其他") rest-state LABEL opacity
2
+ * drops 0.55 → 0.4. 4th channel in the category-differentiation family
3
+ * (R499 italic, R503 dash, R506 rect fill, R551 label paint).
4
+ *
5
+ * Needs an orphan group to exist. The cluster-by-prefix logic creates
6
+ * an orphan band whenever there are sessions without a recognizable
7
+ * prefix (alias with no separator). Mock with a mix: 6 sessions with
8
+ * "alpha-" prefix (groups together) + 2 sessions with no separator
9
+ * (orphan).
10
+ *
11
+ * Test phases:
12
+ * 1. confirm grid layout active
13
+ * 2. locate orphan group-label vs prefix group-label
14
+ * 3. orphan rest opacity = 0.4, opacity attr surfaces value
15
+ * 4. prefix-group rest opacity = 0.55 (unchanged)
16
+ * 5. source-side regex confirms wiring
17
+ */
18
+ import { chromium } from 'playwright';
19
+ import { readFileSync } from 'node:fs';
20
+
21
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
22
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
23
+
24
+ const browser = await chromium.launch({ headless: true });
25
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
26
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
27
+ await ctx.addInitScript(() => {
28
+ try {
29
+ localStorage.setItem('anet-theme', 'cyber');
30
+ localStorage.setItem('anet-topo-layout', 'grid');
31
+ sessionStorage.setItem('anet_v3_auth', '1');
32
+ } catch {}
33
+ });
34
+ // Mock: 6 alpha-prefix sessions (prefix group) + 3 standalone (orphan band).
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 = 'idle') => ({
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('alpha·1'), mk('alpha·2'), mk('alpha·3'),
46
+ mk('alpha·4'), mk('alpha·5'), mk('alpha·6'),
47
+ mk('foo'), mk('bar'), mk('baz'),
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-group-label]', { timeout: 15000 });
55
+ await page.waitForTimeout(500);
56
+
57
+ const groups = await page.evaluate(() => {
58
+ const els = Array.from(document.querySelectorAll('[data-group-label]'));
59
+ return els.map(el => ({
60
+ key: el.getAttribute('data-group-label'),
61
+ orphan: el.getAttribute('data-group-label-orphan') === 'true',
62
+ opacityAttr: el.getAttribute('data-group-label-opacity'),
63
+ computedOpacity: getComputedStyle(el).opacity,
64
+ pinned: el.getAttribute('data-group-label-pinned') === 'true',
65
+ hovered: el.getAttribute('data-group-label-hovered') === 'true',
66
+ }));
67
+ });
68
+
69
+ await browser.close();
70
+
71
+ const orphan = groups.find(g => g.orphan);
72
+ const prefix = groups.find(g => !g.orphan);
73
+
74
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
75
+ const sourceWired =
76
+ /opacity=\{isPinned \|\| isHovered \? 1 : box\.isOrphan \? 0\.4 : 0\.55\}/.test(src);
77
+ const sourceAttrWired =
78
+ /data-group-label-opacity=\{isPinned \|\| isHovered \? 1 : box\.isOrphan \? 0\.4 : 0\.55\}/.test(src);
79
+
80
+ const results = {
81
+ orphan_present: !!orphan,
82
+ prefix_present: !!prefix,
83
+ orphan_attr_0_4: orphan?.opacityAttr === '0.4',
84
+ orphan_computed_0_4: orphan ? Math.abs(parseFloat(orphan.computedOpacity) - 0.4) < 0.001 : false,
85
+ prefix_attr_0_55: prefix?.opacityAttr === '0.55',
86
+ prefix_computed_0_55: prefix ? Math.abs(parseFloat(prefix.computedOpacity) - 0.55) < 0.001 : false,
87
+ orphan_rest_state: orphan ? !orphan.pinned && !orphan.hovered : false,
88
+ prefix_rest_state: prefix ? !prefix.pinned && !prefix.hovered : false,
89
+ source_wired: sourceWired,
90
+ source_attr_wired: sourceAttrWired,
91
+ };
92
+ const ok = Object.values(results).every(Boolean);
93
+ console.log(`${ok ? '✅' : '❌'} R551 orphan label opacity 0.55→0.4 (category-differentiation 4th channel):`,
94
+ JSON.stringify(results, null, 2),
95
+ '\n orphan:', JSON.stringify(orphan),
96
+ '\n prefix:', JSON.stringify(prefix),
97
+ '\n all groups:', JSON.stringify(groups, null, 2));
98
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,91 @@
1
+ /* Round 669 — panel-count pair (recent + legend) extends single-axis
2
+ * brightness(1.15) hover paint to the 2-layer drop-shadow halo
3
+ * vocabulary. 28th anchor in multi-layer halo family — symmetric
4
+ * panel-pair sweep (both panel COUNT texts simultaneously).
5
+ *
6
+ * Source assertions:
7
+ * - recent: filter chain uses pal.legendAccent at 0x80 + 0x40 with 2+4
8
+ * stride, gated on hoveredPanel === 'recent'
9
+ * - legend: filter chain uses pal.legendAccent at 0x80 + 0x40 with 2+4
10
+ * stride, gated on hoveredPanel === 'legend'
11
+ * - both halo-layers data-attrs toggle '2' ↔ '0' on hover
12
+ *
13
+ * Runtime assertions:
14
+ * - both panel counts present in DOM at rest, halo-layers='0'
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'), mk('a·3')] } });
42
+ });
43
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [
44
+ { id: 'm1', from_alias: 'a·1', to_alias: 'a·2', kind: 'task', content: 'ping', network_id: 'default', created_at: fresh },
45
+ { id: 'm2', from_alias: 'a·2', to_alias: 'a·3', kind: 'message', content: 'pong', network_id: 'default', created_at: fresh },
46
+ { id: 'm3', from_alias: 'a·3', to_alias: 'a·1', kind: 'task', content: 'hello', network_id: 'default', created_at: fresh },
47
+ ] } }));
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-legend-panel-count]', { timeout: 15000, state: 'attached' });
52
+ await page.waitForTimeout(500);
53
+
54
+ const restState = await page.evaluate(() => {
55
+ const legend = document.querySelector('[data-legend-panel-count]');
56
+ const recent = document.querySelector('[data-recent-panel-count-letter-spacing]');
57
+ return {
58
+ legend_present: !!legend,
59
+ recent_present: !!recent,
60
+ legend_layers: legend?.getAttribute('data-legend-panel-count-halo-layers'),
61
+ recent_layers: recent?.getAttribute('data-recent-panel-count-halo-layers'),
62
+ legend_brightness: legend?.getAttribute('data-legend-panel-count-brightness'),
63
+ recent_brightness: recent?.getAttribute('data-recent-panel-count-brightness'),
64
+ };
65
+ });
66
+
67
+ await browser.close();
68
+
69
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
70
+ const sourceRecentFilter = /hoveredPanel === 'recent' \? `drop-shadow\(0 0 2px \$\{pal\.legendAccent\}80\) drop-shadow\(0 0 4px \$\{pal\.legendAccent\}40\) brightness\(1\.15\)` : undefined/.test(src);
71
+ const sourceLegendFilter = /hoveredPanel === 'legend' \? `drop-shadow\(0 0 2px \$\{pal\.legendAccent\}80\) drop-shadow\(0 0 4px \$\{pal\.legendAccent\}40\) brightness\(1\.15\)` : undefined/.test(src);
72
+ const sourceRecentAttr = /data-recent-panel-count-halo-layers=\{hoveredPanel === 'recent' \? '2' : '0'\}/.test(src);
73
+ const sourceLegendAttr = /data-legend-panel-count-halo-layers=\{hoveredPanel === 'legend' \? '2' : '0'\}/.test(src);
74
+
75
+ const results = {
76
+ recent_present: restState.recent_present,
77
+ legend_present: restState.legend_present,
78
+ rest_recent_layers_0: restState.recent_layers === '0',
79
+ rest_legend_layers_0: restState.legend_layers === '0',
80
+ rest_recent_bright_1: restState.recent_brightness === '1',
81
+ rest_legend_bright_1: restState.legend_brightness === '1',
82
+ source_recent_filter: sourceRecentFilter,
83
+ source_legend_filter: sourceLegendFilter,
84
+ source_recent_attr: sourceRecentAttr,
85
+ source_legend_attr: sourceLegendAttr,
86
+ };
87
+ const ok = Object.values(results).every(Boolean);
88
+ console.log(`${ok ? '✅' : '❌'} R669 panel-count pair multi-layer halo (symmetric panel-pair sweep):`,
89
+ JSON.stringify(results, null, 2),
90
+ `\n rest: ${JSON.stringify(restState)}`);
91
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,87 @@
1
+ /* Round 566 verification: panel-header count tspans (recent + legend)
2
+ * gain hover-state letter-spacing tween (0.2 → 0.4 on hoveredPanel).
3
+ * Pairs with R424/R310 hover-fw lift at the same scope.
4
+ *
5
+ * Test phases:
6
+ * 1. rest: data-attr 'letter-spacing' = '0.2' on both
7
+ * 2. source-side regex confirms both wired with hoveredPanel
8
+ * conditional + transition 'letter-spacing 200ms'
9
+ *
10
+ * (Live SVG hover via Playwright .hover() on the panel <g> is
11
+ * unreliable for state-driven attrs gated on hoveredPanel react
12
+ * state — banked R525 pattern; this round uses source-canonical
13
+ * for the gate verification and live data-attr probing for the
14
+ * rest state. The conditional itself was added in source.)
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
+ // 1 message so flowLinks > 0 → recent-panel renders
44
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [
45
+ { from_alias: 'a·1', to_alias: 'a·2', content: 'hi', created_at: fresh },
46
+ ] } }));
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-legend-panel-count]', { timeout: 15000 });
51
+ await page.waitForTimeout(500);
52
+
53
+ const probe = async () => {
54
+ return page.evaluate(() => ({
55
+ recent_ls_attr: document.querySelector('[data-recent-panel-count]')?.parentElement?.getAttribute('data-recent-panel-count-letter-spacing'),
56
+ legend_ls_attr: document.querySelector('[data-legend-panel-count]')?.getAttribute('data-legend-panel-count-letter-spacing'),
57
+ }));
58
+ };
59
+ const rest = await probe();
60
+
61
+ await browser.close();
62
+
63
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
64
+ const sourceRecentLS = /letterSpacing=\{hoveredPanel === 'recent' \? '0\.4' : '0\.2'\}/.test(src);
65
+ const sourceLegendLS = /letterSpacing=\{hoveredPanel === 'legend' \? '0\.4' : '0\.2'\}/.test(src);
66
+ const sourceRecentAttr = /data-recent-panel-count-letter-spacing=\{hoveredPanel === 'recent' \? '0\.4' : '0\.2'\}/.test(src);
67
+ const sourceLegendAttr = /data-legend-panel-count-letter-spacing=\{hoveredPanel === 'legend' \? '0\.4' : '0\.2'\}/.test(src);
68
+ const sourceRecentTransition = /transition: 'letter-spacing 200ms ease-out'/.test(src);
69
+ const sourceLegendTransition = /transition: 'fill 200ms ease-out, font-weight 200ms ease-out, letter-spacing 200ms ease-out'/.test(src);
70
+
71
+ const results = {
72
+ // Rest state: data-attrs at the editorial baseline 0.2
73
+ rest_recent_ls_attr_0_2: rest.recent_ls_attr === '0.2',
74
+ rest_legend_ls_attr_0_2: rest.legend_ls_attr === '0.2',
75
+ // Source: both panel counts wired with conditional + transition
76
+ source_recent_ls: sourceRecentLS,
77
+ source_legend_ls: sourceLegendLS,
78
+ source_recent_attr: sourceRecentAttr,
79
+ source_legend_attr: sourceLegendAttr,
80
+ source_recent_transition: sourceRecentTransition,
81
+ source_legend_transition: sourceLegendTransition,
82
+ };
83
+ const ok = Object.values(results).every(Boolean);
84
+ console.log(`${ok ? '✅' : '❌'} R566 panel-count hover letter-spacing (2 sibling anchors):`,
85
+ JSON.stringify(results, null, 2),
86
+ '\n rest:', JSON.stringify(rest));
87
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,90 @@
1
+ /* Round 695 — recent-signal + legend panel rects (panel-pair backdrop)
2
+ * extend filter chain on hoveredPanel branch from elevation-only to
3
+ * 4-LAYER panel-tier composition. Prepends 2-layer radial drop-shadow
4
+ * at pal.legendAccent (3+6 stride, alpha 80/40). Sibling to R693
5
+ * hover-detail card + R694 per-node label card. Closes panel-pair
6
+ * backdrop halo symmetry — both panels now glow on respective hover.
7
+ *
8
+ * Source assertions:
9
+ * - recent panel hover branch: 2× pal.legendAccent drop-shadow + elevation
10
+ * - legend panel hover branch: same composition
11
+ * - both halo-layers data attrs toggle '2' ↔ '0' on hoveredPanel
12
+ *
13
+ * Runtime assertions:
14
+ * - both panel rects present with data-topo-panel-elevation attrs
15
+ * - rest halo-layers='0' on both
16
+ */
17
+ import { chromium } from 'playwright';
18
+ import { readFileSync } from 'node:fs';
19
+
20
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
21
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
22
+
23
+ const browser = await chromium.launch({ headless: true });
24
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
25
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
26
+ await ctx.addInitScript(() => {
27
+ try {
28
+ localStorage.setItem('anet-theme', 'cyber');
29
+ localStorage.setItem('anet-topo-layout', 'ring');
30
+ sessionStorage.setItem('anet_v3_auth', '1');
31
+ } catch {}
32
+ });
33
+ await ctx.route('**/api/hub/status*', async (route) => {
34
+ const r = await route.fetch();
35
+ const b = await r.json();
36
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
37
+ const mk = (alias) => ({
38
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
39
+ network_id: nid, project_dir: null,
40
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
41
+ });
42
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2'), mk('a·3')] } });
43
+ });
44
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [
45
+ { id: 'm1', from_alias: 'a·1', to_alias: 'a·2', kind: 'message', content: 'p', network_id: 'default', created_at: fresh },
46
+ ] } }));
47
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
48
+ const page = await ctx.newPage();
49
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
50
+ await page.waitForSelector('[data-topo-panel-elevation="legend"]', { timeout: 15000, state: 'attached' });
51
+ await page.waitForTimeout(300);
52
+
53
+ const runtimeState = await page.evaluate(() => {
54
+ const recent = document.querySelector('[data-topo-panel-elevation="recent"]');
55
+ const legend = document.querySelector('[data-topo-panel-elevation="legend"]');
56
+ return {
57
+ recent_present: !!recent,
58
+ legend_present: !!legend,
59
+ recent_halo: recent?.getAttribute('data-topo-panel-recent-halo-layers'),
60
+ legend_halo: legend?.getAttribute('data-topo-panel-legend-halo-layers'),
61
+ };
62
+ });
63
+
64
+ await browser.close();
65
+
66
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
67
+ const sourceRecentLight = /hoveredPanel === 'recent'[\s\S]*?isLight\s*\?\s*`drop-shadow\(0 0 3px \$\{pal\.legendAccent\}80\) drop-shadow\(0 0 6px \$\{pal\.legendAccent\}40\) drop-shadow\(0 4px 12px rgba\(15,23,42,0\.14\)\)`/.test(src);
68
+ const sourceRecentCyber = /hoveredPanel === 'recent'[\s\S]*?:\s*`drop-shadow\(0 0 3px \$\{pal\.legendAccent\}80\) drop-shadow\(0 0 6px \$\{pal\.legendAccent\}40\) drop-shadow\(0 4px 12px rgba\(0,0,0,0\.65\)\)`/.test(src);
69
+ const sourceLegendLight = /hoveredPanel === 'legend'[\s\S]*?isLight\s*\?\s*`drop-shadow\(0 0 3px \$\{pal\.legendAccent\}80\) drop-shadow\(0 0 6px \$\{pal\.legendAccent\}40\) drop-shadow\(0 4px 12px rgba\(15,23,42,0\.14\)\)`/.test(src);
70
+ const sourceLegendCyber = /hoveredPanel === 'legend'[\s\S]*?:\s*`drop-shadow\(0 0 3px \$\{pal\.legendAccent\}80\) drop-shadow\(0 0 6px \$\{pal\.legendAccent\}40\) drop-shadow\(0 4px 12px rgba\(0,0,0,0\.65\)\)`/.test(src);
71
+ const sourceRecentAttr = /data-topo-panel-recent-halo-layers=\{hoveredPanel === 'recent' \? '2' : '0'\}/.test(src);
72
+ const sourceLegendAttr = /data-topo-panel-legend-halo-layers=\{hoveredPanel === 'legend' \? '2' : '0'\}/.test(src);
73
+
74
+ const results = {
75
+ recent_present: runtimeState.recent_present,
76
+ legend_present: runtimeState.legend_present,
77
+ rest_recent_layers_0: runtimeState.recent_halo === '0',
78
+ rest_legend_layers_0: runtimeState.legend_halo === '0',
79
+ source_recent_light: sourceRecentLight,
80
+ source_recent_cyber: sourceRecentCyber,
81
+ source_legend_light: sourceLegendLight,
82
+ source_legend_cyber: sourceLegendCyber,
83
+ source_recent_attr: sourceRecentAttr,
84
+ source_legend_attr: sourceLegendAttr,
85
+ };
86
+ const ok = Object.values(results).every(Boolean);
87
+ console.log(`${ok ? '✅' : '❌'} R695 panel-pair backdrop multi-layer halo (51 anchor — closes panel-pair backdrop symmetry):`,
88
+ JSON.stringify(results, null, 2),
89
+ `\n runtime: ${JSON.stringify(runtimeState)}`);
90
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,116 @@
1
+ /* Round 572 verification: panel-row text scopes (recent + legend)
2
+ * stack brightness(1.15) onto R568/R569 drop-shadow filter.
3
+ * 9th + 10th anchors in per-element brightness family.
4
+ *
5
+ * Test phases:
6
+ * 1. mock 1 message + 3 sessions → recent-panel + legend-panel render
7
+ * 2. rest: filters='none', brightness-attrs='1'
8
+ * 3. click pressure-seg working → pinnedStatus='working' →
9
+ * working legend-row label filter contains drop-shadow AND
10
+ * brightness(1.15); brightness-attr='1.15'
11
+ * 4. source-side regex confirms stacked filter expressions at both
12
+ * sites + data-attrs
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, status) => ({
35
+ alias, status, model: 'claude-opus-4', runtime: 'claude-code-cli',
36
+ network_id: nid, project_dir: null,
37
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
38
+ });
39
+ await route.fulfill({ response: r, json: { ...b, sessions: [
40
+ mk('alpha·1', 'working'),
41
+ mk('alpha·2', 'idle'),
42
+ mk('alpha·3', 'offline'),
43
+ ] } });
44
+ });
45
+ // 1 message so flowLinks > 0 → recent-panel renders
46
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [
47
+ { from_alias: 'alpha·1', to_alias: 'alpha·2', content: 'hi', created_at: fresh },
48
+ ] } }));
49
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
50
+ const page = await ctx.newPage();
51
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
52
+ await page.waitForSelector('[data-legend-row-label="working"]', { timeout: 15000 });
53
+ await page.waitForTimeout(500);
54
+
55
+ const probeLegend = (k) => page.evaluate((key) => {
56
+ const el = document.querySelector(`[data-legend-row-label="${key}"]`);
57
+ if (!el) return null;
58
+ const cs = getComputedStyle(el);
59
+ return {
60
+ filter: cs.filter,
61
+ brightnessAttr: el.getAttribute('data-legend-row-label-brightness'),
62
+ glowAttr: el.getAttribute('data-legend-row-label-glow'),
63
+ };
64
+ }, k);
65
+
66
+ const probeRecent = () => page.evaluate(() => {
67
+ const el = document.querySelector('[data-recent-row-text]');
68
+ if (!el) return null;
69
+ const cs = getComputedStyle(el);
70
+ return {
71
+ filter: cs.filter,
72
+ brightnessAttr: el.getAttribute('data-recent-row-text-brightness'),
73
+ glowAttr: el.getAttribute('data-recent-row-text-glow'),
74
+ };
75
+ });
76
+
77
+ const restLegend = await probeLegend('working');
78
+ const restRecent = await probeRecent();
79
+
80
+ await page.click('[data-pressure-seg="working"]');
81
+ await page.waitForTimeout(400);
82
+ const pinnedLegend = await probeLegend('working');
83
+
84
+ await browser.close();
85
+
86
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
87
+ const sourceRecentFilter = /filter: \(isRowHovered \|\| isRowPinned\)\s*\?\s*`drop-shadow\(0 0 2px \$\{pal\.legendAccent\}80\) brightness\(1\.15\)`/.test(src);
88
+ const sourceLegendFilter = /filter: \(hoveredStatus === row\.key \|\| isPinned\)\s*\?\s*`drop-shadow\(0 0 2px \$\{pal\.legendAccent\}80\) brightness\(1\.15\)`/.test(src);
89
+ const sourceRecentAttr = /data-recent-row-text-brightness=\{\(isRowHovered \|\| isRowPinned\) \? '1\.15' : '1'\}/.test(src);
90
+ const sourceLegendAttr = /data-legend-row-label-brightness=\{\(hoveredStatus === row\.key \|\| isPinned\) \? '1\.15' : '1'\}/.test(src);
91
+
92
+ const results = {
93
+ rest_legend_filter_none: restLegend?.filter === 'none',
94
+ rest_legend_brightness_1: restLegend?.brightnessAttr === '1',
95
+ rest_legend_glow_false: restLegend?.glowAttr === 'false',
96
+ rest_recent_filter_none: restRecent?.filter === 'none',
97
+ rest_recent_brightness_1: restRecent?.brightnessAttr === '1',
98
+ rest_recent_glow_false: restRecent?.glowAttr === 'false',
99
+ // Pin working → working legend-row label lights up with stacked filter
100
+ pinned_legend_glow_true: pinnedLegend?.glowAttr === 'true',
101
+ pinned_legend_brightness_1_15: pinnedLegend?.brightnessAttr === '1.15',
102
+ pinned_legend_has_dropshadow: /drop-shadow\(/.test(pinnedLegend?.filter || ''),
103
+ pinned_legend_has_brightness: /brightness\(1\.15\)/.test(pinnedLegend?.filter || ''),
104
+ // Source regexes for both anchors
105
+ source_recent_filter: sourceRecentFilter,
106
+ source_legend_filter: sourceLegendFilter,
107
+ source_recent_attr: sourceRecentAttr,
108
+ source_legend_attr: sourceLegendAttr,
109
+ };
110
+ const ok = Object.values(results).every(Boolean);
111
+ console.log(`${ok ? '✅' : '❌'} R572 panel-row text stacked brightness (9th + 10th anchors in per-element family):`,
112
+ JSON.stringify(results, null, 2),
113
+ '\n rest legend (working):', JSON.stringify(restLegend),
114
+ '\n rest recent:', JSON.stringify(restRecent),
115
+ '\n pinned legend (working):', JSON.stringify(pinnedLegend));
116
+ process.exit(ok ? 0 : 1);