crewswarm 0.9.0 → 0.9.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/README.md +2 -2
- package/apps/dashboard/dist/assets/{chat-core-CMoqlR6D.js → chat-core-Cx4sTxDd.js} +1 -1
- package/apps/dashboard/dist/assets/chat-core-Cx4sTxDd.js.br +0 -0
- package/apps/dashboard/dist/assets/cli-process-COMRNPqr.js.br +0 -0
- package/apps/dashboard/dist/assets/{components-CSUb80ze.js → components-BS9fQjE_.js} +1 -1
- package/apps/dashboard/dist/assets/components-BS9fQjE_.js.br +0 -0
- package/apps/dashboard/dist/assets/core-utils-CmOkXgzi.js +1 -0
- package/apps/dashboard/dist/assets/core-utils-CmOkXgzi.js.br +0 -0
- package/apps/dashboard/dist/assets/index-CF0aJRtC.css.br +0 -0
- package/apps/dashboard/dist/assets/{index-DqVVQLTW.js → index-DnClJ1ee.js} +2 -2
- package/apps/dashboard/dist/assets/index-DnClJ1ee.js.br +0 -0
- package/apps/dashboard/dist/assets/orchestration-Ca2DLWN-.js.br +0 -0
- package/apps/dashboard/dist/assets/{setup-wizard-D4g5DMhW.js → setup-wizard-CA0Or47w.js} +1 -1
- package/apps/dashboard/dist/assets/setup-wizard-CA0Or47w.js.br +0 -0
- package/apps/dashboard/dist/assets/{tab-agents-tab-BThdsdJY.js → tab-agents-tab-BgpIsjkw.js} +1 -1
- package/apps/dashboard/dist/assets/tab-agents-tab-BgpIsjkw.js.br +0 -0
- package/apps/dashboard/dist/assets/{tab-benchmarks-tab-DfCuAClu.js → tab-benchmarks-tab-BHjKCPm3.js} +1 -1
- package/apps/dashboard/dist/assets/{tab-comms-tab-eHpOSBhG.js → tab-comms-tab-kguqTIzD.js} +1 -1
- package/apps/dashboard/dist/assets/tab-comms-tab-kguqTIzD.js.br +0 -0
- package/apps/dashboard/dist/assets/{tab-contacts-tab-5LHSthJM.js → tab-contacts-tab-DiOyMYth.js} +1 -1
- package/apps/dashboard/dist/assets/tab-contacts-tab-DiOyMYth.js.br +0 -0
- package/apps/dashboard/dist/assets/{tab-engines-tab-C3DYxTwy.js → tab-engines-tab-BsdZVvU0.js} +1 -1
- package/apps/dashboard/dist/assets/tab-engines-tab-BsdZVvU0.js.br +0 -0
- package/apps/dashboard/dist/assets/{tab-memory-tab-C59BYFQD.js → tab-memory-tab-Cu6u13EQ.js} +1 -1
- package/apps/dashboard/dist/assets/tab-memory-tab-Cu6u13EQ.js.br +0 -0
- package/apps/dashboard/dist/assets/{tab-models-tab-CQzvaeVh.js → tab-models-tab-BLEjmd19.js} +1 -1
- package/apps/dashboard/dist/assets/tab-models-tab-BLEjmd19.js.br +0 -0
- package/apps/dashboard/dist/assets/{tab-pm-loop-tab-D7mnDelU.js → tab-pm-loop-tab-Bfd449B4.js} +1 -1
- package/apps/dashboard/dist/assets/tab-pm-loop-tab-Bfd449B4.js.br +0 -0
- package/apps/dashboard/dist/assets/{tab-projects-tab-C6h2Mv1K.js → tab-projects-tab-DhNWnlzt.js} +1 -1
- package/apps/dashboard/dist/assets/tab-projects-tab-DhNWnlzt.js.br +0 -0
- package/apps/dashboard/dist/assets/{tab-prompts-tab-C0wZvWK3.js → tab-prompts-tab-DVkUNaJd.js} +1 -1
- package/apps/dashboard/dist/assets/tab-prompts-tab-DVkUNaJd.js.br +0 -0
- package/apps/dashboard/dist/assets/{tab-services-tab-DBj_w3bc.js → tab-services-tab-DU_LH3uG.js} +1 -1
- package/apps/dashboard/dist/assets/tab-services-tab-DU_LH3uG.js.br +0 -0
- package/apps/dashboard/dist/assets/{tab-settings-tab-ezeqAjZk.js → tab-settings-tab-Bn4nXtDe.js} +1 -1
- package/apps/dashboard/dist/assets/tab-settings-tab-Bn4nXtDe.js.br +0 -0
- package/apps/dashboard/dist/assets/{tab-skills-tab-BYdU2whk.js → tab-skills-tab-BpY0uZHW.js} +1 -1
- package/apps/dashboard/dist/assets/tab-skills-tab-BpY0uZHW.js.br +0 -0
- package/apps/dashboard/dist/assets/{tab-spending-tab-Bg6w9t_p.js → tab-spending-tab-DEccQHnt.js} +1 -1
- package/apps/dashboard/dist/assets/tab-spending-tab-DEccQHnt.js.br +0 -0
- package/apps/dashboard/dist/assets/{tab-swarm-chat-tab-BBV9HB2X.js → tab-swarm-chat-tab-BNrd88-r.js} +1 -1
- package/apps/dashboard/dist/assets/tab-swarm-chat-tab-BNrd88-r.js.br +0 -0
- package/apps/dashboard/dist/assets/{tab-swarm-tab-ChqLlEVs.js → tab-swarm-tab-B1AcjL1W.js} +1 -1
- package/apps/dashboard/dist/assets/tab-swarm-tab-B1AcjL1W.js.br +0 -0
- package/apps/dashboard/dist/assets/{tab-usage-tab-B2UWXenJ.js → tab-usage-tab-BIOOnB-Y.js} +1 -1
- package/apps/dashboard/dist/assets/tab-usage-tab-BIOOnB-Y.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-waves-tab-SaJDkb4x.js.br +0 -0
- package/apps/dashboard/dist/assets/{tab-workflows-tab-6QSXLJ0i.js → tab-workflows-tab-B-soSy1k.js} +1 -1
- package/apps/dashboard/dist/assets/tab-workflows-tab-B-soSy1k.js.br +0 -0
- package/apps/dashboard/dist/index.html +23 -23
- package/apps/dashboard/dist/index.html.br +0 -0
- package/apps/dashboard/dist/index.html.gz +0 -0
- package/apps/dashboard/index.html +71 -1
- package/apps/dashboard/src/app.js +5 -0
- package/apps/dashboard/src/core/dom.js +8 -0
- package/apps/dashboard/src/tabs/settings-tab.js +58 -0
- package/apps/vibe/.crew/agent-memory/pipeline.json +12 -1
- package/apps/vibe/.crew/cost.json +3 -3
- package/apps/vibe/.crew/json-parse-metrics.jsonl +1 -0
- package/apps/vibe/.crew/pipeline-metrics.jsonl +1 -0
- package/apps/vibe/.crew/pipeline-runs/pipeline-c1418f4e-b773-4ca1-84a3-216acf36e2f2.jsonl +5 -0
- package/apps/vibe/.crew/session.json +10 -1
- package/apps/vibe/.studio-data/project-messages/general.jsonl +3 -0
- package/apps/vibe/index.html +4 -2
- package/apps/vibe/server.mjs +75 -3
- package/apps/vibe/src/main.js +126 -53
- package/crew-lead.mjs +14 -1
- package/lib/bridges/cli-executor.mjs +0 -2
- package/lib/bridges/tmux-bridge.mjs +200 -0
- package/lib/chat/unified-history.mjs +1 -1
- package/lib/cli-process-tracker.mjs +2 -1
- package/lib/crew-lead/http-server.mjs +286 -1
- package/lib/crew-lead/wave-dispatcher.mjs +40 -3
- package/lib/engines/crew-cli.mjs +3 -2
- package/lib/engines/llm-direct.mjs +4 -1
- package/lib/engines/rt-envelope.mjs +14 -5
- package/lib/engines/runners.mjs +30 -4
- package/lib/runtime/config.mjs +7 -0
- package/lib/sessions/session-manager.mjs +287 -0
- package/package.json +1 -1
- package/scripts/bench/performance_optimization.py +81 -0
- package/whatsapp-bridge.mjs +54 -10
- package/apps/dashboard/dist/assets/core-utils-CAVnDoe1.js +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/tab-benchmarks-tab-
|
|
2
|
-
var e,t,n;import{a as o,g as a,b as s,s as i,p as r,d as l,c,k as d,r as p,h as m,l as u,m as g,e as h}from"./core-utils-CAVnDoe1.js";import{c as v}from"./setup-wizard-D4g5DMhW.js";import{i as f}from"./components-CSUb80ze.js";import{s as y}from"./orchestration-Ca2DLWN-.js";import"./cli-process-COMRNPqr.js";import{i as w}from"./chat-core-CMoqlR6D.js";import{i as b,s as x,h as k}from"./tab-swarm-chat-tab-BBV9HB2X.js";import{i as C}from"./tab-waves-tab-SaJDkb4x.js";import{i as E,s as I}from"./tab-workflows-tab-6QSXLJ0i.js";import{c as T,m as B,s as S,l as j,a as A}from"./tab-memory-tab-C59BYFQD.js";import{i as P,s as L,l as M,a as _,r as N}from"./tab-services-tab-DBj_w3bc.js";import{i as R,s as O,l as F,a as H,t as D,b as z,c as G,d as $,e as V,f as q,g as K,h as U,j as W,k as J,m as Q,n as Y,o as X,p as Z,r as ee,q as te,u as ne,v as oe,w as ae,x as se,y as ie,z as re,A as le}from"./tab-agents-tab-BThdsdJY.js";import{i as ce,a as de}from"./tab-prompts-tab-C0wZvWK3.js";import{s as pe,a as me,l as ue,c as ge,b as he,i as ve,t as fe,d as ye,f as we,r as be,e as xe,g as ke,u as Ce}from"./tab-skills-tab-BYdU2whk.js";import{s as Ee,i as Ie,a as Te,l as Be}from"./tab-contacts-tab-5LHSthJM.js";import{i as Se,t as je,l as Ae,d as Pe}from"./tab-engines-tab-C3DYxTwy.js";import{s as Le,a as Me,b as _e,c as Ne,t as Re,d as Oe,r as Fe,i as He}from"./tab-swarm-tab-ChqLlEVs.js";import{i as De,s as ze,t as Ge,a as $e,b as Ve,c as qe,d as Ke,e as Ue,f as We,g as Je,h as Qe,j as Ye}from"./tab-models-tab-CQzvaeVh.js";import{s as Xe,a as Ze,b as et,t as tt,c as nt,d as ot,e as at,f as st,g as it,h as rt,i as lt,j as ct,k as dt,l as pt,u as mt,m as ut,n as gt,o as ht,p as vt,q as ft,r as yt,v as wt,w as bt,x as xt,y as kt,z as Ct,A as Et,B as It,C as Tt,D as Bt,E as St,F as jt,G as At,H as Pt}from"./tab-settings-tab-ezeqAjZk.js";import{i as Lt,s as Mt,l as _t,a as Nt,b as Rt,c as Ot,d as Ft,e as Ht,f as Dt,g as zt,h as Gt,r as $t,j as Vt}from"./tab-comms-tab-eHpOSBhG.js";import{i as qt,p as Kt,r as Ut,c as Wt,a as Jt,b as Qt,e as Yt,d as Xt,l as Zt,o as en,f as tn,h as nn,j as on,k as an,m as sn,n as rn,q as ln,t as cn,v as dn,w as pn}from"./tab-projects-tab-C6h2Mv1K.js";import{a as mn,r as un,c as gn,b as hn,l as vn,d as fn}from"./tab-usage-tab-B2UWXenJ.js";import{s as yn,r as wn,l as bn,a as xn,b as kn}from"./tab-spending-tab-Bg6w9t_p.js";import{i as Cn}from"./tab-pm-loop-tab-D7mnDelU.js";!function(){const e=document.createElement("link").relList;if(!(e&&e.supports&&e.supports("modulepreload"))){for(const e of document.querySelectorAll('link[rel="modulepreload"]'))t(e);new MutationObserver(e=>{for(const n of e)if("childList"===n.type)for(const e of n.addedNodes)"LINK"===e.tagName&&"modulepreload"===e.rel&&t(e)}).observe(document,{childList:!0,subtree:!0})}function t(e){if(e.ep)return;e.ep=!0;const t=function(e){const t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),"use-credentials"===e.crossOrigin?t.credentials="include":"anonymous"===e.crossOrigin?t.credentials="omit":t.credentials="same-origin",t}(e);fetch(e.href,t)}}();const En={};let In=null;async function Tn(){return In||(In=await function(e,t){let n=Promise.resolve();if(t&&t.length>0){let e=function(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:"fulfilled",value:e}),e=>({status:"rejected",reason:e}))))};document.getElementsByTagName("link");const o=document.querySelector("meta[property=csp-nonce]"),a=(null==o?void 0:o.nonce)||(null==o?void 0:o.getAttribute("nonce"));n=e(t.map(e=>{if((e=function(e){return"/"+e}(e))in En)return;En[e]=!0;const t=e.endsWith(".css"),n=t?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${e}"]${n}`))return;const o=document.createElement("link");return o.rel=t?"stylesheet":"modulepreload",t||(o.as="script"),o.crossOrigin="",o.href=e,a&&o.setAttribute("nonce",a),document.head.appendChild(o),t?new Promise((t,n)=>{o.addEventListener("load",t),o.addEventListener("error",()=>n(new Error(`Unable to preload CSS for ${e}`)))}):void 0}))}function o(e){const t=new Event("vite:preloadError",{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return n.then(t=>{for(const e of t||[])"rejected"===e.status&&o(e.reason);return e().catch(o)})}(()=>import("./tab-benchmarks-tab-DfCuAClu.js"),__vite__mapDeps([0,1]))),In}async function Bn(){try{const e=document.getElementById("statusDot");document.getElementById("status").textContent="online",e.className="status-dot online",await gn();const t=await a("/api/dlq"),n=document.getElementById("dlqBadge");t.length?(n.textContent=t.length,n.classList.remove("hidden")):n.classList.add("hidden")}catch(e){document.getElementById("status").textContent="error",document.getElementById("statusDot").className="status-dot error"}}async function Sn(){await Bn()}function jn(e){document.querySelectorAll(".nav-item").forEach(e=>e.classList.remove("active"));const t=document.getElementById(e);t&&t.classList.add("active")}function An(){u(o.activeTab),document.querySelectorAll(".view, .view-sessions").forEach(e=>{e.classList.remove("active"),e.style.display&&(e.style.display="")});const e=document.querySelector(".msg-bar");e&&(e.style.display="")}async function Pn(e){const t=document.getElementById(e),n=encodeURIComponent((null==t?void 0:t.value)||window._crewHome||""),o=await a("/api/pick-folder?default="+n).catch(()=>null);(null==o?void 0:o.path)&&t&&(t.value=o.path)}function Ln(){const e=(location.hash||"#chat").slice(1),t=(e.split("?")[0]||"chat").split("/");return{view:t[0]||"chat",subtab:t[1],raw:e}}function Mn(){return Ln().view}function _n(e){const t=e&&String(e).trim()&&"undefined"!==e?e:"general",n=`#chat?project=${encodeURIComponent(t)}`;location.hash!==n&&history.replaceState(null,"",n)}async function Nn(){try{const e=await a("/api/ui/active-project");return String((null==e?void 0:e.projectId)||"").trim()||"general"}catch{return"general"}}async function Rn(e){const t=e&&String(e).trim()&&"undefined"!==e?String(e).trim():"general";try{await r("/api/ui/active-project",{projectId:t})}catch{}}async function On(){An(),document.getElementById("chatView").classList.add("active"),jn("navChat"),o.activeTab="chat",s();const e=document.querySelector(".msg-bar");e&&(e.style.display="none"),y();const t=document.getElementById("chatMessages");"true"===(null==t?void 0:t.dataset.historyLoading)&&await Yn();const n=t&&"true"===t.dataset.historyLoaded&&t.children.length>0;try{const e=(await a("/api/projects")).projects||[];o.projectsData={},e.forEach(e=>{o.projectsData[e.id]=e}),s(),Kt(e)}catch(c){console.warn("Failed to refresh projects dropdown:",c)}const i=new URLSearchParams(window.location.hash.replace(/^#chat\?/,"")).get("project");if(i)o.chatActiveProjectId=i;else{const e=await Nn();try{o.chatActiveProjectId=e||localStorage.getItem("crewswarm_chat_active_project_id")||"general"}catch{o.chatActiveProjectId=e||"general"}}window.location.hash.includes("?project=")||_n(o.chatActiveProjectId),console.log("🔵 [INIT] Active project from URL:",o.chatActiveProjectId);const r=document.getElementById("chatProjectTabs");r&&Array.from(r.children).forEach(e=>{e.dataset.projectId===o.chatActiveProjectId?e.classList.add("active"):e.classList.remove("active")});const l=document.getElementById("chatProjectSelect");l&&o.chatActiveProjectId&&l.querySelector('option[value="'+o.chatActiveProjectId+'"]')&&(l.value=o.chatActiveProjectId),Rn(o.chatActiveProjectId),gn(),zn(),async function(){try{const e=((await a("/api/agents-config")).agents||[]).find(e=>"crew-lead"===e.id);if(!e)return;window._crewLeadInfo={emoji:e.emoji||"🧠",name:e.name||"crew-lead",theme:e.theme||""};const t=document.getElementById("chatAgentTitle"),n=document.getElementById("chatAgentSub");t&&(t.textContent=(e.emoji||"🧠")+" "+(e.name||"Crew Lead")),n&&e.theme&&(n.textContent=e.theme+" — chat naturally, dispatch tasks to the crew")}catch(c){}}(),window.loadChatAgentSelector&&window.loadChatAgentSelector(),n?m("chat"):await Qn()}function Fn(){An(),document.getElementById("filesView").classList.add("active"),jn("navFiles"),o.activeTab="files",s(),po()}function Hn(){return"owner"}P({hideAllViews:An,setNavActive:jn}),R({hideAllViews:An,setNavActive:jn,refreshAgents:F}),ce({hideAllViews:An,setNavActive:jn}),He({hideAllViews:An,setNavActive:jn}),C(),E({hideAllViews:An,setNavActive:jn});let Dn=null;function zn(){if(Dn)return;const e=`http://${window.location.hostname||"127.0.0.1"}:5010/events`;console.log("[crewswarm] Starting EventSource listener for",e),Dn=new EventSource(e);const t="undefined"!=typeof localStorage&&"1"===localStorage.getItem("crewswarm_debug_sse");Dn.onmessage=e=>{if(e.data)try{const a=JSON.parse(e.data),s=e=>e&&"general"!==e?e:"general",r="owner";t&&console.log("[crewswarm] SSE:",a.type,e.data.slice(0,120));const l=document.getElementById("chatMessages");if(k(a))return;if("chat_stream"===a.type&&a.sessionId===r){const e=s(a.projectId);if(s(o.chatActiveProjectId)!==e)return;let t=document.getElementById("streaming-bubble");if(!t){const e=document.createElement("div");e.id="streaming-wrapper",e.style.cssText="display:flex;flex-direction:column;align-items:flex-start;gap:4px;";const n=document.createElement("div");n.style.cssText="font-size:11px;color:var(--text-3);padding:0 6px;";const o=window._crewLeadInfo||{emoji:"🧠",name:"crew-lead"};n.textContent=o.emoji+" "+o.name+" (streaming...)",t=document.createElement("div"),t.id="streaming-bubble",t.className="chat-bubble assistant",t.style.cssText="max-width:80%;padding:10px 14px;border-radius:14px 14px 14px 4px;background:var(--surface-2);color:var(--text-2);font-size:14px;line-height:1.5;white-space:pre-wrap;word-break:break-word;border:1px solid var(--border);",t._textNode=document.createTextNode(""),t.appendChild(t._textNode),e.appendChild(n),e.appendChild(t),l&&l.appendChild(e)}const n=(t.dataset.streamChunk||"")+a.token;return t.dataset.streamChunk=n,void(t._rafId||(t._rafId=requestAnimationFrame(()=>{const e=t.dataset.streamChunk||"";e&&(t._textNode||(t._textNode=document.createTextNode(""),t.appendChild(t._textNode)),t._textNode.textContent+=e,t.dataset.streamChunk=""),l&&(l.scrollTop=l.scrollHeight),t._rafId=null})))}if("draft_discarded"===a.type&&a.draftId){const e=document.querySelector('[data-draft-id="'+a.draftId+'"]');return void(e&&e.remove())}if("context_warning"===a.type&&"owner"===a.sessionId){const e=document.getElementById("contextWarningBanner");e&&e.remove();const t=document.createElement("div");t.id="contextWarningBanner";const n="critical"===a.level;t.style.cssText=`display:flex;align-items:center;gap:10px;padding:8px 14px;border-radius:8px;margin:6px 0;font-size:12px;background:${n?"rgba(239,68,68,0.1)":"rgba(245,158,11,0.1)"};border:1px solid ${n?"rgba(239,68,68,0.3)":"rgba(245,158,11,0.3)"};color:${n?"#f87171":"#f59e0b"};`,t.innerHTML=`<span style="flex:1;">${a.message}</span><button onclick="clearChatHistory()" style="padding:2px 8px;font-size:11px;border-radius:4px;border:1px solid currentColor;background:transparent;color:inherit;cursor:pointer;">Clear now</button><button onclick="this.parentElement.remove()" style="background:none;border:none;cursor:pointer;color:inherit;font-size:14px;padding:0 2px;">✕</button>`;const o=document.getElementById("chatMessages");return void(o&&(o.appendChild(t),o.scrollTop=o.scrollHeight))}if("chat_message"===a.type&&"owner"===a.sessionId){const e=s(o.chatActiveProjectId),t=s(a.projectId);if(e!==t)return void console.log("[crewswarm] ❌ SKIP - projectId mismatch:",{current:e||"(General)",message:t||"(General)"});if(console.log("[crewswarm] ✅ Displaying message for current session"),"user"===a.role){if(a.content===Jn)return console.log("[crewswarm] Skipping SSE echo of locally-sent message"),void(Jn=null);a.content!==Wn?(console.log("[crewswarm] Appending user bubble:",a.content.slice(0,50)),g("user",a.content),Wn=a.content):console.log("[crewswarm] Skipping duplicate user message")}else if("assistant"===a.role){document.querySelectorAll('[id^="typing-"]').forEach(e=>e.remove());const e=String(a.content||"").trim();if(e&&function(e){if(!e)return"";for(let t=e.children.length-1;t>=0;t--){const n=e.children[t];if("streaming-wrapper"!==n.id&&!(n.children.length<2)&&String(n.style.alignItems||"").includes("flex-start"))return(n.children[1].textContent||"").trim()}return""}(l)===e)return Un=a.content,void(l&&(l.scrollTop=l.scrollHeight));const t=document.getElementById("streaming-wrapper"),n=document.getElementById("streaming-bubble");if(n){n._rafId&&cancelAnimationFrame(n._rafId),n._rafId=null;const e=n.dataset.streamChunk||"";e&&(n._textNode||(n._textNode=document.createTextNode(""),n.appendChild(n._textNode)),n._textNode.textContent+=e,n.dataset.streamChunk="")}if(t&&n){const e=window._crewLeadInfo||{emoji:"🧠",name:"crew-lead"},o=t.firstElementChild;o&&o!==n&&(o.textContent=e.emoji+" "+e.name);const s=a.content??"";n._textNode?n._textNode.textContent=s:n.textContent=s,t.removeAttribute("id"),n.removeAttribute("id"),delete n.dataset.streamChunk,Un=a.content}else{t&&t.remove();const e=a.content===Un&&function(e,t){if(!e||null==t)return!1;const n=String(t).trim();if(!n)return!1;for(let o=e.children.length-1;o>=0;o--){const t=e.children[o];if("streaming-wrapper"!==t.id&&(!(t.children.length<2)&&String(t.style.alignItems||"").includes("flex-start")&&(t.children[1].textContent||"").trim()===n))return!0}return!1}(l,a.content);e?console.log("[crewswarm] Skipping duplicate assistant message"):(console.log("[crewswarm] Appending assistant bubble (final)"),g("assistant",a.content,a.fallbackModel,a.fallbackReason,a.model,a.engineUsed),Un=a.content)}}return void(l&&(l.scrollTop=l.scrollHeight))}if("pending_project"===a.type&&"owner"===a.sessionId&&a.pendingProject&&l)return Kn(l,a.pendingProject),void(l.scrollTop=l.scrollHeight);if("agent_working"===a.type&&a.agent){const e=document.getElementById("coding-dot-"+a.agent);e&&(e.style.display="inline-flex")}if("agent_idle"===a.type&&a.agent){const e=document.getElementById("coding-dot-"+a.agent);e&&(e.style.display="none")}if("opencode_event"===a.type){const e=document.getElementById("ocFeed"),t=document.getElementById("ocFeedDot");if(!e)return;t&&(t.style.display="inline-block");const o=document.createElement("div");o.style.cssText="display:flex;align-items:center;gap:8px;padding:5px 10px;border-radius:8px;background:var(--bg-2);font-size:12px;font-family:var(--font-mono,monospace);animation:fadeIn .25s ease;";const s=new Date(a.ts||Date.now()).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit"});let i="⚙️",r="";if("session_start"===a.kind){i="▶",o.style.borderLeft="3px solid var(--green-hi)";var n=a.dir||"";r="session started"+(n?" — "+n.split("/").pop():"")}else if("session_end"===a.kind)i="■",o.style.borderLeft="3px solid var(--text-3)",r="session ended",t&&(t.style.display="none");else if("file_edit"===a.kind)i="✏️",o.style.borderLeft="3px solid var(--amber)",r=(a.file||a.path||"")+(a.extra?' <span style="opacity:.5;">'+a.extra+"</span>":"");else if("error"===a.kind)i="✗",o.style.borderLeft="3px solid var(--red-hi)",o.style.color="var(--red-hi)",r=a.message||"error";else if("tool"===a.kind){const e={read_file:"var(--accent)",write_file:"var(--amber)",bash:"var(--purple)",list_directory:"var(--green)",grep:"var(--green)"}[a.tool]||"var(--text-2)";i="done"===a.phase?"✓":"→",o.style.borderLeft="3px solid "+e,o.style.color="done"===a.phase?"var(--text-2)":"var(--text-1)",r='<span style="color:'+e+';font-weight:600;">'+(a.tool||"")+"</span>"+(a.label?' <span style="opacity:.6;">'+a.label+"</span>":"")}for(o.innerHTML='<span style="opacity:.4;flex-shrink:0;">'+s+'</span><span style="flex-shrink:0;">'+i+'</span><span style="flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;">'+r+"</span>",e.appendChild(o);e.children.length>80;)e.removeChild(e.firstChild);return void(e.scrollTop=e.scrollHeight)}if("agent_working"===a.type&&a.agent){const e="agent-spinner-"+(a.taskId||a.agent);if(l&&!document.getElementById(e)){const t=document.createElement("div");t.id=e,t.className="msg a",t.style.cssText="opacity:.7; font-style:italic;",t.innerHTML='<div class="meta"><strong>'+a.agent+'</strong> · working…</div><div class="t" style="display:flex;align-items:center;gap:8px;"><span style="display:inline-block;width:8px;height:8px;border-radius:50%;background:var(--accent);animation:pulse 1s ease-in-out infinite;"></span>Processing task…</div>',l.appendChild(t),l.scrollTop=l.scrollHeight}return}if("agent_reply"===a.type||a.from&&a.content){if(!a.from||!a.content)return;if(a._passthroughSummary)return;const e="agent-spinner-"+(a.taskId||a.from),t=document.getElementById(e);t&&t.remove();const n=document.getElementById("agent-spinner-"+a.from);return n&&n.remove(),g("🤖 "+a.from,a.content,!1,null,null,a.engineUsed),l&&(l.scrollTop=l.scrollHeight),void i(a.from+" finished a task")}if("task.timeout"===a.type&&a.agent){const e="agent-spinner-"+(a.taskId||a.agent),t=document.getElementById(e);t&&t.remove();const n=document.getElementById("agent-spinner-"+a.agent);n&&n.remove();const o="[crew-lead] Task to "+a.agent+" timed out (no reply in 90s). Consider @@SERVICE restart "+a.agent+" or re-dispatch to another agent.";if(l){const e=document.createElement("div");e.className="msg a",e.style.cssText="opacity:.85; font-style:italic; color:var(--text-3);",e.innerHTML='<div class="meta"><strong>'+a.agent+'</strong> · no reply</div><div class="t">'+h(o)+"</div>",l.appendChild(e),l.scrollTop=l.scrollHeight}return void i("Task to "+a.agent+" timed out")}if("pipeline_progress"===a.type){let e;e=a.agents?"Wave "+(a.waveIndex+1)+"/"+a.totalWaves+" → "+a.agents.join(" + "):"Step "+(a.stepIndex+1)+"/"+a.total+" → "+a.agent;const t=document.createElement("div");return t.style.cssText="font-size:11px;color:var(--text-3);padding:2px 8px;margin:2px 0;",t.textContent="↳ "+e,void(l&&(l.appendChild(t),l.scrollTop=l.scrollHeight))}if("pipeline_quality_gate"===a.type){const e=document.createElement("div"),t=a.willRetry?" — retrying wave":" — advancing anyway";return e.style.cssText="font-size:11px;color:var(--warning, #e8a030);padding:2px 8px;margin:2px 0;",e.textContent="⚠️ Wave "+(a.waveIndex+1)+" quality gate: "+(a.issues||[]).join("; ")+t,void(l&&(l.appendChild(e),l.scrollTop=l.scrollHeight))}if("project_launched"===a.type&&a.project){const e=a.project.projectId||a.project.id;return void setTimeout(async()=>{await Xt(),e&&pn(e);const t=document.getElementById("chatMessages");if(t){const n=document.createElement("div");n.style.cssText="font-size:11px;color:var(--green);padding:2px 8px;margin:2px 0;",n.textContent='📁 Project "'+(a.project.name||e)+'" registered — selected in chat',t.appendChild(n),t.scrollTop=t.scrollHeight}},800)}if("pipeline_done"===a.type){const e=document.createElement("div");return e.style.cssText="font-size:11px;color:var(--green);padding:2px 8px;margin:2px 0;",e.textContent="✅ Pipeline complete",void(l&&(l.appendChild(e),l.scrollTop=l.scrollHeight))}if("confirm_run_cmd"===a.type&&a.approvalId)return void function(e,t,n){if(document.getElementById("cmd-approval-"+e))return;const o=document.createElement("div");o.id="cmd-approval-"+e,o.style.cssText=["position:fixed;bottom:80px;right:24px;z-index:9999;","background:var(--bg-card);border:1px solid var(--border);border-radius:12px;","padding:16px 20px;max-width:440px;box-shadow:0 8px 32px rgba(0,0,0,.4);","display:flex;flex-direction:column;gap:10px;"].join("");const a=document.createElement("div");a.style.cssText="font-size:13px;font-weight:600;color:var(--text-1);",a.textContent="🔐 "+t+" wants to run a command";const s=document.createElement("code");s.style.cssText="display:block;font-size:12px;color:var(--accent);background:var(--bg-1);padding:6px 10px;border-radius:6px;word-break:break-all;",s.textContent=n;const r=document.createElement("label");r.style.cssText="display:flex;align-items:center;gap:8px;font-size:12px;color:var(--text-2);cursor:pointer;";const l=document.createElement("input");l.type="checkbox",l.style.cssText="width:14px;height:14px;cursor:pointer;accent-color:var(--green);";const c=n.trim().split(/\s+/)[0]+" *";r.appendChild(l),r.appendChild(document.createTextNode("Always allow "));const d=document.createElement("code");d.style.cssText="font-size:11px;background:var(--bg-1);padding:2px 6px;border-radius:4px;color:var(--accent);",d.textContent=c,r.appendChild(d);const p=document.createElement("div");p.style.cssText="font-size:11px;color:var(--text-3);";let m=60;p.textContent="Auto-reject in "+m+"s";const u=setInterval(()=>{m--,p.textContent="Auto-reject in "+m+"s",m<=0&&(clearInterval(u),o.remove())},1e3),g=document.createElement("div");g.style.cssText="display:flex;gap:8px;";const h=document.createElement("button");h.textContent="✅ Allow",h.style.cssText="flex:1;padding:8px;border-radius:8px;border:none;background:var(--green);color:#fff;cursor:pointer;font-weight:600;font-size:13px;",h.onclick=async()=>{clearInterval(u),o.remove(),l.checked&&(await fetch("/api/cmd-allowlist",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({pattern:c})}),i("Allowlisted: "+c)),await fetch("/api/cmd-approve",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({approvalId:e})}).catch(e=>i("Approve failed: "+e.message,!0)),l.checked||i(t+": command approved")};const v=document.createElement("button");v.textContent="⛔ Deny",v.style.cssText="flex:1;padding:8px;border-radius:8px;border:none;background:var(--red-hi);color:#fff;cursor:pointer;font-weight:600;font-size:13px;",v.onclick=async()=>{clearInterval(u),o.remove(),await fetch("/api/cmd-reject",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({approvalId:e})}).catch(e=>i("Reject failed: "+e.message,!0)),i(t+": command denied")},g.appendChild(h),g.appendChild(v),o.appendChild(a),o.appendChild(s),o.appendChild(r),o.appendChild(p),o.appendChild(g),document.body.appendChild(o)}(a.approvalId,a.agent,a.cmd);if("telemetry"===a.type&&a.payload){window._telemetryEvents=window._telemetryEvents||[],window._telemetryEvents.push(a.payload),window._telemetryEvents.length>100&&window._telemetryEvents.shift();const e=document.getElementById("toolMatrixView");e&&e.classList.contains("active")&&fn(window._telemetryEvents)}}catch{}else console.warn("[crewswarm] SSE message with null/empty data")},Dn.onopen=()=>{console.log("[crewswarm] SSE connection opened"),window._sseReconnectDelay=2e3},Dn.onerror=e=>{console.error("[crewswarm] SSE error:",e),Dn.close(),Dn=null,window._sseReconnectTimer&&clearTimeout(window._sseReconnectTimer),window._sseReconnectTimer=setTimeout(()=>{window._sseReconnectTimer=null,window._sseReconnectDelay=Math.min(2*(window._sseReconnectDelay||2e3),3e4),zn()},window._sseReconnectDelay||2e3)}}const Gn=[{label:"npm",pattern:"npm *",desc:"install, run, build, test…"},{label:"node",pattern:"node *",desc:"run any node script"},{label:"python",pattern:"python *",desc:"python / python3 scripts"},{label:"pip",pattern:"pip *",desc:"pip install packages"},{label:"git",pattern:"git *",desc:"all git operations"},{label:"cursor",pattern:"cursor *",desc:"open files in Cursor"},{label:"make",pattern:"make *",desc:"Makefile targets"},{label:"yarn",pattern:"yarn *",desc:"yarn install / build / run"},{label:"pnpm",pattern:"pnpm *",desc:"pnpm package manager"},{label:"ls / cat / echo",pattern:"ls *",desc:"read-only shell utilities"}];async function $n(){const e=document.getElementById("cmdAllowlistItems"),t=document.getElementById("cmdPresets");if(!e)return;const n=(await a("/api/cmd-allowlist").catch(()=>({list:[]}))).list||[];t&&(t.innerHTML="",Gn.forEach(function(e){const o=n.includes(e.pattern),a=document.createElement("label");a.style.cssText="display:flex;align-items:center;gap:8px;cursor:pointer;padding:4px 6px;border-radius:6px;transition:background 0.1s;",a.onmouseover=function(){a.style.background="var(--bg-hover)"},a.onmouseout=function(){a.style.background=""};const s=document.createElement("input");s.type="checkbox",s.checked=o,s.style.cssText="width:14px;height:14px;cursor:pointer;accent-color:var(--green);flex-shrink:0;",s.onchange=async function(){s.checked?await fetch("/api/cmd-allowlist",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({pattern:e.pattern})}).catch(e=>i("Failed to add pattern: "+e.message,!0)):await fetch("/api/cmd-allowlist",{method:"DELETE",headers:{"content-type":"application/json"},body:JSON.stringify({pattern:e.pattern})}).catch(e=>i("Failed to remove pattern: "+e.message,!0)),$n()};const r=document.createElement("code");r.style.cssText="font-size:12px;color:var(--accent);min-width:90px;",r.textContent=e.pattern;const l=document.createElement("span");l.style.cssText="font-size:11px;color:var(--text-3);",l.textContent=e.desc,a.appendChild(s),a.appendChild(r),a.appendChild(l),t.appendChild(a)}));const o=new Set(Gn.map(function(e){return e.pattern})),s=t?n.filter(function(e){return!o.has(e)}):n;if(e.innerHTML="",s.length)for(const a of s){const t=document.createElement("div");t.style.cssText="display:flex;align-items:center;gap:8px;padding:5px 0;border-bottom:1px solid var(--border);";const n=document.createElement("code");n.style.cssText="flex:1;font-size:12px;color:var(--accent);",n.textContent=a;const o=document.createElement("button");o.textContent="✕",o.style.cssText="border:none;background:transparent;color:var(--text-3);cursor:pointer;font-size:14px;padding:0 4px;",o.title="Remove",o.onclick=async function(){await fetch("/api/cmd-allowlist",{method:"DELETE",headers:{"content-type":"application/json"},body:JSON.stringify({pattern:a})}).catch(e=>i("Failed to delete pattern: "+e.message,!0)),$n()},t.appendChild(n),t.appendChild(o),e.appendChild(t)}else e.innerHTML='<div style="color:var(--text-3);font-size:12px;padding:4px 0;">'+(t?"No custom patterns yet.":"No patterns yet.")+"</div>"}async function Vn(){const e=document.getElementById("cmdAllowlistInput"),t=e?e.value.trim():"";t&&(await fetch("/api/cmd-allowlist",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({pattern:t})}).catch(e=>i("Failed to add pattern: "+e.message,!0)),e.value="",$n())}window._telemetryEvents=window._telemetryEvents||[];const qn=()=>vn(kn);function Kn(e,{draftId:t,name:n,outputDir:o,roadmapMd:a}){function s(e){return(e.match(/^- \[ \]/gm)||[]).length}const i=document.createElement("div");i.setAttribute("data-draft-id",t),i.style.cssText="width:100%;display:flex;flex-direction:column;gap:4px;";const l=document.createElement("div");l.style.cssText="font-size:11px;color:var(--text-3);padding:0 6px;",l.textContent="🗺️ Roadmap draft — review before building";const c=document.createElement("div");c.style.cssText="width:100%;border:1px solid var(--border);border-radius:12px;overflow:hidden;background:var(--bg-card);";const d=document.createElement("div");d.style.cssText="background:var(--bg-card2);padding:10px 14px;display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid var(--border);",d.innerHTML='<div><div style="font-size:13px;font-weight:600;color:var(--accent);">🚀 '+n+'</div><div style="font-size:11px;color:var(--blue);margin-top:2px;">'+o+'</div></div><span style="font-size:10px;color:var(--text-3);padding:2px 7px;background:var(--bg-card2);border-radius:10px;" class="task-count">'+s(a)+" tasks</span>";const p=document.createElement("textarea");p.value=a,p.spellcheck=!1,p.style.cssText="width:100%;background:var(--bg-card);border:none;outline:none;color:var(--text-1);font-size:11.5px;font-family:SF Mono,Monaco,Menlo,monospace;line-height:1.6;padding:12px 14px;resize:none;min-height:160px;max-height:320px;display:block;",setTimeout(()=>{p.style.height="",p.style.height=Math.min(p.scrollHeight,320)+"px"},50),p.addEventListener("input",()=>{p.style.height="",p.style.height=Math.min(p.scrollHeight,320)+"px",d.querySelector(".task-count").textContent=s(p.value)+" tasks"});const m=document.createElement("div");m.style.cssText="display:flex;gap:8px;align-items:center;padding:10px 14px 12px;border-top:1px solid var(--border);background:var(--bg-card2);";const u=document.createElement("button");u.textContent="▶ Start Building",u.style.cssText="background:var(--green-hi);color:#000;border:none;border-radius:8px;padding:8px 16px;font-size:12px;font-weight:700;cursor:pointer;",u.onclick=async()=>{u.disabled=!0,u.textContent="⏳ Launching…";try{const e=await r("/api/crew-lead/confirm-project",{draftId:t,roadmapMd:p.value});e.ok?(c.innerHTML='<div style="padding:14px;color:var(--green-hi);font-size:13px;font-weight:600;">✅ '+n+' — project created, PM loop running!<br><span style="color:var(--blue);font-size:11px;font-weight:400">'+(e.outputDir||o)+"</span></div>",g("assistant","🚀 "+n+" is building. Check the Projects tab to watch progress.")):(u.disabled=!1,u.textContent="▶ Start Building",v.textContent="⚠️ "+(e.error||"Launch failed"))}catch(e){u.disabled=!1,u.textContent="▶ Start Building",v.textContent="⚠️ "+e.message}};const h=document.createElement("button");h.textContent="Discard",h.style.cssText="background:none;border:1px solid var(--border);color:var(--text-3);border-radius:8px;padding:8px 14px;font-size:12px;cursor:pointer;",h.onclick=async()=>{await r("/api/crew-lead/discard-project",{draftId:t}).catch(()=>{}),i.remove()};const v=document.createElement("span");v.style.cssText="font-size:11px;color:var(--blue);margin-left:auto;",v.textContent="Edit above, then confirm",m.appendChild(u),m.appendChild(h),m.appendChild(v),c.appendChild(d),c.appendChild(p),c.appendChild(m),i.appendChild(l),i.appendChild(c),e.appendChild(i),e.scrollTop=e.scrollHeight}let Un="",Wn="",Jn=null;const{loadChatHistory:Qn,waitForChatHistoryIdle:Yn,chatAtAtInput:Xn,chatKeydown:Zn,sendChat:eo,clearChatHistory:to,stopAll:no,killAll:oo,killPassthrough:ao,refreshSessionIndicator:so,clearPassthroughSession:io,resetSendButton:ro,handleImageUpload:lo,toggleVoiceRecording:co}=w({postJSON:r,getJSON:a,appendChatBubble:g,showNotification:i,state:o,getChatSessionId:()=>"owner",getChatActiveProjectId:()=>o.chatActiveProjectId,getCrewLeadInfo:()=>window._crewLeadInfo,appendRoadmapCard:Kn,getLastAppendedAssistantContent:()=>Un,setLastAppendedAssistantContent:e=>{Un=e},setLastAppendedUserContent:e=>{Wn=e},setLastSentContent:e=>{Jn=e}});async function po(e){const t=document.getElementById("filesContent"),n=document.getElementById("filesDir").value.trim()||window._crewCwd||(window._crewHome?window._crewHome+"/CrewSwarm":"");d(t,"Scanning "+n+"...");try{const e=await a("/api/files?dir="+encodeURIComponent(n));if(!e.files||!e.files.length)return void c(t,"No files found in "+n);const o={};e.files.forEach(e=>{const t=e.path.split(".").pop().toLowerCase()||"other";o[t]||(o[t]=[]),o[t].push(e)});const s=["html","css","js","mjs","ts","json","md","sh","txt","other"],i={html:"🌐",css:"🎨",js:"⚡",mjs:"⚡",ts:"🔷",json:"📋",md:"📝",sh:"🖥️",txt:"📄",other:"📁"};let r='<div style="display:grid;gap:1rem;padding:4px 0;">';for(const t of s)o[t]&&(r+="<div>",r+='<div style="font-size:11px;font-weight:600;color:var(--text-2);text-transform:uppercase;letter-spacing:0.08em;margin-bottom:8px;padding-left:2px;">'+(i[t]||"📁")+" ."+t+" — "+o[t].length+" file"+(o[t].length>1?"s":"")+"</div>",r+='<div style="display:grid;gap:6px;">',o[t].sort((e,t)=>t.mtime-e.mtime).forEach(e=>{const t=e.path.replace(n+"/",""),o=go(e.mtime),a=ho(e.size);r+='<div class="file-row">',r+='<div class="file-info"><span class="file-name">'+t+'</span><span class="file-meta">'+a+" · "+o+"</span></div>",r+='<div class="file-actions">',r+='<a href="cursor://file/'+e.path+'" class="file-btn file-btn-cursor" title="Open in Cursor">Cursor</a>',r+='<a href="opencode://open?path='+encodeURIComponent(e.path)+'" class="file-btn file-btn-opencode" title="Open in OpenCode">OpenCode</a>',r+='<button data-action="previewFile" data-arg=\''+e.path.replace(/'/g,"'")+'\' data-self="1" class="file-btn" title="Preview">👁</button>',r+="</div></div>"}),r+="</div></div>");r+="</div>",r+='<div id="file-preview-pane" style="display:none;margin-top:1rem;background:#0d1117;border:1px solid var(--border);border-radius:8px;overflow:hidden;"><div id="file-preview-bar" style="display:flex;align-items:center;gap:8px;padding:8px 12px;background:#0d1420;border-bottom:1px solid var(--border);font-size:12px;color:var(--text-2);"><span id="file-preview-name"></span><button data-action="closePreviewPane" style="margin-left:auto;background:none;border:none;color:var(--text-2);cursor:pointer;">✕</button></div><pre id="file-preview-content" style="margin:0;padding:1rem;font-size:0.75rem;overflow:auto;max-height:400px;"></pre></div>',t.innerHTML=r}catch(o){l(t,"Error: "+o.message)}}async function mo(e,t){const n=document.getElementById("file-preview-pane"),o=document.getElementById("file-preview-content"),s=document.getElementById("file-preview-name");if(n){s.textContent=e.split("/").pop(),o.textContent="Loading...",n.style.display="block",n.scrollIntoView({behavior:"smooth",block:"nearest"});try{const t=await a("/api/file-content?path="+encodeURIComponent(e));o.textContent=t.content||"(empty)"}catch(i){o.textContent="Error: "+i.message}}}function uo(){const e=document.getElementById("file-preview-pane");e&&(e.style.display="none")}function go(e){const t=Date.now()-e,n=Math.floor(t/6e4);if(n<1)return"just now";if(n<60)return n+"m ago";const o=Math.floor(n/60);return o<24?o+"h ago":Math.floor(o/24)+"d ago"}function ho(e){return e<1024?e+"B":e<1048576?(e/1024).toFixed(1)+"KB":(e/1024/1024).toFixed(1)+"MB"}function vo(){An(),document.getElementById("settingsView").classList.add("active"),jn("navSettings"),o.activeTab="settings",s();const e=(location.hash||"").replace("#settings/",""),t={system:"engines",telegram:"comms",whatsapp:"comms"}[e]||e;fo(["usage","engines","comms","security","webhooks"].includes(t)?t:"usage")}function fo(e){var t;["usage","engines","comms","security","webhooks"].forEach(t=>{const n=document.getElementById("stab-panel-"+t),o=document.getElementById("stab-"+t);n&&o&&(n.style.display=t===e?"usage"===t?"grid":"block":"none",o.classList.toggle("active",t===e))}),"usage"===e&&(hn(),xn()),"engines"===e&&(vt(),ft(),yt(),wt(),bt(),xt(),kt(),Ct(),Et(),It(),Tt(),Bt(),St(),jt()),"comms"===e&&Vt(),"security"===e&&($n(),At()),(null==(t=document.getElementById("settingsView"))?void 0:t.classList.contains("active"))&&history.replaceState(null,"","#settings/"+e)}function yo(){An(),document.getElementById("enginesView").classList.add("active"),jn("navEngines"),Ae()}null==(e=document.getElementById("attachImageBtn"))||e.addEventListener("click",()=>{document.getElementById("imageUpload").click()}),null==(t=document.getElementById("imageUpload"))||t.addEventListener("change",lo),null==(n=document.getElementById("recordVoiceBtn"))||n.addEventListener("click",co),window.loadChatHistory=Qn,window.getChatSessionId=Hn,window.selectProjectTab=e=>{const t=e&&String(e).trim()&&"undefined"!==e?e:"general",n=o.chatActiveProjectId;console.log("🔵 [TAB CLICK] START",t,"- from:",n);const a=document.getElementById("chatProjectTabs");if(!a)return void console.error("🔵 [TAB CLICK] ERROR: chatProjectTabs container not found!");if(n===t)return void console.log("🔵 [TAB CLICK] Already on this tab, skipping reload");_n(t),Array.from(a.children).forEach(e=>{e.classList.remove("active")});const s=Array.from(a.children).find(e=>e.dataset.projectId===t);s&&s.classList.add("active"),o.chatActiveProjectId=t;try{localStorage.setItem("crewswarm_chat_active_project_id",t)}catch{}Rn(t),console.log("🔵 [TAB CLICK] Updated state:",{projectId:o.chatActiveProjectId,sessionId:"owner",url:window.location.hash}),console.log("🔵 [TAB CLICK] Calling loadChatHistory()..."),Qn().then(()=>{console.log("🔵 [TAB CLICK] loadChatHistory() completed");const e=document.getElementById("chatMessages");console.log("🔵 [TAB CLICK] Messages in DOM:",(null==e?void 0:e.children.length)||0)}).catch(e=>{console.error("🔵 [TAB CLICK] loadChatHistory() ERROR:",e)})},window.addEventListener("focus",()=>{(async function(){if("chat"!==Ln().view)return;const e=await Nn(),t=e&&"undefined"!==e?e:"general";t!==(o.chatActiveProjectId&&"undefined"!==o.chatActiveProjectId?o.chatActiveProjectId:"general")&&window.selectProjectTab&&window.selectProjectTab(t)})().catch(()=>{})}),Lt({showSettings:vo,showSettingsTab:fo}),Pt({getModels:F,populateModelDropdown:le}),Ye({hideAllViews:An,setNavActive:jn,loadAgents:F}),De(),b({hideAllViews:An,setNavActive:jn});const wo=async()=>{const{showBenchmarks:e}=await Tn();e({hideAllViews:An,setNavActive:jn})};function bo(){An(),document.getElementById("memoryView").classList.add("active"),jn("navMemory"),A()}function xo(){An(),document.getElementById("cliProcessView").classList.add("active"),jn("navCLI"),window.initCLIProcess&&window.initCLIProcess()}function ko(){An(),document.getElementById("toolMatrixView").classList.add("active"),jn("navToolMatrix"),mn()}async function Co(){const e=document.getElementById("webhookChannel").value.trim()||"test";let t={};try{const e=document.getElementById("webhookPayload").value.trim();e&&(t=JSON.parse(e))}catch{t={raw:document.getElementById("webhookPayload").value}}const n=document.getElementById("webhookTestResult");try{const o=await fetch("/proxy-webhook/"+e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}),a=await o.json();n.textContent=a.ok?"✅ Sent to RT bus":"❌ "+(a.error||"failed"),n.style.color=a.ok?"var(--green)":"var(--red)"}catch(o){n.textContent="❌ "+o.message,n.style.color="var(--red)"}}async function Eo(){document.getElementById("pendingApprovals").innerHTML='<div style="color:var(--text-3);font-size:12px;">Pending skill approvals appear here when an agent triggers a skill marked requiresApproval. You will also receive a Telegram notification with inline Approve/Reject buttons if Telegram is configured.</div>'}function Io(){on({hideAllViews:An,setNavActive:jn})}function To(){nn({hideAllViews:An,setNavActive:jn})}qt({showChat:On,showBuild:Io}),Bn(),setInterval(Bn,3e4),(async()=>{try{const e=(await a("/api/projects")).projects||[];o.projectsData={},e.forEach(e=>{o.projectsData[e.id]=e}),Kt(e),s(),"#projects"===location.hash&&To()}catch{}})(),document.getElementById("refreshBtn").onclick=Sn,document.getElementById("runBuildBtn").onclick=Ut,document.getElementById("continuousBuildBtn").onclick=Wt,document.getElementById("stopBuildBtn").onclick=Jt,document.getElementById("stopContinuousBtn").onclick=Qt,document.getElementById("enhancePromptBtn").onclick=Yt,Cn(),document.getElementById("newProjectBtn").onclick=()=>{const e=document.getElementById("newProjectForm");e.style.display="none"===e.style.display?"block":"none"},document.getElementById("npCancelBtn").onclick=()=>{document.getElementById("newProjectForm").style.display="none"},document.getElementById("npCreateBtn").onclick=async()=>{const e=document.getElementById("npName").value.trim(),t=document.getElementById("npDesc").value.trim(),n=document.getElementById("npOutputDir").value.trim(),o=document.getElementById("npFeaturesDoc").value.trim();if(e&&n)try{const a=await r("/api/projects",{name:e,description:t,outputDir:n,featuresDoc:o});i(`Project "${a.project.name}" created!`),document.getElementById("newProjectForm").style.display="none",document.getElementById("npName").value="",document.getElementById("npDesc").value="",document.getElementById("npOutputDir").value="",document.getElementById("npFeaturesDoc").value="",Xt()}catch(a){i("Failed: "+a.message,!0)}else i("Name and output directory required",!0)};const Bo={chat:On,"swarm-chat":x,swarm:_e,rt:Me,dlq:Le,files:Fn,services:L,agents:O,models:ze,settings:vo,engines:yo,skills:me,"run-skills":pe,benchmarks:wo,"tool-matrix":ko,build:Io,messaging:Mt,projects:To,contacts:Ee,memory:bo,workflows:I,"cli-process":xo,prompts:de};for(const[Lo,Mo]of Object.entries(Bo)){const e=Mo,t=function(...t){const n=location.hash||"";return"chat"===Lo?n.startsWith("#chat")||history.replaceState(null,"","#chat"):history.replaceState(null,"","#"+Lo),e(...t)};Bo[Lo]=t,window[e.name]=t}function So(e){const t=String(e||"chat").split("?")[0].split("/")[0];(Bo[t]||Bo.chat)()}(async()=>{if(await v())return;const{view:e,subtab:t}=Ln();"1"===new URLSearchParams(window.location.search).get("focus")?setTimeout(()=>{const e=document.getElementById("chatInput");e&&(So("chat"),e.focus())},500):(So(e||"chat"),"settings"===e&&t&&fo(t))})(),window.addEventListener("hashchange",()=>{const{view:e,subtab:t}=Ln(),n=Po[e];n?(n(),"settings"===e&&t&&fo(t)):On()}),fetch("/api/env").then(e=>e.json()).then(e=>{window._crewHome=e.HOME||"",window._crewCwd=e.cwd||"";const t=document.getElementById("filesDir");t&&!t.value&&(t.value=e.cwd||"")}).catch(()=>{}),F().catch(e=>console.error("Initial agents-config load failed:",e)),Sn(),function(){function e(e){if(e.closest("form"))return;const t=document.createElement("form");t.autocomplete="off",t.onsubmit=()=>!1,t.style.cssText="margin:0;padding:0;display:contents;";const n=document.createElement("input");n.type="text",n.autocomplete="username",n.setAttribute("aria-hidden","true"),n.style.cssText="display:none;position:absolute;width:0;height:0;opacity:0;",t.appendChild(n),e.parentNode.insertBefore(t,e),t.appendChild(e)}function t(t){(t||document).querySelectorAll('input[type="password"]').forEach(e)}t();new MutationObserver(n=>{for(const o of n)for(const n of o.addedNodes)1===n.nodeType&&(n.matches&&n.matches('input[type="password"]')?e(n):t(n))}).observe(document.body,{childList:!0,subtree:!0})}();const jo={showChat:On,showSwarm:_e,showRT:Me,showBuild:Io,showFiles:Fn,showDLQ:Le,showProjects:To,showAgents:O,showModels:ze,showEngines:yo,showSkills:me,showRunSkills:pe,showBenchmarks:wo,showToolMatrix:ko,showServices:L,showSettings:vo,pickFolder:e=>Pn(e),loadFiles:e=>po(),clearChatHistory:to,clearAgentChat:()=>{const e=document.getElementById("agentChatSelector"),t=document.getElementById("agentChatMessages"),n=document.getElementById("agentChatInput");t&&(t.innerHTML='<div class="empty-state">No messages yet. Start chatting!</div>'),n&&(n.value=""),(null==e?void 0:e.value)&&i("Chat history cleared","success")},sendChat:eo,stopAll:no,killAll:oo,stopPassthrough:ao,clearPassthroughSession:io,loadServices:M,saveRTToken:gt,lockConfig:ut,unlockConfig:mt,startCrew:H,toggleEmojiPicker:e=>oe(e),bulkSetRoute:(e,t)=>ae(e,t),loadSpending:bn,resetSpending:wn,saveGlobalCaps:yn,loadOcStats:qn,addAllowlistPattern:Vn,sendTestWebhook:Co,startTgBridge:Gt,stopTgBridge:zt,saveTgConfig:Dt,loadTelegramSessions:Ht,loadTgMessages:Ft,startWaBridge:Ot,stopWaBridge:Rt,saveWaConfig:Nt,loadWaMessages:_t,saveOpencodeSettings:pt,saveOpencodeModel:dt,saveGlobalFallback:ct,toggleBgConsciousness:lt,toggleCursorWaves:rt,toggleAutonomousMentions:it,toggleClaudeCode:st,toggleCodexExecutor:at,toggleGeminiCliExecutor:ot,toggleCrewCliExecutor:nt,toggleOpencodeExecutor:tt,saveGlobalOcLoop:et,saveGlobalOcLoopRounds:Ze,savePassthroughNotify:Xe,toggleAddSkill:ye,toggleImportSkill:fe,importSkillFromUrl:ve,showSkills:me,saveSkill:he,cancelSkillForm:ge,loadRunSkills:ue,loadBenchmarks:async()=>(await Tn()).loadBenchmarks(),loadBenchmarkLeaderboard:async()=>(await Tn()).loadBenchmarkLeaderboard(),loadBenchmarkTasks:async()=>(await Tn()).loadBenchmarkTasks(),onBenchmarkTaskSelect:async e=>(await Tn()).onBenchmarkTaskSelect(e),runBenchmarkTask:async()=>(await Tn()).runBenchmarkTask(),stopBenchmarkRun:async()=>(await Tn()).stopBenchmarkRun(),loadMemoryStats:j,searchMemory:S,migrateMemory:B,compactMemory:T,loadEngines:Ae,toggleImportEngine:je,importEngineFromUrl:Se,deleteEngine:e=>Pe(e),loadToolMatrix:mn,loadBuildProjectPicker:Zt,scrollRTToBottom:()=>{const e=document.getElementById("rtView");e&&(e.scrollTop=e.scrollHeight)},toggleRTPause:Re,clearRTMessages:Ne,togglePmAdvanced:()=>{const e=document.getElementById("pmAdvanced");e&&(e.style.display="none"===e.style.display?"block":"none")},toggleRTTokenVis:()=>{const e=document.getElementById("rtTokenInput");e&&(e.type="password"===e.type?"text":"password")},restartService:e=>N(e),stopService:e=>_(e),closePreviewPane:uo,previewFile:(e,t)=>mo(e),replayDLQ:e=>Fe(e),deleteDLQ:e=>Oe(e),runSkillFromUI:e=>be(e),editSkill:e=>xe(e),deleteSkill:e=>ke(e),restartAgentFromUI:e=>un(e),saveSearchTool:e=>Ke(e),testSearchTool:e=>$e(e),saveBuiltinKey:e=>We(e),testBuiltinProvider:e=>qe(e),fetchBuiltinModels:(e,t)=>Qe(e,t),saveKey:e=>Ue(e),testKey:e=>Ve(e),fetchModels:(e,t)=>Je(e,t),toggleKeyVis:(e,t)=>Ge(e,t),toggleAgentBody:e=>D(e),deleteAgent:e=>te(e),saveAgentModel:e=>Q(e),saveAgentFallback:e=>Z(e),saveAgentVoice:e=>X(e),toggleEmojiPicker:e=>oe(e),saveAgentIdentity:e=>Y(e),saveAgentPrompt:e=>J(e),resetAgentSession:e=>ee(e),saveAgentTools:e=>W(e),applyToolPreset:e=>ne(e),setRoute:(e,t)=>z(e,t),saveOpenCodeConfig:e=>V(e),saveOpenCodeFallback:e=>$(e),saveCursorCliConfig:e=>U(e),saveClaudeCodeConfig:e=>K(e),saveCodexConfig:e=>G(e),saveGeminiCliConfig:e=>q(e),saveCrewCLIConfig:e=>re(e),"pm-toggle":e=>{var t;const n=null==(t=o.projects)?void 0:t.find(t=>t.id===e);n&&n.running?cn(e):dn(e)},"edit-roadmap":e=>{var t;const n=null==(t=o.projects)?void 0:t.find(t=>t.id===e);n&&ln(e,n.roadmapFile)},"retry-failed":e=>{var t;const n=null==(t=o.projects)?void 0:t.find(t=>t.id===e);n&&rn(n.roadmapFile)},"save-roadmap":e=>sn(e),"reset-failed":e=>an(e),showSettingsTab:e=>fo(e)};let Ao=!1;document.addEventListener("touchstart",e=>{if(!(e.target instanceof Element))return;e.target.closest("[data-action]")&&(Ao=!0,setTimeout(()=>{Ao=!1},500))},{passive:!0}),document.addEventListener("click",e=>{if(!(e.target instanceof Element))return;const t=e.target.closest("[data-action]");if(!t)return;if(Ao)return void e.preventDefault();e.stopPropagation();const n=t.dataset.action,o=jo[n];if(!o)return void console.warn("[crewswarm] unknown data-action:",n);const a=t.dataset.arg??null,s=t.dataset.arg2??null,i="1"===t.dataset.self;null!==a&&null!==s?o(a,s):null!==a&&i?o(a,t):null!==a?o(a):i?o(t):o()}),document.addEventListener("change",e=>{const t=e.target.closest("[data-onchange]");if(!t)return;const n=jo[t.dataset.onchange];if(!n)return;const o="this.value"===t.dataset.onchangeArg?t.value:null;null!==o?n(o):n()}),document.addEventListener("DOMContentLoaded",()=>{f("activeTasksPanel"),Ie();const e=document.getElementById("dashSelfLink");e&&(e.href=window.location.origin,e.textContent=window.location.host),document.querySelectorAll(".nav-item").forEach(e=>{e.addEventListener("click",t=>{t.preventDefault(),t.stopPropagation();const n=e.dataset.view;if(!n)return;if(Mn()!==n)return void(window.location.hash=n);const o=Po[n];o&&o()})});const t=document.getElementById("chatInput");t&&!t.dataset.boundChatComposer&&(t.dataset.boundChatComposer="1",t.addEventListener("keydown",Zn),t.addEventListener("input",Xn));const n=document.getElementById("chatSendBtn")||document.querySelector('[data-action="sendChat"]');n&&!n.dataset.boundChatComposer&&(n.dataset.boundChatComposer="1",n.addEventListener("click",e=>{e.preventDefault(),e.stopPropagation(),eo()}));const o=document.getElementById("cmdAllowlistInput");o&&o.addEventListener("keydown",e=>{"Enter"===e.key&&Vn()});const a=document.getElementById("waAllowedNumbers");a&&a.addEventListener("input",$t);const s=document.getElementById("skillSearch");s&&s.addEventListener("input",e=>we(e.target.value));const i=document.getElementById("passthroughEngine");i&&i.addEventListener("change",()=>{so(),function(){const e=document.getElementById("passthroughEngine"),t=document.getElementById("passthroughModel");if(!e||!t)return;const n=e.value,o={cursor:[{value:"",label:"— default (opus-4.6-thinking) —"},{optgroup:"Recommended (No Rate Limits)"},{value:"gemini-3-flash",label:"🟢 Gemini 3 Flash (fastest)"},{value:"gemini-3-pro",label:"🟢 Gemini 3 Pro"},{value:"gemini-3.1-pro",label:"🟢 Gemini 3.1 Pro"},{value:"gpt-5.2-codex",label:"🟢 GPT-5.2 Codex"},{value:"gpt-5.3-codex",label:"🟢 GPT-5.3 Codex"},{optgroup:"Claude Models (May Hit Rate Limits)"},{value:"sonnet-4.5",label:"🟡 Claude 4.5 Sonnet"},{value:"sonnet-4.6",label:"🟡 Claude 4.6 Sonnet (current)"},{value:"opus-4.5",label:"🟡 Claude 4.5 Opus"},{value:"opus-4.6",label:"🟡 Claude 4.6 Opus"},{optgroup:"Thinking Models (Slower)"},{value:"sonnet-4.5-thinking",label:"Claude 4.5 Sonnet Thinking"},{value:"opus-4.6-thinking",label:"Claude 4.6 Opus Thinking"},{optgroup:"Other"},{value:"grok",label:"xAI Grok"},{value:"kimi-k2.5",label:"Moonshot Kimi K2.5"}],claude:[{value:"",label:"— default (Sonnet 4.6) —"},{optgroup:"Recommended"},{value:"sonnet",label:"🟢 Sonnet (alias for latest)"},{value:"Default",label:"🟢 Default (Sonnet 4.6)"},{optgroup:"Specific Versions"},{value:"claude-sonnet-4-6",label:"Sonnet 4.6 · Best for everyday tasks"},{value:"Opus",label:"Opus (Opus 4.6) · Most capable for complex work"},{value:"claude-opus-4-6",label:"Opus 4.6 · Most capable"},{value:"Haiku",label:"Haiku (Haiku 4.5) · Fastest for quick answers"},{value:"claude-haiku-4-5",label:"Haiku 4.5 · Fastest"},{optgroup:"Legacy"},{value:"claude-sonnet-4-5",label:"Sonnet 4.5 (legacy)"}],codex:[{value:"",label:"— default (gpt-5.3-codex) —"},{optgroup:"Recommended"},{value:"gpt-5.3-codex",label:"🟢 GPT-5.3 Codex (current)"},{value:"gpt-5.2-codex",label:"🟢 GPT-5.2 Codex"},{optgroup:"Specialized"},{value:"gpt-5.1-codex-max",label:"GPT-5.1 Codex Max (deep reasoning)"},{value:"gpt-5.2",label:"GPT-5.2 (general purpose)"},{value:"gpt-5.1-codex-mini",label:"GPT-5.1 Codex Mini (fast & cheap)"}],opencode:[{value:"",label:"— default —"},{optgroup:"Free Models 🎁"},{value:"opencode/big-pickle",label:"🆓 Big Pickle (Free)"},{value:"opencode/minimax-m2.5-free",label:"🆓 MiniMax M2.5 Free"},{value:"openai/gpt-5-nano",label:"🆓 GPT 5 Nano (Free)"},{optgroup:"Budget Models 💰"},{value:"openai/gpt-5.1-codex-mini",label:"💰 GPT 5.1 Codex Mini ($0.25/$2)"},{value:"google/gemini-3-flash",label:"💰 Gemini 3 Flash ($0.50/$3)"},{value:"anthropic/claude-haiku-4-5",label:"💰 Claude Haiku 4.5 ($1/$5)"},{optgroup:"Interesting Models 🎯"},{value:"moonshot/kimi-k2.5",label:"Kimi K2.5 ($0.60/$3)"},{value:"moonshot/kimi-k2-thinking",label:"Kimi K2 Thinking ($0.40/$2.50)"},{value:"alibaba/qwen3-coder-480b",label:"Qwen3 Coder 480B ($0.45/$1.50)"},{value:"zhipu/glm-5",label:"GLM 5 ($1/$3.20)"},{optgroup:"Premium Claude"},{value:"anthropic/claude-sonnet-4-6",label:"Claude Sonnet 4.6 ($3/$15)"},{value:"anthropic/claude-opus-4-6",label:"Claude Opus 4.6 ($5/$25)"},{optgroup:"Premium OpenAI"},{value:"openai/gpt-5.3-codex",label:"GPT 5.3 Codex ($1.75/$14)"},{value:"openai/gpt-5.2-codex",label:"GPT 5.2 Codex ($1.75/$14)"},{value:"openai/gpt-5.1-codex-max",label:"GPT 5.1 Codex Max ($1.25/$10)"},{optgroup:"Premium Google"},{value:"google/gemini-3.1-pro",label:"Gemini 3.1 Pro ($2/$12)"},{value:"google/gemini-3-pro",label:"Gemini 3 Pro ($2/$12)"}],gemini:[{value:"",label:"— default (gemini-3-flash-preview) —"},{optgroup:"Recommended (Latest)"},{value:"gemini-3-flash-preview",label:"🟢 Gemini 3 Flash Preview (current)"},{value:"gemini-3.1-pro-preview",label:"🟢 Gemini 3.1 Pro Preview"},{optgroup:"Gemini 2.5 Series"},{value:"gemini-2.5-pro",label:"Gemini 2.5 Pro"},{value:"gemini-2.5-flash",label:"Gemini 2.5 Flash"},{value:"gemini-2.5-flash-lite",label:"Gemini 2.5 Flash Lite (fastest)"}]};if(!n||!o[n])return void(t.style.display="none");t.style.display="inline-block",t.innerHTML="";let a=null;for(const s of o[n])if(s.optgroup)a=document.createElement("optgroup"),a.label=s.optgroup,t.appendChild(a);else{const e=document.createElement("option");e.value=s.value,e.textContent=s.label,a?a.appendChild(e):t.appendChild(e)}}(),ro()});const r=document.getElementById("chatProjectSelect");r&&r.addEventListener("change",so);const l=document.getElementById("passthroughModel");l&&l.addEventListener("change",()=>{ro()})},{once:!0});const Po={chat:On,"swarm-chat":x,swarm:_e,rt:Me,build:Io,files:Fn,dlq:Le,projects:To,contacts:Ee,agents:O,models:ze,engines:yo,skills:me,"run-skills":pe,waves:()=>{An(),document.getElementById("wavesView").style.display="block",jn("navWaves")},workflows:I,benchmarks:wo,"tool-matrix":ko,memory:bo,"cli-process":xo,services:L,prompts:de,settings:vo};document.addEventListener("click",e=>{const t=e.target.closest("[data-view]");if(t){const e=t.dataset.view,n=Po[e];return void(n&&(Mn()!==e?window.location.hash=e:n()))}const n=e.target.closest("[data-stab]");if(n){const e=n.dataset.stab;window.location.hash=`settings/${e}`,fo(e)}const o=e.target.closest("[data-toggle-child]");if(o){const e=o.dataset.toggleChild,t=o.parentElement&&o.parentElement.querySelector(e);t&&(t.style.display="none"===t.style.display?"block":"none")}const a=e.target.closest("[data-toggle-sibling]");a&&a.nextElementSibling&&a.nextElementSibling.classList.toggle(a.dataset.toggleSibling)}),Object.assign(window,{addAllowlistPattern:Vn,applyNewAgentToolPreset:ie,applyPromptPreset:se,bulkSetRoute:ae,cancelSkillForm:ge,chatAtAtInput:Xn,chatKeydown:Zn,clearChatHistory:to,filterSkills:we,loadAllUsage:xn,loadBenchmarkLeaderboard:async()=>(await Tn()).loadBenchmarkLeaderboard(),loadBenchmarks:async()=>(await Tn()).loadBenchmarks(),loadBenchmarkTasks:async()=>(await Tn()).loadBenchmarkTasks(),onBenchmarkTaskSelect:async e=>(await Tn()).onBenchmarkTaskSelect(e),runBenchmarkTask:async()=>(await Tn()).runBenchmarkTask(),stopBenchmarkRun:async()=>(await Tn()).stopBenchmarkRun(),loadMemoryStats:j,searchMemory:S,migrateMemory:B,compactMemory:T,loadBuildProjectPicker:Zt,loadFiles:po,loadOcStats:qn,loadRunSkills:ue,loadServices:M,loadSpending:bn,loadTelegramSessions:Ht,loadTgMessages:Ft,loadToolMatrix:mn,loadWaMessages:_t,onBuildProjectChange:tn,onChatProjectChange:en,pickFolder:Pn,renderWaContactRows:$t,resetSpending:wn,approveSkill:async function(e){try{await fetch("/api/skills/approve",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({approvalId:e})}),i("Approved"),Eo()}catch(t){i("Failed: "+t.message,"error")}},loadPendingApprovals:Eo,rejectSkill:async function(e){try{await fetch("/api/skills/reject",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({approvalId:e})}),i("Rejected"),Eo()}catch(t){i("Failed: "+t.message,"error")}},saveGlobalCaps:yn,saveGlobalFallback:ct,saveBgConsciousnessModel:ht,saveOpencodeSettings:pt,saveRTToken:gt,saveSkill:he,saveTgConfig:Dt,saveWaConfig:Nt,sendChat:eo,sendTestWebhook:Co,showAgents:O,showBenchmarks:wo,showBuild:Io,showChat:On,showContacts:Ee,showDLQ:Le,showFiles:Fn,showModels:ze,showProjects:To,showRT:Me,showRunSkills:pe,showServices:L,showSettings:vo,showSettingsTab:fo,showSkills:me,showSwarm:_e,showToolMatrix:ko,showMemoryView:bo,startCrew:H,startTgBridge:Gt,startWaBridge:Ot,stopTgBridge:zt,stopWaBridge:Rt,toggleAddSkill:ye,toggleBgConsciousness:lt,toggleCursorWaves:rt,toggleClaudeCode:st,toggleEmojiPicker:oe,updateSkillAuthFields:Ce,navigateTo:So,renderStatusBadge:p,showLoading:d,showEmpty:c,showError:l,loadContacts:Be,applyContactFilters:Te,applyToolPreset:ne,closePreviewPane:uo,deleteAgent:te,deleteSkill:ke,editSkill:xe,fetchBuiltinModels:Qe,fetchModels:Je,previewFile:mo,resetAgentSession:ee,restartAgentFromUI:un,restartService:N,runSkillFromUI:be,saveAgentFallback:Z,saveAgentVoice:X,saveAgentIdentity:Y,saveAgentModel:Q,saveAgentPrompt:J,saveAgentTools:W,saveBuiltinKey:We,saveCursorCliConfig:U,saveClaudeCodeConfig:K,saveGeminiCliConfig:q,saveKey:Ue,saveOpenCodeConfig:V,saveOpenCodeFallback:$,saveSearchTool:Ke,saveCodexConfig:G,setRoute:z,stopService:_,testBuiltinProvider:qe,testKey:Ve,testSearchTool:$e,toggleAgentBody:D,toggleKeyVis:Ge});
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/tab-benchmarks-tab-BHjKCPm3.js","assets/core-utils-CmOkXgzi.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
var e,t,n;import{a as o,g as a,b as s,s as i,p as r,d as l,c,k as d,r as p,h as m,l as u,m as g,e as h}from"./core-utils-CmOkXgzi.js";import{c as v}from"./setup-wizard-CA0Or47w.js";import{i as f}from"./components-BS9fQjE_.js";import{s as y}from"./orchestration-Ca2DLWN-.js";import"./cli-process-COMRNPqr.js";import{i as w}from"./chat-core-Cx4sTxDd.js";import{i as b,s as x,h as k}from"./tab-swarm-chat-tab-BNrd88-r.js";import{i as C}from"./tab-waves-tab-SaJDkb4x.js";import{i as E,s as I}from"./tab-workflows-tab-B-soSy1k.js";import{c as T,m as B,s as S,l as j,a as A}from"./tab-memory-tab-Cu6u13EQ.js";import{i as P,s as L,l as M,a as _,r as N}from"./tab-services-tab-DU_LH3uG.js";import{i as R,s as O,l as F,a as H,t as D,b as z,c as G,d as $,e as V,f as q,g as K,h as U,j as W,k as J,m as Q,n as Y,o as X,p as Z,r as ee,q as te,u as ne,v as oe,w as ae,x as se,y as ie,z as re,A as le}from"./tab-agents-tab-BgpIsjkw.js";import{i as ce,a as de}from"./tab-prompts-tab-DVkUNaJd.js";import{s as pe,a as me,l as ue,c as ge,b as he,i as ve,t as fe,d as ye,f as we,r as be,e as xe,g as ke,u as Ce}from"./tab-skills-tab-BpY0uZHW.js";import{s as Ee,i as Ie,a as Te,l as Be}from"./tab-contacts-tab-DiOyMYth.js";import{i as Se,t as je,l as Ae,d as Pe}from"./tab-engines-tab-BsdZVvU0.js";import{s as Le,a as Me,b as _e,c as Ne,t as Re,d as Oe,r as Fe,i as He}from"./tab-swarm-tab-B1AcjL1W.js";import{i as De,s as ze,t as Ge,a as $e,b as Ve,c as qe,d as Ke,e as Ue,f as We,g as Je,h as Qe,j as Ye}from"./tab-models-tab-BLEjmd19.js";import{s as Xe,a as Ze,b as et,t as tt,c as nt,d as ot,e as at,f as st,g as it,h as rt,i as lt,j as ct,k as dt,l as pt,u as mt,m as ut,n as gt,o as ht,p as vt,q as ft,r as yt,v as wt,w as bt,x as xt,y as kt,z as Ct,A as Et,B as It,C as Tt,D as Bt,E as St,F as jt,G as At,H as Pt}from"./tab-settings-tab-Bn4nXtDe.js";import{i as Lt,s as Mt,l as _t,a as Nt,b as Rt,c as Ot,d as Ft,e as Ht,f as Dt,g as zt,h as Gt,r as $t,j as Vt}from"./tab-comms-tab-kguqTIzD.js";import{i as qt,p as Kt,r as Ut,c as Wt,a as Jt,b as Qt,e as Yt,d as Xt,l as Zt,o as en,f as tn,h as nn,j as on,k as an,m as sn,n as rn,q as ln,t as cn,v as dn,w as pn}from"./tab-projects-tab-DhNWnlzt.js";import{a as mn,r as un,c as gn,b as hn,l as vn,d as fn}from"./tab-usage-tab-BIOOnB-Y.js";import{s as yn,r as wn,l as bn,a as xn,b as kn}from"./tab-spending-tab-DEccQHnt.js";import{i as Cn}from"./tab-pm-loop-tab-Bfd449B4.js";!function(){const e=document.createElement("link").relList;if(!(e&&e.supports&&e.supports("modulepreload"))){for(const e of document.querySelectorAll('link[rel="modulepreload"]'))t(e);new MutationObserver(e=>{for(const n of e)if("childList"===n.type)for(const e of n.addedNodes)"LINK"===e.tagName&&"modulepreload"===e.rel&&t(e)}).observe(document,{childList:!0,subtree:!0})}function t(e){if(e.ep)return;e.ep=!0;const t=function(e){const t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),"use-credentials"===e.crossOrigin?t.credentials="include":"anonymous"===e.crossOrigin?t.credentials="omit":t.credentials="same-origin",t}(e);fetch(e.href,t)}}();const En={};let In=null;async function Tn(){return In||(In=await function(e,t){let n=Promise.resolve();if(t&&t.length>0){let e=function(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:"fulfilled",value:e}),e=>({status:"rejected",reason:e}))))};document.getElementsByTagName("link");const o=document.querySelector("meta[property=csp-nonce]"),a=(null==o?void 0:o.nonce)||(null==o?void 0:o.getAttribute("nonce"));n=e(t.map(e=>{if((e=function(e){return"/"+e}(e))in En)return;En[e]=!0;const t=e.endsWith(".css"),n=t?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${e}"]${n}`))return;const o=document.createElement("link");return o.rel=t?"stylesheet":"modulepreload",t||(o.as="script"),o.crossOrigin="",o.href=e,a&&o.setAttribute("nonce",a),document.head.appendChild(o),t?new Promise((t,n)=>{o.addEventListener("load",t),o.addEventListener("error",()=>n(new Error(`Unable to preload CSS for ${e}`)))}):void 0}))}function o(e){const t=new Event("vite:preloadError",{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return n.then(t=>{for(const e of t||[])"rejected"===e.status&&o(e.reason);return e().catch(o)})}(()=>import("./tab-benchmarks-tab-BHjKCPm3.js"),__vite__mapDeps([0,1]))),In}async function Bn(){try{const e=document.getElementById("statusDot");document.getElementById("status").textContent="online",e.className="status-dot online",await gn();const t=await a("/api/dlq"),n=document.getElementById("dlqBadge");t.length?(n.textContent=t.length,n.classList.remove("hidden")):n.classList.add("hidden")}catch(e){document.getElementById("status").textContent="error",document.getElementById("statusDot").className="status-dot error"}}async function Sn(){await Bn()}function jn(e){document.querySelectorAll(".nav-item").forEach(e=>e.classList.remove("active"));const t=document.getElementById(e);t&&t.classList.add("active")}function An(){u(o.activeTab),document.querySelectorAll(".view, .view-sessions").forEach(e=>{e.classList.remove("active"),e.style.display&&(e.style.display="")});const e=document.querySelector(".msg-bar");e&&(e.style.display="")}async function Pn(e){const t=document.getElementById(e),n=encodeURIComponent((null==t?void 0:t.value)||window._crewHome||""),o=await a("/api/pick-folder?default="+n).catch(()=>null);(null==o?void 0:o.path)&&t&&(t.value=o.path)}function Ln(){const e=(location.hash||"#chat").slice(1),t=(e.split("?")[0]||"chat").split("/");return{view:t[0]||"chat",subtab:t[1],raw:e}}function Mn(){return Ln().view}function _n(e){const t=e&&String(e).trim()&&"undefined"!==e?e:"general",n=`#chat?project=${encodeURIComponent(t)}`;location.hash!==n&&history.replaceState(null,"",n)}async function Nn(){try{const e=await a("/api/ui/active-project");return String((null==e?void 0:e.projectId)||"").trim()||"general"}catch{return"general"}}async function Rn(e){const t=e&&String(e).trim()&&"undefined"!==e?String(e).trim():"general";try{await r("/api/ui/active-project",{projectId:t})}catch{}}async function On(){An(),document.getElementById("chatView").classList.add("active"),jn("navChat"),o.activeTab="chat",s();const e=document.querySelector(".msg-bar");e&&(e.style.display="none"),y();const t=document.getElementById("chatMessages");"true"===(null==t?void 0:t.dataset.historyLoading)&&await Yn();const n=t&&"true"===t.dataset.historyLoaded&&t.children.length>0;try{const e=(await a("/api/projects")).projects||[];o.projectsData={},e.forEach(e=>{o.projectsData[e.id]=e}),s(),Kt(e)}catch(c){console.warn("Failed to refresh projects dropdown:",c)}const i=new URLSearchParams(window.location.hash.replace(/^#chat\?/,"")).get("project");if(i)o.chatActiveProjectId=i;else{const e=await Nn();try{o.chatActiveProjectId=e||localStorage.getItem("crewswarm_chat_active_project_id")||"general"}catch{o.chatActiveProjectId=e||"general"}}window.location.hash.includes("?project=")||_n(o.chatActiveProjectId),console.log("🔵 [INIT] Active project from URL:",o.chatActiveProjectId);const r=document.getElementById("chatProjectTabs");r&&Array.from(r.children).forEach(e=>{e.dataset.projectId===o.chatActiveProjectId?e.classList.add("active"):e.classList.remove("active")});const l=document.getElementById("chatProjectSelect");l&&o.chatActiveProjectId&&l.querySelector('option[value="'+o.chatActiveProjectId+'"]')&&(l.value=o.chatActiveProjectId),Rn(o.chatActiveProjectId),gn(),zn(),async function(){try{const e=((await a("/api/agents-config")).agents||[]).find(e=>"crew-lead"===e.id);if(!e)return;window._crewLeadInfo={emoji:e.emoji||"🧠",name:e.name||"crew-lead",theme:e.theme||""};const t=document.getElementById("chatAgentTitle"),n=document.getElementById("chatAgentSub");t&&(t.textContent=(e.emoji||"🧠")+" "+(e.name||"Crew Lead")),n&&e.theme&&(n.textContent=e.theme+" — chat naturally, dispatch tasks to the crew")}catch(c){}}(),window.loadChatAgentSelector&&window.loadChatAgentSelector(),n?m("chat"):await Qn()}function Fn(){An(),document.getElementById("filesView").classList.add("active"),jn("navFiles"),o.activeTab="files",s(),po()}function Hn(){return"owner"}P({hideAllViews:An,setNavActive:jn}),R({hideAllViews:An,setNavActive:jn,refreshAgents:F}),ce({hideAllViews:An,setNavActive:jn}),He({hideAllViews:An,setNavActive:jn}),C(),E({hideAllViews:An,setNavActive:jn});let Dn=null;function zn(){if(Dn)return;const e=`http://${window.location.hostname||"127.0.0.1"}:5010/events`;console.log("[crewswarm] Starting EventSource listener for",e),Dn=new EventSource(e);const t="undefined"!=typeof localStorage&&"1"===localStorage.getItem("crewswarm_debug_sse");Dn.onmessage=e=>{if(e.data)try{const a=JSON.parse(e.data),s=e=>e&&"general"!==e?e:"general",r="owner";t&&console.log("[crewswarm] SSE:",a.type,e.data.slice(0,120));const l=document.getElementById("chatMessages");if(k(a))return;if("chat_stream"===a.type&&a.sessionId===r){const e=s(a.projectId);if(s(o.chatActiveProjectId)!==e)return;let t=document.getElementById("streaming-bubble");if(!t){const e=document.createElement("div");e.id="streaming-wrapper",e.style.cssText="display:flex;flex-direction:column;align-items:flex-start;gap:4px;";const n=document.createElement("div");n.style.cssText="font-size:11px;color:var(--text-3);padding:0 6px;";const o=window._crewLeadInfo||{emoji:"🧠",name:"crew-lead"};n.textContent=o.emoji+" "+o.name+" (streaming...)",t=document.createElement("div"),t.id="streaming-bubble",t.className="chat-bubble assistant",t.style.cssText="max-width:80%;padding:10px 14px;border-radius:14px 14px 14px 4px;background:var(--surface-2);color:var(--text-2);font-size:14px;line-height:1.5;white-space:pre-wrap;word-break:break-word;border:1px solid var(--border);",t._textNode=document.createTextNode(""),t.appendChild(t._textNode),e.appendChild(n),e.appendChild(t),l&&l.appendChild(e)}const n=(t.dataset.streamChunk||"")+a.token;return t.dataset.streamChunk=n,void(t._rafId||(t._rafId=requestAnimationFrame(()=>{const e=t.dataset.streamChunk||"";e&&(t._textNode||(t._textNode=document.createTextNode(""),t.appendChild(t._textNode)),t._textNode.textContent+=e,t.dataset.streamChunk=""),l&&(l.scrollTop=l.scrollHeight),t._rafId=null})))}if("draft_discarded"===a.type&&a.draftId){const e=document.querySelector('[data-draft-id="'+a.draftId+'"]');return void(e&&e.remove())}if("context_warning"===a.type&&"owner"===a.sessionId){const e=document.getElementById("contextWarningBanner");e&&e.remove();const t=document.createElement("div");t.id="contextWarningBanner";const n="critical"===a.level;t.style.cssText=`display:flex;align-items:center;gap:10px;padding:8px 14px;border-radius:8px;margin:6px 0;font-size:12px;background:${n?"rgba(239,68,68,0.1)":"rgba(245,158,11,0.1)"};border:1px solid ${n?"rgba(239,68,68,0.3)":"rgba(245,158,11,0.3)"};color:${n?"#f87171":"#f59e0b"};`,t.innerHTML=`<span style="flex:1;">${a.message}</span><button onclick="clearChatHistory()" style="padding:2px 8px;font-size:11px;border-radius:4px;border:1px solid currentColor;background:transparent;color:inherit;cursor:pointer;">Clear now</button><button onclick="this.parentElement.remove()" style="background:none;border:none;cursor:pointer;color:inherit;font-size:14px;padding:0 2px;">✕</button>`;const o=document.getElementById("chatMessages");return void(o&&(o.appendChild(t),o.scrollTop=o.scrollHeight))}if("chat_message"===a.type&&"owner"===a.sessionId){const e=s(o.chatActiveProjectId),t=s(a.projectId);if(e!==t)return void console.log("[crewswarm] ❌ SKIP - projectId mismatch:",{current:e||"(General)",message:t||"(General)"});if(console.log("[crewswarm] ✅ Displaying message for current session"),"user"===a.role){if(a.content===Jn)return console.log("[crewswarm] Skipping SSE echo of locally-sent message"),void(Jn=null);a.content!==Wn?(console.log("[crewswarm] Appending user bubble:",a.content.slice(0,50)),g("user",a.content),Wn=a.content):console.log("[crewswarm] Skipping duplicate user message")}else if("assistant"===a.role){document.querySelectorAll('[id^="typing-"]').forEach(e=>e.remove());const e=String(a.content||"").trim();if(e&&function(e){if(!e)return"";for(let t=e.children.length-1;t>=0;t--){const n=e.children[t];if("streaming-wrapper"!==n.id&&!(n.children.length<2)&&String(n.style.alignItems||"").includes("flex-start"))return(n.children[1].textContent||"").trim()}return""}(l)===e)return Un=a.content,void(l&&(l.scrollTop=l.scrollHeight));const t=document.getElementById("streaming-wrapper"),n=document.getElementById("streaming-bubble");if(n){n._rafId&&cancelAnimationFrame(n._rafId),n._rafId=null;const e=n.dataset.streamChunk||"";e&&(n._textNode||(n._textNode=document.createTextNode(""),n.appendChild(n._textNode)),n._textNode.textContent+=e,n.dataset.streamChunk="")}if(t&&n){const e=window._crewLeadInfo||{emoji:"🧠",name:"crew-lead"},o=t.firstElementChild;o&&o!==n&&(o.textContent=e.emoji+" "+e.name);const s=a.content??"";n._textNode?n._textNode.textContent=s:n.textContent=s,t.removeAttribute("id"),n.removeAttribute("id"),delete n.dataset.streamChunk,Un=a.content}else{t&&t.remove();const e=a.content===Un&&function(e,t){if(!e||null==t)return!1;const n=String(t).trim();if(!n)return!1;for(let o=e.children.length-1;o>=0;o--){const t=e.children[o];if("streaming-wrapper"!==t.id&&(!(t.children.length<2)&&String(t.style.alignItems||"").includes("flex-start")&&(t.children[1].textContent||"").trim()===n))return!0}return!1}(l,a.content);e?console.log("[crewswarm] Skipping duplicate assistant message"):(console.log("[crewswarm] Appending assistant bubble (final)"),g("assistant",a.content,a.fallbackModel,a.fallbackReason,a.model,a.engineUsed),Un=a.content)}}return void(l&&(l.scrollTop=l.scrollHeight))}if("pending_project"===a.type&&"owner"===a.sessionId&&a.pendingProject&&l)return Kn(l,a.pendingProject),void(l.scrollTop=l.scrollHeight);if("agent_working"===a.type&&a.agent){const e=document.getElementById("coding-dot-"+a.agent);e&&(e.style.display="inline-flex")}if("agent_idle"===a.type&&a.agent){const e=document.getElementById("coding-dot-"+a.agent);e&&(e.style.display="none")}if("opencode_event"===a.type){const e=document.getElementById("ocFeed"),t=document.getElementById("ocFeedDot");if(!e)return;t&&(t.style.display="inline-block");const o=document.createElement("div");o.style.cssText="display:flex;align-items:center;gap:8px;padding:5px 10px;border-radius:8px;background:var(--bg-2);font-size:12px;font-family:var(--font-mono,monospace);animation:fadeIn .25s ease;";const s=new Date(a.ts||Date.now()).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit"});let i="⚙️",r="";if("session_start"===a.kind){i="▶",o.style.borderLeft="3px solid var(--green-hi)";var n=a.dir||"";r="session started"+(n?" — "+n.split("/").pop():"")}else if("session_end"===a.kind)i="■",o.style.borderLeft="3px solid var(--text-3)",r="session ended",t&&(t.style.display="none");else if("file_edit"===a.kind)i="✏️",o.style.borderLeft="3px solid var(--amber)",r=(a.file||a.path||"")+(a.extra?' <span style="opacity:.5;">'+a.extra+"</span>":"");else if("error"===a.kind)i="✗",o.style.borderLeft="3px solid var(--red-hi)",o.style.color="var(--red-hi)",r=a.message||"error";else if("tool"===a.kind){const e={read_file:"var(--accent)",write_file:"var(--amber)",bash:"var(--purple)",list_directory:"var(--green)",grep:"var(--green)"}[a.tool]||"var(--text-2)";i="done"===a.phase?"✓":"→",o.style.borderLeft="3px solid "+e,o.style.color="done"===a.phase?"var(--text-2)":"var(--text-1)",r='<span style="color:'+e+';font-weight:600;">'+(a.tool||"")+"</span>"+(a.label?' <span style="opacity:.6;">'+a.label+"</span>":"")}for(o.innerHTML='<span style="opacity:.4;flex-shrink:0;">'+s+'</span><span style="flex-shrink:0;">'+i+'</span><span style="flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;">'+r+"</span>",e.appendChild(o);e.children.length>80;)e.removeChild(e.firstChild);return void(e.scrollTop=e.scrollHeight)}if("agent_working"===a.type&&a.agent){const e="agent-spinner-"+(a.taskId||a.agent);if(l&&!document.getElementById(e)){const t=document.createElement("div");t.id=e,t.className="msg a",t.style.cssText="opacity:.7; font-style:italic;",t.innerHTML='<div class="meta"><strong>'+a.agent+'</strong> · working…</div><div class="t" style="display:flex;align-items:center;gap:8px;"><span style="display:inline-block;width:8px;height:8px;border-radius:50%;background:var(--accent);animation:pulse 1s ease-in-out infinite;"></span>Processing task…</div>',l.appendChild(t),l.scrollTop=l.scrollHeight}return}if("agent_reply"===a.type||a.from&&a.content){if(!a.from||!a.content)return;if(a._passthroughSummary)return;const e="agent-spinner-"+(a.taskId||a.from),t=document.getElementById(e);t&&t.remove();const n=document.getElementById("agent-spinner-"+a.from);return n&&n.remove(),g("🤖 "+a.from,a.content,!1,null,null,a.engineUsed),l&&(l.scrollTop=l.scrollHeight),void i(a.from+" finished a task")}if("task.timeout"===a.type&&a.agent){const e="agent-spinner-"+(a.taskId||a.agent),t=document.getElementById(e);t&&t.remove();const n=document.getElementById("agent-spinner-"+a.agent);n&&n.remove();const o="[crew-lead] Task to "+a.agent+" timed out (no reply in 90s). Consider @@SERVICE restart "+a.agent+" or re-dispatch to another agent.";if(l){const e=document.createElement("div");e.className="msg a",e.style.cssText="opacity:.85; font-style:italic; color:var(--text-3);",e.innerHTML='<div class="meta"><strong>'+a.agent+'</strong> · no reply</div><div class="t">'+h(o)+"</div>",l.appendChild(e),l.scrollTop=l.scrollHeight}return void i("Task to "+a.agent+" timed out")}if("pipeline_progress"===a.type){let e;e=a.agents?"Wave "+(a.waveIndex+1)+"/"+a.totalWaves+" → "+a.agents.join(" + "):"Step "+(a.stepIndex+1)+"/"+a.total+" → "+a.agent;const t=document.createElement("div");return t.style.cssText="font-size:11px;color:var(--text-3);padding:2px 8px;margin:2px 0;",t.textContent="↳ "+e,void(l&&(l.appendChild(t),l.scrollTop=l.scrollHeight))}if("pipeline_quality_gate"===a.type){const e=document.createElement("div"),t=a.willRetry?" — retrying wave":" — advancing anyway";return e.style.cssText="font-size:11px;color:var(--warning, #e8a030);padding:2px 8px;margin:2px 0;",e.textContent="⚠️ Wave "+(a.waveIndex+1)+" quality gate: "+(a.issues||[]).join("; ")+t,void(l&&(l.appendChild(e),l.scrollTop=l.scrollHeight))}if("project_launched"===a.type&&a.project){const e=a.project.projectId||a.project.id;return void setTimeout(async()=>{await Xt(),e&&pn(e);const t=document.getElementById("chatMessages");if(t){const n=document.createElement("div");n.style.cssText="font-size:11px;color:var(--green);padding:2px 8px;margin:2px 0;",n.textContent='📁 Project "'+(a.project.name||e)+'" registered — selected in chat',t.appendChild(n),t.scrollTop=t.scrollHeight}},800)}if("pipeline_done"===a.type){const e=document.createElement("div");return e.style.cssText="font-size:11px;color:var(--green);padding:2px 8px;margin:2px 0;",e.textContent="✅ Pipeline complete",void(l&&(l.appendChild(e),l.scrollTop=l.scrollHeight))}if("confirm_run_cmd"===a.type&&a.approvalId)return void function(e,t,n){if(document.getElementById("cmd-approval-"+e))return;const o=document.createElement("div");o.id="cmd-approval-"+e,o.style.cssText=["position:fixed;bottom:80px;right:24px;z-index:9999;","background:var(--bg-card);border:1px solid var(--border);border-radius:12px;","padding:16px 20px;max-width:440px;box-shadow:0 8px 32px rgba(0,0,0,.4);","display:flex;flex-direction:column;gap:10px;"].join("");const a=document.createElement("div");a.style.cssText="font-size:13px;font-weight:600;color:var(--text-1);",a.textContent="🔐 "+t+" wants to run a command";const s=document.createElement("code");s.style.cssText="display:block;font-size:12px;color:var(--accent);background:var(--bg-1);padding:6px 10px;border-radius:6px;word-break:break-all;",s.textContent=n;const r=document.createElement("label");r.style.cssText="display:flex;align-items:center;gap:8px;font-size:12px;color:var(--text-2);cursor:pointer;";const l=document.createElement("input");l.type="checkbox",l.style.cssText="width:14px;height:14px;cursor:pointer;accent-color:var(--green);";const c=n.trim().split(/\s+/)[0]+" *";r.appendChild(l),r.appendChild(document.createTextNode("Always allow "));const d=document.createElement("code");d.style.cssText="font-size:11px;background:var(--bg-1);padding:2px 6px;border-radius:4px;color:var(--accent);",d.textContent=c,r.appendChild(d);const p=document.createElement("div");p.style.cssText="font-size:11px;color:var(--text-3);";let m=60;p.textContent="Auto-reject in "+m+"s";const u=setInterval(()=>{m--,p.textContent="Auto-reject in "+m+"s",m<=0&&(clearInterval(u),o.remove())},1e3),g=document.createElement("div");g.style.cssText="display:flex;gap:8px;";const h=document.createElement("button");h.textContent="✅ Allow",h.style.cssText="flex:1;padding:8px;border-radius:8px;border:none;background:var(--green);color:#fff;cursor:pointer;font-weight:600;font-size:13px;",h.onclick=async()=>{clearInterval(u),o.remove(),l.checked&&(await fetch("/api/cmd-allowlist",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({pattern:c})}),i("Allowlisted: "+c)),await fetch("/api/cmd-approve",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({approvalId:e})}).catch(e=>i("Approve failed: "+e.message,!0)),l.checked||i(t+": command approved")};const v=document.createElement("button");v.textContent="⛔ Deny",v.style.cssText="flex:1;padding:8px;border-radius:8px;border:none;background:var(--red-hi);color:#fff;cursor:pointer;font-weight:600;font-size:13px;",v.onclick=async()=>{clearInterval(u),o.remove(),await fetch("/api/cmd-reject",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({approvalId:e})}).catch(e=>i("Reject failed: "+e.message,!0)),i(t+": command denied")},g.appendChild(h),g.appendChild(v),o.appendChild(a),o.appendChild(s),o.appendChild(r),o.appendChild(p),o.appendChild(g),document.body.appendChild(o)}(a.approvalId,a.agent,a.cmd);if("telemetry"===a.type&&a.payload){window._telemetryEvents=window._telemetryEvents||[],window._telemetryEvents.push(a.payload),window._telemetryEvents.length>100&&window._telemetryEvents.shift();const e=document.getElementById("toolMatrixView");e&&e.classList.contains("active")&&fn(window._telemetryEvents)}}catch{}else console.warn("[crewswarm] SSE message with null/empty data")},Dn.onopen=()=>{console.log("[crewswarm] SSE connection opened"),window._sseReconnectDelay=2e3},Dn.onerror=e=>{console.error("[crewswarm] SSE error:",e),Dn.close(),Dn=null,window._sseReconnectTimer&&clearTimeout(window._sseReconnectTimer),window._sseReconnectTimer=setTimeout(()=>{window._sseReconnectTimer=null,window._sseReconnectDelay=Math.min(2*(window._sseReconnectDelay||2e3),3e4),zn()},window._sseReconnectDelay||2e3)}}const Gn=[{label:"npm",pattern:"npm *",desc:"install, run, build, test…"},{label:"node",pattern:"node *",desc:"run any node script"},{label:"python",pattern:"python *",desc:"python / python3 scripts"},{label:"pip",pattern:"pip *",desc:"pip install packages"},{label:"git",pattern:"git *",desc:"all git operations"},{label:"cursor",pattern:"cursor *",desc:"open files in Cursor"},{label:"make",pattern:"make *",desc:"Makefile targets"},{label:"yarn",pattern:"yarn *",desc:"yarn install / build / run"},{label:"pnpm",pattern:"pnpm *",desc:"pnpm package manager"},{label:"ls / cat / echo",pattern:"ls *",desc:"read-only shell utilities"}];async function $n(){const e=document.getElementById("cmdAllowlistItems"),t=document.getElementById("cmdPresets");if(!e)return;const n=(await a("/api/cmd-allowlist").catch(()=>({list:[]}))).list||[];t&&(t.innerHTML="",Gn.forEach(function(e){const o=n.includes(e.pattern),a=document.createElement("label");a.style.cssText="display:flex;align-items:center;gap:8px;cursor:pointer;padding:4px 6px;border-radius:6px;transition:background 0.1s;",a.onmouseover=function(){a.style.background="var(--bg-hover)"},a.onmouseout=function(){a.style.background=""};const s=document.createElement("input");s.type="checkbox",s.checked=o,s.style.cssText="width:14px;height:14px;cursor:pointer;accent-color:var(--green);flex-shrink:0;",s.onchange=async function(){s.checked?await fetch("/api/cmd-allowlist",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({pattern:e.pattern})}).catch(e=>i("Failed to add pattern: "+e.message,!0)):await fetch("/api/cmd-allowlist",{method:"DELETE",headers:{"content-type":"application/json"},body:JSON.stringify({pattern:e.pattern})}).catch(e=>i("Failed to remove pattern: "+e.message,!0)),$n()};const r=document.createElement("code");r.style.cssText="font-size:12px;color:var(--accent);min-width:90px;",r.textContent=e.pattern;const l=document.createElement("span");l.style.cssText="font-size:11px;color:var(--text-3);",l.textContent=e.desc,a.appendChild(s),a.appendChild(r),a.appendChild(l),t.appendChild(a)}));const o=new Set(Gn.map(function(e){return e.pattern})),s=t?n.filter(function(e){return!o.has(e)}):n;if(e.innerHTML="",s.length)for(const a of s){const t=document.createElement("div");t.style.cssText="display:flex;align-items:center;gap:8px;padding:5px 0;border-bottom:1px solid var(--border);";const n=document.createElement("code");n.style.cssText="flex:1;font-size:12px;color:var(--accent);",n.textContent=a;const o=document.createElement("button");o.textContent="✕",o.style.cssText="border:none;background:transparent;color:var(--text-3);cursor:pointer;font-size:14px;padding:0 4px;",o.title="Remove",o.onclick=async function(){await fetch("/api/cmd-allowlist",{method:"DELETE",headers:{"content-type":"application/json"},body:JSON.stringify({pattern:a})}).catch(e=>i("Failed to delete pattern: "+e.message,!0)),$n()},t.appendChild(n),t.appendChild(o),e.appendChild(t)}else e.innerHTML='<div style="color:var(--text-3);font-size:12px;padding:4px 0;">'+(t?"No custom patterns yet.":"No patterns yet.")+"</div>"}async function Vn(){const e=document.getElementById("cmdAllowlistInput"),t=e?e.value.trim():"";t&&(await fetch("/api/cmd-allowlist",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({pattern:t})}).catch(e=>i("Failed to add pattern: "+e.message,!0)),e.value="",$n())}window._telemetryEvents=window._telemetryEvents||[];const qn=()=>vn(kn);function Kn(e,{draftId:t,name:n,outputDir:o,roadmapMd:a}){function s(e){return(e.match(/^- \[ \]/gm)||[]).length}const i=document.createElement("div");i.setAttribute("data-draft-id",t),i.style.cssText="width:100%;display:flex;flex-direction:column;gap:4px;";const l=document.createElement("div");l.style.cssText="font-size:11px;color:var(--text-3);padding:0 6px;",l.textContent="🗺️ Roadmap draft — review before building";const c=document.createElement("div");c.style.cssText="width:100%;border:1px solid var(--border);border-radius:12px;overflow:hidden;background:var(--bg-card);";const d=document.createElement("div");d.style.cssText="background:var(--bg-card2);padding:10px 14px;display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid var(--border);",d.innerHTML='<div><div style="font-size:13px;font-weight:600;color:var(--accent);">🚀 '+n+'</div><div style="font-size:11px;color:var(--blue);margin-top:2px;">'+o+'</div></div><span style="font-size:10px;color:var(--text-3);padding:2px 7px;background:var(--bg-card2);border-radius:10px;" class="task-count">'+s(a)+" tasks</span>";const p=document.createElement("textarea");p.value=a,p.spellcheck=!1,p.style.cssText="width:100%;background:var(--bg-card);border:none;outline:none;color:var(--text-1);font-size:11.5px;font-family:SF Mono,Monaco,Menlo,monospace;line-height:1.6;padding:12px 14px;resize:none;min-height:160px;max-height:320px;display:block;",setTimeout(()=>{p.style.height="",p.style.height=Math.min(p.scrollHeight,320)+"px"},50),p.addEventListener("input",()=>{p.style.height="",p.style.height=Math.min(p.scrollHeight,320)+"px",d.querySelector(".task-count").textContent=s(p.value)+" tasks"});const m=document.createElement("div");m.style.cssText="display:flex;gap:8px;align-items:center;padding:10px 14px 12px;border-top:1px solid var(--border);background:var(--bg-card2);";const u=document.createElement("button");u.textContent="▶ Start Building",u.style.cssText="background:var(--green-hi);color:#000;border:none;border-radius:8px;padding:8px 16px;font-size:12px;font-weight:700;cursor:pointer;",u.onclick=async()=>{u.disabled=!0,u.textContent="⏳ Launching…";try{const e=await r("/api/crew-lead/confirm-project",{draftId:t,roadmapMd:p.value});e.ok?(c.innerHTML='<div style="padding:14px;color:var(--green-hi);font-size:13px;font-weight:600;">✅ '+n+' — project created, PM loop running!<br><span style="color:var(--blue);font-size:11px;font-weight:400">'+(e.outputDir||o)+"</span></div>",g("assistant","🚀 "+n+" is building. Check the Projects tab to watch progress.")):(u.disabled=!1,u.textContent="▶ Start Building",v.textContent="⚠️ "+(e.error||"Launch failed"))}catch(e){u.disabled=!1,u.textContent="▶ Start Building",v.textContent="⚠️ "+e.message}};const h=document.createElement("button");h.textContent="Discard",h.style.cssText="background:none;border:1px solid var(--border);color:var(--text-3);border-radius:8px;padding:8px 14px;font-size:12px;cursor:pointer;",h.onclick=async()=>{await r("/api/crew-lead/discard-project",{draftId:t}).catch(()=>{}),i.remove()};const v=document.createElement("span");v.style.cssText="font-size:11px;color:var(--blue);margin-left:auto;",v.textContent="Edit above, then confirm",m.appendChild(u),m.appendChild(h),m.appendChild(v),c.appendChild(d),c.appendChild(p),c.appendChild(m),i.appendChild(l),i.appendChild(c),e.appendChild(i),e.scrollTop=e.scrollHeight}let Un="",Wn="",Jn=null;const{loadChatHistory:Qn,waitForChatHistoryIdle:Yn,chatAtAtInput:Xn,chatKeydown:Zn,sendChat:eo,clearChatHistory:to,stopAll:no,killAll:oo,killPassthrough:ao,refreshSessionIndicator:so,clearPassthroughSession:io,resetSendButton:ro,handleImageUpload:lo,toggleVoiceRecording:co}=w({postJSON:r,getJSON:a,appendChatBubble:g,showNotification:i,state:o,getChatSessionId:()=>"owner",getChatActiveProjectId:()=>o.chatActiveProjectId,getCrewLeadInfo:()=>window._crewLeadInfo,appendRoadmapCard:Kn,getLastAppendedAssistantContent:()=>Un,setLastAppendedAssistantContent:e=>{Un=e},setLastAppendedUserContent:e=>{Wn=e},setLastSentContent:e=>{Jn=e}});async function po(e){const t=document.getElementById("filesContent"),n=document.getElementById("filesDir").value.trim()||window._crewCwd||(window._crewHome?window._crewHome+"/CrewSwarm":"");d(t,"Scanning "+n+"...");try{const e=await a("/api/files?dir="+encodeURIComponent(n));if(!e.files||!e.files.length)return void c(t,"No files found in "+n);const o={};e.files.forEach(e=>{const t=e.path.split(".").pop().toLowerCase()||"other";o[t]||(o[t]=[]),o[t].push(e)});const s=["html","css","js","mjs","ts","json","md","sh","txt","other"],i={html:"🌐",css:"🎨",js:"⚡",mjs:"⚡",ts:"🔷",json:"📋",md:"📝",sh:"🖥️",txt:"📄",other:"📁"};let r='<div style="display:grid;gap:1rem;padding:4px 0;">';for(const t of s)o[t]&&(r+="<div>",r+='<div style="font-size:11px;font-weight:600;color:var(--text-2);text-transform:uppercase;letter-spacing:0.08em;margin-bottom:8px;padding-left:2px;">'+(i[t]||"📁")+" ."+t+" — "+o[t].length+" file"+(o[t].length>1?"s":"")+"</div>",r+='<div style="display:grid;gap:6px;">',o[t].sort((e,t)=>t.mtime-e.mtime).forEach(e=>{const t=e.path.replace(n+"/",""),o=go(e.mtime),a=ho(e.size);r+='<div class="file-row">',r+='<div class="file-info"><span class="file-name">'+t+'</span><span class="file-meta">'+a+" · "+o+"</span></div>",r+='<div class="file-actions">',r+='<a href="cursor://file/'+e.path+'" class="file-btn file-btn-cursor" title="Open in Cursor">Cursor</a>',r+='<a href="opencode://open?path='+encodeURIComponent(e.path)+'" class="file-btn file-btn-opencode" title="Open in OpenCode">OpenCode</a>',r+='<button data-action="previewFile" data-arg=\''+e.path.replace(/'/g,"'")+'\' data-self="1" class="file-btn" title="Preview">👁</button>',r+="</div></div>"}),r+="</div></div>");r+="</div>",r+='<div id="file-preview-pane" style="display:none;margin-top:1rem;background:#0d1117;border:1px solid var(--border);border-radius:8px;overflow:hidden;"><div id="file-preview-bar" style="display:flex;align-items:center;gap:8px;padding:8px 12px;background:#0d1420;border-bottom:1px solid var(--border);font-size:12px;color:var(--text-2);"><span id="file-preview-name"></span><button data-action="closePreviewPane" style="margin-left:auto;background:none;border:none;color:var(--text-2);cursor:pointer;">✕</button></div><pre id="file-preview-content" style="margin:0;padding:1rem;font-size:0.75rem;overflow:auto;max-height:400px;"></pre></div>',t.innerHTML=r}catch(o){l(t,"Error: "+o.message)}}async function mo(e,t){const n=document.getElementById("file-preview-pane"),o=document.getElementById("file-preview-content"),s=document.getElementById("file-preview-name");if(n){s.textContent=e.split("/").pop(),o.textContent="Loading...",n.style.display="block",n.scrollIntoView({behavior:"smooth",block:"nearest"});try{const t=await a("/api/file-content?path="+encodeURIComponent(e));o.textContent=t.content||"(empty)"}catch(i){o.textContent="Error: "+i.message}}}function uo(){const e=document.getElementById("file-preview-pane");e&&(e.style.display="none")}function go(e){const t=Date.now()-e,n=Math.floor(t/6e4);if(n<1)return"just now";if(n<60)return n+"m ago";const o=Math.floor(n/60);return o<24?o+"h ago":Math.floor(o/24)+"d ago"}function ho(e){return e<1024?e+"B":e<1048576?(e/1024).toFixed(1)+"KB":(e/1024/1024).toFixed(1)+"MB"}function vo(){An(),document.getElementById("settingsView").classList.add("active"),jn("navSettings"),o.activeTab="settings",s();const e=(location.hash||"").replace("#settings/",""),t={system:"engines",telegram:"comms",whatsapp:"comms"}[e]||e;fo(["usage","engines","comms","security","webhooks"].includes(t)?t:"usage")}function fo(e){var t;["usage","engines","comms","security","webhooks"].forEach(t=>{const n=document.getElementById("stab-panel-"+t),o=document.getElementById("stab-"+t);n&&o&&(n.style.display=t===e?"usage"===t?"grid":"block":"none",o.classList.toggle("active",t===e))}),"usage"===e&&(hn(),xn()),"engines"===e&&(vt(),ft(),yt(),wt(),bt(),xt(),kt(),Ct(),Et(),It(),Tt(),Bt(),St(),jt()),"comms"===e&&Vt(),"security"===e&&($n(),At()),(null==(t=document.getElementById("settingsView"))?void 0:t.classList.contains("active"))&&history.replaceState(null,"","#settings/"+e)}function yo(){An(),document.getElementById("enginesView").classList.add("active"),jn("navEngines"),Ae()}null==(e=document.getElementById("attachImageBtn"))||e.addEventListener("click",()=>{document.getElementById("imageUpload").click()}),null==(t=document.getElementById("imageUpload"))||t.addEventListener("change",lo),null==(n=document.getElementById("recordVoiceBtn"))||n.addEventListener("click",co),window.loadChatHistory=Qn,window.getChatSessionId=Hn,window.selectProjectTab=e=>{const t=e&&String(e).trim()&&"undefined"!==e?e:"general",n=o.chatActiveProjectId;console.log("🔵 [TAB CLICK] START",t,"- from:",n);const a=document.getElementById("chatProjectTabs");if(!a)return void console.error("🔵 [TAB CLICK] ERROR: chatProjectTabs container not found!");if(n===t)return void console.log("🔵 [TAB CLICK] Already on this tab, skipping reload");_n(t),Array.from(a.children).forEach(e=>{e.classList.remove("active")});const s=Array.from(a.children).find(e=>e.dataset.projectId===t);s&&s.classList.add("active"),o.chatActiveProjectId=t;try{localStorage.setItem("crewswarm_chat_active_project_id",t)}catch{}Rn(t),console.log("🔵 [TAB CLICK] Updated state:",{projectId:o.chatActiveProjectId,sessionId:"owner",url:window.location.hash}),console.log("🔵 [TAB CLICK] Calling loadChatHistory()..."),Qn().then(()=>{console.log("🔵 [TAB CLICK] loadChatHistory() completed");const e=document.getElementById("chatMessages");console.log("🔵 [TAB CLICK] Messages in DOM:",(null==e?void 0:e.children.length)||0)}).catch(e=>{console.error("🔵 [TAB CLICK] loadChatHistory() ERROR:",e)})},window.addEventListener("focus",()=>{(async function(){if("chat"!==Ln().view)return;const e=await Nn(),t=e&&"undefined"!==e?e:"general";t!==(o.chatActiveProjectId&&"undefined"!==o.chatActiveProjectId?o.chatActiveProjectId:"general")&&window.selectProjectTab&&window.selectProjectTab(t)})().catch(()=>{})}),Lt({showSettings:vo,showSettingsTab:fo}),Pt({getModels:F,populateModelDropdown:le}),Ye({hideAllViews:An,setNavActive:jn,loadAgents:F}),De(),b({hideAllViews:An,setNavActive:jn});const wo=async()=>{const{showBenchmarks:e}=await Tn();e({hideAllViews:An,setNavActive:jn})};function bo(){An(),document.getElementById("memoryView").classList.add("active"),jn("navMemory"),A()}function xo(){An(),document.getElementById("cliProcessView").classList.add("active"),jn("navCLI"),window.initCLIProcess&&window.initCLIProcess()}function ko(){An(),document.getElementById("toolMatrixView").classList.add("active"),jn("navToolMatrix"),mn()}async function Co(){const e=document.getElementById("webhookChannel").value.trim()||"test";let t={};try{const e=document.getElementById("webhookPayload").value.trim();e&&(t=JSON.parse(e))}catch{t={raw:document.getElementById("webhookPayload").value}}const n=document.getElementById("webhookTestResult");try{const o=await fetch("/proxy-webhook/"+e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}),a=await o.json();n.textContent=a.ok?"✅ Sent to RT bus":"❌ "+(a.error||"failed"),n.style.color=a.ok?"var(--green)":"var(--red)"}catch(o){n.textContent="❌ "+o.message,n.style.color="var(--red)"}}async function Eo(){document.getElementById("pendingApprovals").innerHTML='<div style="color:var(--text-3);font-size:12px;">Pending skill approvals appear here when an agent triggers a skill marked requiresApproval. You will also receive a Telegram notification with inline Approve/Reject buttons if Telegram is configured.</div>'}function Io(){on({hideAllViews:An,setNavActive:jn})}function To(){nn({hideAllViews:An,setNavActive:jn})}qt({showChat:On,showBuild:Io}),Bn(),setInterval(Bn,3e4),(async()=>{try{const e=(await a("/api/projects")).projects||[];o.projectsData={},e.forEach(e=>{o.projectsData[e.id]=e}),Kt(e),s(),"#projects"===location.hash&&To()}catch{}})(),document.getElementById("refreshBtn").onclick=Sn,document.getElementById("runBuildBtn").onclick=Ut,document.getElementById("continuousBuildBtn").onclick=Wt,document.getElementById("stopBuildBtn").onclick=Jt,document.getElementById("stopContinuousBtn").onclick=Qt,document.getElementById("enhancePromptBtn").onclick=Yt,Cn(),document.getElementById("newProjectBtn").onclick=()=>{const e=document.getElementById("newProjectForm");e.style.display="none"===e.style.display?"block":"none"},document.getElementById("npCancelBtn").onclick=()=>{document.getElementById("newProjectForm").style.display="none"},document.getElementById("npCreateBtn").onclick=async()=>{const e=document.getElementById("npName").value.trim(),t=document.getElementById("npDesc").value.trim(),n=document.getElementById("npOutputDir").value.trim(),o=document.getElementById("npFeaturesDoc").value.trim();if(e&&n)try{const a=await r("/api/projects",{name:e,description:t,outputDir:n,featuresDoc:o});i(`Project "${a.project.name}" created!`),document.getElementById("newProjectForm").style.display="none",document.getElementById("npName").value="",document.getElementById("npDesc").value="",document.getElementById("npOutputDir").value="",document.getElementById("npFeaturesDoc").value="",Xt()}catch(a){i("Failed: "+a.message,!0)}else i("Name and output directory required",!0)};const Bo={chat:On,"swarm-chat":x,swarm:_e,rt:Me,dlq:Le,files:Fn,services:L,agents:O,models:ze,settings:vo,engines:yo,skills:me,"run-skills":pe,benchmarks:wo,"tool-matrix":ko,build:Io,messaging:Mt,projects:To,contacts:Ee,memory:bo,workflows:I,"cli-process":xo,prompts:de};for(const[Lo,Mo]of Object.entries(Bo)){const e=Mo,t=function(...t){const n=location.hash||"";return"chat"===Lo?n.startsWith("#chat")||history.replaceState(null,"","#chat"):history.replaceState(null,"","#"+Lo),e(...t)};Bo[Lo]=t,window[e.name]=t}function So(e){const t=String(e||"chat").split("?")[0].split("/")[0];(Bo[t]||Bo.chat)()}(async()=>{if(await v())return;const{view:e,subtab:t}=Ln();"1"===new URLSearchParams(window.location.search).get("focus")?setTimeout(()=>{const e=document.getElementById("chatInput");e&&(So("chat"),e.focus())},500):(So(e||"chat"),"settings"===e&&t&&fo(t))})(),window.addEventListener("hashchange",()=>{const{view:e,subtab:t}=Ln(),n=Po[e];n?(n(),"settings"===e&&t&&fo(t)):On()}),fetch("/api/env").then(e=>e.json()).then(e=>{window._crewHome=e.HOME||"",window._crewCwd=e.cwd||"";const t=document.getElementById("filesDir");t&&!t.value&&(t.value=e.cwd||"")}).catch(()=>{}),F().catch(e=>console.error("Initial agents-config load failed:",e)),Sn(),function(){function e(e){if(e.closest("form"))return;const t=document.createElement("form");t.autocomplete="off",t.onsubmit=()=>!1,t.style.cssText="margin:0;padding:0;display:contents;";const n=document.createElement("input");n.type="text",n.autocomplete="username",n.setAttribute("aria-hidden","true"),n.style.cssText="display:none;position:absolute;width:0;height:0;opacity:0;",t.appendChild(n),e.parentNode.insertBefore(t,e),t.appendChild(e)}function t(t){(t||document).querySelectorAll('input[type="password"]').forEach(e)}t();new MutationObserver(n=>{for(const o of n)for(const n of o.addedNodes)1===n.nodeType&&(n.matches&&n.matches('input[type="password"]')?e(n):t(n))}).observe(document.body,{childList:!0,subtree:!0})}();const jo={showChat:On,showSwarm:_e,showRT:Me,showBuild:Io,showFiles:Fn,showDLQ:Le,showProjects:To,showAgents:O,showModels:ze,showEngines:yo,showSkills:me,showRunSkills:pe,showBenchmarks:wo,showToolMatrix:ko,showServices:L,showSettings:vo,pickFolder:e=>Pn(e),loadFiles:e=>po(),clearChatHistory:to,clearAgentChat:()=>{const e=document.getElementById("agentChatSelector"),t=document.getElementById("agentChatMessages"),n=document.getElementById("agentChatInput");t&&(t.innerHTML='<div class="empty-state">No messages yet. Start chatting!</div>'),n&&(n.value=""),(null==e?void 0:e.value)&&i("Chat history cleared","success")},sendChat:eo,stopAll:no,killAll:oo,stopPassthrough:ao,clearPassthroughSession:io,loadServices:M,saveRTToken:gt,lockConfig:ut,unlockConfig:mt,startCrew:H,toggleEmojiPicker:e=>oe(e),bulkSetRoute:(e,t)=>ae(e,t),loadSpending:bn,resetSpending:wn,saveGlobalCaps:yn,loadOcStats:qn,addAllowlistPattern:Vn,sendTestWebhook:Co,startTgBridge:Gt,stopTgBridge:zt,saveTgConfig:Dt,loadTelegramSessions:Ht,loadTgMessages:Ft,startWaBridge:Ot,stopWaBridge:Rt,saveWaConfig:Nt,loadWaMessages:_t,saveOpencodeSettings:pt,saveOpencodeModel:dt,saveGlobalFallback:ct,toggleBgConsciousness:lt,toggleCursorWaves:rt,toggleAutonomousMentions:it,toggleClaudeCode:st,toggleCodexExecutor:at,toggleGeminiCliExecutor:ot,toggleCrewCliExecutor:nt,toggleOpencodeExecutor:tt,saveGlobalOcLoop:et,saveGlobalOcLoopRounds:Ze,savePassthroughNotify:Xe,toggleAddSkill:ye,toggleImportSkill:fe,importSkillFromUrl:ve,showSkills:me,saveSkill:he,cancelSkillForm:ge,loadRunSkills:ue,loadBenchmarks:async()=>(await Tn()).loadBenchmarks(),loadBenchmarkLeaderboard:async()=>(await Tn()).loadBenchmarkLeaderboard(),loadBenchmarkTasks:async()=>(await Tn()).loadBenchmarkTasks(),onBenchmarkTaskSelect:async e=>(await Tn()).onBenchmarkTaskSelect(e),runBenchmarkTask:async()=>(await Tn()).runBenchmarkTask(),stopBenchmarkRun:async()=>(await Tn()).stopBenchmarkRun(),loadMemoryStats:j,searchMemory:S,migrateMemory:B,compactMemory:T,loadEngines:Ae,toggleImportEngine:je,importEngineFromUrl:Se,deleteEngine:e=>Pe(e),loadToolMatrix:mn,loadBuildProjectPicker:Zt,scrollRTToBottom:()=>{const e=document.getElementById("rtView");e&&(e.scrollTop=e.scrollHeight)},toggleRTPause:Re,clearRTMessages:Ne,togglePmAdvanced:()=>{const e=document.getElementById("pmAdvanced");e&&(e.style.display="none"===e.style.display?"block":"none")},toggleRTTokenVis:()=>{const e=document.getElementById("rtTokenInput");e&&(e.type="password"===e.type?"text":"password")},restartService:e=>N(e),stopService:e=>_(e),closePreviewPane:uo,previewFile:(e,t)=>mo(e),replayDLQ:e=>Fe(e),deleteDLQ:e=>Oe(e),runSkillFromUI:e=>be(e),editSkill:e=>xe(e),deleteSkill:e=>ke(e),restartAgentFromUI:e=>un(e),saveSearchTool:e=>Ke(e),testSearchTool:e=>$e(e),saveBuiltinKey:e=>We(e),testBuiltinProvider:e=>qe(e),fetchBuiltinModels:(e,t)=>Qe(e,t),saveKey:e=>Ue(e),testKey:e=>Ve(e),fetchModels:(e,t)=>Je(e,t),toggleKeyVis:(e,t)=>Ge(e,t),toggleAgentBody:e=>D(e),deleteAgent:e=>te(e),saveAgentModel:e=>Q(e),saveAgentFallback:e=>Z(e),saveAgentVoice:e=>X(e),toggleEmojiPicker:e=>oe(e),saveAgentIdentity:e=>Y(e),saveAgentPrompt:e=>J(e),resetAgentSession:e=>ee(e),saveAgentTools:e=>W(e),applyToolPreset:e=>ne(e),setRoute:(e,t)=>z(e,t),saveOpenCodeConfig:e=>V(e),saveOpenCodeFallback:e=>$(e),saveCursorCliConfig:e=>U(e),saveClaudeCodeConfig:e=>K(e),saveCodexConfig:e=>G(e),saveGeminiCliConfig:e=>q(e),saveCrewCLIConfig:e=>re(e),"pm-toggle":e=>{var t;const n=null==(t=o.projects)?void 0:t.find(t=>t.id===e);n&&n.running?cn(e):dn(e)},"edit-roadmap":e=>{var t;const n=null==(t=o.projects)?void 0:t.find(t=>t.id===e);n&&ln(e,n.roadmapFile)},"retry-failed":e=>{var t;const n=null==(t=o.projects)?void 0:t.find(t=>t.id===e);n&&rn(n.roadmapFile)},"save-roadmap":e=>sn(e),"reset-failed":e=>an(e),showSettingsTab:e=>fo(e)};let Ao=!1;document.addEventListener("touchstart",e=>{if(!(e.target instanceof Element))return;e.target.closest("[data-action]")&&(Ao=!0,setTimeout(()=>{Ao=!1},500))},{passive:!0}),document.addEventListener("click",e=>{if(!(e.target instanceof Element))return;const t=e.target.closest("[data-action]");if(!t)return;if(Ao)return void e.preventDefault();e.stopPropagation();const n=t.dataset.action,o=jo[n];if(!o)return void console.warn("[crewswarm] unknown data-action:",n);const a=t.dataset.arg??null,s=t.dataset.arg2??null,i="1"===t.dataset.self;null!==a&&null!==s?o(a,s):null!==a&&i?o(a,t):null!==a?o(a):i?o(t):o()}),document.addEventListener("change",e=>{const t=e.target.closest("[data-onchange]");if(!t)return;const n=jo[t.dataset.onchange];if(!n)return;const o="this.value"===t.dataset.onchangeArg?t.value:null;null!==o?n(o):n()}),document.addEventListener("DOMContentLoaded",()=>{f("activeTasksPanel"),Ie();const e=document.getElementById("dashSelfLink");e&&(e.href=window.location.origin,e.textContent=window.location.host),document.querySelectorAll(".nav-item").forEach(e=>{e.addEventListener("click",t=>{t.preventDefault(),t.stopPropagation();const n=e.dataset.view;if(!n)return;if(Mn()!==n)return void(window.location.hash=n);const o=Po[n];o&&o()})});const t=document.getElementById("chatInput");t&&!t.dataset.boundChatComposer&&(t.dataset.boundChatComposer="1",t.addEventListener("keydown",Zn),t.addEventListener("input",Xn));const n=document.getElementById("chatSendBtn")||document.querySelector('[data-action="sendChat"]');n&&!n.dataset.boundChatComposer&&(n.dataset.boundChatComposer="1",n.addEventListener("click",e=>{e.preventDefault(),e.stopPropagation(),eo()}));const o=document.getElementById("cmdAllowlistInput");o&&o.addEventListener("keydown",e=>{"Enter"===e.key&&Vn()});const a=document.getElementById("waAllowedNumbers");a&&a.addEventListener("input",$t);const s=document.getElementById("skillSearch");s&&s.addEventListener("input",e=>we(e.target.value));const i=document.getElementById("passthroughEngine");i&&i.addEventListener("change",()=>{so(),function(){const e=document.getElementById("passthroughEngine"),t=document.getElementById("passthroughModel");if(!e||!t)return;const n=e.value,o={cursor:[{value:"",label:"— default (opus-4.6-thinking) —"},{optgroup:"Recommended (No Rate Limits)"},{value:"gemini-3-flash",label:"🟢 Gemini 3 Flash (fastest)"},{value:"gemini-3-pro",label:"🟢 Gemini 3 Pro"},{value:"gemini-3.1-pro",label:"🟢 Gemini 3.1 Pro"},{value:"gpt-5.2-codex",label:"🟢 GPT-5.2 Codex"},{value:"gpt-5.3-codex",label:"🟢 GPT-5.3 Codex"},{optgroup:"Claude Models (May Hit Rate Limits)"},{value:"sonnet-4.5",label:"🟡 Claude 4.5 Sonnet"},{value:"sonnet-4.6",label:"🟡 Claude 4.6 Sonnet (current)"},{value:"opus-4.5",label:"🟡 Claude 4.5 Opus"},{value:"opus-4.6",label:"🟡 Claude 4.6 Opus"},{optgroup:"Thinking Models (Slower)"},{value:"sonnet-4.5-thinking",label:"Claude 4.5 Sonnet Thinking"},{value:"opus-4.6-thinking",label:"Claude 4.6 Opus Thinking"},{optgroup:"Other"},{value:"grok",label:"xAI Grok"},{value:"kimi-k2.5",label:"Moonshot Kimi K2.5"}],claude:[{value:"",label:"— default (Sonnet 4.6) —"},{optgroup:"Recommended"},{value:"sonnet",label:"🟢 Sonnet (alias for latest)"},{value:"Default",label:"🟢 Default (Sonnet 4.6)"},{optgroup:"Specific Versions"},{value:"claude-sonnet-4-6",label:"Sonnet 4.6 · Best for everyday tasks"},{value:"Opus",label:"Opus (Opus 4.6) · Most capable for complex work"},{value:"claude-opus-4-6",label:"Opus 4.6 · Most capable"},{value:"Haiku",label:"Haiku (Haiku 4.5) · Fastest for quick answers"},{value:"claude-haiku-4-5",label:"Haiku 4.5 · Fastest"},{optgroup:"Legacy"},{value:"claude-sonnet-4-5",label:"Sonnet 4.5 (legacy)"}],codex:[{value:"",label:"— default (gpt-5.3-codex) —"},{optgroup:"Recommended"},{value:"gpt-5.3-codex",label:"🟢 GPT-5.3 Codex (current)"},{value:"gpt-5.2-codex",label:"🟢 GPT-5.2 Codex"},{optgroup:"Specialized"},{value:"gpt-5.1-codex-max",label:"GPT-5.1 Codex Max (deep reasoning)"},{value:"gpt-5.2",label:"GPT-5.2 (general purpose)"},{value:"gpt-5.1-codex-mini",label:"GPT-5.1 Codex Mini (fast & cheap)"}],opencode:[{value:"",label:"— default —"},{optgroup:"Free Models 🎁"},{value:"opencode/big-pickle",label:"🆓 Big Pickle (Free)"},{value:"opencode/minimax-m2.5-free",label:"🆓 MiniMax M2.5 Free"},{value:"openai/gpt-5-nano",label:"🆓 GPT 5 Nano (Free)"},{optgroup:"Budget Models 💰"},{value:"openai/gpt-5.1-codex-mini",label:"💰 GPT 5.1 Codex Mini ($0.25/$2)"},{value:"google/gemini-3-flash",label:"💰 Gemini 3 Flash ($0.50/$3)"},{value:"anthropic/claude-haiku-4-5",label:"💰 Claude Haiku 4.5 ($1/$5)"},{optgroup:"Interesting Models 🎯"},{value:"moonshot/kimi-k2.5",label:"Kimi K2.5 ($0.60/$3)"},{value:"moonshot/kimi-k2-thinking",label:"Kimi K2 Thinking ($0.40/$2.50)"},{value:"alibaba/qwen3-coder-480b",label:"Qwen3 Coder 480B ($0.45/$1.50)"},{value:"zhipu/glm-5",label:"GLM 5 ($1/$3.20)"},{optgroup:"Premium Claude"},{value:"anthropic/claude-sonnet-4-6",label:"Claude Sonnet 4.6 ($3/$15)"},{value:"anthropic/claude-opus-4-6",label:"Claude Opus 4.6 ($5/$25)"},{optgroup:"Premium OpenAI"},{value:"openai/gpt-5.3-codex",label:"GPT 5.3 Codex ($1.75/$14)"},{value:"openai/gpt-5.2-codex",label:"GPT 5.2 Codex ($1.75/$14)"},{value:"openai/gpt-5.1-codex-max",label:"GPT 5.1 Codex Max ($1.25/$10)"},{optgroup:"Premium Google"},{value:"google/gemini-3.1-pro",label:"Gemini 3.1 Pro ($2/$12)"},{value:"google/gemini-3-pro",label:"Gemini 3 Pro ($2/$12)"}],gemini:[{value:"",label:"— default (gemini-3-flash-preview) —"},{optgroup:"Recommended (Latest)"},{value:"gemini-3-flash-preview",label:"🟢 Gemini 3 Flash Preview (current)"},{value:"gemini-3.1-pro-preview",label:"🟢 Gemini 3.1 Pro Preview"},{optgroup:"Gemini 2.5 Series"},{value:"gemini-2.5-pro",label:"Gemini 2.5 Pro"},{value:"gemini-2.5-flash",label:"Gemini 2.5 Flash"},{value:"gemini-2.5-flash-lite",label:"Gemini 2.5 Flash Lite (fastest)"}]};if(!n||!o[n])return void(t.style.display="none");t.style.display="inline-block",t.innerHTML="";let a=null;for(const s of o[n])if(s.optgroup)a=document.createElement("optgroup"),a.label=s.optgroup,t.appendChild(a);else{const e=document.createElement("option");e.value=s.value,e.textContent=s.label,a?a.appendChild(e):t.appendChild(e)}}(),ro()});const r=document.getElementById("chatProjectSelect");r&&r.addEventListener("change",so);const l=document.getElementById("passthroughModel");l&&l.addEventListener("change",()=>{ro()})},{once:!0});const Po={chat:On,"swarm-chat":x,swarm:_e,rt:Me,build:Io,files:Fn,dlq:Le,projects:To,contacts:Ee,agents:O,models:ze,engines:yo,skills:me,"run-skills":pe,waves:()=>{An(),document.getElementById("wavesView").style.display="block",jn("navWaves")},workflows:I,benchmarks:wo,"tool-matrix":ko,memory:bo,"cli-process":xo,services:L,prompts:de,settings:vo};document.addEventListener("click",e=>{const t=e.target.closest("[data-view]");if(t){const e=t.dataset.view,n=Po[e];return void(n&&(Mn()!==e?window.location.hash=e:n()))}const n=e.target.closest("[data-stab]");if(n){const e=n.dataset.stab;window.location.hash=`settings/${e}`,fo(e)}const o=e.target.closest("[data-toggle-child]");if(o){const e=o.dataset.toggleChild,t=o.parentElement&&o.parentElement.querySelector(e);t&&(t.style.display="none"===t.style.display?"block":"none")}const a=e.target.closest("[data-toggle-sibling]");a&&a.nextElementSibling&&a.nextElementSibling.classList.toggle(a.dataset.toggleSibling)}),Object.assign(window,{addAllowlistPattern:Vn,applyNewAgentToolPreset:ie,applyPromptPreset:se,bulkSetRoute:ae,cancelSkillForm:ge,chatAtAtInput:Xn,chatKeydown:Zn,clearChatHistory:to,filterSkills:we,loadAllUsage:xn,loadBenchmarkLeaderboard:async()=>(await Tn()).loadBenchmarkLeaderboard(),loadBenchmarks:async()=>(await Tn()).loadBenchmarks(),loadBenchmarkTasks:async()=>(await Tn()).loadBenchmarkTasks(),onBenchmarkTaskSelect:async e=>(await Tn()).onBenchmarkTaskSelect(e),runBenchmarkTask:async()=>(await Tn()).runBenchmarkTask(),stopBenchmarkRun:async()=>(await Tn()).stopBenchmarkRun(),loadMemoryStats:j,searchMemory:S,migrateMemory:B,compactMemory:T,loadBuildProjectPicker:Zt,loadFiles:po,loadOcStats:qn,loadRunSkills:ue,loadServices:M,loadSpending:bn,loadTelegramSessions:Ht,loadTgMessages:Ft,loadToolMatrix:mn,loadWaMessages:_t,onBuildProjectChange:tn,onChatProjectChange:en,pickFolder:Pn,renderWaContactRows:$t,resetSpending:wn,approveSkill:async function(e){try{await fetch("/api/skills/approve",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({approvalId:e})}),i("Approved"),Eo()}catch(t){i("Failed: "+t.message,"error")}},loadPendingApprovals:Eo,rejectSkill:async function(e){try{await fetch("/api/skills/reject",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({approvalId:e})}),i("Rejected"),Eo()}catch(t){i("Failed: "+t.message,"error")}},saveGlobalCaps:yn,saveGlobalFallback:ct,saveBgConsciousnessModel:ht,saveOpencodeSettings:pt,saveRTToken:gt,saveSkill:he,saveTgConfig:Dt,saveWaConfig:Nt,sendChat:eo,sendTestWebhook:Co,showAgents:O,showBenchmarks:wo,showBuild:Io,showChat:On,showContacts:Ee,showDLQ:Le,showFiles:Fn,showModels:ze,showProjects:To,showRT:Me,showRunSkills:pe,showServices:L,showSettings:vo,showSettingsTab:fo,showSkills:me,showSwarm:_e,showToolMatrix:ko,showMemoryView:bo,startCrew:H,startTgBridge:Gt,startWaBridge:Ot,stopTgBridge:zt,stopWaBridge:Rt,toggleAddSkill:ye,toggleBgConsciousness:lt,toggleCursorWaves:rt,toggleClaudeCode:st,toggleEmojiPicker:oe,updateSkillAuthFields:Ce,navigateTo:So,renderStatusBadge:p,showLoading:d,showEmpty:c,showError:l,loadContacts:Be,applyContactFilters:Te,applyToolPreset:ne,closePreviewPane:uo,deleteAgent:te,deleteSkill:ke,editSkill:xe,fetchBuiltinModels:Qe,fetchModels:Je,previewFile:mo,resetAgentSession:ee,restartAgentFromUI:un,restartService:N,runSkillFromUI:be,saveAgentFallback:Z,saveAgentVoice:X,saveAgentIdentity:Y,saveAgentModel:Q,saveAgentPrompt:J,saveAgentTools:W,saveBuiltinKey:We,saveCursorCliConfig:U,saveClaudeCodeConfig:K,saveGeminiCliConfig:q,saveKey:Ue,saveOpenCodeConfig:V,saveOpenCodeFallback:$,saveSearchTool:Ke,saveCodexConfig:G,setRoute:z,stopService:_,testBuiltinProvider:qe,testKey:Ve,testSearchTool:$e,toggleAgentBody:D,toggleKeyVis:Ge});
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{g as e,p as t}from"./core-utils-CAVnDoe1.js";const n=[{id:"anthropic",label:"Anthropic",icon:"🟣",placeholder:"sk-ant-...",url:"https://console.anthropic.com/"},{id:"openai",label:"OpenAI",icon:"🟢",placeholder:"sk-...",url:"https://platform.openai.com/api-keys"},{id:"google",label:"Google (Gemini)",icon:"🔵",placeholder:"AIza...",url:"https://aistudio.google.com/apikey"},{id:"groq",label:"Groq",icon:"⚡",placeholder:"gsk_...",url:"https://console.groq.com/keys"},{id:"fireworks",label:"Fireworks AI",icon:"🎆",placeholder:"fw_...",url:"https://fireworks.ai/"},{id:"openrouter",label:"OpenRouter",icon:"🔀",placeholder:"sk-or-...",url:"https://openrouter.ai/keys"},{id:"xai",label:"xAI (Grok)",icon:"𝕏",placeholder:"xai-...",url:"https://console.x.ai/"},{id:"deepseek",label:"DeepSeek",icon:"🌊",placeholder:"sk-...",url:"https://platform.deepseek.com/"},{id:"mistral",label:"Mistral",icon:"🌀",placeholder:"...",url:"https://console.mistral.ai/api-keys"},{id:"cerebras",label:"Cerebras",icon:"🧠",placeholder:"csk-...",url:"https://cloud.cerebras.ai/"},{id:"nvidia",label:"NVIDIA NIM",icon:"🎮",placeholder:"nvapi-...",url:"https://build.nvidia.com/"},{id:"perplexity",label:"Perplexity",icon:"🔍",placeholder:"pplx-...",url:"https://www.perplexity.ai/settings/api"},{id:"together",label:"Together AI",icon:"🤝",placeholder:"...",url:"https://api.together.xyz/settings/api-keys"},{id:"huggingface",label:"Hugging Face",icon:"🤗",placeholder:"hf_...",url:"https://huggingface.co/settings/tokens"},{id:"venice",label:"Venice AI",icon:"🏖️",placeholder:"...",url:"https://venice.ai/settings/api"},{id:"moonshot",label:"Moonshot / Kimi",icon:"🌙",placeholder:"sk-...",url:"https://platform.moonshot.cn/console/api-keys"},{id:"minimax",label:"MiniMax",icon:"✨",placeholder:"...",url:"https://www.minimaxi.com/"},{id:"volcengine",label:"Volcengine",icon:"🌋",placeholder:"...",url:"https://console.volcengine.com/ark"},{id:"qianfan",label:"Baidu Qianfan",icon:"🔵",placeholder:"...",url:"https://console.bce.baidu.com/qianfan/"},{id:"ollama",label:"Ollama (local)",icon:"🏠",placeholder:"no key needed",url:"https://ollama.com/download"}],a=[{id:"claude-code",cmd:"claude",label:"Claude Code",desc:"Anthropic's CLI agent. Best for complex reasoning and multi-file refactors.",installUrl:"https://docs.anthropic.com/en/docs/claude-code/overview",authCmd:"claude auth",keyProvider:"anthropic"},{id:"codex",cmd:"codex",label:"Codex CLI",desc:"OpenAI's CLI agent. Sandboxed execution with full file write access.",installUrl:"https://github.com/openai/codex",authCmd:"codex auth",keyProvider:"openai"},{id:"crew-cli",cmd:"crew",label:"crew-cli",desc:"CrewSwarm's own 3-tier pipeline. Supports Anthropic, OpenAI, Gemini, Groq, DeepSeek, and more.",installUrl:null,authCmd:null,keyProvider:null},{id:"opencode",cmd:"opencode",label:"OpenCode",desc:"Multi-provider CLI agent. Supports OpenAI, Anthropic, Google, and more.",installUrl:"https://github.com/opencode-ai/opencode",authCmd:null,keyProvider:null},{id:"gemini-cli",cmd:"gemini",label:"Gemini CLI",desc:"Google's CLI agent. Fast inference with Gemini models.",installUrl:"https://github.com/google-gemini/gemini-cli",authCmd:"gemini auth",keyProvider:"google"},{id:"cursor",cmd:"cursor",label:"Cursor CLI",desc:"Cursor's agent mode via CLI. Requires Cursor IDE installed.",installUrl:"https://www.cursor.com/",authCmd:null,keyProvider:null}];let i=1,s=null,d={},l=[],o={};async function c(){try{const t=await e("/api/first-run-status"),n=new URLSearchParams(window.location.search).has("wizard");return!(!t.firstRun&&!n)&&(l=t.configuredProviders||[],i=1,d={},s=document.createElement("div"),s.id="setupWizardOverlay",s.className="setup-wizard-overlay",s.setAttribute("role","dialog"),s.setAttribute("aria-modal","true"),s.setAttribute("aria-label","CrewSwarm setup wizard"),r(),document.body.appendChild(s),s.offsetHeight,s.classList.add("visible"),!0)}catch(t){return console.warn("[setup-wizard] Could not check first-run status:",t),!1}}function r(){if(!s)return;const e=function(){switch(i){case 1:default:return p();case 2:return function(){const e=document.createElement("div");e.className="setup-wizard-content";const t=document.createElement("div");t.className="setup-wizard-section-header",t.innerHTML='\n <h2 class="setup-wizard-section-title">API Keys</h2>\n <p class="setup-wizard-section-desc">\n Add keys for the providers you want to use. Already-configured keys are shown with a checkmark.\n Only new keys you enter will be saved — existing keys won\'t be touched.\n </p>\n ',e.appendChild(t);const a=document.createElement("div");a.className="setup-wizard-provider-list";for(const i of n){const e=l.includes(i.id),t=document.createElement("div");t.className="setup-wizard-provider-row",e&&t.classList.add("already-configured");const n=document.createElement("div");n.className="setup-wizard-provider-label";const s=document.createElement("span");s.className="setup-wizard-provider-icon",s.textContent=i.icon||"";const o=document.createElement("span");o.className="setup-wizard-provider-status",o.textContent=e?"✓":"",o.title=e?"Already configured":"Not configured";const c=document.createElement("span");c.className="setup-wizard-provider-name",c.textContent=i.label;const r=document.createElement("a");r.href=i.url,r.target="_blank",r.rel="noopener",r.className="setup-wizard-provider-link",r.textContent="Get key",r.setAttribute("aria-label",`Get API key for ${i.label}`),n.appendChild(s),n.appendChild(c),n.appendChild(o),n.appendChild(r);const p=document.createElement("div");p.className="setup-wizard-provider-input-wrap";const m=document.createElement("input");m.type="password",m.className="setup-wizard-provider-input",m.placeholder=e?"configured ✓":i.placeholder,m.autocomplete="off",m.spellcheck=!1,m.dataset.providerId=i.id,m.setAttribute("aria-label",`API key for ${i.label}`),d[i.id]&&(m.value=d[i.id]),m.addEventListener("input",()=>{const e=m.value.trim();e?(d[i.id]=e,t.classList.add("has-key")):(delete d[i.id],t.classList.remove("has-key")),u()});const h=document.createElement("button");h.type="button",h.className="setup-wizard-toggle-vis",h.textContent="👁",h.setAttribute("aria-label","Toggle key visibility"),h.addEventListener("click",()=>{m.type="password"===m.type?"text":"password"}),p.appendChild(m),p.appendChild(h),t.appendChild(n),t.appendChild(p),d[i.id]&&t.classList.add("has-key"),a.appendChild(t)}e.appendChild(a);const s=document.createElement("div");s.className="setup-wizard-error hidden",s.id="wizardProviderError",e.appendChild(s);const o=document.createElement("div");o.className="setup-wizard-actions";const c=document.createElement("button");c.className="setup-wizard-btn-ghost",c.textContent="Back",c.addEventListener("click",()=>{i=1,r()});const p=document.createElement("button");p.className="setup-wizard-btn-primary",p.id="wizardSaveBtn";const h=Object.keys(d).length>0,w=l.length>0;return p.textContent=h?"Save & Continue":"Continue",p.disabled=!h&&!w,p.addEventListener("click",m),o.appendChild(c),o.appendChild(p),e.appendChild(o),e}();case 3:return function(){var e;const t=document.createElement("div");t.className="setup-wizard-content";const s=document.createElement("div");s.className="setup-wizard-section-header",s.innerHTML='\n <h2 class="setup-wizard-section-title">CLI Engines</h2>\n <p class="setup-wizard-section-desc">\n CrewSwarm dispatches tasks to these CLI coding agents.\n You need at least one installed. Use the API keys from Step 2 to authenticate.\n </p>\n ',t.appendChild(s);const d=document.createElement("div");d.className="setup-wizard-engine-grid";const c=Object.values(o).filter(Boolean).length;for(const i of a){const t=!0===o[i.id],a="crew-cli"===i.id||t,s=document.createElement("div");s.className="setup-wizard-engine-card",a&&s.classList.add("available");const c=document.createElement("div");c.className="setup-wizard-engine-badge",a?(c.textContent="✓ Installed",c.classList.add("installed")):(c.textContent="Not found",c.classList.add("missing")),s.appendChild(c);const r=document.createElement("div");r.className="setup-wizard-engine-title",r.textContent=i.label,s.appendChild(r);const p=document.createElement("code");p.className="setup-wizard-engine-cmd",p.textContent=i.cmd,s.appendChild(p);const u=document.createElement("p");u.className="setup-wizard-engine-desc",u.textContent=i.desc,s.appendChild(u);const m=document.createElement("div");if(m.className="setup-wizard-engine-action",a&&i.authCmd){const e=document.createElement("span");e.className="setup-wizard-engine-auth-label",e.textContent="Auth:";const t=document.createElement("code");t.className="setup-wizard-engine-auth-cmd",t.textContent=i.authCmd,m.appendChild(e),m.appendChild(t)}else if(a&&i.keyProvider){const t=document.createElement("span");t.className="setup-wizard-engine-key-note";const a=(null==(e=n.find(e=>e.id===i.keyProvider))?void 0:e.label)||i.keyProvider,s=l.includes(i.keyProvider);t.textContent=s?`Uses ${a} key ✓`:`Needs ${a} key`,t.classList.add(s?"key-ok":"key-missing"),m.appendChild(t)}else if(!a&&i.installUrl){const e=document.createElement("a");e.href=i.installUrl,e.target="_blank",e.rel="noopener",e.className="setup-wizard-engine-install-btn",e.textContent="Install →",m.appendChild(e)}s.appendChild(m),d.appendChild(s)}if(t.appendChild(d),0===c&&Object.keys(o).length>0){const e=document.createElement("p");e.className="setup-wizard-engine-hint",e.innerHTML="No external CLI engines detected. <strong>crew-cli</strong> is built in and always available.",t.appendChild(e)}const p=document.createElement("div");p.className="setup-wizard-actions";const u=document.createElement("button");u.className="setup-wizard-btn-ghost",u.textContent="Back",u.addEventListener("click",()=>{i=2,r()});const m=document.createElement("button");return m.className="setup-wizard-btn-primary setup-wizard-btn-start",m.textContent="Launch Dashboard",m.addEventListener("click",h),p.appendChild(u),p.appendChild(m),t.appendChild(p),t}()}}();s.innerHTML="";const t=document.createElement("div");t.className="setup-wizard-card",t.appendChild(function(){const e=["Welcome","API Keys","Engines"],t=document.createElement("div");t.className="setup-wizard-steps",t.setAttribute("aria-label",`Step ${i} of 3`);for(let n=1;n<=3;n++){const a=document.createElement("button");a.className="setup-wizard-step-dot",a.setAttribute("aria-label",`Step ${n}`),a.tabIndex=-1,n===i&&a.classList.add("active"),n<i&&a.classList.add("completed");const s=document.createElement("span");s.className="setup-wizard-step-label",s.textContent=e[n-1];const d=document.createElement("div");if(d.className="setup-wizard-step",d.appendChild(a),d.appendChild(s),t.appendChild(d),n<3){const e=document.createElement("div");e.className="setup-wizard-step-line",n<i&&e.classList.add("completed"),t.appendChild(e)}}return t}()),t.appendChild(e),s.appendChild(t),requestAnimationFrame(()=>{t.classList.add("visible")})}function p(){const e=document.createElement("div");e.className="setup-wizard-content",e.innerHTML='\n <div class="setup-wizard-hero">\n <div class="setup-wizard-logo-ring">\n <img src="/favicon.png" alt="CrewSwarm" class="setup-wizard-logo" />\n </div>\n <h1 class="setup-wizard-title">Welcome to CrewSwarm</h1>\n <p class="setup-wizard-subtitle">\n Multi-agent orchestration for AI coding tools.<br>\n Let\'s get you set up in 2 minutes.\n </p>\n </div>\n <div class="setup-wizard-checklist">\n <div class="setup-wizard-check-item">\n <span class="setup-wizard-check-icon done">✓</span>\n <span>Dashboard installed</span>\n </div>\n <div class="setup-wizard-check-item">\n <span class="setup-wizard-check-icon pending">•</span>\n <span>Add API provider keys</span>\n </div>\n <div class="setup-wizard-check-item">\n <span class="setup-wizard-check-icon pending">•</span>\n <span>Detect & configure CLI engines</span>\n </div>\n </div>\n ';const t=document.createElement("div");t.className="setup-wizard-actions";const n=document.createElement("button");n.className="setup-wizard-btn-primary",n.textContent="Get Started",n.addEventListener("click",()=>{i=2,r()});const a=document.createElement("button");return a.className="setup-wizard-btn-ghost",a.textContent="Skip setup",a.addEventListener("click",w),t.appendChild(n),t.appendChild(a),e.appendChild(t),e}function u(){const e=document.getElementById("wizardSaveBtn");if(!e)return;const t=Object.keys(d).length>0,n=l.length>0;e.textContent=t?"Save & Continue":"Continue",e.disabled=!t&&!n}async function m(){const n=document.getElementById("wizardSaveBtn"),a=document.getElementById("wizardProviderError"),s=Object.entries(d).filter(([,e])=>e&&e.length>0);if(s.length>0){n&&(n.disabled=!0,n.textContent="Saving..."),a&&a.classList.add("hidden");try{for(const[e,n]of s)await t("/api/providers/builtin/save",{providerId:e,apiKey:n})}catch(l){return a&&(a.textContent="Failed to save: "+(l.message||"Unknown error"),a.classList.remove("hidden")),void(n&&(n.disabled=!1,n.textContent="Save & Continue"))}}await async function(){try{const t=await e("/api/first-run-engines");o=t.engines||{}}catch{o={}}}(),i=3,r()}async function h(){const e=null==s?void 0:s.querySelector(".setup-wizard-btn-start");e&&(e.disabled=!0,e.textContent="Loading..."),w(),window.location.href=window.location.pathname}function w(){s&&(s.classList.remove("visible"),s.classList.add("dismissing"),s.addEventListener("transitionend",()=>{s.remove(),s=null},{once:!0}),setTimeout(()=>{s&&(s.remove(),s=null)},400))}export{c};
|
|
1
|
+
import{g as e,p as t}from"./core-utils-CmOkXgzi.js";const n=[{id:"anthropic",label:"Anthropic",icon:"🟣",placeholder:"sk-ant-...",url:"https://console.anthropic.com/"},{id:"openai",label:"OpenAI",icon:"🟢",placeholder:"sk-...",url:"https://platform.openai.com/api-keys"},{id:"google",label:"Google (Gemini)",icon:"🔵",placeholder:"AIza...",url:"https://aistudio.google.com/apikey"},{id:"groq",label:"Groq",icon:"⚡",placeholder:"gsk_...",url:"https://console.groq.com/keys"},{id:"fireworks",label:"Fireworks AI",icon:"🎆",placeholder:"fw_...",url:"https://fireworks.ai/"},{id:"openrouter",label:"OpenRouter",icon:"🔀",placeholder:"sk-or-...",url:"https://openrouter.ai/keys"},{id:"xai",label:"xAI (Grok)",icon:"𝕏",placeholder:"xai-...",url:"https://console.x.ai/"},{id:"deepseek",label:"DeepSeek",icon:"🌊",placeholder:"sk-...",url:"https://platform.deepseek.com/"},{id:"mistral",label:"Mistral",icon:"🌀",placeholder:"...",url:"https://console.mistral.ai/api-keys"},{id:"cerebras",label:"Cerebras",icon:"🧠",placeholder:"csk-...",url:"https://cloud.cerebras.ai/"},{id:"nvidia",label:"NVIDIA NIM",icon:"🎮",placeholder:"nvapi-...",url:"https://build.nvidia.com/"},{id:"perplexity",label:"Perplexity",icon:"🔍",placeholder:"pplx-...",url:"https://www.perplexity.ai/settings/api"},{id:"together",label:"Together AI",icon:"🤝",placeholder:"...",url:"https://api.together.xyz/settings/api-keys"},{id:"huggingface",label:"Hugging Face",icon:"🤗",placeholder:"hf_...",url:"https://huggingface.co/settings/tokens"},{id:"venice",label:"Venice AI",icon:"🏖️",placeholder:"...",url:"https://venice.ai/settings/api"},{id:"moonshot",label:"Moonshot / Kimi",icon:"🌙",placeholder:"sk-...",url:"https://platform.moonshot.cn/console/api-keys"},{id:"minimax",label:"MiniMax",icon:"✨",placeholder:"...",url:"https://www.minimaxi.com/"},{id:"volcengine",label:"Volcengine",icon:"🌋",placeholder:"...",url:"https://console.volcengine.com/ark"},{id:"qianfan",label:"Baidu Qianfan",icon:"🔵",placeholder:"...",url:"https://console.bce.baidu.com/qianfan/"},{id:"ollama",label:"Ollama (local)",icon:"🏠",placeholder:"no key needed",url:"https://ollama.com/download"}],a=[{id:"claude-code",cmd:"claude",label:"Claude Code",desc:"Anthropic's CLI agent. Best for complex reasoning and multi-file refactors.",installUrl:"https://docs.anthropic.com/en/docs/claude-code/overview",authCmd:"claude auth",keyProvider:"anthropic"},{id:"codex",cmd:"codex",label:"Codex CLI",desc:"OpenAI's CLI agent. Sandboxed execution with full file write access.",installUrl:"https://github.com/openai/codex",authCmd:"codex auth",keyProvider:"openai"},{id:"crew-cli",cmd:"crew",label:"crew-cli",desc:"CrewSwarm's own 3-tier pipeline. Supports Anthropic, OpenAI, Gemini, Groq, DeepSeek, and more.",installUrl:null,authCmd:null,keyProvider:null},{id:"opencode",cmd:"opencode",label:"OpenCode",desc:"Multi-provider CLI agent. Supports OpenAI, Anthropic, Google, and more.",installUrl:"https://github.com/opencode-ai/opencode",authCmd:null,keyProvider:null},{id:"gemini-cli",cmd:"gemini",label:"Gemini CLI",desc:"Google's CLI agent. Fast inference with Gemini models.",installUrl:"https://github.com/google-gemini/gemini-cli",authCmd:"gemini auth",keyProvider:"google"},{id:"cursor",cmd:"cursor",label:"Cursor CLI",desc:"Cursor's agent mode via CLI. Requires Cursor IDE installed.",installUrl:"https://www.cursor.com/",authCmd:null,keyProvider:null}];let i=1,s=null,d={},l=[],o={};async function c(){try{const t=await e("/api/first-run-status"),n=new URLSearchParams(window.location.search).has("wizard");return!(!t.firstRun&&!n)&&(l=t.configuredProviders||[],i=1,d={},s=document.createElement("div"),s.id="setupWizardOverlay",s.className="setup-wizard-overlay",s.setAttribute("role","dialog"),s.setAttribute("aria-modal","true"),s.setAttribute("aria-label","CrewSwarm setup wizard"),r(),document.body.appendChild(s),s.offsetHeight,s.classList.add("visible"),!0)}catch(t){return console.warn("[setup-wizard] Could not check first-run status:",t),!1}}function r(){if(!s)return;const e=function(){switch(i){case 1:default:return p();case 2:return function(){const e=document.createElement("div");e.className="setup-wizard-content";const t=document.createElement("div");t.className="setup-wizard-section-header",t.innerHTML='\n <h2 class="setup-wizard-section-title">API Keys</h2>\n <p class="setup-wizard-section-desc">\n Add keys for the providers you want to use. Already-configured keys are shown with a checkmark.\n Only new keys you enter will be saved — existing keys won\'t be touched.\n </p>\n ',e.appendChild(t);const a=document.createElement("div");a.className="setup-wizard-provider-list";for(const i of n){const e=l.includes(i.id),t=document.createElement("div");t.className="setup-wizard-provider-row",e&&t.classList.add("already-configured");const n=document.createElement("div");n.className="setup-wizard-provider-label";const s=document.createElement("span");s.className="setup-wizard-provider-icon",s.textContent=i.icon||"";const o=document.createElement("span");o.className="setup-wizard-provider-status",o.textContent=e?"✓":"",o.title=e?"Already configured":"Not configured";const c=document.createElement("span");c.className="setup-wizard-provider-name",c.textContent=i.label;const r=document.createElement("a");r.href=i.url,r.target="_blank",r.rel="noopener",r.className="setup-wizard-provider-link",r.textContent="Get key",r.setAttribute("aria-label",`Get API key for ${i.label}`),n.appendChild(s),n.appendChild(c),n.appendChild(o),n.appendChild(r);const p=document.createElement("div");p.className="setup-wizard-provider-input-wrap";const m=document.createElement("input");m.type="password",m.className="setup-wizard-provider-input",m.placeholder=e?"configured ✓":i.placeholder,m.autocomplete="off",m.spellcheck=!1,m.dataset.providerId=i.id,m.setAttribute("aria-label",`API key for ${i.label}`),d[i.id]&&(m.value=d[i.id]),m.addEventListener("input",()=>{const e=m.value.trim();e?(d[i.id]=e,t.classList.add("has-key")):(delete d[i.id],t.classList.remove("has-key")),u()});const h=document.createElement("button");h.type="button",h.className="setup-wizard-toggle-vis",h.textContent="👁",h.setAttribute("aria-label","Toggle key visibility"),h.addEventListener("click",()=>{m.type="password"===m.type?"text":"password"}),p.appendChild(m),p.appendChild(h),t.appendChild(n),t.appendChild(p),d[i.id]&&t.classList.add("has-key"),a.appendChild(t)}e.appendChild(a);const s=document.createElement("div");s.className="setup-wizard-error hidden",s.id="wizardProviderError",e.appendChild(s);const o=document.createElement("div");o.className="setup-wizard-actions";const c=document.createElement("button");c.className="setup-wizard-btn-ghost",c.textContent="Back",c.addEventListener("click",()=>{i=1,r()});const p=document.createElement("button");p.className="setup-wizard-btn-primary",p.id="wizardSaveBtn";const h=Object.keys(d).length>0,w=l.length>0;return p.textContent=h?"Save & Continue":"Continue",p.disabled=!h&&!w,p.addEventListener("click",m),o.appendChild(c),o.appendChild(p),e.appendChild(o),e}();case 3:return function(){var e;const t=document.createElement("div");t.className="setup-wizard-content";const s=document.createElement("div");s.className="setup-wizard-section-header",s.innerHTML='\n <h2 class="setup-wizard-section-title">CLI Engines</h2>\n <p class="setup-wizard-section-desc">\n CrewSwarm dispatches tasks to these CLI coding agents.\n You need at least one installed. Use the API keys from Step 2 to authenticate.\n </p>\n ',t.appendChild(s);const d=document.createElement("div");d.className="setup-wizard-engine-grid";const c=Object.values(o).filter(Boolean).length;for(const i of a){const t=!0===o[i.id],a="crew-cli"===i.id||t,s=document.createElement("div");s.className="setup-wizard-engine-card",a&&s.classList.add("available");const c=document.createElement("div");c.className="setup-wizard-engine-badge",a?(c.textContent="✓ Installed",c.classList.add("installed")):(c.textContent="Not found",c.classList.add("missing")),s.appendChild(c);const r=document.createElement("div");r.className="setup-wizard-engine-title",r.textContent=i.label,s.appendChild(r);const p=document.createElement("code");p.className="setup-wizard-engine-cmd",p.textContent=i.cmd,s.appendChild(p);const u=document.createElement("p");u.className="setup-wizard-engine-desc",u.textContent=i.desc,s.appendChild(u);const m=document.createElement("div");if(m.className="setup-wizard-engine-action",a&&i.authCmd){const e=document.createElement("span");e.className="setup-wizard-engine-auth-label",e.textContent="Auth:";const t=document.createElement("code");t.className="setup-wizard-engine-auth-cmd",t.textContent=i.authCmd,m.appendChild(e),m.appendChild(t)}else if(a&&i.keyProvider){const t=document.createElement("span");t.className="setup-wizard-engine-key-note";const a=(null==(e=n.find(e=>e.id===i.keyProvider))?void 0:e.label)||i.keyProvider,s=l.includes(i.keyProvider);t.textContent=s?`Uses ${a} key ✓`:`Needs ${a} key`,t.classList.add(s?"key-ok":"key-missing"),m.appendChild(t)}else if(!a&&i.installUrl){const e=document.createElement("a");e.href=i.installUrl,e.target="_blank",e.rel="noopener",e.className="setup-wizard-engine-install-btn",e.textContent="Install →",m.appendChild(e)}s.appendChild(m),d.appendChild(s)}if(t.appendChild(d),0===c&&Object.keys(o).length>0){const e=document.createElement("p");e.className="setup-wizard-engine-hint",e.innerHTML="No external CLI engines detected. <strong>crew-cli</strong> is built in and always available.",t.appendChild(e)}const p=document.createElement("div");p.className="setup-wizard-actions";const u=document.createElement("button");u.className="setup-wizard-btn-ghost",u.textContent="Back",u.addEventListener("click",()=>{i=2,r()});const m=document.createElement("button");return m.className="setup-wizard-btn-primary setup-wizard-btn-start",m.textContent="Launch Dashboard",m.addEventListener("click",h),p.appendChild(u),p.appendChild(m),t.appendChild(p),t}()}}();s.innerHTML="";const t=document.createElement("div");t.className="setup-wizard-card",t.appendChild(function(){const e=["Welcome","API Keys","Engines"],t=document.createElement("div");t.className="setup-wizard-steps",t.setAttribute("aria-label",`Step ${i} of 3`);for(let n=1;n<=3;n++){const a=document.createElement("button");a.className="setup-wizard-step-dot",a.setAttribute("aria-label",`Step ${n}`),a.tabIndex=-1,n===i&&a.classList.add("active"),n<i&&a.classList.add("completed");const s=document.createElement("span");s.className="setup-wizard-step-label",s.textContent=e[n-1];const d=document.createElement("div");if(d.className="setup-wizard-step",d.appendChild(a),d.appendChild(s),t.appendChild(d),n<3){const e=document.createElement("div");e.className="setup-wizard-step-line",n<i&&e.classList.add("completed"),t.appendChild(e)}}return t}()),t.appendChild(e),s.appendChild(t),requestAnimationFrame(()=>{t.classList.add("visible")})}function p(){const e=document.createElement("div");e.className="setup-wizard-content",e.innerHTML='\n <div class="setup-wizard-hero">\n <div class="setup-wizard-logo-ring">\n <img src="/favicon.png" alt="CrewSwarm" class="setup-wizard-logo" />\n </div>\n <h1 class="setup-wizard-title">Welcome to CrewSwarm</h1>\n <p class="setup-wizard-subtitle">\n Multi-agent orchestration for AI coding tools.<br>\n Let\'s get you set up in 2 minutes.\n </p>\n </div>\n <div class="setup-wizard-checklist">\n <div class="setup-wizard-check-item">\n <span class="setup-wizard-check-icon done">✓</span>\n <span>Dashboard installed</span>\n </div>\n <div class="setup-wizard-check-item">\n <span class="setup-wizard-check-icon pending">•</span>\n <span>Add API provider keys</span>\n </div>\n <div class="setup-wizard-check-item">\n <span class="setup-wizard-check-icon pending">•</span>\n <span>Detect & configure CLI engines</span>\n </div>\n </div>\n ';const t=document.createElement("div");t.className="setup-wizard-actions";const n=document.createElement("button");n.className="setup-wizard-btn-primary",n.textContent="Get Started",n.addEventListener("click",()=>{i=2,r()});const a=document.createElement("button");return a.className="setup-wizard-btn-ghost",a.textContent="Skip setup",a.addEventListener("click",w),t.appendChild(n),t.appendChild(a),e.appendChild(t),e}function u(){const e=document.getElementById("wizardSaveBtn");if(!e)return;const t=Object.keys(d).length>0,n=l.length>0;e.textContent=t?"Save & Continue":"Continue",e.disabled=!t&&!n}async function m(){const n=document.getElementById("wizardSaveBtn"),a=document.getElementById("wizardProviderError"),s=Object.entries(d).filter(([,e])=>e&&e.length>0);if(s.length>0){n&&(n.disabled=!0,n.textContent="Saving..."),a&&a.classList.add("hidden");try{for(const[e,n]of s)await t("/api/providers/builtin/save",{providerId:e,apiKey:n})}catch(l){return a&&(a.textContent="Failed to save: "+(l.message||"Unknown error"),a.classList.remove("hidden")),void(n&&(n.disabled=!1,n.textContent="Save & Continue"))}}await async function(){try{const t=await e("/api/first-run-engines");o=t.engines||{}}catch{o={}}}(),i=3,r()}async function h(){const e=null==s?void 0:s.querySelector(".setup-wizard-btn-start");e&&(e.disabled=!0,e.textContent="Loading..."),w(),window.location.href=window.location.pathname}function w(){s&&(s.classList.remove("visible"),s.classList.add("dismissing"),s.addEventListener("transitionend",()=>{s.remove(),s=null},{once:!0}),setTimeout(()=>{s&&(s.remove(),s=null)},400))}export{c};
|
|
Binary file
|