@wrongstack/webui-hq 0.298.1 → 0.298.3
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-CngcvEJh.js → alerts-Dbu8mAyJ.js} +1 -1
- package/dist/assets/{brain-BG13bveN.js → brain-CnW6MARY.js} +1 -1
- package/dist/assets/{cockpit-DXJxjPnB.js → cockpit-Cub2HohR.js} +1 -1
- package/dist/assets/{control-CMd6VthY.js → control-CM21NZFd.js} +1 -1
- package/dist/assets/{cost-CJITkXsR.js → cost-BhlT04tC.js} +1 -1
- package/dist/assets/{fleet-map-CZOgE5Nw.js → fleet-map-kdk3J28q.js} +1 -1
- package/dist/assets/{fleet-topology-oso81R_h.js → fleet-topology-BaclZ2lo.js} +1 -1
- package/dist/assets/index-zoLjN6PE.js +2 -0
- package/dist/assets/{kanban-Dv_JO9FX.js → kanban-BAaa1PxE.js} +1 -1
- package/dist/assets/{live-console-i2bRKrD4.js → live-console-CxIxZIhS.js} +1 -1
- package/dist/assets/{mailbox-Ci-OhMVd.js → mailbox-B_sCyujQ.js} +1 -1
- package/dist/assets/{settings--viYyUXx.js → settings-C2gzlUg1.js} +1 -1
- package/dist/assets/{trends-CUxeiswr.js → trends-DjIGf6JU.js} +1 -1
- package/dist/assets/{use-backfilled-events-aHtiydc8.js → use-backfilled-events-Ccld3A7G.js} +1 -1
- package/dist/assets/{worktree-Be5RGvFw.js → worktree-7QC090A-.js} +1 -1
- package/dist/index.html +1 -1
- package/package.json +4 -4
- package/dist/assets/index-CCbnoNGX.js +0 -2
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/cockpit-DXJxjPnB.js","assets/rolldown-runtime-QTnfLwEv.js","assets/icons-CnibBrEa.js","assets/markdown-B4iP4HAO.js","assets/fleet-map-CZOgE5Nw.js","assets/vendor-oWlwbM7J.js","assets/fleet-topology-oso81R_h.js","assets/live-console-i2bRKrD4.js","assets/mailbox-Ci-OhMVd.js","assets/use-backfilled-events-aHtiydc8.js","assets/kanban-Dv_JO9FX.js","assets/cost-CJITkXsR.js","assets/brain-BG13bveN.js","assets/worktree-Be5RGvFw.js","assets/trends-CUxeiswr.js","assets/alerts-CngcvEJh.js","assets/control-CMd6VthY.js","assets/settings--viYyUXx.js"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{B as t,Bt as n,Ct as r,D as i,Dt as a,E as o,Et as s,F as c,It as l,J as u,M as d,Pt as f,Rt as p,S as m,Vt as ee,X as h,Z as te,_ as ne,a as re,at as ie,c as g,ht as _,i as ae,j as v,m as y,mt as oe,n as se,o as ce,u as le,v as ue,vt as b,w as x,yt as de}from"./icons-CnibBrEa.js";import{t as fe}from"./vendor-oWlwbM7J.js";import{i as pe}from"./markdown-B4iP4HAO.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 me={maxReconnectAttempts:10,initialBackoffMs:1e3,maxBackoffMs:3e4,backoffMultiplier:2,jitterRatio:0,queueLimit:1e3,heartbeatIntervalMs:0,heartbeatTimeoutMs:0};function he(){return{phase:`idle`,reconnectAttempt:0,lastActivityAt:null,stopped:!1}}function ge(e){return e.stopped?e:{...e,phase:`connecting`}}function _e(e,t=Date.now()){return{...e,phase:`open`,reconnectAttempt:0,lastActivityAt:t,stopped:!1}}function ve(e,t=Date.now()){return{...e,lastActivityAt:t}}function ye(e){return{...e,phase:`closed`,stopped:!0}}function be(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 xe(e,t,n=Date.now()){return e.phase!==`open`||e.lastActivityAt===null||t.heartbeatIntervalMs<=0?!1:n-e.lastActivityAt>t.heartbeatIntervalMs+t.heartbeatTimeoutMs}var Se=`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.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(`,`),Ce=[`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`],we=`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(`,`),Te=`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(`,`),Ee=`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(`,`),De=`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(`,`),Oe=[`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`],ke=`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.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(`,`),Ae=`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.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(`,`),je=[`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`],Me=`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(`,`),Ne=`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(`,`),Pe=`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(`,`),Fe=[`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`],Ie=[`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`],Le=`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(`,`),Re=[`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`],ze=[...Se,...Ce,...Oe,...ke,...Ee,...De,...we,...Te],Be=[...Ae,...je,...Le,...Re,...Pe,...Fe,...Ie,...Me,...Ne];new Set(ze),new Set(Be);function S(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:null}function C(e,t=0){return typeof e==`number`&&Number.isFinite(e)?e:t}function w(e){return e===void 0||Array.isArray(e)}function Ve(e){return C(e.activeProjects)===e.activeProjects&&C(e.activeClients)===e.activeClients&&C(e.activeSessions)===e.activeSessions&&C(e.activeSubagents)===e.activeSubagents&&C(e.unreadMailboxMessages)===e.unreadMailboxMessages&&C(e.incompleteMailboxMessages)===e.incompleteMailboxMessages&&C(e.totalCostUsd)===e.totalCostUsd}function He(e){if(e.type!==`hq.snapshot`)return null;let t=S(e.snapshot),n=t?S(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||!Ve(n)||!w(t.machines)||!w(t.liveSessions)||!w(t.mcpServers)?null:{kind:`hq-snapshot`,snapshot:t}}function Ue(e){if(e.type!==`hq.event`)return null;let t=S(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 We(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 Ge(e){if(e.type!==`hq.command_status`)return null;let t=S(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 T=e(ee(),1),Ke=fe(),qe=e=>Symbol.iterator in e,Je=e=>`entries`in e,Ye=(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},Xe=(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 Ze(e,t){return Object.is(e,t)?!0:typeof e!=`object`||!e||typeof t!=`object`||!t||Object.getPrototypeOf(e)!==Object.getPrototypeOf(t)?!1:qe(e)&&qe(t)?Je(e)&&Je(t)?Ye(e,t):Xe(e,t):Ye({entries:()=>Object.entries(e)},{entries:()=>Object.entries(t)})}function E(e){let t=T.useRef(void 0);return n=>{let r=e(n);return Ze(t.current,r)?t.current:t.current=r}}var D=`wrongstack.hq.token.v1`;function O(){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 k(){if(typeof window>`u`)return null;try{return window.sessionStorage??null}catch{return null}}function A(){try{let e=k()?.getItem(D)??null;return e!==null&&e.length>0?e:null}catch{return null}}function j(e){try{k()?.setItem(D,e)}catch{}}function M(){try{k()?.removeItem(D)}catch{}}function N(){let e=O();return e===null?A():(j(e),e)}function Qe(){if(typeof window>`u`)return;let e=O();if(e!==null&&(j(e),A()===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 $e(){let e=N();return e===null?{}:{Authorization:`Bearer ${e}`}}function P(e,t){let n={...t?.headers??{},...$e()};return fetch(e,{...t,headers:n})}function et(){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 tt(){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 nt(){let e=et();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?(tt(),M(),!0):!1}catch{return!1}}async function rt(){if(A()===null)return!1;try{let e=await fetch(`/api/auth/upgrade`,{method:`POST`,headers:$e(),credentials:`same-origin`,signal:AbortSignal.timeout(1e4)});return!e.ok||(await e.json()).loggedIn!==!0?!1:(M(),!0)}catch{return!1}}var it=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},at=(e=>e?it(e):it),ot=e=>e;function st(e,t=ot){let n=T.useSyncExternalStore(e.subscribe,T.useCallback(()=>t(e.getState()),[e,t]),T.useCallback(()=>t(e.getInitialState()),[e,t]));return T.useDebugValue(n),n}var ct=e=>{let t=at(e),n=e=>st(t,e);return Object.assign(n,t),n},lt=(e=>e?ct(e):ct),ut=6e3,dt=0,F=lt()(e=>({toasts:[],addToast:(t,n=`info`,r=ut,i)=>{let a=`toast-${++dt}-${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:[]})})),I=pe(),ft={error:(0,I.jsx)(r,{size:16,"aria-hidden":`true`}),warning:(0,I.jsx)(g,{size:16,"aria-hidden":`true`}),info:(0,I.jsx)(h,{size:16,"aria-hidden":`true`}),success:(0,I.jsx)(a,{size:16,"aria-hidden":`true`})};function pt(){let{toasts:e,removeToast:t}=F(E(e=>({toasts:e.toasts,removeToast:e.removeToast})));return e.length===0?null:(0,I.jsx)(`div`,{className:`hq-toast-container`,role:`status`,"aria-live":`polite`,"aria-label":`Notifications`,children:e.map(e=>(0,I.jsxs)(`div`,{className:`hq-toast hq-toast--${e.severity}`,"data-severity":e.severity,children:[(0,I.jsx)(`span`,{className:`hq-toast-icon`,children:ft[e.severity]}),(0,I.jsx)(`span`,{className:`hq-toast-message`,children:e.message}),e.action?(0,I.jsx)(`span`,{className:`hq-toast-action`,children:e.action}):null,(0,I.jsx)(`button`,{type:`button`,className:`hq-toast-close`,"aria-label":`Dismiss notification`,onClick:()=>t(e.id),children:(0,I.jsx)(se,{size:12})})]},e.id))})}var mt=new Set([`graceful`,`crash`,`heartbeat-timeout`,`auth-revoked`]),L=`__hq_peer__`;function ht(e){return e===void 0||typeof e==`string`}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`||!mt.has(t.reason)||typeof t.detectedAt!=`string`||!Number.isFinite(Date.parse(t.detectedAt))||!ht(t.rehydrateHint)||t.rehydrateHint!==void 0&&t.rehydrateHint.length>280||!ht(t.rehydrateCommandId))}function _t(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`||!mt.has(t.reason)||typeof t.detectedAt!=`string`||!Number.isFinite(Date.parse(t.detectedAt)))}function vt(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 yt(e,t){return e.timestamp===t.timestamp&&e.severity===t.severity&&e.message===t.message}var R=lt()(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?vt(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)?{}:{...vt(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(!gt(t.payload))return r;let e={kind:`peer.rehydrate`,payload:t.payload,receivedAt:new Date().toISOString()};return{...r,...i(L),...n?{}:{peerRehydrate:e}}}if(t.type===`peer.lost`){if(!_t(t.payload))return r;let e={kind:`peer.lost`,payload:t.payload,receivedAt:new Date().toISOString()};return{...r,...i(L),...n?{}:{peerRehydrate:e}}}return{...r,...i(t.clientId)}}),_onAlert:t=>e(e=>e.alerts.some(e=>yt(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 z(e){let t;try{t=await P(e)}catch{throw Error(`Network error fetching ${e}`)}if(t.status===401)throw R.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 bt(e){let t;try{t=await P(`/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 R.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 xt(e,t,n){let r;try{r=await P(`/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 R.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 St=`wrongstack.hq.local-prefs.v1`,B={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}},V=null,H=new Set;function U(){for(let e of H)e()}function W(e){return typeof structuredClone==`function`?structuredClone(e):JSON.parse(JSON.stringify(e))}function G(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Ct(){if(typeof window>`u`||window.localStorage===void 0)return W(B);try{let e=window.localStorage.getItem(St);return e===null?W(B):wt(JSON.parse(e))}catch{return W(B)}}function wt(e){if(!G(e))return W(B);let t=G(e.appearance)?e.appearance:{},n=G(e.fleet)?e.fleet:{},r=G(e.console)?e.console:{},i=G(e.control)?e.control:{},a=G(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:B.control.cmdType,abortTarget:i.abortTarget===`fleet`?`fleet`:`leader`,spawnRole:typeof i.spawnRole==`string`&&i.spawnRole.length>0?i.spawnRole:B.control.spawnRole,spawnTask:typeof i.spawnTask==`string`?i.spawnTask:B.control.spawnTask,steerTo:typeof i.steerTo==`string`?i.steerTo:B.control.steerTo,steerSubject:typeof i.steerSubject==`string`?i.steerSubject:B.control.steerSubject,steerBody:typeof i.steerBody==`string`?i.steerBody:B.control.steerBody,broadcastSubject:typeof i.broadcastSubject==`string`?i.broadcastSubject:B.control.broadcastSubject,broadcastBody:typeof i.broadcastBody==`string`?i.broadcastBody:B.control.broadcastBody},mailbox:{query:typeof a.query==`string`?a.query:B.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 K(){return V===null&&(V=Ct()),V}function q(e){if(!(typeof window>`u`||window.localStorage===void 0))try{window.localStorage.setItem(St,JSON.stringify(e))}catch{}}function Tt(e){return H.add(e),()=>H.delete(e)}function Et(){return K()}function Dt(){return B}function Ot(){return(0,T.useSyncExternalStore)(Tt,Et,Dt)}function kt(e){let t=K();V={...t,control:{...t.control,...e}},q(V),U()}function At(e){let t=K();V={...t,appearance:{...t.appearance,...e}},q(V),U()}function jt(e){let t=K();V={...t,fleet:{...t.fleet,...e}},q(V),U()}function Mt(e){let t=K();V={...t,console:{...t.console,...e}},q(V),U()}function Nt(e){let t=K();V={...t,mailbox:{...t.mailbox,...e}},q(V),U()}function J({value:e,onChange:t,onKeyDown:n,placeholder:r,autoComplete:i,minLength:a,maxLength:o,autoFocus:s,className:c,id:l}){let[u,d]=(0,T.useState)(!1);return(0,I.jsxs)(`div`,{className:`hq-password-input-wrapper`,children:[(0,I.jsx)(`input`,{id:l,type:u?`text`:`password`,className:c??`hq-token-input`,placeholder:r,autoComplete:i,minLength:a,maxLength:o,autoFocus:s,value:e,onChange:e=>t(e.target.value),onKeyDown:n}),(0,I.jsx)(`button`,{type:`button`,className:`hq-password-toggle`,onClick:()=>d(e=>!e),"aria-label":u?`Hide password`:`Show password`,tabIndex:-1,children:u?(0,I.jsx)(_,{size:14}):(0,I.jsx)(oe,{size:14})})]})}function Pt({hadToken:e}){let[t,n]=(0,T.useState)(null),[r,i]=(0,T.useState)(null);(0,T.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,T.useState)(`token`);return(0,T.useEffect)(()=>{t&&c(t.passwordMode?`password`:`token`)},[t]),r?(0,I.jsx)(`div`,{className:`hq-token-gate`,children:(0,I.jsxs)(`div`,{className:`hq-token-card`,children:[(0,I.jsx)(`div`,{className:`hq-brand`,children:`WrongStack HQ`}),(0,I.jsx)(`div`,{className:`hq-token-title`,children:`Auth status unavailable`}),(0,I.jsx)(`p`,{className:`hq-token-text`,children:r})]})}):t?(0,I.jsx)(`div`,{className:`hq-token-gate`,children:(0,I.jsxs)(`div`,{className:`hq-token-card`,children:[(0,I.jsx)(`div`,{className:`hq-brand`,children:`WrongStack HQ`}),a&&o?(0,I.jsxs)(`div`,{className:`hq-token-tabs`,children:[(0,I.jsx)(`button`,{type:`button`,className:`hq-token-tab`+(s===`token`?` active`:``),onClick:()=>c(`token`),children:`Browser token`}),(0,I.jsx)(`button`,{type:`button`,className:`hq-token-tab`+(s===`password`?` active`:``),onClick:()=>c(`password`),children:`Password`})]}):null,s===`token`||!o?(0,I.jsx)(Ft,{hadToken:e}):(0,I.jsx)(It,{})]})}):(0,I.jsx)(`div`,{className:`hq-token-gate`,children:(0,I.jsxs)(`div`,{className:`hq-token-card`,children:[(0,I.jsx)(`div`,{className:`hq-brand`,children:`WrongStack HQ`}),(0,I.jsx)(`div`,{className:`hq-token-title`,children:`Checking auth mode…`})]})})}function Ft({hadToken:e}){let[t,n]=(0,T.useState)(``),r=()=>{let e=t.trim();e.length!==0&&(j(e),window.location.reload())};return(0,I.jsxs)(I.Fragment,{children:[(0,I.jsx)(`div`,{className:`hq-token-title`,children:`Browser token required`}),(0,I.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,I.jsx)(J,{value:t,onChange:n,onKeyDown:e=>{e.key===`Enter`&&r()},placeholder:`browser token`,autoComplete:`off`,autoFocus:!0}),(0,I.jsx)(`button`,{type:`button`,className:`hq-token-submit`,onClick:r,disabled:t.trim().length===0,children:`Connect`}),(0,I.jsxs)(`p`,{className:`hq-token-hint`,children:[`Manage tokens with `,(0,I.jsx)(`code`,{children:`wstack hq token list`}),` / `,(0,I.jsx)(`code`,{children:`wstack hq token create`}),` — they live in `,(0,I.jsx)(`code`,{children:`~/.wrongstack/hq/auth.json`}),`.`]})]})}function It(){let[e,t]=(0,T.useState)(``),[n,r]=(0,T.useState)(``),[i,a]=(0,T.useState)(!1),[o,s]=(0,T.useState)(null),[c,l]=(0,T.useState)(!1),u=async()=>{let t=e;if(t.length!==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),l(!1);return}if((await e.json()).totpRequired){a(!0),l(!1);return}M(),window.location.reload()}catch{s(`Network error.`),l(!1)}}},d=async()=>{let e=n.trim();if(e.length!==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),l(!1);return}M(),window.location.reload()}catch{s(`Network error.`),l(!1)}}};return i?(0,I.jsxs)(I.Fragment,{children:[o?(0,I.jsx)(`p`,{className:`hq-token-error`,children:o}):null,(0,I.jsx)(`label`,{className:`hq-token-label`,htmlFor:`hq-totp-code`,children:`Authenticator code`}),(0,I.jsx)(`input`,{id:`hq-totp-code`,className:`hq-token-input`,type:`text`,autoComplete:`one-time-code`,autoFocus:!0,placeholder:`000000 or recovery code`,value:n,onChange:e=>r(e.target.value.slice(0,32)),onKeyDown:e=>{e.key===`Enter`&&d()}}),(0,I.jsx)(`button`,{type:`button`,className:`hq-token-submit`,onClick:()=>void d(),disabled:n.trim().length===0||c,children:c?`Verifying…`:`Verify`}),(0,I.jsx)(`button`,{type:`button`,className:`hq-token-hint`,onClick:()=>{a(!1),r(``),s(null)},children:`← Back to password`}),(0,I.jsx)(`p`,{className:`hq-token-hint`,children:`Enter the 6-digit code from your authenticator app, or paste a recovery code.`})]}):(0,I.jsxs)(I.Fragment,{children:[(0,I.jsx)(`div`,{className:`hq-token-title`,children:`Password required`}),(0,I.jsx)(`p`,{className:`hq-token-text`,children:`This HQ server is protected by a password. Enter it to open the dashboard.`}),o?(0,I.jsx)(`p`,{className:`hq-token-error`,children:o}):null,(0,I.jsx)(J,{value:e,onChange:t,onKeyDown:e=>{e.key===`Enter`&&u()},placeholder:`password`,autoComplete:`current-password`,autoFocus:!0}),(0,I.jsx)(`button`,{type:`button`,className:`hq-token-submit`,onClick:()=>void u(),disabled:e.length===0||c,children:c?`Logging in…`:`Log in`}),(0,I.jsxs)(`p`,{className:`hq-token-hint`,children:[`Set or change the password with `,(0,I.jsx)(`code`,{children:`wstack --hq --password <secret>`}),`.`]})]})}var Lt=`modulepreload`,Rt=function(e){return`/`+e},zt={},Y=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=Rt(t,n),t=s(t),t in zt)return;zt[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`:Lt,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)})},Bt=360*60*1e3,X=[{id:`cockpit`,label:`Cockpit`,eyebrow:`Fleet overview`,description:`Health, active work, alerts, cost and command shortcuts.`,group:`Operations`,icon:u,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:c,shortcut:3},{id:`mailbox`,label:`Mailbox`,eyebrow:`Coordination`,description:`Cross-project messages, unread work and direct delivery.`,group:`Operations`,icon:te,shortcut:4},{id:`kanban`,label:`Kanban`,eyebrow:`Project work`,description:`Read-only project boards synchronized across clones and machines.`,group:`Operations`,icon:de},{id:`alerts`,label:`Alerts`,eyebrow:`Attention`,description:`Active fleet warnings and alert transition history.`,group:`Intelligence`,icon:p,shortcut:5},{id:`cost`,label:`Cost`,eyebrow:`Economics`,description:`Project, provider and model spending distribution.`,group:`Intelligence`,icon:s,shortcut:6},{id:`trends`,label:`Trends`,eyebrow:`Telemetry`,description:`Cost, token and tool activity over time.`,group:`Intelligence`,icon:f,shortcut:7},{id:`brain`,label:`Brain`,eyebrow:`Decisions`,description:`Autonomous decisions, escalations and interventions.`,group:`Intelligence`,icon:l,shortcut:8},{id:`worktree`,label:`Worktrees`,eyebrow:`Workspace`,description:`Distributed branches, worktrees and ownership state.`,group:`System`,icon:ie,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:ne}],Vt=[`Operations`,`Intelligence`,`System`],Ht={cockpit:(0,T.lazy)(()=>Y(()=>import(`./cockpit-DXJxjPnB.js`).then(e=>({default:e.CockpitView})),__vite__mapDeps([0,1,2,3]))),fleet:(0,T.lazy)(()=>Y(()=>import(`./fleet-map-CZOgE5Nw.js`).then(e=>({default:e.FleetMapView})),__vite__mapDeps([4,1,2,5,3,6]))),console:(0,T.lazy)(()=>Y(()=>import(`./live-console-i2bRKrD4.js`).then(e=>({default:e.LiveConsoleView})),__vite__mapDeps([7,1,2,3,6,5]))),mailbox:(0,T.lazy)(()=>Y(()=>import(`./mailbox-Ci-OhMVd.js`).then(e=>({default:e.MailboxView})),__vite__mapDeps([8,1,2,3,9]))),kanban:(0,T.lazy)(()=>Y(()=>import(`./kanban-Dv_JO9FX.js`).then(e=>({default:e.KanbanView})),__vite__mapDeps([10,1,2,3]))),cost:(0,T.lazy)(()=>Y(()=>import(`./cost-CJITkXsR.js`).then(e=>({default:e.CostView})),__vite__mapDeps([11,1,2,3]))),brain:(0,T.lazy)(()=>Y(()=>import(`./brain-BG13bveN.js`).then(e=>({default:e.BrainView})),__vite__mapDeps([12,1,2,3,9]))),worktree:(0,T.lazy)(()=>Y(()=>import(`./worktree-Be5RGvFw.js`).then(e=>({default:e.WorktreeView})),__vite__mapDeps([13,1,2,3,9]))),trends:(0,T.lazy)(()=>Y(()=>import(`./trends-CUxeiswr.js`).then(e=>({default:e.TrendsView})),__vite__mapDeps([14,1,2,3]))),alerts:(0,T.lazy)(()=>Y(()=>import(`./alerts-CngcvEJh.js`).then(e=>({default:e.AlertsView})),__vite__mapDeps([15,1,2,3]))),control:(0,T.lazy)(()=>Y(()=>import(`./control-CMd6VthY.js`).then(e=>({default:e.ControlView})),__vite__mapDeps([16,1,2,3]))),settings:(0,T.lazy)(()=>Y(()=>import(`./settings--viYyUXx.js`).then(e=>({default:e.SettingsView})),__vite__mapDeps([17,1,2,3])))};function Ut(e){return X.find(t=>t.id===e)??X[0]}var Wt=class extends T.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,I.jsxs)(`div`,{className:`hq-view-error`,role:`alert`,children:[(0,I.jsx)(y,{size:22}),(0,I.jsxs)(`div`,{children:[(0,I.jsx)(`strong`,{children:`This HQ surface stopped safely.`}),(0,I.jsx)(`p`,{children:this.state.error})]}),(0,I.jsxs)(`button`,{type:`button`,className:`hq-btn secondary`,onClick:()=>this.setState({error:null}),children:[(0,I.jsx)(m,{size:13}),`Retry view`]})]})}};function Gt(){let{snapshot:e,alerts:r,activeView:a,authRequired:c,connected:l,peerRehydrate:u}=R(E(e=>({snapshot:e.snapshot,alerts:e.alerts,activeView:e.activeView,authRequired:e.authRequired,connected:e.connected,peerRehydrate:e.peerRehydrate}))),[f,p]=(0,T.useState)(()=>typeof window>`u`||window.innerWidth>=1180),[m,ee]=(0,T.useState)(null),[h,te]=(0,T.useState)(null),[ne,ie]=(0,T.useState)(!1),{theme:g}=Ot().appearance,_=(0,T.useRef)(!1),v=(0,T.useRef)(!1);if((0,T.useEffect)(()=>{v.current&&l===!1?F.getState().addToast(`Connection lost — reconnecting with backoff…`,`warning`,4e3):v.current&&_.current===!1&&l===!0&&F.getState().addToast(`Reconnected to HQ server`,`success`,3e3),l&&(v.current=!0),_.current=l},[l]),(0,T.useEffect)(()=>(document.documentElement.dataset.hqTheme=g,()=>{delete document.documentElement.dataset.hqTheme}),[g]),(0,T.useEffect)(()=>{let e=!1;return z(`/api/snapshot`).then(t=>{e||R.getState()._hydrateSnapshot(t)}).catch(()=>{}),()=>{e=!0}},[]),(0,T.useEffect)(()=>{let e=!1;return z(`/api/auth/status`).then(t=>{e||te(t)}).catch(()=>{}),()=>{e=!0}},[]),(0,T.useEffect)(()=>{let e=!1,t=()=>{z(`/api/system/update`).then(t=>{e||ee(t)}).catch(()=>{})};t();let n=window.setInterval(t,Bt);return()=>{e=!0,window.clearInterval(n)}},[]),(0,T.useEffect)(()=>{let e=e=>{if((e.ctrlKey||e.metaKey)&&e.key.toLowerCase()===`b`){e.preventDefault(),p(e=>!e);return}if(e.altKey&&/^\d$/.test(e.key)){let t=Number(e.key),n=X.find(e=>e.shortcut===t);n&&(e.preventDefault(),R.getState().setActiveView(n.id));return}e.key===`Escape`&&f&&window.innerWidth<900&&p(!1)};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[f]),c)return(0,I.jsx)(Pt,{hadToken:N()!==null});let y=e?.totals,oe=y?.unreadMailboxMessages??0,se=r.filter(e=>e.severity!==`info`).length,b=Ut(a),x=b.icon,de=Ht[a],fe=e=>{R.getState().setActiveView(e),window.innerWidth<900&&p(!1)},pe=async()=>{ie(!0);try{await P(`/api/logout`,{method:`POST`})}finally{M(),window.location.reload()}};return(0,I.jsxs)(`div`,{className:`hq-app`,"data-theme":g,"data-testid":`hq-workbench`,children:[(0,I.jsx)(`button`,{type:`button`,className:`hq-sidebar-scrim`,"data-open":f,"aria-label":`Close HQ navigation`,onClick:()=>p(!1)}),(0,I.jsxs)(`aside`,{className:`hq-secondary-nav`,"data-open":f,"aria-label":`HQ navigation`,children:[(0,I.jsxs)(`div`,{className:`hq-secondary-header`,children:[(0,I.jsxs)(`div`,{className:`hq-secondary-brand`,children:[(0,I.jsx)(`img`,{src:`/wrongstack.svg`,alt:``,"aria-hidden":`true`,draggable:!1}),(0,I.jsxs)(`div`,{className:`hq-secondary-copy`,children:[(0,I.jsx)(`span`,{className:`hq-secondary-eyebrow`,children:`Command center`}),(0,I.jsx)(`strong`,{children:`WrongStack HQ`})]})]}),(0,I.jsx)(`button`,{type:`button`,className:`hq-icon-button hq-secondary-close`,"aria-label":`Collapse HQ navigation`,title:`Collapse navigation (Ctrl+B)`,onClick:()=>p(!1),children:(0,I.jsx)(i,{size:16})})]}),(0,I.jsx)(`div`,{className:`hq-secondary-scroll`,children:Vt.map(e=>(0,I.jsxs)(`section`,{className:`hq-nav-group`,children:[(0,I.jsx)(`div`,{className:`hq-nav-group-label`,children:e}),X.filter(t=>t.group===e).map(e=>{let t=e.icon,n=e.id===`mailbox`?oe:e.id===`alerts`?se:0;return(0,I.jsxs)(`button`,{type:`button`,className:`hq-nav-item`,"data-active":a===e.id,"aria-current":a===e.id?`page`:void 0,onClick:()=>fe(e.id),children:[(0,I.jsx)(t,{size:15}),(0,I.jsx)(`span`,{children:e.label}),e.shortcut===void 0?null:(0,I.jsxs)(`kbd`,{children:[`Alt+`,e.shortcut]}),n>0?(0,I.jsx)(`span`,{className:`hq-nav-badge`,children:n}):null]},e.id)})]},e))}),(0,I.jsxs)(`div`,{className:`hq-secondary-footer`,children:[(0,I.jsxs)(`div`,{className:`hq-link-state`,"data-live":l,children:[(0,I.jsx)(`span`,{className:`hq-link-dot`}),(0,I.jsxs)(`div`,{children:[(0,I.jsx)(`strong`,{children:l?`Connected`:`Reconnecting`}),(0,I.jsxs)(`span`,{children:[y?.activeMachines??0,` machines · `,y?.activeClients??0,` clients`]})]})]}),(0,I.jsx)(`span`,{className:`hq-build-label`,children:`@wrongstack/webui-hq`})]})]}),(0,I.jsxs)(`section`,{className:`hq-workbench`,"data-update-available":m?.outdated===!0,children:[(0,I.jsxs)(`header`,{className:`hq-header`,children:[(0,I.jsx)(`button`,{type:`button`,className:`hq-icon-button hq-sidebar-toggle`,"aria-label":f?`Collapse HQ navigation`:`Expand HQ navigation`,"aria-expanded":f,title:`Toggle navigation (Ctrl+B)`,onClick:()=>p(e=>!e),children:f?(0,I.jsx)(i,{size:17}):(0,I.jsx)(o,{size:17})}),(0,I.jsx)(`div`,{className:`hq-view-icon`,"aria-hidden":`true`,children:(0,I.jsx)(x,{size:18})}),(0,I.jsxs)(`div`,{className:`hq-view-identity`,children:[(0,I.jsx)(`span`,{children:b.eyebrow}),(0,I.jsx)(`h1`,{children:b.label}),(0,I.jsx)(`p`,{children:b.description})]}),(0,I.jsxs)(`div`,{className:`hq-top-metrics`,children:[(0,I.jsx)(Z,{icon:ue,label:`Machines`,value:y?.activeMachines??0}),(0,I.jsx)(Z,{icon:ce,label:`Agents`,value:y?.activeAgents??0}),(0,I.jsx)(Z,{icon:n,label:`Sessions`,value:y?.activeSessions??0}),(0,I.jsx)(Z,{icon:s,label:`Cost`,value:`$${(y?.totalCostUsd??0).toFixed(2)}`,accent:!0})]}),(0,I.jsxs)(`div`,{className:`hq-connection-pill`,"data-live":l,children:[l?(0,I.jsx)(ae,{size:13}):(0,I.jsx)(re,{size:13}),l?`Live`:`Reconnecting`]}),(0,I.jsx)(`button`,{type:`button`,className:`hq-icon-button hq-theme-toggle`,"aria-label":`Switch to ${g===`dark`?`light`:`dark`} mode`,title:`Switch to ${g===`dark`?`light`:`dark`} mode`,onClick:()=>At({theme:g===`dark`?`light`:`dark`}),children:g===`dark`?(0,I.jsx)(le,{size:16}):(0,I.jsx)(d,{size:16})}),h?.tokenMode||h?.passwordMode?(0,I.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:ne,onClick:()=>void pe(),children:(0,I.jsx)(t,{size:16})}):null]}),m?.outdated?(0,I.jsx)(qt,{status:m}):null,u?(0,I.jsx)(Kt,{envelope:u}):null,(0,I.jsx)(`main`,{className:`hq-main`,id:`hq-main`,tabIndex:-1,children:(0,I.jsx)(Wt,{view:a,children:(0,I.jsx)(T.Suspense,{fallback:(0,I.jsx)(Jt,{label:b.label}),children:(0,I.jsx)(de,{})})})})]}),(0,I.jsx)(pt,{})]})}function Kt({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,I.jsxs)(`aside`,{className:`hq-peer-rehydrate-notice`,role:`status`,"aria-live":`polite`,children:[(0,I.jsx)(g,{size:16,"aria-hidden":`true`}),(0,I.jsxs)(`div`,{children:[(0,I.jsx)(`strong`,{children:t}),(0,I.jsx)(`span`,{children:n})]}),(0,I.jsx)(`button`,{type:`button`,onClick:()=>R.getState()._dismissPeerRehydrate(),title:`Dismiss peer lifecycle notice`,children:`Dismiss`})]})}function qt({status:e}){let[t,n]=(0,T.useState)(!1),r=async()=>{try{await navigator.clipboard.writeText(e.command),n(!0),window.setTimeout(()=>n(!1),1500)}catch{n(!1)}};return(0,I.jsxs)(`aside`,{className:`hq-update-notice`,role:`status`,"aria-live":`polite`,children:[(0,I.jsx)(g,{size:16,"aria-hidden":`true`}),(0,I.jsxs)(`div`,{children:[(0,I.jsx)(`strong`,{children:`WrongStack update available`}),(0,I.jsxs)(`span`,{children:[`v`,e.current,` → v`,e.latest,`. Run `,(0,I.jsx)(`code`,{children:e.command}),` in your terminal, then restart HQ.`]})]}),(0,I.jsxs)(`button`,{type:`button`,onClick:()=>void r(),title:`Copy update command`,children:[(0,I.jsx)(b,{size:13,"aria-hidden":`true`}),t?`Copied`:`Copy command`]})]})}function Z({icon:e,label:t,value:n,accent:r=!1}){return(0,I.jsxs)(`div`,{className:`hq-top-metric`,"data-accent":r,children:[(0,I.jsx)(e,{size:12}),(0,I.jsx)(`span`,{children:t}),(0,I.jsx)(`strong`,{children:n})]})}function Jt({label:e}){return(0,I.jsxs)(`div`,{className:`hq-view-loading`,role:`status`,children:[(0,I.jsx)(x,{size:18}),(0,I.jsxs)(`span`,{children:[`Loading `,e,`…`]})]})}var Yt=25e3,Xt=1e4,Zt=3e4,Qt=32;function $t(e){if(!Number.isFinite(e))return 0;let t=Math.max(0,Math.trunc(e));return Number.isSafeInteger(t)?t:0}var en=class{ws=null;handlers=new Set;stateHandlers=new Set;reconnectAttempt=0;connectionState=he();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??Yt,this.heartbeatTimeoutMs=e?.heartbeatTimeoutMs??Xt,this.maxBackoffMs=e?.maxBackoffMs??Zt,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=N(),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=ge(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=_e(this.connectionState),this.lastMessageAt=Date.now(),this.connectionState=ve(this.connectionState,this.lastMessageAt),this.emitState(`connected`),this.sendResume(),this.startHeartbeat())},e.onmessage=t=>{if(this.ws===e){this.lastMessageAt=Date.now(),this.connectionState=ve(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=ye(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=be(this.connectionState,{...me,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=$t(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===L),i=r===void 0?Qt:Qt-1,a=n.filter(({clientId:e})=>e!==L).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||xe(this.connectionState,{...me,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{}}},Q=null;function tn(e){if(Q===null)return Q=new en(e),Q.connect(),Q;if(e?.resumeCursor!==void 0&&Q.setResumeCursorProvider(e.resumeCursor),e===void 0)return Q;let t=[];return e.url!==void 0&&e.url!==Q.url&&t.push(`url: ${e.url} vs ${Q.url}`),e.heartbeatIntervalMs!==void 0&&e.heartbeatIntervalMs!==Q.heartbeatIntervalMs&&t.push(`heartbeatIntervalMs: ${e.heartbeatIntervalMs} vs ${Q.heartbeatIntervalMs}`),e.heartbeatTimeoutMs!==void 0&&e.heartbeatTimeoutMs!==Q.heartbeatTimeoutMs&&t.push(`heartbeatTimeoutMs: ${e.heartbeatTimeoutMs} vs ${Q.heartbeatTimeoutMs}`),e.maxBackoffMs!==void 0&&e.maxBackoffMs!==Q.maxBackoffMs&&t.push(`maxBackoffMs: ${e.maxBackoffMs} vs ${Q.maxBackoffMs}`),e.maxRetries!==void 0&&e.maxRetries!==Q.maxRetries&&t.push(`maxRetries: ${e.maxRetries} vs ${Q.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.`),Q}var $=document.getElementById(`root`);$!==null&&nt().finally(()=>{Qe(),rt();let e=tn({resumeCursor:()=>R.getState().resumeCursors});e.onStateChange(e=>{R.getState()._setConnected(e===`connected`)});let t=null,n=()=>{t===null&&(R.getState()._setNeedsSnapshotRefresh(!1),t=z(`/api/snapshot`).then(e=>{R.getState()._onSnapshot(e)}).catch(()=>void 0).finally(()=>{t=null}))};R.subscribe((e,t)=>{e.needsSnapshotRefresh&&!t.needsSnapshotRefresh&&n()}),e.on(e=>{if(e.type===`hq.snapshot`){let t=He(e);t&&R.getState()._onSnapshot(t.snapshot)}else if(e.type===`hq.event`){let t=Ue(e);t&&R.getState()._onEvent(t.event)}else if(e.type===`hq.alert`){let t=We(e);t&&R.getState()._onAlert(t.alert)}else if(e.type===`hq.command_status`){let t=Ge(e);t&&R.getState()._onCommandStatus(t.command)}else if(e.type===`hq.resume_gap`)for(let t of e.envelopes){let e=Ue({type:`hq.event`,event:t});e&&R.getState()._onEvent(e.event)}else e.type===`hq.resume_reject`&&(R.getState()._resetResumeCursors(),R.getState()._setNeedsSnapshotRefresh(!0))}),(0,Ke.createRoot)($).render((0,I.jsx)(T.StrictMode,{children:(0,I.jsx)(Gt,{})}))});export{Nt as a,xt as c,P as d,M as f,jt as i,bt as l,Mt as n,Ot as o,E as p,kt as r,z as s,J as t,R as u};
|