@sleep2agi/agent-network-dashboard 0.5.3-preview.21 → 0.5.3-preview.211

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 (349) 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/{17-8bizggk6cz.js → 0apd6mdrbto5c.js} +1 -1
  143. package/.next/static/chunks/0b0-7zxsflbws.js +1 -0
  144. package/.next/static/chunks/0f8..rye42edf.js +1 -0
  145. package/.next/static/chunks/0nklvgzpy80d0.css +2 -0
  146. package/.next/static/chunks/177da35-xmv.k.js +4 -0
  147. package/.next/trace +2 -2
  148. package/.next/trace-build +1 -1
  149. package/app/components/TopoGraph.tsx +5134 -184
  150. package/app/globals.css +183 -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-wrapper-halo-test.mjs +83 -0
  183. package/scripts/topo-click-ripple-glow-test.mjs +86 -0
  184. package/scripts/topo-click-ripple-halo-layers-test.mjs +79 -0
  185. package/scripts/topo-click-ripple-sw-test.mjs +110 -0
  186. package/scripts/topo-cluster-count-attr-test.mjs +80 -0
  187. package/scripts/topo-crescent-breath-test.mjs +104 -0
  188. package/scripts/topo-crescent-recede-test.mjs +111 -0
  189. package/scripts/topo-dense-alias-chat-halo-test.mjs +73 -0
  190. package/scripts/topo-dense-alias-halo-layers-test.mjs +80 -0
  191. package/scripts/topo-edge-badge-circle-brightness-test.mjs +82 -0
  192. package/scripts/topo-edge-badge-circle-hot-pulse-test.mjs +100 -0
  193. package/scripts/topo-edge-badge-digit-halo-layers-test.mjs +107 -0
  194. package/scripts/topo-edge-badge-endpoint-gate-test.mjs +94 -0
  195. package/scripts/topo-edge-badge-halo-layers-test.mjs +85 -0
  196. package/scripts/topo-edge-badge-hot-pulse-test.mjs +92 -0
  197. package/scripts/topo-edge-badge-hover-glow-test.mjs +90 -0
  198. package/scripts/topo-edge-badge-text-brightness-test.mjs +83 -0
  199. package/scripts/topo-edge-chat-gate-test.mjs +71 -0
  200. package/scripts/topo-edge-flow-rail-halo-layers-test.mjs +89 -0
  201. package/scripts/topo-edge-particle-brightness-test.mjs +82 -0
  202. package/scripts/topo-edge-particle-halo-layers-test.mjs +91 -0
  203. package/scripts/topo-edge-pill-glow-test.mjs +67 -0
  204. package/scripts/topo-edge-pin-halo-test.mjs +99 -0
  205. package/scripts/topo-edge-visible-brightness-test.mjs +84 -0
  206. package/scripts/topo-edge-visible-halo-layers-test.mjs +87 -0
  207. package/scripts/topo-endpoint-ring-brightness-test.mjs +83 -0
  208. package/scripts/topo-endpoint-ring-flow-halo-test.mjs +107 -0
  209. package/scripts/topo-endpoint-ring-halo-layers-test.mjs +100 -0
  210. package/scripts/topo-filter-pill-glow-test.mjs +90 -0
  211. package/scripts/topo-filter-pill-halo-layers-test.mjs +27 -0
  212. package/scripts/topo-flow-arrow-brightness-test.mjs +82 -0
  213. package/scripts/topo-flow-rail-brightness-test.mjs +80 -0
  214. package/scripts/topo-fullscreen-attr-test.mjs +73 -0
  215. package/scripts/topo-fullscreen-brightness-test.mjs +84 -0
  216. package/scripts/topo-fullscreen-icon-rotate-test.mjs +93 -0
  217. package/scripts/topo-grid-content-bottom-attr-test.mjs +72 -0
  218. package/scripts/topo-group-box-brightness-test.mjs +84 -0
  219. package/scripts/topo-group-box-halo-layers-test.mjs +91 -0
  220. package/scripts/topo-group-chat-gate-test.mjs +77 -0
  221. package/scripts/topo-group-label-brightness-test.mjs +84 -0
  222. package/scripts/topo-group-label-halo-layers-test.mjs +78 -0
  223. package/scripts/topo-group-label-hover-glow-test.mjs +86 -0
  224. package/scripts/topo-group-label-member-alias-hover-test.mjs +125 -0
  225. package/scripts/topo-group-pill-glow-test.mjs +76 -0
  226. package/scripts/topo-group-tint-brightness-test.mjs +82 -0
  227. package/scripts/topo-halo-chat-gate-test.mjs +72 -0
  228. package/scripts/topo-hover-detail-halo-test.mjs +76 -0
  229. package/scripts/topo-hub-core-brightness-test.mjs +82 -0
  230. package/scripts/topo-hub-core-halo-layers-test.mjs +81 -0
  231. package/scripts/topo-hub-digit-brightness-test.mjs +79 -0
  232. package/scripts/topo-hub-digit-halo-layers-test.mjs +76 -0
  233. package/scripts/topo-hub-digit-ls-test.mjs +119 -0
  234. package/scripts/topo-hub-halo-brightness-test.mjs +80 -0
  235. package/scripts/topo-hub-halo-glow-test.mjs +96 -0
  236. package/scripts/topo-hub-halo-halo-layers-test.mjs +76 -0
  237. package/scripts/topo-hub-highlight-amplify-test.mjs +139 -0
  238. package/scripts/topo-hub-highlight-brightness-test.mjs +84 -0
  239. package/scripts/topo-hub-highlight-fill-transition-test.mjs +84 -0
  240. package/scripts/topo-hub-highlight-glow-test.mjs +99 -0
  241. package/scripts/topo-hub-highlight-halo-layers-test.mjs +78 -0
  242. package/scripts/topo-hub-highlight-r-test.mjs +112 -0
  243. package/scripts/topo-hub-highlight-recede-test.mjs +144 -0
  244. package/scripts/topo-hub-highlight-theme-fill-test.mjs +83 -0
  245. package/scripts/topo-hub-hover-ring-brightness-test.mjs +79 -0
  246. package/scripts/topo-hub-hover-ring-glow-test.mjs +97 -0
  247. package/scripts/topo-hub-hover-ring-halo-layers-test.mjs +71 -0
  248. package/scripts/topo-hub-idle-breath-test.mjs +7 -2
  249. package/scripts/topo-hub-spoke-brightness-test.mjs +77 -0
  250. package/scripts/topo-hub-spoke-glow-test.mjs +112 -0
  251. package/scripts/topo-hub-spoke-halo-layers-test.mjs +97 -0
  252. package/scripts/topo-hub-spoke-self-filter-test.mjs +119 -0
  253. package/scripts/topo-kicker-halo-layers-test.mjs +82 -0
  254. package/scripts/topo-label-card-brightness-test.mjs +81 -0
  255. package/scripts/topo-layout-hover-fw-test.mjs +98 -0
  256. package/scripts/topo-layout-toggle-brightness-test.mjs +94 -0
  257. package/scripts/topo-layout-toggle-halo-layers-test.mjs +95 -0
  258. package/scripts/topo-legend-count-brightness-test.mjs +80 -0
  259. package/scripts/topo-legend-count-halo-layers-test.mjs +79 -0
  260. package/scripts/topo-legend-count-letter-spacing-test.mjs +108 -0
  261. package/scripts/topo-legend-label-fw-test.mjs +107 -0
  262. package/scripts/topo-legend-pin-ring-brightness-test.mjs +82 -0
  263. package/scripts/topo-legend-pin-ring-halo-layers-test.mjs +71 -0
  264. package/scripts/topo-legend-row-count-brightness-test.mjs +85 -0
  265. package/scripts/topo-legend-row-label-glow-test.mjs +102 -0
  266. package/scripts/topo-legend-swatch-glow-test.mjs +109 -0
  267. package/scripts/topo-legend-swatch-member-alias-match-test.mjs +139 -0
  268. package/scripts/topo-legend-tint-brightness-test.mjs +83 -0
  269. package/scripts/topo-legend-trio-halo-layers-test.mjs +22 -0
  270. package/scripts/topo-minimap-container-halo-test.mjs +82 -0
  271. package/scripts/topo-minimap-dot-chat-gate-test.mjs +81 -0
  272. package/scripts/topo-minimap-hover-glow-test.mjs +109 -0
  273. package/scripts/topo-minimap-viewport-brightness-test.mjs +84 -0
  274. package/scripts/topo-minimap-viewport-halo-layers-test.mjs +24 -0
  275. package/scripts/topo-more-footer-brightness-test.mjs +94 -0
  276. package/scripts/topo-node-alias-brightness-test.mjs +84 -0
  277. package/scripts/topo-node-avatar-halo-layers-test.mjs +25 -0
  278. package/scripts/topo-node-hover-ring-halo-layers-test.mjs +70 -0
  279. package/scripts/topo-node-label-card-halo-test.mjs +76 -0
  280. package/scripts/topo-node-sub-text-brightness-test.mjs +88 -0
  281. package/scripts/topo-nodesize-brightness-test.mjs +82 -0
  282. package/scripts/topo-nodesize-halo-layers-test.mjs +89 -0
  283. package/scripts/topo-nodesize-hover-fw-test.mjs +99 -0
  284. package/scripts/topo-orphan-label-opacity-test.mjs +98 -0
  285. package/scripts/topo-panel-count-halo-layers-test.mjs +91 -0
  286. package/scripts/topo-panel-count-hover-ls-test.mjs +87 -0
  287. package/scripts/topo-panel-rect-halo-test.mjs +90 -0
  288. package/scripts/topo-panel-row-brightness-test.mjs +116 -0
  289. package/scripts/topo-panel-title-brightness-test.mjs +98 -0
  290. package/scripts/topo-panel-title-glow-test.mjs +111 -0
  291. package/scripts/topo-panel-titles-halo-layers-test.mjs +23 -0
  292. package/scripts/topo-pill-x-rotate-test.mjs +96 -0
  293. package/scripts/topo-pip-brightness-test.mjs +85 -0
  294. package/scripts/topo-pressure-bar-halo-layers-test.mjs +19 -0
  295. package/scripts/topo-pressure-seg-glow-test.mjs +92 -0
  296. package/scripts/topo-pressure-seg-member-alias-match-test.mjs +133 -0
  297. package/scripts/topo-pressure-seg-motion-test.mjs +101 -0
  298. package/scripts/topo-recent-count-brightness-test.mjs +84 -0
  299. package/scripts/topo-recent-more-fw-test.mjs +126 -0
  300. package/scripts/topo-recent-more-halo-layers-test.mjs +90 -0
  301. package/scripts/topo-recent-panel-hot-pulse-test.mjs +105 -0
  302. package/scripts/topo-recent-pip-halo-layers-test.mjs +82 -0
  303. package/scripts/topo-recent-row-chat-gate-test.mjs +75 -0
  304. package/scripts/topo-recent-row-content-lift-test.mjs +140 -0
  305. package/scripts/topo-recent-row-fw-test.mjs +115 -0
  306. package/scripts/topo-recent-row-text-glow-test.mjs +86 -0
  307. package/scripts/topo-recent-row-text-halo-layers-test.mjs +67 -0
  308. package/scripts/topo-recent-tint-brightness-test.mjs +80 -0
  309. package/scripts/topo-recent-ts-brightness-test.mjs +86 -0
  310. package/scripts/topo-reduced-motion-attr-test.mjs +69 -0
  311. package/scripts/topo-reset-brightness-test.mjs +83 -0
  312. package/scripts/topo-reset-icon-hover-scale-test.mjs +102 -0
  313. package/scripts/topo-runtime-badge-brightness-test.mjs +78 -0
  314. package/scripts/topo-runtime-badge-glow-test.mjs +108 -0
  315. package/scripts/topo-runtime-badge-halo-layers-test.mjs +87 -0
  316. package/scripts/topo-runtime-badge-rotate-test.mjs +85 -0
  317. package/scripts/topo-section-title-halo-layers-test.mjs +88 -0
  318. package/scripts/topo-spoke-chat-gate-test.mjs +72 -0
  319. package/scripts/topo-starfield-hue-test.mjs +109 -0
  320. package/scripts/topo-status-pin-pill-halo-layers-test.mjs +17 -0
  321. package/scripts/topo-status-ring-brightness-test.mjs +84 -0
  322. package/scripts/topo-status-ring-chat-gate-test.mjs +72 -0
  323. package/scripts/topo-status-ring-halo-layers-test.mjs +105 -0
  324. package/scripts/topo-status-ring-status-halo-test.mjs +110 -0
  325. package/scripts/topo-sub-text-chat-brightness-test.mjs +81 -0
  326. package/scripts/topo-titleblock-h2-hover-fw-test.mjs +109 -0
  327. package/scripts/topo-titleblock-h2-hover-tracking-test.mjs +128 -0
  328. package/scripts/topo-titleblock-kicker-hover-test.mjs +134 -0
  329. package/scripts/topo-vendor-chip-glow-test.mjs +97 -0
  330. package/scripts/topo-vendor-chip-halo-layers-test.mjs +18 -0
  331. package/scripts/topo-vendor-chip-pin-halo-test.mjs +88 -0
  332. package/scripts/topo-vendor-count-suffix-halo-layers-test.mjs +79 -0
  333. package/scripts/topo-vendor-letter-halo-layers-test.mjs +93 -0
  334. package/scripts/topo-vendor-pill-glow-test.mjs +98 -0
  335. package/scripts/topo-watermark-breath-test.mjs +100 -0
  336. package/scripts/topo-watermark-recede-test.mjs +114 -0
  337. package/scripts/topo-working-online-chip-halo-layers-test.mjs +94 -0
  338. package/scripts/topo-zoom-buttons-brightness-test.mjs +94 -0
  339. package/scripts/topo-zoom-in-out-halo-layers-test.mjs +97 -0
  340. package/scripts/topo-zoom-level-brightness-test.mjs +83 -0
  341. package/scripts/topo-zoom-level-color-test.mjs +105 -0
  342. package/scripts/topo-zoom-level-halo-layers-test.mjs +78 -0
  343. package/.next/static/chunks/01uyqm4r9qnpt.js +0 -1
  344. package/.next/static/chunks/04m~pbcsq2ej6.js +0 -4
  345. package/.next/static/chunks/0m.1mvl~t.avc.css +0 -2
  346. package/.next/static/chunks/112g_zni~x6_j.js +0 -1
  347. /package/.next/static/{9EnLX9vOfh-hoRKs1_aTC → __WGpawYHaQmmhEB3M_Qh}/_buildManifest.js +0 -0
  348. /package/.next/static/{9EnLX9vOfh-hoRKs1_aTC → __WGpawYHaQmmhEB3M_Qh}/_clientMiddlewareManifest.js +0 -0
  349. /package/.next/static/{9EnLX9vOfh-hoRKs1_aTC → __WGpawYHaQmmhEB3M_Qh}/_ssgManifest.js +0 -0
@@ -0,0 +1,67 @@
1
+ /* Round 546 verification: edge filter pill gains pal.flowEdge-tied drop-
2
+ * shadow when rendered. CLOSES pin-active filter-pill drop-shadow sub-
3
+ * family at the 4th pill variant. Source-canonical (banked R544 lesson —
4
+ * setPinnedEdgeKey is bound to SVG edge hitbox/badge, Playwright can't
5
+ * reach through topo-panel rect's pointer interception).
6
+ *
7
+ * Test phases:
8
+ * 1. unpinned: no [data-active-filter="edge"] element
9
+ * 2. source-side regex confirms filter wired with pal.flowEdge via
10
+ * color-mix 60% syntax, scoped to edge-pill block (setPinnedEdgeKey
11
+ * handler proximity)
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
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
42
+ const page = await ctx.newPage();
43
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
44
+ await page.waitForSelector('svg[data-topo-layout]', { timeout: 15000 });
45
+ await page.waitForTimeout(500);
46
+
47
+ const unpinned = await page.evaluate(() =>
48
+ document.querySelector('[data-active-filter="edge"]') !== null
49
+ );
50
+
51
+ await browser.close();
52
+
53
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
54
+ // Scope: setPinnedEdgeKey(null) handler vicinity (edge pill block)
55
+ const edgePillScope = src.match(/onClick=\{\(\) => setPinnedEdgeKey\(null\)\}[\s\S]{0,2500}/)?.[0] || '';
56
+ const sourceFilterScoped =
57
+ /filter: `drop-shadow\(0 0 3px color-mix\(in srgb, \$\{pal\.flowEdge\} 60%, transparent\)\)`,/.test(edgePillScope);
58
+
59
+ const results = {
60
+ unpinned_pill_absent: unpinned === false,
61
+ source_filter_scoped: sourceFilterScoped,
62
+ };
63
+ const ok = Object.values(results).every(Boolean);
64
+ console.log(`${ok ? '✅' : '❌'} R546 edge filter pill glow (source-canonical, CLOSES sub-family):`,
65
+ JSON.stringify(results, null, 2),
66
+ '\n unpinned absent:', unpinned);
67
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,99 @@
1
+ /* Round 692 — extends edge visible path (R677) + flow-rail (R678) +
2
+ * particle (R679) halo gates from hover-only to (hover || pin).
3
+ * Closes per-edge pin-state symmetry: pre-R692 only the badge
4
+ * (R646/R672 already pin-aware) halo'd when an edge was pinned;
5
+ * R692 closes the gap so ALL 5 per-edge surfaces respond to pin.
6
+ *
7
+ * Implementation: hoists `isEdgePinned = pinnedEdgeKey === link.key`
8
+ * to the outer link map closure (before the visible path/rail/
9
+ * particle declarations) — pre-existing badge IIFE's isPinned stays
10
+ * unchanged.
11
+ *
12
+ * Source assertions:
13
+ * - `isEdgePinned` defined in outer link map closure
14
+ * - visible path filter + halo-layers gate include isEdgePinned
15
+ * - flow-rail filter + halo-layers gate include isEdgePinned
16
+ * - particle filter + halo-layers gate include isEdgePinned
17
+ *
18
+ * Runtime assertions:
19
+ * - edges render with halo-layers='0' at rest (no hover, no pin)
20
+ */
21
+ import { chromium } from 'playwright';
22
+ import { readFileSync } from 'node:fs';
23
+
24
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
25
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
26
+
27
+ const browser = await chromium.launch({ headless: true });
28
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
29
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
30
+ await ctx.addInitScript(() => {
31
+ try {
32
+ localStorage.setItem('anet-theme', 'cyber');
33
+ localStorage.setItem('anet-topo-layout', 'ring');
34
+ sessionStorage.setItem('anet_v3_auth', '1');
35
+ } catch {}
36
+ });
37
+ await ctx.route('**/api/hub/status*', async (route) => {
38
+ const r = await route.fetch();
39
+ const b = await r.json();
40
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
41
+ const mk = (alias) => ({
42
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
43
+ network_id: nid, project_dir: null,
44
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
45
+ });
46
+ await route.fulfill({ response: r, json: { ...b, sessions: [
47
+ mk('a·1'), mk('a·2'), mk('a·3'),
48
+ ] } });
49
+ });
50
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [
51
+ { id: 'm1', from_alias: 'a·1', to_alias: 'a·2', kind: 'message', content: 'p', network_id: 'default', created_at: fresh },
52
+ { id: 'm2', from_alias: 'a·2', to_alias: 'a·3', kind: 'task', content: 'p2', network_id: 'default', created_at: fresh },
53
+ ] } }));
54
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
55
+ const page = await ctx.newPage();
56
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
57
+ await page.waitForSelector('[data-edge-visible-halo-layers]', { timeout: 15000, state: 'attached' });
58
+ await page.waitForTimeout(300);
59
+
60
+ const runtimeState = await page.evaluate(() => {
61
+ const visibles = Array.from(document.querySelectorAll('[data-edge-visible-halo-layers]'));
62
+ const rails = Array.from(document.querySelectorAll('[data-edge-flow-rail-halo-layers]'));
63
+ return {
64
+ visible_count: visibles.length,
65
+ rail_count: rails.length,
66
+ visible_rest_zero: visibles.every(el => el.getAttribute('data-edge-visible-halo-layers') === '0'),
67
+ rail_rest_zero: rails.every(el => el.getAttribute('data-edge-flow-rail-halo-layers') === '0'),
68
+ };
69
+ });
70
+
71
+ await browser.close();
72
+
73
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
74
+ const sourceIsEdgePinned = /const isEdgePinned = pinnedEdgeKey === link\.key;/.test(src);
75
+ const sourceVisibleAttr = /data-edge-visible-halo-layers=\{\(isHoveredEdge \|\| isEndpointHoveredEdge \|\| isEdgePinned\) \? '2' : '0'\}/.test(src);
76
+ const sourceVisibleFilter = /filter: \(isHoveredEdge \|\| isEndpointHoveredEdge \|\| isEdgePinned\)\s*\?\s*\(isLight/.test(src);
77
+ const sourceRailAttr = /data-edge-flow-rail-halo-layers=\{\(isHoveredEdge \|\| isEndpointHoveredEdge \|\| isEdgePinned\) \? '2' : '0'\}/.test(src);
78
+ const sourceRailFilter = /filter: \(isHoveredEdge \|\| isEndpointHoveredEdge \|\| isEdgePinned\)\s*\?\s*`drop-shadow\(0 0 2px \$\{pal\.flowPath\}/.test(src);
79
+ const sourceParticleAttr = /data-edge-particle-halo-layers=\{\(isHoveredEdge \|\| isEndpointHoveredEdge \|\| isEdgePinned\) \? '2' : '0'\}/.test(src);
80
+ const sourceParticleFilter = /filter: \(isHoveredEdge \|\| isEndpointHoveredEdge \|\| isEdgePinned\)\s*\?\s*\(isLight/.test(src);
81
+
82
+ const results = {
83
+ edges_present: runtimeState.visible_count >= 2,
84
+ rails_present: runtimeState.rail_count >= 2,
85
+ visible_rest_zero: runtimeState.visible_rest_zero,
86
+ rail_rest_zero: runtimeState.rail_rest_zero,
87
+ source_is_pinned: sourceIsEdgePinned,
88
+ source_visible_attr: sourceVisibleAttr,
89
+ source_visible_filter: sourceVisibleFilter,
90
+ source_rail_attr: sourceRailAttr,
91
+ source_rail_filter: sourceRailFilter,
92
+ source_particle_attr: sourceParticleAttr,
93
+ source_particle_filter: sourceParticleFilter,
94
+ };
95
+ const ok = Object.values(results).every(Boolean);
96
+ console.log(`${ok ? '✅' : '❌'} R692 per-edge tier pin-gated halo (closes 5/5 pin-symmetry):`,
97
+ JSON.stringify(results, null, 2),
98
+ `\n runtime: ${runtimeState.visible_count} visibles, ${runtimeState.rail_count} rails`);
99
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,84 @@
1
+ /* Round 582 verification: edge visible flow path gains filter
2
+ * brightness(1.15) stacked with url(#topo-glow) on cyber theme,
3
+ * plain brightness on light. 21st anchor in per-element
4
+ * brightness family.
5
+ *
6
+ * Test phases:
7
+ * 1. mock 1 message → 1 flowLink → visible path renders
8
+ * 2. rest (cyber): filter contains 'url("#topo-glow")'
9
+ * (no brightness stacked, no hover state)
10
+ * 3. brightness-attr='1' at rest
11
+ * 4. source: filter conditional + data-attr + transition extension
12
+ */
13
+ import { chromium } from 'playwright';
14
+ import { readFileSync } from 'node:fs';
15
+
16
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
17
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
18
+
19
+ const browser = await chromium.launch({ headless: true });
20
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
21
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
22
+ await ctx.addInitScript(() => {
23
+ try {
24
+ localStorage.setItem('anet-theme', 'cyber');
25
+ localStorage.setItem('anet-topo-layout', 'ring');
26
+ sessionStorage.setItem('anet_v3_auth', '1');
27
+ } catch {}
28
+ });
29
+ await ctx.route('**/api/hub/status*', async (route) => {
30
+ const r = await route.fetch();
31
+ const b = await r.json();
32
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
33
+ const mk = (alias) => ({
34
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
35
+ network_id: nid, project_dir: null,
36
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
37
+ });
38
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
39
+ });
40
+ 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-visible]', { timeout: 15000, state: 'attached' });
47
+ await page.waitForTimeout(500);
48
+
49
+ const rest = await page.evaluate(() => {
50
+ const el = document.querySelector('[data-edge-visible]');
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-visible-brightness'),
57
+ endpointHoveredAttr: el.getAttribute('data-edge-visible-endpoint-hovered'),
58
+ };
59
+ });
60
+
61
+ await browser.close();
62
+
63
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
64
+ const sourceFilter = /filter: \(isHoveredEdge \|\| isEndpointHoveredEdge\)\s*\?\s*\(isLight \? 'brightness\(1\.15\)' : 'url\(#topo-glow\) brightness\(1\.15\)'\)\s*:\s*\(isLight \? undefined : 'url\(#topo-glow\)'\)/.test(src);
65
+ const sourceAttr = /data-edge-visible-brightness=\{\(isHoveredEdge \|\| isEndpointHoveredEdge\) \? '1\.15' : '1'\}/.test(src);
66
+ const sourceTransition = /transition: 'opacity 300ms ease-out, stroke-width 300ms ease-out, stroke 300ms ease-out, filter 300ms ease-out'/.test(src);
67
+
68
+ const results = {
69
+ path_present: !!rest,
70
+ // On cyber theme (default in mock) at rest: filter = url(#topo-glow)
71
+ rest_filter_has_url: /url\(/.test(rest?.filter || ''),
72
+ rest_filter_no_brightness: !/brightness\(/.test(rest?.filter || ''),
73
+ rest_brightness_1: rest?.brightnessAttr === '1',
74
+ rest_endpoint_false: rest?.endpointHoveredAttr === 'false',
75
+ transition_has_filter: /filter/.test(rest?.transitionProperty || ''),
76
+ source_filter: sourceFilter,
77
+ source_attr: sourceAttr,
78
+ source_transition: sourceTransition,
79
+ };
80
+ const ok = Object.values(results).every(Boolean);
81
+ console.log(`${ok ? '✅' : '❌'} R582 edge visible path stacked brightness (21st anchor):`,
82
+ JSON.stringify(results, null, 2),
83
+ `\n rest: ${JSON.stringify(rest)}`);
84
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,87 @@
1
+ /* Round 677 — edge visible PRIMARY path extends single-axis brightness
2
+ * hover paint to 2-layer drop-shadow at pal.flowEdge tint with 2+4
3
+ * stride, alpha 80/40. Closes the per-edge identity halo tier with
4
+ * R646 circle + R672 digit + R677 visible path all multi-layer. 36th
5
+ * anchor in family.
6
+ *
7
+ * Source assertions:
8
+ * - light filter: drop-shadow×2 + brightness(1.15), pal.flowEdge tint
9
+ * - cyber filter: drop-shadow×2 + url(#topo-glow) + brightness(1.15)
10
+ * - data-edge-visible-halo-layers attr toggles '2' ↔ '0'
11
+ *
12
+ * Runtime assertions:
13
+ * - edges present in DOM
14
+ * - all rest: halo-layers='0'
15
+ */
16
+ import { chromium } from 'playwright';
17
+ import { readFileSync } from 'node:fs';
18
+
19
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
20
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
21
+
22
+ const browser = await chromium.launch({ headless: true });
23
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
24
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
25
+ await ctx.addInitScript(() => {
26
+ try {
27
+ localStorage.setItem('anet-theme', 'cyber');
28
+ localStorage.setItem('anet-topo-layout', 'ring');
29
+ sessionStorage.setItem('anet_v3_auth', '1');
30
+ } catch {}
31
+ });
32
+ await ctx.route('**/api/hub/status*', async (route) => {
33
+ const r = await route.fetch();
34
+ const b = await r.json();
35
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
36
+ const mk = (alias) => ({
37
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
38
+ network_id: nid, project_dir: null,
39
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
40
+ });
41
+ await route.fulfill({ response: r, json: { ...b, sessions: [
42
+ mk('a·1'), mk('a·2'), mk('a·3'),
43
+ ] } });
44
+ });
45
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [
46
+ { id: 'm1', from_alias: 'a·1', to_alias: 'a·2', kind: 'message', content: 'p', network_id: 'default', created_at: fresh },
47
+ { id: 'm2', from_alias: 'a·2', to_alias: 'a·3', kind: 'task', content: 'p2', network_id: 'default', created_at: fresh },
48
+ ] } }));
49
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
50
+ const page = await ctx.newPage();
51
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
52
+ await page.waitForSelector('[data-edge-visible-halo-layers]', { timeout: 15000, state: 'attached' });
53
+ await page.waitForTimeout(500);
54
+
55
+ const restState = await page.evaluate(() => {
56
+ return Array.from(document.querySelectorAll('[data-edge-visible]')).map(el => ({
57
+ edge: el.getAttribute('data-edge-visible'),
58
+ layers: el.getAttribute('data-edge-visible-halo-layers'),
59
+ brightness: el.getAttribute('data-edge-visible-brightness'),
60
+ }));
61
+ });
62
+
63
+ await browser.close();
64
+
65
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
66
+ const sourceLight = /isLight\s*\?\s*`drop-shadow\(0 0 2px \$\{pal\.flowEdge\}80\) drop-shadow\(0 0 4px \$\{pal\.flowEdge\}40\) brightness\(1\.15\)`/.test(src);
67
+ const sourceCyber = /:\s*`drop-shadow\(0 0 2px \$\{pal\.flowEdge\}80\) drop-shadow\(0 0 4px \$\{pal\.flowEdge\}40\) url\(#topo-glow\) brightness\(1\.15\)`/.test(src);
68
+ const sourceAttr = /data-edge-visible-halo-layers=\{\(isHoveredEdge \|\| isEndpointHoveredEdge\) \? '2' : '0'\}/.test(src);
69
+
70
+ const allConsistent = restState.every(e =>
71
+ (e.brightness === '1' && e.layers === '0') ||
72
+ (e.brightness === '1.15' && e.layers === '2')
73
+ );
74
+
75
+ const results = {
76
+ edges_present: restState.length >= 2,
77
+ rest_all_layers_zero: restState.every(e => e.layers === '0'),
78
+ rest_gate_consistent: allConsistent,
79
+ source_light_filter: sourceLight,
80
+ source_cyber_filter: sourceCyber,
81
+ source_layers_attr: sourceAttr,
82
+ };
83
+ const ok = Object.values(results).every(Boolean);
84
+ console.log(`${ok ? '✅' : '❌'} R677 edge visible path multi-layer halo (closes per-edge tier 3/3):`,
85
+ JSON.stringify(results, null, 2),
86
+ `\n rest: ${JSON.stringify(restState)}`);
87
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,83 @@
1
+ /* Round 585 verification: edge endpoint emphasis ring gains
2
+ * filter brightness(1.15) when isEndpoint activates. 24th
3
+ * anchor in per-element brightness family, fourth edge-tier
4
+ * paint layer (rail R581 + curve R582 + particle R583 +
5
+ * endpoint-ring R585).
6
+ *
7
+ * Test phases:
8
+ * 1. mock 2 idle nodes, 0 messages → endpoint rings render
9
+ * (opacity=0 at rest, isEndpoint=false)
10
+ * 2. rest: filter='none', brightness-attr='1', active='false'
11
+ * 3. transition-property contains 'filter'
12
+ * 4. source: filter conditional + data-attr + transition extension
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
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
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-edge-endpoint-ring]', { timeout: 15000, state: 'attached' });
46
+ await page.waitForTimeout(500);
47
+
48
+ const rest = await page.evaluate(() => {
49
+ const el = document.querySelector('[data-edge-endpoint-ring]');
50
+ if (!el) return null;
51
+ const cs = getComputedStyle(el);
52
+ return {
53
+ filter: cs.filter,
54
+ transitionProperty: cs.transitionProperty,
55
+ brightnessAttr: el.getAttribute('data-edge-endpoint-ring-brightness'),
56
+ activeAttr: el.getAttribute('data-edge-endpoint-active'),
57
+ opacity: cs.opacity,
58
+ };
59
+ });
60
+
61
+ await browser.close();
62
+
63
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
64
+ const sourceFilter = /filter: isEndpoint \? 'brightness\(1\.15\)' : undefined/.test(src);
65
+ const sourceAttr = /data-edge-endpoint-ring-brightness=\{isEndpoint \? '1\.15' : '1'\}/.test(src);
66
+ const sourceTransition = /transition: 'opacity 180ms ease-out, stroke-width 180ms ease-out, r 180ms ease-out, filter 180ms ease-out'/.test(src);
67
+
68
+ const results = {
69
+ ring_present: !!rest,
70
+ rest_filter_none: rest?.filter === 'none',
71
+ rest_brightness_1: rest?.brightnessAttr === '1',
72
+ rest_active_false: rest?.activeAttr === 'false',
73
+ rest_opacity_zero: parseFloat(rest?.opacity || '1') === 0,
74
+ transition_has_filter: /filter/.test(rest?.transitionProperty || ''),
75
+ source_filter: sourceFilter,
76
+ source_attr: sourceAttr,
77
+ source_transition: sourceTransition,
78
+ };
79
+ const ok = Object.values(results).every(Boolean);
80
+ console.log(`${ok ? '✅' : '❌'} R585 endpoint-ring brightness (24th anchor, edge-tier 4/4):`,
81
+ JSON.stringify(results, null, 2),
82
+ `\n rest: ${JSON.stringify(rest)}`);
83
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,107 @@
1
+ /* Round 639 — endpoint emphasis ring filter gains a stroke-tinted
2
+ * drop-shadow halo on isEndpoint. Halo color matches pal.flowEdge
3
+ * stroke (cyber cyan / light emerald). 3rd anchor in chromatic-
4
+ * identity family at the per-node ring surface.
5
+ *
6
+ * Test phases:
7
+ * 1. mock 2 nodes + 1 message → 1 edge, hover edge to trigger
8
+ * hoveredEdgeEndpoints → endpoint ring opacity > 0
9
+ * 2. rest (no edge hover): all endpoint rings halo-color='none',
10
+ * endpoint-active='false'
11
+ * 3. hover edge → 2 endpoint rings turn active; halo-color
12
+ * matches pal.flowEdge (cyber: #67e8f9, light: #10b981);
13
+ * computed filter contains drop-shadow + brightness
14
+ * 4. source: filter expression uses ${pal.flowEdge}40 in drop-shadow
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
+ // 3 messages → edge badge becomes visible + clickable (R215 threshold)
44
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [
45
+ { from_alias: 'a·1', to_alias: 'a·2', content: 'one', created_at: fresh },
46
+ { from_alias: 'a·1', to_alias: 'a·2', content: 'two', created_at: fresh },
47
+ { from_alias: 'a·1', to_alias: 'a·2', content: 'three', created_at: fresh },
48
+ ] } }));
49
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
50
+ const page = await ctx.newPage();
51
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
52
+ await page.waitForSelector('[data-edge-endpoint-ring]', { timeout: 15000, state: 'attached' });
53
+ await page.waitForTimeout(500);
54
+
55
+ // rest: collect endpoint ring halo colors (should all be 'none')
56
+ const restRings = await page.evaluate(() => {
57
+ return Array.from(document.querySelectorAll('[data-edge-endpoint-ring]')).map(el => ({
58
+ haloColor: el.getAttribute('data-edge-endpoint-ring-halo-color'),
59
+ active: el.getAttribute('data-edge-endpoint-active'),
60
+ }));
61
+ });
62
+
63
+ // Pin the edge by clicking the recent-row tint rect (R116 lets
64
+ // recent-row click pin activeEdgeKey → hoveredEdgeEndpoints fires).
65
+ await page.click('[data-recent-row-tint-brightness]', { force: true });
66
+ await page.waitForTimeout(400);
67
+
68
+ const activeState = await page.evaluate(() => {
69
+ return Array.from(document.querySelectorAll('[data-edge-endpoint-ring]')).map(el => {
70
+ const cs = getComputedStyle(el);
71
+ return {
72
+ haloColor: el.getAttribute('data-edge-endpoint-ring-halo-color'),
73
+ active: el.getAttribute('data-edge-endpoint-active'),
74
+ brightness:el.getAttribute('data-edge-endpoint-ring-brightness'),
75
+ filter: cs.filter,
76
+ };
77
+ });
78
+ });
79
+
80
+ await browser.close();
81
+
82
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
83
+ const sourceFilter = /`drop-shadow\(0 0 2px \$\{pal\.flowEdge\}40\) brightness\(1\.15\)`/.test(src);
84
+ const sourceHaloAttr = /data-edge-endpoint-ring-halo-color=\{isEndpoint \? pal\.flowEdge : 'none'\}/.test(src);
85
+
86
+ const restAllNone = restRings.every(r => r.haloColor === 'none' && r.active === 'false');
87
+ const activeRings = activeState.filter(s => s.active === 'true');
88
+ const activeAllHaloMatch = activeRings.length > 0
89
+ && activeRings.every(s => /^#[0-9a-f]{6,8}$/i.test(s.haloColor || '')
90
+ && /drop-shadow/.test(s.filter || '')
91
+ && /brightness/.test(s.filter || ''));
92
+
93
+ const results = {
94
+ rings_present: restRings.length >= 2,
95
+ rest_all_none: restAllNone,
96
+ active_at_least_two: activeRings.length >= 2,
97
+ active_brightness_1_15: activeRings.every(s => s.brightness === '1.15'),
98
+ active_halo_match: activeAllHaloMatch,
99
+ source_filter: sourceFilter,
100
+ source_halo_attr: sourceHaloAttr,
101
+ };
102
+ const ok = Object.values(results).every(Boolean);
103
+ console.log(`${ok ? '✅' : '❌'} R639 endpoint emphasis ring stroke-tinted halo (chromatic identity 3rd anchor):`,
104
+ JSON.stringify(results, null, 2),
105
+ `\n rest: ${JSON.stringify(restRings)}`,
106
+ `\n active: ${JSON.stringify(activeState)}`);
107
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,100 @@
1
+ /* Round 644 — endpoint emphasis ring filter gains a SECOND drop-
2
+ * shadow layer at 4px blur + 0x20 alpha, matching R643 status-
3
+ * ring + R642 chat-target ring multi-layer halo. Closes the
4
+ * 2-layer halo across all 3 per-node identity rings.
5
+ *
6
+ * Test phases:
7
+ * 1. mock 2 nodes + 3 messages → 1 visible edge with badge
8
+ * 2. rest: endpoint rings halo-layers='0', active='false'
9
+ * 3. pin edge via recent-row click → both endpoint rings turn
10
+ * active=true, halo-layers='2', computed filter contains
11
+ * exactly 2 drop-shadow substrings with pal.flowEdge tint
12
+ * 4. source: filter expression stacks 2 drop-shadows
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
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
40
+ });
41
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [
42
+ { from_alias: 'a·1', to_alias: 'a·2', content: 'one', created_at: fresh },
43
+ { from_alias: 'a·1', to_alias: 'a·2', content: 'two', created_at: fresh },
44
+ { from_alias: 'a·1', to_alias: 'a·2', content: 'three', created_at: fresh },
45
+ ] } }));
46
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
47
+ const page = await ctx.newPage();
48
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
49
+ await page.waitForSelector('[data-edge-endpoint-ring]', { timeout: 15000, state: 'attached' });
50
+ await page.waitForTimeout(500);
51
+
52
+ const restRings = await page.evaluate(() => {
53
+ return Array.from(document.querySelectorAll('[data-edge-endpoint-ring]')).map(el => ({
54
+ layers: el.getAttribute('data-edge-endpoint-ring-halo-layers'),
55
+ active: el.getAttribute('data-edge-endpoint-active'),
56
+ }));
57
+ });
58
+
59
+ await page.click('[data-recent-row-tint-brightness]', { force: true });
60
+ await page.waitForTimeout(400);
61
+
62
+ const activeState = await page.evaluate(() => {
63
+ return Array.from(document.querySelectorAll('[data-edge-endpoint-ring]')).map(el => {
64
+ const cs = getComputedStyle(el);
65
+ return {
66
+ layers: el.getAttribute('data-edge-endpoint-ring-halo-layers'),
67
+ active: el.getAttribute('data-edge-endpoint-active'),
68
+ haloColor: el.getAttribute('data-edge-endpoint-ring-halo-color'),
69
+ filter: cs.filter,
70
+ };
71
+ });
72
+ });
73
+
74
+ await browser.close();
75
+
76
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
77
+ const sourceFilter = /`drop-shadow\(0 0 2px \$\{pal\.flowEdge\}40\) drop-shadow\(0 0 4px \$\{pal\.flowEdge\}20\) brightness\(1\.15\)`/.test(src);
78
+ const sourceLayersAttr = /data-edge-endpoint-ring-halo-layers=\{isEndpoint \? '2' : '0'\}/.test(src);
79
+
80
+ const restAllZero = restRings.every(r => r.layers === '0' && r.active === 'false');
81
+ const activeRings = activeState.filter(s => s.active === 'true');
82
+ const activeAllTwoLayers = activeRings.length > 0
83
+ && activeRings.every(s => s.layers === '2'
84
+ && (s.filter?.match(/drop-shadow/g) || []).length === 2
85
+ && /^#[0-9a-f]{6,8}$/i.test(s.haloColor || ''));
86
+
87
+ const results = {
88
+ rings_present: restRings.length >= 2,
89
+ rest_all_zero: restAllZero,
90
+ active_at_least_2: activeRings.length >= 2,
91
+ active_all_two_layers: activeAllTwoLayers,
92
+ source_filter: sourceFilter,
93
+ source_layers_attr: sourceLayersAttr,
94
+ };
95
+ const ok = Object.values(results).every(Boolean);
96
+ console.log(`${ok ? '✅' : '❌'} R644 endpoint emphasis ring multi-layer halo (chromatic-identity 3-ring family closure):`,
97
+ JSON.stringify(results, null, 2),
98
+ `\n rest: ${JSON.stringify(restRings)}`,
99
+ `\n active: ${JSON.stringify(activeState)}`);
100
+ process.exit(ok ? 0 : 1);