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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (393) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +3 -3
  3. package/.next/diagnostics/route-bundle-stats.json +7 -7
  4. package/.next/fallback-build-manifest.json +3 -3
  5. package/.next/server/app/_global-error.html +1 -1
  6. package/.next/server/app/_global-error.rsc +1 -1
  7. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  8. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  12. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  13. package/.next/server/app/_not-found.html +2 -2
  14. package/.next/server/app/_not-found.rsc +2 -2
  15. package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  16. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  17. package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  18. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  19. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  20. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  21. package/.next/server/app/admin/page_client-reference-manifest.js +1 -1
  22. package/.next/server/app/admin.html +2 -2
  23. package/.next/server/app/admin.rsc +2 -2
  24. package/.next/server/app/admin.segments/_full.segment.rsc +2 -2
  25. package/.next/server/app/admin.segments/_head.segment.rsc +1 -1
  26. package/.next/server/app/admin.segments/_index.segment.rsc +2 -2
  27. package/.next/server/app/admin.segments/_tree.segment.rsc +2 -2
  28. package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +1 -1
  29. package/.next/server/app/admin.segments/admin.segment.rsc +1 -1
  30. package/.next/server/app/index.html +2 -2
  31. package/.next/server/app/index.rsc +3 -3
  32. package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  33. package/.next/server/app/index.segments/_full.segment.rsc +3 -3
  34. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  35. package/.next/server/app/index.segments/_index.segment.rsc +2 -2
  36. package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  37. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  38. package/.next/server/app/login.html +2 -2
  39. package/.next/server/app/login.rsc +3 -3
  40. package/.next/server/app/login.segments/_full.segment.rsc +3 -3
  41. package/.next/server/app/login.segments/_head.segment.rsc +1 -1
  42. package/.next/server/app/login.segments/_index.segment.rsc +2 -2
  43. package/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  44. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  45. package/.next/server/app/login.segments/login.segment.rsc +1 -1
  46. package/.next/server/app/logs/page_client-reference-manifest.js +1 -1
  47. package/.next/server/app/logs.html +2 -2
  48. package/.next/server/app/logs.rsc +2 -2
  49. package/.next/server/app/logs.segments/_full.segment.rsc +2 -2
  50. package/.next/server/app/logs.segments/_head.segment.rsc +1 -1
  51. package/.next/server/app/logs.segments/_index.segment.rsc +2 -2
  52. package/.next/server/app/logs.segments/_tree.segment.rsc +2 -2
  53. package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +1 -1
  54. package/.next/server/app/logs.segments/logs.segment.rsc +1 -1
  55. package/.next/server/app/messages/page_client-reference-manifest.js +1 -1
  56. package/.next/server/app/messages.html +2 -2
  57. package/.next/server/app/messages.rsc +2 -2
  58. package/.next/server/app/messages.segments/_full.segment.rsc +2 -2
  59. package/.next/server/app/messages.segments/_head.segment.rsc +1 -1
  60. package/.next/server/app/messages.segments/_index.segment.rsc +2 -2
  61. package/.next/server/app/messages.segments/_tree.segment.rsc +2 -2
  62. package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +1 -1
  63. package/.next/server/app/messages.segments/messages.segment.rsc +1 -1
  64. package/.next/server/app/node/page_client-reference-manifest.js +1 -1
  65. package/.next/server/app/node.html +2 -2
  66. package/.next/server/app/node.rsc +2 -2
  67. package/.next/server/app/node.segments/_full.segment.rsc +2 -2
  68. package/.next/server/app/node.segments/_head.segment.rsc +1 -1
  69. package/.next/server/app/node.segments/_index.segment.rsc +2 -2
  70. package/.next/server/app/node.segments/_tree.segment.rsc +2 -2
  71. package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +1 -1
  72. package/.next/server/app/node.segments/node.segment.rsc +1 -1
  73. package/.next/server/app/nodes/page_client-reference-manifest.js +1 -1
  74. package/.next/server/app/nodes.html +2 -2
  75. package/.next/server/app/nodes.rsc +2 -2
  76. package/.next/server/app/nodes.segments/_full.segment.rsc +2 -2
  77. package/.next/server/app/nodes.segments/_head.segment.rsc +1 -1
  78. package/.next/server/app/nodes.segments/_index.segment.rsc +2 -2
  79. package/.next/server/app/nodes.segments/_tree.segment.rsc +2 -2
  80. package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +1 -1
  81. package/.next/server/app/nodes.segments/nodes.segment.rsc +1 -1
  82. package/.next/server/app/page_client-reference-manifest.js +1 -1
  83. package/.next/server/app/server-logs/page_client-reference-manifest.js +1 -1
  84. package/.next/server/app/server-logs.html +2 -2
  85. package/.next/server/app/server-logs.rsc +2 -2
  86. package/.next/server/app/server-logs.segments/_full.segment.rsc +2 -2
  87. package/.next/server/app/server-logs.segments/_head.segment.rsc +1 -1
  88. package/.next/server/app/server-logs.segments/_index.segment.rsc +2 -2
  89. package/.next/server/app/server-logs.segments/_tree.segment.rsc +2 -2
  90. package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +1 -1
  91. package/.next/server/app/server-logs.segments/server-logs.segment.rsc +1 -1
  92. package/.next/server/app/settings/networks/page_client-reference-manifest.js +1 -1
  93. package/.next/server/app/settings/networks.html +2 -2
  94. package/.next/server/app/settings/networks.rsc +2 -2
  95. package/.next/server/app/settings/networks.segments/_full.segment.rsc +2 -2
  96. package/.next/server/app/settings/networks.segments/_head.segment.rsc +1 -1
  97. package/.next/server/app/settings/networks.segments/_index.segment.rsc +2 -2
  98. package/.next/server/app/settings/networks.segments/_tree.segment.rsc +2 -2
  99. package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +1 -1
  100. package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +1 -1
  101. package/.next/server/app/settings/networks.segments/settings.segment.rsc +1 -1
  102. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  103. package/.next/server/app/settings/tokens/page_client-reference-manifest.js +1 -1
  104. package/.next/server/app/settings/tokens.html +2 -2
  105. package/.next/server/app/settings/tokens.rsc +2 -2
  106. package/.next/server/app/settings/tokens.segments/_full.segment.rsc +2 -2
  107. package/.next/server/app/settings/tokens.segments/_head.segment.rsc +1 -1
  108. package/.next/server/app/settings/tokens.segments/_index.segment.rsc +2 -2
  109. package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +2 -2
  110. package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +1 -1
  111. package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +1 -1
  112. package/.next/server/app/settings/tokens.segments/settings.segment.rsc +1 -1
  113. package/.next/server/app/settings.html +2 -2
  114. package/.next/server/app/settings.rsc +3 -3
  115. package/.next/server/app/settings.segments/_full.segment.rsc +3 -3
  116. package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  117. package/.next/server/app/settings.segments/_index.segment.rsc +2 -2
  118. package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  119. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +2 -2
  120. package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  121. package/.next/server/app/tasks/[id]/page_client-reference-manifest.js +1 -1
  122. package/.next/server/app/tasks/page_client-reference-manifest.js +1 -1
  123. package/.next/server/app/tasks.html +2 -2
  124. package/.next/server/app/tasks.rsc +2 -2
  125. package/.next/server/app/tasks.segments/_full.segment.rsc +2 -2
  126. package/.next/server/app/tasks.segments/_head.segment.rsc +1 -1
  127. package/.next/server/app/tasks.segments/_index.segment.rsc +2 -2
  128. package/.next/server/app/tasks.segments/_tree.segment.rsc +2 -2
  129. package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +1 -1
  130. package/.next/server/app/tasks.segments/tasks.segment.rsc +1 -1
  131. package/.next/server/chunks/[root-of-the-server]__0tx8s8i._.js +1 -1
  132. package/.next/server/chunks/[root-of-the-server]__0tx8s8i._.js.map +1 -1
  133. package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js +1 -1
  134. package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js.map +1 -1
  135. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js +4 -4
  136. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js.map +1 -1
  137. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js +1 -1
  138. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js.map +1 -1
  139. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js +1 -1
  140. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js.map +1 -1
  141. package/.next/server/middleware-build-manifest.js +3 -3
  142. package/.next/server/pages/404.html +2 -2
  143. package/.next/server/pages/500.html +1 -1
  144. package/.next/static/chunks/083elibefsefi.js +4 -0
  145. package/.next/static/chunks/{05uydm8okqgqe.js → 0p142v5va508~.js} +1 -1
  146. package/.next/static/chunks/0u8v68gl7g6j1.js +1 -0
  147. package/.next/static/chunks/11sahbo6ikg8g.js +1 -0
  148. package/.next/static/chunks/16-7qr7qx9zrz.css +2 -0
  149. package/.next/trace +2 -2
  150. package/.next/trace-build +1 -1
  151. package/app/api/hub/servers/route.ts +3 -29
  152. package/app/components/TopoGraph.tsx +6143 -180
  153. package/app/globals.css +897 -7
  154. package/app/lib/serverDedupe.ts +122 -0
  155. package/package.json +1 -1
  156. package/scripts/p157-rc2-dedup-test.mjs +110 -0
  157. package/scripts/topo-a11y-titles-catalog-test.mjs +132 -0
  158. package/scripts/topo-active-chrome-hover-text-test.mjs +107 -0
  159. package/scripts/topo-active-links-chip-halo-layers-test.mjs +81 -0
  160. package/scripts/topo-alias-chat-brightness-test.mjs +79 -0
  161. package/scripts/topo-alias-text-halo-layers-test.mjs +98 -0
  162. package/scripts/topo-animation-temporal-modes-catalog-test.mjs +144 -0
  163. package/scripts/topo-avatar-chat-gate-test.mjs +77 -0
  164. package/scripts/topo-avatar-drop-shadow-test.mjs +86 -0
  165. package/scripts/topo-avatar-fallback-hover-test.mjs +104 -0
  166. package/scripts/topo-avatar-fallback-rotate-test.mjs +92 -0
  167. package/scripts/topo-avatar-rotate-test.mjs +85 -0
  168. package/scripts/topo-avatar-scale-test.mjs +89 -0
  169. package/scripts/topo-badge-chat-gate-test.mjs +74 -0
  170. package/scripts/topo-brand-drop-shadow-test.mjs +71 -0
  171. package/scripts/topo-brand-logo-breath-test.mjs +102 -0
  172. package/scripts/topo-brand-logo-halo-layers-test.mjs +85 -0
  173. package/scripts/topo-brand-logo-hover-brightness-test.mjs +105 -0
  174. package/scripts/topo-brand-logo-hover-rotate-test.mjs +93 -0
  175. package/scripts/topo-brand-logo-hover-test.mjs +85 -0
  176. package/scripts/topo-canvas-desc-a11y-test.mjs +87 -0
  177. package/scripts/topo-canvas-entrance-animation-test.mjs +117 -0
  178. package/scripts/topo-canvas-scan-beam-diagonal-test.mjs +148 -0
  179. package/scripts/topo-canvas-scan-beam-test.mjs +109 -0
  180. package/scripts/topo-canvas-scan-beam-vertical-test.mjs +123 -0
  181. package/scripts/topo-card-chat-brightness-test.mjs +86 -0
  182. package/scripts/topo-chat-ring-breath-curve-test.mjs +114 -0
  183. package/scripts/topo-chat-ring-brightness-test.mjs +80 -0
  184. package/scripts/topo-chat-ring-halo-layers-test.mjs +100 -0
  185. package/scripts/topo-chat-ring-r-breath-test.mjs +121 -0
  186. package/scripts/topo-chat-ring-status-halo-test.mjs +106 -0
  187. package/scripts/topo-chat-ring-sw-breath-test.mjs +123 -0
  188. package/scripts/topo-chip-pin-halo-test.mjs +85 -0
  189. package/scripts/topo-chip-row-digit-ls-test.mjs +135 -0
  190. package/scripts/topo-chip-row-member-alias-lit-test.mjs +154 -0
  191. package/scripts/topo-chip-row-tier-glow-brightness-test.mjs +99 -0
  192. package/scripts/topo-chip-row-unit-hover-tracking-test.mjs +124 -0
  193. package/scripts/topo-chrome-control-halo-layers-test.mjs +22 -0
  194. package/scripts/topo-chrome-fullscreen-breath-test.mjs +121 -0
  195. package/scripts/topo-chrome-layout-trailer-breath-test.mjs +86 -0
  196. package/scripts/topo-chrome-nodesize-trailer-breath-test.mjs +86 -0
  197. package/scripts/topo-chrome-reset-breath-test.mjs +115 -0
  198. package/scripts/topo-chrome-strip-entrance-animation-test.mjs +115 -0
  199. package/scripts/topo-chrome-wrapper-halo-test.mjs +83 -0
  200. package/scripts/topo-chrome-zoom-wrapper-breath-test.mjs +85 -0
  201. package/scripts/topo-click-ripple-glow-test.mjs +86 -0
  202. package/scripts/topo-click-ripple-halo-layers-test.mjs +79 -0
  203. package/scripts/topo-click-ripple-sw-test.mjs +110 -0
  204. package/scripts/topo-crescent-breath-test.mjs +104 -0
  205. package/scripts/topo-crescent-envelope-breath-test.mjs +103 -0
  206. package/scripts/topo-crescent-recede-test.mjs +111 -0
  207. package/scripts/topo-dense-alias-chat-halo-test.mjs +73 -0
  208. package/scripts/topo-dense-alias-halo-layers-test.mjs +80 -0
  209. package/scripts/topo-dual-axis-surfaces-catalog-test.mjs +94 -0
  210. package/scripts/topo-edge-badge-circle-brightness-test.mjs +82 -0
  211. package/scripts/topo-edge-badge-circle-hot-pulse-test.mjs +100 -0
  212. package/scripts/topo-edge-badge-digit-halo-layers-test.mjs +107 -0
  213. package/scripts/topo-edge-badge-endpoint-gate-test.mjs +94 -0
  214. package/scripts/topo-edge-badge-halo-layers-test.mjs +85 -0
  215. package/scripts/topo-edge-badge-hot-pulse-test.mjs +92 -0
  216. package/scripts/topo-edge-badge-hover-glow-test.mjs +90 -0
  217. package/scripts/topo-edge-badge-text-brightness-test.mjs +83 -0
  218. package/scripts/topo-edge-chat-gate-test.mjs +71 -0
  219. package/scripts/topo-edge-flow-rail-halo-layers-test.mjs +89 -0
  220. package/scripts/topo-edge-particle-brightness-test.mjs +82 -0
  221. package/scripts/topo-edge-particle-halo-layers-test.mjs +91 -0
  222. package/scripts/topo-edge-pill-glow-test.mjs +67 -0
  223. package/scripts/topo-edge-pin-halo-test.mjs +99 -0
  224. package/scripts/topo-edge-visible-brightness-test.mjs +84 -0
  225. package/scripts/topo-edge-visible-halo-layers-test.mjs +87 -0
  226. package/scripts/topo-endpoint-ring-brightness-test.mjs +83 -0
  227. package/scripts/topo-endpoint-ring-flow-halo-test.mjs +107 -0
  228. package/scripts/topo-endpoint-ring-halo-layers-test.mjs +100 -0
  229. package/scripts/topo-filter-pill-glow-test.mjs +90 -0
  230. package/scripts/topo-filter-pill-halo-layers-test.mjs +27 -0
  231. package/scripts/topo-flow-arrow-brightness-test.mjs +82 -0
  232. package/scripts/topo-flow-rail-brightness-test.mjs +80 -0
  233. package/scripts/topo-fullscreen-attr-test.mjs +73 -0
  234. package/scripts/topo-fullscreen-brightness-test.mjs +84 -0
  235. package/scripts/topo-fullscreen-icon-rotate-test.mjs +93 -0
  236. package/scripts/topo-grid-content-bottom-attr-test.mjs +72 -0
  237. package/scripts/topo-group-box-brightness-test.mjs +84 -0
  238. package/scripts/topo-group-box-halo-layers-test.mjs +91 -0
  239. package/scripts/topo-group-chat-gate-test.mjs +77 -0
  240. package/scripts/topo-group-label-brightness-test.mjs +84 -0
  241. package/scripts/topo-group-label-halo-layers-test.mjs +78 -0
  242. package/scripts/topo-group-label-hover-glow-test.mjs +86 -0
  243. package/scripts/topo-group-label-member-alias-hover-test.mjs +125 -0
  244. package/scripts/topo-group-pill-glow-test.mjs +76 -0
  245. package/scripts/topo-group-tint-brightness-test.mjs +82 -0
  246. package/scripts/topo-h2-dual-axis-breath-test.mjs +92 -0
  247. package/scripts/topo-h2-triple-axis-breath-test.mjs +142 -0
  248. package/scripts/topo-halo-chat-gate-test.mjs +72 -0
  249. package/scripts/topo-hover-detail-halo-test.mjs +76 -0
  250. package/scripts/topo-hub-a11y-title-test.mjs +95 -0
  251. package/scripts/topo-hub-core-brightness-test.mjs +82 -0
  252. package/scripts/topo-hub-core-halo-layers-test.mjs +81 -0
  253. package/scripts/topo-hub-digit-brightness-test.mjs +79 -0
  254. package/scripts/topo-hub-digit-halo-layers-test.mjs +76 -0
  255. package/scripts/topo-hub-digit-ls-test.mjs +119 -0
  256. package/scripts/topo-hub-halo-brightness-test.mjs +80 -0
  257. package/scripts/topo-hub-halo-glow-test.mjs +96 -0
  258. package/scripts/topo-hub-halo-halo-layers-test.mjs +76 -0
  259. package/scripts/topo-hub-highlight-brightness-test.mjs +84 -0
  260. package/scripts/topo-hub-highlight-glow-test.mjs +99 -0
  261. package/scripts/topo-hub-highlight-halo-layers-test.mjs +78 -0
  262. package/scripts/topo-hub-highlight-r-test.mjs +112 -0
  263. package/scripts/topo-hub-hover-ring-brightness-test.mjs +79 -0
  264. package/scripts/topo-hub-hover-ring-glow-test.mjs +97 -0
  265. package/scripts/topo-hub-hover-ring-halo-layers-test.mjs +71 -0
  266. package/scripts/topo-hub-spoke-brightness-test.mjs +77 -0
  267. package/scripts/topo-hub-spoke-glow-test.mjs +112 -0
  268. package/scripts/topo-hub-spoke-halo-layers-test.mjs +97 -0
  269. package/scripts/topo-hub-spoke-self-filter-test.mjs +119 -0
  270. package/scripts/topo-kicker-breath-test.mjs +100 -0
  271. package/scripts/topo-kicker-dual-axis-breath-test.mjs +81 -0
  272. package/scripts/topo-kicker-halo-layers-test.mjs +82 -0
  273. package/scripts/topo-kicker-triple-axis-breath-test.mjs +124 -0
  274. package/scripts/topo-label-card-brightness-test.mjs +81 -0
  275. package/scripts/topo-layout-hover-fw-test.mjs +98 -0
  276. package/scripts/topo-layout-toggle-brightness-test.mjs +94 -0
  277. package/scripts/topo-layout-toggle-halo-layers-test.mjs +95 -0
  278. package/scripts/topo-legend-count-brightness-test.mjs +80 -0
  279. package/scripts/topo-legend-count-halo-layers-test.mjs +79 -0
  280. package/scripts/topo-legend-count-letter-spacing-test.mjs +108 -0
  281. package/scripts/topo-legend-label-fw-test.mjs +107 -0
  282. package/scripts/topo-legend-panel-title-breath-test.mjs +86 -0
  283. package/scripts/topo-legend-pin-ring-brightness-test.mjs +82 -0
  284. package/scripts/topo-legend-pin-ring-halo-layers-test.mjs +71 -0
  285. package/scripts/topo-legend-row-count-brightness-test.mjs +85 -0
  286. package/scripts/topo-legend-row-label-glow-test.mjs +102 -0
  287. package/scripts/topo-legend-swatch-glow-test.mjs +109 -0
  288. package/scripts/topo-legend-swatch-member-alias-match-test.mjs +139 -0
  289. package/scripts/topo-legend-tint-brightness-test.mjs +83 -0
  290. package/scripts/topo-legend-trio-halo-layers-test.mjs +22 -0
  291. package/scripts/topo-minimap-container-halo-test.mjs +82 -0
  292. package/scripts/topo-minimap-dot-chat-gate-test.mjs +81 -0
  293. package/scripts/topo-minimap-hover-glow-test.mjs +109 -0
  294. package/scripts/topo-minimap-viewport-brightness-test.mjs +84 -0
  295. package/scripts/topo-minimap-viewport-halo-layers-test.mjs +24 -0
  296. package/scripts/topo-more-footer-brightness-test.mjs +94 -0
  297. package/scripts/topo-node-alias-brightness-test.mjs +84 -0
  298. package/scripts/topo-node-avatar-halo-layers-test.mjs +25 -0
  299. package/scripts/topo-node-hover-ring-halo-layers-test.mjs +70 -0
  300. package/scripts/topo-node-label-card-halo-test.mjs +76 -0
  301. package/scripts/topo-node-sub-text-brightness-test.mjs +88 -0
  302. package/scripts/topo-nodesize-brightness-test.mjs +82 -0
  303. package/scripts/topo-nodesize-halo-layers-test.mjs +89 -0
  304. package/scripts/topo-nodesize-hover-fw-test.mjs +99 -0
  305. package/scripts/topo-orphan-label-opacity-test.mjs +98 -0
  306. package/scripts/topo-panel-count-halo-layers-test.mjs +91 -0
  307. package/scripts/topo-panel-count-hover-ls-test.mjs +87 -0
  308. package/scripts/topo-panel-rect-halo-test.mjs +90 -0
  309. package/scripts/topo-panel-row-brightness-test.mjs +116 -0
  310. package/scripts/topo-panel-title-brightness-test.mjs +98 -0
  311. package/scripts/topo-panel-title-glow-test.mjs +111 -0
  312. package/scripts/topo-panel-titles-dual-axis-breath-test.mjs +94 -0
  313. package/scripts/topo-panel-titles-halo-layers-test.mjs +23 -0
  314. package/scripts/topo-panel-titles-triple-axis-breath-test.mjs +161 -0
  315. package/scripts/topo-pill-x-rotate-test.mjs +96 -0
  316. package/scripts/topo-pip-brightness-test.mjs +85 -0
  317. package/scripts/topo-pressure-bar-halo-layers-test.mjs +19 -0
  318. package/scripts/topo-pressure-seg-glow-test.mjs +92 -0
  319. package/scripts/topo-pressure-seg-member-alias-match-test.mjs +133 -0
  320. package/scripts/topo-pressure-seg-motion-test.mjs +101 -0
  321. package/scripts/topo-r717-scan-beam-pair-pattern-test.mjs +100 -0
  322. package/scripts/topo-r717-triple-axis-pair-pattern-test.mjs +113 -0
  323. package/scripts/topo-r717-triple-axis-tier-pattern-test.mjs +117 -0
  324. package/scripts/topo-recent-count-brightness-test.mjs +84 -0
  325. package/scripts/topo-recent-more-fw-test.mjs +126 -0
  326. package/scripts/topo-recent-more-halo-layers-test.mjs +90 -0
  327. package/scripts/topo-recent-panel-hot-pulse-test.mjs +105 -0
  328. package/scripts/topo-recent-panel-title-breath-test.mjs +91 -0
  329. package/scripts/topo-recent-pip-halo-layers-test.mjs +82 -0
  330. package/scripts/topo-recent-row-chat-gate-test.mjs +75 -0
  331. package/scripts/topo-recent-row-content-lift-test.mjs +140 -0
  332. package/scripts/topo-recent-row-fw-test.mjs +115 -0
  333. package/scripts/topo-recent-row-text-glow-test.mjs +86 -0
  334. package/scripts/topo-recent-row-text-halo-layers-test.mjs +67 -0
  335. package/scripts/topo-recent-tint-brightness-test.mjs +80 -0
  336. package/scripts/topo-recent-ts-brightness-test.mjs +86 -0
  337. package/scripts/topo-reduced-motion-attr-test.mjs +69 -0
  338. package/scripts/topo-reset-brightness-test.mjs +83 -0
  339. package/scripts/topo-reset-icon-hover-scale-test.mjs +102 -0
  340. package/scripts/topo-respiratory-axis-count-stats-test.mjs +154 -0
  341. package/scripts/topo-respiratory-patterns-catalog-test.mjs +112 -0
  342. package/scripts/topo-respiratory-rolodex-test.mjs +83 -0
  343. package/scripts/topo-respiratory-tiers-catalog-test.mjs +119 -0
  344. package/scripts/topo-respiratory-triple-axis-surfaces-catalog-test.mjs +127 -0
  345. package/scripts/topo-runtime-badge-brightness-test.mjs +78 -0
  346. package/scripts/topo-runtime-badge-glow-test.mjs +108 -0
  347. package/scripts/topo-runtime-badge-halo-layers-test.mjs +87 -0
  348. package/scripts/topo-runtime-badge-rotate-test.mjs +85 -0
  349. package/scripts/topo-section-title-breath-test.mjs +83 -0
  350. package/scripts/topo-section-title-halo-layers-test.mjs +88 -0
  351. package/scripts/topo-spoke-chat-gate-test.mjs +72 -0
  352. package/scripts/topo-starfield-hue-test.mjs +109 -0
  353. package/scripts/topo-status-pin-pill-halo-layers-test.mjs +17 -0
  354. package/scripts/topo-status-ring-brightness-test.mjs +84 -0
  355. package/scripts/topo-status-ring-chat-gate-test.mjs +72 -0
  356. package/scripts/topo-status-ring-halo-layers-test.mjs +105 -0
  357. package/scripts/topo-status-ring-status-halo-test.mjs +110 -0
  358. package/scripts/topo-sub-text-chat-brightness-test.mjs +81 -0
  359. package/scripts/topo-svg-title-a11y-r731-test.mjs +93 -0
  360. package/scripts/topo-svg-title-a11y-test.mjs +88 -0
  361. package/scripts/topo-title-block-entrance-animation-test.mjs +127 -0
  362. package/scripts/topo-title-block-envelope-breath-test.mjs +87 -0
  363. package/scripts/topo-titleblock-h2-hover-fw-test.mjs +109 -0
  364. package/scripts/topo-titleblock-h2-hover-tracking-test.mjs +128 -0
  365. package/scripts/topo-titleblock-kicker-hover-test.mjs +134 -0
  366. package/scripts/topo-vendor-chip-glow-test.mjs +97 -0
  367. package/scripts/topo-vendor-chip-halo-layers-test.mjs +18 -0
  368. package/scripts/topo-vendor-chip-pin-halo-test.mjs +88 -0
  369. package/scripts/topo-vendor-count-suffix-halo-layers-test.mjs +79 -0
  370. package/scripts/topo-vendor-distribution-wrapper-halo-test.mjs +93 -0
  371. package/scripts/topo-vendor-letter-halo-layers-test.mjs +93 -0
  372. package/scripts/topo-vendor-pill-glow-test.mjs +98 -0
  373. package/scripts/topo-watermark-breath-test.mjs +100 -0
  374. package/scripts/topo-watermark-dual-axis-breath-test.mjs +88 -0
  375. package/scripts/topo-watermark-envelope-breath-test.mjs +88 -0
  376. package/scripts/topo-watermark-recede-test.mjs +114 -0
  377. package/scripts/topo-watermark-triple-axis-breath-test.mjs +129 -0
  378. package/scripts/topo-working-online-chip-halo-layers-test.mjs +94 -0
  379. package/scripts/topo-zoom-buttons-brightness-test.mjs +94 -0
  380. package/scripts/topo-zoom-in-out-halo-layers-test.mjs +97 -0
  381. package/scripts/topo-zoom-level-breath-test.mjs +87 -0
  382. package/scripts/topo-zoom-level-brightness-test.mjs +83 -0
  383. package/scripts/topo-zoom-level-color-test.mjs +105 -0
  384. package/scripts/topo-zoom-level-dual-axis-breath-test.mjs +83 -0
  385. package/scripts/topo-zoom-level-halo-layers-test.mjs +78 -0
  386. package/scripts/topo-zoom-level-triple-axis-breath-test.mjs +148 -0
  387. package/.next/static/chunks/0b57cx-~yee9s.js +0 -1
  388. package/.next/static/chunks/0c5ux9rrl-j.a.js +0 -4
  389. package/.next/static/chunks/0ixrbcha76lse.js +0 -1
  390. package/.next/static/chunks/0m.1mvl~t.avc.css +0 -2
  391. /package/.next/static/{fAHTff4Obp5vYwjZIWEvA → wz1T-LhLDalz691PpN3E7}/_buildManifest.js +0 -0
  392. /package/.next/static/{fAHTff4Obp5vYwjZIWEvA → wz1T-LhLDalz691PpN3E7}/_clientMiddlewareManifest.js +0 -0
  393. /package/.next/static/{fAHTff4Obp5vYwjZIWEvA → wz1T-LhLDalz691PpN3E7}/_ssgManifest.js +0 -0
@@ -0,0 +1,103 @@
1
+ /* Round 705 — canvas crescent moon wrapper envelope breath at 13s.
2
+ * Mirror to R704 watermark wrapper (15s), closing canvas-brand-pair
3
+ * envelope symmetry. Two coprime cadences (13 + 15) for independent
4
+ * voices. Tighter alpha range (0.30 ↔ 0.35) hugs the existing inline
5
+ * baseline.
6
+ *
7
+ * Source assertions:
8
+ * - TopoGraph.tsx crescent <g> has className + data-topo-brand-canvas-mark-envelope-breath
9
+ * - globals.css @keyframes + .class + 2 gate rules + reduced-motion guard
10
+ *
11
+ * Runtime assertions:
12
+ * - crescent visible (no flowLinks, default test scaffold)
13
+ * - data-topo-brand-canvas-mark-visible='true'
14
+ * - data-topo-brand-canvas-mark-envelope-breath='13s'
15
+ * - computed animation-name + duration 13s + iter infinite
16
+ */
17
+ import { chromium } from 'playwright';
18
+ import { readFileSync } from 'node:fs';
19
+
20
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
21
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
22
+
23
+ const browser = await chromium.launch({ headless: true });
24
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
25
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
26
+ await ctx.addInitScript(() => {
27
+ try {
28
+ localStorage.setItem('anet-theme', 'cyber');
29
+ localStorage.setItem('anet-topo-layout', 'ring');
30
+ sessionStorage.setItem('anet_v3_auth', '1');
31
+ } catch {}
32
+ });
33
+ await ctx.route('**/api/hub/status*', async (route) => {
34
+ const r = await route.fetch();
35
+ const b = await r.json();
36
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
37
+ const mk = (alias) => ({
38
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
39
+ network_id: nid, project_dir: null,
40
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
41
+ });
42
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
43
+ });
44
+ // No messages → flowLinks.length === 0 → crescent visible
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-brand-canvas-mark]', { timeout: 15000, state: 'attached' });
50
+ await page.waitForTimeout(300);
51
+
52
+ const runtimeState = await page.evaluate(() => {
53
+ const g = document.querySelector('[data-topo-brand-canvas-mark]');
54
+ if (!g) return null;
55
+ const cs = getComputedStyle(g);
56
+ return {
57
+ has_class: g.classList.contains('anet-topo-brand-canvas-mark-envelope-breath'),
58
+ breath_attr: g.getAttribute('data-topo-brand-canvas-mark-envelope-breath'),
59
+ visible_attr: g.getAttribute('data-topo-brand-canvas-mark-visible'),
60
+ recede_attr: g.getAttribute('data-topo-brand-canvas-mark-recede'),
61
+ anim_name: cs.animationName,
62
+ anim_duration: cs.animationDuration,
63
+ anim_iter: cs.animationIterationCount,
64
+ };
65
+ });
66
+
67
+ await browser.close();
68
+
69
+ const cssSrc = readFileSync('/home/vansin/agent-network-dashboard/app/globals.css', 'utf8');
70
+ const tsxSrc = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
71
+
72
+ const cssKeyframes = /@keyframes anet-topo-brand-canvas-mark-envelope-breath-kf\s*\{[\s\S]*?0%, 100%\s*\{\s*opacity:\s*0\.35;\s*\}[\s\S]*?50%\s*\{\s*opacity:\s*0\.30;/.test(cssSrc);
73
+ const cssRule = /\.anet-topo-brand-canvas-mark-envelope-breath\s*\{[\s\S]*?animation:\s*anet-topo-brand-canvas-mark-envelope-breath-kf\s+13s\s+ease-in-out\s+infinite/.test(cssSrc);
74
+ const cssVisibleGate = /\.anet-topo-brand-canvas-mark-envelope-breath\[data-topo-brand-canvas-mark-visible="false"\]\s*\{\s*animation:\s*none/.test(cssSrc);
75
+ const cssRecedeGate = /\.anet-topo-brand-canvas-mark-envelope-breath\[data-topo-brand-canvas-mark-recede="true"\]\s*\{\s*animation:\s*none/.test(cssSrc);
76
+ const cssReducedMotion = /prefers-reduced-motion:\s*reduce\s*\)\s*\{\s*\.anet-topo-brand-canvas-mark-envelope-breath\s*\{\s*animation:\s*none/.test(cssSrc);
77
+ const tsxClass = /className="anet-topo-brand-canvas-mark-envelope-breath"/.test(tsxSrc);
78
+ const tsxAttr = /data-topo-brand-canvas-mark-envelope-breath="13s"/.test(tsxSrc);
79
+
80
+ const runtimeAnim = runtimeState?.anim_name === 'anet-topo-brand-canvas-mark-envelope-breath-kf' || runtimeState?.anim_name === 'none';
81
+ const runtimeDuration = runtimeState?.anim_duration === '13s' || runtimeState?.anim_name === 'none';
82
+
83
+ const results = {
84
+ wrapper_present: !!runtimeState,
85
+ has_breath_class: runtimeState?.has_class === true,
86
+ breath_attr_13s: runtimeState?.breath_attr === '13s',
87
+ visible_at_rest: runtimeState?.visible_attr === 'true',
88
+ rest_not_recede: runtimeState?.recede_attr === 'false',
89
+ runtime_anim_ok: runtimeAnim,
90
+ runtime_duration_ok: runtimeDuration,
91
+ css_keyframes: cssKeyframes,
92
+ css_rule: cssRule,
93
+ css_visible_gate: cssVisibleGate,
94
+ css_recede_gate: cssRecedeGate,
95
+ css_reduced_motion: cssReducedMotion,
96
+ tsx_class: tsxClass,
97
+ tsx_breath_attr: tsxAttr,
98
+ };
99
+ const ok = Object.values(results).every(Boolean);
100
+ console.log(`${ok ? '✅' : '❌'} R705 crescent wrapper envelope breath (13s, canvas-brand-pair envelope symmetry closed):`,
101
+ JSON.stringify(results, null, 2),
102
+ `\n runtime: ${JSON.stringify(runtimeState)}`);
103
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,111 @@
1
+ /* Round 526 verification: brand crescent at canvas top-left gains
2
+ * focal-recede (4th anchor in family). Multiplies visible opacity by
3
+ * 0.7 when non-hub canvas surface is hovered.
4
+ *
5
+ * Test phases (flowLinks=0 state — crescent visible):
6
+ * 1. rest: opacity=0.35, recede attr='false', visible='true'
7
+ * 2. hover legend `idle` row: opacity=0.245 (0.35 × 0.7),
8
+ * recede attr='true'
9
+ * 3. mouseleave: opacity returns to 0.35, recede='false'
10
+ * 4. source-side regex confirms multiplicative opacity + attr wired
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: [
38
+ mk('alpha·1'), mk('alpha·2'), mk('alpha·3'),
39
+ ] } });
40
+ });
41
+ // NO messages → flowLinks.length === 0 → crescent visible at opacity 0.35
42
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
43
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
44
+ const page = await ctx.newPage();
45
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
46
+ await page.waitForSelector('[data-topo-brand-canvas-mark]', { timeout: 15000 });
47
+ await page.waitForTimeout(800);
48
+
49
+ // Phase 1: rest
50
+ const rest = await page.evaluate(() => {
51
+ const m = document.querySelector('[data-topo-brand-canvas-mark]');
52
+ return {
53
+ opacity: parseFloat(m?.getAttribute('opacity') || '0'),
54
+ visible: m?.getAttribute('data-topo-brand-canvas-mark-visible'),
55
+ recede: m?.getAttribute('data-topo-brand-canvas-mark-recede'),
56
+ };
57
+ });
58
+
59
+ // Phase 2: hover legend `idle` row (sets hoveredStatus → recede)
60
+ await page.hover('[data-legend-row-label="idle"]');
61
+ await page.waitForTimeout(400);
62
+ const hover = await page.evaluate(() => {
63
+ const m = document.querySelector('[data-topo-brand-canvas-mark]');
64
+ return {
65
+ opacity: parseFloat(m?.getAttribute('opacity') || '0'),
66
+ visible: m?.getAttribute('data-topo-brand-canvas-mark-visible'),
67
+ recede: m?.getAttribute('data-topo-brand-canvas-mark-recede'),
68
+ };
69
+ });
70
+
71
+ // Phase 3: mouseleave
72
+ await page.mouse.move(900, 50);
73
+ await page.waitForTimeout(400);
74
+ const leave = await page.evaluate(() => {
75
+ const m = document.querySelector('[data-topo-brand-canvas-mark]');
76
+ return {
77
+ opacity: parseFloat(m?.getAttribute('opacity') || '0'),
78
+ recede: m?.getAttribute('data-topo-brand-canvas-mark-recede'),
79
+ };
80
+ });
81
+
82
+ await browser.close();
83
+
84
+ // Source regex
85
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
86
+ const sourceOpacityWired =
87
+ /opacity=\{\(flowLinks\.length === 0 \? 0\.35 : 0\) \* \(\s*\(hoveredAlias \|\| hoveredEdgeKey \|\| hoveredGroupLabel \|\|\s*hoveredStatus \|\| hoveredVendor\) && !hoveredHub \? 0\.7 : 1\s*\)\}/.test(src);
88
+ const sourceAttrWired =
89
+ /data-topo-brand-canvas-mark-recede=\{\s*\(hoveredAlias \|\| hoveredEdgeKey \|\| hoveredGroupLabel \|\|\s*hoveredStatus \|\| hoveredVendor\) && !hoveredHub \? 'true' : 'false'\s*\}/.test(src);
90
+
91
+ const approxEq = (a, b, tol = 0.001) => Math.abs(a - b) < tol;
92
+
93
+ const results = {
94
+ rest_opacity_035: approxEq(rest?.opacity, 0.35),
95
+ rest_visible_true: rest?.visible === 'true',
96
+ rest_recede_false: rest?.recede === 'false',
97
+ hover_opacity_0245: approxEq(hover?.opacity, 0.245),
98
+ hover_recede_true: hover?.recede === 'true',
99
+ hover_visible_still: hover?.visible === 'true', // crescent should still be visible
100
+ leave_opacity_035: approxEq(leave?.opacity, 0.35),
101
+ leave_recede_false: leave?.recede === 'false',
102
+ source_opacity_wired: sourceOpacityWired,
103
+ source_attr_wired: sourceAttrWired,
104
+ };
105
+ const ok = Object.values(results).every(Boolean);
106
+ console.log(`${ok ? '✅' : '❌'} R526 crescent focal-recede:`,
107
+ JSON.stringify(results, null, 2),
108
+ '\n rest:', JSON.stringify(rest),
109
+ '\n hover:', JSON.stringify(hover),
110
+ '\n leave:', JSON.stringify(leave));
111
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,73 @@
1
+ /* Round 691 — dense plain-text alias halo gate extends from hover-only
2
+ * (R680) to (hover || chat-target). Closes dense-mode + chat-target
3
+ * signaling parity at the per-node label scope — joins R616/R617/R645
4
+ * chat-target-gated brightness family.
5
+ *
6
+ * Source assertions:
7
+ * - dense alias halo-layers attr: (hoveredAlias || chatAlias) gate
8
+ * - dense alias filter: same OR-gate at status.primary tint 2+4
9
+ *
10
+ * Runtime assertions:
11
+ * - dense fleet renders (≥17 nodes → triggers dense fallback)
12
+ * - rest halo-layers='0' on all (no hover, no chat)
13
+ */
14
+ import { chromium } from 'playwright';
15
+ import { readFileSync } from 'node:fs';
16
+
17
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
18
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
19
+
20
+ const browser = await chromium.launch({ headless: true });
21
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
22
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
23
+ await ctx.addInitScript(() => {
24
+ try {
25
+ localStorage.setItem('anet-theme', 'cyber');
26
+ localStorage.setItem('anet-topo-layout', 'ring');
27
+ sessionStorage.setItem('anet_v3_auth', '1');
28
+ } catch {}
29
+ });
30
+ await ctx.route('**/api/hub/status*', async (route) => {
31
+ const r = await route.fetch();
32
+ const b = await r.json();
33
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
34
+ const mk = (alias) => ({
35
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
36
+ network_id: nid, project_dir: null,
37
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
38
+ });
39
+ // 18 nodes → dense fallback (>16)
40
+ await route.fulfill({ response: r, json: { ...b, sessions: Array.from({ length: 18 }, (_, i) => mk(`a·${i + 1}`)) } });
41
+ });
42
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
43
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
44
+ const page = await ctx.newPage();
45
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
46
+ await page.waitForSelector('[data-node-dense-alias-text]', { timeout: 15000, state: 'attached' });
47
+ await page.waitForTimeout(300);
48
+
49
+ const runtimeState = await page.evaluate(() => {
50
+ const labels = Array.from(document.querySelectorAll('[data-node-dense-alias-text]'));
51
+ return {
52
+ count: labels.length,
53
+ all_layers_zero: labels.every(el => el.getAttribute('data-node-dense-alias-text-halo-layers') === '0'),
54
+ };
55
+ });
56
+
57
+ await browser.close();
58
+
59
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
60
+ const sourceAttrGate = /data-node-dense-alias-text-halo-layers=\{\(hoveredAlias === session\.alias \|\| chatAlias === session\.alias\) \? '2' : '0'\}/.test(src);
61
+ const sourceFilterGate = /filter: \(hoveredAlias === session\.alias \|\| chatAlias === session\.alias\)\s*\?\s*`drop-shadow\(0 0 2px \$\{status\.primary\}80\) drop-shadow\(0 0 4px \$\{status\.primary\}40\)`/.test(src);
62
+
63
+ const results = {
64
+ dense_labels_present: runtimeState.count >= 10,
65
+ rest_all_layers_zero: runtimeState.all_layers_zero,
66
+ source_attr_gate: sourceAttrGate,
67
+ source_filter_gate: sourceFilterGate,
68
+ };
69
+ const ok = Object.values(results).every(Boolean);
70
+ console.log(`${ok ? '✅' : '❌'} R691 dense alias chat-target-gated halo (closes dense-mode chat signaling):`,
71
+ JSON.stringify(results, null, 2),
72
+ `\n runtime: ${runtimeState.count} dense labels rendered`);
73
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,80 @@
1
+ /* Round 680 — dense plain-text alias (the >16-node fallback label)
2
+ * extends from group-hover:-translate-y geometry-only to 2-layer
3
+ * drop-shadow at status.primary tint with 2+4 stride, alpha 80/40.
4
+ * Closes the dense-mode alias hover signature parity with normal-
5
+ * mode card label (R645). 39th anchor in family — first dense-mode
6
+ * anchor.
7
+ *
8
+ * Source assertions:
9
+ * - filter uses status.primary at 0x80 + 0x40 with 2+4 stride,
10
+ * gated on hoveredAlias === session.alias
11
+ * - data-node-dense-alias-text-halo-layers attr toggles '2' ↔ '0'
12
+ * - transition extends with 'filter 200ms ease-out'
13
+ *
14
+ * Runtime assertions:
15
+ * - dense alias labels present (>16 nodes)
16
+ * - all rest: halo-layers='0'
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
+ // 18 nodes triggers dense fallback (>16 nodes)
44
+ await route.fulfill({ response: r, json: { ...b, sessions: Array.from({ length: 18 }, (_, i) => mk(`a·${i + 1}`)) } });
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-node-dense-alias-text-halo-layers]', { timeout: 15000, state: 'attached' });
51
+ await page.waitForTimeout(500);
52
+
53
+ const restState = await page.evaluate(() => {
54
+ return Array.from(document.querySelectorAll('[data-node-dense-alias-text]')).map(el => ({
55
+ alias: el.getAttribute('data-node-dense-alias-text'),
56
+ layers: el.getAttribute('data-node-dense-alias-text-halo-layers'),
57
+ }));
58
+ });
59
+
60
+ await browser.close();
61
+
62
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
63
+ const sourceFilter = /filter: hoveredAlias === session\.alias\s*\?\s*`drop-shadow\(0 0 2px \$\{status\.primary\}80\) drop-shadow\(0 0 4px \$\{status\.primary\}40\)`/.test(src);
64
+ const sourceLayersAttr = /data-node-dense-alias-text-halo-layers=\{hoveredAlias === session\.alias \? '2' : '0'\}/.test(src);
65
+ const sourceTransition = /transition: 'transform 200ms ease-out, fill 300ms ease-out, filter 200ms ease-out'/.test(src);
66
+
67
+ const restAllZero = restState.every(e => e.layers === '0');
68
+
69
+ const results = {
70
+ dense_aliases_present: restState.length >= 10, // 18 nodes should yield ~18 dense labels
71
+ rest_all_layers_zero: restAllZero,
72
+ source_filter: sourceFilter,
73
+ source_layers_attr: sourceLayersAttr,
74
+ source_transition: sourceTransition,
75
+ };
76
+ const ok = Object.values(results).every(Boolean);
77
+ console.log(`${ok ? '✅' : '❌'} R680 dense plain-text alias multi-layer halo (first dense-mode anchor):`,
78
+ JSON.stringify(results, null, 2),
79
+ `\n count: ${restState.length}, sample: ${JSON.stringify(restState.slice(0, 3))}`);
80
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,94 @@
1
+ /* Round 716 — dual-axis surfaces catalog attr on canvas root. Companion
2
+ * to R710 rolodex catalog. Lists the 5 dual-axis surfaces (6 underlying
3
+ * elements counting panel-pair as 2) with their cadences and axes.
4
+ *
5
+ * Assertions:
6
+ * - attr present on root <svg>
7
+ * - JSON parses to an Array
8
+ * - exactly 6 entries (4 unique surfaces but panel-pair = 2)
9
+ * - each entry has { anchor, cadence_s, axes } shape
10
+ * - axes is non-empty Array<string>
11
+ * - opacity is the FIRST axis in every entry (preserves R699/R700/.../
12
+ * existing opacity-first establishment)
13
+ * - second axis is one of: transform-scale, letter-spacing, font-size
14
+ */
15
+ import { chromium } from 'playwright';
16
+ import { readFileSync } from 'node:fs';
17
+
18
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
19
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
20
+
21
+ const browser = await chromium.launch({ headless: true });
22
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
23
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
24
+ await ctx.addInitScript(() => {
25
+ try {
26
+ localStorage.setItem('anet-theme', 'cyber');
27
+ localStorage.setItem('anet-topo-layout', 'ring');
28
+ sessionStorage.setItem('anet_v3_auth', '1');
29
+ } catch {}
30
+ });
31
+ await ctx.route('**/api/hub/status*', async (route) => {
32
+ const r = await route.fetch();
33
+ const b = await r.json();
34
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
35
+ const mk = (alias) => ({
36
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
37
+ network_id: nid, project_dir: null,
38
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
39
+ });
40
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
41
+ });
42
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
43
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
44
+ const page = await ctx.newPage();
45
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
46
+ await page.waitForSelector('[data-topo-canvas-aria]', { timeout: 15000, state: 'attached' });
47
+ await page.waitForTimeout(300);
48
+
49
+ const runtimeAttr = await page.evaluate(() => {
50
+ const svg = document.querySelector('[data-topo-canvas-aria]');
51
+ return svg?.getAttribute('data-topo-respiratory-dual-axis-surfaces') ?? null;
52
+ });
53
+
54
+ await browser.close();
55
+
56
+ let parsed = null;
57
+ let parseError = null;
58
+ try {
59
+ parsed = JSON.parse(runtimeAttr ?? '');
60
+ } catch (e) {
61
+ parseError = String(e);
62
+ }
63
+
64
+ const validShapeAndOpacityFirst = Array.isArray(parsed)
65
+ ? parsed.every(e => e && typeof e === 'object'
66
+ && typeof e.anchor === 'string' && e.anchor.length > 0
67
+ && typeof e.cadence_s === 'number' && e.cadence_s > 0
68
+ && Array.isArray(e.axes) && e.axes.length >= 2
69
+ && e.axes.every(a => typeof a === 'string' && a.length > 0)
70
+ && e.axes[0] === 'opacity')
71
+ : false;
72
+
73
+ const validSecondAxisChoices = Array.isArray(parsed)
74
+ ? parsed.every(e => Array.isArray(e?.axes) && ['transform-scale', 'letter-spacing', 'font-size'].includes(e.axes[1]))
75
+ : false;
76
+
77
+ const anchorNames = Array.isArray(parsed) ? parsed.map(e => e.anchor).sort() : [];
78
+ const expectedAnchors = ['H2', 'kicker', 'legend', 'recent', 'watermark', 'zoom-level'];
79
+
80
+ const results = {
81
+ attr_present: !!runtimeAttr,
82
+ json_parses: parsed !== null && parseError === null,
83
+ is_array: Array.isArray(parsed),
84
+ has_6_entries: Array.isArray(parsed) && parsed.length === 6,
85
+ anchors_match_expected: JSON.stringify(anchorNames) === JSON.stringify(expectedAnchors),
86
+ shape_and_opacity_first: validShapeAndOpacityFirst,
87
+ second_axis_valid_choices: validSecondAxisChoices,
88
+ };
89
+ const ok = Object.values(results).every(Boolean);
90
+ console.log(`${ok ? '✅' : '❌'} R716 dual-axis surfaces catalog attr (companion to R710 rolodex — breath family meta-documentation closed):`,
91
+ JSON.stringify(results, null, 2),
92
+ `\n parsed: ${JSON.stringify(parsed)}`,
93
+ parseError ? `\n parseError: ${parseError}` : '');
94
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,82 @@
1
+ /* Round 603 — edge-badge CIRCLE stacks brightness(1.15) onto
2
+ * R534/R480 drop-shadow on hover/pin/hot. 5th hover axis on
3
+ * the badge ring; brings circle brightness to parity with the
4
+ * R570 digit brightness within the same edge-badge unit.
5
+ *
6
+ * Test phases:
7
+ * 1. mock 1 message → 1 flowLink → edge-badge renders
8
+ * 2. rest: filter='none', brightness-attr='1'
9
+ * 3. computed transition-property contains 'filter'
10
+ * 4. source: stacked filter conditional includes brightness +
11
+ * data-attr extension
12
+ */
13
+ import { chromium } from 'playwright';
14
+ import { readFileSync } from 'node:fs';
15
+
16
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
17
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
18
+
19
+ const browser = await chromium.launch({ headless: true });
20
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
21
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
22
+ await ctx.addInitScript(() => {
23
+ try {
24
+ localStorage.setItem('anet-theme', 'cyber');
25
+ localStorage.setItem('anet-topo-layout', 'ring');
26
+ sessionStorage.setItem('anet_v3_auth', '1');
27
+ } catch {}
28
+ });
29
+ await ctx.route('**/api/hub/status*', async (route) => {
30
+ const r = await route.fetch();
31
+ const b = await r.json();
32
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
33
+ const mk = (alias) => ({
34
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
35
+ network_id: nid, project_dir: null,
36
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
37
+ });
38
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
39
+ });
40
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [
41
+ { from_alias: 'a·1', to_alias: 'a·2', content: 'hi', created_at: fresh },
42
+ ] } }));
43
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
44
+ const page = await ctx.newPage();
45
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
46
+ await page.waitForSelector('[data-edge-badge-brightness]', { timeout: 15000, state: 'attached' });
47
+ await page.waitForTimeout(500);
48
+
49
+ const rest = await page.evaluate(() => {
50
+ const el = document.querySelector('[data-edge-badge-brightness]');
51
+ if (!el) return null;
52
+ const cs = getComputedStyle(el);
53
+ return {
54
+ filter: cs.filter,
55
+ transitionProperty: cs.transitionProperty,
56
+ brightnessAttr: el.getAttribute('data-edge-badge-brightness'),
57
+ glowAttr: el.getAttribute('data-edge-badge-glow'),
58
+ liftedAttr: el.getAttribute('data-edge-badge-lifted'),
59
+ };
60
+ });
61
+
62
+ await browser.close();
63
+
64
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
65
+ const sourceFilter = /filter: \(isHoveredEdge \|\| isPinned\)\s*\?\s*`drop-shadow\(0 0 3px \$\{pal\.legendAccent\}99\) brightness\(1\.15\)`\s*:\s*isHot\s*\?\s*`drop-shadow\(0 0 3px \$\{hotStroke\}80\) brightness\(1\.15\)`\s*:\s*undefined/.test(src);
66
+ const sourceAttr = /data-edge-badge-brightness=\{\(isHoveredEdge \|\| isPinned \|\| isHot\) \? '1\.15' : '1'\}/.test(src);
67
+
68
+ const results = {
69
+ badge_present: !!rest,
70
+ rest_filter_none: rest?.filter === 'none',
71
+ rest_brightness_1: rest?.brightnessAttr === '1',
72
+ rest_glow_false: rest?.glowAttr === 'false',
73
+ rest_lifted_false: rest?.liftedAttr === 'false',
74
+ transition_has_filter: /filter/.test(rest?.transitionProperty || ''),
75
+ source_filter: sourceFilter,
76
+ source_attr: sourceAttr,
77
+ };
78
+ const ok = Object.values(results).every(Boolean);
79
+ console.log(`${ok ? '✅' : '❌'} R603 edge-badge circle brightness (5th axis, ring↔digit parity):`,
80
+ JSON.stringify(results, null, 2),
81
+ `\n rest: ${JSON.stringify(rest)}`);
82
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,100 @@
1
+ /* Round 633 — edge-badge CIRCLE joins the hot-pulse family at the
2
+ * geometric axis. SMIL stroke-width 2 ↔ 2.5 over 3s ease-in-out,
3
+ * gated `isHot && !reducedMotion`. In lockstep with R632 digit
4
+ * opacity pulse. 3rd anchor in hot-pulse family.
5
+ *
6
+ * Test phases:
7
+ * 1. cold edge (mock 3 messages) → no hot-pulse, sw=1.25 attr
8
+ * doesn't exist as SMIL animate child
9
+ * 2. hot edge (mock 12 messages) → SMIL animate child present
10
+ * with attributeName='stroke-width', values='2;2.5;2',
11
+ * dur='3s', calcMode='spline'
12
+ * 3. hot-pulse attr === 'on' on hot edge
13
+ * 4. source: SMIL animate gated on `isHot && !reducedMotion`,
14
+ * stroke-width values='2;2.5;2' explicit
15
+ */
16
+ import { chromium } from 'playwright';
17
+ import { readFileSync } from 'node:fs';
18
+
19
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
20
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
21
+
22
+ const browser = await chromium.launch({ headless: true });
23
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
24
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
25
+ await ctx.addInitScript(() => {
26
+ try {
27
+ localStorage.setItem('anet-theme', 'cyber');
28
+ localStorage.setItem('anet-topo-layout', 'ring');
29
+ sessionStorage.setItem('anet_v3_auth', '1');
30
+ } catch {}
31
+ });
32
+ await ctx.route('**/api/hub/status*', async (route) => {
33
+ const r = await route.fetch();
34
+ const b = await r.json();
35
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
36
+ const mk = (alias) => ({
37
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
38
+ network_id: nid, project_dir: null,
39
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
40
+ });
41
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
42
+ });
43
+ // 12 messages → isHot (count ≥ 10 threshold)
44
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages:
45
+ Array.from({ length: 12 }, (_, i) => ({
46
+ from_alias: 'a·1', to_alias: 'a·2', content: `msg-${i}`, created_at: fresh,
47
+ }))
48
+ } }));
49
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
50
+ const page = await ctx.newPage();
51
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
52
+ await page.waitForSelector('[data-edge-badge-hot-pulse]', { timeout: 15000, state: 'attached' });
53
+ await page.waitForTimeout(500);
54
+
55
+ const hot = await page.evaluate(() => {
56
+ const el = document.querySelector('[data-edge-badge-hot-pulse="on"]');
57
+ if (!el) return null;
58
+ const animates = Array.from(el.querySelectorAll('animate'));
59
+ return {
60
+ hotPulseAttr: el.getAttribute('data-edge-badge-hot-pulse'),
61
+ glowAttr: el.getAttribute('data-edge-badge-glow'),
62
+ strokeWidthAttr: el.getAttribute('stroke-width'),
63
+ animateCount: animates.length,
64
+ animateAttrs: animates.map(a => ({
65
+ attr: a.getAttribute('attributeName'),
66
+ dur: a.getAttribute('dur'),
67
+ vals: a.getAttribute('values'),
68
+ calc: a.getAttribute('calcMode'),
69
+ spl: a.getAttribute('keySplines'),
70
+ rep: a.getAttribute('repeatCount'),
71
+ })),
72
+ };
73
+ });
74
+
75
+ await browser.close();
76
+
77
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
78
+ const sourceAnimate = /\{isHot && !reducedMotion && \(\s*<animate\s+attributeName="stroke-width"\s+values="2;2\.5;2"\s+dur="3s"\s+calcMode="spline"\s+keyTimes="0;0\.5;1"\s+keySplines="0\.42 0 0\.58 1;0\.42 0 0\.58 1"\s+repeatCount="indefinite"\s*\/>\s*\)\}/.test(src);
79
+ const sourceAttr = /data-edge-badge-hot-pulse=\{isHot && !reducedMotion \? 'on' : 'off'\}/.test(src);
80
+
81
+ const swAnimate = hot?.animateAttrs?.find(a => a.attr === 'stroke-width');
82
+ const results = {
83
+ hot_circle_present: !!hot,
84
+ hot_pulse_attr_on: hot?.hotPulseAttr === 'on',
85
+ hot_glow_amber: hot?.glowAttr === 'hot',
86
+ hot_has_smil_sw: swAnimate != null,
87
+ hot_sw_values: swAnimate?.vals === '2;2.5;2',
88
+ hot_sw_dur_3s: swAnimate?.dur === '3s',
89
+ hot_sw_calc_spline: swAnimate?.calc === 'spline',
90
+ hot_sw_spline_ease: swAnimate?.spl === '0.42 0 0.58 1;0.42 0 0.58 1',
91
+ hot_sw_rep_indef: swAnimate?.rep === 'indefinite',
92
+ hot_attr_sw_2: hot?.strokeWidthAttr === '2',
93
+ source_smil_gated: sourceAnimate,
94
+ source_attr_gated: sourceAttr,
95
+ };
96
+ const ok = Object.values(results).every(Boolean);
97
+ console.log(`${ok ? '✅' : '❌'} R633 edge-badge CIRCLE hot-pulse stroke-width breath (3rd hot-pulse anchor):`,
98
+ JSON.stringify(results, null, 2),
99
+ `\n hot: ${JSON.stringify(hot)}`);
100
+ process.exit(ok ? 0 : 1);