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

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 (359) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +3 -3
  3. package/.next/diagnostics/route-bundle-stats.json +7 -7
  4. package/.next/fallback-build-manifest.json +3 -3
  5. package/.next/server/app/_global-error.html +1 -1
  6. package/.next/server/app/_global-error.rsc +1 -1
  7. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  8. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  12. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  13. package/.next/server/app/_not-found.html +2 -2
  14. package/.next/server/app/_not-found.rsc +2 -2
  15. package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  16. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  17. package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  18. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  19. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  20. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  21. package/.next/server/app/admin/page_client-reference-manifest.js +1 -1
  22. package/.next/server/app/admin.html +2 -2
  23. package/.next/server/app/admin.rsc +2 -2
  24. package/.next/server/app/admin.segments/_full.segment.rsc +2 -2
  25. package/.next/server/app/admin.segments/_head.segment.rsc +1 -1
  26. package/.next/server/app/admin.segments/_index.segment.rsc +2 -2
  27. package/.next/server/app/admin.segments/_tree.segment.rsc +2 -2
  28. package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +1 -1
  29. package/.next/server/app/admin.segments/admin.segment.rsc +1 -1
  30. package/.next/server/app/index.html +2 -2
  31. package/.next/server/app/index.rsc +3 -3
  32. package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  33. package/.next/server/app/index.segments/_full.segment.rsc +3 -3
  34. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  35. package/.next/server/app/index.segments/_index.segment.rsc +2 -2
  36. package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  37. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  38. package/.next/server/app/login.html +2 -2
  39. package/.next/server/app/login.rsc +3 -3
  40. package/.next/server/app/login.segments/_full.segment.rsc +3 -3
  41. package/.next/server/app/login.segments/_head.segment.rsc +1 -1
  42. package/.next/server/app/login.segments/_index.segment.rsc +2 -2
  43. package/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  44. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  45. package/.next/server/app/login.segments/login.segment.rsc +1 -1
  46. package/.next/server/app/logs/page_client-reference-manifest.js +1 -1
  47. package/.next/server/app/logs.html +2 -2
  48. package/.next/server/app/logs.rsc +2 -2
  49. package/.next/server/app/logs.segments/_full.segment.rsc +2 -2
  50. package/.next/server/app/logs.segments/_head.segment.rsc +1 -1
  51. package/.next/server/app/logs.segments/_index.segment.rsc +2 -2
  52. package/.next/server/app/logs.segments/_tree.segment.rsc +2 -2
  53. package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +1 -1
  54. package/.next/server/app/logs.segments/logs.segment.rsc +1 -1
  55. package/.next/server/app/messages/page_client-reference-manifest.js +1 -1
  56. package/.next/server/app/messages.html +2 -2
  57. package/.next/server/app/messages.rsc +2 -2
  58. package/.next/server/app/messages.segments/_full.segment.rsc +2 -2
  59. package/.next/server/app/messages.segments/_head.segment.rsc +1 -1
  60. package/.next/server/app/messages.segments/_index.segment.rsc +2 -2
  61. package/.next/server/app/messages.segments/_tree.segment.rsc +2 -2
  62. package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +1 -1
  63. package/.next/server/app/messages.segments/messages.segment.rsc +1 -1
  64. package/.next/server/app/node/page_client-reference-manifest.js +1 -1
  65. package/.next/server/app/node.html +2 -2
  66. package/.next/server/app/node.rsc +2 -2
  67. package/.next/server/app/node.segments/_full.segment.rsc +2 -2
  68. package/.next/server/app/node.segments/_head.segment.rsc +1 -1
  69. package/.next/server/app/node.segments/_index.segment.rsc +2 -2
  70. package/.next/server/app/node.segments/_tree.segment.rsc +2 -2
  71. package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +1 -1
  72. package/.next/server/app/node.segments/node.segment.rsc +1 -1
  73. package/.next/server/app/nodes/page_client-reference-manifest.js +1 -1
  74. package/.next/server/app/nodes.html +2 -2
  75. package/.next/server/app/nodes.rsc +2 -2
  76. package/.next/server/app/nodes.segments/_full.segment.rsc +2 -2
  77. package/.next/server/app/nodes.segments/_head.segment.rsc +1 -1
  78. package/.next/server/app/nodes.segments/_index.segment.rsc +2 -2
  79. package/.next/server/app/nodes.segments/_tree.segment.rsc +2 -2
  80. package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +1 -1
  81. package/.next/server/app/nodes.segments/nodes.segment.rsc +1 -1
  82. package/.next/server/app/page_client-reference-manifest.js +1 -1
  83. package/.next/server/app/server-logs/page_client-reference-manifest.js +1 -1
  84. package/.next/server/app/server-logs.html +2 -2
  85. package/.next/server/app/server-logs.rsc +2 -2
  86. package/.next/server/app/server-logs.segments/_full.segment.rsc +2 -2
  87. package/.next/server/app/server-logs.segments/_head.segment.rsc +1 -1
  88. package/.next/server/app/server-logs.segments/_index.segment.rsc +2 -2
  89. package/.next/server/app/server-logs.segments/_tree.segment.rsc +2 -2
  90. package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +1 -1
  91. package/.next/server/app/server-logs.segments/server-logs.segment.rsc +1 -1
  92. package/.next/server/app/settings/networks/page_client-reference-manifest.js +1 -1
  93. package/.next/server/app/settings/networks.html +2 -2
  94. package/.next/server/app/settings/networks.rsc +2 -2
  95. package/.next/server/app/settings/networks.segments/_full.segment.rsc +2 -2
  96. package/.next/server/app/settings/networks.segments/_head.segment.rsc +1 -1
  97. package/.next/server/app/settings/networks.segments/_index.segment.rsc +2 -2
  98. package/.next/server/app/settings/networks.segments/_tree.segment.rsc +2 -2
  99. package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +1 -1
  100. package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +1 -1
  101. package/.next/server/app/settings/networks.segments/settings.segment.rsc +1 -1
  102. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  103. package/.next/server/app/settings/tokens/page_client-reference-manifest.js +1 -1
  104. package/.next/server/app/settings/tokens.html +2 -2
  105. package/.next/server/app/settings/tokens.rsc +2 -2
  106. package/.next/server/app/settings/tokens.segments/_full.segment.rsc +2 -2
  107. package/.next/server/app/settings/tokens.segments/_head.segment.rsc +1 -1
  108. package/.next/server/app/settings/tokens.segments/_index.segment.rsc +2 -2
  109. package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +2 -2
  110. package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +1 -1
  111. package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +1 -1
  112. package/.next/server/app/settings/tokens.segments/settings.segment.rsc +1 -1
  113. package/.next/server/app/settings.html +2 -2
  114. package/.next/server/app/settings.rsc +3 -3
  115. package/.next/server/app/settings.segments/_full.segment.rsc +3 -3
  116. package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  117. package/.next/server/app/settings.segments/_index.segment.rsc +2 -2
  118. package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  119. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +2 -2
  120. package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  121. package/.next/server/app/tasks/[id]/page_client-reference-manifest.js +1 -1
  122. package/.next/server/app/tasks/page_client-reference-manifest.js +1 -1
  123. package/.next/server/app/tasks.html +2 -2
  124. package/.next/server/app/tasks.rsc +2 -2
  125. package/.next/server/app/tasks.segments/_full.segment.rsc +2 -2
  126. package/.next/server/app/tasks.segments/_head.segment.rsc +1 -1
  127. package/.next/server/app/tasks.segments/_index.segment.rsc +2 -2
  128. package/.next/server/app/tasks.segments/_tree.segment.rsc +2 -2
  129. package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +1 -1
  130. package/.next/server/app/tasks.segments/tasks.segment.rsc +1 -1
  131. package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js +1 -1
  132. package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js.map +1 -1
  133. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js +4 -4
  134. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js.map +1 -1
  135. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js +1 -1
  136. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js.map +1 -1
  137. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js +1 -1
  138. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js.map +1 -1
  139. package/.next/server/middleware-build-manifest.js +3 -3
  140. package/.next/server/pages/404.html +2 -2
  141. package/.next/server/pages/500.html +1 -1
  142. package/.next/static/chunks/{0l440-mv.tqcj.js → 01y2e_k826-.6.js} +1 -1
  143. package/.next/static/chunks/0l2u50d_2k5uz.js +4 -0
  144. package/.next/static/chunks/0u-m.q18hv~8~.js +1 -0
  145. package/.next/static/chunks/10~rut8fhur6w.css +2 -0
  146. package/.next/static/chunks/14_qeodw_r83j.js +1 -0
  147. package/.next/trace +2 -2
  148. package/.next/trace-build +1 -1
  149. package/app/components/TopoGraph.tsx +5425 -177
  150. package/app/globals.css +405 -7
  151. package/package.json +4 -4
  152. package/scripts/topo-active-chrome-hover-text-test.mjs +107 -0
  153. package/scripts/topo-active-links-chip-halo-layers-test.mjs +81 -0
  154. package/scripts/topo-alias-chat-brightness-test.mjs +79 -0
  155. package/scripts/topo-alias-text-halo-layers-test.mjs +98 -0
  156. package/scripts/topo-avatar-chat-gate-test.mjs +77 -0
  157. package/scripts/topo-avatar-drop-shadow-test.mjs +86 -0
  158. package/scripts/topo-avatar-fallback-hover-test.mjs +104 -0
  159. package/scripts/topo-avatar-fallback-rotate-test.mjs +92 -0
  160. package/scripts/topo-avatar-rotate-test.mjs +85 -0
  161. package/scripts/topo-avatar-scale-test.mjs +89 -0
  162. package/scripts/topo-badge-chat-gate-test.mjs +74 -0
  163. package/scripts/topo-brand-drop-shadow-test.mjs +71 -0
  164. package/scripts/topo-brand-logo-breath-test.mjs +102 -0
  165. package/scripts/topo-brand-logo-halo-layers-test.mjs +85 -0
  166. package/scripts/topo-brand-logo-hover-brightness-test.mjs +105 -0
  167. package/scripts/topo-brand-logo-hover-rotate-test.mjs +93 -0
  168. package/scripts/topo-brand-logo-hover-test.mjs +85 -0
  169. package/scripts/topo-card-chat-brightness-test.mjs +86 -0
  170. package/scripts/topo-chat-ring-breath-curve-test.mjs +114 -0
  171. package/scripts/topo-chat-ring-brightness-test.mjs +80 -0
  172. package/scripts/topo-chat-ring-halo-layers-test.mjs +100 -0
  173. package/scripts/topo-chat-ring-r-breath-test.mjs +121 -0
  174. package/scripts/topo-chat-ring-status-halo-test.mjs +106 -0
  175. package/scripts/topo-chat-ring-sw-breath-test.mjs +123 -0
  176. package/scripts/topo-chip-pin-halo-test.mjs +85 -0
  177. package/scripts/topo-chip-row-digit-ls-test.mjs +135 -0
  178. package/scripts/topo-chip-row-member-alias-lit-test.mjs +154 -0
  179. package/scripts/topo-chip-row-tier-glow-brightness-test.mjs +99 -0
  180. package/scripts/topo-chip-row-unit-hover-tracking-test.mjs +124 -0
  181. package/scripts/topo-chrome-control-halo-layers-test.mjs +22 -0
  182. package/scripts/topo-chrome-layout-trailer-breath-test.mjs +86 -0
  183. package/scripts/topo-chrome-wrapper-halo-test.mjs +83 -0
  184. package/scripts/topo-click-ripple-glow-test.mjs +86 -0
  185. package/scripts/topo-click-ripple-halo-layers-test.mjs +79 -0
  186. package/scripts/topo-click-ripple-sw-test.mjs +110 -0
  187. package/scripts/topo-cluster-count-attr-test.mjs +80 -0
  188. package/scripts/topo-crescent-breath-test.mjs +104 -0
  189. package/scripts/topo-crescent-envelope-breath-test.mjs +103 -0
  190. package/scripts/topo-crescent-recede-test.mjs +111 -0
  191. package/scripts/topo-dense-alias-chat-halo-test.mjs +73 -0
  192. package/scripts/topo-dense-alias-halo-layers-test.mjs +80 -0
  193. package/scripts/topo-edge-badge-circle-brightness-test.mjs +82 -0
  194. package/scripts/topo-edge-badge-circle-hot-pulse-test.mjs +100 -0
  195. package/scripts/topo-edge-badge-digit-halo-layers-test.mjs +107 -0
  196. package/scripts/topo-edge-badge-endpoint-gate-test.mjs +94 -0
  197. package/scripts/topo-edge-badge-halo-layers-test.mjs +85 -0
  198. package/scripts/topo-edge-badge-hot-pulse-test.mjs +92 -0
  199. package/scripts/topo-edge-badge-hover-glow-test.mjs +90 -0
  200. package/scripts/topo-edge-badge-text-brightness-test.mjs +83 -0
  201. package/scripts/topo-edge-chat-gate-test.mjs +71 -0
  202. package/scripts/topo-edge-flow-rail-halo-layers-test.mjs +89 -0
  203. package/scripts/topo-edge-particle-brightness-test.mjs +82 -0
  204. package/scripts/topo-edge-particle-halo-layers-test.mjs +91 -0
  205. package/scripts/topo-edge-pill-glow-test.mjs +67 -0
  206. package/scripts/topo-edge-pin-halo-test.mjs +99 -0
  207. package/scripts/topo-edge-visible-brightness-test.mjs +84 -0
  208. package/scripts/topo-edge-visible-halo-layers-test.mjs +87 -0
  209. package/scripts/topo-endpoint-ring-brightness-test.mjs +83 -0
  210. package/scripts/topo-endpoint-ring-flow-halo-test.mjs +107 -0
  211. package/scripts/topo-endpoint-ring-halo-layers-test.mjs +100 -0
  212. package/scripts/topo-filter-pill-glow-test.mjs +90 -0
  213. package/scripts/topo-filter-pill-halo-layers-test.mjs +27 -0
  214. package/scripts/topo-flow-arrow-brightness-test.mjs +82 -0
  215. package/scripts/topo-flow-rail-brightness-test.mjs +80 -0
  216. package/scripts/topo-fullscreen-attr-test.mjs +73 -0
  217. package/scripts/topo-fullscreen-brightness-test.mjs +84 -0
  218. package/scripts/topo-fullscreen-icon-rotate-test.mjs +93 -0
  219. package/scripts/topo-grid-content-bottom-attr-test.mjs +72 -0
  220. package/scripts/topo-group-box-brightness-test.mjs +84 -0
  221. package/scripts/topo-group-box-halo-layers-test.mjs +91 -0
  222. package/scripts/topo-group-chat-gate-test.mjs +77 -0
  223. package/scripts/topo-group-label-brightness-test.mjs +84 -0
  224. package/scripts/topo-group-label-halo-layers-test.mjs +78 -0
  225. package/scripts/topo-group-label-hover-glow-test.mjs +86 -0
  226. package/scripts/topo-group-label-member-alias-hover-test.mjs +125 -0
  227. package/scripts/topo-group-pill-glow-test.mjs +76 -0
  228. package/scripts/topo-group-tint-brightness-test.mjs +82 -0
  229. package/scripts/topo-halo-chat-gate-test.mjs +72 -0
  230. package/scripts/topo-hover-detail-halo-test.mjs +76 -0
  231. package/scripts/topo-hub-core-brightness-test.mjs +82 -0
  232. package/scripts/topo-hub-core-halo-layers-test.mjs +81 -0
  233. package/scripts/topo-hub-digit-brightness-test.mjs +79 -0
  234. package/scripts/topo-hub-digit-halo-layers-test.mjs +76 -0
  235. package/scripts/topo-hub-digit-ls-test.mjs +119 -0
  236. package/scripts/topo-hub-halo-brightness-test.mjs +80 -0
  237. package/scripts/topo-hub-halo-glow-test.mjs +96 -0
  238. package/scripts/topo-hub-halo-halo-layers-test.mjs +76 -0
  239. package/scripts/topo-hub-highlight-amplify-test.mjs +139 -0
  240. package/scripts/topo-hub-highlight-brightness-test.mjs +84 -0
  241. package/scripts/topo-hub-highlight-fill-transition-test.mjs +84 -0
  242. package/scripts/topo-hub-highlight-glow-test.mjs +99 -0
  243. package/scripts/topo-hub-highlight-halo-layers-test.mjs +78 -0
  244. package/scripts/topo-hub-highlight-r-test.mjs +112 -0
  245. package/scripts/topo-hub-highlight-recede-test.mjs +5 -1
  246. package/scripts/topo-hub-highlight-theme-fill-test.mjs +83 -0
  247. package/scripts/topo-hub-hover-ring-brightness-test.mjs +79 -0
  248. package/scripts/topo-hub-hover-ring-glow-test.mjs +97 -0
  249. package/scripts/topo-hub-hover-ring-halo-layers-test.mjs +71 -0
  250. package/scripts/topo-hub-idle-breath-test.mjs +6 -7
  251. package/scripts/topo-hub-spoke-brightness-test.mjs +77 -0
  252. package/scripts/topo-hub-spoke-glow-test.mjs +112 -0
  253. package/scripts/topo-hub-spoke-halo-layers-test.mjs +97 -0
  254. package/scripts/topo-hub-spoke-self-filter-test.mjs +119 -0
  255. package/scripts/topo-kicker-breath-test.mjs +100 -0
  256. package/scripts/topo-kicker-halo-layers-test.mjs +82 -0
  257. package/scripts/topo-label-card-brightness-test.mjs +81 -0
  258. package/scripts/topo-layout-hover-fw-test.mjs +98 -0
  259. package/scripts/topo-layout-toggle-brightness-test.mjs +94 -0
  260. package/scripts/topo-layout-toggle-halo-layers-test.mjs +95 -0
  261. package/scripts/topo-legend-count-brightness-test.mjs +80 -0
  262. package/scripts/topo-legend-count-halo-layers-test.mjs +79 -0
  263. package/scripts/topo-legend-count-letter-spacing-test.mjs +108 -0
  264. package/scripts/topo-legend-label-fw-test.mjs +107 -0
  265. package/scripts/topo-legend-panel-title-breath-test.mjs +86 -0
  266. package/scripts/topo-legend-pin-ring-brightness-test.mjs +82 -0
  267. package/scripts/topo-legend-pin-ring-halo-layers-test.mjs +71 -0
  268. package/scripts/topo-legend-row-count-brightness-test.mjs +85 -0
  269. package/scripts/topo-legend-row-label-glow-test.mjs +102 -0
  270. package/scripts/topo-legend-swatch-glow-test.mjs +109 -0
  271. package/scripts/topo-legend-swatch-member-alias-match-test.mjs +139 -0
  272. package/scripts/topo-legend-tint-brightness-test.mjs +83 -0
  273. package/scripts/topo-legend-trio-halo-layers-test.mjs +22 -0
  274. package/scripts/topo-minimap-container-halo-test.mjs +82 -0
  275. package/scripts/topo-minimap-dot-chat-gate-test.mjs +81 -0
  276. package/scripts/topo-minimap-hover-glow-test.mjs +109 -0
  277. package/scripts/topo-minimap-viewport-brightness-test.mjs +84 -0
  278. package/scripts/topo-minimap-viewport-halo-layers-test.mjs +24 -0
  279. package/scripts/topo-more-footer-brightness-test.mjs +94 -0
  280. package/scripts/topo-node-alias-brightness-test.mjs +84 -0
  281. package/scripts/topo-node-avatar-halo-layers-test.mjs +25 -0
  282. package/scripts/topo-node-hover-ring-halo-layers-test.mjs +70 -0
  283. package/scripts/topo-node-label-card-halo-test.mjs +76 -0
  284. package/scripts/topo-node-sub-text-brightness-test.mjs +88 -0
  285. package/scripts/topo-nodesize-brightness-test.mjs +82 -0
  286. package/scripts/topo-nodesize-halo-layers-test.mjs +89 -0
  287. package/scripts/topo-nodesize-hover-fw-test.mjs +99 -0
  288. package/scripts/topo-orphan-label-opacity-test.mjs +98 -0
  289. package/scripts/topo-panel-count-halo-layers-test.mjs +91 -0
  290. package/scripts/topo-panel-count-hover-ls-test.mjs +87 -0
  291. package/scripts/topo-panel-rect-halo-test.mjs +90 -0
  292. package/scripts/topo-panel-row-brightness-test.mjs +116 -0
  293. package/scripts/topo-panel-title-brightness-test.mjs +98 -0
  294. package/scripts/topo-panel-title-glow-test.mjs +111 -0
  295. package/scripts/topo-panel-titles-halo-layers-test.mjs +23 -0
  296. package/scripts/topo-pill-x-rotate-test.mjs +96 -0
  297. package/scripts/topo-pip-brightness-test.mjs +85 -0
  298. package/scripts/topo-pressure-bar-halo-layers-test.mjs +19 -0
  299. package/scripts/topo-pressure-seg-glow-test.mjs +92 -0
  300. package/scripts/topo-pressure-seg-member-alias-match-test.mjs +133 -0
  301. package/scripts/topo-pressure-seg-motion-test.mjs +101 -0
  302. package/scripts/topo-recent-count-brightness-test.mjs +84 -0
  303. package/scripts/topo-recent-more-fw-test.mjs +126 -0
  304. package/scripts/topo-recent-more-halo-layers-test.mjs +90 -0
  305. package/scripts/topo-recent-panel-hot-pulse-test.mjs +105 -0
  306. package/scripts/topo-recent-panel-title-breath-test.mjs +91 -0
  307. package/scripts/topo-recent-pip-halo-layers-test.mjs +82 -0
  308. package/scripts/topo-recent-row-chat-gate-test.mjs +75 -0
  309. package/scripts/topo-recent-row-content-lift-test.mjs +140 -0
  310. package/scripts/topo-recent-row-fw-test.mjs +115 -0
  311. package/scripts/topo-recent-row-text-glow-test.mjs +86 -0
  312. package/scripts/topo-recent-row-text-halo-layers-test.mjs +67 -0
  313. package/scripts/topo-recent-tint-brightness-test.mjs +80 -0
  314. package/scripts/topo-recent-ts-brightness-test.mjs +86 -0
  315. package/scripts/topo-reduced-motion-attr-test.mjs +69 -0
  316. package/scripts/topo-reset-brightness-test.mjs +83 -0
  317. package/scripts/topo-reset-icon-hover-scale-test.mjs +102 -0
  318. package/scripts/topo-runtime-badge-brightness-test.mjs +78 -0
  319. package/scripts/topo-runtime-badge-glow-test.mjs +108 -0
  320. package/scripts/topo-runtime-badge-halo-layers-test.mjs +87 -0
  321. package/scripts/topo-runtime-badge-rotate-test.mjs +85 -0
  322. package/scripts/topo-section-title-breath-test.mjs +83 -0
  323. package/scripts/topo-section-title-halo-layers-test.mjs +88 -0
  324. package/scripts/topo-spoke-chat-gate-test.mjs +72 -0
  325. package/scripts/topo-starfield-hue-test.mjs +109 -0
  326. package/scripts/topo-status-pin-pill-halo-layers-test.mjs +17 -0
  327. package/scripts/topo-status-ring-brightness-test.mjs +84 -0
  328. package/scripts/topo-status-ring-chat-gate-test.mjs +72 -0
  329. package/scripts/topo-status-ring-halo-layers-test.mjs +105 -0
  330. package/scripts/topo-status-ring-status-halo-test.mjs +110 -0
  331. package/scripts/topo-sub-text-chat-brightness-test.mjs +81 -0
  332. package/scripts/topo-title-block-envelope-breath-test.mjs +87 -0
  333. package/scripts/topo-titleblock-h2-hover-fw-test.mjs +109 -0
  334. package/scripts/topo-titleblock-h2-hover-tracking-test.mjs +128 -0
  335. package/scripts/topo-titleblock-kicker-hover-test.mjs +134 -0
  336. package/scripts/topo-vendor-chip-glow-test.mjs +97 -0
  337. package/scripts/topo-vendor-chip-halo-layers-test.mjs +18 -0
  338. package/scripts/topo-vendor-chip-pin-halo-test.mjs +88 -0
  339. package/scripts/topo-vendor-count-suffix-halo-layers-test.mjs +79 -0
  340. package/scripts/topo-vendor-distribution-wrapper-halo-test.mjs +93 -0
  341. package/scripts/topo-vendor-letter-halo-layers-test.mjs +93 -0
  342. package/scripts/topo-vendor-pill-glow-test.mjs +98 -0
  343. package/scripts/topo-watermark-breath-test.mjs +100 -0
  344. package/scripts/topo-watermark-envelope-breath-test.mjs +88 -0
  345. package/scripts/topo-watermark-recede-test.mjs +114 -0
  346. package/scripts/topo-working-online-chip-halo-layers-test.mjs +94 -0
  347. package/scripts/topo-zoom-buttons-brightness-test.mjs +94 -0
  348. package/scripts/topo-zoom-in-out-halo-layers-test.mjs +97 -0
  349. package/scripts/topo-zoom-level-breath-test.mjs +87 -0
  350. package/scripts/topo-zoom-level-brightness-test.mjs +83 -0
  351. package/scripts/topo-zoom-level-color-test.mjs +105 -0
  352. package/scripts/topo-zoom-level-halo-layers-test.mjs +78 -0
  353. package/.next/static/chunks/0g2t4ytep_laz.js +0 -4
  354. package/.next/static/chunks/0m.1mvl~t.avc.css +0 -2
  355. package/.next/static/chunks/0zm6yg97ubkp5.js +0 -1
  356. package/.next/static/chunks/1867gm.v~vka2.js +0 -1
  357. /package/.next/static/{oGQapRVlgbDN-Wxb5B4gq → 1PfQhDLU997pzw51rqEG8}/_buildManifest.js +0 -0
  358. /package/.next/static/{oGQapRVlgbDN-Wxb5B4gq → 1PfQhDLU997pzw51rqEG8}/_clientMiddlewareManifest.js +0 -0
  359. /package/.next/static/{oGQapRVlgbDN-Wxb5B4gq → 1PfQhDLU997pzw51rqEG8}/_ssgManifest.js +0 -0
@@ -0,0 +1,99 @@
1
+ /* Round 578 verification: chip-row tier-color glow trio gains
2
+ * stacked brightness:
3
+ * R537 legend swatch + R578 brightness(1.15)
4
+ * R541 vendor chip + R578 brightness(1.15)
5
+ * R542 pressure-seg (already had brightness(1.2) — pre-existing)
6
+ *
7
+ * Test phases:
8
+ * 1. rest: legend swatch filter='none', brightness-attr='1'
9
+ * 2. source: legend swatch stacked filter expression
10
+ * 3. source: vendor chip stacked filter expression (pin + hover branches)
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, status) => ({
33
+ alias, status, 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('alpha·1', 'working'),
39
+ ] } });
40
+ });
41
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
42
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
43
+ const page = await ctx.newPage();
44
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
45
+ await page.waitForSelector('[data-legend-swatch="working"]', { timeout: 15000 });
46
+ await page.waitForTimeout(500);
47
+
48
+ const restSwatch = await page.evaluate(() => {
49
+ const el = document.querySelector('[data-legend-swatch="working"]');
50
+ if (!el) return null;
51
+ const cs = getComputedStyle(el);
52
+ return {
53
+ filter: cs.filter,
54
+ brightnessAttr: el.getAttribute('data-legend-swatch-brightness'),
55
+ glowAttr: el.getAttribute('data-legend-swatch-glow'),
56
+ };
57
+ });
58
+
59
+ // Click pressure-seg working → pinnedStatus='working' → legend swatch lifts
60
+ await page.click('[data-pressure-seg="working"]');
61
+ await page.waitForTimeout(400);
62
+ const pinnedSwatch = await page.evaluate(() => {
63
+ const el = document.querySelector('[data-legend-swatch="working"]');
64
+ if (!el) return null;
65
+ const cs = getComputedStyle(el);
66
+ return {
67
+ filter: cs.filter,
68
+ brightnessAttr: el.getAttribute('data-legend-swatch-brightness'),
69
+ glowAttr: el.getAttribute('data-legend-swatch-glow'),
70
+ };
71
+ });
72
+
73
+ await browser.close();
74
+
75
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
76
+ const sourceSwatchFilter = /filter: isSwatchLifted\s*\?\s*`drop-shadow\(0 0 3px \$\{row\.fill\}99\) brightness\(1\.15\)`/.test(src);
77
+ const sourceSwatchAttr = /data-legend-swatch-brightness=\{isSwatchLifted \? '1\.15' : '1'\}/.test(src);
78
+ const sourceVendorPin = /`drop-shadow\(0 0 3px color-mix\(in srgb, \$\{v\.color\} 60%, transparent\)\) brightness\(1\.15\)`/.test(src);
79
+ const sourceVendorHover = /`drop-shadow\(0 0 3px color-mix\(in srgb, \$\{v\.color\} 40%, transparent\)\) brightness\(1\.15\)`/.test(src);
80
+
81
+ const results = {
82
+ rest_swatch_filter_none: restSwatch?.filter === 'none',
83
+ rest_swatch_brightness_1: restSwatch?.brightnessAttr === '1',
84
+ rest_swatch_glow_false: restSwatch?.glowAttr === 'false',
85
+ pinned_swatch_brightness_1_15: pinnedSwatch?.brightnessAttr === '1.15',
86
+ pinned_swatch_glow_true: pinnedSwatch?.glowAttr === 'true',
87
+ pinned_swatch_has_dropshadow: /drop-shadow\(/.test(pinnedSwatch?.filter || ''),
88
+ pinned_swatch_has_brightness: /brightness\(1\.15\)/.test(pinnedSwatch?.filter || ''),
89
+ source_swatch_filter: sourceSwatchFilter,
90
+ source_swatch_attr: sourceSwatchAttr,
91
+ source_vendor_pin_filter: sourceVendorPin,
92
+ source_vendor_hover_filter: sourceVendorHover,
93
+ };
94
+ const ok = Object.values(results).every(Boolean);
95
+ console.log(`${ok ? '✅' : '❌'} R578 chip-row tier-color glow trio stacked brightness (legend swatch + vendor chip):`,
96
+ JSON.stringify(results, null, 2),
97
+ '\n rest swatch:', JSON.stringify(restSwatch),
98
+ '\n pinned swatch:', JSON.stringify(pinnedSwatch));
99
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,124 @@
1
+ /* Round 560 verification: chip-row chip UNIT spans + filter-pill
2
+ * prefix/count + vendor-letter count suffix gain group-hover:
3
+ * tracking-wide. Coordinated 7-occurrence replace_all swap
4
+ * extends the hover-letter-spacing family across the small
5
+ * data-label-spans-with-opacity-70 cohort.
6
+ *
7
+ * Test phases:
8
+ * 1. rest: letter-spacing ≈ 'normal' (0px) on working-chip-unit
9
+ * 2. hover the chip wrapper (group) → unit letter-spacing lifts
10
+ * to ≈ 0.025em ≈ 0.3px on a 12px font
11
+ * 3. transition-property contains BOTH 'opacity' and
12
+ * 'letter-spacing'
13
+ * 4. source-side regex confirms the new className substring
14
+ * appears 7 times (replace_all touched all sites)
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, status = 'working') => ({
37
+ alias, status, 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
+ // Working sessions so the working chip is clickable / hoverable.
42
+ await route.fulfill({ response: r, json: { ...b, sessions: [
43
+ mk('a·1', 'working'), mk('a·2', 'working'), mk('a·3', 'idle'),
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-working-chip-unit]', { timeout: 15000 });
51
+ await page.waitForTimeout(500);
52
+
53
+ const unitSel = '[data-working-chip-unit]';
54
+ // Hover the parent chip (the <span> wrapping digit+unit) — group-hover.
55
+ // Walk up until we find the role='button' chip wrapper.
56
+ const chipWrapperHandle = await page.evaluateHandle((s) => {
57
+ let el = document.querySelector(s);
58
+ while (el && el.parentElement) {
59
+ el = el.parentElement;
60
+ if (el.getAttribute('role') === 'button' || el.getAttribute('aria-pressed') !== null) {
61
+ return el;
62
+ }
63
+ }
64
+ return el;
65
+ }, unitSel);
66
+
67
+ const parsePx = (s) => parseFloat((s || '').replace(/px$/, ''));
68
+
69
+ const rest = await page.evaluate((s) => {
70
+ const el = document.querySelector(s);
71
+ if (!el) return null;
72
+ const cs = getComputedStyle(el);
73
+ return {
74
+ letterSpacing: cs.letterSpacing,
75
+ transitionProperty: cs.transitionProperty,
76
+ transitionDuration: cs.transitionDuration,
77
+ fontSize: cs.fontSize,
78
+ opacity: cs.opacity,
79
+ };
80
+ }, unitSel);
81
+
82
+ // Hover the chip wrapper
83
+ await chipWrapperHandle.hover();
84
+ await page.waitForTimeout(400);
85
+ const hover = await page.evaluate((s) => {
86
+ const el = document.querySelector(s);
87
+ if (!el) return null;
88
+ const cs = getComputedStyle(el);
89
+ return {
90
+ letterSpacing: cs.letterSpacing,
91
+ opacity: cs.opacity,
92
+ };
93
+ }, unitSel);
94
+
95
+ await browser.close();
96
+
97
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
98
+ // Count occurrences of the new className
99
+ const occurrences = (src.match(/opacity-70 transition-\[opacity,letter-spacing\] duration-200 group-hover:opacity-100 group-hover:tracking-wide/g) || []).length;
100
+
101
+ // At text-xs (12px in chip-row context), tracking-wide = 0.025em = 0.3px
102
+ // At rest, letter-spacing = 'normal' which most browsers report as '0px'
103
+ // or 'normal'.
104
+ const restPx = parsePx(rest?.letterSpacing) || 0;
105
+ const hoverPx = parsePx(hover?.letterSpacing);
106
+
107
+ const results = {
108
+ rest_letter_spacing_zero: rest?.letterSpacing === 'normal' || Math.abs(restPx) < 0.01,
109
+ hover_letter_spacing_wide: Math.abs(hoverPx - 0.3) < 0.1, // tracking-wide @ 12px ≈ 0.3px
110
+ hover_ls_greater_than_rest: hoverPx > restPx + 0.1,
111
+ rest_opacity_0_7: Math.abs(parseFloat(rest?.opacity || '0') - 0.7) < 0.01,
112
+ hover_opacity_1: Math.abs(parseFloat(hover?.opacity || '0') - 1.0) < 0.01,
113
+ transition_has_opacity: /opacity/.test(rest?.transitionProperty || ''),
114
+ transition_has_ls: /letter-spacing/.test(rest?.transitionProperty || ''),
115
+ transition_duration: rest?.transitionDuration === '0.2s' || /^0\.2s/.test(rest?.transitionDuration || ''),
116
+ source_7_occurrences: occurrences === 7,
117
+ };
118
+ const ok = Object.values(results).every(Boolean);
119
+ console.log(`${ok ? '✅' : '❌'} R560 chip-row unit + filter-pill spans hover-tracking (7 anchors via replace_all):`,
120
+ JSON.stringify(results, null, 2),
121
+ `\n rest: ${JSON.stringify(rest)}`,
122
+ `\n hover: ${JSON.stringify(hover)}`,
123
+ `\n source replace_all occurrences: ${occurrences}`);
124
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,22 @@
1
+ /* Round 667 — chrome reset + fullscreen buttons gain 2-layer drop-
2
+ * shadow halo on hover. 26th anchor in multi-layer halo family —
3
+ * 1st chrome-control anchor.
4
+ */
5
+ import { readFileSync } from 'node:fs';
6
+
7
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
8
+ const sourceResetFilter = /hoveredReset \? `drop-shadow\(0 0 2px \$\{pal\.legendAccent\}80\) drop-shadow\(0 0 4px \$\{pal\.legendAccent\}40\) brightness\(1\.15\)` : undefined/.test(src);
9
+ const sourceFullscreenFilter = /hoveredFullscreen \? `drop-shadow\(0 0 2px \$\{pal\.legendAccent\}80\) drop-shadow\(0 0 4px \$\{pal\.legendAccent\}40\) brightness\(1\.15\)` : undefined/.test(src);
10
+ const sourceResetAttr = /data-topo-chrome-reset-halo-layers=\{hoveredReset \? '2' : '0'\}/.test(src);
11
+ const sourceFullscreenAttr = /data-topo-chrome-fullscreen-halo-layers=\{hoveredFullscreen \? '2' : '0'\}/.test(src);
12
+
13
+ const results = {
14
+ source_reset_filter: sourceResetFilter,
15
+ source_fullscreen_filter: sourceFullscreenFilter,
16
+ source_reset_attr: sourceResetAttr,
17
+ source_fullscreen_attr: sourceFullscreenAttr,
18
+ };
19
+ const ok = Object.values(results).every(Boolean);
20
+ console.log(`${ok ? '✅' : '❌'} R667 chrome controls multi-layer halo (reset + fullscreen sibling pair):`,
21
+ JSON.stringify(results, null, 2));
22
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,86 @@
1
+ /* Round 707 — chrome Layout wrapper at-rest breath at 17s. Slowest tier
2
+ * among HTML chrome respiratory anchors. Sibling to R703 zoom-level 9s
3
+ * in chrome strip's data tier; this 17s lands in chrome's control tier.
4
+ * Tightest alpha range (0.94↔1, ~6%) — control group should not flicker.
5
+ * Hover gate via :has(button:hover) — R697 halo takes precedence.
6
+ */
7
+ import { chromium } from 'playwright';
8
+ import { readFileSync } from 'node:fs';
9
+
10
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
11
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
12
+
13
+ const browser = await chromium.launch({ headless: true });
14
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
15
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
16
+ await ctx.addInitScript(() => {
17
+ try {
18
+ localStorage.setItem('anet-theme', 'cyber');
19
+ localStorage.setItem('anet-topo-layout', 'ring');
20
+ sessionStorage.setItem('anet_v3_auth', '1');
21
+ } catch {}
22
+ });
23
+ await ctx.route('**/api/hub/status*', async (route) => {
24
+ const r = await route.fetch();
25
+ const b = await r.json();
26
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
27
+ const mk = (alias) => ({
28
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
29
+ network_id: nid, project_dir: null,
30
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
31
+ });
32
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
33
+ });
34
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
35
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
36
+ const page = await ctx.newPage();
37
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
38
+ await page.waitForSelector('[data-topo-chrome-layout-trailer]', { timeout: 15000, state: 'attached' });
39
+ await page.waitForTimeout(300);
40
+
41
+ const runtimeState = await page.evaluate(() => {
42
+ const wrap = document.querySelector('[data-topo-chrome-layout-trailer]');
43
+ if (!wrap) return null;
44
+ const cs = getComputedStyle(wrap);
45
+ return {
46
+ has_class: wrap.classList.contains('anet-topo-chrome-layout-trailer-breath'),
47
+ breath_attr: wrap.getAttribute('data-topo-chrome-layout-trailer-breath'),
48
+ anim_name: cs.animationName,
49
+ anim_duration: cs.animationDuration,
50
+ anim_iter: cs.animationIterationCount,
51
+ };
52
+ });
53
+
54
+ await browser.close();
55
+
56
+ const cssSrc = readFileSync('/home/vansin/agent-network-dashboard/app/globals.css', 'utf8');
57
+ const tsxSrc = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
58
+
59
+ const cssKeyframes = /@keyframes anet-topo-chrome-layout-trailer-breath-kf\s*\{[\s\S]*?0%, 100%\s*\{\s*opacity:\s*1;\s*\}[\s\S]*?50%\s*\{\s*opacity:\s*0\.94;/.test(cssSrc);
60
+ const cssRule = /\.anet-topo-chrome-layout-trailer-breath\s*\{[\s\S]*?animation:\s*anet-topo-chrome-layout-trailer-breath-kf\s+17s\s+ease-in-out\s+infinite/.test(cssSrc);
61
+ const cssHoverGate = /\.anet-topo-chrome-layout-trailer-breath:has\(button:hover\)\s*\{\s*animation:\s*none/.test(cssSrc);
62
+ const cssReducedMotion = /prefers-reduced-motion:\s*reduce\s*\)\s*\{\s*\.anet-topo-chrome-layout-trailer-breath\s*\{\s*animation:\s*none/.test(cssSrc);
63
+ const tsxClass = /anet-topo-chrome-layout-trailer-breath mr-0\.5/.test(tsxSrc);
64
+ const tsxAttr = /data-topo-chrome-layout-trailer-breath="17s"/.test(tsxSrc);
65
+
66
+ const runtimeAnim = runtimeState?.anim_name === 'anet-topo-chrome-layout-trailer-breath-kf' || runtimeState?.anim_name === 'none';
67
+ const runtimeDuration = runtimeState?.anim_duration === '17s' || runtimeState?.anim_name === 'none';
68
+
69
+ const results = {
70
+ wrapper_present: !!runtimeState,
71
+ has_breath_class: runtimeState?.has_class === true,
72
+ breath_attr_17s: runtimeState?.breath_attr === '17s',
73
+ runtime_anim_ok: runtimeAnim,
74
+ runtime_duration_ok: runtimeDuration,
75
+ css_keyframes: cssKeyframes,
76
+ css_rule: cssRule,
77
+ css_hover_gate: cssHoverGate,
78
+ css_reduced_motion: cssReducedMotion,
79
+ tsx_class: tsxClass,
80
+ tsx_breath_attr: tsxAttr,
81
+ };
82
+ const ok = Object.values(results).every(Boolean);
83
+ console.log(`${ok ? '✅' : '❌'} R707 chrome Layout wrapper at-rest breath (17s prime, :has hover-gated, tightest alpha 6%):`,
84
+ JSON.stringify(results, null, 2),
85
+ `\n runtime: ${JSON.stringify(runtimeState)}`);
86
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,83 @@
1
+ /* Round 697 — chrome strip segmented-control wrappers (Layout /
2
+ * nodeSize / zoom containers) gain wrapper-level multi-layer halo
3
+ * via CSS :has(button:hover) on the 3 wrappers' data-attrs. Pre-R697
4
+ * only individual inner buttons halo'd (R667-R675 per-button); the
5
+ * parent wrappers stayed flat. R697 closes the chrome-strip "active
6
+ * control group" signal at the parent scope.
7
+ *
8
+ * Source assertions:
9
+ * - globals.css :has(button:hover) rule covers all 3 wrappers
10
+ * - globals.css transition rule for the 3 wrappers includes filter
11
+ * - TopoGraph.tsx Layout wrapper has data-topo-chrome-wrapper-halo-family="layout"
12
+ * - TopoGraph.tsx nodeSize wrapper has data-topo-chrome-wrapper-halo-family="nodesize"
13
+ * - TopoGraph.tsx zoom wrapper has data-topo-chrome-wrapper-halo-family="zoom"
14
+ *
15
+ * Runtime assertions:
16
+ * - all 3 wrappers present in DOM with halo-family data-attrs
17
+ */
18
+ import { chromium } from 'playwright';
19
+ import { readFileSync } from 'node:fs';
20
+
21
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
22
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
23
+
24
+ const browser = await chromium.launch({ headless: true });
25
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
26
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
27
+ await ctx.addInitScript(() => {
28
+ try {
29
+ localStorage.setItem('anet-theme', 'cyber');
30
+ localStorage.setItem('anet-topo-layout', 'ring');
31
+ sessionStorage.setItem('anet_v3_auth', '1');
32
+ } catch {}
33
+ });
34
+ await ctx.route('**/api/hub/status*', async (route) => {
35
+ const r = await route.fetch();
36
+ const b = await r.json();
37
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
38
+ const mk = (alias) => ({
39
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
40
+ network_id: nid, project_dir: null,
41
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
42
+ });
43
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
44
+ });
45
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
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-topo-chrome-wrapper-halo-family]', { timeout: 15000, state: 'attached' });
50
+ await page.waitForTimeout(300);
51
+
52
+ const runtimeState = await page.evaluate(() => {
53
+ const wrappers = Array.from(document.querySelectorAll('[data-topo-chrome-wrapper-halo-family]'));
54
+ return wrappers.map(w => w.getAttribute('data-topo-chrome-wrapper-halo-family')).sort();
55
+ });
56
+
57
+ await browser.close();
58
+
59
+ const cssSrc = readFileSync('/home/vansin/agent-network-dashboard/app/globals.css', 'utf8');
60
+ const tsxSrc = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
61
+
62
+ const cssHoverRule = /\[data-topo-chrome-layout-trailer\]:has\(button:hover\),[\s\S]*?\[data-topo-chrome-fleet-group-trailer\]:has\(button:hover\),[\s\S]*?\[data-topo-chrome-zoom-wrapper\]:has\(button:hover\)\s*\{[\s\S]*?drop-shadow\(0 0 2px rgba\(103, 232, 249, 0\.5\)\)[\s\S]*?drop-shadow\(0 0 4px rgba\(103, 232, 249, 0\.25\)\)/.test(cssSrc);
63
+ const cssTransition = /\[data-topo-chrome-layout-trailer\],[\s\S]*?\[data-topo-chrome-fleet-group-trailer\],[\s\S]*?\[data-topo-chrome-zoom-wrapper\]\s*\{[\s\S]*?transition:[\s\S]*?filter 200ms/.test(cssSrc);
64
+ const tsxLayoutAttr = /data-topo-chrome-wrapper-halo-family="layout"/.test(tsxSrc);
65
+ const tsxNodesizeAttr = /data-topo-chrome-wrapper-halo-family="nodesize"/.test(tsxSrc);
66
+ const tsxZoomAttr = /data-topo-chrome-wrapper-halo-family="zoom"/.test(tsxSrc);
67
+
68
+ const expectedFamilies = ['layout', 'nodesize', 'zoom'];
69
+
70
+ const results = {
71
+ wrappers_count: runtimeState.length === 3,
72
+ wrappers_families: JSON.stringify(runtimeState) === JSON.stringify(expectedFamilies),
73
+ css_hover_rule: cssHoverRule,
74
+ css_transition: cssTransition,
75
+ tsx_layout_attr: tsxLayoutAttr,
76
+ tsx_nodesize_attr: tsxNodesizeAttr,
77
+ tsx_zoom_attr: tsxZoomAttr,
78
+ };
79
+ const ok = Object.values(results).every(Boolean);
80
+ console.log(`${ok ? '✅' : '❌'} R697 chrome wrapper :has() multi-layer halo (53rd anchor — 3 wrappers via CSS rule):`,
81
+ JSON.stringify(results, null, 2),
82
+ `\n runtime families: ${JSON.stringify(runtimeState)}`);
83
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,86 @@
1
+ /* Round 608 — click-ripple gains drop-shadow glow that matches
2
+ * the ripple's stroke color. Expanding feedback ring now reads
3
+ * as a "lit pulse" rather than a plain stroke line.
4
+ *
5
+ * Test phases:
6
+ * 1. mock 2 idle nodes → click first node → ripple renders
7
+ * 2. ripple element present with data-click-ripple attr
8
+ * 3. computed filter contains 'drop-shadow'
9
+ * 4. data-click-ripple-glow attr present with valid format
10
+ * 5. source: filter inline + data-attr extension
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: 'idle', 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: [mk('a·1'), mk('a·2')] } });
38
+ });
39
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
40
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
41
+ const page = await ctx.newPage();
42
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
43
+ // Click hub group (role=button aria-label="Network hub...") to fire setClickRipple
44
+ await page.waitForSelector('[data-topo-hub-fade-delay]', { timeout: 15000, state: 'attached' });
45
+ const hubBox = await page.evaluate(() => {
46
+ const el = document.querySelector('[data-topo-hub-fade-delay]');
47
+ if (!el) return null;
48
+ const r = el.getBoundingClientRect();
49
+ return { x: r.left + r.width / 2, y: r.top + r.height / 2 };
50
+ });
51
+ if (!hubBox) throw new Error('hub not found');
52
+ await page.mouse.click(hubBox.x, hubBox.y);
53
+ // Wait briefly so the ripple mounts but doesn't fully fade
54
+ await page.waitForSelector('[data-click-ripple]', { timeout: 5000, state: 'attached' });
55
+ await page.waitForTimeout(100);
56
+
57
+ const rippleState = await page.evaluate(() => {
58
+ const el = document.querySelector('[data-click-ripple]');
59
+ if (!el) return null;
60
+ const cs = getComputedStyle(el);
61
+ return {
62
+ filter: cs.filter,
63
+ glowAttr: el.getAttribute('data-click-ripple-glow'),
64
+ stroke: el.getAttribute('stroke'),
65
+ };
66
+ });
67
+
68
+ await browser.close();
69
+
70
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
71
+ const sourceFilter = /filter: `drop-shadow\(0 0 4px \$\{clickRipple\.color\}99\)`/.test(src);
72
+ const sourceAttr = /data-click-ripple-glow=\{`0 0 4px \$\{clickRipple\.color\}99`\}/.test(src);
73
+
74
+ const results = {
75
+ ripple_present: !!rippleState,
76
+ has_drop_shadow: /drop-shadow/.test(rippleState?.filter || ''),
77
+ glow_attr_format: /^0 0 4px /.test(rippleState?.glowAttr || ''),
78
+ has_stroke: !!rippleState?.stroke,
79
+ source_filter: sourceFilter,
80
+ source_attr: sourceAttr,
81
+ };
82
+ const ok = Object.values(results).every(Boolean);
83
+ console.log(`${ok ? '✅' : '❌'} R608 click-ripple drop-shadow glow (click feedback enhancement):`,
84
+ JSON.stringify(results, null, 2),
85
+ `\n ripple: ${JSON.stringify(rippleState)}`);
86
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,79 @@
1
+ /* Round 657 — click-ripple drop-shadow gains a SECOND outer layer
2
+ * at 8px + 0x4c alpha (half R608 inner 0x99). 16th anchor in
3
+ * multi-layer halo family (1st click-feedback anchor).
4
+ */
5
+ import { chromium } from 'playwright';
6
+ import { readFileSync } from 'node:fs';
7
+
8
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
9
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
10
+
11
+ const browser = await chromium.launch({ headless: true });
12
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
13
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
14
+ await ctx.addInitScript(() => {
15
+ try {
16
+ localStorage.setItem('anet-theme', 'cyber');
17
+ localStorage.setItem('anet-topo-layout', 'ring');
18
+ sessionStorage.setItem('anet_v3_auth', '1');
19
+ } catch {}
20
+ });
21
+ await ctx.route('**/api/hub/status*', async (route) => {
22
+ const r = await route.fetch();
23
+ const b = await r.json();
24
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
25
+ const mk = (alias) => ({
26
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
27
+ network_id: nid, project_dir: null,
28
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
29
+ });
30
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
31
+ });
32
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
33
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
34
+ const page = await ctx.newPage();
35
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
36
+ await page.waitForSelector('[data-node="a·1"]', { timeout: 15000 });
37
+ await page.waitForTimeout(500);
38
+
39
+ // rest: no ripple
40
+ const restRipple = await page.evaluate(() => !!document.querySelector('[data-click-ripple]'));
41
+
42
+ // click node → ripple mounts; poll to catch it before it self-cleans
43
+ await page.click('[data-node="a·1"]', { force: true });
44
+ let activeState = null;
45
+ for (let i = 0; i < 12; i++) {
46
+ await page.waitForTimeout(40);
47
+ const s = await page.evaluate(() => {
48
+ const el = document.querySelector('[data-click-ripple]');
49
+ if (!el) return null;
50
+ const cs = getComputedStyle(el);
51
+ return {
52
+ layers: el.getAttribute('data-click-ripple-halo-layers'),
53
+ filter: cs.filter,
54
+ };
55
+ });
56
+ if (s) { activeState = s; break; }
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: `drop-shadow\(0 0 4px \$\{clickRipple\.color\}99\) drop-shadow\(0 0 8px \$\{clickRipple\.color\}4c\)`/.test(src);
63
+ const sourceLayersAttr = /data-click-ripple-halo-layers="2"/.test(src);
64
+
65
+ const dropShadowCount = (activeState?.filter?.match(/drop-shadow/g) || []).length;
66
+
67
+ const results = {
68
+ rest_no_ripple: restRipple === false,
69
+ active_present: !!activeState,
70
+ active_layers_2: activeState?.layers === '2',
71
+ active_two_dropshadows: dropShadowCount === 2,
72
+ source_filter: sourceFilter,
73
+ source_layers_attr: sourceLayersAttr,
74
+ };
75
+ const ok = Object.values(results).every(Boolean);
76
+ console.log(`${ok ? '✅' : '❌'} R657 click-ripple multi-layer halo (1st click-feedback anchor):`,
77
+ JSON.stringify(results, null, 2),
78
+ `\n active: ${JSON.stringify(activeState)}`);
79
+ process.exit(ok ? 0 : 1);