@sleep2agi/agent-network-dashboard 0.4.6-preview.174 → 0.4.6-preview.176

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/{03~z5ygg0hl~_.js → 03hwy2_i9i8uc.js} +1 -1
  133. package/.next/static/chunks/{0mj_cxi6hdi4a.js → 0nt9bck.b13oi.js} +3 -3
  134. package/.next/static/chunks/{0ge-r3n~2to_6.js → 14sry8vr1i-ej.js} +1 -1
  135. package/.next/trace +2 -2
  136. package/.next/trace-build +1 -1
  137. package/app/components/TopoGraph.tsx +58 -7
  138. package/package.json +1 -1
  139. package/scripts/topo-discrete-zoom-smooth-test.mjs +125 -0
  140. package/scripts/topo-view-smooth-test.mjs +131 -0
  141. /package/.next/static/{B0krJIVJbtQW2xab3VfMm → x7o9_a5i87QxdsQ6ORlfv}/_buildManifest.js +0 -0
  142. /package/.next/static/{B0krJIVJbtQW2xab3VfMm → x7o9_a5i87QxdsQ6ORlfv}/_clientMiddlewareManifest.js +0 -0
  143. /package/.next/static/{B0krJIVJbtQW2xab3VfMm → x7o9_a5i87QxdsQ6ORlfv}/_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.174"],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.176"],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":299,"timestamp":63502944524,"id":4,"parentId":1,"tags":{},"startTime":1778871475191,"traceId":"5e36563bce6c4a0b"},{"name":"load-custom-routes","duration":655,"timestamp":63502945038,"id":5,"parentId":1,"tags":{},"startTime":1778871475191,"traceId":"5e36563bce6c4a0b"},{"name":"create-dist-dir","duration":664,"timestamp":63502945747,"id":6,"parentId":1,"tags":{},"startTime":1778871475192,"traceId":"5e36563bce6c4a0b"},{"name":"clean","duration":444,"timestamp":63502947077,"id":7,"parentId":1,"tags":{},"startTime":1778871475193,"traceId":"5e36563bce6c4a0b"},{"name":"discover-routes","duration":8901,"timestamp":63503025203,"id":8,"parentId":1,"tags":{},"startTime":1778871475271,"traceId":"5e36563bce6c4a0b"},{"name":"create-root-mapping","duration":112,"timestamp":63503034154,"id":9,"parentId":1,"tags":{},"startTime":1778871475280,"traceId":"5e36563bce6c4a0b"},{"name":"generate-route-types","duration":28857,"timestamp":63503036423,"id":10,"parentId":1,"tags":{},"startTime":1778871475283,"traceId":"5e36563bce6c4a0b"},{"name":"public-dir-conflict-check","duration":92,"timestamp":63503065429,"id":11,"parentId":1,"tags":{},"startTime":1778871475312,"traceId":"5e36563bce6c4a0b"},{"name":"generate-routes-manifest","duration":4330,"timestamp":63503065635,"id":12,"parentId":1,"tags":{},"startTime":1778871475312,"traceId":"5e36563bce6c4a0b"},{"name":"run-turbopack","duration":5338025,"timestamp":63503076349,"id":14,"parentId":1,"tags":{},"startTime":1778871475323,"traceId":"5e36563bce6c4a0b"},{"name":"turbopack-build-events","duration":112,"timestamp":63503365788,"id":15,"parentId":1,"tags":{},"startTime":1778871475612,"traceId":"5e36563bce6c4a0b"},{"name":"run-typescript","duration":8498594,"timestamp":63508424146,"id":16,"parentId":1,"tags":{},"startTime":1778871480670,"traceId":"5e36563bce6c4a0b"},{"name":"generate-required-server-files","duration":1912,"timestamp":63516923589,"id":18,"parentId":1,"tags":{},"startTime":1778871489170,"traceId":"5e36563bce6c4a0b"},{"name":"check-static-error-page","duration":10207,"timestamp":63517086280,"id":20,"parentId":19,"tags":{},"startTime":1778871489333,"traceId":"5e36563bce6c4a0b"},{"name":"is-page-static","duration":428092,"timestamp":63517099581,"id":63,"parentId":22,"tags":{},"startTime":1778871489346,"traceId":"5e36563bce6c4a0b"},{"name":"check-page","duration":439286,"timestamp":63517088583,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1778871489335,"traceId":"5e36563bce6c4a0b"},{"name":"is-page-static","duration":521321,"timestamp":63517100270,"id":69,"parentId":30,"tags":{},"startTime":1778871489347,"traceId":"5e36563bce6c4a0b"},{"name":"check-page","duration":530290,"timestamp":63517091400,"id":30,"parentId":19,"tags":{"page":"/api/hub/broadcast"},"startTime":1778871489338,"traceId":"5e36563bce6c4a0b"},{"name":"is-page-static","duration":524788,"timestamp":63517099296,"id":62,"parentId":21,"tags":{},"startTime":1778871489346,"traceId":"5e36563bce6c4a0b"},{"name":"check-page","duration":536718,"timestamp":63517087434,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1778871489334,"traceId":"5e36563bce6c4a0b"},{"name":"is-page-static","duration":524582,"timestamp":63517099745,"id":65,"parentId":26,"tags":{},"startTime":1778871489346,"traceId":"5e36563bce6c4a0b"},{"name":"check-page","duration":533323,"timestamp":63517091044,"id":26,"parentId":19,"tags":{"page":"/api/auth/logout"},"startTime":1778871489337,"traceId":"5e36563bce6c4a0b"},{"name":"is-page-static","duration":531786,"timestamp":63517100444,"id":70,"parentId":32,"tags":{},"startTime":1778871489347,"traceId":"5e36563bce6c4a0b"},{"name":"check-page","duration":540617,"timestamp":63517091681,"id":32,"parentId":19,"tags":{"page":"/api/hub/health"},"startTime":1778871489338,"traceId":"5e36563bce6c4a0b"},{"name":"is-page-static","duration":536519,"timestamp":63517099979,"id":67,"parentId":28,"tags":{},"startTime":1778871489346,"traceId":"5e36563bce6c4a0b"},{"name":"check-page","duration":545320,"timestamp":63517091231,"id":28,"parentId":19,"tags":{"page":"/api/hub/audit-log"},"startTime":1778871489338,"traceId":"5e36563bce6c4a0b"},{"name":"is-page-static","duration":540582,"timestamp":63517099668,"id":64,"parentId":25,"tags":{},"startTime":1778871489346,"traceId":"5e36563bce6c4a0b"},{"name":"check-page","duration":549402,"timestamp":63517090898,"id":25,"parentId":19,"tags":{"page":"/api/auth/login"},"startTime":1778871489337,"traceId":"5e36563bce6c4a0b"},{"name":"is-page-static","duration":540889,"timestamp":63517100734,"id":74,"parentId":36,"tags":{},"startTime":1778871489347,"traceId":"5e36563bce6c4a0b"},{"name":"check-page","duration":549339,"timestamp":63517092324,"id":36,"parentId":19,"tags":{"page":"/api/hub/networks"},"startTime":1778871489339,"traceId":"5e36563bce6c4a0b"},{"name":"is-page-static","duration":545442,"timestamp":63517100787,"id":75,"parentId":37,"tags":{},"startTime":1778871489347,"traceId":"5e36563bce6c4a0b"},{"name":"check-page","duration":553830,"timestamp":63517092444,"id":37,"parentId":19,"tags":{"page":"/api/hub/nodes"},"startTime":1778871489339,"traceId":"5e36563bce6c4a0b"},{"name":"is-page-static","duration":549194,"timestamp":63517099827,"id":66,"parentId":27,"tags":{},"startTime":1778871489346,"traceId":"5e36563bce6c4a0b"},{"name":"check-page","duration":557919,"timestamp":63517091147,"id":27,"parentId":19,"tags":{"page":"/api/auth/v3"},"startTime":1778871489337,"traceId":"5e36563bce6c4a0b"},{"name":"is-page-static","duration":549206,"timestamp":63517100132,"id":68,"parentId":29,"tags":{},"startTime":1778871489346,"traceId":"5e36563bce6c4a0b"},{"name":"check-page","duration":558067,"timestamp":63517091306,"id":29,"parentId":19,"tags":{"page":"/api/hub/auth"},"startTime":1778871489338,"traceId":"5e36563bce6c4a0b"},{"name":"is-page-static","duration":554614,"timestamp":63517100590,"id":72,"parentId":34,"tags":{},"startTime":1778871489347,"traceId":"5e36563bce6c4a0b"},{"name":"check-page","duration":563377,"timestamp":63517091866,"id":34,"parentId":19,"tags":{"page":"/api/hub/license"},"startTime":1778871489338,"traceId":"5e36563bce6c4a0b"},{"name":"is-page-static","duration":562565,"timestamp":63517100628,"id":73,"parentId":35,"tags":{},"startTime":1778871489347,"traceId":"5e36563bce6c4a0b"},{"name":"check-page","duration":571280,"timestamp":63517091963,"id":35,"parentId":19,"tags":{"page":"/api/hub/messages"},"startTime":1778871489338,"traceId":"5e36563bce6c4a0b"},{"name":"is-page-static","duration":564696,"timestamp":63517100857,"id":80,"parentId":42,"tags":{},"startTime":1778871489347,"traceId":"5e36563bce6c4a0b"},{"name":"check-page","duration":572803,"timestamp":63517092795,"id":42,"parentId":19,"tags":{"page":"/api/hub/session"},"startTime":1778871489339,"traceId":"5e36563bce6c4a0b"},{"name":"is-page-static","duration":579062,"timestamp":63517100807,"id":76,"parentId":38,"tags":{},"startTime":1778871489347,"traceId":"5e36563bce6c4a0b"},{"name":"check-page","duration":587401,"timestamp":63517092529,"id":38,"parentId":19,"tags":{"page":"/api/hub/register"},"startTime":1778871489339,"traceId":"5e36563bce6c4a0b"},{"name":"is-page-static","duration":582411,"timestamp":63517100879,"id":82,"parentId":44,"tags":{},"startTime":1778871489347,"traceId":"5e36563bce6c4a0b"},{"name":"check-page","duration":590415,"timestamp":63517092921,"id":44,"parentId":19,"tags":{"page":"/api/hub/status"},"startTime":1778871489339,"traceId":"5e36563bce6c4a0b"},{"name":"is-page-static","duration":582652,"timestamp":63517100832,"id":78,"parentId":40,"tags":{},"startTime":1778871489347,"traceId":"5e36563bce6c4a0b"},{"name":"check-page","duration":590869,"timestamp":63517092654,"id":40,"parentId":19,"tags":{"page":"/api/hub/server-logs"},"startTime":1778871489339,"traceId":"5e36563bce6c4a0b"},{"name":"is-page-static","duration":582803,"timestamp":63517100866,"id":81,"parentId":43,"tags":{},"startTime":1778871489347,"traceId":"5e36563bce6c4a0b"},{"name":"check-page","duration":590834,"timestamp":63517092859,"id":43,"parentId":19,"tags":{"page":"/api/hub/stats"},"startTime":1778871489339,"traceId":"5e36563bce6c4a0b"},{"name":"is-page-static","duration":591409,"timestamp":63517100818,"id":77,"parentId":39,"tags":{},"startTime":1778871489347,"traceId":"5e36563bce6c4a0b"},{"name":"check-page","duration":599683,"timestamp":63517092592,"id":39,"parentId":19,"tags":{"page":"/api/hub/send"},"startTime":1778871489339,"traceId":"5e36563bce6c4a0b"},{"name":"is-page-static","duration":591901,"timestamp":63517100902,"id":84,"parentId":46,"tags":{},"startTime":1778871489347,"traceId":"5e36563bce6c4a0b"},{"name":"check-page","duration":599783,"timestamp":63517093061,"id":46,"parentId":19,"tags":{"page":"/api/hub/tasks"},"startTime":1778871489339,"traceId":"5e36563bce6c4a0b"},{"name":"is-page-static","duration":592189,"timestamp":63517100928,"id":86,"parentId":48,"tags":{},"startTime":1778871489347,"traceId":"5e36563bce6c4a0b"},{"name":"check-page","duration":599941,"timestamp":63517093218,"id":48,"parentId":19,"tags":{"page":"/api/hub/tokens"},"startTime":1778871489339,"traceId":"5e36563bce6c4a0b"},{"name":"is-page-static","duration":594914,"timestamp":63517100915,"id":85,"parentId":47,"tags":{},"startTime":1778871489347,"traceId":"5e36563bce6c4a0b"},{"name":"check-page","duration":602711,"timestamp":63517093152,"id":47,"parentId":19,"tags":{"page":"/api/hub/tmux"},"startTime":1778871489339,"traceId":"5e36563bce6c4a0b"},{"name":"is-page-static","duration":597000,"timestamp":63517100942,"id":87,"parentId":49,"tags":{},"startTime":1778871489347,"traceId":"5e36563bce6c4a0b"},{"name":"check-page","duration":604714,"timestamp":63517093273,"id":49,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1778871489340,"traceId":"5e36563bce6c4a0b"},{"name":"is-page-static","duration":596040,"timestamp":63517106176,"id":89,"parentId":31,"tags":{},"startTime":1778871489352,"traceId":"5e36563bce6c4a0b"},{"name":"check-page","duration":610783,"timestamp":63517091474,"id":31,"parentId":19,"tags":{"page":"/api/hub/events"},"startTime":1778871489338,"traceId":"5e36563bce6c4a0b"},{"name":"is-page-static","duration":597443,"timestamp":63517104948,"id":88,"parentId":24,"tags":{},"startTime":1778871489351,"traceId":"5e36563bce6c4a0b"},{"name":"check-page","duration":613453,"timestamp":63517088970,"id":24,"parentId":19,"tags":{"page":"/api/anet/config"},"startTime":1778871489335,"traceId":"5e36563bce6c4a0b"},{"name":"is-page-static","duration":601691,"timestamp":63517100844,"id":79,"parentId":41,"tags":{},"startTime":1778871489347,"traceId":"5e36563bce6c4a0b"},{"name":"check-page","duration":609852,"timestamp":63517092716,"id":41,"parentId":19,"tags":{"page":"/api/hub/servers"},"startTime":1778871489339,"traceId":"5e36563bce6c4a0b"},{"name":"is-page-static","duration":603557,"timestamp":63517100893,"id":83,"parentId":45,"tags":{},"startTime":1778871489347,"traceId":"5e36563bce6c4a0b"},{"name":"check-page","duration":611513,"timestamp":63517092984,"id":45,"parentId":19,"tags":{"page":"/api/hub/task-events"},"startTime":1778871489339,"traceId":"5e36563bce6c4a0b"},{"name":"is-page-static","duration":618621,"timestamp":63517100515,"id":71,"parentId":33,"tags":{},"startTime":1778871489347,"traceId":"5e36563bce6c4a0b"},{"name":"check-page","duration":627405,"timestamp":63517091787,"id":33,"parentId":19,"tags":{"page":"/api/hub/inbox"},"startTime":1778871489338,"traceId":"5e36563bce6c4a0b"},{"name":"is-page-static","duration":618090,"timestamp":63517108946,"id":96,"parentId":56,"tags":{},"startTime":1778871489355,"traceId":"5e36563bce6c4a0b"},{"name":"check-page","duration":632273,"timestamp":63517094815,"id":56,"parentId":19,"tags":{"page":"/server-logs"},"startTime":1778871489341,"traceId":"5e36563bce6c4a0b"},{"name":"is-page-static","duration":625377,"timestamp":63517108958,"id":97,"parentId":57,"tags":{},"startTime":1778871489355,"traceId":"5e36563bce6c4a0b"},{"name":"check-page","duration":639406,"timestamp":63517094985,"id":57,"parentId":19,"tags":{"page":"/settings/networks"},"startTime":1778871489341,"traceId":"5e36563bce6c4a0b"},{"name":"is-page-static","duration":632538,"timestamp":63517108973,"id":98,"parentId":59,"tags":{},"startTime":1778871489355,"traceId":"5e36563bce6c4a0b"},{"name":"check-page","duration":645775,"timestamp":63517095786,"id":59,"parentId":19,"tags":{"page":"/settings/tokens"},"startTime":1778871489342,"traceId":"5e36563bce6c4a0b"},{"name":"is-page-static","duration":645453,"timestamp":63517108835,"id":90,"parentId":23,"tags":{},"startTime":1778871489355,"traceId":"5e36563bce6c4a0b"},{"name":"check-page","duration":665556,"timestamp":63517088787,"id":23,"parentId":19,"tags":{"page":"/admin"},"startTime":1778871489335,"traceId":"5e36563bce6c4a0b"},{"name":"is-page-static","duration":646517,"timestamp":63517108993,"id":99,"parentId":60,"tags":{},"startTime":1778871489355,"traceId":"5e36563bce6c4a0b"},{"name":"check-page","duration":659609,"timestamp":63517095963,"id":60,"parentId":19,"tags":{"page":"/tasks/[id]"},"startTime":1778871489342,"traceId":"5e36563bce6c4a0b"},{"name":"is-page-static","duration":651819,"timestamp":63517108930,"id":95,"parentId":54,"tags":{},"startTime":1778871489355,"traceId":"5e36563bce6c4a0b"},{"name":"check-page","duration":666630,"timestamp":63517094202,"id":54,"parentId":19,"tags":{"page":"/nodes"},"startTime":1778871489340,"traceId":"5e36563bce6c4a0b"},{"name":"is-page-static","duration":651893,"timestamp":63517109033,"id":100,"parentId":61,"tags":{},"startTime":1778871489355,"traceId":"5e36563bce6c4a0b"},{"name":"check-page","duration":664788,"timestamp":63517096162,"id":61,"parentId":19,"tags":{"page":"/tasks"},"startTime":1778871489342,"traceId":"5e36563bce6c4a0b"},{"name":"is-page-static","duration":652840,"timestamp":63517108885,"id":92,"parentId":51,"tags":{},"startTime":1778871489355,"traceId":"5e36563bce6c4a0b"},{"name":"check-page","duration":668088,"timestamp":63517093704,"id":51,"parentId":19,"tags":{"page":"/logs"},"startTime":1778871489340,"traceId":"5e36563bce6c4a0b"},{"name":"is-page-static","duration":653216,"timestamp":63517108898,"id":93,"parentId":52,"tags":{},"startTime":1778871489355,"traceId":"5e36563bce6c4a0b"},{"name":"check-page","duration":668323,"timestamp":63517093837,"id":52,"parentId":19,"tags":{"page":"/messages"},"startTime":1778871489340,"traceId":"5e36563bce6c4a0b"},{"name":"is-page-static","duration":648063,"timestamp":63517114727,"id":101,"parentId":58,"tags":{},"startTime":1778871489361,"traceId":"5e36563bce6c4a0b"},{"name":"check-page","duration":667516,"timestamp":63517095302,"id":58,"parentId":19,"tags":{"page":"/settings"},"startTime":1778871489342,"traceId":"5e36563bce6c4a0b"},{"name":"is-page-static","duration":654216,"timestamp":63517108914,"id":94,"parentId":53,"tags":{},"startTime":1778871489355,"traceId":"5e36563bce6c4a0b"},{"name":"check-page","duration":669131,"timestamp":63517094019,"id":53,"parentId":19,"tags":{"page":"/node"},"startTime":1778871489340,"traceId":"5e36563bce6c4a0b"},{"name":"is-page-static","duration":657409,"timestamp":63517108867,"id":91,"parentId":50,"tags":{},"startTime":1778871489355,"traceId":"5e36563bce6c4a0b"},{"name":"check-page","duration":672710,"timestamp":63517093586,"id":50,"parentId":19,"tags":{"page":"/login"},"startTime":1778871489340,"traceId":"5e36563bce6c4a0b"},{"name":"is-page-static","duration":645061,"timestamp":63517123202,"id":102,"parentId":55,"tags":{},"startTime":1778871489369,"traceId":"5e36563bce6c4a0b"},{"name":"check-page","duration":673883,"timestamp":63517094402,"id":55,"parentId":19,"tags":{"page":"/"},"startTime":1778871489341,"traceId":"5e36563bce6c4a0b"},{"name":"static-check","duration":682938,"timestamp":63517085379,"id":19,"parentId":1,"tags":{},"startTime":1778871489332,"traceId":"5e36563bce6c4a0b"},{"name":"write-routes-manifest","duration":448,"timestamp":63517774474,"id":104,"parentId":1,"tags":{},"startTime":1778871490021,"traceId":"5e36563bce6c4a0b"},{"name":"load-dotenv","duration":42,"timestamp":63517786103,"id":107,"parentId":106,"tags":{},"startTime":1778871490032,"traceId":"5e36563bce6c4a0b"},{"name":"run-export-path-map","duration":624,"timestamp":63517788906,"id":108,"parentId":106,"tags":{},"startTime":1778871490035,"traceId":"5e36563bce6c4a0b"},{"name":"next-export","duration":534311,"timestamp":63517784837,"id":106,"parentId":1,"tags":{},"startTime":1778871490031,"traceId":"5e36563bce6c4a0b"}]
2
- [{"name":"move-exported-app-not-found-","duration":2139,"timestamp":63518322391,"id":109,"parentId":105,"tags":{},"startTime":1778871490569,"traceId":"5e36563bce6c4a0b"},{"name":"move-exported-app-global-error-","duration":596,"timestamp":63518324613,"id":110,"parentId":105,"tags":{},"startTime":1778871490571,"traceId":"5e36563bce6c4a0b"},{"name":"static-generation","duration":548019,"timestamp":63517778964,"id":105,"parentId":1,"tags":{},"startTime":1778871490025,"traceId":"5e36563bce6c4a0b"},{"name":"write-routes-manifest","duration":387,"timestamp":63518327161,"id":111,"parentId":1,"tags":{},"startTime":1778871490573,"traceId":"5e36563bce6c4a0b"},{"name":"print-tree-view","duration":3530,"timestamp":63518341502,"id":112,"parentId":1,"tags":{},"startTime":1778871490588,"traceId":"5e36563bce6c4a0b"},{"name":"write-route-bundle-stats","duration":11749,"timestamp":63518345067,"id":113,"parentId":1,"tags":{},"startTime":1778871490591,"traceId":"5e36563bce6c4a0b"},{"name":"telemetry-flush","duration":40051,"timestamp":63518356837,"id":114,"parentId":1,"tags":{},"startTime":1778871490603,"traceId":"5e36563bce6c4a0b"},{"name":"next-build","duration":15501760,"timestamp":63502895151,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778871475141,"traceId":"5e36563bce6c4a0b"}]
1
+ [{"name":"generate-buildid","duration":294,"timestamp":64251799984,"id":4,"parentId":1,"tags":{},"startTime":1778872224046,"traceId":"fb47c7482ee06004"},{"name":"load-custom-routes","duration":660,"timestamp":64251800473,"id":5,"parentId":1,"tags":{},"startTime":1778872224047,"traceId":"fb47c7482ee06004"},{"name":"create-dist-dir","duration":636,"timestamp":64251801193,"id":6,"parentId":1,"tags":{},"startTime":1778872224047,"traceId":"fb47c7482ee06004"},{"name":"clean","duration":641,"timestamp":64251802518,"id":7,"parentId":1,"tags":{},"startTime":1778872224049,"traceId":"fb47c7482ee06004"},{"name":"discover-routes","duration":8854,"timestamp":64251883890,"id":8,"parentId":1,"tags":{},"startTime":1778872224130,"traceId":"fb47c7482ee06004"},{"name":"create-root-mapping","duration":102,"timestamp":64251892813,"id":9,"parentId":1,"tags":{},"startTime":1778872224139,"traceId":"fb47c7482ee06004"},{"name":"generate-route-types","duration":32173,"timestamp":64251895556,"id":10,"parentId":1,"tags":{},"startTime":1778872224142,"traceId":"fb47c7482ee06004"},{"name":"public-dir-conflict-check","duration":96,"timestamp":64251927901,"id":11,"parentId":1,"tags":{},"startTime":1778872224174,"traceId":"fb47c7482ee06004"},{"name":"generate-routes-manifest","duration":4655,"timestamp":64251928169,"id":12,"parentId":1,"tags":{},"startTime":1778872224174,"traceId":"fb47c7482ee06004"},{"name":"run-turbopack","duration":5468406,"timestamp":64251938169,"id":14,"parentId":1,"tags":{},"startTime":1778872224184,"traceId":"fb47c7482ee06004"},{"name":"turbopack-build-events","duration":70,"timestamp":64252219531,"id":15,"parentId":1,"tags":{},"startTime":1778872224466,"traceId":"fb47c7482ee06004"},{"name":"run-typescript","duration":8387667,"timestamp":64257421655,"id":16,"parentId":1,"tags":{},"startTime":1778872229668,"traceId":"fb47c7482ee06004"},{"name":"generate-required-server-files","duration":3019,"timestamp":64265810465,"id":18,"parentId":1,"tags":{},"startTime":1778872238057,"traceId":"fb47c7482ee06004"},{"name":"check-static-error-page","duration":11546,"timestamp":64265981051,"id":20,"parentId":19,"tags":{},"startTime":1778872238227,"traceId":"fb47c7482ee06004"},{"name":"is-page-static","duration":396355,"timestamp":64265995570,"id":63,"parentId":22,"tags":{},"startTime":1778872238242,"traceId":"fb47c7482ee06004"},{"name":"check-page","duration":408666,"timestamp":64265983451,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1778872238230,"traceId":"fb47c7482ee06004"},{"name":"is-page-static","duration":505336,"timestamp":64265996111,"id":67,"parentId":28,"tags":{},"startTime":1778872238242,"traceId":"fb47c7482ee06004"},{"name":"check-page","duration":515403,"timestamp":64265986149,"id":28,"parentId":19,"tags":{"page":"/api/hub/audit-log"},"startTime":1778872238232,"traceId":"fb47c7482ee06004"},{"name":"is-page-static","duration":503841,"timestamp":64265997937,"id":69,"parentId":30,"tags":{},"startTime":1778872238244,"traceId":"fb47c7482ee06004"},{"name":"check-page","duration":515405,"timestamp":64265986418,"id":30,"parentId":19,"tags":{"page":"/api/hub/broadcast"},"startTime":1778872238233,"traceId":"fb47c7482ee06004"},{"name":"is-page-static","duration":523109,"timestamp":64265998160,"id":70,"parentId":32,"tags":{},"startTime":1778872238244,"traceId":"fb47c7482ee06004"},{"name":"check-page","duration":534543,"timestamp":64265986786,"id":32,"parentId":19,"tags":{"page":"/api/hub/health"},"startTime":1778872238233,"traceId":"fb47c7482ee06004"},{"name":"is-page-static","duration":527233,"timestamp":64265995223,"id":62,"parentId":21,"tags":{},"startTime":1778872238241,"traceId":"fb47c7482ee06004"},{"name":"check-page","duration":540267,"timestamp":64265982243,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1778872238229,"traceId":"fb47c7482ee06004"},{"name":"is-page-static","duration":526463,"timestamp":64265998233,"id":71,"parentId":33,"tags":{},"startTime":1778872238245,"traceId":"fb47c7482ee06004"},{"name":"check-page","duration":537810,"timestamp":64265986932,"id":33,"parentId":19,"tags":{"page":"/api/hub/inbox"},"startTime":1778872238233,"traceId":"fb47c7482ee06004"},{"name":"is-page-static","duration":534294,"timestamp":64265995652,"id":64,"parentId":25,"tags":{},"startTime":1778872238242,"traceId":"fb47c7482ee06004"},{"name":"check-page","duration":544325,"timestamp":64265985696,"id":25,"parentId":19,"tags":{"page":"/api/auth/login"},"startTime":1778872238232,"traceId":"fb47c7482ee06004"},{"name":"is-page-static","duration":534406,"timestamp":64265998306,"id":72,"parentId":34,"tags":{},"startTime":1778872238245,"traceId":"fb47c7482ee06004"},{"name":"check-page","duration":545712,"timestamp":64265987069,"id":34,"parentId":19,"tags":{"page":"/api/hub/license"},"startTime":1778872238233,"traceId":"fb47c7482ee06004"},{"name":"is-page-static","duration":539268,"timestamp":64265995845,"id":66,"parentId":27,"tags":{},"startTime":1778872238242,"traceId":"fb47c7482ee06004"},{"name":"check-page","duration":549165,"timestamp":64265985999,"id":27,"parentId":19,"tags":{"page":"/api/auth/v3"},"startTime":1778872238232,"traceId":"fb47c7482ee06004"},{"name":"is-page-static","duration":536966,"timestamp":64265998473,"id":75,"parentId":37,"tags":{},"startTime":1778872238245,"traceId":"fb47c7482ee06004"},{"name":"check-page","duration":547648,"timestamp":64265987840,"id":37,"parentId":19,"tags":{"page":"/api/hub/nodes"},"startTime":1778872238234,"traceId":"fb47c7482ee06004"},{"name":"is-page-static","duration":540095,"timestamp":64265995733,"id":65,"parentId":26,"tags":{},"startTime":1778872238242,"traceId":"fb47c7482ee06004"},{"name":"check-page","duration":549996,"timestamp":64265985879,"id":26,"parentId":19,"tags":{"page":"/api/auth/logout"},"startTime":1778872238232,"traceId":"fb47c7482ee06004"},{"name":"is-page-static","duration":538935,"timestamp":64265999619,"id":76,"parentId":38,"tags":{},"startTime":1778872238246,"traceId":"fb47c7482ee06004"},{"name":"check-page","duration":550675,"timestamp":64265987932,"id":38,"parentId":19,"tags":{"page":"/api/hub/register"},"startTime":1778872238234,"traceId":"fb47c7482ee06004"},{"name":"is-page-static","duration":540411,"timestamp":64265999655,"id":77,"parentId":39,"tags":{},"startTime":1778872238246,"traceId":"fb47c7482ee06004"},{"name":"check-page","duration":552075,"timestamp":64265988031,"id":39,"parentId":19,"tags":{"page":"/api/hub/send"},"startTime":1778872238234,"traceId":"fb47c7482ee06004"},{"name":"is-page-static","duration":541249,"timestamp":64265999686,"id":79,"parentId":41,"tags":{},"startTime":1778872238246,"traceId":"fb47c7482ee06004"},{"name":"check-page","duration":552814,"timestamp":64265988164,"id":41,"parentId":19,"tags":{"page":"/api/hub/servers"},"startTime":1778872238234,"traceId":"fb47c7482ee06004"},{"name":"is-page-static","duration":544995,"timestamp":64265997745,"id":68,"parentId":29,"tags":{},"startTime":1778872238244,"traceId":"fb47c7482ee06004"},{"name":"check-page","duration":556519,"timestamp":64265986271,"id":29,"parentId":19,"tags":{"page":"/api/hub/auth"},"startTime":1778872238233,"traceId":"fb47c7482ee06004"},{"name":"is-page-static","duration":543224,"timestamp":64265999702,"id":80,"parentId":42,"tags":{},"startTime":1778872238246,"traceId":"fb47c7482ee06004"},{"name":"check-page","duration":554723,"timestamp":64265988231,"id":42,"parentId":19,"tags":{"page":"/api/hub/session"},"startTime":1778872238235,"traceId":"fb47c7482ee06004"},{"name":"is-page-static","duration":547049,"timestamp":64265998443,"id":74,"parentId":36,"tags":{},"startTime":1778872238245,"traceId":"fb47c7482ee06004"},{"name":"check-page","duration":557865,"timestamp":64265987687,"id":36,"parentId":19,"tags":{"page":"/api/hub/networks"},"startTime":1778872238234,"traceId":"fb47c7482ee06004"},{"name":"is-page-static","duration":549017,"timestamp":64265999781,"id":84,"parentId":46,"tags":{},"startTime":1778872238246,"traceId":"fb47c7482ee06004"},{"name":"check-page","duration":560378,"timestamp":64265988472,"id":46,"parentId":19,"tags":{"page":"/api/hub/tasks"},"startTime":1778872238235,"traceId":"fb47c7482ee06004"},{"name":"is-page-static","duration":551937,"timestamp":64265999717,"id":81,"parentId":43,"tags":{},"startTime":1778872238246,"traceId":"fb47c7482ee06004"},{"name":"check-page","duration":563407,"timestamp":64265988293,"id":43,"parentId":19,"tags":{"page":"/api/hub/stats"},"startTime":1778872238235,"traceId":"fb47c7482ee06004"},{"name":"is-page-static","duration":553142,"timestamp":64265999809,"id":86,"parentId":48,"tags":{},"startTime":1778872238246,"traceId":"fb47c7482ee06004"},{"name":"check-page","duration":564377,"timestamp":64265988618,"id":48,"parentId":19,"tags":{"page":"/api/hub/tokens"},"startTime":1778872238235,"traceId":"fb47c7482ee06004"},{"name":"is-page-static","duration":556274,"timestamp":64265999825,"id":87,"parentId":49,"tags":{},"startTime":1778872238246,"traceId":"fb47c7482ee06004"},{"name":"check-page","duration":567476,"timestamp":64265988677,"id":49,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1778872238235,"traceId":"fb47c7482ee06004"},{"name":"is-page-static","duration":557028,"timestamp":64265999764,"id":83,"parentId":45,"tags":{},"startTime":1778872238246,"traceId":"fb47c7482ee06004"},{"name":"check-page","duration":568424,"timestamp":64265988412,"id":45,"parentId":19,"tags":{"page":"/api/hub/task-events"},"startTime":1778872238235,"traceId":"fb47c7482ee06004"},{"name":"is-page-static","duration":554586,"timestamp":64266003539,"id":88,"parentId":24,"tags":{},"startTime":1778872238250,"traceId":"fb47c7482ee06004"},{"name":"check-page","duration":574327,"timestamp":64265983845,"id":24,"parentId":19,"tags":{"page":"/api/anet/config"},"startTime":1778872238230,"traceId":"fb47c7482ee06004"},{"name":"is-page-static","duration":557020,"timestamp":64266004723,"id":89,"parentId":31,"tags":{},"startTime":1778872238251,"traceId":"fb47c7482ee06004"},{"name":"check-page","duration":575269,"timestamp":64265986541,"id":31,"parentId":19,"tags":{"page":"/api/hub/events"},"startTime":1778872238233,"traceId":"fb47c7482ee06004"},{"name":"is-page-static","duration":570136,"timestamp":64265999794,"id":85,"parentId":47,"tags":{},"startTime":1778872238246,"traceId":"fb47c7482ee06004"},{"name":"check-page","duration":581423,"timestamp":64265988556,"id":47,"parentId":19,"tags":{"page":"/api/hub/tmux"},"startTime":1778872238235,"traceId":"fb47c7482ee06004"},{"name":"is-page-static","duration":577957,"timestamp":64265999734,"id":82,"parentId":44,"tags":{},"startTime":1778872238246,"traceId":"fb47c7482ee06004"},{"name":"check-page","duration":589388,"timestamp":64265988348,"id":44,"parentId":19,"tags":{"page":"/api/hub/status"},"startTime":1778872238235,"traceId":"fb47c7482ee06004"},{"name":"is-page-static","duration":601636,"timestamp":64265998335,"id":73,"parentId":35,"tags":{},"startTime":1778872238245,"traceId":"fb47c7482ee06004"},{"name":"check-page","duration":612851,"timestamp":64265987211,"id":35,"parentId":19,"tags":{"page":"/api/hub/messages"},"startTime":1778872238233,"traceId":"fb47c7482ee06004"},{"name":"is-page-static","duration":598439,"timestamp":64266011505,"id":95,"parentId":54,"tags":{},"startTime":1778872238258,"traceId":"fb47c7482ee06004"},{"name":"check-page","duration":619574,"timestamp":64265990642,"id":54,"parentId":19,"tags":{"page":"/nodes"},"startTime":1778872238237,"traceId":"fb47c7482ee06004"},{"name":"is-page-static","duration":606887,"timestamp":64266011520,"id":96,"parentId":56,"tags":{},"startTime":1778872238258,"traceId":"fb47c7482ee06004"},{"name":"check-page","duration":627275,"timestamp":64265991200,"id":56,"parentId":19,"tags":{"page":"/server-logs"},"startTime":1778872238237,"traceId":"fb47c7482ee06004"},{"name":"is-page-static","duration":611465,"timestamp":64266011442,"id":91,"parentId":50,"tags":{},"startTime":1778872238258,"traceId":"fb47c7482ee06004"},{"name":"check-page","duration":632951,"timestamp":64265990086,"id":50,"parentId":19,"tags":{"page":"/login"},"startTime":1778872238236,"traceId":"fb47c7482ee06004"},{"name":"is-page-static","duration":623575,"timestamp":64265999669,"id":78,"parentId":40,"tags":{},"startTime":1778872238246,"traceId":"fb47c7482ee06004"},{"name":"check-page","duration":635192,"timestamp":64265988106,"id":40,"parentId":19,"tags":{"page":"/api/hub/server-logs"},"startTime":1778872238234,"traceId":"fb47c7482ee06004"},{"name":"is-page-static","duration":613951,"timestamp":64266011532,"id":97,"parentId":57,"tags":{},"startTime":1778872238258,"traceId":"fb47c7482ee06004"},{"name":"check-page","duration":634127,"timestamp":64265991405,"id":57,"parentId":19,"tags":{"page":"/settings/networks"},"startTime":1778872238238,"traceId":"fb47c7482ee06004"},{"name":"is-page-static","duration":616231,"timestamp":64266011547,"id":98,"parentId":59,"tags":{},"startTime":1778872238258,"traceId":"fb47c7482ee06004"},{"name":"check-page","duration":635803,"timestamp":64265992036,"id":59,"parentId":19,"tags":{"page":"/settings/tokens"},"startTime":1778872238238,"traceId":"fb47c7482ee06004"},{"name":"is-page-static","duration":619322,"timestamp":64266011409,"id":90,"parentId":23,"tags":{},"startTime":1778872238258,"traceId":"fb47c7482ee06004"},{"name":"check-page","duration":647135,"timestamp":64265983654,"id":23,"parentId":19,"tags":{"page":"/admin"},"startTime":1778872238230,"traceId":"fb47c7482ee06004"},{"name":"is-page-static","duration":620377,"timestamp":64266011582,"id":100,"parentId":61,"tags":{},"startTime":1778872238258,"traceId":"fb47c7482ee06004"},{"name":"check-page","duration":639652,"timestamp":64265992338,"id":61,"parentId":19,"tags":{"page":"/tasks"},"startTime":1778872238239,"traceId":"fb47c7482ee06004"},{"name":"is-page-static","duration":618052,"timestamp":64266017994,"id":101,"parentId":58,"tags":{},"startTime":1778872238264,"traceId":"fb47c7482ee06004"},{"name":"check-page","duration":644502,"timestamp":64265991582,"id":58,"parentId":19,"tags":{"page":"/settings"},"startTime":1778872238238,"traceId":"fb47c7482ee06004"},{"name":"is-page-static","duration":603726,"timestamp":64266034176,"id":102,"parentId":55,"tags":{},"startTime":1778872238280,"traceId":"fb47c7482ee06004"},{"name":"check-page","duration":647119,"timestamp":64265990811,"id":55,"parentId":19,"tags":{"page":"/"},"startTime":1778872238237,"traceId":"fb47c7482ee06004"},{"name":"is-page-static","duration":634080,"timestamp":64266011474,"id":93,"parentId":52,"tags":{},"startTime":1778872238258,"traceId":"fb47c7482ee06004"},{"name":"check-page","duration":655236,"timestamp":64265990354,"id":52,"parentId":19,"tags":{"page":"/messages"},"startTime":1778872238237,"traceId":"fb47c7482ee06004"},{"name":"is-page-static","duration":634505,"timestamp":64266011462,"id":92,"parentId":51,"tags":{},"startTime":1778872238258,"traceId":"fb47c7482ee06004"},{"name":"check-page","duration":655750,"timestamp":64265990242,"id":51,"parentId":19,"tags":{"page":"/logs"},"startTime":1778872238237,"traceId":"fb47c7482ee06004"},{"name":"is-page-static","duration":636846,"timestamp":64266011490,"id":94,"parentId":53,"tags":{},"startTime":1778872238258,"traceId":"fb47c7482ee06004"},{"name":"check-page","duration":657889,"timestamp":64265990487,"id":53,"parentId":19,"tags":{"page":"/node"},"startTime":1778872238237,"traceId":"fb47c7482ee06004"},{"name":"is-page-static","duration":660513,"timestamp":64266011566,"id":99,"parentId":60,"tags":{},"startTime":1778872238258,"traceId":"fb47c7482ee06004"},{"name":"check-page","duration":679939,"timestamp":64265992187,"id":60,"parentId":19,"tags":{"page":"/tasks/[id]"},"startTime":1778872238238,"traceId":"fb47c7482ee06004"},{"name":"static-check","duration":691936,"timestamp":64265980226,"id":19,"parentId":1,"tags":{},"startTime":1778872238227,"traceId":"fb47c7482ee06004"},{"name":"write-routes-manifest","duration":545,"timestamp":64266680788,"id":104,"parentId":1,"tags":{},"startTime":1778872238927,"traceId":"fb47c7482ee06004"},{"name":"load-dotenv","duration":84,"timestamp":64266695934,"id":107,"parentId":106,"tags":{},"startTime":1778872238942,"traceId":"fb47c7482ee06004"},{"name":"run-export-path-map","duration":852,"timestamp":64266699310,"id":108,"parentId":106,"tags":{},"startTime":1778872238946,"traceId":"fb47c7482ee06004"},{"name":"next-export","duration":560473,"timestamp":64266694202,"id":106,"parentId":1,"tags":{},"startTime":1778872238940,"traceId":"fb47c7482ee06004"}]
2
+ [{"name":"move-exported-app-not-found-","duration":2040,"timestamp":64267258360,"id":109,"parentId":105,"tags":{},"startTime":1778872239505,"traceId":"fb47c7482ee06004"},{"name":"move-exported-app-global-error-","duration":492,"timestamp":64267260493,"id":110,"parentId":105,"tags":{},"startTime":1778872239507,"traceId":"fb47c7482ee06004"},{"name":"static-generation","duration":576489,"timestamp":64266686200,"id":105,"parentId":1,"tags":{},"startTime":1778872238932,"traceId":"fb47c7482ee06004"},{"name":"write-routes-manifest","duration":400,"timestamp":64267262861,"id":111,"parentId":1,"tags":{},"startTime":1778872239509,"traceId":"fb47c7482ee06004"},{"name":"print-tree-view","duration":3454,"timestamp":64267279391,"id":112,"parentId":1,"tags":{},"startTime":1778872239526,"traceId":"fb47c7482ee06004"},{"name":"write-route-bundle-stats","duration":12664,"timestamp":64267282870,"id":113,"parentId":1,"tags":{},"startTime":1778872239529,"traceId":"fb47c7482ee06004"},{"name":"telemetry-flush","duration":21850,"timestamp":64267295566,"id":114,"parentId":1,"tags":{},"startTime":1778872239542,"traceId":"fb47c7482ee06004"},{"name":"next-build","duration":15568860,"timestamp":64251748588,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778872223995,"traceId":"fb47c7482ee06004"}]
package/.next/trace-build CHANGED
@@ -1 +1 @@
1
- [{"name":"run-turbopack","duration":5338025,"timestamp":63503076349,"id":14,"parentId":1,"tags":{},"startTime":1778871475323,"traceId":"5e36563bce6c4a0b"},{"name":"turbopack-build-events","duration":112,"timestamp":63503365788,"id":15,"parentId":1,"tags":{},"startTime":1778871475612,"traceId":"5e36563bce6c4a0b"},{"name":"run-typescript","duration":8498594,"timestamp":63508424146,"id":16,"parentId":1,"tags":{},"startTime":1778871480670,"traceId":"5e36563bce6c4a0b"},{"name":"static-check","duration":682938,"timestamp":63517085379,"id":19,"parentId":1,"tags":{},"startTime":1778871489332,"traceId":"5e36563bce6c4a0b"},{"name":"static-generation","duration":548019,"timestamp":63517778964,"id":105,"parentId":1,"tags":{},"startTime":1778871490025,"traceId":"5e36563bce6c4a0b"},{"name":"telemetry-flush","duration":40051,"timestamp":63518356837,"id":114,"parentId":1,"tags":{},"startTime":1778871490603,"traceId":"5e36563bce6c4a0b"},{"name":"next-build","duration":15501760,"timestamp":63502895151,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778871475141,"traceId":"5e36563bce6c4a0b"}]
1
+ [{"name":"run-turbopack","duration":5468406,"timestamp":64251938169,"id":14,"parentId":1,"tags":{},"startTime":1778872224184,"traceId":"fb47c7482ee06004"},{"name":"turbopack-build-events","duration":70,"timestamp":64252219531,"id":15,"parentId":1,"tags":{},"startTime":1778872224466,"traceId":"fb47c7482ee06004"},{"name":"run-typescript","duration":8387667,"timestamp":64257421655,"id":16,"parentId":1,"tags":{},"startTime":1778872229668,"traceId":"fb47c7482ee06004"},{"name":"static-check","duration":691936,"timestamp":64265980226,"id":19,"parentId":1,"tags":{},"startTime":1778872238227,"traceId":"fb47c7482ee06004"},{"name":"static-generation","duration":576489,"timestamp":64266686200,"id":105,"parentId":1,"tags":{},"startTime":1778872238932,"traceId":"fb47c7482ee06004"},{"name":"telemetry-flush","duration":21850,"timestamp":64267295566,"id":114,"parentId":1,"tags":{},"startTime":1778872239542,"traceId":"fb47c7482ee06004"},{"name":"next-build","duration":15568860,"timestamp":64251748588,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778872223995,"traceId":"fb47c7482ee06004"}]
@@ -1180,16 +1180,54 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
1180
1180
  return { zoom: nz, x: cx0 - (cx0 - prev.x) * ratio, y: cy0 - (cy0 - prev.y) * ratio };
1181
1181
  });
1182
1182
  };
1183
- const resetView = () => setView({ zoom: 1, x: 0, y: 0 });
1183
+ // Round 169 / Loop: discrete-zoom wrapper that arms the R168
1184
+ // smoothView flag before invoking zoomBy. Keyboard + / − and
1185
+ // the chrome zoom buttons fire once per gesture, so each
1186
+ // 1.2× step deserves the same 300ms glide R168 gives
1187
+ // reset/fit. Wheel zoom keeps calling zoomBy() directly —
1188
+ // every tick should respond live without lag. The arming
1189
+ // path is identical to resetView/fitView so all four
1190
+ // discrete-zoom surfaces share one timing constant.
1191
+ const zoomByDiscrete = (factor: number) => {
1192
+ setSmoothView(true);
1193
+ setTimeout(() => setSmoothView(false), 350);
1194
+ zoomBy(factor);
1195
+ };
1196
+ // Round 168 / Loop: smoothView is a one-shot flag that arms a
1197
+ // CSS transition on the viewport <g> transform attribute. Set
1198
+ // true when resetView/fitView fires; the inline style on the
1199
+ // viewport <g> reads this flag and conditionally applies
1200
+ // `transition: transform 300ms ease-out`. Auto-clears after
1201
+ // 350ms (just past the transition end) via setTimeout so
1202
+ // subsequent pan/wheel zoom stays snappy with no lag. Keeping
1203
+ // it as state (vs ref) so the React rerender re-applies the
1204
+ // style attribute synchronously when the transform also
1205
+ // changes — both attribute mutation and transition class
1206
+ // arrive in the same paint frame, which is what triggers the
1207
+ // browser to animate between the old and new transform values.
1208
+ const [smoothView, setSmoothView] = useState(false);
1209
+ const armSmoothView = () => {
1210
+ setSmoothView(true);
1211
+ setTimeout(() => setSmoothView(false), 350);
1212
+ };
1213
+ const resetView = () => {
1214
+ armSmoothView();
1215
+ setView({ zoom: 1, x: 0, y: 0 });
1216
+ };
1184
1217
 
1185
1218
  // Round 29 / Loop: `f` = fit-to-content. Shared by the Round 28
1186
1219
  // first-paint auto-fit effect and the keyboard handler so the math is
1187
1220
  // in one place. When content already fits at natural zoom, this is
1188
1221
  // effectively a "recenter" — `f` always lands on a known good view.
1222
+ // R168: arm smoothView so the transition glides instead of snapping
1223
+ // when the operator invokes fit-to-content via the hub click (R52),
1224
+ // chrome button, `f` key, or palette command.
1189
1225
  const fitView = useCallback(() => {
1190
1226
  const zoom = !gridContentBottom || gridContentBottom <= VIEWBOX_H
1191
1227
  ? 1
1192
1228
  : Math.max(ZOOM_MIN, Math.min(1, VIEWBOX_H / gridContentBottom));
1229
+ setSmoothView(true);
1230
+ setTimeout(() => setSmoothView(false), 350);
1193
1231
  setView({ zoom, x: 0, y: 0 });
1194
1232
  }, [gridContentBottom]);
1195
1233
 
@@ -1230,8 +1268,8 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
1230
1268
  const tag = ae.tagName;
1231
1269
  if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT' || ae.isContentEditable) return;
1232
1270
  }
1233
- if (e.key === '+' || e.key === '=') { zoomBy(1.2); e.preventDefault(); }
1234
- else if (e.key === '-' || e.key === '_') { zoomBy(1 / 1.2); e.preventDefault(); }
1271
+ if (e.key === '+' || e.key === '=') { zoomByDiscrete(1.2); e.preventDefault(); }
1272
+ else if (e.key === '-' || e.key === '_') { zoomByDiscrete(1 / 1.2); e.preventDefault(); }
1235
1273
  else if (e.key === '0') { resetView(); e.preventDefault(); }
1236
1274
  else if (e.key === 'f' || e.key === 'F') { fitView(); e.preventDefault(); }
1237
1275
  // Round 32 / Loop: `l` toggles ring|grid. The vim-style `g l` route
@@ -2208,8 +2246,21 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
2208
2246
  <rect width="1000" height="680" fill="url(#topo-panel)" />
2209
2247
 
2210
2248
  {/* Round 103 (issue #81): everything inside this <g> zooms + pans
2211
- together. transform order = translate then scale. */}
2212
- <g transform={`translate(${view.x} ${view.y}) scale(${view.zoom})`}>
2249
+ together. transform order = translate then scale.
2250
+ Round 168 / Loop: smoothView arms a one-shot transition on
2251
+ the transform attribute, active only when resetView/fitView
2252
+ fires. Pan (R103 pointer drag) and wheel zoom never set the
2253
+ flag, so they stay snappy with no lag. Pressing `0`, `f`,
2254
+ clicking the hub (R52), or chrome reset/fit buttons triggers
2255
+ a 300ms ease-out glide instead of a jolt. Respects prefers-
2256
+ reduced-motion via the R29 globals.css blanket override that
2257
+ neutralises transition-duration universally. */}
2258
+ <g
2259
+ transform={`translate(${view.x} ${view.y}) scale(${view.zoom})`}
2260
+ data-topo-viewport
2261
+ data-topo-viewport-smooth={smoothView ? 'true' : 'false'}
2262
+ style={smoothView ? { transition: 'transform 300ms ease-out' } : undefined}
2263
+ >
2213
2264
  {/* Issue #87: radar/ring ambiance renders only in ring layout —
2214
2265
  grid mode drops it so the concentric rings don't sit behind a
2215
2266
  rectangular grid. */}
@@ -4593,7 +4644,7 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
4593
4644
  style={{ background: pal.legendBox.fill, borderColor: pal.containerBorder }}
4594
4645
  >
4595
4646
  <button
4596
- onClick={() => zoomBy(1 / 1.2)}
4647
+ onClick={() => zoomByDiscrete(1 / 1.2)}
4597
4648
  data-topo-chrome-zoom-out
4598
4649
  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"
4599
4650
  style={{ color: pal.legendText }}
@@ -4611,7 +4662,7 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
4611
4662
  {Math.round(view.zoom * 100)}%
4612
4663
  </span>
4613
4664
  <button
4614
- onClick={() => zoomBy(1.2)}
4665
+ onClick={() => zoomByDiscrete(1.2)}
4615
4666
  data-topo-chrome-zoom-in
4616
4667
  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"
4617
4668
  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.174",
3
+ "version": "0.4.6-preview.176",
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,131 @@
1
+ /* Round 168 verification: smooth viewport transition on reset/fit.
2
+ *
3
+ * Pre-R168 resetView/fitView snapped the <g transform> from
4
+ * current zoom/pan to {zoom:1, x:0, y:0} in one frame. Pressing
5
+ * `0` or clicking the hub jolted the eye.
6
+ *
7
+ * R168 arms a one-shot smoothView flag when resetView/fitView
8
+ * fires; the viewport <g> reads this flag and conditionally
9
+ * applies `transition: transform 300ms ease-out`. Auto-clears
10
+ * 350ms later. Pan (R103 drag) and wheel zoom never set the
11
+ * flag, so interactive view changes stay snappy.
12
+ *
13
+ * Test:
14
+ * 1. Load page → idle state, smoothView=false (no transition)
15
+ * 2. Zoom in twice via '+' to set non-default view
16
+ * 3. Press '0' (resetView) → smoothView=true, viewport <g>
17
+ * has style.transition = 'transform 300ms ease-out'
18
+ * 4. Wait 450ms → smoothView=false again, transition cleared
19
+ * 5. Repeat with 'f' (fitView)
20
+ */
21
+ import { chromium } from 'playwright';
22
+ import { readFileSync } from 'node:fs';
23
+
24
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
25
+ const browser = await chromium.launch({ headless: true });
26
+
27
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1500 } });
28
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
29
+ await ctx.addInitScript(() => {
30
+ try { localStorage.setItem('anet-theme', 'cyber'); sessionStorage.setItem('anet_v3_auth', '1'); } catch {}
31
+ });
32
+
33
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
34
+ await ctx.route('**/api/hub/status*', async (route) => {
35
+ const r = await route.fetch();
36
+ const b = await r.json();
37
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
38
+ const mk = (alias) => ({
39
+ alias, status: 'working', model: 'claude-opus-4', runtime: 'cli-claude-code',
40
+ network_id: nid, project_dir: null,
41
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
42
+ });
43
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('alpha'), mk('beta'), mk('gamma')] } });
44
+ });
45
+ await ctx.route('**/api/hub/messages*', (route) => route.fulfill({ json: { messages: [] } }));
46
+ await ctx.route('**/api/hub/tasks*', (route) => route.fulfill({ json: { tasks: [] } }));
47
+
48
+ const page = await ctx.newPage();
49
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
50
+ await page.waitForFunction(() => document.querySelectorAll('g[data-node]').length === 3, { timeout: 30000 });
51
+ await page.waitForSelector('[data-topo-viewport]', { timeout: 10000 });
52
+ await page.waitForTimeout(400);
53
+
54
+ // Idle: smoothView=false, no transition style.
55
+ const idle = await page.evaluate(() => {
56
+ const g = document.querySelector('[data-topo-viewport]');
57
+ return {
58
+ smooth: g?.getAttribute('data-topo-viewport-smooth'),
59
+ transition: g?.style?.transition || '',
60
+ };
61
+ });
62
+
63
+ // Zoom in twice → set non-default view
64
+ await page.keyboard.press('+');
65
+ await page.keyboard.press('+');
66
+ await page.waitForTimeout(150);
67
+ const zoomBefore = await page.evaluate(() =>
68
+ document.querySelector('[data-topo-chrome-zoom-level]')?.textContent?.trim());
69
+
70
+ // Press 0 (resetView) → smoothView=true. Probe within the
71
+ // 350ms window so the style is still set.
72
+ await page.keyboard.press('0');
73
+ // Small delay so React commits the state update.
74
+ await page.waitForTimeout(50);
75
+ const duringReset = await page.evaluate(() => {
76
+ const g = document.querySelector('[data-topo-viewport]');
77
+ return {
78
+ smooth: g?.getAttribute('data-topo-viewport-smooth'),
79
+ transition: g?.style?.transition || '',
80
+ };
81
+ });
82
+
83
+ // Wait past the 350ms window
84
+ await page.waitForTimeout(450);
85
+ const afterReset = await page.evaluate(() => {
86
+ const g = document.querySelector('[data-topo-viewport]');
87
+ return {
88
+ smooth: g?.getAttribute('data-topo-viewport-smooth'),
89
+ transition: g?.style?.transition || '',
90
+ };
91
+ });
92
+ const zoomAfter = await page.evaluate(() =>
93
+ document.querySelector('[data-topo-chrome-zoom-level]')?.textContent?.trim());
94
+
95
+ // Now zoom in again and press 'f' (fitView) — same arming path
96
+ await page.keyboard.press('+');
97
+ await page.keyboard.press('+');
98
+ await page.waitForTimeout(150);
99
+ await page.keyboard.press('f');
100
+ await page.waitForTimeout(50);
101
+ const duringFit = await page.evaluate(() => {
102
+ const g = document.querySelector('[data-topo-viewport]');
103
+ return {
104
+ smooth: g?.getAttribute('data-topo-viewport-smooth'),
105
+ transition: g?.style?.transition || '',
106
+ };
107
+ });
108
+
109
+ await browser.close();
110
+
111
+ const results = {
112
+ viewport_found: idle !== null,
113
+ idle_smooth_false: idle.smooth === 'false',
114
+ idle_no_transition: !idle.transition.includes('transform'),
115
+ zoomed_before_reset: zoomBefore !== '100%',
116
+ reset_armed_smooth: duringReset.smooth === 'true',
117
+ reset_transition_set: duringReset.transition.includes('transform 300ms'),
118
+ after_reset_smooth_false: afterReset.smooth === 'false',
119
+ after_reset_no_transition: !afterReset.transition.includes('transform'),
120
+ reset_landed_at_100: zoomAfter === '100%',
121
+ fit_armed_smooth: duringFit.smooth === 'true',
122
+ fit_transition_set: duringFit.transition.includes('transform 300ms'),
123
+ };
124
+ const ok = Object.values(results).every(Boolean);
125
+ console.log(`${ok ? '✅' : '❌'} view smooth transition:`, JSON.stringify(results),
126
+ `\n idle =`, idle,
127
+ `\n duringReset =`, duringReset,
128
+ `\n afterReset =`, afterReset,
129
+ `\n duringFit =`, duringFit,
130
+ `\n zoom before/after = ${zoomBefore} → ${zoomAfter}`);
131
+ process.exit(ok ? 0 : 1);