@sleep2agi/agent-network-dashboard 0.4.6-preview.362 → 0.4.6-preview.363

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +3 -3
  3. package/.next/diagnostics/route-bundle-stats.json +4 -4
  4. package/.next/fallback-build-manifest.json +3 -3
  5. package/.next/server/app/_global-error.html +1 -1
  6. package/.next/server/app/_global-error.rsc +1 -1
  7. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  8. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  12. package/.next/server/app/_not-found.html +1 -1
  13. package/.next/server/app/_not-found.rsc +1 -1
  14. package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  15. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  16. package/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  17. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  18. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  19. package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  20. package/.next/server/app/admin.html +1 -1
  21. package/.next/server/app/admin.rsc +1 -1
  22. package/.next/server/app/admin.segments/_full.segment.rsc +1 -1
  23. package/.next/server/app/admin.segments/_head.segment.rsc +1 -1
  24. package/.next/server/app/admin.segments/_index.segment.rsc +1 -1
  25. package/.next/server/app/admin.segments/_tree.segment.rsc +1 -1
  26. package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +1 -1
  27. package/.next/server/app/admin.segments/admin.segment.rsc +1 -1
  28. package/.next/server/app/index.html +2 -2
  29. package/.next/server/app/index.rsc +2 -2
  30. package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  31. package/.next/server/app/index.segments/_full.segment.rsc +2 -2
  32. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  33. package/.next/server/app/index.segments/_index.segment.rsc +1 -1
  34. package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  35. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  36. package/.next/server/app/login.html +2 -2
  37. package/.next/server/app/login.rsc +2 -2
  38. package/.next/server/app/login.segments/_full.segment.rsc +2 -2
  39. package/.next/server/app/login.segments/_head.segment.rsc +1 -1
  40. package/.next/server/app/login.segments/_index.segment.rsc +1 -1
  41. package/.next/server/app/login.segments/_tree.segment.rsc +1 -1
  42. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  43. package/.next/server/app/login.segments/login.segment.rsc +1 -1
  44. package/.next/server/app/logs.html +1 -1
  45. package/.next/server/app/logs.rsc +1 -1
  46. package/.next/server/app/logs.segments/_full.segment.rsc +1 -1
  47. package/.next/server/app/logs.segments/_head.segment.rsc +1 -1
  48. package/.next/server/app/logs.segments/_index.segment.rsc +1 -1
  49. package/.next/server/app/logs.segments/_tree.segment.rsc +1 -1
  50. package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +1 -1
  51. package/.next/server/app/logs.segments/logs.segment.rsc +1 -1
  52. package/.next/server/app/messages.html +1 -1
  53. package/.next/server/app/messages.rsc +1 -1
  54. package/.next/server/app/messages.segments/_full.segment.rsc +1 -1
  55. package/.next/server/app/messages.segments/_head.segment.rsc +1 -1
  56. package/.next/server/app/messages.segments/_index.segment.rsc +1 -1
  57. package/.next/server/app/messages.segments/_tree.segment.rsc +1 -1
  58. package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +1 -1
  59. package/.next/server/app/messages.segments/messages.segment.rsc +1 -1
  60. package/.next/server/app/node.html +1 -1
  61. package/.next/server/app/node.rsc +1 -1
  62. package/.next/server/app/node.segments/_full.segment.rsc +1 -1
  63. package/.next/server/app/node.segments/_head.segment.rsc +1 -1
  64. package/.next/server/app/node.segments/_index.segment.rsc +1 -1
  65. package/.next/server/app/node.segments/_tree.segment.rsc +1 -1
  66. package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +1 -1
  67. package/.next/server/app/node.segments/node.segment.rsc +1 -1
  68. package/.next/server/app/nodes.html +1 -1
  69. package/.next/server/app/nodes.rsc +1 -1
  70. package/.next/server/app/nodes.segments/_full.segment.rsc +1 -1
  71. package/.next/server/app/nodes.segments/_head.segment.rsc +1 -1
  72. package/.next/server/app/nodes.segments/_index.segment.rsc +1 -1
  73. package/.next/server/app/nodes.segments/_tree.segment.rsc +1 -1
  74. package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +1 -1
  75. package/.next/server/app/nodes.segments/nodes.segment.rsc +1 -1
  76. package/.next/server/app/page_client-reference-manifest.js +1 -1
  77. package/.next/server/app/server-logs.html +1 -1
  78. package/.next/server/app/server-logs.rsc +1 -1
  79. package/.next/server/app/server-logs.segments/_full.segment.rsc +1 -1
  80. package/.next/server/app/server-logs.segments/_head.segment.rsc +1 -1
  81. package/.next/server/app/server-logs.segments/_index.segment.rsc +1 -1
  82. package/.next/server/app/server-logs.segments/_tree.segment.rsc +1 -1
  83. package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +1 -1
  84. package/.next/server/app/server-logs.segments/server-logs.segment.rsc +1 -1
  85. package/.next/server/app/settings/networks.html +1 -1
  86. package/.next/server/app/settings/networks.rsc +1 -1
  87. package/.next/server/app/settings/networks.segments/_full.segment.rsc +1 -1
  88. package/.next/server/app/settings/networks.segments/_head.segment.rsc +1 -1
  89. package/.next/server/app/settings/networks.segments/_index.segment.rsc +1 -1
  90. package/.next/server/app/settings/networks.segments/_tree.segment.rsc +1 -1
  91. package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +1 -1
  92. package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +1 -1
  93. package/.next/server/app/settings/networks.segments/settings.segment.rsc +1 -1
  94. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  95. package/.next/server/app/settings/tokens.html +1 -1
  96. package/.next/server/app/settings/tokens.rsc +1 -1
  97. package/.next/server/app/settings/tokens.segments/_full.segment.rsc +1 -1
  98. package/.next/server/app/settings/tokens.segments/_head.segment.rsc +1 -1
  99. package/.next/server/app/settings/tokens.segments/_index.segment.rsc +1 -1
  100. package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +1 -1
  101. package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +1 -1
  102. package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +1 -1
  103. package/.next/server/app/settings/tokens.segments/settings.segment.rsc +1 -1
  104. package/.next/server/app/settings.html +2 -2
  105. package/.next/server/app/settings.rsc +2 -2
  106. package/.next/server/app/settings.segments/_full.segment.rsc +2 -2
  107. package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  108. package/.next/server/app/settings.segments/_index.segment.rsc +1 -1
  109. package/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
  110. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +2 -2
  111. package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  112. package/.next/server/app/tasks.html +1 -1
  113. package/.next/server/app/tasks.rsc +1 -1
  114. package/.next/server/app/tasks.segments/_full.segment.rsc +1 -1
  115. package/.next/server/app/tasks.segments/_head.segment.rsc +1 -1
  116. package/.next/server/app/tasks.segments/_index.segment.rsc +1 -1
  117. package/.next/server/app/tasks.segments/_tree.segment.rsc +1 -1
  118. package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +1 -1
  119. package/.next/server/app/tasks.segments/tasks.segment.rsc +1 -1
  120. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js +1 -1
  121. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js.map +1 -1
  122. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js +1 -1
  123. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js.map +1 -1
  124. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js +1 -1
  125. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js.map +1 -1
  126. package/.next/server/middleware-build-manifest.js +3 -3
  127. package/.next/server/pages/404.html +1 -1
  128. package/.next/server/pages/500.html +1 -1
  129. package/.next/static/chunks/{0b5odyhyr1fnp.js → 06bfn73sfnyut.js} +1 -1
  130. package/.next/static/chunks/{0mmvfihvlb_w4.js → 0899uvk6dbkf~.js} +1 -1
  131. package/.next/static/chunks/{0utwz8~_w7ae2.js → 0l5xx57wh29-o.js} +1 -1
  132. package/.next/trace +2 -2
  133. package/.next/trace-build +1 -1
  134. package/app/api/hub/servers/route.ts +77 -1
  135. package/app/components/TopoGraph.tsx +18 -5
  136. package/package.json +1 -1
  137. package/scripts/topo-filter-pill-count-tabular-test.mjs +135 -0
  138. /package/.next/static/{5LdAxDjnLcwVdWMm8Id_r → s5Iteo_lZIHlLuHW2r0KA}/_buildManifest.js +0 -0
  139. /package/.next/static/{5LdAxDjnLcwVdWMm8Id_r → s5Iteo_lZIHlLuHW2r0KA}/_clientMiddlewareManifest.js +0 -0
  140. /package/.next/static/{5LdAxDjnLcwVdWMm8Id_r → s5Iteo_lZIHlLuHW2r0KA}/_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.361"],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.363"],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":262,"timestamp":121779888356,"id":4,"parentId":1,"tags":{},"startTime":1778929752135,"traceId":"89a9eb83accb0dc0"},{"name":"load-custom-routes","duration":498,"timestamp":121779888760,"id":5,"parentId":1,"tags":{},"startTime":1778929752135,"traceId":"89a9eb83accb0dc0"},{"name":"create-dist-dir","duration":847,"timestamp":121779889305,"id":6,"parentId":1,"tags":{},"startTime":1778929752136,"traceId":"89a9eb83accb0dc0"},{"name":"clean","duration":35688,"timestamp":121779891085,"id":7,"parentId":1,"tags":{},"startTime":1778929752137,"traceId":"89a9eb83accb0dc0"},{"name":"discover-routes","duration":30157,"timestamp":121780020572,"id":8,"parentId":1,"tags":{},"startTime":1778929752267,"traceId":"89a9eb83accb0dc0"},{"name":"create-root-mapping","duration":165,"timestamp":121780050813,"id":9,"parentId":1,"tags":{},"startTime":1778929752297,"traceId":"89a9eb83accb0dc0"},{"name":"generate-route-types","duration":24322,"timestamp":121780054358,"id":10,"parentId":1,"tags":{},"startTime":1778929752301,"traceId":"89a9eb83accb0dc0"},{"name":"public-dir-conflict-check","duration":128,"timestamp":121780078788,"id":11,"parentId":1,"tags":{},"startTime":1778929752325,"traceId":"89a9eb83accb0dc0"},{"name":"generate-routes-manifest","duration":4990,"timestamp":121780079081,"id":12,"parentId":1,"tags":{},"startTime":1778929752325,"traceId":"89a9eb83accb0dc0"},{"name":"run-turbopack","duration":7524781,"timestamp":121780090131,"id":14,"parentId":1,"tags":{},"startTime":1778929752336,"traceId":"89a9eb83accb0dc0"},{"name":"turbopack-build-events","duration":113,"timestamp":121780411608,"id":15,"parentId":1,"tags":{},"startTime":1778929752658,"traceId":"89a9eb83accb0dc0"},{"name":"run-typescript","duration":13525847,"timestamp":121787627421,"id":16,"parentId":1,"tags":{},"startTime":1778929759874,"traceId":"89a9eb83accb0dc0"},{"name":"generate-required-server-files","duration":3119,"timestamp":121801154671,"id":18,"parentId":1,"tags":{},"startTime":1778929773401,"traceId":"89a9eb83accb0dc0"},{"name":"check-static-error-page","duration":21789,"timestamp":121801395251,"id":20,"parentId":19,"tags":{},"startTime":1778929773642,"traceId":"89a9eb83accb0dc0"},{"name":"is-page-static","duration":717340,"timestamp":121801423111,"id":65,"parentId":22,"tags":{},"startTime":1778929773669,"traceId":"89a9eb83accb0dc0"},{"name":"check-page","duration":740017,"timestamp":121801400603,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1778929773647,"traceId":"89a9eb83accb0dc0"},{"name":"is-page-static","duration":749745,"timestamp":121801423273,"id":66,"parentId":25,"tags":{},"startTime":1778929773670,"traceId":"89a9eb83accb0dc0"},{"name":"check-page","duration":769289,"timestamp":121801403848,"id":25,"parentId":19,"tags":{"page":"/api/auth/login"},"startTime":1778929773650,"traceId":"89a9eb83accb0dc0"},{"name":"is-page-static","duration":754658,"timestamp":121801424248,"id":72,"parentId":32,"tags":{},"startTime":1778929773671,"traceId":"89a9eb83accb0dc0"},{"name":"check-page","duration":773108,"timestamp":121801405879,"id":32,"parentId":19,"tags":{"page":"/api/hub/health"},"startTime":1778929773652,"traceId":"89a9eb83accb0dc0"},{"name":"is-page-static","duration":818913,"timestamp":121801424458,"id":73,"parentId":33,"tags":{},"startTime":1778929773671,"traceId":"89a9eb83accb0dc0"},{"name":"check-page","duration":837393,"timestamp":121801406068,"id":33,"parentId":19,"tags":{"page":"/api/hub/inbox"},"startTime":1778929773652,"traceId":"89a9eb83accb0dc0"},{"name":"is-page-static","duration":826329,"timestamp":121801423783,"id":69,"parentId":28,"tags":{},"startTime":1778929773670,"traceId":"89a9eb83accb0dc0"},{"name":"check-page","duration":845093,"timestamp":121801405117,"id":28,"parentId":19,"tags":{"page":"/api/hub/audit-log"},"startTime":1778929773651,"traceId":"89a9eb83accb0dc0"},{"name":"is-page-static","duration":827894,"timestamp":121801424546,"id":74,"parentId":34,"tags":{},"startTime":1778929773671,"traceId":"89a9eb83accb0dc0"},{"name":"check-page","duration":847332,"timestamp":121801406245,"id":34,"parentId":19,"tags":{"page":"/api/hub/license"},"startTime":1778929773653,"traceId":"89a9eb83accb0dc0"},{"name":"is-page-static","duration":831053,"timestamp":121801424575,"id":75,"parentId":35,"tags":{},"startTime":1778929773671,"traceId":"89a9eb83accb0dc0"},{"name":"check-page","duration":849287,"timestamp":121801406408,"id":35,"parentId":19,"tags":{"page":"/api/hub/messages"},"startTime":1778929773653,"traceId":"89a9eb83accb0dc0"},{"name":"is-page-static","duration":852005,"timestamp":121801424601,"id":76,"parentId":36,"tags":{},"startTime":1778929773671,"traceId":"89a9eb83accb0dc0"},{"name":"check-page","duration":869715,"timestamp":121801406966,"id":36,"parentId":19,"tags":{"page":"/api/hub/networks"},"startTime":1778929773653,"traceId":"89a9eb83accb0dc0"},{"name":"is-page-static","duration":859720,"timestamp":121801424653,"id":78,"parentId":38,"tags":{},"startTime":1778929773671,"traceId":"89a9eb83accb0dc0"},{"name":"check-page","duration":876809,"timestamp":121801407655,"id":38,"parentId":19,"tags":{"page":"/api/hub/register"},"startTime":1778929773654,"traceId":"89a9eb83accb0dc0"},{"name":"is-page-static","duration":863379,"timestamp":121801422617,"id":64,"parentId":21,"tags":{},"startTime":1778929773669,"traceId":"89a9eb83accb0dc0"},{"name":"check-page","duration":887267,"timestamp":121801398807,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1778929773645,"traceId":"89a9eb83accb0dc0"},{"name":"is-page-static","duration":878715,"timestamp":121801424633,"id":77,"parentId":37,"tags":{},"startTime":1778929773671,"traceId":"89a9eb83accb0dc0"},{"name":"check-page","duration":895946,"timestamp":121801407479,"id":37,"parentId":19,"tags":{"page":"/api/hub/nodes"},"startTime":1778929773654,"traceId":"89a9eb83accb0dc0"},{"name":"is-page-static","duration":894760,"timestamp":121801424665,"id":79,"parentId":39,"tags":{},"startTime":1778929773671,"traceId":"89a9eb83accb0dc0"},{"name":"check-page","duration":911743,"timestamp":121801407769,"id":39,"parentId":19,"tags":{"page":"/api/hub/send"},"startTime":1778929773654,"traceId":"89a9eb83accb0dc0"},{"name":"is-page-static","duration":898173,"timestamp":121801423401,"id":67,"parentId":26,"tags":{},"startTime":1778929773670,"traceId":"89a9eb83accb0dc0"},{"name":"check-page","duration":916940,"timestamp":121801404700,"id":26,"parentId":19,"tags":{"page":"/api/auth/logout"},"startTime":1778929773651,"traceId":"89a9eb83accb0dc0"},{"name":"is-page-static","duration":909039,"timestamp":121801424710,"id":82,"parentId":43,"tags":{},"startTime":1778929773671,"traceId":"89a9eb83accb0dc0"},{"name":"check-page","duration":925227,"timestamp":121801408599,"id":43,"parentId":19,"tags":{"page":"/api/hub/servers"},"startTime":1778929773655,"traceId":"89a9eb83accb0dc0"},{"name":"is-page-static","duration":911501,"timestamp":121801423995,"id":70,"parentId":29,"tags":{},"startTime":1778929773670,"traceId":"89a9eb83accb0dc0"},{"name":"check-page","duration":930296,"timestamp":121801405257,"id":29,"parentId":19,"tags":{"page":"/api/hub/auth"},"startTime":1778929773652,"traceId":"89a9eb83accb0dc0"},{"name":"is-page-static","duration":919729,"timestamp":121801424744,"id":84,"parentId":45,"tags":{},"startTime":1778929773671,"traceId":"89a9eb83accb0dc0"},{"name":"check-page","duration":935708,"timestamp":121801408840,"id":45,"parentId":19,"tags":{"page":"/api/hub/stats"},"startTime":1778929773655,"traceId":"89a9eb83accb0dc0"},{"name":"is-page-static","duration":924219,"timestamp":121801424697,"id":81,"parentId":42,"tags":{},"startTime":1778929773671,"traceId":"89a9eb83accb0dc0"},{"name":"check-page","duration":940614,"timestamp":121801408417,"id":42,"parentId":19,"tags":{"page":"/api/hub/server/[hostname]/health"},"startTime":1778929773655,"traceId":"89a9eb83accb0dc0"},{"name":"is-page-static","duration":930428,"timestamp":121801424773,"id":86,"parentId":47,"tags":{},"startTime":1778929773671,"traceId":"89a9eb83accb0dc0"},{"name":"check-page","duration":944248,"timestamp":121801411032,"id":47,"parentId":19,"tags":{"page":"/api/hub/task-events"},"startTime":1778929773657,"traceId":"89a9eb83accb0dc0"},{"name":"is-page-static","duration":932439,"timestamp":121801424728,"id":83,"parentId":44,"tags":{},"startTime":1778929773671,"traceId":"89a9eb83accb0dc0"},{"name":"check-page","duration":948497,"timestamp":121801408723,"id":44,"parentId":19,"tags":{"page":"/api/hub/session"},"startTime":1778929773655,"traceId":"89a9eb83accb0dc0"},{"name":"is-page-static","duration":935985,"timestamp":121801424789,"id":87,"parentId":48,"tags":{},"startTime":1778929773671,"traceId":"89a9eb83accb0dc0"},{"name":"check-page","duration":949509,"timestamp":121801411318,"id":48,"parentId":19,"tags":{"page":"/api/hub/tasks"},"startTime":1778929773658,"traceId":"89a9eb83accb0dc0"},{"name":"is-page-static","duration":941688,"timestamp":121801424804,"id":88,"parentId":49,"tags":{},"startTime":1778929773671,"traceId":"89a9eb83accb0dc0"},{"name":"check-page","duration":955059,"timestamp":121801411497,"id":49,"parentId":19,"tags":{"page":"/api/hub/tmux"},"startTime":1778929773658,"traceId":"89a9eb83accb0dc0"},{"name":"is-page-static","duration":948247,"timestamp":121801424185,"id":71,"parentId":30,"tags":{},"startTime":1778929773670,"traceId":"89a9eb83accb0dc0"},{"name":"check-page","duration":967048,"timestamp":121801405438,"id":30,"parentId":19,"tags":{"page":"/api/hub/broadcast"},"startTime":1778929773652,"traceId":"89a9eb83accb0dc0"},{"name":"is-page-static","duration":932872,"timestamp":121801439954,"id":91,"parentId":24,"tags":{},"startTime":1778929773686,"traceId":"89a9eb83accb0dc0"},{"name":"check-page","duration":971685,"timestamp":121801401223,"id":24,"parentId":19,"tags":{"page":"/api/anet/config"},"startTime":1778929773647,"traceId":"89a9eb83accb0dc0"},{"name":"is-page-static","duration":957858,"timestamp":121801424815,"id":89,"parentId":50,"tags":{},"startTime":1778929773671,"traceId":"89a9eb83accb0dc0"},{"name":"check-page","duration":971024,"timestamp":121801411703,"id":50,"parentId":19,"tags":{"page":"/api/hub/tokens"},"startTime":1778929773658,"traceId":"89a9eb83accb0dc0"},{"name":"is-page-static","duration":958801,"timestamp":121801424761,"id":85,"parentId":46,"tags":{},"startTime":1778929773671,"traceId":"89a9eb83accb0dc0"},{"name":"check-page","duration":972800,"timestamp":121801410807,"id":46,"parentId":19,"tags":{"page":"/api/hub/status"},"startTime":1778929773657,"traceId":"89a9eb83accb0dc0"},{"name":"is-page-static","duration":943852,"timestamp":121801450236,"id":92,"parentId":31,"tags":{},"startTime":1778929773697,"traceId":"89a9eb83accb0dc0"},{"name":"check-page","duration":988575,"timestamp":121801405572,"id":31,"parentId":19,"tags":{"page":"/api/hub/events"},"startTime":1778929773652,"traceId":"89a9eb83accb0dc0"},{"name":"is-page-static","duration":978407,"timestamp":121801424681,"id":80,"parentId":40,"tags":{},"startTime":1778929773671,"traceId":"89a9eb83accb0dc0"},{"name":"check-page","duration":995246,"timestamp":121801407907,"id":40,"parentId":19,"tags":{"page":"/api/hub/server-logs"},"startTime":1778929773654,"traceId":"89a9eb83accb0dc0"},{"name":"is-page-static","duration":958483,"timestamp":121801451223,"id":93,"parentId":41,"tags":{},"startTime":1778929773698,"traceId":"89a9eb83accb0dc0"},{"name":"check-page","duration":1001694,"timestamp":121801408075,"id":41,"parentId":19,"tags":{"page":"/api/hub/server/[hostname]/agents"},"startTime":1778929773654,"traceId":"89a9eb83accb0dc0"},{"name":"is-page-static","duration":953993,"timestamp":121801458438,"id":97,"parentId":54,"tags":{},"startTime":1778929773705,"traceId":"89a9eb83accb0dc0"},{"name":"check-page","duration":999719,"timestamp":121801412775,"id":54,"parentId":19,"tags":{"page":"/messages"},"startTime":1778929773659,"traceId":"89a9eb83accb0dc0"},{"name":"is-page-static","duration":989209,"timestamp":121801424831,"id":90,"parentId":51,"tags":{},"startTime":1778929773671,"traceId":"89a9eb83accb0dc0"},{"name":"check-page","duration":1002124,"timestamp":121801411971,"id":51,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1778929773658,"traceId":"89a9eb83accb0dc0"},{"name":"is-page-static","duration":971075,"timestamp":121801458458,"id":99,"parentId":56,"tags":{},"startTime":1778929773705,"traceId":"89a9eb83accb0dc0"},{"name":"check-page","duration":1015787,"timestamp":121801413822,"id":56,"parentId":19,"tags":{"page":"/nodes"},"startTime":1778929773660,"traceId":"89a9eb83accb0dc0"},{"name":"is-page-static","duration":1008669,"timestamp":121801423517,"id":68,"parentId":27,"tags":{},"startTime":1778929773670,"traceId":"89a9eb83accb0dc0"},{"name":"check-page","duration":1027313,"timestamp":121801404931,"id":27,"parentId":19,"tags":{"page":"/api/auth/v3"},"startTime":1778929773651,"traceId":"89a9eb83accb0dc0"},{"name":"is-page-static","duration":984505,"timestamp":121801458481,"id":101,"parentId":59,"tags":{},"startTime":1778929773705,"traceId":"89a9eb83accb0dc0"},{"name":"check-page","duration":1027673,"timestamp":121801415404,"id":59,"parentId":19,"tags":{"page":"/settings/networks"},"startTime":1778929773662,"traceId":"89a9eb83accb0dc0"},{"name":"is-page-static","duration":1025535,"timestamp":121801458447,"id":98,"parentId":55,"tags":{},"startTime":1778929773705,"traceId":"89a9eb83accb0dc0"},{"name":"check-page","duration":1070489,"timestamp":121801413592,"id":55,"parentId":19,"tags":{"page":"/node"},"startTime":1778929773660,"traceId":"89a9eb83accb0dc0"},{"name":"is-page-static","duration":1028403,"timestamp":121801458508,"id":103,"parentId":62,"tags":{},"startTime":1778929773705,"traceId":"89a9eb83accb0dc0"},{"name":"check-page","duration":1070327,"timestamp":121801416661,"id":62,"parentId":19,"tags":{"page":"/tasks/[id]"},"startTime":1778929773663,"traceId":"89a9eb83accb0dc0"},{"name":"is-page-static","duration":1033739,"timestamp":121801458519,"id":104,"parentId":63,"tags":{},"startTime":1778929773705,"traceId":"89a9eb83accb0dc0"},{"name":"check-page","duration":1075531,"timestamp":121801416795,"id":63,"parentId":19,"tags":{"page":"/tasks"},"startTime":1778929773663,"traceId":"89a9eb83accb0dc0"},{"name":"is-page-static","duration":1030718,"timestamp":121801468359,"id":105,"parentId":60,"tags":{},"startTime":1778929773715,"traceId":"89a9eb83accb0dc0"},{"name":"check-page","duration":1083110,"timestamp":121801416071,"id":60,"parentId":19,"tags":{"page":"/settings"},"startTime":1778929773662,"traceId":"89a9eb83accb0dc0"},{"name":"is-page-static","duration":1022729,"timestamp":121801480824,"id":106,"parentId":57,"tags":{},"startTime":1778929773727,"traceId":"89a9eb83accb0dc0"},{"name":"check-page","duration":1089404,"timestamp":121801414193,"id":57,"parentId":19,"tags":{"page":"/"},"startTime":1778929773660,"traceId":"89a9eb83accb0dc0"},{"name":"is-page-static","duration":1053294,"timestamp":121801458413,"id":95,"parentId":52,"tags":{},"startTime":1778929773705,"traceId":"89a9eb83accb0dc0"},{"name":"check-page","duration":1099315,"timestamp":121801412460,"id":52,"parentId":19,"tags":{"page":"/login"},"startTime":1778929773659,"traceId":"89a9eb83accb0dc0"},{"name":"is-page-static","duration":1058069,"timestamp":121801458380,"id":94,"parentId":23,"tags":{},"startTime":1778929773705,"traceId":"89a9eb83accb0dc0"},{"name":"check-page","duration":1115587,"timestamp":121801400926,"id":23,"parentId":19,"tags":{"page":"/admin"},"startTime":1778929773647,"traceId":"89a9eb83accb0dc0"},{"name":"is-page-static","duration":1067246,"timestamp":121801458470,"id":100,"parentId":58,"tags":{},"startTime":1778929773705,"traceId":"89a9eb83accb0dc0"},{"name":"check-page","duration":1110986,"timestamp":121801414790,"id":58,"parentId":19,"tags":{"page":"/server-logs"},"startTime":1778929773661,"traceId":"89a9eb83accb0dc0"},{"name":"is-page-static","duration":1074143,"timestamp":121801458427,"id":96,"parentId":53,"tags":{},"startTime":1778929773705,"traceId":"89a9eb83accb0dc0"},{"name":"check-page","duration":1119993,"timestamp":121801412631,"id":53,"parentId":19,"tags":{"page":"/logs"},"startTime":1778929773659,"traceId":"89a9eb83accb0dc0"},{"name":"is-page-static","duration":1082442,"timestamp":121801458497,"id":102,"parentId":61,"tags":{},"startTime":1778929773705,"traceId":"89a9eb83accb0dc0"},{"name":"check-page","duration":1124503,"timestamp":121801416522,"id":61,"parentId":19,"tags":{"page":"/settings/tokens"},"startTime":1778929773663,"traceId":"89a9eb83accb0dc0"},{"name":"static-check","duration":1147017,"timestamp":121801394053,"id":19,"parentId":1,"tags":{},"startTime":1778929773640,"traceId":"89a9eb83accb0dc0"}]
2
- [{"name":"write-routes-manifest","duration":424,"timestamp":121802551048,"id":108,"parentId":1,"tags":{},"startTime":1778929774797,"traceId":"89a9eb83accb0dc0"},{"name":"load-dotenv","duration":62,"timestamp":121802564489,"id":111,"parentId":110,"tags":{},"startTime":1778929774811,"traceId":"89a9eb83accb0dc0"},{"name":"run-export-path-map","duration":725,"timestamp":121802569740,"id":112,"parentId":110,"tags":{},"startTime":1778929774816,"traceId":"89a9eb83accb0dc0"},{"name":"next-export","duration":698911,"timestamp":121802562669,"id":110,"parentId":1,"tags":{},"startTime":1778929774809,"traceId":"89a9eb83accb0dc0"},{"name":"move-exported-app-not-found-","duration":666,"timestamp":121803266357,"id":113,"parentId":109,"tags":{},"startTime":1778929775513,"traceId":"89a9eb83accb0dc0"},{"name":"move-exported-app-global-error-","duration":473,"timestamp":121803267153,"id":114,"parentId":109,"tags":{},"startTime":1778929775513,"traceId":"89a9eb83accb0dc0"},{"name":"static-generation","duration":715021,"timestamp":121802555331,"id":109,"parentId":1,"tags":{},"startTime":1778929774802,"traceId":"89a9eb83accb0dc0"},{"name":"write-routes-manifest","duration":536,"timestamp":121803270638,"id":115,"parentId":1,"tags":{},"startTime":1778929775517,"traceId":"89a9eb83accb0dc0"},{"name":"print-tree-view","duration":5520,"timestamp":121803288668,"id":116,"parentId":1,"tags":{},"startTime":1778929775535,"traceId":"89a9eb83accb0dc0"},{"name":"write-route-bundle-stats","duration":19948,"timestamp":121803294236,"id":117,"parentId":1,"tags":{},"startTime":1778929775541,"traceId":"89a9eb83accb0dc0"},{"name":"telemetry-flush","duration":18411,"timestamp":121803314239,"id":118,"parentId":1,"tags":{},"startTime":1778929775561,"traceId":"89a9eb83accb0dc0"},{"name":"next-build","duration":23499857,"timestamp":121779832830,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778929752079,"traceId":"89a9eb83accb0dc0"}]
1
+ [{"name":"generate-buildid","duration":317,"timestamp":122311048653,"id":4,"parentId":1,"tags":{},"startTime":1778930283295,"traceId":"0833df250a0c9aa5"},{"name":"load-custom-routes","duration":480,"timestamp":122311049162,"id":5,"parentId":1,"tags":{},"startTime":1778930283295,"traceId":"0833df250a0c9aa5"},{"name":"create-dist-dir","duration":776,"timestamp":122311049686,"id":6,"parentId":1,"tags":{},"startTime":1778930283296,"traceId":"0833df250a0c9aa5"},{"name":"clean","duration":40272,"timestamp":122311051448,"id":7,"parentId":1,"tags":{},"startTime":1778930283298,"traceId":"0833df250a0c9aa5"},{"name":"discover-routes","duration":27169,"timestamp":122311186998,"id":8,"parentId":1,"tags":{},"startTime":1778930283433,"traceId":"0833df250a0c9aa5"},{"name":"create-root-mapping","duration":117,"timestamp":122311214231,"id":9,"parentId":1,"tags":{},"startTime":1778930283461,"traceId":"0833df250a0c9aa5"},{"name":"generate-route-types","duration":19675,"timestamp":122311217236,"id":10,"parentId":1,"tags":{},"startTime":1778930283464,"traceId":"0833df250a0c9aa5"},{"name":"public-dir-conflict-check","duration":112,"timestamp":122311237032,"id":11,"parentId":1,"tags":{},"startTime":1778930283483,"traceId":"0833df250a0c9aa5"},{"name":"generate-routes-manifest","duration":5627,"timestamp":122311237273,"id":12,"parentId":1,"tags":{},"startTime":1778930283484,"traceId":"0833df250a0c9aa5"},{"name":"run-turbopack","duration":7563636,"timestamp":122311250646,"id":14,"parentId":1,"tags":{},"startTime":1778930283497,"traceId":"0833df250a0c9aa5"},{"name":"turbopack-build-events","duration":121,"timestamp":122311593363,"id":15,"parentId":1,"tags":{},"startTime":1778930283840,"traceId":"0833df250a0c9aa5"},{"name":"run-typescript","duration":10884268,"timestamp":122318858626,"id":16,"parentId":1,"tags":{},"startTime":1778930291105,"traceId":"0833df250a0c9aa5"},{"name":"generate-required-server-files","duration":3720,"timestamp":122329744394,"id":18,"parentId":1,"tags":{},"startTime":1778930301991,"traceId":"0833df250a0c9aa5"},{"name":"check-static-error-page","duration":16192,"timestamp":122329947725,"id":20,"parentId":19,"tags":{},"startTime":1778930302194,"traceId":"0833df250a0c9aa5"},{"name":"is-page-static","duration":685870,"timestamp":122329969537,"id":69,"parentId":28,"tags":{},"startTime":1778930302216,"traceId":"0833df250a0c9aa5"},{"name":"check-page","duration":698674,"timestamp":122329956906,"id":28,"parentId":19,"tags":{"page":"/api/hub/audit-log"},"startTime":1778930302203,"traceId":"0833df250a0c9aa5"},{"name":"is-page-static","duration":689970,"timestamp":122329968911,"id":65,"parentId":22,"tags":{},"startTime":1778930302215,"traceId":"0833df250a0c9aa5"},{"name":"check-page","duration":707828,"timestamp":122329951141,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1778930302197,"traceId":"0833df250a0c9aa5"},{"name":"is-page-static","duration":691764,"timestamp":122329969838,"id":71,"parentId":30,"tags":{},"startTime":1778930302216,"traceId":"0833df250a0c9aa5"},{"name":"check-page","duration":704384,"timestamp":122329957277,"id":30,"parentId":19,"tags":{"page":"/api/hub/broadcast"},"startTime":1778930302204,"traceId":"0833df250a0c9aa5"},{"name":"is-page-static","duration":703160,"timestamp":122329970143,"id":73,"parentId":33,"tags":{},"startTime":1778930302216,"traceId":"0833df250a0c9aa5"},{"name":"check-page","duration":715591,"timestamp":122329957767,"id":33,"parentId":19,"tags":{"page":"/api/hub/inbox"},"startTime":1778930302204,"traceId":"0833df250a0c9aa5"},{"name":"is-page-static","duration":708641,"timestamp":122329970224,"id":74,"parentId":34,"tags":{},"startTime":1778930302216,"traceId":"0833df250a0c9aa5"},{"name":"check-page","duration":721050,"timestamp":122329957868,"id":34,"parentId":19,"tags":{"page":"/api/hub/license"},"startTime":1778930302204,"traceId":"0833df250a0c9aa5"},{"name":"is-page-static","duration":720867,"timestamp":122329970252,"id":75,"parentId":35,"tags":{},"startTime":1778930302217,"traceId":"0833df250a0c9aa5"},{"name":"check-page","duration":733236,"timestamp":122329957948,"id":35,"parentId":19,"tags":{"page":"/api/hub/messages"},"startTime":1778930302204,"traceId":"0833df250a0c9aa5"},{"name":"is-page-static","duration":739650,"timestamp":122329969211,"id":67,"parentId":26,"tags":{},"startTime":1778930302215,"traceId":"0833df250a0c9aa5"},{"name":"check-page","duration":754555,"timestamp":122329954379,"id":26,"parentId":19,"tags":{"page":"/api/auth/logout"},"startTime":1778930302201,"traceId":"0833df250a0c9aa5"},{"name":"is-page-static","duration":752214,"timestamp":122329970269,"id":76,"parentId":36,"tags":{},"startTime":1778930302217,"traceId":"0833df250a0c9aa5"},{"name":"check-page","duration":764225,"timestamp":122329958335,"id":36,"parentId":19,"tags":{"page":"/api/hub/networks"},"startTime":1778930302205,"traceId":"0833df250a0c9aa5"},{"name":"is-page-static","duration":776564,"timestamp":122329968571,"id":64,"parentId":21,"tags":{},"startTime":1778930302215,"traceId":"0833df250a0c9aa5"},{"name":"check-page","duration":795786,"timestamp":122329949431,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1778930302196,"traceId":"0833df250a0c9aa5"},{"name":"is-page-static","duration":781933,"timestamp":122329970312,"id":78,"parentId":38,"tags":{},"startTime":1778930302217,"traceId":"0833df250a0c9aa5"},{"name":"check-page","duration":793779,"timestamp":122329958549,"id":38,"parentId":19,"tags":{"page":"/api/hub/register"},"startTime":1778930302205,"traceId":"0833df250a0c9aa5"},{"name":"is-page-static","duration":783687,"timestamp":122329969702,"id":70,"parentId":29,"tags":{},"startTime":1778930302216,"traceId":"0833df250a0c9aa5"},{"name":"check-page","duration":796340,"timestamp":122329957114,"id":29,"parentId":19,"tags":{"page":"/api/hub/auth"},"startTime":1778930302203,"traceId":"0833df250a0c9aa5"},{"name":"is-page-static","duration":789996,"timestamp":122329970340,"id":80,"parentId":40,"tags":{},"startTime":1778930302217,"traceId":"0833df250a0c9aa5"},{"name":"check-page","duration":801736,"timestamp":122329958673,"id":40,"parentId":19,"tags":{"page":"/api/hub/server-logs"},"startTime":1778930302205,"traceId":"0833df250a0c9aa5"},{"name":"is-page-static","duration":792700,"timestamp":122329970362,"id":82,"parentId":43,"tags":{},"startTime":1778930302217,"traceId":"0833df250a0c9aa5"},{"name":"check-page","duration":803919,"timestamp":122329959205,"id":43,"parentId":19,"tags":{"page":"/api/hub/servers"},"startTime":1778930302205,"traceId":"0833df250a0c9aa5"},{"name":"is-page-static","duration":794641,"timestamp":122329970292,"id":77,"parentId":37,"tags":{},"startTime":1778930302217,"traceId":"0833df250a0c9aa5"},{"name":"check-page","duration":806531,"timestamp":122329958453,"id":37,"parentId":19,"tags":{"page":"/api/hub/nodes"},"startTime":1778930302205,"traceId":"0833df250a0c9aa5"},{"name":"is-page-static","duration":798903,"timestamp":122329970374,"id":83,"parentId":44,"tags":{},"startTime":1778930302217,"traceId":"0833df250a0c9aa5"},{"name":"check-page","duration":810132,"timestamp":122329959341,"id":44,"parentId":19,"tags":{"page":"/api/hub/session"},"startTime":1778930302206,"traceId":"0833df250a0c9aa5"},{"name":"is-page-static","duration":807193,"timestamp":122329970395,"id":85,"parentId":46,"tags":{},"startTime":1778930302217,"traceId":"0833df250a0c9aa5"},{"name":"check-page","duration":818104,"timestamp":122329959533,"id":46,"parentId":19,"tags":{"page":"/api/hub/status"},"startTime":1778930302206,"traceId":"0833df250a0c9aa5"},{"name":"is-page-static","duration":815482,"timestamp":122329970409,"id":86,"parentId":47,"tags":{},"startTime":1778930302217,"traceId":"0833df250a0c9aa5"},{"name":"check-page","duration":824705,"timestamp":122329961251,"id":47,"parentId":19,"tags":{"page":"/api/hub/task-events"},"startTime":1778930302208,"traceId":"0833df250a0c9aa5"},{"name":"is-page-static","duration":824784,"timestamp":122329970422,"id":87,"parentId":48,"tags":{},"startTime":1778930302217,"traceId":"0833df250a0c9aa5"},{"name":"check-page","duration":833892,"timestamp":122329961374,"id":48,"parentId":19,"tags":{"page":"/api/hub/tasks"},"startTime":1778930302208,"traceId":"0833df250a0c9aa5"},{"name":"is-page-static","duration":829417,"timestamp":122329970431,"id":88,"parentId":49,"tags":{},"startTime":1778930302217,"traceId":"0833df250a0c9aa5"},{"name":"check-page","duration":838441,"timestamp":122329961461,"id":49,"parentId":19,"tags":{"page":"/api/hub/tmux"},"startTime":1778930302208,"traceId":"0833df250a0c9aa5"},{"name":"is-page-static","duration":834900,"timestamp":122329970443,"id":89,"parentId":50,"tags":{},"startTime":1778930302217,"traceId":"0833df250a0c9aa5"},{"name":"check-page","duration":843880,"timestamp":122329961516,"id":50,"parentId":19,"tags":{"page":"/api/hub/tokens"},"startTime":1778930302208,"traceId":"0833df250a0c9aa5"},{"name":"is-page-static","duration":840744,"timestamp":122329970382,"id":84,"parentId":45,"tags":{},"startTime":1778930302217,"traceId":"0833df250a0c9aa5"},{"name":"check-page","duration":851740,"timestamp":122329959442,"id":45,"parentId":19,"tags":{"page":"/api/hub/stats"},"startTime":1778930302206,"traceId":"0833df250a0c9aa5"},{"name":"is-page-static","duration":861494,"timestamp":122329970325,"id":79,"parentId":39,"tags":{},"startTime":1778930302217,"traceId":"0833df250a0c9aa5"},{"name":"check-page","duration":873279,"timestamp":122329958610,"id":39,"parentId":19,"tags":{"page":"/api/hub/send"},"startTime":1778930302205,"traceId":"0833df250a0c9aa5"},{"name":"is-page-static","duration":865466,"timestamp":122329970349,"id":81,"parentId":42,"tags":{},"startTime":1778930302217,"traceId":"0833df250a0c9aa5"},{"name":"check-page","duration":876963,"timestamp":122329958933,"id":42,"parentId":19,"tags":{"page":"/api/hub/server/[hostname]/health"},"startTime":1778930302205,"traceId":"0833df250a0c9aa5"},{"name":"is-page-static","duration":864031,"timestamp":122329973751,"id":91,"parentId":24,"tags":{},"startTime":1778930302220,"traceId":"0833df250a0c9aa5"},{"name":"check-page","duration":886200,"timestamp":122329951639,"id":24,"parentId":19,"tags":{"page":"/api/anet/config"},"startTime":1778930302198,"traceId":"0833df250a0c9aa5"},{"name":"is-page-static","duration":867598,"timestamp":122329970456,"id":90,"parentId":51,"tags":{},"startTime":1778930302217,"traceId":"0833df250a0c9aa5"},{"name":"check-page","duration":876530,"timestamp":122329961567,"id":51,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1778930302208,"traceId":"0833df250a0c9aa5"},{"name":"is-page-static","duration":875677,"timestamp":122329969310,"id":68,"parentId":27,"tags":{},"startTime":1778930302216,"traceId":"0833df250a0c9aa5"},{"name":"check-page","duration":890580,"timestamp":122329954487,"id":27,"parentId":19,"tags":{"page":"/api/auth/v3"},"startTime":1778930302201,"traceId":"0833df250a0c9aa5"},{"name":"is-page-static","duration":879430,"timestamp":122329975705,"id":93,"parentId":41,"tags":{},"startTime":1778930302222,"traceId":"0833df250a0c9aa5"},{"name":"check-page","duration":896454,"timestamp":122329958734,"id":41,"parentId":19,"tags":{"page":"/api/hub/server/[hostname]/agents"},"startTime":1778930302205,"traceId":"0833df250a0c9aa5"},{"name":"is-page-static","duration":907754,"timestamp":122329969902,"id":72,"parentId":32,"tags":{},"startTime":1778930302216,"traceId":"0833df250a0c9aa5"},{"name":"check-page","duration":920049,"timestamp":122329957673,"id":32,"parentId":19,"tags":{"page":"/api/hub/health"},"startTime":1778930302204,"traceId":"0833df250a0c9aa5"},{"name":"is-page-static","duration":910110,"timestamp":122329974845,"id":92,"parentId":31,"tags":{},"startTime":1778930302221,"traceId":"0833df250a0c9aa5"},{"name":"check-page","duration":927658,"timestamp":122329957402,"id":31,"parentId":19,"tags":{"page":"/api/hub/events"},"startTime":1778930302204,"traceId":"0833df250a0c9aa5"},{"name":"is-page-static","duration":911659,"timestamp":122329987253,"id":99,"parentId":56,"tags":{},"startTime":1778930302234,"traceId":"0833df250a0c9aa5"},{"name":"check-page","duration":936603,"timestamp":122329962379,"id":56,"parentId":19,"tags":{"page":"/nodes"},"startTime":1778930302209,"traceId":"0833df250a0c9aa5"},{"name":"is-page-static","duration":917351,"timestamp":122329987262,"id":100,"parentId":58,"tags":{},"startTime":1778930302234,"traceId":"0833df250a0c9aa5"},{"name":"check-page","duration":941700,"timestamp":122329962969,"id":58,"parentId":19,"tags":{"page":"/server-logs"},"startTime":1778930302209,"traceId":"0833df250a0c9aa5"},{"name":"is-page-static","duration":924976,"timestamp":122329987385,"id":101,"parentId":59,"tags":{},"startTime":1778930302234,"traceId":"0833df250a0c9aa5"},{"name":"check-page","duration":949286,"timestamp":122329963136,"id":59,"parentId":19,"tags":{"page":"/settings/networks"},"startTime":1778930302209,"traceId":"0833df250a0c9aa5"},{"name":"is-page-static","duration":926527,"timestamp":122329987226,"id":97,"parentId":54,"tags":{},"startTime":1778930302233,"traceId":"0833df250a0c9aa5"},{"name":"check-page","duration":951740,"timestamp":122329962080,"id":54,"parentId":19,"tags":{"page":"/messages"},"startTime":1778930302208,"traceId":"0833df250a0c9aa5"},{"name":"is-page-static","duration":936360,"timestamp":122329987416,"id":103,"parentId":62,"tags":{},"startTime":1778930302234,"traceId":"0833df250a0c9aa5"},{"name":"check-page","duration":960174,"timestamp":122329963657,"id":62,"parentId":19,"tags":{"page":"/tasks/[id]"},"startTime":1778930302210,"traceId":"0833df250a0c9aa5"},{"name":"is-page-static","duration":955062,"timestamp":122329969085,"id":66,"parentId":25,"tags":{},"startTime":1778930302215,"traceId":"0833df250a0c9aa5"},{"name":"check-page","duration":969976,"timestamp":122329954219,"id":25,"parentId":19,"tags":{"page":"/api/auth/login"},"startTime":1778930302200,"traceId":"0833df250a0c9aa5"},{"name":"is-page-static","duration":945661,"timestamp":122329987431,"id":104,"parentId":63,"tags":{},"startTime":1778930302234,"traceId":"0833df250a0c9aa5"},{"name":"check-page","duration":969413,"timestamp":122329963748,"id":63,"parentId":19,"tags":{"page":"/tasks"},"startTime":1778930302210,"traceId":"0833df250a0c9aa5"},{"name":"is-page-static","duration":939909,"timestamp":122329999528,"id":106,"parentId":57,"tags":{},"startTime":1778930302246,"traceId":"0833df250a0c9aa5"},{"name":"check-page","duration":976893,"timestamp":122329962590,"id":57,"parentId":19,"tags":{"page":"/"},"startTime":1778930302209,"traceId":"0833df250a0c9aa5"},{"name":"is-page-static","duration":954651,"timestamp":122329987406,"id":102,"parentId":61,"tags":{},"startTime":1778930302234,"traceId":"0833df250a0c9aa5"},{"name":"check-page","duration":978547,"timestamp":122329963560,"id":61,"parentId":19,"tags":{"page":"/settings/tokens"},"startTime":1778930302210,"traceId":"0833df250a0c9aa5"},{"name":"is-page-static","duration":958177,"timestamp":122329987238,"id":98,"parentId":55,"tags":{},"startTime":1778930302234,"traceId":"0833df250a0c9aa5"},{"name":"check-page","duration":983237,"timestamp":122329962222,"id":55,"parentId":19,"tags":{"page":"/node"},"startTime":1778930302208,"traceId":"0833df250a0c9aa5"},{"name":"is-page-static","duration":960457,"timestamp":122329987203,"id":95,"parentId":52,"tags":{},"startTime":1778930302233,"traceId":"0833df250a0c9aa5"},{"name":"check-page","duration":985857,"timestamp":122329961844,"id":52,"parentId":19,"tags":{"page":"/login"},"startTime":1778930302208,"traceId":"0833df250a0c9aa5"},{"name":"is-page-static","duration":967852,"timestamp":122329987166,"id":94,"parentId":23,"tags":{},"startTime":1778930302233,"traceId":"0833df250a0c9aa5"},{"name":"check-page","duration":1003656,"timestamp":122329951413,"id":23,"parentId":19,"tags":{"page":"/admin"},"startTime":1778930302198,"traceId":"0833df250a0c9aa5"},{"name":"is-page-static","duration":971347,"timestamp":122329987213,"id":96,"parentId":53,"tags":{},"startTime":1778930302233,"traceId":"0833df250a0c9aa5"},{"name":"check-page","duration":996667,"timestamp":122329961941,"id":53,"parentId":19,"tags":{"page":"/logs"},"startTime":1778930302208,"traceId":"0833df250a0c9aa5"},{"name":"is-page-static","duration":1017092,"timestamp":122329987444,"id":105,"parentId":60,"tags":{},"startTime":1778930302234,"traceId":"0833df250a0c9aa5"},{"name":"check-page","duration":1041342,"timestamp":122329963277,"id":60,"parentId":19,"tags":{"page":"/settings"},"startTime":1778930302210,"traceId":"0833df250a0c9aa5"},{"name":"static-check","duration":1058175,"timestamp":122329946501,"id":19,"parentId":1,"tags":{},"startTime":1778930302193,"traceId":"0833df250a0c9aa5"}]
2
+ [{"name":"write-routes-manifest","duration":555,"timestamp":122331014385,"id":108,"parentId":1,"tags":{},"startTime":1778930303261,"traceId":"0833df250a0c9aa5"},{"name":"load-dotenv","duration":60,"timestamp":122331027834,"id":111,"parentId":110,"tags":{},"startTime":1778930303274,"traceId":"0833df250a0c9aa5"},{"name":"run-export-path-map","duration":555,"timestamp":122331031117,"id":112,"parentId":110,"tags":{},"startTime":1778930303277,"traceId":"0833df250a0c9aa5"},{"name":"next-export","duration":686288,"timestamp":122331026337,"id":110,"parentId":1,"tags":{},"startTime":1778930303273,"traceId":"0833df250a0c9aa5"},{"name":"move-exported-app-not-found-","duration":537,"timestamp":122331715846,"id":113,"parentId":109,"tags":{},"startTime":1778930303962,"traceId":"0833df250a0c9aa5"},{"name":"move-exported-app-global-error-","duration":549,"timestamp":122331716497,"id":114,"parentId":109,"tags":{},"startTime":1778930303963,"traceId":"0833df250a0c9aa5"},{"name":"static-generation","duration":699580,"timestamp":122331019892,"id":109,"parentId":1,"tags":{},"startTime":1778930303266,"traceId":"0833df250a0c9aa5"},{"name":"write-routes-manifest","duration":591,"timestamp":122331719812,"id":115,"parentId":1,"tags":{},"startTime":1778930303966,"traceId":"0833df250a0c9aa5"},{"name":"print-tree-view","duration":5450,"timestamp":122331731045,"id":116,"parentId":1,"tags":{},"startTime":1778930303977,"traceId":"0833df250a0c9aa5"},{"name":"write-route-bundle-stats","duration":20046,"timestamp":122331736542,"id":117,"parentId":1,"tags":{},"startTime":1778930303983,"traceId":"0833df250a0c9aa5"},{"name":"telemetry-flush","duration":16026,"timestamp":122331756637,"id":118,"parentId":1,"tags":{},"startTime":1778930304003,"traceId":"0833df250a0c9aa5"},{"name":"next-build","duration":20788184,"timestamp":122310984527,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778930283231,"traceId":"0833df250a0c9aa5"}]
package/.next/trace-build CHANGED
@@ -1 +1 @@
1
- [{"name":"run-turbopack","duration":7524781,"timestamp":121780090131,"id":14,"parentId":1,"tags":{},"startTime":1778929752336,"traceId":"89a9eb83accb0dc0"},{"name":"turbopack-build-events","duration":113,"timestamp":121780411608,"id":15,"parentId":1,"tags":{},"startTime":1778929752658,"traceId":"89a9eb83accb0dc0"},{"name":"run-typescript","duration":13525847,"timestamp":121787627421,"id":16,"parentId":1,"tags":{},"startTime":1778929759874,"traceId":"89a9eb83accb0dc0"},{"name":"static-check","duration":1147017,"timestamp":121801394053,"id":19,"parentId":1,"tags":{},"startTime":1778929773640,"traceId":"89a9eb83accb0dc0"},{"name":"static-generation","duration":715021,"timestamp":121802555331,"id":109,"parentId":1,"tags":{},"startTime":1778929774802,"traceId":"89a9eb83accb0dc0"},{"name":"telemetry-flush","duration":18411,"timestamp":121803314239,"id":118,"parentId":1,"tags":{},"startTime":1778929775561,"traceId":"89a9eb83accb0dc0"},{"name":"next-build","duration":23499857,"timestamp":121779832830,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778929752079,"traceId":"89a9eb83accb0dc0"}]
1
+ [{"name":"run-turbopack","duration":7563636,"timestamp":122311250646,"id":14,"parentId":1,"tags":{},"startTime":1778930283497,"traceId":"0833df250a0c9aa5"},{"name":"turbopack-build-events","duration":121,"timestamp":122311593363,"id":15,"parentId":1,"tags":{},"startTime":1778930283840,"traceId":"0833df250a0c9aa5"},{"name":"run-typescript","duration":10884268,"timestamp":122318858626,"id":16,"parentId":1,"tags":{},"startTime":1778930291105,"traceId":"0833df250a0c9aa5"},{"name":"static-check","duration":1058175,"timestamp":122329946501,"id":19,"parentId":1,"tags":{},"startTime":1778930302193,"traceId":"0833df250a0c9aa5"},{"name":"static-generation","duration":699580,"timestamp":122331019892,"id":109,"parentId":1,"tags":{},"startTime":1778930303266,"traceId":"0833df250a0c9aa5"},{"name":"telemetry-flush","duration":16026,"timestamp":122331756637,"id":118,"parentId":1,"tags":{},"startTime":1778930304003,"traceId":"0833df250a0c9aa5"},{"name":"next-build","duration":20788184,"timestamp":122310984527,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778930283231,"traceId":"0833df250a0c9aa5"}]
@@ -15,7 +15,72 @@ async function hubHeaders(): Promise<Record<string, string>> {
15
15
  * agent_count, status). Per issue #119; lands in v0.8.1-preview.2 of the
16
16
  * commhub-server (通信牛). The dashboard <ServersDrawer> mounts in
17
17
  * AppShell and refreshes every 5s when expanded.
18
+ *
19
+ * v0.10.0 Hero 1+2 — normalization layer. commhub-server@0.8.1-preview.5
20
+ * (LOCAL hub upgraded 2026-05-16 per 通信龙 d627eca7) returns:
21
+ * raw array `[{hostname, ip, agent_count, cpu_load_1min, cpu_cores,
22
+ * mem_avail_gb, mem_used_gb, last_seen}, ...]`
23
+ * — without the `{servers: [...]}` envelope the dashboard's ServersDrawer
24
+ * expects. Also uses `mem_avail_gb` instead of `mem_total_gb`. This
25
+ * proxy normalizes both:
26
+ * 1. Wraps raw array in `{servers: [...]}` envelope. If hub later
27
+ * switches to that shape natively, the pass-through still works.
28
+ * 2. Computes `mem_total_gb = mem_used_gb + mem_avail_gb` when the
29
+ * hub reports avail instead of total (older shape).
30
+ * 3. Marks server `status: 'online'|'offline'` from last_seen freshness
31
+ * (within 60s = online). Hub doesn't carry an explicit status
32
+ * field in 0.8.1-preview.5.
18
33
  */
34
+
35
+ interface HubServerRow {
36
+ hostname: string;
37
+ ip?: string | null;
38
+ agent_count?: number;
39
+ cpu_load_1min?: number | null;
40
+ cpu_cores?: number | null;
41
+ mem_used_gb?: number | null;
42
+ mem_total_gb?: number | null;
43
+ mem_avail_gb?: number | null;
44
+ disk_used_gb?: number | null;
45
+ disk_total_gb?: number | null;
46
+ cpu_history?: number[];
47
+ mem_history?: number[];
48
+ agents?: unknown[];
49
+ last_seen?: string | null;
50
+ status?: 'online' | 'offline';
51
+ note?: string;
52
+ }
53
+
54
+ function freshnessStatus(lastSeen: string | null | undefined): 'online' | 'offline' {
55
+ if (!lastSeen) return 'offline';
56
+ const t = Date.parse(lastSeen);
57
+ if (Number.isNaN(t)) return 'offline';
58
+ return Date.now() - t < 60_000 ? 'online' : 'offline';
59
+ }
60
+
61
+ function normalizeServer(row: HubServerRow) {
62
+ const memTotal = row.mem_total_gb ??
63
+ (row.mem_used_gb != null && row.mem_avail_gb != null
64
+ ? row.mem_used_gb + row.mem_avail_gb
65
+ : null);
66
+ return {
67
+ hostname: row.hostname,
68
+ ip: row.ip ?? null,
69
+ agent_count: row.agent_count ?? 0,
70
+ cpu_load_1min: row.cpu_load_1min ?? null,
71
+ cpu_cores: row.cpu_cores ?? 0,
72
+ mem_used_gb: row.mem_used_gb ?? null,
73
+ mem_total_gb: memTotal,
74
+ disk_used_gb: row.disk_used_gb ?? null,
75
+ disk_total_gb: row.disk_total_gb ?? null,
76
+ cpu_history: row.cpu_history,
77
+ mem_history: row.mem_history,
78
+ agents: row.agents,
79
+ status: row.status ?? freshnessStatus(row.last_seen),
80
+ note: row.note,
81
+ };
82
+ }
83
+
19
84
  export async function GET() {
20
85
  const authFailure = await requireDashboardAuth();
21
86
  if (authFailure) return authFailure;
@@ -32,7 +97,18 @@ export async function GET() {
32
97
  if (res.status === 404) return Response.json({ servers: [], unavailable: true });
33
98
  return Response.json({ error: `hub ${res.status}` }, { status: res.status });
34
99
  }
35
- return Response.json(await res.json());
100
+ const raw = await res.json();
101
+ // Accept both shapes: bare array (0.8.1-preview.5) or {servers: [...]}
102
+ // wrapper (future hub revisions).
103
+ const rows: HubServerRow[] = Array.isArray(raw)
104
+ ? raw
105
+ : Array.isArray(raw?.servers)
106
+ ? raw.servers
107
+ : [];
108
+ return Response.json({
109
+ servers: rows.map(normalizeServer),
110
+ unavailable: raw?.unavailable === true,
111
+ });
36
112
  } catch (e: unknown) {
37
113
  return Response.json({ error: 'hub unreachable', detail: e instanceof Error ? e.message : String(e) }, { status: 502 });
38
114
  }
@@ -2128,7 +2128,7 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
2128
2128
  cursor: 'pointer',
2129
2129
  }}
2130
2130
  >
2131
- <span><span className="hidden sm:inline" data-filter-prefix>filter: </span>{pinnedStatus}<span className="opacity-70"> · {matchCount}</span></span>
2131
+ <span><span className="hidden sm:inline" data-filter-prefix>filter: </span>{pinnedStatus}<span className="opacity-70 tabular-nums" data-filter-pill-count> · {matchCount}</span></span>
2132
2132
  <button
2133
2133
  type="button"
2134
2134
  aria-label={`Clear ${pinnedStatus} filter`}
@@ -2162,7 +2162,7 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
2162
2162
  cursor: 'pointer',
2163
2163
  }}
2164
2164
  >
2165
- <span><span className="hidden sm:inline" data-filter-prefix>filter: </span>{pinnedGroup}<span className="opacity-70"> · {matchCount}</span></span>
2165
+ <span><span className="hidden sm:inline" data-filter-prefix>filter: </span>{pinnedGroup}<span className="opacity-70 tabular-nums" data-filter-pill-count> · {matchCount}</span></span>
2166
2166
  <button
2167
2167
  type="button"
2168
2168
  aria-label={`Clear group filter ${pinnedGroup}`}
@@ -2212,7 +2212,7 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
2212
2212
  cursor: 'pointer',
2213
2213
  }}
2214
2214
  >
2215
- <span><span className="hidden sm:inline" data-filter-prefix>filter: </span>{pinnedVendor}<span className="opacity-70"> · {matchCount}</span></span>
2215
+ <span><span className="hidden sm:inline" data-filter-prefix>filter: </span>{pinnedVendor}<span className="opacity-70 tabular-nums" data-filter-pill-count> · {matchCount}</span></span>
2216
2216
  <button
2217
2217
  type="button"
2218
2218
  aria-label={`Clear vendor filter ${pinnedVendor}`}
@@ -2263,16 +2263,29 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
2263
2263
  <span>
2264
2264
  <span className="hidden sm:inline" data-filter-prefix>filter: </span>
2265
2265
  {link.from}→{link.to}
2266
+ {/* Round 323 / Loop: edge filter pill count digit picks
2267
+ up tabular-nums (Tailwind class on both cold +
2268
+ hot branches). Sibling treatment to the status /
2269
+ group / vendor pin pills (R323 replace_all upstream
2270
+ in this same round added `tabular-nums` to those
2271
+ three pills' count spans). Pre-R323 a matchCount /
2272
+ link.count crossing 9→10 widened the digit and
2273
+ shifted the trailing × button right ~3px in font-
2274
+ mono (mono digits still have natural-vs-tabular
2275
+ variance). Locks the slot so the × button stays
2276
+ planted as the count grows. 9th surface in the
2277
+ info-density tabular-nums sweep after R322 panel
2278
+ hot count. */}
2266
2279
  {isHot ? (
2267
2280
  <span
2268
- className="opacity-90"
2281
+ className="opacity-90 tabular-nums"
2269
2282
  style={{ color: hotStroke, fontWeight: 700 }}
2270
2283
  data-active-filter-edge-count-hot
2271
2284
  >
2272
2285
  {' · '}{link.count}
2273
2286
  </span>
2274
2287
  ) : (
2275
- <span className="opacity-70" data-active-filter-edge-count>
2288
+ <span className="opacity-70 tabular-nums" data-active-filter-edge-count>
2276
2289
  {' · '}{link.count}
2277
2290
  </span>
2278
2291
  )}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sleep2agi/agent-network-dashboard",
3
- "version": "0.4.6-preview.362",
3
+ "version": "0.4.6-preview.363",
4
4
  "description": "Agent Network Dashboard — Web UI for managing AI Agent networks",
5
5
  "scripts": {
6
6
  "dev": "next dev",
@@ -0,0 +1,135 @@
1
+ /* Round 323 verification: filter pin pill count spans (status /
2
+ * group / vendor) AND edge filter pill count (cold + hot) all pick
3
+ * up Tailwind `tabular-nums` class. Pre-R323 the count digit
4
+ * (matchCount or link.count) widened 9→10 / 99→100 even in font-mono
5
+ * because mono fonts still have natural-vs-tabular variance; the
6
+ * trailing × clear-button shifted right a couple px.
7
+ *
8
+ * 9th surface in the info-density tabular-nums sweep:
9
+ * R224 edge badge
10
+ * R225 hub digit / panel flows-count / recent-row count
11
+ * R229 group-label count
12
+ * R230 group-label status pips
13
+ * R320 recent-row count fw=600 (left neighbour)
14
+ * R321 recent-row timestamp
15
+ * R322 panel hot count
16
+ * R323 filter pill counts (status + group + vendor + edge×2)
17
+ *
18
+ * Contract:
19
+ * - All 5 patterns gain `tabular-nums`. We can probe via a
20
+ * scenario that activates the status pin (simplest), then
21
+ * check the resulting [data-filter-pill-count] element.
22
+ * - Each `[data-filter-pill-count]` has computed
23
+ * fontVariantNumeric containing 'tabular-nums'.
24
+ * - The edge pill count test is best-effort — only active when
25
+ * a flow is pinned via R116; we don't simulate pin in this
26
+ * test, so we accept its absence.
27
+ * - R322 hot tabular + R321 ts tabular regressions intact.
28
+ * - R317/R318/R294 chrome + pulse regressions intact.
29
+ *
30
+ * Fixture: 2 working sessions, 2 idle sessions — pin status='idle'
31
+ * via initial localStorage so the status filter pill is visible.
32
+ */
33
+ import { chromium } from 'playwright';
34
+ import { readFileSync } from 'node:fs';
35
+
36
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
37
+ const browser = await chromium.launch({ headless: true });
38
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1500 } });
39
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
40
+ await ctx.addInitScript(() => {
41
+ try {
42
+ localStorage.setItem('anet-theme', 'cyber');
43
+ sessionStorage.setItem('anet_v3_auth', '1');
44
+ } catch {}
45
+ });
46
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
47
+ await ctx.route('**/api/hub/status*', async (route) => {
48
+ const r = await route.fetch();
49
+ const b = await r.json();
50
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
51
+ const mk = (alias, status) => ({
52
+ alias, status, model: 'claude-opus-4', runtime: 'claude-code-cli',
53
+ network_id: nid, project_dir: null,
54
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
55
+ });
56
+ await route.fulfill({ response: r, json: { ...b, sessions: [
57
+ mk('alpha-1', 'working'),
58
+ mk('alpha-2', 'idle'),
59
+ mk('beta-1', 'working'),
60
+ mk('beta-2', 'idle'),
61
+ ] } });
62
+ });
63
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
64
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
65
+
66
+ const page = await ctx.newPage();
67
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
68
+ await page.waitForFunction(() => document.querySelectorAll('g[data-node]').length === 4, { timeout: 20000 });
69
+ await page.waitForTimeout(300);
70
+
71
+ // Programmatically trigger a status pin by clicking on the working
72
+ // status legend row. R64 pin handler responds to legend clicks.
73
+ // Best-effort: if the click target is not exposed, fall back to
74
+ // the chip-row "working chip" click which also triggers pinning.
75
+ await page.click('[data-working-chip]', { delay: 50 }).catch(() => {});
76
+ await page.waitForTimeout(400);
77
+
78
+ const probe = await page.evaluate(() => {
79
+ const pillCounts = Array.from(document.querySelectorAll('[data-filter-pill-count]'));
80
+ const edgeColdCount = document.querySelector('[data-active-filter-edge-count]');
81
+ const edgeHotCount = document.querySelector('[data-active-filter-edge-count-hot]');
82
+ const recentRowTs = document.querySelector('[data-recent-row-ts]');
83
+ const recentRowCount = document.querySelector('[data-recent-row-count]');
84
+ const recentPanelHot = document.querySelector('[data-recent-panel-hot-count]');
85
+
86
+ const cs = (el) => el ? getComputedStyle(el).fontVariantNumeric : null;
87
+
88
+ return {
89
+ pillCount: pillCounts.length,
90
+ pillCountAllTabular: pillCounts.every(p => /tabular-nums/.test(getComputedStyle(p).fontVariantNumeric || '')),
91
+ pillTexts: pillCounts.map(p => p.textContent),
92
+ edgeColdTabular: edgeColdCount ? cs(edgeColdCount) : null,
93
+ edgeHotTabular: edgeHotCount ? cs(edgeHotCount) : null,
94
+ edgeColdClass: edgeColdCount?.className ?? null,
95
+ edgeHotClass: edgeHotCount?.className ?? null,
96
+ recentRowTsTabular: cs(recentRowTs),
97
+ recentRowCountFw: recentRowCount ? getComputedStyle(recentRowCount).fontWeight : null,
98
+ recentPanelHotTab: cs(recentPanelHot),
99
+ layoutInactiveCls: document.querySelector('[data-topo-chrome-layout="grid"]')?.className ?? '',
100
+ layoutActiveCls: document.querySelector('[data-topo-chrome-layout="ring"]')?.className ?? '',
101
+ pulseCount: document.querySelectorAll('[data-pulse-wrapper]').length,
102
+ };
103
+ });
104
+ await browser.close();
105
+
106
+ const hasTab = (s) => /tabular-nums/.test(s || '');
107
+ const classHasTab = (s) => /tabular-nums/.test(s || '');
108
+
109
+ const results = {
110
+ // At least one filter pill count visible after click (the status pin).
111
+ pill_count_present: probe.pillCount >= 1,
112
+ pill_count_all_tabular: probe.pillCountAllTabular,
113
+ // The edge pills are not triggered in this test, but their CLASS
114
+ // attribute should already include `tabular-nums` from R323 even
115
+ // if not rendered (best-effort source-level probe via a snapshot
116
+ // of an active pill is not possible without simulating R116 pin).
117
+ // We accept presence-or-absence here; the main contract is the
118
+ // status/group/vendor pills.
119
+ // R322 / R321 regressions — both surfaces depend on recent-signal
120
+ // panel rendering, which requires messages. Fixture here has zero
121
+ // messages (only sessions for the pin click), so accept null OR
122
+ // tabular for both. The R322 regression is primarily covered by
123
+ // topo-recent-panel-hot-tabular-test which forces messages.
124
+ r322_panel_hot_tabular_or_absent: probe.recentPanelHotTab === null || hasTab(probe.recentPanelHotTab),
125
+ r321_ts_tabular_or_absent: probe.recentRowTsTabular === null || hasTab(probe.recentRowTsTabular),
126
+ // R317/R318 chrome regression.
127
+ r317_inactive_gray_400: probe.layoutInactiveCls.includes('text-gray-400'),
128
+ r318_active_font_medium: probe.layoutActiveCls.includes('font-medium'),
129
+ r294_pulse_absent: probe.pulseCount === 0,
130
+ };
131
+ const ok = Object.values(results).every(Boolean);
132
+ console.log(`${ok ? '✅' : '❌'} filter pill count tabular:`, JSON.stringify(results),
133
+ '\n pill count visible:', probe.pillCount,
134
+ '\n pill texts:', probe.pillTexts);
135
+ process.exit(ok ? 0 : 1);