@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,100 @@
1
+ /* Round 737 — formalize the R735/R736 scan beam ambient pair as the
2
+ * 9TH entry in R717 patterns catalog. CROSS-FAMILY pattern entry:
3
+ * prior 8 patterns are all in the respiratory (breath) family;
4
+ * scan-beam-pair lives in the AMBIENT family but uses the same
5
+ * R717 "pattern axis" introspection vocabulary.
6
+ *
7
+ * Mirrors R724's pattern-formalization round (which added the
8
+ * triple-axis-pair entry after R721/R722 established the surfaces).
9
+ *
10
+ * Assertions:
11
+ * - R717 patterns has exactly 9 entries
12
+ * - `scan-beam-pair` entry exists with:
13
+ * - cadences [23, 30]
14
+ * - anchors ["scan beam horizontal", "scan beam vertical"]
15
+ * - shape "coprime-crosshair"
16
+ * - Coprime invariant: gcd(23, 30) === 1
17
+ * - Pattern cadences match the actual SMIL animate durs on the
18
+ * two beams (regression: R735 y-anim dur === 30s, R736 x-anim
19
+ * dur === 23s)
20
+ * - Pattern anchors map to actual data-attr selectors that resolve
21
+ * to live DOM elements (semantic anchor-to-element correspondence)
22
+ * - All other 8 R717 entries preserved (regression)
23
+ */
24
+ import { chromium } from 'playwright';
25
+ import { readFileSync } from 'node:fs';
26
+
27
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
28
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
29
+
30
+ const browser = await chromium.launch({ headless: true });
31
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
32
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
33
+ await ctx.addInitScript(() => {
34
+ try {
35
+ localStorage.setItem('anet-theme', 'cyber');
36
+ localStorage.setItem('anet-topo-layout', 'ring');
37
+ sessionStorage.setItem('anet_v3_auth', '1');
38
+ } catch {}
39
+ });
40
+ await ctx.route('**/api/hub/status*', async (route) => {
41
+ const r = await route.fetch();
42
+ const b = await r.json();
43
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
44
+ const mk = (alias) => ({
45
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
46
+ network_id: nid, project_dir: null,
47
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
48
+ });
49
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
50
+ });
51
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
52
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
53
+ const page = await ctx.newPage();
54
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
55
+ await page.waitForSelector('[data-topo-canvas-aria]', { timeout: 15000, state: 'attached' });
56
+ await page.waitForTimeout(300);
57
+
58
+ const state = await page.evaluate(() => {
59
+ const svg = document.querySelector('[data-topo-canvas-aria]');
60
+ const patternsAttr = svg?.getAttribute('data-topo-respiratory-patterns') ?? null;
61
+ const hbeam = document.querySelector('[data-topo-canvas-scan-beam]');
62
+ const vbeam = document.querySelector('[data-topo-canvas-scan-beam-vertical]');
63
+ return {
64
+ patterns_attr: patternsAttr,
65
+ hbeam_y_dur: hbeam?.querySelector('animate[attributeName="y"]')?.getAttribute('dur') ?? null,
66
+ vbeam_x_dur: vbeam?.querySelector('animate[attributeName="x"]')?.getAttribute('dur') ?? null,
67
+ hbeam_present: !!hbeam,
68
+ vbeam_present: !!vbeam,
69
+ };
70
+ });
71
+
72
+ await browser.close();
73
+
74
+ let patterns = null;
75
+ try { patterns = JSON.parse(state.patterns_attr ?? ''); } catch {}
76
+
77
+ const sbpEntry = Array.isArray(patterns) ? patterns.find(p => p.name === 'scan-beam-pair') : null;
78
+ const gcd = (a, b) => (b === 0 ? a : gcd(b, a % b));
79
+
80
+ const expectedNames = ['background', 'canvas-brand-pair', 'chrome-strip', 'panel-pair', 'scan-beam-pair', 'title-block', 'triple-axis-pair', 'triple-axis-pair-8s', 'triple-axis-tier'];
81
+ const actualNames = Array.isArray(patterns) ? patterns.map(p => p.name).sort() : [];
82
+
83
+ const results = {
84
+ patterns_has_9_entries: Array.isArray(patterns) && patterns.length === 9,
85
+ pattern_names_complete: JSON.stringify(actualNames) === JSON.stringify(expectedNames),
86
+ scan_beam_pair_entry_present: !!sbpEntry,
87
+ cadences_23_30: !!sbpEntry && JSON.stringify(sbpEntry.cadences) === JSON.stringify([23, 30]),
88
+ anchors_horizontal_vertical: !!sbpEntry && JSON.stringify(sbpEntry.anchors) === JSON.stringify(['scan beam horizontal', 'scan beam vertical']),
89
+ shape_coprime_crosshair: sbpEntry?.shape === 'coprime-crosshair',
90
+ coprime_invariant_holds: gcd(23, 30) === 1,
91
+ pattern_matches_hbeam_dur: state.hbeam_y_dur === '30s' && Array.isArray(sbpEntry?.cadences) && sbpEntry.cadences.includes(30),
92
+ pattern_matches_vbeam_dur: state.vbeam_x_dur === '23s' && Array.isArray(sbpEntry?.cadences) && sbpEntry.cadences.includes(23),
93
+ both_beams_in_dom: state.hbeam_present && state.vbeam_present,
94
+ };
95
+ const ok = Object.values(results).every(Boolean);
96
+ console.log(`${ok ? '✅' : '❌'} R737 R717 patterns +1: scan-beam-pair (9th entry, first cross-family pattern from the ambient layer):`,
97
+ JSON.stringify(results, null, 2),
98
+ `\n sbp entry: ${JSON.stringify(sbpEntry)}`,
99
+ `\n gcd(23, 30) = ${gcd(23, 30)}`);
100
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,113 @@
1
+ /* Round 724 — 6th entry added to R717 patterns catalog:
2
+ * `triple-axis-pair` with shape `6s-triple-pair`. Formalizes the
3
+ * structural motif previously implicit across R721/R722/R723:
4
+ * kicker + watermark text — both at 6 s, both with text-shadow as
5
+ * the 3rd axis, both sparse-hover read-target text.
6
+ *
7
+ * Cross-validates against R723 triple-axis-surfaces catalog (the
8
+ * authoritative axis-count index): the anchors in this pattern entry
9
+ * must equal R723's anchor set.
10
+ *
11
+ * Assertions:
12
+ * - R717 patterns has exactly 6 entries (was 5 before R724)
13
+ * - One entry named "triple-axis-pair" exists
14
+ * - Its cadences = [6]
15
+ * - Its shape = "6s-triple-pair"
16
+ * - Its anchors = ["kicker", "watermark text"] (order preserved)
17
+ * - Cross-check: R723 triple-axis-surfaces anchor set, after
18
+ * normalising "watermark" → "watermark text" (the R723 catalog
19
+ * uses the short anchor key; R717 uses the full rolodex anchor
20
+ * name), equals this pattern's anchors
21
+ * - Anchor non-exclusivity (intended): kicker also appears in
22
+ * "title-block" pattern; "watermark text" also appears in
23
+ * "canvas-brand-pair" pattern
24
+ */
25
+ import { chromium } from 'playwright';
26
+ import { readFileSync } from 'node:fs';
27
+
28
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
29
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
30
+
31
+ const browser = await chromium.launch({ headless: true });
32
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
33
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
34
+ await ctx.addInitScript(() => {
35
+ try {
36
+ localStorage.setItem('anet-theme', 'cyber');
37
+ localStorage.setItem('anet-topo-layout', 'ring');
38
+ sessionStorage.setItem('anet_v3_auth', '1');
39
+ } catch {}
40
+ });
41
+ await ctx.route('**/api/hub/status*', async (route) => {
42
+ const r = await route.fetch();
43
+ const b = await r.json();
44
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
45
+ const mk = (alias) => ({
46
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
47
+ network_id: nid, project_dir: null,
48
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
49
+ });
50
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
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-topo-canvas-aria]', { timeout: 15000, state: 'attached' });
57
+ await page.waitForTimeout(300);
58
+
59
+ const runtimeAttrs = await page.evaluate(() => {
60
+ const svg = document.querySelector('[data-topo-canvas-aria]');
61
+ return {
62
+ patterns: svg?.getAttribute('data-topo-respiratory-patterns') ?? null,
63
+ triple: svg?.getAttribute('data-topo-respiratory-triple-axis-surfaces') ?? null,
64
+ };
65
+ });
66
+
67
+ await browser.close();
68
+
69
+ let patterns = null;
70
+ let triple = null;
71
+ try {
72
+ patterns = JSON.parse(runtimeAttrs.patterns ?? '');
73
+ triple = JSON.parse(runtimeAttrs.triple ?? '');
74
+ } catch {}
75
+
76
+ const pairEntry = Array.isArray(patterns) ? patterns.find(p => p.name === 'triple-axis-pair') : null;
77
+ const titleBlockEntry = Array.isArray(patterns) ? patterns.find(p => p.name === 'title-block') : null;
78
+ const canvasBrandPairEntry = Array.isArray(patterns) ? patterns.find(p => p.name === 'canvas-brand-pair') : null;
79
+
80
+ /* R725 extended R723 to 3 entries (H2 added at 10 s). The strict
81
+ * equality between R723's anchor set and the R717 pair anchors no
82
+ * longer holds — R723 is the full triple-axis SUPERSET now, the
83
+ * pair is a subset. Widen the cross-check: every pair anchor must
84
+ * exist in R723 (mapping watermark → watermark text), AND R723's
85
+ * 6 s subset (members with cadence_s === 6) must equal the pair. */
86
+ const r723AnchorsNormalised = Array.isArray(triple)
87
+ ? triple.map(e => e.anchor === 'watermark' ? 'watermark text' : e.anchor)
88
+ : [];
89
+ const r723SixSecAnchorsNormalised = Array.isArray(triple)
90
+ ? triple.filter(e => e.cadence_s === 6).map(e => e.anchor === 'watermark' ? 'watermark text' : e.anchor).sort()
91
+ : [];
92
+ const pairAnchorsSorted = pairEntry?.anchors ? [...pairEntry.anchors].sort() : [];
93
+ const pairSubsetOfR723 = Array.isArray(pairEntry?.anchors)
94
+ && pairEntry.anchors.every(a => r723AnchorsNormalised.includes(a));
95
+ const r723SixSecondSubsetEqualsPair = JSON.stringify(r723SixSecAnchorsNormalised) === JSON.stringify(pairAnchorsSorted);
96
+
97
+ const results = {
98
+ patterns_has_6_entries: Array.isArray(patterns) && patterns.length === 6,
99
+ pair_entry_exists: !!pairEntry,
100
+ pair_cadences_is_6: JSON.stringify(pairEntry?.cadences) === JSON.stringify([6]),
101
+ pair_shape_correct: pairEntry?.shape === '6s-triple-pair',
102
+ pair_anchors_correct: JSON.stringify(pairEntry?.anchors) === JSON.stringify(['kicker', 'watermark text']),
103
+ pair_is_subset_of_r723: pairSubsetOfR723,
104
+ r723_6s_subset_equals_pair: r723SixSecondSubsetEqualsPair,
105
+ kicker_also_in_title_block: Array.isArray(titleBlockEntry?.anchors) && titleBlockEntry.anchors.includes('kicker'),
106
+ watermark_also_in_canvas_brand: Array.isArray(canvasBrandPairEntry?.anchors) && canvasBrandPairEntry.anchors.includes('watermark text'),
107
+ };
108
+ const ok = Object.values(results).every(Boolean);
109
+ console.log(`${ok ? '✅' : '❌'} R724 R717 patterns +1: triple-axis-pair (formalizes the 6s triple-axis pair structural motif):`,
110
+ JSON.stringify(results, null, 2),
111
+ `\n pair entry: ${JSON.stringify(pairEntry)}`,
112
+ `\n R723 anchors (normalised): ${JSON.stringify(r723AnchorsNormalised)}`);
113
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,117 @@
1
+ /* Round 726 — 7th entry added to R717 patterns catalog: `triple-axis-tier`
2
+ * (shape `tier-multi-cadence`). Companion to R724's `triple-axis-pair`
3
+ * (shape `6s-triple-pair`). R725 added H2 as the 3rd triple-axis surface
4
+ * at 10 s, proving the tier is multi-cadence; R726 documents the tier
5
+ * as its own pattern entry covering all 3 triple-axis members across
6
+ * both cadences.
7
+ *
8
+ * Pattern axis now has BOTH grain sizes:
9
+ * triple-axis-pair cadences [6] anchors [kicker, watermark text] — 6 s subset
10
+ * triple-axis-tier cadences [6, 10] anchors [kicker, watermark text, H2 section title] — full tier
11
+ *
12
+ * Assertions:
13
+ * - R717 patterns has exactly 7 entries (was 6 before R726)
14
+ * - One entry named "triple-axis-tier" exists
15
+ * - Its cadences = [6, 10]
16
+ * - Its shape = "tier-multi-cadence"
17
+ * - Its anchors = ["kicker", "watermark text", "H2 section title"]
18
+ * - PAIR ⊂ TIER: every pair anchor appears in tier anchors
19
+ * - PAIR cadences ⊂ TIER cadences: 6 ∈ tier.cadences
20
+ * - Cross-check with R723: tier anchors (normalised) equals
21
+ * R723 triple-axis-surfaces anchors (normalised)
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-canvas-aria]', { timeout: 15000, state: 'attached' });
55
+ await page.waitForTimeout(300);
56
+
57
+ const runtimeAttrs = await page.evaluate(() => {
58
+ const svg = document.querySelector('[data-topo-canvas-aria]');
59
+ return {
60
+ patterns: svg?.getAttribute('data-topo-respiratory-patterns') ?? null,
61
+ triple: svg?.getAttribute('data-topo-respiratory-triple-axis-surfaces') ?? null,
62
+ };
63
+ });
64
+
65
+ await browser.close();
66
+
67
+ let patterns = null;
68
+ let triple = null;
69
+ try {
70
+ patterns = JSON.parse(runtimeAttrs.patterns ?? '');
71
+ triple = JSON.parse(runtimeAttrs.triple ?? '');
72
+ } catch {}
73
+
74
+ const pairEntry = Array.isArray(patterns) ? patterns.find(p => p.name === 'triple-axis-pair') : null;
75
+ const tierEntry = Array.isArray(patterns) ? patterns.find(p => p.name === 'triple-axis-tier') : null;
76
+
77
+ const tierAnchorsCorrect = tierEntry
78
+ && JSON.stringify(tierEntry.anchors) === JSON.stringify(['kicker', 'watermark text', 'recent title', 'legend title', 'zoom-level readout', 'H2 section title']);
79
+ const tierCadencesCorrect = tierEntry
80
+ && JSON.stringify(tierEntry.cadences) === JSON.stringify([6, 8, 9, 10]);
81
+ const tierShapeCorrect = tierEntry?.shape === 'tier-multi-cadence';
82
+
83
+ const pairAnchorsSubsetOfTier = Array.isArray(pairEntry?.anchors) && Array.isArray(tierEntry?.anchors)
84
+ && pairEntry.anchors.every(a => tierEntry.anchors.includes(a));
85
+ const pairCadencesSubsetOfTier = Array.isArray(pairEntry?.cadences) && Array.isArray(tierEntry?.cadences)
86
+ && pairEntry.cadences.every(c => tierEntry.cadences.includes(c));
87
+
88
+ const r723AnchorsNormalisedSorted = Array.isArray(triple)
89
+ ? triple.map(e => {
90
+ if (e.anchor === 'watermark') return 'watermark text';
91
+ if (e.anchor === 'H2') return 'H2 section title';
92
+ if (e.anchor === 'zoom-level') return 'zoom-level readout';
93
+ if (e.anchor === 'recent') return 'recent title';
94
+ if (e.anchor === 'legend') return 'legend title';
95
+ return e.anchor;
96
+ }).sort()
97
+ : [];
98
+ const tierAnchorsSorted = tierEntry?.anchors ? [...tierEntry.anchors].sort() : [];
99
+ const tierEqualsR723 = JSON.stringify(tierAnchorsSorted) === JSON.stringify(r723AnchorsNormalisedSorted);
100
+
101
+ const results = {
102
+ patterns_has_8_entries: Array.isArray(patterns) && patterns.length === 8,
103
+ tier_entry_exists: !!tierEntry,
104
+ tier_cadences_6_8_9_10: !!tierCadencesCorrect,
105
+ tier_shape_correct: tierShapeCorrect,
106
+ tier_anchors_correct: !!tierAnchorsCorrect,
107
+ pair_anchors_subset_of_tier: pairAnchorsSubsetOfTier,
108
+ pair_cadences_subset_of_tier: pairCadencesSubsetOfTier,
109
+ tier_equals_r723_anchor_set: tierEqualsR723,
110
+ };
111
+ const ok = Object.values(results).every(Boolean);
112
+ console.log(`${ok ? '✅' : '❌'} R726 R717 patterns +1: triple-axis-tier (companion to R724 pair, covers full multi-cadence tier):`,
113
+ JSON.stringify(results, null, 2),
114
+ `\n tier entry: ${JSON.stringify(tierEntry)}`,
115
+ `\n pair entry: ${JSON.stringify(pairEntry)}`,
116
+ `\n R723 anchors (normalised, sorted): ${JSON.stringify(r723AnchorsNormalisedSorted)}`);
117
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,84 @@
1
+ /* Round 589 verification: recent-signal panel count <text>
2
+ * root gains filter brightness(1.15) on hoveredPanel ===
3
+ * 'recent'. 28th anchor in per-element brightness family.
4
+ * Sibling to R588 at legend panel — closes panel-pair
5
+ * brightness symmetry at the header-count scope.
6
+ *
7
+ * Test phases:
8
+ * 1. mock 1 flow message → recent-signal panel renders count
9
+ * 2. rest (no panel hover): filter='none', brightness-attr='1'
10
+ * 3. transition-property contains 'filter'
11
+ * 4. source: filter conditional + data-attr + transition extension
12
+ */
13
+ import { chromium } from 'playwright';
14
+ import { readFileSync } from 'node:fs';
15
+
16
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
17
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
18
+
19
+ const browser = await chromium.launch({ headless: true });
20
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
21
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
22
+ await ctx.addInitScript(() => {
23
+ try {
24
+ localStorage.setItem('anet-theme', 'cyber');
25
+ localStorage.setItem('anet-topo-layout', 'ring');
26
+ sessionStorage.setItem('anet_v3_auth', '1');
27
+ } catch {}
28
+ });
29
+ await ctx.route('**/api/hub/status*', async (route) => {
30
+ const r = await route.fetch();
31
+ const b = await r.json();
32
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
33
+ const mk = (alias) => ({
34
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
35
+ network_id: nid, project_dir: null,
36
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
37
+ });
38
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
39
+ });
40
+ // recent-signal panel renders only when flowLinks.length > 0
41
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [
42
+ { from_alias: 'a·1', to_alias: 'a·2', content: 'hi', created_at: fresh },
43
+ ] } }));
44
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
45
+ const page = await ctx.newPage();
46
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
47
+ await page.waitForSelector('[data-recent-panel-count-brightness]', { timeout: 15000, state: 'attached' });
48
+ await page.waitForTimeout(500);
49
+
50
+ const rest = await page.evaluate(() => {
51
+ const el = document.querySelector('[data-recent-panel-count-brightness]');
52
+ if (!el) return null;
53
+ const cs = getComputedStyle(el);
54
+ return {
55
+ filter: cs.filter,
56
+ transitionProperty: cs.transitionProperty,
57
+ brightnessAttr: el.getAttribute('data-recent-panel-count-brightness'),
58
+ letterSpacingAttr: el.getAttribute('data-recent-panel-count-letter-spacing'),
59
+ textContent: el.textContent,
60
+ };
61
+ });
62
+
63
+ await browser.close();
64
+
65
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
66
+ const sourceFilter = /filter: hoveredPanel === 'recent' \? 'brightness\(1\.15\)' : undefined/.test(src);
67
+ const sourceAttr = /data-recent-panel-count-brightness=\{hoveredPanel === 'recent' \? '1\.15' : '1'\}/.test(src);
68
+ const sourceTransition = /transition: 'letter-spacing 200ms ease-out, filter 200ms ease-out'/.test(src);
69
+
70
+ const results = {
71
+ count_present: !!rest,
72
+ rest_filter_none: rest?.filter === 'none',
73
+ rest_brightness_1: rest?.brightnessAttr === '1',
74
+ rest_letter_spacing: rest?.letterSpacingAttr === '0.2',
75
+ transition_has_filter: /filter/.test(rest?.transitionProperty || ''),
76
+ source_filter: sourceFilter,
77
+ source_attr: sourceAttr,
78
+ source_transition: sourceTransition,
79
+ };
80
+ const ok = Object.values(results).every(Boolean);
81
+ console.log(`${ok ? '✅' : '❌'} R589 recent-panel-count brightness (28th anchor, panel-pair symmetry closure):`,
82
+ JSON.stringify(results, null, 2),
83
+ `\n rest: ${JSON.stringify(rest)}`);
84
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,90 @@
1
+ /* Round 670 — "+N more flows" footer in recent-signal panel extends
2
+ * its single-axis brightness(1.15) hover to the multi-layer drop-
3
+ * shadow halo vocabulary. 29th anchor in the family. The footer is
4
+ * the panel's primary nav into /messages — closing its hover signature
5
+ * at 7 axes (densest on any topology surface).
6
+ *
7
+ * Source assertions:
8
+ * - filter chain uses pal.legendAccent at 0x80 + 0x40 with 2+4 stride,
9
+ * gated on hoveredRecentMore
10
+ * - data-recent-panel-more-halo-layers attr toggles '2' ↔ '0' on hover
11
+ *
12
+ * Runtime assertions:
13
+ * - footer present (≥6 recent messages so "+N more" shows)
14
+ * - rest: halo-layers='0', brightness='1', hovered='false'
15
+ */
16
+ import { chromium } from 'playwright';
17
+ import { readFileSync } from 'node:fs';
18
+
19
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
20
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
21
+
22
+ const browser = await chromium.launch({ headless: true });
23
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
24
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
25
+ await ctx.addInitScript(() => {
26
+ try {
27
+ localStorage.setItem('anet-theme', 'cyber');
28
+ localStorage.setItem('anet-topo-layout', 'ring');
29
+ sessionStorage.setItem('anet_v3_auth', '1');
30
+ } catch {}
31
+ });
32
+ await ctx.route('**/api/hub/status*', async (route) => {
33
+ const r = await route.fetch();
34
+ const b = await r.json();
35
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
36
+ const mk = (alias) => ({
37
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
38
+ network_id: nid, project_dir: null,
39
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
40
+ });
41
+ await route.fulfill({ response: r, json: { ...b, sessions: [
42
+ mk('a·1'), mk('a·2'), mk('a·3'), mk('a·4'), mk('a·5'),
43
+ mk('a·6'), mk('a·7'), mk('a·8'),
44
+ ] } });
45
+ });
46
+ // 10 unique edges across 8 nodes — enough that "+N more flows" footer renders
47
+ // (recent panel caps visible rows; surplus surfaces the footer).
48
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: Array.from({ length: 10 }, (_, i) => ({
49
+ id: `m${i}`,
50
+ from_alias: `a·${(i % 8) + 1}`,
51
+ to_alias: `a·${((i + 3) % 8) + 1}`,
52
+ kind: i % 2 ? 'task' : 'message',
53
+ content: `ping ${i}`,
54
+ network_id: 'default',
55
+ created_at: fresh,
56
+ })) } }));
57
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
58
+ const page = await ctx.newPage();
59
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
60
+ await page.waitForSelector('[data-recent-panel-more-hovered]', { timeout: 15000, state: 'attached' });
61
+ await page.waitForTimeout(500);
62
+
63
+ const restState = await page.evaluate(() => {
64
+ const el = document.querySelector('[data-recent-panel-more-hovered]');
65
+ return el ? {
66
+ layers: el.getAttribute('data-recent-panel-more-halo-layers'),
67
+ hovered: el.getAttribute('data-recent-panel-more-hovered'),
68
+ brightness: el.getAttribute('data-recent-panel-more-brightness'),
69
+ } : null;
70
+ });
71
+
72
+ await browser.close();
73
+
74
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
75
+ const sourceFilter = /hoveredRecentMore \? `drop-shadow\(0 0 2px \$\{pal\.legendAccent\}80\) drop-shadow\(0 0 4px \$\{pal\.legendAccent\}40\) brightness\(1\.15\)` : undefined/.test(src);
76
+ const sourceLayersAttr = /data-recent-panel-more-halo-layers=\{hoveredRecentMore \? '2' : '0'\}/.test(src);
77
+
78
+ const results = {
79
+ footer_present: !!restState,
80
+ rest_layers_zero: restState?.layers === '0',
81
+ rest_hovered_false: restState?.hovered === 'false',
82
+ rest_brightness_1: restState?.brightness === '1',
83
+ source_filter: sourceFilter,
84
+ source_layers_attr: sourceLayersAttr,
85
+ };
86
+ const ok = Object.values(results).every(Boolean);
87
+ console.log(`${ok ? '✅' : '❌'} R670 +N more footer multi-layer halo (7-axis hover closure):`,
88
+ JSON.stringify(results, null, 2),
89
+ `\n rest: ${JSON.stringify(restState)}`);
90
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,105 @@
1
+ /* Round 634 — panel header hot-count tspan joins hot-pulse family
2
+ * at the panel-aggregate tier. ClassName composition combines the
3
+ * one-shot 'anet-fade-in' mount fade with the continuous
4
+ * 'anet-recent-hot-pulse' breath when hotFlowCount > 0 &&
5
+ * !reducedMotion. 4th anchor in hot-pulse family.
6
+ *
7
+ * Test phases:
8
+ * 1. cold (3 messages on one edge → no hot lane): hot-count
9
+ * tspan present but hidden (opacity=0); pulse attr 'off';
10
+ * className === 'anet-fade-in' (no breath)
11
+ * 2. hot (12 messages on one edge → 1 hot lane): tspan visible
12
+ * (opacity=1); pulse attr 'on'; className contains
13
+ * 'anet-recent-hot-pulse'; computed animation-name resolves
14
+ * to anet-recent-hot-pulse-kf
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
+ async function shoot(messageCount, label) {
23
+ const browser = await chromium.launch({ headless: true });
24
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
25
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
26
+ await ctx.addInitScript(() => {
27
+ try {
28
+ localStorage.setItem('anet-theme', 'cyber');
29
+ localStorage.setItem('anet-topo-layout', 'ring');
30
+ sessionStorage.setItem('anet_v3_auth', '1');
31
+ } catch {}
32
+ });
33
+ await ctx.route('**/api/hub/status*', async (route) => {
34
+ const r = await route.fetch();
35
+ const b = await r.json();
36
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
37
+ const mk = (alias) => ({
38
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
39
+ network_id: nid, project_dir: null,
40
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
41
+ });
42
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
43
+ });
44
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages:
45
+ Array.from({ length: messageCount }, (_, i) => ({
46
+ from_alias: 'a·1', to_alias: 'a·2', content: `msg-${i}`, created_at: fresh,
47
+ }))
48
+ } }));
49
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
50
+ const page = await ctx.newPage();
51
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
52
+ await page.waitForSelector('[data-recent-panel-hot-count]', { timeout: 15000, state: 'attached' });
53
+ await page.waitForTimeout(500);
54
+ const state = await page.evaluate(() => {
55
+ const el = document.querySelector('[data-recent-panel-hot-count]');
56
+ if (!el) return null;
57
+ const cs = getComputedStyle(el);
58
+ return {
59
+ hotCount: el.getAttribute('data-recent-panel-hot-count'),
60
+ hotVisible: el.getAttribute('data-recent-panel-hot-visible'),
61
+ hotPulseAttr: el.getAttribute('data-recent-panel-hot-pulse'),
62
+ cls: el.getAttribute('class') || '',
63
+ opacity: el.getAttribute('opacity'),
64
+ animName: cs.animationName,
65
+ animDuration: cs.animationDuration,
66
+ animIter: cs.animationIterationCount,
67
+ };
68
+ });
69
+ await browser.close();
70
+ return { label, state };
71
+ }
72
+
73
+ const cold = await shoot(3, 'cold');
74
+ const hot = await shoot(12, 'hot');
75
+
76
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
77
+ const sourceClassNameGate = /className=\{hotFlowCount > 0 && !reducedMotion\s*\?\s*'anet-fade-in anet-recent-hot-pulse'\s*:\s*'anet-fade-in'\}/.test(src);
78
+ const sourcePulseAttr = /data-recent-panel-hot-pulse=\{hotFlowCount > 0 && !reducedMotion \? 'on' : 'off'\}/.test(src);
79
+
80
+ const results = {
81
+ cold_present: !!cold.state,
82
+ cold_hot_count_0: cold.state?.hotCount === '0',
83
+ cold_visible_false: cold.state?.hotVisible === 'false',
84
+ cold_pulse_off: cold.state?.hotPulseAttr === 'off',
85
+ cold_opacity_0: cold.state?.opacity === '0',
86
+ cold_cls_no_pulse: !/anet-recent-hot-pulse/.test(cold.state?.cls || ''),
87
+ cold_cls_has_fade_in: /anet-fade-in/.test(cold.state?.cls || ''),
88
+ hot_present: !!hot.state,
89
+ hot_count_1: hot.state?.hotCount === '1',
90
+ hot_visible_true: hot.state?.hotVisible === 'true',
91
+ hot_pulse_on: hot.state?.hotPulseAttr === 'on',
92
+ hot_opacity_1: hot.state?.opacity === '1',
93
+ hot_cls_has_pulse: /anet-recent-hot-pulse/.test(hot.state?.cls || ''),
94
+ hot_cls_has_fade_in: /anet-fade-in/.test(hot.state?.cls || ''),
95
+ // CSS animation-name may include both anet-fade-in + anet-recent-hot-pulse-kf
96
+ hot_anim_name_includes_kf: /anet-recent-hot-pulse-kf/.test(hot.state?.animName || ''),
97
+ source_className_gate: sourceClassNameGate,
98
+ source_pulse_attr: sourcePulseAttr,
99
+ };
100
+ const ok = Object.values(results).every(Boolean);
101
+ console.log(`${ok ? '✅' : '❌'} R634 recent-panel hot-count pulse (4th hot-pulse anchor):`,
102
+ JSON.stringify(results, null, 2),
103
+ `\n cold: ${JSON.stringify(cold.state)}`,
104
+ `\n hot: ${JSON.stringify(hot.state)}`);
105
+ process.exit(ok ? 0 : 1);