@sleep2agi/agent-network-dashboard 0.4.6-preview.255 → 0.4.6-preview.257

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 (140) 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 +4 -4
  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/agent-network-dashboard_09kk21a._.js +2 -2
  121. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js.map +1 -1
  122. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js +1 -1
  123. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js.map +1 -1
  124. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js +1 -1
  125. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js.map +1 -1
  126. package/.next/server/middleware-build-manifest.js +3 -3
  127. package/.next/server/pages/404.html +1 -1
  128. package/.next/server/pages/500.html +1 -1
  129. package/.next/static/chunks/{0l9-fuqv0.8hs.js → 0bf5jlulny0a4.js} +1 -1
  130. package/.next/static/chunks/{0ls5ub379gwuh.js → 0x2xktkosa9jo.js} +2 -2
  131. package/.next/static/chunks/{0r0~xrrd_ww~t.js → 163hogc.6af4c.js} +1 -1
  132. package/.next/trace +2 -2
  133. package/.next/trace-build +1 -1
  134. package/app/components/TopoGraph.tsx +51 -12
  135. package/package.json +1 -1
  136. package/scripts/topo-chrome-pop-extension-test.mjs +98 -0
  137. package/scripts/topo-chrome-pop-nodesize-test.mjs +88 -0
  138. /package/.next/static/{CNet9a9Bwooa-6U9T5a5Y → Y70LgbBo4fA7-eNNd9B5f}/_buildManifest.js +0 -0
  139. /package/.next/static/{CNet9a9Bwooa-6U9T5a5Y → Y70LgbBo4fA7-eNNd9B5f}/_clientMiddlewareManifest.js +0 -0
  140. /package/.next/static/{CNet9a9Bwooa-6U9T5a5Y → Y70LgbBo4fA7-eNNd9B5f}/_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.4.6-preview.255"],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.4.6-preview.257"],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":326,"timestamp":92059557046,"id":4,"parentId":1,"tags":{},"startTime":1778900031803,"traceId":"0ba1af1bb1779032"},{"name":"load-custom-routes","duration":465,"timestamp":92059557525,"id":5,"parentId":1,"tags":{},"startTime":1778900031804,"traceId":"0ba1af1bb1779032"},{"name":"create-dist-dir","duration":737,"timestamp":92059558061,"id":6,"parentId":1,"tags":{},"startTime":1778900031804,"traceId":"0ba1af1bb1779032"},{"name":"clean","duration":33315,"timestamp":92059559538,"id":7,"parentId":1,"tags":{},"startTime":1778900031806,"traceId":"0ba1af1bb1779032"},{"name":"discover-routes","duration":28520,"timestamp":92059681958,"id":8,"parentId":1,"tags":{},"startTime":1778900031928,"traceId":"0ba1af1bb1779032"},{"name":"create-root-mapping","duration":198,"timestamp":92059710570,"id":9,"parentId":1,"tags":{},"startTime":1778900031957,"traceId":"0ba1af1bb1779032"},{"name":"generate-route-types","duration":23457,"timestamp":92059714304,"id":10,"parentId":1,"tags":{},"startTime":1778900031961,"traceId":"0ba1af1bb1779032"},{"name":"public-dir-conflict-check","duration":116,"timestamp":92059737858,"id":11,"parentId":1,"tags":{},"startTime":1778900031984,"traceId":"0ba1af1bb1779032"},{"name":"generate-routes-manifest","duration":5015,"timestamp":92059738123,"id":12,"parentId":1,"tags":{},"startTime":1778900031984,"traceId":"0ba1af1bb1779032"},{"name":"run-turbopack","duration":5861609,"timestamp":92059756563,"id":14,"parentId":1,"tags":{},"startTime":1778900032003,"traceId":"0ba1af1bb1779032"},{"name":"turbopack-build-events","duration":99,"timestamp":92060065548,"id":15,"parentId":1,"tags":{},"startTime":1778900032312,"traceId":"0ba1af1bb1779032"},{"name":"run-typescript","duration":9548879,"timestamp":92065627676,"id":16,"parentId":1,"tags":{},"startTime":1778900037874,"traceId":"0ba1af1bb1779032"},{"name":"generate-required-server-files","duration":2786,"timestamp":92075177701,"id":18,"parentId":1,"tags":{},"startTime":1778900047424,"traceId":"0ba1af1bb1779032"},{"name":"check-static-error-page","duration":14963,"timestamp":92075374876,"id":20,"parentId":19,"tags":{},"startTime":1778900047621,"traceId":"0ba1af1bb1779032"},{"name":"is-page-static","duration":600621,"timestamp":92075394043,"id":67,"parentId":28,"tags":{},"startTime":1778900047640,"traceId":"0ba1af1bb1779032"},{"name":"check-page","duration":612583,"timestamp":92075382245,"id":28,"parentId":19,"tags":{"page":"/api/hub/audit-log"},"startTime":1778900047629,"traceId":"0ba1af1bb1779032"},{"name":"is-page-static","duration":612388,"timestamp":92075395156,"id":69,"parentId":30,"tags":{},"startTime":1778900047641,"traceId":"0ba1af1bb1779032"},{"name":"check-page","duration":625104,"timestamp":92075382519,"id":30,"parentId":19,"tags":{"page":"/api/hub/broadcast"},"startTime":1778900047629,"traceId":"0ba1af1bb1779032"},{"name":"is-page-static","duration":629758,"timestamp":92075393326,"id":63,"parentId":22,"tags":{},"startTime":1778900047640,"traceId":"0ba1af1bb1779032"},{"name":"check-page","duration":644854,"timestamp":92075378333,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1778900047625,"traceId":"0ba1af1bb1779032"},{"name":"is-page-static","duration":676072,"timestamp":92075393473,"id":64,"parentId":25,"tags":{},"startTime":1778900047640,"traceId":"0ba1af1bb1779032"},{"name":"check-page","duration":687879,"timestamp":92075381739,"id":25,"parentId":19,"tags":{"page":"/api/auth/login"},"startTime":1778900047628,"traceId":"0ba1af1bb1779032"},{"name":"is-page-static","duration":676125,"timestamp":92075395363,"id":70,"parentId":32,"tags":{},"startTime":1778900047642,"traceId":"0ba1af1bb1779032"},{"name":"check-page","duration":688629,"timestamp":92075382920,"id":32,"parentId":19,"tags":{"page":"/api/hub/health"},"startTime":1778900047629,"traceId":"0ba1af1bb1779032"},{"name":"is-page-static","duration":707549,"timestamp":92075395552,"id":73,"parentId":35,"tags":{},"startTime":1778900047642,"traceId":"0ba1af1bb1779032"},{"name":"check-page","duration":720016,"timestamp":92075383382,"id":35,"parentId":19,"tags":{"page":"/api/hub/messages"},"startTime":1778900047630,"traceId":"0ba1af1bb1779032"},{"name":"is-page-static","duration":717958,"timestamp":92075395517,"id":72,"parentId":34,"tags":{},"startTime":1778900047642,"traceId":"0ba1af1bb1779032"},{"name":"check-page","duration":730310,"timestamp":92075383235,"id":34,"parentId":19,"tags":{"page":"/api/hub/license"},"startTime":1778900047630,"traceId":"0ba1af1bb1779032"},{"name":"is-page-static","duration":729614,"timestamp":92075393738,"id":66,"parentId":27,"tags":{},"startTime":1778900047640,"traceId":"0ba1af1bb1779032"},{"name":"check-page","duration":741326,"timestamp":92075382093,"id":27,"parentId":19,"tags":{"page":"/api/auth/v3"},"startTime":1778900047628,"traceId":"0ba1af1bb1779032"},{"name":"is-page-static","duration":732314,"timestamp":92075395668,"id":74,"parentId":36,"tags":{},"startTime":1778900047642,"traceId":"0ba1af1bb1779032"},{"name":"check-page","duration":744177,"timestamp":92075383893,"id":36,"parentId":19,"tags":{"page":"/api/hub/networks"},"startTime":1778900047630,"traceId":"0ba1af1bb1779032"},{"name":"is-page-static","duration":735134,"timestamp":92075395702,"id":75,"parentId":37,"tags":{},"startTime":1778900047642,"traceId":"0ba1af1bb1779032"},{"name":"check-page","duration":746743,"timestamp":92075384148,"id":37,"parentId":19,"tags":{"page":"/api/hub/nodes"},"startTime":1778900047630,"traceId":"0ba1af1bb1779032"},{"name":"is-page-static","duration":736699,"timestamp":92075395735,"id":77,"parentId":39,"tags":{},"startTime":1778900047642,"traceId":"0ba1af1bb1779032"},{"name":"check-page","duration":748046,"timestamp":92075384440,"id":39,"parentId":19,"tags":{"page":"/api/hub/send"},"startTime":1778900047631,"traceId":"0ba1af1bb1779032"},{"name":"is-page-static","duration":740331,"timestamp":92075392888,"id":62,"parentId":21,"tags":{},"startTime":1778900047639,"traceId":"0ba1af1bb1779032"},{"name":"check-page","duration":756714,"timestamp":92075376592,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1778900047623,"traceId":"0ba1af1bb1779032"},{"name":"is-page-static","duration":743590,"timestamp":92075395770,"id":78,"parentId":40,"tags":{},"startTime":1778900047642,"traceId":"0ba1af1bb1779032"},{"name":"check-page","duration":754862,"timestamp":92075384557,"id":40,"parentId":19,"tags":{"page":"/api/hub/server-logs"},"startTime":1778900047631,"traceId":"0ba1af1bb1779032"},{"name":"is-page-static","duration":748392,"timestamp":92075395780,"id":79,"parentId":41,"tags":{},"startTime":1778900047642,"traceId":"0ba1af1bb1779032"},{"name":"check-page","duration":759562,"timestamp":92075384656,"id":41,"parentId":19,"tags":{"page":"/api/hub/servers"},"startTime":1778900047631,"traceId":"0ba1af1bb1779032"},{"name":"is-page-static","duration":748770,"timestamp":92075395807,"id":81,"parentId":43,"tags":{},"startTime":1778900047642,"traceId":"0ba1af1bb1779032"},{"name":"check-page","duration":759744,"timestamp":92075384876,"id":43,"parentId":19,"tags":{"page":"/api/hub/stats"},"startTime":1778900047631,"traceId":"0ba1af1bb1779032"},{"name":"is-page-static","duration":750734,"timestamp":92075395815,"id":82,"parentId":44,"tags":{},"startTime":1778900047642,"traceId":"0ba1af1bb1779032"},{"name":"check-page","duration":761610,"timestamp":92075384975,"id":44,"parentId":19,"tags":{"page":"/api/hub/status"},"startTime":1778900047631,"traceId":"0ba1af1bb1779032"},{"name":"is-page-static","duration":757631,"timestamp":92075395720,"id":76,"parentId":38,"tags":{},"startTime":1778900047642,"traceId":"0ba1af1bb1779032"},{"name":"check-page","duration":769085,"timestamp":92075384325,"id":38,"parentId":19,"tags":{"page":"/api/hub/register"},"startTime":1778900047631,"traceId":"0ba1af1bb1779032"},{"name":"is-page-static","duration":757721,"timestamp":92075395842,"id":84,"parentId":46,"tags":{},"startTime":1778900047642,"traceId":"0ba1af1bb1779032"},{"name":"check-page","duration":768262,"timestamp":92075385328,"id":46,"parentId":19,"tags":{"page":"/api/hub/tasks"},"startTime":1778900047632,"traceId":"0ba1af1bb1779032"},{"name":"is-page-static","duration":759937,"timestamp":92075395829,"id":83,"parentId":45,"tags":{},"startTime":1778900047642,"traceId":"0ba1af1bb1779032"},{"name":"check-page","duration":770616,"timestamp":92075385190,"id":45,"parentId":19,"tags":{"page":"/api/hub/task-events"},"startTime":1778900047631,"traceId":"0ba1af1bb1779032"},{"name":"is-page-static","duration":763490,"timestamp":92075396081,"id":87,"parentId":49,"tags":{},"startTime":1778900047642,"traceId":"0ba1af1bb1779032"},{"name":"check-page","duration":773935,"timestamp":92075385682,"id":49,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1778900047632,"traceId":"0ba1af1bb1779032"},{"name":"is-page-static","duration":764441,"timestamp":92075395865,"id":86,"parentId":48,"tags":{},"startTime":1778900047642,"traceId":"0ba1af1bb1779032"},{"name":"check-page","duration":774757,"timestamp":92075385581,"id":48,"parentId":19,"tags":{"page":"/api/hub/tokens"},"startTime":1778900047632,"traceId":"0ba1af1bb1779032"},{"name":"is-page-static","duration":767268,"timestamp":92075395856,"id":85,"parentId":47,"tags":{},"startTime":1778900047642,"traceId":"0ba1af1bb1779032"},{"name":"check-page","duration":777712,"timestamp":92075385469,"id":47,"parentId":19,"tags":{"page":"/api/hub/tmux"},"startTime":1778900047632,"traceId":"0ba1af1bb1779032"},{"name":"is-page-static","duration":746807,"timestamp":92075417048,"id":89,"parentId":31,"tags":{},"startTime":1778900047663,"traceId":"0ba1af1bb1779032"},{"name":"check-page","duration":781250,"timestamp":92075382651,"id":31,"parentId":19,"tags":{"page":"/api/hub/events"},"startTime":1778900047629,"traceId":"0ba1af1bb1779032"},{"name":"is-page-static","duration":749202,"timestamp":92075415535,"id":88,"parentId":24,"tags":{},"startTime":1778900047662,"traceId":"0ba1af1bb1779032"},{"name":"check-page","duration":785943,"timestamp":92075378839,"id":24,"parentId":19,"tags":{"page":"/api/anet/config"},"startTime":1778900047625,"traceId":"0ba1af1bb1779032"},{"name":"is-page-static","duration":770265,"timestamp":92075395438,"id":71,"parentId":33,"tags":{},"startTime":1778900047642,"traceId":"0ba1af1bb1779032"},{"name":"check-page","duration":782665,"timestamp":92075383086,"id":33,"parentId":19,"tags":{"page":"/api/hub/inbox"},"startTime":1778900047629,"traceId":"0ba1af1bb1779032"},{"name":"is-page-static","duration":819070,"timestamp":92075393618,"id":65,"parentId":26,"tags":{},"startTime":1778900047640,"traceId":"0ba1af1bb1779032"},{"name":"check-page","duration":830843,"timestamp":92075381931,"id":26,"parentId":19,"tags":{"page":"/api/auth/logout"},"startTime":1778900047628,"traceId":"0ba1af1bb1779032"},{"name":"is-page-static","duration":827047,"timestamp":92075395793,"id":80,"parentId":42,"tags":{},"startTime":1778900047642,"traceId":"0ba1af1bb1779032"},{"name":"check-page","duration":838142,"timestamp":92075384772,"id":42,"parentId":19,"tags":{"page":"/api/hub/session"},"startTime":1778900047631,"traceId":"0ba1af1bb1779032"},{"name":"is-page-static","duration":801552,"timestamp":92075427127,"id":93,"parentId":52,"tags":{},"startTime":1778900047673,"traceId":"0ba1af1bb1779032"},{"name":"check-page","duration":842198,"timestamp":92075386558,"id":52,"parentId":19,"tags":{"page":"/messages"},"startTime":1778900047633,"traceId":"0ba1af1bb1779032"},{"name":"is-page-static","duration":805784,"timestamp":92075426903,"id":90,"parentId":23,"tags":{},"startTime":1778900047673,"traceId":"0ba1af1bb1779032"},{"name":"check-page","duration":854138,"timestamp":92075378606,"id":23,"parentId":19,"tags":{"page":"/admin"},"startTime":1778900047625,"traceId":"0ba1af1bb1779032"},{"name":"is-page-static","duration":811896,"timestamp":92075427183,"id":96,"parentId":56,"tags":{},"startTime":1778900047673,"traceId":"0ba1af1bb1779032"},{"name":"check-page","duration":851009,"timestamp":92075388138,"id":56,"parentId":19,"tags":{"page":"/server-logs"},"startTime":1778900047634,"traceId":"0ba1af1bb1779032"},{"name":"is-page-static","duration":813665,"timestamp":92075427217,"id":97,"parentId":57,"tags":{},"startTime":1778900047673,"traceId":"0ba1af1bb1779032"},{"name":"check-page","duration":852523,"timestamp":92075388415,"id":57,"parentId":19,"tags":{"page":"/settings/networks"},"startTime":1778900047635,"traceId":"0ba1af1bb1779032"},{"name":"is-page-static","duration":814431,"timestamp":92075426956,"id":92,"parentId":51,"tags":{},"startTime":1778900047673,"traceId":"0ba1af1bb1779032"},{"name":"check-page","duration":855077,"timestamp":92075386359,"id":51,"parentId":19,"tags":{"page":"/logs"},"startTime":1778900047633,"traceId":"0ba1af1bb1779032"},{"name":"is-page-static","duration":816003,"timestamp":92075427235,"id":98,"parentId":59,"tags":{},"startTime":1778900047674,"traceId":"0ba1af1bb1779032"},{"name":"check-page","duration":854155,"timestamp":92075389153,"id":59,"parentId":19,"tags":{"page":"/settings/tokens"},"startTime":1778900047635,"traceId":"0ba1af1bb1779032"},{"name":"is-page-static","duration":818231,"timestamp":92075427167,"id":95,"parentId":54,"tags":{},"startTime":1778900047673,"traceId":"0ba1af1bb1779032"},{"name":"check-page","duration":858331,"timestamp":92075387118,"id":54,"parentId":19,"tags":{"page":"/nodes"},"startTime":1778900047633,"traceId":"0ba1af1bb1779032"},{"name":"is-page-static","duration":819971,"timestamp":92075426941,"id":91,"parentId":50,"tags":{},"startTime":1778900047673,"traceId":"0ba1af1bb1779032"},{"name":"check-page","duration":860810,"timestamp":92075386146,"id":50,"parentId":19,"tags":{"page":"/login"},"startTime":1778900047632,"traceId":"0ba1af1bb1779032"},{"name":"is-page-static","duration":821934,"timestamp":92075427272,"id":100,"parentId":61,"tags":{},"startTime":1778900047674,"traceId":"0ba1af1bb1779032"},{"name":"check-page","duration":859723,"timestamp":92075389520,"id":61,"parentId":19,"tags":{"page":"/tasks"},"startTime":1778900047636,"traceId":"0ba1af1bb1779032"},{"name":"is-page-static","duration":765791,"timestamp":92075485139,"id":101,"parentId":55,"tags":{},"startTime":1778900047731,"traceId":"0ba1af1bb1779032"},{"name":"check-page","duration":863512,"timestamp":92075387468,"id":55,"parentId":19,"tags":{"page":"/"},"startTime":1778900047634,"traceId":"0ba1af1bb1779032"},{"name":"is-page-static","duration":762849,"timestamp":92075490620,"id":102,"parentId":58,"tags":{},"startTime":1778900047737,"traceId":"0ba1af1bb1779032"},{"name":"check-page","duration":864878,"timestamp":92075388640,"id":58,"parentId":19,"tags":{"page":"/settings"},"startTime":1778900047635,"traceId":"0ba1af1bb1779032"},{"name":"is-page-static","duration":827189,"timestamp":92075427252,"id":99,"parentId":60,"tags":{},"startTime":1778900047674,"traceId":"0ba1af1bb1779032"},{"name":"check-page","duration":865154,"timestamp":92075389346,"id":60,"parentId":19,"tags":{"page":"/tasks/[id]"},"startTime":1778900047636,"traceId":"0ba1af1bb1779032"},{"name":"is-page-static","duration":870078,"timestamp":92075394952,"id":68,"parentId":29,"tags":{},"startTime":1778900047641,"traceId":"0ba1af1bb1779032"},{"name":"check-page","duration":882719,"timestamp":92075382372,"id":29,"parentId":19,"tags":{"page":"/api/hub/auth"},"startTime":1778900047629,"traceId":"0ba1af1bb1779032"},{"name":"is-page-static","duration":854647,"timestamp":92075427147,"id":94,"parentId":53,"tags":{},"startTime":1778900047673,"traceId":"0ba1af1bb1779032"},{"name":"check-page","duration":895045,"timestamp":92075386820,"id":53,"parentId":19,"tags":{"page":"/node"},"startTime":1778900047633,"traceId":"0ba1af1bb1779032"},{"name":"static-check","duration":908123,"timestamp":92075373809,"id":19,"parentId":1,"tags":{},"startTime":1778900047620,"traceId":"0ba1af1bb1779032"},{"name":"write-routes-manifest","duration":451,"timestamp":92076289573,"id":104,"parentId":1,"tags":{},"startTime":1778900048536,"traceId":"0ba1af1bb1779032"},{"name":"load-dotenv","duration":72,"timestamp":92076304627,"id":107,"parentId":106,"tags":{},"startTime":1778900048551,"traceId":"0ba1af1bb1779032"},{"name":"run-export-path-map","duration":561,"timestamp":92076307592,"id":108,"parentId":106,"tags":{},"startTime":1778900048554,"traceId":"0ba1af1bb1779032"},{"name":"next-export","duration":629142,"timestamp":92076302957,"id":106,"parentId":1,"tags":{},"startTime":1778900048549,"traceId":"0ba1af1bb1779032"}]
2
- [{"name":"move-exported-app-not-found-","duration":2252,"timestamp":92076937526,"id":109,"parentId":105,"tags":{},"startTime":1778900049184,"traceId":"0ba1af1bb1779032"},{"name":"move-exported-app-global-error-","duration":1299,"timestamp":92076939900,"id":110,"parentId":105,"tags":{},"startTime":1778900049186,"traceId":"0ba1af1bb1779032"},{"name":"static-generation","duration":648504,"timestamp":92076294664,"id":105,"parentId":1,"tags":{},"startTime":1778900048541,"traceId":"0ba1af1bb1779032"},{"name":"write-routes-manifest","duration":517,"timestamp":92076943359,"id":111,"parentId":1,"tags":{},"startTime":1778900049190,"traceId":"0ba1af1bb1779032"},{"name":"print-tree-view","duration":3723,"timestamp":92076961696,"id":112,"parentId":1,"tags":{},"startTime":1778900049208,"traceId":"0ba1af1bb1779032"},{"name":"write-route-bundle-stats","duration":13619,"timestamp":92076965455,"id":113,"parentId":1,"tags":{},"startTime":1778900049212,"traceId":"0ba1af1bb1779032"},{"name":"telemetry-flush","duration":18030,"timestamp":92076979111,"id":114,"parentId":1,"tags":{},"startTime":1778900049225,"traceId":"0ba1af1bb1779032"},{"name":"next-build","duration":17499101,"timestamp":92059498090,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778900031744,"traceId":"0ba1af1bb1779032"}]
1
+ [{"name":"generate-buildid","duration":254,"timestamp":92911526564,"id":4,"parentId":1,"tags":{},"startTime":1778900883773,"traceId":"5d003c9cb25dfbf2"},{"name":"load-custom-routes","duration":478,"timestamp":92911526959,"id":5,"parentId":1,"tags":{},"startTime":1778900883773,"traceId":"5d003c9cb25dfbf2"},{"name":"create-dist-dir","duration":715,"timestamp":92911527480,"id":6,"parentId":1,"tags":{},"startTime":1778900883774,"traceId":"5d003c9cb25dfbf2"},{"name":"clean","duration":34169,"timestamp":92911528869,"id":7,"parentId":1,"tags":{},"startTime":1778900883775,"traceId":"5d003c9cb25dfbf2"},{"name":"discover-routes","duration":24626,"timestamp":92911661761,"id":8,"parentId":1,"tags":{},"startTime":1778900883908,"traceId":"5d003c9cb25dfbf2"},{"name":"create-root-mapping","duration":135,"timestamp":92911686456,"id":9,"parentId":1,"tags":{},"startTime":1778900883933,"traceId":"5d003c9cb25dfbf2"},{"name":"generate-route-types","duration":22009,"timestamp":92911689191,"id":10,"parentId":1,"tags":{},"startTime":1778900883935,"traceId":"5d003c9cb25dfbf2"},{"name":"public-dir-conflict-check","duration":110,"timestamp":92911711294,"id":11,"parentId":1,"tags":{},"startTime":1778900883958,"traceId":"5d003c9cb25dfbf2"},{"name":"generate-routes-manifest","duration":4775,"timestamp":92911711527,"id":12,"parentId":1,"tags":{},"startTime":1778900883958,"traceId":"5d003c9cb25dfbf2"},{"name":"run-turbopack","duration":6232125,"timestamp":92911722548,"id":14,"parentId":1,"tags":{},"startTime":1778900883969,"traceId":"5d003c9cb25dfbf2"},{"name":"turbopack-build-events","duration":72,"timestamp":92912007676,"id":15,"parentId":1,"tags":{},"startTime":1778900884254,"traceId":"5d003c9cb25dfbf2"},{"name":"run-typescript","duration":9760257,"timestamp":92917964209,"id":16,"parentId":1,"tags":{},"startTime":1778900890210,"traceId":"5d003c9cb25dfbf2"},{"name":"generate-required-server-files","duration":2854,"timestamp":92927725799,"id":18,"parentId":1,"tags":{},"startTime":1778900899972,"traceId":"5d003c9cb25dfbf2"},{"name":"check-static-error-page","duration":14832,"timestamp":92927940391,"id":20,"parentId":19,"tags":{},"startTime":1778900900187,"traceId":"5d003c9cb25dfbf2"},{"name":"is-page-static","duration":603407,"timestamp":92927961850,"id":68,"parentId":29,"tags":{},"startTime":1778900900208,"traceId":"5d003c9cb25dfbf2"},{"name":"check-page","duration":617906,"timestamp":92927947548,"id":29,"parentId":19,"tags":{"page":"/api/hub/auth"},"startTime":1778900900194,"traceId":"5d003c9cb25dfbf2"},{"name":"is-page-static","duration":627736,"timestamp":92927962044,"id":69,"parentId":30,"tags":{},"startTime":1778900900208,"traceId":"5d003c9cb25dfbf2"},{"name":"check-page","duration":642170,"timestamp":92927947717,"id":30,"parentId":19,"tags":{"page":"/api/hub/broadcast"},"startTime":1778900900194,"traceId":"5d003c9cb25dfbf2"},{"name":"is-page-static","duration":632064,"timestamp":92927958125,"id":63,"parentId":22,"tags":{},"startTime":1778900900204,"traceId":"5d003c9cb25dfbf2"},{"name":"check-page","duration":646508,"timestamp":92927943739,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1778900900190,"traceId":"5d003c9cb25dfbf2"},{"name":"is-page-static","duration":642034,"timestamp":92927962257,"id":70,"parentId":32,"tags":{},"startTime":1778900900209,"traceId":"5d003c9cb25dfbf2"},{"name":"check-page","duration":656178,"timestamp":92927948199,"id":32,"parentId":19,"tags":{"page":"/api/hub/health"},"startTime":1778900900194,"traceId":"5d003c9cb25dfbf2"},{"name":"is-page-static","duration":648007,"timestamp":92927962399,"id":72,"parentId":34,"tags":{},"startTime":1778900900209,"traceId":"5d003c9cb25dfbf2"},{"name":"check-page","duration":661977,"timestamp":92927948510,"id":34,"parentId":19,"tags":{"page":"/api/hub/license"},"startTime":1778900900195,"traceId":"5d003c9cb25dfbf2"},{"name":"is-page-static","duration":652384,"timestamp":92927962429,"id":73,"parentId":35,"tags":{},"startTime":1778900900209,"traceId":"5d003c9cb25dfbf2"},{"name":"check-page","duration":666197,"timestamp":92927948673,"id":35,"parentId":19,"tags":{"page":"/api/hub/messages"},"startTime":1778900900195,"traceId":"5d003c9cb25dfbf2"},{"name":"is-page-static","duration":660950,"timestamp":92927958225,"id":64,"parentId":25,"tags":{},"startTime":1778900900204,"traceId":"5d003c9cb25dfbf2"},{"name":"check-page","duration":672331,"timestamp":92927946903,"id":25,"parentId":19,"tags":{"page":"/api/auth/login"},"startTime":1778900900193,"traceId":"5d003c9cb25dfbf2"},{"name":"is-page-static","duration":659566,"timestamp":92927962552,"id":74,"parentId":36,"tags":{},"startTime":1778900900209,"traceId":"5d003c9cb25dfbf2"},{"name":"check-page","duration":672949,"timestamp":92927949223,"id":36,"parentId":19,"tags":{"page":"/api/hub/networks"},"startTime":1778900900195,"traceId":"5d003c9cb25dfbf2"},{"name":"is-page-static","duration":666601,"timestamp":92927958332,"id":65,"parentId":26,"tags":{},"startTime":1778900900205,"traceId":"5d003c9cb25dfbf2"},{"name":"check-page","duration":677871,"timestamp":92927947114,"id":26,"parentId":19,"tags":{"page":"/api/auth/logout"},"startTime":1778900900193,"traceId":"5d003c9cb25dfbf2"},{"name":"is-page-static","duration":668837,"timestamp":92927962612,"id":77,"parentId":39,"tags":{},"startTime":1778900900209,"traceId":"5d003c9cb25dfbf2"},{"name":"check-page","duration":681767,"timestamp":92927949725,"id":39,"parentId":19,"tags":{"page":"/api/hub/send"},"startTime":1778900900196,"traceId":"5d003c9cb25dfbf2"},{"name":"is-page-static","duration":683678,"timestamp":92927962587,"id":75,"parentId":37,"tags":{},"startTime":1778900900209,"traceId":"5d003c9cb25dfbf2"},{"name":"check-page","duration":696900,"timestamp":92927949424,"id":37,"parentId":19,"tags":{"page":"/api/hub/nodes"},"startTime":1778900900196,"traceId":"5d003c9cb25dfbf2"},{"name":"is-page-static","duration":687055,"timestamp":92927962601,"id":76,"parentId":38,"tags":{},"startTime":1778900900209,"traceId":"5d003c9cb25dfbf2"},{"name":"check-page","duration":700136,"timestamp":92927949583,"id":38,"parentId":19,"tags":{"page":"/api/hub/register"},"startTime":1778900900196,"traceId":"5d003c9cb25dfbf2"},{"name":"is-page-static","duration":690801,"timestamp":92927962634,"id":79,"parentId":41,"tags":{},"startTime":1778900900209,"traceId":"5d003c9cb25dfbf2"},{"name":"check-page","duration":703522,"timestamp":92927949963,"id":41,"parentId":19,"tags":{"page":"/api/hub/servers"},"startTime":1778900900196,"traceId":"5d003c9cb25dfbf2"},{"name":"is-page-static","duration":705786,"timestamp":92927962646,"id":80,"parentId":42,"tags":{},"startTime":1778900900209,"traceId":"5d003c9cb25dfbf2"},{"name":"check-page","duration":718376,"timestamp":92927950125,"id":42,"parentId":19,"tags":{"page":"/api/hub/session"},"startTime":1778900900196,"traceId":"5d003c9cb25dfbf2"},{"name":"is-page-static","duration":707901,"timestamp":92927962656,"id":81,"parentId":43,"tags":{},"startTime":1778900900209,"traceId":"5d003c9cb25dfbf2"},{"name":"check-page","duration":720341,"timestamp":92927950259,"id":43,"parentId":19,"tags":{"page":"/api/hub/stats"},"startTime":1778900900197,"traceId":"5d003c9cb25dfbf2"},{"name":"is-page-static","duration":712632,"timestamp":92927962675,"id":83,"parentId":45,"tags":{},"startTime":1778900900209,"traceId":"5d003c9cb25dfbf2"},{"name":"check-page","duration":724929,"timestamp":92927950419,"id":45,"parentId":19,"tags":{"page":"/api/hub/task-events"},"startTime":1778900900197,"traceId":"5d003c9cb25dfbf2"},{"name":"is-page-static","duration":713292,"timestamp":92927962666,"id":82,"parentId":44,"tags":{},"startTime":1778900900209,"traceId":"5d003c9cb25dfbf2"},{"name":"check-page","duration":725688,"timestamp":92927950344,"id":44,"parentId":19,"tags":{"page":"/api/hub/status"},"startTime":1778900900197,"traceId":"5d003c9cb25dfbf2"},{"name":"is-page-static","duration":716327,"timestamp":92927962622,"id":78,"parentId":40,"tags":{},"startTime":1778900900209,"traceId":"5d003c9cb25dfbf2"},{"name":"check-page","duration":729144,"timestamp":92927949847,"id":40,"parentId":19,"tags":{"page":"/api/hub/server-logs"},"startTime":1778900900196,"traceId":"5d003c9cb25dfbf2"},{"name":"is-page-static","duration":718827,"timestamp":92927965730,"id":86,"parentId":48,"tags":{},"startTime":1778900900212,"traceId":"5d003c9cb25dfbf2"},{"name":"check-page","duration":733959,"timestamp":92927950639,"id":48,"parentId":19,"tags":{"page":"/api/hub/tokens"},"startTime":1778900900197,"traceId":"5d003c9cb25dfbf2"},{"name":"is-page-static","duration":719642,"timestamp":92927965702,"id":85,"parentId":47,"tags":{},"startTime":1778900900212,"traceId":"5d003c9cb25dfbf2"},{"name":"check-page","duration":734809,"timestamp":92927950574,"id":47,"parentId":19,"tags":{"page":"/api/hub/tmux"},"startTime":1778900900197,"traceId":"5d003c9cb25dfbf2"},{"name":"is-page-static","duration":724481,"timestamp":92927965744,"id":87,"parentId":49,"tags":{},"startTime":1778900900212,"traceId":"5d003c9cb25dfbf2"},{"name":"check-page","duration":739568,"timestamp":92927950704,"id":49,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1778900900197,"traceId":"5d003c9cb25dfbf2"},{"name":"is-page-static","duration":721432,"timestamp":92927969222,"id":88,"parentId":24,"tags":{},"startTime":1778900900215,"traceId":"5d003c9cb25dfbf2"},{"name":"check-page","duration":746350,"timestamp":92927944344,"id":24,"parentId":19,"tags":{"page":"/api/anet/config"},"startTime":1778900900191,"traceId":"5d003c9cb25dfbf2"},{"name":"is-page-static","duration":733220,"timestamp":92927958435,"id":66,"parentId":27,"tags":{},"startTime":1778900900205,"traceId":"5d003c9cb25dfbf2"},{"name":"check-page","duration":744439,"timestamp":92927947260,"id":27,"parentId":19,"tags":{"page":"/api/auth/v3"},"startTime":1778900900194,"traceId":"5d003c9cb25dfbf2"},{"name":"is-page-static","duration":731535,"timestamp":92927962685,"id":84,"parentId":46,"tags":{},"startTime":1778900900209,"traceId":"5d003c9cb25dfbf2"},{"name":"check-page","duration":743780,"timestamp":92927950483,"id":46,"parentId":19,"tags":{"page":"/api/hub/tasks"},"startTime":1778900900197,"traceId":"5d003c9cb25dfbf2"},{"name":"is-page-static","duration":726107,"timestamp":92927970365,"id":89,"parentId":31,"tags":{},"startTime":1778900900217,"traceId":"5d003c9cb25dfbf2"},{"name":"check-page","duration":748665,"timestamp":92927947862,"id":31,"parentId":19,"tags":{"page":"/api/hub/events"},"startTime":1778900900194,"traceId":"5d003c9cb25dfbf2"},{"name":"is-page-static","duration":753502,"timestamp":92927958690,"id":67,"parentId":28,"tags":{},"startTime":1778900900205,"traceId":"5d003c9cb25dfbf2"},{"name":"check-page","duration":764864,"timestamp":92927947401,"id":28,"parentId":19,"tags":{"page":"/api/hub/audit-log"},"startTime":1778900900194,"traceId":"5d003c9cb25dfbf2"},{"name":"is-page-static","duration":778187,"timestamp":92927957726,"id":62,"parentId":21,"tags":{},"startTime":1778900900204,"traceId":"5d003c9cb25dfbf2"},{"name":"check-page","duration":793845,"timestamp":92927942149,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1778900900188,"traceId":"5d003c9cb25dfbf2"},{"name":"is-page-static","duration":788692,"timestamp":92927978892,"id":90,"parentId":23,"tags":{},"startTime":1778900900225,"traceId":"5d003c9cb25dfbf2"},{"name":"check-page","duration":823612,"timestamp":92927944058,"id":23,"parentId":19,"tags":{"page":"/admin"},"startTime":1778900900190,"traceId":"5d003c9cb25dfbf2"},{"name":"is-page-static","duration":788921,"timestamp":92927978949,"id":93,"parentId":52,"tags":{},"startTime":1778900900225,"traceId":"5d003c9cb25dfbf2"},{"name":"check-page","duration":815256,"timestamp":92927952656,"id":52,"parentId":19,"tags":{"page":"/messages"},"startTime":1778900900199,"traceId":"5d003c9cb25dfbf2"},{"name":"is-page-static","duration":794356,"timestamp":92927978983,"id":96,"parentId":56,"tags":{},"startTime":1778900900225,"traceId":"5d003c9cb25dfbf2"},{"name":"check-page","duration":819691,"timestamp":92927953705,"id":56,"parentId":19,"tags":{"page":"/server-logs"},"startTime":1778900900200,"traceId":"5d003c9cb25dfbf2"},{"name":"is-page-static","duration":796448,"timestamp":92927978995,"id":97,"parentId":57,"tags":{},"startTime":1778900900225,"traceId":"5d003c9cb25dfbf2"},{"name":"check-page","duration":821581,"timestamp":92927953916,"id":57,"parentId":19,"tags":{"page":"/settings/networks"},"startTime":1778900900200,"traceId":"5d003c9cb25dfbf2"},{"name":"is-page-static","duration":803992,"timestamp":92927978936,"id":92,"parentId":51,"tags":{},"startTime":1778900900225,"traceId":"5d003c9cb25dfbf2"},{"name":"check-page","duration":830458,"timestamp":92927952525,"id":51,"parentId":19,"tags":{"page":"/logs"},"startTime":1778900900199,"traceId":"5d003c9cb25dfbf2"},{"name":"is-page-static","duration":805338,"timestamp":92927979022,"id":98,"parentId":59,"tags":{},"startTime":1778900900225,"traceId":"5d003c9cb25dfbf2"},{"name":"check-page","duration":829812,"timestamp":92927954623,"id":59,"parentId":19,"tags":{"page":"/settings/tokens"},"startTime":1778900900201,"traceId":"5d003c9cb25dfbf2"},{"name":"is-page-static","duration":810458,"timestamp":92927979042,"id":99,"parentId":60,"tags":{},"startTime":1778900900225,"traceId":"5d003c9cb25dfbf2"},{"name":"check-page","duration":834779,"timestamp":92927954780,"id":60,"parentId":19,"tags":{"page":"/tasks/[id]"},"startTime":1778900900201,"traceId":"5d003c9cb25dfbf2"},{"name":"is-page-static","duration":811250,"timestamp":92927979066,"id":100,"parentId":61,"tags":{},"startTime":1778900900225,"traceId":"5d003c9cb25dfbf2"},{"name":"check-page","duration":835429,"timestamp":92927954933,"id":61,"parentId":19,"tags":{"page":"/tasks"},"startTime":1778900900201,"traceId":"5d003c9cb25dfbf2"},{"name":"is-page-static","duration":814906,"timestamp":92927978970,"id":95,"parentId":54,"tags":{},"startTime":1778900900225,"traceId":"5d003c9cb25dfbf2"},{"name":"check-page","duration":840814,"timestamp":92927953105,"id":54,"parentId":19,"tags":{"page":"/nodes"},"startTime":1778900900199,"traceId":"5d003c9cb25dfbf2"},{"name":"is-page-static","duration":791525,"timestamp":92928005798,"id":102,"parentId":58,"tags":{},"startTime":1778900900252,"traceId":"5d003c9cb25dfbf2"},{"name":"check-page","duration":843248,"timestamp":92927954120,"id":58,"parentId":19,"tags":{"page":"/settings"},"startTime":1778900900200,"traceId":"5d003c9cb25dfbf2"},{"name":"is-page-static","duration":805313,"timestamp":92927992620,"id":101,"parentId":55,"tags":{},"startTime":1778900900239,"traceId":"5d003c9cb25dfbf2"},{"name":"check-page","duration":844676,"timestamp":92927953295,"id":55,"parentId":19,"tags":{"page":"/"},"startTime":1778900900200,"traceId":"5d003c9cb25dfbf2"},{"name":"is-page-static","duration":843010,"timestamp":92927962327,"id":71,"parentId":33,"tags":{},"startTime":1778900900209,"traceId":"5d003c9cb25dfbf2"},{"name":"check-page","duration":857292,"timestamp":92927948358,"id":33,"parentId":19,"tags":{"page":"/api/hub/inbox"},"startTime":1778900900195,"traceId":"5d003c9cb25dfbf2"},{"name":"is-page-static","duration":838001,"timestamp":92927978921,"id":91,"parentId":50,"tags":{},"startTime":1778900900225,"traceId":"5d003c9cb25dfbf2"},{"name":"check-page","duration":864643,"timestamp":92927952326,"id":50,"parentId":19,"tags":{"page":"/login"},"startTime":1778900900199,"traceId":"5d003c9cb25dfbf2"},{"name":"is-page-static","duration":840284,"timestamp":92927978962,"id":94,"parentId":53,"tags":{},"startTime":1778900900225,"traceId":"5d003c9cb25dfbf2"},{"name":"check-page","duration":866419,"timestamp":92927952862,"id":53,"parentId":19,"tags":{"page":"/node"},"startTime":1778900900199,"traceId":"5d003c9cb25dfbf2"},{"name":"static-check","duration":880111,"timestamp":92927939227,"id":19,"parentId":1,"tags":{},"startTime":1778900900186,"traceId":"5d003c9cb25dfbf2"},{"name":"write-routes-manifest","duration":577,"timestamp":92928826966,"id":104,"parentId":1,"tags":{},"startTime":1778900901073,"traceId":"5d003c9cb25dfbf2"},{"name":"load-dotenv","duration":70,"timestamp":92928844589,"id":107,"parentId":106,"tags":{},"startTime":1778900901091,"traceId":"5d003c9cb25dfbf2"},{"name":"run-export-path-map","duration":702,"timestamp":92928848270,"id":108,"parentId":106,"tags":{},"startTime":1778900901095,"traceId":"5d003c9cb25dfbf2"},{"name":"next-export","duration":706472,"timestamp":92928842774,"id":106,"parentId":1,"tags":{},"startTime":1778900901089,"traceId":"5d003c9cb25dfbf2"}]
2
+ [{"name":"move-exported-app-not-found-","duration":2955,"timestamp":92929553982,"id":109,"parentId":105,"tags":{},"startTime":1778900901800,"traceId":"5d003c9cb25dfbf2"},{"name":"move-exported-app-global-error-","duration":662,"timestamp":92929557068,"id":110,"parentId":105,"tags":{},"startTime":1778900901803,"traceId":"5d003c9cb25dfbf2"},{"name":"static-generation","duration":726033,"timestamp":92928834193,"id":105,"parentId":1,"tags":{},"startTime":1778900901080,"traceId":"5d003c9cb25dfbf2"},{"name":"write-routes-manifest","duration":487,"timestamp":92929560415,"id":111,"parentId":1,"tags":{},"startTime":1778900901807,"traceId":"5d003c9cb25dfbf2"},{"name":"print-tree-view","duration":5221,"timestamp":92929582387,"id":112,"parentId":1,"tags":{},"startTime":1778900901829,"traceId":"5d003c9cb25dfbf2"},{"name":"write-route-bundle-stats","duration":14555,"timestamp":92929587651,"id":113,"parentId":1,"tags":{},"startTime":1778900901834,"traceId":"5d003c9cb25dfbf2"},{"name":"telemetry-flush","duration":17351,"timestamp":92929602243,"id":114,"parentId":1,"tags":{},"startTime":1778900901849,"traceId":"5d003c9cb25dfbf2"},{"name":"next-build","duration":18148348,"timestamp":92911471284,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778900883718,"traceId":"5d003c9cb25dfbf2"}]
package/.next/trace-build CHANGED
@@ -1 +1 @@
1
- [{"name":"run-turbopack","duration":5861609,"timestamp":92059756563,"id":14,"parentId":1,"tags":{},"startTime":1778900032003,"traceId":"0ba1af1bb1779032"},{"name":"turbopack-build-events","duration":99,"timestamp":92060065548,"id":15,"parentId":1,"tags":{},"startTime":1778900032312,"traceId":"0ba1af1bb1779032"},{"name":"run-typescript","duration":9548879,"timestamp":92065627676,"id":16,"parentId":1,"tags":{},"startTime":1778900037874,"traceId":"0ba1af1bb1779032"},{"name":"static-check","duration":908123,"timestamp":92075373809,"id":19,"parentId":1,"tags":{},"startTime":1778900047620,"traceId":"0ba1af1bb1779032"},{"name":"static-generation","duration":648504,"timestamp":92076294664,"id":105,"parentId":1,"tags":{},"startTime":1778900048541,"traceId":"0ba1af1bb1779032"},{"name":"telemetry-flush","duration":18030,"timestamp":92076979111,"id":114,"parentId":1,"tags":{},"startTime":1778900049225,"traceId":"0ba1af1bb1779032"},{"name":"next-build","duration":17499101,"timestamp":92059498090,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778900031744,"traceId":"0ba1af1bb1779032"}]
1
+ [{"name":"run-turbopack","duration":6232125,"timestamp":92911722548,"id":14,"parentId":1,"tags":{},"startTime":1778900883969,"traceId":"5d003c9cb25dfbf2"},{"name":"turbopack-build-events","duration":72,"timestamp":92912007676,"id":15,"parentId":1,"tags":{},"startTime":1778900884254,"traceId":"5d003c9cb25dfbf2"},{"name":"run-typescript","duration":9760257,"timestamp":92917964209,"id":16,"parentId":1,"tags":{},"startTime":1778900890210,"traceId":"5d003c9cb25dfbf2"},{"name":"static-check","duration":880111,"timestamp":92927939227,"id":19,"parentId":1,"tags":{},"startTime":1778900900186,"traceId":"5d003c9cb25dfbf2"},{"name":"static-generation","duration":726033,"timestamp":92928834193,"id":105,"parentId":1,"tags":{},"startTime":1778900901080,"traceId":"5d003c9cb25dfbf2"},{"name":"telemetry-flush","duration":17351,"timestamp":92929602243,"id":114,"parentId":1,"tags":{},"startTime":1778900901849,"traceId":"5d003c9cb25dfbf2"},{"name":"next-build","duration":18148348,"timestamp":92911471284,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778900883718,"traceId":"5d003c9cb25dfbf2"}]
@@ -1069,8 +1069,20 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
1069
1069
  // is currently popping so only that icon picks up the class.
1070
1070
  // Arms for 240ms (CSS animation 220ms + 20ms buffer) so a quick
1071
1071
  // re-click can replay cleanly.
1072
- const [chromePopping, setChromePopping] = useState<'zoom-in' | 'zoom-out' | null>(null);
1073
- const popChrome = (which: 'zoom-in' | 'zoom-out') => {
1072
+ // Round 249 / Loop: extend chromePopping to cover ring/grid layout
1073
+ // toggle + fullscreen button alongside the existing zoom-in/zoom-out.
1074
+ // Pre-R249 only the zoom buttons fired the R186 .anet-chrome-pop scale
1075
+ // pulse on click; the other chrome controls (layout toggle, fullscreen)
1076
+ // had no transient "I just clicked" signal — silent click → state change
1077
+ // with only the post-click visual difference to confirm action. R249
1078
+ // gives every clickable chrome control the same 220ms scale pulse, so
1079
+ // the whole strip speaks one consistent click vocabulary. Reset button
1080
+ // keeps its own R184 rotation animation (different gesture, semantic).
1081
+ // Node-size S/M/L keep their R171 layoutSwitching crossfade (already
1082
+ // gestural). Type union grows but the helper signature stays one-arg.
1083
+ type ChromePop = 'zoom-in' | 'zoom-out' | 'layout-ring' | 'layout-grid' | 'fullscreen' | 'size-S' | 'size-M' | 'size-L';
1084
+ const [chromePopping, setChromePopping] = useState<ChromePop | null>(null);
1085
+ const popChrome = (which: ChromePop) => {
1074
1086
  setChromePopping(which);
1075
1087
  setTimeout(() => setChromePopping(prev => prev === which ? null : prev), 240);
1076
1088
  };
@@ -1420,29 +1432,38 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
1420
1432
  -fullscreen etc). */}
1421
1433
  <div className="inline-flex rounded-md border border-gray-500/25 overflow-hidden" role="group" aria-label="Topology layout">
1422
1434
  <button
1423
- onClick={() => { if (layout !== 'ring') toggleLayout(); }}
1435
+ onClick={() => { popChrome('layout-ring'); if (layout !== 'ring') toggleLayout(); }}
1424
1436
  aria-pressed={layout === 'ring'}
1425
1437
  title="Ring layout (l to toggle)"
1426
1438
  data-topo-chrome-layout="ring"
1427
1439
  data-topo-chrome-layout-active={layout === 'ring' ? 'true' : 'false'}
1440
+ data-topo-chrome-layout-ring-popping={chromePopping === 'layout-ring' ? 'true' : 'false'}
1428
1441
  // Round 196 / Loop: add active: (pressed) state for tactile
1429
1442
  // click feedback — bridges mouse-down → R186/R184/R192 pop-on-
1430
1443
  // release. Selected variant deepens to cyan-500/25 (one tier
1431
1444
  // above its hover:cyan-500/20); unselected variant deepens
1432
1445
  // to cyan-500/15 (one tier above its hover:cyan-500/5).
1433
- className={`px-2.5 py-1 transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-cyan-400/60 focus-visible:ring-inset ${layout === 'ring' ? 'bg-cyan-500/15 text-cyan-300 hover:bg-cyan-500/20 active:bg-cyan-500/25' : 'text-gray-500 hover:text-gray-300 hover:bg-cyan-500/5 active:bg-cyan-500/15'}`}
1446
+ // Round 249 / Loop: chrome-pop joins the click handshake —
1447
+ // mouse-down deepens cyan press (R196), release fires
1448
+ // .anet-chrome-pop on the button (R249) AND triggers
1449
+ // toggleLayout if state changes. The pop runs even when
1450
+ // clicking the already-active layout (no state change),
1451
+ // confirming the click was received either way.
1452
+ className={`px-2.5 py-1 transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-cyan-400/60 focus-visible:ring-inset ${layout === 'ring' ? 'bg-cyan-500/15 text-cyan-300 hover:bg-cyan-500/20 active:bg-cyan-500/25' : 'text-gray-500 hover:text-gray-300 hover:bg-cyan-500/5 active:bg-cyan-500/15'} ${chromePopping === 'layout-ring' ? ' anet-chrome-pop' : ''}`}
1434
1453
  >
1435
1454
  Ring
1436
1455
  </button>
1437
1456
  <button
1438
- onClick={() => { if (layout !== 'grid') toggleLayout(); }}
1457
+ onClick={() => { popChrome('layout-grid'); if (layout !== 'grid') toggleLayout(); }}
1439
1458
  aria-pressed={layout === 'grid'}
1440
1459
  title="Grid layout (l to toggle)"
1441
1460
  data-topo-chrome-layout="grid"
1442
1461
  data-topo-chrome-layout-active={layout === 'grid' ? 'true' : 'false'}
1462
+ data-topo-chrome-layout-grid-popping={chromePopping === 'layout-grid' ? 'true' : 'false'}
1443
1463
  // Round 196 / Loop: R163 layout-toggle Grid variant picks up
1444
1464
  // press-state — same tier pattern as Ring above.
1445
- className={`px-2.5 py-1 border-l border-gray-500/25 transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-cyan-400/60 focus-visible:ring-inset ${layout === 'grid' ? 'bg-cyan-500/15 text-cyan-300 hover:bg-cyan-500/20 active:bg-cyan-500/25' : 'text-gray-500 hover:text-gray-300 hover:bg-cyan-500/5 active:bg-cyan-500/15'}`}
1465
+ // Round 249 / Loop: chrome-pop on click — same as Ring.
1466
+ className={`px-2.5 py-1 border-l border-gray-500/25 transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-cyan-400/60 focus-visible:ring-inset ${layout === 'grid' ? 'bg-cyan-500/15 text-cyan-300 hover:bg-cyan-500/20 active:bg-cyan-500/25' : 'text-gray-500 hover:text-gray-300 hover:bg-cyan-500/5 active:bg-cyan-500/15'} ${chromePopping === 'layout-grid' ? ' anet-chrome-pop' : ''}`}
1446
1467
  >
1447
1468
  Grid
1448
1469
  </button>
@@ -6391,13 +6412,16 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
6391
6412
  role="group"
6392
6413
  aria-label="Node size"
6393
6414
  >
6394
- {([['S', 0.7], ['M', 0.84], ['L', 1]] as const).map(([lbl, v], idx) => (
6415
+ {([['S', 0.7], ['M', 0.84], ['L', 1]] as const).map(([lbl, v], idx) => {
6416
+ const popKey = `size-${lbl}` as 'size-S' | 'size-M' | 'size-L';
6417
+ return (
6395
6418
  <button
6396
6419
  key={lbl}
6397
- onClick={() => pickNodeScale(v)}
6420
+ onClick={() => { popChrome(popKey); pickNodeScale(v); }}
6398
6421
  aria-pressed={nodeScale === v}
6399
6422
  data-topo-chrome-nodesize={lbl}
6400
6423
  data-topo-chrome-nodesize-active={nodeScale === v ? 'true' : 'false'}
6424
+ data-topo-chrome-nodesize-popping={chromePopping === popKey ? 'true' : 'false'}
6401
6425
  title={`Node size: ${lbl === 'S' ? 'small' : lbl === 'M' ? 'medium' : 'large'}`}
6402
6426
  // Round 179 / Loop: nodeSize S/M/L active-button hover
6403
6427
  // variant closes the inconsistency with R163 layout
@@ -6413,12 +6437,24 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
6413
6437
  // (active:) — selected variant deepens to cyan-500/25,
6414
6438
  // unselected to white/10. Same tier pattern as R196 layout
6415
6439
  // toggle + zoom/reset/fullscreen below.
6416
- className={`px-2 py-1 transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-cyan-400/60 focus-visible:ring-inset ${idx > 0 ? 'border-l' : ''} ${nodeScale === v ? 'bg-cyan-500/15 text-cyan-300 hover:bg-cyan-500/20 active:bg-cyan-500/25' : 'hover:bg-white/5 active:bg-white/10'}`}
6440
+ // Round 250 / Loop: nodeSize buttons close the chrome-pop
6441
+ // family — every clickable chrome button now fires the
6442
+ // R186 .anet-chrome-pop scale-pulse on release. R171
6443
+ // canvas crossfade (nodeSizeSwitching) keeps masking the
6444
+ // node radius change at the global scope; R250 chrome-pop
6445
+ // adds the LOCAL button-level confirmation. The two
6446
+ // happen simultaneously without conflict — local scale
6447
+ // pulse on the button, global canvas dim around it.
6448
+ // Milestone round: the entire chrome strip (zoom -/+,
6449
+ // ring/grid, fullscreen, S/M/L) now speaks one
6450
+ // consistent click vocabulary.
6451
+ className={`px-2 py-1 transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-cyan-400/60 focus-visible:ring-inset ${idx > 0 ? 'border-l' : ''} ${nodeScale === v ? 'bg-cyan-500/15 text-cyan-300 hover:bg-cyan-500/20 active:bg-cyan-500/25' : 'hover:bg-white/5 active:bg-white/10'}${chromePopping === popKey ? ' anet-chrome-pop' : ''}`}
6417
6452
  style={{ color: nodeScale === v ? undefined : pal.legendText, borderColor: pal.containerBorder }}
6418
6453
  >
6419
6454
  {lbl}
6420
6455
  </button>
6421
- ))}
6456
+ );
6457
+ })}
6422
6458
  </div>
6423
6459
  <div
6424
6460
  className="flex items-center rounded-md border overflow-hidden"
@@ -6545,17 +6581,20 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
6545
6581
  background + color when active so the Tailwind cyan
6546
6582
  classes win specificity. */}
6547
6583
  <button
6548
- onClick={toggleFullscreen}
6584
+ onClick={() => { popChrome('fullscreen'); toggleFullscreen(); }}
6549
6585
  data-topo-chrome-fullscreen
6550
6586
  data-topo-chrome-fullscreen-active={isFullscreen ? 'true' : 'false'}
6587
+ data-topo-chrome-fullscreen-popping={chromePopping === 'fullscreen' ? 'true' : 'false'}
6551
6588
  // R196: fullscreen also picks up press-state — active variant
6552
6589
  // deepens cyan-500/20 → cyan-500/25 on press; non-active
6553
6590
  // deepens white/5 → white/10.
6591
+ // R249: chrome-pop on click — same one-vocabulary click signal
6592
+ // as layout toggle and zoom buttons.
6554
6593
  className={`p-1.5 rounded-md border transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-cyan-400/60 ${
6555
6594
  isFullscreen
6556
6595
  ? 'bg-cyan-500/15 text-cyan-300 hover:bg-cyan-500/20 active:bg-cyan-500/25'
6557
6596
  : 'hover:bg-white/5 active:bg-white/10'
6558
- }`}
6597
+ }${chromePopping === 'fullscreen' ? ' anet-chrome-pop' : ''}`}
6559
6598
  style={{
6560
6599
  borderColor: pal.containerBorder,
6561
6600
  ...(isFullscreen
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sleep2agi/agent-network-dashboard",
3
- "version": "0.4.6-preview.255",
3
+ "version": "0.4.6-preview.257",
4
4
  "description": "Agent Network Dashboard — Web UI for managing AI Agent networks",
5
5
  "scripts": {
6
6
  "dev": "next dev",
@@ -0,0 +1,98 @@
1
+ /* Round 249 verification: chrome-pop click animation extends from
2
+ * the existing zoom-in/zoom-out pair to ring/grid layout toggle +
3
+ * fullscreen buttons. Whole chrome strip now speaks one click
4
+ * vocabulary instead of zoom-only-pops + silent-everything-else.
5
+ *
6
+ * Per button, on click:
7
+ * data-topo-chrome-{key}-popping flips 'false' → 'true' for ~240ms
8
+ * className gains 'anet-chrome-pop' for the same window
9
+ *
10
+ * Test scope:
11
+ * - Ring layout button: click → data-topo-chrome-layout-ring-popping='true' (within 100ms)
12
+ * - Grid layout button: click → data-topo-chrome-layout-grid-popping='true'
13
+ * - Fullscreen button: click → data-topo-chrome-fullscreen-popping='true'
14
+ *
15
+ * Hard-to-test trap: chromePopping is transient (240ms TTL). Probe
16
+ * immediately after Playwright click resolves. Wait full 240ms after
17
+ * for the second probe — must be 'false' again.
18
+ */
19
+ import { chromium } from 'playwright';
20
+ import { readFileSync } from 'node:fs';
21
+
22
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
23
+ const browser = await chromium.launch({ headless: true });
24
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1500 } });
25
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
26
+ await ctx.addInitScript(() => {
27
+ try { localStorage.setItem('anet-theme', 'cyber'); sessionStorage.setItem('anet_v3_auth', '1'); } catch {}
28
+ });
29
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
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('alpha'), mk('beta'), mk('gamma'), mk('delta'),
41
+ ] } });
42
+ });
43
+ await ctx.route('**/api/hub/messages*', (r2) => r2.fulfill({ json: { messages: [] } }));
44
+ await ctx.route('**/api/hub/tasks*', (r2) => r2.fulfill({ json: { tasks: [] } }));
45
+
46
+ const page = await ctx.newPage();
47
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
48
+ await page.waitForFunction(() => document.querySelectorAll('g[data-node]').length === 4, { timeout: 30000 });
49
+ await page.waitForSelector('[data-topo-chrome-layout="ring"]', { timeout: 10000 });
50
+ await page.waitForSelector('[data-topo-chrome-fullscreen]', { timeout: 10000 });
51
+ await page.waitForTimeout(300);
52
+
53
+ const testButton = async (clickSelector, poppingAttr, label) => {
54
+ // Click + immediately read state. The chromePopping setState is
55
+ // synchronous within the click handler, so the DOM should reflect
56
+ // 'true' on the next React commit (very soon after click resolves).
57
+ await page.locator(clickSelector).click();
58
+ // Probe quickly — within the 240ms window
59
+ await page.waitForTimeout(50);
60
+ const duringPop = await page.locator(clickSelector).getAttribute(poppingAttr);
61
+ const classDuring = await page.locator(clickSelector).getAttribute('class');
62
+ // Wait for the pop to clear
63
+ await page.waitForTimeout(300);
64
+ const afterPop = await page.locator(clickSelector).getAttribute(poppingAttr);
65
+ const classAfter = await page.locator(clickSelector).getAttribute('class');
66
+ return {
67
+ label,
68
+ duringAttr: duringPop,
69
+ duringClass: /anet-chrome-pop/.test(classDuring || ''),
70
+ afterAttr: afterPop,
71
+ afterClass: /anet-chrome-pop/.test(classAfter || ''),
72
+ };
73
+ };
74
+
75
+ const ring = await testButton('[data-topo-chrome-layout="ring"]', 'data-topo-chrome-layout-ring-popping', 'ring');
76
+ const grid = await testButton('[data-topo-chrome-layout="grid"]', 'data-topo-chrome-layout-grid-popping', 'grid');
77
+ // For fullscreen, browser context may not honour requestFullscreen in
78
+ // headless mode — wrap in try/catch on the page side. Test only the
79
+ // data attr + className.
80
+ const fullscreen = await testButton('[data-topo-chrome-fullscreen]', 'data-topo-chrome-fullscreen-popping', 'fullscreen');
81
+
82
+ await browser.close();
83
+
84
+ const ok_each = (b) =>
85
+ b.duringAttr === 'true' && b.duringClass === true &&
86
+ b.afterAttr === 'false' && b.afterClass === false;
87
+
88
+ const results = {
89
+ ring_pops_on_click: ok_each(ring),
90
+ grid_pops_on_click: ok_each(grid),
91
+ fullscreen_pops_on_click: ok_each(fullscreen),
92
+ };
93
+ const ok = Object.values(results).every(Boolean);
94
+ console.log(`${ok ? '✅' : '❌'} chrome-pop extension:`, JSON.stringify(results),
95
+ '\n ring: ', ring,
96
+ '\n grid: ', grid,
97
+ '\n fullscreen:', fullscreen);
98
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,88 @@
1
+ /* Round 250 verification: nodeSize S/M/L buttons close the chrome-
2
+ * pop click-feedback family. Every clickable chrome button now fires
3
+ * the R186 .anet-chrome-pop 220ms scale-pulse on release.
4
+ *
5
+ * R171 nodeSizeSwitching canvas crossfade still masks the radius
6
+ * change at the global scope; R250 chrome-pop adds the LOCAL
7
+ * button-level click confirmation.
8
+ *
9
+ * Test scope: click each of S/M/L → within 50ms data-topo-chrome-
10
+ * nodesize-popping='true' + className contains 'anet-chrome-pop'.
11
+ * After 300ms both clear.
12
+ */
13
+ import { chromium } from 'playwright';
14
+ import { readFileSync } from 'node:fs';
15
+
16
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
17
+ const browser = await chromium.launch({ headless: true });
18
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1500 } });
19
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
20
+ await ctx.addInitScript(() => {
21
+ try { localStorage.setItem('anet-theme', 'cyber'); sessionStorage.setItem('anet_v3_auth', '1'); } catch {}
22
+ });
23
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
24
+ await ctx.route('**/api/hub/status*', async (route) => {
25
+ const r = await route.fetch();
26
+ const b = await r.json();
27
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
28
+ const mk = (alias) => ({
29
+ alias, status: 'working', model: 'claude-opus-4', runtime: 'claude-code-cli',
30
+ network_id: nid, project_dir: null,
31
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
32
+ });
33
+ await route.fulfill({ response: r, json: { ...b, sessions: [
34
+ mk('alpha'), mk('beta'), mk('gamma'), mk('delta'),
35
+ ] } });
36
+ });
37
+ await ctx.route('**/api/hub/messages*', (r2) => r2.fulfill({ json: { messages: [] } }));
38
+ await ctx.route('**/api/hub/tasks*', (r2) => r2.fulfill({ json: { tasks: [] } }));
39
+
40
+ const page = await ctx.newPage();
41
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
42
+ await page.waitForFunction(() => document.querySelectorAll('g[data-node]').length === 4, { timeout: 30000 });
43
+ await page.waitForSelector('[data-topo-chrome-nodesize="S"]', { timeout: 10000 });
44
+ await page.waitForTimeout(300);
45
+
46
+ const testButton = async (size) => {
47
+ const sel = `[data-topo-chrome-nodesize="${size}"]`;
48
+ await page.locator(sel).click();
49
+ await page.waitForTimeout(50);
50
+ const duringAttr = await page.locator(sel).getAttribute('data-topo-chrome-nodesize-popping');
51
+ const duringClass = await page.locator(sel).getAttribute('class');
52
+ // Wait past the 240ms TTL
53
+ await page.waitForTimeout(300);
54
+ const afterAttr = await page.locator(sel).getAttribute('data-topo-chrome-nodesize-popping');
55
+ const afterClass = await page.locator(sel).getAttribute('class');
56
+ return {
57
+ size,
58
+ duringAttr,
59
+ duringClassHasPop: /anet-chrome-pop/.test(duringClass || ''),
60
+ afterAttr,
61
+ afterClassHasPop: /anet-chrome-pop/.test(afterClass || ''),
62
+ };
63
+ };
64
+
65
+ // Click each in order S → L → M to mix up state
66
+ const small = await testButton('S');
67
+ const large = await testButton('L');
68
+ const medium = await testButton('M');
69
+
70
+ await browser.close();
71
+
72
+ const ok_each = (b) =>
73
+ b.duringAttr === 'true' &&
74
+ b.duringClassHasPop === true &&
75
+ b.afterAttr === 'false' &&
76
+ b.afterClassHasPop === false;
77
+
78
+ const results = {
79
+ small_pops: ok_each(small),
80
+ medium_pops: ok_each(medium),
81
+ large_pops: ok_each(large),
82
+ };
83
+ const ok = Object.values(results).every(Boolean);
84
+ console.log(`${ok ? '✅' : '❌'} chrome-pop nodesize:`, JSON.stringify(results),
85
+ '\n small: ', small,
86
+ '\n medium:', medium,
87
+ '\n large: ', large);
88
+ process.exit(ok ? 0 : 1);