@sleep2agi/agent-network-dashboard 0.4.6-preview.175 → 0.4.6-preview.177

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 (143) 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/prerender-manifest.json +3 -3
  6. package/.next/server/app/_global-error.html +1 -1
  7. package/.next/server/app/_global-error.rsc +1 -1
  8. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  12. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  13. package/.next/server/app/_not-found.html +1 -1
  14. package/.next/server/app/_not-found.rsc +1 -1
  15. package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  16. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  17. package/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  18. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  19. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  20. package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  21. package/.next/server/app/admin.html +1 -1
  22. package/.next/server/app/admin.rsc +1 -1
  23. package/.next/server/app/admin.segments/_full.segment.rsc +1 -1
  24. package/.next/server/app/admin.segments/_head.segment.rsc +1 -1
  25. package/.next/server/app/admin.segments/_index.segment.rsc +1 -1
  26. package/.next/server/app/admin.segments/_tree.segment.rsc +1 -1
  27. package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +1 -1
  28. package/.next/server/app/admin.segments/admin.segment.rsc +1 -1
  29. package/.next/server/app/index.html +2 -2
  30. package/.next/server/app/index.rsc +2 -2
  31. package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  32. package/.next/server/app/index.segments/_full.segment.rsc +2 -2
  33. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  34. package/.next/server/app/index.segments/_index.segment.rsc +1 -1
  35. package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  36. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  37. package/.next/server/app/login.html +2 -2
  38. package/.next/server/app/login.rsc +2 -2
  39. package/.next/server/app/login.segments/_full.segment.rsc +2 -2
  40. package/.next/server/app/login.segments/_head.segment.rsc +1 -1
  41. package/.next/server/app/login.segments/_index.segment.rsc +1 -1
  42. package/.next/server/app/login.segments/_tree.segment.rsc +1 -1
  43. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  44. package/.next/server/app/login.segments/login.segment.rsc +1 -1
  45. package/.next/server/app/logs.html +1 -1
  46. package/.next/server/app/logs.rsc +1 -1
  47. package/.next/server/app/logs.segments/_full.segment.rsc +1 -1
  48. package/.next/server/app/logs.segments/_head.segment.rsc +1 -1
  49. package/.next/server/app/logs.segments/_index.segment.rsc +1 -1
  50. package/.next/server/app/logs.segments/_tree.segment.rsc +1 -1
  51. package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +1 -1
  52. package/.next/server/app/logs.segments/logs.segment.rsc +1 -1
  53. package/.next/server/app/messages.html +1 -1
  54. package/.next/server/app/messages.rsc +1 -1
  55. package/.next/server/app/messages.segments/_full.segment.rsc +1 -1
  56. package/.next/server/app/messages.segments/_head.segment.rsc +1 -1
  57. package/.next/server/app/messages.segments/_index.segment.rsc +1 -1
  58. package/.next/server/app/messages.segments/_tree.segment.rsc +1 -1
  59. package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +1 -1
  60. package/.next/server/app/messages.segments/messages.segment.rsc +1 -1
  61. package/.next/server/app/node.html +1 -1
  62. package/.next/server/app/node.rsc +1 -1
  63. package/.next/server/app/node.segments/_full.segment.rsc +1 -1
  64. package/.next/server/app/node.segments/_head.segment.rsc +1 -1
  65. package/.next/server/app/node.segments/_index.segment.rsc +1 -1
  66. package/.next/server/app/node.segments/_tree.segment.rsc +1 -1
  67. package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +1 -1
  68. package/.next/server/app/node.segments/node.segment.rsc +1 -1
  69. package/.next/server/app/nodes.html +1 -1
  70. package/.next/server/app/nodes.rsc +1 -1
  71. package/.next/server/app/nodes.segments/_full.segment.rsc +1 -1
  72. package/.next/server/app/nodes.segments/_head.segment.rsc +1 -1
  73. package/.next/server/app/nodes.segments/_index.segment.rsc +1 -1
  74. package/.next/server/app/nodes.segments/_tree.segment.rsc +1 -1
  75. package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +1 -1
  76. package/.next/server/app/nodes.segments/nodes.segment.rsc +1 -1
  77. package/.next/server/app/page_client-reference-manifest.js +1 -1
  78. package/.next/server/app/server-logs.html +1 -1
  79. package/.next/server/app/server-logs.rsc +1 -1
  80. package/.next/server/app/server-logs.segments/_full.segment.rsc +1 -1
  81. package/.next/server/app/server-logs.segments/_head.segment.rsc +1 -1
  82. package/.next/server/app/server-logs.segments/_index.segment.rsc +1 -1
  83. package/.next/server/app/server-logs.segments/_tree.segment.rsc +1 -1
  84. package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +1 -1
  85. package/.next/server/app/server-logs.segments/server-logs.segment.rsc +1 -1
  86. package/.next/server/app/settings/networks.html +1 -1
  87. package/.next/server/app/settings/networks.rsc +1 -1
  88. package/.next/server/app/settings/networks.segments/_full.segment.rsc +1 -1
  89. package/.next/server/app/settings/networks.segments/_head.segment.rsc +1 -1
  90. package/.next/server/app/settings/networks.segments/_index.segment.rsc +1 -1
  91. package/.next/server/app/settings/networks.segments/_tree.segment.rsc +1 -1
  92. package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +1 -1
  93. package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +1 -1
  94. package/.next/server/app/settings/networks.segments/settings.segment.rsc +1 -1
  95. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  96. package/.next/server/app/settings/tokens.html +1 -1
  97. package/.next/server/app/settings/tokens.rsc +1 -1
  98. package/.next/server/app/settings/tokens.segments/_full.segment.rsc +1 -1
  99. package/.next/server/app/settings/tokens.segments/_head.segment.rsc +1 -1
  100. package/.next/server/app/settings/tokens.segments/_index.segment.rsc +1 -1
  101. package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +1 -1
  102. package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +1 -1
  103. package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +1 -1
  104. package/.next/server/app/settings/tokens.segments/settings.segment.rsc +1 -1
  105. package/.next/server/app/settings.html +2 -2
  106. package/.next/server/app/settings.rsc +2 -2
  107. package/.next/server/app/settings.segments/_full.segment.rsc +2 -2
  108. package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  109. package/.next/server/app/settings.segments/_index.segment.rsc +1 -1
  110. package/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
  111. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +2 -2
  112. package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  113. package/.next/server/app/tasks.html +1 -1
  114. package/.next/server/app/tasks.rsc +1 -1
  115. package/.next/server/app/tasks.segments/_full.segment.rsc +1 -1
  116. package/.next/server/app/tasks.segments/_head.segment.rsc +1 -1
  117. package/.next/server/app/tasks.segments/_index.segment.rsc +1 -1
  118. package/.next/server/app/tasks.segments/_tree.segment.rsc +1 -1
  119. package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +1 -1
  120. package/.next/server/app/tasks.segments/tasks.segment.rsc +1 -1
  121. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js +3 -3
  122. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js.map +1 -1
  123. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js +1 -1
  124. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js.map +1 -1
  125. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js +1 -1
  126. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js.map +1 -1
  127. package/.next/server/middleware-build-manifest.js +3 -3
  128. package/.next/server/pages/404.html +1 -1
  129. package/.next/server/pages/500.html +1 -1
  130. package/.next/server/server-reference-manifest.js +1 -1
  131. package/.next/server/server-reference-manifest.json +1 -1
  132. package/.next/static/chunks/{0nvqjslg7-oow.js → 00gu5o61f6_n9.js} +1 -1
  133. package/.next/static/chunks/{0ovm05~5qcocw.js → 08ai0cx208y-r.js} +3 -3
  134. package/.next/static/chunks/{0mchz1dcdphpm.js → 0d7na5qgxoxj8.js} +1 -1
  135. package/.next/trace +2 -2
  136. package/.next/trace-build +1 -1
  137. package/app/components/TopoGraph.tsx +51 -10
  138. package/package.json +1 -1
  139. package/scripts/topo-discrete-zoom-smooth-test.mjs +125 -0
  140. package/scripts/topo-layout-switch-crossfade-test.mjs +126 -0
  141. /package/.next/static/{5D9ZP7oWmL5NQe1UryHlb → PDsu7ujenvS5Nt2NcgKn9}/_buildManifest.js +0 -0
  142. /package/.next/static/{5D9ZP7oWmL5NQe1UryHlb → PDsu7ujenvS5Nt2NcgKn9}/_clientMiddlewareManifest.js +0 -0
  143. /package/.next/static/{5D9ZP7oWmL5NQe1UryHlb → PDsu7ujenvS5Nt2NcgKn9}/_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.175"],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.177"],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":274,"timestamp":63968093111,"id":4,"parentId":1,"tags":{},"startTime":1778871940339,"traceId":"8680eb7153e90972"},{"name":"load-custom-routes","duration":495,"timestamp":63968093538,"id":5,"parentId":1,"tags":{},"startTime":1778871940340,"traceId":"8680eb7153e90972"},{"name":"create-dist-dir","duration":647,"timestamp":63968094077,"id":6,"parentId":1,"tags":{},"startTime":1778871940340,"traceId":"8680eb7153e90972"},{"name":"clean","duration":482,"timestamp":63968095383,"id":7,"parentId":1,"tags":{},"startTime":1778871940342,"traceId":"8680eb7153e90972"},{"name":"discover-routes","duration":9004,"timestamp":63968177533,"id":8,"parentId":1,"tags":{},"startTime":1778871940424,"traceId":"8680eb7153e90972"},{"name":"create-root-mapping","duration":197,"timestamp":63968186593,"id":9,"parentId":1,"tags":{},"startTime":1778871940433,"traceId":"8680eb7153e90972"},{"name":"generate-route-types","duration":29824,"timestamp":63968188962,"id":10,"parentId":1,"tags":{},"startTime":1778871940435,"traceId":"8680eb7153e90972"},{"name":"public-dir-conflict-check","duration":115,"timestamp":63968218929,"id":11,"parentId":1,"tags":{},"startTime":1778871940465,"traceId":"8680eb7153e90972"},{"name":"generate-routes-manifest","duration":4034,"timestamp":63968219163,"id":12,"parentId":1,"tags":{},"startTime":1778871940465,"traceId":"8680eb7153e90972"},{"name":"run-turbopack","duration":5267884,"timestamp":63968229168,"id":14,"parentId":1,"tags":{},"startTime":1778871940475,"traceId":"8680eb7153e90972"},{"name":"turbopack-build-events","duration":70,"timestamp":63968502392,"id":15,"parentId":1,"tags":{},"startTime":1778871940749,"traceId":"8680eb7153e90972"},{"name":"run-typescript","duration":8552049,"timestamp":63973506194,"id":16,"parentId":1,"tags":{},"startTime":1778871945752,"traceId":"8680eb7153e90972"},{"name":"generate-required-server-files","duration":2317,"timestamp":63982059560,"id":18,"parentId":1,"tags":{},"startTime":1778871954306,"traceId":"8680eb7153e90972"},{"name":"check-static-error-page","duration":14474,"timestamp":63982216904,"id":20,"parentId":19,"tags":{},"startTime":1778871954463,"traceId":"8680eb7153e90972"},{"name":"is-page-static","duration":435957,"timestamp":63982234318,"id":63,"parentId":22,"tags":{},"startTime":1778871954481,"traceId":"8680eb7153e90972"},{"name":"check-page","duration":450369,"timestamp":63982220051,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1778871954466,"traceId":"8680eb7153e90972"},{"name":"is-page-static","duration":516801,"timestamp":63982234550,"id":65,"parentId":26,"tags":{},"startTime":1778871954481,"traceId":"8680eb7153e90972"},{"name":"check-page","duration":528189,"timestamp":63982223274,"id":26,"parentId":19,"tags":{"page":"/api/auth/logout"},"startTime":1778871954470,"traceId":"8680eb7153e90972"},{"name":"is-page-static","duration":515414,"timestamp":63982236274,"id":68,"parentId":29,"tags":{},"startTime":1778871954483,"traceId":"8680eb7153e90972"},{"name":"check-page","duration":528096,"timestamp":63982223639,"id":29,"parentId":19,"tags":{"page":"/api/hub/auth"},"startTime":1778871954470,"traceId":"8680eb7153e90972"},{"name":"is-page-static","duration":525888,"timestamp":63982234439,"id":64,"parentId":25,"tags":{},"startTime":1778871954481,"traceId":"8680eb7153e90972"},{"name":"check-page","duration":537286,"timestamp":63982223099,"id":25,"parentId":19,"tags":{"page":"/api/auth/login"},"startTime":1778871954469,"traceId":"8680eb7153e90972"},{"name":"is-page-static","duration":532254,"timestamp":63982233911,"id":62,"parentId":21,"tags":{},"startTime":1778871954480,"traceId":"8680eb7153e90972"},{"name":"check-page","duration":547746,"timestamp":63982218475,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1778871954465,"traceId":"8680eb7153e90972"},{"name":"is-page-static","duration":539347,"timestamp":63982236092,"id":67,"parentId":28,"tags":{},"startTime":1778871954482,"traceId":"8680eb7153e90972"},{"name":"check-page","duration":551966,"timestamp":63982223528,"id":28,"parentId":19,"tags":{"page":"/api/hub/audit-log"},"startTime":1778871954470,"traceId":"8680eb7153e90972"},{"name":"is-page-static","duration":542843,"timestamp":63982236603,"id":70,"parentId":32,"tags":{},"startTime":1778871954483,"traceId":"8680eb7153e90972"},{"name":"check-page","duration":555338,"timestamp":63982224161,"id":32,"parentId":19,"tags":{"page":"/api/hub/health"},"startTime":1778871954470,"traceId":"8680eb7153e90972"},{"name":"is-page-static","duration":544751,"timestamp":63982236769,"id":72,"parentId":34,"tags":{},"startTime":1778871954483,"traceId":"8680eb7153e90972"},{"name":"check-page","duration":557176,"timestamp":63982224386,"id":34,"parentId":19,"tags":{"page":"/api/hub/license"},"startTime":1778871954471,"traceId":"8680eb7153e90972"},{"name":"is-page-static","duration":545455,"timestamp":63982236676,"id":71,"parentId":33,"tags":{},"startTime":1778871954483,"traceId":"8680eb7153e90972"},{"name":"check-page","duration":557896,"timestamp":63982224281,"id":33,"parentId":19,"tags":{"page":"/api/hub/inbox"},"startTime":1778871954471,"traceId":"8680eb7153e90972"},{"name":"is-page-static","duration":550782,"timestamp":63982236984,"id":76,"parentId":38,"tags":{},"startTime":1778871954483,"traceId":"8680eb7153e90972"},{"name":"check-page","duration":562441,"timestamp":63982225366,"id":38,"parentId":19,"tags":{"page":"/api/hub/register"},"startTime":1778871954472,"traceId":"8680eb7153e90972"},{"name":"is-page-static","duration":558701,"timestamp":63982236969,"id":75,"parentId":37,"tags":{},"startTime":1778871954483,"traceId":"8680eb7153e90972"},{"name":"check-page","duration":570489,"timestamp":63982225229,"id":37,"parentId":19,"tags":{"page":"/api/hub/nodes"},"startTime":1778871954472,"traceId":"8680eb7153e90972"},{"name":"is-page-static","duration":561845,"timestamp":63982236998,"id":77,"parentId":39,"tags":{},"startTime":1778871954483,"traceId":"8680eb7153e90972"},{"name":"check-page","duration":573424,"timestamp":63982225464,"id":39,"parentId":19,"tags":{"page":"/api/hub/send"},"startTime":1778871954472,"traceId":"8680eb7153e90972"},{"name":"is-page-static","duration":563126,"timestamp":63982237040,"id":79,"parentId":41,"tags":{},"startTime":1778871954483,"traceId":"8680eb7153e90972"},{"name":"check-page","duration":574565,"timestamp":63982225649,"id":41,"parentId":19,"tags":{"page":"/api/hub/servers"},"startTime":1778871954472,"traceId":"8680eb7153e90972"},{"name":"is-page-static","duration":570976,"timestamp":63982236931,"id":74,"parentId":36,"tags":{},"startTime":1778871954483,"traceId":"8680eb7153e90972"},{"name":"check-page","duration":582922,"timestamp":63982225031,"id":36,"parentId":19,"tags":{"page":"/api/hub/networks"},"startTime":1778871954471,"traceId":"8680eb7153e90972"},{"name":"is-page-static","duration":571064,"timestamp":63982237054,"id":80,"parentId":42,"tags":{},"startTime":1778871954483,"traceId":"8680eb7153e90972"},{"name":"check-page","duration":582371,"timestamp":63982225780,"id":42,"parentId":19,"tags":{"page":"/api/hub/session"},"startTime":1778871954472,"traceId":"8680eb7153e90972"},{"name":"is-page-static","duration":571234,"timestamp":63982237030,"id":78,"parentId":40,"tags":{},"startTime":1778871954483,"traceId":"8680eb7153e90972"},{"name":"check-page","duration":582733,"timestamp":63982225558,"id":40,"parentId":19,"tags":{"page":"/api/hub/server-logs"},"startTime":1778871954472,"traceId":"8680eb7153e90972"},{"name":"is-page-static","duration":571430,"timestamp":63982237067,"id":81,"parentId":43,"tags":{},"startTime":1778871954483,"traceId":"8680eb7153e90972"},{"name":"check-page","duration":582647,"timestamp":63982225893,"id":43,"parentId":19,"tags":{"page":"/api/hub/stats"},"startTime":1778871954472,"traceId":"8680eb7153e90972"},{"name":"is-page-static","duration":576844,"timestamp":63982237087,"id":83,"parentId":45,"tags":{},"startTime":1778871954483,"traceId":"8680eb7153e90972"},{"name":"check-page","duration":587873,"timestamp":63982226111,"id":45,"parentId":19,"tags":{"page":"/api/hub/task-events"},"startTime":1778871954472,"traceId":"8680eb7153e90972"},{"name":"is-page-static","duration":577073,"timestamp":63982237099,"id":84,"parentId":46,"tags":{},"startTime":1778871954483,"traceId":"8680eb7153e90972"},{"name":"check-page","duration":588010,"timestamp":63982226204,"id":46,"parentId":19,"tags":{"page":"/api/hub/tasks"},"startTime":1778871954472,"traceId":"8680eb7153e90972"},{"name":"is-page-static","duration":580286,"timestamp":63982236424,"id":69,"parentId":30,"tags":{},"startTime":1778871954483,"traceId":"8680eb7153e90972"},{"name":"check-page","duration":592982,"timestamp":63982223786,"id":30,"parentId":19,"tags":{"page":"/api/hub/broadcast"},"startTime":1778871954470,"traceId":"8680eb7153e90972"},{"name":"is-page-static","duration":581122,"timestamp":63982237135,"id":87,"parentId":49,"tags":{},"startTime":1778871954483,"traceId":"8680eb7153e90972"},{"name":"check-page","duration":590325,"timestamp":63982227976,"id":49,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1778871954474,"traceId":"8680eb7153e90972"},{"name":"is-page-static","duration":582862,"timestamp":63982237122,"id":86,"parentId":48,"tags":{},"startTime":1778871954483,"traceId":"8680eb7153e90972"},{"name":"check-page","duration":592193,"timestamp":63982227847,"id":48,"parentId":19,"tags":{"page":"/api/hub/tokens"},"startTime":1778871954474,"traceId":"8680eb7153e90972"},{"name":"is-page-static","duration":583216,"timestamp":63982237112,"id":85,"parentId":47,"tags":{},"startTime":1778871954483,"traceId":"8680eb7153e90972"},{"name":"check-page","duration":594187,"timestamp":63982226326,"id":47,"parentId":19,"tags":{"page":"/api/hub/tmux"},"startTime":1778871954473,"traceId":"8680eb7153e90972"},{"name":"is-page-static","duration":582311,"timestamp":63982240546,"id":88,"parentId":24,"tags":{},"startTime":1778871954487,"traceId":"8680eb7153e90972"},{"name":"check-page","duration":602347,"timestamp":63982220551,"id":24,"parentId":19,"tags":{"page":"/api/anet/config"},"startTime":1778871954467,"traceId":"8680eb7153e90972"},{"name":"is-page-static","duration":584810,"timestamp":63982241674,"id":89,"parentId":31,"tags":{},"startTime":1778871954488,"traceId":"8680eb7153e90972"},{"name":"check-page","duration":602619,"timestamp":63982223903,"id":31,"parentId":19,"tags":{"page":"/api/hub/events"},"startTime":1778871954470,"traceId":"8680eb7153e90972"},{"name":"is-page-static","duration":595896,"timestamp":63982235742,"id":66,"parentId":27,"tags":{},"startTime":1778871954482,"traceId":"8680eb7153e90972"},{"name":"check-page","duration":608280,"timestamp":63982223400,"id":27,"parentId":19,"tags":{"page":"/api/auth/v3"},"startTime":1778871954470,"traceId":"8680eb7153e90972"},{"name":"is-page-static","duration":597572,"timestamp":63982237079,"id":82,"parentId":44,"tags":{},"startTime":1778871954483,"traceId":"8680eb7153e90972"},{"name":"check-page","duration":608712,"timestamp":63982225983,"id":44,"parentId":19,"tags":{"page":"/api/hub/status"},"startTime":1778871954472,"traceId":"8680eb7153e90972"},{"name":"is-page-static","duration":606790,"timestamp":63982236806,"id":73,"parentId":35,"tags":{},"startTime":1778871954483,"traceId":"8680eb7153e90972"},{"name":"check-page","duration":619105,"timestamp":63982224530,"id":35,"parentId":19,"tags":{"page":"/api/hub/messages"},"startTime":1778871954471,"traceId":"8680eb7153e90972"},{"name":"is-page-static","duration":604007,"timestamp":63982248126,"id":96,"parentId":56,"tags":{},"startTime":1778871954494,"traceId":"8680eb7153e90972"},{"name":"check-page","duration":622142,"timestamp":63982230033,"id":56,"parentId":19,"tags":{"page":"/server-logs"},"startTime":1778871954476,"traceId":"8680eb7153e90972"},{"name":"is-page-static","duration":610593,"timestamp":63982248135,"id":97,"parentId":57,"tags":{},"startTime":1778871954494,"traceId":"8680eb7153e90972"},{"name":"check-page","duration":628541,"timestamp":63982230242,"id":57,"parentId":19,"tags":{"page":"/settings/networks"},"startTime":1778871954477,"traceId":"8680eb7153e90972"},{"name":"is-page-static","duration":621915,"timestamp":63982248148,"id":98,"parentId":59,"tags":{},"startTime":1778871954494,"traceId":"8680eb7153e90972"},{"name":"check-page","duration":639270,"timestamp":63982230839,"id":59,"parentId":19,"tags":{"page":"/settings/tokens"},"startTime":1778871954477,"traceId":"8680eb7153e90972"},{"name":"is-page-static","duration":630170,"timestamp":63982248025,"id":90,"parentId":23,"tags":{},"startTime":1778871954494,"traceId":"8680eb7153e90972"},{"name":"check-page","duration":657924,"timestamp":63982220315,"id":23,"parentId":19,"tags":{"page":"/admin"},"startTime":1778871954467,"traceId":"8680eb7153e90972"},{"name":"is-page-static","duration":631006,"timestamp":63982248164,"id":99,"parentId":60,"tags":{},"startTime":1778871954494,"traceId":"8680eb7153e90972"},{"name":"check-page","duration":648265,"timestamp":63982230979,"id":60,"parentId":19,"tags":{"page":"/tasks/[id]"},"startTime":1778871954477,"traceId":"8680eb7153e90972"},{"name":"is-page-static","duration":634730,"timestamp":63982248073,"id":92,"parentId":51,"tags":{},"startTime":1778871954494,"traceId":"8680eb7153e90972"},{"name":"check-page","duration":654263,"timestamp":63982228593,"id":51,"parentId":19,"tags":{"page":"/logs"},"startTime":1778871954475,"traceId":"8680eb7153e90972"},{"name":"is-page-static","duration":636843,"timestamp":63982248090,"id":93,"parentId":52,"tags":{},"startTime":1778871954494,"traceId":"8680eb7153e90972"},{"name":"check-page","duration":656200,"timestamp":63982228780,"id":52,"parentId":19,"tags":{"page":"/messages"},"startTime":1778871954475,"traceId":"8680eb7153e90972"},{"name":"is-page-static","duration":636901,"timestamp":63982248180,"id":100,"parentId":61,"tags":{},"startTime":1778871954494,"traceId":"8680eb7153e90972"},{"name":"check-page","duration":653973,"timestamp":63982231135,"id":61,"parentId":19,"tags":{"page":"/tasks"},"startTime":1778871954477,"traceId":"8680eb7153e90972"},{"name":"is-page-static","duration":623053,"timestamp":63982262981,"id":101,"parentId":55,"tags":{},"startTime":1778871954509,"traceId":"8680eb7153e90972"},{"name":"check-page","duration":656626,"timestamp":63982229448,"id":55,"parentId":19,"tags":{"page":"/"},"startTime":1778871954476,"traceId":"8680eb7153e90972"},{"name":"is-page-static","duration":638992,"timestamp":63982248057,"id":91,"parentId":50,"tags":{},"startTime":1778871954494,"traceId":"8680eb7153e90972"},{"name":"check-page","duration":658669,"timestamp":63982228428,"id":50,"parentId":19,"tags":{"page":"/login"},"startTime":1778871954475,"traceId":"8680eb7153e90972"},{"name":"is-page-static","duration":615765,"timestamp":63982273555,"id":102,"parentId":58,"tags":{},"startTime":1778871954520,"traceId":"8680eb7153e90972"},{"name":"check-page","duration":658931,"timestamp":63982230418,"id":58,"parentId":19,"tags":{"page":"/settings"},"startTime":1778871954477,"traceId":"8680eb7153e90972"},{"name":"is-page-static","duration":653066,"timestamp":63982248113,"id":95,"parentId":54,"tags":{},"startTime":1778871954494,"traceId":"8680eb7153e90972"},{"name":"check-page","duration":672001,"timestamp":63982229207,"id":54,"parentId":19,"tags":{"page":"/nodes"},"startTime":1778871954475,"traceId":"8680eb7153e90972"},{"name":"is-page-static","duration":666113,"timestamp":63982248099,"id":94,"parentId":53,"tags":{},"startTime":1778871954494,"traceId":"8680eb7153e90972"},{"name":"check-page","duration":685264,"timestamp":63982228985,"id":53,"parentId":19,"tags":{"page":"/node"},"startTime":1778871954475,"traceId":"8680eb7153e90972"},{"name":"static-check","duration":698525,"timestamp":63982215765,"id":19,"parentId":1,"tags":{},"startTime":1778871954462,"traceId":"8680eb7153e90972"},{"name":"write-routes-manifest","duration":419,"timestamp":63982922219,"id":104,"parentId":1,"tags":{},"startTime":1778871955168,"traceId":"8680eb7153e90972"},{"name":"load-dotenv","duration":47,"timestamp":63982933766,"id":107,"parentId":106,"tags":{},"startTime":1778871955180,"traceId":"8680eb7153e90972"},{"name":"run-export-path-map","duration":688,"timestamp":63982936522,"id":108,"parentId":106,"tags":{},"startTime":1778871955183,"traceId":"8680eb7153e90972"},{"name":"next-export","duration":550553,"timestamp":63982932536,"id":106,"parentId":1,"tags":{},"startTime":1778871955179,"traceId":"8680eb7153e90972"}]
2
- [{"name":"move-exported-app-not-found-","duration":2354,"timestamp":63983486966,"id":109,"parentId":105,"tags":{},"startTime":1778871955733,"traceId":"8680eb7153e90972"},{"name":"move-exported-app-global-error-","duration":567,"timestamp":63983489426,"id":110,"parentId":105,"tags":{},"startTime":1778871955736,"traceId":"8680eb7153e90972"},{"name":"static-generation","duration":565197,"timestamp":63982926668,"id":105,"parentId":1,"tags":{},"startTime":1778871955173,"traceId":"8680eb7153e90972"},{"name":"write-routes-manifest","duration":417,"timestamp":63983492067,"id":111,"parentId":1,"tags":{},"startTime":1778871955738,"traceId":"8680eb7153e90972"},{"name":"print-tree-view","duration":3387,"timestamp":63983511074,"id":112,"parentId":1,"tags":{},"startTime":1778871955757,"traceId":"8680eb7153e90972"},{"name":"write-route-bundle-stats","duration":12464,"timestamp":63983514490,"id":113,"parentId":1,"tags":{},"startTime":1778871955761,"traceId":"8680eb7153e90972"},{"name":"telemetry-flush","duration":28975,"timestamp":63983526987,"id":114,"parentId":1,"tags":{},"startTime":1778871955773,"traceId":"8680eb7153e90972"},{"name":"next-build","duration":15512635,"timestamp":63968043362,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778871940290,"traceId":"8680eb7153e90972"}]
1
+ [{"name":"generate-buildid","duration":259,"timestamp":64575371547,"id":4,"parentId":1,"tags":{},"startTime":1778872547618,"traceId":"2f781dc581049cad"},{"name":"load-custom-routes","duration":492,"timestamp":64575371944,"id":5,"parentId":1,"tags":{},"startTime":1778872547618,"traceId":"2f781dc581049cad"},{"name":"create-dist-dir","duration":627,"timestamp":64575372480,"id":6,"parentId":1,"tags":{},"startTime":1778872547619,"traceId":"2f781dc581049cad"},{"name":"clean","duration":494,"timestamp":64575373727,"id":7,"parentId":1,"tags":{},"startTime":1778872547620,"traceId":"2f781dc581049cad"},{"name":"discover-routes","duration":9768,"timestamp":64575452761,"id":8,"parentId":1,"tags":{},"startTime":1778872547699,"traceId":"2f781dc581049cad"},{"name":"create-root-mapping","duration":121,"timestamp":64575462587,"id":9,"parentId":1,"tags":{},"startTime":1778872547709,"traceId":"2f781dc581049cad"},{"name":"generate-route-types","duration":39298,"timestamp":64575464936,"id":10,"parentId":1,"tags":{},"startTime":1778872547711,"traceId":"2f781dc581049cad"},{"name":"public-dir-conflict-check","duration":99,"timestamp":64575504390,"id":11,"parentId":1,"tags":{},"startTime":1778872547751,"traceId":"2f781dc581049cad"},{"name":"generate-routes-manifest","duration":4076,"timestamp":64575504598,"id":12,"parentId":1,"tags":{},"startTime":1778872547751,"traceId":"2f781dc581049cad"},{"name":"run-turbopack","duration":5281848,"timestamp":64575513557,"id":14,"parentId":1,"tags":{},"startTime":1778872547760,"traceId":"2f781dc581049cad"},{"name":"turbopack-build-events","duration":112,"timestamp":64575780915,"id":15,"parentId":1,"tags":{},"startTime":1778872548027,"traceId":"2f781dc581049cad"},{"name":"run-typescript","duration":8685209,"timestamp":64580814509,"id":16,"parentId":1,"tags":{},"startTime":1778872553061,"traceId":"2f781dc581049cad"},{"name":"generate-required-server-files","duration":2425,"timestamp":64589500919,"id":18,"parentId":1,"tags":{},"startTime":1778872561747,"traceId":"2f781dc581049cad"},{"name":"check-static-error-page","duration":15426,"timestamp":64589677488,"id":20,"parentId":19,"tags":{},"startTime":1778872561924,"traceId":"2f781dc581049cad"},{"name":"is-page-static","duration":465088,"timestamp":64589697207,"id":63,"parentId":22,"tags":{},"startTime":1778872561943,"traceId":"2f781dc581049cad"},{"name":"check-page","duration":481762,"timestamp":64589680690,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1778872561927,"traceId":"2f781dc581049cad"},{"name":"is-page-static","duration":536718,"timestamp":64589697976,"id":68,"parentId":29,"tags":{},"startTime":1778872561944,"traceId":"2f781dc581049cad"},{"name":"check-page","duration":550285,"timestamp":64589684525,"id":29,"parentId":19,"tags":{"page":"/api/hub/auth"},"startTime":1778872561931,"traceId":"2f781dc581049cad"},{"name":"is-page-static","duration":545771,"timestamp":64589698279,"id":70,"parentId":32,"tags":{},"startTime":1778872561945,"traceId":"2f781dc581049cad"},{"name":"check-page","duration":559076,"timestamp":64589685058,"id":32,"parentId":19,"tags":{"page":"/api/hub/health"},"startTime":1778872561931,"traceId":"2f781dc581049cad"},{"name":"is-page-static","duration":575477,"timestamp":64589697821,"id":67,"parentId":28,"tags":{},"startTime":1778872561944,"traceId":"2f781dc581049cad"},{"name":"check-page","duration":588979,"timestamp":64589684404,"id":28,"parentId":19,"tags":{"page":"/api/hub/audit-log"},"startTime":1778872561931,"traceId":"2f781dc581049cad"},{"name":"is-page-static","duration":581944,"timestamp":64589698425,"id":72,"parentId":34,"tags":{},"startTime":1778872561945,"traceId":"2f781dc581049cad"},{"name":"check-page","duration":595164,"timestamp":64589685290,"id":34,"parentId":19,"tags":{"page":"/api/hub/license"},"startTime":1778872561932,"traceId":"2f781dc581049cad"},{"name":"is-page-static","duration":583977,"timestamp":64589698349,"id":71,"parentId":33,"tags":{},"startTime":1778872561945,"traceId":"2f781dc581049cad"},{"name":"check-page","duration":597218,"timestamp":64589685181,"id":33,"parentId":19,"tags":{"page":"/api/hub/inbox"},"startTime":1778872561931,"traceId":"2f781dc581049cad"},{"name":"is-page-static","duration":606636,"timestamp":64589696778,"id":62,"parentId":21,"tags":{},"startTime":1778872561943,"traceId":"2f781dc581049cad"},{"name":"check-page","duration":624386,"timestamp":64589679105,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1778872561925,"traceId":"2f781dc581049cad"},{"name":"is-page-static","duration":605537,"timestamp":64589698564,"id":74,"parentId":36,"tags":{},"startTime":1778872561945,"traceId":"2f781dc581049cad"},{"name":"check-page","duration":618290,"timestamp":64589685887,"id":36,"parentId":19,"tags":{"page":"/api/hub/networks"},"startTime":1778872561932,"traceId":"2f781dc581049cad"},{"name":"is-page-static","duration":609847,"timestamp":64589698452,"id":73,"parentId":35,"tags":{},"startTime":1778872561945,"traceId":"2f781dc581049cad"},{"name":"check-page","duration":622964,"timestamp":64589685398,"id":35,"parentId":19,"tags":{"page":"/api/hub/messages"},"startTime":1778872561932,"traceId":"2f781dc581049cad"},{"name":"is-page-static","duration":610936,"timestamp":64589698609,"id":76,"parentId":38,"tags":{},"startTime":1778872561945,"traceId":"2f781dc581049cad"},{"name":"check-page","duration":623327,"timestamp":64589686261,"id":38,"parentId":19,"tags":{"page":"/api/hub/register"},"startTime":1778872561933,"traceId":"2f781dc581049cad"},{"name":"is-page-static","duration":617201,"timestamp":64589698636,"id":78,"parentId":40,"tags":{},"startTime":1778872561945,"traceId":"2f781dc581049cad"},{"name":"check-page","duration":629426,"timestamp":64589686459,"id":40,"parentId":19,"tags":{"page":"/api/hub/server-logs"},"startTime":1778872561933,"traceId":"2f781dc581049cad"},{"name":"is-page-static","duration":620086,"timestamp":64589697340,"id":64,"parentId":25,"tags":{},"startTime":1778872561944,"traceId":"2f781dc581049cad"},{"name":"check-page","duration":633527,"timestamp":64589683944,"id":25,"parentId":19,"tags":{"page":"/api/auth/login"},"startTime":1778872561930,"traceId":"2f781dc581049cad"},{"name":"is-page-static","duration":619696,"timestamp":64589698118,"id":69,"parentId":30,"tags":{},"startTime":1778872561944,"traceId":"2f781dc581049cad"},{"name":"check-page","duration":633193,"timestamp":64589684665,"id":30,"parentId":19,"tags":{"page":"/api/hub/broadcast"},"startTime":1778872561931,"traceId":"2f781dc581049cad"},{"name":"is-page-static","duration":622779,"timestamp":64589698622,"id":77,"parentId":39,"tags":{},"startTime":1778872561945,"traceId":"2f781dc581049cad"},{"name":"check-page","duration":635083,"timestamp":64589686364,"id":39,"parentId":19,"tags":{"page":"/api/hub/send"},"startTime":1778872561933,"traceId":"2f781dc581049cad"},{"name":"is-page-static","duration":622991,"timestamp":64589698649,"id":79,"parentId":41,"tags":{},"startTime":1778872561945,"traceId":"2f781dc581049cad"},{"name":"check-page","duration":635133,"timestamp":64589686552,"id":41,"parentId":19,"tags":{"page":"/api/hub/servers"},"startTime":1778872561933,"traceId":"2f781dc581049cad"},{"name":"is-page-static","duration":627449,"timestamp":64589698696,"id":83,"parentId":45,"tags":{},"startTime":1778872561945,"traceId":"2f781dc581049cad"},{"name":"check-page","duration":637106,"timestamp":64589689090,"id":45,"parentId":19,"tags":{"page":"/api/hub/task-events"},"startTime":1778872561935,"traceId":"2f781dc581049cad"},{"name":"is-page-static","duration":632147,"timestamp":64589698673,"id":81,"parentId":43,"tags":{},"startTime":1778872561945,"traceId":"2f781dc581049cad"},{"name":"check-page","duration":644107,"timestamp":64589686778,"id":43,"parentId":19,"tags":{"page":"/api/hub/stats"},"startTime":1778872561933,"traceId":"2f781dc581049cad"},{"name":"is-page-static","duration":632578,"timestamp":64589698709,"id":84,"parentId":46,"tags":{},"startTime":1778872561945,"traceId":"2f781dc581049cad"},{"name":"check-page","duration":642117,"timestamp":64589689229,"id":46,"parentId":19,"tags":{"page":"/api/hub/tasks"},"startTime":1778872561936,"traceId":"2f781dc581049cad"},{"name":"is-page-static","duration":637451,"timestamp":64589698735,"id":86,"parentId":48,"tags":{},"startTime":1778872561945,"traceId":"2f781dc581049cad"},{"name":"check-page","duration":646755,"timestamp":64589689482,"id":48,"parentId":19,"tags":{"page":"/api/hub/tokens"},"startTime":1778872561936,"traceId":"2f781dc581049cad"},{"name":"is-page-static","duration":639840,"timestamp":64589698659,"id":80,"parentId":42,"tags":{},"startTime":1778872561945,"traceId":"2f781dc581049cad"},{"name":"check-page","duration":651881,"timestamp":64589686659,"id":42,"parentId":19,"tags":{"page":"/api/hub/session"},"startTime":1778872561933,"traceId":"2f781dc581049cad"},{"name":"is-page-static","duration":648519,"timestamp":64589698745,"id":87,"parentId":49,"tags":{},"startTime":1778872561945,"traceId":"2f781dc581049cad"},{"name":"check-page","duration":657753,"timestamp":64589689573,"id":49,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1778872561936,"traceId":"2f781dc581049cad"},{"name":"is-page-static","duration":648813,"timestamp":64589698687,"id":82,"parentId":44,"tags":{},"startTime":1778872561945,"traceId":"2f781dc581049cad"},{"name":"check-page","duration":660650,"timestamp":64589686885,"id":44,"parentId":19,"tags":{"page":"/api/hub/status"},"startTime":1778872561933,"traceId":"2f781dc581049cad"},{"name":"is-page-static","duration":639946,"timestamp":64589713219,"id":89,"parentId":31,"tags":{},"startTime":1778872561959,"traceId":"2f781dc581049cad"},{"name":"check-page","duration":668459,"timestamp":64589684782,"id":31,"parentId":19,"tags":{"page":"/api/hub/events"},"startTime":1778872561931,"traceId":"2f781dc581049cad"},{"name":"is-page-static","duration":657829,"timestamp":64589698722,"id":85,"parentId":47,"tags":{},"startTime":1778872561945,"traceId":"2f781dc581049cad"},{"name":"check-page","duration":667230,"timestamp":64589689368,"id":47,"parentId":19,"tags":{"page":"/api/hub/tmux"},"startTime":1778872561936,"traceId":"2f781dc581049cad"},{"name":"is-page-static","duration":667690,"timestamp":64589697562,"id":66,"parentId":27,"tags":{},"startTime":1778872561944,"traceId":"2f781dc581049cad"},{"name":"check-page","duration":681029,"timestamp":64589684276,"id":27,"parentId":19,"tags":{"page":"/api/auth/v3"},"startTime":1778872561931,"traceId":"2f781dc581049cad"},{"name":"is-page-static","duration":656497,"timestamp":64589708938,"id":88,"parentId":24,"tags":{},"startTime":1778872561955,"traceId":"2f781dc581049cad"},{"name":"check-page","duration":684224,"timestamp":64589681239,"id":24,"parentId":19,"tags":{"page":"/api/anet/config"},"startTime":1778872561928,"traceId":"2f781dc581049cad"},{"name":"is-page-static","duration":677803,"timestamp":64589697457,"id":65,"parentId":26,"tags":{},"startTime":1778872561944,"traceId":"2f781dc581049cad"},{"name":"check-page","duration":691156,"timestamp":64589684153,"id":26,"parentId":19,"tags":{"page":"/api/auth/logout"},"startTime":1778872561930,"traceId":"2f781dc581049cad"},{"name":"is-page-static","duration":694197,"timestamp":64589698596,"id":75,"parentId":37,"tags":{},"startTime":1778872561945,"traceId":"2f781dc581049cad"},{"name":"check-page","duration":706750,"timestamp":64589686109,"id":37,"parentId":19,"tags":{"page":"/api/hub/nodes"},"startTime":1778872561932,"traceId":"2f781dc581049cad"},{"name":"is-page-static","duration":687999,"timestamp":64589718129,"id":96,"parentId":56,"tags":{},"startTime":1778872561964,"traceId":"2f781dc581049cad"},{"name":"check-page","duration":714680,"timestamp":64589691546,"id":56,"parentId":19,"tags":{"page":"/server-logs"},"startTime":1778872561938,"traceId":"2f781dc581049cad"},{"name":"is-page-static","duration":711140,"timestamp":64589718023,"id":90,"parentId":23,"tags":{},"startTime":1778872561964,"traceId":"2f781dc581049cad"},{"name":"check-page","duration":748252,"timestamp":64589680983,"id":23,"parentId":19,"tags":{"page":"/admin"},"startTime":1778872561927,"traceId":"2f781dc581049cad"},{"name":"is-page-static","duration":714298,"timestamp":64589718143,"id":97,"parentId":57,"tags":{},"startTime":1778872561964,"traceId":"2f781dc581049cad"},{"name":"check-page","duration":740749,"timestamp":64589691752,"id":57,"parentId":19,"tags":{"page":"/settings/networks"},"startTime":1778872561938,"traceId":"2f781dc581049cad"},{"name":"is-page-static","duration":727323,"timestamp":64589718061,"id":91,"parentId":50,"tags":{},"startTime":1778872561964,"traceId":"2f781dc581049cad"},{"name":"check-page","duration":755481,"timestamp":64589689972,"id":50,"parentId":19,"tags":{"page":"/login"},"startTime":1778872561936,"traceId":"2f781dc581049cad"},{"name":"is-page-static","duration":729007,"timestamp":64589718175,"id":99,"parentId":60,"tags":{},"startTime":1778872561964,"traceId":"2f781dc581049cad"},{"name":"check-page","duration":754756,"timestamp":64589692517,"id":60,"parentId":19,"tags":{"page":"/tasks/[id]"},"startTime":1778872561939,"traceId":"2f781dc581049cad"},{"name":"is-page-static","duration":731613,"timestamp":64589718101,"id":94,"parentId":53,"tags":{},"startTime":1778872561964,"traceId":"2f781dc581049cad"},{"name":"check-page","duration":759261,"timestamp":64589690521,"id":53,"parentId":19,"tags":{"page":"/node"},"startTime":1778872561937,"traceId":"2f781dc581049cad"},{"name":"is-page-static","duration":733773,"timestamp":64589718153,"id":98,"parentId":59,"tags":{},"startTime":1778872561964,"traceId":"2f781dc581049cad"},{"name":"check-page","duration":759587,"timestamp":64589692382,"id":59,"parentId":19,"tags":{"page":"/settings/tokens"},"startTime":1778872561939,"traceId":"2f781dc581049cad"},{"name":"is-page-static","duration":736149,"timestamp":64589718194,"id":100,"parentId":61,"tags":{},"startTime":1778872561964,"traceId":"2f781dc581049cad"},{"name":"check-page","duration":761731,"timestamp":64589692656,"id":61,"parentId":19,"tags":{"page":"/tasks"},"startTime":1778872561939,"traceId":"2f781dc581049cad"},{"name":"is-page-static","duration":719840,"timestamp":64589735139,"id":101,"parentId":58,"tags":{},"startTime":1778872561981,"traceId":"2f781dc581049cad"},{"name":"check-page","duration":763083,"timestamp":64589691951,"id":58,"parentId":19,"tags":{"page":"/settings"},"startTime":1778872561938,"traceId":"2f781dc581049cad"},{"name":"is-page-static","duration":737764,"timestamp":64589718077,"id":92,"parentId":51,"tags":{},"startTime":1778872561964,"traceId":"2f781dc581049cad"},{"name":"check-page","duration":765730,"timestamp":64589690152,"id":51,"parentId":19,"tags":{"page":"/logs"},"startTime":1778872561936,"traceId":"2f781dc581049cad"},{"name":"is-page-static","duration":695085,"timestamp":64589762460,"id":102,"parentId":55,"tags":{},"startTime":1778872562009,"traceId":"2f781dc581049cad"},{"name":"check-page","duration":766613,"timestamp":64589690965,"id":55,"parentId":19,"tags":{"page":"/"},"startTime":1778872561937,"traceId":"2f781dc581049cad"},{"name":"is-page-static","duration":764941,"timestamp":64589718115,"id":95,"parentId":54,"tags":{},"startTime":1778872561964,"traceId":"2f781dc581049cad"},{"name":"check-page","duration":792400,"timestamp":64589690728,"id":54,"parentId":19,"tags":{"page":"/nodes"},"startTime":1778872561937,"traceId":"2f781dc581049cad"},{"name":"is-page-static","duration":766281,"timestamp":64589718092,"id":93,"parentId":52,"tags":{},"startTime":1778872561964,"traceId":"2f781dc581049cad"},{"name":"check-page","duration":794091,"timestamp":64589690319,"id":52,"parentId":19,"tags":{"page":"/messages"},"startTime":1778872561937,"traceId":"2f781dc581049cad"},{"name":"static-check","duration":808103,"timestamp":64589676340,"id":19,"parentId":1,"tags":{},"startTime":1778872561923,"traceId":"2f781dc581049cad"},{"name":"write-routes-manifest","duration":426,"timestamp":64590490834,"id":104,"parentId":1,"tags":{},"startTime":1778872562737,"traceId":"2f781dc581049cad"},{"name":"load-dotenv","duration":40,"timestamp":64590502570,"id":107,"parentId":106,"tags":{},"startTime":1778872562749,"traceId":"2f781dc581049cad"},{"name":"run-export-path-map","duration":612,"timestamp":64590505643,"id":108,"parentId":106,"tags":{},"startTime":1778872562752,"traceId":"2f781dc581049cad"},{"name":"next-export","duration":566356,"timestamp":64590501384,"id":106,"parentId":1,"tags":{},"startTime":1778872562748,"traceId":"2f781dc581049cad"}]
2
+ [{"name":"move-exported-app-not-found-","duration":2144,"timestamp":64591071655,"id":109,"parentId":105,"tags":{},"startTime":1778872563318,"traceId":"2f781dc581049cad"},{"name":"move-exported-app-global-error-","duration":565,"timestamp":64591073887,"id":110,"parentId":105,"tags":{},"startTime":1778872563320,"traceId":"2f781dc581049cad"},{"name":"static-generation","duration":581450,"timestamp":64590494980,"id":105,"parentId":1,"tags":{},"startTime":1778872562741,"traceId":"2f781dc581049cad"},{"name":"write-routes-manifest","duration":539,"timestamp":64591076691,"id":111,"parentId":1,"tags":{},"startTime":1778872563323,"traceId":"2f781dc581049cad"},{"name":"print-tree-view","duration":3896,"timestamp":64591091184,"id":112,"parentId":1,"tags":{},"startTime":1778872563337,"traceId":"2f781dc581049cad"},{"name":"write-route-bundle-stats","duration":13352,"timestamp":64591095112,"id":113,"parentId":1,"tags":{},"startTime":1778872563341,"traceId":"2f781dc581049cad"},{"name":"telemetry-flush","duration":24031,"timestamp":64591108499,"id":114,"parentId":1,"tags":{},"startTime":1778872563355,"traceId":"2f781dc581049cad"},{"name":"next-build","duration":15810703,"timestamp":64575321856,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778872547568,"traceId":"2f781dc581049cad"}]
package/.next/trace-build CHANGED
@@ -1 +1 @@
1
- [{"name":"run-turbopack","duration":5267884,"timestamp":63968229168,"id":14,"parentId":1,"tags":{},"startTime":1778871940475,"traceId":"8680eb7153e90972"},{"name":"turbopack-build-events","duration":70,"timestamp":63968502392,"id":15,"parentId":1,"tags":{},"startTime":1778871940749,"traceId":"8680eb7153e90972"},{"name":"run-typescript","duration":8552049,"timestamp":63973506194,"id":16,"parentId":1,"tags":{},"startTime":1778871945752,"traceId":"8680eb7153e90972"},{"name":"static-check","duration":698525,"timestamp":63982215765,"id":19,"parentId":1,"tags":{},"startTime":1778871954462,"traceId":"8680eb7153e90972"},{"name":"static-generation","duration":565197,"timestamp":63982926668,"id":105,"parentId":1,"tags":{},"startTime":1778871955173,"traceId":"8680eb7153e90972"},{"name":"telemetry-flush","duration":28975,"timestamp":63983526987,"id":114,"parentId":1,"tags":{},"startTime":1778871955773,"traceId":"8680eb7153e90972"},{"name":"next-build","duration":15512635,"timestamp":63968043362,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778871940290,"traceId":"8680eb7153e90972"}]
1
+ [{"name":"run-turbopack","duration":5281848,"timestamp":64575513557,"id":14,"parentId":1,"tags":{},"startTime":1778872547760,"traceId":"2f781dc581049cad"},{"name":"turbopack-build-events","duration":112,"timestamp":64575780915,"id":15,"parentId":1,"tags":{},"startTime":1778872548027,"traceId":"2f781dc581049cad"},{"name":"run-typescript","duration":8685209,"timestamp":64580814509,"id":16,"parentId":1,"tags":{},"startTime":1778872553061,"traceId":"2f781dc581049cad"},{"name":"static-check","duration":808103,"timestamp":64589676340,"id":19,"parentId":1,"tags":{},"startTime":1778872561923,"traceId":"2f781dc581049cad"},{"name":"static-generation","duration":581450,"timestamp":64590494980,"id":105,"parentId":1,"tags":{},"startTime":1778872562741,"traceId":"2f781dc581049cad"},{"name":"telemetry-flush","duration":24031,"timestamp":64591108499,"id":114,"parentId":1,"tags":{},"startTime":1778872563355,"traceId":"2f781dc581049cad"},{"name":"next-build","duration":15810703,"timestamp":64575321856,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778872547568,"traceId":"2f781dc581049cad"}]
@@ -444,11 +444,28 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
444
444
  if (saved === 'grid' || saved === 'ring') setLayout(saved);
445
445
  } catch {}
446
446
  }, []);
447
- const toggleLayout = () => setLayout(prev => {
448
- const next = prev === 'ring' ? 'grid' : 'ring';
449
- try { localStorage.setItem('anet-topo-layout', next); } catch {}
450
- return next;
451
- });
447
+ // Round 170 / Loop: layout toggle (Ring ↔ Grid) used to teleport
448
+ // every node from its old position to its new one in one paint
449
+ // frame — the most jarring single user action left on the
450
+ // canvas. Solution: dim the viewport <g> to ~45% opacity for
451
+ // the duration of the swap so the eye reads it as a soft
452
+ // crossfade-blink rather than a hard teleport. layoutSwitching
453
+ // is a one-shot flag; the inline style on the viewport <g>
454
+ // reads it and lerps opacity 1 → 0.45 → 1 across the swap.
455
+ // Auto-clears after 400ms (covers fade-down 250ms + buffer for
456
+ // React to commit the new layout's positions). Same pattern as
457
+ // R168's smoothView arming but on a different visual axis
458
+ // (opacity, not transform).
459
+ const [layoutSwitching, setLayoutSwitching] = useState(false);
460
+ const toggleLayout = () => {
461
+ setLayoutSwitching(true);
462
+ setTimeout(() => setLayoutSwitching(false), 400);
463
+ setLayout(prev => {
464
+ const next = prev === 'ring' ? 'grid' : 'ring';
465
+ try { localStorage.setItem('anet-topo-layout', next); } catch {}
466
+ return next;
467
+ });
468
+ };
452
469
  // Issue #113: node size scale (Vincent 4727 — nodes too big / crowded at
453
470
  // ~22 nodes). S/M/L → 0.7/0.84/1.0; default M (one notch down from the old
454
471
  // fixed size). Persisted like the layout toggle.
@@ -1180,6 +1197,19 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
1180
1197
  return { zoom: nz, x: cx0 - (cx0 - prev.x) * ratio, y: cy0 - (cy0 - prev.y) * ratio };
1181
1198
  });
1182
1199
  };
1200
+ // Round 169 / Loop: discrete-zoom wrapper that arms the R168
1201
+ // smoothView flag before invoking zoomBy. Keyboard + / − and
1202
+ // the chrome zoom buttons fire once per gesture, so each
1203
+ // 1.2× step deserves the same 300ms glide R168 gives
1204
+ // reset/fit. Wheel zoom keeps calling zoomBy() directly —
1205
+ // every tick should respond live without lag. The arming
1206
+ // path is identical to resetView/fitView so all four
1207
+ // discrete-zoom surfaces share one timing constant.
1208
+ const zoomByDiscrete = (factor: number) => {
1209
+ setSmoothView(true);
1210
+ setTimeout(() => setSmoothView(false), 350);
1211
+ zoomBy(factor);
1212
+ };
1183
1213
  // Round 168 / Loop: smoothView is a one-shot flag that arms a
1184
1214
  // CSS transition on the viewport <g> transform attribute. Set
1185
1215
  // true when resetView/fitView fires; the inline style on the
@@ -1255,8 +1285,8 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
1255
1285
  const tag = ae.tagName;
1256
1286
  if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT' || ae.isContentEditable) return;
1257
1287
  }
1258
- if (e.key === '+' || e.key === '=') { zoomBy(1.2); e.preventDefault(); }
1259
- else if (e.key === '-' || e.key === '_') { zoomBy(1 / 1.2); e.preventDefault(); }
1288
+ if (e.key === '+' || e.key === '=') { zoomByDiscrete(1.2); e.preventDefault(); }
1289
+ else if (e.key === '-' || e.key === '_') { zoomByDiscrete(1 / 1.2); e.preventDefault(); }
1260
1290
  else if (e.key === '0') { resetView(); e.preventDefault(); }
1261
1291
  else if (e.key === 'f' || e.key === 'F') { fitView(); e.preventDefault(); }
1262
1292
  // Round 32 / Loop: `l` toggles ring|grid. The vim-style `g l` route
@@ -2246,7 +2276,18 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
2246
2276
  transform={`translate(${view.x} ${view.y}) scale(${view.zoom})`}
2247
2277
  data-topo-viewport
2248
2278
  data-topo-viewport-smooth={smoothView ? 'true' : 'false'}
2249
- style={smoothView ? { transition: 'transform 300ms ease-out' } : undefined}
2279
+ data-topo-viewport-layout-switching={layoutSwitching ? 'true' : 'false'}
2280
+ style={{
2281
+ // R170 / Loop: opacity always carries a transition so the
2282
+ // layout-switch crossfade fires cleanly. R168 smoothView
2283
+ // transition on transform is added only when armed (pan
2284
+ // and wheel zoom MUST stay snappy). The two arming flags
2285
+ // compose without conflict — different visual axes.
2286
+ transition: smoothView
2287
+ ? 'opacity 250ms ease-out, transform 300ms ease-out'
2288
+ : 'opacity 250ms ease-out',
2289
+ opacity: layoutSwitching ? 0.45 : 1,
2290
+ }}
2250
2291
  >
2251
2292
  {/* Issue #87: radar/ring ambiance renders only in ring layout —
2252
2293
  grid mode drops it so the concentric rings don't sit behind a
@@ -4631,7 +4672,7 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
4631
4672
  style={{ background: pal.legendBox.fill, borderColor: pal.containerBorder }}
4632
4673
  >
4633
4674
  <button
4634
- onClick={() => zoomBy(1 / 1.2)}
4675
+ onClick={() => zoomByDiscrete(1 / 1.2)}
4635
4676
  data-topo-chrome-zoom-out
4636
4677
  className="px-2 py-1 hover:bg-white/5 transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-cyan-400/60 focus-visible:ring-inset"
4637
4678
  style={{ color: pal.legendText }}
@@ -4649,7 +4690,7 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
4649
4690
  {Math.round(view.zoom * 100)}%
4650
4691
  </span>
4651
4692
  <button
4652
- onClick={() => zoomBy(1.2)}
4693
+ onClick={() => zoomByDiscrete(1.2)}
4653
4694
  data-topo-chrome-zoom-in
4654
4695
  className="px-2 py-1 hover:bg-white/5 transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-cyan-400/60 focus-visible:ring-inset"
4655
4696
  style={{ color: pal.legendText }}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sleep2agi/agent-network-dashboard",
3
- "version": "0.4.6-preview.175",
3
+ "version": "0.4.6-preview.177",
4
4
  "description": "Agent Network Dashboard — Web UI for managing AI Agent networks",
5
5
  "scripts": {
6
6
  "dev": "next dev",
@@ -0,0 +1,125 @@
1
+ /* Round 169 verification: keyboard '+'/'−' and chrome zoom in/out
2
+ * buttons arm the R168 smoothView transition.
3
+ *
4
+ * R168 introduced one-shot smoothView arming on resetView/fitView.
5
+ * R169 extends the same arming to the three other DISCRETE zoom
6
+ * surfaces (one keypress / button-click = one 1.2× step):
7
+ * keyboard '+' / '=' / '−' / '_'
8
+ * chrome zoom-in / zoom-out buttons
9
+ *
10
+ * Wheel zoom stays direct (every tick = live, no transition lag).
11
+ * Wrapper:
12
+ * const zoomByDiscrete = (factor) => {
13
+ * setSmoothView(true);
14
+ * setTimeout(() => setSmoothView(false), 350);
15
+ * zoomBy(factor);
16
+ * };
17
+ *
18
+ * Test:
19
+ * 1. Idle: smooth=false, no transition
20
+ * 2. Press '+': smooth=true, transition 'transform 300ms ease-out'
21
+ * zoom 100% → 120%
22
+ * 3. Wait 450ms: smooth=false, transition cleared
23
+ * 4. Click chrome zoom-in button: smooth=true again (same path)
24
+ * 5. Press '−': smooth=true, zoom back toward 100%
25
+ */
26
+ import { chromium } from 'playwright';
27
+ import { readFileSync } from 'node:fs';
28
+
29
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
30
+ const browser = await chromium.launch({ headless: true });
31
+
32
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1500 } });
33
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
34
+ await ctx.addInitScript(() => {
35
+ try { localStorage.setItem('anet-theme', 'cyber'); sessionStorage.setItem('anet_v3_auth', '1'); } catch {}
36
+ });
37
+
38
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
39
+ await ctx.route('**/api/hub/status*', async (route) => {
40
+ const r = await route.fetch();
41
+ const b = await r.json();
42
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
43
+ const mk = (alias) => ({
44
+ alias, status: 'working', model: 'claude-opus-4', runtime: 'cli-claude-code',
45
+ network_id: nid, project_dir: null,
46
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
47
+ });
48
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('alpha'), mk('beta'), mk('gamma')] } });
49
+ });
50
+ await ctx.route('**/api/hub/messages*', (route) => route.fulfill({ json: { messages: [] } }));
51
+ await ctx.route('**/api/hub/tasks*', (route) => route.fulfill({ json: { tasks: [] } }));
52
+
53
+ const page = await ctx.newPage();
54
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
55
+ await page.waitForFunction(() => document.querySelectorAll('g[data-node]').length === 3, { timeout: 30000 });
56
+ await page.waitForSelector('[data-topo-viewport]', { timeout: 10000 });
57
+ await page.waitForTimeout(400);
58
+
59
+ const probeViewport = () => page.evaluate(() => {
60
+ const g = document.querySelector('[data-topo-viewport]');
61
+ return {
62
+ smooth: g?.getAttribute('data-topo-viewport-smooth'),
63
+ transition: g?.style?.transition || '',
64
+ };
65
+ });
66
+ const probeZoom = () => page.evaluate(() =>
67
+ document.querySelector('[data-topo-chrome-zoom-level]')?.textContent?.trim());
68
+
69
+ const idle = await probeViewport();
70
+ const zoomIdle = await probeZoom();
71
+
72
+ // Press '+' → keyboard zoom-in. Probe within the 350ms window.
73
+ await page.keyboard.press('+');
74
+ await page.waitForTimeout(50);
75
+ const duringKbZoomIn = await probeViewport();
76
+ const zoomAfterKb = await probeZoom();
77
+
78
+ // Wait past the 350ms window
79
+ await page.waitForTimeout(450);
80
+ const afterKbZoomIn = await probeViewport();
81
+
82
+ // Click chrome zoom-in button → same arming path
83
+ await page.locator('[data-topo-chrome-zoom-in]').click();
84
+ await page.waitForTimeout(50);
85
+ const duringChromeZoomIn = await probeViewport();
86
+ const zoomAfterChromeIn = await probeZoom();
87
+
88
+ // Wait past window then press '−' (keyboard zoom-out)
89
+ await page.waitForTimeout(450);
90
+ await page.keyboard.press('-');
91
+ await page.waitForTimeout(50);
92
+ const duringKbZoomOut = await probeViewport();
93
+ const zoomAfterKbOut = await probeZoom();
94
+
95
+ await browser.close();
96
+
97
+ const results = {
98
+ viewport_found: idle !== null,
99
+ idle_smooth_false: idle.smooth === 'false',
100
+ idle_no_transition: !idle.transition.includes('transform'),
101
+ idle_zoom_100: zoomIdle === '100%',
102
+
103
+ kb_plus_armed_smooth: duringKbZoomIn.smooth === 'true',
104
+ kb_plus_transition_set: duringKbZoomIn.transition.includes('transform 300ms'),
105
+ kb_plus_zoom_increased: zoomAfterKb !== '100%',
106
+
107
+ after_kb_smooth_cleared: afterKbZoomIn.smooth === 'false',
108
+ after_kb_no_transition: !afterKbZoomIn.transition.includes('transform'),
109
+
110
+ chrome_in_armed_smooth: duringChromeZoomIn.smooth === 'true',
111
+ chrome_in_transition_set: duringChromeZoomIn.transition.includes('transform 300ms'),
112
+ chrome_in_zoom_increased: zoomAfterChromeIn !== zoomAfterKb,
113
+
114
+ kb_minus_armed_smooth: duringKbZoomOut.smooth === 'true',
115
+ kb_minus_transition_set: duringKbZoomOut.transition.includes('transform 300ms'),
116
+ kb_minus_zoom_decreased: zoomAfterKbOut !== zoomAfterChromeIn,
117
+ };
118
+ const ok = Object.values(results).every(Boolean);
119
+ console.log(`${ok ? '✅' : '❌'} discrete zoom smooth:`, JSON.stringify(results),
120
+ `\n idle =`, idle, `zoom=${zoomIdle}`,
121
+ `\n '+' fired =`, duringKbZoomIn, `zoom=${zoomAfterKb}`,
122
+ `\n after '+' =`, afterKbZoomIn,
123
+ `\n chrome-in fired =`, duringChromeZoomIn, `zoom=${zoomAfterChromeIn}`,
124
+ `\n '-' fired =`, duringKbZoomOut, `zoom=${zoomAfterKbOut}`);
125
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,126 @@
1
+ /* Round 170 verification: layout toggle (Ring ↔ Grid) crossfade.
2
+ *
3
+ * Pre-R170 clicking Ring/Grid teleported every node to its new
4
+ * position in one frame — most jarring user action on the canvas.
5
+ *
6
+ * R170 introduces layoutSwitching one-shot flag (same pattern as
7
+ * R168 smoothView but on opacity axis). The viewport <g>:
8
+ * transition: 'opacity 250ms ease-out' (always present)
9
+ * + 'transform 300ms ease-out' (when smoothView armed)
10
+ * opacity: layoutSwitching ? 0.45 : 1
11
+ * data-topo-viewport-layout-switching: 'true' | 'false'
12
+ *
13
+ * Layout state swap is synchronous (setLayout) — the dim masks
14
+ * the snap as a soft blink. Auto-clears 400ms (covers fade-down
15
+ * 250ms + buffer for React commit).
16
+ *
17
+ * Test:
18
+ * 1. Idle (ring layout): layoutSwitching='false', opacity=1
19
+ * 2. Press 'L' (toggleLayout) → flag='true', opacity=0.45
20
+ * 3. Layout state flipped to grid (group boxes visible)
21
+ * 4. Wait 450ms → flag='false', opacity=1
22
+ * 5. Press 'L' again → flag='true' (reverse direction works too)
23
+ */
24
+ import { chromium } from 'playwright';
25
+ import { readFileSync } from 'node:fs';
26
+
27
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
28
+ const browser = await chromium.launch({ headless: true });
29
+
30
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1500 } });
31
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
32
+ await ctx.addInitScript(() => {
33
+ try {
34
+ localStorage.setItem('anet-theme', 'cyber');
35
+ sessionStorage.setItem('anet_v3_auth', '1');
36
+ localStorage.setItem('anet-topo-layout', 'ring');
37
+ } catch {}
38
+ });
39
+
40
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
41
+ await ctx.route('**/api/hub/status*', async (route) => {
42
+ const r = await route.fetch();
43
+ const b = await r.json();
44
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
45
+ const mk = (alias) => ({
46
+ alias, status: 'working', model: 'claude-opus-4', runtime: 'cli-claude-code',
47
+ network_id: nid, project_dir: null,
48
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
49
+ });
50
+ // Prefix-clustered aliases so group boxes render in grid layout
51
+ await route.fulfill({ response: r, json: { ...b, sessions: [
52
+ mk('agents-a1'), mk('agents-a2'), mk('infra-b1'), mk('infra-b2'),
53
+ ] } });
54
+ });
55
+ await ctx.route('**/api/hub/messages*', (route) => route.fulfill({ json: { messages: [] } }));
56
+ await ctx.route('**/api/hub/tasks*', (route) => route.fulfill({ json: { tasks: [] } }));
57
+
58
+ const page = await ctx.newPage();
59
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
60
+ await page.waitForFunction(() => document.querySelectorAll('g[data-node]').length === 4, { timeout: 30000 });
61
+ await page.waitForSelector('[data-topo-viewport]', { timeout: 10000 });
62
+ await page.waitForTimeout(400);
63
+
64
+ const probeViewport = () => page.evaluate(() => {
65
+ const g = document.querySelector('[data-topo-viewport]');
66
+ return {
67
+ layoutSwitching: g?.getAttribute('data-topo-viewport-layout-switching'),
68
+ opacity: g?.style?.opacity || '',
69
+ transition: g?.style?.transition || '',
70
+ hubVisible: !!document.querySelector('[data-topo-hub]'),
71
+ groupBoxes: document.querySelectorAll('[data-group-box-pinned]').length,
72
+ };
73
+ });
74
+
75
+ const idle = await probeViewport();
76
+
77
+ // Press 'L' to toggle ring → grid. Probe within 400ms window.
78
+ await page.keyboard.press('l');
79
+ await page.waitForTimeout(50);
80
+ const duringToggle1 = await probeViewport();
81
+
82
+ // Wait past 400ms window
83
+ await page.waitForTimeout(420);
84
+ const afterToggle1 = await probeViewport();
85
+
86
+ // Press 'L' again to toggle grid → ring
87
+ await page.keyboard.press('l');
88
+ await page.waitForTimeout(50);
89
+ const duringToggle2 = await probeViewport();
90
+
91
+ await page.waitForTimeout(420);
92
+ const afterToggle2 = await probeViewport();
93
+
94
+ await browser.close();
95
+
96
+ const results = {
97
+ viewport_found: idle !== null,
98
+ idle_layoutSwitching_false: idle.layoutSwitching === 'false',
99
+ idle_opacity_1: idle.opacity === '1' || idle.opacity === '',
100
+ idle_has_opacity_transition: idle.transition.includes('opacity 250ms'),
101
+ idle_in_ring: idle.hubVisible && idle.groupBoxes === 0,
102
+
103
+ toggle1_flag_true: duringToggle1.layoutSwitching === 'true',
104
+ toggle1_opacity_0p45: duringToggle1.opacity === '0.45',
105
+ // Layout state has flipped synchronously inside toggleLayout
106
+ toggle1_now_grid: !duringToggle1.hubVisible && duringToggle1.groupBoxes > 0,
107
+
108
+ after1_flag_false: afterToggle1.layoutSwitching === 'false',
109
+ after1_opacity_1: afterToggle1.opacity === '1',
110
+ after1_still_grid: !afterToggle1.hubVisible && afterToggle1.groupBoxes > 0,
111
+
112
+ toggle2_flag_true: duringToggle2.layoutSwitching === 'true',
113
+ toggle2_opacity_0p45: duringToggle2.opacity === '0.45',
114
+ toggle2_back_to_ring: duringToggle2.hubVisible && duringToggle2.groupBoxes === 0,
115
+
116
+ after2_flag_false: afterToggle2.layoutSwitching === 'false',
117
+ after2_opacity_1: afterToggle2.opacity === '1',
118
+ };
119
+ const ok = Object.values(results).every(Boolean);
120
+ console.log(`${ok ? '✅' : '❌'} layout switch crossfade:`, JSON.stringify(results),
121
+ `\n idle =`, idle,
122
+ `\n during toggle1 (ring→grid) =`, duringToggle1,
123
+ `\n after toggle1 =`, afterToggle1,
124
+ `\n during toggle2 (grid→ring) =`, duringToggle2,
125
+ `\n after toggle2 =`, afterToggle2);
126
+ process.exit(ok ? 0 : 1);