@wrongstack/webui-hq 0.303.0 → 0.305.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.
@@ -1,2 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/cockpit-C0Q5npnJ.js","assets/rolldown-runtime-QTnfLwEv.js","assets/icons-kYa9YuNu.js","assets/markdown-mWU1fYYi.js","assets/fleet-map-tbp_DaSv.js","assets/vendor-5Eg_tZuH.js","assets/fleet-topology-DyGlTJ4j.js","assets/live-console-DS00TFIt.js","assets/mailbox-D2n4tL4Z.js","assets/use-backfilled-events-C3CQ5XjI.js","assets/kanban-DWDrxqax.js","assets/cost-DPxMPrnl.js","assets/brain-B366UC4Q.js","assets/worktree-D-LpcIeT.js","assets/trends-BM1Q1qna.js","assets/alerts-N0Ynpm47.js","assets/control-CrHaYj7v.js","assets/settings-BPxMN8dJ.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,topic.advice,completion.request,model.switch,model.refine,model.fallback_choice,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.fallback_pending,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,topic.advice_result,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.agent_deregistered`,`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 Ze(){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.localStorage??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=k()?.getItem(O)??null;if(e!==null&&e.length>0)return e}catch{}return Qe()}function Qe(){try{let e=A()?.getItem(O)??null;if(e===null||e.length===0)return null;let t=!1;try{let n=k();n!==null&&(n.setItem(O,e),t=n.getItem(O)===e)}catch{}if(t)try{A()?.removeItem(O)}catch{}return e}catch{return null}}function M(e){try{k()?.setItem(O,e)}catch{}}function N(){try{k()?.removeItem(O)}catch{}try{A()?.removeItem(O)}catch{}}function P(){let e=Ze();return e===null?j():(M(e),e)}function $e(){if(typeof window>`u`)return;let e=Ze();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 et(){let e=P();return e===null?{}:{Authorization:`Bearer ${e}`}}function F(e,t){let n={...t?.headers??{},...et()};return fetch(e,{...t,headers:n})}function tt(e){let t=e.trim();if(!/[?&]token=/.test(t))return t;try{let e=typeof window>`u`?`http://127.0.0.1/`:window.location.href;return new URL(t,e).searchParams.get(`token`)?.trim()||t}catch{return t}}async function nt(e){return fetch(`/api/auth/upgrade`,{method:`POST`,headers:{Authorization:`Bearer ${e}`},credentials:`same-origin`,signal:AbortSignal.timeout(1e4)})}async function rt(e){let t=tt(e);if(t.length===0)return{ok:!1,message:`Enter a browser token.`};try{let e=await nt(t),n={};try{n=await e.json()}catch{}if(e.ok&&n.loggedIn===!0)return M(t),{ok:!0};let r=n.error;return{ok:!1,message:typeof r==`string`?r:typeof r?.message==`string`?r.message:e.status===401?`The browser token was rejected. It may be invalid, expired, or revoked.`:`HQ could not start a browser session with this token.`}}catch{return{ok:!1,message:`Could not reach the HQ server. Try again.`}}}function it(){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 at(){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 ot(){let e=it();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?(at(),N(),!0):!1}catch{return!1}}async function st(){let e=j();if(e===null)return!1;try{let t=await nt(e);return!(!t.ok||(await t.json()).loggedIn!==!0)}catch{return!1}}var ct=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},lt=(e=>e?ct(e):ct),ut=e=>e;function dt(e,t=ut){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 ft=e=>{let t=lt(e),n=e=>dt(t,e);return Object.assign(n,t),n},pt=(e=>e?ft(e):ft),mt=6e3,ht=0,I=pt()(e=>({toasts:[],addToast:(t,n=`info`,r=mt,i)=>{let a=`toast-${++ht}-${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(),gt={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 _t(){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:gt[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 vt=new Set([`graceful`,`crash`,`heartbeat-timeout`,`auth-revoked`]),R=`__hq_peer__`;function yt(e){return e===void 0||typeof e==`string`}function bt(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`||!vt.has(t.reason)||typeof t.detectedAt!=`string`||!Number.isFinite(Date.parse(t.detectedAt))||!yt(t.rehydrateHint)||t.rehydrateHint!==void 0&&t.rehydrateHint.length>280||!yt(t.rehydrateCommandId))}function xt(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`||!vt.has(t.reason)||typeof t.detectedAt!=`string`||!Number.isFinite(Date.parse(t.detectedAt)))}function St(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 Ct(e,t){return e.timestamp===t.timestamp&&e.severity===t.severity&&e.message===t.message}var z=pt()(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?St(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)?{}:{...St(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(!bt(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(!xt(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=>Ct(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 wt(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 Tt(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 Et=`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 Dt(){if(typeof window>`u`||window.localStorage===void 0)return G(V);try{let e=window.localStorage.getItem(Et);return e===null?G(V):Ot(JSON.parse(e))}catch{return G(V)}}function Ot(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=Dt()),H}function J(e){if(!(typeof window>`u`||window.localStorage===void 0))try{window.localStorage.setItem(Et,JSON.stringify(e))}catch{}}function kt(e){return U.add(e),()=>U.delete(e)}function At(){return q()}function jt(){return V}function Mt(){return(0,E.useSyncExternalStore)(kt,At,jt)}function Nt(e){let t=q();H={...t,control:{...t.control,...e}},J(H),W()}function Pt(e){let t=q();H={...t,appearance:{...t.appearance,...e}},J(H),W()}function Ft(e){let t=q();H={...t,fleet:{...t.fleet,...e}},J(H),W()}function It(e){let t=q();H={...t,console:{...t.console,...e}},J(H),W()}function Lt(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 Rt({hadToken:e,onAuthenticated:t=()=>window.location.reload()}){let[n,r]=(0,E.useState)(null),[i,a]=(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(r).catch(()=>a(`Could not load HQ auth status.`))},[]);let o=n?.tokenMode??!0,s=n?.passwordMode??!1,[c,l]=(0,E.useState)(null),u=c??(e&&o?`token`:s?`password`:`token`);return i?(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:i})]})}):n?(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`}),o&&s?(0,L.jsxs)(`div`,{className:`hq-token-tabs`,children:[(0,L.jsx)(`button`,{type:`button`,className:`hq-token-tab`+(u===`token`?` active`:``),onClick:()=>l(`token`),children:`Browser token`}),(0,L.jsx)(`button`,{type:`button`,className:`hq-token-tab`+(u===`password`?` active`:``),onClick:()=>l(`password`),children:`Password`})]}):null,u===`token`||!s?(0,L.jsx)(zt,{hadToken:e,onAuthenticated:t}):(0,L.jsx)(Bt,{})]})}):(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 zt({hadToken:e,onAuthenticated:t}){let[n,r]=(0,E.useState)(``),[i,a]=(0,E.useState)(null),[o,s]=(0,E.useState)(!1),c=(0,E.useRef)(null),l=(0,E.useRef)(!1);(0,E.useEffect)(()=>{c.current?.focus()},[]);let u=async()=>{if(o||l.current||n.trim().length===0)return;l.current=!0,s(!0),a(null);let e=await rt(n);if(e.ok){t();return}a(e.message??`The browser token was rejected.`),l.current=!1,s(!1)};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 from wstack hq token create. A complete legacy ?token= URL also works.`}),i?(0,L.jsx)(`p`,{className:`hq-token-error`,children:i}):null,(0,L.jsx)(Y,{inputRef:c,value:n,onChange:r,onKeyDown:e=>{e.key===`Enter`&&u()},placeholder:`browser token`,autoComplete:`off`}),(0,L.jsx)(`button`,{type:`button`,className:`hq-token-submit`,onClick:()=>void u(),disabled:n.trim().length===0||o,children:o?`Connecting…`:`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 Bt(){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 Vt=`modulepreload`,Ht=function(e){return`/`+e},Ut={},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=Ht(t,n),t=s(t),t in Ut)return;Ut[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`:Vt,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)})},Wt=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}],Gt=[`Operations`,`Intelligence`,`System`],Kt={cockpit:(0,E.lazy)(()=>X(()=>import(`./cockpit-C0Q5npnJ.js`).then(e=>({default:e.CockpitView})),__vite__mapDeps([0,1,2,3]))),fleet:(0,E.lazy)(()=>X(()=>import(`./fleet-map-tbp_DaSv.js`).then(e=>({default:e.FleetMapView})),__vite__mapDeps([4,1,2,5,3,6]))),console:(0,E.lazy)(()=>X(()=>import(`./live-console-DS00TFIt.js`).then(e=>({default:e.LiveConsoleView})),__vite__mapDeps([7,1,2,3,6,5]))),mailbox:(0,E.lazy)(()=>X(()=>import(`./mailbox-D2n4tL4Z.js`).then(e=>({default:e.MailboxView})),__vite__mapDeps([8,1,2,3,9]))),kanban:(0,E.lazy)(()=>X(()=>import(`./kanban-DWDrxqax.js`).then(e=>({default:e.KanbanView})),__vite__mapDeps([10,1,2,3]))),cost:(0,E.lazy)(()=>X(()=>import(`./cost-DPxMPrnl.js`).then(e=>({default:e.CostView})),__vite__mapDeps([11,1,2,3]))),brain:(0,E.lazy)(()=>X(()=>import(`./brain-B366UC4Q.js`).then(e=>({default:e.BrainView})),__vite__mapDeps([12,1,2,3,9]))),worktree:(0,E.lazy)(()=>X(()=>import(`./worktree-D-LpcIeT.js`).then(e=>({default:e.WorktreeView})),__vite__mapDeps([13,1,2,3,9]))),trends:(0,E.lazy)(()=>X(()=>import(`./trends-BM1Q1qna.js`).then(e=>({default:e.TrendsView})),__vite__mapDeps([14,1,2,3]))),alerts:(0,E.lazy)(()=>X(()=>import(`./alerts-N0Ynpm47.js`).then(e=>({default:e.AlertsView})),__vite__mapDeps([15,1,2,3]))),control:(0,E.lazy)(()=>X(()=>import(`./control-CrHaYj7v.js`).then(e=>({default:e.ControlView})),__vite__mapDeps([16,1,2,3]))),settings:(0,E.lazy)(()=>X(()=>import(`./settings-BPxMN8dJ.js`).then(e=>({default:e.SettingsView})),__vite__mapDeps([17,1,2,3])))};function qt(e){return Z.find(t=>t.id===e)??Z[0]}var Jt=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 Yt(){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:_}=Mt().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,Wt);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)(Rt,{hadToken:P()!==null});let b=e?.totals,oe=b?.unreadMailboxMessages??0,x=t.filter(e=>e.severity!==`info`).length,S=qt(a),le=S.icon,ue=Kt[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:Gt.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:()=>Pt({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)(Zt,{status:p}):null,l?(0,L.jsx)(Xt,{envelope:l}):null,(0,L.jsx)(`main`,{className:`hq-main`,id:`hq-main`,tabIndex:-1,children:(0,L.jsx)(Jt,{view:a,children:(0,L.jsx)(E.Suspense,{fallback:(0,L.jsx)(Qt,{label:S.label}),children:(0,L.jsx)(ue,{})})})})]}),(0,L.jsx)(_t,{})]})}function Xt({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 Zt({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 $t=25e3,en=1e4,tn=3e4,nn=32;function rn(e){let t=e.toLowerCase().replace(/^\[(.*)\]$/,`$1`);if(t===`localhost`)return!0;let n=t.match(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/);if(n){if(n[1]!==`127`)return!1;for(let e of n.slice(1))if(Number(e)>255)return!1;return!0}return t===`::1`||t===`0:0:0:0:0:0:0:1`||t.startsWith(`::ffff:127.`)}function an(e){if(!Number.isFinite(e))return 0;let t=Math.max(0,Math.trunc(e));return Number.isSafeInteger(t)?t:0}var on=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??$t,this.heartbeatTimeoutMs=e?.heartbeatTimeoutMs??en,this.maxBackoffMs=e?.maxBackoffMs??tn,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:`,hostname:`127.0.0.1`},t=e.protocol===`https:`?`wss:`:`ws:`,n=P(),r=rn(e.hostname),i=`${t}//${e.host}/ws/browser`;this._url=n!==null&&r?`${i}?token=${encodeURIComponent(n)}`:i}}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=an(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?nn:nn-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 sn(e){if($===null)return $=new on(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 cn=document.getElementById(`root`);cn!==null&&ot().finally(()=>{$e(),st();let e=sn({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)(cn).render((0,L.jsx)(E.StrictMode,{children:(0,L.jsx)(Yt,{})}))});export{Lt as a,Tt as c,F as d,N as f,Ft as i,wt as l,It as n,Mt as o,D as p,Nt as r,B as s,Y as t,z as u};
@@ -1 +0,0 @@
1
- import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{At as t,C as n,Dt as r,Ot as i,St as a,Ut as o,Wt as s,Y as c,_t as l,c as u,n as d,ot as f,s as p}from"./icons-kYa9YuNu.js";import{i as m}from"./markdown-mWU1fYYi.js";import{s as h,u as g}from"./index-DIscZlJt.js";var _=e(s(),1),v=m();function y({task:e,board:n,webuiUrl:r,dependencyTitles:i,onClose:o}){let s=e.dependsOn.map(e=>({id:e,title:i?.get(e)??e.slice(0,8)}));return(0,v.jsxs)(`aside`,{className:`hq-kanban-inspector`,"aria-label":`Task detail`,children:[(0,v.jsxs)(`header`,{className:`hq-kanban-inspector-header`,children:[(0,v.jsxs)(`div`,{children:[(0,v.jsx)(`span`,{className:`hq-pill ${e.status}`,children:e.status.replaceAll(`_`,` `)}),(0,v.jsx)(`span`,{className:`hq-kanban-priority ${e.priority}`,children:e.priority})]}),(0,v.jsx)(`button`,{type:`button`,onClick:o,"aria-label":`Close inspector`,className:`hq-inspector-close`,children:(0,v.jsx)(d,{size:16})})]}),(0,v.jsx)(`h2`,{className:`hq-kanban-inspector-title`,children:e.title}),(0,v.jsx)(`span`,{className:`hq-mono hq-kanban-inspector-id`,children:e.id}),e.description?(0,v.jsxs)(`section`,{className:`hq-kanban-inspector-section`,children:[(0,v.jsx)(`h3`,{children:`Description`}),(0,v.jsx)(`p`,{className:`hq-kanban-inspector-description`,children:e.description})]}):null,(0,v.jsxs)(`section`,{className:`hq-kanban-inspector-section`,children:[(0,v.jsx)(`h3`,{children:`Details`}),(0,v.jsxs)(`dl`,{className:`hq-kanban-inspector-details`,children:[(0,v.jsxs)(`div`,{className:`hq-kanban-inspector-row`,children:[(0,v.jsxs)(`dt`,{children:[(0,v.jsx)(c,{size:13}),`Board`]}),(0,v.jsx)(`dd`,{children:n.title})]}),e.assignee?(0,v.jsxs)(`div`,{className:`hq-kanban-inspector-row`,children:[(0,v.jsxs)(`dt`,{children:[(0,v.jsx)(p,{size:13}),`Assignee`]}),(0,v.jsxs)(`dd`,{children:[e.assignee,e.assignmentStatus?(0,v.jsxs)(`span`,{className:`hq-mono`,style:{marginLeft:6,opacity:.7},children:[`(`,e.assignmentStatus,`)`]}):null]})]}):null,e.dueDate?(0,v.jsxs)(`div`,{className:`hq-kanban-inspector-row`,children:[(0,v.jsxs)(`dt`,{children:[(0,v.jsx)(a,{size:13}),`Due`]}),(0,v.jsx)(`dd`,{children:new Date(e.dueDate).toLocaleString()})]}):null,e.columnId?(0,v.jsxs)(`div`,{className:`hq-kanban-inspector-row`,children:[(0,v.jsxs)(`dt`,{children:[(0,v.jsx)(c,{size:13}),`Column`]}),(0,v.jsx)(`dd`,{children:n.columns.find(t=>t.id===e.columnId)?.title??e.columnId})]}):null]})]}),e.labels.length>0?(0,v.jsxs)(`section`,{className:`hq-kanban-inspector-section`,children:[(0,v.jsx)(`h3`,{children:`Labels`}),(0,v.jsx)(`div`,{className:`hq-kanban-inspector-labels`,children:e.labels.map(e=>(0,v.jsx)(`span`,{className:`hq-pill info`,children:e},e))})]}):null,s.length>0?(0,v.jsxs)(`section`,{className:`hq-kanban-inspector-section`,children:[(0,v.jsxs)(`h3`,{children:[(0,v.jsx)(f,{size:13}),`Dependencies (`,s.length,`)`]}),(0,v.jsx)(`ul`,{className:`hq-kanban-inspector-deps`,children:s.map(n=>(0,v.jsxs)(`li`,{children:[(0,v.jsx)(`span`,{className:`hq-mono`,children:n.id.slice(0,8)}),(0,v.jsx)(`span`,{children:n.title}),e.status===`completed`?(0,v.jsx)(t,{size:13,className:`is-done`}):null]},n.id))})]}):null,e.status===`blocked`||e.status===`failed`?(0,v.jsxs)(`div`,{className:`hq-kanban-inspector-alert`,children:[(0,v.jsx)(u,{size:14}),(0,v.jsxs)(`span`,{children:[`This task is `,e.status,` and may need attention.`]})]}):null,r?(0,v.jsx)(`footer`,{className:`hq-kanban-inspector-footer`,children:(0,v.jsxs)(`a`,{href:r,target:`_blank`,rel:`noopener noreferrer`,className:`hq-button hq-button-primary`,children:[(0,v.jsx)(l,{size:14}),`Open in WebUI`]})}):null]})}function b({board:e}){let n=x(e),s=n.ready===0&&n.running===0&&n.review===0&&n.blocked===0&&n.failed===0;return(0,v.jsxs)(`div`,{className:`hq-kanban-queue-health`,role:`status`,"aria-label":`Queue health`,children:[(0,v.jsx)(`span`,{className:`hq-kanban-qh-label`,children:`Queue health`}),n.ready>0?(0,v.jsxs)(`span`,{className:`hq-kanban-qh-pill ready`,title:`Claimable tasks`,children:[(0,v.jsx)(r,{size:12}),n.ready,` ready`]}):null,n.running>0?(0,v.jsxs)(`span`,{className:`hq-kanban-qh-pill running`,title:`Running assignments`,children:[(0,v.jsx)(o,{size:12}),n.running,` running`]}):null,n.review>0?(0,v.jsxs)(`span`,{className:`hq-kanban-qh-pill review`,title:`In review`,children:[(0,v.jsx)(a,{size:12}),n.review,` review`]}):null,n.blocked>0?(0,v.jsxs)(`span`,{className:`hq-kanban-qh-pill blocked`,title:`Manually blocked`,children:[(0,v.jsx)(i,{size:12}),n.blocked,` blocked`]}):null,n.failed>0?(0,v.jsxs)(`span`,{className:`hq-kanban-qh-pill failed`,title:`Failed tasks`,children:[(0,v.jsx)(u,{size:12}),n.failed,` failed`]}):null,s?(0,v.jsxs)(`span`,{className:`hq-kanban-qh-pill healthy`,title:`No issues detected`,children:[(0,v.jsx)(t,{size:12}),`healthy`]}):null]})}function x(e){let t={ready:0,running:0,review:0,blocked:0,failed:0};for(let n of e.columns)for(let e of n.tasks)switch(e.status){case`ready`:t.ready++;break;case`in_progress`:t.running++;break;case`review`:t.review++;break;case`blocked`:t.blocked++;break;case`failed`:t.failed++;break}return t}var S=new Set([`low`,`medium`,`high`,`critical`]),C=new Set([`pending`,`ready`,`in_progress`,`review`,`completed`,`blocked`,`failed`,`archived`]);function w(e){return`/api/projects/${encodeURIComponent(e)}/kanban`}function T(e){return e.boards.map(e=>E(e)).filter(e=>e!==null).sort((e,t)=>t.updatedAt.localeCompare(e.updatedAt))}function E(e){let t=e.board;if(t.id!==e.boardId)return null;let n=k(t.columns).map(D).filter(e=>e!==null),r=k(t.tasks).map(O).filter(e=>e!==null),i=new Set(n.map(e=>e.id)),a=new Set(r.map(e=>e.columnId).filter(e=>!i.has(e)));for(let e of a)n.push({id:e,title:e.length>0?e:`Unmapped`,order:2**53-1});let o=n.sort((e,t)=>e.order-t.order||e.title.localeCompare(t.title)).map(e=>({...e,tasks:r.filter(t=>t.columnId===e.id).sort((e,t)=>e.order-t.order||e.title.localeCompare(t.title))}));return{id:e.boardId,title:M(t.title)??e.boardId,description:M(t.description),tags:j(t.tags),revision:e.revision,updatedAt:e.updatedAt,activePresence:k(t.presence).filter(e=>e.active===!0).length,taskCount:r.length,completedTaskCount:r.filter(e=>e.status===`completed`).length,activeTaskCount:r.filter(e=>e.status===`in_progress`||e.status===`review`).length,blockedTaskCount:r.filter(e=>e.status===`blocked`||e.status===`failed`).length,columns:o}}function D(e){let t=M(e.id),n=M(e.title);return!t||!n?null:{id:t,title:n,color:M(e.color),order:N(e.order)??0,wipLimit:N(e.wipLimit)}}function O(e){let t=M(e.id),n=M(e.title),r=M(e.columnId);if(!t||!n||r===void 0)return null;let i=A(e.assignment);return{id:t,title:n,description:M(e.description),columnId:r,order:N(e.order)??0,priority:P(e.priority,S)??`medium`,status:P(e.status,C)??`pending`,assignee:M(e.assignee)??M(e.assignedAgent)??M(i?.name)??M(i?.agentId),assignmentStatus:M(i?.status),labels:j(e.labels),dependsOn:j(e.dependsOn),dueDate:M(e.dueDate)}}function k(e){return Array.isArray(e)?e.filter(e=>typeof e==`object`&&!!e&&!Array.isArray(e)):[]}function A(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:void 0}function j(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function M(e){return typeof e==`string`?e:void 0}function N(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function P(e,t){return typeof e==`string`&&t.has(e)?e:void 0}var F=1e4,I=[];function L(){let e=g(e=>e.snapshot?.projects??I),t=g(e=>{for(let t=e.events.length-1;t>=0;t--){let n=e.events[t];if(n?.type===`kanban.snapshot`)return n.id}return null}),[r,i]=(0,_.useState)(``),[a,o]=(0,_.useState)(``),[s,c]=(0,_.useState)(null),[l,d]=(0,_.useState)(!1),[f,p]=(0,_.useState)(!1),[m,x]=(0,_.useState)(null),S=(0,_.useRef)(0),C=(0,_.useRef)(t);(0,_.useEffect)(()=>{if(e.length===0){i(``),c(null);return}e.some(e=>e.projectId===r)||i(e[0].projectId)},[r,e]);let E=(0,_.useCallback)(async(e=!1)=>{if(!r)return;let t=++S.current;e?d(!0):p(!0);try{let e=await h(w(r));if(t!==S.current)return;c(e),x(null)}catch(e){if(t!==S.current)return;x(e instanceof Error?e.message:String(e))}finally{t===S.current&&(d(!1),p(!1))}},[r]);(0,_.useEffect)(()=>{S.current++,c(null),o(``),x(null)},[r]),(0,_.useEffect)(()=>{if(!r)return;E(!0);let e=window.setInterval(()=>void E(!1),F);return()=>{S.current++,window.clearInterval(e)}},[E,r]),(0,_.useEffect)(()=>{t===null||t===C.current||(C.current=t,r&&E(!1))},[t,E,r]);let D=(0,_.useMemo)(()=>s?T(s):[],[s]);(0,_.useEffect)(()=>{D.length===0?o(``):D.some(e=>e.id===a)||o(D[0].id)},[a,D]);let O=D.find(e=>e.id===a)??null,k=e.find(e=>e.projectId===r)??null,[A,j]=(0,_.useState)(null);(0,_.useEffect)(()=>{j(null)},[a]);let M=(0,_.useMemo)(()=>{if(!O||!A)return null;for(let e of O.columns){let t=e.tasks.find(e=>e.id===A);if(t)return t}return null},[O,A]),N=(0,_.useMemo)(()=>{if(!O)return new Map;let e=new Map;for(let t of O.columns)for(let n of t.tasks)e.set(n.id,n.title);return e},[O]);return e.length===0?(0,v.jsx)(`div`,{className:`hq-empty`,children:`No HQ projects are available. Connect a WrongStack client to publish its project identity and Kanban snapshot.`}):(0,v.jsxs)(`div`,{className:`hq-kanban-view`,children:[(0,v.jsx)(R,{projects:e,projectId:r,onProjectChange:e=>i(e),boards:D,boardId:a,onBoardChange:o,generatedAt:s?.generatedAt,refreshing:f,onRefresh:()=>void E(!1)}),m?(0,v.jsxs)(`div`,{className:`hq-kanban-error`,role:`alert`,children:[(0,v.jsx)(u,{size:15}),(0,v.jsx)(`span`,{children:m}),(0,v.jsx)(`button`,{type:`button`,onClick:()=>void E(!0),children:`Retry`})]}):null,l&&s===null?(0,v.jsxs)(`div`,{className:`hq-view-loading`,role:`status`,children:[(0,v.jsx)(n,{size:18}),(0,v.jsx)(`span`,{children:`Loading project boards…`})]}):O?(0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(z,{project:k,board:O,boardCount:D.length}),(0,v.jsx)(b,{board:O}),(0,v.jsxs)(`div`,{className:`hq-kanban-main`,children:[(0,v.jsx)(V,{board:O,onTaskClick:j,selectedTaskId:A}),M?(0,v.jsx)(y,{task:M,board:O,dependencyTitles:N,onClose:()=>j(null)}):null]})]}):(0,v.jsxs)(`div`,{className:`hq-empty`,children:[`This project has not published a Kanban board yet. Create one with `,(0,v.jsx)(`code`,{children:`/kanban`}),` `,`from any connected clone.`]})]})}function R({projects:e,projectId:t,onProjectChange:r,boards:i,boardId:a,onBoardChange:o,generatedAt:s,refreshing:c,onRefresh:l}){return(0,v.jsxs)(`div`,{className:`hq-kanban-toolbar`,children:[(0,v.jsxs)(`label`,{children:[(0,v.jsx)(`span`,{children:`Project`}),(0,v.jsx)(`select`,{className:`hq-select`,"aria-label":`Kanban project`,value:t,onChange:e=>r(e.target.value),children:e.map(e=>(0,v.jsx)(`option`,{value:e.projectId,children:e.projectName},e.projectId))})]}),(0,v.jsxs)(`label`,{children:[(0,v.jsx)(`span`,{children:`Board`}),(0,v.jsxs)(`select`,{className:`hq-select`,"aria-label":`Kanban board`,value:a,disabled:i.length===0,onChange:e=>o(e.target.value),children:[i.length===0?(0,v.jsx)(`option`,{value:``,children:`No boards`}):null,i.map(e=>(0,v.jsx)(`option`,{value:e.id,children:e.title},e.id))]})]}),(0,v.jsxs)(`div`,{className:`hq-kanban-sync`,children:[(0,v.jsx)(`span`,{children:s?`Synced ${W(s)}`:`Waiting for snapshot`}),(0,v.jsxs)(`button`,{type:`button`,onClick:l,disabled:c,"aria-label":`Refresh Kanban`,children:[(0,v.jsx)(n,{size:14,className:c?`is-spinning`:void 0}),`Refresh`]})]})]})}function z({project:e,board:t,boardCount:n}){return(0,v.jsxs)(`section`,{className:`hq-kanban-summary`,children:[(0,v.jsxs)(`div`,{className:`hq-kanban-heading`,children:[(0,v.jsxs)(`div`,{children:[(0,v.jsxs)(`span`,{children:[e?.projectName??`Project`,` · Kanban`]}),(0,v.jsx)(`h2`,{children:t.title}),t.description?(0,v.jsx)(`p`,{children:t.description}):null]}),(0,v.jsxs)(`div`,{className:`hq-kanban-board-meta`,children:[(0,v.jsxs)(`span`,{className:`hq-mono`,children:[`rev `,t.revision]}),(0,v.jsx)(`span`,{children:W(t.updatedAt)}),t.activePresence>0?(0,v.jsxs)(`span`,{className:`hq-pill active`,children:[t.activePresence,` active`]}):null]})]}),t.tags.length>0?(0,v.jsx)(`div`,{className:`hq-kanban-tags`,children:t.tags.map(e=>(0,v.jsx)(`span`,{className:`hq-pill info`,children:e},e))}):null,(0,v.jsxs)(`div`,{className:`hq-kanban-stats`,children:[(0,v.jsx)(B,{label:`Boards`,value:n}),(0,v.jsx)(B,{label:`Tasks`,value:t.taskCount}),(0,v.jsx)(B,{label:`Active`,value:t.activeTaskCount,tone:`active`}),(0,v.jsx)(B,{label:`Blocked`,value:t.blockedTaskCount,tone:`blocked`}),(0,v.jsx)(B,{label:`Done`,value:t.completedTaskCount,tone:`done`})]})]})}function B({label:e,value:t,tone:n}){return(0,v.jsxs)(`div`,{className:`hq-kanban-stat`,"data-tone":n,children:[(0,v.jsx)(`strong`,{children:t}),(0,v.jsx)(`span`,{children:e})]})}function V({board:e,onTaskClick:t,selectedTaskId:n}){return e.columns.length===0?(0,v.jsx)(`div`,{className:`hq-empty`,children:`This board does not have any columns yet.`}):(0,v.jsx)(`section`,{className:`hq-kanban-board`,"aria-label":`${e.title} Kanban board`,style:{"--hq-kanban-columns":Math.max(1,e.columns.length)},children:e.columns.map(e=>(0,v.jsxs)(`div`,{className:`hq-kanban-column`,"data-over-limit":e.wipLimit!==void 0&&e.tasks.filter(e=>e.status!==`completed`).length>e.wipLimit,children:[(0,v.jsxs)(`header`,{style:e.color?{borderTopColor:e.color}:void 0,children:[(0,v.jsxs)(`div`,{children:[(0,v.jsx)(`strong`,{children:e.title}),e.wipLimit===void 0?null:(0,v.jsxs)(`span`,{children:[`WIP `,e.tasks.length,`/`,e.wipLimit]})]}),(0,v.jsx)(`span`,{className:`hq-kanban-column-count`,children:e.tasks.length})]}),(0,v.jsx)(`div`,{className:`hq-kanban-column-body`,children:e.tasks.length===0?(0,v.jsx)(`div`,{className:`hq-kanban-column-empty`,children:`No cards`}):e.tasks.map(e=>(0,v.jsx)(H,{task:e,isSelected:e.id===n,onClick:()=>t(e.id)},e.id))})]},e.id))})}function H({task:e,isSelected:n=!1,onClick:r}){return(0,v.jsxs)(`button`,{type:`button`,className:`hq-kanban-task`,"data-priority":e.priority,"data-selected":n,onClick:r,children:[(0,v.jsxs)(`div`,{className:`hq-kanban-task-topline`,children:[(0,v.jsx)(`span`,{className:`hq-pill ${e.status}`,children:e.status.replaceAll(`_`,` `)}),(0,v.jsx)(`span`,{className:`hq-kanban-priority ${e.priority}`,children:e.priority})]}),(0,v.jsx)(`h3`,{children:e.title}),e.description?(0,v.jsx)(`p`,{children:e.description}):null,e.labels.length>0?(0,v.jsx)(`div`,{className:`hq-kanban-task-labels`,children:e.labels.slice(0,4).map(e=>(0,v.jsx)(`span`,{children:e},e))}):null,(0,v.jsxs)(`footer`,{children:[e.assignee?(0,v.jsxs)(`span`,{title:e.assignmentStatus??`assigned`,children:[(0,v.jsx)(p,{size:12}),e.assignee]}):null,e.dependsOn.length>0?(0,v.jsxs)(`span`,{title:`${e.dependsOn.length} dependencies`,children:[(0,v.jsx)(f,{size:12}),e.dependsOn.length]}):null,e.dueDate?(0,v.jsxs)(`span`,{title:`Due ${new Date(e.dueDate).toLocaleString()}`,children:[(0,v.jsx)(a,{size:12}),U(e.dueDate)]}):null,e.status===`completed`?(0,v.jsx)(t,{size:13,className:`is-done`}):null]})]})}function U(e){let t=new Date(e);return Number.isFinite(t.getTime())?t.toLocaleDateString(void 0,{month:`short`,day:`numeric`}):e}function W(e){let t=Date.parse(e);if(!Number.isFinite(t))return e;let n=Math.max(0,Math.floor((Date.now()-t)/1e3));if(n<10)return`just now`;if(n<60)return`${n}s ago`;let r=Math.floor(n/60);if(r<60)return`${r}m ago`;let i=Math.floor(r/60);return i<24?`${i}h ago`:`${Math.floor(i/24)}d ago`}export{L as KanbanView};