@sleep2agi/agent-network-dashboard 0.5.3-preview.17 → 0.5.3-preview.171

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 (313) 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/0-8bxlg9uqt.w.css +2 -0
  143. package/.next/static/chunks/0.bt153zu.xu3.js +1 -0
  144. package/.next/static/chunks/0qprv_83ervj7.js +4 -0
  145. package/.next/static/chunks/0r958sir8xouh.js +1 -0
  146. package/.next/static/chunks/{0agyfkcu1wim_.js → 0v9ruva902feb.js} +1 -1
  147. package/.next/trace +2 -2
  148. package/.next/trace-build +1 -1
  149. package/app/components/TopoGraph.tsx +4551 -173
  150. package/app/globals.css +58 -7
  151. package/package.json +4 -4
  152. package/scripts/topo-active-chrome-hover-text-test.mjs +107 -0
  153. package/scripts/topo-alias-chat-brightness-test.mjs +79 -0
  154. package/scripts/topo-alias-text-halo-layers-test.mjs +98 -0
  155. package/scripts/topo-avatar-chat-gate-test.mjs +77 -0
  156. package/scripts/topo-avatar-drop-shadow-test.mjs +86 -0
  157. package/scripts/topo-avatar-fallback-hover-test.mjs +104 -0
  158. package/scripts/topo-avatar-fallback-rotate-test.mjs +92 -0
  159. package/scripts/topo-avatar-rotate-test.mjs +85 -0
  160. package/scripts/topo-avatar-scale-test.mjs +89 -0
  161. package/scripts/topo-badge-chat-gate-test.mjs +74 -0
  162. package/scripts/topo-brand-drop-shadow-test.mjs +71 -0
  163. package/scripts/topo-brand-logo-breath-test.mjs +102 -0
  164. package/scripts/topo-brand-logo-hover-brightness-test.mjs +105 -0
  165. package/scripts/topo-brand-logo-hover-rotate-test.mjs +93 -0
  166. package/scripts/topo-brand-logo-hover-test.mjs +85 -0
  167. package/scripts/topo-card-chat-brightness-test.mjs +86 -0
  168. package/scripts/topo-chat-ring-breath-curve-test.mjs +114 -0
  169. package/scripts/topo-chat-ring-brightness-test.mjs +80 -0
  170. package/scripts/topo-chat-ring-halo-layers-test.mjs +100 -0
  171. package/scripts/topo-chat-ring-r-breath-test.mjs +121 -0
  172. package/scripts/topo-chat-ring-status-halo-test.mjs +106 -0
  173. package/scripts/topo-chat-ring-sw-breath-test.mjs +123 -0
  174. package/scripts/topo-chip-row-digit-ls-test.mjs +135 -0
  175. package/scripts/topo-chip-row-member-alias-lit-test.mjs +154 -0
  176. package/scripts/topo-chip-row-tier-glow-brightness-test.mjs +99 -0
  177. package/scripts/topo-chip-row-unit-hover-tracking-test.mjs +124 -0
  178. package/scripts/topo-click-ripple-glow-test.mjs +86 -0
  179. package/scripts/topo-click-ripple-halo-layers-test.mjs +79 -0
  180. package/scripts/topo-click-ripple-sw-test.mjs +110 -0
  181. package/scripts/topo-cluster-count-attr-test.mjs +80 -0
  182. package/scripts/topo-crescent-breath-test.mjs +104 -0
  183. package/scripts/topo-crescent-recede-test.mjs +111 -0
  184. package/scripts/topo-edge-badge-circle-brightness-test.mjs +82 -0
  185. package/scripts/topo-edge-badge-circle-hot-pulse-test.mjs +100 -0
  186. package/scripts/topo-edge-badge-endpoint-gate-test.mjs +94 -0
  187. package/scripts/topo-edge-badge-halo-layers-test.mjs +85 -0
  188. package/scripts/topo-edge-badge-hot-pulse-test.mjs +92 -0
  189. package/scripts/topo-edge-badge-hover-glow-test.mjs +90 -0
  190. package/scripts/topo-edge-badge-text-brightness-test.mjs +83 -0
  191. package/scripts/topo-edge-chat-gate-test.mjs +71 -0
  192. package/scripts/topo-edge-particle-brightness-test.mjs +82 -0
  193. package/scripts/topo-edge-pill-glow-test.mjs +67 -0
  194. package/scripts/topo-edge-visible-brightness-test.mjs +84 -0
  195. package/scripts/topo-endpoint-ring-brightness-test.mjs +83 -0
  196. package/scripts/topo-endpoint-ring-flow-halo-test.mjs +107 -0
  197. package/scripts/topo-endpoint-ring-halo-layers-test.mjs +100 -0
  198. package/scripts/topo-filter-pill-glow-test.mjs +90 -0
  199. package/scripts/topo-flow-arrow-brightness-test.mjs +82 -0
  200. package/scripts/topo-flow-rail-brightness-test.mjs +80 -0
  201. package/scripts/topo-freshness-chip-fade-test.mjs +105 -0
  202. package/scripts/topo-fullscreen-attr-test.mjs +73 -0
  203. package/scripts/topo-fullscreen-brightness-test.mjs +84 -0
  204. package/scripts/topo-fullscreen-icon-rotate-test.mjs +93 -0
  205. package/scripts/topo-grid-content-bottom-attr-test.mjs +72 -0
  206. package/scripts/topo-group-box-brightness-test.mjs +84 -0
  207. package/scripts/topo-group-chat-gate-test.mjs +77 -0
  208. package/scripts/topo-group-label-brightness-test.mjs +84 -0
  209. package/scripts/topo-group-label-halo-layers-test.mjs +78 -0
  210. package/scripts/topo-group-label-hover-glow-test.mjs +86 -0
  211. package/scripts/topo-group-label-member-alias-hover-test.mjs +125 -0
  212. package/scripts/topo-group-pill-glow-test.mjs +76 -0
  213. package/scripts/topo-group-tint-brightness-test.mjs +82 -0
  214. package/scripts/topo-halo-chat-gate-test.mjs +72 -0
  215. package/scripts/topo-hub-core-brightness-test.mjs +82 -0
  216. package/scripts/topo-hub-digit-brightness-test.mjs +79 -0
  217. package/scripts/topo-hub-digit-halo-layers-test.mjs +76 -0
  218. package/scripts/topo-hub-digit-ls-test.mjs +119 -0
  219. package/scripts/topo-hub-halo-brightness-test.mjs +80 -0
  220. package/scripts/topo-hub-halo-glow-test.mjs +96 -0
  221. package/scripts/topo-hub-halo-halo-layers-test.mjs +76 -0
  222. package/scripts/topo-hub-highlight-amplify-test.mjs +139 -0
  223. package/scripts/topo-hub-highlight-brightness-test.mjs +84 -0
  224. package/scripts/topo-hub-highlight-fill-transition-test.mjs +84 -0
  225. package/scripts/topo-hub-highlight-glow-test.mjs +99 -0
  226. package/scripts/topo-hub-highlight-halo-layers-test.mjs +78 -0
  227. package/scripts/topo-hub-highlight-r-test.mjs +112 -0
  228. package/scripts/topo-hub-highlight-recede-test.mjs +144 -0
  229. package/scripts/topo-hub-highlight-theme-fill-test.mjs +83 -0
  230. package/scripts/topo-hub-hover-ring-brightness-test.mjs +79 -0
  231. package/scripts/topo-hub-hover-ring-glow-test.mjs +97 -0
  232. package/scripts/topo-hub-hover-ring-halo-layers-test.mjs +71 -0
  233. package/scripts/topo-hub-idle-breath-test.mjs +7 -2
  234. package/scripts/topo-hub-recede-test.mjs +124 -0
  235. package/scripts/topo-hub-spoke-brightness-test.mjs +77 -0
  236. package/scripts/topo-hub-spoke-glow-test.mjs +112 -0
  237. package/scripts/topo-hub-spoke-halo-layers-test.mjs +97 -0
  238. package/scripts/topo-hub-spoke-self-filter-test.mjs +119 -0
  239. package/scripts/topo-label-card-brightness-test.mjs +81 -0
  240. package/scripts/topo-layout-hover-fw-test.mjs +98 -0
  241. package/scripts/topo-layout-toggle-brightness-test.mjs +94 -0
  242. package/scripts/topo-legend-count-brightness-test.mjs +80 -0
  243. package/scripts/topo-legend-count-letter-spacing-test.mjs +108 -0
  244. package/scripts/topo-legend-label-fw-test.mjs +107 -0
  245. package/scripts/topo-legend-pin-ring-brightness-test.mjs +82 -0
  246. package/scripts/topo-legend-pin-ring-halo-layers-test.mjs +71 -0
  247. package/scripts/topo-legend-row-count-brightness-test.mjs +85 -0
  248. package/scripts/topo-legend-row-label-glow-test.mjs +102 -0
  249. package/scripts/topo-legend-swatch-glow-test.mjs +109 -0
  250. package/scripts/topo-legend-swatch-member-alias-match-test.mjs +139 -0
  251. package/scripts/topo-legend-tint-brightness-test.mjs +83 -0
  252. package/scripts/topo-minimap-dot-chat-gate-test.mjs +81 -0
  253. package/scripts/topo-minimap-hover-glow-test.mjs +109 -0
  254. package/scripts/topo-minimap-viewport-brightness-test.mjs +84 -0
  255. package/scripts/topo-minimap-viewport-halo-layers-test.mjs +24 -0
  256. package/scripts/topo-more-footer-brightness-test.mjs +94 -0
  257. package/scripts/topo-node-alias-brightness-test.mjs +84 -0
  258. package/scripts/topo-node-sub-text-brightness-test.mjs +88 -0
  259. package/scripts/topo-nodesize-brightness-test.mjs +82 -0
  260. package/scripts/topo-nodesize-hover-fw-test.mjs +99 -0
  261. package/scripts/topo-orphan-fill-opacity-test.mjs +91 -0
  262. package/scripts/topo-orphan-label-opacity-test.mjs +98 -0
  263. package/scripts/topo-panel-count-hover-ls-test.mjs +87 -0
  264. package/scripts/topo-panel-row-brightness-test.mjs +116 -0
  265. package/scripts/topo-panel-title-brightness-test.mjs +98 -0
  266. package/scripts/topo-panel-title-glow-test.mjs +111 -0
  267. package/scripts/topo-pill-x-rotate-test.mjs +96 -0
  268. package/scripts/topo-pinned-aspect-test.mjs +89 -0
  269. package/scripts/topo-pip-brightness-test.mjs +85 -0
  270. package/scripts/topo-pressure-seg-glow-test.mjs +92 -0
  271. package/scripts/topo-pressure-seg-member-alias-match-test.mjs +133 -0
  272. package/scripts/topo-pressure-seg-motion-test.mjs +101 -0
  273. package/scripts/topo-recent-count-brightness-test.mjs +84 -0
  274. package/scripts/topo-recent-more-fw-test.mjs +126 -0
  275. package/scripts/topo-recent-panel-hot-pulse-test.mjs +105 -0
  276. package/scripts/topo-recent-pip-halo-layers-test.mjs +82 -0
  277. package/scripts/topo-recent-row-chat-gate-test.mjs +75 -0
  278. package/scripts/topo-recent-row-content-lift-test.mjs +140 -0
  279. package/scripts/topo-recent-row-fw-test.mjs +115 -0
  280. package/scripts/topo-recent-row-text-glow-test.mjs +86 -0
  281. package/scripts/topo-recent-tint-brightness-test.mjs +80 -0
  282. package/scripts/topo-recent-ts-brightness-test.mjs +86 -0
  283. package/scripts/topo-reduced-motion-attr-test.mjs +69 -0
  284. package/scripts/topo-reset-brightness-test.mjs +83 -0
  285. package/scripts/topo-reset-icon-hover-scale-test.mjs +102 -0
  286. package/scripts/topo-runtime-badge-brightness-test.mjs +78 -0
  287. package/scripts/topo-runtime-badge-glow-test.mjs +108 -0
  288. package/scripts/topo-runtime-badge-halo-layers-test.mjs +87 -0
  289. package/scripts/topo-runtime-badge-rotate-test.mjs +85 -0
  290. package/scripts/topo-spoke-chat-gate-test.mjs +72 -0
  291. package/scripts/topo-starfield-hue-test.mjs +109 -0
  292. package/scripts/topo-status-ring-brightness-test.mjs +84 -0
  293. package/scripts/topo-status-ring-chat-gate-test.mjs +72 -0
  294. package/scripts/topo-status-ring-halo-layers-test.mjs +105 -0
  295. package/scripts/topo-status-ring-status-halo-test.mjs +110 -0
  296. package/scripts/topo-sub-text-chat-brightness-test.mjs +81 -0
  297. package/scripts/topo-titleblock-h2-hover-fw-test.mjs +109 -0
  298. package/scripts/topo-titleblock-h2-hover-tracking-test.mjs +128 -0
  299. package/scripts/topo-titleblock-kicker-hover-test.mjs +134 -0
  300. package/scripts/topo-vendor-chip-glow-test.mjs +97 -0
  301. package/scripts/topo-vendor-pill-glow-test.mjs +98 -0
  302. package/scripts/topo-watermark-breath-test.mjs +100 -0
  303. package/scripts/topo-watermark-recede-test.mjs +114 -0
  304. package/scripts/topo-zoom-buttons-brightness-test.mjs +94 -0
  305. package/scripts/topo-zoom-level-brightness-test.mjs +83 -0
  306. package/scripts/topo-zoom-level-color-test.mjs +105 -0
  307. package/.next/static/chunks/0m.1mvl~t.avc.css +0 -2
  308. package/.next/static/chunks/0owj9w5mce71l.js +0 -1
  309. package/.next/static/chunks/0r~-3n-0-xo9r.js +0 -1
  310. package/.next/static/chunks/14-f9xit_jsav.js +0 -4
  311. /package/.next/static/{I0Fa214fBO3TE0o93MFNh → hA6ox_Th7oyKFksYUIVNN}/_buildManifest.js +0 -0
  312. /package/.next/static/{I0Fa214fBO3TE0o93MFNh → hA6ox_Th7oyKFksYUIVNN}/_clientMiddlewareManifest.js +0 -0
  313. /package/.next/static/{I0Fa214fBO3TE0o93MFNh → hA6ox_Th7oyKFksYUIVNN}/_ssgManifest.js +0 -0
package/app/globals.css CHANGED
@@ -949,15 +949,40 @@ body {
949
949
  all preserved) plus `outline-color` for R490. All at 200ms ease-
950
950
  out, matching the chip-row's existing Tailwind duration-200 ease-
951
951
  out so visible animations on the chip are unchanged.
952
- Trade-off: chips with inline `style.transition` (e.g. R210
953
- pressure-bar segments at 220ms width / 150ms boxShadow / 150ms
954
- filter, line 2338 in TopoGraph.tsx) keep their inline value
955
- because inline style wins over class rules regardless of
956
- !important. That's intentional those custom timings were
957
- deliberate and stay scoped to their element. */
952
+
953
+ Round 524 / Loop CORRECTION + bug fix.
954
+ R490's original 'trade-off' note read:
955
+ 'chips with inline style.transition (R210 pressure-bar
956
+ segments at 220ms width / 150ms boxShadow / 150ms filter)
957
+ keep their inline value because inline style wins over class
958
+ rules regardless of !important.'
959
+ That was WRONG about CSS cascade. Per the spec, `!important`
960
+ author declarations DO override normal-priority inline-style
961
+ declarations. So R490's transition-property list silently
962
+ dropped every inline transition that targeted a property NOT
963
+ in this class's list — including R165's width 220ms tween on
964
+ the pressure-bar segments AND R210's filter brightness(1.2)
965
+ hover on those same segments. Both motion polishes have been
966
+ silently broken (snapping instead of easing) since R490
967
+ landed; banked as test-craft lesson in R523.
968
+ R524 fixes by extending the transition-property list to
969
+ include `width` and `filter` so the pressure-bar segments
970
+ (and any future chip-focus surface with width/filter motion)
971
+ animate per the class's unified 200ms ease-out. The cadence
972
+ shift (R165's 220ms → 200ms, R210's 150ms → 200ms) loses 20-
973
+ 50ms of intent precision but slots into the dashboard's
974
+ uniform 200ms motion vocabulary the rest of the chip family
975
+ already uses — net visible improvement (motion was DEAD,
976
+ now eases at 200ms; that's a strictly better state than
977
+ snapping).
978
+ Other chip-focus surfaces (filter pills, online/working
979
+ chips, minimap container, "+N more" footer's <g>) don't
980
+ change width or filter at runtime, so adding these
981
+ properties to the list is a no-op for them. */
958
982
  transition-property:
959
983
  outline-color, color, background-color, border-color,
960
- text-decoration-color, fill, stroke, opacity, box-shadow, transform
984
+ text-decoration-color, fill, stroke, opacity, box-shadow, transform,
985
+ width, filter
961
986
  !important;
962
987
  transition-duration: 200ms !important;
963
988
  transition-timing-function: ease-out !important;
@@ -1049,6 +1074,32 @@ body {
1049
1074
  animation-iteration-count: infinite;
1050
1075
  }
1051
1076
 
1077
+ /* Round 553 — title-block brand logo subtle idle breath.
1078
+ 5th anchor in the 呼吸感 breath family — cadence ladder:
1079
+ row hot 3s
1080
+ hub idle 4s
1081
+ brand logo 5s ← this round
1082
+ watermark 6s
1083
+ crescent 7s
1084
+ Pure opacity breath (0.92 ↔ 1, ~8% delta) on the title-block
1085
+ crescent SVG so the brand mark reads as a "living mark" at
1086
+ rest. Composes cleanly with R548 hover:scale-105 +
1087
+ R549 hover:rotate-6 (independent properties: opacity vs
1088
+ scale/rotate; the moon keeps breathing as it lifts on hover).
1089
+ prefers-reduced-motion handled by R29 blanket override —
1090
+ animation-duration → 0.001ms neutralises the keyframe without
1091
+ killing the static opacity baseline. Component-side gate also
1092
+ applied (`!reducedMotion` toggles the className) as canonical
1093
+ TopoGraph breath pattern (sibling to R130 hub idle / R519
1094
+ watermark / R326 crescent breath gates). */
1095
+ @keyframes anet-topo-brand-logo-breath-kf {
1096
+ 0%, 100% { opacity: 1; }
1097
+ 50% { opacity: 0.92; }
1098
+ }
1099
+ .anet-topo-brand-logo-breath {
1100
+ animation: anet-topo-brand-logo-breath-kf 5s ease-in-out infinite;
1101
+ }
1102
+
1052
1103
  /* ─────────────────────────────────────────────────────────────────────
1053
1104
  Round 29 — prefers-reduced-motion a11y sweep
1054
1105
 
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@sleep2agi/agent-network-dashboard",
3
- "version": "0.5.3-preview.17",
4
- "description": "Agent Network Dashboard Web UI for managing AI Agent networks",
3
+ "version": "0.5.3-preview.171",
4
+ "description": "Agent Network Dashboard \u2014 Web UI for managing AI Agent networks",
5
5
  "scripts": {
6
6
  "dev": "next dev",
7
7
  "build": "next build",
8
8
  "start": "next start",
9
9
  "lint": "eslint",
10
- "prepublishOnly": "[ -f .next/BUILD_ID ] || (echo 'prepublishOnly: .next/BUILD_ID missing run npm run build first (see commit 05c1ebf body for R224 chunk-500 root cause)' >&2 && exit 1)"
10
+ "prepublishOnly": "[ -f .next/BUILD_ID ] || (echo 'prepublishOnly: .next/BUILD_ID missing \u2014 run npm run build first (see commit 05c1ebf body for R224 chunk-500 root cause)' >&2 && exit 1)"
11
11
  },
12
12
  "bin": {
13
13
  "agent-network-dashboard": "./bin/start.js"
@@ -44,4 +44,4 @@
44
44
  "tailwindcss": "^4",
45
45
  "typescript": "^5"
46
46
  }
47
- }
47
+ }
@@ -0,0 +1,107 @@
1
+ /* Round 552 verification: chrome active-variant buttons gain
2
+ * hover:text-cyan-200 lift. Coordinated 4-anchor edit:
3
+ * Ring | Grid | S/M/L | Fullscreen
4
+ *
5
+ * Test phases:
6
+ * 1. Pick an active button (Ring is active by default in ring layout)
7
+ * 2. Read rest text color (cyan-300 = rgb(103, 232, 249))
8
+ * 3. Hover → text color = cyan-200 (rgb(165, 243, 252))
9
+ * 4. Verify bg also deepened (cyan-500/20)
10
+ * 5. Source-side regex: 4 occurrences of the new className substring
11
+ */
12
+ import { chromium } from 'playwright';
13
+ import { readFileSync } from 'node:fs';
14
+
15
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
16
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
17
+
18
+ const browser = await chromium.launch({ headless: true });
19
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
20
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
21
+ await ctx.addInitScript(() => {
22
+ try {
23
+ localStorage.setItem('anet-theme', 'cyber');
24
+ localStorage.setItem('anet-topo-layout', 'ring');
25
+ sessionStorage.setItem('anet_v3_auth', '1');
26
+ } catch {}
27
+ });
28
+ await ctx.route('**/api/hub/status*', async (route) => {
29
+ const r = await route.fetch();
30
+ const b = await r.json();
31
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
32
+ const mk = (alias) => ({
33
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
34
+ network_id: nid, project_dir: null,
35
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
36
+ });
37
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1')] } });
38
+ });
39
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
40
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
41
+ const page = await ctx.newPage();
42
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
43
+ await page.waitForSelector('[data-topo-chrome-layout="ring"]', { timeout: 15000 });
44
+ await page.waitForTimeout(500);
45
+
46
+ // Ring is active in ring layout
47
+ const sel = '[data-topo-chrome-layout="ring"]';
48
+ const rest = await page.evaluate((s) => {
49
+ const el = document.querySelector(s);
50
+ if (!el) return null;
51
+ const cs = getComputedStyle(el);
52
+ return {
53
+ color: cs.color,
54
+ bg: cs.backgroundColor,
55
+ activeAttr: el.getAttribute('data-topo-chrome-layout-active'),
56
+ };
57
+ }, sel);
58
+
59
+ await page.hover(sel);
60
+ await page.waitForTimeout(400);
61
+ const hover = await page.evaluate((s) => {
62
+ const el = document.querySelector(s);
63
+ if (!el) return null;
64
+ const cs = getComputedStyle(el);
65
+ return { color: cs.color, bg: cs.backgroundColor };
66
+ }, sel);
67
+
68
+ await browser.close();
69
+
70
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
71
+ // New active-variant substring must appear 4× (Ring, Grid, S/M/L, Fullscreen)
72
+ const occurrences = (src.match(/bg-cyan-500\/15 text-cyan-300 font-medium hover:bg-cyan-500\/20 hover:text-cyan-200 active:bg-cyan-500\/25/g) || []).length;
73
+
74
+ // Tailwind v4 emits cyan-300 / cyan-200 in lab() / oklab() color
75
+ // space, not legacy rgb(). Parse the L (lightness) component and
76
+ // verify hover L > rest L (cyan-200 is lighter than cyan-300).
77
+ // Bg uses oklab with alpha; rest alpha = 0.15 (cyan-500/15), hover
78
+ // alpha = 0.2 (cyan-500/20).
79
+ const parseLab = (s) => {
80
+ const m = (s || '').match(/lab\(([0-9.]+)\s/) || (s || '').match(/oklab\(([0-9.]+)\s/);
81
+ return m ? parseFloat(m[1]) : NaN;
82
+ };
83
+ const parseAlpha = (s) => {
84
+ const m = (s || '').match(/\/\s*([0-9.]+)\)/);
85
+ return m ? parseFloat(m[1]) : NaN;
86
+ };
87
+ const restL = parseLab(rest?.color);
88
+ const hoverL = parseLab(hover?.color);
89
+ const restBgA = parseAlpha(rest?.bg);
90
+ const hoverBgA = parseAlpha(hover?.bg);
91
+
92
+ const results = {
93
+ active_attr: rest?.activeAttr === 'true',
94
+ rest_text_parsed: !Number.isNaN(restL),
95
+ hover_text_parsed: !Number.isNaN(hoverL),
96
+ hover_text_lighter_than_rest: hoverL > restL + 3, // cyan-200 L≈91 > cyan-300 L≈85
97
+ rest_bg_alpha_0_15: Math.abs(restBgA - 0.15) < 0.01,
98
+ hover_bg_alpha_0_20: Math.abs(hoverBgA - 0.20) < 0.01,
99
+ source_4_occurrences: occurrences === 4,
100
+ };
101
+ const ok = Object.values(results).every(Boolean);
102
+ console.log(`${ok ? '✅' : '❌'} R552 chrome active-variant hover:text-cyan-200 (4 anchors):`,
103
+ JSON.stringify(results, null, 2),
104
+ '\n rest:', JSON.stringify(rest),
105
+ '\n hover:', JSON.stringify(hover),
106
+ '\n source occurrences:', occurrences);
107
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,79 @@
1
+ /* Round 616 — alias text brightness gate extends from hover-only
2
+ * to (hover || chat-target). 2nd anchor in chat-target-gated
3
+ * brightness family (sibling to R615 chat ring).
4
+ *
5
+ * Test phases:
6
+ * 1. mock 2 idle nodes → alias text renders
7
+ * 2. rest (no hover, no chat): filter='none', brightness-attr='1'
8
+ * 3. computed transition-property contains 'filter'
9
+ * 4. source: filter conditional includes BOTH hover AND chat
10
+ * gates, joined by `||`
11
+ */
12
+ import { chromium } from 'playwright';
13
+ import { readFileSync } from 'node:fs';
14
+
15
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
16
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
17
+
18
+ const browser = await chromium.launch({ headless: true });
19
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
20
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
21
+ await ctx.addInitScript(() => {
22
+ try {
23
+ localStorage.setItem('anet-theme', 'cyber');
24
+ localStorage.setItem('anet-topo-layout', 'ring');
25
+ sessionStorage.setItem('anet_v3_auth', '1');
26
+ } catch {}
27
+ });
28
+ await ctx.route('**/api/hub/status*', async (route) => {
29
+ const r = await route.fetch();
30
+ const b = await r.json();
31
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
32
+ const mk = (alias) => ({
33
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
34
+ network_id: nid, project_dir: null,
35
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
36
+ });
37
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
38
+ });
39
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
40
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
41
+ const page = await ctx.newPage();
42
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
43
+ await page.waitForSelector('[data-node-alias-text]', { timeout: 15000, state: 'attached' });
44
+ await page.waitForTimeout(500);
45
+
46
+ const rest = await page.evaluate(() => {
47
+ const el = document.querySelector('[data-node-alias-text]');
48
+ if (!el) return null;
49
+ const cs = getComputedStyle(el);
50
+ return {
51
+ filter: cs.filter,
52
+ transitionProperty: cs.transitionProperty,
53
+ brightnessAttr: el.getAttribute('data-node-alias-brightness'),
54
+ hoveredAttr: el.getAttribute('data-node-alias-hovered'),
55
+ chatTargetAttr: el.getAttribute('data-node-alias-chat-target'),
56
+ };
57
+ });
58
+
59
+ await browser.close();
60
+
61
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
62
+ const sourceFilter = /filter: !reducedMotion && \(hoveredAlias === session\.alias \|\| chatAlias === session\.alias\)\s*\?\s*`drop-shadow\(0 0 2px \$\{status\.text\}80\) brightness\(1\.15\)`\s*:\s*undefined/.test(src);
63
+ const sourceAttr = /data-node-alias-brightness=\{!reducedMotion && \(hoveredAlias === session\.alias \|\| chatAlias === session\.alias\) \? '1\.15' : '1'\}/.test(src);
64
+
65
+ const results = {
66
+ alias_present: !!rest,
67
+ rest_filter_none: rest?.filter === 'none',
68
+ rest_brightness_1: rest?.brightnessAttr === '1',
69
+ rest_hovered_false: rest?.hoveredAttr === 'false',
70
+ rest_chat_target_false: rest?.chatTargetAttr === 'false',
71
+ transition_has_filter: /filter/.test(rest?.transitionProperty || ''),
72
+ source_filter_or_gate: sourceFilter,
73
+ source_attr_or_gate: sourceAttr,
74
+ };
75
+ const ok = Object.values(results).every(Boolean);
76
+ console.log(`${ok ? '✅' : '❌'} R616 alias chat-target brightness (chat-gated family 2/N):`,
77
+ JSON.stringify(results, null, 2),
78
+ `\n rest: ${JSON.stringify(rest)}`);
79
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,98 @@
1
+ /* Round 645 — node alias text gains a SECOND drop-shadow layer at
2
+ * 4px blur + 0x40 alpha. Extends the chromatic-identity 2-layer
3
+ * halo family from rings (R642/R643/R644) to TEXT — first text-
4
+ * scope multi-layer halo anchor.
5
+ *
6
+ * Test phases:
7
+ * 1. rest: alias text halo-layers='0', no filter
8
+ * 2. click a·1 → chat-target gate fires → alias text halo-layers='2',
9
+ * computed filter has EXACTLY 2 drop-shadow substrings with
10
+ * status.text tint at different alphas
11
+ * 3. source: filter expression stacks 2 drop-shadows
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('[data-node-alias-text]', { timeout: 15000, state: 'attached' });
45
+ await page.waitForTimeout(500);
46
+
47
+ const restTexts = await page.evaluate(() => {
48
+ return Array.from(document.querySelectorAll('[data-node-alias-text]')).map(el => ({
49
+ layers: el.getAttribute('data-node-alias-halo-layers'),
50
+ glow: el.getAttribute('data-node-alias-glow'),
51
+ chatTarget: el.getAttribute('data-node-alias-chat-target'),
52
+ }));
53
+ });
54
+
55
+ await page.click('[data-node="a·1"]', { force: true });
56
+ await page.waitForTimeout(400);
57
+
58
+ const chatState = await page.evaluate(() => {
59
+ return Array.from(document.querySelectorAll('[data-node-alias-text]')).map(el => {
60
+ const cs = getComputedStyle(el);
61
+ return {
62
+ alias: el.getAttribute('data-node-alias-text'),
63
+ layers: el.getAttribute('data-node-alias-halo-layers'),
64
+ chatTarget: el.getAttribute('data-node-alias-chat-target'),
65
+ filter: cs.filter,
66
+ };
67
+ });
68
+ });
69
+
70
+ await browser.close();
71
+
72
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
73
+ const sourceFilter = /`drop-shadow\(0 0 2px \$\{status\.text\}80\) drop-shadow\(0 0 4px \$\{status\.text\}40\) brightness\(1\.15\)`/.test(src);
74
+ const sourceLayersAttr = /data-node-alias-halo-layers=\{!reducedMotion && \(hoveredAlias === session\.alias \|\| chatAlias === session\.alias\) \? '2' : '0'\}/.test(src);
75
+
76
+ const restAllZero = restTexts.every(t => t.layers === '0');
77
+ const chatActive = chatState.find(c => c.alias === 'a·1');
78
+ const chatActiveDropShadowCount = (chatActive?.filter?.match(/drop-shadow/g) || []).length;
79
+ const chatIdle = chatState.find(c => c.alias === 'a·2');
80
+
81
+ const results = {
82
+ texts_present: restTexts.length >= 2,
83
+ rest_all_zero: restAllZero,
84
+ chat_a1_present: !!chatActive,
85
+ chat_a1_layers_2: chatActive?.layers === '2',
86
+ chat_a1_chat_target_true:chatActive?.chatTarget === 'true',
87
+ chat_a1_two_dropshadows: chatActiveDropShadowCount === 2,
88
+ chat_a1_brightness: /brightness/.test(chatActive?.filter || ''),
89
+ chat_a2_layers_0: chatIdle?.layers === '0',
90
+ source_filter: sourceFilter,
91
+ source_layers_attr: sourceLayersAttr,
92
+ };
93
+ const ok = Object.values(results).every(Boolean);
94
+ console.log(`${ok ? '✅' : '❌'} R645 node alias text multi-layer halo (text-scope chromatic identity):`,
95
+ JSON.stringify(results, null, 2),
96
+ `\n rest: ${JSON.stringify(restTexts)}`,
97
+ `\n chat: ${JSON.stringify(chatState)}`);
98
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,77 @@
1
+ /* Round 619 — extend isAvatarHovered + isAvatarFallbackHovered
2
+ * to include chatAlias === session.alias. Cascades the same 4
3
+ * avatar axes (brightness + rotate + scale + drop-shadow) to
4
+ * also fire on chat-target across all 3 branches.
5
+ *
6
+ * Test phases:
7
+ * 1. mock 2 idle nodes → avatar renders
8
+ * 2. rest (no hover, no chat): all data attrs reflect idle
9
+ * state — rotate '0', scale '1', drop-shadow 'none'
10
+ * 3. source: BOTH avatar hover state declarations use
11
+ * gate union (hoveredAlias || chatAlias)
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('[data-node-avatar]', { timeout: 15000, state: 'attached' });
45
+ await page.waitForTimeout(500);
46
+
47
+ const rest = await page.evaluate(() => {
48
+ const el = document.querySelector('[data-node-avatar]');
49
+ if (!el) return null;
50
+ return {
51
+ rotateAttr: el.getAttribute('data-node-avatar-rotate'),
52
+ scaleAttr: el.getAttribute('data-node-avatar-scale'),
53
+ hoveredAttr: el.getAttribute('data-node-avatar-hovered'),
54
+ dropShadowAttr: el.getAttribute('data-node-avatar-drop-shadow'),
55
+ };
56
+ });
57
+
58
+ await browser.close();
59
+
60
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
61
+ const sourceImageGate = /const isAvatarHovered = !reducedMotion && \(hoveredAlias === session\.alias \|\| chatAlias === session\.alias\)/.test(src);
62
+ const sourceFallbackGate = /const isAvatarFallbackHovered = !reducedMotion && \(hoveredAlias === session\.alias \|\| chatAlias === session\.alias\)/.test(src);
63
+
64
+ const results = {
65
+ avatar_present: !!rest,
66
+ rest_rotate_zero: rest?.rotateAttr === '0',
67
+ rest_scale_one: rest?.scaleAttr === '1',
68
+ rest_hovered_false: rest?.hoveredAttr === 'false',
69
+ rest_drop_shadow_none: rest?.dropShadowAttr === 'none',
70
+ source_image_gate: sourceImageGate,
71
+ source_fallback_gate: sourceFallbackGate,
72
+ };
73
+ const ok = Object.values(results).every(Boolean);
74
+ console.log(`${ok ? '✅' : '❌'} R619 avatar chat-target gate (chat-gated family 5th anchor):`,
75
+ JSON.stringify(results, null, 2),
76
+ `\n rest: ${JSON.stringify(rest)}`);
77
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,86 @@
1
+ /* Round 605 — per-node avatar gains drop-shadow on hover,
2
+ * stacked with brightness via banked R582/R583 stacked-filter
3
+ * pattern. 4th hover axis on avatar (brightness + rotate +
4
+ * scale + drop-shadow). 3-element sibling edit (image + 2
5
+ * fallback branches).
6
+ *
7
+ * Test phases:
8
+ * 1. mock 2 idle nodes → avatar renders
9
+ * 2. rest: filter='none', drop-shadow attr 'none'
10
+ * 3. computed transition-property contains 'filter'
11
+ * 4. source: stacked filter conditional + data-attr on all
12
+ * 3 branches
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-node-avatar-drop-shadow]', { timeout: 15000, state: 'attached' });
46
+ await page.waitForTimeout(500);
47
+
48
+ const rest = await page.evaluate(() => {
49
+ const el = document.querySelector('[data-node-avatar-drop-shadow]');
50
+ if (!el) return null;
51
+ const cs = getComputedStyle(el);
52
+ return {
53
+ filter: cs.filter,
54
+ transitionProperty: cs.transitionProperty,
55
+ dropShadowAttr: el.getAttribute('data-node-avatar-drop-shadow'),
56
+ brightnessAttr: el.getAttribute('data-node-avatar-brightness') || null,
57
+ rotateAttr: el.getAttribute('data-node-avatar-rotate'),
58
+ scaleAttr: el.getAttribute('data-node-avatar-scale'),
59
+ hoveredAttr: el.getAttribute('data-node-avatar-hovered'),
60
+ };
61
+ });
62
+
63
+ await browser.close();
64
+
65
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
66
+ const sourceImageDS = /data-node-avatar-drop-shadow=\{isAvatarHovered \? `0 0 4px \$\{pal\.legendAccent\}99` : 'none'\}/.test(src);
67
+ const sourceMonogramDS = /data-node-avatar-monogram-drop-shadow=\{isAvatarFallbackHovered \? `0 0 4px \$\{pal\.legendAccent\}99` : 'none'\}/.test(src);
68
+ const sourceFallbackDS = /data-node-avatar-fallback-drop-shadow=\{isAvatarFallbackHovered \? `0 0 4px \$\{pal\.legendAccent\}99` : 'none'\}/.test(src);
69
+ const sourceStackedFilters = (src.match(/`drop-shadow\(0 0 4px \$\{pal\.legendAccent\}99\) brightness\(1\.15\)`/g) || []).length >= 3;
70
+
71
+ const results = {
72
+ avatar_present: !!rest,
73
+ rest_filter_none: rest?.filter === 'none',
74
+ rest_drop_shadow_none: rest?.dropShadowAttr === 'none',
75
+ rest_hovered_false: rest?.hoveredAttr === 'false',
76
+ transition_has_filter: /filter/.test(rest?.transitionProperty || ''),
77
+ source_image_ds_attr: sourceImageDS,
78
+ source_monogram_ds: sourceMonogramDS,
79
+ source_fallback_ds: sourceFallbackDS,
80
+ source_3_stacked: sourceStackedFilters,
81
+ };
82
+ const ok = Object.values(results).every(Boolean);
83
+ console.log(`${ok ? '✅' : '❌'} R605 avatar drop-shadow (3/3 branches, 4-axis hover signature):`,
84
+ JSON.stringify(results, null, 2),
85
+ `\n rest: ${JSON.stringify(rest)}`);
86
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,104 @@
1
+ /* Round 558 verification: per-node avatar hover-brightness family
2
+ * closes at 3 anchors. R501 already covers the vendor.logo image
3
+ * branch; R558 adds the monogram + prefix-group fallback branches.
4
+ *
5
+ * Mock with claude-code-cli runtime and no recognized vendor model
6
+ * → triggers the prefix-group fallback branch (hue-hashed initial).
7
+ *
8
+ * Test phases:
9
+ * 1. wait for [data-node-avatar-fallback] to render
10
+ * 2. rest filter = 'none', hovered attr = 'false'
11
+ * 3. hover the node → filter contains 'brightness(1.15)',
12
+ * hovered attr = 'true'
13
+ * 4. source-side regex confirms both fallback branches wired
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
+ // model=null → vendor=unknown → prefix-group fallback branch.
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: null, runtime: null,
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('foo·1'), mk('foo·2')] } });
42
+ });
43
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
44
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
45
+ const page = await ctx.newPage();
46
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
47
+ await page.waitForSelector('[data-node-avatar-fallback="foo·1"]', { timeout: 15000 });
48
+ await page.waitForTimeout(500);
49
+
50
+ const avatarSel = '[data-node-avatar-fallback="foo·1"]';
51
+ const nodeSel = 'g[data-node="foo·1"]';
52
+
53
+ const rest = await page.evaluate((s) => {
54
+ const el = document.querySelector(s);
55
+ if (!el) return null;
56
+ const cs = getComputedStyle(el);
57
+ return {
58
+ filter: cs.filter,
59
+ transitionProperty: cs.transitionProperty,
60
+ transitionDuration: cs.transitionDuration,
61
+ hoveredAttr: el.getAttribute('data-node-avatar-fallback-hovered'),
62
+ };
63
+ }, avatarSel);
64
+
65
+ // Hover the parent node group (the avatar is pointerEvents:none inside,
66
+ // but the node group handles hover; node-hovered state is what we test).
67
+ await page.hover(nodeSel);
68
+ await page.waitForTimeout(400);
69
+ const hover = await page.evaluate((s) => {
70
+ const el = document.querySelector(s);
71
+ if (!el) return null;
72
+ const cs = getComputedStyle(el);
73
+ return {
74
+ filter: cs.filter,
75
+ hoveredAttr: el.getAttribute('data-node-avatar-fallback-hovered'),
76
+ };
77
+ }, avatarSel);
78
+
79
+ await browser.close();
80
+
81
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
82
+ const sourceMonogramG = /data-node-avatar-monogram-hovered=\{isAvatarFallbackHovered/.test(src);
83
+ const sourceFallbackG = /data-node-avatar-fallback-hovered=\{isAvatarFallbackHovered/.test(src);
84
+ const sourceBrightnessExpr = /filter: isAvatarFallbackHovered \? 'brightness\(1\.15\)' : undefined/.test(src);
85
+ const sourceTransitionExpr = /transition: 'filter 200ms ease-out'/.test(src);
86
+
87
+ const results = {
88
+ rest_filter_none: rest?.filter === 'none',
89
+ rest_hovered_false: rest?.hoveredAttr === 'false',
90
+ hover_filter_brightness: /brightness\(1\.15\)/.test(hover?.filter || ''),
91
+ hover_hovered_true: hover?.hoveredAttr === 'true',
92
+ transition_filter: /filter/.test(rest?.transitionProperty || ''),
93
+ transition_duration: rest?.transitionDuration === '0.2s',
94
+ source_monogram_group: sourceMonogramG,
95
+ source_fallback_group: sourceFallbackG,
96
+ source_brightness_expr: sourceBrightnessExpr,
97
+ source_transition_expr: sourceTransitionExpr,
98
+ };
99
+ const ok = Object.values(results).every(Boolean);
100
+ console.log(`${ok ? '✅' : '❌'} R558 per-node avatar fallback hover-brightness (closes 3-anchor family):`,
101
+ JSON.stringify(results, null, 2),
102
+ `\n rest: ${JSON.stringify(rest)}`,
103
+ `\n hover: ${JSON.stringify(hover)}`);
104
+ process.exit(ok ? 0 : 1);