@wrongstack/webui 0.282.1 → 0.282.2
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/{AnalyticsDashboard-TCNC-sVb.js → AnalyticsDashboard-CPLSpHzV.js} +1 -1
- package/dist/assets/{AutoPhaseView-BMUiT6aI.js → AutoPhaseView-HIzNPExo.js} +1 -1
- package/dist/assets/{CodeEditor-C0si742k.js → CodeEditor-dOQDoCfn.js} +1 -1
- package/dist/assets/{DebugDashboard-BHpiEOcf.js → DebugDashboard-CQCI-B4W.js} +1 -1
- package/dist/assets/{DesignGalleryView-BfZTw48N.js → DesignGalleryView-BxTlrmrr.js} +1 -1
- package/dist/assets/{KanbanView-C4T4y0b7.js → KanbanView-2uDRr6Qd.js} +1 -1
- package/dist/assets/{MailboxDetailView-DJtjP0NF.js → MailboxDetailView-B0DCs5lu.js} +1 -1
- package/dist/assets/OfficeMapPanel-lGSaptet.js +4 -0
- package/dist/assets/{ProcessMonitor-D53zn0h4.js → ProcessMonitor-eTb8_-ZW.js} +1 -1
- package/dist/assets/{QueuePanel-DTO68vaB.js → QueuePanel-TbbkNAx_.js} +1 -1
- package/dist/assets/{RefreshDebugView-BXq2P3wo.js → RefreshDebugView-CX6x-xHs.js} +1 -1
- package/dist/assets/SddBoardView-BXQsH6fr.js +2 -0
- package/dist/assets/{SddFlowGraph-CtMpzU4S.js → SddFlowGraph-DTWV-DPB.js} +1 -1
- package/dist/assets/SddWizard-1ZhDgcgM.js +1 -0
- package/dist/assets/{SessionsDashboard-Dqsrp5CK.js → SessionsDashboard-CfNbqjeh.js} +1 -1
- package/dist/assets/SkillDetailView-UzixISza.js +2 -0
- package/dist/assets/{SpecsView-Cwd6PiYr.js → SpecsView-BO8yG6ID.js} +1 -1
- package/dist/assets/{TerminalPanel-Bzyhr2aC.js → TerminalPanel-Bjbu9ktV.js} +1 -1
- package/dist/assets/{chat-store-CIMOL6-x.js → chat-store-7ekEnPAf.js} +1 -1
- package/dist/assets/{i18n-CNo6A2vu.js → i18n-BCQuDmQo.js} +2 -2
- package/dist/assets/index-Cb-hw9qG.js +147 -0
- package/dist/assets/index-ZtF5f7wy.css +1 -0
- package/dist/assets/{session-store-DN1UYDL9.js → session-store-KCJiKVqL.js} +1 -1
- package/dist/assets/settings-wb322bGN.js +1 -0
- package/dist/assets/{ui-store-BdOsq6T-.js → ui-store-CcznRsiV.js} +1 -1
- package/dist/assets/utils-C3qJEm2b.js +1 -0
- package/dist/assets/{vendor-Ch4m_qLI.js → vendor-Cm3Womkr.js} +25 -25
- package/dist/assets/{ws-client-BAV7SLzK.js → ws-client-9j1mjm9I.js} +1 -1
- package/dist/assets/{xyflow-D5_yey7w.js → xyflow-Dy5Edi88.js} +3 -3
- package/dist/index.html +10 -10
- package/dist/index.js +4040 -3685
- package/dist/index.js.map +1 -1
- package/dist/server/entry.js +42 -5
- package/dist/server/entry.js.map +1 -1
- package/dist/server/index.js +42 -5
- package/dist/server/index.js.map +1 -1
- package/dist/types.d.ts +28 -0
- package/package.json +6 -6
- package/dist/assets/OfficeMapPanel-CgvHvGQm.js +0 -4
- package/dist/assets/SddBoardView-C8X4MiTy.js +0 -2
- package/dist/assets/SddWizard-t5Cly3CG.js +0 -1
- package/dist/assets/SkillDetailView-Dq-fTqSp.js +0 -2
- package/dist/assets/index-CWj2bI87.js +0 -145
- package/dist/assets/index-D7_FeyCA.css +0 -1
- package/dist/assets/settings-CGhOOFpI.js +0 -1
- package/dist/assets/utils-DBns3uMk.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-QTnfLwEv.js";import{si as t}from"./vendor-Ch4m_qLI.js";import{t as n}from"./session-store-DN1UYDL9.js";function r(e){typeof requestAnimationFrame==`function`?requestAnimationFrame(e):queueMicrotask(e)}var i=new class{pending=new Map;scheduled=!1;push(e,t,n){if(!t)return;let r=this.pending.get(e);r?(r.buffer+=t,r.flush=n):this.pending.set(e,{buffer:t,flush:n}),this.schedule()}schedule(){this.scheduled||(this.scheduled=!0,r(()=>{this.scheduled=!1,this.drain()}))}drain(){if(this.pending.size===0)return;let e=Array.from(this.pending.entries());this.pending.clear();for(let[t,n]of e)n.buffer&&n.flush(t,n.buffer)}drop(e){this.pending.delete(e)}dropAll(){this.pending.clear()}flush(e){let t=this.pending.get(e);t&&(this.pending.delete(e),t.buffer&&t.flush(e,t.buffer))}flushAll(){this.drain()}};function a(e){return{type:`provider.clear_models`,payload:{providerId:e}}}function o(e,t){return{type:`provider.undo_clear`,payload:{providerId:e,previousModels:[...t]}}}function s(e){return{type:`provider.update`,payload:e}}function c(e){return Math.max(0,Math.min(100,Math.round((typeof e==`number`&&Number.isFinite(e)?e:0)*100)))}function l(e,t=!1){if(t&&e.target){if(e.kind===`agent:tool`||e.kind===`tool:executed`||e.kind===`tool:started`)return`tool`;if(e.source===`leader`||e.source===`coordinator`)return`coordinator`;if(e.kind.startsWith(`provider:`))return`provider`;if(e.kind.startsWith(`mailbox:`))return`mailbox`}switch(e.kind){case`provider:call`:case`provider:delta`:case`provider:response`:return`provider`;case`agent:spawned`:case`agent:tool`:case`agent:status`:case`agent:text`:case`agent:ctx`:case`budget:warning`:case`budget:extended`:return`agent`;case`tool:started`:case`tool:executed`:case`tool:progress`:return`tool`;case`mailbox:send`:case`mailbox:deliver`:return`mailbox`;case`collab:event`:return`system`;case`session:start`:case`session:end`:case`iteration:start`:case`iteration:end`:case`eternal:iteration`:case`fleet:snapshot`:return`session`;case`context:compacted`:case`context:repaired`:case`cost:update`:return`system`;case`error`:return`error`;default:return`system`}}function u(e){switch(e){case`provider:call`:case`provider:delta`:case`agent:tool`:case`tool:started`:case`tool:progress`:case`iteration:start`:case`agent:text`:return`streaming`;case`agent:status`:case`iteration:end`:return`completed`;case`error`:return`error`;case`tool:executed`:return`completed`;case`session:end`:return`idle`;default:return`active`}}var d=0;function f(){return`viz_${Date.now()}_${++d}`}function p(e,t){if(e===t)return!0;if(!e||!t)return!1;let n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(let r of n){let n=e[r],i=t[r];if(n!==i){if(n==null||i==null||typeof n!=typeof i)return!1;if(typeof n==`object`){if(Array.isArray(n)||Array.isArray(i)||!p(n,i))return!1;continue}return!1}}return!0}var m={provider:`hsl(180, 80%, 55%)`,agent:`hsl(280, 80%, 65%)`,tool:`hsl(40, 90%, 55%)`,mailbox:`hsl(140, 70%, 55%)`,session:`hsl(220, 80%, 60%)`,system:`hsl(0, 0%, 60%)`,error:`hsl(0, 80%, 55%)`},h={"provider:call":`hsl(180, 80%, 55%)`,"provider:delta":`hsl(180, 60%, 70%)`,"agent:tool":`hsl(40, 90%, 55%)`,"mailbox:send":`hsl(140, 70%, 55%)`,default:`hsl(0, 0%, 40%)`},g=t()((e,t)=>({events:[],nodes:new Map,edges:new Map,isActive:!1,maxEvents:2e3,counters:{totalTokens:0,totalCost:0,totalToolCalls:0,activeAgents:0,completedTasks:0,errors:0,mailboxMessages:0},pushEvent:t=>e(e=>{let n=[{...t,id:t.id??f(),timestamp:t.timestamp||Date.now()},...e.events];n.length>e.maxEvents&&(n.length=e.maxEvents);let r=Date.now(),i=t.source,a={id:i,kind:l(t),label:t.label,status:u(t.kind),activity:1,color:t.color??m[l(t)],lastSeenAt:r},o=e.nodes.get(i),s=o?{...o,...a}:a,c=!p(o,s),d,h=!1,g;if(t.target){g=t.target;let n={id:g,kind:l(t,!0),label:g,status:u(t.kind),activity:.8,color:t.color??m[l(t,!0)],lastSeenAt:r},i=e.nodes.get(g);d=i?{...i,...n}:n,h=!p(i,d)}let _,v=!1,y;if(t.target&&i){y=`${i}->${t.target}`;let n=e.edges.get(y),a={id:y,source:i,target:t.target,kind:t.kind,label:t.label,intensity:n?Math.min(1,n.intensity+.3):.7,color:t.color??m[l(t)]??`#6366f1`,lastActiveAt:r,totalMagnitude:(n?.totalMagnitude??0)+(t.magnitude??0)};_=n?{...n,...a}:a,v=!p(n,_)}let b=e.nodes,x=e.edges;return(c||h)&&(b=new Map(e.nodes),c&&b.set(i,s),h&&d&&g&&b.set(g,d)),v&&_&&y&&(x=new Map(e.edges),x.set(y,_)),{events:n,nodes:b,edges:x}}),upsertNode:t=>e(e=>{let n=new Map(e.nodes),r=n.get(t.id);return n.set(t.id,{...r,...t,lastSeenAt:t.lastSeenAt===void 0?Date.now():t.lastSeenAt}),{nodes:n}}),removeNode:t=>e(e=>{let n=new Map(e.nodes);n.delete(t);let r=new Map(e.edges);for(let[e,n]of r)(n.source===t||n.target===t)&&r.delete(e);return{nodes:n,edges:r}}),upsertEdge:t=>e(e=>{let n=new Map(e.edges),r=n.get(t.id);return n.set(t.id,{...r,...t,lastActiveAt:t.lastActiveAt===void 0?Date.now():t.lastActiveAt,intensity:t.intensity??r?.intensity??.5,color:t.color??h[t.kind]??h.default,totalMagnitude:(r?.totalMagnitude??0)+(t.totalMagnitude??0)}),{edges:n}}),removeEdge:t=>e(e=>{let n=new Map(e.edges);return n.delete(t),{edges:n}}),clear:()=>e({events:[],nodes:new Map,edges:new Map,counters:{totalTokens:0,totalCost:0,totalToolCalls:0,activeAgents:0,completedTasks:0,errors:0,mailboxMessages:0}}),setActive:t=>e({isActive:t}),decayActivity:()=>e(e=>{let t=new Map(e.nodes);for(let[e,n]of t)if(n.activity>=.01){let r=n.activity*.92;t.set(e,{...n,activity:r<.01?0:r})}let n=new Map(e.edges);for(let[e,t]of n)if(t.intensity>=.01){let r=t.intensity*.9;n.set(e,{...t,intensity:r<.01?0:r})}return{nodes:t,edges:n}}),prunesStale:t=>e(e=>{let n=Date.now()-t,r=new Map(e.nodes);for(let[e,t]of r)t.lastSeenAt<n&&t.status!==void 0&&t.status!==`active`&&r.delete(e);let i=new Map(e.edges);for(let[e,t]of i)t.lastActiveAt<n&&i.delete(e);return{nodes:r,edges:i,events:e.events.filter(e=>e.timestamp>n)}})}));function _(e,t){switch(e){case`provider.text_delta`:{let e=t.text??``;return{id:f(),kind:`provider:delta`,timestamp:Date.now(),source:`provider`,target:`leader`,label:e.slice(0,60),magnitude:e.length,data:{text:e},color:m.provider,flowGroup:`provider`}}case`provider.response`:{let e=t.usage,n=(e?.input??0)+(e?.output??0);return{id:f(),kind:`provider:response`,timestamp:Date.now(),source:`provider`,target:`leader`,label:`${(e?.input??0).toLocaleString(`en-US`)} in / ${(e?.output??0).toLocaleString(`en-US`)} out`,magnitude:n,data:t,color:m.provider,flowGroup:`provider`}}case`provider.stream_error`:{let e=t.message??`Provider stream error`;return{id:f(),kind:`error`,timestamp:Date.now(),source:`provider`,target:`leader`,label:e.slice(0,80),magnitude:1,data:t,color:m.error,flowGroup:`provider`}}case`tool.started`:{let e=t.name??`tool`;return{id:f(),kind:`tool:started`,timestamp:Date.now(),source:e,target:`filesystem`,label:e,magnitude:1,data:t,color:m.tool,flowGroup:`tool:${e}`}}case`tool.executed`:{let e=t.name??`tool`,n=t.ok??!0;return{id:f(),kind:`tool:executed`,timestamp:Date.now(),source:e,target:`leader`,label:`${e} ${n?`✓`:`✗`} (${t.durationMs??0}ms)`,magnitude:t.durationMs??0,data:t,color:n?m.tool:m.error,flowGroup:`tool:${e}`}}case`tool.progress`:{let e=t.name??`tool`,n=t.event?.text??``;return{id:f(),kind:`tool:progress`,timestamp:Date.now(),source:e,target:`leader`,label:n.slice(0,60)||e,magnitude:n.length,data:t,color:m.tool,flowGroup:`tool:${e}`}}case`tool.loop_detected`:{let e=t.tools??``,n=t.kind??`loop`;return{id:f(),kind:`error`,timestamp:Date.now(),source:e||n,target:`leader`,label:`${n} loop x${t.repeatCount??0}`,magnitude:t.repeatCount??1,data:t,color:m.error,flowGroup:`tool`}}case`delegate.started`:{let e=t.target??`delegate`,n=t.task??``;return{id:f(),kind:`agent:status`,timestamp:Date.now(),source:`leader`,target:e,label:n.slice(0,80)||`Delegating to ${e}`,magnitude:1,data:t,color:m.agent,flowGroup:`delegate:${e}`}}case`delegate.completed`:{let e=t.subagentId??t.target??`delegate`,n=t.ok??!1;return{id:f(),kind:n?`agent:status`:`error`,timestamp:Date.now(),source:e,target:`leader`,label:(t.summary??t.status??`delegate completed`).slice(0,80),magnitude:t.durationMs??1,data:t,color:n?m.agent:m.error,flowGroup:`delegate:${e}`}}case`subagent.event`:{let e=t.kind,n=t.subagentId??`unknown`,r=t.name??n;switch(e){case`spawned`:return{id:f(),kind:`agent:spawned`,timestamp:Date.now(),source:n,target:`session`,label:`${r} spawned`,magnitude:1,data:t,color:m.agent,flowGroup:`agent:${n}`};case`tool_executed`:{let e=t.toolName??`tool`,r=t.ok??!0;return{id:f(),kind:`agent:tool`,timestamp:Date.now(),source:n,target:e,label:e,magnitude:t.durationMs??0,data:t,color:r?m.tool:m.error,flowGroup:`agent:${n}`}}case`task_completed`:{let e=t.status??`completed`;return{id:f(),kind:`agent:status`,timestamp:Date.now(),source:n,target:`session`,label:`${r} ${e}`,magnitude:1,data:t,color:e===`success`?`hsl(140, 70%, 55%)`:m.error,flowGroup:`agent:${n}`}}case`ctx_pct`:return{id:f(),kind:`agent:ctx`,timestamp:Date.now(),source:n,target:`session`,label:`ctx ${c(t.load)}%`,magnitude:t.tokens??0,data:t,color:m.agent,flowGroup:`agent:${n}`};case`iteration_summary`:return{id:f(),kind:`agent:text`,timestamp:Date.now(),source:n,target:`session`,label:(t.partialText??``).slice(0,80)||`iter ${t.iteration??0}`,magnitude:t.costUsd??0,data:t,color:m.agent,flowGroup:`agent:${n}`};case`budget_extended`:return{id:f(),kind:`budget:extended`,timestamp:Date.now(),source:n,target:`session`,label:`${r} extended budget`,magnitude:t.totalExtensions??1,data:t,color:`hsl(40, 90%, 55%)`,flowGroup:`agent:${n}`};case`budget_warning`:return{id:f(),kind:`budget:warning`,timestamp:Date.now(),source:n,target:`session`,label:`${r} hit ${t.budgetKind??`budget`} ${t.used??0}/${t.limit??0}`,magnitude:t.used??1,data:t,color:m.error,flowGroup:`agent:${n}`}}return null}case`mailbox.event`:{let e=t.event,n=t.from??`?`,r=t.to??`?`,i=t.subject??``,a=e===`mailbox.sent`;return{id:f(),kind:a?`mailbox:send`:`mailbox:deliver`,timestamp:Date.now(),source:n,target:r,label:i||(a?`→ ${r}`:`← ${n}`),magnitude:1,data:t,color:m.mailbox,flowGroup:`mailbox`}}case`iteration.started`:{let e=t.index??0;return{id:f(),kind:`iteration:start`,timestamp:Date.now(),source:`leader`,target:`session`,label:`Iteration ${e}`,magnitude:e,data:t,color:m.agent,flowGroup:`iteration`}}case`iteration.completed`:{let e=t.index??0;return{id:f(),kind:`iteration:end`,timestamp:Date.now(),source:`leader`,target:`session`,label:`Iteration ${e} done`,magnitude:e,data:t,color:m.session,flowGroup:`iteration`}}case`ctx.pct`:{let e=t.tokens??0;return{id:f(),kind:`agent:ctx`,timestamp:Date.now(),source:`leader`,target:`session`,label:`ctx ${c(t.load)}%`,magnitude:e,data:t,color:m.agent,flowGroup:`leader`}}case`error`:{let e=t.message??`Error`;return{id:f(),kind:`error`,timestamp:Date.now(),source:t.phase??`system`,target:`session`,label:e,magnitude:1,data:t,color:m.error,flowGroup:`error`}}case`context.compacted`:return{id:f(),kind:`context:compacted`,timestamp:Date.now(),source:`system`,target:`session`,label:`Compacted: ${(t.saved??0).toLocaleString(`en-US`)} tokens`,magnitude:t.saved??0,data:t,color:`hsl(220, 60%, 50%)`,flowGroup:`context`};case`compaction.failed`:{let e=t.message??`Compaction failed`;return{id:f(),kind:`error`,timestamp:Date.now(),source:`compactor`,target:`session`,label:e.slice(0,80),magnitude:t.tokens??1,data:t,color:m.error,flowGroup:`context`}}case`context.repaired`:return{id:f(),kind:`context:repaired`,timestamp:Date.now(),source:`system`,target:`session`,label:`Repaired: ${t.removedMessages??0} msgs`,magnitude:t.removedMessages??0,data:t,color:`hsl(220, 60%, 50%)`,flowGroup:`context`};case`session.start`:{let e=t.sessionId??`?`,n=t.projectName??``;return{id:f(),kind:`session:start`,timestamp:Date.now(),source:`session`,target:`leader`,label:n||e.slice(0,12),magnitude:1,data:t,color:m.session,flowGroup:`session`}}case`sessions.status_update`:{let e=t.sessions??[];return{id:f(),kind:`fleet:snapshot`,timestamp:Date.now(),source:`system`,target:`session`,label:`${e.length} session(s)`,magnitude:e.length,data:t,color:m.system,flowGroup:`fleet`}}default:return null}}function v(e){let t=e.payload?.sessionId,r=n.getState().session?.id;return!t||!r||t===r}function y(e){let t=_(e.type,e.payload);t&&(g.getState().pushEvent(t),g.getState().setActive(!0))}function b(e,t,n){let r=e.payload??{};for(let[e,n]of Object.entries(t)){let t=r[e];if(!x(t,n))return null}if(n)for(let[e,t]of Object.entries(n)){let n=r[e];if(n!=null&&!x(n,t))return null}return r}function x(e,t){switch(t){case`string`:return typeof e==`string`;case`number`:return typeof e==`number`;case`boolean`:return typeof e==`boolean`;case`object`:return typeof e==`object`&&!!e&&!Array.isArray(e);case`array`:return Array.isArray(e);default:return!1}}function S(e){try{return new URL(e).searchParams.get(`token`)}catch{return null}}function C(){if(typeof window>`u`||!window.location)return null;try{let e=window.location.search??``;return new URLSearchParams(e).get(`token`)}catch{return null}}function w(e){try{let t=new URL(e);return t.searchParams.delete(`token`),t.toString()}catch{return e}}function T(){if(!(typeof window>`u`||!window.location||!window.history?.replaceState))try{let e=window.location.href;if(!e)return;let t=new URL(e);if(!t.searchParams.has(`token`))return;t.searchParams.delete(`token`),window.history.replaceState(window.history.state,document.title,t.toString())}catch{}}var E=3457;function D(){if(typeof document>`u`)return E;let e=document.querySelector(`meta[name="wrongstack-ws-port"]`)?.getAttribute(`content`),t=e?Number.parseInt(e,10):NaN;return Number.isFinite(t)&&t>0&&t<65536?t:E}function O(){if(typeof document>`u`)return null;let e=document.querySelector(`meta[name="wrongstack-ws-url"]`)?.getAttribute(`content`)?.trim();if(!e)return null;try{let t=new URL(e);if(t.protocol!==`ws:`&&t.protocol!==`wss:`)return null;let n=C();return n&&!t.searchParams.has(`token`)&&t.searchParams.set(`token`,n),t.toString()}catch{return null}}function k(){let e=O();if(e)return e;let t=D();if(typeof window>`u`||!window.location?.hostname)return`ws://127.0.0.1:${t}`;let n=window.location.protocol===`https:`?`wss`:`ws`,r=window.location.hostname.toLowerCase(),i=C(),a=i?`?token=${encodeURIComponent(i)}`:``;return r===`localhost`||r===`127.0.0.1`||r===`[::1]`||r===`::1`?`${n}://127.0.0.1:${t}${a}`:`${n}://${window.location.hostname}:${t}${a}`}function A(){if(typeof window>`u`||!window.location?.hostname)return`http://127.0.0.1:3456`;let e=window.location.protocol===`https:`?`https`:`http`,t=window.location.hostname.toLowerCase(),n=window.location.port?`:${window.location.port}`:``;return t===`localhost`||t===`127.0.0.1`||t===`[::1]`||t===`::1`?`${e}://127.0.0.1${n}`:`${e}://${window.location.hostname}${n}`}var j=e({WrongStackWebSocketClient:()=>N,getWSClient:()=>F});function M(e){try{let t=new URL(e),n=new URL(A());return t.hostname===n.hostname}catch{return!0}}var N=class e{ws=null;url;handlers=new Map;reconnectAttempts=0;maxReconnectAttempts=10;reconnectDelay=1e3;shouldReconnect=!0;reconnectTimer=null;messageQueue=[];static MAX_QUEUED_MESSAGES=1e3;pendingConfirms=new Map;sessionId=null;lastErrorText;statusListeners=new Set;currentStatus={state:`connecting`};onStatus(e){return this.statusListeners.add(e),e(this.currentStatus),()=>this.statusListeners.delete(e)}get status(){return this.currentStatus}setStatus(e){this.currentStatus=e;for(let t of this.statusListeners)try{t(e)}catch{}}constructor(e){this.url=e??k()}withSession(e){return this.sessionId?{...e,sessionId:this.sessionId}:e}async ensureAuthCookie(){if(typeof window>`u`)return;if(document.cookie.split(`;`).some(e=>e.trim().startsWith(`ws_token=`))){M(this.url)&&(this.url=w(this.url)),T();return}let e=S(this.url)??C();if(!e)return;let t=A()+`/ws-auth?token=${encodeURIComponent(e)}`;try{let e=await fetch(t,{method:`GET`,credentials:`same-origin`,cache:`no-store`});e.ok?(M(this.url)&&(this.url=w(this.url)),T()):console.warn(JSON.stringify({level:`warn`,event:`ws_client.ws_auth_failed`,status:e.status,timestamp:new Date().toISOString()}))}catch(e){console.warn(JSON.stringify({level:`warn`,event:`ws_client.ws_auth_error`,message:e instanceof Error?e.message:String(e),timestamp:new Date().toISOString()}))}}async connect(){return await this.ensureAuthCookie(),new Promise((e,t)=>{if(this.ws?.readyState===WebSocket.OPEN){e();return}this.setStatus({state:`connecting`});try{this.ws=new WebSocket(this.url),this.ws.binaryType=`arraybuffer`;let n=setTimeout(()=>{t(Error(`Connection timeout`))},1e4),r=!1;this.ws.onopen=()=>{clearTimeout(n),r=!0,this.reconnectAttempts=0,this.lastErrorText=void 0,this.setStatus({state:`open`}),this.flushMessageQueue(),e()},this.ws.onmessage=e=>{try{let t=JSON.parse(e.data);this.handleMessage(t)}catch(e){console.error(JSON.stringify({level:`error`,event:`ws_client.message_parse_failed`,message:e instanceof Error?e.message:String(e),timestamp:new Date().toISOString()}))}},this.ws.onerror=e=>{console.error(JSON.stringify({level:`error`,event:`ws_client.error`,message:e instanceof Error?e.message:String(e),timestamp:new Date().toISOString()})),this.lastErrorText=`Connection error (see browser devtools)`,r||(clearTimeout(n),t(Error(this.lastErrorText)))},this.ws.onclose=e=>{if(!r){clearTimeout(n);let r=e.reason||`Closed with code ${e.code}`;this.lastErrorText=r,t(Error(r));return}e.reason&&!this.lastErrorText?this.lastErrorText=`${e.reason} (code ${e.code})`:!this.lastErrorText&&e.code!==1e3&&(this.lastErrorText=`Closed with code ${e.code}`),this.attemptReconnect()}}catch(e){this.lastErrorText=e instanceof Error?e.message:String(e),this.setStatus({state:`closed`,error:this.lastErrorText}),t(e)}})}attemptReconnect(){if(!this.shouldReconnect||this.reconnectAttempts>=this.maxReconnectAttempts){this.reconnectTimer=null,this.setStatus({state:`closed`,error:this.lastErrorText??`Disconnected`});return}this.reconnectAttempts++;let e=Math.min(this.reconnectDelay*2**(this.reconnectAttempts-1),3e4),t=Date.now()+e;this.setStatus({state:`reconnecting`,attempt:this.reconnectAttempts,nextRetryAt:t,lastError:this.lastErrorText}),this.reconnectTimer=setTimeout(async()=>{if(this.shouldReconnect)try{await this.connect()}catch(e){console.error(JSON.stringify({level:`error`,event:`ws_client.reconnect_failed`,message:e instanceof Error?e.message:String(e),timestamp:new Date().toISOString()}))}},e)}retryNow(){this.currentStatus.state!==`open`&&(this.reconnectTimer&&=(clearTimeout(this.reconnectTimer),null),this.reconnectAttempts=0,this.connect().catch(e=>console.warn(JSON.stringify({level:`warn`,event:`ws_client.reconnect_failed`,message:e instanceof Error?e.message:String(e),timestamp:new Date().toISOString()}))))}flushMessageQueue(){for(;this.messageQueue.length>0;){let e=this.messageQueue.shift();e&&this.send(e)}}handleMessage(e){if(e.type===`tool.confirm_needed`){let t=e.payload;this.pendingConfirms.set(t.id,{}),this.emit(e);return}if(e.type===`session.start`){let t=e.payload;this.sessionId=t.sessionId}this.emit(e)}emit(e){let t=this.handlers.get(e.type);if(t)for(let n of t)try{n(e)}catch(t){console.error(JSON.stringify({level:`error`,event:`ws_client.handler_error`,messageType:e.type,message:t instanceof Error?t.message:String(t),timestamp:new Date().toISOString()}))}}send(t){if((t.type===`context.clear`||t.type===`session.new`||t.type===`session.resume`)&&i.dropAll(),this.ws?.readyState===WebSocket.OPEN)this.ws.send(JSON.stringify(t));else{if(this.messageQueue.length>=e.MAX_QUEUED_MESSAGES){let t=this.messageQueue.shift();t&&console.warn(JSON.stringify({level:`warn`,event:`ws_client.message_queue_full`,cap:e.MAX_QUEUED_MESSAGES,droppedType:t.type,timestamp:new Date().toISOString()}))}this.messageQueue.push(t)}}on(e,t){let n=this.handlers.get(e);return n||(n=new Set,this.handlers.set(e,n)),n.add(t),()=>n?.delete(t)}off(e,t){this.handlers.get(e)?.delete(t)}sendMessage(e,t){let n=`msg_${Date.now()}_${crypto.randomUUID().slice(0,8)}`;return this.send({type:`user_message`,payload:this.withSession({id:n,content:e,timestamp:Date.now(),...t?{imageBase64:t}:{}})}),n}sendAbort(){this.send({type:`abort`,payload:this.withSession({})})}getGitInfo(){this.send({type:`git.info`})}getGitChanges(){this.send({type:`git.changes`})}getGitDiff(e){this.send({type:`git.diff`,payload:{path:e}})}sendConfirm(e,t){this.pendingConfirms.has(e)&&this.pendingConfirms.delete(e),this.send({type:`tool.confirm_result`,payload:this.withSession({id:e,decision:t})})}switchModel(e,t){this.send({type:`model.switch`,payload:{provider:e,model:t}})}newSession(){this.send({type:`session.new`,payload:this.withSession({})})}listProviders(){this.send({type:`providers.list`})}listProviderModels(e){this.send({type:`provider.models`,payload:{providerId:e}})}listSavedProviders(){this.send({type:`providers.saved`})}addKey(e,t,n){this.send({type:`key.add`,payload:{providerId:e,label:t,apiKey:n}})}updateKey(e,t,n){this.send({type:`key.update`,payload:{providerId:e,label:t,apiKey:n}})}deleteKey(e,t){this.send({type:`key.delete`,payload:{providerId:e,label:t}})}setActiveKey(e,t){this.send({type:`key.set_active`,payload:{providerId:e,label:t}})}addProvider(e,t,n,r){this.send({type:`provider.add`,payload:{id:e,family:t,baseUrl:n,apiKey:r}})}removeProvider(e){this.send({type:`provider.remove`,payload:{providerId:e}})}startOAuth(e){this.send({type:`auth.oauth.start`,payload:{kind:e}})}submitOAuthCode(e,t){this.send({type:`auth.oauth.code`,payload:{kind:e,input:t}})}cancelOAuth(e){this.send({type:`auth.oauth.cancel`,payload:{kind:e}})}probeProvider(e,t){this.send({type:`provider.probe`,payload:t===void 0?{providerId:e}:{providerId:e,timeoutMs:t}})}clearProviderModels(e){this.send(a(e))}undoProviderClear(e,t){this.send(o(e,t))}updateProvider(e){this.send(s(e))}clearContext(){this.send({type:`context.clear`,payload:this.withSession({})})}compactContext(e=!1){this.send({type:`context.compact`,payload:this.withSession({aggressive:e})})}repairContext(){this.send({type:`context.repair`,payload:this.withSession({})})}debugContext(){this.send({type:`context.debug`,payload:this.withSession({})})}listContextModes(){this.send({type:`context.modes.list`,payload:this.withSession({})})}switchContextMode(e){this.send({type:`context.mode.switch`,payload:this.withSession({id:e})})}createContextMode(e){this.send({type:`context.mode.create`,payload:this.withSession(e)})}updateContextMode(e,t){this.send({type:`context.mode.update`,payload:this.withSession({id:e,...t})})}deleteContextMode(e){this.send({type:`context.mode.delete`,payload:this.withSession({id:e})})}switchAutonomy(e){this.send({type:`autonomy.switch`,payload:{mode:e}})}updatePrefs(e){this.send({type:`prefs.update`,payload:e})}getPrefs(){this.send({type:`prefs.get`})}listTools(){this.send({type:`tools.list`})}listMemory(){this.send({type:`memory.list`})}remember(e,t){this.send({type:`memory.remember`,payload:{text:e,scope:t}})}forget(e,t){this.send({type:`memory.forget`,payload:{text:e,scope:t}})}listMcpServers(){this.send({type:`mcp.list`})}addMcpServer(e){this.send({type:`mcp.add`,payload:e})}removeMcpServer(e){this.send({type:`mcp.remove`,payload:{name:e}})}updateMcpServer(e){this.send({type:`mcp.update`,payload:e})}wakeMcpServer(e){this.send({type:`mcp.wake`,payload:{name:e}})}sleepMcpServer(e){this.send({type:`mcp.sleep`,payload:{name:e}})}discoverMcpServer(e){this.send({type:`mcp.discover`,payload:{name:e}})}enableMcpServer(e){this.send({type:`mcp.enable`,payload:{name:e}})}disableMcpServer(e){this.send({type:`mcp.disable`,payload:{name:e}})}restartMcpServer(e){this.send({type:`mcp.restart`,payload:{name:e}})}listSkills(){this.send({type:`skills.list`})}getSkillContent(e,t){this.send({type:`skills.content`,payload:{name:e,source:t}})}installSkill(e,t){this.send({type:`skills.install`,payload:{ref:e,global:t}})}uninstallSkill(e,t){this.send({type:`skills.uninstall`,payload:{name:e,global:t}})}checkForUpdates(e,t){this.send({type:`skills.update`,payload:{name:e,global:t}})}createSkill(e,t,n){this.send({type:`skills.create`,payload:{name:e,description:t,scope:n}})}editSkill(e,t){this.send({type:`skills.edit`,payload:{name:e,body:t}})}exportAllSkills(){this.send({type:`skills.export`})}getDiag(){this.send({type:`diag.get`,payload:this.withSession({})})}getStats(){this.send({type:`stats.get`,payload:this.withSession({})})}saveSession(){this.send({type:`session.save`,payload:this.withSession({})})}resumeSessionById(e){this.send({type:`session.resume`,payload:this.withSession({id:e})})}listModes(){this.send({type:`modes.list`})}switchMode(e){this.send({type:`mode.switch`,payload:{id:e}})}listFiles(e,t,n){this.send({type:`files.list`,payload:{query:e,limit:t,path:n}})}requestCompletion(e){this.send({type:`completion.request`,payload:e})}getTodos(){this.send({type:`todos.get`,payload:this.withSession({})})}clearTodos(){this.send({type:`todos.clear`,payload:this.withSession({})})}removeTodo(e){let t=typeof e==`number`?{index:e}:{id:e};this.send({type:`todos.remove`,payload:this.withSession(t)})}updateTodoStatus(e,t){this.send({type:`todo.update`,payload:this.withSession({id:e,status:t})})}getTasks(){this.send({type:`tasks.get`,payload:this.withSession({})})}updateTaskStatus(e,t){this.send({type:`task.update`,payload:this.withSession({id:e,status:t})})}getPlan(){this.send({type:`plan.get`,payload:this.withSession({})})}updatePlanItem(e,t){this.send({type:`plan.item.update`,payload:this.withSession({target:e,status:t})})}listSessions(e=50){this.send({type:`sessions.list`,payload:this.withSession({limit:e})})}deleteSession(e){this.send({type:`session.delete`,payload:{id:e}})}renameSession(e,t){this.send({type:`session.rename`,payload:{id:e,name:t}})}setWorkingDir(e){this.send({type:`working_dir.set`,payload:{path:e}})}resumeSession(e){this.send({type:`session.resume`,payload:this.withSession({id:e})})}ping(){this.send({type:`ping`})}refineModel(e){this.send({type:`model.refine`,payload:{text:e}})}disconnect(){this.shouldReconnect=!1,this.reconnectTimer&&=(clearTimeout(this.reconnectTimer),null),this.messageQueue.length=0,this.ws?.close(),this.ws=null}get isConnected(){return this.ws?.readyState===WebSocket.OPEN}get currentSessionId(){return this.sessionId}},P=null;function F(e){return P||=new N(e),P}export{y as a,_ as c,v as i,i as l,j as n,b as o,k as r,g as s,F as t};
|
|
1
|
+
import{n as e}from"./rolldown-runtime-QTnfLwEv.js";import{li as t}from"./vendor-Cm3Womkr.js";import{t as n}from"./session-store-KCJiKVqL.js";function r(e){typeof requestAnimationFrame==`function`?requestAnimationFrame(e):queueMicrotask(e)}var i=new class{pending=new Map;scheduled=!1;push(e,t,n){if(!t)return;let r=this.pending.get(e);r?(r.buffer+=t,r.flush=n):this.pending.set(e,{buffer:t,flush:n}),this.schedule()}schedule(){this.scheduled||(this.scheduled=!0,r(()=>{this.scheduled=!1,this.drain()}))}drain(){if(this.pending.size===0)return;let e=Array.from(this.pending.entries());this.pending.clear();for(let[t,n]of e)n.buffer&&n.flush(t,n.buffer)}drop(e){this.pending.delete(e)}dropAll(){this.pending.clear()}flush(e){let t=this.pending.get(e);t&&(this.pending.delete(e),t.buffer&&t.flush(e,t.buffer))}flushAll(){this.drain()}};function a(e){return{type:`provider.clear_models`,payload:{providerId:e}}}function o(e,t){return{type:`provider.undo_clear`,payload:{providerId:e,previousModels:[...t]}}}function s(e){return{type:`provider.update`,payload:e}}function c(e){return Math.max(0,Math.min(100,Math.round((typeof e==`number`&&Number.isFinite(e)?e:0)*100)))}function l(e,t=!1){if(t&&e.target){if(e.kind===`agent:tool`||e.kind===`tool:executed`||e.kind===`tool:started`)return`tool`;if(e.source===`leader`||e.source===`coordinator`)return`coordinator`;if(e.kind.startsWith(`provider:`))return`provider`;if(e.kind.startsWith(`mailbox:`))return`mailbox`}switch(e.kind){case`provider:call`:case`provider:delta`:case`provider:response`:return`provider`;case`agent:spawned`:case`agent:tool`:case`agent:status`:case`agent:text`:case`agent:ctx`:case`budget:warning`:case`budget:extended`:return`agent`;case`tool:started`:case`tool:executed`:case`tool:progress`:return`tool`;case`mailbox:send`:case`mailbox:deliver`:return`mailbox`;case`collab:event`:return`system`;case`session:start`:case`session:end`:case`iteration:start`:case`iteration:end`:case`eternal:iteration`:case`fleet:snapshot`:return`session`;case`context:compacted`:case`context:repaired`:case`cost:update`:return`system`;case`error`:return`error`;default:return`system`}}function u(e){switch(e){case`provider:call`:case`provider:delta`:case`agent:tool`:case`tool:started`:case`tool:progress`:case`iteration:start`:case`agent:text`:return`streaming`;case`agent:status`:case`iteration:end`:return`completed`;case`error`:return`error`;case`tool:executed`:return`completed`;case`session:end`:return`idle`;default:return`active`}}var d=0;function f(){return`viz_${Date.now()}_${++d}`}function p(e,t){if(e===t)return!0;if(!e||!t)return!1;let n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(let r of n){let n=e[r],i=t[r];if(n!==i){if(n==null||i==null||typeof n!=typeof i)return!1;if(typeof n==`object`){if(Array.isArray(n)||Array.isArray(i)||!p(n,i))return!1;continue}return!1}}return!0}var m={provider:`hsl(180, 80%, 55%)`,agent:`hsl(280, 80%, 65%)`,tool:`hsl(40, 90%, 55%)`,mailbox:`hsl(140, 70%, 55%)`,session:`hsl(220, 80%, 60%)`,system:`hsl(0, 0%, 60%)`,error:`hsl(0, 80%, 55%)`},h={"provider:call":`hsl(180, 80%, 55%)`,"provider:delta":`hsl(180, 60%, 70%)`,"agent:tool":`hsl(40, 90%, 55%)`,"mailbox:send":`hsl(140, 70%, 55%)`,default:`hsl(0, 0%, 40%)`},g=t()((e,t)=>({events:[],nodes:new Map,edges:new Map,isActive:!1,maxEvents:2e3,counters:{totalTokens:0,totalCost:0,totalToolCalls:0,activeAgents:0,completedTasks:0,errors:0,mailboxMessages:0},pushEvent:t=>e(e=>{let n=[{...t,id:t.id??f(),timestamp:t.timestamp||Date.now()},...e.events];n.length>e.maxEvents&&(n.length=e.maxEvents);let r=Date.now(),i=t.source,a={id:i,kind:l(t),label:t.label,status:u(t.kind),activity:1,color:t.color??m[l(t)],lastSeenAt:r},o=e.nodes.get(i),s=o?{...o,...a}:a,c=!p(o,s),d,h=!1,g;if(t.target){g=t.target;let n={id:g,kind:l(t,!0),label:g,status:u(t.kind),activity:.8,color:t.color??m[l(t,!0)],lastSeenAt:r},i=e.nodes.get(g);d=i?{...i,...n}:n,h=!p(i,d)}let _,v=!1,y;if(t.target&&i){y=`${i}->${t.target}`;let n=e.edges.get(y),a={id:y,source:i,target:t.target,kind:t.kind,label:t.label,intensity:n?Math.min(1,n.intensity+.3):.7,color:t.color??m[l(t)]??`#6366f1`,lastActiveAt:r,totalMagnitude:(n?.totalMagnitude??0)+(t.magnitude??0)};_=n?{...n,...a}:a,v=!p(n,_)}let b=e.nodes,x=e.edges;return(c||h)&&(b=new Map(e.nodes),c&&b.set(i,s),h&&d&&g&&b.set(g,d)),v&&_&&y&&(x=new Map(e.edges),x.set(y,_)),{events:n,nodes:b,edges:x}}),upsertNode:t=>e(e=>{let n=new Map(e.nodes),r=n.get(t.id);return n.set(t.id,{...r,...t,lastSeenAt:t.lastSeenAt===void 0?Date.now():t.lastSeenAt}),{nodes:n}}),removeNode:t=>e(e=>{let n=new Map(e.nodes);n.delete(t);let r=new Map(e.edges);for(let[e,n]of r)(n.source===t||n.target===t)&&r.delete(e);return{nodes:n,edges:r}}),upsertEdge:t=>e(e=>{let n=new Map(e.edges),r=n.get(t.id);return n.set(t.id,{...r,...t,lastActiveAt:t.lastActiveAt===void 0?Date.now():t.lastActiveAt,intensity:t.intensity??r?.intensity??.5,color:t.color??h[t.kind]??h.default,totalMagnitude:(r?.totalMagnitude??0)+(t.totalMagnitude??0)}),{edges:n}}),removeEdge:t=>e(e=>{let n=new Map(e.edges);return n.delete(t),{edges:n}}),clear:()=>e({events:[],nodes:new Map,edges:new Map,counters:{totalTokens:0,totalCost:0,totalToolCalls:0,activeAgents:0,completedTasks:0,errors:0,mailboxMessages:0}}),setActive:t=>e({isActive:t}),decayActivity:()=>e(e=>{let t=new Map(e.nodes);for(let[e,n]of t)if(n.activity>=.01){let r=n.activity*.92;t.set(e,{...n,activity:r<.01?0:r})}let n=new Map(e.edges);for(let[e,t]of n)if(t.intensity>=.01){let r=t.intensity*.9;n.set(e,{...t,intensity:r<.01?0:r})}return{nodes:t,edges:n}}),prunesStale:t=>e(e=>{let n=Date.now()-t,r=new Map(e.nodes);for(let[e,t]of r)t.lastSeenAt<n&&t.status!==void 0&&t.status!==`active`&&r.delete(e);let i=new Map(e.edges);for(let[e,t]of i)t.lastActiveAt<n&&i.delete(e);return{nodes:r,edges:i,events:e.events.filter(e=>e.timestamp>n)}})}));function _(e,t){switch(e){case`provider.text_delta`:{let e=t.text??``;return{id:f(),kind:`provider:delta`,timestamp:Date.now(),source:`provider`,target:`leader`,label:e.slice(0,60),magnitude:e.length,data:{text:e},color:m.provider,flowGroup:`provider`}}case`provider.response`:{let e=t.usage,n=(e?.input??0)+(e?.output??0);return{id:f(),kind:`provider:response`,timestamp:Date.now(),source:`provider`,target:`leader`,label:`${(e?.input??0).toLocaleString(`en-US`)} in / ${(e?.output??0).toLocaleString(`en-US`)} out`,magnitude:n,data:t,color:m.provider,flowGroup:`provider`}}case`provider.stream_error`:{let e=t.message??`Provider stream error`;return{id:f(),kind:`error`,timestamp:Date.now(),source:`provider`,target:`leader`,label:e.slice(0,80),magnitude:1,data:t,color:m.error,flowGroup:`provider`}}case`tool.started`:{let e=t.name??`tool`;return{id:f(),kind:`tool:started`,timestamp:Date.now(),source:e,target:`filesystem`,label:e,magnitude:1,data:t,color:m.tool,flowGroup:`tool:${e}`}}case`tool.executed`:{let e=t.name??`tool`,n=t.ok??!0;return{id:f(),kind:`tool:executed`,timestamp:Date.now(),source:e,target:`leader`,label:`${e} ${n?`✓`:`✗`} (${t.durationMs??0}ms)`,magnitude:t.durationMs??0,data:t,color:n?m.tool:m.error,flowGroup:`tool:${e}`}}case`tool.progress`:{let e=t.name??`tool`,n=t.event?.text??``;return{id:f(),kind:`tool:progress`,timestamp:Date.now(),source:e,target:`leader`,label:n.slice(0,60)||e,magnitude:n.length,data:t,color:m.tool,flowGroup:`tool:${e}`}}case`tool.loop_detected`:{let e=t.tools??``,n=t.kind??`loop`;return{id:f(),kind:`error`,timestamp:Date.now(),source:e||n,target:`leader`,label:`${n} loop x${t.repeatCount??0}`,magnitude:t.repeatCount??1,data:t,color:m.error,flowGroup:`tool`}}case`delegate.started`:{let e=t.target??`delegate`,n=t.task??``;return{id:f(),kind:`agent:status`,timestamp:Date.now(),source:`leader`,target:e,label:n.slice(0,80)||`Delegating to ${e}`,magnitude:1,data:t,color:m.agent,flowGroup:`delegate:${e}`}}case`delegate.completed`:{let e=t.subagentId??t.target??`delegate`,n=t.ok??!1;return{id:f(),kind:n?`agent:status`:`error`,timestamp:Date.now(),source:e,target:`leader`,label:(t.summary??t.status??`delegate completed`).slice(0,80),magnitude:t.durationMs??1,data:t,color:n?m.agent:m.error,flowGroup:`delegate:${e}`}}case`subagent.event`:{let e=t.kind,n=t.subagentId??`unknown`,r=t.name??n;switch(e){case`spawned`:return{id:f(),kind:`agent:spawned`,timestamp:Date.now(),source:n,target:`session`,label:`${r} spawned`,magnitude:1,data:t,color:m.agent,flowGroup:`agent:${n}`};case`tool_executed`:{let e=t.toolName??`tool`,r=t.ok??!0;return{id:f(),kind:`agent:tool`,timestamp:Date.now(),source:n,target:e,label:e,magnitude:t.durationMs??0,data:t,color:r?m.tool:m.error,flowGroup:`agent:${n}`}}case`task_completed`:{let e=t.status??`completed`;return{id:f(),kind:`agent:status`,timestamp:Date.now(),source:n,target:`session`,label:`${r} ${e}`,magnitude:1,data:t,color:e===`success`?`hsl(140, 70%, 55%)`:m.error,flowGroup:`agent:${n}`}}case`ctx_pct`:return{id:f(),kind:`agent:ctx`,timestamp:Date.now(),source:n,target:`session`,label:`ctx ${c(t.load)}%`,magnitude:t.tokens??0,data:t,color:m.agent,flowGroup:`agent:${n}`};case`iteration_summary`:return{id:f(),kind:`agent:text`,timestamp:Date.now(),source:n,target:`session`,label:(t.partialText??``).slice(0,80)||`iter ${t.iteration??0}`,magnitude:t.costUsd??0,data:t,color:m.agent,flowGroup:`agent:${n}`};case`budget_extended`:return{id:f(),kind:`budget:extended`,timestamp:Date.now(),source:n,target:`session`,label:`${r} extended budget`,magnitude:t.totalExtensions??1,data:t,color:`hsl(40, 90%, 55%)`,flowGroup:`agent:${n}`};case`budget_warning`:return{id:f(),kind:`budget:warning`,timestamp:Date.now(),source:n,target:`session`,label:`${r} hit ${t.budgetKind??`budget`} ${t.used??0}/${t.limit??0}`,magnitude:t.used??1,data:t,color:m.error,flowGroup:`agent:${n}`}}return null}case`mailbox.event`:{let e=t.event,n=t.from??`?`,r=t.to??`?`,i=t.subject??``,a=e===`mailbox.sent`;return{id:f(),kind:a?`mailbox:send`:`mailbox:deliver`,timestamp:Date.now(),source:n,target:r,label:i||(a?`→ ${r}`:`← ${n}`),magnitude:1,data:t,color:m.mailbox,flowGroup:`mailbox`}}case`iteration.started`:{let e=t.index??0;return{id:f(),kind:`iteration:start`,timestamp:Date.now(),source:`leader`,target:`session`,label:`Iteration ${e}`,magnitude:e,data:t,color:m.agent,flowGroup:`iteration`}}case`iteration.completed`:{let e=t.index??0;return{id:f(),kind:`iteration:end`,timestamp:Date.now(),source:`leader`,target:`session`,label:`Iteration ${e} done`,magnitude:e,data:t,color:m.session,flowGroup:`iteration`}}case`ctx.pct`:{let e=t.tokens??0;return{id:f(),kind:`agent:ctx`,timestamp:Date.now(),source:`leader`,target:`session`,label:`ctx ${c(t.load)}%`,magnitude:e,data:t,color:m.agent,flowGroup:`leader`}}case`error`:{let e=t.message??`Error`;return{id:f(),kind:`error`,timestamp:Date.now(),source:t.phase??`system`,target:`session`,label:e,magnitude:1,data:t,color:m.error,flowGroup:`error`}}case`context.compacted`:return{id:f(),kind:`context:compacted`,timestamp:Date.now(),source:`system`,target:`session`,label:`Compacted: ${(t.saved??0).toLocaleString(`en-US`)} tokens`,magnitude:t.saved??0,data:t,color:`hsl(220, 60%, 50%)`,flowGroup:`context`};case`compaction.failed`:{let e=t.message??`Compaction failed`;return{id:f(),kind:`error`,timestamp:Date.now(),source:`compactor`,target:`session`,label:e.slice(0,80),magnitude:t.tokens??1,data:t,color:m.error,flowGroup:`context`}}case`context.repaired`:return{id:f(),kind:`context:repaired`,timestamp:Date.now(),source:`system`,target:`session`,label:`Repaired: ${t.removedMessages??0} msgs`,magnitude:t.removedMessages??0,data:t,color:`hsl(220, 60%, 50%)`,flowGroup:`context`};case`session.start`:{let e=t.sessionId??`?`,n=t.projectName??``;return{id:f(),kind:`session:start`,timestamp:Date.now(),source:`session`,target:`leader`,label:n||e.slice(0,12),magnitude:1,data:t,color:m.session,flowGroup:`session`}}case`sessions.status_update`:{let e=t.sessions??[];return{id:f(),kind:`fleet:snapshot`,timestamp:Date.now(),source:`system`,target:`session`,label:`${e.length} session(s)`,magnitude:e.length,data:t,color:m.system,flowGroup:`fleet`}}default:return null}}function v(e){let t=e.payload?.sessionId,r=n.getState().session?.id;return!t||!r||t===r}function y(e){let t=_(e.type,e.payload);t&&(g.getState().pushEvent(t),g.getState().setActive(!0))}function b(e,t,n){let r=e.payload??{};for(let[e,n]of Object.entries(t)){let t=r[e];if(!x(t,n))return null}if(n)for(let[e,t]of Object.entries(n)){let n=r[e];if(n!=null&&!x(n,t))return null}return r}function x(e,t){switch(t){case`string`:return typeof e==`string`;case`number`:return typeof e==`number`;case`boolean`:return typeof e==`boolean`;case`object`:return typeof e==`object`&&!!e&&!Array.isArray(e);case`array`:return Array.isArray(e);default:return!1}}function S(e){try{return new URL(e).searchParams.get(`token`)}catch{return null}}function C(){if(typeof window>`u`||!window.location)return null;try{let e=window.location.search??``;return new URLSearchParams(e).get(`token`)}catch{return null}}function w(e){try{let t=new URL(e);return t.searchParams.delete(`token`),t.toString()}catch{return e}}function T(){if(!(typeof window>`u`||!window.location||!window.history?.replaceState))try{let e=window.location.href;if(!e)return;let t=new URL(e);if(!t.searchParams.has(`token`))return;t.searchParams.delete(`token`),window.history.replaceState(window.history.state,document.title,t.toString())}catch{}}var E=3457;function D(){if(typeof document>`u`)return E;let e=document.querySelector(`meta[name="wrongstack-ws-port"]`)?.getAttribute(`content`),t=e?Number.parseInt(e,10):NaN;return Number.isFinite(t)&&t>0&&t<65536?t:E}function O(){if(typeof document>`u`)return null;let e=document.querySelector(`meta[name="wrongstack-ws-url"]`)?.getAttribute(`content`)?.trim();if(!e)return null;try{let t=new URL(e);if(t.protocol!==`ws:`&&t.protocol!==`wss:`)return null;let n=C();return n&&!t.searchParams.has(`token`)&&t.searchParams.set(`token`,n),t.toString()}catch{return null}}function k(){let e=O();if(e)return e;let t=D();if(typeof window>`u`||!window.location?.hostname)return`ws://127.0.0.1:${t}`;let n=window.location.protocol===`https:`?`wss`:`ws`,r=window.location.hostname.toLowerCase(),i=C(),a=i?`?token=${encodeURIComponent(i)}`:``;return r===`localhost`||r===`127.0.0.1`||r===`[::1]`||r===`::1`?`${n}://127.0.0.1:${t}${a}`:`${n}://${window.location.hostname}:${t}${a}`}function A(){if(typeof window>`u`||!window.location?.hostname)return`http://127.0.0.1:3456`;let e=window.location.protocol===`https:`?`https`:`http`,t=window.location.hostname.toLowerCase(),n=window.location.port?`:${window.location.port}`:``;return t===`localhost`||t===`127.0.0.1`||t===`[::1]`||t===`::1`?`${e}://127.0.0.1${n}`:`${e}://${window.location.hostname}${n}`}var j=e({WrongStackWebSocketClient:()=>N,getWSClient:()=>F});function M(e){try{let t=new URL(e),n=new URL(A());return t.hostname===n.hostname}catch{return!0}}var N=class e{ws=null;url;handlers=new Map;reconnectAttempts=0;maxReconnectAttempts=10;reconnectDelay=1e3;shouldReconnect=!0;reconnectTimer=null;messageQueue=[];static MAX_QUEUED_MESSAGES=1e3;pendingConfirms=new Map;sessionId=null;lastErrorText;statusListeners=new Set;currentStatus={state:`connecting`};onStatus(e){return this.statusListeners.add(e),e(this.currentStatus),()=>this.statusListeners.delete(e)}get status(){return this.currentStatus}setStatus(e){this.currentStatus=e;for(let t of this.statusListeners)try{t(e)}catch{}}constructor(e){this.url=e??k()}withSession(e){return this.sessionId?{...e,sessionId:this.sessionId}:e}async ensureAuthCookie(){if(typeof window>`u`)return;if(document.cookie.split(`;`).some(e=>e.trim().startsWith(`ws_token=`))){M(this.url)&&(this.url=w(this.url)),T();return}let e=S(this.url)??C();if(!e)return;let t=A()+`/ws-auth?token=${encodeURIComponent(e)}`;try{let e=await fetch(t,{method:`GET`,credentials:`same-origin`,cache:`no-store`});e.ok?(M(this.url)&&(this.url=w(this.url)),T()):console.warn(JSON.stringify({level:`warn`,event:`ws_client.ws_auth_failed`,status:e.status,timestamp:new Date().toISOString()}))}catch(e){console.warn(JSON.stringify({level:`warn`,event:`ws_client.ws_auth_error`,message:e instanceof Error?e.message:String(e),timestamp:new Date().toISOString()}))}}async connect(){return await this.ensureAuthCookie(),new Promise((e,t)=>{if(this.ws?.readyState===WebSocket.OPEN){e();return}this.setStatus({state:`connecting`});try{this.ws=new WebSocket(this.url),this.ws.binaryType=`arraybuffer`;let n=setTimeout(()=>{t(Error(`Connection timeout`))},1e4),r=!1;this.ws.onopen=()=>{clearTimeout(n),r=!0,this.reconnectAttempts=0,this.lastErrorText=void 0,this.setStatus({state:`open`}),this.flushMessageQueue(),e()},this.ws.onmessage=e=>{try{let t=JSON.parse(e.data);this.handleMessage(t)}catch(e){console.error(JSON.stringify({level:`error`,event:`ws_client.message_parse_failed`,message:e instanceof Error?e.message:String(e),timestamp:new Date().toISOString()}))}},this.ws.onerror=e=>{console.error(JSON.stringify({level:`error`,event:`ws_client.error`,message:e instanceof Error?e.message:String(e),timestamp:new Date().toISOString()})),this.lastErrorText=`Connection error (see browser devtools)`,r||(clearTimeout(n),t(Error(this.lastErrorText)))},this.ws.onclose=e=>{if(!r){clearTimeout(n);let r=e.reason||`Closed with code ${e.code}`;this.lastErrorText=r,t(Error(r));return}e.reason&&!this.lastErrorText?this.lastErrorText=`${e.reason} (code ${e.code})`:!this.lastErrorText&&e.code!==1e3&&(this.lastErrorText=`Closed with code ${e.code}`),this.attemptReconnect()}}catch(e){this.lastErrorText=e instanceof Error?e.message:String(e),this.setStatus({state:`closed`,error:this.lastErrorText}),t(e)}})}attemptReconnect(){if(!this.shouldReconnect||this.reconnectAttempts>=this.maxReconnectAttempts){this.reconnectTimer=null,this.setStatus({state:`closed`,error:this.lastErrorText??`Disconnected`});return}this.reconnectAttempts++;let e=Math.min(this.reconnectDelay*2**(this.reconnectAttempts-1),3e4),t=Date.now()+e;this.setStatus({state:`reconnecting`,attempt:this.reconnectAttempts,nextRetryAt:t,lastError:this.lastErrorText}),this.reconnectTimer=setTimeout(async()=>{if(this.shouldReconnect)try{await this.connect()}catch(e){console.error(JSON.stringify({level:`error`,event:`ws_client.reconnect_failed`,message:e instanceof Error?e.message:String(e),timestamp:new Date().toISOString()}))}},e)}retryNow(){this.currentStatus.state!==`open`&&(this.reconnectTimer&&=(clearTimeout(this.reconnectTimer),null),this.reconnectAttempts=0,this.connect().catch(e=>console.warn(JSON.stringify({level:`warn`,event:`ws_client.reconnect_failed`,message:e instanceof Error?e.message:String(e),timestamp:new Date().toISOString()}))))}flushMessageQueue(){for(;this.messageQueue.length>0;){let e=this.messageQueue.shift();e&&this.send(e)}}handleMessage(e){if(e.type===`tool.confirm_needed`){let t=e.payload;this.pendingConfirms.set(t.id,{}),this.emit(e);return}if(e.type===`session.start`){let t=e.payload;this.sessionId=t.sessionId}this.emit(e)}emit(e){let t=this.handlers.get(e.type);if(t)for(let n of t)try{n(e)}catch(t){console.error(JSON.stringify({level:`error`,event:`ws_client.handler_error`,messageType:e.type,message:t instanceof Error?t.message:String(t),timestamp:new Date().toISOString()}))}}send(t){if((t.type===`context.clear`||t.type===`session.new`||t.type===`session.resume`)&&i.dropAll(),this.ws?.readyState===WebSocket.OPEN)this.ws.send(JSON.stringify(t));else{if(this.messageQueue.length>=e.MAX_QUEUED_MESSAGES){let t=this.messageQueue.shift();t&&console.warn(JSON.stringify({level:`warn`,event:`ws_client.message_queue_full`,cap:e.MAX_QUEUED_MESSAGES,droppedType:t.type,timestamp:new Date().toISOString()}))}this.messageQueue.push(t)}}on(e,t){let n=this.handlers.get(e);return n||(n=new Set,this.handlers.set(e,n)),n.add(t),()=>n?.delete(t)}off(e,t){this.handlers.get(e)?.delete(t)}sendMessage(e,t){let n=`msg_${Date.now()}_${crypto.randomUUID().slice(0,8)}`;return this.send({type:`user_message`,payload:this.withSession({id:n,content:e,timestamp:Date.now(),...t?{imageBase64:t}:{}})}),n}sendAbort(){this.send({type:`abort`,payload:this.withSession({})})}getGitInfo(){this.send({type:`git.info`})}getGitChanges(){this.send({type:`git.changes`})}getGitDiff(e){this.send({type:`git.diff`,payload:{path:e}})}sendConfirm(e,t){this.pendingConfirms.has(e)&&this.pendingConfirms.delete(e),this.send({type:`tool.confirm_result`,payload:this.withSession({id:e,decision:t})})}switchModel(e,t){this.send({type:`model.switch`,payload:{provider:e,model:t}})}newSession(){this.send({type:`session.new`,payload:this.withSession({})})}listProviders(){this.send({type:`providers.list`})}listProviderModels(e){this.send({type:`provider.models`,payload:{providerId:e}})}listSavedProviders(){this.send({type:`providers.saved`})}addKey(e,t,n){this.send({type:`key.add`,payload:{providerId:e,label:t,apiKey:n}})}updateKey(e,t,n){this.send({type:`key.update`,payload:{providerId:e,label:t,apiKey:n}})}deleteKey(e,t){this.send({type:`key.delete`,payload:{providerId:e,label:t}})}setActiveKey(e,t){this.send({type:`key.set_active`,payload:{providerId:e,label:t}})}addProvider(e,t,n,r){this.send({type:`provider.add`,payload:{id:e,family:t,baseUrl:n,apiKey:r}})}removeProvider(e){this.send({type:`provider.remove`,payload:{providerId:e}})}startOAuth(e){this.send({type:`auth.oauth.start`,payload:{kind:e}})}submitOAuthCode(e,t){this.send({type:`auth.oauth.code`,payload:{kind:e,input:t}})}cancelOAuth(e){this.send({type:`auth.oauth.cancel`,payload:{kind:e}})}probeProvider(e,t){this.send({type:`provider.probe`,payload:t===void 0?{providerId:e}:{providerId:e,timeoutMs:t}})}clearProviderModels(e){this.send(a(e))}undoProviderClear(e,t){this.send(o(e,t))}updateProvider(e){this.send(s(e))}clearContext(){this.send({type:`context.clear`,payload:this.withSession({})})}compactContext(e=!1){this.send({type:`context.compact`,payload:this.withSession({aggressive:e})})}repairContext(){this.send({type:`context.repair`,payload:this.withSession({})})}debugContext(){this.send({type:`context.debug`,payload:this.withSession({})})}listContextModes(){this.send({type:`context.modes.list`,payload:this.withSession({})})}switchContextMode(e){this.send({type:`context.mode.switch`,payload:this.withSession({id:e})})}createContextMode(e){this.send({type:`context.mode.create`,payload:this.withSession(e)})}updateContextMode(e,t){this.send({type:`context.mode.update`,payload:this.withSession({id:e,...t})})}deleteContextMode(e){this.send({type:`context.mode.delete`,payload:this.withSession({id:e})})}switchAutonomy(e){this.send({type:`autonomy.switch`,payload:{mode:e}})}updatePrefs(e){this.send({type:`prefs.update`,payload:e})}getPrefs(){this.send({type:`prefs.get`})}listTools(){this.send({type:`tools.list`})}listMemory(){this.send({type:`memory.list`})}remember(e,t){this.send({type:`memory.remember`,payload:{text:e,scope:t}})}forget(e,t){this.send({type:`memory.forget`,payload:{text:e,scope:t}})}listMcpServers(){this.send({type:`mcp.list`})}addMcpServer(e){this.send({type:`mcp.add`,payload:e})}removeMcpServer(e){this.send({type:`mcp.remove`,payload:{name:e}})}updateMcpServer(e){this.send({type:`mcp.update`,payload:e})}wakeMcpServer(e){this.send({type:`mcp.wake`,payload:{name:e}})}sleepMcpServer(e){this.send({type:`mcp.sleep`,payload:{name:e}})}discoverMcpServer(e){this.send({type:`mcp.discover`,payload:{name:e}})}enableMcpServer(e){this.send({type:`mcp.enable`,payload:{name:e}})}disableMcpServer(e){this.send({type:`mcp.disable`,payload:{name:e}})}restartMcpServer(e){this.send({type:`mcp.restart`,payload:{name:e}})}listSkills(){this.send({type:`skills.list`})}getSkillContent(e,t){this.send({type:`skills.content`,payload:{name:e,source:t}})}installSkill(e,t){this.send({type:`skills.install`,payload:{ref:e,global:t}})}uninstallSkill(e,t){this.send({type:`skills.uninstall`,payload:{name:e,global:t}})}checkForUpdates(e,t){this.send({type:`skills.update`,payload:{name:e,global:t}})}createSkill(e,t,n){this.send({type:`skills.create`,payload:{name:e,description:t,scope:n}})}editSkill(e,t){this.send({type:`skills.edit`,payload:{name:e,body:t}})}exportAllSkills(){this.send({type:`skills.export`})}getDiag(){this.send({type:`diag.get`,payload:this.withSession({})})}getStats(){this.send({type:`stats.get`,payload:this.withSession({})})}saveSession(){this.send({type:`session.save`,payload:this.withSession({})})}resumeSessionById(e){this.send({type:`session.resume`,payload:this.withSession({id:e})})}listModes(){this.send({type:`modes.list`})}switchMode(e){this.send({type:`mode.switch`,payload:{id:e}})}listFiles(e,t,n){this.send({type:`files.list`,payload:{query:e,limit:t,path:n}})}requestCompletion(e){this.send({type:`completion.request`,payload:e})}getTodos(){this.send({type:`todos.get`,payload:this.withSession({})})}clearTodos(){this.send({type:`todos.clear`,payload:this.withSession({})})}removeTodo(e){let t=typeof e==`number`?{index:e}:{id:e};this.send({type:`todos.remove`,payload:this.withSession(t)})}updateTodoStatus(e,t){this.send({type:`todo.update`,payload:this.withSession({id:e,status:t})})}getTasks(){this.send({type:`tasks.get`,payload:this.withSession({})})}updateTaskStatus(e,t){this.send({type:`task.update`,payload:this.withSession({id:e,status:t})})}getPlan(){this.send({type:`plan.get`,payload:this.withSession({})})}updatePlanItem(e,t){this.send({type:`plan.item.update`,payload:this.withSession({target:e,status:t})})}listSessions(e=50){this.send({type:`sessions.list`,payload:this.withSession({limit:e})})}deleteSession(e){this.send({type:`session.delete`,payload:{id:e}})}renameSession(e,t){this.send({type:`session.rename`,payload:{id:e,name:t}})}setWorkingDir(e){this.send({type:`working_dir.set`,payload:{path:e}})}resumeSession(e){this.send({type:`session.resume`,payload:this.withSession({id:e})})}ping(){this.send({type:`ping`})}refineModel(e){this.send({type:`model.refine`,payload:{text:e}})}disconnect(){this.shouldReconnect=!1,this.reconnectTimer&&=(clearTimeout(this.reconnectTimer),null),this.messageQueue.length=0,this.ws?.close(),this.ws=null}get isConnected(){return this.ws?.readyState===WebSocket.OPEN}get currentSessionId(){return this.sessionId}},P=null;function F(e){return P||=new N(e),P}export{y as a,_ as c,v as i,i as l,j as n,b as o,k as r,g as s,F as t};
|