@sleep2agi/agent-network-dashboard 0.5.3-preview.14 → 0.5.3-preview.140

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 (289) 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 +32 -32
  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 +12 -12
  15. package/.next/server/app/_not-found.segments/_full.segment.rsc +12 -12
  16. package/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
  17. package/.next/server/app/_not-found.segments/_index.segment.rsc +7 -7
  18. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  19. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  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 +14 -14
  24. package/.next/server/app/admin.segments/_full.segment.rsc +14 -14
  25. package/.next/server/app/admin.segments/_head.segment.rsc +4 -4
  26. package/.next/server/app/admin.segments/_index.segment.rsc +7 -7
  27. package/.next/server/app/admin.segments/_tree.segment.rsc +2 -2
  28. package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +4 -4
  29. package/.next/server/app/admin.segments/admin.segment.rsc +3 -3
  30. package/.next/server/app/index.html +2 -2
  31. package/.next/server/app/index.rsc +14 -14
  32. package/.next/server/app/index.segments/__PAGE__.segment.rsc +4 -4
  33. package/.next/server/app/index.segments/_full.segment.rsc +14 -14
  34. package/.next/server/app/index.segments/_head.segment.rsc +4 -4
  35. package/.next/server/app/index.segments/_index.segment.rsc +7 -7
  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 +14 -14
  40. package/.next/server/app/login.segments/_full.segment.rsc +14 -14
  41. package/.next/server/app/login.segments/_head.segment.rsc +4 -4
  42. package/.next/server/app/login.segments/_index.segment.rsc +7 -7
  43. package/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  44. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +4 -4
  45. package/.next/server/app/login.segments/login.segment.rsc +3 -3
  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 +14 -14
  49. package/.next/server/app/logs.segments/_full.segment.rsc +14 -14
  50. package/.next/server/app/logs.segments/_head.segment.rsc +4 -4
  51. package/.next/server/app/logs.segments/_index.segment.rsc +7 -7
  52. package/.next/server/app/logs.segments/_tree.segment.rsc +2 -2
  53. package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +4 -4
  54. package/.next/server/app/logs.segments/logs.segment.rsc +3 -3
  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 +14 -14
  58. package/.next/server/app/messages.segments/_full.segment.rsc +14 -14
  59. package/.next/server/app/messages.segments/_head.segment.rsc +4 -4
  60. package/.next/server/app/messages.segments/_index.segment.rsc +7 -7
  61. package/.next/server/app/messages.segments/_tree.segment.rsc +2 -2
  62. package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +4 -4
  63. package/.next/server/app/messages.segments/messages.segment.rsc +3 -3
  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 +14 -14
  67. package/.next/server/app/node.segments/_full.segment.rsc +14 -14
  68. package/.next/server/app/node.segments/_head.segment.rsc +4 -4
  69. package/.next/server/app/node.segments/_index.segment.rsc +7 -7
  70. package/.next/server/app/node.segments/_tree.segment.rsc +2 -2
  71. package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +4 -4
  72. package/.next/server/app/node.segments/node.segment.rsc +3 -3
  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 +14 -14
  76. package/.next/server/app/nodes.segments/_full.segment.rsc +14 -14
  77. package/.next/server/app/nodes.segments/_head.segment.rsc +4 -4
  78. package/.next/server/app/nodes.segments/_index.segment.rsc +7 -7
  79. package/.next/server/app/nodes.segments/_tree.segment.rsc +2 -2
  80. package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +4 -4
  81. package/.next/server/app/nodes.segments/nodes.segment.rsc +3 -3
  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 +14 -14
  86. package/.next/server/app/server-logs.segments/_full.segment.rsc +14 -14
  87. package/.next/server/app/server-logs.segments/_head.segment.rsc +4 -4
  88. package/.next/server/app/server-logs.segments/_index.segment.rsc +7 -7
  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 +4 -4
  91. package/.next/server/app/server-logs.segments/server-logs.segment.rsc +3 -3
  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 +14 -14
  95. package/.next/server/app/settings/networks.segments/_full.segment.rsc +14 -14
  96. package/.next/server/app/settings/networks.segments/_head.segment.rsc +4 -4
  97. package/.next/server/app/settings/networks.segments/_index.segment.rsc +7 -7
  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 +4 -4
  100. package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +3 -3
  101. package/.next/server/app/settings/networks.segments/settings.segment.rsc +3 -3
  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 +14 -14
  106. package/.next/server/app/settings/tokens.segments/_full.segment.rsc +14 -14
  107. package/.next/server/app/settings/tokens.segments/_head.segment.rsc +4 -4
  108. package/.next/server/app/settings/tokens.segments/_index.segment.rsc +7 -7
  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 +4 -4
  111. package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +3 -3
  112. package/.next/server/app/settings/tokens.segments/settings.segment.rsc +3 -3
  113. package/.next/server/app/settings.html +2 -2
  114. package/.next/server/app/settings.rsc +14 -14
  115. package/.next/server/app/settings.segments/_full.segment.rsc +14 -14
  116. package/.next/server/app/settings.segments/_head.segment.rsc +4 -4
  117. package/.next/server/app/settings.segments/_index.segment.rsc +7 -7
  118. package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  119. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +4 -4
  120. package/.next/server/app/settings.segments/settings.segment.rsc +3 -3
  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 +14 -14
  125. package/.next/server/app/tasks.segments/_full.segment.rsc +14 -14
  126. package/.next/server/app/tasks.segments/_head.segment.rsc +4 -4
  127. package/.next/server/app/tasks.segments/_index.segment.rsc +7 -7
  128. package/.next/server/app/tasks.segments/_tree.segment.rsc +2 -2
  129. package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +4 -4
  130. package/.next/server/app/tasks.segments/tasks.segment.rsc +3 -3
  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/chunks/ssr/agent-network-dashboard_app_components_0mvyi-4._.js +1 -1
  140. package/.next/server/chunks/ssr/agent-network-dashboard_app_components_0mvyi-4._.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/006dxnaf1ojoc.js +1 -0
  145. package/.next/static/chunks/05-~ezd16iskp.css +2 -0
  146. package/.next/static/chunks/069b9-o1a2f0v.js +4 -0
  147. package/.next/static/chunks/{16p3.8p0yi.1p.js → 0bbv-sge~hmdb.js} +1 -1
  148. package/.next/static/chunks/0k930mbg_qx0j.js +1 -0
  149. package/.next/static/chunks/{03a4--7ncekmk.js → 0v4-5tng.uh.7.js} +2 -2
  150. package/.next/trace +2 -2
  151. package/.next/trace-build +1 -1
  152. package/app/components/ServersDrawer.tsx +16 -3
  153. package/app/components/TopoGraph.tsx +3688 -162
  154. package/app/globals.css +58 -7
  155. package/package.json +4 -4
  156. package/scripts/p157-servers-copy-test.mjs +95 -0
  157. package/scripts/topo-active-chrome-hover-text-test.mjs +107 -0
  158. package/scripts/topo-alias-chat-brightness-test.mjs +79 -0
  159. package/scripts/topo-avatar-chat-gate-test.mjs +77 -0
  160. package/scripts/topo-avatar-drop-shadow-test.mjs +86 -0
  161. package/scripts/topo-avatar-fallback-hover-test.mjs +104 -0
  162. package/scripts/topo-avatar-fallback-rotate-test.mjs +92 -0
  163. package/scripts/topo-avatar-rotate-test.mjs +85 -0
  164. package/scripts/topo-avatar-scale-test.mjs +89 -0
  165. package/scripts/topo-badge-chat-gate-test.mjs +74 -0
  166. package/scripts/topo-brand-drop-shadow-test.mjs +71 -0
  167. package/scripts/topo-brand-logo-breath-test.mjs +102 -0
  168. package/scripts/topo-brand-logo-hover-brightness-test.mjs +105 -0
  169. package/scripts/topo-brand-logo-hover-rotate-test.mjs +93 -0
  170. package/scripts/topo-brand-logo-hover-test.mjs +85 -0
  171. package/scripts/topo-card-chat-brightness-test.mjs +86 -0
  172. package/scripts/topo-chat-ring-brightness-test.mjs +80 -0
  173. package/scripts/topo-chip-row-digit-ls-test.mjs +135 -0
  174. package/scripts/topo-chip-row-member-alias-lit-test.mjs +154 -0
  175. package/scripts/topo-chip-row-tier-glow-brightness-test.mjs +99 -0
  176. package/scripts/topo-chip-row-unit-hover-tracking-test.mjs +124 -0
  177. package/scripts/topo-click-ripple-glow-test.mjs +86 -0
  178. package/scripts/topo-cluster-count-attr-test.mjs +80 -0
  179. package/scripts/topo-crescent-breath-test.mjs +104 -0
  180. package/scripts/topo-crescent-recede-test.mjs +111 -0
  181. package/scripts/topo-edge-badge-circle-brightness-test.mjs +82 -0
  182. package/scripts/topo-edge-badge-hover-glow-test.mjs +90 -0
  183. package/scripts/topo-edge-badge-text-brightness-test.mjs +83 -0
  184. package/scripts/topo-edge-chat-gate-test.mjs +71 -0
  185. package/scripts/topo-edge-particle-brightness-test.mjs +82 -0
  186. package/scripts/topo-edge-pill-glow-test.mjs +67 -0
  187. package/scripts/topo-edge-visible-brightness-test.mjs +84 -0
  188. package/scripts/topo-endpoint-ring-brightness-test.mjs +83 -0
  189. package/scripts/topo-filter-pill-glow-test.mjs +90 -0
  190. package/scripts/topo-fleet-density-tier-test.mjs +84 -0
  191. package/scripts/topo-flow-arrow-brightness-test.mjs +82 -0
  192. package/scripts/topo-flow-rail-brightness-test.mjs +80 -0
  193. package/scripts/topo-freshness-chip-fade-test.mjs +105 -0
  194. package/scripts/topo-fullscreen-attr-test.mjs +73 -0
  195. package/scripts/topo-fullscreen-brightness-test.mjs +84 -0
  196. package/scripts/topo-fullscreen-icon-rotate-test.mjs +93 -0
  197. package/scripts/topo-grid-content-bottom-attr-test.mjs +72 -0
  198. package/scripts/topo-group-box-brightness-test.mjs +84 -0
  199. package/scripts/topo-group-chat-gate-test.mjs +77 -0
  200. package/scripts/topo-group-label-brightness-test.mjs +84 -0
  201. package/scripts/topo-group-label-hover-glow-test.mjs +86 -0
  202. package/scripts/topo-group-label-member-alias-hover-test.mjs +125 -0
  203. package/scripts/topo-group-pill-glow-test.mjs +76 -0
  204. package/scripts/topo-group-tint-brightness-test.mjs +82 -0
  205. package/scripts/topo-halo-chat-gate-test.mjs +72 -0
  206. package/scripts/topo-hub-core-brightness-test.mjs +82 -0
  207. package/scripts/topo-hub-digit-brightness-test.mjs +79 -0
  208. package/scripts/topo-hub-digit-ls-test.mjs +119 -0
  209. package/scripts/topo-hub-halo-brightness-test.mjs +80 -0
  210. package/scripts/topo-hub-halo-glow-test.mjs +96 -0
  211. package/scripts/topo-hub-highlight-amplify-test.mjs +139 -0
  212. package/scripts/topo-hub-highlight-brightness-test.mjs +84 -0
  213. package/scripts/topo-hub-highlight-fill-transition-test.mjs +84 -0
  214. package/scripts/topo-hub-highlight-glow-test.mjs +99 -0
  215. package/scripts/topo-hub-highlight-r-test.mjs +112 -0
  216. package/scripts/topo-hub-highlight-recede-test.mjs +144 -0
  217. package/scripts/topo-hub-highlight-theme-fill-test.mjs +83 -0
  218. package/scripts/topo-hub-hover-ring-brightness-test.mjs +79 -0
  219. package/scripts/topo-hub-hover-ring-glow-test.mjs +97 -0
  220. package/scripts/topo-hub-idle-breath-test.mjs +7 -2
  221. package/scripts/topo-hub-recede-test.mjs +124 -0
  222. package/scripts/topo-hub-spoke-brightness-test.mjs +77 -0
  223. package/scripts/topo-hub-spoke-glow-test.mjs +112 -0
  224. package/scripts/topo-label-card-brightness-test.mjs +81 -0
  225. package/scripts/topo-layout-hover-fw-test.mjs +98 -0
  226. package/scripts/topo-layout-toggle-brightness-test.mjs +94 -0
  227. package/scripts/topo-legend-count-brightness-test.mjs +80 -0
  228. package/scripts/topo-legend-count-letter-spacing-test.mjs +108 -0
  229. package/scripts/topo-legend-label-fw-test.mjs +107 -0
  230. package/scripts/topo-legend-pin-ring-brightness-test.mjs +82 -0
  231. package/scripts/topo-legend-row-count-brightness-test.mjs +85 -0
  232. package/scripts/topo-legend-row-label-glow-test.mjs +102 -0
  233. package/scripts/topo-legend-swatch-glow-test.mjs +109 -0
  234. package/scripts/topo-legend-swatch-member-alias-match-test.mjs +139 -0
  235. package/scripts/topo-legend-tint-brightness-test.mjs +83 -0
  236. package/scripts/topo-minimap-hover-glow-test.mjs +109 -0
  237. package/scripts/topo-more-footer-brightness-test.mjs +94 -0
  238. package/scripts/topo-node-alias-brightness-test.mjs +84 -0
  239. package/scripts/topo-node-sub-text-brightness-test.mjs +88 -0
  240. package/scripts/topo-nodesize-brightness-test.mjs +82 -0
  241. package/scripts/topo-nodesize-hover-fw-test.mjs +99 -0
  242. package/scripts/topo-orphan-box-dash-test.mjs +89 -0
  243. package/scripts/topo-orphan-fill-opacity-test.mjs +91 -0
  244. package/scripts/topo-orphan-label-opacity-test.mjs +98 -0
  245. package/scripts/topo-panel-count-hover-ls-test.mjs +87 -0
  246. package/scripts/topo-panel-row-brightness-test.mjs +116 -0
  247. package/scripts/topo-panel-title-brightness-test.mjs +98 -0
  248. package/scripts/topo-panel-title-glow-test.mjs +111 -0
  249. package/scripts/topo-pill-x-rotate-test.mjs +96 -0
  250. package/scripts/topo-pinned-aspect-test.mjs +89 -0
  251. package/scripts/topo-pip-brightness-test.mjs +85 -0
  252. package/scripts/topo-pressure-seg-glow-test.mjs +92 -0
  253. package/scripts/topo-pressure-seg-member-alias-match-test.mjs +133 -0
  254. package/scripts/topo-pressure-seg-motion-test.mjs +101 -0
  255. package/scripts/topo-recent-count-brightness-test.mjs +84 -0
  256. package/scripts/topo-recent-more-fw-test.mjs +126 -0
  257. package/scripts/topo-recent-row-chat-gate-test.mjs +75 -0
  258. package/scripts/topo-recent-row-fw-test.mjs +115 -0
  259. package/scripts/topo-recent-row-text-glow-test.mjs +86 -0
  260. package/scripts/topo-recent-tint-brightness-test.mjs +80 -0
  261. package/scripts/topo-recent-ts-brightness-test.mjs +86 -0
  262. package/scripts/topo-reduced-motion-attr-test.mjs +69 -0
  263. package/scripts/topo-reset-brightness-test.mjs +83 -0
  264. package/scripts/topo-reset-icon-hover-scale-test.mjs +102 -0
  265. package/scripts/topo-runtime-badge-brightness-test.mjs +78 -0
  266. package/scripts/topo-runtime-badge-glow-test.mjs +108 -0
  267. package/scripts/topo-runtime-badge-rotate-test.mjs +85 -0
  268. package/scripts/topo-spoke-chat-gate-test.mjs +72 -0
  269. package/scripts/topo-starfield-hue-test.mjs +109 -0
  270. package/scripts/topo-status-ring-brightness-test.mjs +84 -0
  271. package/scripts/topo-status-ring-chat-gate-test.mjs +72 -0
  272. package/scripts/topo-sub-text-chat-brightness-test.mjs +81 -0
  273. package/scripts/topo-titleblock-h2-hover-fw-test.mjs +109 -0
  274. package/scripts/topo-titleblock-h2-hover-tracking-test.mjs +128 -0
  275. package/scripts/topo-titleblock-kicker-hover-test.mjs +134 -0
  276. package/scripts/topo-vendor-chip-glow-test.mjs +97 -0
  277. package/scripts/topo-vendor-pill-glow-test.mjs +98 -0
  278. package/scripts/topo-watermark-breath-test.mjs +100 -0
  279. package/scripts/topo-watermark-recede-test.mjs +114 -0
  280. package/scripts/topo-zoom-buttons-brightness-test.mjs +94 -0
  281. package/scripts/topo-zoom-level-brightness-test.mjs +83 -0
  282. package/scripts/topo-zoom-level-color-test.mjs +105 -0
  283. package/.next/static/chunks/0ckoz2evm~lvq.js +0 -1
  284. package/.next/static/chunks/0m.1mvl~t.avc.css +0 -2
  285. package/.next/static/chunks/0qf8ynb6zk1~~.js +0 -4
  286. package/.next/static/chunks/10s69w5k6v8cr.js +0 -1
  287. /package/.next/static/{Q8lkSZiF_OETF8cugX0IW → AGbxLByQywWb5JcOo5dTf}/_buildManifest.js +0 -0
  288. /package/.next/static/{Q8lkSZiF_OETF8cugX0IW → AGbxLByQywWb5JcOo5dTf}/_clientMiddlewareManifest.js +0 -0
  289. /package/.next/static/{Q8lkSZiF_OETF8cugX0IW → AGbxLByQywWb5JcOo5dTf}/_ssgManifest.js +0 -0
@@ -0,0 +1,101 @@
1
+ /* Round 524 verification: pressure-bar segment width + filter motion
2
+ * restored — extends .anet-topo-chip-focus transition-property list
3
+ * to include `width` and `filter`, fixing the R165/R210 motion
4
+ * polishes silently broken by R490.
5
+ *
6
+ * Test phases:
7
+ * 1. computed transition on pressure-seg includes:
8
+ * - background-color (R510 family, R83 box-shadow already works)
9
+ * - width (R165 restoration ← R524)
10
+ * - filter (R210 brightness restoration ← R524)
11
+ * all at 200ms ease-out
12
+ * 2. globals.css source confirms width + filter in property list
13
+ * 3. hover the segment → filter brightness applied + transitioning
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, status) => ({
36
+ alias, status, 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: [
41
+ mk('a·1', 'working'),
42
+ mk('a·2', 'idle'),
43
+ mk('a·3', 'offline'),
44
+ ] } });
45
+ });
46
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
47
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
48
+ const page = await ctx.newPage();
49
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
50
+ await page.waitForSelector('[data-pressure-seg="working"]', { timeout: 15000 });
51
+ await page.waitForTimeout(800);
52
+
53
+ const rest = await page.evaluate(() => {
54
+ const el = document.querySelector('[data-pressure-seg="working"]');
55
+ if (!el) return null;
56
+ const cs = getComputedStyle(el);
57
+ return {
58
+ transition: cs.transition,
59
+ transitionProp: cs.transitionProperty,
60
+ transitionDur: cs.transitionDuration,
61
+ filter: cs.filter,
62
+ };
63
+ });
64
+
65
+ // Hover the segment → filter should apply
66
+ await page.hover('[data-pressure-seg="working"]');
67
+ await page.waitForTimeout(350);
68
+ const hover = await page.evaluate(() => {
69
+ const el = document.querySelector('[data-pressure-seg="working"]');
70
+ if (!el) return null;
71
+ const cs = getComputedStyle(el);
72
+ return {
73
+ filter: cs.filter,
74
+ };
75
+ });
76
+
77
+ await browser.close();
78
+
79
+ const css = readFileSync('/home/vansin/agent-network-dashboard/app/globals.css', 'utf8');
80
+ const cssHasWidth =
81
+ /\.anet-topo-chip-focus[\s\S]*?transition-property:[\s\S]*?width[\s\S]*?!important/.test(css);
82
+ const cssHasFilter =
83
+ /\.anet-topo-chip-focus[\s\S]*?transition-property:[\s\S]*?filter[\s\S]*?!important/.test(css);
84
+
85
+ const results = {
86
+ has_width_in_prop: /(^|,\s*)width(,|$)/.test(rest?.transitionProp || '') ||
87
+ /\bwidth\b/.test(rest?.transitionProp || ''),
88
+ has_filter_in_prop: /\bfilter\b/.test(rest?.transitionProp || ''),
89
+ has_bg_color_in_prop: /background-color/.test(rest?.transitionProp || ''), // sanity
90
+ duration_200ms: /(200ms|0\.2s)/.test(rest?.transitionDur || ''),
91
+ rest_no_filter: rest?.filter === 'none' || rest?.filter === '',
92
+ hover_filter_brightness: /brightness\(1\.2\)/.test(hover?.filter || ''),
93
+ css_width_in_list: cssHasWidth,
94
+ css_filter_in_list: cssHasFilter,
95
+ };
96
+ const ok = Object.values(results).every(Boolean);
97
+ console.log(`${ok ? '✅' : '❌'} R524 pressure-seg motion restored:`,
98
+ JSON.stringify(results, null, 2),
99
+ '\n rest:', JSON.stringify(rest),
100
+ '\n hover.filter:', hover?.filter);
101
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,84 @@
1
+ /* Round 589 verification: recent-signal panel count <text>
2
+ * root gains filter brightness(1.15) on hoveredPanel ===
3
+ * 'recent'. 28th anchor in per-element brightness family.
4
+ * Sibling to R588 at legend panel — closes panel-pair
5
+ * brightness symmetry at the header-count scope.
6
+ *
7
+ * Test phases:
8
+ * 1. mock 1 flow message → recent-signal panel renders count
9
+ * 2. rest (no panel hover): filter='none', brightness-attr='1'
10
+ * 3. transition-property contains 'filter'
11
+ * 4. source: filter conditional + data-attr + transition extension
12
+ */
13
+ import { chromium } from 'playwright';
14
+ import { readFileSync } from 'node:fs';
15
+
16
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
17
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
18
+
19
+ const browser = await chromium.launch({ headless: true });
20
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
21
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
22
+ await ctx.addInitScript(() => {
23
+ try {
24
+ localStorage.setItem('anet-theme', 'cyber');
25
+ localStorage.setItem('anet-topo-layout', 'ring');
26
+ sessionStorage.setItem('anet_v3_auth', '1');
27
+ } catch {}
28
+ });
29
+ await ctx.route('**/api/hub/status*', async (route) => {
30
+ const r = await route.fetch();
31
+ const b = await r.json();
32
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
33
+ const mk = (alias) => ({
34
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
35
+ network_id: nid, project_dir: null,
36
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
37
+ });
38
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
39
+ });
40
+ // recent-signal panel renders only when flowLinks.length > 0
41
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [
42
+ { from_alias: 'a·1', to_alias: 'a·2', content: 'hi', created_at: fresh },
43
+ ] } }));
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-recent-panel-count-brightness]', { timeout: 15000, state: 'attached' });
48
+ await page.waitForTimeout(500);
49
+
50
+ const rest = await page.evaluate(() => {
51
+ const el = document.querySelector('[data-recent-panel-count-brightness]');
52
+ if (!el) return null;
53
+ const cs = getComputedStyle(el);
54
+ return {
55
+ filter: cs.filter,
56
+ transitionProperty: cs.transitionProperty,
57
+ brightnessAttr: el.getAttribute('data-recent-panel-count-brightness'),
58
+ letterSpacingAttr: el.getAttribute('data-recent-panel-count-letter-spacing'),
59
+ textContent: el.textContent,
60
+ };
61
+ });
62
+
63
+ await browser.close();
64
+
65
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
66
+ const sourceFilter = /filter: hoveredPanel === 'recent' \? 'brightness\(1\.15\)' : undefined/.test(src);
67
+ const sourceAttr = /data-recent-panel-count-brightness=\{hoveredPanel === 'recent' \? '1\.15' : '1'\}/.test(src);
68
+ const sourceTransition = /transition: 'letter-spacing 200ms ease-out, filter 200ms ease-out'/.test(src);
69
+
70
+ const results = {
71
+ count_present: !!rest,
72
+ rest_filter_none: rest?.filter === 'none',
73
+ rest_brightness_1: rest?.brightnessAttr === '1',
74
+ rest_letter_spacing: rest?.letterSpacingAttr === '0.2',
75
+ transition_has_filter: /filter/.test(rest?.transitionProperty || ''),
76
+ source_filter: sourceFilter,
77
+ source_attr: sourceAttr,
78
+ source_transition: sourceTransition,
79
+ };
80
+ const ok = Object.values(results).every(Boolean);
81
+ console.log(`${ok ? '✅' : '❌'} R589 recent-panel-count brightness (28th anchor, panel-pair symmetry closure):`,
82
+ JSON.stringify(results, null, 2),
83
+ `\n rest: ${JSON.stringify(rest)}`);
84
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,126 @@
1
+ /* Round 520 verification: `+N more flows` footer gains 5-axis hover
2
+ * signature by adding fontWeight 500 → 600 on hover. Closes R475
3
+ * panel-text cadence at this last 150ms holdout.
4
+ *
5
+ * Test phases:
6
+ * 1. rest: fw=500, attr='500', opacity=0.55, ls=0.2px, no underline
7
+ * + transition list includes opacity at 200ms (not 150ms)
8
+ * 2. hover: fw=600, attr='600', opacity=0.85, ls=0.3px, underline
9
+ * 3. source-side regex confirms fw ternary + cadence
10
+ *
11
+ * Needs flowLinks > 3 to render the footer — uses 5 working sessions
12
+ * with at least 1 inbound flow each via mock messages.
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: 'working', 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('a·1'), mk('a·2'), mk('a·3'), mk('a·4'), mk('a·5'), mk('a·6'),
41
+ ] } });
42
+ });
43
+ // Mock 6 recent messages → 6 flowLinks → "+ 3 more flows" footer (top-3 visible)
44
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: {
45
+ messages: [
46
+ { id: 'm1', from_alias: 'a·1', to_alias: 'a·2', content: 't', created_at: fresh },
47
+ { id: 'm2', from_alias: 'a·2', to_alias: 'a·3', content: 't', created_at: fresh },
48
+ { id: 'm3', from_alias: 'a·3', to_alias: 'a·4', content: 't', created_at: fresh },
49
+ { id: 'm4', from_alias: 'a·4', to_alias: 'a·5', content: 't', created_at: fresh },
50
+ { id: 'm5', from_alias: 'a·5', to_alias: 'a·6', content: 't', created_at: fresh },
51
+ { id: 'm6', from_alias: 'a·6', to_alias: 'a·1', content: 't', created_at: fresh },
52
+ ]
53
+ } }));
54
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
55
+ const page = await ctx.newPage();
56
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
57
+ await page.waitForSelector('[data-recent-panel-more]', { timeout: 15000 });
58
+ await page.waitForTimeout(1000);
59
+
60
+ const sel = '[data-recent-panel-more]';
61
+
62
+ // Phase 1: rest
63
+ const rest = await page.evaluate((sel) => {
64
+ const el = document.querySelector(sel);
65
+ if (!el) return null;
66
+ const cs = getComputedStyle(el);
67
+ return {
68
+ attrFw: el.getAttribute('data-recent-panel-more-font-weight'),
69
+ attrHovered: el.getAttribute('data-recent-panel-more-hovered'),
70
+ attrTrans: el.getAttribute('data-recent-panel-more-transition'),
71
+ fontWeight: cs.fontWeight,
72
+ opacity: cs.opacity,
73
+ letterSpacing: cs.letterSpacing,
74
+ textDecoration:cs.textDecorationLine,
75
+ transition: cs.transition,
76
+ };
77
+ }, sel);
78
+
79
+ // Phase 2: hover the parent <g> (text is wrapped in a click-target <g>)
80
+ await page.hover('[data-recent-panel-more-nav]');
81
+ await page.waitForTimeout(350);
82
+ const hover = await page.evaluate((sel) => {
83
+ const el = document.querySelector(sel);
84
+ if (!el) return null;
85
+ const cs = getComputedStyle(el);
86
+ return {
87
+ attrFw: el.getAttribute('data-recent-panel-more-font-weight'),
88
+ attrHovered: el.getAttribute('data-recent-panel-more-hovered'),
89
+ fontWeight: cs.fontWeight,
90
+ opacity: cs.opacity,
91
+ letterSpacing: cs.letterSpacing,
92
+ textDecoration:cs.textDecorationLine,
93
+ };
94
+ }, sel);
95
+
96
+ await browser.close();
97
+
98
+ // Phase 3: source regex
99
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
100
+ const sourceWiredFw =
101
+ /fontWeight=\{hoveredRecentMore \? '600' : '500'\}/.test(src) &&
102
+ /data-recent-panel-more-font-weight=\{hoveredRecentMore \? '600' : '500'\}/.test(src);
103
+ const sourceWiredCadence =
104
+ /transition: 'opacity 200ms ease-out, fill 200ms ease-out, letter-spacing 200ms ease-out, font-weight 200ms ease-out'/.test(src);
105
+
106
+ const results = {
107
+ rest_attr_fw_500: rest?.attrFw === '500',
108
+ rest_attr_hovered_false: rest?.attrHovered === 'false',
109
+ rest_attr_trans_200: rest?.attrTrans === '200ms',
110
+ rest_fw_500: rest?.fontWeight === '500',
111
+ rest_underline_none: rest?.textDecoration === 'none' || rest?.textDecoration === '',
112
+ rest_transition_200: /(200ms|0\.2s).+font-weight|font-weight.+(200ms|0\.2s)/.test(rest?.transition || '') ||
113
+ /(200ms|0\.2s)/.test(rest?.transition || ''),
114
+ hover_attr_fw_600: hover?.attrFw === '600',
115
+ hover_attr_hovered_true: hover?.attrHovered === 'true',
116
+ hover_fw_600: hover?.fontWeight === '600',
117
+ hover_letter_spacing_3: hover?.letterSpacing === '0.3px',
118
+ hover_underline: /underline/.test(hover?.textDecoration || ''),
119
+ source_fw_ternary: sourceWiredFw,
120
+ source_cadence_4axis: sourceWiredCadence,
121
+ };
122
+ const ok = Object.values(results).every(Boolean);
123
+ console.log(`${ok ? '✅' : '❌'} R520 recent-panel-more 5-axis hover + 200ms cadence:`,
124
+ JSON.stringify(results, null, 2),
125
+ '\n rest:', JSON.stringify(rest), '\n hover:', JSON.stringify(hover));
126
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,75 @@
1
+ /* Round 625 — extend isRowActive gate to include chat-target
2
+ * endpoint match. Recent-row tint rect (R611) brightens when
3
+ * row's from/to matches chatAlias. 11th anchor in chat-target-
4
+ * gated brightness family.
5
+ *
6
+ * Test phases:
7
+ * 1. mock 1 flow message → recent-row + tint rect render
8
+ * 2. rest (no hover, no chat): tint rect at rest, no
9
+ * brightness, fill 'transparent'
10
+ * 3. source: isRowActive declaration includes
11
+ * isChatEndpointRow term
12
+ */
13
+ import { chromium } from 'playwright';
14
+ import { readFileSync } from 'node:fs';
15
+
16
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
17
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
18
+
19
+ const browser = await chromium.launch({ headless: true });
20
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
21
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
22
+ await ctx.addInitScript(() => {
23
+ try {
24
+ localStorage.setItem('anet-theme', 'cyber');
25
+ localStorage.setItem('anet-topo-layout', 'ring');
26
+ sessionStorage.setItem('anet_v3_auth', '1');
27
+ } catch {}
28
+ });
29
+ await ctx.route('**/api/hub/status*', async (route) => {
30
+ const r = await route.fetch();
31
+ const b = await r.json();
32
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
33
+ const mk = (alias) => ({
34
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
35
+ network_id: nid, project_dir: null,
36
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
37
+ });
38
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
39
+ });
40
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [
41
+ { from_alias: 'a·1', to_alias: 'a·2', content: 'hi', created_at: fresh },
42
+ ] } }));
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-recent-row-tint-brightness]', { timeout: 15000, state: 'attached' });
47
+ await page.waitForTimeout(500);
48
+
49
+ const rest = await page.evaluate(() => {
50
+ const el = document.querySelector('[data-recent-row-tint-brightness]');
51
+ if (!el) return null;
52
+ return {
53
+ brightnessAttr: el.getAttribute('data-recent-row-tint-brightness'),
54
+ fill: el.getAttribute('fill'),
55
+ };
56
+ });
57
+
58
+ await browser.close();
59
+
60
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
61
+ const sourceChatEndpoint = /const isChatEndpointRow = !!chatAlias && \(link\.from === chatAlias \|\| link\.to === chatAlias\)/.test(src);
62
+ const sourceRowActive = /const isRowActive\s+= isRowHovered \|\| isRowPinned \|\| isChatEndpointRow/.test(src);
63
+
64
+ const results = {
65
+ tint_present: !!rest,
66
+ rest_brightness_1: rest?.brightnessAttr === '1',
67
+ rest_fill_transparent: rest?.fill === 'transparent',
68
+ source_chat_endpoint: sourceChatEndpoint,
69
+ source_row_active_with_chat: sourceRowActive,
70
+ };
71
+ const ok = Object.values(results).every(Boolean);
72
+ console.log(`${ok ? '✅' : '❌'} R625 recent-row chat-endpoint gate (chat-gated family 11th anchor):`,
73
+ JSON.stringify(results, null, 2),
74
+ `\n rest: ${JSON.stringify(rest)}`);
75
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,115 @@
1
+ /* Round 530 verification: recent-row alias text gains fontWeight 500
2
+ * → 600 on hover OR pin. Hover-fw family 7th anchor.
3
+ *
4
+ * Test phases (needs ≥1 flowLink for recent-row to render):
5
+ * 1. rest: fw=500, attr='500', hovered/pinned='false'
6
+ * 2. hover row (via hover the row's text element):
7
+ * fw=600, attr='600', hovered='true'
8
+ * 3. mouseleave: fw returns to 500
9
+ * 4. count tspan unaffected (R320 inline fw=600 preserved)
10
+ * 5. source-side regex confirms ternary + transition wiring
11
+ */
12
+ import { chromium } from 'playwright';
13
+ import { readFileSync } from 'node:fs';
14
+
15
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
16
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
17
+
18
+ const browser = await chromium.launch({ headless: true });
19
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
20
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
21
+ await ctx.addInitScript(() => {
22
+ try {
23
+ localStorage.setItem('anet-theme', 'cyber');
24
+ localStorage.setItem('anet-topo-layout', 'ring');
25
+ sessionStorage.setItem('anet_v3_auth', '1');
26
+ } catch {}
27
+ });
28
+ await ctx.route('**/api/hub/status*', async (route) => {
29
+ const r = await route.fetch();
30
+ const b = await r.json();
31
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
32
+ const mk = (alias) => ({
33
+ alias, status: 'working', model: 'claude-opus-4', runtime: 'claude-code-cli',
34
+ network_id: nid, project_dir: null,
35
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
36
+ });
37
+ await route.fulfill({ response: r, json: { ...b, sessions: [
38
+ mk('a·1'), mk('a·2'),
39
+ ] } });
40
+ });
41
+ // 1 flow → 1 recent-row visible
42
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: {
43
+ messages: [{ id: 'm1', from_alias: 'a·1', to_alias: 'a·2', content: 'test', created_at: fresh }]
44
+ } }));
45
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
46
+ const page = await ctx.newPage();
47
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
48
+ await page.waitForSelector('[data-recent-row-text]', { timeout: 15000 });
49
+ await page.waitForTimeout(800);
50
+
51
+ const sel = '[data-recent-row-text]';
52
+
53
+ const restRead = async () => page.evaluate((sel) => {
54
+ const el = document.querySelector(sel);
55
+ if (!el) return null;
56
+ const cs = getComputedStyle(el);
57
+ return {
58
+ attrFw: el.getAttribute('data-recent-row-text-font-weight'),
59
+ attrPinned: el.getAttribute('data-recent-row-text-pinned'),
60
+ attrHovered: el.getAttribute('data-recent-row-text-hovered'),
61
+ fontWeight: cs.fontWeight,
62
+ transition: cs.transition,
63
+ };
64
+ }, sel);
65
+
66
+ // Phase 1: rest
67
+ const rest = await restRead();
68
+
69
+ // Phase 2: hover the row's hitbox (rect parent) — the row text
70
+ // has pointer-events behavior driven by row-level hover handlers.
71
+ // Look for the row group's tint rect or rect hitbox.
72
+ const bbox = await page.locator(sel).first().boundingBox();
73
+ if (bbox) {
74
+ await page.mouse.move(bbox.x + bbox.width / 2, bbox.y + bbox.height / 2);
75
+ }
76
+ await page.waitForTimeout(400);
77
+ const hover = await restRead();
78
+
79
+ // Phase 3: mouseleave
80
+ await page.mouse.move(50, 50);
81
+ await page.waitForTimeout(400);
82
+ const leave = await restRead();
83
+
84
+ await browser.close();
85
+
86
+ // Source regex
87
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
88
+ const sourceFwTernary =
89
+ /fontWeight=\{\(isRowHovered \|\| isRowPinned\) \? '600' : '500'\}/.test(src);
90
+ const sourceAttrWired =
91
+ /data-recent-row-text-font-weight=\{\(isRowHovered \|\| isRowPinned\) \? '600' : '500'\}/.test(src);
92
+ const sourceTransitionExt =
93
+ /transition: 'fill 200ms ease-out, letter-spacing 200ms ease-out, font-weight 200ms ease-out'/.test(src);
94
+
95
+ const results = {
96
+ rest_attr_500: rest?.attrFw === '500',
97
+ rest_fw_500: rest?.fontWeight === '500',
98
+ rest_hovered_false: rest?.attrHovered === 'false',
99
+ rest_pinned_false: rest?.attrPinned === 'false',
100
+ hover_attr_600: hover?.attrFw === '600',
101
+ hover_fw_600: hover?.fontWeight === '600',
102
+ hover_hovered_true: hover?.attrHovered === 'true',
103
+ leave_attr_500: leave?.attrFw === '500',
104
+ leave_fw_500: leave?.fontWeight === '500',
105
+ source_fw_ternary: sourceFwTernary,
106
+ source_attr_wired: sourceAttrWired,
107
+ source_transition_ext: sourceTransitionExt,
108
+ };
109
+ const ok = Object.values(results).every(Boolean);
110
+ console.log(`${ok ? '✅' : '❌'} R530 recent-row hover-fw:`,
111
+ JSON.stringify(results, null, 2),
112
+ '\n rest:', JSON.stringify(rest),
113
+ '\n hover:', JSON.stringify(hover),
114
+ '\n leave:', JSON.stringify(leave));
115
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,86 @@
1
+ /* Round 568 verification: recent-row text gains drop-shadow glow
2
+ * on isRowHovered || isRowPinned. 17th anchor in drop-shadow
3
+ * visual-polish family. 4-axis hover signature now complete at
4
+ * recent-row text scope (fill + ls + fw + glow).
5
+ *
6
+ * Test phases:
7
+ * 1. mock 1 message → recent-panel renders with 1 row
8
+ * 2. rest: row text filter='none', glow-attr='false'
9
+ * 3. source: filter conditional + transition extension + data-attr
10
+ *
11
+ * Live hover-state probe relies on Playwright .hover() on SVG which
12
+ * has known reliability issues (R525 banked) — use source-canonical
13
+ * for the gate verification + rest-state probe for the rest behavior.
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'), mk('a·2')] } });
41
+ });
42
+ // 1 message so flowLinks > 0 → recent-panel renders with 1 row
43
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [
44
+ { from_alias: 'a·1', to_alias: 'a·2', content: 'hi', created_at: fresh },
45
+ ] } }));
46
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
47
+ const page = await ctx.newPage();
48
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
49
+ await page.waitForSelector('[data-recent-row-text]', { timeout: 15000 });
50
+ await page.waitForTimeout(500);
51
+
52
+ const rest = await page.evaluate(() => {
53
+ const el = document.querySelector('[data-recent-row-text]');
54
+ if (!el) return null;
55
+ const cs = getComputedStyle(el);
56
+ return {
57
+ filter: cs.filter,
58
+ transitionProperty: cs.transitionProperty,
59
+ glowAttr: el.getAttribute('data-recent-row-text-glow'),
60
+ hoveredAttr: el.getAttribute('data-recent-row-text-hovered'),
61
+ pinnedAttr: el.getAttribute('data-recent-row-text-pinned'),
62
+ };
63
+ });
64
+
65
+ await browser.close();
66
+
67
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
68
+ const sourceFilter = /filter: \(isRowHovered \|\| isRowPinned\)\s*\?\s*`drop-shadow\(0 0 2px \$\{pal\.legendAccent\}80\)`\s*:\s*undefined/.test(src);
69
+ const sourceTransition = /transition: 'fill 200ms ease-out, letter-spacing 200ms ease-out, font-weight 200ms ease-out, filter 200ms ease-out'/.test(src);
70
+ const sourceGlowAttr = /data-recent-row-text-glow=\{\(isRowHovered \|\| isRowPinned\) \? 'true' : 'false'\}/.test(src);
71
+
72
+ const results = {
73
+ rest_filter_none: rest?.filter === 'none',
74
+ rest_glow_attr_false: rest?.glowAttr === 'false',
75
+ rest_hovered_false: rest?.hoveredAttr === 'false',
76
+ rest_pinned_false: rest?.pinnedAttr === 'false',
77
+ transition_has_filter: /filter/.test(rest?.transitionProperty || ''),
78
+ source_filter: sourceFilter,
79
+ source_transition: sourceTransition,
80
+ source_glow_attr: sourceGlowAttr,
81
+ };
82
+ const ok = Object.values(results).every(Boolean);
83
+ console.log(`${ok ? '✅' : '❌'} R568 recent-row text drop-shadow glow (17th anchor in family):`,
84
+ JSON.stringify(results, null, 2),
85
+ `\n rest: ${JSON.stringify(rest)}`);
86
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,80 @@
1
+ /* Round 611 — recent-row tint rect brightness on hover/pin.
2
+ * Sibling to R610 group-label tint rect. 6th anchor in pin/
3
+ * hover-gated brightness family at panel tier.
4
+ *
5
+ * Test phases:
6
+ * 1. mock 1 fresh message → recent-row + tint rect render
7
+ * 2. rest: filter='none', brightness-attr='1'
8
+ * 3. computed transition-property contains 'filter'
9
+ * 4. source: filter conditional + data-attr + transition extension
10
+ */
11
+ import { chromium } from 'playwright';
12
+ import { readFileSync } from 'node:fs';
13
+
14
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
15
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
16
+
17
+ const browser = await chromium.launch({ headless: true });
18
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
19
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
20
+ await ctx.addInitScript(() => {
21
+ try {
22
+ localStorage.setItem('anet-theme', 'cyber');
23
+ localStorage.setItem('anet-topo-layout', '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'), mk('a·2')] } });
37
+ });
38
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [
39
+ { from_alias: 'a·1', to_alias: 'a·2', content: 'hi', created_at: fresh },
40
+ ] } }));
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-recent-row-tint-brightness]', { timeout: 15000, state: 'attached' });
45
+ await page.waitForTimeout(500);
46
+
47
+ const rest = await page.evaluate(() => {
48
+ const el = document.querySelector('[data-recent-row-tint-brightness]');
49
+ if (!el) return null;
50
+ const cs = getComputedStyle(el);
51
+ return {
52
+ filter: cs.filter,
53
+ transitionProperty: cs.transitionProperty,
54
+ brightnessAttr: el.getAttribute('data-recent-row-tint-brightness'),
55
+ transitionAttr: el.getAttribute('data-recent-row-tint-transition'),
56
+ };
57
+ });
58
+
59
+ await browser.close();
60
+
61
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
62
+ const sourceFilter = /filter: isRowActive \? 'brightness\(1\.15\)' : undefined/.test(src);
63
+ const sourceAttr = /data-recent-row-tint-brightness=\{isRowActive \? '1\.15' : '1'\}/.test(src);
64
+ const sourceTransition = /transition: 'fill 200ms ease-out, opacity 200ms ease-out, filter 200ms ease-out'/.test(src);
65
+
66
+ const results = {
67
+ tint_present: !!rest,
68
+ rest_filter_none: rest?.filter === 'none',
69
+ rest_brightness_1: rest?.brightnessAttr === '1',
70
+ transition_attr_200ms: rest?.transitionAttr === '200ms',
71
+ transition_has_filter: /filter/.test(rest?.transitionProperty || ''),
72
+ source_filter: sourceFilter,
73
+ source_attr: sourceAttr,
74
+ source_transition: sourceTransition,
75
+ };
76
+ const ok = Object.values(results).every(Boolean);
77
+ console.log(`${ok ? '✅' : '❌'} R611 recent-row tint rect brightness (panel tier sibling to R610):`,
78
+ JSON.stringify(results, null, 2),
79
+ `\n rest: ${JSON.stringify(rest)}`);
80
+ process.exit(ok ? 0 : 1);