@sleep2agi/agent-network-dashboard 0.5.7-preview.38 → 0.5.7-preview.39

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 (161) 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 +7 -7
  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/page.js.nft.json +1 -1
  53. package/.next/server/app/messages/page_client-reference-manifest.js +1 -1
  54. package/.next/server/app/messages.html +2 -2
  55. package/.next/server/app/messages.rsc +2 -2
  56. package/.next/server/app/messages.segments/_full.segment.rsc +2 -2
  57. package/.next/server/app/messages.segments/_head.segment.rsc +1 -1
  58. package/.next/server/app/messages.segments/_index.segment.rsc +1 -1
  59. package/.next/server/app/messages.segments/_tree.segment.rsc +1 -1
  60. package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +2 -2
  61. package/.next/server/app/messages.segments/messages.segment.rsc +1 -1
  62. package/.next/server/app/node.html +1 -1
  63. package/.next/server/app/node.rsc +1 -1
  64. package/.next/server/app/node.segments/_full.segment.rsc +1 -1
  65. package/.next/server/app/node.segments/_head.segment.rsc +1 -1
  66. package/.next/server/app/node.segments/_index.segment.rsc +1 -1
  67. package/.next/server/app/node.segments/_tree.segment.rsc +1 -1
  68. package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +1 -1
  69. package/.next/server/app/node.segments/node.segment.rsc +1 -1
  70. package/.next/server/app/nodes/page.js.nft.json +1 -1
  71. package/.next/server/app/nodes/page_client-reference-manifest.js +1 -1
  72. package/.next/server/app/nodes.html +2 -2
  73. package/.next/server/app/nodes.rsc +2 -2
  74. package/.next/server/app/nodes.segments/_full.segment.rsc +2 -2
  75. package/.next/server/app/nodes.segments/_head.segment.rsc +1 -1
  76. package/.next/server/app/nodes.segments/_index.segment.rsc +1 -1
  77. package/.next/server/app/nodes.segments/_tree.segment.rsc +1 -1
  78. package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +2 -2
  79. package/.next/server/app/nodes.segments/nodes.segment.rsc +1 -1
  80. package/.next/server/app/page_client-reference-manifest.js +1 -1
  81. package/.next/server/app/server-logs.html +1 -1
  82. package/.next/server/app/server-logs.rsc +1 -1
  83. package/.next/server/app/server-logs.segments/_full.segment.rsc +1 -1
  84. package/.next/server/app/server-logs.segments/_head.segment.rsc +1 -1
  85. package/.next/server/app/server-logs.segments/_index.segment.rsc +1 -1
  86. package/.next/server/app/server-logs.segments/_tree.segment.rsc +1 -1
  87. package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +1 -1
  88. package/.next/server/app/server-logs.segments/server-logs.segment.rsc +1 -1
  89. package/.next/server/app/servers.html +1 -1
  90. package/.next/server/app/servers.rsc +1 -1
  91. package/.next/server/app/servers.segments/_full.segment.rsc +1 -1
  92. package/.next/server/app/servers.segments/_head.segment.rsc +1 -1
  93. package/.next/server/app/servers.segments/_index.segment.rsc +1 -1
  94. package/.next/server/app/servers.segments/_tree.segment.rsc +1 -1
  95. package/.next/server/app/servers.segments/servers/__PAGE__.segment.rsc +1 -1
  96. package/.next/server/app/servers.segments/servers.segment.rsc +1 -1
  97. package/.next/server/app/settings/networks.html +1 -1
  98. package/.next/server/app/settings/networks.rsc +1 -1
  99. package/.next/server/app/settings/networks.segments/_full.segment.rsc +1 -1
  100. package/.next/server/app/settings/networks.segments/_head.segment.rsc +1 -1
  101. package/.next/server/app/settings/networks.segments/_index.segment.rsc +1 -1
  102. package/.next/server/app/settings/networks.segments/_tree.segment.rsc +1 -1
  103. package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +1 -1
  104. package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +1 -1
  105. package/.next/server/app/settings/networks.segments/settings.segment.rsc +1 -1
  106. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  107. package/.next/server/app/settings/tokens.html +1 -1
  108. package/.next/server/app/settings/tokens.rsc +1 -1
  109. package/.next/server/app/settings/tokens.segments/_full.segment.rsc +1 -1
  110. package/.next/server/app/settings/tokens.segments/_head.segment.rsc +1 -1
  111. package/.next/server/app/settings/tokens.segments/_index.segment.rsc +1 -1
  112. package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +1 -1
  113. package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +1 -1
  114. package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +1 -1
  115. package/.next/server/app/settings/tokens.segments/settings.segment.rsc +1 -1
  116. package/.next/server/app/settings.html +2 -2
  117. package/.next/server/app/settings.rsc +2 -2
  118. package/.next/server/app/settings.segments/_full.segment.rsc +2 -2
  119. package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  120. package/.next/server/app/settings.segments/_index.segment.rsc +1 -1
  121. package/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
  122. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +2 -2
  123. package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  124. package/.next/server/app/tasks.html +1 -1
  125. package/.next/server/app/tasks.rsc +1 -1
  126. package/.next/server/app/tasks.segments/_full.segment.rsc +1 -1
  127. package/.next/server/app/tasks.segments/_head.segment.rsc +1 -1
  128. package/.next/server/app/tasks.segments/_index.segment.rsc +1 -1
  129. package/.next/server/app/tasks.segments/_tree.segment.rsc +1 -1
  130. package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +1 -1
  131. package/.next/server/app/tasks.segments/tasks.segment.rsc +1 -1
  132. package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js +1 -1
  133. package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js.map +1 -1
  134. package/.next/server/chunks/ssr/{[root-of-the-server]__0nw~zhp._.js → [root-of-the-server]__0torghd._.js} +2 -2
  135. package/.next/server/chunks/ssr/[root-of-the-server]__0torghd._.js.map +1 -0
  136. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js +1 -1
  137. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js.map +1 -1
  138. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js +1 -1
  139. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js.map +1 -1
  140. package/.next/server/chunks/ssr/{agent-network-dashboard_app_1153xeb._.js → agent-network-dashboard_app_0gd.4pc._.js} +3 -3
  141. package/.next/server/chunks/ssr/agent-network-dashboard_app_0gd.4pc._.js.map +1 -0
  142. package/.next/server/middleware-build-manifest.js +3 -3
  143. package/.next/server/pages/404.html +1 -1
  144. package/.next/server/pages/500.html +1 -1
  145. package/.next/static/chunks/{0xyds0k-llh6y.js → 0_m0zx8f~zx54.js} +2 -2
  146. package/.next/static/chunks/{0q0ngzf2wy2uu.js → 0_ukxl9as.uj4.js} +1 -1
  147. package/.next/static/chunks/{09aqa0t3~kdv-.js → 0a27.a8ipcr7p.js} +1 -1
  148. package/.next/static/chunks/0urrkhru4u8d2.js +1 -0
  149. package/.next/static/chunks/{0t.g5hwhwocea.js → 12st54z6c1wau.js} +1 -1
  150. package/.next/trace +2 -2
  151. package/.next/trace-build +1 -1
  152. package/app/components/CollapsibleSearch.tsx +127 -0
  153. package/app/messages/page.tsx +13 -55
  154. package/app/nodes/page.tsx +17 -61
  155. package/package.json +1 -1
  156. package/.next/server/chunks/ssr/[root-of-the-server]__0nw~zhp._.js.map +0 -1
  157. package/.next/server/chunks/ssr/agent-network-dashboard_app_1153xeb._.js.map +0 -1
  158. package/.next/static/chunks/16xdsfhu7lg04.js +0 -1
  159. /package/.next/static/{RSm_bZeU9qWHnykS1m6iu → DMTO2mYq8skQpUQTCuQ-4}/_buildManifest.js +0 -0
  160. /package/.next/static/{RSm_bZeU9qWHnykS1m6iu → DMTO2mYq8skQpUQTCuQ-4}/_clientMiddlewareManifest.js +0 -0
  161. /package/.next/static/{RSm_bZeU9qWHnykS1m6iu → DMTO2mYq8skQpUQTCuQ-4}/_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}},"useMessages",0,function(e=100){let{networkId:l}=(0,a.useNetworkId)(),{data:i,error:o,isLoading:c}=(0,s.default)(n(`/api/hub/messages?limit=${e}`,l),t,r);return{messages:i?.messages||[],error:o,isLoading:c}},"useSessions",0,function(){let{networkId:e}=(0,a.useNetworkId)(),{data:l,error:i,isLoading:o}=(0,s.default)(n("/api/hub/status",e),t,r);return{sessions:l?.sessions||[],hint:l?._hint,error:i,isLoading:o}},"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:o,error:c,isLoading:d}=(0,s.default)(n(`/api/hub/tasks?${i}`,l),t,r);return{tasks:o?.tasks||[],count:o?.count??0,source:o?.source,error:c,isLoading:d}}])},70286,e=>{"use strict";e.s(["DASHBOARD_VERSION",0,"0.5.7-preview.38"],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)(),[i,o]=(0,a.useState)(""),[c,d]=(0,a.useState)(""),[x,m]=(0,a.useState)(""),h="flex flex-col gap-1 sm:flex-row sm:items-start sm:justify-between",g="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-2 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:"inline-flex min-h-[44px] items-center rounded-md border border-[#2a2a4a] bg-[#0a0a15]/60 px-3 py-2 text-gray-400 hover:border-cyan-500/50 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:h,children:[(0,s.jsx)("span",{className:"text-gray-500 shrink-0",children:"Hub URL"}),(0,s.jsx)("span",{className:`text-cyan-300 ${g}`,children:e?.hub||"not configured"})]}),(0,s.jsxs)("div",{className:h,children:[(0,s.jsx)("span",{className:"text-gray-500",children:"Config Source"}),(0,s.jsx)("span",{className:`text-gray-300 ${g}`,children:e?.source==="file"?"Local file (~/.anet/config.json)":e?.source==="runtime-env"?"Vercel env vars":"Missing"})]}),(0,s.jsxs)("div",{className:h,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"} ${g}`,children:e?.tokenConfigured?`Configured (${e.tokenPreview})`:"Not configured"})]}),(0,s.jsxs)("div",{className:h,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:h,children:[(0,s.jsx)("span",{className:"text-gray-500",children:"Version"}),(0,s.jsx)("span",{className:`text-gray-300 ${g}`,children:l?.version||"--"})]}),(0,s.jsxs)("div",{className:h,children:[(0,s.jsx)("span",{className:"text-gray-500",children:"Sessions"}),(0,s.jsx)("span",{className:`text-gray-300 ${g}`,children:l?.sessions??"--"})]}),(0,s.jsxs)("div",{className:h,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 ${g}`,children:l?.sse_connections??"--"})]}),(0,s.jsxs)("div",{className:h,children:[(0,s.jsx)("span",{className:"text-gray-500",children:"Uptime"}),(0,s.jsx)("span",{className:`text-gray-300 ${g}`,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:h,children:[(0,s.jsx)("span",{className:"text-gray-500",children:"Version"}),(0,s.jsx)("span",{className:`text-gray-300 font-mono ${g}`,title:"From package.json @sleep2agi/agent-network-dashboard",children:n.DASHBOARD_VERSION})]}),(0,s.jsxs)("div",{className:h,children:[(0,s.jsx)("span",{className:"text-gray-500",children:"Data Layer"}),(0,s.jsx)("span",{className:`text-gray-300 ${g}`,children:"SWR (5s refresh, 3s dedup)"})]}),(0,s.jsxs)("div",{className:h,children:[(0,s.jsx)("span",{className:"text-gray-500",children:"Pages"}),(0,s.jsx)("span",{className:`text-gray-300 ${g}`,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.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:i,onChange:e=>o(e.target.value),placeholder:"Current password",className:"w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-3 py-2 text-base sm:text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none"}),(0,s.jsx)("input",{type:"password",value:c,onChange:e=>d(e.target.value),placeholder:"New password",className:"w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-3 py-2 text-base sm:text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none"}),(0,s.jsx)("button",{onClick:async()=>{if(!i||!c)return;let e=sessionStorage.getItem("anet_v3_auth");if(!e)return void m("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:i,new_password:c})}),t=await a.json();if(m(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}))}o(""),d("")}setTimeout(()=>m(""),5e3)},disabled:!i||!c,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"})]}),x&&(0,s.jsx)("div",{className:`mt-2 text-xs ${x.startsWith("Failed")?"text-red-400":"text-green-400"}`,children:x})]}),(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 →"})]}),(0,s.jsxs)(t.default,{href:"/messages",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:"Messages"}),(0,s.jsx)("p",{className:"text-xs text-gray-500 mt-2",children:"Global timeline of CommHub messages across all agents."}),(0,s.jsx)("span",{className:"text-xs text-cyan-400 mt-3 inline-block",children:"Open →"})]}),(0,s.jsxs)(t.default,{href:"/logs",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:"Audit Log"}),(0,s.jsx)("p",{className:"text-xs text-gray-500 mt-2",children:"Authentication, token rotations, and admin actions."}),(0,s.jsx)("span",{className:"text-xs text-cyan-400 mt-3 inline-block",children:"Open →"})]}),(0,s.jsxs)(t.default,{href:"/server-logs",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:"Server Logs"}),(0,s.jsx)("p",{className:"text-xs text-gray-500 mt-2",children:"Live stdout / stderr from the CommHub server."}),(0,s.jsx)("span",{className:"text-xs text-cyan-400 mt-3 inline-block",children:"Open →"})]})]})]})]})]})}])}]);
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}},"useMessages",0,function(e=100){let{networkId:l}=(0,a.useNetworkId)(),{data:i,error:o,isLoading:c}=(0,s.default)(n(`/api/hub/messages?limit=${e}`,l),t,r);return{messages:i?.messages||[],error:o,isLoading:c}},"useSessions",0,function(){let{networkId:e}=(0,a.useNetworkId)(),{data:l,error:i,isLoading:o}=(0,s.default)(n("/api/hub/status",e),t,r);return{sessions:l?.sessions||[],hint:l?._hint,error:i,isLoading:o}},"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:o,error:c,isLoading:d}=(0,s.default)(n(`/api/hub/tasks?${i}`,l),t,r);return{tasks:o?.tasks||[],count:o?.count??0,source:o?.source,error:c,isLoading:d}}])},70286,e=>{"use strict";e.s(["DASHBOARD_VERSION",0,"0.5.7-preview.39"],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)(),[i,o]=(0,a.useState)(""),[c,d]=(0,a.useState)(""),[x,m]=(0,a.useState)(""),h="flex flex-col gap-1 sm:flex-row sm:items-start sm:justify-between",g="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-2 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:"inline-flex min-h-[44px] items-center rounded-md border border-[#2a2a4a] bg-[#0a0a15]/60 px-3 py-2 text-gray-400 hover:border-cyan-500/50 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:h,children:[(0,s.jsx)("span",{className:"text-gray-500 shrink-0",children:"Hub URL"}),(0,s.jsx)("span",{className:`text-cyan-300 ${g}`,children:e?.hub||"not configured"})]}),(0,s.jsxs)("div",{className:h,children:[(0,s.jsx)("span",{className:"text-gray-500",children:"Config Source"}),(0,s.jsx)("span",{className:`text-gray-300 ${g}`,children:e?.source==="file"?"Local file (~/.anet/config.json)":e?.source==="runtime-env"?"Vercel env vars":"Missing"})]}),(0,s.jsxs)("div",{className:h,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"} ${g}`,children:e?.tokenConfigured?`Configured (${e.tokenPreview})`:"Not configured"})]}),(0,s.jsxs)("div",{className:h,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:h,children:[(0,s.jsx)("span",{className:"text-gray-500",children:"Version"}),(0,s.jsx)("span",{className:`text-gray-300 ${g}`,children:l?.version||"--"})]}),(0,s.jsxs)("div",{className:h,children:[(0,s.jsx)("span",{className:"text-gray-500",children:"Sessions"}),(0,s.jsx)("span",{className:`text-gray-300 ${g}`,children:l?.sessions??"--"})]}),(0,s.jsxs)("div",{className:h,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 ${g}`,children:l?.sse_connections??"--"})]}),(0,s.jsxs)("div",{className:h,children:[(0,s.jsx)("span",{className:"text-gray-500",children:"Uptime"}),(0,s.jsx)("span",{className:`text-gray-300 ${g}`,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:h,children:[(0,s.jsx)("span",{className:"text-gray-500",children:"Version"}),(0,s.jsx)("span",{className:`text-gray-300 font-mono ${g}`,title:"From package.json @sleep2agi/agent-network-dashboard",children:n.DASHBOARD_VERSION})]}),(0,s.jsxs)("div",{className:h,children:[(0,s.jsx)("span",{className:"text-gray-500",children:"Data Layer"}),(0,s.jsx)("span",{className:`text-gray-300 ${g}`,children:"SWR (5s refresh, 3s dedup)"})]}),(0,s.jsxs)("div",{className:h,children:[(0,s.jsx)("span",{className:"text-gray-500",children:"Pages"}),(0,s.jsx)("span",{className:`text-gray-300 ${g}`,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.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:i,onChange:e=>o(e.target.value),placeholder:"Current password",className:"w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-3 py-2 text-base sm:text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none"}),(0,s.jsx)("input",{type:"password",value:c,onChange:e=>d(e.target.value),placeholder:"New password",className:"w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-3 py-2 text-base sm:text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none"}),(0,s.jsx)("button",{onClick:async()=>{if(!i||!c)return;let e=sessionStorage.getItem("anet_v3_auth");if(!e)return void m("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:i,new_password:c})}),t=await a.json();if(m(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}))}o(""),d("")}setTimeout(()=>m(""),5e3)},disabled:!i||!c,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"})]}),x&&(0,s.jsx)("div",{className:`mt-2 text-xs ${x.startsWith("Failed")?"text-red-400":"text-green-400"}`,children:x})]}),(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 →"})]}),(0,s.jsxs)(t.default,{href:"/messages",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:"Messages"}),(0,s.jsx)("p",{className:"text-xs text-gray-500 mt-2",children:"Global timeline of CommHub messages across all agents."}),(0,s.jsx)("span",{className:"text-xs text-cyan-400 mt-3 inline-block",children:"Open →"})]}),(0,s.jsxs)(t.default,{href:"/logs",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:"Audit Log"}),(0,s.jsx)("p",{className:"text-xs text-gray-500 mt-2",children:"Authentication, token rotations, and admin actions."}),(0,s.jsx)("span",{className:"text-xs text-cyan-400 mt-3 inline-block",children:"Open →"})]}),(0,s.jsxs)(t.default,{href:"/server-logs",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:"Server Logs"}),(0,s.jsx)("p",{className:"text-xs text-gray-500 mt-2",children:"Live stdout / stderr from the CommHub server."}),(0,s.jsx)("span",{className:"text-xs text-cyan-400 mt-3 inline-block",children:"Open →"})]})]})]})]})]})}])}]);
package/.next/trace CHANGED
@@ -1,2 +1,2 @@
1
- [{"name":"generate-buildid","duration":401,"timestamp":2086467552554,"id":4,"parentId":1,"tags":{},"startTime":1780894439799,"traceId":"8ff6404efde47814"},{"name":"load-custom-routes","duration":11691,"timestamp":2086467553211,"id":5,"parentId":1,"tags":{},"startTime":1780894439799,"traceId":"8ff6404efde47814"},{"name":"create-dist-dir","duration":5926,"timestamp":2086467565153,"id":6,"parentId":1,"tags":{},"startTime":1780894439811,"traceId":"8ff6404efde47814"},{"name":"clean","duration":430912,"timestamp":2086467576529,"id":7,"parentId":1,"tags":{},"startTime":1780894439823,"traceId":"8ff6404efde47814"},{"name":"discover-routes","duration":200497,"timestamp":2086470154463,"id":8,"parentId":1,"tags":{},"startTime":1780894442401,"traceId":"8ff6404efde47814"},{"name":"create-root-mapping","duration":247,"timestamp":2086470355096,"id":9,"parentId":1,"tags":{},"startTime":1780894442601,"traceId":"8ff6404efde47814"},{"name":"generate-route-types","duration":295018,"timestamp":2086470395084,"id":10,"parentId":1,"tags":{},"startTime":1780894442641,"traceId":"8ff6404efde47814"},{"name":"public-dir-conflict-check","duration":161,"timestamp":2086470690254,"id":11,"parentId":1,"tags":{},"startTime":1780894442937,"traceId":"8ff6404efde47814"},{"name":"generate-routes-manifest","duration":149955,"timestamp":2086470690621,"id":12,"parentId":1,"tags":{},"startTime":1780894442937,"traceId":"8ff6404efde47814"},{"name":"run-turbopack","duration":326490727,"timestamp":2086470966240,"id":14,"parentId":1,"tags":{},"startTime":1780894443213,"traceId":"8ff6404efde47814"},{"name":"turbopack-build-events","duration":120,"timestamp":2086475648796,"id":15,"parentId":1,"tags":{},"startTime":1780894447895,"traceId":"8ff6404efde47814"},{"name":"run-typescript","duration":289986292,"timestamp":2086798583251,"id":16,"parentId":1,"tags":{},"startTime":1780894770830,"traceId":"8ff6404efde47814"},{"name":"generate-required-server-files","duration":78183,"timestamp":2087088570491,"id":18,"parentId":1,"tags":{},"startTime":1780895060817,"traceId":"8ff6404efde47814"},{"name":"check-static-error-page","duration":888562,"timestamp":2087093790029,"id":20,"parentId":19,"tags":{},"startTime":1780895066036,"traceId":"8ff6404efde47814"},{"name":"is-page-static","duration":14171257,"timestamp":2087094686527,"id":67,"parentId":22,"tags":{},"startTime":1780895066933,"traceId":"8ff6404efde47814"},{"name":"check-page","duration":14872711,"timestamp":2087093985234,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1780895066232,"traceId":"8ff6404efde47814"},{"name":"is-page-static","duration":17648765,"timestamp":2087094686791,"id":69,"parentId":26,"tags":{},"startTime":1780895066933,"traceId":"8ff6404efde47814"},{"name":"check-page","duration":18127548,"timestamp":2087094208117,"id":26,"parentId":19,"tags":{"page":"/api/auth/logout"},"startTime":1780895066454,"traceId":"8ff6404efde47814"},{"name":"is-page-static","duration":18023846,"timestamp":2087094763913,"id":74,"parentId":32,"tags":{},"startTime":1780895067010,"traceId":"8ff6404efde47814"},{"name":"check-page","duration":18482698,"timestamp":2087094305146,"id":32,"parentId":19,"tags":{"page":"/api/hub/health"},"startTime":1780895066551,"traceId":"8ff6404efde47814"},{"name":"is-page-static","duration":18615974,"timestamp":2087094767313,"id":75,"parentId":33,"tags":{},"startTime":1780895067014,"traceId":"8ff6404efde47814"},{"name":"check-page","duration":19077901,"timestamp":2087094305480,"id":33,"parentId":19,"tags":{"page":"/api/hub/inbox"},"startTime":1780895066552,"traceId":"8ff6404efde47814"},{"name":"is-page-static","duration":18900760,"timestamp":2087094763813,"id":73,"parentId":30,"tags":{},"startTime":1780895067010,"traceId":"8ff6404efde47814"},{"name":"check-page","duration":19455982,"timestamp":2087094208690,"id":30,"parentId":19,"tags":{"page":"/api/hub/broadcast"},"startTime":1780895066455,"traceId":"8ff6404efde47814"},{"name":"is-page-static","duration":19114914,"timestamp":2087094767436,"id":77,"parentId":35,"tags":{},"startTime":1780895067014,"traceId":"8ff6404efde47814"},{"name":"check-page","duration":19576655,"timestamp":2087094305788,"id":35,"parentId":19,"tags":{"page":"/api/hub/networks"},"startTime":1780895066552,"traceId":"8ff6404efde47814"},{"name":"is-page-static","duration":19167830,"timestamp":2087094767407,"id":76,"parentId":34,"tags":{},"startTime":1780895067014,"traceId":"8ff6404efde47814"},{"name":"check-page","duration":19629677,"timestamp":2087094305656,"id":34,"parentId":19,"tags":{"page":"/api/hub/messages"},"startTime":1780895066552,"traceId":"8ff6404efde47814"},{"name":"is-page-static","duration":19475252,"timestamp":2087094767454,"id":78,"parentId":36,"tags":{},"startTime":1780895067014,"traceId":"8ff6404efde47814"},{"name":"check-page","duration":19910522,"timestamp":2087094332273,"id":36,"parentId":19,"tags":{"page":"/api/hub/nodes"},"startTime":1780895066579,"traceId":"8ff6404efde47814"},{"name":"is-page-static","duration":19508362,"timestamp":2087094767486,"id":79,"parentId":37,"tags":{},"startTime":1780895067014,"traceId":"8ff6404efde47814"},{"name":"check-page","duration":19943300,"timestamp":2087094332644,"id":37,"parentId":19,"tags":{"page":"/api/hub/register"},"startTime":1780895066579,"traceId":"8ff6404efde47814"},{"name":"is-page-static","duration":19856265,"timestamp":2087094767505,"id":80,"parentId":38,"tags":{},"startTime":1780895067014,"traceId":"8ff6404efde47814"},{"name":"check-page","duration":20291068,"timestamp":2087094332782,"id":38,"parentId":19,"tags":{"page":"/api/hub/send"},"startTime":1780895066579,"traceId":"8ff6404efde47814"},{"name":"is-page-static","duration":19889529,"timestamp":2087094767516,"id":81,"parentId":39,"tags":{},"startTime":1780895067014,"traceId":"8ff6404efde47814"},{"name":"check-page","duration":20324247,"timestamp":2087094332891,"id":39,"parentId":19,"tags":{"page":"/api/hub/server-logs"},"startTime":1780895066579,"traceId":"8ff6404efde47814"},{"name":"is-page-static","duration":20524077,"timestamp":2087094767548,"id":83,"parentId":43,"tags":{},"startTime":1780895067014,"traceId":"8ff6404efde47814"},{"name":"check-page","duration":20828018,"timestamp":2087094463693,"id":43,"parentId":19,"tags":{"page":"/api/hub/session"},"startTime":1780895066710,"traceId":"8ff6404efde47814"},{"name":"is-page-static","duration":20885886,"timestamp":2087094767563,"id":84,"parentId":44,"tags":{},"startTime":1780895067014,"traceId":"8ff6404efde47814"},{"name":"check-page","duration":21189659,"timestamp":2087094463879,"id":44,"parentId":19,"tags":{"page":"/api/hub/stats"},"startTime":1780895066710,"traceId":"8ff6404efde47814"},{"name":"is-page-static","duration":20886310,"timestamp":2087094767531,"id":82,"parentId":41,"tags":{},"startTime":1780895067014,"traceId":"8ff6404efde47814"},{"name":"check-page","duration":21266763,"timestamp":2087094387131,"id":41,"parentId":19,"tags":{"page":"/api/hub/server/[hostname]/health"},"startTime":1780895066633,"traceId":"8ff6404efde47814"},{"name":"is-page-static","duration":21308400,"timestamp":2087094767575,"id":85,"parentId":45,"tags":{},"startTime":1780895067014,"traceId":"8ff6404efde47814"},{"name":"check-page","duration":21612080,"timestamp":2087094463992,"id":45,"parentId":19,"tags":{"page":"/api/hub/status"},"startTime":1780895066710,"traceId":"8ff6404efde47814"},{"name":"is-page-static","duration":21308658,"timestamp":2087094767590,"id":86,"parentId":46,"tags":{},"startTime":1780895067014,"traceId":"8ff6404efde47814"},{"name":"check-page","duration":21612141,"timestamp":2087094464141,"id":46,"parentId":19,"tags":{"page":"/api/hub/task-events"},"startTime":1780895066710,"traceId":"8ff6404efde47814"},{"name":"is-page-static","duration":21475955,"timestamp":2087094767616,"id":88,"parentId":48,"tags":{},"startTime":1780895067014,"traceId":"8ff6404efde47814"},{"name":"check-page","duration":21779351,"timestamp":2087094464327,"id":48,"parentId":19,"tags":{"page":"/api/hub/tmux"},"startTime":1780895066711,"traceId":"8ff6404efde47814"},{"name":"is-page-static","duration":21476255,"timestamp":2087094767605,"id":87,"parentId":47,"tags":{},"startTime":1780895067014,"traceId":"8ff6404efde47814"},{"name":"check-page","duration":21779672,"timestamp":2087094464227,"id":47,"parentId":19,"tags":{"page":"/api/hub/tasks"},"startTime":1780895066710,"traceId":"8ff6404efde47814"},{"name":"is-page-static","duration":21729715,"timestamp":2087094767645,"id":90,"parentId":50,"tags":{},"startTime":1780895067014,"traceId":"8ff6404efde47814"},{"name":"check-page","duration":22032980,"timestamp":2087094464463,"id":50,"parentId":19,"tags":{"page":"/api/hub/upload"},"startTime":1780895066711,"traceId":"8ff6404efde47814"},{"name":"is-page-static","duration":21945195,"timestamp":2087094767631,"id":89,"parentId":49,"tags":{},"startTime":1780895067014,"traceId":"8ff6404efde47814"},{"name":"check-page","duration":22248508,"timestamp":2087094464396,"id":49,"parentId":19,"tags":{"page":"/api/hub/tokens"},"startTime":1780895066711,"traceId":"8ff6404efde47814"},{"name":"is-page-static","duration":22057715,"timestamp":2087094767660,"id":91,"parentId":51,"tags":{},"startTime":1780895067014,"traceId":"8ff6404efde47814"},{"name":"check-page","duration":22360925,"timestamp":2087094464538,"id":51,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1780895066711,"traceId":"8ff6404efde47814"},{"name":"is-page-static","duration":22820149,"timestamp":2087094687179,"id":71,"parentId":28,"tags":{},"startTime":1780895066933,"traceId":"8ff6404efde47814"},{"name":"check-page","duration":23299030,"timestamp":2087094208416,"id":28,"parentId":19,"tags":{"page":"/api/hub/audit-log"},"startTime":1780895066455,"traceId":"8ff6404efde47814"},{"name":"is-page-static","duration":22865074,"timestamp":2087094919653,"id":93,"parentId":24,"tags":{},"startTime":1780895067166,"traceId":"8ff6404efde47814"},{"name":"check-page","duration":23767921,"timestamp":2087094016904,"id":24,"parentId":19,"tags":{"page":"/api/anet/config"},"startTime":1780895066263,"traceId":"8ff6404efde47814"},{"name":"is-page-static","duration":23099051,"timestamp":2087094686067,"id":66,"parentId":21,"tags":{},"startTime":1780895066932,"traceId":"8ff6404efde47814"},{"name":"check-page","duration":23926873,"timestamp":2087093858308,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1780895066105,"traceId":"8ff6404efde47814"},{"name":"is-page-static","duration":23180352,"timestamp":2087094767671,"id":92,"parentId":54,"tags":{},"startTime":1780895067014,"traceId":"8ff6404efde47814"},{"name":"check-page","duration":23487763,"timestamp":2087094465438,"id":54,"parentId":19,"tags":{"page":"/manifest.webmanifest"},"startTime":1780895066712,"traceId":"8ff6404efde47814"},{"name":"is-page-static","duration":23283011,"timestamp":2087094763516,"id":72,"parentId":29,"tags":{},"startTime":1780895067010,"traceId":"8ff6404efde47814"},{"name":"check-page","duration":23838078,"timestamp":2087094208532,"id":29,"parentId":19,"tags":{"page":"/api/hub/auth"},"startTime":1780895066455,"traceId":"8ff6404efde47814"},{"name":"is-page-static","duration":23457904,"timestamp":2087094686673,"id":68,"parentId":25,"tags":{},"startTime":1780895066933,"traceId":"8ff6404efde47814"},{"name":"check-page","duration":23936889,"timestamp":2087094207771,"id":25,"parentId":19,"tags":{"page":"/api/auth/login"},"startTime":1780895066454,"traceId":"8ff6404efde47814"},{"name":"is-page-static","duration":23740254,"timestamp":2087094920896,"id":94,"parentId":31,"tags":{},"startTime":1780895067167,"traceId":"8ff6404efde47814"},{"name":"check-page","duration":24452436,"timestamp":2087094208810,"id":31,"parentId":19,"tags":{"page":"/api/hub/events"},"startTime":1780895066455,"traceId":"8ff6404efde47814"},{"name":"is-page-static","duration":23711647,"timestamp":2087094968542,"id":95,"parentId":40,"tags":{},"startTime":1780895067215,"traceId":"8ff6404efde47814"},{"name":"check-page","duration":24354951,"timestamp":2087094333018,"id":40,"parentId":19,"tags":{"page":"/api/hub/server/[hostname]/agents"},"startTime":1780895066579,"traceId":"8ff6404efde47814"},{"name":"is-page-static","duration":24813338,"timestamp":2087094686910,"id":70,"parentId":27,"tags":{},"startTime":1780895066933,"traceId":"8ff6404efde47814"},{"name":"check-page","duration":25292060,"timestamp":2087094208281,"id":27,"parentId":19,"tags":{"page":"/api/auth/v3"},"startTime":1780895066455,"traceId":"8ff6404efde47814"},{"name":"is-page-static","duration":24742998,"timestamp":2087095055954,"id":96,"parentId":42,"tags":{},"startTime":1780895067302,"traceId":"8ff6404efde47814"},{"name":"check-page","duration":25340720,"timestamp":2087094458345,"id":42,"parentId":19,"tags":{"page":"/api/hub/servers"},"startTime":1780895066705,"traceId":"8ff6404efde47814"},{"name":"is-page-static","duration":24467415,"timestamp":2087095764993,"id":103,"parentId":59,"tags":{},"startTime":1780895068011,"traceId":"8ff6404efde47814"},{"name":"check-page","duration":25630225,"timestamp":2087094602267,"id":59,"parentId":19,"tags":{"page":"/server-logs"},"startTime":1780895066849,"traceId":"8ff6404efde47814"},{"name":"is-page-static","duration":24528211,"timestamp":2087095764711,"id":97,"parentId":23,"tags":{},"startTime":1780895068011,"traceId":"8ff6404efde47814"},{"name":"check-page","duration":26358306,"timestamp":2087093985740,"id":23,"parentId":19,"tags":{"page":"/admin"},"startTime":1780895066232,"traceId":"8ff6404efde47814"},{"name":"is-page-static","duration":24657879,"timestamp":2087095786454,"id":104,"parentId":60,"tags":{},"startTime":1780895068033,"traceId":"8ff6404efde47814"},{"name":"check-page","duration":25841733,"timestamp":2087094602683,"id":60,"parentId":19,"tags":{"page":"/servers"},"startTime":1780895066849,"traceId":"8ff6404efde47814"},{"name":"is-page-static","duration":24861931,"timestamp":2087095786496,"id":105,"parentId":61,"tags":{},"startTime":1780895068033,"traceId":"8ff6404efde47814"},{"name":"check-page","duration":26045649,"timestamp":2087094602869,"id":61,"parentId":19,"tags":{"page":"/settings/networks"},"startTime":1780895066849,"traceId":"8ff6404efde47814"},{"name":"is-page-static","duration":24949213,"timestamp":2087095764770,"id":98,"parentId":52,"tags":{},"startTime":1780895068011,"traceId":"8ff6404efde47814"},{"name":"check-page","duration":26249130,"timestamp":2087094464955,"id":52,"parentId":19,"tags":{"page":"/login"},"startTime":1780895066711,"traceId":"8ff6404efde47814"},{"name":"is-page-static","duration":25049641,"timestamp":2087095786513,"id":106,"parentId":63,"tags":{},"startTime":1780895068033,"traceId":"8ff6404efde47814"},{"name":"check-page","duration":26158674,"timestamp":2087094677585,"id":63,"parentId":19,"tags":{"page":"/settings/tokens"},"startTime":1780895066924,"traceId":"8ff6404efde47814"},{"name":"is-page-static","duration":25316675,"timestamp":2087095764790,"id":99,"parentId":53,"tags":{},"startTime":1780895068011,"traceId":"8ff6404efde47814"},{"name":"check-page","duration":26616333,"timestamp":2087094465218,"id":53,"parentId":19,"tags":{"page":"/logs"},"startTime":1780895066711,"traceId":"8ff6404efde47814"},{"name":"is-page-static","duration":25295105,"timestamp":2087095786553,"id":109,"parentId":62,"tags":{},"startTime":1780895068033,"traceId":"8ff6404efde47814"},{"name":"check-page","duration":26478534,"timestamp":2087094603154,"id":62,"parentId":19,"tags":{"page":"/settings"},"startTime":1780895066849,"traceId":"8ff6404efde47814"},{"name":"is-page-static","duration":25295226,"timestamp":2087095786537,"id":108,"parentId":65,"tags":{},"startTime":1780895068033,"traceId":"8ff6404efde47814"},{"name":"check-page","duration":26403586,"timestamp":2087094678202,"id":65,"parentId":19,"tags":{"page":"/tasks"},"startTime":1780895066924,"traceId":"8ff6404efde47814"},{"name":"is-page-static","duration":25518163,"timestamp":2087095786524,"id":107,"parentId":64,"tags":{},"startTime":1780895068033,"traceId":"8ff6404efde47814"},{"name":"check-page","duration":26626836,"timestamp":2087094677951,"id":64,"parentId":19,"tags":{"page":"/tasks/[id]"},"startTime":1780895066924,"traceId":"8ff6404efde47814"},{"name":"is-page-static","duration":25540102,"timestamp":2087095764816,"id":101,"parentId":56,"tags":{},"startTime":1780895068011,"traceId":"8ff6404efde47814"},{"name":"check-page","duration":26747494,"timestamp":2087094557480,"id":56,"parentId":19,"tags":{"page":"/node"},"startTime":1780895066804,"traceId":"8ff6404efde47814"},{"name":"is-page-static","duration":25574026,"timestamp":2087095764802,"id":100,"parentId":55,"tags":{},"startTime":1780895068011,"traceId":"8ff6404efde47814"},{"name":"check-page","duration":26873356,"timestamp":2087094465557,"id":55,"parentId":19,"tags":{"page":"/messages"},"startTime":1780895066712,"traceId":"8ff6404efde47814"},{"name":"is-page-static","duration":25295446,"timestamp":2087096181635,"id":110,"parentId":58,"tags":{},"startTime":1780895068428,"traceId":"8ff6404efde47814"}]
2
- [{"name":"check-page","duration":26901709,"timestamp":2087094575755,"id":58,"parentId":19,"tags":{"page":"/"},"startTime":1780895066822,"traceId":"8ff6404efde47814"},{"name":"is-page-static","duration":26111568,"timestamp":2087095764831,"id":102,"parentId":57,"tags":{},"startTime":1780895068011,"traceId":"8ff6404efde47814"},{"name":"check-page","duration":27318512,"timestamp":2087094557974,"id":57,"parentId":19,"tags":{"page":"/nodes"},"startTime":1780895066804,"traceId":"8ff6404efde47814"},{"name":"static-check","duration":28087700,"timestamp":2087093788840,"id":19,"parentId":1,"tags":{},"startTime":1780895066035,"traceId":"8ff6404efde47814"},{"name":"write-routes-manifest","duration":6254,"timestamp":2087122024981,"id":112,"parentId":1,"tags":{},"startTime":1780895094271,"traceId":"8ff6404efde47814"},{"name":"load-dotenv","duration":93,"timestamp":2087122269669,"id":115,"parentId":114,"tags":{},"startTime":1780895094516,"traceId":"8ff6404efde47814"},{"name":"run-export-path-map","duration":920,"timestamp":2087122380729,"id":116,"parentId":114,"tags":{},"startTime":1780895094627,"traceId":"8ff6404efde47814"},{"name":"next-export","duration":13741150,"timestamp":2087122252845,"id":114,"parentId":1,"tags":{},"startTime":1780895094499,"traceId":"8ff6404efde47814"},{"name":"move-exported-app-not-found-","duration":7962,"timestamp":2087136053162,"id":117,"parentId":113,"tags":{},"startTime":1780895108299,"traceId":"8ff6404efde47814"},{"name":"move-exported-app-global-error-","duration":926,"timestamp":2087136071069,"id":118,"parentId":113,"tags":{},"startTime":1780895108317,"traceId":"8ff6404efde47814"},{"name":"static-generation","duration":14011759,"timestamp":2087122101902,"id":113,"parentId":1,"tags":{},"startTime":1780895094348,"traceId":"8ff6404efde47814"},{"name":"write-routes-manifest","duration":7591,"timestamp":2087136127297,"id":119,"parentId":1,"tags":{},"startTime":1780895108374,"traceId":"8ff6404efde47814"},{"name":"print-tree-view","duration":8947,"timestamp":2087136375618,"id":120,"parentId":1,"tags":{},"startTime":1780895108622,"traceId":"8ff6404efde47814"},{"name":"write-route-bundle-stats","duration":297197,"timestamp":2087136384619,"id":121,"parentId":1,"tags":{},"startTime":1780895108631,"traceId":"8ff6404efde47814"},{"name":"telemetry-flush","duration":196,"timestamp":2087136681869,"id":122,"parentId":1,"tags":{},"startTime":1780895108928,"traceId":"8ff6404efde47814"},{"name":"next-build","duration":669723127,"timestamp":2086466958975,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1780894439205,"traceId":"8ff6404efde47814"}]
1
+ [{"name":"generate-buildid","duration":467,"timestamp":2087914737584,"id":4,"parentId":1,"tags":{},"startTime":1780895886984,"traceId":"7d1bc556d9b442e8"},{"name":"load-custom-routes","duration":755,"timestamp":2087914738294,"id":5,"parentId":1,"tags":{},"startTime":1780895886985,"traceId":"7d1bc556d9b442e8"},{"name":"create-dist-dir","duration":4962,"timestamp":2087914739129,"id":6,"parentId":1,"tags":{},"startTime":1780895886985,"traceId":"7d1bc556d9b442e8"},{"name":"clean","duration":266635,"timestamp":2087914745089,"id":7,"parentId":1,"tags":{},"startTime":1780895886991,"traceId":"7d1bc556d9b442e8"},{"name":"discover-routes","duration":225712,"timestamp":2087916472756,"id":8,"parentId":1,"tags":{},"startTime":1780895888719,"traceId":"7d1bc556d9b442e8"},{"name":"create-root-mapping","duration":247,"timestamp":2087916698580,"id":9,"parentId":1,"tags":{},"startTime":1780895888945,"traceId":"7d1bc556d9b442e8"},{"name":"generate-route-types","duration":413539,"timestamp":2087916747839,"id":10,"parentId":1,"tags":{},"startTime":1780895888994,"traceId":"7d1bc556d9b442e8"},{"name":"public-dir-conflict-check","duration":154,"timestamp":2087917161534,"id":11,"parentId":1,"tags":{},"startTime":1780895889408,"traceId":"7d1bc556d9b442e8"},{"name":"generate-routes-manifest","duration":201165,"timestamp":2087917161908,"id":12,"parentId":1,"tags":{},"startTime":1780895889408,"traceId":"7d1bc556d9b442e8"},{"name":"run-turbopack","duration":303870441,"timestamp":2087917489222,"id":14,"parentId":1,"tags":{},"startTime":1780895889736,"traceId":"7d1bc556d9b442e8"},{"name":"turbopack-build-events","duration":141,"timestamp":2087922021736,"id":15,"parentId":1,"tags":{},"startTime":1780895894268,"traceId":"7d1bc556d9b442e8"},{"name":"run-typescript","duration":248896268,"timestamp":2088221829236,"id":16,"parentId":1,"tags":{},"startTime":1780896194076,"traceId":"7d1bc556d9b442e8"},{"name":"generate-required-server-files","duration":31589,"timestamp":2088470746282,"id":18,"parentId":1,"tags":{},"startTime":1780896442993,"traceId":"7d1bc556d9b442e8"},{"name":"check-static-error-page","duration":421296,"timestamp":2088474611151,"id":20,"parentId":19,"tags":{},"startTime":1780896446857,"traceId":"7d1bc556d9b442e8"},{"name":"is-page-static","duration":13177710,"timestamp":2088475137418,"id":67,"parentId":22,"tags":{},"startTime":1780896447384,"traceId":"7d1bc556d9b442e8"},{"name":"check-page","duration":13573122,"timestamp":2088474742186,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1780896446988,"traceId":"7d1bc556d9b442e8"},{"name":"is-page-static","duration":14300985,"timestamp":2088475161392,"id":69,"parentId":26,"tags":{},"startTime":1780896447408,"traceId":"7d1bc556d9b442e8"},{"name":"check-page","duration":14649968,"timestamp":2088474812510,"id":26,"parentId":19,"tags":{"page":"/api/auth/logout"},"startTime":1780896447059,"traceId":"7d1bc556d9b442e8"},{"name":"is-page-static","duration":14318274,"timestamp":2088475196310,"id":74,"parentId":32,"tags":{},"startTime":1780896447443,"traceId":"7d1bc556d9b442e8"},{"name":"check-page","duration":14666253,"timestamp":2088474848415,"id":32,"parentId":19,"tags":{"page":"/api/hub/health"},"startTime":1780896447095,"traceId":"7d1bc556d9b442e8"},{"name":"is-page-static","duration":14792951,"timestamp":2088475196512,"id":75,"parentId":33,"tags":{},"startTime":1780896447443,"traceId":"7d1bc556d9b442e8"},{"name":"check-page","duration":15140848,"timestamp":2088474848710,"id":33,"parentId":19,"tags":{"page":"/api/hub/inbox"},"startTime":1780896447095,"traceId":"7d1bc556d9b442e8"},{"name":"is-page-static","duration":15190927,"timestamp":2088475196594,"id":76,"parentId":34,"tags":{},"startTime":1780896447443,"traceId":"7d1bc556d9b442e8"},{"name":"check-page","duration":15538750,"timestamp":2088474848865,"id":34,"parentId":19,"tags":{"page":"/api/hub/messages"},"startTime":1780896447095,"traceId":"7d1bc556d9b442e8"},{"name":"is-page-static","duration":15209444,"timestamp":2088475196621,"id":77,"parentId":35,"tags":{},"startTime":1780896447443,"traceId":"7d1bc556d9b442e8"},{"name":"check-page","duration":15557140,"timestamp":2088474849026,"id":35,"parentId":19,"tags":{"page":"/api/hub/networks"},"startTime":1780896447095,"traceId":"7d1bc556d9b442e8"},{"name":"is-page-static","duration":15222990,"timestamp":2088475196641,"id":78,"parentId":36,"tags":{},"startTime":1780896447443,"traceId":"7d1bc556d9b442e8"},{"name":"check-page","duration":15570077,"timestamp":2088474849635,"id":36,"parentId":19,"tags":{"page":"/api/hub/nodes"},"startTime":1780896447096,"traceId":"7d1bc556d9b442e8"},{"name":"is-page-static","duration":15283311,"timestamp":2088475196669,"id":79,"parentId":37,"tags":{},"startTime":1780896447443,"traceId":"7d1bc556d9b442e8"},{"name":"check-page","duration":15630256,"timestamp":2088474849845,"id":37,"parentId":19,"tags":{"page":"/api/hub/register"},"startTime":1780896447096,"traceId":"7d1bc556d9b442e8"},{"name":"is-page-static","duration":15370179,"timestamp":2088475196682,"id":80,"parentId":38,"tags":{},"startTime":1780896447443,"traceId":"7d1bc556d9b442e8"},{"name":"check-page","duration":15716987,"timestamp":2088474849969,"id":38,"parentId":19,"tags":{"page":"/api/hub/send"},"startTime":1780896447096,"traceId":"7d1bc556d9b442e8"},{"name":"is-page-static","duration":15494431,"timestamp":2088475196696,"id":81,"parentId":39,"tags":{},"startTime":1780896447443,"traceId":"7d1bc556d9b442e8"},{"name":"check-page","duration":15807863,"timestamp":2088474883352,"id":39,"parentId":19,"tags":{"page":"/api/hub/server-logs"},"startTime":1780896447130,"traceId":"7d1bc556d9b442e8"},{"name":"is-page-static","duration":16028743,"timestamp":2088475196709,"id":82,"parentId":41,"tags":{},"startTime":1780896447443,"traceId":"7d1bc556d9b442e8"},{"name":"check-page","duration":16341381,"timestamp":2088474884181,"id":41,"parentId":19,"tags":{"page":"/api/hub/server/[hostname]/health"},"startTime":1780896447130,"traceId":"7d1bc556d9b442e8"},{"name":"is-page-static","duration":16201675,"timestamp":2088475196722,"id":83,"parentId":43,"tags":{},"startTime":1780896447443,"traceId":"7d1bc556d9b442e8"},{"name":"check-page","duration":16498274,"timestamp":2088474900209,"id":43,"parentId":19,"tags":{"page":"/api/hub/session"},"startTime":1780896447146,"traceId":"7d1bc556d9b442e8"},{"name":"is-page-static","duration":16388865,"timestamp":2088475196731,"id":84,"parentId":44,"tags":{},"startTime":1780896447443,"traceId":"7d1bc556d9b442e8"},{"name":"check-page","duration":16685274,"timestamp":2088474900409,"id":44,"parentId":19,"tags":{"page":"/api/hub/stats"},"startTime":1780896447147,"traceId":"7d1bc556d9b442e8"},{"name":"is-page-static","duration":16480843,"timestamp":2088475136650,"id":66,"parentId":21,"tags":{},"startTime":1780896447383,"traceId":"7d1bc556d9b442e8"},{"name":"check-page","duration":16932297,"timestamp":2088474685278,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1780896446932,"traceId":"7d1bc556d9b442e8"},{"name":"is-page-static","duration":16709336,"timestamp":2088475196743,"id":85,"parentId":45,"tags":{},"startTime":1780896447443,"traceId":"7d1bc556d9b442e8"},{"name":"check-page","duration":17005653,"timestamp":2088474900520,"id":45,"parentId":19,"tags":{"page":"/api/hub/status"},"startTime":1780896447147,"traceId":"7d1bc556d9b442e8"},{"name":"is-page-static","duration":17023548,"timestamp":2088475196768,"id":87,"parentId":47,"tags":{},"startTime":1780896447443,"traceId":"7d1bc556d9b442e8"},{"name":"check-page","duration":17319653,"timestamp":2088474900741,"id":47,"parentId":19,"tags":{"page":"/api/hub/tasks"},"startTime":1780896447147,"traceId":"7d1bc556d9b442e8"},{"name":"is-page-static","duration":17307611,"timestamp":2088475196780,"id":88,"parentId":48,"tags":{},"startTime":1780896447443,"traceId":"7d1bc556d9b442e8"},{"name":"check-page","duration":17603624,"timestamp":2088474900870,"id":48,"parentId":19,"tags":{"page":"/api/hub/tmux"},"startTime":1780896447147,"traceId":"7d1bc556d9b442e8"},{"name":"is-page-static","duration":17500677,"timestamp":2088475196793,"id":89,"parentId":49,"tags":{},"startTime":1780896447443,"traceId":"7d1bc556d9b442e8"},{"name":"check-page","duration":17796585,"timestamp":2088474900967,"id":49,"parentId":19,"tags":{"page":"/api/hub/tokens"},"startTime":1780896447147,"traceId":"7d1bc556d9b442e8"},{"name":"is-page-static","duration":17575375,"timestamp":2088475161164,"id":68,"parentId":25,"tags":{},"startTime":1780896447407,"traceId":"7d1bc556d9b442e8"},{"name":"check-page","duration":17924418,"timestamp":2088474812206,"id":25,"parentId":19,"tags":{"page":"/api/auth/login"},"startTime":1780896447058,"traceId":"7d1bc556d9b442e8"},{"name":"is-page-static","duration":17648725,"timestamp":2088475196806,"id":90,"parentId":50,"tags":{},"startTime":1780896447443,"traceId":"7d1bc556d9b442e8"},{"name":"check-page","duration":17944535,"timestamp":2088474901077,"id":50,"parentId":19,"tags":{"page":"/api/hub/upload"},"startTime":1780896447147,"traceId":"7d1bc556d9b442e8"},{"name":"is-page-static","duration":17717205,"timestamp":2088475196829,"id":92,"parentId":54,"tags":{},"startTime":1780896447443,"traceId":"7d1bc556d9b442e8"},{"name":"check-page","duration":18012060,"timestamp":2088474902055,"id":54,"parentId":19,"tags":{"page":"/manifest.webmanifest"},"startTime":1780896447148,"traceId":"7d1bc556d9b442e8"},{"name":"is-page-static","duration":18028526,"timestamp":2088475161936,"id":72,"parentId":29,"tags":{},"startTime":1780896447408,"traceId":"7d1bc556d9b442e8"},{"name":"check-page","duration":18377629,"timestamp":2088474812929,"id":29,"parentId":19,"tags":{"page":"/api/hub/auth"},"startTime":1780896447059,"traceId":"7d1bc556d9b442e8"},{"name":"is-page-static","duration":17463504,"timestamp":2088476012144,"id":93,"parentId":24,"tags":{},"startTime":1780896448258,"traceId":"7d1bc556d9b442e8"},{"name":"check-page","duration":18732787,"timestamp":2088474742965,"id":24,"parentId":19,"tags":{"page":"/api/anet/config"},"startTime":1780896446989,"traceId":"7d1bc556d9b442e8"},{"name":"is-page-static","duration":18412242,"timestamp":2088475196207,"id":73,"parentId":30,"tags":{},"startTime":1780896447442,"traceId":"7d1bc556d9b442e8"},{"name":"check-page","duration":18795396,"timestamp":2088474813137,"id":30,"parentId":19,"tags":{"page":"/api/hub/broadcast"},"startTime":1780896447059,"traceId":"7d1bc556d9b442e8"},{"name":"is-page-static","duration":18764362,"timestamp":2088475196816,"id":91,"parentId":51,"tags":{},"startTime":1780896447443,"traceId":"7d1bc556d9b442e8"},{"name":"check-page","duration":19060109,"timestamp":2088474901165,"id":51,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1780896447147,"traceId":"7d1bc556d9b442e8"},{"name":"is-page-static","duration":18079126,"timestamp":2088476081494,"id":95,"parentId":40,"tags":{},"startTime":1780896448328,"traceId":"7d1bc556d9b442e8"},{"name":"check-page","duration":19277217,"timestamp":2088474883505,"id":40,"parentId":19,"tags":{"page":"/api/hub/server/[hostname]/agents"},"startTime":1780896447130,"traceId":"7d1bc556d9b442e8"},{"name":"is-page-static","duration":18136399,"timestamp":2088476103570,"id":96,"parentId":42,"tags":{},"startTime":1780896448350,"traceId":"7d1bc556d9b442e8"},{"name":"check-page","duration":19355760,"timestamp":2088474884364,"id":42,"parentId":19,"tags":{"page":"/api/hub/servers"},"startTime":1780896447131,"traceId":"7d1bc556d9b442e8"},{"name":"is-page-static","duration":19166778,"timestamp":2088475161526,"id":70,"parentId":27,"tags":{},"startTime":1780896447408,"traceId":"7d1bc556d9b442e8"},{"name":"check-page","duration":19515744,"timestamp":2088474812656,"id":27,"parentId":19,"tags":{"page":"/api/auth/v3"},"startTime":1780896447059,"traceId":"7d1bc556d9b442e8"},{"name":"is-page-static","duration":19576648,"timestamp":2088475196759,"id":86,"parentId":46,"tags":{},"startTime":1780896447443,"traceId":"7d1bc556d9b442e8"},{"name":"check-page","duration":19872862,"timestamp":2088474900635,"id":46,"parentId":19,"tags":{"page":"/api/hub/task-events"},"startTime":1780896447147,"traceId":"7d1bc556d9b442e8"},{"name":"is-page-static","duration":18835324,"timestamp":2088476013456,"id":94,"parentId":31,"tags":{},"startTime":1780896448260,"traceId":"7d1bc556d9b442e8"},{"name":"check-page","duration":20035590,"timestamp":2088474813277,"id":31,"parentId":19,"tags":{"page":"/api/hub/events"},"startTime":1780896447060,"traceId":"7d1bc556d9b442e8"},{"name":"is-page-static","duration":18852030,"timestamp":2088476177473,"id":101,"parentId":56,"tags":{},"startTime":1780896448424,"traceId":"7d1bc556d9b442e8"},{"name":"check-page","duration":20058029,"timestamp":2088474971558,"id":56,"parentId":19,"tags":{"page":"/node"},"startTime":1780896447218,"traceId":"7d1bc556d9b442e8"},{"name":"is-page-static","duration":19451740,"timestamp":2088476177631,"id":103,"parentId":59,"tags":{},"startTime":1780896448424,"traceId":"7d1bc556d9b442e8"},{"name":"check-page","duration":20636692,"timestamp":2088474992775,"id":59,"parentId":19,"tags":{"page":"/server-logs"},"startTime":1780896447239,"traceId":"7d1bc556d9b442e8"},{"name":"is-page-static","duration":20891275,"timestamp":2088475161640,"id":71,"parentId":28,"tags":{},"startTime":1780896447408,"traceId":"7d1bc556d9b442e8"},{"name":"check-page","duration":21243494,"timestamp":2088474812797,"id":28,"parentId":19,"tags":{"page":"/api/hub/audit-log"},"startTime":1780896447059,"traceId":"7d1bc556d9b442e8"},{"name":"is-page-static","duration":20041445,"timestamp":2088476177649,"id":104,"parentId":60,"tags":{},"startTime":1780896448424,"traceId":"7d1bc556d9b442e8"},{"name":"check-page","duration":21220075,"timestamp":2088474999101,"id":60,"parentId":19,"tags":{"page":"/servers"},"startTime":1780896447245,"traceId":"7d1bc556d9b442e8"},{"name":"is-page-static","duration":20116017,"timestamp":2088476177487,"id":102,"parentId":57,"tags":{},"startTime":1780896448424,"traceId":"7d1bc556d9b442e8"},{"name":"check-page","duration":21302082,"timestamp":2088474991522,"id":57,"parentId":19,"tags":{"page":"/nodes"},"startTime":1780896447238,"traceId":"7d1bc556d9b442e8"},{"name":"is-page-static","duration":20285705,"timestamp":2088476177694,"id":106,"parentId":63,"tags":{},"startTime":1780896448424,"traceId":"7d1bc556d9b442e8"},{"name":"check-page","duration":21459870,"timestamp":2088475006500,"id":63,"parentId":19,"tags":{"page":"/settings/tokens"},"startTime":1780896447253,"traceId":"7d1bc556d9b442e8"},{"name":"is-page-static","duration":20504654,"timestamp":2088476177709,"id":107,"parentId":64,"tags":{},"startTime":1780896448424,"traceId":"7d1bc556d9b442e8"},{"name":"check-page","duration":21675736,"timestamp":2088475006712,"id":64,"parentId":19,"tags":{"page":"/tasks/[id]"},"startTime":1780896447253,"traceId":"7d1bc556d9b442e8"},{"name":"is-page-static","duration":20504948,"timestamp":2088476177719,"id":108,"parentId":65,"tags":{},"startTime":1780896448424,"traceId":"7d1bc556d9b442e8"},{"name":"check-page","duration":21675810,"timestamp":2088475006900,"id":65,"parentId":19,"tags":{"page":"/tasks"},"startTime":1780896447253,"traceId":"7d1bc556d9b442e8"},{"name":"is-page-static","duration":20747852,"timestamp":2088476177447,"id":99,"parentId":53,"tags":{},"startTime":1780896448424,"traceId":"7d1bc556d9b442e8"},{"name":"check-page","duration":22023547,"timestamp":2088474901841,"id":53,"parentId":19,"tags":{"page":"/logs"},"startTime":1780896447148,"traceId":"7d1bc556d9b442e8"},{"name":"is-page-static","duration":20488953,"timestamp":2088476462633,"id":109,"parentId":62,"tags":{},"startTime":1780896448709,"traceId":"7d1bc556d9b442e8"},{"name":"check-page","duration":21952181,"timestamp":2088474999508,"id":62,"parentId":19,"tags":{"page":"/settings"},"startTime":1780896447246,"traceId":"7d1bc556d9b442e8"},{"name":"is-page-static","duration":19959072,"timestamp":2088477013897,"id":110,"parentId":58,"tags":{},"startTime":1780896449260,"traceId":"7d1bc556d9b442e8"},{"name":"check-page","duration":21981114,"timestamp":2088474991969,"id":58,"parentId":19,"tags":{"page":"/"},"startTime":1780896447238,"traceId":"7d1bc556d9b442e8"},{"name":"is-page-static","duration":20858918,"timestamp":2088476177363,"id":97,"parentId":23,"tags":{},"startTime":1780896448424,"traceId":"7d1bc556d9b442e8"},{"name":"check-page","duration":22293664,"timestamp":2088474742702,"id":23,"parentId":19,"tags":{"page":"/admin"},"startTime":1780896446989,"traceId":"7d1bc556d9b442e8"},{"name":"is-page-static","duration":20964785,"timestamp":2088476177462,"id":100,"parentId":55,"tags":{},"startTime":1780896448424,"traceId":"7d1bc556d9b442e8"},{"name":"check-page","duration":22240159,"timestamp":2088474902167,"id":55,"parentId":19,"tags":{"page":"/messages"},"startTime":1780896447148,"traceId":"7d1bc556d9b442e8"},{"name":"is-page-static","duration":20993947,"timestamp":2088476177427,"id":98,"parentId":52,"tags":{},"startTime":1780896448424,"traceId":"7d1bc556d9b442e8"}]
2
+ [{"name":"check-page","duration":22270128,"timestamp":2088474901629,"id":52,"parentId":19,"tags":{"page":"/login"},"startTime":1780896447148,"traceId":"7d1bc556d9b442e8"},{"name":"is-page-static","duration":21363565,"timestamp":2088476177680,"id":105,"parentId":61,"tags":{},"startTime":1780896448424,"traceId":"7d1bc556d9b442e8"},{"name":"check-page","duration":22542069,"timestamp":2088474999274,"id":61,"parentId":19,"tags":{"page":"/settings/networks"},"startTime":1780896447246,"traceId":"7d1bc556d9b442e8"},{"name":"static-check","duration":22937968,"timestamp":2088474603427,"id":19,"parentId":1,"tags":{},"startTime":1780896446850,"traceId":"7d1bc556d9b442e8"},{"name":"write-routes-manifest","duration":725,"timestamp":2088497642018,"id":112,"parentId":1,"tags":{},"startTime":1780896469888,"traceId":"7d1bc556d9b442e8"},{"name":"load-dotenv","duration":93,"timestamp":2088497847764,"id":115,"parentId":114,"tags":{},"startTime":1780896470094,"traceId":"7d1bc556d9b442e8"},{"name":"run-export-path-map","duration":1012,"timestamp":2088497999733,"id":116,"parentId":114,"tags":{},"startTime":1780896470246,"traceId":"7d1bc556d9b442e8"},{"name":"next-export","duration":15554983,"timestamp":2088497844532,"id":114,"parentId":1,"tags":{},"startTime":1780896470091,"traceId":"7d1bc556d9b442e8"},{"name":"move-exported-app-not-found-","duration":4713,"timestamp":2088513472064,"id":117,"parentId":113,"tags":{},"startTime":1780896485718,"traceId":"7d1bc556d9b442e8"},{"name":"move-exported-app-global-error-","duration":18185,"timestamp":2088513476941,"id":118,"parentId":113,"tags":{},"startTime":1780896485723,"traceId":"7d1bc556d9b442e8"},{"name":"static-generation","duration":15815560,"timestamp":2088497711657,"id":113,"parentId":1,"tags":{},"startTime":1780896469958,"traceId":"7d1bc556d9b442e8"},{"name":"write-routes-manifest","duration":6119,"timestamp":2088513527616,"id":119,"parentId":1,"tags":{},"startTime":1780896485774,"traceId":"7d1bc556d9b442e8"},{"name":"print-tree-view","duration":112067,"timestamp":2088514047508,"id":120,"parentId":1,"tags":{},"startTime":1780896486294,"traceId":"7d1bc556d9b442e8"},{"name":"write-route-bundle-stats","duration":593993,"timestamp":2088514159643,"id":121,"parentId":1,"tags":{},"startTime":1780896486406,"traceId":"7d1bc556d9b442e8"},{"name":"telemetry-flush","duration":21594,"timestamp":2088514753689,"id":122,"parentId":1,"tags":{},"startTime":1780896487000,"traceId":"7d1bc556d9b442e8"},{"name":"next-build","duration":600682723,"timestamp":2087914092625,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1780895886339,"traceId":"7d1bc556d9b442e8"}]
package/.next/trace-build CHANGED
@@ -1 +1 @@
1
- [{"name":"run-turbopack","duration":326490727,"timestamp":2086470966240,"id":14,"parentId":1,"tags":{},"startTime":1780894443213,"traceId":"8ff6404efde47814"},{"name":"turbopack-build-events","duration":120,"timestamp":2086475648796,"id":15,"parentId":1,"tags":{},"startTime":1780894447895,"traceId":"8ff6404efde47814"},{"name":"run-typescript","duration":289986292,"timestamp":2086798583251,"id":16,"parentId":1,"tags":{},"startTime":1780894770830,"traceId":"8ff6404efde47814"},{"name":"static-check","duration":28087700,"timestamp":2087093788840,"id":19,"parentId":1,"tags":{},"startTime":1780895066035,"traceId":"8ff6404efde47814"},{"name":"static-generation","duration":14011759,"timestamp":2087122101902,"id":113,"parentId":1,"tags":{},"startTime":1780895094348,"traceId":"8ff6404efde47814"},{"name":"telemetry-flush","duration":196,"timestamp":2087136681869,"id":122,"parentId":1,"tags":{},"startTime":1780895108928,"traceId":"8ff6404efde47814"},{"name":"next-build","duration":669723127,"timestamp":2086466958975,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1780894439205,"traceId":"8ff6404efde47814"}]
1
+ [{"name":"run-turbopack","duration":303870441,"timestamp":2087917489222,"id":14,"parentId":1,"tags":{},"startTime":1780895889736,"traceId":"7d1bc556d9b442e8"},{"name":"turbopack-build-events","duration":141,"timestamp":2087922021736,"id":15,"parentId":1,"tags":{},"startTime":1780895894268,"traceId":"7d1bc556d9b442e8"},{"name":"run-typescript","duration":248896268,"timestamp":2088221829236,"id":16,"parentId":1,"tags":{},"startTime":1780896194076,"traceId":"7d1bc556d9b442e8"},{"name":"static-check","duration":22937968,"timestamp":2088474603427,"id":19,"parentId":1,"tags":{},"startTime":1780896446850,"traceId":"7d1bc556d9b442e8"},{"name":"static-generation","duration":15815560,"timestamp":2088497711657,"id":113,"parentId":1,"tags":{},"startTime":1780896469958,"traceId":"7d1bc556d9b442e8"},{"name":"telemetry-flush","duration":21594,"timestamp":2088514753689,"id":122,"parentId":1,"tags":{},"startTime":1780896487000,"traceId":"7d1bc556d9b442e8"},{"name":"next-build","duration":600682723,"timestamp":2087914092625,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1780895886339,"traceId":"7d1bc556d9b442e8"}]
@@ -0,0 +1,127 @@
1
+ 'use client';
2
+
3
+ /**
4
+ * CollapsibleSearch
5
+ * ──────────────────
6
+ * #209 R34 — Reusable WeChat-style search-toggle pattern.
7
+ *
8
+ * Two pieces of UI from one component:
9
+ * 1. A magnifier button (`w-9 h-9 rounded-full`) that lives in a page
10
+ * header — render it via `Button`.
11
+ * 2. A collapsible search row that reveals below the header on open —
12
+ * render it via `Row`.
13
+ *
14
+ * Used together they replicate WeChat's chat-list search affordance:
15
+ * the search field is hidden by default behind a small circle at the
16
+ * top-right of the page header. Tapping it slides the input open,
17
+ * autofocuses, and lets Escape clear + close. A cyan dot appears in
18
+ * the corner of the icon when there is an active search term but the
19
+ * row is collapsed, so the user always knows a filter is in effect.
20
+ *
21
+ * Owner of the search string is the parent (this component is
22
+ * uncontrolled w.r.t. value — pure UI). That keeps the filter logic
23
+ * with the page so it's easy to plumb additional behaviour like
24
+ * `from:alias` shortcuts or highlight rendering.
25
+ *
26
+ * Shipped as a single component with two named children so callers
27
+ * can place `<Button>` inside their existing header flex row and
28
+ * `<Row>` just after, without restructuring around a tighter API.
29
+ *
30
+ * First adopters: /nodes (R32), /messages (R33). R34 ships
31
+ * /nodes + /messages migrated to use this component; future pages
32
+ * can add search by importing it instead of copy-pasting the JSX.
33
+ */
34
+
35
+ import { useState, useCallback } from 'react';
36
+
37
+ interface CollapsibleSearchAPI {
38
+ /** Round magnifier button. Place in your page header (e.g. right edge). */
39
+ Button: () => React.JSX.Element;
40
+ /** Collapsible search input row. Place immediately after the header. */
41
+ Row: () => React.JSX.Element | null;
42
+ /** Current search value — pass to your filter logic. */
43
+ value: string;
44
+ /** Programmatically clear + close (useful for "no results" reset link). */
45
+ reset: () => void;
46
+ }
47
+
48
+ interface UseCollapsibleSearchProps {
49
+ /** Controlled value + setter from the parent — owns the search string. */
50
+ value: string;
51
+ onChange: (next: string) => void;
52
+ /** Input placeholder. */
53
+ placeholder?: string;
54
+ /** Accessible label for the button (also drives `title=`). */
55
+ label?: string;
56
+ /** Hide everything when false (e.g. when there is nothing to search). */
57
+ enabled?: boolean;
58
+ }
59
+
60
+ export function useCollapsibleSearch({
61
+ value,
62
+ onChange,
63
+ placeholder = 'Search…',
64
+ label = 'Search',
65
+ enabled = true,
66
+ }: UseCollapsibleSearchProps): CollapsibleSearchAPI {
67
+ const [open, setOpen] = useState(false);
68
+
69
+ const reset = useCallback(() => {
70
+ onChange('');
71
+ setOpen(false);
72
+ }, [onChange]);
73
+
74
+ const Button = useCallback(() => {
75
+ if (!enabled) return <></>;
76
+ const active = open || value;
77
+ return (
78
+ <button
79
+ type="button"
80
+ onClick={() => setOpen(v => !v)}
81
+ aria-label={open ? `Close ${label.toLowerCase()}` : `Open ${label.toLowerCase()}`}
82
+ aria-pressed={open}
83
+ title={open ? `Close ${label.toLowerCase()}` : label}
84
+ className={`relative shrink-0 inline-flex items-center justify-center rounded-full border w-9 h-9 transition-colors ${
85
+ active
86
+ ? 'border-cyan-500/40 bg-cyan-500/10 text-cyan-300'
87
+ : 'border-[#2a2a4a] bg-[#111128] text-gray-400 hover:text-gray-200 hover:border-[#3a3a5a]'
88
+ }`}
89
+ >
90
+ <svg className="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={2}>
91
+ <path strokeLinecap="round" strokeLinejoin="round" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" />
92
+ </svg>
93
+ {value && !open && (
94
+ <span aria-hidden className="absolute -top-0.5 -right-0.5 w-2 h-2 rounded-full bg-cyan-400 ring-2 ring-[#0a0a1a]" />
95
+ )}
96
+ </button>
97
+ );
98
+ }, [open, value, label, enabled]);
99
+
100
+ const Row = useCallback(() => {
101
+ if (!enabled) return null;
102
+ if (!open && !value) return null;
103
+ return (
104
+ <div className="mb-3 sm:mb-4 flex items-center gap-2">
105
+ <input
106
+ type="text"
107
+ value={value}
108
+ onChange={e => onChange(e.target.value)}
109
+ onKeyDown={e => { if (e.key === 'Escape') reset(); }}
110
+ placeholder={placeholder}
111
+ autoFocus={open}
112
+ className="flex-1 bg-[#111128] border border-[#2a2a4a] rounded-lg px-3 py-2 text-base sm:text-sm text-white placeholder-gray-600 focus:border-cyan-500/40 focus:outline-none"
113
+ />
114
+ <button
115
+ type="button"
116
+ onClick={reset}
117
+ className="shrink-0 text-xs text-gray-500 hover:text-gray-300 px-2 py-2"
118
+ aria-label="Clear and close search"
119
+ >
120
+ Cancel
121
+ </button>
122
+ </div>
123
+ );
124
+ }, [open, value, onChange, placeholder, reset, enabled]);
125
+
126
+ return { Button, Row, value, reset };
127
+ }
@@ -5,6 +5,7 @@ import { useMessages } from '../lib/hooks';
5
5
  import { timeAgo, previewContent } from '../components/utils';
6
6
  import { EmptyState } from '../components/EmptyState';
7
7
  import { AliasAvatar } from '../components/AliasAvatar';
8
+ import { useCollapsibleSearch } from '../components/CollapsibleSearch';
8
9
 
9
10
  interface MessageItem {
10
11
  id: string;
@@ -58,14 +59,14 @@ export default function MessagesPage() {
58
59
  const [search, setSearch] = useState('');
59
60
  const [debug, setDebug] = useState(false);
60
61
  const [viewMode, setViewMode] = useState<'timeline' | 'grouped'>('timeline');
61
- // #209 R33 (Vincent msg 563 WeChat direction): same magnifier-toggle
62
- // search pattern as R32 on /nodes. Inline ~290 px search input was
63
- // soaking up scroll real-estate on phones; collapse it behind a
64
- // top-right magnifier circle in the page header. Default closed;
65
- // open state autofocuses; an active search value with the box
66
- // closed shows a cyan dot on the icon as a "filter still applied"
67
- // hint, mirroring WeChat's red-dot unread marker.
68
- const [searchOpen, setSearchOpen] = useState(false);
62
+ // #209 R33→R34: WeChat-style magnifier-toggle search hook (shared with /nodes).
63
+ const searchCtl = useCollapsibleSearch({
64
+ value: search,
65
+ onChange: setSearch,
66
+ placeholder: 'Search from/to/content or use from:alias…',
67
+ label: 'Search messages',
68
+ enabled: messages.length > 0,
69
+ });
69
70
 
70
71
  const quickFromChips = useMemo(() => {
71
72
  const aliases = new Set<string>();
@@ -151,55 +152,12 @@ export default function MessagesPage() {
151
152
  </button>
152
153
  )}
153
154
  </div>
154
- {messages.length > 0 && (
155
- <button
156
- type="button"
157
- onClick={() => setSearchOpen(v => !v)}
158
- aria-label={searchOpen ? 'Close search' : 'Open search'}
159
- aria-pressed={searchOpen}
160
- title={searchOpen ? 'Close search' : 'Search messages'}
161
- className={`relative shrink-0 inline-flex items-center justify-center rounded-full border w-9 h-9 transition-colors ${
162
- searchOpen || search
163
- ? 'border-cyan-500/40 bg-cyan-500/10 text-cyan-300'
164
- : 'border-[#2a2a4a] bg-[#111128] text-gray-400 hover:text-gray-200 hover:border-[#3a3a5a]'
165
- }`}
166
- >
167
- <svg className="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={2}>
168
- <path strokeLinecap="round" strokeLinejoin="round" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" />
169
- </svg>
170
- {search && !searchOpen && (
171
- <span aria-hidden className="absolute -top-0.5 -right-0.5 w-2 h-2 rounded-full bg-cyan-400 ring-2 ring-[#0a0a1a]" />
172
- )}
173
- </button>
174
- )}
155
+ <searchCtl.Button />
175
156
  </div>
176
157
 
177
- {/* R33: collapsible search row renders when magnifier is open
178
- OR a search term is active so the user can see/clear it.
179
- Escape clears + closes; explicit Cancel button does the same. */}
180
- {messages.length > 0 && (searchOpen || search) && (
181
- <div className="mb-3 sm:mb-4 flex items-center gap-2">
182
- <input
183
- type="text"
184
- value={search}
185
- onChange={e => setSearch(e.target.value)}
186
- onKeyDown={e => { if (e.key === 'Escape') { setSearch(''); setSearchOpen(false); } }}
187
- placeholder="Search from/to/content or use from:alias…"
188
- autoFocus={searchOpen}
189
- className="flex-1 bg-[#111128] border border-[#2a2a4a] rounded-lg px-3 py-2 text-base sm:text-sm text-white placeholder-gray-600 focus:border-cyan-500/40 focus:outline-none"
190
- />
191
- {(search || searchOpen) && (
192
- <button
193
- type="button"
194
- onClick={() => { setSearch(''); setSearchOpen(false); }}
195
- className="shrink-0 text-xs text-gray-500 hover:text-gray-300 px-2 py-2"
196
- aria-label="Clear and close search"
197
- >
198
- Cancel
199
- </button>
200
- )}
201
- </div>
202
- )}
158
+ {/* #209 R34: shared <CollapsibleSearch> component. enabled gate
159
+ handles the no-content case (button + row both hide). */}
160
+ <searchCtl.Row />
203
161
 
204
162
  {/* Round 76: hide search + type filter + view toggle + Debug button
205
163
  when there are no messages at all. Same r70-class fix carried
@@ -6,6 +6,7 @@ import { useSessions, useHealth } from '../lib/hooks';
6
6
  import { TaskChatPanel } from '../components/TaskChatPanel';
7
7
  import { EmptyState, NodesEmptyState } from '../components/EmptyState';
8
8
  import { AliasAvatar } from '../components/AliasAvatar';
9
+ import { useCollapsibleSearch } from '../components/CollapsibleSearch';
9
10
  import type { Session } from '../components/types';
10
11
  import { SESSION_STATUS_CHIP_CLASS as STATUS_COLORS } from '../lib/status';
11
12
  import { useChatUnread } from '../lib/chat-unread';
@@ -34,15 +35,17 @@ export default function NodesPage() {
34
35
  const [search, setSearch] = useState('');
35
36
  const [viewMode, setViewMode] = useState<ViewMode>('list');
36
37
  const [chatAlias, setChatAlias] = useState<string | null>(null);
37
- // #209 R32 (Vincent msg 563 WeChat direction "搜索框学习微信放到右上角一个
38
- // 小圆圈"): the search input no longer lives inline in the filter row.
39
- // Instead a magnifier icon button sits in the top-right of the page
40
- // header (mirroring WeChat's chat-list header). Tapping it slides
41
- // a search field open below the header; tapping again (or clearing
42
- // and confirming) tucks it away. Default state: closed. Search value
43
- // is preserved across open/close so the filter applies even when the
44
- // input is hidden — only the input chrome collapses, not the filter.
45
- const [searchOpen, setSearchOpen] = useState(false);
38
+ // #209 R32→R34: the WeChat-style magnifier-toggle search was hand-rolled
39
+ // inline in R32. R34 extracted it to a shared hook so /nodes, /messages,
40
+ // and any future search surface stay visually + behaviourally identical.
41
+ // The hook returns a Button (place in header) + Row (place after header).
42
+ const searchCtl = useCollapsibleSearch({
43
+ value: search,
44
+ onChange: setSearch,
45
+ placeholder: 'Search nodes…',
46
+ label: 'Search nodes',
47
+ enabled: sessions.length > 0,
48
+ });
46
49
 
47
50
  const filtered: SessionRow[] = sessions
48
51
  .map(s => ({ ...s, online: !!sseFor(s) }))
@@ -77,60 +80,13 @@ export default function NodesPage() {
77
80
  {sessions.length} total
78
81
  </span>
79
82
  </div>
80
- {sessions.length > 0 && (
81
- <button
82
- type="button"
83
- onClick={() => setSearchOpen(v => !v)}
84
- aria-label={searchOpen ? 'Close search' : 'Open search'}
85
- aria-pressed={searchOpen}
86
- title={searchOpen ? 'Close search' : 'Search nodes'}
87
- className={`relative shrink-0 inline-flex items-center justify-center rounded-full border w-9 h-9 transition-colors ${
88
- searchOpen || search
89
- ? 'border-cyan-500/40 bg-cyan-500/10 text-cyan-300'
90
- : 'border-[#2a2a4a] bg-[#111128] text-gray-400 hover:text-gray-200 hover:border-[#3a3a5a]'
91
- }`}
92
- >
93
- {/* magnifier icon — matches the one used in CommandPalette &
94
- Sidebar quick-search for visual consistency */}
95
- <svg className="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={2}>
96
- <path strokeLinecap="round" strokeLinejoin="round" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" />
97
- </svg>
98
- {/* if a search term is active but the box is closed, a tiny
99
- cyan dot shows there is an active filter — same idea as
100
- the WeChat red-dot unread marker. */}
101
- {search && !searchOpen && (
102
- <span aria-hidden className="absolute -top-0.5 -right-0.5 w-2 h-2 rounded-full bg-cyan-400 ring-2 ring-[#0a0a1a]" />
103
- )}
104
- </button>
105
- )}
83
+ <searchCtl.Button />
106
84
  </div>
107
85
 
108
- {/* R32 collapsible search row only renders when the magnifier
109
- is toggled open OR a search term is active (so the user can
110
- see + clear it). Closes on Escape. */}
111
- {sessions.length > 0 && (searchOpen || search) && (
112
- <div className="mb-3 sm:mb-4 flex items-center gap-2">
113
- <input
114
- type="text"
115
- value={search}
116
- onChange={e => setSearch(e.target.value)}
117
- onKeyDown={e => { if (e.key === 'Escape') { setSearch(''); setSearchOpen(false); } }}
118
- placeholder="Search nodes…"
119
- autoFocus={searchOpen}
120
- className="flex-1 bg-[#111128] border border-[#2a2a4a] rounded-lg px-3 py-2 text-base sm:text-sm text-white placeholder-gray-600 focus:border-cyan-500/40 focus:outline-none"
121
- />
122
- {(search || searchOpen) && (
123
- <button
124
- type="button"
125
- onClick={() => { setSearch(''); setSearchOpen(false); }}
126
- className="shrink-0 text-xs text-gray-500 hover:text-gray-300 px-2 py-2"
127
- aria-label="Clear and close search"
128
- >
129
- Cancel
130
- </button>
131
- )}
132
- </div>
133
- )}
86
+ {/* #209 R34: shared <CollapsibleSearch> component handles row reveal,
87
+ autofocus, Escape, and Cancel. enabled=sessions.length>0 hides
88
+ everything until there's content to search. */}
89
+ <searchCtl.Row />
134
90
 
135
91
  {/* Status bar */}
136
92
  {sessions.length > 0 && (() => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sleep2agi/agent-network-dashboard",
3
- "version": "0.5.7-preview.38",
3
+ "version": "0.5.7-preview.39",
4
4
  "description": "Agent Network Dashboard — Web UI for managing AI Agent networks",
5
5
  "main": "apps/desktop/electron/main.cjs",
6
6
  "scripts": {