@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,72 @@
1
+ /* Round 621 — extend isRingHovered gate to include chatAlias.
2
+ * Single conceptual change cascades both status-ring axes
3
+ * (R438 sw + R584 brightness) to also fire on chat-target.
4
+ * 7th anchor in chat-target-gated brightness family.
5
+ *
6
+ * Test phases:
7
+ * 1. mock 2 idle nodes → status ring renders
8
+ * 2. rest: ring at idle sw (3 online) + no brightness filter
9
+ * 3. source: isRingHovered declaration uses gate union
10
+ * (hoveredAlias || chatAlias)
11
+ */
12
+ import { chromium } from 'playwright';
13
+ import { readFileSync } from 'node:fs';
14
+
15
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
16
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
17
+
18
+ const browser = await chromium.launch({ headless: true });
19
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
20
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
21
+ await ctx.addInitScript(() => {
22
+ try {
23
+ localStorage.setItem('anet-theme', 'cyber');
24
+ localStorage.setItem('anet-topo-layout', 'ring');
25
+ sessionStorage.setItem('anet_v3_auth', '1');
26
+ } catch {}
27
+ });
28
+ await ctx.route('**/api/hub/status*', async (route) => {
29
+ const r = await route.fetch();
30
+ const b = await r.json();
31
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
32
+ const mk = (alias) => ({
33
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
34
+ network_id: nid, project_dir: null,
35
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
36
+ });
37
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
38
+ });
39
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
40
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
41
+ const page = await ctx.newPage();
42
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
43
+ await page.waitForSelector('[data-node-status-ring]', { timeout: 15000, state: 'attached' });
44
+ await page.waitForTimeout(500);
45
+
46
+ const rest = await page.evaluate(() => {
47
+ const el = document.querySelector('[data-node-status-ring]');
48
+ if (!el) return null;
49
+ return {
50
+ hoveredAttr: el.getAttribute('data-node-status-ring-hovered'),
51
+ swAttr: el.getAttribute('data-node-status-ring-stroke-width'),
52
+ brightnessAttr: el.getAttribute('data-node-status-ring-brightness'),
53
+ };
54
+ });
55
+
56
+ await browser.close();
57
+
58
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
59
+ const sourceGate = /const isRingHovered = !reducedMotion && \(hoveredAlias === session\.alias \|\| chatAlias === session\.alias\)/.test(src);
60
+
61
+ const results = {
62
+ ring_present: !!rest,
63
+ rest_hovered_false: rest?.hoveredAttr === 'false',
64
+ rest_sw_idle: rest?.swAttr === '3', // idle status (online, no hover)
65
+ rest_brightness_1: rest?.brightnessAttr === '1',
66
+ source_gate_or: sourceGate,
67
+ };
68
+ const ok = Object.values(results).every(Boolean);
69
+ console.log(`${ok ? '✅' : '❌'} R621 status-ring chat-target gate (chat-gated family 7th anchor):`,
70
+ JSON.stringify(results, null, 2),
71
+ `\n rest: ${JSON.stringify(rest)}`);
72
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,105 @@
1
+ /* Round 643 — status ring filter gains a SECOND drop-shadow layer
2
+ * at 4px blur + 0x20 alpha, mirroring R642's multi-layer halo on
3
+ * the chat-target ring. Per-node identity rings now share the same
4
+ * "near + far" 2-layer halo vocabulary on hover/chat.
5
+ *
6
+ * Test phases:
7
+ * 1. rest: no hover/chat, halo-layers='0'
8
+ * 2. click a·1 → R621 extends isRingHovered to chat-target;
9
+ * that node's status ring gets halo-layers='2'; computed
10
+ * filter has exactly 2 drop-shadow substrings
11
+ * 3. source: light + cyber+online + cyber+offline branches all
12
+ * stack 2 drop-shadows (2px + 4px blur)
13
+ */
14
+ import { chromium } from 'playwright';
15
+ import { readFileSync } from 'node:fs';
16
+
17
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
18
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
19
+
20
+ const browser = await chromium.launch({ headless: true });
21
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
22
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
23
+ await ctx.addInitScript(() => {
24
+ try {
25
+ localStorage.setItem('anet-theme', 'cyber');
26
+ localStorage.setItem('anet-topo-layout', 'ring');
27
+ sessionStorage.setItem('anet_v3_auth', '1');
28
+ } catch {}
29
+ });
30
+ await ctx.route('**/api/hub/status*', async (route) => {
31
+ const r = await route.fetch();
32
+ const b = await r.json();
33
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
34
+ const mk = (alias, status) => ({
35
+ alias, status, model: 'claude-opus-4', runtime: 'claude-code-cli',
36
+ network_id: nid, project_dir: null,
37
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
38
+ });
39
+ await route.fulfill({ response: r, json: { ...b, sessions: [
40
+ mk('a·1', 'idle'),
41
+ mk('a·2', 'working'),
42
+ ] } });
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-node-status-ring]', { timeout: 15000, state: 'attached' });
49
+ await page.waitForTimeout(500);
50
+
51
+ const restRings = await page.evaluate(() => {
52
+ return Array.from(document.querySelectorAll('[data-node-status-ring]')).map(el => ({
53
+ layers: el.getAttribute('data-node-status-ring-halo-layers'),
54
+ hovered: el.getAttribute('data-node-status-ring-hovered'),
55
+ }));
56
+ });
57
+
58
+ await page.click('[data-node="a·1"]', { force: true });
59
+ await page.waitForTimeout(400);
60
+
61
+ const chatState = await page.evaluate(() => {
62
+ return Array.from(document.querySelectorAll('[data-node]')).map(g => {
63
+ const ring = g.querySelector('[data-node-status-ring]');
64
+ if (!ring) return null;
65
+ const cs = getComputedStyle(ring);
66
+ return {
67
+ alias: g.getAttribute('data-node'),
68
+ layers: ring.getAttribute('data-node-status-ring-halo-layers'),
69
+ hovered: ring.getAttribute('data-node-status-ring-hovered'),
70
+ filter: cs.filter,
71
+ };
72
+ }).filter(Boolean);
73
+ });
74
+
75
+ await browser.close();
76
+
77
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
78
+ const sourceLight = /`drop-shadow\(0 0 2px \$\{status\.primary\}40\) drop-shadow\(0 0 4px \$\{status\.primary\}20\) brightness\(1\.15\)`/.test(src);
79
+ const sourceCyberOnline = /`drop-shadow\(0 0 2px \$\{status\.primary\}40\) drop-shadow\(0 0 4px \$\{status\.primary\}20\) url\(#topo-glow\) brightness\(1\.15\)`/.test(src);
80
+ const sourceLayersAttr = /data-node-status-ring-halo-layers=\{isRingHovered \? '2' : '0'\}/.test(src);
81
+
82
+ const restAllZeroLayers = restRings.every(r => r.layers === '0');
83
+ const chatActiveRing = chatState.find(c => c.alias === 'a·1');
84
+ const chatIdleRing = chatState.find(c => c.alias === 'a·2');
85
+ const activeDropShadowCount = (chatActiveRing?.filter?.match(/drop-shadow/g) || []).length;
86
+
87
+ const results = {
88
+ rest_rings_present: restRings.length >= 2,
89
+ rest_all_layers_0: restAllZeroLayers,
90
+ chat_a1_present: !!chatActiveRing,
91
+ chat_a1_layers_2: chatActiveRing?.layers === '2',
92
+ chat_a1_hovered: chatActiveRing?.hovered === 'true',
93
+ chat_a1_two_dropshadows: activeDropShadowCount === 2,
94
+ chat_a1_brightness: /brightness/.test(chatActiveRing?.filter || ''),
95
+ chat_a2_layers_0: chatIdleRing?.layers === '0',
96
+ source_light_filter: sourceLight,
97
+ source_cyber_online: sourceCyberOnline,
98
+ source_layers_attr: sourceLayersAttr,
99
+ };
100
+ const ok = Object.values(results).every(Boolean);
101
+ console.log(`${ok ? '✅' : '❌'} R643 status ring multi-layer halo (innermost identity ring 2-layer halo):`,
102
+ JSON.stringify(results, null, 2),
103
+ `\n rest: ${JSON.stringify(restRings)}`,
104
+ `\n chat: ${JSON.stringify(chatState)}`);
105
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,110 @@
1
+ /* Round 638 — status ring filter gains a status-tinted drop-shadow
2
+ * halo on isRingHovered. Sibling to R637 chat-target ring at the
3
+ * innermost per-node identity surface (r=radius). Halo color
4
+ * matches stroke color (status.primary) across all status tiers.
5
+ *
6
+ * Test phases:
7
+ * 1. mock idle node + working node
8
+ * 2. rest: no hover/chat → status-ring-halo-color='none' for all
9
+ * 3. open chat with idle node a·1 (R621 extends isRingHovered to
10
+ * chat-target) → that ring's halo-color = idle teal hex,
11
+ * filter contains drop-shadow(teal); other node stays 'none'
12
+ * 4. source: filter expression includes status.primary in drop-
13
+ * shadow across all 3 branches (light, cyber+online,
14
+ * cyber+offline)
15
+ */
16
+ import { chromium } from 'playwright';
17
+ import { readFileSync } from 'node:fs';
18
+
19
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
20
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
21
+
22
+ const browser = await chromium.launch({ headless: true });
23
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
24
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
25
+ await ctx.addInitScript(() => {
26
+ try {
27
+ localStorage.setItem('anet-theme', 'cyber');
28
+ localStorage.setItem('anet-topo-layout', 'ring');
29
+ sessionStorage.setItem('anet_v3_auth', '1');
30
+ } catch {}
31
+ });
32
+ await ctx.route('**/api/hub/status*', async (route) => {
33
+ const r = await route.fetch();
34
+ const b = await r.json();
35
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
36
+ const mk = (alias, status) => ({
37
+ alias, status, model: 'claude-opus-4', runtime: 'claude-code-cli',
38
+ network_id: nid, project_dir: null,
39
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
40
+ });
41
+ await route.fulfill({ response: r, json: { ...b, sessions: [
42
+ mk('a·1', 'idle'),
43
+ mk('a·2', 'working'),
44
+ ] } });
45
+ });
46
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
47
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
48
+ const page = await ctx.newPage();
49
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
50
+ await page.waitForSelector('[data-node-status-ring]', { timeout: 15000, state: 'attached' });
51
+ await page.waitForTimeout(500);
52
+
53
+ // rest: collect all status-ring halo colors (should be 'none')
54
+ const restRings = await page.evaluate(() => {
55
+ return Array.from(document.querySelectorAll('[data-node-status-ring]')).map(el => ({
56
+ haloColor: el.getAttribute('data-node-status-ring-halo-color'),
57
+ hovered: el.getAttribute('data-node-status-ring-hovered'),
58
+ }));
59
+ });
60
+
61
+ // open chat with a·1 (idle) — R621 extends isRingHovered to chat-target
62
+ await page.click('[data-node="a·1"]', { force: true });
63
+ await page.waitForTimeout(400);
64
+
65
+ const chatState = await page.evaluate(() => {
66
+ const all = Array.from(document.querySelectorAll('[data-node]')).map(g => {
67
+ const ring = g.querySelector('[data-node-status-ring]');
68
+ if (!ring) return null;
69
+ const cs = getComputedStyle(ring);
70
+ return {
71
+ alias: g.getAttribute('data-node'),
72
+ haloColor: ring.getAttribute('data-node-status-ring-halo-color'),
73
+ hovered: ring.getAttribute('data-node-status-ring-hovered'),
74
+ stroke: cs.stroke,
75
+ filter: cs.filter,
76
+ };
77
+ }).filter(Boolean);
78
+ return all;
79
+ });
80
+
81
+ await browser.close();
82
+
83
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
84
+ const sourceLightFilter = /`drop-shadow\(0 0 2px \$\{status\.primary\}40\) brightness\(1\.15\)`/.test(src);
85
+ const sourceCyberOnline = /`drop-shadow\(0 0 2px \$\{status\.primary\}40\) url\(#topo-glow\) brightness\(1\.15\)`/.test(src);
86
+ const sourceHaloAttr = /data-node-status-ring-halo-color=\{isRingHovered \? status\.primary : 'none'\}/.test(src);
87
+
88
+ const restAllNone = restRings.every(r => r.haloColor === 'none');
89
+ const chatActiveRing = chatState.find(c => c.alias === 'a·1');
90
+ const chatIdleRing = chatState.find(c => c.alias === 'a·2');
91
+
92
+ const results = {
93
+ rest_all_halo_none: restAllNone,
94
+ chat_a1_present: !!chatActiveRing,
95
+ chat_a1_halo_color: /^#[0-9a-f]{6,8}$/i.test(chatActiveRing?.haloColor || ''),
96
+ chat_a1_hovered_true: chatActiveRing?.hovered === 'true',
97
+ chat_a1_filter_dropshadow: /drop-shadow/.test(chatActiveRing?.filter || ''),
98
+ chat_a1_filter_brightness: /brightness/.test(chatActiveRing?.filter || ''),
99
+ chat_a2_present: !!chatIdleRing,
100
+ chat_a2_halo_none: chatIdleRing?.haloColor === 'none',
101
+ source_light_filter: sourceLightFilter,
102
+ source_cyber_online: sourceCyberOnline,
103
+ source_halo_attr: sourceHaloAttr,
104
+ };
105
+ const ok = Object.values(results).every(Boolean);
106
+ console.log(`${ok ? '✅' : '❌'} R638 status ring status-tinted halo (chromatic identity at innermost identity surface):`,
107
+ JSON.stringify(results, null, 2),
108
+ `\n rest: ${JSON.stringify(restRings)}`,
109
+ `\n chat: ${JSON.stringify(chatState)}`);
110
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,81 @@
1
+ /* Round 617 — sub-text brightness gate extends from hover-only to
2
+ * (hover || chat-target). 3rd anchor in chat-target-gated
3
+ * brightness family (sibling to R615 chat ring + R616 alias text).
4
+ *
5
+ * Test phases:
6
+ * 1. mock 2 idle nodes → sub-text renders
7
+ * 2. rest (no hover, no chat): filter='none', brightness-attr='1'
8
+ * 3. computed transition-property contains 'filter'
9
+ * 4. source: filter conditional includes BOTH hover AND chat
10
+ * gates, joined by `||`
11
+ */
12
+ import { chromium } from 'playwright';
13
+ import { readFileSync } from 'node:fs';
14
+
15
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
16
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
17
+
18
+ const browser = await chromium.launch({ headless: true });
19
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
20
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
21
+ await ctx.addInitScript(() => {
22
+ try {
23
+ localStorage.setItem('anet-theme', 'cyber');
24
+ localStorage.setItem('anet-topo-layout', 'ring');
25
+ sessionStorage.setItem('anet_v3_auth', '1');
26
+ } catch {}
27
+ });
28
+ await ctx.route('**/api/hub/status*', async (route) => {
29
+ const r = await route.fetch();
30
+ const b = await r.json();
31
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
32
+ const mk = (alias) => ({
33
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
34
+ network_id: nid, project_dir: null,
35
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
36
+ });
37
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
38
+ });
39
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
40
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
41
+ const page = await ctx.newPage();
42
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
43
+ await page.waitForSelector('[data-node-sub-text]', { timeout: 15000, state: 'attached' });
44
+ await page.waitForTimeout(500);
45
+
46
+ const rest = await page.evaluate(() => {
47
+ const el = document.querySelector('[data-node-sub-text]');
48
+ if (!el) return null;
49
+ const cs = getComputedStyle(el);
50
+ return {
51
+ filter: cs.filter,
52
+ transitionProperty: cs.transitionProperty,
53
+ brightnessAttr: el.getAttribute('data-node-sub-text-brightness'),
54
+ hoveredAttr: el.getAttribute('data-node-sub-text-hovered'),
55
+ chatTargetAttr: el.getAttribute('data-node-sub-text-chat-target'),
56
+ };
57
+ });
58
+
59
+ await browser.close();
60
+
61
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
62
+ const sourceFilter = /filter: !reducedMotion && \(hoveredAlias === session\.alias \|\| chatAlias === session\.alias\)\s*\?\s*'brightness\(1\.15\)'\s*:\s*undefined/.test(src);
63
+ const sourceAttr = /data-node-sub-text-brightness=\{!reducedMotion && \(hoveredAlias === session\.alias \|\| chatAlias === session\.alias\) \? '1\.15' : '1'\}/.test(src);
64
+ const sourceChatAttr = /data-node-sub-text-chat-target=\{chatAlias === session\.alias \? 'true' : 'false'\}/.test(src);
65
+
66
+ const results = {
67
+ sub_text_present: !!rest,
68
+ rest_filter_none: rest?.filter === 'none',
69
+ rest_brightness_1: rest?.brightnessAttr === '1',
70
+ rest_hovered_false: rest?.hoveredAttr === 'false',
71
+ rest_chat_target_false: rest?.chatTargetAttr === 'false',
72
+ transition_has_filter: /filter/.test(rest?.transitionProperty || ''),
73
+ source_filter_or_gate: sourceFilter,
74
+ source_attr_or_gate: sourceAttr,
75
+ source_chat_attr: sourceChatAttr,
76
+ };
77
+ const ok = Object.values(results).every(Boolean);
78
+ console.log(`${ok ? '✅' : '❌'} R617 sub-text chat-target brightness (chat-gated family 3rd anchor):`,
79
+ JSON.stringify(results, null, 2),
80
+ `\n rest: ${JSON.stringify(rest)}`);
81
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,93 @@
1
+ /* Round 731 — extend SVG <title> a11y children to 2 more decorative
2
+ * SVG elements: title-block brand logo + canvas-corner crescent mark.
3
+ * Continues R730's a11y sub-family thread.
4
+ *
5
+ * R730 + R731 a11y title coverage so far (5 elements):
6
+ * R730 watermark <text> "sleep2agi · brand watermark"
7
+ * R730 recent panel title "recent signal · activity panel title"
8
+ * R730 legend panel title "legend · status / vendor / runtime swatch panel"
9
+ * R731 title-block brand logo "sleep2agi · brand logo"
10
+ * R731 canvas-corner crescent "sleep2agi · canvas-corner brand mark"
11
+ *
12
+ * Canonical title format: "<surface-name> · <structural-role>".
13
+ *
14
+ * Assertions:
15
+ * - Brand logo <svg> has a <title> child with expected text
16
+ * - Canvas-corner crescent <g> has a <title> child with expected text
17
+ * - Both follow the canonical "<name> · <role>" format
18
+ * - R730 watermark title still present (regression)
19
+ * - R730 legend title still present (regression)
20
+ */
21
+ import { chromium } from 'playwright';
22
+ import { readFileSync } from 'node:fs';
23
+
24
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
25
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
26
+
27
+ const browser = await chromium.launch({ headless: true });
28
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
29
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
30
+ await ctx.addInitScript(() => {
31
+ try {
32
+ localStorage.setItem('anet-theme', 'cyber');
33
+ localStorage.setItem('anet-topo-layout', 'ring');
34
+ sessionStorage.setItem('anet_v3_auth', '1');
35
+ } catch {}
36
+ });
37
+ await ctx.route('**/api/hub/status*', async (route) => {
38
+ const r = await route.fetch();
39
+ const b = await r.json();
40
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
41
+ const mk = (alias) => ({
42
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
43
+ network_id: nid, project_dir: null,
44
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
45
+ });
46
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
47
+ });
48
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
49
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
50
+ const page = await ctx.newPage();
51
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
52
+ await page.waitForSelector('[data-topo-brand-logo]', { timeout: 15000, state: 'attached' });
53
+ await page.waitForTimeout(300);
54
+
55
+ const state = await page.evaluate(() => {
56
+ const brandLogo = document.querySelector('[data-topo-brand-logo]');
57
+ const canvasMark = document.querySelector('[data-topo-brand-canvas-mark]');
58
+ const watermark = document.querySelector('[data-topo-brand-watermark]');
59
+ const legend = document.querySelector('[data-legend-panel-title]');
60
+ /* Get DIRECT child <title> (not descendant) so we don't pick up
61
+ * titles from nested SVG elements inside the brand logo's mask defs. */
62
+ const directTitleText = (el) => {
63
+ if (!el) return null;
64
+ for (const child of el.children) {
65
+ if (child.tagName.toLowerCase() === 'title') return child.textContent;
66
+ }
67
+ return null;
68
+ };
69
+ return {
70
+ brand_logo_title: directTitleText(brandLogo),
71
+ canvas_mark_title: directTitleText(canvasMark),
72
+ watermark_title: directTitleText(watermark),
73
+ legend_title: directTitleText(legend),
74
+ };
75
+ });
76
+
77
+ await browser.close();
78
+
79
+ const canonicalFormat = (s) => typeof s === 'string' && /^[^·]+ · [^·]+$/.test(s);
80
+
81
+ const results = {
82
+ brand_logo_title_present: state.brand_logo_title === 'sleep2agi · brand logo',
83
+ canvas_mark_title_present: state.canvas_mark_title === 'sleep2agi · canvas-corner brand mark',
84
+ brand_logo_canonical_format: canonicalFormat(state.brand_logo_title),
85
+ canvas_mark_canonical_format: canonicalFormat(state.canvas_mark_title),
86
+ r730_watermark_title_kept: state.watermark_title === 'sleep2agi · brand watermark',
87
+ r730_legend_title_kept: state.legend_title === 'legend · status / vendor / runtime swatch panel',
88
+ };
89
+ const ok = Object.values(results).every(Boolean);
90
+ console.log(`${ok ? '✅' : '❌'} R731 SVG <title> a11y extension to brand logo + canvas-corner crescent:`,
91
+ JSON.stringify(results, null, 2),
92
+ `\n state: ${JSON.stringify(state)}`);
93
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,88 @@
1
+ /* Round 730 — SVG <title> a11y children on the 3 primary SVG text
2
+ * anchors (watermark, recent panel title, legend panel title). Pure
3
+ * additive a11y improvement: screen readers can now identify these
4
+ * decorative SVG elements via their accessible name. No visible chrome
5
+ * change (mouse tooltips don't fire because the elements have
6
+ * pointer-events: none), no overlap risk.
7
+ *
8
+ * Pivot round: first non-breath-family addition after the R721–R729
9
+ * triple-axis + meta-doc hexagon thread.
10
+ *
11
+ * Assertions:
12
+ * - Watermark <text> has a <title> child with expected text
13
+ * - Recent panel title (when rendered) has a <title> child
14
+ * - Legend panel title has a <title> child
15
+ * - Each title text matches the canonical format "<name> · <role>"
16
+ * - Existing breath animations on all 3 are preserved (regression)
17
+ */
18
+ import { chromium } from 'playwright';
19
+ import { readFileSync } from 'node:fs';
20
+
21
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
22
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
23
+
24
+ const browser = await chromium.launch({ headless: true });
25
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
26
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
27
+ await ctx.addInitScript(() => {
28
+ try {
29
+ localStorage.setItem('anet-theme', 'cyber');
30
+ localStorage.setItem('anet-topo-layout', 'ring');
31
+ sessionStorage.setItem('anet_v3_auth', '1');
32
+ } catch {}
33
+ });
34
+ await ctx.route('**/api/hub/status*', async (route) => {
35
+ const r = await route.fetch();
36
+ const b = await r.json();
37
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
38
+ const mk = (alias) => ({
39
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
40
+ network_id: nid, project_dir: null,
41
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
42
+ });
43
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
44
+ });
45
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
46
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
47
+ const page = await ctx.newPage();
48
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
49
+ await page.waitForSelector('[data-topo-brand-watermark]', { timeout: 15000, state: 'attached' });
50
+ await page.waitForTimeout(300);
51
+
52
+ const state = await page.evaluate(() => {
53
+ const watermark = document.querySelector('[data-topo-brand-watermark]');
54
+ const recent = document.querySelector('[data-recent-panel-title]');
55
+ const legend = document.querySelector('[data-legend-panel-title]');
56
+ const titleOf = (el) => el?.querySelector('title')?.textContent ?? null;
57
+ const smilCount = (el) => el?.querySelectorAll('animate').length ?? 0;
58
+ return {
59
+ watermark_present: !!watermark,
60
+ watermark_title_text: titleOf(watermark),
61
+ watermark_smil_count: smilCount(watermark), // expect 2 (R519 opacity + R712 letter-spacing)
62
+ recent_present: !!recent,
63
+ recent_title_text: titleOf(recent),
64
+ recent_smil_count: smilCount(recent), // expect 2 (R700 opacity + R713 font-size)
65
+ legend_present: !!legend,
66
+ legend_title_text: titleOf(legend),
67
+ legend_smil_count: smilCount(legend), // expect 2 (R701 opacity + R713 font-size)
68
+ };
69
+ });
70
+
71
+ await browser.close();
72
+
73
+ const results = {
74
+ watermark_title_present: state.watermark_present && state.watermark_title_text === 'sleep2agi · brand watermark',
75
+ watermark_smil_preserved: state.watermark_smil_count === 2,
76
+ /* Recent panel renders conditionally on flowLinks; same conditional-
77
+ * presence pattern as R728. Treat as pass if not rendered, strict
78
+ * check otherwise. */
79
+ recent_title_present: !state.recent_present || state.recent_title_text === 'recent signal · activity panel title',
80
+ recent_smil_preserved: !state.recent_present || state.recent_smil_count === 2,
81
+ legend_title_present: state.legend_present && state.legend_title_text === 'legend · status / vendor / runtime swatch panel',
82
+ legend_smil_preserved: state.legend_present && state.legend_smil_count === 2,
83
+ };
84
+ const ok = Object.values(results).every(Boolean);
85
+ console.log(`${ok ? '✅' : '❌'} R730 SVG <title> a11y children on 3 SVG text anchors (watermark + recent + legend titles):`,
86
+ JSON.stringify(results, null, 2),
87
+ `\n state: ${JSON.stringify(state)}`);
88
+ process.exit(ok ? 0 : 1);