@wrongstack/webui-hq 0.299.0 → 0.300.0
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.
- package/dist/assets/{alerts-DMDGm1Rk.js → alerts-4bco1VuM.js} +1 -1
- package/dist/assets/{brain-CThvhPfH.js → brain-QY07hl6f.js} +1 -1
- package/dist/assets/cockpit-CTlOn_yS.js +1 -0
- package/dist/assets/{control-DfFOI2b8.js → control-B2bNy8I6.js} +1 -1
- package/dist/assets/{cost-BgTMK9-t.js → cost-BHJnZ7zB.js} +1 -1
- package/dist/assets/{fleet-map-BdJKS5l1.js → fleet-map-IuKuIH3B.js} +1 -1
- package/dist/assets/{fleet-topology--NWS9MVT.js → fleet-topology-CcdCIklO.js} +1 -1
- package/dist/assets/index-DHXA2NF6.js +2 -0
- package/dist/assets/{kanban-Cza8Uzw2.js → kanban-rtwcBJSU.js} +1 -1
- package/dist/assets/{live-console-go8KNMD3.js → live-console-aN0mrmnm.js} +1 -1
- package/dist/assets/{mailbox-CzJ8l7_F.js → mailbox-DYaKcxby.js} +1 -1
- package/dist/assets/{settings-DUBTEqcE.js → settings-VhTJrOKn.js} +1 -1
- package/dist/assets/{trends-WVVT_AEW.js → trends-DmGE_EIu.js} +1 -1
- package/dist/assets/{use-backfilled-events-Cdz-R54C.js → use-backfilled-events-CDmetvtR.js} +1 -1
- package/dist/assets/{worktree-DM1gfidB.js → worktree-BCuaYDT3.js} +1 -1
- package/dist/index.html +1 -1
- package/package.json +4 -4
- package/dist/assets/cockpit-C08zaO3u.js +0 -1
- package/dist/assets/index-BY6kl-Jl.js +0 -2
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{Wt as t,v as n}from"./icons-kYa9YuNu.js";import{i as r}from"./markdown-mWU1fYYi.js";import{c as i,p as a,s as o,u as s}from"./index-BY6kl-Jl.js";var c=e(t(),1),l=r();function u(){let{snapshot:e,alerts:t,selectedClientId:r,connected:u}=s(a(e=>({snapshot:e.snapshot,alerts:e.alerts,selectedClientId:e.selectedClientId,connected:e.connected}))),g=e,_=g?.totals,v=g?.machines??[],y=g?.projects??[],b=g?.clients??[],x=g?.liveSessions??[],S=y.filter(e=>e.governance!==void 0),C=S.filter(e=>e.governance?.signal.level===`warning`||e.governance?.signal.level===`unavailable`),w=b.filter(e=>e.capabilities.includes(`control.receive`)),T=r??w[0]?.clientId??null,E=w.find(e=>e.clientId===T)??w[0]??null,[D,O]=(0,c.useState)([]),[k,A]=(0,c.useState)([]),[j,M]=(0,c.useState)(null),[N,P]=(0,c.useState)(null),[F,I]=(0,c.useState)(null),[L,R]=(0,c.useState)(null),[z,B]=(0,c.useState)(null),[V,H]=(0,c.useState)(null);(0,c.useEffect)(()=>{let e=!1,t=()=>{o(`/api/system/health`).then(t=>{e||(B(t),H(null))}).catch(t=>{e||H(t instanceof Error?t.message:String(t))})};t();let n=setInterval(t,3e4);return()=>{e=!0,clearInterval(n)}},[]),(0,c.useEffect)(()=>{let e=!1,t=()=>{o(`/api/alerts`).then(t=>{e||(O(t.active),A(t.history),M(null))}).catch(t=>{e||M(t instanceof Error?t.message:String(t))})};t();let n=setInterval(t,15e3);return()=>{e=!0,clearInterval(n)}},[]);let U=(0,c.useMemo)(()=>{let e=t.slice(-30).reverse().map(e=>({severity:typeof e.severity==`string`?e.severity:`info`,ruleId:e.type??`hq.alert`,message:typeof e.message==`string`?e.message:`Alert envelope received`,timestamp:typeof e.timestamp==`string`?e.timestamp:new Date().toISOString()})),n=[...D??[],...k??[]].slice(-30).reverse().map(e=>({severity:typeof e.severity==`string`?e.severity:`info`,ruleId:typeof e.ruleId==`string`?e.ruleId:`alert`,message:typeof e.message==`string`?e.message:``,timestamp:typeof e.lastFiredAt==`string`?e.lastFiredAt:typeof e.firstFiredAt==`string`?e.firstFiredAt:new Date().toISOString()})),r=[...e,...n],i=new Set,a=[];for(let e of r){let t=`${e.ruleId}|${e.message}|${e.timestamp}`;if(!i.has(t)&&(i.add(t),a.push(e),a.length>=12))break}return a},[t,D,k]),W=(0,c.useMemo)(()=>{let e=0,t=0,n=0,r=0,i=0;for(let a of x){a.status===`active`&&(i+=1);for(let i of a.agents??[])e+=1,i.status===`running`||i.status===`streaming`?t+=1:i.status===`waiting_user`?n+=1:i.status===`error`&&(r+=1)}return{total:e,busy:t,waiting:n,errored:r,activeSessions:i}},[x]),G=(0,c.useMemo)(()=>[...y].sort((e,t)=>t.totalCostUsd-e.totalCostUsd).slice(0,4),[y]);async function K(e){if(E!==null){P(e),I(null),R(null);try{let t=e===`pause-noisy`?{subject:`HQ quick action: pause noisy agents`,body:`HQ operator requests: pause non-critical/noisy agent work, reduce chatter, and keep only essential status updates until resumed.`,priority:`high`}:{subject:`HQ quick action: status request`,body:`HQ operator requests a concise status broadcast from active agents: current task, blocker if any, and next expected action.`,priority:`normal`},n=await i(E.clientId,`broadcast`,t);I(`queued ${n.commandId}`)}catch(e){R(e instanceof Error?e.message:String(e))}finally{P(null)}}}let q=[{title:`Fleet`,view:`fleet`,cta:`open fleet`,body:(0,l.jsxs)(`div`,{className:`hq-cockpit-grid`,children:[(0,l.jsx)(d,{label:`machines`,value:v.length}),(0,l.jsx)(d,{label:`clients`,value:b.length}),(0,l.jsx)(d,{label:`sessions`,value:W.activeSessions,accent:W.activeSessions>0?`green`:void 0}),(0,l.jsx)(d,{label:`agents`,value:W.total}),(0,l.jsx)(d,{label:`busy`,value:W.busy,accent:W.busy>0?`green`:void 0}),(0,l.jsx)(d,{label:`waiting`,value:W.waiting,accent:W.waiting>0?`warn`:void 0}),(0,l.jsx)(d,{label:`errored`,value:W.errored,accent:W.errored>0?`error`:void 0}),(0,l.jsx)(d,{label:`cost $`,value:(_?.totalCostUsd??0).toFixed(2),accent:`green`})]})}],J={title:`Auth Tokens`,view:`settings`,cta:`open settings`,body:(0,l.jsx)(f,{tokenStats:_?.tokenStats})},Y={title:`Governance Advisory`,view:`fleet`,cta:`open fleet`,body:S.length===0?(0,l.jsx)(`div`,{className:`hq-empty hq-cockpit-empty`,children:`No project governance snapshots yet.`}):(0,l.jsx)(`div`,{className:`hq-cockpit-alert-list`,children:S.map(e=>{let t=e.governance;return t===void 0?null:(0,l.jsxs)(`div`,{className:`hq-cockpit-alert-row`,children:[(0,l.jsx)(`span`,{className:`hq-pill ${t.signal.level===`healthy`?`green`:t.signal.level===`notice`?`warn`:`error`}`,children:t.signal.level}),(0,l.jsx)(`span`,{children:e.projectName}),(0,l.jsx)(`span`,{className:`hq-mono hq-cockpit-alert-msg`,children:t.signal.code}),(0,l.jsx)(`span`,{className:`hq-mono hq-text-dim hq-ml-auto`,children:t.signal.executionDisposition})]},e.projectId)})})},X={title:`Alerts`,view:`alerts`,cta:`open alerts`,body:U.length===0?(0,l.jsx)(`div`,{className:`hq-empty hq-cockpit-empty`,children:`No alerts in the last few minutes.`}):(0,l.jsx)(`div`,{className:`hq-cockpit-alert-list`,children:U.map((e,t)=>(0,l.jsxs)(`div`,{className:`hq-cockpit-alert-row`,children:[(0,l.jsx)(`span`,{className:`hq-pill `+h(e.severity),children:e.severity}),(0,l.jsx)(`span`,{className:`hq-mono`,children:e.ruleId}),(0,l.jsx)(`span`,{className:`hq-cockpit-alert-msg`,children:e.message}),(0,l.jsx)(`span`,{className:`hq-mono hq-text-dim hq-ml-auto`,children:m(e.timestamp)})]},`${e.ruleId}-${e.timestamp}-${t}`))})},Z={title:`Cost`,view:`cost`,cta:`open cost`,body:G.length===0?(0,l.jsx)(`div`,{className:`hq-empty hq-cockpit-empty`,children:`No cost data yet — connect some clients.`}):(0,l.jsx)(`div`,{className:`hq-cockpit-cost-list`,children:G.map(e=>{let t=(_?.totalCostUsd??0)>0?e.totalCostUsd/_.totalCostUsd*100:0;return(0,l.jsxs)(`div`,{className:`hq-cockpit-cost-row`,children:[(0,l.jsxs)(`div`,{className:`hq-cockpit-cost-line`,children:[(0,l.jsx)(`span`,{className:`hq-cockpit-cost-name`,children:e.projectName}),(0,l.jsx)(`span`,{className:`hq-mono hq-text-dim`,children:e.projectId}),(0,l.jsxs)(`span`,{className:`hq-mono hq-cockpit-cost-amount hq-ml-auto`,children:[`$`,e.totalCostUsd.toFixed(4)]}),(0,l.jsxs)(`span`,{className:`hq-mono hq-text-dim`,children:[t.toFixed(1),`%`]})]}),(0,l.jsx)(`div`,{className:`hq-cockpit-cost-bar`,role:`progressbar`,"aria-label":`${e.projectName} share of fleet cost`,"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":Number(t.toFixed(1)),children:(0,l.jsx)(`span`,{style:{width:`${Math.max(2,t)}%`}})}),(0,l.jsxs)(`div`,{className:`hq-cockpit-cost-meta`,children:[(0,l.jsxs)(`span`,{children:[e.activeSessions,` sessions`]}),(0,l.jsxs)(`span`,{children:[e.activeSubagents,` subagents`]}),(0,l.jsxs)(`span`,{children:[e.activeClients,` clients`]})]})]},e.projectId)})})};return(0,l.jsxs)(`div`,{children:[(0,l.jsx)(`div`,{className:`hq-card-title`,children:`Cockpit`}),(0,l.jsxs)(`div`,{className:`hq-card hq-cockpit-summary`,children:[(0,l.jsxs)(`div`,{className:`hq-row`,children:[(0,l.jsx)(`span`,{className:`hq-pill info`,children:u?`connected`:`reconnecting`}),(0,l.jsxs)(`span`,{className:`hq-pill`,children:[_?.activeMachines??0,` machines`]}),(0,l.jsxs)(`span`,{className:`hq-pill`,children:[_?.activeSessions??0,` sessions`]}),(0,l.jsxs)(`span`,{className:`hq-pill`,children:[_?.activeAgents??0,` agents`]}),(0,l.jsxs)(`span`,{className:`hq-pill green`,children:[`$`,(_?.totalCostUsd??0).toFixed(2)]}),(D?.length??0)>0&&(0,l.jsxs)(`span`,{className:`hq-pill error`,children:[D?.length??0,` active alerts`]}),C.length>0&&(0,l.jsxs)(`span`,{className:`hq-pill error`,children:[C.length,` governance advisories`]}),j!==null&&(0,l.jsx)(`span`,{className:`hq-pill error`,children:j}),(0,l.jsx)(`button`,{type:`button`,className:`hq-btn secondary hq-ml-auto`,onClick:()=>s.getState().setActiveView(`fleet`),children:`Open Fleet`})]}),(0,l.jsxs)(`section`,{className:`hq-cockpit-actions`,"aria-label":`Cockpit quick actions`,children:[(0,l.jsxs)(`div`,{className:`hq-cockpit-actions-copy`,children:[(0,l.jsx)(`span`,{className:`hq-cockpit-section-title`,children:`Quick Actions`}),(0,l.jsx)(`span`,{className:`hq-mono`,children:E===null?`no controllable client connected`:`target ${p(E.clientId)}`})]}),(0,l.jsxs)(`div`,{className:`hq-cockpit-actions-buttons`,children:[(0,l.jsx)(`button`,{type:`button`,className:`hq-btn secondary`,disabled:E===null||N!==null,onClick:()=>void K(`pause-noisy`),children:N===`pause-noisy`?`Queuing…`:`Pause noisy agents`}),(0,l.jsx)(`button`,{type:`button`,className:`hq-btn secondary`,disabled:E===null||N!==null,onClick:()=>void K(`status-request`),children:N===`status-request`?`Queuing…`:`Broadcast status request`}),(0,l.jsx)(`button`,{type:`button`,className:`hq-btn secondary`,onClick:()=>s.getState().setActiveView(`control`),children:`Open Control`})]}),F!==null&&(0,l.jsx)(`span`,{className:`hq-pill info`,children:F}),L!==null&&(0,l.jsx)(`span`,{className:`hq-pill error`,children:L})]})]}),z!==null||V!==null?(0,l.jsxs)(`div`,{className:`hq-card hq-cockpit-section`,children:[(0,l.jsxs)(`div`,{className:`hq-row`,children:[(0,l.jsxs)(`span`,{className:`hq-cockpit-section-title`,children:[(0,l.jsx)(n,{size:14,style:{marginRight:`0.375rem`}}),`System Health`]}),(0,l.jsx)(`button`,{type:`button`,className:`hq-btn secondary hq-ml-auto`,onClick:()=>s.getState().setActiveView(`settings`),children:`open settings`})]}),V===null?z===null?null:(0,l.jsxs)(`div`,{className:`hq-cockpit-grid`,children:[(0,l.jsx)(d,{label:`status`,value:z.status,accent:z.status===`healthy`?`green`:`error`}),(0,l.jsx)(d,{label:`event log`,value:z.uptime.eventLogSize}),(0,l.jsx)(d,{label:`connections`,value:z.connections.total}),(0,l.jsx)(d,{label:`active`,value:z.connections.active,accent:z.connections.active>0?`green`:void 0}),(0,l.jsx)(d,{label:`stale`,value:z.connections.stale,accent:z.connections.stale>3?`warn`:void 0})]}):(0,l.jsx)(`div`,{className:`hq-empty hq-cockpit-empty`,children:V})]}):null,[...q,Y,J,X,Z].map(e=>(0,l.jsxs)(`div`,{className:`hq-card hq-cockpit-section`,children:[(0,l.jsxs)(`div`,{className:`hq-row`,children:[(0,l.jsx)(`span`,{className:`hq-cockpit-section-title`,children:e.title}),(0,l.jsx)(`button`,{type:`button`,className:`hq-btn secondary hq-ml-auto`,onClick:()=>s.getState().setActiveView(e.view),children:e.cta})]}),e.body]},e.title))]})}function d({label:e,value:t,accent:n}){return(0,l.jsxs)(`div`,{className:`hq-stat`+(n?` ${n}`:``),children:[(0,l.jsx)(`span`,{className:`hq-stat-num`,children:t}),(0,l.jsx)(`span`,{className:`hq-stat-label`,children:e})]})}function f({tokenStats:e}){if(e===void 0)return(0,l.jsx)(`div`,{className:`hq-empty hq-cockpit-empty`,children:`Token expiry stats unavailable on this HQ version.`});let{browserTotal:t,clientTotal:n,expired:r,expiringSoon:i}=e,a=t+n;return(0,l.jsxs)(`fieldset`,{className:`hq-cockpit-grid`,"aria-label":`Auth token stats`,style:{border:0,margin:0,padding:0},children:[(0,l.jsx)(d,{label:`browser`,value:t}),(0,l.jsx)(d,{label:`client`,value:n}),(0,l.jsx)(d,{label:`total`,value:a}),(0,l.jsx)(d,{label:`expired`,value:r,accent:r>0?`error`:void 0}),(0,l.jsx)(d,{label:`expiring soon`,value:i,accent:i>0?`warn`:void 0})]})}function p(e){return e.length<=18?e:`${e.slice(0,9)}…${e.slice(-6)}`}function m(e){let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleTimeString()}function h(e){return e===`critical`||e===`error`||e===`high`?`error`:e===`warn`||e===`warning`||e===`medium`?`warn`:e===`info`||e===`low`?`info`:`idle`}export{u as CockpitView};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/cockpit-C08zaO3u.js","assets/rolldown-runtime-QTnfLwEv.js","assets/icons-kYa9YuNu.js","assets/markdown-mWU1fYYi.js","assets/fleet-map-BdJKS5l1.js","assets/vendor-5Eg_tZuH.js","assets/fleet-topology--NWS9MVT.js","assets/live-console-go8KNMD3.js","assets/mailbox-CzJ8l7_F.js","assets/use-backfilled-events-Cdz-R54C.js","assets/kanban-Cza8Uzw2.js","assets/cost-BgTMK9-t.js","assets/brain-CThvhPfH.js","assets/worktree-DM1gfidB.js","assets/trends-WVVT_AEW.js","assets/alerts-DMDGm1Rk.js","assets/control-DfFOI2b8.js","assets/settings-DUBTEqcE.js"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{At as t,B as n,D as r,E as i,F as a,J as o,Lt as s,M as c,Q as l,S as u,Ut as d,Vt as f,Wt as p,Z as m,_ as h,a as ee,bt as te,c as g,gt as ne,ht as _,i as re,j as v,kt as ie,m as y,n as b,o as ae,ot as oe,u as se,v as ce,w as x,wt as S,yt as le,zt as ue}from"./icons-kYa9YuNu.js";import{t as de}from"./vendor-5Eg_tZuH.js";import{i as fe}from"./markdown-mWU1fYYi.js";(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var pe={maxReconnectAttempts:10,initialBackoffMs:1e3,maxBackoffMs:3e4,backoffMultiplier:2,jitterRatio:0,queueLimit:1e3,heartbeatIntervalMs:0,heartbeatTimeoutMs:0};function me(){return{phase:`idle`,reconnectAttempt:0,lastActivityAt:null,stopped:!1}}function he(e){return e.stopped?e:{...e,phase:`connecting`}}function ge(e,t=Date.now()){return{...e,phase:`open`,reconnectAttempt:0,lastActivityAt:t,stopped:!1}}function _e(e,t=Date.now()){return{...e,lastActivityAt:t}}function ve(e){return{...e,phase:`closed`,stopped:!0}}function ye(e,t,n=Date.now(),r=Math.random){if(e.stopped||e.reconnectAttempt>=t.maxReconnectAttempts)return{state:{...e,phase:`closed`},plan:null};let i=e.reconnectAttempt+1,a=Math.min(t.initialBackoffMs*t.backoffMultiplier**(i-1),t.maxBackoffMs),o=(r()*2-1)*t.jitterRatio,s=Math.max(0,Math.round(a*(1+o)));return{state:{...e,phase:`reconnecting`,reconnectAttempt:i},plan:{attempt:i,delayMs:s,retryAt:n+s}}}function be(e,t,n=Date.now()){return e.phase!==`open`||e.lastActivityAt===null||t.heartbeatIntervalMs<=0?!1:n-e.lastActivityAt>t.heartbeatIntervalMs+t.heartbeatTimeoutMs}var xe=`abort,ping,user_message,tool.confirm_result,completion.request,model.switch,model.refine,autonomy.switch,context.clear,context.compact,context.debug,context.editor.open,context.editor.validate,context.editor.apply,context.mode.create,context.mode.delete,context.mode.switch,context.mode.update,context.modes.list,context.repair,mode.switch,modes.list,session.checkpoints,session.delete,session.inspect,session.new,session.rename,session.resume,session.rewind,session.save,sessions.list,side_effects.list,stats.get,todo.update,todos.clear,todos.get,todos.remove`.split(`,`),Se=[`collab.join`,`collab.leave`,`collab.annotate`,`collab.resolve`,`collab.request_pause`,`collab.resume`,`collab.grant_control`,`collab.inject_tool`,`mailbox.action`,`mailbox.agents`,`mailbox.clear`,`mailbox.compact`,`mailbox.messages`,`mailbox.purge`,`mailbox.send`],Ce=`brain.ask,brain.config.get,brain.config.set,brain.risk,brain.status,chronicle.facet,chronicle.facets,chronicle.graph,chronicle.metrics,chronicle.query,chronicle.status,config.doctor,design.list,design.materialize,design.set,design.state,design.swap,design.tune,design.use,design.verify,memory.list,memory.sage.backfillRecoverable,memory.sage.candidateResolve,memory.sage.delete,memory.sage.forFile,memory.sage.get,memory.sage.graph,memory.sage.list,memory.sage.listPage,memory.sage.recover,memory.sage.remember,memory.sage.update`.split(`,`),we=`auth.oauth.cancel,auth.oauth.code,auth.oauth.start,mcp.add,mcp.disable,mcp.discover,mcp.enable,mcp.list,mcp.prompt.get,mcp.prompts,mcp.remove,mcp.resource.read,mcp.resources,mcp.restart,mcp.sleep,mcp.update,mcp.wake,prompts.content,prompts.create,prompts.favorite,prompts.list,prompts.recent,prompts.search,prompts.used,skills.content,skills.create,skills.edit,skills.export,skills.install,skills.list,skills.uninstall,skills.update`.split(`,`),Te=`goal-state.get,goal.addTask,goal.assess,goal.assignTask,goal.clear,goal.get,goal.list,goal.load,goal.moveTask,goal.pause,goal.resume,goal.retryTask,goal.revert,goal.runTask,goal.save,goal.selectPhase,goal.start,goal.state,goal.status,goal.stop,goal.taskStatus,goal.toggleAutonomous,plan.get,plan.item.update,plan.template_use,task.update,tasks.get`.split(`,`),Ee=`sdd.board.cancel_task,sdd.board.cleanup_worktrees,sdd.board.delete_task,sdd.board.destroy,sdd.board.get,sdd.board.list,sdd.board.pause,sdd.board.reassign,sdd.board.resume,sdd.board.retry,sdd.board.retry_all_failed,sdd.board.rollback,sdd.board.set_task_fallbacks,sdd.board.set_task_model,sdd.board.set_task_verification,sdd.board.split_task,sdd.board.stop,sdd.run.from_graph,sdd.run.from_spec,sdd.run.start,sdd.spec.approve,sdd.spec.discard,sdd.spec.get,sdd.spec.message,sdd.spec.start,specs.get,specs.list,specs.taskStatus`.split(`,`),De=[`files.list`,`files.read`,`files.tree`,`files.write`,`git.changes`,`git.diff`,`git.info`,`projects.add`,`projects.list`,`projects.select`,`working_dir.set`,`worktree.cleanup`,`worktree.diff`,`worktree.merge`,`worktree.remove`,`worktree.scan`,`shell.open`,`process.kill`,`process.killAll`,`process.list`,`terminal.close`,`terminal.create`,`terminal.input`,`terminal.resize`],Oe=`codebase.index.server.shutdown,connections.health,connections.service_action,diag.get,key.add,key.delete,key.set_active,key.update,prefs.get,prefs.update,provider.add,provider.clear_models,provider.custom_models.remove,provider.custom_models.set,provider.models,provider.models.search,provider.probe,provider.remove,provider.status.clear,provider.status.get,provider.status.retry,provider.undo_clear,provider.update,providers.list,providers.saved,tool.disable,tool.enable,tools.list,webui.shutdown`.split(`,`),ke=`error,log,pong,side_effects,agent.status_changed,agent.timeline.message,client.status_update,chimera.report_available,compaction.failed,completion.result,context.compacted,context.debug,context.editor.snapshot,context.editor.validation,context.editor.applied,context.mode.changed,context.modes.list,context.repaired,ctx.max_context,ctx.pct,delegate.completed,delegate.started,iteration.completed,iteration.limit_reached,iteration.started,model.refine_result,modes.list,provider.active_blocked,provider.error,provider.fallback,provider.response,provider.retry,provider.status_changed,provider.stream_error,provider.text_delta,provider.thinking_delta,run.result,session.checkpoints,session.damaged,session.end,session.inspect,session.rewound,session.start,session.stats,sessions.list,sessions.status_update,stats.get,token.cost_estimate_unavailable,token.threshold,tool.confirm_needed,tool.disabled,tool.enabled,tool.executed,tool.loop_detected,tool.progress,tool.started,tools.list,trust.persisted`.split(`,`),Ae=[`collab.annotation.added`,`collab.annotation.resolved`,`collab.event`,`collab.injection.granted`,`collab.participant.joined`,`collab.participant.left`,`collab.pause.granted`,`collab.pause.released`,`collab.state`,`mailbox.action_result`,`mailbox.agent_registered`,`mailbox.agents`,`mailbox.cleared`,`mailbox.compacted`,`mailbox.event`,`mailbox.messages`,`mailbox.sent`,`mailbox.purged`,`mailbox.received`,`subagent.budget_extended`,`subagent.event`],je=`brain.answer,brain.config,brain.event,brain.status,chronicle.error,chronicle.facet_result,chronicle.facets_result,chronicle.graph_result,chronicle.metrics_result,chronicle.query_result,chronicle.status_result,config.doctor.result,design.list,design.materialize,design.set,design.state,design.swap,design.tune,design.use,design.verify,memory.event,memory.list,memory.sage.backfillRecoverable,memory.sage.candidateResolve,memory.sage.delete,memory.sage.forFile,memory.sage.get,memory.sage.graph,memory.sage.list,memory.sage.listPage,memory.sage.recover,memory.sage.remember,memory.sage.update`.split(`,`),Me=`mcp.content.error,mcp.content.selected,mcp.list,mcp.operation_result,mcp.prompts,mcp.resources,mcp.server.added,mcp.server.connected,mcp.server.disconnected,mcp.server.discovered,mcp.server.error,mcp.server.reconnected,mcp.server.removed,mcp.server.sleeping,mcp.server.updated,mcp.server.waking,prompts.content,prompts.created,prompts.favorite,prompts.list,prompts.recent,prompts.search,prompts.used,skills.content,skills.created,skills.edited,skills.exported,skills.installed,skills.list,skills.uninstalled,skills.updated`.split(`,`),Ne=`budget.decision,budget.threshold_reached,coordinator.stats,coordinator.status,eternal.iteration,fleet.concurrency_update,goal-state.updated,goal.assess.result,goal.list,goal.paused,goal.resumed,goal.saved,goal.error,goal.stopped,goal.failed,goal.completed,goal.cleared,goal.reverted,goal.progress,goal.state,in_flight.ended,in_flight.started,plan.updated,task.completed,task.failed,task.pending,task.started,tasks.updated,todos.cleared,todos.updated`.split(`,`),Pe=[`kanban.task.activity`,`sdd.board.lifecycle_result`,`sdd.board.list`,`sdd.board.snapshot`,`sdd.run.started`,`sdd.spec.agent_text`,`sdd.spec.error`,`sdd.spec.snapshot`,`specs.detail`,`specs.list`],Fe=[`consensus.vote_cast`,`consensus.vote_initiated`,`consensus.vote_resolved`,`cron.job_fired`,`cron.snapshot`,`techstack.job.cancelled`,`techstack.job.failed`,`techstack.job.progress`,`techstack.job.started`,`techstack.report.delivered`,`techstack.report.ready`,`techstack.snapshot.updated`,`techstack.workspace.completed`],Ie=`checkpoint.written,codemap.file_event,codemap.index_updated,codemap.tool_executed,codemap.tool_started,file.saved,files.list,files.read,files.tree,files.written,git.changes,git.diff,git.info,process.list,projects.added,projects.list,projects.selected,terminal.exit,terminal.output,working_dir.changed,worktree.cleanup_result,worktree.diff_result,worktree.event,worktree.merge_result,worktree.orphans,worktree.state`.split(`,`),Le=[`auth.oauth.status`,`codebase.index.server.shutdown_result`,`connections.health_error`,`connections.health_result`,`connections.service_action_result`,`diag.get`,`key.operation_result`,`model.switch_result`,`prefs.updated`,`provider.catalog`,`provider.models`,`provider.models.search_result`,`provider.probe`,`provider.status.snapshot`,`providers.saved`],Re=[...xe,...Se,...De,...Oe,...Te,...Ee,...Ce,...we],ze=[...ke,...Ae,...Ie,...Le,...Ne,...Pe,...Fe,...je,...Me];new Set(Re),new Set(ze);function C(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:null}function w(e,t=0){return typeof e==`number`&&Number.isFinite(e)?e:t}function T(e){return e===void 0||Array.isArray(e)}function Be(e){return w(e.activeProjects)===e.activeProjects&&w(e.activeClients)===e.activeClients&&w(e.activeSessions)===e.activeSessions&&w(e.activeSubagents)===e.activeSubagents&&w(e.unreadMailboxMessages)===e.unreadMailboxMessages&&w(e.incompleteMailboxMessages)===e.incompleteMailboxMessages&&w(e.totalCostUsd)===e.totalCostUsd}function Ve(e){if(e.type!==`hq.snapshot`)return null;let t=C(e.snapshot),n=t?C(t.totals):null;return!t||typeof t.generatedAt!=`string`||!Array.isArray(t.clients)||!Array.isArray(t.projects)||!Array.isArray(t.sessions)||!Array.isArray(t.fleets)||!Array.isArray(t.mailboxes)||!n||!Be(n)||!T(t.machines)||!T(t.liveSessions)||!T(t.mcpServers)?null:{kind:`hq-snapshot`,snapshot:t}}function He(e){if(e.type!==`hq.event`)return null;let t=C(e.event);return!t||typeof t.id!=`string`||typeof t.type!=`string`||typeof t.timestamp!=`string`||typeof t.clientId!=`string`||typeof t.projectId!=`string`||typeof t.seq!=`number`?null:{kind:`hq-event`,event:t}}function Ue(e){return e.type!==`hq.alert`||typeof e.severity!=`string`||![`info`,`warn`,`error`].includes(e.severity)||typeof e.message!=`string`||typeof e.timestamp!=`string`?null:{kind:`hq-alert`,alert:e}}function We(e){if(e.type!==`hq.command_status`)return null;let t=C(e.command);return!t||typeof t.commandId!=`string`||typeof t.type!=`string`||typeof t.clientId!=`string`||typeof t.enqueuedBy!=`string`||typeof t.enqueuedAt!=`string`||typeof t.status!=`string`||![`queued`,`delivered`,`acked`].includes(t.status)?null:{kind:`hq-command-status`,command:t}}var E=e(p(),1),Ge=de(),Ke=e=>Symbol.iterator in e,qe=e=>`entries`in e,Je=(e,t)=>{let n=e instanceof Map?e:new Map(e.entries()),r=t instanceof Map?t:new Map(t.entries());if(n.size!==r.size)return!1;for(let[e,t]of n)if(!r.has(e)||!Object.is(t,r.get(e)))return!1;return!0},Ye=(e,t)=>{let n=e[Symbol.iterator](),r=t[Symbol.iterator](),i=n.next(),a=r.next();for(;!i.done&&!a.done;){if(!Object.is(i.value,a.value))return!1;i=n.next(),a=r.next()}return!!i.done&&!!a.done};function Xe(e,t){return Object.is(e,t)?!0:typeof e!=`object`||!e||typeof t!=`object`||!t||Object.getPrototypeOf(e)!==Object.getPrototypeOf(t)?!1:Ke(e)&&Ke(t)?qe(e)&&qe(t)?Je(e,t):Ye(e,t):Je({entries:()=>Object.entries(e)},{entries:()=>Object.entries(t)})}function D(e){let t=E.useRef(void 0);return n=>{let r=e(n);return Xe(t.current,r)?t.current:t.current=r}}var O=`wrongstack.hq.token.v1`;function k(){if(typeof window>`u`)return null;try{let e=new URLSearchParams(window.location.search).get(`token`);return e!==null&&e.length>0?e:null}catch{return null}}function A(){if(typeof window>`u`)return null;try{return window.sessionStorage??null}catch{return null}}function j(){try{let e=A()?.getItem(O)??null;return e!==null&&e.length>0?e:null}catch{return null}}function M(e){try{A()?.setItem(O,e)}catch{}}function N(){try{A()?.removeItem(O)}catch{}}function P(){let e=k();return e===null?j():(M(e),e)}function Ze(){if(typeof window>`u`)return;let e=k();if(e!==null&&(M(e),j()===e))try{let e=new URL(window.location.href);e.searchParams.delete(`token`),window.history.replaceState(null,``,`${e.pathname}${e.search}${e.hash}`)}catch{}}function Qe(){let e=P();return e===null?{}:{Authorization:`Bearer ${e}`}}function F(e,t){let n={...t?.headers??{},...Qe()};return fetch(e,{...t,headers:n})}function $e(){if(typeof window>`u`)return null;try{let e=window.location.hash;if(!e.startsWith(`#bootstrap=`))return null;let t=e.slice(11);return t.length>0?t:null}catch{return null}}function et(){if(!(typeof window>`u`))try{let e=new URL(window.location.href);e.hash.startsWith(`#bootstrap=`)&&(e.hash=``,window.history.replaceState(null,``,`${e.pathname}${e.search}`))}catch{}}async function tt(){let e=$e();if(e===null)return!1;try{return(await fetch(`/api/auth/bootstrap`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({code:e}),credentials:`same-origin`,signal:AbortSignal.timeout(1e4)})).ok?(et(),N(),!0):!1}catch{return!1}}async function nt(){if(j()===null)return!1;try{let e=await fetch(`/api/auth/upgrade`,{method:`POST`,headers:Qe(),credentials:`same-origin`,signal:AbortSignal.timeout(1e4)});return!e.ok||(await e.json()).loggedIn!==!0?!1:(N(),!0)}catch{return!1}}var rt=e=>{let t,n=new Set,r=(e,r)=>{let i=typeof e==`function`?e(t):e;if(!Object.is(i,t)){let e=t;t=r??(typeof i!=`object`||!i)?i:Object.assign({},t,i),n.forEach(n=>n(t,e))}},i=()=>t,a={setState:r,getState:i,getInitialState:()=>o,subscribe:e=>(n.add(e),()=>n.delete(e))},o=t=e(r,i,a);return a},it=(e=>e?rt(e):rt),at=e=>e;function ot(e,t=at){let n=E.useSyncExternalStore(e.subscribe,E.useCallback(()=>t(e.getState()),[e,t]),E.useCallback(()=>t(e.getInitialState()),[e,t]));return E.useDebugValue(n),n}var st=e=>{let t=it(e),n=e=>ot(t,e);return Object.assign(n,t),n},ct=(e=>e?st(e):st),lt=6e3,ut=0,I=ct()(e=>({toasts:[],addToast:(t,n=`info`,r=lt,i)=>{let a=`toast-${++ut}-${Date.now()}`,o={id:a,message:t,severity:n,createdAt:Date.now(),ttlMs:r,action:i};e(e=>({toasts:[...e.toasts.slice(-4),o]})),r>0&&setTimeout(()=>{e(e=>({toasts:e.toasts.filter(e=>e.id!==a)}))},r)},removeToast:t=>e(e=>({toasts:e.toasts.filter(e=>e.id!==t)})),clearToasts:()=>e({toasts:[]})})),L=fe(),dt={error:(0,L.jsx)(S,{size:16,"aria-hidden":`true`}),warning:(0,L.jsx)(g,{size:16,"aria-hidden":`true`}),info:(0,L.jsx)(m,{size:16,"aria-hidden":`true`}),success:(0,L.jsx)(t,{size:16,"aria-hidden":`true`})};function ft(){let{toasts:e,removeToast:t}=I(D(e=>({toasts:e.toasts,removeToast:e.removeToast})));return e.length===0?null:(0,L.jsx)(`div`,{className:`hq-toast-container`,role:`status`,"aria-live":`polite`,"aria-label":`Notifications`,children:e.map(e=>(0,L.jsxs)(`div`,{className:`hq-toast hq-toast--${e.severity}`,"data-severity":e.severity,children:[(0,L.jsx)(`span`,{className:`hq-toast-icon`,children:dt[e.severity]}),(0,L.jsx)(`span`,{className:`hq-toast-message`,children:e.message}),e.action?(0,L.jsx)(`span`,{className:`hq-toast-action`,children:e.action}):null,(0,L.jsx)(`button`,{type:`button`,className:`hq-toast-close`,"aria-label":`Dismiss notification`,onClick:()=>t(e.id),children:(0,L.jsx)(b,{size:12})})]},e.id))})}var pt=new Set([`graceful`,`crash`,`heartbeat-timeout`,`auth-revoked`]),R=`__hq_peer__`;function mt(e){return e===void 0||typeof e==`string`}function ht(e){if(typeof e!=`object`||!e||Array.isArray(e))return!1;let t=e;return!(typeof t.projectId!=`string`||t.projectId.length===0||typeof t.machineId!=`string`||t.machineId.length===0||typeof t.leaderClientId!=`string`||t.leaderClientId.length===0||typeof t.previousLeaderHandle!=`string`||t.previousLeaderHandle.length===0||typeof t.reason!=`string`||!pt.has(t.reason)||typeof t.detectedAt!=`string`||!Number.isFinite(Date.parse(t.detectedAt))||!mt(t.rehydrateHint)||t.rehydrateHint!==void 0&&t.rehydrateHint.length>280||!mt(t.rehydrateCommandId))}function gt(e){if(typeof e!=`object`||!e||Array.isArray(e))return!1;let t=e;return!(typeof t.projectId!=`string`||t.projectId.length===0||typeof t.machineId!=`string`||t.machineId.length===0||typeof t.leaderClientId!=`string`||t.leaderClientId.length===0||typeof t.previousLeaderHandle!=`string`||t.previousLeaderHandle.length===0||typeof t.reason!=`string`||!pt.has(t.reason)||typeof t.detectedAt!=`string`||!Number.isFinite(Date.parse(t.detectedAt)))}function _t(e,t){let n=t.liveSessions??[],r=e.selectedSessionId===null?void 0:n.find(t=>t.sessionId===e.selectedSessionId),i=e.selectedAgentId===null||r?.agents.some(t=>t.id===e.selectedAgentId)===!0,a=e.selectedClientId===null||t.clients.some(t=>t.clientId===e.selectedClientId);return{snapshot:t,...e.selectedSessionId!==null&&r===void 0?{selectedSessionId:null,selectedAgentId:null}:i?{}:{selectedAgentId:null},...a?{}:{selectedClientId:null}}}function vt(e,t){return e.timestamp===t.timestamp&&e.severity===t.severity&&e.message===t.message}var z=ct()(e=>({snapshot:null,events:[],alerts:[],commandStatuses:[],activeView:`cockpit`,selectedSessionId:null,selectedAgentId:null,selectedClientId:null,connected:!1,authRequired:!1,resumeCursors:{},needsSnapshotRefresh:!1,peerRehydrate:null,setActiveView:t=>e({activeView:t}),selectSession:(t,n=null)=>e({selectedSessionId:t,selectedAgentId:n}),selectAgent:(t,n)=>e({selectedSessionId:t,selectedAgentId:n}),selectClient:t=>e({selectedClientId:t}),markAuthRequired:()=>e(e=>e.authRequired?{}:{authRequired:!0}),_hydrateSnapshot:t=>e(e=>e.snapshot===null?_t(e,t):{}),_onSnapshot:t=>e(e=>{let n=e.snapshot;return n!==null&&typeof n.generatedAt==`string`&&typeof t.generatedAt==`string`&&Date.parse(t.generatedAt)<Date.parse(n.generatedAt)?{}:{..._t(e,t),connected:!0}}),_resetResumeCursors:()=>e({resumeCursors:{}}),_onEvent:t=>e(e=>{let n=e.events.some(e=>e.id===t.id),r=n?{}:{events:[...e.events,t].slice(-500)},i=t.type===`peer.rehydrate`||t.type===`peer.lost`?e=>({}):n=>{let r=e.resumeCursors[n]??0,i=t.seq,a=r>0&&i>0&&i<=r/2&&t.type!==`client.hello`;return i>r||a?{resumeCursors:{...e.resumeCursors,[n]:i}}:{}};if(t.type===`peer.rehydrate`){if(!ht(t.payload))return r;let e={kind:`peer.rehydrate`,payload:t.payload,receivedAt:new Date().toISOString()};return{...r,...i(R),...n?{}:{peerRehydrate:e}}}if(t.type===`peer.lost`){if(!gt(t.payload))return r;let e={kind:`peer.lost`,payload:t.payload,receivedAt:new Date().toISOString()};return{...r,...i(R),...n?{}:{peerRehydrate:e}}}return{...r,...i(t.clientId)}}),_onAlert:t=>e(e=>e.alerts.some(e=>vt(e,t))?{}:{alerts:[...e.alerts,t].slice(-100)}),_onCommandStatus:t=>e(e=>{let n=e.commandStatuses.findIndex(e=>e.commandId===t.commandId);if(n<0)return{commandStatuses:[...e.commandStatuses,t].slice(-200)};let r=[...e.commandStatuses];return r[n]=t,{commandStatuses:r}}),_setConnected:t=>e({connected:t}),_setNeedsSnapshotRefresh:t=>e(e=>e.needsSnapshotRefresh===t?{}:{needsSnapshotRefresh:t}),_dismissPeerRehydrate:()=>e({peerRehydrate:null})}));async function B(e){let t;try{t=await F(e)}catch{throw Error(`Network error fetching ${e}`)}if(t.status===401)throw z.getState().markAuthRequired(),Error(`401 Unauthorized fetching ${e} — browser token required`);if(!t.ok)throw Error(`${t.status} ${t.statusText}`);try{return await t.json()}catch{throw Error(`Invalid JSON response from ${e}: ${t.status}`)}}async function yt(e){let t;try{t=await F(`/api/mailbox-send`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)})}catch{throw Error(`Network error sending mailbox message`)}if(t.status===401)throw z.getState().markAuthRequired(),Error(`401 Unauthorized — browser token required`);if(!t.ok){let e=await t.json().catch(()=>null),n=typeof e?.error==`string`?e.error:t.statusText||`HTTP ${t.status}`;throw Error(n)}try{return await t.json()}catch{throw Error(`Invalid JSON response from mailbox-send API`)}}async function bt(e,t,n){let r;try{r=await F(`/api/command`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({clientId:e,type:t,payload:n})})}catch{throw Error(`Network error sending command`)}if(r.status===401)throw z.getState().markAuthRequired(),Error(`401 Unauthorized — browser token required`);if(!r.ok){let e=(await r.json().catch(()=>null))?.error??(r.statusText||`HTTP ${r.status}`);throw Error(e)}try{return await r.json()}catch{throw Error(`Invalid JSON response from command API`)}}var xt=`wrongstack.hq.local-prefs.v1`,V={appearance:{theme:`dark`},fleet:{scope:`all`,layout:`map`,machineId:``,projectId:``},console:{delivery:`steer`,subject:``,body:``},control:{cmdType:`steer`,abortTarget:`leader`,spawnRole:`bug-hunter`,spawnTask:``,steerTo:`leader`,steerSubject:``,steerBody:``,broadcastSubject:``,broadcastBody:``},mailbox:{query:``,types:[],priorities:[],includeCompleted:!0}},H=null,U=new Set;function W(){for(let e of U)e()}function G(e){return typeof structuredClone==`function`?structuredClone(e):JSON.parse(JSON.stringify(e))}function K(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function St(){if(typeof window>`u`||window.localStorage===void 0)return G(V);try{let e=window.localStorage.getItem(xt);return e===null?G(V):Ct(JSON.parse(e))}catch{return G(V)}}function Ct(e){if(!K(e))return G(V);let t=K(e.appearance)?e.appearance:{},n=K(e.fleet)?e.fleet:{},r=K(e.console)?e.console:{},i=K(e.control)?e.control:{},a=K(e.mailbox)?e.mailbox:{};return{appearance:{theme:t.theme===`light`?`light`:`dark`},fleet:{scope:n.scope===`machine`||n.scope===`project`?n.scope:`all`,layout:n.layout===`compact`?`compact`:`map`,machineId:typeof n.machineId==`string`?n.machineId:``,projectId:typeof n.projectId==`string`?n.projectId:``},console:{delivery:r.delivery===`btw`||r.delivery===`queue`?r.delivery:`steer`,subject:typeof r.subject==`string`?r.subject:``,body:typeof r.body==`string`?r.body:``},control:{cmdType:i.cmdType===`btw`||i.cmdType===`queue`||i.cmdType===`abort`||i.cmdType===`spawn`||i.cmdType===`broadcast`||i.cmdType===`run-command`?i.cmdType:V.control.cmdType,abortTarget:i.abortTarget===`fleet`?`fleet`:`leader`,spawnRole:typeof i.spawnRole==`string`&&i.spawnRole.length>0?i.spawnRole:V.control.spawnRole,spawnTask:typeof i.spawnTask==`string`?i.spawnTask:V.control.spawnTask,steerTo:typeof i.steerTo==`string`?i.steerTo:V.control.steerTo,steerSubject:typeof i.steerSubject==`string`?i.steerSubject:V.control.steerSubject,steerBody:typeof i.steerBody==`string`?i.steerBody:V.control.steerBody,broadcastSubject:typeof i.broadcastSubject==`string`?i.broadcastSubject:V.control.broadcastSubject,broadcastBody:typeof i.broadcastBody==`string`?i.broadcastBody:V.control.broadcastBody},mailbox:{query:typeof a.query==`string`?a.query:V.mailbox.query,types:Array.isArray(a.types)?a.types.filter(e=>typeof e==`string`):[],priorities:Array.isArray(a.priorities)?a.priorities.filter(e=>typeof e==`string`):[],includeCompleted:typeof a.includeCompleted!=`boolean`||a.includeCompleted}}}function q(){return H===null&&(H=St()),H}function J(e){if(!(typeof window>`u`||window.localStorage===void 0))try{window.localStorage.setItem(xt,JSON.stringify(e))}catch{}}function wt(e){return U.add(e),()=>U.delete(e)}function Tt(){return q()}function Et(){return V}function Dt(){return(0,E.useSyncExternalStore)(wt,Tt,Et)}function Ot(e){let t=q();H={...t,control:{...t.control,...e}},J(H),W()}function kt(e){let t=q();H={...t,appearance:{...t.appearance,...e}},J(H),W()}function At(e){let t=q();H={...t,fleet:{...t.fleet,...e}},J(H),W()}function jt(e){let t=q();H={...t,console:{...t.console,...e}},J(H),W()}function Mt(e){let t=q();H={...t,mailbox:{...t.mailbox,...e}},J(H),W()}function Y({value:e,onChange:t,onKeyDown:n,inputRef:r,placeholder:i,autoComplete:a,minLength:o,maxLength:s,className:c,id:l}){let[u,d]=(0,E.useState)(!1);return(0,L.jsxs)(`div`,{className:`hq-password-input-wrapper`,children:[(0,L.jsx)(`input`,{ref:r,id:l,type:u?`text`:`password`,className:c??`hq-token-input`,placeholder:i,autoComplete:a,minLength:o,maxLength:s,value:e,onChange:e=>t(e.target.value),onKeyDown:n}),(0,L.jsx)(`button`,{type:`button`,className:`hq-password-toggle`,onMouseDown:e=>e.preventDefault(),onClick:()=>d(e=>!e),"aria-label":u?`Hide password`:`Show password`,"aria-pressed":u,children:u?(0,L.jsx)(ne,{size:14}):(0,L.jsx)(_,{size:14})})]})}function Nt({hadToken:e}){let[t,n]=(0,E.useState)(null),[r,i]=(0,E.useState)(null);(0,E.useEffect)(()=>{fetch(`/api/auth/status`).then(async e=>{if(!e.ok)throw Error(`HTTP ${e.status}`);return await e.json()}).then(n).catch(()=>i(`Could not load HQ auth status.`))},[]);let a=t?.tokenMode??!0,o=t?.passwordMode??!1,[s,c]=(0,E.useState)(null),l=s??(o?`password`:`token`);return r?(0,L.jsx)(`div`,{className:`hq-token-gate`,children:(0,L.jsxs)(`div`,{className:`hq-token-card`,children:[(0,L.jsx)(`div`,{className:`hq-brand`,children:`WrongStack HQ`}),(0,L.jsx)(`div`,{className:`hq-token-title`,children:`Auth status unavailable`}),(0,L.jsx)(`p`,{className:`hq-token-text`,children:r})]})}):t?(0,L.jsx)(`div`,{className:`hq-token-gate`,children:(0,L.jsxs)(`div`,{className:`hq-token-card`,children:[(0,L.jsx)(`div`,{className:`hq-brand`,children:`WrongStack HQ`}),a&&o?(0,L.jsxs)(`div`,{className:`hq-token-tabs`,children:[(0,L.jsx)(`button`,{type:`button`,className:`hq-token-tab`+(l===`token`?` active`:``),onClick:()=>c(`token`),children:`Browser token`}),(0,L.jsx)(`button`,{type:`button`,className:`hq-token-tab`+(l===`password`?` active`:``),onClick:()=>c(`password`),children:`Password`})]}):null,l===`token`||!o?(0,L.jsx)(Pt,{hadToken:e}):(0,L.jsx)(Ft,{})]})}):(0,L.jsx)(`div`,{className:`hq-token-gate`,children:(0,L.jsxs)(`div`,{className:`hq-token-card`,children:[(0,L.jsx)(`div`,{className:`hq-brand`,children:`WrongStack HQ`}),(0,L.jsx)(`div`,{className:`hq-token-title`,children:`Checking auth mode…`})]})})}function Pt({hadToken:e}){let[t,n]=(0,E.useState)(``),r=(0,E.useRef)(null);(0,E.useEffect)(()=>{r.current?.focus()},[]);let i=()=>{let e=t.trim();e.length!==0&&(M(e),window.location.reload())};return(0,L.jsxs)(L.Fragment,{children:[(0,L.jsx)(`div`,{className:`hq-token-title`,children:`Browser token required`}),(0,L.jsx)(`p`,{className:`hq-token-text`,children:e?`The saved token was rejected — it may have been revoked or the server was reset. Paste a current browser token.`:`This HQ server runs in token mode. Paste the browser token printed at startup (the ?token= value in the URL wstack --hq shows).`}),(0,L.jsx)(Y,{inputRef:r,value:t,onChange:n,onKeyDown:e=>{e.key===`Enter`&&i()},placeholder:`browser token`,autoComplete:`off`}),(0,L.jsx)(`button`,{type:`button`,className:`hq-token-submit`,onClick:i,disabled:t.trim().length===0,children:`Connect`}),(0,L.jsxs)(`p`,{className:`hq-token-hint`,children:[`Manage tokens with `,(0,L.jsx)(`code`,{children:`wstack hq token list`}),` / `,(0,L.jsx)(`code`,{children:`wstack hq token create`}),` — they live in `,(0,L.jsx)(`code`,{children:`~/.wrongstack/hq/auth.json`}),`.`]})]})}function Ft(){let[e,t]=(0,E.useState)(``),[n,r]=(0,E.useState)(``),[i,a]=(0,E.useState)(!1),[o,s]=(0,E.useState)(null),[c,l]=(0,E.useState)(!1),u=(0,E.useRef)(null),d=(0,E.useRef)(null),f=(0,E.useRef)(!1),p=(0,E.useRef)(!1);(0,E.useEffect)(()=>{if(i){d.current?.focus();return}u.current?.focus()},[i]);let m=async()=>{if(c||f.current)return;let t=e;if(t.length!==0){f.current=!0,l(!0),s(null);try{let e=await fetch(`/api/login`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({password:t})});if(!e.ok){let t=`Login failed.`;try{let n=(await e.json()).error;typeof n==`string`?t=n:typeof n?.message==`string`&&(t=n.message)}catch{}s(t),f.current=!1,l(!1);return}if((await e.json()).totpRequired){a(!0),f.current=!1,l(!1);return}N(),window.location.reload()}catch{s(`Network error.`),f.current=!1,l(!1)}}},h=async()=>{if(c||p.current)return;let e=n.trim();if(e.length!==0){p.current=!0,l(!0),s(null);try{let t=e.includes(`-`)?{recoveryCode:e}:{code:e.replace(/\D/g,``).slice(0,6)},n=await fetch(`/api/login/verify`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)});if(!n.ok){let e=`Verification failed.`;try{let t=(await n.json()).error;typeof t==`string`?e=t:typeof t?.message==`string`&&(e=t.message)}catch{}s(e),p.current=!1,l(!1);return}N(),window.location.reload()}catch{s(`Network error.`),p.current=!1,l(!1)}}};return i?(0,L.jsxs)(L.Fragment,{children:[o?(0,L.jsx)(`p`,{className:`hq-token-error`,children:o}):null,(0,L.jsx)(`label`,{className:`hq-token-label`,htmlFor:`hq-totp-code`,children:`Authenticator code`}),(0,L.jsx)(`input`,{ref:d,id:`hq-totp-code`,className:`hq-token-input`,type:`text`,autoComplete:`one-time-code`,placeholder:`000000 or recovery code`,value:n,onChange:e=>r(e.target.value.slice(0,32)),onKeyDown:e=>{e.key===`Enter`&&h()}}),(0,L.jsx)(`button`,{type:`button`,className:`hq-token-submit`,onClick:()=>void h(),disabled:n.trim().length===0||c,children:c?`Verifying…`:`Verify`}),(0,L.jsx)(`button`,{type:`button`,className:`hq-token-hint`,onClick:()=>{a(!1),r(``),s(null)},children:`← Back to password`}),(0,L.jsx)(`p`,{className:`hq-token-hint`,children:`Enter the 6-digit code from your authenticator app, or paste a recovery code.`})]}):(0,L.jsxs)(L.Fragment,{children:[(0,L.jsx)(`div`,{className:`hq-token-title`,children:`Password required`}),(0,L.jsx)(`p`,{className:`hq-token-text`,children:`This HQ server is protected by a password. Enter it to open the dashboard.`}),o?(0,L.jsx)(`p`,{className:`hq-token-error`,children:o}):null,(0,L.jsx)(Y,{inputRef:u,value:e,onChange:t,onKeyDown:e=>{e.key===`Enter`&&m()},placeholder:`password`,autoComplete:`current-password`}),(0,L.jsx)(`button`,{type:`button`,className:`hq-token-submit`,onClick:()=>void m(),disabled:e.length===0||c,children:c?`Logging in…`:`Log in`}),(0,L.jsxs)(`p`,{className:`hq-token-hint`,children:[`Set or change the password with `,(0,L.jsx)(`code`,{children:`wstack --hq --password <secret>`}),`.`]})]})}var It=`modulepreload`,Lt=function(e){return`/`+e},Rt={},X=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?import.meta.resolve(e):new URL(e,import.meta.url).href}r=o(t.map(t=>{if(t=Lt(t,n),t=s(t),t in Rt)return;Rt[t]=!0;let r=t.endsWith(`.css`);for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}let i=document.createElement(`link`);if(i.rel=r?`stylesheet`:It,r||(i.as=`script`),i.crossOrigin=``,i.href=t,a&&i.setAttribute(`nonce`,a),document.head.appendChild(i),r)return new Promise((e,n)=>{i.addEventListener(`load`,e),i.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},zt=360*60*1e3,Z=[{id:`cockpit`,label:`Cockpit`,eyebrow:`Fleet overview`,description:`Health, active work, alerts, cost and command shortcuts.`,group:`Operations`,icon:o,shortcut:1},{id:`fleet`,label:`Fleet Map`,eyebrow:`Topology`,description:`Machines, projects, terminals and agents in one live graph.`,group:`Operations`,icon:v,shortcut:2},{id:`console`,label:`Live Console`,eyebrow:`Transcripts`,description:`Stream and inspect session or agent conversations.`,group:`Operations`,icon:a,shortcut:3},{id:`mailbox`,label:`Mailbox`,eyebrow:`Coordination`,description:`Cross-project messages, unread work and direct delivery.`,group:`Operations`,icon:l,shortcut:4},{id:`kanban`,label:`Kanban`,eyebrow:`Project work`,description:`Read-only project boards synchronized across clones and machines.`,group:`Operations`,icon:te},{id:`alerts`,label:`Alerts`,eyebrow:`Attention`,description:`Active fleet warnings and alert transition history.`,group:`Intelligence`,icon:f,shortcut:5},{id:`cost`,label:`Cost`,eyebrow:`Economics`,description:`Project, provider and model spending distribution.`,group:`Intelligence`,icon:ie,shortcut:6},{id:`trends`,label:`Trends`,eyebrow:`Telemetry`,description:`Cost, token and tool activity over time.`,group:`Intelligence`,icon:s,shortcut:7},{id:`brain`,label:`Brain`,eyebrow:`Decisions`,description:`Autonomous decisions, escalations and interventions.`,group:`Intelligence`,icon:ue,shortcut:8},{id:`worktree`,label:`Worktrees`,eyebrow:`Workspace`,description:`Distributed branches, worktrees and ownership state.`,group:`System`,icon:oe,shortcut:9},{id:`control`,label:`Control`,eyebrow:`Command plane`,description:`Steer, queue, broadcast and audit remote commands.`,group:`System`,icon:x,shortcut:0},{id:`settings`,label:`Security`,eyebrow:`Access control`,description:`Manage the HQ browser password, authentication and active credentials.`,group:`System`,icon:h}],Bt=[`Operations`,`Intelligence`,`System`],Vt={cockpit:(0,E.lazy)(()=>X(()=>import(`./cockpit-C08zaO3u.js`).then(e=>({default:e.CockpitView})),__vite__mapDeps([0,1,2,3]))),fleet:(0,E.lazy)(()=>X(()=>import(`./fleet-map-BdJKS5l1.js`).then(e=>({default:e.FleetMapView})),__vite__mapDeps([4,1,2,5,3,6]))),console:(0,E.lazy)(()=>X(()=>import(`./live-console-go8KNMD3.js`).then(e=>({default:e.LiveConsoleView})),__vite__mapDeps([7,1,2,3,6,5]))),mailbox:(0,E.lazy)(()=>X(()=>import(`./mailbox-CzJ8l7_F.js`).then(e=>({default:e.MailboxView})),__vite__mapDeps([8,1,2,3,9]))),kanban:(0,E.lazy)(()=>X(()=>import(`./kanban-Cza8Uzw2.js`).then(e=>({default:e.KanbanView})),__vite__mapDeps([10,1,2,3]))),cost:(0,E.lazy)(()=>X(()=>import(`./cost-BgTMK9-t.js`).then(e=>({default:e.CostView})),__vite__mapDeps([11,1,2,3]))),brain:(0,E.lazy)(()=>X(()=>import(`./brain-CThvhPfH.js`).then(e=>({default:e.BrainView})),__vite__mapDeps([12,1,2,3,9]))),worktree:(0,E.lazy)(()=>X(()=>import(`./worktree-DM1gfidB.js`).then(e=>({default:e.WorktreeView})),__vite__mapDeps([13,1,2,3,9]))),trends:(0,E.lazy)(()=>X(()=>import(`./trends-WVVT_AEW.js`).then(e=>({default:e.TrendsView})),__vite__mapDeps([14,1,2,3]))),alerts:(0,E.lazy)(()=>X(()=>import(`./alerts-DMDGm1Rk.js`).then(e=>({default:e.AlertsView})),__vite__mapDeps([15,1,2,3]))),control:(0,E.lazy)(()=>X(()=>import(`./control-DfFOI2b8.js`).then(e=>({default:e.ControlView})),__vite__mapDeps([16,1,2,3]))),settings:(0,E.lazy)(()=>X(()=>import(`./settings-DUBTEqcE.js`).then(e=>({default:e.SettingsView})),__vite__mapDeps([17,1,2,3])))};function Ht(e){return Z.find(t=>t.id===e)??Z[0]}var Ut=class extends E.Component{state={error:null};static getDerivedStateFromError(e){return{error:e instanceof Error?e.message:String(e)}}componentDidUpdate(e){e.view!==this.props.view&&this.state.error!==null&&this.setState({error:null})}render(){return this.state.error===null?this.props.children:(0,L.jsxs)(`div`,{className:`hq-view-error`,role:`alert`,children:[(0,L.jsx)(y,{size:22}),(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`strong`,{children:`This HQ surface stopped safely.`}),(0,L.jsx)(`p`,{children:this.state.error})]}),(0,L.jsxs)(`button`,{type:`button`,className:`hq-btn secondary`,onClick:()=>this.setState({error:null}),children:[(0,L.jsx)(u,{size:13}),`Retry view`]})]})}};function Wt(){let{snapshot:e,alerts:t,activeView:a,authRequired:o,connected:s,peerRehydrate:l}=z(D(e=>({snapshot:e.snapshot,alerts:e.alerts,activeView:e.activeView,authRequired:e.authRequired,connected:e.connected,peerRehydrate:e.peerRehydrate}))),[u,f]=(0,E.useState)(()=>typeof window>`u`||window.innerWidth>=1180),[p,m]=(0,E.useState)(null),[h,te]=(0,E.useState)(null),[g,ne]=(0,E.useState)(!1),{theme:_}=Dt().appearance,v=(0,E.useRef)(!1),y=(0,E.useRef)(!1);if((0,E.useEffect)(()=>{y.current&&s===!1?I.getState().addToast(`Connection lost — reconnecting with backoff…`,`warning`,4e3):y.current&&v.current===!1&&s===!0&&I.getState().addToast(`Reconnected to HQ server`,`success`,3e3),s&&(y.current=!0),v.current=s},[s]),(0,E.useEffect)(()=>(document.documentElement.dataset.hqTheme=_,()=>{delete document.documentElement.dataset.hqTheme}),[_]),(0,E.useEffect)(()=>{let e=!1;return B(`/api/snapshot`).then(t=>{e||z.getState()._hydrateSnapshot(t)}).catch(()=>{}),()=>{e=!0}},[]),(0,E.useEffect)(()=>{let e=!1;return B(`/api/auth/status`).then(t=>{e||te(t)}).catch(()=>{}),()=>{e=!0}},[]),(0,E.useEffect)(()=>{let e=!1,t=()=>{B(`/api/system/update`).then(t=>{e||m(t)}).catch(()=>{})};t();let n=window.setInterval(t,zt);return()=>{e=!0,window.clearInterval(n)}},[]),(0,E.useEffect)(()=>{let e=e=>{if((e.ctrlKey||e.metaKey)&&e.key.toLowerCase()===`b`){e.preventDefault(),f(e=>!e);return}if(e.altKey&&/^\d$/.test(e.key)){let t=Number(e.key),n=Z.find(e=>e.shortcut===t);n&&(e.preventDefault(),z.getState().setActiveView(n.id));return}e.key===`Escape`&&u&&window.innerWidth<900&&f(!1)};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[u]),o)return(0,L.jsx)(Nt,{hadToken:P()!==null});let b=e?.totals,oe=b?.unreadMailboxMessages??0,x=t.filter(e=>e.severity!==`info`).length,S=Ht(a),le=S.icon,ue=Vt[a],de=e=>{z.getState().setActiveView(e),window.innerWidth<900&&f(!1)},fe=async()=>{ne(!0);try{await F(`/api/logout`,{method:`POST`})}finally{N(),window.location.reload()}};return(0,L.jsxs)(`div`,{className:`hq-app`,"data-theme":_,"data-testid":`hq-workbench`,children:[(0,L.jsx)(`button`,{type:`button`,className:`hq-sidebar-scrim`,"data-open":u,"aria-label":`Close HQ navigation`,onClick:()=>f(!1)}),(0,L.jsxs)(`aside`,{className:`hq-secondary-nav`,"data-open":u,"aria-label":`HQ navigation`,children:[(0,L.jsxs)(`div`,{className:`hq-secondary-header`,children:[(0,L.jsxs)(`div`,{className:`hq-secondary-brand`,children:[(0,L.jsx)(`img`,{src:`/wrongstack.svg`,alt:``,"aria-hidden":`true`,draggable:!1}),(0,L.jsxs)(`div`,{className:`hq-secondary-copy`,children:[(0,L.jsx)(`span`,{className:`hq-secondary-eyebrow`,children:`Command center`}),(0,L.jsx)(`strong`,{children:`WrongStack HQ`})]})]}),(0,L.jsx)(`button`,{type:`button`,className:`hq-icon-button hq-secondary-close`,"aria-label":`Collapse HQ navigation`,title:`Collapse navigation (Ctrl+B)`,onClick:()=>f(!1),children:(0,L.jsx)(r,{size:16})})]}),(0,L.jsx)(`div`,{className:`hq-secondary-scroll`,children:Bt.map(e=>(0,L.jsxs)(`section`,{className:`hq-nav-group`,children:[(0,L.jsx)(`div`,{className:`hq-nav-group-label`,children:e}),Z.filter(t=>t.group===e).map(e=>{let t=e.icon,n=e.id===`mailbox`?oe:e.id===`alerts`?x:0;return(0,L.jsxs)(`button`,{type:`button`,className:`hq-nav-item`,"data-active":a===e.id,"aria-current":a===e.id?`page`:void 0,onClick:()=>de(e.id),children:[(0,L.jsx)(t,{size:15}),(0,L.jsx)(`span`,{children:e.label}),e.shortcut===void 0?null:(0,L.jsxs)(`kbd`,{children:[`Alt+`,e.shortcut]}),n>0?(0,L.jsx)(`span`,{className:`hq-nav-badge`,children:n}):null]},e.id)})]},e))}),(0,L.jsxs)(`div`,{className:`hq-secondary-footer`,children:[(0,L.jsxs)(`div`,{className:`hq-link-state`,"data-live":s,children:[(0,L.jsx)(`span`,{className:`hq-link-dot`}),(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`strong`,{children:s?`Connected`:`Reconnecting`}),(0,L.jsxs)(`span`,{children:[b?.activeMachines??0,` machines · `,b?.activeClients??0,` clients`]})]})]}),(0,L.jsx)(`span`,{className:`hq-build-label`,children:`@wrongstack/webui-hq`})]})]}),(0,L.jsxs)(`section`,{className:`hq-workbench`,"data-update-available":p?.outdated===!0,children:[(0,L.jsxs)(`header`,{className:`hq-header`,children:[(0,L.jsx)(`button`,{type:`button`,className:`hq-icon-button hq-sidebar-toggle`,"aria-label":u?`Collapse HQ navigation`:`Expand HQ navigation`,"aria-expanded":u,title:`Toggle navigation (Ctrl+B)`,onClick:()=>f(e=>!e),children:u?(0,L.jsx)(r,{size:17}):(0,L.jsx)(i,{size:17})}),(0,L.jsx)(`div`,{className:`hq-view-icon`,"aria-hidden":`true`,children:(0,L.jsx)(le,{size:18})}),(0,L.jsxs)(`div`,{className:`hq-view-identity`,children:[(0,L.jsx)(`span`,{children:S.eyebrow}),(0,L.jsx)(`h1`,{children:S.label}),(0,L.jsx)(`p`,{children:S.description})]}),(0,L.jsxs)(`div`,{className:`hq-top-metrics`,children:[(0,L.jsx)(Q,{icon:ce,label:`Machines`,value:b?.activeMachines??0}),(0,L.jsx)(Q,{icon:ae,label:`Agents`,value:b?.activeAgents??0}),(0,L.jsx)(Q,{icon:d,label:`Sessions`,value:b?.activeSessions??0}),(0,L.jsx)(Q,{icon:ie,label:`Cost`,value:`$${(b?.totalCostUsd??0).toFixed(2)}`,accent:!0})]}),(0,L.jsxs)(`div`,{className:`hq-connection-pill`,"data-live":s,children:[s?(0,L.jsx)(re,{size:13}):(0,L.jsx)(ee,{size:13}),s?`Live`:`Reconnecting`]}),(0,L.jsx)(`button`,{type:`button`,className:`hq-icon-button hq-theme-toggle`,"aria-label":`Switch to ${_===`dark`?`light`:`dark`} mode`,title:`Switch to ${_===`dark`?`light`:`dark`} mode`,onClick:()=>kt({theme:_===`dark`?`light`:`dark`}),children:_===`dark`?(0,L.jsx)(se,{size:16}):(0,L.jsx)(c,{size:16})}),h?.tokenMode||h?.passwordMode?(0,L.jsx)(`button`,{type:`button`,className:`hq-icon-button`,"aria-label":`Log out of HQ`,title:`Log out and clear this tab's HQ credentials`,disabled:g,onClick:()=>void fe(),children:(0,L.jsx)(n,{size:16})}):null]}),p?.outdated?(0,L.jsx)(Kt,{status:p}):null,l?(0,L.jsx)(Gt,{envelope:l}):null,(0,L.jsx)(`main`,{className:`hq-main`,id:`hq-main`,tabIndex:-1,children:(0,L.jsx)(Ut,{view:a,children:(0,L.jsx)(E.Suspense,{fallback:(0,L.jsx)(qt,{label:S.label}),children:(0,L.jsx)(ue,{})})})})]}),(0,L.jsx)(ft,{})]})}function Gt({envelope:e}){let t=e.kind===`peer.rehydrate`?`Leader session lost — survivor clients can rehydrate`:`Leader session lost — no survivor clients reported`,n=e.kind===`peer.rehydrate`&&e.payload.rehydrateHint?e.payload.rehydrateHint:`${e.payload.previousLeaderHandle} on ${e.payload.machineId} ended (${e.payload.reason}).`;return(0,L.jsxs)(`aside`,{className:`hq-peer-rehydrate-notice`,role:`status`,"aria-live":`polite`,children:[(0,L.jsx)(g,{size:16,"aria-hidden":`true`}),(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`strong`,{children:t}),(0,L.jsx)(`span`,{children:n})]}),(0,L.jsx)(`button`,{type:`button`,onClick:()=>z.getState()._dismissPeerRehydrate(),title:`Dismiss peer lifecycle notice`,children:`Dismiss`})]})}function Kt({status:e}){let[t,n]=(0,E.useState)(!1),r=async()=>{try{await navigator.clipboard.writeText(e.command),n(!0),window.setTimeout(()=>n(!1),1500)}catch{n(!1)}};return(0,L.jsxs)(`aside`,{className:`hq-update-notice`,role:`status`,"aria-live":`polite`,children:[(0,L.jsx)(g,{size:16,"aria-hidden":`true`}),(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`strong`,{children:`WrongStack update available`}),(0,L.jsxs)(`span`,{children:[`v`,e.current,` → v`,e.latest,`. Run `,(0,L.jsx)(`code`,{children:e.command}),` in your terminal, then restart HQ.`]})]}),(0,L.jsxs)(`button`,{type:`button`,onClick:()=>void r(),title:`Copy update command`,children:[(0,L.jsx)(le,{size:13,"aria-hidden":`true`}),t?`Copied`:`Copy command`]})]})}function Q({icon:e,label:t,value:n,accent:r=!1}){return(0,L.jsxs)(`div`,{className:`hq-top-metric`,"data-accent":r,children:[(0,L.jsx)(e,{size:12}),(0,L.jsx)(`span`,{children:t}),(0,L.jsx)(`strong`,{children:n})]})}function qt({label:e}){return(0,L.jsxs)(`div`,{className:`hq-view-loading`,role:`status`,children:[(0,L.jsx)(x,{size:18}),(0,L.jsxs)(`span`,{children:[`Loading `,e,`…`]})]})}var Jt=25e3,Yt=1e4,Xt=3e4,Zt=32;function Qt(e){if(!Number.isFinite(e))return 0;let t=Math.max(0,Math.trunc(e));return Number.isSafeInteger(t)?t:0}var $t=class{ws=null;handlers=new Set;stateHandlers=new Set;reconnectAttempt=0;connectionState=me();reconnectTimer=null;heartbeatTimer=null;lastMessageAt=0;stopped=!1;_state=`disconnected`;_url;resumeCursor;maxRetries;heartbeatIntervalMs;heartbeatTimeoutMs;maxBackoffMs;constructor(e){if(this.maxRetries=e?.maxRetries??1/0,this.heartbeatIntervalMs=e?.heartbeatIntervalMs??Jt,this.heartbeatTimeoutMs=e?.heartbeatTimeoutMs??Yt,this.maxBackoffMs=e?.maxBackoffMs??Xt,this.resumeCursor=e?.resumeCursor??(()=>({})),e?.url)this._url=e.url;else{let e=typeof window<`u`?window.location:{host:`127.0.0.1:3499`,protocol:`http:`},t=e.protocol===`https:`?`wss:`:`ws:`,n=P(),r=`${t}//${e.host}/ws/browser`;this._url=n===null?r:`${r}?token=${encodeURIComponent(n)}`}}get url(){return this._url}get state(){return this._state}get isConnected(){return this.ws?.readyState===WebSocket.OPEN}connect(){if(this.stopped||this.ws!==null)return;this.connectionState=he(this.connectionState),this.emitState(`connecting`);let e;try{e=new WebSocket(this._url)}catch{this.scheduleReconnect();return}this.ws=e,e.onopen=()=>{this.ws===e&&(this.reconnectAttempt=0,this.connectionState=ge(this.connectionState),this.lastMessageAt=Date.now(),this.connectionState=_e(this.connectionState,this.lastMessageAt),this.emitState(`connected`),this.sendResume(),this.startHeartbeat())},e.onmessage=t=>{if(this.ws===e){this.lastMessageAt=Date.now(),this.connectionState=_e(this.connectionState,this.lastMessageAt);try{let e=JSON.parse(typeof t.data==`string`?t.data:``);for(let t of this.handlers)try{t(e)}catch{}}catch{}}},e.onclose=()=>this.handleClose(e,`close`),e.onerror=()=>this.handleClose(e,`error`)}close(){this.stopped=!0,this.connectionState=ve(this.connectionState),this.stopHeartbeat(),this.reconnectTimer!==null&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null),this.ws?.close(1e3,`client closed`),this.ws=null,this.emitState(`disconnected`)}setResumeCursorProvider(e){this.resumeCursor=e}on(e){return this.handlers.add(e),()=>this.handlers.delete(e)}onStateChange(e){return this.stateHandlers.add(e),e(this._state),()=>this.stateHandlers.delete(e)}handleClose(e,t){this.ws===e&&(this.ws=null,this.stopHeartbeat(),this.scheduleReconnect())}scheduleReconnect(){if(this.stopped||this.reconnectTimer!==null)return;let e=ye(this.connectionState,{...pe,maxReconnectAttempts:this.maxRetries,maxBackoffMs:this.maxBackoffMs,heartbeatIntervalMs:this.heartbeatIntervalMs,heartbeatTimeoutMs:this.heartbeatTimeoutMs,jitterRatio:.5});if(this.connectionState=e.state,this.reconnectAttempt=e.state.reconnectAttempt,!e.plan){this.emitState(`disconnected`);return}this.emitState(`reconnecting`),this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.connect()},e.plan.delayMs)}sendResume(){if(this.ws?.readyState===WebSocket.OPEN)try{for(let e of this.resumeFrames())this.ws.send(JSON.stringify(e))}catch{}}resumeFrames(){try{let e=this.resumeCursor(),t=typeof e.entries==`function`?e.entries():Object.entries(e),n=[];for(let[e,r]of t){if(typeof e!=`string`||e.length===0)continue;let t=Qt(r);n.push({clientId:e,lastSeqSeen:t})}n.sort((e,t)=>t.lastSeqSeen===e.lastSeqSeen?e.clientId.localeCompare(t.clientId):t.lastSeqSeen-e.lastSeqSeen);let r=n.find(({clientId:e})=>e===R),i=r===void 0?Zt:Zt-1,a=n.filter(({clientId:e})=>e!==R).slice(0,i);return r!==void 0&&a.unshift(r),a.map(({clientId:e,lastSeqSeen:t})=>({type:`client.resume`,clientId:e,lastSeqSeen:t}))}catch{return[]}}get isHeartbeatTimedOut(){return this.ws===null||be(this.connectionState,{...pe,heartbeatIntervalMs:this.heartbeatIntervalMs,heartbeatTimeoutMs:this.heartbeatTimeoutMs})}startHeartbeat(){this.stopHeartbeat(),this.lastMessageAt=Date.now(),this.heartbeatTimer=setInterval(()=>{this.isHeartbeatTimedOut&&this.ws!==null&&(this.ws.close(4e3,`heartbeat timeout`),this.ws=null,this.scheduleReconnect())},this.heartbeatIntervalMs)}stopHeartbeat(){this.heartbeatTimer!==null&&(clearInterval(this.heartbeatTimer),this.heartbeatTimer=null)}emitState(e){this._state=e;for(let t of this.stateHandlers)try{t(e)}catch{}}},$=null;function en(e){if($===null)return $=new $t(e),$.connect(),$;if(e?.resumeCursor!==void 0&&$.setResumeCursorProvider(e.resumeCursor),e===void 0)return $;let t=[];return e.url!==void 0&&e.url!==$.url&&t.push(`url: ${e.url} vs ${$.url}`),e.heartbeatIntervalMs!==void 0&&e.heartbeatIntervalMs!==$.heartbeatIntervalMs&&t.push(`heartbeatIntervalMs: ${e.heartbeatIntervalMs} vs ${$.heartbeatIntervalMs}`),e.heartbeatTimeoutMs!==void 0&&e.heartbeatTimeoutMs!==$.heartbeatTimeoutMs&&t.push(`heartbeatTimeoutMs: ${e.heartbeatTimeoutMs} vs ${$.heartbeatTimeoutMs}`),e.maxBackoffMs!==void 0&&e.maxBackoffMs!==$.maxBackoffMs&&t.push(`maxBackoffMs: ${e.maxBackoffMs} vs ${$.maxBackoffMs}`),e.maxRetries!==void 0&&e.maxRetries!==$.maxRetries&&t.push(`maxRetries: ${e.maxRetries} vs ${$.maxRetries}`),t.length>0&&typeof console<`u`&&console.warn(`[hq-ws-client] getHqClient() called with options that conflict with the live singleton; ignoring: ${t.join(`, `)}. Call closeHqClient() first if you need to reconfigure.`),$}var tn=document.getElementById(`root`);tn!==null&&tt().finally(()=>{Ze(),nt();let e=en({resumeCursor:()=>z.getState().resumeCursors});e.onStateChange(e=>{z.getState()._setConnected(e===`connected`)});let t=null,n=()=>{t===null&&(z.getState()._setNeedsSnapshotRefresh(!1),t=B(`/api/snapshot`).then(e=>{z.getState()._onSnapshot(e)}).catch(()=>void 0).finally(()=>{t=null}))};z.subscribe((e,t)=>{e.needsSnapshotRefresh&&!t.needsSnapshotRefresh&&n()}),e.on(e=>{if(e.type===`hq.snapshot`){let t=Ve(e);t&&z.getState()._onSnapshot(t.snapshot)}else if(e.type===`hq.event`){let t=He(e);t&&z.getState()._onEvent(t.event)}else if(e.type===`hq.alert`){let t=Ue(e);t&&z.getState()._onAlert(t.alert)}else if(e.type===`hq.command_status`){let t=We(e);t&&z.getState()._onCommandStatus(t.command)}else if(e.type===`hq.resume_gap`)for(let t of e.envelopes){let e=He({type:`hq.event`,event:t});e&&z.getState()._onEvent(e.event)}else e.type===`hq.resume_reject`&&(z.getState()._resetResumeCursors(),z.getState()._setNeedsSnapshotRefresh(!0))}),(0,Ge.createRoot)(tn).render((0,L.jsx)(E.StrictMode,{children:(0,L.jsx)(Wt,{})}))});export{Mt as a,bt as c,F as d,N as f,At as i,yt as l,jt as n,Dt as o,D as p,Ot as r,B as s,Y as t,z as u};
|