@sleep2agi/agent-network-dashboard 0.5.3-preview.99 → 0.5.4

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 (410) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +2 -0
  3. package/.next/build-manifest.json +3 -3
  4. package/.next/diagnostics/route-bundle-stats.json +35 -35
  5. package/.next/fallback-build-manifest.json +3 -3
  6. package/.next/prerender-manifest.json +29 -0
  7. package/.next/routes-manifest.json +12 -0
  8. package/.next/server/app/_global-error.html +1 -1
  9. package/.next/server/app/_global-error.rsc +2 -2
  10. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_full.segment.rsc +2 -2
  12. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  13. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  14. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  15. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  16. package/.next/server/app/_not-found.html +2 -2
  17. package/.next/server/app/_not-found.rsc +13 -13
  18. package/.next/server/app/_not-found.segments/_full.segment.rsc +13 -13
  19. package/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
  20. package/.next/server/app/_not-found.segments/_index.segment.rsc +7 -7
  21. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  22. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  23. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  24. package/.next/server/app/admin/page_client-reference-manifest.js +1 -1
  25. package/.next/server/app/admin.html +2 -2
  26. package/.next/server/app/admin.rsc +15 -15
  27. package/.next/server/app/admin.segments/_full.segment.rsc +15 -15
  28. package/.next/server/app/admin.segments/_head.segment.rsc +4 -4
  29. package/.next/server/app/admin.segments/_index.segment.rsc +7 -7
  30. package/.next/server/app/admin.segments/_tree.segment.rsc +2 -2
  31. package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +4 -4
  32. package/.next/server/app/admin.segments/admin.segment.rsc +3 -3
  33. package/.next/server/app/api/hub/upload/route/app-paths-manifest.json +3 -0
  34. package/.next/server/app/api/hub/upload/route/build-manifest.json +9 -0
  35. package/.next/server/app/api/hub/upload/route/server-reference-manifest.json +4 -0
  36. package/.next/server/app/api/hub/upload/route.js +7 -0
  37. package/.next/server/app/api/hub/upload/route.js.map +5 -0
  38. package/.next/server/app/api/hub/upload/route.js.nft.json +1 -0
  39. package/.next/server/app/api/hub/upload/route_client-reference-manifest.js +3 -0
  40. package/.next/server/app/index.html +2 -2
  41. package/.next/server/app/index.rsc +15 -15
  42. package/.next/server/app/index.segments/__PAGE__.segment.rsc +4 -4
  43. package/.next/server/app/index.segments/_full.segment.rsc +15 -15
  44. package/.next/server/app/index.segments/_head.segment.rsc +4 -4
  45. package/.next/server/app/index.segments/_index.segment.rsc +7 -7
  46. package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  47. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  48. package/.next/server/app/login.html +2 -2
  49. package/.next/server/app/login.rsc +15 -15
  50. package/.next/server/app/login.segments/_full.segment.rsc +15 -15
  51. package/.next/server/app/login.segments/_head.segment.rsc +4 -4
  52. package/.next/server/app/login.segments/_index.segment.rsc +7 -7
  53. package/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  54. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +4 -4
  55. package/.next/server/app/login.segments/login.segment.rsc +3 -3
  56. package/.next/server/app/logs/page_client-reference-manifest.js +1 -1
  57. package/.next/server/app/logs.html +2 -2
  58. package/.next/server/app/logs.rsc +15 -15
  59. package/.next/server/app/logs.segments/_full.segment.rsc +15 -15
  60. package/.next/server/app/logs.segments/_head.segment.rsc +4 -4
  61. package/.next/server/app/logs.segments/_index.segment.rsc +7 -7
  62. package/.next/server/app/logs.segments/_tree.segment.rsc +2 -2
  63. package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +4 -4
  64. package/.next/server/app/logs.segments/logs.segment.rsc +3 -3
  65. package/.next/server/app/manifest.webmanifest/route/app-paths-manifest.json +3 -0
  66. package/.next/server/app/manifest.webmanifest/route/build-manifest.json +9 -0
  67. package/.next/server/app/manifest.webmanifest/route/server-reference-manifest.json +4 -0
  68. package/.next/server/app/manifest.webmanifest/route.js +8 -0
  69. package/.next/server/app/manifest.webmanifest/route.js.map +5 -0
  70. package/.next/server/app/manifest.webmanifest/route.js.nft.json +1 -0
  71. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +3 -0
  72. package/.next/server/app/manifest.webmanifest.body +1 -0
  73. package/.next/server/app/manifest.webmanifest.meta +1 -0
  74. package/.next/server/app/messages/page_client-reference-manifest.js +1 -1
  75. package/.next/server/app/messages.html +2 -2
  76. package/.next/server/app/messages.rsc +15 -15
  77. package/.next/server/app/messages.segments/_full.segment.rsc +15 -15
  78. package/.next/server/app/messages.segments/_head.segment.rsc +4 -4
  79. package/.next/server/app/messages.segments/_index.segment.rsc +7 -7
  80. package/.next/server/app/messages.segments/_tree.segment.rsc +2 -2
  81. package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +4 -4
  82. package/.next/server/app/messages.segments/messages.segment.rsc +3 -3
  83. package/.next/server/app/node/page_client-reference-manifest.js +1 -1
  84. package/.next/server/app/node.html +2 -2
  85. package/.next/server/app/node.rsc +15 -15
  86. package/.next/server/app/node.segments/_full.segment.rsc +15 -15
  87. package/.next/server/app/node.segments/_head.segment.rsc +4 -4
  88. package/.next/server/app/node.segments/_index.segment.rsc +7 -7
  89. package/.next/server/app/node.segments/_tree.segment.rsc +2 -2
  90. package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +4 -4
  91. package/.next/server/app/node.segments/node.segment.rsc +3 -3
  92. package/.next/server/app/nodes/page_client-reference-manifest.js +1 -1
  93. package/.next/server/app/nodes.html +2 -2
  94. package/.next/server/app/nodes.rsc +15 -15
  95. package/.next/server/app/nodes.segments/_full.segment.rsc +15 -15
  96. package/.next/server/app/nodes.segments/_head.segment.rsc +4 -4
  97. package/.next/server/app/nodes.segments/_index.segment.rsc +7 -7
  98. package/.next/server/app/nodes.segments/_tree.segment.rsc +2 -2
  99. package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +4 -4
  100. package/.next/server/app/nodes.segments/nodes.segment.rsc +3 -3
  101. package/.next/server/app/page_client-reference-manifest.js +1 -1
  102. package/.next/server/app/server-logs/page_client-reference-manifest.js +1 -1
  103. package/.next/server/app/server-logs.html +2 -2
  104. package/.next/server/app/server-logs.rsc +15 -15
  105. package/.next/server/app/server-logs.segments/_full.segment.rsc +15 -15
  106. package/.next/server/app/server-logs.segments/_head.segment.rsc +4 -4
  107. package/.next/server/app/server-logs.segments/_index.segment.rsc +7 -7
  108. package/.next/server/app/server-logs.segments/_tree.segment.rsc +2 -2
  109. package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +4 -4
  110. package/.next/server/app/server-logs.segments/server-logs.segment.rsc +3 -3
  111. package/.next/server/app/settings/networks/page_client-reference-manifest.js +1 -1
  112. package/.next/server/app/settings/networks.html +2 -2
  113. package/.next/server/app/settings/networks.rsc +15 -15
  114. package/.next/server/app/settings/networks.segments/_full.segment.rsc +15 -15
  115. package/.next/server/app/settings/networks.segments/_head.segment.rsc +4 -4
  116. package/.next/server/app/settings/networks.segments/_index.segment.rsc +7 -7
  117. package/.next/server/app/settings/networks.segments/_tree.segment.rsc +2 -2
  118. package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +4 -4
  119. package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +3 -3
  120. package/.next/server/app/settings/networks.segments/settings.segment.rsc +3 -3
  121. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  122. package/.next/server/app/settings/tokens/page_client-reference-manifest.js +1 -1
  123. package/.next/server/app/settings/tokens.html +2 -2
  124. package/.next/server/app/settings/tokens.rsc +15 -15
  125. package/.next/server/app/settings/tokens.segments/_full.segment.rsc +15 -15
  126. package/.next/server/app/settings/tokens.segments/_head.segment.rsc +4 -4
  127. package/.next/server/app/settings/tokens.segments/_index.segment.rsc +7 -7
  128. package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +2 -2
  129. package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +4 -4
  130. package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +3 -3
  131. package/.next/server/app/settings/tokens.segments/settings.segment.rsc +3 -3
  132. package/.next/server/app/settings.html +2 -2
  133. package/.next/server/app/settings.rsc +15 -15
  134. package/.next/server/app/settings.segments/_full.segment.rsc +15 -15
  135. package/.next/server/app/settings.segments/_head.segment.rsc +4 -4
  136. package/.next/server/app/settings.segments/_index.segment.rsc +7 -7
  137. package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  138. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +4 -4
  139. package/.next/server/app/settings.segments/settings.segment.rsc +3 -3
  140. package/.next/server/app/tasks/[id]/page_client-reference-manifest.js +1 -1
  141. package/.next/server/app/tasks/page_client-reference-manifest.js +1 -1
  142. package/.next/server/app/tasks.html +2 -2
  143. package/.next/server/app/tasks.rsc +15 -15
  144. package/.next/server/app/tasks.segments/_full.segment.rsc +15 -15
  145. package/.next/server/app/tasks.segments/_head.segment.rsc +4 -4
  146. package/.next/server/app/tasks.segments/_index.segment.rsc +7 -7
  147. package/.next/server/app/tasks.segments/_tree.segment.rsc +2 -2
  148. package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +4 -4
  149. package/.next/server/app/tasks.segments/tasks.segment.rsc +3 -3
  150. package/.next/server/app-paths-manifest.json +2 -0
  151. package/.next/server/chunks/00jm_next_dist_0ju_ux9._.js +18 -0
  152. package/.next/server/chunks/00jm_next_dist_0ju_ux9._.js.map +1 -0
  153. package/.next/server/chunks/0ykm__next-internal_server_app_api_hub_upload_route_actions_03_eqnf.js +3 -0
  154. package/.next/server/chunks/0ykm__next-internal_server_app_manifest_webmanifest_route_actions_0m16rb8.js +3 -0
  155. package/.next/server/chunks/0ykm__next-internal_server_app_manifest_webmanifest_route_actions_0m16rb8.js.map +1 -0
  156. package/.next/server/chunks/{[externals]__11vad82._.js → [externals]__036g1.i._.js} +2 -2
  157. package/.next/server/chunks/[externals]__036g1.i._.js.map +1 -0
  158. package/.next/server/chunks/[root-of-the-server]__0-8_f0o._.js +3 -0
  159. package/.next/server/chunks/[root-of-the-server]__0-8_f0o._.js.map +1 -0
  160. package/.next/server/chunks/{[root-of-the-server]__08uyvdq._.js → [root-of-the-server]__0jndzts._.js} +2 -2
  161. package/.next/server/chunks/{[root-of-the-server]__08uyvdq._.js.map → [root-of-the-server]__0jndzts._.js.map} +1 -1
  162. package/.next/server/chunks/[root-of-the-server]__0mxw4vb._.js +1 -1
  163. package/.next/server/chunks/[root-of-the-server]__0mxw4vb._.js.map +1 -1
  164. package/.next/server/chunks/[root-of-the-server]__0tx8s8i._.js +1 -1
  165. package/.next/server/chunks/[root-of-the-server]__0tx8s8i._.js.map +1 -1
  166. package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0..ddwm.js +1 -1
  167. package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0..ddwm.js.map +1 -1
  168. package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_02bxi6j.js +1 -1
  169. package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_02bxi6j.js.map +1 -1
  170. package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_05oassd.js +1 -1
  171. package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_05oassd.js.map +1 -1
  172. package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_05vxtby.js +1 -1
  173. package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_05vxtby.js.map +1 -1
  174. package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_05~eml4.js +1 -1
  175. package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_05~eml4.js.map +1 -1
  176. package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0_-g_q2.js +1 -1
  177. package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0_-g_q2.js.map +1 -1
  178. package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0_ec0xu.js +1 -1
  179. package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0_ec0xu.js.map +1 -1
  180. package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0czb6wz.js +1 -1
  181. package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0czb6wz.js.map +1 -1
  182. package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0e-cn.p.js +1 -1
  183. package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0e-cn.p.js.map +1 -1
  184. package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0k8_sr8.js +1 -1
  185. package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0k8_sr8.js.map +1 -1
  186. package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0lt_3bw.js +1 -1
  187. package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0lt_3bw.js.map +1 -1
  188. package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0uyh3yt.js +1 -1
  189. package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0uyh3yt.js.map +1 -1
  190. package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0v-a2ps.js +1 -1
  191. package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0v-a2ps.js.map +1 -1
  192. package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_12.4r9~.js +1 -1
  193. package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_12.4r9~.js.map +1 -1
  194. package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_13mqkay.js +1 -1
  195. package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_13mqkay.js.map +1 -1
  196. package/.next/server/chunks/ssr/[root-of-the-server]__030vg4n._.js +4 -1
  197. package/.next/server/chunks/ssr/[root-of-the-server]__030vg4n._.js.map +1 -1
  198. package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js +1 -1
  199. package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js.map +1 -1
  200. package/.next/server/chunks/ssr/[root-of-the-server]__0u5aqkk._.js +1 -1
  201. package/.next/server/chunks/ssr/[root-of-the-server]__0u5aqkk._.js.map +1 -1
  202. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js +3 -3
  203. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js.map +1 -1
  204. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js +1 -1
  205. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js.map +1 -1
  206. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js +1 -1
  207. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js.map +1 -1
  208. package/.next/server/chunks/ssr/agent-network-dashboard_app_components_0mvyi-4._.js +1 -1
  209. package/.next/server/chunks/ssr/agent-network-dashboard_app_components_0mvyi-4._.js.map +1 -1
  210. package/.next/server/middleware-build-manifest.js +3 -3
  211. package/.next/server/middleware.js +2 -2
  212. package/.next/server/middleware.js.nft.json +1 -1
  213. package/.next/server/pages/404.html +2 -2
  214. package/.next/server/pages/500.html +1 -1
  215. package/.next/static/chunks/{07~8sx3_5uiox.js → 04wjx7vbxusw5.js} +4 -1
  216. package/.next/static/chunks/089t1exs6apb8.js +4 -0
  217. package/.next/static/chunks/{084e1mr6acfta.js → 09e8kxo30n5cf.js} +1 -1
  218. package/.next/static/chunks/{0v4-5tng.uh.7.js → 0k-c1chkvf78s.js} +2 -2
  219. package/.next/static/chunks/0v2~nlpk-cx6v.css +2 -0
  220. package/.next/static/chunks/0xsye-9kffdi0.js +1 -0
  221. package/.next/static/chunks/0~rx_~akeylmq.js +1 -0
  222. package/.next/trace +2 -2
  223. package/.next/trace-build +1 -1
  224. package/.next/types/routes.d.ts +2 -1
  225. package/.next/types/validator.ts +9 -0
  226. package/app/api/hub/send/route.ts +11 -2
  227. package/app/api/hub/servers/route.ts +3 -29
  228. package/app/api/hub/upload/route.ts +83 -0
  229. package/app/components/AppShell.tsx +3 -1
  230. package/app/components/MobileNav.tsx +45 -0
  231. package/app/components/TaskChatPanel.tsx +130 -6
  232. package/app/components/TopoGraph.tsx +4591 -216
  233. package/app/globals.css +839 -0
  234. package/app/layout.tsx +6 -0
  235. package/app/lib/serverDedupe.ts +122 -0
  236. package/app/lib/vendorIdentity.ts +74 -56
  237. package/app/manifest.ts +23 -0
  238. package/package.json +4 -4
  239. package/public/vendors/claude.svg +7 -8
  240. package/public/vendors/minimax.svg +8 -9
  241. package/public/vendors/openai.svg +8 -10
  242. package/scripts/p157-rc2-dedup-test.mjs +110 -0
  243. package/scripts/topo-a11y-titles-catalog-test.mjs +132 -0
  244. package/scripts/topo-active-links-chip-halo-layers-test.mjs +81 -0
  245. package/scripts/topo-alias-chat-brightness-test.mjs +79 -0
  246. package/scripts/topo-alias-text-halo-layers-test.mjs +98 -0
  247. package/scripts/topo-animation-temporal-modes-catalog-test.mjs +144 -0
  248. package/scripts/topo-avatar-chat-gate-test.mjs +77 -0
  249. package/scripts/topo-avatar-drop-shadow-test.mjs +86 -0
  250. package/scripts/topo-avatar-fallback-rotate-test.mjs +92 -0
  251. package/scripts/topo-avatar-rotate-test.mjs +85 -0
  252. package/scripts/topo-avatar-scale-test.mjs +89 -0
  253. package/scripts/topo-badge-chat-gate-test.mjs +74 -0
  254. package/scripts/topo-brand-drop-shadow-test.mjs +71 -0
  255. package/scripts/topo-brand-logo-halo-layers-test.mjs +85 -0
  256. package/scripts/topo-canvas-desc-a11y-test.mjs +87 -0
  257. package/scripts/topo-canvas-entrance-animation-test.mjs +117 -0
  258. package/scripts/topo-canvas-scan-beam-diagonal-test.mjs +148 -0
  259. package/scripts/topo-canvas-scan-beam-test.mjs +109 -0
  260. package/scripts/topo-canvas-scan-beam-vertical-test.mjs +123 -0
  261. package/scripts/topo-card-chat-brightness-test.mjs +86 -0
  262. package/scripts/topo-chat-ring-breath-curve-test.mjs +114 -0
  263. package/scripts/topo-chat-ring-brightness-test.mjs +80 -0
  264. package/scripts/topo-chat-ring-halo-layers-test.mjs +100 -0
  265. package/scripts/topo-chat-ring-r-breath-test.mjs +121 -0
  266. package/scripts/topo-chat-ring-status-halo-test.mjs +106 -0
  267. package/scripts/topo-chat-ring-sw-breath-test.mjs +123 -0
  268. package/scripts/topo-chip-pin-halo-test.mjs +85 -0
  269. package/scripts/topo-chrome-control-halo-layers-test.mjs +22 -0
  270. package/scripts/topo-chrome-fullscreen-breath-test.mjs +121 -0
  271. package/scripts/topo-chrome-layout-trailer-breath-test.mjs +86 -0
  272. package/scripts/topo-chrome-nodesize-trailer-breath-test.mjs +86 -0
  273. package/scripts/topo-chrome-reset-breath-test.mjs +115 -0
  274. package/scripts/topo-chrome-strip-entrance-animation-test.mjs +115 -0
  275. package/scripts/topo-chrome-wrapper-halo-test.mjs +83 -0
  276. package/scripts/topo-chrome-zoom-wrapper-breath-test.mjs +85 -0
  277. package/scripts/topo-click-ripple-glow-test.mjs +86 -0
  278. package/scripts/topo-click-ripple-halo-layers-test.mjs +79 -0
  279. package/scripts/topo-click-ripple-sw-test.mjs +110 -0
  280. package/scripts/topo-crescent-envelope-breath-test.mjs +103 -0
  281. package/scripts/topo-dense-alias-chat-halo-test.mjs +73 -0
  282. package/scripts/topo-dense-alias-halo-layers-test.mjs +80 -0
  283. package/scripts/topo-dual-axis-surfaces-catalog-test.mjs +94 -0
  284. package/scripts/topo-edge-badge-circle-brightness-test.mjs +82 -0
  285. package/scripts/topo-edge-badge-circle-hot-pulse-test.mjs +100 -0
  286. package/scripts/topo-edge-badge-digit-halo-layers-test.mjs +107 -0
  287. package/scripts/topo-edge-badge-endpoint-gate-test.mjs +94 -0
  288. package/scripts/topo-edge-badge-halo-layers-test.mjs +85 -0
  289. package/scripts/topo-edge-badge-hot-pulse-test.mjs +92 -0
  290. package/scripts/topo-edge-chat-gate-test.mjs +71 -0
  291. package/scripts/topo-edge-flow-rail-halo-layers-test.mjs +89 -0
  292. package/scripts/topo-edge-particle-halo-layers-test.mjs +91 -0
  293. package/scripts/topo-edge-pin-halo-test.mjs +99 -0
  294. package/scripts/topo-edge-visible-halo-layers-test.mjs +87 -0
  295. package/scripts/topo-endpoint-ring-flow-halo-test.mjs +107 -0
  296. package/scripts/topo-endpoint-ring-halo-layers-test.mjs +100 -0
  297. package/scripts/topo-filter-pill-halo-layers-test.mjs +27 -0
  298. package/scripts/topo-flow-arrow-brightness-test.mjs +82 -0
  299. package/scripts/topo-fullscreen-brightness-test.mjs +84 -0
  300. package/scripts/topo-group-box-brightness-test.mjs +84 -0
  301. package/scripts/topo-group-box-halo-layers-test.mjs +91 -0
  302. package/scripts/topo-group-chat-gate-test.mjs +77 -0
  303. package/scripts/topo-group-label-halo-layers-test.mjs +78 -0
  304. package/scripts/topo-group-tint-brightness-test.mjs +82 -0
  305. package/scripts/topo-h2-dual-axis-breath-test.mjs +92 -0
  306. package/scripts/topo-h2-triple-axis-breath-test.mjs +142 -0
  307. package/scripts/topo-halo-chat-gate-test.mjs +72 -0
  308. package/scripts/topo-hover-detail-halo-test.mjs +76 -0
  309. package/scripts/topo-hub-a11y-title-test.mjs +95 -0
  310. package/scripts/topo-hub-core-brightness-test.mjs +82 -0
  311. package/scripts/topo-hub-core-halo-layers-test.mjs +81 -0
  312. package/scripts/topo-hub-digit-halo-layers-test.mjs +76 -0
  313. package/scripts/topo-hub-halo-halo-layers-test.mjs +76 -0
  314. package/scripts/topo-hub-highlight-halo-layers-test.mjs +78 -0
  315. package/scripts/topo-hub-hover-ring-halo-layers-test.mjs +71 -0
  316. package/scripts/topo-hub-spoke-halo-layers-test.mjs +97 -0
  317. package/scripts/topo-hub-spoke-self-filter-test.mjs +119 -0
  318. package/scripts/topo-kicker-breath-test.mjs +100 -0
  319. package/scripts/topo-kicker-dual-axis-breath-test.mjs +81 -0
  320. package/scripts/topo-kicker-halo-layers-test.mjs +82 -0
  321. package/scripts/topo-kicker-triple-axis-breath-test.mjs +124 -0
  322. package/scripts/topo-label-card-brightness-test.mjs +81 -0
  323. package/scripts/topo-layout-toggle-brightness-test.mjs +94 -0
  324. package/scripts/topo-layout-toggle-halo-layers-test.mjs +95 -0
  325. package/scripts/topo-legend-count-brightness-test.mjs +80 -0
  326. package/scripts/topo-legend-count-halo-layers-test.mjs +79 -0
  327. package/scripts/topo-legend-panel-title-breath-test.mjs +86 -0
  328. package/scripts/topo-legend-pin-ring-brightness-test.mjs +82 -0
  329. package/scripts/topo-legend-pin-ring-halo-layers-test.mjs +71 -0
  330. package/scripts/topo-legend-row-count-brightness-test.mjs +85 -0
  331. package/scripts/topo-legend-tint-brightness-test.mjs +83 -0
  332. package/scripts/topo-legend-trio-halo-layers-test.mjs +22 -0
  333. package/scripts/topo-live-lanes.mjs +48 -0
  334. package/scripts/topo-minimap-container-halo-test.mjs +82 -0
  335. package/scripts/topo-minimap-dot-chat-gate-test.mjs +81 -0
  336. package/scripts/topo-minimap-viewport-brightness-test.mjs +84 -0
  337. package/scripts/topo-minimap-viewport-halo-layers-test.mjs +24 -0
  338. package/scripts/topo-more-footer-brightness-test.mjs +94 -0
  339. package/scripts/topo-node-avatar-halo-layers-test.mjs +25 -0
  340. package/scripts/topo-node-hover-ring-halo-layers-test.mjs +70 -0
  341. package/scripts/topo-node-label-card-halo-test.mjs +76 -0
  342. package/scripts/topo-nodesize-brightness-test.mjs +82 -0
  343. package/scripts/topo-nodesize-halo-layers-test.mjs +89 -0
  344. package/scripts/topo-overlap-test.mjs +22 -8
  345. package/scripts/topo-panel-count-halo-layers-test.mjs +91 -0
  346. package/scripts/topo-panel-rect-halo-test.mjs +90 -0
  347. package/scripts/topo-panel-titles-dual-axis-breath-test.mjs +94 -0
  348. package/scripts/topo-panel-titles-halo-layers-test.mjs +23 -0
  349. package/scripts/topo-panel-titles-triple-axis-breath-test.mjs +161 -0
  350. package/scripts/topo-pip-brightness-test.mjs +85 -0
  351. package/scripts/topo-pressure-bar-halo-layers-test.mjs +19 -0
  352. package/scripts/topo-r717-scan-beam-pair-pattern-test.mjs +100 -0
  353. package/scripts/topo-r717-triple-axis-pair-pattern-test.mjs +113 -0
  354. package/scripts/topo-r717-triple-axis-tier-pattern-test.mjs +117 -0
  355. package/scripts/topo-recent-count-brightness-test.mjs +84 -0
  356. package/scripts/topo-recent-more-halo-layers-test.mjs +90 -0
  357. package/scripts/topo-recent-panel-hot-pulse-test.mjs +105 -0
  358. package/scripts/topo-recent-panel-title-breath-test.mjs +91 -0
  359. package/scripts/topo-recent-pip-halo-layers-test.mjs +82 -0
  360. package/scripts/topo-recent-row-chat-gate-test.mjs +75 -0
  361. package/scripts/topo-recent-row-content-lift-test.mjs +140 -0
  362. package/scripts/topo-recent-row-text-halo-layers-test.mjs +67 -0
  363. package/scripts/topo-recent-tint-brightness-test.mjs +80 -0
  364. package/scripts/topo-recent-ts-brightness-test.mjs +86 -0
  365. package/scripts/topo-reset-brightness-test.mjs +83 -0
  366. package/scripts/topo-respiratory-axis-count-stats-test.mjs +154 -0
  367. package/scripts/topo-respiratory-patterns-catalog-test.mjs +112 -0
  368. package/scripts/topo-respiratory-rolodex-test.mjs +83 -0
  369. package/scripts/topo-respiratory-tiers-catalog-test.mjs +119 -0
  370. package/scripts/topo-respiratory-triple-axis-surfaces-catalog-test.mjs +127 -0
  371. package/scripts/topo-runtime-badge-brightness-test.mjs +78 -0
  372. package/scripts/topo-runtime-badge-halo-layers-test.mjs +87 -0
  373. package/scripts/topo-runtime-badge-rotate-test.mjs +85 -0
  374. package/scripts/topo-section-title-breath-test.mjs +83 -0
  375. package/scripts/topo-section-title-halo-layers-test.mjs +88 -0
  376. package/scripts/topo-spoke-chat-gate-test.mjs +72 -0
  377. package/scripts/topo-status-pin-pill-halo-layers-test.mjs +17 -0
  378. package/scripts/topo-status-ring-chat-gate-test.mjs +72 -0
  379. package/scripts/topo-status-ring-halo-layers-test.mjs +105 -0
  380. package/scripts/topo-status-ring-status-halo-test.mjs +110 -0
  381. package/scripts/topo-sub-text-chat-brightness-test.mjs +81 -0
  382. package/scripts/topo-svg-title-a11y-r731-test.mjs +93 -0
  383. package/scripts/topo-svg-title-a11y-test.mjs +88 -0
  384. package/scripts/topo-title-block-entrance-animation-test.mjs +127 -0
  385. package/scripts/topo-title-block-envelope-breath-test.mjs +87 -0
  386. package/scripts/topo-tree-diag.mjs +95 -0
  387. package/scripts/topo-vendor-chip-halo-layers-test.mjs +18 -0
  388. package/scripts/topo-vendor-chip-pin-halo-test.mjs +88 -0
  389. package/scripts/topo-vendor-count-suffix-halo-layers-test.mjs +79 -0
  390. package/scripts/topo-vendor-distribution-wrapper-halo-test.mjs +93 -0
  391. package/scripts/topo-vendor-letter-halo-layers-test.mjs +93 -0
  392. package/scripts/topo-watermark-dual-axis-breath-test.mjs +88 -0
  393. package/scripts/topo-watermark-envelope-breath-test.mjs +88 -0
  394. package/scripts/topo-watermark-triple-axis-breath-test.mjs +129 -0
  395. package/scripts/topo-working-online-chip-halo-layers-test.mjs +94 -0
  396. package/scripts/topo-zoom-buttons-brightness-test.mjs +94 -0
  397. package/scripts/topo-zoom-in-out-halo-layers-test.mjs +97 -0
  398. package/scripts/topo-zoom-level-breath-test.mjs +87 -0
  399. package/scripts/topo-zoom-level-brightness-test.mjs +83 -0
  400. package/scripts/topo-zoom-level-dual-axis-breath-test.mjs +83 -0
  401. package/scripts/topo-zoom-level-halo-layers-test.mjs +78 -0
  402. package/scripts/topo-zoom-level-triple-axis-breath-test.mjs +148 -0
  403. package/.next/static/chunks/09oxd2mm27b_n.js +0 -1
  404. package/.next/static/chunks/0ots8-uksxz9p.js +0 -4
  405. package/.next/static/chunks/0voxs92keb6tg.js +0 -1
  406. package/.next/static/chunks/13~aih56vx-cf.css +0 -2
  407. /package/.next/server/chunks/{[externals]__11vad82._.js.map → 0ykm__next-internal_server_app_api_hub_upload_route_actions_03_eqnf.js.map} +0 -0
  408. /package/.next/static/{Ha31LjrNJgJIEydZivRlp → xq88BMF7fMUHWh10yaKTn}/_buildManifest.js +0 -0
  409. /package/.next/static/{Ha31LjrNJgJIEydZivRlp → xq88BMF7fMUHWh10yaKTn}/_clientMiddlewareManifest.js +0 -0
  410. /package/.next/static/{Ha31LjrNJgJIEydZivRlp → xq88BMF7fMUHWh10yaKTn}/_ssgManifest.js +0 -0
@@ -0,0 +1,93 @@
1
+ /* Round 676 — vendor letter glyph (the per-vendor brand initial in
2
+ * the distribution chip) gains multi-layer halo on hover using its
3
+ * OWN per-vendor color (v.color) as tint. 35th anchor in family —
4
+ * first per-vendor anchor. Sibling to R671 legend-row count's per-
5
+ * tier row.fill pattern.
6
+ *
7
+ * Source assertions:
8
+ * - filter chain uses v.color at 0x80 + 0x40 with 2+4 stride,
9
+ * gated on hoveredVendor === v.initial
10
+ * - transition list extends with 'filter 200ms ease-out'
11
+ * - data-vendor-letter-glyph-halo-layers attr toggles '2' ↔ '0'
12
+ *
13
+ * Runtime assertions:
14
+ * - vendor letter glyphs present in chip-row distribution chip
15
+ * - rest state: halo-layers='0' on all glyphs
16
+ * - hover gate consistency: hover='true' ↔ halo-layers='2'
17
+ */
18
+ import { chromium } from 'playwright';
19
+ import { readFileSync } from 'node:fs';
20
+
21
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
22
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
23
+
24
+ const browser = await chromium.launch({ headless: true });
25
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
26
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
27
+ await ctx.addInitScript(() => {
28
+ try {
29
+ localStorage.setItem('anet-theme', 'cyber');
30
+ localStorage.setItem('anet-topo-layout', 'ring');
31
+ sessionStorage.setItem('anet_v3_auth', '1');
32
+ } catch {}
33
+ });
34
+ await ctx.route('**/api/hub/status*', async (route) => {
35
+ const r = await route.fetch();
36
+ const b = await r.json();
37
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
38
+ // 3 vendors: Claude (claude-opus-4), GPT (gpt-4o), Gemini (gemini-pro)
39
+ // so the vendor distribution chip surfaces multiple letters
40
+ const mk = (alias, model) => ({
41
+ alias, status: 'idle', model, runtime: 'claude-code-cli',
42
+ network_id: nid, project_dir: null,
43
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
44
+ });
45
+ await route.fulfill({ response: r, json: { ...b, sessions: [
46
+ mk('a·1', 'claude-opus-4'),
47
+ mk('a·2', 'gpt-4o'),
48
+ mk('a·3', 'gemini-pro'),
49
+ mk('a·4', 'claude-opus-4'),
50
+ ] } });
51
+ });
52
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
53
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
54
+ const page = await ctx.newPage();
55
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
56
+ await page.waitForSelector('[data-vendor-letter-glyph]', { timeout: 15000, state: 'attached' });
57
+ await page.waitForTimeout(500);
58
+
59
+ const restState = await page.evaluate(() => {
60
+ return Array.from(document.querySelectorAll('[data-vendor-letter-glyph]')).map(el => ({
61
+ initial: el.getAttribute('data-vendor-letter-glyph'),
62
+ hover: el.getAttribute('data-vendor-letter-glyph-hover'),
63
+ layers: el.getAttribute('data-vendor-letter-glyph-halo-layers'),
64
+ }));
65
+ });
66
+
67
+ await browser.close();
68
+
69
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
70
+ const sourceFilter = /filter: hoveredVendor === v\.initial \? `drop-shadow\(0 0 2px \$\{v\.color\}80\) drop-shadow\(0 0 4px \$\{v\.color\}40\) brightness\(1\.15\)` : undefined/.test(src);
71
+ const sourceLayersAttr = /data-vendor-letter-glyph-halo-layers=\{hoveredVendor === v\.initial \? '2' : '0'\}/.test(src);
72
+ const sourceTransition = /transition: 'transform 200ms ease-out, filter 200ms ease-out'/.test(src);
73
+
74
+ // Gate consistency: hover ↔ layers must agree on every glyph.
75
+ const allConsistent = restState.every(e =>
76
+ (e.hover === 'false' && e.layers === '0') ||
77
+ (e.hover === 'true' && e.layers === '2')
78
+ );
79
+
80
+ const results = {
81
+ glyphs_present: restState.length >= 2,
82
+ rest_all_layers_zero: restState.every(e => e.layers === '0'),
83
+ rest_all_hover_false: restState.every(e => e.hover === 'false'),
84
+ rest_gate_consistent: allConsistent,
85
+ source_filter: sourceFilter,
86
+ source_layers_attr: sourceLayersAttr,
87
+ source_transition: sourceTransition,
88
+ };
89
+ const ok = Object.values(results).every(Boolean);
90
+ console.log(`${ok ? '✅' : '❌'} R676 vendor letter glyph multi-layer halo (per-vendor v.color tint):`,
91
+ JSON.stringify(results, null, 2),
92
+ `\n rest: ${JSON.stringify(restState)}`);
93
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,88 @@
1
+ /* Round 712 — watermark dual-axis breath. R519 6s opacity breath +
2
+ * R712 6s letter-spacing breath, both via SVG <animate>, both on
3
+ * the same <text> element, both at 6s cadence → in-phase dual-axis.
4
+ * Mirror to R711 H2 dual-axis on a different primary-identity surface.
5
+ *
6
+ * Assertions:
7
+ * - watermark text element present
8
+ * - R519 opacity <animate> child still present (regression)
9
+ * - R712 letter-spacing <animate> child present
10
+ * - both animates have dur="6s"
11
+ * - both have repeatCount="indefinite"
12
+ * - R712 values "0.45;0.55;0.45"
13
+ * - source has the two animate elements paired
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-brand-watermark]', { timeout: 15000, state: 'attached' });
47
+ await page.waitForTimeout(300);
48
+
49
+ const runtimeState = await page.evaluate(() => {
50
+ const text = document.querySelector('[data-topo-brand-watermark]');
51
+ if (!text) return null;
52
+ const opacityAnim = text.querySelector('animate[attributeName="opacity"]');
53
+ const lsAnim = text.querySelector('animate[attributeName="letter-spacing"]');
54
+ return {
55
+ text_present: true,
56
+ opacity_anim_present: !!opacityAnim,
57
+ opacity_dur: opacityAnim?.getAttribute('dur'),
58
+ opacity_values: opacityAnim?.getAttribute('values'),
59
+ ls_anim_present: !!lsAnim,
60
+ ls_dur: lsAnim?.getAttribute('dur'),
61
+ ls_values: lsAnim?.getAttribute('values'),
62
+ ls_repeat: lsAnim?.getAttribute('repeatCount'),
63
+ };
64
+ });
65
+
66
+ await browser.close();
67
+
68
+ const tsxSrc = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
69
+ const tsxR519Preserved = /<animate attributeName="opacity" values="0\.32;0\.48;0\.32" dur="6s" repeatCount="indefinite" \/>/.test(tsxSrc);
70
+ const tsxR712LetterSpacing = /<animate attributeName="letter-spacing" values="0\.45;0\.55;0\.45" dur="6s" repeatCount="indefinite" \/>/.test(tsxSrc);
71
+
72
+ const results = {
73
+ text_present: !!runtimeState?.text_present,
74
+ opacity_anim_preserved: runtimeState?.opacity_anim_present === true,
75
+ opacity_dur_6s: runtimeState?.opacity_dur === '6s',
76
+ opacity_values_kept: runtimeState?.opacity_values === '0.32;0.48;0.32',
77
+ ls_anim_present: runtimeState?.ls_anim_present === true,
78
+ ls_dur_6s: runtimeState?.ls_dur === '6s',
79
+ ls_values: runtimeState?.ls_values === '0.45;0.55;0.45',
80
+ ls_repeat_indef: runtimeState?.ls_repeat === 'indefinite',
81
+ tsx_r519_preserved: tsxR519Preserved,
82
+ tsx_r712_letter_spacing: tsxR712LetterSpacing,
83
+ };
84
+ const ok = Object.values(results).every(Boolean);
85
+ console.log(`${ok ? '✅' : '❌'} R712 watermark dual-axis breath (opacity + letter-spacing both at 6s — SVG primary-identity dual):`,
86
+ JSON.stringify(results, null, 2),
87
+ `\n runtime: ${JSON.stringify(runtimeState)}`);
88
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,88 @@
1
+ /* Round 704 — brand watermark wrapper envelope breath at 15s. Slowest
2
+ * tier in respiratory rolodex. Nested respiration: inner "sleep2agi"
3
+ * text breathes at 6s (R519); this wrapper envelope at 15s creates
4
+ * fast-inner / slow-outer layered effect. Focal-recede gate via
5
+ * [data-topo-brand-watermark-recede="true"] → animation: none.
6
+ */
7
+ import { chromium } from 'playwright';
8
+ import { readFileSync } from 'node:fs';
9
+
10
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
11
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
12
+
13
+ const browser = await chromium.launch({ headless: true });
14
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
15
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
16
+ await ctx.addInitScript(() => {
17
+ try {
18
+ localStorage.setItem('anet-theme', 'cyber');
19
+ localStorage.setItem('anet-topo-layout', 'ring');
20
+ sessionStorage.setItem('anet_v3_auth', '1');
21
+ } catch {}
22
+ });
23
+ await ctx.route('**/api/hub/status*', async (route) => {
24
+ const r = await route.fetch();
25
+ const b = await r.json();
26
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
27
+ const mk = (alias) => ({
28
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
29
+ network_id: nid, project_dir: null,
30
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
31
+ });
32
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
33
+ });
34
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
35
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
36
+ const page = await ctx.newPage();
37
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
38
+ await page.waitForSelector('[data-topo-brand-watermark-wrapper]', { timeout: 15000, state: 'attached' });
39
+ await page.waitForTimeout(300);
40
+
41
+ const runtimeState = await page.evaluate(() => {
42
+ const g = document.querySelector('[data-topo-brand-watermark-wrapper]');
43
+ if (!g) return null;
44
+ const cs = getComputedStyle(g);
45
+ return {
46
+ has_class: g.classList.contains('anet-topo-brand-watermark-envelope-breath'),
47
+ breath_attr: g.getAttribute('data-topo-brand-watermark-envelope-breath'),
48
+ recede_attr: g.getAttribute('data-topo-brand-watermark-recede'),
49
+ anim_name: cs.animationName,
50
+ anim_duration: cs.animationDuration,
51
+ anim_iter: cs.animationIterationCount,
52
+ };
53
+ });
54
+
55
+ await browser.close();
56
+
57
+ const cssSrc = readFileSync('/home/vansin/agent-network-dashboard/app/globals.css', 'utf8');
58
+ const tsxSrc = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
59
+
60
+ const cssKeyframes = /@keyframes anet-topo-brand-watermark-envelope-breath-kf\s*\{[\s\S]*?0%, 100%\s*\{\s*opacity:\s*1;\s*\}[\s\S]*?50%\s*\{\s*opacity:\s*0\.85;/.test(cssSrc);
61
+ const cssRule = /\.anet-topo-brand-watermark-envelope-breath\s*\{[\s\S]*?animation:\s*anet-topo-brand-watermark-envelope-breath-kf\s+15s\s+ease-in-out\s+infinite/.test(cssSrc);
62
+ const cssRecedeGate = /\.anet-topo-brand-watermark-envelope-breath\[data-topo-brand-watermark-recede="true"\]\s*\{\s*animation:\s*none/.test(cssSrc);
63
+ const cssReducedMotion = /prefers-reduced-motion:\s*reduce\s*\)\s*\{\s*\.anet-topo-brand-watermark-envelope-breath\s*\{\s*animation:\s*none/.test(cssSrc);
64
+ const tsxClass = /className="anet-topo-brand-watermark-envelope-breath"/.test(tsxSrc);
65
+ const tsxAttr = /data-topo-brand-watermark-envelope-breath="15s"/.test(tsxSrc);
66
+
67
+ const runtimeAnim = runtimeState?.anim_name === 'anet-topo-brand-watermark-envelope-breath-kf' || runtimeState?.anim_name === 'none';
68
+ const runtimeDuration = runtimeState?.anim_duration === '15s' || runtimeState?.anim_name === 'none';
69
+
70
+ const results = {
71
+ wrapper_present: !!runtimeState,
72
+ has_breath_class: runtimeState?.has_class === true,
73
+ breath_attr_15s: runtimeState?.breath_attr === '15s',
74
+ rest_not_recede: runtimeState?.recede_attr === 'false',
75
+ runtime_anim_ok: runtimeAnim,
76
+ runtime_duration_ok: runtimeDuration,
77
+ css_keyframes: cssKeyframes,
78
+ css_rule: cssRule,
79
+ css_recede_gate: cssRecedeGate,
80
+ css_reduced_motion: cssReducedMotion,
81
+ tsx_class: tsxClass,
82
+ tsx_breath_attr: tsxAttr,
83
+ };
84
+ const ok = Object.values(results).every(Boolean);
85
+ console.log(`${ok ? '✅' : '❌'} R704 brand watermark wrapper envelope breath (15s, recede-gated — slowest tier):`,
86
+ JSON.stringify(results, null, 2),
87
+ `\n runtime: ${JSON.stringify(runtimeState)}`);
88
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,129 @@
1
+ /* Round 722 — watermark becomes the 2ND triple-axis breath surface.
2
+ * R519 SMIL opacity + R712 SMIL letter-spacing joined by R722 CSS
3
+ * text-shadow — all 3 axes at 6 s in phase. Together with R721 kicker
4
+ * they form the "6 s triple-axis PAIR" — the first multi-member
5
+ * triple-axis structural pattern in the family.
6
+ *
7
+ * Tuning vs kicker: blur 8px (vs 6px), alpha 0.20 (vs 0.30) — wider
8
+ * spread + lower alpha to register at the watermark's quieter base
9
+ * opacity (0.4 from R282) without overpowering.
10
+ *
11
+ * Assertions:
12
+ * - CSS keyframes 0%/100% has text-shadow: none
13
+ * - CSS keyframes 50% has text-shadow: 0 0 8px rgba(34, 211, 238, 0.20)
14
+ * - .anet-topo-brand-watermark-glow-breath rule binds 6s cadence
15
+ * - prefers-reduced-motion guard present
16
+ * - runtime watermark <text> has the glow class
17
+ * - runtime glow-breath data-attr = "6s" (or "false" if reducedMotion)
18
+ * - existing R519 SMIL opacity animate child still present (regression)
19
+ * - existing R712 SMIL letter-spacing animate child still present (regression)
20
+ * - R716 catalog watermark entry axes = ["opacity", "letter-spacing", "text-shadow"]
21
+ * - 2 surfaces now triple-axis (kicker + watermark) — 6s triple-axis PAIR
22
+ */
23
+ import { chromium } from 'playwright';
24
+ import { readFileSync } from 'node:fs';
25
+
26
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
27
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
28
+
29
+ const browser = await chromium.launch({ headless: true });
30
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
31
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
32
+ await ctx.addInitScript(() => {
33
+ try {
34
+ localStorage.setItem('anet-theme', 'cyber');
35
+ localStorage.setItem('anet-topo-layout', 'ring');
36
+ sessionStorage.setItem('anet_v3_auth', '1');
37
+ } catch {}
38
+ });
39
+ await ctx.route('**/api/hub/status*', async (route) => {
40
+ const r = await route.fetch();
41
+ const b = await r.json();
42
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
43
+ const mk = (alias) => ({
44
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
45
+ network_id: nid, project_dir: null,
46
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
47
+ });
48
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
49
+ });
50
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
51
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
52
+ const page = await ctx.newPage();
53
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
54
+ await page.waitForSelector('[data-topo-brand-watermark]', { timeout: 15000, state: 'attached' });
55
+ await page.waitForTimeout(300);
56
+
57
+ const runtimeState = await page.evaluate(() => {
58
+ const wm = document.querySelector('[data-topo-brand-watermark]');
59
+ if (!wm) return null;
60
+ const cs = getComputedStyle(wm);
61
+ const smilOpacity = wm.querySelector('animate[attributeName="opacity"]');
62
+ const smilLetterSpace = wm.querySelector('animate[attributeName="letter-spacing"]');
63
+ const svg = document.querySelector('[data-topo-canvas-aria]');
64
+ return {
65
+ has_glow_class: wm.classList.contains('anet-topo-brand-watermark-glow-breath'),
66
+ glow_attr: wm.getAttribute('data-topo-brand-watermark-glow-breath'),
67
+ anim_name: cs.animationName,
68
+ anim_duration: cs.animationDuration,
69
+ smil_opacity_present: !!smilOpacity,
70
+ smil_opacity_dur: smilOpacity?.getAttribute('dur'),
71
+ smil_letter_present: !!smilLetterSpace,
72
+ smil_letter_dur: smilLetterSpace?.getAttribute('dur'),
73
+ catalog: svg?.getAttribute('data-topo-respiratory-dual-axis-surfaces') ?? null,
74
+ };
75
+ });
76
+
77
+ await browser.close();
78
+
79
+ const cssSrc = readFileSync('/home/vansin/agent-network-dashboard/app/globals.css', 'utf8');
80
+ const cssKfNone = /@keyframes anet-topo-brand-watermark-glow-breath-kf\s*\{[\s\S]*?0%,\s*100%\s*\{[\s\S]*?text-shadow:\s*none/.test(cssSrc);
81
+ const cssKfGlow = /@keyframes anet-topo-brand-watermark-glow-breath-kf\s*\{[\s\S]*?50%\s*\{[\s\S]*?text-shadow:\s*0\s+0\s+8px\s+rgba\(34,\s*211,\s*238,\s*0\.20\)/.test(cssSrc);
82
+ const cssClassBound6s = /\.anet-topo-brand-watermark-glow-breath\s*\{[\s\S]*?animation:\s*anet-topo-brand-watermark-glow-breath-kf\s+6s\s+ease-in-out\s+infinite/.test(cssSrc);
83
+ const cssReducedMotion = /@media\s*\(prefers-reduced-motion:\s*reduce\)\s*\{[\s\S]*?\.anet-topo-brand-watermark-glow-breath\s*\{\s*animation:\s*none/.test(cssSrc);
84
+
85
+ const runtimeAnimOk = runtimeState?.anim_name === 'anet-topo-brand-watermark-glow-breath-kf' || runtimeState?.anim_name === 'none';
86
+
87
+ let catalog = null;
88
+ try { catalog = JSON.parse(runtimeState?.catalog ?? ''); } catch {}
89
+ const wmEntry = Array.isArray(catalog) ? catalog.find(e => e.anchor === 'watermark') : null;
90
+ const wmTripleAxes = !!wmEntry
91
+ && Array.isArray(wmEntry.axes)
92
+ && wmEntry.axes.length === 3
93
+ && JSON.stringify(wmEntry.axes) === JSON.stringify(['opacity', 'letter-spacing', 'text-shadow']);
94
+
95
+ const tripleAxisSurfaces = Array.isArray(catalog)
96
+ ? catalog.filter(e => Array.isArray(e.axes) && e.axes.length === 3)
97
+ : [];
98
+ const tripleAxisAnchorsSorted = tripleAxisSurfaces.map(e => e.anchor).sort();
99
+ /* R725 added H2 as a 3rd triple-axis surface at 10 s — the "6 s pair"
100
+ * subset still exists (kicker + watermark @ 6 s), but the catalog
101
+ * has 3 total entries now. Widen the assertion to verify the 6 s
102
+ * pair SUBSET is intact rather than asserting it's the whole set. */
103
+ const sixSecondMembers = tripleAxisSurfaces.filter(e => e.cadence_s === 6);
104
+ const sixSecondAnchorsSorted = sixSecondMembers.map(e => e.anchor).sort();
105
+ const triple6sPair =
106
+ sixSecondMembers.length === 2
107
+ && JSON.stringify(sixSecondAnchorsSorted) === JSON.stringify(['kicker', 'watermark']);
108
+
109
+ const results = {
110
+ watermark_present: !!runtimeState,
111
+ has_glow_class: runtimeState?.has_glow_class === true,
112
+ glow_attr_6s: runtimeState?.glow_attr === '6s',
113
+ runtime_anim_kf: runtimeAnimOk,
114
+ css_keyframes_norm_none: cssKfNone,
115
+ css_keyframes_mid_glow: cssKfGlow,
116
+ css_class_binds_6s: cssClassBound6s,
117
+ css_reduced_motion_guard: cssReducedMotion,
118
+ r519_smil_opacity_kept: runtimeState?.smil_opacity_present === true && runtimeState?.smil_opacity_dur === '6s',
119
+ r712_smil_letter_kept: runtimeState?.smil_letter_present === true && runtimeState?.smil_letter_dur === '6s',
120
+ catalog_watermark_three_axes: wmTripleAxes,
121
+ triple_axis_pair_6s: triple6sPair,
122
+ };
123
+ const ok = Object.values(results).every(Boolean);
124
+ console.log(`${ok ? '✅' : '❌'} R722 watermark triple-axis breath (2nd triple-axis surface, 6s triple-axis PAIR with kicker):`,
125
+ JSON.stringify(results, null, 2),
126
+ `\n watermark entry: ${JSON.stringify(wmEntry)}`,
127
+ `\n triple-axis surfaces: ${JSON.stringify(tripleAxisAnchorsSorted)}`,
128
+ `\n runtime: ${JSON.stringify({ anim_name: runtimeState?.anim_name, anim_duration: runtimeState?.anim_duration, smil_opacity: runtimeState?.smil_opacity_dur, smil_letter: runtimeState?.smil_letter_dur })}`);
129
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,94 @@
1
+ /* Round 687 — working + online chips extend from 4 hover axes (bg/
2
+ * border swap + translate-y + active scale) to add multi-layer halo
3
+ * paint axis. Per-tier tints — green-400 #4ade80 for working chip,
4
+ * cyan-300 #67e8f9 for online chip — match the existing pinnedStatus
5
+ * boxShadow inset rings. 2+4 stride, alpha 80/40. Sibling extension
6
+ * to R686 active-links chip; closes chip-row left-side trio
7
+ * (working + online + active-links) at halo-axis parity.
8
+ *
9
+ * Source assertions:
10
+ * - working chip filter: pal green-400 #4ade80 80/40 2+4 stride
11
+ * - online chip filter: pal cyan-300 #67e8f9 80/40 2+4 stride
12
+ * - both halo-layers attrs toggle '2' ↔ '0' on respective gates
13
+ *
14
+ * Runtime assertions:
15
+ * - both chips present
16
+ * - rest halo-layers='0' on both
17
+ * - mock sessions ensure both chips are interactive (workingCount + onlineNodes > 0)
18
+ */
19
+ import { chromium } from 'playwright';
20
+ import { readFileSync } from 'node:fs';
21
+
22
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
23
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
24
+
25
+ const browser = await chromium.launch({ headless: true });
26
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
27
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
28
+ await ctx.addInitScript(() => {
29
+ try {
30
+ localStorage.setItem('anet-theme', 'cyber');
31
+ localStorage.setItem('anet-topo-layout', 'ring');
32
+ sessionStorage.setItem('anet_v3_auth', '1');
33
+ } catch {}
34
+ });
35
+ await ctx.route('**/api/hub/status*', async (route) => {
36
+ const r = await route.fetch();
37
+ const b = await r.json();
38
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
39
+ const mk = (alias, status) => ({
40
+ alias, status, model: 'claude-opus-4', runtime: 'claude-code-cli',
41
+ network_id: nid, project_dir: null,
42
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
43
+ });
44
+ await route.fulfill({ response: r, json: { ...b, sessions: [
45
+ mk('a·1', 'working'),
46
+ mk('a·2', 'idle'),
47
+ mk('a·3', 'idle'),
48
+ ] } });
49
+ });
50
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
51
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
52
+ const page = await ctx.newPage();
53
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
54
+ await page.waitForSelector('[data-working-chip]', { timeout: 15000, state: 'attached' });
55
+ await page.waitForTimeout(300);
56
+
57
+ const runtimeState = await page.evaluate(() => {
58
+ const working = document.querySelector('[data-working-chip]');
59
+ const online = document.querySelector('[data-online-chip]');
60
+ return {
61
+ working_present: !!working,
62
+ online_present: !!online,
63
+ working_halo: working?.getAttribute('data-working-chip-halo-layers'),
64
+ online_halo: online?.getAttribute('data-online-chip-halo-layers'),
65
+ working_click: working?.getAttribute('data-working-chip-clickable'),
66
+ online_click: online?.getAttribute('data-online-chip-clickable'),
67
+ };
68
+ });
69
+
70
+ await browser.close();
71
+
72
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
73
+ const sourceWorkingFilter = /filter: hoveredStatus === 'working' && workingCount > 0\s*\?\s*'drop-shadow\(0 0 2px #4ade8080\) drop-shadow\(0 0 4px #4ade8040\)'/.test(src);
74
+ const sourceOnlineFilter = /filter: \(hoveredStatus === 'working' \|\| hoveredStatus === 'idle'\) && onlineNodes\.length > 0\s*\?\s*'drop-shadow\(0 0 2px #67e8f980\) drop-shadow\(0 0 4px #67e8f940\)'/.test(src);
75
+ const sourceWorkingAttr = /data-working-chip-halo-layers=\{hoveredStatus === 'working' && workingCount > 0 \? '2' : '0'\}/.test(src);
76
+ const sourceOnlineAttr = /data-online-chip-halo-layers=\{\(hoveredStatus === 'working' \|\| hoveredStatus === 'idle'\) && onlineNodes\.length > 0 \? '2' : '0'\}/.test(src);
77
+
78
+ const results = {
79
+ working_present: runtimeState.working_present,
80
+ online_present: runtimeState.online_present,
81
+ rest_working_layers_0: runtimeState.working_halo === '0',
82
+ rest_online_layers_0: runtimeState.online_halo === '0',
83
+ working_interactive: runtimeState.working_click === 'true',
84
+ online_interactive: runtimeState.online_click === 'true',
85
+ source_working_filter: sourceWorkingFilter,
86
+ source_online_filter: sourceOnlineFilter,
87
+ source_working_attr: sourceWorkingAttr,
88
+ source_online_attr: sourceOnlineAttr,
89
+ };
90
+ const ok = Object.values(results).every(Boolean);
91
+ console.log(`${ok ? '✅' : '❌'} R687 working+online chip multi-layer halo (closes chip-row left-side trio):`,
92
+ JSON.stringify(results, null, 2),
93
+ `\n runtime: ${JSON.stringify(runtimeState)}`);
94
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,94 @@
1
+ /* Round 596 verification: chrome zoom +/- segmented buttons
2
+ * gain hover:brightness-[1.15] via Tailwind class. 35th + 36th
3
+ * anchors in per-element brightness family (4th + 5th HTML).
4
+ * Paired-anchor round closing the zoom control trio.
5
+ *
6
+ * Test phases:
7
+ * 1. mock nodes → chrome zoom buttons render
8
+ * 2. rest: filter='none' (CSS hover-only, no React state)
9
+ * 3. computed transition-property contains 'filter'
10
+ * 4. source: hover:brightness-[1.15] in className + arbitrary
11
+ * transition-property includes filter
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-topo-chrome-zoom-out]', { timeout: 15000, state: 'attached' });
45
+ await page.waitForTimeout(500);
46
+
47
+ const rest = await page.evaluate(() => {
48
+ const zoomOut = document.querySelector('[data-topo-chrome-zoom-out]');
49
+ const zoomIn = document.querySelector('[data-topo-chrome-zoom-in]');
50
+ if (!zoomOut || !zoomIn) return null;
51
+ return {
52
+ zoomOut: {
53
+ filter: getComputedStyle(zoomOut).filter,
54
+ transitionProperty: getComputedStyle(zoomOut).transitionProperty,
55
+ brightnessHoverAttr: zoomOut.getAttribute('data-topo-chrome-zoom-out-brightness-hover'),
56
+ ariaLabel: zoomOut.getAttribute('aria-label'),
57
+ },
58
+ zoomIn: {
59
+ filter: getComputedStyle(zoomIn).filter,
60
+ transitionProperty: getComputedStyle(zoomIn).transitionProperty,
61
+ brightnessHoverAttr: zoomIn.getAttribute('data-topo-chrome-zoom-in-brightness-hover'),
62
+ ariaLabel: zoomIn.getAttribute('aria-label'),
63
+ },
64
+ };
65
+ });
66
+
67
+ await browser.close();
68
+
69
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
70
+ const sourceOutFilter = /data-topo-chrome-zoom-out[\s\S]*?hover:brightness-\[1\.15\]/.test(src);
71
+ const sourceInFilter = /data-topo-chrome-zoom-in[\s\S]*?hover:brightness-\[1\.15\]/.test(src);
72
+ const sourceOutTransition = /data-topo-chrome-zoom-out[\s\S]*?\[transition-property:color,background-color,transform,filter\]/.test(src);
73
+ const sourceInTransition = /data-topo-chrome-zoom-in[\s\S]*?\[transition-property:color,background-color,transform,filter\]/.test(src);
74
+
75
+ const results = {
76
+ both_buttons_present: !!rest,
77
+ out_rest_filter_none: rest?.zoomOut.filter === 'none',
78
+ in_rest_filter_none: rest?.zoomIn.filter === 'none',
79
+ out_hover_attr: rest?.zoomOut.brightnessHoverAttr === '1.15',
80
+ in_hover_attr: rest?.zoomIn.brightnessHoverAttr === '1.15',
81
+ out_aria_zoom_out: /zoom out/i.test(rest?.zoomOut.ariaLabel || ''),
82
+ in_aria_zoom_in: /zoom in/i.test(rest?.zoomIn.ariaLabel || ''),
83
+ out_transition_filter: /filter/.test(rest?.zoomOut.transitionProperty || ''),
84
+ in_transition_filter: /filter/.test(rest?.zoomIn.transitionProperty || ''),
85
+ source_out_filter: sourceOutFilter,
86
+ source_in_filter: sourceInFilter,
87
+ source_out_transition: sourceOutTransition,
88
+ source_in_transition: sourceInTransition,
89
+ };
90
+ const ok = Object.values(results).every(Boolean);
91
+ console.log(`${ok ? '✅' : '❌'} R596 zoom +/- brightness (35+36th anchors, zoom trio closure):`,
92
+ JSON.stringify(results, null, 2),
93
+ `\n rest: ${JSON.stringify(rest)}`);
94
+ process.exit(ok ? 0 : 1);