@sleep2agi/agent-network-dashboard 0.5.3-preview.23 → 0.5.3-preview.231

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 (368) 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/09oamdv~26l2i.js +1 -0
  143. package/.next/static/chunks/{0uasv5346--sz.js → 0f.appti_l02h.js} +1 -1
  144. package/.next/static/chunks/0fcch25_x_e6k.css +2 -0
  145. package/.next/static/chunks/0j0b0yd222u40.js +4 -0
  146. package/.next/static/chunks/0xuohyx.zz.1-.js +1 -0
  147. package/.next/trace +2 -2
  148. package/.next/trace-build +1 -1
  149. package/app/components/TopoGraph.tsx +5654 -178
  150. package/app/globals.css +524 -7
  151. package/package.json +4 -4
  152. package/scripts/topo-active-chrome-hover-text-test.mjs +107 -0
  153. package/scripts/topo-active-links-chip-halo-layers-test.mjs +81 -0
  154. package/scripts/topo-alias-chat-brightness-test.mjs +79 -0
  155. package/scripts/topo-alias-text-halo-layers-test.mjs +98 -0
  156. package/scripts/topo-avatar-chat-gate-test.mjs +77 -0
  157. package/scripts/topo-avatar-drop-shadow-test.mjs +86 -0
  158. package/scripts/topo-avatar-fallback-hover-test.mjs +104 -0
  159. package/scripts/topo-avatar-fallback-rotate-test.mjs +92 -0
  160. package/scripts/topo-avatar-rotate-test.mjs +85 -0
  161. package/scripts/topo-avatar-scale-test.mjs +89 -0
  162. package/scripts/topo-badge-chat-gate-test.mjs +74 -0
  163. package/scripts/topo-brand-drop-shadow-test.mjs +71 -0
  164. package/scripts/topo-brand-logo-breath-test.mjs +102 -0
  165. package/scripts/topo-brand-logo-halo-layers-test.mjs +85 -0
  166. package/scripts/topo-brand-logo-hover-brightness-test.mjs +105 -0
  167. package/scripts/topo-brand-logo-hover-rotate-test.mjs +93 -0
  168. package/scripts/topo-brand-logo-hover-test.mjs +85 -0
  169. package/scripts/topo-card-chat-brightness-test.mjs +86 -0
  170. package/scripts/topo-chat-ring-breath-curve-test.mjs +114 -0
  171. package/scripts/topo-chat-ring-brightness-test.mjs +80 -0
  172. package/scripts/topo-chat-ring-halo-layers-test.mjs +100 -0
  173. package/scripts/topo-chat-ring-r-breath-test.mjs +121 -0
  174. package/scripts/topo-chat-ring-status-halo-test.mjs +106 -0
  175. package/scripts/topo-chat-ring-sw-breath-test.mjs +123 -0
  176. package/scripts/topo-chip-pin-halo-test.mjs +85 -0
  177. package/scripts/topo-chip-row-digit-ls-test.mjs +135 -0
  178. package/scripts/topo-chip-row-member-alias-lit-test.mjs +154 -0
  179. package/scripts/topo-chip-row-tier-glow-brightness-test.mjs +99 -0
  180. package/scripts/topo-chip-row-unit-hover-tracking-test.mjs +124 -0
  181. package/scripts/topo-chrome-control-halo-layers-test.mjs +22 -0
  182. package/scripts/topo-chrome-layout-trailer-breath-test.mjs +86 -0
  183. package/scripts/topo-chrome-nodesize-trailer-breath-test.mjs +86 -0
  184. package/scripts/topo-chrome-wrapper-halo-test.mjs +83 -0
  185. package/scripts/topo-chrome-zoom-wrapper-breath-test.mjs +85 -0
  186. package/scripts/topo-click-ripple-glow-test.mjs +86 -0
  187. package/scripts/topo-click-ripple-halo-layers-test.mjs +79 -0
  188. package/scripts/topo-click-ripple-sw-test.mjs +110 -0
  189. package/scripts/topo-cluster-count-attr-test.mjs +80 -0
  190. package/scripts/topo-crescent-breath-test.mjs +104 -0
  191. package/scripts/topo-crescent-envelope-breath-test.mjs +103 -0
  192. package/scripts/topo-crescent-recede-test.mjs +111 -0
  193. package/scripts/topo-dense-alias-chat-halo-test.mjs +73 -0
  194. package/scripts/topo-dense-alias-halo-layers-test.mjs +80 -0
  195. package/scripts/topo-dual-axis-surfaces-catalog-test.mjs +94 -0
  196. package/scripts/topo-edge-badge-circle-brightness-test.mjs +82 -0
  197. package/scripts/topo-edge-badge-circle-hot-pulse-test.mjs +100 -0
  198. package/scripts/topo-edge-badge-digit-halo-layers-test.mjs +107 -0
  199. package/scripts/topo-edge-badge-endpoint-gate-test.mjs +94 -0
  200. package/scripts/topo-edge-badge-halo-layers-test.mjs +85 -0
  201. package/scripts/topo-edge-badge-hot-pulse-test.mjs +92 -0
  202. package/scripts/topo-edge-badge-hover-glow-test.mjs +90 -0
  203. package/scripts/topo-edge-badge-text-brightness-test.mjs +83 -0
  204. package/scripts/topo-edge-chat-gate-test.mjs +71 -0
  205. package/scripts/topo-edge-flow-rail-halo-layers-test.mjs +89 -0
  206. package/scripts/topo-edge-particle-brightness-test.mjs +82 -0
  207. package/scripts/topo-edge-particle-halo-layers-test.mjs +91 -0
  208. package/scripts/topo-edge-pill-glow-test.mjs +67 -0
  209. package/scripts/topo-edge-pin-halo-test.mjs +99 -0
  210. package/scripts/topo-edge-visible-brightness-test.mjs +84 -0
  211. package/scripts/topo-edge-visible-halo-layers-test.mjs +87 -0
  212. package/scripts/topo-endpoint-ring-brightness-test.mjs +83 -0
  213. package/scripts/topo-endpoint-ring-flow-halo-test.mjs +107 -0
  214. package/scripts/topo-endpoint-ring-halo-layers-test.mjs +100 -0
  215. package/scripts/topo-filter-pill-glow-test.mjs +90 -0
  216. package/scripts/topo-filter-pill-halo-layers-test.mjs +27 -0
  217. package/scripts/topo-flow-arrow-brightness-test.mjs +82 -0
  218. package/scripts/topo-flow-rail-brightness-test.mjs +80 -0
  219. package/scripts/topo-fullscreen-attr-test.mjs +73 -0
  220. package/scripts/topo-fullscreen-brightness-test.mjs +84 -0
  221. package/scripts/topo-fullscreen-icon-rotate-test.mjs +93 -0
  222. package/scripts/topo-grid-content-bottom-attr-test.mjs +72 -0
  223. package/scripts/topo-group-box-brightness-test.mjs +84 -0
  224. package/scripts/topo-group-box-halo-layers-test.mjs +91 -0
  225. package/scripts/topo-group-chat-gate-test.mjs +77 -0
  226. package/scripts/topo-group-label-brightness-test.mjs +84 -0
  227. package/scripts/topo-group-label-halo-layers-test.mjs +78 -0
  228. package/scripts/topo-group-label-hover-glow-test.mjs +86 -0
  229. package/scripts/topo-group-label-member-alias-hover-test.mjs +125 -0
  230. package/scripts/topo-group-pill-glow-test.mjs +76 -0
  231. package/scripts/topo-group-tint-brightness-test.mjs +82 -0
  232. package/scripts/topo-h2-dual-axis-breath-test.mjs +92 -0
  233. package/scripts/topo-halo-chat-gate-test.mjs +72 -0
  234. package/scripts/topo-hover-detail-halo-test.mjs +76 -0
  235. package/scripts/topo-hub-core-brightness-test.mjs +82 -0
  236. package/scripts/topo-hub-core-halo-layers-test.mjs +81 -0
  237. package/scripts/topo-hub-digit-brightness-test.mjs +79 -0
  238. package/scripts/topo-hub-digit-halo-layers-test.mjs +76 -0
  239. package/scripts/topo-hub-digit-ls-test.mjs +119 -0
  240. package/scripts/topo-hub-halo-brightness-test.mjs +80 -0
  241. package/scripts/topo-hub-halo-glow-test.mjs +96 -0
  242. package/scripts/topo-hub-halo-halo-layers-test.mjs +76 -0
  243. package/scripts/topo-hub-highlight-amplify-test.mjs +139 -0
  244. package/scripts/topo-hub-highlight-brightness-test.mjs +84 -0
  245. package/scripts/topo-hub-highlight-fill-transition-test.mjs +84 -0
  246. package/scripts/topo-hub-highlight-glow-test.mjs +99 -0
  247. package/scripts/topo-hub-highlight-halo-layers-test.mjs +78 -0
  248. package/scripts/topo-hub-highlight-r-test.mjs +112 -0
  249. package/scripts/topo-hub-highlight-recede-test.mjs +5 -1
  250. package/scripts/topo-hub-hover-ring-brightness-test.mjs +79 -0
  251. package/scripts/topo-hub-hover-ring-glow-test.mjs +97 -0
  252. package/scripts/topo-hub-hover-ring-halo-layers-test.mjs +71 -0
  253. package/scripts/topo-hub-idle-breath-test.mjs +6 -7
  254. package/scripts/topo-hub-spoke-brightness-test.mjs +77 -0
  255. package/scripts/topo-hub-spoke-glow-test.mjs +112 -0
  256. package/scripts/topo-hub-spoke-halo-layers-test.mjs +97 -0
  257. package/scripts/topo-hub-spoke-self-filter-test.mjs +119 -0
  258. package/scripts/topo-kicker-breath-test.mjs +100 -0
  259. package/scripts/topo-kicker-dual-axis-breath-test.mjs +81 -0
  260. package/scripts/topo-kicker-halo-layers-test.mjs +82 -0
  261. package/scripts/topo-label-card-brightness-test.mjs +81 -0
  262. package/scripts/topo-layout-hover-fw-test.mjs +98 -0
  263. package/scripts/topo-layout-toggle-brightness-test.mjs +94 -0
  264. package/scripts/topo-layout-toggle-halo-layers-test.mjs +95 -0
  265. package/scripts/topo-legend-count-brightness-test.mjs +80 -0
  266. package/scripts/topo-legend-count-halo-layers-test.mjs +79 -0
  267. package/scripts/topo-legend-count-letter-spacing-test.mjs +108 -0
  268. package/scripts/topo-legend-label-fw-test.mjs +107 -0
  269. package/scripts/topo-legend-panel-title-breath-test.mjs +86 -0
  270. package/scripts/topo-legend-pin-ring-brightness-test.mjs +82 -0
  271. package/scripts/topo-legend-pin-ring-halo-layers-test.mjs +71 -0
  272. package/scripts/topo-legend-row-count-brightness-test.mjs +85 -0
  273. package/scripts/topo-legend-row-label-glow-test.mjs +102 -0
  274. package/scripts/topo-legend-swatch-glow-test.mjs +109 -0
  275. package/scripts/topo-legend-swatch-member-alias-match-test.mjs +139 -0
  276. package/scripts/topo-legend-tint-brightness-test.mjs +83 -0
  277. package/scripts/topo-legend-trio-halo-layers-test.mjs +22 -0
  278. package/scripts/topo-minimap-container-halo-test.mjs +82 -0
  279. package/scripts/topo-minimap-dot-chat-gate-test.mjs +81 -0
  280. package/scripts/topo-minimap-hover-glow-test.mjs +109 -0
  281. package/scripts/topo-minimap-viewport-brightness-test.mjs +84 -0
  282. package/scripts/topo-minimap-viewport-halo-layers-test.mjs +24 -0
  283. package/scripts/topo-more-footer-brightness-test.mjs +94 -0
  284. package/scripts/topo-node-alias-brightness-test.mjs +84 -0
  285. package/scripts/topo-node-avatar-halo-layers-test.mjs +25 -0
  286. package/scripts/topo-node-hover-ring-halo-layers-test.mjs +70 -0
  287. package/scripts/topo-node-label-card-halo-test.mjs +76 -0
  288. package/scripts/topo-node-sub-text-brightness-test.mjs +88 -0
  289. package/scripts/topo-nodesize-brightness-test.mjs +82 -0
  290. package/scripts/topo-nodesize-halo-layers-test.mjs +89 -0
  291. package/scripts/topo-nodesize-hover-fw-test.mjs +99 -0
  292. package/scripts/topo-orphan-label-opacity-test.mjs +98 -0
  293. package/scripts/topo-panel-count-halo-layers-test.mjs +91 -0
  294. package/scripts/topo-panel-count-hover-ls-test.mjs +87 -0
  295. package/scripts/topo-panel-rect-halo-test.mjs +90 -0
  296. package/scripts/topo-panel-row-brightness-test.mjs +116 -0
  297. package/scripts/topo-panel-title-brightness-test.mjs +98 -0
  298. package/scripts/topo-panel-title-glow-test.mjs +111 -0
  299. package/scripts/topo-panel-titles-dual-axis-breath-test.mjs +94 -0
  300. package/scripts/topo-panel-titles-halo-layers-test.mjs +23 -0
  301. package/scripts/topo-pill-x-rotate-test.mjs +96 -0
  302. package/scripts/topo-pip-brightness-test.mjs +85 -0
  303. package/scripts/topo-pressure-bar-halo-layers-test.mjs +19 -0
  304. package/scripts/topo-pressure-seg-glow-test.mjs +92 -0
  305. package/scripts/topo-pressure-seg-member-alias-match-test.mjs +133 -0
  306. package/scripts/topo-pressure-seg-motion-test.mjs +101 -0
  307. package/scripts/topo-recent-count-brightness-test.mjs +84 -0
  308. package/scripts/topo-recent-more-fw-test.mjs +126 -0
  309. package/scripts/topo-recent-more-halo-layers-test.mjs +90 -0
  310. package/scripts/topo-recent-panel-hot-pulse-test.mjs +105 -0
  311. package/scripts/topo-recent-panel-title-breath-test.mjs +91 -0
  312. package/scripts/topo-recent-pip-halo-layers-test.mjs +82 -0
  313. package/scripts/topo-recent-row-chat-gate-test.mjs +75 -0
  314. package/scripts/topo-recent-row-content-lift-test.mjs +140 -0
  315. package/scripts/topo-recent-row-fw-test.mjs +115 -0
  316. package/scripts/topo-recent-row-text-glow-test.mjs +86 -0
  317. package/scripts/topo-recent-row-text-halo-layers-test.mjs +67 -0
  318. package/scripts/topo-recent-tint-brightness-test.mjs +80 -0
  319. package/scripts/topo-recent-ts-brightness-test.mjs +86 -0
  320. package/scripts/topo-reduced-motion-attr-test.mjs +69 -0
  321. package/scripts/topo-reset-brightness-test.mjs +83 -0
  322. package/scripts/topo-reset-icon-hover-scale-test.mjs +102 -0
  323. package/scripts/topo-respiratory-patterns-catalog-test.mjs +106 -0
  324. package/scripts/topo-respiratory-rolodex-test.mjs +83 -0
  325. package/scripts/topo-runtime-badge-brightness-test.mjs +78 -0
  326. package/scripts/topo-runtime-badge-glow-test.mjs +108 -0
  327. package/scripts/topo-runtime-badge-halo-layers-test.mjs +87 -0
  328. package/scripts/topo-runtime-badge-rotate-test.mjs +85 -0
  329. package/scripts/topo-section-title-breath-test.mjs +83 -0
  330. package/scripts/topo-section-title-halo-layers-test.mjs +88 -0
  331. package/scripts/topo-spoke-chat-gate-test.mjs +72 -0
  332. package/scripts/topo-starfield-hue-test.mjs +109 -0
  333. package/scripts/topo-status-pin-pill-halo-layers-test.mjs +17 -0
  334. package/scripts/topo-status-ring-brightness-test.mjs +84 -0
  335. package/scripts/topo-status-ring-chat-gate-test.mjs +72 -0
  336. package/scripts/topo-status-ring-halo-layers-test.mjs +105 -0
  337. package/scripts/topo-status-ring-status-halo-test.mjs +110 -0
  338. package/scripts/topo-sub-text-chat-brightness-test.mjs +81 -0
  339. package/scripts/topo-title-block-envelope-breath-test.mjs +87 -0
  340. package/scripts/topo-titleblock-h2-hover-fw-test.mjs +109 -0
  341. package/scripts/topo-titleblock-h2-hover-tracking-test.mjs +128 -0
  342. package/scripts/topo-titleblock-kicker-hover-test.mjs +134 -0
  343. package/scripts/topo-vendor-chip-glow-test.mjs +97 -0
  344. package/scripts/topo-vendor-chip-halo-layers-test.mjs +18 -0
  345. package/scripts/topo-vendor-chip-pin-halo-test.mjs +88 -0
  346. package/scripts/topo-vendor-count-suffix-halo-layers-test.mjs +79 -0
  347. package/scripts/topo-vendor-distribution-wrapper-halo-test.mjs +93 -0
  348. package/scripts/topo-vendor-letter-halo-layers-test.mjs +93 -0
  349. package/scripts/topo-vendor-pill-glow-test.mjs +98 -0
  350. package/scripts/topo-watermark-breath-test.mjs +100 -0
  351. package/scripts/topo-watermark-dual-axis-breath-test.mjs +88 -0
  352. package/scripts/topo-watermark-envelope-breath-test.mjs +88 -0
  353. package/scripts/topo-watermark-recede-test.mjs +114 -0
  354. package/scripts/topo-working-online-chip-halo-layers-test.mjs +94 -0
  355. package/scripts/topo-zoom-buttons-brightness-test.mjs +94 -0
  356. package/scripts/topo-zoom-in-out-halo-layers-test.mjs +97 -0
  357. package/scripts/topo-zoom-level-breath-test.mjs +87 -0
  358. package/scripts/topo-zoom-level-brightness-test.mjs +83 -0
  359. package/scripts/topo-zoom-level-color-test.mjs +105 -0
  360. package/scripts/topo-zoom-level-dual-axis-breath-test.mjs +83 -0
  361. package/scripts/topo-zoom-level-halo-layers-test.mjs +78 -0
  362. package/.next/static/chunks/0m.1mvl~t.avc.css +0 -2
  363. package/.next/static/chunks/0o7ix_c958qcs.js +0 -4
  364. package/.next/static/chunks/10q5vtqj7.g7b.js +0 -1
  365. package/.next/static/chunks/16faz62o8faa9.js +0 -1
  366. /package/.next/static/{hJ3DiAf0PdSz8-LSqjCPy → ZyjUKk4WhRuLkc8K4d7em}/_buildManifest.js +0 -0
  367. /package/.next/static/{hJ3DiAf0PdSz8-LSqjCPy → ZyjUKk4WhRuLkc8K4d7em}/_clientMiddlewareManifest.js +0 -0
  368. /package/.next/static/{hJ3DiAf0PdSz8-LSqjCPy → ZyjUKk4WhRuLkc8K4d7em}/_ssgManifest.js +0 -0
@@ -0,0 +1,83 @@
1
+ /* Round 594 verification: chrome reset button gains filter
2
+ * brightness(1.15) on hoveredReset. 33rd anchor in per-element
3
+ * brightness family, 2nd HTML-element anchor (R593 zoom-level
4
+ * was the first).
5
+ *
6
+ * Test phases:
7
+ * 1. mock nodes → chrome strip renders Reset button
8
+ * 2. rest (no hover): filter='none', brightness-attr='1'
9
+ * 3. transition-property contains 'filter'
10
+ * 4. source: filter conditional + data-attr + transition list
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-topo-chrome-reset-brightness]', { timeout: 15000, state: 'attached' });
44
+ await page.waitForTimeout(500);
45
+
46
+ const rest = await page.evaluate(() => {
47
+ const el = document.querySelector('[data-topo-chrome-reset-brightness]');
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-topo-chrome-reset-brightness'),
54
+ hoverAttr: el.getAttribute('data-topo-chrome-reset-hover'),
55
+ hoverLiftAttr: el.getAttribute('data-topo-chrome-reset-hover-lift'),
56
+ ariaLabel: el.getAttribute('aria-label'),
57
+ };
58
+ });
59
+
60
+ await browser.close();
61
+
62
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
63
+ const sourceFilter = /filter: hoveredReset \? 'brightness\(1\.15\)' : undefined/.test(src);
64
+ const sourceAttr = /data-topo-chrome-reset-brightness=\{hoveredReset \? '1\.15' : '1'\}/.test(src);
65
+ const sourceTransition = /transition: 'color 200ms ease-out, background-color 200ms ease-out, border-color 200ms ease-out, transform 200ms ease-out, filter 200ms ease-out'/.test(src);
66
+
67
+ const results = {
68
+ button_present: !!rest,
69
+ rest_filter_none: rest?.filter === 'none',
70
+ rest_brightness_1: rest?.brightnessAttr === '1',
71
+ rest_hover_false: rest?.hoverAttr === 'false',
72
+ hover_lift_attr_true: rest?.hoverLiftAttr === 'true',
73
+ is_reset_button: /reset/i.test(rest?.ariaLabel || ''),
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 ? '✅' : '❌'} R594 reset-button brightness (33rd anchor, 2nd HTML, 5-axis closure):`,
81
+ JSON.stringify(results, null, 2),
82
+ `\n rest: ${JSON.stringify(rest)}`);
83
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,102 @@
1
+ /* Round 514 verification: reset icon hover-transform composes
2
+ * rotate + scale (was rotate-only). Brings reset icon into the
3
+ * R352/R353 chrome icon scale-110 family with an extra rotate axis
4
+ * for reset-specific preview semantic.
5
+ *
6
+ * Test phases:
7
+ * 1. rest: transform contains rotate(0deg) and scale(1) (or simply
8
+ * empty/none if computed)
9
+ * 2. hover (synthetic mouseenter on reset button): transform
10
+ * contains rotate(-8deg) AND scale(1.1)
11
+ * 3. source-side regex confirms 3-axis transform string wired
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, status) => ({
34
+ alias, status, 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', 'idle')] } });
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-topo-chrome-reset-icon]', { timeout: 15000 });
45
+ await page.waitForTimeout(1500);
46
+
47
+ // Phase 1: rest state
48
+ const rest = await page.evaluate(() => {
49
+ const icon = document.querySelector('[data-topo-chrome-reset-icon]');
50
+ if (!icon) return null;
51
+ const inline = icon.getAttribute('style') || '';
52
+ return {
53
+ inline_transform: inline.match(/transform:\s*([^;]+)/)?.[1]?.trim(),
54
+ hover_attr: icon.getAttribute('data-topo-chrome-reset-icon-hover'),
55
+ };
56
+ });
57
+
58
+ // Phase 2: trigger hover. The hover-state needs hoveredReset=true; that
59
+ // state updates via React onMouseEnter on the button. Find reset button
60
+ // + dispatch synthetic mouseenter on it.
61
+ await page.evaluate(() => {
62
+ const btn = document.querySelector('button[data-topo-chrome-reset-hover-lift]');
63
+ if (!btn) return;
64
+ ['pointerenter', 'pointerover', 'mouseenter', 'mouseover'].forEach((t) => {
65
+ btn.dispatchEvent(new Event(t, { bubbles: true, cancelable: true }));
66
+ });
67
+ });
68
+ await page.waitForTimeout(400);
69
+ const hover = await page.evaluate(() => {
70
+ const icon = document.querySelector('[data-topo-chrome-reset-icon]');
71
+ if (!icon) return null;
72
+ const inline = icon.getAttribute('style') || '';
73
+ return {
74
+ inline_transform: inline.match(/transform:\s*([^;]+)/)?.[1]?.trim(),
75
+ hover_attr: icon.getAttribute('data-topo-chrome-reset-icon-hover'),
76
+ };
77
+ });
78
+
79
+ await browser.close();
80
+
81
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
82
+ const sourceWired = /transform: hoveredReset && !resetSpinning \? 'rotate\(-8deg\) scale\(1\.1\)' : 'rotate\(0deg\) scale\(1\)'/.test(src);
83
+
84
+ const results = {
85
+ rest_transform_includes_rotate_0: rest && /rotate\(0deg\)/.test(rest.inline_transform || ''),
86
+ rest_transform_includes_scale_1: rest && /scale\(1\)/.test(rest.inline_transform || ''),
87
+ rest_hover_attr_false: rest && rest.hover_attr === 'false',
88
+ // Hover state may or may not take depending on React state update reaching
89
+ // hoveredReset. Test passes vacuously if hover didn't take.
90
+ hover_strict_or_vacuous:
91
+ !hover ||
92
+ hover.hover_attr === 'false' ||
93
+ (/rotate\(-8deg\)/.test(hover.inline_transform || '') &&
94
+ /scale\(1\.1\)/.test(hover.inline_transform || '') &&
95
+ hover.hover_attr === 'true'),
96
+ source_wired: sourceWired,
97
+ };
98
+ const ok = Object.values(results).every(Boolean);
99
+ console.log(`${ok ? '✅' : '❌'} R514 reset icon hover-scale:`, JSON.stringify(results),
100
+ '\n rest:', JSON.stringify(rest),
101
+ '\n hover:', JSON.stringify(hover));
102
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,106 @@
1
+ /* Round 717 — patterns catalog attr on canvas root. 3rd of 3 meta-doc
2
+ * catalogs completing the breath family's self-describing triangle:
3
+ * R710 data-topo-respiratory-rolodex (cadences)
4
+ * R716 data-topo-respiratory-dual-axis-surfaces (axes)
5
+ * R717 data-topo-respiratory-patterns (patterns)
6
+ *
7
+ * Assertions:
8
+ * - attr present on root <svg>
9
+ * - JSON parses to an Array of exactly 5 entries
10
+ * - shape: each entry has {name, cadences, anchors, shape}
11
+ * - shape strings are one of the 5 known taxonomy values
12
+ * - sum of anchors across patterns matches the R710 anchor count (16)
13
+ * - cross-check: every cadence in R717 patterns also appears in R710 rolodex
14
+ */
15
+ import { chromium } from 'playwright';
16
+ import { readFileSync } from 'node:fs';
17
+
18
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
19
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
20
+
21
+ const browser = await chromium.launch({ headless: true });
22
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
23
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
24
+ await ctx.addInitScript(() => {
25
+ try {
26
+ localStorage.setItem('anet-theme', 'cyber');
27
+ localStorage.setItem('anet-topo-layout', 'ring');
28
+ sessionStorage.setItem('anet_v3_auth', '1');
29
+ } catch {}
30
+ });
31
+ await ctx.route('**/api/hub/status*', async (route) => {
32
+ const r = await route.fetch();
33
+ const b = await r.json();
34
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
35
+ const mk = (alias) => ({
36
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
37
+ network_id: nid, project_dir: null,
38
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
39
+ });
40
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
41
+ });
42
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
43
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
44
+ const page = await ctx.newPage();
45
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
46
+ await page.waitForSelector('[data-topo-canvas-aria]', { timeout: 15000, state: 'attached' });
47
+ await page.waitForTimeout(300);
48
+
49
+ const runtimeAttrs = await page.evaluate(() => {
50
+ const svg = document.querySelector('[data-topo-canvas-aria]');
51
+ return {
52
+ patterns: svg?.getAttribute('data-topo-respiratory-patterns') ?? null,
53
+ rolodex: svg?.getAttribute('data-topo-respiratory-rolodex') ?? null,
54
+ };
55
+ });
56
+
57
+ await browser.close();
58
+
59
+ let patterns = null;
60
+ let rolodex = null;
61
+ let parseError = null;
62
+ try {
63
+ patterns = JSON.parse(runtimeAttrs.patterns ?? '');
64
+ rolodex = JSON.parse(runtimeAttrs.rolodex ?? '');
65
+ } catch (e) {
66
+ parseError = String(e);
67
+ }
68
+
69
+ const validShape = Array.isArray(patterns)
70
+ ? patterns.every(p => p && typeof p === 'object'
71
+ && typeof p.name === 'string' && p.name.length > 0
72
+ && Array.isArray(p.cadences) && p.cadences.length > 0 && p.cadences.every(c => typeof c === 'number' && c > 0)
73
+ && Array.isArray(p.anchors) && p.anchors.length > 0 && p.anchors.every(a => typeof a === 'string' && a.length > 0)
74
+ && typeof p.shape === 'string' && ['trio-with-envelope', 'parity', 'tiered-with-trio', 'coprime-nested-pair', 'baseline-pair'].includes(p.shape))
75
+ : false;
76
+
77
+ const totalAnchorCount = Array.isArray(patterns)
78
+ ? patterns.reduce((acc, p) => acc + (Array.isArray(p.anchors) ? p.anchors.length : 0), 0)
79
+ : 0;
80
+
81
+ // Cross-check: every cadence in R717 patterns must appear in R710 rolodex
82
+ const rolodexCadences = rolodex ? new Set(Object.keys(rolodex).map(Number)) : new Set();
83
+ const patternsCadences = Array.isArray(patterns)
84
+ ? new Set(patterns.flatMap(p => p.cadences))
85
+ : new Set();
86
+ const allPatternCadencesInRolodex = [...patternsCadences].every(c => rolodexCadences.has(c));
87
+
88
+ const patternNames = Array.isArray(patterns) ? patterns.map(p => p.name).sort() : [];
89
+ const expectedNames = ['background', 'canvas-brand-pair', 'chrome-strip', 'panel-pair', 'title-block'];
90
+
91
+ const results = {
92
+ attr_present: !!runtimeAttrs.patterns,
93
+ json_parses: patterns !== null && parseError === null,
94
+ is_array: Array.isArray(patterns),
95
+ has_5_entries: Array.isArray(patterns) && patterns.length === 5,
96
+ pattern_names_match: JSON.stringify(patternNames) === JSON.stringify(expectedNames),
97
+ shape_and_taxonomy_valid: validShape,
98
+ total_anchors_count: totalAnchorCount >= 14 && totalAnchorCount <= 18, // pattern membership can have overlap counting
99
+ all_cadences_in_rolodex: allPatternCadencesInRolodex,
100
+ };
101
+ const ok = Object.values(results).every(Boolean);
102
+ console.log(`${ok ? '✅' : '❌'} R717 patterns catalog attr (3rd meta-doc — breath family triangle complete):`,
103
+ JSON.stringify(results, null, 2),
104
+ `\n patterns: ${JSON.stringify(patterns)}`,
105
+ parseError ? `\n parseError: ${parseError}` : '');
106
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,83 @@
1
+ /* Round 710 (milestone) — respiratory rolodex catalog attr on canvas
2
+ * root. JSON catalog of all 16 breath anchors / 14 cadence tiers in
3
+ * one attr read. Closes the 呼吸感 family vocabulary as DATA.
4
+ *
5
+ * Assertions:
6
+ * - attr present on the root <svg>
7
+ * - JSON parses to an object
8
+ * - exact catalog match: 14 cadence keys, 16 total anchors
9
+ * - shape: each value is an Array<string>, no empty arrays
10
+ * - cadence keys parse to integers, sorted ascending: 3/4/5/6/7/8/9/10/11/13/15/17/19/23
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-topo-canvas-aria]', { timeout: 15000, state: 'attached' });
44
+ await page.waitForTimeout(300);
45
+
46
+ const runtimeAttr = await page.evaluate(() => {
47
+ const svg = document.querySelector('[data-topo-canvas-aria]');
48
+ return svg?.getAttribute('data-topo-respiratory-rolodex') ?? null;
49
+ });
50
+
51
+ await browser.close();
52
+
53
+ let parsed = null;
54
+ let parseError = null;
55
+ try {
56
+ parsed = JSON.parse(runtimeAttr ?? '');
57
+ } catch (e) {
58
+ parseError = String(e);
59
+ }
60
+
61
+ const expectedKeys = ['3','4','5','6','7','8','9','10','11','13','15','17','19','23'];
62
+ const cadenceKeys = parsed ? Object.keys(parsed).sort((a, b) => parseInt(a) - parseInt(b)) : [];
63
+ const totalAnchors = parsed ? Object.values(parsed).reduce((acc, v) => acc + (Array.isArray(v) ? v.length : 0), 0) : 0;
64
+ const allArraysNonEmpty = parsed ? Object.values(parsed).every(v => Array.isArray(v) && v.length > 0) : false;
65
+ const allValuesStrings = parsed ? Object.values(parsed).every(v => Array.isArray(v) && v.every(s => typeof s === 'string' && s.length > 0)) : false;
66
+
67
+ const results = {
68
+ attr_present: !!runtimeAttr,
69
+ json_parses: parsed !== null && parseError === null,
70
+ has_14_cadence_keys: cadenceKeys.length === 14,
71
+ has_16_total_anchors: totalAnchors === 16,
72
+ keys_match_expected: JSON.stringify(cadenceKeys) === JSON.stringify(expectedKeys),
73
+ all_values_arrays: allArraysNonEmpty,
74
+ all_strings: allValuesStrings,
75
+ cadence_6_has_two: Array.isArray(parsed?.["6"]) && parsed["6"].length === 2,
76
+ cadence_8_has_two: Array.isArray(parsed?.["8"]) && parsed["8"].length === 2,
77
+ };
78
+ const ok = Object.values(results).every(Boolean);
79
+ console.log(`${ok ? '✅' : '❌'} R710 respiratory rolodex catalog attr (milestone — breath family vocabulary as data):`,
80
+ JSON.stringify(results, null, 2),
81
+ `\n parsed: ${JSON.stringify(parsed)}`,
82
+ parseError ? `\n parseError: ${parseError}` : '');
83
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,78 @@
1
+ /* Round 586 verification: runtime badge outer <g> stacks
2
+ * brightness(1.15) onto the R559 drop-shadow on node hover.
3
+ * 25th anchor in per-element brightness family, 18th in
4
+ * stacked-filter sub-pattern.
5
+ *
6
+ * Test phases:
7
+ * 1. mock 2 idle nodes → runtime badges render
8
+ * 2. rest: filter='none' on outer <g> (no hover), brightness-attr='1'
9
+ * 3. transition-property contains 'filter'
10
+ * 4. source: filter string contains 'brightness(1.15)' stacked
11
+ * onto drop-shadow + data-attr
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-runtime-badge-brightness]', { timeout: 15000, state: 'attached' });
45
+ await page.waitForTimeout(500);
46
+
47
+ const rest = await page.evaluate(() => {
48
+ const el = document.querySelector('[data-runtime-badge-brightness]');
49
+ if (!el) return null;
50
+ const cs = getComputedStyle(el);
51
+ return {
52
+ filter: cs.filter,
53
+ transitionProperty: cs.transitionProperty,
54
+ brightnessAttr: el.getAttribute('data-runtime-badge-brightness'),
55
+ glowAttr: el.getAttribute('data-runtime-badge-glow'),
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: isNodeActive\s*\?\s*`drop-shadow\(0 0 2px \$\{rt\.color\}99\) brightness\(1\.15\)`\s*:\s*undefined/.test(src);
63
+ const sourceAttr = /data-runtime-badge-brightness=\{isNodeActive \? '1\.15' : '1'\}/.test(src);
64
+
65
+ const results = {
66
+ badge_present: !!rest,
67
+ rest_filter_none: rest?.filter === 'none',
68
+ rest_brightness_1: rest?.brightnessAttr === '1',
69
+ rest_glow_false: rest?.glowAttr === 'false',
70
+ transition_has_filter: /filter/.test(rest?.transitionProperty || ''),
71
+ source_filter: sourceFilter,
72
+ source_attr: sourceAttr,
73
+ };
74
+ const ok = Object.values(results).every(Boolean);
75
+ console.log(`${ok ? '✅' : '❌'} R586 runtime-badge brightness (25th anchor, badge 4-axis closure):`,
76
+ JSON.stringify(results, null, 2),
77
+ `\n rest: ${JSON.stringify(rest)}`);
78
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,108 @@
1
+ /* Round 559 verification: runtime badge outer <g> gains drop-shadow
2
+ * glow using rt.color on node hover. 16th anchor in drop-shadow
3
+ * family. Pairs with R208 (ring r+sw) + R443 (icon sw) for 3-axis
4
+ * hover signature.
5
+ *
6
+ * runtimeIdentity('claude-code-cli').color is one of:
7
+ * '#a78bfa', '#38bdf8', '#34d399', '#fbbf24'
8
+ *
9
+ * Test phases:
10
+ * 1. mock sessions with runtime → badge renders
11
+ * 2. rest: outer <g> filter='none', glow attr='false'
12
+ * 3. hover the parent node group → filter contains 'drop-shadow',
13
+ * glow attr='true', and the existing R208 ring r/sw still lift
14
+ * 4. source: drop-shadow with rt.color hex+99 alpha + transition
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
+ // Use claude-code-cli runtime so the runtime badge renders.
33
+ await ctx.route('**/api/hub/status*', async (route) => {
34
+ const r = await route.fetch();
35
+ const b = await r.json();
36
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
37
+ const mk = (alias) => ({
38
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
39
+ network_id: nid, project_dir: null,
40
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
41
+ });
42
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
43
+ });
44
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
45
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
46
+ const page = await ctx.newPage();
47
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
48
+ await page.waitForSelector('[data-runtime-badge="a·1"]', { timeout: 15000 });
49
+ await page.waitForTimeout(500);
50
+
51
+ // The outer <g> wrapping the runtime badge carries the glow filter.
52
+ // We can locate it via the parent of the [data-runtime-badge] circle.
53
+ const probe = async (state) => {
54
+ return page.evaluate(() => {
55
+ const circle = document.querySelector('[data-runtime-badge="a·1"]');
56
+ if (!circle) return null;
57
+ const outerG = circle.parentElement;
58
+ if (!outerG) return null;
59
+ const cs = getComputedStyle(outerG);
60
+ const ringCs = getComputedStyle(circle);
61
+ return {
62
+ outerFilter: cs.filter,
63
+ outerTransitionProperty: cs.transitionProperty,
64
+ outerTransitionDuration: cs.transitionDuration,
65
+ glowAttr: outerG.getAttribute('data-runtime-badge-glow'),
66
+ ringR: ringCs.r,
67
+ ringSw: ringCs.strokeWidth,
68
+ activeAttr: circle.getAttribute('data-runtime-badge-active'),
69
+ };
70
+ });
71
+ };
72
+
73
+ const rest = await probe();
74
+
75
+ await page.hover('g[data-node="a·1"]');
76
+ await page.waitForTimeout(400);
77
+ const hover = await probe();
78
+
79
+ await browser.close();
80
+
81
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
82
+ const sourceFilter = /filter: isNodeActive\s*\?\s*`drop-shadow\(0 0 2px \$\{rt\.color\}99\)`\s*:\s*undefined,/.test(src);
83
+ const sourceTransition = /transition: 'filter 150ms ease-out',/.test(src);
84
+ const sourceGlowAttr = /data-runtime-badge-glow=\{isNodeActive \? 'true' : 'false'\}/.test(src);
85
+
86
+ const results = {
87
+ rest_filter_none: rest?.outerFilter === 'none',
88
+ rest_glow_false: rest?.glowAttr === 'false',
89
+ rest_ring_r_7: rest?.ringR === '7px',
90
+ rest_ring_sw_1_5: rest?.ringSw === '1.5px',
91
+ rest_active_false: rest?.activeAttr === 'false',
92
+ hover_filter_dropshadow: /drop-shadow\(/.test(hover?.outerFilter || ''),
93
+ hover_glow_true: hover?.glowAttr === 'true',
94
+ hover_ring_r_8: hover?.ringR === '8px', // R208 still lifts
95
+ hover_ring_sw_2: hover?.ringSw === '2px', // R208 still lifts
96
+ hover_active_true: hover?.activeAttr === 'true',
97
+ transition_has_filter: /filter/.test(rest?.outerTransitionProperty || ''),
98
+ transition_duration: rest?.outerTransitionDuration === '0.15s',
99
+ source_filter: sourceFilter,
100
+ source_transition: sourceTransition,
101
+ source_glow_attr: sourceGlowAttr,
102
+ };
103
+ const ok = Object.values(results).every(Boolean);
104
+ console.log(`${ok ? '✅' : '❌'} R559 runtime badge drop-shadow glow (16th anchor):`,
105
+ JSON.stringify(results, null, 2),
106
+ `\n rest: ${JSON.stringify(rest)}`,
107
+ `\n hover: ${JSON.stringify(hover)}`);
108
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,87 @@
1
+ /* Round 656 — runtime badge filter gains a SECOND outer drop-shadow
2
+ * at 4px + 0x4c alpha (half R559 inner 0x99). 15th anchor in multi-
3
+ * layer halo family (1st per-node-badge anchor).
4
+ */
5
+ import { chromium } from 'playwright';
6
+ import { readFileSync } from 'node:fs';
7
+
8
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
9
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
10
+
11
+ const browser = await chromium.launch({ headless: true });
12
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
13
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
14
+ await ctx.addInitScript(() => {
15
+ try {
16
+ localStorage.setItem('anet-theme', 'cyber');
17
+ localStorage.setItem('anet-topo-layout', 'ring');
18
+ sessionStorage.setItem('anet_v3_auth', '1');
19
+ } catch {}
20
+ });
21
+ await ctx.route('**/api/hub/status*', async (route) => {
22
+ const r = await route.fetch();
23
+ const b = await r.json();
24
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
25
+ const mk = (alias) => ({
26
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
27
+ network_id: nid, project_dir: null,
28
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
29
+ });
30
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
31
+ });
32
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
33
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
34
+ const page = await ctx.newPage();
35
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
36
+ await page.waitForSelector('[data-runtime-badge-halo-layers]', { timeout: 15000, state: 'attached' });
37
+ await page.waitForTimeout(500);
38
+
39
+ const restBadges = await page.evaluate(() => {
40
+ return Array.from(document.querySelectorAll('[data-runtime-badge-halo-layers]')).map(el => ({
41
+ layers: el.getAttribute('data-runtime-badge-halo-layers'),
42
+ glow: el.getAttribute('data-runtime-badge-glow'),
43
+ }));
44
+ });
45
+
46
+ // Open chat to fire isNodeActive (chat-gated per R620)
47
+ await page.click('[data-node="a·1"]', { force: true });
48
+ await page.waitForTimeout(400);
49
+
50
+ const activeState = await page.evaluate(() => {
51
+ const node = document.querySelector('[data-node="a·1"]');
52
+ if (!node) return null;
53
+ const badge = node.querySelector('[data-runtime-badge-halo-layers]');
54
+ if (!badge) return null;
55
+ const cs = getComputedStyle(badge);
56
+ return {
57
+ layers: badge.getAttribute('data-runtime-badge-halo-layers'),
58
+ glow: badge.getAttribute('data-runtime-badge-glow'),
59
+ filter: cs.filter,
60
+ };
61
+ });
62
+
63
+ await browser.close();
64
+
65
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
66
+ const sourceFilter = /`drop-shadow\(0 0 2px \$\{rt\.color\}99\) drop-shadow\(0 0 4px \$\{rt\.color\}4c\) brightness\(1\.15\)`/.test(src);
67
+ const sourceLayersAttr = /data-runtime-badge-halo-layers=\{isNodeActive \? '2' : '0'\}/.test(src);
68
+
69
+ const dropShadowCount = (activeState?.filter?.match(/drop-shadow/g) || []).length;
70
+ const restAllZero = restBadges.every(b => b.layers === '0' && b.glow === 'false');
71
+
72
+ const results = {
73
+ badges_present: restBadges.length >= 2,
74
+ rest_all_zero: restAllZero,
75
+ active_present: !!activeState,
76
+ active_layers_2: activeState?.layers === '2',
77
+ active_glow_true: activeState?.glow === 'true',
78
+ active_two_dropshadows: dropShadowCount === 2,
79
+ source_filter: sourceFilter,
80
+ source_layers_attr: sourceLayersAttr,
81
+ };
82
+ const ok = Object.values(results).every(Boolean);
83
+ console.log(`${ok ? '✅' : '❌'} R656 runtime badge multi-layer halo (1st per-node-badge anchor):`,
84
+ JSON.stringify(results, null, 2),
85
+ `\n rest: ${JSON.stringify(restBadges)}`,
86
+ `\n active: ${JSON.stringify(activeState)}`);
87
+ process.exit(ok ? 0 : 1);