@sleep2agi/agent-network-dashboard 0.5.3-preview.185 → 0.5.3-preview.187

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 (144) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +3 -3
  3. package/.next/diagnostics/route-bundle-stats.json +5 -5
  4. package/.next/fallback-build-manifest.json +3 -3
  5. package/.next/server/app/_global-error.html +1 -1
  6. package/.next/server/app/_global-error.rsc +1 -1
  7. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  8. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  12. package/.next/server/app/_not-found.html +1 -1
  13. package/.next/server/app/_not-found.rsc +1 -1
  14. package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  15. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  16. package/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  17. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  18. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  19. package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  20. package/.next/server/app/admin.html +1 -1
  21. package/.next/server/app/admin.rsc +1 -1
  22. package/.next/server/app/admin.segments/_full.segment.rsc +1 -1
  23. package/.next/server/app/admin.segments/_head.segment.rsc +1 -1
  24. package/.next/server/app/admin.segments/_index.segment.rsc +1 -1
  25. package/.next/server/app/admin.segments/_tree.segment.rsc +1 -1
  26. package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +1 -1
  27. package/.next/server/app/admin.segments/admin.segment.rsc +1 -1
  28. package/.next/server/app/index.html +2 -2
  29. package/.next/server/app/index.rsc +2 -2
  30. package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  31. package/.next/server/app/index.segments/_full.segment.rsc +2 -2
  32. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  33. package/.next/server/app/index.segments/_index.segment.rsc +1 -1
  34. package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  35. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  36. package/.next/server/app/login.html +2 -2
  37. package/.next/server/app/login.rsc +2 -2
  38. package/.next/server/app/login.segments/_full.segment.rsc +2 -2
  39. package/.next/server/app/login.segments/_head.segment.rsc +1 -1
  40. package/.next/server/app/login.segments/_index.segment.rsc +1 -1
  41. package/.next/server/app/login.segments/_tree.segment.rsc +1 -1
  42. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  43. package/.next/server/app/login.segments/login.segment.rsc +1 -1
  44. package/.next/server/app/logs.html +1 -1
  45. package/.next/server/app/logs.rsc +1 -1
  46. package/.next/server/app/logs.segments/_full.segment.rsc +1 -1
  47. package/.next/server/app/logs.segments/_head.segment.rsc +1 -1
  48. package/.next/server/app/logs.segments/_index.segment.rsc +1 -1
  49. package/.next/server/app/logs.segments/_tree.segment.rsc +1 -1
  50. package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +1 -1
  51. package/.next/server/app/logs.segments/logs.segment.rsc +1 -1
  52. package/.next/server/app/messages.html +1 -1
  53. package/.next/server/app/messages.rsc +1 -1
  54. package/.next/server/app/messages.segments/_full.segment.rsc +1 -1
  55. package/.next/server/app/messages.segments/_head.segment.rsc +1 -1
  56. package/.next/server/app/messages.segments/_index.segment.rsc +1 -1
  57. package/.next/server/app/messages.segments/_tree.segment.rsc +1 -1
  58. package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +1 -1
  59. package/.next/server/app/messages.segments/messages.segment.rsc +1 -1
  60. package/.next/server/app/node.html +1 -1
  61. package/.next/server/app/node.rsc +1 -1
  62. package/.next/server/app/node.segments/_full.segment.rsc +1 -1
  63. package/.next/server/app/node.segments/_head.segment.rsc +1 -1
  64. package/.next/server/app/node.segments/_index.segment.rsc +1 -1
  65. package/.next/server/app/node.segments/_tree.segment.rsc +1 -1
  66. package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +1 -1
  67. package/.next/server/app/node.segments/node.segment.rsc +1 -1
  68. package/.next/server/app/nodes.html +1 -1
  69. package/.next/server/app/nodes.rsc +1 -1
  70. package/.next/server/app/nodes.segments/_full.segment.rsc +1 -1
  71. package/.next/server/app/nodes.segments/_head.segment.rsc +1 -1
  72. package/.next/server/app/nodes.segments/_index.segment.rsc +1 -1
  73. package/.next/server/app/nodes.segments/_tree.segment.rsc +1 -1
  74. package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +1 -1
  75. package/.next/server/app/nodes.segments/nodes.segment.rsc +1 -1
  76. package/.next/server/app/page_client-reference-manifest.js +1 -1
  77. package/.next/server/app/server-logs.html +1 -1
  78. package/.next/server/app/server-logs.rsc +1 -1
  79. package/.next/server/app/server-logs.segments/_full.segment.rsc +1 -1
  80. package/.next/server/app/server-logs.segments/_head.segment.rsc +1 -1
  81. package/.next/server/app/server-logs.segments/_index.segment.rsc +1 -1
  82. package/.next/server/app/server-logs.segments/_tree.segment.rsc +1 -1
  83. package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +1 -1
  84. package/.next/server/app/server-logs.segments/server-logs.segment.rsc +1 -1
  85. package/.next/server/app/settings/networks.html +1 -1
  86. package/.next/server/app/settings/networks.rsc +1 -1
  87. package/.next/server/app/settings/networks.segments/_full.segment.rsc +1 -1
  88. package/.next/server/app/settings/networks.segments/_head.segment.rsc +1 -1
  89. package/.next/server/app/settings/networks.segments/_index.segment.rsc +1 -1
  90. package/.next/server/app/settings/networks.segments/_tree.segment.rsc +1 -1
  91. package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +1 -1
  92. package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +1 -1
  93. package/.next/server/app/settings/networks.segments/settings.segment.rsc +1 -1
  94. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  95. package/.next/server/app/settings/tokens.html +1 -1
  96. package/.next/server/app/settings/tokens.rsc +1 -1
  97. package/.next/server/app/settings/tokens.segments/_full.segment.rsc +1 -1
  98. package/.next/server/app/settings/tokens.segments/_head.segment.rsc +1 -1
  99. package/.next/server/app/settings/tokens.segments/_index.segment.rsc +1 -1
  100. package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +1 -1
  101. package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +1 -1
  102. package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +1 -1
  103. package/.next/server/app/settings/tokens.segments/settings.segment.rsc +1 -1
  104. package/.next/server/app/settings.html +2 -2
  105. package/.next/server/app/settings.rsc +2 -2
  106. package/.next/server/app/settings.segments/_full.segment.rsc +2 -2
  107. package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  108. package/.next/server/app/settings.segments/_index.segment.rsc +1 -1
  109. package/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
  110. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +2 -2
  111. package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  112. package/.next/server/app/tasks.html +1 -1
  113. package/.next/server/app/tasks.rsc +1 -1
  114. package/.next/server/app/tasks.segments/_full.segment.rsc +1 -1
  115. package/.next/server/app/tasks.segments/_head.segment.rsc +1 -1
  116. package/.next/server/app/tasks.segments/_index.segment.rsc +1 -1
  117. package/.next/server/app/tasks.segments/_tree.segment.rsc +1 -1
  118. package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +1 -1
  119. package/.next/server/app/tasks.segments/tasks.segment.rsc +1 -1
  120. package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js +1 -1
  121. package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js.map +1 -1
  122. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js +3 -3
  123. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js.map +1 -1
  124. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js +1 -1
  125. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js.map +1 -1
  126. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js +1 -1
  127. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js.map +1 -1
  128. package/.next/server/middleware-build-manifest.js +3 -3
  129. package/.next/server/pages/404.html +1 -1
  130. package/.next/server/pages/500.html +1 -1
  131. package/.next/static/chunks/{09b9obth5p7ey.js → 0-vg9uuwshm~u.js} +1 -1
  132. package/.next/static/chunks/01t19h6doi5uo.js +4 -0
  133. package/.next/static/chunks/{0qo2jnmc~2x6r.js → 0kvu7uu7l40a6.js} +1 -1
  134. package/.next/static/chunks/{0_ywg77fy0kxs.js → 17z7vbs-c4_70.js} +1 -1
  135. package/.next/trace +2 -2
  136. package/.next/trace-build +1 -1
  137. package/app/components/TopoGraph.tsx +73 -5
  138. package/package.json +1 -1
  139. package/scripts/topo-edge-badge-digit-halo-layers-test.mjs +107 -0
  140. package/scripts/topo-zoom-in-out-halo-layers-test.mjs +97 -0
  141. package/.next/static/chunks/0xu-3tff-gnlt.js +0 -4
  142. /package/.next/static/{IqMVXY-eUv1iRB-WS0feJ → xOITy7lUAxDAbL0lMYtNF}/_buildManifest.js +0 -0
  143. /package/.next/static/{IqMVXY-eUv1iRB-WS0feJ → xOITy7lUAxDAbL0lMYtNF}/_clientMiddlewareManifest.js +0 -0
  144. /package/.next/static/{IqMVXY-eUv1iRB-WS0feJ → xOITy7lUAxDAbL0lMYtNF}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,59276,e=>{"use strict";var s=e.i(12629),a=e.i(11449);let t=async e=>{let s=await fetch(e);if(401===s.status)throw window.location.assign("/login"),Error("unauthorized");return s.json()},r={refreshInterval:5e3,dedupingInterval:3e3};function n(e,s){if(!s)return e;let a=e.includes("?")?"&":"?";return`${e}${a}network_id=${encodeURIComponent(s)}`}e.s(["useAnetConfig",0,function(){let{data:e}=(0,s.default)("/api/anet/config",t,{refreshInterval:3e4});return{config:e||null}},"useHealth",0,function(){let{data:e,error:a}=(0,s.default)("/api/hub/health",t,r);return{health:e||null,error:a}},"useLicense",0,function(){let{data:e,error:a}=(0,s.default)("/api/hub/license",t,{refreshInterval:6e4});return{license:e?.ok?e:null,error:a}},"useMessages",0,function(e=100){let{networkId:l}=(0,a.useNetworkId)(),{data:i,error:c,isLoading:d}=(0,s.default)(n(`/api/hub/messages?limit=${e}`,l),t,r);return{messages:i?.messages||[],error:c,isLoading:d}},"useSessions",0,function(){let{networkId:e}=(0,a.useNetworkId)(),{data:l,error:i,isLoading:c}=(0,s.default)(n("/api/hub/status",e),t,r);return{sessions:l?.sessions||[],hint:l?._hint,error:i,isLoading:c}},"useStats",0,function(){let{networkId:e}=(0,a.useNetworkId)(),{data:l,error:i}=(0,s.default)(n("/api/hub/stats",e),t,r);return{stats:l?.ok?l:null,error:i}},"useTasks",0,function(e){let{networkId:l}=(0,a.useNetworkId)(),i=new URLSearchParams({limit:"100",...e}).toString(),{data:c,error:d,isLoading:o}=(0,s.default)(n(`/api/hub/tasks?${i}`,l),t,r);return{tasks:c?.tasks||[],count:c?.count??0,source:c?.source,error:d,isLoading:o}}])},70286,e=>{"use strict";e.s(["DASHBOARD_VERSION",0,"0.5.3-preview.185"],70286)},65610,e=>{"use strict";var s=e.i(22381),a=e.i(23910),t=e.i(56839),r=e.i(59276),n=e.i(70286);e.s(["default",0,function(){let{config:e}=(0,r.useAnetConfig)(),{health:l}=(0,r.useHealth)(),{license:i}=(0,r.useLicense)(),[c,d]=(0,a.useState)(""),[o,x]=(0,a.useState)(""),[m,h]=(0,a.useState)(""),[g,u]=(0,a.useState)(""),[p,N]=(0,a.useState)(""),b="flex flex-col gap-1 sm:flex-row sm:items-start sm:justify-between",j="break-all sm:max-w-[320px] sm:text-right";return(0,s.jsxs)("div",{className:"min-h-screen bg-[#0a0a1a] text-gray-100 p-4 sm:p-6 font-mono",children:[(0,s.jsx)("h1",{className:"text-2xl font-bold text-white mb-3 lg:ml-0 ml-10",children:"Settings"}),(0,s.jsx)("nav",{className:"mb-8 flex flex-wrap gap-1 text-xs",children:[{href:"#connection",label:"Connection"},{href:"#account",label:"Account"},{href:"#resources",label:"Resources"}].map(e=>(0,s.jsx)("a",{href:e.href,className:"rounded-md px-2.5 py-1 text-gray-500 hover:text-cyan-300 hover:bg-cyan-500/10 transition-colors",children:e.label},e.href))}),(0,s.jsxs)("div",{className:"max-w-2xl space-y-10",children:[(0,s.jsxs)("div",{id:"connection",className:"space-y-4 scroll-mt-6",children:[(0,s.jsxs)("div",{className:"flex items-center gap-2 px-1",children:[(0,s.jsx)("div",{className:"text-[11px] uppercase tracking-[0.14em] text-gray-400 font-semibold",children:"Connection"}),(0,s.jsx)("div",{className:"flex-1 h-px bg-[#2a2a4a]"})]}),(0,s.jsxs)("section",{className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5",children:[(0,s.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-4",children:"CommHub Connection"}),(0,s.jsxs)("div",{className:"space-y-3 text-sm",children:[(0,s.jsxs)("div",{className:b,children:[(0,s.jsx)("span",{className:"text-gray-500 shrink-0",children:"Hub URL"}),(0,s.jsx)("span",{className:`text-cyan-300 ${j}`,children:e?.hub||"not configured"})]}),(0,s.jsxs)("div",{className:b,children:[(0,s.jsx)("span",{className:"text-gray-500",children:"Config Source"}),(0,s.jsx)("span",{className:`text-gray-300 ${j}`,children:e?.source==="file"?"Local file (~/.anet/config.json)":e?.source==="runtime-env"?"Vercel env vars":"Missing"})]}),(0,s.jsxs)("div",{className:b,children:[(0,s.jsx)("span",{className:"text-gray-500",children:"Auth Token"}),(0,s.jsx)("span",{className:`${e?.tokenConfigured?"text-green-400":"text-red-400"} ${j}`,children:e?.tokenConfigured?`Configured (${e.tokenPreview})`:"Not configured"})]}),(0,s.jsxs)("div",{className:b,children:[(0,s.jsx)("span",{className:"text-gray-500",children:"Server Auth"}),(0,s.jsx)("span",{className:`${l?.auth==="enabled"?"text-green-400":"text-yellow-400"} sm:text-right`,children:l?.auth||"--"})]}),e?.error&&(0,s.jsx)("div",{className:"border-t border-[#2a2a4a] pt-3 text-xs text-gray-600",children:e.error})]})]}),(0,s.jsxs)("section",{className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5",children:[(0,s.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-4",children:"Server Info"}),(0,s.jsxs)("div",{className:"space-y-3 text-sm",children:[(0,s.jsxs)("div",{className:b,children:[(0,s.jsx)("span",{className:"text-gray-500",children:"Version"}),(0,s.jsx)("span",{className:`text-gray-300 ${j}`,children:l?.version||"--"})]}),(0,s.jsxs)("div",{className:b,children:[(0,s.jsx)("span",{className:"text-gray-500",children:"Sessions"}),(0,s.jsx)("span",{className:`text-gray-300 ${j}`,children:l?.sessions??"--"})]}),(0,s.jsxs)("div",{className:b,children:[(0,s.jsxs)("span",{className:"text-gray-500",children:["SSE streams ",(0,s.jsx)("span",{className:"text-gray-600",children:"· server"})]}),(0,s.jsx)("span",{className:`text-gray-300 ${j}`,children:l?.sse_connections??"--"})]}),(0,s.jsxs)("div",{className:b,children:[(0,s.jsx)("span",{className:"text-gray-500",children:"Uptime"}),(0,s.jsx)("span",{className:`text-gray-300 ${j}`,children:l?.uptime?`${Math.floor(l.uptime/3600)}h ${Math.floor(l.uptime%3600/60)}m`:"--"})]})]})]}),(0,s.jsxs)("section",{className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5",children:[(0,s.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-4",children:"Dashboard"}),(0,s.jsxs)("div",{className:"space-y-3 text-sm",children:[(0,s.jsxs)("div",{className:b,children:[(0,s.jsx)("span",{className:"text-gray-500",children:"Version"}),(0,s.jsx)("span",{className:`text-gray-300 font-mono ${j}`,title:"From package.json @sleep2agi/agent-network-dashboard",children:n.DASHBOARD_VERSION})]}),(0,s.jsxs)("div",{className:b,children:[(0,s.jsx)("span",{className:"text-gray-500",children:"Data Layer"}),(0,s.jsx)("span",{className:`text-gray-300 ${j}`,children:"SWR (5s refresh, 3s dedup)"})]}),(0,s.jsxs)("div",{className:b,children:[(0,s.jsx)("span",{className:"text-gray-500",children:"Pages"}),(0,s.jsx)("span",{className:`text-gray-300 ${j}`,children:"Overview, Tasks, Nodes, Messages, Networks, Audit, Server Logs, Admin, Settings"})]})]})]})]}),(0,s.jsxs)("div",{id:"account",className:"space-y-4 scroll-mt-6",children:[(0,s.jsxs)("div",{className:"flex items-center gap-2 px-1",children:[(0,s.jsx)("div",{className:"text-[11px] uppercase tracking-[0.14em] text-gray-400 font-semibold",children:"Account"}),(0,s.jsx)("div",{className:"flex-1 h-px bg-[#2a2a4a]"})]}),(0,s.jsxs)("section",{className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5",children:[(0,s.jsxs)("h2",{className:"text-sm font-semibold text-gray-300 mb-4 flex items-center gap-2",children:["License",i?.license&&(0,s.jsxs)("span",{className:`inline-flex items-center gap-1.5 text-[10px] font-medium px-2 py-0.5 rounded-full border ${"pro"===i.license.type?"text-green-300 bg-green-500/10 border-green-500/30":i.license.days_left<=7?"text-red-300 bg-red-500/10 border-red-500/30":"text-amber-300 bg-amber-500/10 border-amber-500/30"}`,children:[(0,s.jsx)("span",{"aria-hidden":!0,className:"w-1.5 h-1.5 rounded-full bg-current"}),i.license.type,i.license.days_left?` \xb7 ${i.license.days_left}d left`:""]})]}),i?.license?(0,s.jsxs)("div",{className:"space-y-3 text-sm",children:[i.license.days_left<=7&&(0,s.jsxs)("div",{className:b,children:[(0,s.jsx)("span",{className:"text-red-400 font-medium",children:"⚠ Expiring soon"}),(0,s.jsxs)("span",{className:"text-red-400",children:[i.license.days_left," days left"]})]}),(0,s.jsxs)("div",{className:b,children:[(0,s.jsx)("span",{className:"text-gray-500",children:"Expires"}),(0,s.jsx)("span",{className:`text-gray-300 ${j}`,children:i.license.expires_at})]}),i.limits&&(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)("div",{className:b,children:[(0,s.jsx)("span",{className:"text-gray-500",children:"Max Agents"}),(0,s.jsx)("span",{className:`text-gray-300 ${j}`,children:i.limits.max_agents})]}),(0,s.jsxs)("div",{className:b,children:[(0,s.jsx)("span",{className:"text-gray-500",children:"Max Networks"}),(0,s.jsx)("span",{className:`text-gray-300 ${j}`,children:i.limits.max_networks})]}),(0,s.jsxs)("div",{className:b,children:[(0,s.jsx)("span",{className:"text-gray-500",children:"Tasks/Day"}),(0,s.jsx)("span",{className:`text-gray-300 ${j}`,children:i.limits.max_tasks_day})]})]}),(0,s.jsxs)("div",{className:"pt-3 border-t border-[#2a2a4a]",children:[(0,s.jsxs)("div",{className:"flex gap-2",children:[(0,s.jsx)("input",{type:"text",value:c,onChange:e=>d(e.target.value),placeholder:"anet-XXXX-XXXX-XXXX-XXXX",className:"flex-1 bg-[#0a0a15] border border-[#2a2a4a] rounded px-3 py-2 text-xs text-white placeholder-gray-600 focus:outline-none"}),(0,s.jsx)("button",{onClick:async()=>{if(!c.trim())return;let e=await fetch("/api/hub/license",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({key:c})}),s=await e.json();x(s.ok?`Activated: ${s.type}`:`Failed: ${s.error}`),s.ok&&d(""),setTimeout(()=>x(""),5e3)},className:"px-3 py-2 bg-cyan-600 hover:bg-cyan-500 text-white text-xs rounded transition-colors",children:"Activate"})]}),o&&(0,s.jsx)("div",{className:`mt-2 text-xs ${o.startsWith("Failed")?"text-red-400":"text-green-400"}`,children:o})]})]}):(0,s.jsx)("div",{className:"text-xs text-gray-600",children:"License info not available"})]}),(0,s.jsxs)("section",{className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5",children:[(0,s.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-4",children:"Change Password"}),(0,s.jsxs)("div",{className:"space-y-3",children:[(0,s.jsx)("input",{type:"password",value:m,onChange:e=>h(e.target.value),placeholder:"Current password",className:"w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-3 py-2 text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none"}),(0,s.jsx)("input",{type:"password",value:g,onChange:e=>u(e.target.value),placeholder:"New password",className:"w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-3 py-2 text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none"}),(0,s.jsx)("button",{onClick:async()=>{if(!m||!g)return;let e=sessionStorage.getItem("anet_v3_auth");if(!e)return void N("Not logged in with V3 auth");let{token:s}=JSON.parse(e),a=await fetch("/api/hub/auth",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"change_password",token:s,current_password:m,new_password:g})}),t=await a.json();if(N(t.ok?"Password changed":`Failed: ${t.error}`),t.ok){if(t.token){let s=JSON.parse(e);sessionStorage.setItem("anet_v3_auth",JSON.stringify({...s,token:t.token}))}h(""),u("")}setTimeout(()=>N(""),5e3)},disabled:!m||!g,className:"px-4 py-2 bg-cyan-600 hover:bg-cyan-500 disabled:bg-gray-800 disabled:text-gray-600 text-white text-sm rounded-lg transition-colors",children:"Change Password"})]}),p&&(0,s.jsx)("div",{className:`mt-2 text-xs ${p.startsWith("Failed")?"text-red-400":"text-green-400"}`,children:p})]}),(0,s.jsxs)("section",{className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5",children:[(0,s.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-4",children:"Sign out"}),(0,s.jsx)("p",{className:"text-xs text-gray-500 mb-3",children:"Signing out clears your dashboard session cookie. You'll return to the login page."}),(0,s.jsx)("button",{onClick:async()=>{await fetch("/api/auth/logout",{method:"POST"}).catch(()=>{}),window.location.assign("/login")},className:"px-4 py-2 bg-transparent hover:bg-[#1a1a2a] text-gray-300 text-sm rounded-lg border border-[#2a2a4a] hover:border-[#3a3a5a] transition-colors",children:"Sign out"})]})]}),(0,s.jsxs)("div",{id:"resources",className:"space-y-4 scroll-mt-6",children:[(0,s.jsxs)("div",{className:"flex items-center gap-2 px-1",children:[(0,s.jsx)("div",{className:"text-[11px] uppercase tracking-[0.14em] text-gray-400 font-semibold",children:"Resources"}),(0,s.jsx)("div",{className:"flex-1 h-px bg-[#2a2a4a]"})]}),(0,s.jsxs)("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-4",children:[(0,s.jsxs)(t.default,{href:"/settings/tokens",className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5 hover:border-cyan-500/30 transition-colors",children:[(0,s.jsx)("h2",{className:"text-sm font-semibold text-gray-300",children:"API Tokens"}),(0,s.jsx)("p",{className:"text-xs text-gray-500 mt-2",children:"Create and manage tokens for CLI access."}),(0,s.jsx)("span",{className:"text-xs text-cyan-400 mt-3 inline-block",children:"Manage →"})]}),(0,s.jsxs)(t.default,{href:"/settings/networks",className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5 hover:border-cyan-500/30 transition-colors",children:[(0,s.jsx)("h2",{className:"text-sm font-semibold text-gray-300",children:"Networks"}),(0,s.jsx)("p",{className:"text-xs text-gray-500 mt-2",children:"Create, manage, and delete agent networks."}),(0,s.jsx)("span",{className:"text-xs text-cyan-400 mt-3 inline-block",children:"Manage →"})]})]})]})]})]})}])}]);
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,59276,e=>{"use strict";var s=e.i(12629),a=e.i(11449);let t=async e=>{let s=await fetch(e);if(401===s.status)throw window.location.assign("/login"),Error("unauthorized");return s.json()},r={refreshInterval:5e3,dedupingInterval:3e3};function n(e,s){if(!s)return e;let a=e.includes("?")?"&":"?";return`${e}${a}network_id=${encodeURIComponent(s)}`}e.s(["useAnetConfig",0,function(){let{data:e}=(0,s.default)("/api/anet/config",t,{refreshInterval:3e4});return{config:e||null}},"useHealth",0,function(){let{data:e,error:a}=(0,s.default)("/api/hub/health",t,r);return{health:e||null,error:a}},"useLicense",0,function(){let{data:e,error:a}=(0,s.default)("/api/hub/license",t,{refreshInterval:6e4});return{license:e?.ok?e:null,error:a}},"useMessages",0,function(e=100){let{networkId:l}=(0,a.useNetworkId)(),{data:i,error:c,isLoading:d}=(0,s.default)(n(`/api/hub/messages?limit=${e}`,l),t,r);return{messages:i?.messages||[],error:c,isLoading:d}},"useSessions",0,function(){let{networkId:e}=(0,a.useNetworkId)(),{data:l,error:i,isLoading:c}=(0,s.default)(n("/api/hub/status",e),t,r);return{sessions:l?.sessions||[],hint:l?._hint,error:i,isLoading:c}},"useStats",0,function(){let{networkId:e}=(0,a.useNetworkId)(),{data:l,error:i}=(0,s.default)(n("/api/hub/stats",e),t,r);return{stats:l?.ok?l:null,error:i}},"useTasks",0,function(e){let{networkId:l}=(0,a.useNetworkId)(),i=new URLSearchParams({limit:"100",...e}).toString(),{data:c,error:d,isLoading:o}=(0,s.default)(n(`/api/hub/tasks?${i}`,l),t,r);return{tasks:c?.tasks||[],count:c?.count??0,source:c?.source,error:d,isLoading:o}}])},70286,e=>{"use strict";e.s(["DASHBOARD_VERSION",0,"0.5.3-preview.187"],70286)},65610,e=>{"use strict";var s=e.i(22381),a=e.i(23910),t=e.i(56839),r=e.i(59276),n=e.i(70286);e.s(["default",0,function(){let{config:e}=(0,r.useAnetConfig)(),{health:l}=(0,r.useHealth)(),{license:i}=(0,r.useLicense)(),[c,d]=(0,a.useState)(""),[o,x]=(0,a.useState)(""),[m,h]=(0,a.useState)(""),[g,u]=(0,a.useState)(""),[p,N]=(0,a.useState)(""),b="flex flex-col gap-1 sm:flex-row sm:items-start sm:justify-between",j="break-all sm:max-w-[320px] sm:text-right";return(0,s.jsxs)("div",{className:"min-h-screen bg-[#0a0a1a] text-gray-100 p-4 sm:p-6 font-mono",children:[(0,s.jsx)("h1",{className:"text-2xl font-bold text-white mb-3 lg:ml-0 ml-10",children:"Settings"}),(0,s.jsx)("nav",{className:"mb-8 flex flex-wrap gap-1 text-xs",children:[{href:"#connection",label:"Connection"},{href:"#account",label:"Account"},{href:"#resources",label:"Resources"}].map(e=>(0,s.jsx)("a",{href:e.href,className:"rounded-md px-2.5 py-1 text-gray-500 hover:text-cyan-300 hover:bg-cyan-500/10 transition-colors",children:e.label},e.href))}),(0,s.jsxs)("div",{className:"max-w-2xl space-y-10",children:[(0,s.jsxs)("div",{id:"connection",className:"space-y-4 scroll-mt-6",children:[(0,s.jsxs)("div",{className:"flex items-center gap-2 px-1",children:[(0,s.jsx)("div",{className:"text-[11px] uppercase tracking-[0.14em] text-gray-400 font-semibold",children:"Connection"}),(0,s.jsx)("div",{className:"flex-1 h-px bg-[#2a2a4a]"})]}),(0,s.jsxs)("section",{className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5",children:[(0,s.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-4",children:"CommHub Connection"}),(0,s.jsxs)("div",{className:"space-y-3 text-sm",children:[(0,s.jsxs)("div",{className:b,children:[(0,s.jsx)("span",{className:"text-gray-500 shrink-0",children:"Hub URL"}),(0,s.jsx)("span",{className:`text-cyan-300 ${j}`,children:e?.hub||"not configured"})]}),(0,s.jsxs)("div",{className:b,children:[(0,s.jsx)("span",{className:"text-gray-500",children:"Config Source"}),(0,s.jsx)("span",{className:`text-gray-300 ${j}`,children:e?.source==="file"?"Local file (~/.anet/config.json)":e?.source==="runtime-env"?"Vercel env vars":"Missing"})]}),(0,s.jsxs)("div",{className:b,children:[(0,s.jsx)("span",{className:"text-gray-500",children:"Auth Token"}),(0,s.jsx)("span",{className:`${e?.tokenConfigured?"text-green-400":"text-red-400"} ${j}`,children:e?.tokenConfigured?`Configured (${e.tokenPreview})`:"Not configured"})]}),(0,s.jsxs)("div",{className:b,children:[(0,s.jsx)("span",{className:"text-gray-500",children:"Server Auth"}),(0,s.jsx)("span",{className:`${l?.auth==="enabled"?"text-green-400":"text-yellow-400"} sm:text-right`,children:l?.auth||"--"})]}),e?.error&&(0,s.jsx)("div",{className:"border-t border-[#2a2a4a] pt-3 text-xs text-gray-600",children:e.error})]})]}),(0,s.jsxs)("section",{className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5",children:[(0,s.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-4",children:"Server Info"}),(0,s.jsxs)("div",{className:"space-y-3 text-sm",children:[(0,s.jsxs)("div",{className:b,children:[(0,s.jsx)("span",{className:"text-gray-500",children:"Version"}),(0,s.jsx)("span",{className:`text-gray-300 ${j}`,children:l?.version||"--"})]}),(0,s.jsxs)("div",{className:b,children:[(0,s.jsx)("span",{className:"text-gray-500",children:"Sessions"}),(0,s.jsx)("span",{className:`text-gray-300 ${j}`,children:l?.sessions??"--"})]}),(0,s.jsxs)("div",{className:b,children:[(0,s.jsxs)("span",{className:"text-gray-500",children:["SSE streams ",(0,s.jsx)("span",{className:"text-gray-600",children:"· server"})]}),(0,s.jsx)("span",{className:`text-gray-300 ${j}`,children:l?.sse_connections??"--"})]}),(0,s.jsxs)("div",{className:b,children:[(0,s.jsx)("span",{className:"text-gray-500",children:"Uptime"}),(0,s.jsx)("span",{className:`text-gray-300 ${j}`,children:l?.uptime?`${Math.floor(l.uptime/3600)}h ${Math.floor(l.uptime%3600/60)}m`:"--"})]})]})]}),(0,s.jsxs)("section",{className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5",children:[(0,s.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-4",children:"Dashboard"}),(0,s.jsxs)("div",{className:"space-y-3 text-sm",children:[(0,s.jsxs)("div",{className:b,children:[(0,s.jsx)("span",{className:"text-gray-500",children:"Version"}),(0,s.jsx)("span",{className:`text-gray-300 font-mono ${j}`,title:"From package.json @sleep2agi/agent-network-dashboard",children:n.DASHBOARD_VERSION})]}),(0,s.jsxs)("div",{className:b,children:[(0,s.jsx)("span",{className:"text-gray-500",children:"Data Layer"}),(0,s.jsx)("span",{className:`text-gray-300 ${j}`,children:"SWR (5s refresh, 3s dedup)"})]}),(0,s.jsxs)("div",{className:b,children:[(0,s.jsx)("span",{className:"text-gray-500",children:"Pages"}),(0,s.jsx)("span",{className:`text-gray-300 ${j}`,children:"Overview, Tasks, Nodes, Messages, Networks, Audit, Server Logs, Admin, Settings"})]})]})]})]}),(0,s.jsxs)("div",{id:"account",className:"space-y-4 scroll-mt-6",children:[(0,s.jsxs)("div",{className:"flex items-center gap-2 px-1",children:[(0,s.jsx)("div",{className:"text-[11px] uppercase tracking-[0.14em] text-gray-400 font-semibold",children:"Account"}),(0,s.jsx)("div",{className:"flex-1 h-px bg-[#2a2a4a]"})]}),(0,s.jsxs)("section",{className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5",children:[(0,s.jsxs)("h2",{className:"text-sm font-semibold text-gray-300 mb-4 flex items-center gap-2",children:["License",i?.license&&(0,s.jsxs)("span",{className:`inline-flex items-center gap-1.5 text-[10px] font-medium px-2 py-0.5 rounded-full border ${"pro"===i.license.type?"text-green-300 bg-green-500/10 border-green-500/30":i.license.days_left<=7?"text-red-300 bg-red-500/10 border-red-500/30":"text-amber-300 bg-amber-500/10 border-amber-500/30"}`,children:[(0,s.jsx)("span",{"aria-hidden":!0,className:"w-1.5 h-1.5 rounded-full bg-current"}),i.license.type,i.license.days_left?` \xb7 ${i.license.days_left}d left`:""]})]}),i?.license?(0,s.jsxs)("div",{className:"space-y-3 text-sm",children:[i.license.days_left<=7&&(0,s.jsxs)("div",{className:b,children:[(0,s.jsx)("span",{className:"text-red-400 font-medium",children:"⚠ Expiring soon"}),(0,s.jsxs)("span",{className:"text-red-400",children:[i.license.days_left," days left"]})]}),(0,s.jsxs)("div",{className:b,children:[(0,s.jsx)("span",{className:"text-gray-500",children:"Expires"}),(0,s.jsx)("span",{className:`text-gray-300 ${j}`,children:i.license.expires_at})]}),i.limits&&(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)("div",{className:b,children:[(0,s.jsx)("span",{className:"text-gray-500",children:"Max Agents"}),(0,s.jsx)("span",{className:`text-gray-300 ${j}`,children:i.limits.max_agents})]}),(0,s.jsxs)("div",{className:b,children:[(0,s.jsx)("span",{className:"text-gray-500",children:"Max Networks"}),(0,s.jsx)("span",{className:`text-gray-300 ${j}`,children:i.limits.max_networks})]}),(0,s.jsxs)("div",{className:b,children:[(0,s.jsx)("span",{className:"text-gray-500",children:"Tasks/Day"}),(0,s.jsx)("span",{className:`text-gray-300 ${j}`,children:i.limits.max_tasks_day})]})]}),(0,s.jsxs)("div",{className:"pt-3 border-t border-[#2a2a4a]",children:[(0,s.jsxs)("div",{className:"flex gap-2",children:[(0,s.jsx)("input",{type:"text",value:c,onChange:e=>d(e.target.value),placeholder:"anet-XXXX-XXXX-XXXX-XXXX",className:"flex-1 bg-[#0a0a15] border border-[#2a2a4a] rounded px-3 py-2 text-xs text-white placeholder-gray-600 focus:outline-none"}),(0,s.jsx)("button",{onClick:async()=>{if(!c.trim())return;let e=await fetch("/api/hub/license",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({key:c})}),s=await e.json();x(s.ok?`Activated: ${s.type}`:`Failed: ${s.error}`),s.ok&&d(""),setTimeout(()=>x(""),5e3)},className:"px-3 py-2 bg-cyan-600 hover:bg-cyan-500 text-white text-xs rounded transition-colors",children:"Activate"})]}),o&&(0,s.jsx)("div",{className:`mt-2 text-xs ${o.startsWith("Failed")?"text-red-400":"text-green-400"}`,children:o})]})]}):(0,s.jsx)("div",{className:"text-xs text-gray-600",children:"License info not available"})]}),(0,s.jsxs)("section",{className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5",children:[(0,s.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-4",children:"Change Password"}),(0,s.jsxs)("div",{className:"space-y-3",children:[(0,s.jsx)("input",{type:"password",value:m,onChange:e=>h(e.target.value),placeholder:"Current password",className:"w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-3 py-2 text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none"}),(0,s.jsx)("input",{type:"password",value:g,onChange:e=>u(e.target.value),placeholder:"New password",className:"w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-3 py-2 text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none"}),(0,s.jsx)("button",{onClick:async()=>{if(!m||!g)return;let e=sessionStorage.getItem("anet_v3_auth");if(!e)return void N("Not logged in with V3 auth");let{token:s}=JSON.parse(e),a=await fetch("/api/hub/auth",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"change_password",token:s,current_password:m,new_password:g})}),t=await a.json();if(N(t.ok?"Password changed":`Failed: ${t.error}`),t.ok){if(t.token){let s=JSON.parse(e);sessionStorage.setItem("anet_v3_auth",JSON.stringify({...s,token:t.token}))}h(""),u("")}setTimeout(()=>N(""),5e3)},disabled:!m||!g,className:"px-4 py-2 bg-cyan-600 hover:bg-cyan-500 disabled:bg-gray-800 disabled:text-gray-600 text-white text-sm rounded-lg transition-colors",children:"Change Password"})]}),p&&(0,s.jsx)("div",{className:`mt-2 text-xs ${p.startsWith("Failed")?"text-red-400":"text-green-400"}`,children:p})]}),(0,s.jsxs)("section",{className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5",children:[(0,s.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-4",children:"Sign out"}),(0,s.jsx)("p",{className:"text-xs text-gray-500 mb-3",children:"Signing out clears your dashboard session cookie. You'll return to the login page."}),(0,s.jsx)("button",{onClick:async()=>{await fetch("/api/auth/logout",{method:"POST"}).catch(()=>{}),window.location.assign("/login")},className:"px-4 py-2 bg-transparent hover:bg-[#1a1a2a] text-gray-300 text-sm rounded-lg border border-[#2a2a4a] hover:border-[#3a3a5a] transition-colors",children:"Sign out"})]})]}),(0,s.jsxs)("div",{id:"resources",className:"space-y-4 scroll-mt-6",children:[(0,s.jsxs)("div",{className:"flex items-center gap-2 px-1",children:[(0,s.jsx)("div",{className:"text-[11px] uppercase tracking-[0.14em] text-gray-400 font-semibold",children:"Resources"}),(0,s.jsx)("div",{className:"flex-1 h-px bg-[#2a2a4a]"})]}),(0,s.jsxs)("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-4",children:[(0,s.jsxs)(t.default,{href:"/settings/tokens",className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5 hover:border-cyan-500/30 transition-colors",children:[(0,s.jsx)("h2",{className:"text-sm font-semibold text-gray-300",children:"API Tokens"}),(0,s.jsx)("p",{className:"text-xs text-gray-500 mt-2",children:"Create and manage tokens for CLI access."}),(0,s.jsx)("span",{className:"text-xs text-cyan-400 mt-3 inline-block",children:"Manage →"})]}),(0,s.jsxs)(t.default,{href:"/settings/networks",className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5 hover:border-cyan-500/30 transition-colors",children:[(0,s.jsx)("h2",{className:"text-sm font-semibold text-gray-300",children:"Networks"}),(0,s.jsx)("p",{className:"text-xs text-gray-500 mt-2",children:"Create, manage, and delete agent networks."}),(0,s.jsx)("span",{className:"text-xs text-cyan-400 mt-3 inline-block",children:"Manage →"})]})]})]})]})]})}])}]);
package/.next/trace CHANGED
@@ -1,2 +1,2 @@
1
- [{"name":"generate-buildid","duration":287,"timestamp":257699239650,"id":4,"parentId":1,"tags":{},"startTime":1779065671486,"traceId":"91d2da37e51f2be9"},{"name":"load-custom-routes","duration":460,"timestamp":257699240113,"id":5,"parentId":1,"tags":{},"startTime":1779065671486,"traceId":"91d2da37e51f2be9"},{"name":"create-dist-dir","duration":819,"timestamp":257699240614,"id":6,"parentId":1,"tags":{},"startTime":1779065671487,"traceId":"91d2da37e51f2be9"},{"name":"clean","duration":34142,"timestamp":257699242264,"id":7,"parentId":1,"tags":{},"startTime":1779065671489,"traceId":"91d2da37e51f2be9"},{"name":"discover-routes","duration":26412,"timestamp":257699360240,"id":8,"parentId":1,"tags":{},"startTime":1779065671607,"traceId":"91d2da37e51f2be9"},{"name":"create-root-mapping","duration":145,"timestamp":257699386730,"id":9,"parentId":1,"tags":{},"startTime":1779065671633,"traceId":"91d2da37e51f2be9"},{"name":"generate-route-types","duration":21565,"timestamp":257699389376,"id":10,"parentId":1,"tags":{},"startTime":1779065671636,"traceId":"91d2da37e51f2be9"},{"name":"public-dir-conflict-check","duration":102,"timestamp":257699411055,"id":11,"parentId":1,"tags":{},"startTime":1779065671657,"traceId":"91d2da37e51f2be9"},{"name":"generate-routes-manifest","duration":4911,"timestamp":257699411268,"id":12,"parentId":1,"tags":{},"startTime":1779065671658,"traceId":"91d2da37e51f2be9"},{"name":"run-turbopack","duration":6393268,"timestamp":257699422714,"id":14,"parentId":1,"tags":{},"startTime":1779065671669,"traceId":"91d2da37e51f2be9"},{"name":"turbopack-build-events","duration":101,"timestamp":257699729266,"id":15,"parentId":1,"tags":{},"startTime":1779065671976,"traceId":"91d2da37e51f2be9"},{"name":"run-typescript","duration":10002175,"timestamp":257705829974,"id":16,"parentId":1,"tags":{},"startTime":1779065678076,"traceId":"91d2da37e51f2be9"},{"name":"generate-required-server-files","duration":2509,"timestamp":257715833281,"id":18,"parentId":1,"tags":{},"startTime":1779065688080,"traceId":"91d2da37e51f2be9"},{"name":"check-static-error-page","duration":15137,"timestamp":257716052281,"id":20,"parentId":19,"tags":{},"startTime":1779065688299,"traceId":"91d2da37e51f2be9"},{"name":"is-page-static","duration":533198,"timestamp":257716072409,"id":69,"parentId":28,"tags":{},"startTime":1779065688319,"traceId":"91d2da37e51f2be9"},{"name":"check-page","duration":547243,"timestamp":257716058522,"id":28,"parentId":19,"tags":{"page":"/api/hub/audit-log"},"startTime":1779065688305,"traceId":"91d2da37e51f2be9"},{"name":"is-page-static","duration":537956,"timestamp":257716072822,"id":71,"parentId":30,"tags":{},"startTime":1779065688319,"traceId":"91d2da37e51f2be9"},{"name":"check-page","duration":552111,"timestamp":257716058748,"id":30,"parentId":19,"tags":{"page":"/api/hub/broadcast"},"startTime":1779065688305,"traceId":"91d2da37e51f2be9"},{"name":"is-page-static","duration":562415,"timestamp":257716072900,"id":72,"parentId":32,"tags":{},"startTime":1779065688319,"traceId":"91d2da37e51f2be9"},{"name":"check-page","duration":576243,"timestamp":257716059142,"id":32,"parentId":19,"tags":{"page":"/api/hub/health"},"startTime":1779065688305,"traceId":"91d2da37e51f2be9"},{"name":"is-page-static","duration":566863,"timestamp":257716071896,"id":65,"parentId":22,"tags":{},"startTime":1779065688318,"traceId":"91d2da37e51f2be9"},{"name":"check-page","duration":583768,"timestamp":257716055088,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1779065688301,"traceId":"91d2da37e51f2be9"},{"name":"is-page-static","duration":573546,"timestamp":257716075785,"id":73,"parentId":33,"tags":{},"startTime":1779065688322,"traceId":"91d2da37e51f2be9"},{"name":"check-page","duration":590142,"timestamp":257716059251,"id":33,"parentId":19,"tags":{"page":"/api/hub/inbox"},"startTime":1779065688306,"traceId":"91d2da37e51f2be9"},{"name":"is-page-static","duration":589817,"timestamp":257716075934,"id":75,"parentId":35,"tags":{},"startTime":1779065688322,"traceId":"91d2da37e51f2be9"},{"name":"check-page","duration":606325,"timestamp":257716059497,"id":35,"parentId":19,"tags":{"page":"/api/hub/messages"},"startTime":1779065688306,"traceId":"91d2da37e51f2be9"},{"name":"is-page-static","duration":594797,"timestamp":257716075956,"id":76,"parentId":36,"tags":{},"startTime":1779065688322,"traceId":"91d2da37e51f2be9"},{"name":"check-page","duration":610642,"timestamp":257716060177,"id":36,"parentId":19,"tags":{"page":"/api/hub/networks"},"startTime":1779065688306,"traceId":"91d2da37e51f2be9"},{"name":"is-page-static","duration":599724,"timestamp":257716075987,"id":77,"parentId":37,"tags":{},"startTime":1779065688322,"traceId":"91d2da37e51f2be9"},{"name":"check-page","duration":615354,"timestamp":257716060416,"id":37,"parentId":19,"tags":{"page":"/api/hub/nodes"},"startTime":1779065688307,"traceId":"91d2da37e51f2be9"},{"name":"is-page-static","duration":610473,"timestamp":257716072091,"id":66,"parentId":25,"tags":{},"startTime":1779065688318,"traceId":"91d2da37e51f2be9"},{"name":"check-page","duration":624602,"timestamp":257716058019,"id":25,"parentId":19,"tags":{"page":"/api/auth/login"},"startTime":1779065688304,"traceId":"91d2da37e51f2be9"},{"name":"is-page-static","duration":605737,"timestamp":257716078282,"id":78,"parentId":38,"tags":{},"startTime":1779065688325,"traceId":"91d2da37e51f2be9"},{"name":"check-page","duration":623489,"timestamp":257716060593,"id":38,"parentId":19,"tags":{"page":"/api/hub/register"},"startTime":1779065688307,"traceId":"91d2da37e51f2be9"},{"name":"is-page-static","duration":609956,"timestamp":257716078314,"id":79,"parentId":39,"tags":{},"startTime":1779065688325,"traceId":"91d2da37e51f2be9"},{"name":"check-page","duration":627590,"timestamp":257716060723,"id":39,"parentId":19,"tags":{"page":"/api/hub/send"},"startTime":1779065688307,"traceId":"91d2da37e51f2be9"},{"name":"is-page-static","duration":611216,"timestamp":257716078331,"id":80,"parentId":40,"tags":{},"startTime":1779065688325,"traceId":"91d2da37e51f2be9"},{"name":"check-page","duration":628725,"timestamp":257716060863,"id":40,"parentId":19,"tags":{"page":"/api/hub/server-logs"},"startTime":1779065688307,"traceId":"91d2da37e51f2be9"},{"name":"is-page-static","duration":617729,"timestamp":257716078356,"id":82,"parentId":44,"tags":{},"startTime":1779065688325,"traceId":"91d2da37e51f2be9"},{"name":"check-page","duration":634238,"timestamp":257716061891,"id":44,"parentId":19,"tags":{"page":"/api/hub/session"},"startTime":1779065688308,"traceId":"91d2da37e51f2be9"},{"name":"is-page-static","duration":620690,"timestamp":257716078370,"id":83,"parentId":45,"tags":{},"startTime":1779065688325,"traceId":"91d2da37e51f2be9"},{"name":"check-page","duration":637027,"timestamp":257716062075,"id":45,"parentId":19,"tags":{"page":"/api/hub/stats"},"startTime":1779065688308,"traceId":"91d2da37e51f2be9"},{"name":"is-page-static","duration":625666,"timestamp":257716078388,"id":84,"parentId":46,"tags":{},"startTime":1779065688325,"traceId":"91d2da37e51f2be9"},{"name":"check-page","duration":641848,"timestamp":257716062247,"id":46,"parentId":19,"tags":{"page":"/api/hub/status"},"startTime":1779065688309,"traceId":"91d2da37e51f2be9"},{"name":"is-page-static","duration":630123,"timestamp":257716078401,"id":85,"parentId":47,"tags":{},"startTime":1779065688325,"traceId":"91d2da37e51f2be9"},{"name":"check-page","duration":644407,"timestamp":257716064159,"id":47,"parentId":19,"tags":{"page":"/api/hub/task-events"},"startTime":1779065688310,"traceId":"91d2da37e51f2be9"},{"name":"is-page-static","duration":642297,"timestamp":257716071582,"id":64,"parentId":21,"tags":{},"startTime":1779065688318,"traceId":"91d2da37e51f2be9"},{"name":"check-page","duration":660141,"timestamp":257716053799,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1779065688300,"traceId":"91d2da37e51f2be9"},{"name":"is-page-static","duration":638676,"timestamp":257716078411,"id":86,"parentId":48,"tags":{},"startTime":1779065688325,"traceId":"91d2da37e51f2be9"},{"name":"check-page","duration":652880,"timestamp":257716064255,"id":48,"parentId":19,"tags":{"page":"/api/hub/tasks"},"startTime":1779065688311,"traceId":"91d2da37e51f2be9"},{"name":"is-page-static","duration":647772,"timestamp":257716078438,"id":88,"parentId":50,"tags":{},"startTime":1779065688325,"traceId":"91d2da37e51f2be9"},{"name":"check-page","duration":661820,"timestamp":257716064436,"id":50,"parentId":19,"tags":{"page":"/api/hub/tokens"},"startTime":1779065688311,"traceId":"91d2da37e51f2be9"},{"name":"is-page-static","duration":653963,"timestamp":257716078346,"id":81,"parentId":42,"tags":{},"startTime":1779065688325,"traceId":"91d2da37e51f2be9"},{"name":"check-page","duration":671010,"timestamp":257716061356,"id":42,"parentId":19,"tags":{"page":"/api/hub/server/[hostname]/health"},"startTime":1779065688308,"traceId":"91d2da37e51f2be9"},{"name":"is-page-static","duration":666022,"timestamp":257716075904,"id":74,"parentId":34,"tags":{},"startTime":1779065688322,"traceId":"91d2da37e51f2be9"},{"name":"check-page","duration":682655,"timestamp":257716059335,"id":34,"parentId":19,"tags":{"page":"/api/hub/license"},"startTime":1779065688306,"traceId":"91d2da37e51f2be9"},{"name":"is-page-static","duration":666582,"timestamp":257716078449,"id":89,"parentId":51,"tags":{},"startTime":1779065688325,"traceId":"91d2da37e51f2be9"},{"name":"check-page","duration":680589,"timestamp":257716064490,"id":51,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1779065688311,"traceId":"91d2da37e51f2be9"},{"name":"is-page-static","duration":678303,"timestamp":257716072665,"id":70,"parentId":29,"tags":{},"startTime":1779065688319,"traceId":"91d2da37e51f2be9"},{"name":"check-page","duration":692402,"timestamp":257716058629,"id":29,"parentId":19,"tags":{"page":"/api/hub/auth"},"startTime":1779065688305,"traceId":"91d2da37e51f2be9"},{"name":"is-page-static","duration":636458,"timestamp":257716118932,"id":92,"parentId":41,"tags":{},"startTime":1779065688365,"traceId":"91d2da37e51f2be9"},{"name":"check-page","duration":694371,"timestamp":257716061065,"id":41,"parentId":19,"tags":{"page":"/api/hub/server/[hostname]/agents"},"startTime":1779065688307,"traceId":"91d2da37e51f2be9"},{"name":"is-page-static","duration":634039,"timestamp":257716123137,"id":93,"parentId":43,"tags":{},"startTime":1779065688369,"traceId":"91d2da37e51f2be9"},{"name":"check-page","duration":695711,"timestamp":257716061502,"id":43,"parentId":19,"tags":{"page":"/api/hub/servers"},"startTime":1779065688308,"traceId":"91d2da37e51f2be9"},{"name":"is-page-static","duration":691611,"timestamp":257716072203,"id":67,"parentId":26,"tags":{},"startTime":1779065688318,"traceId":"91d2da37e51f2be9"},{"name":"check-page","duration":705610,"timestamp":257716058260,"id":26,"parentId":19,"tags":{"page":"/api/auth/logout"},"startTime":1779065688305,"traceId":"91d2da37e51f2be9"},{"name":"is-page-static","duration":676143,"timestamp":257716088550,"id":90,"parentId":24,"tags":{},"startTime":1779065688335,"traceId":"91d2da37e51f2be9"},{"name":"check-page","duration":709235,"timestamp":257716055494,"id":24,"parentId":19,"tags":{"page":"/api/anet/config"},"startTime":1779065688302,"traceId":"91d2da37e51f2be9"},{"name":"is-page-static","duration":700517,"timestamp":257716072310,"id":68,"parentId":27,"tags":{},"startTime":1779065688319,"traceId":"91d2da37e51f2be9"},{"name":"check-page","duration":714491,"timestamp":257716058405,"id":27,"parentId":19,"tags":{"page":"/api/auth/v3"},"startTime":1779065688305,"traceId":"91d2da37e51f2be9"},{"name":"is-page-static","duration":690212,"timestamp":257716094985,"id":91,"parentId":31,"tags":{},"startTime":1779065688341,"traceId":"91d2da37e51f2be9"},{"name":"check-page","duration":726409,"timestamp":257716058836,"id":31,"parentId":19,"tags":{"page":"/api/hub/events"},"startTime":1779065688305,"traceId":"91d2da37e51f2be9"},{"name":"is-page-static","duration":733038,"timestamp":257716078425,"id":87,"parentId":49,"tags":{},"startTime":1779065688325,"traceId":"91d2da37e51f2be9"},{"name":"check-page","duration":747185,"timestamp":257716064350,"id":49,"parentId":19,"tags":{"page":"/api/hub/tmux"},"startTime":1779065688311,"traceId":"91d2da37e51f2be9"},{"name":"is-page-static","duration":707745,"timestamp":257716127063,"id":100,"parentId":58,"tags":{},"startTime":1779065688373,"traceId":"91d2da37e51f2be9"},{"name":"check-page","duration":768650,"timestamp":257716066250,"id":58,"parentId":19,"tags":{"page":"/server-logs"},"startTime":1779065688313,"traceId":"91d2da37e51f2be9"},{"name":"is-page-static","duration":714957,"timestamp":257716127178,"id":101,"parentId":59,"tags":{},"startTime":1779065688373,"traceId":"91d2da37e51f2be9"},{"name":"check-page","duration":775688,"timestamp":257716066515,"id":59,"parentId":19,"tags":{"page":"/settings/networks"},"startTime":1779065688313,"traceId":"91d2da37e51f2be9"},{"name":"is-page-static","duration":722929,"timestamp":257716127201,"id":102,"parentId":61,"tags":{},"startTime":1779065688373,"traceId":"91d2da37e51f2be9"},{"name":"check-page","duration":783168,"timestamp":257716067048,"id":61,"parentId":19,"tags":{"page":"/settings/tokens"},"startTime":1779065688313,"traceId":"91d2da37e51f2be9"},{"name":"is-page-static","duration":728959,"timestamp":257716126128,"id":94,"parentId":23,"tags":{},"startTime":1779065688372,"traceId":"91d2da37e51f2be9"},{"name":"check-page","duration":799840,"timestamp":257716055313,"id":23,"parentId":19,"tags":{"page":"/admin"},"startTime":1779065688302,"traceId":"91d2da37e51f2be9"},{"name":"is-page-static","duration":734588,"timestamp":257716127225,"id":104,"parentId":63,"tags":{},"startTime":1779065688374,"traceId":"91d2da37e51f2be9"},{"name":"check-page","duration":794654,"timestamp":257716067248,"id":63,"parentId":19,"tags":{"page":"/tasks"},"startTime":1779065688314,"traceId":"91d2da37e51f2be9"},{"name":"is-page-static","duration":737423,"timestamp":257716127216,"id":103,"parentId":62,"tags":{},"startTime":1779065688373,"traceId":"91d2da37e51f2be9"},{"name":"check-page","duration":797534,"timestamp":257716067154,"id":62,"parentId":19,"tags":{"page":"/tasks/[id]"},"startTime":1779065688313,"traceId":"91d2da37e51f2be9"},{"name":"is-page-static","duration":730493,"timestamp":257716140483,"id":105,"parentId":57,"tags":{},"startTime":1779065688387,"traceId":"91d2da37e51f2be9"},{"name":"check-page","duration":805254,"timestamp":257716065785,"id":57,"parentId":19,"tags":{"page":"/"},"startTime":1779065688312,"traceId":"91d2da37e51f2be9"},{"name":"is-page-static","duration":744555,"timestamp":257716126959,"id":95,"parentId":52,"tags":{},"startTime":1779065688373,"traceId":"91d2da37e51f2be9"},{"name":"check-page","duration":806622,"timestamp":257716064935,"id":52,"parentId":19,"tags":{"page":"/login"},"startTime":1779065688311,"traceId":"91d2da37e51f2be9"},{"name":"is-page-static","duration":708885,"timestamp":257716163581,"id":106,"parentId":60,"tags":{},"startTime":1779065688410,"traceId":"91d2da37e51f2be9"},{"name":"check-page","duration":805798,"timestamp":257716066702,"id":60,"parentId":19,"tags":{"page":"/settings"},"startTime":1779065688313,"traceId":"91d2da37e51f2be9"},{"name":"is-page-static","duration":752859,"timestamp":257716127019,"id":97,"parentId":54,"tags":{},"startTime":1779065688373,"traceId":"91d2da37e51f2be9"},{"name":"check-page","duration":814641,"timestamp":257716065276,"id":54,"parentId":19,"tags":{"page":"/messages"},"startTime":1779065688312,"traceId":"91d2da37e51f2be9"},{"name":"is-page-static","duration":757596,"timestamp":257716126989,"id":96,"parentId":53,"tags":{},"startTime":1779065688373,"traceId":"91d2da37e51f2be9"},{"name":"check-page","duration":819500,"timestamp":257716065118,"id":53,"parentId":19,"tags":{"page":"/logs"},"startTime":1779065688311,"traceId":"91d2da37e51f2be9"},{"name":"is-page-static","duration":759286,"timestamp":257716127048,"id":99,"parentId":56,"tags":{},"startTime":1779065688373,"traceId":"91d2da37e51f2be9"},{"name":"check-page","duration":820752,"timestamp":257716065609,"id":56,"parentId":19,"tags":{"page":"/nodes"},"startTime":1779065688312,"traceId":"91d2da37e51f2be9"},{"name":"is-page-static","duration":766452,"timestamp":257716127031,"id":98,"parentId":55,"tags":{},"startTime":1779065688373,"traceId":"91d2da37e51f2be9"},{"name":"check-page","duration":828088,"timestamp":257716065436,"id":55,"parentId":19,"tags":{"page":"/node"},"startTime":1779065688312,"traceId":"91d2da37e51f2be9"},{"name":"static-check","duration":842162,"timestamp":257716051408,"id":19,"parentId":1,"tags":{},"startTime":1779065688298,"traceId":"91d2da37e51f2be9"}]
2
- [{"name":"write-routes-manifest","duration":722,"timestamp":257716902864,"id":108,"parentId":1,"tags":{},"startTime":1779065689149,"traceId":"91d2da37e51f2be9"},{"name":"load-dotenv","duration":58,"timestamp":257716915697,"id":111,"parentId":110,"tags":{},"startTime":1779065689162,"traceId":"91d2da37e51f2be9"},{"name":"run-export-path-map","duration":796,"timestamp":257716918747,"id":112,"parentId":110,"tags":{},"startTime":1779065689165,"traceId":"91d2da37e51f2be9"},{"name":"next-export","duration":676096,"timestamp":257716913869,"id":110,"parentId":1,"tags":{},"startTime":1779065689160,"traceId":"91d2da37e51f2be9"},{"name":"move-exported-app-not-found-","duration":596,"timestamp":257717593226,"id":113,"parentId":109,"tags":{},"startTime":1779065689840,"traceId":"91d2da37e51f2be9"},{"name":"move-exported-app-global-error-","duration":509,"timestamp":257717593915,"id":114,"parentId":109,"tags":{},"startTime":1779065689840,"traceId":"91d2da37e51f2be9"},{"name":"static-generation","duration":689210,"timestamp":257716907481,"id":109,"parentId":1,"tags":{},"startTime":1779065689154,"traceId":"91d2da37e51f2be9"},{"name":"write-routes-manifest","duration":532,"timestamp":257717596996,"id":115,"parentId":1,"tags":{},"startTime":1779065689843,"traceId":"91d2da37e51f2be9"},{"name":"print-tree-view","duration":4583,"timestamp":257717618236,"id":116,"parentId":1,"tags":{},"startTime":1779065689865,"traceId":"91d2da37e51f2be9"},{"name":"write-route-bundle-stats","duration":13327,"timestamp":257717622867,"id":117,"parentId":1,"tags":{},"startTime":1779065689869,"traceId":"91d2da37e51f2be9"},{"name":"telemetry-flush","duration":48659,"timestamp":257717636226,"id":118,"parentId":1,"tags":{},"startTime":1779065689883,"traceId":"91d2da37e51f2be9"},{"name":"next-build","duration":18500193,"timestamp":257699184734,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1779065671431,"traceId":"91d2da37e51f2be9"}]
1
+ [{"name":"generate-buildid","duration":368,"timestamp":258492716603,"id":4,"parentId":1,"tags":{},"startTime":1779066464963,"traceId":"e38753321d6d30e3"},{"name":"load-custom-routes","duration":603,"timestamp":258492717182,"id":5,"parentId":1,"tags":{},"startTime":1779066464963,"traceId":"e38753321d6d30e3"},{"name":"create-dist-dir","duration":689,"timestamp":258492717843,"id":6,"parentId":1,"tags":{},"startTime":1779066464964,"traceId":"e38753321d6d30e3"},{"name":"clean","duration":35622,"timestamp":258492719350,"id":7,"parentId":1,"tags":{},"startTime":1779066464966,"traceId":"e38753321d6d30e3"},{"name":"discover-routes","duration":26773,"timestamp":258492836855,"id":8,"parentId":1,"tags":{},"startTime":1779066465083,"traceId":"e38753321d6d30e3"},{"name":"create-root-mapping","duration":162,"timestamp":258492863698,"id":9,"parentId":1,"tags":{},"startTime":1779066465110,"traceId":"e38753321d6d30e3"},{"name":"generate-route-types","duration":23426,"timestamp":258492867148,"id":10,"parentId":1,"tags":{},"startTime":1779066465113,"traceId":"e38753321d6d30e3"},{"name":"public-dir-conflict-check","duration":157,"timestamp":258492890708,"id":11,"parentId":1,"tags":{},"startTime":1779066465137,"traceId":"e38753321d6d30e3"},{"name":"generate-routes-manifest","duration":6311,"timestamp":258492891065,"id":12,"parentId":1,"tags":{},"startTime":1779066465137,"traceId":"e38753321d6d30e3"},{"name":"run-turbopack","duration":6405251,"timestamp":258492912205,"id":14,"parentId":1,"tags":{},"startTime":1779066465158,"traceId":"e38753321d6d30e3"},{"name":"turbopack-build-events","duration":75,"timestamp":258493230469,"id":15,"parentId":1,"tags":{},"startTime":1779066465477,"traceId":"e38753321d6d30e3"},{"name":"run-typescript","duration":9768316,"timestamp":258499326299,"id":16,"parentId":1,"tags":{},"startTime":1779066471573,"traceId":"e38753321d6d30e3"},{"name":"generate-required-server-files","duration":2946,"timestamp":258509095747,"id":18,"parentId":1,"tags":{},"startTime":1779066481342,"traceId":"e38753321d6d30e3"},{"name":"check-static-error-page","duration":12421,"timestamp":258509313438,"id":20,"parentId":19,"tags":{},"startTime":1779066481560,"traceId":"e38753321d6d30e3"},{"name":"is-page-static","duration":505541,"timestamp":258509329783,"id":65,"parentId":22,"tags":{},"startTime":1779066481576,"traceId":"e38753321d6d30e3"},{"name":"check-page","duration":519449,"timestamp":258509316047,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1779066481562,"traceId":"e38753321d6d30e3"},{"name":"is-page-static","duration":613891,"timestamp":258509329334,"id":64,"parentId":21,"tags":{},"startTime":1779066481576,"traceId":"e38753321d6d30e3"},{"name":"check-page","duration":628486,"timestamp":258509314833,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1779066481561,"traceId":"e38753321d6d30e3"},{"name":"is-page-static","duration":634476,"timestamp":258509330119,"id":67,"parentId":26,"tags":{},"startTime":1779066481576,"traceId":"e38753321d6d30e3"},{"name":"check-page","duration":646129,"timestamp":258509318549,"id":26,"parentId":19,"tags":{"page":"/api/auth/logout"},"startTime":1779066481565,"traceId":"e38753321d6d30e3"},{"name":"is-page-static","duration":646998,"timestamp":258509331039,"id":73,"parentId":33,"tags":{},"startTime":1779066481577,"traceId":"e38753321d6d30e3"},{"name":"check-page","duration":658766,"timestamp":258509319371,"id":33,"parentId":19,"tags":{"page":"/api/hub/inbox"},"startTime":1779066481566,"traceId":"e38753321d6d30e3"},{"name":"is-page-static","duration":651850,"timestamp":258509330639,"id":70,"parentId":29,"tags":{},"startTime":1779066481577,"traceId":"e38753321d6d30e3"},{"name":"check-page","duration":663693,"timestamp":258509318869,"id":29,"parentId":19,"tags":{"page":"/api/hub/auth"},"startTime":1779066481565,"traceId":"e38753321d6d30e3"},{"name":"is-page-static","duration":653581,"timestamp":258509330789,"id":71,"parentId":30,"tags":{},"startTime":1779066481577,"traceId":"e38753321d6d30e3"},{"name":"check-page","duration":667238,"timestamp":258509318974,"id":30,"parentId":19,"tags":{"page":"/api/hub/broadcast"},"startTime":1779066481565,"traceId":"e38753321d6d30e3"},{"name":"is-page-static","duration":656142,"timestamp":258509331148,"id":75,"parentId":35,"tags":{},"startTime":1779066481577,"traceId":"e38753321d6d30e3"},{"name":"check-page","duration":667785,"timestamp":258509319558,"id":35,"parentId":19,"tags":{"page":"/api/hub/messages"},"startTime":1779066481566,"traceId":"e38753321d6d30e3"},{"name":"is-page-static","duration":657868,"timestamp":258509331120,"id":74,"parentId":34,"tags":{},"startTime":1779066481577,"traceId":"e38753321d6d30e3"},{"name":"check-page","duration":669585,"timestamp":258509319473,"id":34,"parentId":19,"tags":{"page":"/api/hub/license"},"startTime":1779066481566,"traceId":"e38753321d6d30e3"},{"name":"is-page-static","duration":661331,"timestamp":258509331169,"id":76,"parentId":36,"tags":{},"startTime":1779066481577,"traceId":"e38753321d6d30e3"},{"name":"check-page","duration":672649,"timestamp":258509319904,"id":36,"parentId":19,"tags":{"page":"/api/hub/networks"},"startTime":1779066481566,"traceId":"e38753321d6d30e3"},{"name":"is-page-static","duration":665570,"timestamp":258509330363,"id":69,"parentId":28,"tags":{},"startTime":1779066481577,"traceId":"e38753321d6d30e3"},{"name":"check-page","duration":677214,"timestamp":258509318763,"id":28,"parentId":19,"tags":{"page":"/api/hub/audit-log"},"startTime":1779066481565,"traceId":"e38753321d6d30e3"},{"name":"is-page-static","duration":666792,"timestamp":258509331207,"id":78,"parentId":38,"tags":{},"startTime":1779066481577,"traceId":"e38753321d6d30e3"},{"name":"check-page","duration":677877,"timestamp":258509320174,"id":38,"parentId":19,"tags":{"page":"/api/hub/register"},"startTime":1779066481566,"traceId":"e38753321d6d30e3"},{"name":"is-page-static","duration":671747,"timestamp":258509331220,"id":79,"parentId":39,"tags":{},"startTime":1779066481577,"traceId":"e38753321d6d30e3"},{"name":"check-page","duration":682791,"timestamp":258509320251,"id":39,"parentId":19,"tags":{"page":"/api/hub/send"},"startTime":1779066481567,"traceId":"e38753321d6d30e3"},{"name":"is-page-static","duration":672026,"timestamp":258509331237,"id":80,"parentId":40,"tags":{},"startTime":1779066481578,"traceId":"e38753321d6d30e3"},{"name":"check-page","duration":682978,"timestamp":258509320319,"id":40,"parentId":19,"tags":{"page":"/api/hub/server-logs"},"startTime":1779066481567,"traceId":"e38753321d6d30e3"},{"name":"is-page-static","duration":675277,"timestamp":258509329973,"id":66,"parentId":25,"tags":{},"startTime":1779066481576,"traceId":"e38753321d6d30e3"},{"name":"check-page","duration":686887,"timestamp":258509318407,"id":25,"parentId":19,"tags":{"page":"/api/auth/login"},"startTime":1779066481565,"traceId":"e38753321d6d30e3"},{"name":"is-page-static","duration":677630,"timestamp":258509331195,"id":77,"parentId":37,"tags":{},"startTime":1779066481577,"traceId":"e38753321d6d30e3"},{"name":"check-page","duration":688811,"timestamp":258509320062,"id":37,"parentId":19,"tags":{"page":"/api/hub/nodes"},"startTime":1779066481566,"traceId":"e38753321d6d30e3"},{"name":"is-page-static","duration":678987,"timestamp":258509331261,"id":82,"parentId":44,"tags":{},"startTime":1779066481578,"traceId":"e38753321d6d30e3"},{"name":"check-page","duration":689451,"timestamp":258509320843,"id":44,"parentId":19,"tags":{"page":"/api/hub/session"},"startTime":1779066481567,"traceId":"e38753321d6d30e3"},{"name":"is-page-static","duration":681585,"timestamp":258509331252,"id":81,"parentId":42,"tags":{},"startTime":1779066481578,"traceId":"e38753321d6d30e3"},{"name":"check-page","duration":692343,"timestamp":258509320559,"id":42,"parentId":19,"tags":{"page":"/api/hub/server/[hostname]/health"},"startTime":1779066481567,"traceId":"e38753321d6d30e3"},{"name":"is-page-static","duration":683014,"timestamp":258509331295,"id":85,"parentId":47,"tags":{},"startTime":1779066481578,"traceId":"e38753321d6d30e3"},{"name":"check-page","duration":693218,"timestamp":258509321133,"id":47,"parentId":19,"tags":{"page":"/api/hub/task-events"},"startTime":1779066481567,"traceId":"e38753321d6d30e3"},{"name":"is-page-static","duration":686431,"timestamp":258509330243,"id":68,"parentId":27,"tags":{},"startTime":1779066481577,"traceId":"e38753321d6d30e3"},{"name":"check-page","duration":698051,"timestamp":258509318661,"id":27,"parentId":19,"tags":{"page":"/api/auth/v3"},"startTime":1779066481565,"traceId":"e38753321d6d30e3"},{"name":"is-page-static","duration":688209,"timestamp":258509331335,"id":88,"parentId":50,"tags":{},"startTime":1779066481578,"traceId":"e38753321d6d30e3"},{"name":"check-page","duration":696602,"timestamp":258509322977,"id":50,"parentId":19,"tags":{"page":"/api/hub/tokens"},"startTime":1779066481569,"traceId":"e38753321d6d30e3"},{"name":"is-page-static","duration":688407,"timestamp":258509331308,"id":86,"parentId":48,"tags":{},"startTime":1779066481578,"traceId":"e38753321d6d30e3"},{"name":"check-page","duration":698538,"timestamp":258509321205,"id":48,"parentId":19,"tags":{"page":"/api/hub/tasks"},"startTime":1779066481567,"traceId":"e38753321d6d30e3"},{"name":"is-page-static","duration":689404,"timestamp":258509331345,"id":89,"parentId":51,"tags":{},"startTime":1779066481578,"traceId":"e38753321d6d30e3"},{"name":"check-page","duration":697712,"timestamp":258509323076,"id":51,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1779066481569,"traceId":"e38753321d6d30e3"},{"name":"is-page-static","duration":693496,"timestamp":258509330868,"id":72,"parentId":32,"tags":{},"startTime":1779066481577,"traceId":"e38753321d6d30e3"},{"name":"check-page","duration":705120,"timestamp":258509319280,"id":32,"parentId":19,"tags":{"page":"/api/hub/health"},"startTime":1779066481566,"traceId":"e38753321d6d30e3"},{"name":"is-page-static","duration":680831,"timestamp":258509348434,"id":91,"parentId":31,"tags":{},"startTime":1779066481595,"traceId":"e38753321d6d30e3"},{"name":"check-page","duration":710480,"timestamp":258509319081,"id":31,"parentId":19,"tags":{"page":"/api/hub/events"},"startTime":1779066481565,"traceId":"e38753321d6d30e3"},{"name":"is-page-static","duration":681946,"timestamp":258509357205,"id":93,"parentId":43,"tags":{},"startTime":1779066481603,"traceId":"e38753321d6d30e3"},{"name":"check-page","duration":718558,"timestamp":258509320654,"id":43,"parentId":19,"tags":{"page":"/api/hub/servers"},"startTime":1779066481567,"traceId":"e38753321d6d30e3"},{"name":"is-page-static","duration":695264,"timestamp":258509344117,"id":90,"parentId":24,"tags":{},"startTime":1779066481590,"traceId":"e38753321d6d30e3"},{"name":"check-page","duration":722969,"timestamp":258509316452,"id":24,"parentId":19,"tags":{"page":"/api/anet/config"},"startTime":1779066481563,"traceId":"e38753321d6d30e3"},{"name":"is-page-static","duration":708228,"timestamp":258509331322,"id":87,"parentId":49,"tags":{},"startTime":1779066481578,"traceId":"e38753321d6d30e3"},{"name":"check-page","duration":716739,"timestamp":258509322842,"id":49,"parentId":19,"tags":{"page":"/api/hub/tmux"},"startTime":1779066481569,"traceId":"e38753321d6d30e3"},{"name":"is-page-static","duration":708408,"timestamp":258509331286,"id":84,"parentId":46,"tags":{},"startTime":1779066481578,"traceId":"e38753321d6d30e3"},{"name":"check-page","duration":718674,"timestamp":258509321050,"id":46,"parentId":19,"tags":{"page":"/api/hub/status"},"startTime":1779066481567,"traceId":"e38753321d6d30e3"},{"name":"is-page-static","duration":708575,"timestamp":258509331272,"id":83,"parentId":45,"tags":{},"startTime":1779066481578,"traceId":"e38753321d6d30e3"},{"name":"check-page","duration":718920,"timestamp":258509320957,"id":45,"parentId":19,"tags":{"page":"/api/hub/stats"},"startTime":1779066481567,"traceId":"e38753321d6d30e3"},{"name":"is-page-static","duration":684999,"timestamp":258509360063,"id":95,"parentId":52,"tags":{},"startTime":1779066481606,"traceId":"e38753321d6d30e3"},{"name":"check-page","duration":721748,"timestamp":258509323373,"id":52,"parentId":19,"tags":{"page":"/login"},"startTime":1779066481570,"traceId":"e38753321d6d30e3"},{"name":"is-page-static","duration":688591,"timestamp":258509360157,"id":100,"parentId":58,"tags":{},"startTime":1779066481606,"traceId":"e38753321d6d30e3"},{"name":"check-page","duration":724138,"timestamp":258509324657,"id":58,"parentId":19,"tags":{"page":"/server-logs"},"startTime":1779066481571,"traceId":"e38753321d6d30e3"},{"name":"is-page-static","duration":697838,"timestamp":258509351277,"id":92,"parentId":41,"tags":{},"startTime":1779066481598,"traceId":"e38753321d6d30e3"},{"name":"check-page","duration":728784,"timestamp":258509320380,"id":41,"parentId":19,"tags":{"page":"/api/hub/server/[hostname]/agents"},"startTime":1779066481567,"traceId":"e38753321d6d30e3"},{"name":"is-page-static","duration":696597,"timestamp":258509360277,"id":101,"parentId":59,"tags":{},"startTime":1779066481607,"traceId":"e38753321d6d30e3"},{"name":"check-page","duration":732081,"timestamp":258509324856,"id":59,"parentId":19,"tags":{"page":"/settings/networks"},"startTime":1779066481571,"traceId":"e38753321d6d30e3"},{"name":"is-page-static","duration":717000,"timestamp":258509360312,"id":103,"parentId":62,"tags":{},"startTime":1779066481607,"traceId":"e38753321d6d30e3"},{"name":"check-page","duration":751844,"timestamp":258509325533,"id":62,"parentId":19,"tags":{"page":"/tasks/[id]"},"startTime":1779066481572,"traceId":"e38753321d6d30e3"},{"name":"is-page-static","duration":726153,"timestamp":258509360329,"id":104,"parentId":63,"tags":{},"startTime":1779066481607,"traceId":"e38753321d6d30e3"},{"name":"check-page","duration":760898,"timestamp":258509325647,"id":63,"parentId":19,"tags":{"page":"/tasks"},"startTime":1779066481572,"traceId":"e38753321d6d30e3"},{"name":"is-page-static","duration":707759,"timestamp":258509390278,"id":105,"parentId":57,"tags":{},"startTime":1779066481637,"traceId":"e38753321d6d30e3"},{"name":"check-page","duration":773973,"timestamp":258509324131,"id":57,"parentId":19,"tags":{"page":"/"},"startTime":1779066481570,"traceId":"e38753321d6d30e3"},{"name":"is-page-static","duration":741403,"timestamp":258509360092,"id":96,"parentId":53,"tags":{},"startTime":1779066481606,"traceId":"e38753321d6d30e3"},{"name":"check-page","duration":778069,"timestamp":258509323474,"id":53,"parentId":19,"tags":{"page":"/logs"},"startTime":1779066481570,"traceId":"e38753321d6d30e3"},{"name":"is-page-static","duration":743313,"timestamp":258509359981,"id":94,"parentId":23,"tags":{},"startTime":1779066481606,"traceId":"e38753321d6d30e3"},{"name":"check-page","duration":787071,"timestamp":258509316267,"id":23,"parentId":19,"tags":{"page":"/admin"},"startTime":1779066481563,"traceId":"e38753321d6d30e3"},{"name":"is-page-static","duration":744480,"timestamp":258509360110,"id":97,"parentId":54,"tags":{},"startTime":1779066481606,"traceId":"e38753321d6d30e3"},{"name":"check-page","duration":781068,"timestamp":258509323573,"id":54,"parentId":19,"tags":{"page":"/messages"},"startTime":1779066481570,"traceId":"e38753321d6d30e3"},{"name":"is-page-static","duration":699180,"timestamp":258509406778,"id":106,"parentId":60,"tags":{},"startTime":1779066481653,"traceId":"e38753321d6d30e3"},{"name":"check-page","duration":780995,"timestamp":258509325029,"id":60,"parentId":19,"tags":{"page":"/settings"},"startTime":1779066481571,"traceId":"e38753321d6d30e3"},{"name":"is-page-static","duration":761557,"timestamp":258509360140,"id":99,"parentId":56,"tags":{},"startTime":1779066481606,"traceId":"e38753321d6d30e3"},{"name":"check-page","duration":797864,"timestamp":258509323887,"id":56,"parentId":19,"tags":{"page":"/nodes"},"startTime":1779066481570,"traceId":"e38753321d6d30e3"},{"name":"is-page-static","duration":761749,"timestamp":258509360121,"id":98,"parentId":55,"tags":{},"startTime":1779066481606,"traceId":"e38753321d6d30e3"},{"name":"check-page","duration":798191,"timestamp":258509323705,"id":55,"parentId":19,"tags":{"page":"/node"},"startTime":1779066481570,"traceId":"e38753321d6d30e3"},{"name":"is-page-static","duration":771872,"timestamp":258509360296,"id":102,"parentId":61,"tags":{},"startTime":1779066481607,"traceId":"e38753321d6d30e3"},{"name":"check-page","duration":806808,"timestamp":258509325408,"id":61,"parentId":19,"tags":{"page":"/settings/tokens"},"startTime":1779066481572,"traceId":"e38753321d6d30e3"},{"name":"static-check","duration":819691,"timestamp":258509312576,"id":19,"parentId":1,"tags":{},"startTime":1779066481559,"traceId":"e38753321d6d30e3"}]
2
+ [{"name":"write-routes-manifest","duration":1258,"timestamp":258510142634,"id":108,"parentId":1,"tags":{},"startTime":1779066482389,"traceId":"e38753321d6d30e3"},{"name":"load-dotenv","duration":52,"timestamp":258510156368,"id":111,"parentId":110,"tags":{},"startTime":1779066482403,"traceId":"e38753321d6d30e3"},{"name":"run-export-path-map","duration":550,"timestamp":258510159263,"id":112,"parentId":110,"tags":{},"startTime":1779066482406,"traceId":"e38753321d6d30e3"},{"name":"next-export","duration":575822,"timestamp":258510155153,"id":110,"parentId":1,"tags":{},"startTime":1779066482401,"traceId":"e38753321d6d30e3"},{"name":"move-exported-app-not-found-","duration":557,"timestamp":258510734868,"id":113,"parentId":109,"tags":{},"startTime":1779066482981,"traceId":"e38753321d6d30e3"},{"name":"move-exported-app-global-error-","duration":486,"timestamp":258510735544,"id":114,"parentId":109,"tags":{},"startTime":1779066482982,"traceId":"e38753321d6d30e3"},{"name":"static-generation","duration":589783,"timestamp":258510148466,"id":109,"parentId":1,"tags":{},"startTime":1779066482395,"traceId":"e38753321d6d30e3"},{"name":"write-routes-manifest","duration":471,"timestamp":258510738564,"id":115,"parentId":1,"tags":{},"startTime":1779066482985,"traceId":"e38753321d6d30e3"},{"name":"print-tree-view","duration":5793,"timestamp":258510760408,"id":116,"parentId":1,"tags":{},"startTime":1779066483007,"traceId":"e38753321d6d30e3"},{"name":"write-route-bundle-stats","duration":13433,"timestamp":258510766242,"id":117,"parentId":1,"tags":{},"startTime":1779066483013,"traceId":"e38753321d6d30e3"},{"name":"telemetry-flush","duration":17885,"timestamp":258510779712,"id":118,"parentId":1,"tags":{},"startTime":1779066483026,"traceId":"e38753321d6d30e3"},{"name":"next-build","duration":18135895,"timestamp":258492661738,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1779066464908,"traceId":"e38753321d6d30e3"}]
package/.next/trace-build CHANGED
@@ -1 +1 @@
1
- [{"name":"run-turbopack","duration":6393268,"timestamp":257699422714,"id":14,"parentId":1,"tags":{},"startTime":1779065671669,"traceId":"91d2da37e51f2be9"},{"name":"turbopack-build-events","duration":101,"timestamp":257699729266,"id":15,"parentId":1,"tags":{},"startTime":1779065671976,"traceId":"91d2da37e51f2be9"},{"name":"run-typescript","duration":10002175,"timestamp":257705829974,"id":16,"parentId":1,"tags":{},"startTime":1779065678076,"traceId":"91d2da37e51f2be9"},{"name":"static-check","duration":842162,"timestamp":257716051408,"id":19,"parentId":1,"tags":{},"startTime":1779065688298,"traceId":"91d2da37e51f2be9"},{"name":"static-generation","duration":689210,"timestamp":257716907481,"id":109,"parentId":1,"tags":{},"startTime":1779065689154,"traceId":"91d2da37e51f2be9"},{"name":"telemetry-flush","duration":48659,"timestamp":257717636226,"id":118,"parentId":1,"tags":{},"startTime":1779065689883,"traceId":"91d2da37e51f2be9"},{"name":"next-build","duration":18500193,"timestamp":257699184734,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1779065671431,"traceId":"91d2da37e51f2be9"}]
1
+ [{"name":"run-turbopack","duration":6405251,"timestamp":258492912205,"id":14,"parentId":1,"tags":{},"startTime":1779066465158,"traceId":"e38753321d6d30e3"},{"name":"turbopack-build-events","duration":75,"timestamp":258493230469,"id":15,"parentId":1,"tags":{},"startTime":1779066465477,"traceId":"e38753321d6d30e3"},{"name":"run-typescript","duration":9768316,"timestamp":258499326299,"id":16,"parentId":1,"tags":{},"startTime":1779066471573,"traceId":"e38753321d6d30e3"},{"name":"static-check","duration":819691,"timestamp":258509312576,"id":19,"parentId":1,"tags":{},"startTime":1779066481559,"traceId":"e38753321d6d30e3"},{"name":"static-generation","duration":589783,"timestamp":258510148466,"id":109,"parentId":1,"tags":{},"startTime":1779066482395,"traceId":"e38753321d6d30e3"},{"name":"telemetry-flush","duration":17885,"timestamp":258510779712,"id":118,"parentId":1,"tags":{},"startTime":1779066483026,"traceId":"e38753321d6d30e3"},{"name":"next-build","duration":18135895,"timestamp":258492661738,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1779066464908,"traceId":"e38753321d6d30e3"}]
@@ -1148,6 +1148,15 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
1148
1148
  // the standalone chrome button pair (reset + fullscreen) at
1149
1149
  // brightness parity.
1150
1150
  const [hoveredFullscreen, setHoveredFullscreen] = useState(false);
1151
+ // R673 — hover state for the chrome zoom-in / zoom-out buttons.
1152
+ // Drives the multi-layer halo filter (pal.legendAccent 2+4 stride)
1153
+ // that completes the chrome zoom-strip parity: zoom-out + zoom-level
1154
+ // pill (R668) + zoom-in now all emit unified cyan halo on hover.
1155
+ // Pre-R673 these buttons had only Tailwind `hover:brightness-[1.15]`
1156
+ // (R596) — a single-axis paint lift. Sibling pattern to R594
1157
+ // hoveredReset + R595 hoveredFullscreen.
1158
+ const [hoveredZoomIn, setHoveredZoomIn] = useState(false);
1159
+ const [hoveredZoomOut, setHoveredZoomOut] = useState(false);
1151
1160
  // R135: panel-wide hover-elevation. The recent-signal + legend
1152
1161
  // panels both already host clickable rows (R56/R116 recent rows,
1153
1162
  // R55/R61 legend rows) and a clickable footer (R133), so the
@@ -7783,11 +7792,45 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
7783
7792
  CIRCLE + TEXT brightness coverage in lockstep
7784
7793
  (the R603/R570 parity arc the ring and digit
7785
7794
  established for the 3-state gate). */
7786
- filter: (isHoveredEdge || isPinned || isHot || isEndpointHoveredEdge)
7787
- ? 'brightness(1.15)'
7788
- : undefined,
7795
+ /* R672 edge-badge DIGIT joins the multi-layer
7796
+ halo family in lockstep with R646 edge-badge
7797
+ CIRCLE. Pre-R672 the digit had brightness(1.15)
7798
+ only on a unified 4-condition gate (hover/pin/
7799
+ hot/endpoint). R672 splits into the same TWO-
7800
+ branch pattern as R646 — cyan for non-hot
7801
+ (pal.legendAccent), amber for hot (hotStroke).
7802
+ Stride 2+4 (text scale, matches R645 alias
7803
+ text); alpha 80/40 matches the family. The
7804
+ badge circle (R646) + digit (R672) now emit
7805
+ multi-layer halo in lockstep when the edge
7806
+ surfaces under attention — full per-edge
7807
+ identity badge halo closure.
7808
+ Hover/pin/endpoint branch (cyan):
7809
+ R672 digit: 2px + 4px, alpha 80/40
7810
+ R646 circle: 3px + 6px, alpha 99/50
7811
+ Hot-only branch (amber):
7812
+ R672 digit: 2px + 4px, alpha 80/40
7813
+ R646 circle: 3px + 6px, alpha 80/40
7814
+ Hot-only branch precedes the unified hover
7815
+ branch in the chain so when the edge is BOTH
7816
+ hot AND hovered, the cyan halo wins (matches
7817
+ R646 chain order — hover priority over hot
7818
+ since hover is user intent).
7819
+ Multi-layer halo family — 31st anchor, 2nd
7820
+ per-edge surface after R646 circle. */
7821
+ filter: (isHoveredEdge || isPinned || isEndpointHoveredEdge)
7822
+ ? `drop-shadow(0 0 2px ${pal.legendAccent}80) drop-shadow(0 0 4px ${pal.legendAccent}40) brightness(1.15)`
7823
+ : isHot
7824
+ ? `drop-shadow(0 0 2px ${hotStroke}80) drop-shadow(0 0 4px ${hotStroke}40) brightness(1.15)`
7825
+ : undefined,
7789
7826
  transition: 'letter-spacing 300ms ease-out, font-weight 300ms ease-out, filter 300ms ease-out',
7790
7827
  }}
7828
+ data-edge-badge-digit-halo-layers={(isHoveredEdge || isPinned || isEndpointHoveredEdge || isHot) ? '2' : '0'}
7829
+ data-edge-badge-digit-halo-branch={
7830
+ (isHoveredEdge || isPinned || isEndpointHoveredEdge) ? 'cyan'
7831
+ : isHot ? 'amber'
7832
+ : 'none'
7833
+ }
7791
7834
  >{link.count}</text>
7792
7835
  </g>
7793
7836
  );
@@ -15600,9 +15643,22 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
15600
15643
  >
15601
15644
  <button
15602
15645
  onClick={() => { popChrome('zoom-out'); zoomByDiscrete(1 / 1.2); }}
15646
+ onMouseEnter={() => setHoveredZoomOut(true)}
15647
+ onMouseLeave={() => setHoveredZoomOut(false)}
15603
15648
  data-topo-chrome-zoom-out
15604
15649
  data-topo-chrome-zoom-out-popping={chromePopping === 'zoom-out' ? 'true' : 'false'}
15605
15650
  data-topo-chrome-zoom-out-brightness-hover="1.15"
15651
+ /* R673 — chrome zoom-out picks up multi-layer halo on
15652
+ hover, completing the chrome zoom-strip trio (zoom-out
15653
+ + zoom-level pill R668 + zoom-in below) at FULL halo
15654
+ parity. Pre-R673 the button had only Tailwind hover:
15655
+ brightness-[1.15] (R596) — a single-axis paint lift.
15656
+ Post-R673 inline filter on hoveredZoomOut state takes
15657
+ precedence over the Tailwind hover, applying 2-layer
15658
+ drop-shadow at pal.legendAccent tint with 2+4 stride
15659
+ (matches R667/R668 chrome-control siblings).
15660
+ 32nd anchor in multi-layer halo family. */
15661
+ data-topo-chrome-zoom-out-halo-layers={hoveredZoomOut ? '2' : '0'}
15606
15662
  // R196: press-state deepens bg one tier above hover (white/5
15607
15663
  // → white/10) so mouse-down has a tactile dim before the
15608
15664
  // R186 icon pop fires on release.
@@ -15631,7 +15687,10 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
15631
15687
  data-topo-chrome-zoom-out-brightness-hover='1.15' attr
15632
15688
  documents the hover value for tests. */
15633
15689
  className="group px-2 py-1 hover:bg-white/5 hover:brightness-[1.15] active:bg-white/10 [transition-property:color,background-color,transform,filter] duration-200 ease-out transform-gpu active:scale-95 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-cyan-400/60 focus-visible:ring-inset"
15634
- style={{ color: pal.legendText }}
15690
+ style={{
15691
+ color: pal.legendText,
15692
+ filter: hoveredZoomOut ? `drop-shadow(0 0 2px ${pal.legendAccent}80) drop-shadow(0 0 4px ${pal.legendAccent}40) brightness(1.15)` : undefined,
15693
+ }}
15635
15694
  aria-label="Zoom out"
15636
15695
  title="Zoom out (−)"
15637
15696
  >
@@ -15835,9 +15894,15 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
15835
15894
  </span>
15836
15895
  <button
15837
15896
  onClick={() => { popChrome('zoom-in'); zoomByDiscrete(1.2); }}
15897
+ onMouseEnter={() => setHoveredZoomIn(true)}
15898
+ onMouseLeave={() => setHoveredZoomIn(false)}
15838
15899
  data-topo-chrome-zoom-in
15839
15900
  data-topo-chrome-zoom-in-popping={chromePopping === 'zoom-in' ? 'true' : 'false'}
15840
15901
  data-topo-chrome-zoom-in-brightness-hover="1.15"
15902
+ /* R673 sibling — zoom-in mirrors zoom-out above. Together
15903
+ with R668 zoom-level pill, the chrome zoom-strip is
15904
+ FULLY halo-extended. */
15905
+ data-topo-chrome-zoom-in-halo-layers={hoveredZoomIn ? '2' : '0'}
15841
15906
  // R196: press-state (mirror of zoom-out above).
15842
15907
  // R352: `group` lets the inner svg respond via group-hover.
15843
15908
  // R493 — zoom +/− buttons join the chrome-strip active:scale-95
@@ -15847,7 +15912,10 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
15847
15912
  /* R596 sibling — zoom-in mirrors zoom-out above. 36th anchor
15848
15913
  in per-element brightness family, 5th HTML. */
15849
15914
  className="group px-2 py-1 hover:bg-white/5 hover:brightness-[1.15] active:bg-white/10 [transition-property:color,background-color,transform,filter] duration-200 ease-out transform-gpu active:scale-95 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-cyan-400/60 focus-visible:ring-inset"
15850
- style={{ color: pal.legendText }}
15915
+ style={{
15916
+ color: pal.legendText,
15917
+ filter: hoveredZoomIn ? `drop-shadow(0 0 2px ${pal.legendAccent}80) drop-shadow(0 0 4px ${pal.legendAccent}40) brightness(1.15)` : undefined,
15918
+ }}
15851
15919
  aria-label="Zoom in"
15852
15920
  title="Zoom in (+)"
15853
15921
  >
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sleep2agi/agent-network-dashboard",
3
- "version": "0.5.3-preview.185",
3
+ "version": "0.5.3-preview.187",
4
4
  "description": "Agent Network Dashboard \u2014 Web UI for managing AI Agent networks",
5
5
  "scripts": {
6
6
  "dev": "next dev",
@@ -0,0 +1,107 @@
1
+ /* Round 672 — edge-badge DIGIT text extends single-axis brightness
2
+ * across a unified 4-condition gate to the SAME two-branch multi-
3
+ * layer halo pattern as R646 edge-badge CIRCLE. Cyan branch (hover/
4
+ * pin/endpoint) uses pal.legendAccent; amber branch (hot-only) uses
5
+ * hotStroke. Both at 2+4 stride (text scale, matches R645). Edge-
6
+ * badge circle (R646) + digit (R672) now emit halo in lockstep on
7
+ * edge attention. 31st anchor in family.
8
+ *
9
+ * Source assertions:
10
+ * - cyan branch: pal.legendAccent 80/40 with 2+4 stride
11
+ * - amber branch: hotStroke 80/40 with 2+4 stride
12
+ * - halo-layers + halo-branch data attrs reflect runtime state
13
+ */
14
+ import { chromium } from 'playwright';
15
+ import { readFileSync } from 'node:fs';
16
+
17
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
18
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
19
+
20
+ const browser = await chromium.launch({ headless: true });
21
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
22
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
23
+ await ctx.addInitScript(() => {
24
+ try {
25
+ localStorage.setItem('anet-theme', 'cyber');
26
+ localStorage.setItem('anet-topo-layout', 'ring');
27
+ sessionStorage.setItem('anet_v3_auth', '1');
28
+ } catch {}
29
+ });
30
+ await ctx.route('**/api/hub/status*', async (route) => {
31
+ const r = await route.fetch();
32
+ const b = await r.json();
33
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
34
+ const mk = (alias) => ({
35
+ alias, status: 'working', 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'), mk('a·2'), mk('a·3'), mk('a·4'),
41
+ ] } });
42
+ });
43
+ // 12 messages between a·1 ↔ a·2 — enough to push edge into "hot" state
44
+ // (~10 messages in window). Other edges stay non-hot.
45
+ const HOT_PAIR = [['a·1', 'a·2']];
46
+ const COLD_PAIRS = [['a·3', 'a·4']];
47
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [
48
+ ...Array.from({ length: 12 }, (_, i) => ({
49
+ id: `hot${i}`,
50
+ from_alias: HOT_PAIR[0][i % 2],
51
+ to_alias: HOT_PAIR[0][(i + 1) % 2],
52
+ kind: 'task', content: `hot ${i}`,
53
+ network_id: 'default', created_at: fresh,
54
+ })),
55
+ ...Array.from({ length: 2 }, (_, i) => ({
56
+ id: `cold${i}`,
57
+ from_alias: COLD_PAIRS[0][i % 2],
58
+ to_alias: COLD_PAIRS[0][(i + 1) % 2],
59
+ kind: 'message', content: `cold ${i}`,
60
+ network_id: 'default', created_at: fresh,
61
+ })),
62
+ ] } }));
63
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
64
+ const page = await ctx.newPage();
65
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
66
+ await page.waitForSelector('[data-edge-badge-digit-halo-layers]', { timeout: 15000, state: 'attached' });
67
+ await page.waitForTimeout(500);
68
+
69
+ const restState = await page.evaluate(() => {
70
+ return Array.from(document.querySelectorAll('[data-edge-badge-digit-halo-layers]')).map(el => ({
71
+ layers: el.getAttribute('data-edge-badge-digit-halo-layers'),
72
+ branch: el.getAttribute('data-edge-badge-digit-halo-branch'),
73
+ }));
74
+ });
75
+
76
+ await browser.close();
77
+
78
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
79
+ const sourceCyanFilter = /\(isHoveredEdge \|\| isPinned \|\| isEndpointHoveredEdge\)\s+\?\s+`drop-shadow\(0 0 2px \$\{pal\.legendAccent\}80\) drop-shadow\(0 0 4px \$\{pal\.legendAccent\}40\) brightness\(1\.15\)`/.test(src);
80
+ const sourceAmberFilter = /isHot\s+\?\s+`drop-shadow\(0 0 2px \$\{hotStroke\}80\) drop-shadow\(0 0 4px \$\{hotStroke\}40\) brightness\(1\.15\)`/.test(src);
81
+ const sourceLayersAttr = /data-edge-badge-digit-halo-layers=\{\(isHoveredEdge \|\| isPinned \|\| isEndpointHoveredEdge \|\| isHot\) \? '2' : '0'\}/.test(src);
82
+ const sourceBranchAttr = /data-edge-badge-digit-halo-branch=\{[\s\S]*?\(isHoveredEdge \|\| isPinned \|\| isEndpointHoveredEdge\) \? 'cyan'[\s\S]*?: isHot \? 'amber'[\s\S]*?: 'none'/.test(src);
83
+
84
+ // Logical invariant at rest: branch='none' ↔ layers='0', and any non-none
85
+ // branch must have layers='2'. Don't pin to specific message-rate thresholds
86
+ // (those vary with mock data) — verify the cyan↔amber↔none gate consistency
87
+ // at every edge digit instead.
88
+ const allConsistent = restState.every(e =>
89
+ (e.branch === 'none' && e.layers === '0') ||
90
+ ((e.branch === 'cyan' || e.branch === 'amber') && e.layers === '2')
91
+ );
92
+ const hasNoneAtRest = restState.some(e => e.branch === 'none' && e.layers === '0');
93
+
94
+ const results = {
95
+ digits_present: restState.length >= 2,
96
+ rest_gate_consistent: allConsistent,
97
+ has_none_at_rest: hasNoneAtRest,
98
+ source_cyan_filter: sourceCyanFilter,
99
+ source_amber_filter: sourceAmberFilter,
100
+ source_layers_attr: sourceLayersAttr,
101
+ source_branch_attr: sourceBranchAttr,
102
+ };
103
+ const ok = Object.values(results).every(Boolean);
104
+ console.log(`${ok ? '✅' : '❌'} R672 edge-badge digit multi-layer halo (2-branch lockstep w/ R646 circle):`,
105
+ JSON.stringify(results, null, 2),
106
+ `\n rest: ${JSON.stringify(restState)}`);
107
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,97 @@
1
+ /* Round 673 — chrome zoom-in + zoom-out buttons gain multi-layer
2
+ * halo on hover via new hoveredZoomIn / hoveredZoomOut state. Pre-
3
+ * R673 these buttons had only Tailwind hover:brightness-[1.15] (R596)
4
+ * — a single-axis paint lift. Post-R673 inline filter uses the same
5
+ * 2+4 stride at pal.legendAccent tint as R667 reset+fullscreen and
6
+ * R668 zoom-level pill. The chrome zoom-strip (zoom-out + zoom-level
7
+ * + zoom-in) is now FULLY halo-extended at all 3 controls.
8
+ *
9
+ * 32nd anchor in multi-layer halo family (paired sibling extension).
10
+ *
11
+ * Source assertions:
12
+ * - useState pair for hoveredZoomIn / hoveredZoomOut
13
+ * - both buttons' onMouseEnter/Leave wired
14
+ * - both inline filters use pal.legendAccent 2+4 stride alpha 80/40
15
+ * - data-topo-chrome-zoom-{in,out}-halo-layers attrs toggle '2'/'0'
16
+ *
17
+ * Runtime assertions:
18
+ * - both buttons present in DOM
19
+ * - rest state: halo-layers='0' on both
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-chrome-zoom-in-halo-layers]', { timeout: 15000, state: 'attached' });
53
+ await page.waitForTimeout(500);
54
+
55
+ const restState = await page.evaluate(() => {
56
+ const zin = document.querySelector('[data-topo-chrome-zoom-in-halo-layers]');
57
+ const zout = document.querySelector('[data-topo-chrome-zoom-out-halo-layers]');
58
+ return {
59
+ zin_present: !!zin,
60
+ zout_present: !!zout,
61
+ zin_layers: zin?.getAttribute('data-topo-chrome-zoom-in-halo-layers'),
62
+ zout_layers: zout?.getAttribute('data-topo-chrome-zoom-out-halo-layers'),
63
+ };
64
+ });
65
+
66
+ await browser.close();
67
+
68
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
69
+ const sourceState = /const \[hoveredZoomIn, setHoveredZoomIn\] = useState\(false\);/.test(src) &&
70
+ /const \[hoveredZoomOut, setHoveredZoomOut\] = useState\(false\);/.test(src);
71
+ const sourceZinHandler = /onMouseEnter=\{\(\) => setHoveredZoomIn\(true\)\}/.test(src) &&
72
+ /onMouseLeave=\{\(\) => setHoveredZoomIn\(false\)\}/.test(src);
73
+ const sourceZoutHandler = /onMouseEnter=\{\(\) => setHoveredZoomOut\(true\)\}/.test(src) &&
74
+ /onMouseLeave=\{\(\) => setHoveredZoomOut\(false\)\}/.test(src);
75
+ const sourceZinFilter = /filter: hoveredZoomIn \? `drop-shadow\(0 0 2px \$\{pal\.legendAccent\}80\) drop-shadow\(0 0 4px \$\{pal\.legendAccent\}40\) brightness\(1\.15\)` : undefined/.test(src);
76
+ const sourceZoutFilter = /filter: hoveredZoomOut \? `drop-shadow\(0 0 2px \$\{pal\.legendAccent\}80\) drop-shadow\(0 0 4px \$\{pal\.legendAccent\}40\) brightness\(1\.15\)` : undefined/.test(src);
77
+ const sourceZinAttr = /data-topo-chrome-zoom-in-halo-layers=\{hoveredZoomIn \? '2' : '0'\}/.test(src);
78
+ const sourceZoutAttr = /data-topo-chrome-zoom-out-halo-layers=\{hoveredZoomOut \? '2' : '0'\}/.test(src);
79
+
80
+ const results = {
81
+ zin_present: restState.zin_present,
82
+ zout_present: restState.zout_present,
83
+ rest_zin_layers_0: restState.zin_layers === '0',
84
+ rest_zout_layers_0: restState.zout_layers === '0',
85
+ source_state: sourceState,
86
+ source_zin_handler: sourceZinHandler,
87
+ source_zout_handler:sourceZoutHandler,
88
+ source_zin_filter: sourceZinFilter,
89
+ source_zout_filter: sourceZoutFilter,
90
+ source_zin_attr: sourceZinAttr,
91
+ source_zout_attr: sourceZoutAttr,
92
+ };
93
+ const ok = Object.values(results).every(Boolean);
94
+ console.log(`${ok ? '✅' : '❌'} R673 chrome zoom-in/-out multi-layer halo (completes chrome zoom-strip trio):`,
95
+ JSON.stringify(results, null, 2),
96
+ `\n rest: ${JSON.stringify(restState)}`);
97
+ process.exit(ok ? 0 : 1);