@sleep2agi/agent-network-dashboard 0.4.6-preview.280 → 0.4.6-preview.282

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 (141) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +3 -3
  3. package/.next/diagnostics/route-bundle-stats.json +4 -4
  4. package/.next/fallback-build-manifest.json +3 -3
  5. package/.next/server/app/_global-error.html +1 -1
  6. package/.next/server/app/_global-error.rsc +1 -1
  7. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  8. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  12. package/.next/server/app/_not-found.html +1 -1
  13. package/.next/server/app/_not-found.rsc +1 -1
  14. package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  15. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  16. package/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  17. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  18. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  19. package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  20. package/.next/server/app/admin.html +1 -1
  21. package/.next/server/app/admin.rsc +1 -1
  22. package/.next/server/app/admin.segments/_full.segment.rsc +1 -1
  23. package/.next/server/app/admin.segments/_head.segment.rsc +1 -1
  24. package/.next/server/app/admin.segments/_index.segment.rsc +1 -1
  25. package/.next/server/app/admin.segments/_tree.segment.rsc +1 -1
  26. package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +1 -1
  27. package/.next/server/app/admin.segments/admin.segment.rsc +1 -1
  28. package/.next/server/app/index.html +2 -2
  29. package/.next/server/app/index.rsc +2 -2
  30. package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  31. package/.next/server/app/index.segments/_full.segment.rsc +2 -2
  32. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  33. package/.next/server/app/index.segments/_index.segment.rsc +1 -1
  34. package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  35. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  36. package/.next/server/app/login.html +2 -2
  37. package/.next/server/app/login.rsc +2 -2
  38. package/.next/server/app/login.segments/_full.segment.rsc +2 -2
  39. package/.next/server/app/login.segments/_head.segment.rsc +1 -1
  40. package/.next/server/app/login.segments/_index.segment.rsc +1 -1
  41. package/.next/server/app/login.segments/_tree.segment.rsc +1 -1
  42. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  43. package/.next/server/app/login.segments/login.segment.rsc +1 -1
  44. package/.next/server/app/logs.html +1 -1
  45. package/.next/server/app/logs.rsc +1 -1
  46. package/.next/server/app/logs.segments/_full.segment.rsc +1 -1
  47. package/.next/server/app/logs.segments/_head.segment.rsc +1 -1
  48. package/.next/server/app/logs.segments/_index.segment.rsc +1 -1
  49. package/.next/server/app/logs.segments/_tree.segment.rsc +1 -1
  50. package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +1 -1
  51. package/.next/server/app/logs.segments/logs.segment.rsc +1 -1
  52. package/.next/server/app/messages.html +1 -1
  53. package/.next/server/app/messages.rsc +1 -1
  54. package/.next/server/app/messages.segments/_full.segment.rsc +1 -1
  55. package/.next/server/app/messages.segments/_head.segment.rsc +1 -1
  56. package/.next/server/app/messages.segments/_index.segment.rsc +1 -1
  57. package/.next/server/app/messages.segments/_tree.segment.rsc +1 -1
  58. package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +1 -1
  59. package/.next/server/app/messages.segments/messages.segment.rsc +1 -1
  60. package/.next/server/app/node.html +1 -1
  61. package/.next/server/app/node.rsc +1 -1
  62. package/.next/server/app/node.segments/_full.segment.rsc +1 -1
  63. package/.next/server/app/node.segments/_head.segment.rsc +1 -1
  64. package/.next/server/app/node.segments/_index.segment.rsc +1 -1
  65. package/.next/server/app/node.segments/_tree.segment.rsc +1 -1
  66. package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +1 -1
  67. package/.next/server/app/node.segments/node.segment.rsc +1 -1
  68. package/.next/server/app/nodes.html +1 -1
  69. package/.next/server/app/nodes.rsc +1 -1
  70. package/.next/server/app/nodes.segments/_full.segment.rsc +1 -1
  71. package/.next/server/app/nodes.segments/_head.segment.rsc +1 -1
  72. package/.next/server/app/nodes.segments/_index.segment.rsc +1 -1
  73. package/.next/server/app/nodes.segments/_tree.segment.rsc +1 -1
  74. package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +1 -1
  75. package/.next/server/app/nodes.segments/nodes.segment.rsc +1 -1
  76. package/.next/server/app/page_client-reference-manifest.js +1 -1
  77. package/.next/server/app/server-logs.html +1 -1
  78. package/.next/server/app/server-logs.rsc +1 -1
  79. package/.next/server/app/server-logs.segments/_full.segment.rsc +1 -1
  80. package/.next/server/app/server-logs.segments/_head.segment.rsc +1 -1
  81. package/.next/server/app/server-logs.segments/_index.segment.rsc +1 -1
  82. package/.next/server/app/server-logs.segments/_tree.segment.rsc +1 -1
  83. package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +1 -1
  84. package/.next/server/app/server-logs.segments/server-logs.segment.rsc +1 -1
  85. package/.next/server/app/settings/networks.html +1 -1
  86. package/.next/server/app/settings/networks.rsc +1 -1
  87. package/.next/server/app/settings/networks.segments/_full.segment.rsc +1 -1
  88. package/.next/server/app/settings/networks.segments/_head.segment.rsc +1 -1
  89. package/.next/server/app/settings/networks.segments/_index.segment.rsc +1 -1
  90. package/.next/server/app/settings/networks.segments/_tree.segment.rsc +1 -1
  91. package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +1 -1
  92. package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +1 -1
  93. package/.next/server/app/settings/networks.segments/settings.segment.rsc +1 -1
  94. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  95. package/.next/server/app/settings/tokens.html +1 -1
  96. package/.next/server/app/settings/tokens.rsc +1 -1
  97. package/.next/server/app/settings/tokens.segments/_full.segment.rsc +1 -1
  98. package/.next/server/app/settings/tokens.segments/_head.segment.rsc +1 -1
  99. package/.next/server/app/settings/tokens.segments/_index.segment.rsc +1 -1
  100. package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +1 -1
  101. package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +1 -1
  102. package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +1 -1
  103. package/.next/server/app/settings/tokens.segments/settings.segment.rsc +1 -1
  104. package/.next/server/app/settings.html +2 -2
  105. package/.next/server/app/settings.rsc +2 -2
  106. package/.next/server/app/settings.segments/_full.segment.rsc +2 -2
  107. package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  108. package/.next/server/app/settings.segments/_index.segment.rsc +1 -1
  109. package/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
  110. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +2 -2
  111. package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  112. package/.next/server/app/tasks.html +1 -1
  113. package/.next/server/app/tasks.rsc +1 -1
  114. package/.next/server/app/tasks.segments/_full.segment.rsc +1 -1
  115. package/.next/server/app/tasks.segments/_head.segment.rsc +1 -1
  116. package/.next/server/app/tasks.segments/_index.segment.rsc +1 -1
  117. package/.next/server/app/tasks.segments/_tree.segment.rsc +1 -1
  118. package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +1 -1
  119. package/.next/server/app/tasks.segments/tasks.segment.rsc +1 -1
  120. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js +2 -2
  121. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js.map +1 -1
  122. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js +1 -1
  123. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js.map +1 -1
  124. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js +1 -1
  125. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js.map +1 -1
  126. package/.next/server/middleware-build-manifest.js +3 -3
  127. package/.next/server/pages/404.html +1 -1
  128. package/.next/server/pages/500.html +1 -1
  129. package/.next/static/chunks/{0g~epaflwnl2_.js → 0.17023t0q5iy.js} +1 -1
  130. package/.next/static/chunks/{10am04t1.vng-.js → 0my515m3gk_js.js} +3 -3
  131. package/.next/static/chunks/{07-se8kincki8.js → 15v_s2m~-o.q-.js} +1 -1
  132. package/.next/trace +2 -2
  133. package/.next/trace-build +1 -1
  134. package/app/components/TopoGraph.tsx +37 -1
  135. package/package.json +1 -1
  136. package/scripts/topo-freshness-conditional-render-test.mjs +92 -0
  137. package/scripts/topo-legend-count-tabular-test.mjs +87 -0
  138. package/scripts/topo-freshness-text-color-coherence-test.mjs +0 -97
  139. /package/.next/static/{3p-KUaM1iXZ5ooi8BuSwP → jm9NWDYTm3hLXINnznnDk}/_buildManifest.js +0 -0
  140. /package/.next/static/{3p-KUaM1iXZ5ooi8BuSwP → jm9NWDYTm3hLXINnznnDk}/_clientMiddlewareManifest.js +0 -0
  141. /package/.next/static/{3p-KUaM1iXZ5ooi8BuSwP → jm9NWDYTm3hLXINnznnDk}/_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.280"],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.282"],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":272,"timestamp":102224997651,"id":4,"parentId":1,"tags":{},"startTime":1778910197244,"traceId":"61d19d6bfc8851ca"},{"name":"load-custom-routes","duration":449,"timestamp":102224998102,"id":5,"parentId":1,"tags":{},"startTime":1778910197244,"traceId":"61d19d6bfc8851ca"},{"name":"create-dist-dir","duration":712,"timestamp":102224998591,"id":6,"parentId":1,"tags":{},"startTime":1778910197245,"traceId":"61d19d6bfc8851ca"},{"name":"clean","duration":35921,"timestamp":102224999963,"id":7,"parentId":1,"tags":{},"startTime":1778910197246,"traceId":"61d19d6bfc8851ca"},{"name":"discover-routes","duration":8640,"timestamp":102225123090,"id":8,"parentId":1,"tags":{},"startTime":1778910197369,"traceId":"61d19d6bfc8851ca"},{"name":"create-root-mapping","duration":132,"timestamp":102225131793,"id":9,"parentId":1,"tags":{},"startTime":1778910197378,"traceId":"61d19d6bfc8851ca"},{"name":"generate-route-types","duration":41300,"timestamp":102225134343,"id":10,"parentId":1,"tags":{},"startTime":1778910197381,"traceId":"61d19d6bfc8851ca"},{"name":"public-dir-conflict-check","duration":101,"timestamp":102225175739,"id":11,"parentId":1,"tags":{},"startTime":1778910197422,"traceId":"61d19d6bfc8851ca"},{"name":"generate-routes-manifest","duration":4436,"timestamp":102225175979,"id":12,"parentId":1,"tags":{},"startTime":1778910197422,"traceId":"61d19d6bfc8851ca"},{"name":"run-turbopack","duration":5758092,"timestamp":102225186894,"id":14,"parentId":1,"tags":{},"startTime":1778910197433,"traceId":"61d19d6bfc8851ca"},{"name":"turbopack-build-events","duration":74,"timestamp":102225472613,"id":15,"parentId":1,"tags":{},"startTime":1778910197719,"traceId":"61d19d6bfc8851ca"},{"name":"run-typescript","duration":9213824,"timestamp":102230953656,"id":16,"parentId":1,"tags":{},"startTime":1778910203200,"traceId":"61d19d6bfc8851ca"},{"name":"generate-required-server-files","duration":2532,"timestamp":102240168560,"id":18,"parentId":1,"tags":{},"startTime":1778910212415,"traceId":"61d19d6bfc8851ca"},{"name":"check-static-error-page","duration":11966,"timestamp":102240350495,"id":20,"parentId":19,"tags":{},"startTime":1778910212597,"traceId":"61d19d6bfc8851ca"},{"name":"is-page-static","duration":471021,"timestamp":102240366042,"id":63,"parentId":22,"tags":{},"startTime":1778910212612,"traceId":"61d19d6bfc8851ca"},{"name":"check-page","duration":484005,"timestamp":102240353439,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1778910212600,"traceId":"61d19d6bfc8851ca"},{"name":"is-page-static","duration":557632,"timestamp":102240366554,"id":67,"parentId":28,"tags":{},"startTime":1778910212613,"traceId":"61d19d6bfc8851ca"},{"name":"check-page","duration":568016,"timestamp":102240356273,"id":28,"parentId":19,"tags":{"page":"/api/hub/audit-log"},"startTime":1778910212603,"traceId":"61d19d6bfc8851ca"},{"name":"is-page-static","duration":564110,"timestamp":102240366198,"id":64,"parentId":25,"tags":{},"startTime":1778910212612,"traceId":"61d19d6bfc8851ca"},{"name":"check-page","duration":574416,"timestamp":102240355962,"id":25,"parentId":19,"tags":{"page":"/api/auth/login"},"startTime":1778910212602,"traceId":"61d19d6bfc8851ca"},{"name":"is-page-static","duration":589473,"timestamp":102240366874,"id":70,"parentId":32,"tags":{},"startTime":1778910212613,"traceId":"61d19d6bfc8851ca"},{"name":"check-page","duration":599686,"timestamp":102240356741,"id":32,"parentId":19,"tags":{"page":"/api/hub/health"},"startTime":1778910212603,"traceId":"61d19d6bfc8851ca"},{"name":"is-page-static","duration":591025,"timestamp":102240365613,"id":62,"parentId":21,"tags":{},"startTime":1778910212612,"traceId":"61d19d6bfc8851ca"},{"name":"check-page","duration":604821,"timestamp":102240351870,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1778910212598,"traceId":"61d19d6bfc8851ca"},{"name":"is-page-static","duration":599519,"timestamp":102240366923,"id":71,"parentId":33,"tags":{},"startTime":1778910212613,"traceId":"61d19d6bfc8851ca"},{"name":"check-page","duration":609666,"timestamp":102240356834,"id":33,"parentId":19,"tags":{"page":"/api/hub/inbox"},"startTime":1778910212603,"traceId":"61d19d6bfc8851ca"},{"name":"is-page-static","duration":602941,"timestamp":102240366973,"id":72,"parentId":34,"tags":{},"startTime":1778910212613,"traceId":"61d19d6bfc8851ca"},{"name":"check-page","duration":613038,"timestamp":102240356929,"id":34,"parentId":19,"tags":{"page":"/api/hub/license"},"startTime":1778910212603,"traceId":"61d19d6bfc8851ca"},{"name":"is-page-static","duration":605319,"timestamp":102240367092,"id":74,"parentId":36,"tags":{},"startTime":1778910212613,"traceId":"61d19d6bfc8851ca"},{"name":"check-page","duration":615026,"timestamp":102240357428,"id":36,"parentId":19,"tags":{"page":"/api/hub/networks"},"startTime":1778910212604,"traceId":"61d19d6bfc8851ca"},{"name":"is-page-static","duration":606518,"timestamp":102240366388,"id":66,"parentId":27,"tags":{},"startTime":1778910212613,"traceId":"61d19d6bfc8851ca"},{"name":"check-page","duration":616751,"timestamp":102240356199,"id":27,"parentId":19,"tags":{"page":"/api/auth/v3"},"startTime":1778910212602,"traceId":"61d19d6bfc8851ca"},{"name":"is-page-static","duration":607474,"timestamp":102240367119,"id":75,"parentId":37,"tags":{},"startTime":1778910212613,"traceId":"61d19d6bfc8851ca"},{"name":"check-page","duration":617039,"timestamp":102240357593,"id":37,"parentId":19,"tags":{"page":"/api/hub/nodes"},"startTime":1778910212604,"traceId":"61d19d6bfc8851ca"},{"name":"is-page-static","duration":610794,"timestamp":102240367140,"id":77,"parentId":39,"tags":{},"startTime":1778910212613,"traceId":"61d19d6bfc8851ca"},{"name":"check-page","duration":620208,"timestamp":102240357762,"id":39,"parentId":19,"tags":{"page":"/api/hub/send"},"startTime":1778910212604,"traceId":"61d19d6bfc8851ca"},{"name":"is-page-static","duration":612326,"timestamp":102240367150,"id":78,"parentId":40,"tags":{},"startTime":1778910212613,"traceId":"61d19d6bfc8851ca"},{"name":"check-page","duration":621685,"timestamp":102240357834,"id":40,"parentId":19,"tags":{"page":"/api/hub/server-logs"},"startTime":1778910212604,"traceId":"61d19d6bfc8851ca"},{"name":"is-page-static","duration":617073,"timestamp":102240367166,"id":80,"parentId":42,"tags":{},"startTime":1778910212613,"traceId":"61d19d6bfc8851ca"},{"name":"check-page","duration":626269,"timestamp":102240358013,"id":42,"parentId":19,"tags":{"page":"/api/hub/session"},"startTime":1778910212604,"traceId":"61d19d6bfc8851ca"},{"name":"is-page-static","duration":620133,"timestamp":102240367129,"id":76,"parentId":38,"tags":{},"startTime":1778910212613,"traceId":"61d19d6bfc8851ca"},{"name":"check-page","duration":629611,"timestamp":102240357691,"id":38,"parentId":19,"tags":{"page":"/api/hub/register"},"startTime":1778910212604,"traceId":"61d19d6bfc8851ca"},{"name":"is-page-static","duration":622326,"timestamp":102240366304,"id":65,"parentId":26,"tags":{},"startTime":1778910212613,"traceId":"61d19d6bfc8851ca"},{"name":"check-page","duration":632564,"timestamp":102240356110,"id":26,"parentId":19,"tags":{"page":"/api/auth/logout"},"startTime":1778910212602,"traceId":"61d19d6bfc8851ca"},{"name":"is-page-static","duration":621651,"timestamp":102240367176,"id":81,"parentId":43,"tags":{},"startTime":1778910212613,"traceId":"61d19d6bfc8851ca"},{"name":"check-page","duration":630789,"timestamp":102240358087,"id":43,"parentId":19,"tags":{"page":"/api/hub/stats"},"startTime":1778910212604,"traceId":"61d19d6bfc8851ca"},{"name":"is-page-static","duration":624778,"timestamp":102240366661,"id":68,"parentId":29,"tags":{},"startTime":1778910212613,"traceId":"61d19d6bfc8851ca"},{"name":"check-page","duration":635148,"timestamp":102240356343,"id":29,"parentId":19,"tags":{"page":"/api/hub/auth"},"startTime":1778910212603,"traceId":"61d19d6bfc8851ca"},{"name":"is-page-static","duration":626272,"timestamp":102240367203,"id":84,"parentId":46,"tags":{},"startTime":1778910212613,"traceId":"61d19d6bfc8851ca"},{"name":"check-page","duration":635228,"timestamp":102240358288,"id":46,"parentId":19,"tags":{"page":"/api/hub/tasks"},"startTime":1778910212605,"traceId":"61d19d6bfc8851ca"},{"name":"is-page-static","duration":626952,"timestamp":102240367193,"id":83,"parentId":45,"tags":{},"startTime":1778910212613,"traceId":"61d19d6bfc8851ca"},{"name":"check-page","duration":635962,"timestamp":102240358222,"id":45,"parentId":19,"tags":{"page":"/api/hub/task-events"},"startTime":1778910212604,"traceId":"61d19d6bfc8851ca"},{"name":"is-page-static","duration":628203,"timestamp":102240367187,"id":82,"parentId":44,"tags":{},"startTime":1778910212613,"traceId":"61d19d6bfc8851ca"},{"name":"check-page","duration":637275,"timestamp":102240358152,"id":44,"parentId":19,"tags":{"page":"/api/hub/status"},"startTime":1778910212604,"traceId":"61d19d6bfc8851ca"},{"name":"is-page-static","duration":633469,"timestamp":102240367160,"id":79,"parentId":41,"tags":{},"startTime":1778910212613,"traceId":"61d19d6bfc8851ca"},{"name":"check-page","duration":642756,"timestamp":102240357913,"id":41,"parentId":19,"tags":{"page":"/api/hub/servers"},"startTime":1778910212604,"traceId":"61d19d6bfc8851ca"},{"name":"is-page-static","duration":633569,"timestamp":102240367225,"id":86,"parentId":48,"tags":{},"startTime":1778910212613,"traceId":"61d19d6bfc8851ca"},{"name":"check-page","duration":642367,"timestamp":102240358452,"id":48,"parentId":19,"tags":{"page":"/api/hub/tokens"},"startTime":1778910212605,"traceId":"61d19d6bfc8851ca"},{"name":"is-page-static","duration":637083,"timestamp":102240370979,"id":88,"parentId":24,"tags":{},"startTime":1778910212617,"traceId":"61d19d6bfc8851ca"},{"name":"check-page","duration":654186,"timestamp":102240353920,"id":24,"parentId":19,"tags":{"page":"/api/anet/config"},"startTime":1778910212600,"traceId":"61d19d6bfc8851ca"},{"name":"is-page-static","duration":641045,"timestamp":102240367231,"id":87,"parentId":49,"tags":{},"startTime":1778910212614,"traceId":"61d19d6bfc8851ca"},{"name":"check-page","duration":649781,"timestamp":102240358525,"id":49,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1778910212605,"traceId":"61d19d6bfc8851ca"},{"name":"is-page-static","duration":641861,"timestamp":102240367213,"id":85,"parentId":47,"tags":{},"startTime":1778910212613,"traceId":"61d19d6bfc8851ca"},{"name":"check-page","duration":650733,"timestamp":102240358379,"id":47,"parentId":19,"tags":{"page":"/api/hub/tmux"},"startTime":1778910212605,"traceId":"61d19d6bfc8851ca"},{"name":"is-page-static","duration":643628,"timestamp":102240366753,"id":69,"parentId":30,"tags":{},"startTime":1778910212613,"traceId":"61d19d6bfc8851ca"},{"name":"check-page","duration":653980,"timestamp":102240356439,"id":30,"parentId":19,"tags":{"page":"/api/hub/broadcast"},"startTime":1778910212603,"traceId":"61d19d6bfc8851ca"},{"name":"is-page-static","duration":662453,"timestamp":102240366992,"id":73,"parentId":35,"tags":{},"startTime":1778910212613,"traceId":"61d19d6bfc8851ca"},{"name":"check-page","duration":672501,"timestamp":102240357038,"id":35,"parentId":19,"tags":{"page":"/api/hub/messages"},"startTime":1778910212603,"traceId":"61d19d6bfc8851ca"},{"name":"is-page-static","duration":662198,"timestamp":102240372179,"id":89,"parentId":31,"tags":{},"startTime":1778910212618,"traceId":"61d19d6bfc8851ca"},{"name":"check-page","duration":677908,"timestamp":102240356528,"id":31,"parentId":19,"tags":{"page":"/api/hub/events"},"startTime":1778910212603,"traceId":"61d19d6bfc8851ca"},{"name":"is-page-static","duration":660529,"timestamp":102240378924,"id":95,"parentId":54,"tags":{},"startTime":1778910212625,"traceId":"61d19d6bfc8851ca"},{"name":"check-page","duration":679970,"timestamp":102240359532,"id":54,"parentId":19,"tags":{"page":"/nodes"},"startTime":1778910212606,"traceId":"61d19d6bfc8851ca"},{"name":"is-page-static","duration":669641,"timestamp":102240378953,"id":97,"parentId":57,"tags":{},"startTime":1778910212625,"traceId":"61d19d6bfc8851ca"},{"name":"check-page","duration":688223,"timestamp":102240360421,"id":57,"parentId":19,"tags":{"page":"/settings/networks"},"startTime":1778910212607,"traceId":"61d19d6bfc8851ca"},{"name":"is-page-static","duration":679248,"timestamp":102240378969,"id":98,"parentId":59,"tags":{},"startTime":1778910212625,"traceId":"61d19d6bfc8851ca"},{"name":"check-page","duration":697296,"timestamp":102240360979,"id":59,"parentId":19,"tags":{"page":"/settings/tokens"},"startTime":1778910212607,"traceId":"61d19d6bfc8851ca"},{"name":"is-page-static","duration":692630,"timestamp":102240378986,"id":99,"parentId":60,"tags":{},"startTime":1778910212625,"traceId":"61d19d6bfc8851ca"},{"name":"check-page","duration":710517,"timestamp":102240361167,"id":60,"parentId":19,"tags":{"page":"/tasks/[id]"},"startTime":1778910212607,"traceId":"61d19d6bfc8851ca"},{"name":"is-page-static","duration":692956,"timestamp":102240378891,"id":93,"parentId":52,"tags":{},"startTime":1778910212625,"traceId":"61d19d6bfc8851ca"},{"name":"check-page","duration":712766,"timestamp":102240359147,"id":52,"parentId":19,"tags":{"page":"/messages"},"startTime":1778910212605,"traceId":"61d19d6bfc8851ca"},{"name":"is-page-static","duration":695986,"timestamp":102240378845,"id":91,"parentId":50,"tags":{},"startTime":1778910212625,"traceId":"61d19d6bfc8851ca"},{"name":"check-page","duration":716057,"timestamp":102240358845,"id":50,"parentId":19,"tags":{"page":"/login"},"startTime":1778910212605,"traceId":"61d19d6bfc8851ca"},{"name":"is-page-static","duration":696213,"timestamp":102240378808,"id":90,"parentId":23,"tags":{},"startTime":1778910212625,"traceId":"61d19d6bfc8851ca"},{"name":"check-page","duration":721354,"timestamp":102240353700,"id":23,"parentId":19,"tags":{"page":"/admin"},"startTime":1778910212600,"traceId":"61d19d6bfc8851ca"},{"name":"is-page-static","duration":700293,"timestamp":102240379026,"id":100,"parentId":61,"tags":{},"startTime":1778910212625,"traceId":"61d19d6bfc8851ca"},{"name":"check-page","duration":718023,"timestamp":102240361335,"id":61,"parentId":19,"tags":{"page":"/tasks"},"startTime":1778910212608,"traceId":"61d19d6bfc8851ca"},{"name":"is-page-static","duration":682090,"timestamp":102240399413,"id":102,"parentId":55,"tags":{},"startTime":1778910212646,"traceId":"61d19d6bfc8851ca"},{"name":"check-page","duration":721804,"timestamp":102240359737,"id":55,"parentId":19,"tags":{"page":"/"},"startTime":1778910212606,"traceId":"61d19d6bfc8851ca"},{"name":"is-page-static","duration":707901,"timestamp":102240378908,"id":94,"parentId":53,"tags":{},"startTime":1778910212625,"traceId":"61d19d6bfc8851ca"},{"name":"check-page","duration":727498,"timestamp":102240359349,"id":53,"parentId":19,"tags":{"page":"/node"},"startTime":1778910212606,"traceId":"61d19d6bfc8851ca"},{"name":"is-page-static","duration":698940,"timestamp":102240388657,"id":101,"parentId":58,"tags":{},"startTime":1778910212635,"traceId":"61d19d6bfc8851ca"},{"name":"check-page","duration":727047,"timestamp":102240360579,"id":58,"parentId":19,"tags":{"page":"/settings"},"startTime":1778910212607,"traceId":"61d19d6bfc8851ca"},{"name":"is-page-static","duration":714597,"timestamp":102240378937,"id":96,"parentId":56,"tags":{},"startTime":1778910212625,"traceId":"61d19d6bfc8851ca"},{"name":"check-page","duration":733340,"timestamp":102240360229,"id":56,"parentId":19,"tags":{"page":"/server-logs"},"startTime":1778910212607,"traceId":"61d19d6bfc8851ca"},{"name":"is-page-static","duration":718449,"timestamp":102240378858,"id":92,"parentId":51,"tags":{},"startTime":1778910212625,"traceId":"61d19d6bfc8851ca"},{"name":"check-page","duration":738352,"timestamp":102240358990,"id":51,"parentId":19,"tags":{"page":"/logs"},"startTime":1778910212605,"traceId":"61d19d6bfc8851ca"},{"name":"static-check","duration":747711,"timestamp":102240349690,"id":19,"parentId":1,"tags":{},"startTime":1778910212596,"traceId":"61d19d6bfc8851ca"},{"name":"write-routes-manifest","duration":502,"timestamp":102241106293,"id":104,"parentId":1,"tags":{},"startTime":1778910213353,"traceId":"61d19d6bfc8851ca"},{"name":"load-dotenv","duration":64,"timestamp":102241126443,"id":107,"parentId":106,"tags":{},"startTime":1778910213373,"traceId":"61d19d6bfc8851ca"},{"name":"run-export-path-map","duration":715,"timestamp":102241129636,"id":108,"parentId":106,"tags":{},"startTime":1778910213376,"traceId":"61d19d6bfc8851ca"},{"name":"next-export","duration":565652,"timestamp":102241124745,"id":106,"parentId":1,"tags":{},"startTime":1778910213371,"traceId":"61d19d6bfc8851ca"}]
2
- [{"name":"move-exported-app-not-found-","duration":2577,"timestamp":102241695485,"id":109,"parentId":105,"tags":{},"startTime":1778910213942,"traceId":"61d19d6bfc8851ca"},{"name":"move-exported-app-global-error-","duration":531,"timestamp":102241698152,"id":110,"parentId":105,"tags":{},"startTime":1778910213944,"traceId":"61d19d6bfc8851ca"},{"name":"static-generation","duration":588421,"timestamp":102241112140,"id":105,"parentId":1,"tags":{},"startTime":1778910213358,"traceId":"61d19d6bfc8851ca"},{"name":"write-routes-manifest","duration":476,"timestamp":102241700729,"id":111,"parentId":1,"tags":{},"startTime":1778910213947,"traceId":"61d19d6bfc8851ca"},{"name":"print-tree-view","duration":4644,"timestamp":102241715856,"id":112,"parentId":1,"tags":{},"startTime":1778910213962,"traceId":"61d19d6bfc8851ca"},{"name":"write-route-bundle-stats","duration":14643,"timestamp":102241720534,"id":113,"parentId":1,"tags":{},"startTime":1778910213967,"traceId":"61d19d6bfc8851ca"},{"name":"telemetry-flush","duration":56732,"timestamp":102241735202,"id":114,"parentId":1,"tags":{},"startTime":1778910213981,"traceId":"61d19d6bfc8851ca"},{"name":"next-build","duration":16846817,"timestamp":102224945151,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778910197191,"traceId":"61d19d6bfc8851ca"}]
1
+ [{"name":"generate-buildid","duration":253,"timestamp":103142310524,"id":4,"parentId":1,"tags":{},"startTime":1778911114557,"traceId":"8954e1a57a6b5b6a"},{"name":"load-custom-routes","duration":588,"timestamp":103142310928,"id":5,"parentId":1,"tags":{},"startTime":1778911114557,"traceId":"8954e1a57a6b5b6a"},{"name":"create-dist-dir","duration":723,"timestamp":103142311580,"id":6,"parentId":1,"tags":{},"startTime":1778911114558,"traceId":"8954e1a57a6b5b6a"},{"name":"clean","duration":28847,"timestamp":103142313100,"id":7,"parentId":1,"tags":{},"startTime":1778911114559,"traceId":"8954e1a57a6b5b6a"},{"name":"discover-routes","duration":12419,"timestamp":103142416538,"id":8,"parentId":1,"tags":{},"startTime":1778911114663,"traceId":"8954e1a57a6b5b6a"},{"name":"create-root-mapping","duration":125,"timestamp":103142429031,"id":9,"parentId":1,"tags":{},"startTime":1778911114675,"traceId":"8954e1a57a6b5b6a"},{"name":"generate-route-types","duration":33814,"timestamp":103142431600,"id":10,"parentId":1,"tags":{},"startTime":1778911114678,"traceId":"8954e1a57a6b5b6a"},{"name":"public-dir-conflict-check","duration":103,"timestamp":103142465497,"id":11,"parentId":1,"tags":{},"startTime":1778911114712,"traceId":"8954e1a57a6b5b6a"},{"name":"generate-routes-manifest","duration":5457,"timestamp":103142465708,"id":12,"parentId":1,"tags":{},"startTime":1778911114712,"traceId":"8954e1a57a6b5b6a"},{"name":"run-turbopack","duration":5345540,"timestamp":103142476636,"id":14,"parentId":1,"tags":{},"startTime":1778911114723,"traceId":"8954e1a57a6b5b6a"},{"name":"turbopack-build-events","duration":70,"timestamp":103142751437,"id":15,"parentId":1,"tags":{},"startTime":1778911114998,"traceId":"8954e1a57a6b5b6a"},{"name":"run-typescript","duration":9105486,"timestamp":103147831862,"id":16,"parentId":1,"tags":{},"startTime":1778911120078,"traceId":"8954e1a57a6b5b6a"},{"name":"generate-required-server-files","duration":3135,"timestamp":103156938773,"id":18,"parentId":1,"tags":{},"startTime":1778911129185,"traceId":"8954e1a57a6b5b6a"},{"name":"check-static-error-page","duration":11984,"timestamp":103157141362,"id":20,"parentId":19,"tags":{},"startTime":1778911129388,"traceId":"8954e1a57a6b5b6a"},{"name":"is-page-static","duration":463662,"timestamp":103157157145,"id":63,"parentId":22,"tags":{},"startTime":1778911129403,"traceId":"8954e1a57a6b5b6a"},{"name":"check-page","duration":476802,"timestamp":103157144264,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1778911129391,"traceId":"8954e1a57a6b5b6a"},{"name":"is-page-static","duration":542004,"timestamp":103157157501,"id":66,"parentId":27,"tags":{},"startTime":1778911129404,"traceId":"8954e1a57a6b5b6a"},{"name":"check-page","duration":552634,"timestamp":103157146987,"id":27,"parentId":19,"tags":{"page":"/api/auth/v3"},"startTime":1778911129393,"traceId":"8954e1a57a6b5b6a"},{"name":"is-page-static","duration":542821,"timestamp":103157157760,"id":67,"parentId":28,"tags":{},"startTime":1778911129404,"traceId":"8954e1a57a6b5b6a"},{"name":"check-page","duration":553533,"timestamp":103157147112,"id":28,"parentId":19,"tags":{"page":"/api/hub/audit-log"},"startTime":1778911129393,"traceId":"8954e1a57a6b5b6a"},{"name":"is-page-static","duration":547275,"timestamp":103157156805,"id":62,"parentId":21,"tags":{},"startTime":1778911129403,"traceId":"8954e1a57a6b5b6a"},{"name":"check-page","duration":561296,"timestamp":103157142841,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1778911129389,"traceId":"8954e1a57a6b5b6a"},{"name":"is-page-static","duration":568249,"timestamp":103157158359,"id":71,"parentId":33,"tags":{},"startTime":1778911129405,"traceId":"8954e1a57a6b5b6a"},{"name":"check-page","duration":579013,"timestamp":103157147671,"id":33,"parentId":19,"tags":{"page":"/api/hub/inbox"},"startTime":1778911129394,"traceId":"8954e1a57a6b5b6a"},{"name":"is-page-static","duration":587768,"timestamp":103157158289,"id":70,"parentId":32,"tags":{},"startTime":1778911129405,"traceId":"8954e1a57a6b5b6a"},{"name":"check-page","duration":598555,"timestamp":103157147582,"id":32,"parentId":19,"tags":{"page":"/api/hub/health"},"startTime":1778911129394,"traceId":"8954e1a57a6b5b6a"},{"name":"is-page-static","duration":593345,"timestamp":103157157265,"id":64,"parentId":25,"tags":{},"startTime":1778911129404,"traceId":"8954e1a57a6b5b6a"},{"name":"check-page","duration":603940,"timestamp":103157146749,"id":25,"parentId":19,"tags":{"page":"/api/auth/login"},"startTime":1778911129393,"traceId":"8954e1a57a6b5b6a"},{"name":"is-page-static","duration":592973,"timestamp":103157157944,"id":68,"parentId":29,"tags":{},"startTime":1778911129404,"traceId":"8954e1a57a6b5b6a"},{"name":"check-page","duration":603760,"timestamp":103157147196,"id":29,"parentId":19,"tags":{"page":"/api/hub/auth"},"startTime":1778911129393,"traceId":"8954e1a57a6b5b6a"},{"name":"is-page-static","duration":596158,"timestamp":103157158564,"id":74,"parentId":36,"tags":{},"startTime":1778911129405,"traceId":"8954e1a57a6b5b6a"},{"name":"check-page","duration":606565,"timestamp":103157148225,"id":36,"parentId":19,"tags":{"page":"/api/hub/networks"},"startTime":1778911129394,"traceId":"8954e1a57a6b5b6a"},{"name":"is-page-static","duration":598285,"timestamp":103157158591,"id":75,"parentId":37,"tags":{},"startTime":1778911129405,"traceId":"8954e1a57a6b5b6a"},{"name":"check-page","duration":608596,"timestamp":103157148353,"id":37,"parentId":19,"tags":{"page":"/api/hub/nodes"},"startTime":1778911129395,"traceId":"8954e1a57a6b5b6a"},{"name":"is-page-static","duration":599119,"timestamp":103157158464,"id":73,"parentId":35,"tags":{},"startTime":1778911129405,"traceId":"8954e1a57a6b5b6a"},{"name":"check-page","duration":609782,"timestamp":103157147846,"id":35,"parentId":19,"tags":{"page":"/api/hub/messages"},"startTime":1778911129394,"traceId":"8954e1a57a6b5b6a"},{"name":"is-page-static","duration":600650,"timestamp":103157158108,"id":69,"parentId":30,"tags":{},"startTime":1778911129404,"traceId":"8954e1a57a6b5b6a"},{"name":"check-page","duration":611507,"timestamp":103157147301,"id":30,"parentId":19,"tags":{"page":"/api/hub/broadcast"},"startTime":1778911129394,"traceId":"8954e1a57a6b5b6a"},{"name":"is-page-static","duration":601617,"timestamp":103157158625,"id":77,"parentId":39,"tags":{},"startTime":1778911129405,"traceId":"8954e1a57a6b5b6a"},{"name":"check-page","duration":611792,"timestamp":103157148505,"id":39,"parentId":19,"tags":{"page":"/api/hub/send"},"startTime":1778911129395,"traceId":"8954e1a57a6b5b6a"},{"name":"is-page-static","duration":604883,"timestamp":103157157388,"id":65,"parentId":26,"tags":{},"startTime":1778911129404,"traceId":"8954e1a57a6b5b6a"},{"name":"check-page","duration":615435,"timestamp":103157146878,"id":26,"parentId":19,"tags":{"page":"/api/auth/logout"},"startTime":1778911129393,"traceId":"8954e1a57a6b5b6a"},{"name":"is-page-static","duration":608591,"timestamp":103157158608,"id":76,"parentId":38,"tags":{},"startTime":1778911129405,"traceId":"8954e1a57a6b5b6a"},{"name":"check-page","duration":618796,"timestamp":103157148443,"id":38,"parentId":19,"tags":{"page":"/api/hub/register"},"startTime":1778911129395,"traceId":"8954e1a57a6b5b6a"},{"name":"is-page-static","duration":608843,"timestamp":103157158684,"id":82,"parentId":44,"tags":{},"startTime":1778911129405,"traceId":"8954e1a57a6b5b6a"},{"name":"check-page","duration":618753,"timestamp":103157148825,"id":44,"parentId":19,"tags":{"page":"/api/hub/status"},"startTime":1778911129395,"traceId":"8954e1a57a6b5b6a"},{"name":"is-page-static","duration":609174,"timestamp":103157158662,"id":80,"parentId":42,"tags":{},"startTime":1778911129405,"traceId":"8954e1a57a6b5b6a"},{"name":"check-page","duration":619206,"timestamp":103157148699,"id":42,"parentId":19,"tags":{"page":"/api/hub/session"},"startTime":1778911129395,"traceId":"8954e1a57a6b5b6a"},{"name":"is-page-static","duration":613088,"timestamp":103157158675,"id":81,"parentId":43,"tags":{},"startTime":1778911129405,"traceId":"8954e1a57a6b5b6a"},{"name":"check-page","duration":623051,"timestamp":103157148763,"id":43,"parentId":19,"tags":{"page":"/api/hub/stats"},"startTime":1778911129395,"traceId":"8954e1a57a6b5b6a"},{"name":"is-page-static","duration":614039,"timestamp":103157158696,"id":83,"parentId":45,"tags":{},"startTime":1778911129405,"traceId":"8954e1a57a6b5b6a"},{"name":"check-page","duration":623874,"timestamp":103157148906,"id":45,"parentId":19,"tags":{"page":"/api/hub/task-events"},"startTime":1778911129395,"traceId":"8954e1a57a6b5b6a"},{"name":"is-page-static","duration":616349,"timestamp":103157158719,"id":85,"parentId":47,"tags":{},"startTime":1778911129405,"traceId":"8954e1a57a6b5b6a"},{"name":"check-page","duration":624855,"timestamp":103157150262,"id":47,"parentId":19,"tags":{"page":"/api/hub/tmux"},"startTime":1778911129397,"traceId":"8954e1a57a6b5b6a"},{"name":"is-page-static","duration":616623,"timestamp":103157158649,"id":79,"parentId":41,"tags":{},"startTime":1778911129405,"traceId":"8954e1a57a6b5b6a"},{"name":"check-page","duration":626673,"timestamp":103157148632,"id":41,"parentId":19,"tags":{"page":"/api/hub/servers"},"startTime":1778911129395,"traceId":"8954e1a57a6b5b6a"},{"name":"is-page-static","duration":618009,"timestamp":103157158745,"id":87,"parentId":49,"tags":{},"startTime":1778911129405,"traceId":"8954e1a57a6b5b6a"},{"name":"check-page","duration":626341,"timestamp":103157150460,"id":49,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1778911129397,"traceId":"8954e1a57a6b5b6a"},{"name":"is-page-static","duration":619774,"timestamp":103157158732,"id":86,"parentId":48,"tags":{},"startTime":1778911129405,"traceId":"8954e1a57a6b5b6a"},{"name":"check-page","duration":628187,"timestamp":103157150370,"id":48,"parentId":19,"tags":{"page":"/api/hub/tokens"},"startTime":1778911129397,"traceId":"8954e1a57a6b5b6a"},{"name":"is-page-static","duration":620976,"timestamp":103157162068,"id":88,"parentId":24,"tags":{},"startTime":1778911129408,"traceId":"8954e1a57a6b5b6a"},{"name":"check-page","duration":638308,"timestamp":103157144783,"id":24,"parentId":19,"tags":{"page":"/api/anet/config"},"startTime":1778911129391,"traceId":"8954e1a57a6b5b6a"},{"name":"is-page-static","duration":620022,"timestamp":103157163196,"id":89,"parentId":31,"tags":{},"startTime":1778911129409,"traceId":"8954e1a57a6b5b6a"},{"name":"check-page","duration":635873,"timestamp":103157147381,"id":31,"parentId":19,"tags":{"page":"/api/hub/events"},"startTime":1778911129394,"traceId":"8954e1a57a6b5b6a"},{"name":"is-page-static","duration":627669,"timestamp":103157158434,"id":72,"parentId":34,"tags":{},"startTime":1778911129405,"traceId":"8954e1a57a6b5b6a"},{"name":"check-page","duration":638398,"timestamp":103157147748,"id":34,"parentId":19,"tags":{"page":"/api/hub/license"},"startTime":1778911129394,"traceId":"8954e1a57a6b5b6a"},{"name":"is-page-static","duration":631266,"timestamp":103157158710,"id":84,"parentId":46,"tags":{},"startTime":1778911129405,"traceId":"8954e1a57a6b5b6a"},{"name":"check-page","duration":641069,"timestamp":103157148969,"id":46,"parentId":19,"tags":{"page":"/api/hub/tasks"},"startTime":1778911129395,"traceId":"8954e1a57a6b5b6a"},{"name":"is-page-static","duration":628271,"timestamp":103157165587,"id":94,"parentId":53,"tags":{},"startTime":1778911129412,"traceId":"8954e1a57a6b5b6a"},{"name":"check-page","duration":642754,"timestamp":103157151159,"id":53,"parentId":19,"tags":{"page":"/node"},"startTime":1778911129397,"traceId":"8954e1a57a6b5b6a"},{"name":"is-page-static","duration":636446,"timestamp":103157158635,"id":78,"parentId":40,"tags":{},"startTime":1778911129405,"traceId":"8954e1a57a6b5b6a"},{"name":"check-page","duration":646553,"timestamp":103157148569,"id":40,"parentId":19,"tags":{"page":"/api/hub/server-logs"},"startTime":1778911129395,"traceId":"8954e1a57a6b5b6a"},{"name":"is-page-static","duration":636804,"timestamp":103157165610,"id":96,"parentId":56,"tags":{},"startTime":1778911129412,"traceId":"8954e1a57a6b5b6a"},{"name":"check-page","duration":650732,"timestamp":103157151865,"id":56,"parentId":19,"tags":{"page":"/server-logs"},"startTime":1778911129398,"traceId":"8954e1a57a6b5b6a"},{"name":"is-page-static","duration":644897,"timestamp":103157165635,"id":98,"parentId":59,"tags":{},"startTime":1778911129412,"traceId":"8954e1a57a6b5b6a"},{"name":"check-page","duration":657851,"timestamp":103157152733,"id":59,"parentId":19,"tags":{"page":"/settings/tokens"},"startTime":1778911129399,"traceId":"8954e1a57a6b5b6a"},{"name":"is-page-static","duration":663450,"timestamp":103157165651,"id":99,"parentId":60,"tags":{},"startTime":1778911129412,"traceId":"8954e1a57a6b5b6a"},{"name":"check-page","duration":676270,"timestamp":103157152907,"id":60,"parentId":19,"tags":{"page":"/tasks/[id]"},"startTime":1778911129399,"traceId":"8954e1a57a6b5b6a"},{"name":"is-page-static","duration":667491,"timestamp":103157165545,"id":91,"parentId":50,"tags":{},"startTime":1778911129412,"traceId":"8954e1a57a6b5b6a"},{"name":"check-page","duration":682363,"timestamp":103157150757,"id":50,"parentId":19,"tags":{"page":"/login"},"startTime":1778911129397,"traceId":"8954e1a57a6b5b6a"},{"name":"is-page-static","duration":670022,"timestamp":103157165664,"id":100,"parentId":61,"tags":{},"startTime":1778911129412,"traceId":"8954e1a57a6b5b6a"},{"name":"check-page","duration":682659,"timestamp":103157153082,"id":61,"parentId":19,"tags":{"page":"/tasks"},"startTime":1778911129399,"traceId":"8954e1a57a6b5b6a"},{"name":"is-page-static","duration":663748,"timestamp":103157179436,"id":101,"parentId":58,"tags":{},"startTime":1778911129426,"traceId":"8954e1a57a6b5b6a"},{"name":"check-page","duration":690921,"timestamp":103157152312,"id":58,"parentId":19,"tags":{"page":"/settings"},"startTime":1778911129399,"traceId":"8954e1a57a6b5b6a"},{"name":"is-page-static","duration":638913,"timestamp":103157204658,"id":102,"parentId":55,"tags":{},"startTime":1778911129451,"traceId":"8954e1a57a6b5b6a"},{"name":"check-page","duration":692150,"timestamp":103157151458,"id":55,"parentId":19,"tags":{"page":"/"},"startTime":1778911129398,"traceId":"8954e1a57a6b5b6a"},{"name":"is-page-static","duration":682643,"timestamp":103157165514,"id":90,"parentId":23,"tags":{},"startTime":1778911129412,"traceId":"8954e1a57a6b5b6a"},{"name":"check-page","duration":703629,"timestamp":103157144570,"id":23,"parentId":19,"tags":{"page":"/admin"},"startTime":1778911129391,"traceId":"8954e1a57a6b5b6a"},{"name":"is-page-static","duration":682712,"timestamp":103157165571,"id":93,"parentId":52,"tags":{},"startTime":1778911129412,"traceId":"8954e1a57a6b5b6a"},{"name":"check-page","duration":697319,"timestamp":103157150994,"id":52,"parentId":19,"tags":{"page":"/messages"},"startTime":1778911129397,"traceId":"8954e1a57a6b5b6a"},{"name":"is-page-static","duration":684946,"timestamp":103157165561,"id":92,"parentId":51,"tags":{},"startTime":1778911129412,"traceId":"8954e1a57a6b5b6a"},{"name":"check-page","duration":699678,"timestamp":103157150868,"id":51,"parentId":19,"tags":{"page":"/logs"},"startTime":1778911129397,"traceId":"8954e1a57a6b5b6a"},{"name":"is-page-static","duration":692761,"timestamp":103157165600,"id":95,"parentId":54,"tags":{},"startTime":1778911129412,"traceId":"8954e1a57a6b5b6a"},{"name":"check-page","duration":707094,"timestamp":103157151298,"id":54,"parentId":19,"tags":{"page":"/nodes"},"startTime":1778911129398,"traceId":"8954e1a57a6b5b6a"},{"name":"is-page-static","duration":693692,"timestamp":103157165623,"id":97,"parentId":57,"tags":{},"startTime":1778911129412,"traceId":"8954e1a57a6b5b6a"},{"name":"check-page","duration":707239,"timestamp":103157152099,"id":57,"parentId":19,"tags":{"page":"/settings/networks"},"startTime":1778911129398,"traceId":"8954e1a57a6b5b6a"},{"name":"static-check","duration":718834,"timestamp":103157140535,"id":19,"parentId":1,"tags":{},"startTime":1778911129387,"traceId":"8954e1a57a6b5b6a"},{"name":"write-routes-manifest","duration":397,"timestamp":103157865509,"id":104,"parentId":1,"tags":{},"startTime":1778911130112,"traceId":"8954e1a57a6b5b6a"},{"name":"load-dotenv","duration":72,"timestamp":103157877523,"id":107,"parentId":106,"tags":{},"startTime":1778911130124,"traceId":"8954e1a57a6b5b6a"},{"name":"run-export-path-map","duration":764,"timestamp":103157882189,"id":108,"parentId":106,"tags":{},"startTime":1778911130128,"traceId":"8954e1a57a6b5b6a"},{"name":"next-export","duration":611048,"timestamp":103157875666,"id":106,"parentId":1,"tags":{},"startTime":1778911130122,"traceId":"8954e1a57a6b5b6a"}]
2
+ [{"name":"move-exported-app-not-found-","duration":2120,"timestamp":103158490473,"id":109,"parentId":105,"tags":{},"startTime":1778911130737,"traceId":"8954e1a57a6b5b6a"},{"name":"move-exported-app-global-error-","duration":542,"timestamp":103158492675,"id":110,"parentId":105,"tags":{},"startTime":1778911130739,"traceId":"8954e1a57a6b5b6a"},{"name":"static-generation","duration":625104,"timestamp":103157869916,"id":105,"parentId":1,"tags":{},"startTime":1778911130116,"traceId":"8954e1a57a6b5b6a"},{"name":"write-routes-manifest","duration":391,"timestamp":103158495176,"id":111,"parentId":1,"tags":{},"startTime":1778911130741,"traceId":"8954e1a57a6b5b6a"},{"name":"print-tree-view","duration":4072,"timestamp":103158513701,"id":112,"parentId":1,"tags":{},"startTime":1778911130760,"traceId":"8954e1a57a6b5b6a"},{"name":"write-route-bundle-stats","duration":13209,"timestamp":103158517813,"id":113,"parentId":1,"tags":{},"startTime":1778911130764,"traceId":"8954e1a57a6b5b6a"},{"name":"telemetry-flush","duration":26583,"timestamp":103158531062,"id":114,"parentId":1,"tags":{},"startTime":1778911130777,"traceId":"8954e1a57a6b5b6a"},{"name":"next-build","duration":16295565,"timestamp":103142262115,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778911114508,"traceId":"8954e1a57a6b5b6a"}]
package/.next/trace-build CHANGED
@@ -1 +1 @@
1
- [{"name":"run-turbopack","duration":5758092,"timestamp":102225186894,"id":14,"parentId":1,"tags":{},"startTime":1778910197433,"traceId":"61d19d6bfc8851ca"},{"name":"turbopack-build-events","duration":74,"timestamp":102225472613,"id":15,"parentId":1,"tags":{},"startTime":1778910197719,"traceId":"61d19d6bfc8851ca"},{"name":"run-typescript","duration":9213824,"timestamp":102230953656,"id":16,"parentId":1,"tags":{},"startTime":1778910203200,"traceId":"61d19d6bfc8851ca"},{"name":"static-check","duration":747711,"timestamp":102240349690,"id":19,"parentId":1,"tags":{},"startTime":1778910212596,"traceId":"61d19d6bfc8851ca"},{"name":"static-generation","duration":588421,"timestamp":102241112140,"id":105,"parentId":1,"tags":{},"startTime":1778910213358,"traceId":"61d19d6bfc8851ca"},{"name":"telemetry-flush","duration":56732,"timestamp":102241735202,"id":114,"parentId":1,"tags":{},"startTime":1778910213981,"traceId":"61d19d6bfc8851ca"},{"name":"next-build","duration":16846817,"timestamp":102224945151,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778910197191,"traceId":"61d19d6bfc8851ca"}]
1
+ [{"name":"run-turbopack","duration":5345540,"timestamp":103142476636,"id":14,"parentId":1,"tags":{},"startTime":1778911114723,"traceId":"8954e1a57a6b5b6a"},{"name":"turbopack-build-events","duration":70,"timestamp":103142751437,"id":15,"parentId":1,"tags":{},"startTime":1778911114998,"traceId":"8954e1a57a6b5b6a"},{"name":"run-typescript","duration":9105486,"timestamp":103147831862,"id":16,"parentId":1,"tags":{},"startTime":1778911120078,"traceId":"8954e1a57a6b5b6a"},{"name":"static-check","duration":718834,"timestamp":103157140535,"id":19,"parentId":1,"tags":{},"startTime":1778911129387,"traceId":"8954e1a57a6b5b6a"},{"name":"static-generation","duration":625104,"timestamp":103157869916,"id":105,"parentId":1,"tags":{},"startTime":1778911130116,"traceId":"8954e1a57a6b5b6a"},{"name":"telemetry-flush","duration":26583,"timestamp":103158531062,"id":114,"parentId":1,"tags":{},"startTime":1778911130777,"traceId":"8954e1a57a6b5b6a"},{"name":"next-build","duration":16295565,"timestamp":103142262115,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778911114508,"traceId":"8954e1a57a6b5b6a"}]
@@ -131,6 +131,26 @@ function FreshnessChip({ sessions }: { sessions: unknown }) {
131
131
  const colorClass = stale
132
132
  ? "bg-amber-500/10 text-amber-300 border-amber-500/20"
133
133
  : "bg-gray-500/10 text-gray-400 border-gray-500/20";
134
+ /* Round 275 / Loop: simplification per Vincent 5214/5215-5217 visual
135
+ audit (clutter cleanup for Twitter screenshot). Pre-R275 the chip
136
+ ALWAYS rendered — "live · 5s" gray-on-gray at rest, "lag · 15s"
137
+ amber when stale. The fresh state is an "everything's fine"
138
+ affirmation that's implicit elsewhere on the canvas (counts
139
+ updating, flows animating). Adding a permanent chip to the chip-
140
+ row's right end for that affirmation is added visual chrome
141
+ without proportional info value.
142
+
143
+ R275 converts the chip to a CONDITIONAL warning indicator: render
144
+ only when stale (sec > 10). Fresh state → null (chip absent). The
145
+ amber stale chip still appears as a warning when SWR lags, so
146
+ users see the problem signal; the fresh state implicitly relies
147
+ on other liveness signals (recent-signal panel rows, edge
148
+ animations, count updates).
149
+
150
+ Net effect: chip-row at rest has 1 fewer chip (cleaner Twitter
151
+ screenshot, less right-edge chrome), but signals appear on
152
+ stale-onset to direct attention. */
153
+ if (!stale) return null;
134
154
  return (
135
155
  <span
136
156
  className={`${baseClass} ${colorClass}`}
@@ -6523,6 +6543,22 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
6523
6543
  stay at pal.legendText regardless — empty doesn't
6524
6544
  get to claim tier identity. 8th surface in the
6525
6545
  hover-deepen-own-hue family. */}
6546
+ {/* Round 274 / Loop: legend per-row count picks up
6547
+ tabular-nums (sibling treatment to R225's recent-
6548
+ signal panel header flow-count + R230's group-
6549
+ label pip strip). The text uses fontFamily=
6550
+ 'monospace' which is typically tabular by
6551
+ nature, but some monospace implementations have
6552
+ subtle digit-pair width variance (e.g., '0' vs
6553
+ '1' at the visual boundary). Explicit
6554
+ fontVariantNumeric: 'tabular-nums' is belt-and-
6555
+ suspenders: locks digit widths regardless of
6556
+ the rendered monospace font, so the count
6557
+ column stays planted as offline/idle/working
6558
+ counters roll across 9→10 / 99→100 thresholds.
6559
+ Pure CSS-level addition, no layout shift.
6560
+ 10th surface in the info-density tabular-nums
6561
+ sweep family. */}
6526
6562
  <text
6527
6563
  x="215" y={row.y1}
6528
6564
  textAnchor="end"
@@ -6535,7 +6571,7 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
6535
6571
  data-legend-count={row.key}
6536
6572
  data-legend-count-empty={row.count === 0 ? 'true' : 'false'}
6537
6573
  data-legend-count-fill={row.count > 0 && (hoveredStatus === row.key || isPinned) ? 'tier' : 'neutral'}
6538
- style={{ pointerEvents: 'none', transition: 'opacity 150ms ease-out, fill 150ms ease-out' }}
6574
+ style={{ pointerEvents: 'none', transition: 'opacity 150ms ease-out, fill 150ms ease-out', fontVariantNumeric: 'tabular-nums' }}
6539
6575
  >{row.count}</text>
6540
6576
  </g>
6541
6577
  );
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sleep2agi/agent-network-dashboard",
3
- "version": "0.4.6-preview.280",
3
+ "version": "0.4.6-preview.282",
4
4
  "description": "Agent Network Dashboard — Web UI for managing AI Agent networks",
5
5
  "scripts": {
6
6
  "dev": "next dev",
@@ -0,0 +1,92 @@
1
+ /* Round 275 verification: FreshnessChip converts from always-render
2
+ * to conditional render (only when stale) — chip-row simplification
3
+ * per Vincent 5214/5215-5217 visual audit ask ("乱" cleanup for
4
+ * Twitter screenshot).
5
+ *
6
+ * Pre-R275 the chip ALWAYS rendered:
7
+ * fresh: gray + "live · {sec}s" (always-present "I'm fine" chip)
8
+ * stale: amber + "lag · {sec}s" (R272 prefix swap)
9
+ *
10
+ * Post-R275:
11
+ * fresh: chip absent (null)
12
+ * stale: amber + "lag · {sec}s" (warning indicator only)
13
+ *
14
+ * Net effect: chip-row at rest has 1 fewer chip — cleaner Twitter
15
+ * screenshot, less right-edge chrome. Stale state still alerts via
16
+ * conditional appearance (amber "lag" warning chip).
17
+ *
18
+ * R272 prefix-swap intent (live↔lag) still in code; only the lag side
19
+ * is rendered now. Fresh state implicitly relies on other liveness
20
+ * signals (recent-signal panel rows, edge animations, count updates).
21
+ *
22
+ * Test scope:
23
+ * 1. At fresh state (default page load, 0s elapsed), chip element
24
+ * is NOT present in DOM. R275 simplification verified.
25
+ * 2. R273 Layout toggle Grid inactive has hover:text-cyan-300
26
+ * (regression).
27
+ * 3. R274 legend per-row count has tabular-nums (regression).
28
+ * 4. Source code regression: FreshnessChip body still contains the
29
+ * "lag" / "live" ternary — verified by reading the bundled JS
30
+ * isn't worth the effort; trust the source diff + this fresh-
31
+ * absence test as proof R275 applied.
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 { localStorage.setItem('anet-theme', 'cyber'); sessionStorage.setItem('anet_v3_auth', '1'); } catch {}
42
+ });
43
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
44
+ await ctx.route('**/api/hub/status*', async (route) => {
45
+ const r = await route.fetch();
46
+ const b = await r.json();
47
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
48
+ const mk = (alias) => ({
49
+ alias, status: 'working', model: 'claude-opus-4', runtime: 'claude-code-cli',
50
+ network_id: nid, project_dir: null,
51
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
52
+ });
53
+ await route.fulfill({ response: r, json: { ...b, sessions: [
54
+ mk('alpha'), mk('beta'), mk('gamma'), mk('delta'),
55
+ ] } });
56
+ });
57
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
58
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
59
+
60
+ const page = await ctx.newPage();
61
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
62
+ await page.waitForFunction(() => document.querySelectorAll('g[data-node]').length === 4, { timeout: 30000 });
63
+ await page.waitForSelector('[data-topo-chrome-layout="grid"]', { timeout: 10000 });
64
+ await page.waitForSelector('[data-legend-count="working"]', { timeout: 10000 });
65
+ // Give the page time to settle so FreshnessChip mount cycle is stable.
66
+ // Note: we are NOT waiting for [data-freshness-chip] — that selector
67
+ // should NOT match in fresh state (chip absent). Use a short fixed
68
+ // wait instead.
69
+ await page.waitForTimeout(500);
70
+
71
+ const probe = await page.evaluate(() => {
72
+ const freshnessChip = document.querySelector('[data-freshness-chip]');
73
+ const grid = document.querySelector('[data-topo-chrome-layout="grid"]');
74
+ const legendCount = document.querySelector('[data-legend-count="working"]');
75
+ return {
76
+ chipPresentAtFresh: freshnessChip !== null,
77
+ gridClasses: grid ? grid.className.toString() : null,
78
+ legendCountFVN: legendCount ? window.getComputedStyle(legendCount).fontVariantNumeric : null,
79
+ };
80
+ });
81
+ await browser.close();
82
+
83
+ const results = {
84
+ chip_absent_at_fresh: probe.chipPresentAtFresh === false,
85
+ r273_grid_has_cyan_hover_text: (probe.gridClasses || '').includes('hover:text-cyan-300'),
86
+ r274_legend_count_tabular: probe.legendCountFVN != null && probe.legendCountFVN.includes('tabular-nums'),
87
+ };
88
+ const ok = Object.values(results).every(Boolean);
89
+ console.log(`${ok ? '✅' : '❌'} freshness conditional render:`, JSON.stringify(results),
90
+ '\n chip present at fresh:', probe.chipPresentAtFresh, '(expected: false)',
91
+ '\n legend count FVN:', probe.legendCountFVN);
92
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,87 @@
1
+ /* Round 274 verification: legend per-row count text gains tabular-nums.
2
+ *
3
+ * Pre-R274 the legend per-row count at x=215 used fontFamily="monospace"
4
+ * (typically tabular by nature) but NO explicit fontVariantNumeric:
5
+ * 'tabular-nums'. The recent-signal panel header flow-count (R225)
6
+ * AND the group-label pip strip (R230) both explicitly set tabular-
7
+ * nums for digit-width stability across 9→10 / 99→100 thresholds.
8
+ *
9
+ * R274 closes the consistency gap: legend per-row counts now also
10
+ * carry fontVariantNumeric: 'tabular-nums'. Belt-and-suspenders for
11
+ * monospace fonts where some implementations have subtle digit-pair
12
+ * variance.
13
+ *
14
+ * Test scope:
15
+ * 1. Working row count text has computed fontVariantNumeric ===
16
+ * 'tabular-nums'.
17
+ * 2. Idle row count text same.
18
+ * 3. Offline row count text same.
19
+ * 4. R273 Layout toggle Grid inactive has hover:text-cyan-300
20
+ * (regression).
21
+ */
22
+ import { chromium } from 'playwright';
23
+ import { readFileSync } from 'node:fs';
24
+
25
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
26
+ const browser = await chromium.launch({ headless: true });
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
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
33
+ await ctx.route('**/api/hub/status*', async (route) => {
34
+ const r = await route.fetch();
35
+ const b = await r.json();
36
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
37
+ const mk = (alias, status = 'working') => ({
38
+ alias, status, model: 'claude-opus-4', runtime: 'claude-code-cli',
39
+ network_id: nid, project_dir: null,
40
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
41
+ });
42
+ // Mix of statuses so all 3 legend row counts have non-zero values
43
+ await route.fulfill({ response: r, json: { ...b, sessions: [
44
+ mk('alpha', 'working'), mk('beta', 'idle'),
45
+ mk('gamma', 'idle'), mk('delta', 'idle'),
46
+ ] } });
47
+ });
48
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
49
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
50
+
51
+ const page = await ctx.newPage();
52
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
53
+ await page.waitForFunction(() => document.querySelectorAll('g[data-node]').length === 4, { timeout: 30000 });
54
+ await page.waitForSelector('[data-legend-count="working"]', { timeout: 10000 });
55
+ await page.waitForSelector('[data-legend-count="idle"]', { timeout: 10000 });
56
+ await page.waitForSelector('[data-legend-count="offline"]', { timeout: 10000 });
57
+ await page.waitForSelector('[data-topo-chrome-layout="grid"]', { timeout: 10000 });
58
+ await page.waitForTimeout(300);
59
+
60
+ const probe = await page.evaluate(() => {
61
+ const working = document.querySelector('[data-legend-count="working"]');
62
+ const idle = document.querySelector('[data-legend-count="idle"]');
63
+ const offline = document.querySelector('[data-legend-count="offline"]');
64
+ const grid = document.querySelector('[data-topo-chrome-layout="grid"]');
65
+ return {
66
+ workingFVN: working ? window.getComputedStyle(working).fontVariantNumeric : null,
67
+ idleFVN: idle ? window.getComputedStyle(idle).fontVariantNumeric : null,
68
+ offlineFVN: offline ? window.getComputedStyle(offline).fontVariantNumeric : null,
69
+ gridClasses: grid ? grid.className.toString() : null,
70
+ };
71
+ });
72
+ await browser.close();
73
+
74
+ const isTabular = (v) => v != null && v.includes('tabular-nums');
75
+
76
+ const results = {
77
+ working_count_tabular: isTabular(probe.workingFVN),
78
+ idle_count_tabular: isTabular(probe.idleFVN),
79
+ offline_count_tabular: isTabular(probe.offlineFVN),
80
+ r273_grid_has_cyan_hover_text: (probe.gridClasses || '').includes('hover:text-cyan-300'),
81
+ };
82
+ const ok = Object.values(results).every(Boolean);
83
+ console.log(`${ok ? '✅' : '❌'} legend count tabular-nums:`, JSON.stringify(results),
84
+ '\n working FVN:', probe.workingFVN,
85
+ '\n idle FVN: ', probe.idleFVN,
86
+ '\n offline FVN:', probe.offlineFVN);
87
+ process.exit(ok ? 0 : 1);
@@ -1,97 +0,0 @@
1
- /* Round 272 verification: FreshnessChip text prefix matches color
2
- * state (fresh="live", stale="lag").
3
- *
4
- * Pre-R272 the chip read "live · {sec}s" in both states:
5
- * fresh: gray + "live · 3s" → color says fresh, text says fresh ✓
6
- * stale: amber + "live · 15s" → color says stale, text says fresh ✗ (contradicts)
7
- *
8
- * Post-R272:
9
- * fresh: gray + "live · 3s" → color and text both say fresh ✓
10
- * stale: amber + "lag · 15s" → color and text both signal stale ✓
11
- *
12
- * The chip's `stale` flag fires when sec > 10. Hard to wait 11s in
13
- * a test, so we test the fresh-state directly (default render is
14
- * fresh since useRef captures Date.now() at mount and 0s has
15
- * elapsed). For stale, we'd need to wait — instead, verify the
16
- * code path by checking the chip exists with fresh text + correct
17
- * `data-freshness-chip-stale='false'` attr.
18
- *
19
- * Test scope:
20
- * 1. Chip exists with data-freshness-chip attribute.
21
- * 2. At fresh state, data-freshness-chip-stale === 'false'.
22
- * 3. At fresh state, text starts with "live · " (prefix word "live").
23
- * 4. At fresh state, color is gray (computed color contains 156 or
24
- * similar Tailwind gray RGB).
25
- * 5. Source code regression: the new JSX uses {stale ? 'lag' : 'live'}
26
- * ternary (verified by grep'ing the rendered HTML node structure
27
- * — the ternary always renders ONE of the two words, so the chip
28
- * text should contain a single 3-letter prefix word).
29
- * 6. R271 regression: legend row hitbox y=21 (working row).
30
- */
31
- import { chromium } from 'playwright';
32
- import { readFileSync } from 'node:fs';
33
-
34
- const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
35
- const browser = await chromium.launch({ headless: true });
36
- const ctx = await browser.newContext({ viewport: { width: 1500, height: 1500 } });
37
- await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
38
- await ctx.addInitScript(() => {
39
- try { localStorage.setItem('anet-theme', 'cyber'); sessionStorage.setItem('anet_v3_auth', '1'); } catch {}
40
- });
41
- const fresh = new Date(Date.now() - 60 * 1000).toISOString();
42
- await ctx.route('**/api/hub/status*', async (route) => {
43
- const r = await route.fetch();
44
- const b = await r.json();
45
- const nid = (b.sessions || [])[0]?.network_id || 'default';
46
- const mk = (alias) => ({
47
- alias, status: 'working', model: 'claude-opus-4', runtime: 'claude-code-cli',
48
- network_id: nid, project_dir: null,
49
- created_at: fresh, updated_at: fresh, last_seen_at: fresh,
50
- });
51
- await route.fulfill({ response: r, json: { ...b, sessions: [
52
- mk('alpha'), mk('beta'), mk('gamma'), mk('delta'),
53
- ] } });
54
- });
55
- await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
56
- await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
57
-
58
- const page = await ctx.newPage();
59
- await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
60
- await page.waitForFunction(() => document.querySelectorAll('g[data-node]').length === 4, { timeout: 30000 });
61
- await page.waitForSelector('[data-freshness-chip]', { timeout: 10000 });
62
- await page.waitForSelector('[data-legend-status="working"] rect', { timeout: 10000 });
63
- await page.waitForTimeout(300);
64
-
65
- const probe = await page.evaluate(() => {
66
- const chip = document.querySelector('[data-freshness-chip]');
67
- const legendRect = document.querySelector('[data-legend-status="working"] rect');
68
- return {
69
- chipText: chip ? chip.textContent.trim() : null,
70
- chipStale: chip ? chip.getAttribute('data-freshness-chip-stale') : null,
71
- chipColor: chip ? window.getComputedStyle(chip).color : null,
72
- legendRectY: legendRect ? +legendRect.getAttribute('y') : null,
73
- };
74
- });
75
- await browser.close();
76
-
77
- // Fresh state: text should start with "live · " and stale attr === 'false'.
78
- // gray chip color: text-gray-400 in cyber theme = rgb(156, 163, 175) or oklab(...) → contains "156" or "rgb".
79
- const results = {
80
- chip_present: probe.chipText !== null,
81
- chip_is_fresh: probe.chipStale === 'false',
82
- chip_text_starts_with_live: probe.chipText != null && probe.chipText.startsWith('live · '),
83
- chip_text_no_lag_when_fresh: probe.chipText != null && !probe.chipText.startsWith('lag · '),
84
- // Fresh color in cyber is text-gray-400. Tailwind v4 renders modern
85
- // browsers as oklab()/lab()/oklch(). Accept any computed-color
86
- // function format that indicates a color was actually applied.
87
- chip_color_set: probe.chipColor != null
88
- && /(rgb|oklab|lab|oklch|hsl)/.test(probe.chipColor),
89
- r271_legend_rect_y_21: probe.legendRectY === 21,
90
- };
91
- const ok = Object.values(results).every(Boolean);
92
- console.log(`${ok ? '✅' : '❌'} freshness text color coherence:`, JSON.stringify(results),
93
- '\n chip text:', JSON.stringify(probe.chipText),
94
- '\n chip stale attr:', probe.chipStale,
95
- '\n chip color:', probe.chipColor,
96
- '\n legend rect y:', probe.legendRectY);
97
- process.exit(ok ? 0 : 1);