@sleep2agi/agent-network-dashboard 0.5.3-preview.24 → 0.5.3-preview.241

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 (377) 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/024nhti9gv5nb.js +1 -0
  143. package/.next/static/chunks/040lvwcu-_z1_.css +2 -0
  144. package/.next/static/chunks/{115yobnkg0j9i.js → 0_teenxqq9lvq.js} +1 -1
  145. package/.next/static/chunks/0ac4j_t84kf05.js +1 -0
  146. package/.next/static/chunks/11zr.y3xk.6s1.js +4 -0
  147. package/.next/trace +2 -2
  148. package/.next/trace-build +1 -1
  149. package/app/components/TopoGraph.tsx +5797 -179
  150. package/app/globals.css +757 -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-fullscreen-breath-test.mjs +121 -0
  183. package/scripts/topo-chrome-layout-trailer-breath-test.mjs +86 -0
  184. package/scripts/topo-chrome-nodesize-trailer-breath-test.mjs +86 -0
  185. package/scripts/topo-chrome-reset-breath-test.mjs +115 -0
  186. package/scripts/topo-chrome-wrapper-halo-test.mjs +83 -0
  187. package/scripts/topo-chrome-zoom-wrapper-breath-test.mjs +85 -0
  188. package/scripts/topo-click-ripple-glow-test.mjs +86 -0
  189. package/scripts/topo-click-ripple-halo-layers-test.mjs +79 -0
  190. package/scripts/topo-click-ripple-sw-test.mjs +110 -0
  191. package/scripts/topo-cluster-count-attr-test.mjs +80 -0
  192. package/scripts/topo-crescent-breath-test.mjs +104 -0
  193. package/scripts/topo-crescent-envelope-breath-test.mjs +103 -0
  194. package/scripts/topo-crescent-recede-test.mjs +111 -0
  195. package/scripts/topo-dense-alias-chat-halo-test.mjs +73 -0
  196. package/scripts/topo-dense-alias-halo-layers-test.mjs +80 -0
  197. package/scripts/topo-dual-axis-surfaces-catalog-test.mjs +94 -0
  198. package/scripts/topo-edge-badge-circle-brightness-test.mjs +82 -0
  199. package/scripts/topo-edge-badge-circle-hot-pulse-test.mjs +100 -0
  200. package/scripts/topo-edge-badge-digit-halo-layers-test.mjs +107 -0
  201. package/scripts/topo-edge-badge-endpoint-gate-test.mjs +94 -0
  202. package/scripts/topo-edge-badge-halo-layers-test.mjs +85 -0
  203. package/scripts/topo-edge-badge-hot-pulse-test.mjs +92 -0
  204. package/scripts/topo-edge-badge-hover-glow-test.mjs +90 -0
  205. package/scripts/topo-edge-badge-text-brightness-test.mjs +83 -0
  206. package/scripts/topo-edge-chat-gate-test.mjs +71 -0
  207. package/scripts/topo-edge-flow-rail-halo-layers-test.mjs +89 -0
  208. package/scripts/topo-edge-particle-brightness-test.mjs +82 -0
  209. package/scripts/topo-edge-particle-halo-layers-test.mjs +91 -0
  210. package/scripts/topo-edge-pill-glow-test.mjs +67 -0
  211. package/scripts/topo-edge-pin-halo-test.mjs +99 -0
  212. package/scripts/topo-edge-visible-brightness-test.mjs +84 -0
  213. package/scripts/topo-edge-visible-halo-layers-test.mjs +87 -0
  214. package/scripts/topo-endpoint-ring-brightness-test.mjs +83 -0
  215. package/scripts/topo-endpoint-ring-flow-halo-test.mjs +107 -0
  216. package/scripts/topo-endpoint-ring-halo-layers-test.mjs +100 -0
  217. package/scripts/topo-filter-pill-glow-test.mjs +90 -0
  218. package/scripts/topo-filter-pill-halo-layers-test.mjs +27 -0
  219. package/scripts/topo-flow-arrow-brightness-test.mjs +82 -0
  220. package/scripts/topo-flow-rail-brightness-test.mjs +80 -0
  221. package/scripts/topo-fullscreen-attr-test.mjs +73 -0
  222. package/scripts/topo-fullscreen-brightness-test.mjs +84 -0
  223. package/scripts/topo-fullscreen-icon-rotate-test.mjs +93 -0
  224. package/scripts/topo-grid-content-bottom-attr-test.mjs +72 -0
  225. package/scripts/topo-group-box-brightness-test.mjs +84 -0
  226. package/scripts/topo-group-box-halo-layers-test.mjs +91 -0
  227. package/scripts/topo-group-chat-gate-test.mjs +77 -0
  228. package/scripts/topo-group-label-brightness-test.mjs +84 -0
  229. package/scripts/topo-group-label-halo-layers-test.mjs +78 -0
  230. package/scripts/topo-group-label-hover-glow-test.mjs +86 -0
  231. package/scripts/topo-group-label-member-alias-hover-test.mjs +125 -0
  232. package/scripts/topo-group-pill-glow-test.mjs +76 -0
  233. package/scripts/topo-group-tint-brightness-test.mjs +82 -0
  234. package/scripts/topo-h2-dual-axis-breath-test.mjs +92 -0
  235. package/scripts/topo-h2-triple-axis-breath-test.mjs +142 -0
  236. package/scripts/topo-halo-chat-gate-test.mjs +72 -0
  237. package/scripts/topo-hover-detail-halo-test.mjs +76 -0
  238. package/scripts/topo-hub-core-brightness-test.mjs +82 -0
  239. package/scripts/topo-hub-core-halo-layers-test.mjs +81 -0
  240. package/scripts/topo-hub-digit-brightness-test.mjs +79 -0
  241. package/scripts/topo-hub-digit-halo-layers-test.mjs +76 -0
  242. package/scripts/topo-hub-digit-ls-test.mjs +119 -0
  243. package/scripts/topo-hub-halo-brightness-test.mjs +80 -0
  244. package/scripts/topo-hub-halo-glow-test.mjs +96 -0
  245. package/scripts/topo-hub-halo-halo-layers-test.mjs +76 -0
  246. package/scripts/topo-hub-highlight-amplify-test.mjs +139 -0
  247. package/scripts/topo-hub-highlight-brightness-test.mjs +84 -0
  248. package/scripts/topo-hub-highlight-glow-test.mjs +99 -0
  249. package/scripts/topo-hub-highlight-halo-layers-test.mjs +78 -0
  250. package/scripts/topo-hub-highlight-r-test.mjs +112 -0
  251. package/scripts/topo-hub-highlight-recede-test.mjs +5 -1
  252. package/scripts/topo-hub-hover-ring-brightness-test.mjs +79 -0
  253. package/scripts/topo-hub-hover-ring-glow-test.mjs +97 -0
  254. package/scripts/topo-hub-hover-ring-halo-layers-test.mjs +71 -0
  255. package/scripts/topo-hub-idle-breath-test.mjs +6 -7
  256. package/scripts/topo-hub-spoke-brightness-test.mjs +77 -0
  257. package/scripts/topo-hub-spoke-glow-test.mjs +112 -0
  258. package/scripts/topo-hub-spoke-halo-layers-test.mjs +97 -0
  259. package/scripts/topo-hub-spoke-self-filter-test.mjs +119 -0
  260. package/scripts/topo-kicker-breath-test.mjs +100 -0
  261. package/scripts/topo-kicker-dual-axis-breath-test.mjs +81 -0
  262. package/scripts/topo-kicker-halo-layers-test.mjs +82 -0
  263. package/scripts/topo-kicker-triple-axis-breath-test.mjs +124 -0
  264. package/scripts/topo-label-card-brightness-test.mjs +81 -0
  265. package/scripts/topo-layout-hover-fw-test.mjs +98 -0
  266. package/scripts/topo-layout-toggle-brightness-test.mjs +94 -0
  267. package/scripts/topo-layout-toggle-halo-layers-test.mjs +95 -0
  268. package/scripts/topo-legend-count-brightness-test.mjs +80 -0
  269. package/scripts/topo-legend-count-halo-layers-test.mjs +79 -0
  270. package/scripts/topo-legend-count-letter-spacing-test.mjs +108 -0
  271. package/scripts/topo-legend-label-fw-test.mjs +107 -0
  272. package/scripts/topo-legend-panel-title-breath-test.mjs +86 -0
  273. package/scripts/topo-legend-pin-ring-brightness-test.mjs +82 -0
  274. package/scripts/topo-legend-pin-ring-halo-layers-test.mjs +71 -0
  275. package/scripts/topo-legend-row-count-brightness-test.mjs +85 -0
  276. package/scripts/topo-legend-row-label-glow-test.mjs +102 -0
  277. package/scripts/topo-legend-swatch-glow-test.mjs +109 -0
  278. package/scripts/topo-legend-swatch-member-alias-match-test.mjs +139 -0
  279. package/scripts/topo-legend-tint-brightness-test.mjs +83 -0
  280. package/scripts/topo-legend-trio-halo-layers-test.mjs +22 -0
  281. package/scripts/topo-minimap-container-halo-test.mjs +82 -0
  282. package/scripts/topo-minimap-dot-chat-gate-test.mjs +81 -0
  283. package/scripts/topo-minimap-hover-glow-test.mjs +109 -0
  284. package/scripts/topo-minimap-viewport-brightness-test.mjs +84 -0
  285. package/scripts/topo-minimap-viewport-halo-layers-test.mjs +24 -0
  286. package/scripts/topo-more-footer-brightness-test.mjs +94 -0
  287. package/scripts/topo-node-alias-brightness-test.mjs +84 -0
  288. package/scripts/topo-node-avatar-halo-layers-test.mjs +25 -0
  289. package/scripts/topo-node-hover-ring-halo-layers-test.mjs +70 -0
  290. package/scripts/topo-node-label-card-halo-test.mjs +76 -0
  291. package/scripts/topo-node-sub-text-brightness-test.mjs +88 -0
  292. package/scripts/topo-nodesize-brightness-test.mjs +82 -0
  293. package/scripts/topo-nodesize-halo-layers-test.mjs +89 -0
  294. package/scripts/topo-nodesize-hover-fw-test.mjs +99 -0
  295. package/scripts/topo-orphan-label-opacity-test.mjs +98 -0
  296. package/scripts/topo-panel-count-halo-layers-test.mjs +91 -0
  297. package/scripts/topo-panel-count-hover-ls-test.mjs +87 -0
  298. package/scripts/topo-panel-rect-halo-test.mjs +90 -0
  299. package/scripts/topo-panel-row-brightness-test.mjs +116 -0
  300. package/scripts/topo-panel-title-brightness-test.mjs +98 -0
  301. package/scripts/topo-panel-title-glow-test.mjs +111 -0
  302. package/scripts/topo-panel-titles-dual-axis-breath-test.mjs +94 -0
  303. package/scripts/topo-panel-titles-halo-layers-test.mjs +23 -0
  304. package/scripts/topo-pill-x-rotate-test.mjs +96 -0
  305. package/scripts/topo-pip-brightness-test.mjs +85 -0
  306. package/scripts/topo-pressure-bar-halo-layers-test.mjs +19 -0
  307. package/scripts/topo-pressure-seg-glow-test.mjs +92 -0
  308. package/scripts/topo-pressure-seg-member-alias-match-test.mjs +133 -0
  309. package/scripts/topo-pressure-seg-motion-test.mjs +101 -0
  310. package/scripts/topo-r717-triple-axis-pair-pattern-test.mjs +113 -0
  311. package/scripts/topo-r717-triple-axis-tier-pattern-test.mjs +115 -0
  312. package/scripts/topo-recent-count-brightness-test.mjs +84 -0
  313. package/scripts/topo-recent-more-fw-test.mjs +126 -0
  314. package/scripts/topo-recent-more-halo-layers-test.mjs +90 -0
  315. package/scripts/topo-recent-panel-hot-pulse-test.mjs +105 -0
  316. package/scripts/topo-recent-panel-title-breath-test.mjs +91 -0
  317. package/scripts/topo-recent-pip-halo-layers-test.mjs +82 -0
  318. package/scripts/topo-recent-row-chat-gate-test.mjs +75 -0
  319. package/scripts/topo-recent-row-content-lift-test.mjs +140 -0
  320. package/scripts/topo-recent-row-fw-test.mjs +115 -0
  321. package/scripts/topo-recent-row-text-glow-test.mjs +86 -0
  322. package/scripts/topo-recent-row-text-halo-layers-test.mjs +67 -0
  323. package/scripts/topo-recent-tint-brightness-test.mjs +80 -0
  324. package/scripts/topo-recent-ts-brightness-test.mjs +86 -0
  325. package/scripts/topo-reduced-motion-attr-test.mjs +69 -0
  326. package/scripts/topo-reset-brightness-test.mjs +83 -0
  327. package/scripts/topo-reset-icon-hover-scale-test.mjs +102 -0
  328. package/scripts/topo-respiratory-patterns-catalog-test.mjs +106 -0
  329. package/scripts/topo-respiratory-rolodex-test.mjs +83 -0
  330. package/scripts/topo-respiratory-tiers-catalog-test.mjs +119 -0
  331. package/scripts/topo-respiratory-triple-axis-surfaces-catalog-test.mjs +127 -0
  332. package/scripts/topo-runtime-badge-brightness-test.mjs +78 -0
  333. package/scripts/topo-runtime-badge-glow-test.mjs +108 -0
  334. package/scripts/topo-runtime-badge-halo-layers-test.mjs +87 -0
  335. package/scripts/topo-runtime-badge-rotate-test.mjs +85 -0
  336. package/scripts/topo-section-title-breath-test.mjs +83 -0
  337. package/scripts/topo-section-title-halo-layers-test.mjs +88 -0
  338. package/scripts/topo-spoke-chat-gate-test.mjs +72 -0
  339. package/scripts/topo-starfield-hue-test.mjs +109 -0
  340. package/scripts/topo-status-pin-pill-halo-layers-test.mjs +17 -0
  341. package/scripts/topo-status-ring-brightness-test.mjs +84 -0
  342. package/scripts/topo-status-ring-chat-gate-test.mjs +72 -0
  343. package/scripts/topo-status-ring-halo-layers-test.mjs +105 -0
  344. package/scripts/topo-status-ring-status-halo-test.mjs +110 -0
  345. package/scripts/topo-sub-text-chat-brightness-test.mjs +81 -0
  346. package/scripts/topo-title-block-envelope-breath-test.mjs +87 -0
  347. package/scripts/topo-titleblock-h2-hover-fw-test.mjs +109 -0
  348. package/scripts/topo-titleblock-h2-hover-tracking-test.mjs +128 -0
  349. package/scripts/topo-titleblock-kicker-hover-test.mjs +134 -0
  350. package/scripts/topo-vendor-chip-glow-test.mjs +97 -0
  351. package/scripts/topo-vendor-chip-halo-layers-test.mjs +18 -0
  352. package/scripts/topo-vendor-chip-pin-halo-test.mjs +88 -0
  353. package/scripts/topo-vendor-count-suffix-halo-layers-test.mjs +79 -0
  354. package/scripts/topo-vendor-distribution-wrapper-halo-test.mjs +93 -0
  355. package/scripts/topo-vendor-letter-halo-layers-test.mjs +93 -0
  356. package/scripts/topo-vendor-pill-glow-test.mjs +98 -0
  357. package/scripts/topo-watermark-breath-test.mjs +100 -0
  358. package/scripts/topo-watermark-dual-axis-breath-test.mjs +88 -0
  359. package/scripts/topo-watermark-envelope-breath-test.mjs +88 -0
  360. package/scripts/topo-watermark-recede-test.mjs +114 -0
  361. package/scripts/topo-watermark-triple-axis-breath-test.mjs +129 -0
  362. package/scripts/topo-working-online-chip-halo-layers-test.mjs +94 -0
  363. package/scripts/topo-zoom-buttons-brightness-test.mjs +94 -0
  364. package/scripts/topo-zoom-in-out-halo-layers-test.mjs +97 -0
  365. package/scripts/topo-zoom-level-breath-test.mjs +87 -0
  366. package/scripts/topo-zoom-level-brightness-test.mjs +83 -0
  367. package/scripts/topo-zoom-level-color-test.mjs +105 -0
  368. package/scripts/topo-zoom-level-dual-axis-breath-test.mjs +83 -0
  369. package/scripts/topo-zoom-level-halo-layers-test.mjs +78 -0
  370. package/scripts/topo-zoom-level-triple-axis-breath-test.mjs +143 -0
  371. package/.next/static/chunks/01_u86y_l.lyl.js +0 -1
  372. package/.next/static/chunks/0m.1mvl~t.avc.css +0 -2
  373. package/.next/static/chunks/0u-2pbnw428e2.js +0 -1
  374. package/.next/static/chunks/0yt96fzy~na3o.js +0 -4
  375. /package/.next/static/{Zlpna2lT3oD0Hh_j8KRN8 → fR0ebw1JI7cnTNTC-B5-l}/_buildManifest.js +0 -0
  376. /package/.next/static/{Zlpna2lT3oD0Hh_j8KRN8 → fR0ebw1JI7cnTNTC-B5-l}/_clientMiddlewareManifest.js +0 -0
  377. /package/.next/static/{Zlpna2lT3oD0Hh_j8KRN8 → fR0ebw1JI7cnTNTC-B5-l}/_ssgManifest.js +0 -0
@@ -0,0 +1,154 @@
1
+ /* Round 565 (50-round milestone) verification: chip-row chips
2
+ * gain "lit" bg/border treatment when operator hovers a node
3
+ * alias matching the chip's status tier. 7th anchor in the
4
+ * inspection-overrides-encoding family.
5
+ *
6
+ * Mock: alpha·1 (working) + alpha·2 (idle) + alpha·3 (offline).
7
+ * Hover alpha·1 → working chip lit (bg-green-500/15); hover
8
+ * alpha·2 → online chip lit (bg-cyan-500/15).
9
+ *
10
+ * Test phases:
11
+ * 1. rest: both chip bg's at /10 alpha (0.1); attrs 'false'
12
+ * 2. hover alpha·1 (working) → working chip bg at /15 (0.15);
13
+ * attr 'true'; online chip stays at /10
14
+ * 3. hover alpha·2 (idle) → online chip bg at /15; attr 'true';
15
+ * working stays at /10
16
+ * 4. hover alpha·3 (offline) → neither chip lit
17
+ * 5. source-side regex confirms wiring
18
+ */
19
+ import { chromium } from 'playwright';
20
+ import { readFileSync } from 'node:fs';
21
+
22
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
23
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
24
+
25
+ const browser = await chromium.launch({ headless: true });
26
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
27
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
28
+ await ctx.addInitScript(() => {
29
+ try {
30
+ localStorage.setItem('anet-theme', 'cyber');
31
+ localStorage.setItem('anet-topo-layout', 'ring');
32
+ sessionStorage.setItem('anet_v3_auth', '1');
33
+ } catch {}
34
+ });
35
+ await ctx.route('**/api/hub/status*', async (route) => {
36
+ const r = await route.fetch();
37
+ const b = await r.json();
38
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
39
+ const mk = (alias, status) => ({
40
+ alias, status, model: 'claude-opus-4', runtime: 'claude-code-cli',
41
+ network_id: nid, project_dir: null,
42
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
43
+ });
44
+ await route.fulfill({ response: r, json: { ...b, sessions: [
45
+ mk('alpha·1', 'working'),
46
+ mk('alpha·2', 'idle'),
47
+ mk('alpha·3', 'offline'),
48
+ ] } });
49
+ });
50
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
51
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
52
+ const page = await ctx.newPage();
53
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
54
+ await page.waitForSelector('[data-working-chip]', { timeout: 15000 });
55
+ await page.waitForTimeout(500);
56
+
57
+ const probeChips = async () => {
58
+ return page.evaluate(() => {
59
+ const probe = (sel) => {
60
+ const el = document.querySelector(sel);
61
+ if (!el) return null;
62
+ const cs = getComputedStyle(el);
63
+ // Tailwind v4 emits bg in oklab format: oklab(L A B / alpha)
64
+ // Parse the trailing alpha to detect /10 vs /15.
65
+ const m = (cs.backgroundColor || '').match(/\/\s*([0-9.]+)\s*\)/);
66
+ return {
67
+ bg: cs.backgroundColor,
68
+ bgAlpha: m ? parseFloat(m[1]) : null,
69
+ };
70
+ };
71
+ return {
72
+ working: {
73
+ ...probe('[data-working-chip]'),
74
+ lit: document.querySelector('[data-working-chip-member-alias-lit]')
75
+ ?.getAttribute('data-working-chip-member-alias-lit') === 'true',
76
+ },
77
+ online: {
78
+ ...probe('[data-online-chip]'),
79
+ lit: document.querySelector('[data-online-chip-member-alias-lit]')
80
+ ?.getAttribute('data-online-chip-member-alias-lit') === 'true',
81
+ },
82
+ };
83
+ });
84
+ };
85
+
86
+ const rest = await probeChips();
87
+
88
+ // Hover working node
89
+ await page.hover('g[data-node="alpha·1"]');
90
+ await page.waitForTimeout(400);
91
+ const hoverWorking = await probeChips();
92
+
93
+ // Move and hover idle node
94
+ await page.mouse.move(0, 0);
95
+ await page.waitForTimeout(300);
96
+ await page.hover('g[data-node="alpha·2"]');
97
+ await page.waitForTimeout(400);
98
+ const hoverIdle = await probeChips();
99
+
100
+ // Move and hover offline node
101
+ await page.mouse.move(0, 0);
102
+ await page.waitForTimeout(300);
103
+ await page.hover('g[data-node="alpha·3"]');
104
+ await page.waitForTimeout(400);
105
+ const hoverOffline = await probeChips();
106
+
107
+ await browser.close();
108
+
109
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
110
+ const sourceTierKey = /const hoveredAliasTierKey: 'working' \| 'idle' \| 'offline' \| null/.test(src);
111
+ const sourceWorkingLit = /const isWorkingChipLit = hoveredAliasTierKey === 'working';/.test(src);
112
+ const sourceOnlineLit = /const isOnlineChipLit\s+= hoveredAliasTierKey === 'idle';/.test(src);
113
+ const sourceWorkingClass = /isWorkingChipLit \? 'bg-green-500\/15 border-green-500\/30' : 'bg-green-500\/10 border-green-500\/20'/.test(src);
114
+ const sourceOnlineClass = /isOnlineChipLit \? 'bg-cyan-500\/15 border-cyan-500\/30' : 'bg-cyan-500\/10 border-cyan-500\/20'/.test(src);
115
+ const sourceWorkingAttr = /data-working-chip-member-alias-lit=/.test(src);
116
+ const sourceOnlineAttr = /data-online-chip-member-alias-lit=/.test(src);
117
+
118
+ const closeAlpha = (a, target) => a !== null && Math.abs(a - target) < 0.005;
119
+
120
+ const results = {
121
+ rest_working_alpha_10: closeAlpha(rest.working.bgAlpha, 0.1),
122
+ rest_online_alpha_10: closeAlpha(rest.online.bgAlpha, 0.1),
123
+ rest_working_lit_false: rest.working.lit === false,
124
+ rest_online_lit_false: rest.online.lit === false,
125
+ // hover working → working chip alpha lifts to 0.15
126
+ hover_working_w_alpha_15: closeAlpha(hoverWorking.working.bgAlpha, 0.15),
127
+ hover_working_w_lit_true: hoverWorking.working.lit === true,
128
+ hover_working_o_alpha_10: closeAlpha(hoverWorking.online.bgAlpha, 0.1),
129
+ hover_working_o_lit_false: hoverWorking.online.lit === false,
130
+ // hover idle → online chip alpha lifts; working stays
131
+ hover_idle_o_alpha_15: closeAlpha(hoverIdle.online.bgAlpha, 0.15),
132
+ hover_idle_o_lit_true: hoverIdle.online.lit === true,
133
+ hover_idle_w_alpha_10: closeAlpha(hoverIdle.working.bgAlpha, 0.1),
134
+ hover_idle_w_lit_false: hoverIdle.working.lit === false,
135
+ // hover offline → neither chip lit
136
+ hover_offline_w_lit_false: hoverOffline.working.lit === false,
137
+ hover_offline_o_lit_false: hoverOffline.online.lit === false,
138
+ // Source
139
+ source_tier_key: sourceTierKey,
140
+ source_working_lit: sourceWorkingLit,
141
+ source_online_lit: sourceOnlineLit,
142
+ source_working_class: sourceWorkingClass,
143
+ source_online_class: sourceOnlineClass,
144
+ source_working_attr: sourceWorkingAttr,
145
+ source_online_attr: sourceOnlineAttr,
146
+ };
147
+ const ok = Object.values(results).every(Boolean);
148
+ console.log(`${ok ? '✅' : '❌'} R565 chip-row chip member-alias-lit (7th anchor, 50-round milestone):`,
149
+ JSON.stringify(results, null, 2),
150
+ '\n rest:', JSON.stringify(rest),
151
+ '\n hover working node:', JSON.stringify(hoverWorking),
152
+ '\n hover idle node:', JSON.stringify(hoverIdle),
153
+ '\n hover offline node:', JSON.stringify(hoverOffline));
154
+ process.exit(ok ? 0 : 1);
@@ -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,121 @@
1
+ /* Round 719 — chrome fullscreen button respiratory anchor at 25 s.
2
+ * 6th anchor on the chrome-strip pattern, completing the ATOMIC-CONTROL
3
+ * DUO with R718 reset (21 s + 25 s, parity 7% alpha range). Shape
4
+ * advances "tiered-with-quartet" → "tiered-with-quintet". 25 = 5²,
5
+ * coprime with every other rolodex cadence (no other factor-5 anywhere)
6
+ * — new slowest cadence on the rolodex.
7
+ *
8
+ * Assertions:
9
+ * - fullscreen button present with breath class + breath-cadence "25s"
10
+ * - hover attr defaults to "false" at rest (gate inactive)
11
+ * - CSS @keyframes 0%,100% opacity:1, 50% opacity:0.93 (parity to R718)
12
+ * - .anet-topo-chrome-fullscreen-breath rule binds 25s cadence
13
+ * - hover-gate selector `[data-topo-chrome-fullscreen-hover="true"]`
14
+ * - prefers-reduced-motion guard present
15
+ * - R710 rolodex catalog includes "25": ["fullscreen button"]
16
+ * - R717 patterns chrome-strip entry has cadence 25 + anchor
17
+ * "fullscreen button" + shape "tiered-with-quintet"
18
+ * - duo cadences (21, 25) both present in chrome-strip cadences
19
+ */
20
+ import { chromium } from 'playwright';
21
+ import { readFileSync } from 'node:fs';
22
+
23
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
24
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
25
+
26
+ const browser = await chromium.launch({ headless: true });
27
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
28
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
29
+ await ctx.addInitScript(() => {
30
+ try {
31
+ localStorage.setItem('anet-theme', 'cyber');
32
+ localStorage.setItem('anet-topo-layout', 'ring');
33
+ sessionStorage.setItem('anet_v3_auth', '1');
34
+ } catch {}
35
+ });
36
+ await ctx.route('**/api/hub/status*', async (route) => {
37
+ const r = await route.fetch();
38
+ const b = await r.json();
39
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
40
+ const mk = (alias) => ({
41
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
42
+ network_id: nid, project_dir: null,
43
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
44
+ });
45
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
46
+ });
47
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
48
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
49
+ const page = await ctx.newPage();
50
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
51
+ await page.waitForSelector('[data-topo-chrome-fullscreen]', { timeout: 15000, state: 'attached' });
52
+ await page.waitForTimeout(300);
53
+
54
+ const runtimeState = await page.evaluate(() => {
55
+ const btn = document.querySelector('[data-topo-chrome-fullscreen]');
56
+ if (!btn) return null;
57
+ const cs = getComputedStyle(btn);
58
+ const svg = document.querySelector('[data-topo-canvas-aria]');
59
+ return {
60
+ has_class: btn.classList.contains('anet-topo-chrome-fullscreen-breath'),
61
+ breath_attr: btn.getAttribute('data-topo-chrome-fullscreen-breath'),
62
+ hover_attr: btn.getAttribute('data-topo-chrome-fullscreen-hover'),
63
+ anim_name: cs.animationName,
64
+ anim_duration: cs.animationDuration,
65
+ rolodex_attr: svg?.getAttribute('data-topo-respiratory-rolodex') ?? null,
66
+ patterns_attr: svg?.getAttribute('data-topo-respiratory-patterns') ?? null,
67
+ };
68
+ });
69
+
70
+ await browser.close();
71
+
72
+ const cssSrc = readFileSync('/home/vansin/agent-network-dashboard/app/globals.css', 'utf8');
73
+ const cssKfNorm = /@keyframes anet-topo-chrome-fullscreen-breath-kf\s*\{[\s\S]*?0%,\s*100%\s*\{[\s\S]*?opacity:\s*1\s*;?[\s\S]*?\}/.test(cssSrc);
74
+ const cssKfMid = /@keyframes anet-topo-chrome-fullscreen-breath-kf\s*\{[\s\S]*?50%\s*\{[\s\S]*?opacity:\s*0\.93/.test(cssSrc);
75
+ const cssBind25 = /\.anet-topo-chrome-fullscreen-breath\s*\{[\s\S]*?animation:\s*anet-topo-chrome-fullscreen-breath-kf\s+25s\s+ease-in-out\s+infinite/.test(cssSrc);
76
+ const cssHoverGate = /\.anet-topo-chrome-fullscreen-breath\[data-topo-chrome-fullscreen-hover="true"\]\s*\{\s*animation:\s*none/.test(cssSrc);
77
+ const cssReducedMotion = /@media\s*\(prefers-reduced-motion:\s*reduce\)\s*\{[\s\S]*?\.anet-topo-chrome-fullscreen-breath\s*\{\s*animation:\s*none/.test(cssSrc);
78
+
79
+ const runtimeAnim = runtimeState?.anim_name === 'anet-topo-chrome-fullscreen-breath-kf' || runtimeState?.anim_name === 'none';
80
+
81
+ let rolodex = null;
82
+ let patterns = null;
83
+ try {
84
+ rolodex = JSON.parse(runtimeState?.rolodex_attr ?? '');
85
+ patterns = JSON.parse(runtimeState?.patterns_attr ?? '');
86
+ } catch {}
87
+ const rolodexHas25 = !!rolodex && Array.isArray(rolodex['25']) && rolodex['25'].includes('fullscreen button');
88
+ const chromeStripEntry = Array.isArray(patterns) ? patterns.find(p => p.name === 'chrome-strip') : null;
89
+ const patternsChromeStripHas25AndFullscreen =
90
+ !!chromeStripEntry
91
+ && Array.isArray(chromeStripEntry.cadences) && chromeStripEntry.cadences.includes(25)
92
+ && Array.isArray(chromeStripEntry.anchors) && chromeStripEntry.anchors.includes('fullscreen button')
93
+ && chromeStripEntry.shape === 'tiered-with-quintet';
94
+ const atomicDuoBothPresent =
95
+ !!chromeStripEntry
96
+ && chromeStripEntry.cadences.includes(21)
97
+ && chromeStripEntry.cadences.includes(25)
98
+ && chromeStripEntry.anchors.includes('reset button')
99
+ && chromeStripEntry.anchors.includes('fullscreen button');
100
+
101
+ const results = {
102
+ button_present: !!runtimeState,
103
+ has_breath_class: runtimeState?.has_class === true,
104
+ breath_attr_25s: runtimeState?.breath_attr === '25s',
105
+ rest_not_hover: runtimeState?.hover_attr === 'false',
106
+ runtime_anim_ok: runtimeAnim,
107
+ css_keyframes_norm: cssKfNorm,
108
+ css_keyframes_mid_0_93: cssKfMid,
109
+ css_class_binds_25s: cssBind25,
110
+ css_hover_gate_present: cssHoverGate,
111
+ css_reduced_motion_guard: cssReducedMotion,
112
+ rolodex_has_25_fullscreen: rolodexHas25,
113
+ patterns_chrome_strip_6_anchors: patternsChromeStripHas25AndFullscreen,
114
+ atomic_control_duo_complete: atomicDuoBothPresent,
115
+ };
116
+ const ok = Object.values(results).every(Boolean);
117
+ console.log(`${ok ? '✅' : '❌'} R719 chrome fullscreen button breath (6th chrome-strip anchor, atomic-control DUO complete @ 25s):`,
118
+ JSON.stringify(results, null, 2),
119
+ `\n runtime: ${JSON.stringify({ has_class: runtimeState?.has_class, breath_attr: runtimeState?.breath_attr, hover_attr: runtimeState?.hover_attr, anim_name: runtimeState?.anim_name, anim_duration: runtimeState?.anim_duration })}`,
120
+ `\n chrome-strip pattern: ${JSON.stringify(chromeStripEntry)}`);
121
+ 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);