hermes-web-ui 0.6.0-beta.2 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/dist/client/assets/js/{ChannelsView-9bNGmPOL.js → ChannelsView-CvORJMzg.js} +1 -1
  2. package/dist/client/assets/js/{ChatView-CrMN1j5u.js → ChatView-DihfBNUf.js} +1 -1
  3. package/dist/client/assets/js/{FileRenameModal-C4oWOgjw.js → FileRenameModal-DN-U6DZT.js} +1 -1
  4. package/dist/client/assets/js/{FilesView-pDP8mSTZ.js → FilesView-BxW5kOlO.js} +1 -1
  5. package/dist/client/assets/js/{GroupChatView-BV3Dxn4i.js → GroupChatView-Cdyg0EOz.js} +1 -1
  6. package/dist/client/assets/js/{HistoryMessageList-CHk-rOIr.js → HistoryMessageList-S77rD1zj.js} +1 -1
  7. package/dist/client/assets/js/{HistoryView-RE-m9Yx6.js → HistoryView-DM7qDtZb.js} +1 -1
  8. package/dist/client/assets/js/{JobsView-BkXCTE4b.js → JobsView-BqylpVBm.js} +1 -1
  9. package/dist/client/assets/js/{KanbanView-Bwlm-lFI.js → KanbanView-C8uXrTRt.js} +1 -1
  10. package/dist/client/assets/js/{LoginView-Cil7q9fA.js → LoginView-ISxozFfh.js} +1 -1
  11. package/dist/client/assets/js/{LogsView-BRXZpNpB.js → LogsView-CtCOjFb5.js} +1 -1
  12. package/dist/client/assets/js/{MarkdownRenderer-BbsOzYq-.js → MarkdownRenderer-BJbqsrMI.js} +1 -1
  13. package/dist/client/assets/js/{MemoryView-BeY8xybk.js → MemoryView-Bc-a9i1U.js} +1 -1
  14. package/dist/client/assets/js/{MessageItem-DWHvbLzg.js → MessageItem-DOA2nFJg.js} +1 -1
  15. package/dist/client/assets/js/{ModelsView-C33B9WXE.js → ModelsView-CmcXLgHA.js} +1 -1
  16. package/dist/client/assets/js/{OutlinePanel-CxJshR71.js → OutlinePanel-D2LVzKPs.js} +1 -1
  17. package/dist/client/assets/js/{PerformanceView-Bcs2X6p5.js → PerformanceView-BIMfq0BU.js} +1 -1
  18. package/dist/client/assets/js/{PluginsView-ClPgLZw1.js → PluginsView-DfSS_RTl.js} +1 -1
  19. package/dist/client/assets/js/{ProfilesView-C4kzKN1z.js → ProfilesView-CVh7LT-n.js} +1 -1
  20. package/dist/client/assets/js/{SettingRow-BAmGrtcn.js → SettingRow-Dt5XWkpQ.js} +1 -1
  21. package/dist/client/assets/js/{SettingsView-BuKFsiAz.js → SettingsView-hA4C1YcG.js} +1 -1
  22. package/dist/client/assets/js/{SkillsUsageView-CRcgWp1p.js → SkillsUsageView-_ToBXkb1.js} +1 -1
  23. package/dist/client/assets/js/{SkillsView-B2j4jJMz.js → SkillsView-DMUkyn3M.js} +1 -1
  24. package/dist/client/assets/js/{TerminalView-0vvlfSha.js → TerminalView-CS_MwrJD.js} +1 -1
  25. package/dist/client/assets/js/{UsageView-3v8bYw4Z.js → UsageView-D6o-9cR-.js} +1 -1
  26. package/dist/client/assets/js/{_plugin-vue_export-helper-B8gz9Iqn.js → _plugin-vue_export-helper-CHoatqkO.js} +2 -2
  27. package/dist/client/assets/js/{index-Cuk9R8hy.js → index-DpU5R9KV.js} +1 -1
  28. package/dist/client/assets/js/{models-Of46_lGf.js → models-CDdUhb_e.js} +1 -1
  29. package/dist/client/assets/js/profiles-CyjgPK1f.js +1 -0
  30. package/dist/client/assets/js/{session-browser-prefs-IGK7Xpdn.js → session-browser-prefs-C6G-jnbR.js} +1 -1
  31. package/dist/client/assets/js/{skills-BQ2jtPxK.js → skills-vuknhTFJ.js} +1 -1
  32. package/dist/client/index.html +3 -3
  33. package/dist/server/index.js +2 -2
  34. package/dist/server/index.js.map +1 -1
  35. package/package.json +1 -1
  36. package/dist/client/assets/js/profiles-DiEn61KW.js +0 -1
@@ -1 +1 @@
1
- import{n as P}from"./rolldown-runtime-BKwlnUi0.js";import{Pt as t,W as M,tt as d}from"./ui-vendor-BMwF7QXa.js";import{d as h,u as w}from"./vue-vendor-kBYBtqCg.js";import{c as y,l as b}from"./_plugin-vue_export-helper-B8gz9Iqn.js";import{c as S,d as A,h as D,l as u,m as W,p as C,r as F,t as x,u as K}from"./profiles-DiEn61KW.js";var N,E=P((()=>{h(),M(),C(),b(),S(),x(),N=w("models",()=>{const r=t([]),n=t([]),o=t(""),s=t(""),i=t(!1),v=d(()=>r.value.filter(e=>e.provider.startsWith("custom:"))),f=d(()=>r.value.filter(e=>!e.provider.startsWith("custom:"))),c=d(()=>r.value.flatMap(e=>e.models.map(a=>({id:a,provider:e.provider,label:e.label,base_url:e.base_url,isDefault:a===o.value&&e.provider===s.value}))));async function l(){if(y()){i.value=!0;try{const e=F().activeProfileName||"default",a=await A(e);r.value=a.groups,n.value=a.allProviders,o.value=a.default,s.value=a.default_provider||""}catch(e){console.error("Failed to fetch providers:",e)}finally{i.value=!1}}}async function p(e,a){await D({default:e,provider:a}),o.value=e,s.value=a,u().reloadModels()}async function m(e){await K(e),await l(),await u().reloadModels()}async function _(e){await W(e),await l(),await u().reloadModels()}return{providers:r,allProviders:n,defaultModel:o,defaultProvider:s,loading:i,customProviders:v,builtinProviders:f,allModels:c,fetchProviders:l,setDefaultModel:p,addProvider:m,removeProvider:_}})}));export{N as n,E as t};
1
+ import{n as P}from"./rolldown-runtime-BKwlnUi0.js";import{Pt as t,W as M,tt as d}from"./ui-vendor-BMwF7QXa.js";import{d as h,u as w}from"./vue-vendor-kBYBtqCg.js";import{c as y,l as b}from"./_plugin-vue_export-helper-CHoatqkO.js";import{c as S,d as A,h as D,l as u,m as W,p as C,r as F,t as x,u as K}from"./profiles-CyjgPK1f.js";var N,E=P((()=>{h(),M(),C(),b(),S(),x(),N=w("models",()=>{const r=t([]),n=t([]),o=t(""),s=t(""),i=t(!1),v=d(()=>r.value.filter(e=>e.provider.startsWith("custom:"))),f=d(()=>r.value.filter(e=>!e.provider.startsWith("custom:"))),c=d(()=>r.value.flatMap(e=>e.models.map(a=>({id:a,provider:e.provider,label:e.label,base_url:e.base_url,isDefault:a===o.value&&e.provider===s.value}))));async function l(){if(y()){i.value=!0;try{const e=F().activeProfileName||"default",a=await A(e);r.value=a.groups,n.value=a.allProviders,o.value=a.default,s.value=a.default_provider||""}catch(e){console.error("Failed to fetch providers:",e)}finally{i.value=!1}}}async function p(e,a){await D({default:e,provider:a}),o.value=e,s.value=a,u().reloadModels()}async function m(e){await K(e),await l(),await u().reloadModels()}async function _(e){await W(e),await l(),await u().reloadModels()}return{providers:r,allProviders:n,defaultModel:o,defaultProvider:s,loading:i,customProviders:v,builtinProviders:f,allModels:c,fetchProviders:l,setDefaultModel:p,addProvider:m,removeProvider:_}})}));export{N as n,E as t};
@@ -0,0 +1 @@
1
+ import{n as k,r as Ce}from"./rolldown-runtime-BKwlnUi0.js";import{Pt as u,W as oe}from"./ui-vendor-BMwF7QXa.js";import{d as re,u as ie}from"./vue-vendor-kBYBtqCg.js";import{c as Z,d as v,l as J,o as le,s as ne}from"./_plugin-vue_export-helper-CHoatqkO.js";async function Me(){return v("/health")}async function Oe(){return v("/api/hermes/update",{method:"POST"})}async function Ue(){return v("/api/hermes/available-models")}async function qe(e){const i=new URLSearchParams;return i.set("profile",e||"default"),v(`/api/hermes/available-models?${i.toString()}`)}async function Qe(e){return v("/api/hermes/provider-models",{method:"POST",body:JSON.stringify(e)})}async function Ae(e){await v("/api/hermes/config/model",{method:"PUT",body:JSON.stringify(e)})}async function Ee(e){await v("/api/hermes/model-alias",{method:"PUT",body:JSON.stringify(e)})}async function Xe(e){await v("/api/hermes/config/providers",{method:"POST",body:JSON.stringify(e)})}async function Ze(e){await v(`/api/hermes/config/providers/${encodeURIComponent(e)}`,{method:"DELETE"})}async function ea(e,i){await v(`/api/hermes/config/providers/${encodeURIComponent(e)}`,{method:"PUT",body:JSON.stringify(i)})}async function Re(e){return v("/api/hermes/model-visibility",{method:"PUT",body:JSON.stringify(e)})}async function Te(e){return v("/api/hermes/custom-model",{method:"PUT",body:JSON.stringify(e)})}async function $e(e){const i=new URLSearchParams;return i.set("provider",e.provider),i.set("model",e.model),v(`/api/hermes/custom-model?${i.toString()}`,{method:"DELETE"})}var Le=k((()=>{J()})),V,x,ee,ae,se,ke=k((()=>{re(),oe(),Le(),J(),V="0.6.0",x="hermes_sidebar_collapsed",ee="hermes_active_profile_name",ae=3e4,se=ie("app",()=>{const e=u(!1),i=u(localStorage.getItem(x)==="1"),l=u(!1),m=u(V),p=u(""),P=u(!1),y=u(!1),b=u(!1),g=u([]),M=u([]),_=u(""),S=u(""),w=u({}),C=u({}),O=u({}),A=u(),T=u(""),D=u(!0),N=u(!0),t=u(4096);let o=null,c=0;async function R(){b.value=!0;try{const a=await Oe();return a.success&&(P.value=!1,await $()),a.success}catch(a){return console.error("Failed to update Hermes Web UI:",a),!1}finally{b.value=!1}}async function $(){try{const a=await Me();l.value=a.status==="ok",a.webui_version&&(m.value=a.webui_version),y.value=!!a.webui_version&&a.webui_version!==V,a.webui_latest&&(p.value=a.webui_latest),P.value=!!a.webui_update_available,a.node_version&&(T.value=a.node_version)}catch{l.value=!1,y.value=!1}}function H(a){g.value=a.groups,M.value=a.profiles||[],C.value=a.model_aliases||{},O.value=a.model_visibility||{},w.value=a.custom_models||{};const r=localStorage.getItem(ee)||"",s=(r?M.value.find(h=>h.profile===r):void 0)||a,f=s.groups||[],n=s.default||"",d=s.default_provider||"",U=f.find(h=>h.provider===d&&h.models.includes(n)),q=f.find(h=>h.models.includes(n)),F=f.find(h=>h.models.length>0),L=d?f.find(h=>h.provider===d):void 0,I=d?a.allProviders.find(h=>h.provider===d):void 0,Q=L?.available_models?.length?L.available_models:I?.available_models?.length?I.available_models:I?.models||[],X=d?O.value[d]:void 0,_e=!!(n&&X?.mode==="include"&&!X.models.includes(n)&&(Q.length===0||Q.includes(n))),Se=!!(n&&d&&L&&!L.models.includes(n)&&!_e);if(U||q){const h=U||q;_.value=n,S.value=h.provider}else Se?(_.value=n,S.value=d,w.value={...w.value,[d]:Array.from(new Set([...w.value[d]||[],n]))}):F?(_.value=F.models[0],S.value=F.provider):(_.value="",S.value="")}async function G(a=!1){if(Z()){if(!a&&o)return o;if(!(!a&&c>0&&Date.now()-c<ae))return c=Date.now(),o=(async()=>{try{H(await Ue())}catch{}finally{o=null}})(),o}}async function ce(a=15e3){if(!Z())return;const r=o||(c===0?G():null);r&&await Promise.race([r,new Promise(s=>setTimeout(s,a))])}async function B(){return G(!0)}function K(a,r){if(r)return C.value[r]?.[a]||"";for(const s of Object.values(C.value))if(s[a])return s[a];return""}function fe(a,r){return K(a,r)||a}function j(a,r,s){return a.map(f=>f.provider!==r?f:{...f,models:f.models.filter(n=>n!==s),available_models:f.available_models?.filter(n=>n!==s)})}function de(a,r){g.value=j(g.value,a,r),M.value=M.value.map(s=>({...s,groups:j(s.groups,a,r)}))}async function ve(a,r,s){const f=s.trim();await Ee({provider:r,model:a,alias:f});const n={...C.value},d={...n[r]||{}};f?(d[a]=f,n[r]=d):(delete d[a],Object.keys(d).length>0?n[r]=d:delete n[r]),C.value=n}async function z(a,r){try{const s=g.value.find(n=>n.models.includes(a)),f=r||s?.provider||"";await Ae({default:a,provider:f}),_.value=a,S.value=f||"",f&&!g.value.find(n=>n.provider===f)?.models.includes(a)&&(w.value=(await Te({provider:f,model:a})).custom_models||{})}catch(s){console.error("Failed to switch model:",s)}}async function me(a,r){const s=w.value[r]||[];if(!s.includes(a))return;const f={...w.value},n=s.filter(d=>d!==a);n.length>0?f[r]=n:delete f[r];try{w.value=(await $e({provider:r,model:a})).custom_models||f}catch(d){console.error("Failed to remove custom model:",d),w.value=f}if(de(r,a),_.value===a&&S.value===r){const d=g.value.find(U=>U.provider===r&&U.models.length>0)||g.value.find(U=>U.models.length>0);d?await z(d.models[0],d.provider):(_.value="",S.value="")}}function W(a){return O.value[a]||{mode:"all",models:[]}}function pe(a,r){const s=W(a);return s.mode!=="include"||s.models.includes(r)}async function he(a,r){O.value=(await Re({provider:a,mode:r.mode,models:r.models})).model_visibility||{},await B()}function ye(a=3e4){Y(),$(),A.value=setInterval($,a)}function Y(){A.value&&(clearInterval(A.value),A.value=void 0)}function we(){const a=new URL(window.location.href);a.searchParams.set("__hwui_reload",Date.now().toString()),window.location.replace(a.toString())}function Pe(){e.value=!e.value}function be(){e.value=!1}function ge(){i.value=!i.value;try{localStorage.setItem(x,i.value?"1":"0")}catch{}}return{sidebarOpen:e,sidebarCollapsed:i,toggleSidebar:Pe,closeSidebar:be,toggleSidebarCollapsed:ge,connected:l,serverVersion:m,latestVersion:p,nodeVersion:T,updateAvailable:P,clientOutdated:y,updating:b,doUpdate:R,reloadClient:we,modelGroups:g,profileModelGroups:M,customModels:w,modelAliases:C,modelVisibility:O,selectedModel:_,selectedProvider:S,streamEnabled:D,sessionPersistence:N,maxTokens:t,checkConnection:$,loadModels:G,waitForModelsForRun:ce,reloadModels:B,applyAvailableModelsResponse:H,switchModel:z,removeCustomModel:me,getModelAlias:K,displayModelName:fe,setModelAlias:ve,getProviderVisibility:W,isModelVisible:pe,setModelVisibility:he,startHealthPolling:ye,stopHealthPolling:Y}})}));async function te(){return(await v("/api/hermes/profiles")).profiles}async function De(e){return(await v(`/api/hermes/profiles/${encodeURIComponent(e)}`)).profile}async function aa(){return(await v("/api/hermes/profiles/runtime-statuses")).profiles}async function Ne(e,i){return(await v(`/api/hermes/profiles/${encodeURIComponent(e)}/avatar`,{method:"PUT",body:JSON.stringify(i)})).avatar}async function Ge(e){await v(`/api/hermes/profiles/${encodeURIComponent(e)}/avatar`,{method:"DELETE"})}async function ta(e){return(await v(`/api/hermes/profiles/${encodeURIComponent(e)}/gateway/restart`,{method:"POST"})).gateway}async function oa(e){return(await v(`/api/hermes/profiles/${encodeURIComponent(e)}/restart`,{method:"POST"})).status}async function Fe(e,i){try{const l=await v("/api/hermes/profiles",{method:"POST",body:JSON.stringify({name:e,clone:i})});return{success:!!l.success,strippedCredentials:l.strippedCredentials,disabledPlatforms:l.disabledPlatforms,strippedConfigCredentials:l.strippedConfigCredentials,error:l.error}}catch(l){return{success:!1,error:l.message||"Unknown error"}}}async function Ie(e){try{return await v(`/api/hermes/profiles/${encodeURIComponent(e)}`,{method:"DELETE"}),!0}catch{return!1}}async function Ve(e,i){try{return await v(`/api/hermes/profiles/${encodeURIComponent(e)}/rename`,{method:"POST",body:JSON.stringify({new_name:i})}),!0}catch{return!1}}async function xe(e){return!!e}async function Je(e){try{return await v("/api/hermes/profiles/active",{method:"PUT",body:JSON.stringify({name:e})}),!0}catch{return!1}}async function He(e){try{const i=ne(),l=le(),m={};l&&(m.Authorization=`Bearer ${l}`);const p=await fetch(`${i}/api/hermes/profiles/${encodeURIComponent(e)}/export`,{method:"POST",headers:m});if(!p.ok)throw new Error;const P=await p.blob(),y=URL.createObjectURL(P),b=document.createElement("a");return b.href=y,b.download=`hermes-profile-${e}.tar.gz`,b.click(),URL.revokeObjectURL(y),!0}catch{return!1}}async function Be(e){try{const i=ne(),l=le(),m={};l&&(m.Authorization=`Bearer ${l}`);const p=new FormData;return p.append("file",e),(await fetch(`${i}/api/hermes/profiles/import`,{method:"POST",headers:m,body:p})).ok}catch{return!1}}var Ke=k((()=>{J()})),ra=Ce({useProfilesStore:()=>ue}),E,ue,ia=k((()=>{re(),oe(),Ke(),ke(),E="hermes_active_profile_name",ue=ie("profiles",()=>{const e=u([]),i=u(localStorage.getItem(E)),l=u(null),m=u({}),p=u(!1),P=u(!1);async function y(){p.value=!0;try{e.value=await te();const t=i.value||localStorage.getItem(E);let o=e.value.find(c=>c.name===t)??null;!o&&e.value.length>0&&(o=e.value[0],i.value=o.name,localStorage.setItem(E,o.name)),e.value=e.value.map(c=>({...c,active:!!o&&c.name===o.name})),l.value=o,o?i.value=o.name:(i.value=null,localStorage.removeItem(E))}catch(t){console.error("Failed to fetch profiles:",t)}finally{p.value=!1}}async function b(){p.value=!0;try{e.value=await te(),l.value=e.value.find(t=>t.active)??null}catch(t){console.error("Failed to fetch Hermes profiles:",t)}finally{p.value=!1}}async function g(t){if(m.value[t])return m.value[t];try{const o=await De(t);return m.value[t]=o,o}catch{return null}}async function M(t,o){const c=await Ne(t,o);return e.value=e.value.map(R=>R.name===t?{...R,avatar:c}:R),m.value[t]&&(m.value[t]={...m.value[t],avatar:c}),l.value?.name===t&&(l.value={...l.value,avatar:c}),c}async function _(t){await Ge(t),e.value=e.value.map(o=>o.name===t?{...o,avatar:null}:o),m.value[t]&&(m.value[t]={...m.value[t],avatar:null}),l.value?.name===t&&(l.value={...l.value,avatar:null})}async function S(t,o){const c=await Fe(t,o);return c.success&&await y(),c}async function w(t){const o=await Ie(t);return o&&(delete m.value[t],await y()),o}function C(){}async function O(t,o){const c=await Ve(t,o);return c&&(delete m.value[t],await y()),c}async function A(t){P.value=!0;try{const o=await xe(t);return o&&(i.value=t,localStorage.setItem(E,t),e.value=e.value.map(c=>({...c,active:c.name===t})),l.value=e.value.find(c=>c.name===t)??null,await se().reloadModels()),o}finally{P.value=!1}}async function T(t){P.value=!0;try{const o=await Je(t);return o&&await b(),o}finally{P.value=!1}}async function D(t){return He(t)}async function N(t){const o=await Be(t);return o&&await y(),o}return{profiles:e,activeProfile:l,activeProfileName:i,detailMap:m,loading:p,switching:P,fetchProfiles:y,fetchHermesProfiles:b,fetchProfileDetail:g,createProfile:S,deleteProfile:w,renameProfile:O,switchProfile:A,switchHermesProfile:T,exportProfile:D,importProfile:N,updateAvatar:M,deleteAvatar:_,clearAllSessionCaches:C}})}));export{Ke as a,ke as c,qe as d,Qe as f,ea as g,Ae as h,aa as i,se as l,Ze as m,ra as n,ta as o,Le as p,ue as r,oa as s,ia as t,Xe as u};
@@ -1 +1 @@
1
- import{n as w}from"./rolldown-runtime-BKwlnUi0.js";import{Ct as I,Pt as l,W as E}from"./ui-vendor-BMwF7QXa.js";import{d as J,u as K}from"./vue-vendor-kBYBtqCg.js";import{r as p,t as $}from"./profiles-DiEn61KW.js";function m(){try{return p().activeProfileName||"default"}catch{return localStorage.getItem("hermes_active_profile_name")||"default"}}function f(n){return`${h}${n}`}function c(n){return`${P}${n}`}function i(n,e){try{const t=localStorage.getItem(n);return t?JSON.parse(t):e}catch{return e}}function _(n,e){try{localStorage.setItem(n,JSON.stringify(e))}catch{}}function H(n,e){return n.length===e.length&&n.every((t,a)=>t===e[a])}var h,P,M,X=w((()=>{J(),E(),$(),h="hermes_session_pins_v1_",P="hermes_human_only_v1_",M=K("session-browser-prefs",()=>{const n=l(m()),e=l(i(f(n.value),[])),t=l(i(c(n.value),!0));function a(){n.value=m(),e.value=i(f(n.value),[]),t.value=i(c(n.value),!0)}function s(){_(f(n.value),e.value)}function d(){_(c(n.value),t.value)}function o(r){return e.value.includes(r)}function g(r){o(r)?e.value=e.value.filter(u=>u!==r):e.value=[...e.value,r],s()}function y(r){return o(r)?(e.value=e.value.filter(u=>u!==r),s(),!0):!1}function S(r){t.value!==r&&(t.value=r,d())}function N(r){if(r.length===0)return!1;const u=new Set(r),v=e.value.filter(O=>u.has(O));return H(v,e.value)?!1:(e.value=v,s(),!0)}return I(()=>p().activeProfileName,()=>a()),{profileName:n,pinnedIds:e,humanOnly:t,reload:a,isPinned:o,togglePinned:g,removePinned:y,setHumanOnly:S,pruneMissingSessions:N}})}));export{M as n,X as t};
1
+ import{n as w}from"./rolldown-runtime-BKwlnUi0.js";import{Ct as I,Pt as l,W as E}from"./ui-vendor-BMwF7QXa.js";import{d as J,u as K}from"./vue-vendor-kBYBtqCg.js";import{r as p,t as $}from"./profiles-CyjgPK1f.js";function m(){try{return p().activeProfileName||"default"}catch{return localStorage.getItem("hermes_active_profile_name")||"default"}}function f(n){return`${h}${n}`}function c(n){return`${P}${n}`}function i(n,e){try{const t=localStorage.getItem(n);return t?JSON.parse(t):e}catch{return e}}function _(n,e){try{localStorage.setItem(n,JSON.stringify(e))}catch{}}function H(n,e){return n.length===e.length&&n.every((t,a)=>t===e[a])}var h,P,M,X=w((()=>{J(),E(),$(),h="hermes_session_pins_v1_",P="hermes_human_only_v1_",M=K("session-browser-prefs",()=>{const n=l(m()),e=l(i(f(n.value),[])),t=l(i(c(n.value),!0));function a(){n.value=m(),e.value=i(f(n.value),[]),t.value=i(c(n.value),!0)}function s(){_(f(n.value),e.value)}function d(){_(c(n.value),t.value)}function o(r){return e.value.includes(r)}function g(r){o(r)?e.value=e.value.filter(u=>u!==r):e.value=[...e.value,r],s()}function y(r){return o(r)?(e.value=e.value.filter(u=>u!==r),s(),!0):!1}function S(r){t.value!==r&&(t.value=r,d())}function N(r){if(r.length===0)return!1;const u=new Set(r),v=e.value.filter(O=>u.has(O));return H(v,e.value)?!1:(e.value=v,s(),!0)}return I(()=>p().activeProfileName,()=>a()),{profileName:n,pinnedIds:e,humanOnly:t,reload:a,isPinned:o,togglePinned:g,removePinned:y,setHumanOnly:S,pruneMissingSessions:N}})}));export{M as n,X as t};
@@ -1 +1 @@
1
- import{n as a}from"./rolldown-runtime-BKwlnUi0.js";import{d as i,l as t}from"./_plugin-vue_export-helper-B8gz9Iqn.js";async function l(){const s=await i("/api/hermes/skills");return{categories:s.categories,archived:s.archived??[]}}async function o(s=7){return i(`/api/hermes/skills/usage/stats?${new URLSearchParams({days:String(s)})}`)}async function c(s){return(await i(`/api/hermes/skills/${s}`)).content}async function m(s,e){return(await i(`/api/hermes/skills/${s}/${e}/files`)).files}async function f(){return i("/api/hermes/memory")}async function h(s,e){await i("/api/hermes/memory",{method:"POST",body:JSON.stringify({section:s,content:e})})}async function y(s,e){await i("/api/hermes/skills/toggle",{method:"PUT",body:JSON.stringify({name:s,enabled:e})})}async function u(s,e){await i("/api/hermes/skills/pin",{method:"PUT",body:JSON.stringify({name:s,pinned:e})})}var p=a((()=>{t()}));export{l as a,h as c,o as i,y as l,c as n,p as o,m as r,u as s,f as t};
1
+ import{n as a}from"./rolldown-runtime-BKwlnUi0.js";import{d as i,l as t}from"./_plugin-vue_export-helper-CHoatqkO.js";async function l(){const s=await i("/api/hermes/skills");return{categories:s.categories,archived:s.archived??[]}}async function o(s=7){return i(`/api/hermes/skills/usage/stats?${new URLSearchParams({days:String(s)})}`)}async function c(s){return(await i(`/api/hermes/skills/${s}`)).content}async function m(s,e){return(await i(`/api/hermes/skills/${s}/${e}/files`)).files}async function f(){return i("/api/hermes/memory")}async function h(s,e){await i("/api/hermes/memory",{method:"POST",body:JSON.stringify({section:s,content:e})})}async function y(s,e){await i("/api/hermes/skills/toggle",{method:"PUT",body:JSON.stringify({name:s,enabled:e})})}async function u(s,e){await i("/api/hermes/skills/pin",{method:"PUT",body:JSON.stringify({name:s,pinned:e})})}var p=a((()=>{t()}));export{l as a,h as c,o as i,y as l,c as n,p as o,m as r,u as s,f as t};
@@ -33,14 +33,14 @@
33
33
  }
34
34
  })();
35
35
  </script>
36
- <script type="module" crossorigin src="/assets/js/index-Cuk9R8hy.js"></script>
36
+ <script type="module" crossorigin src="/assets/js/index-DpU5R9KV.js"></script>
37
37
  <link rel="modulepreload" crossorigin href="/assets/js/rolldown-runtime-BKwlnUi0.js">
38
38
  <link rel="modulepreload" crossorigin href="/assets/js/mermaid-BShvZgMM.js">
39
39
  <link rel="modulepreload" crossorigin href="/assets/js/ui-vendor-BMwF7QXa.js">
40
40
  <link rel="modulepreload" crossorigin href="/assets/js/vendor-CGQjY-CL.js">
41
41
  <link rel="modulepreload" crossorigin href="/assets/js/vue-vendor-kBYBtqCg.js">
42
- <link rel="modulepreload" crossorigin href="/assets/js/_plugin-vue_export-helper-B8gz9Iqn.js">
43
- <link rel="modulepreload" crossorigin href="/assets/js/profiles-DiEn61KW.js">
42
+ <link rel="modulepreload" crossorigin href="/assets/js/_plugin-vue_export-helper-CHoatqkO.js">
43
+ <link rel="modulepreload" crossorigin href="/assets/js/profiles-CyjgPK1f.js">
44
44
  <link rel="stylesheet" crossorigin href="/assets/css/vendor-DX3NCGtF.css">
45
45
  <link rel="stylesheet" crossorigin href="/assets/css/index-DVBMQycc.css">
46
46
  </head>
@@ -237,7 +237,7 @@ Path:ssml\r
237
237
  \r
238
238
  `),Z.destroy();return}b.kanbanProfile=e||void 0}try{b.kanbanBoard=$Z(W.searchParams.get("board"))}catch{Z.write(`HTTP/1.1 400 Bad Request\r
239
239
  \r
240
- `),Z.destroy();return}l.handleUpgrade(b,Z,d,a=>{l.emit("connection",a,b)})}})}),l.on("connection",(c,b)=>{let Z=b.kanbanBoard||"default",d=_C({board:Z,interval:.5}),W=!1;Em(c,{type:"connected",board:Z});let a=()=>{W||(W=!0,d.killed||d.kill())};d.stdout?.on("data",tA(m=>{m.toLowerCase().startsWith("watching kanban events")||Em(c,{type:"event",board:Z})})),d.stderr?.on("data",tA(m=>{Em(c,{type:"error",board:Z,message:m})})),d.on("error",m=>{R.error(m,"Hermes CLI: kanban watch failed"),Em(c,{type:"error",board:Z,message:m.message}),c.readyState===c.OPEN&&c.close()}),d.on("exit",(m,e)=>{Em(c,{type:"stopped",board:Z,code:m,signal:e}),c.readyState===c.OPEN&&c.close()}),c.on("close",a),c.on("error",a)}),R.info("WebSocket ready at /api/hermes/kanban/events (kanban watch bridge)")}var HA=z(ya(),1),jaI=z(An(),1),iA=z(ya(),1),B2=z(An(),1),EY=require("url"),oW=z(FA(),1),rA=z(require("http"),1),vA=z(dl(),1),oA={NotFound:"not-found"};function OaI(I){return typeof I=="function"?I(oA):I}var MaI=class{_handlers=new Map;register(I,l){let G=this._handlers.get(I)??[];G.push(l),this._handlers.set(I,G)}emit(I,l,G){let c=this._handlers.get(I);return c&&c.length>0?(0,HA.default)(c)(l,G):G()}};function yY(I,l={}){let G={...l};"strict"in G&&!("trailing"in G)&&(G.trailing=G.strict!==!0,delete G.strict),delete G.pathAsRegExp,delete G.ignoreCaptures,delete G.prefix;let{regexp:c,keys:b}=(0,oW.pathToRegexp)(I,G);return{regexp:c,keys:b}}function KaI(I,l={}){return(0,oW.compile)(I,l)}function faI(I,l){return(0,oW.parse)(I,l)}function x2(I={}){let l={sensitive:I.sensitive,end:I.end,strict:I.strict,trailing:I.trailing};"strict"in l&&!("trailing"in l)&&(l.trailing=l.strict!==!0,delete l.strict);for(let G of Object.keys(l))l[G]===void 0&&delete l[G];return l}function SaI(I){try{return decodeURIComponent(I)}catch{return I}}var XA=class{opts;name;methods;paramNames;stack;path;regexp;constructor(I,l,G,c={}){this.opts=c,this.name=this.opts.name||void 0,this.methods=this._normalizeHttpMethods(l),this.stack=this._normalizeAndValidateMiddleware(G,l,I),this.path=I,this.paramNames=[],this._configurePathMatching()}_normalizeHttpMethods(I){let l=[];for(let G of I){let c=G.toUpperCase();l.push(c),c==="GET"&&l.unshift("HEAD")}return l}_normalizeAndValidateMiddleware(I,l,G){let c=Array.isArray(I)?I:[I];for(let b of c){let Z=typeof b;if(Z!=="function"){let d=this.opts.name||G;throw new Error(`${l.toString()} \`${d}\`: \`middleware\` must be a function, not \`${Z}\``)}}return c}_configurePathMatching(){this.opts.pathAsRegExp===!0?this.regexp=this.path instanceof RegExp?this.path:new RegExp(this.path):this.path&&this._configurePathToRegexp()}_configurePathToRegexp(){let I=x2(this.opts),{regexp:l,keys:G}=yY(this.path,I);this.regexp=l,this.paramNames=G}match(I){return this.regexp.test(I)}params(I,l,G={}){let c={...G};for(let[b,Z]of l.entries()){let d=this.paramNames[b];if(d&&Z&&Z.length>0){let W=d.name;c[W]=SaI(Z)}}return c}captures(I){if(this.opts.ignoreCaptures)return[];let l=I.match(this.regexp);return l?l.slice(1):[]}url(...I){if(this.path instanceof RegExp)throw new TypeError("Cannot generate URL for routes defined with RegExp paths. Use string paths with named parameters instead.");let{params:l,options:G}=this._parseUrlArguments(I),c=this.path.replaceAll("(.*)",""),b=KaI(c,{encode:encodeURIComponent,...G}),Z=this._buildParamReplacements(l,c),d=b(Z);return G&&G.query?this._addQueryString(d,G.query):d}_parseUrlArguments(I){let l=I[0]??{},G=I[1];if(typeof l!="object"||l===null){let c=[...I],b=c.at(-1);typeof b=="object"&&b!==null?(G=b,l=c.slice(0,-1)):l=c}else if(l&&!G){let c=Object.keys(l);if(c.length===1&&c[0]==="query")G=l,l={};else if("query"in l&&l.query){let{query:Z,...d}=l;G={query:Z},l=d}}return{params:l,options:G}}_buildParamReplacements(I,l){let{tokens:G}=faI(l),c=G.some(Z=>"name"in Z&&Z.name),b={};if(Array.isArray(I)){let Z=0;for(let d of G)"name"in d&&d.name&&(b[d.name]=String(I[Z++]))}else if(c&&typeof I=="object"&&!("query"in I))for(let[Z,d]of Object.entries(I))b[Z]=String(d);return b}_addQueryString(I,l){let G=(0,EY.parse)(I),c={...G,query:G.query??void 0};return typeof l=="string"?(c.search=l,c.query=void 0):(c.search=void 0,c.query=l),(0,EY.format)(c)}param(I,l){let G=this.stack,c=this.paramNames,b=this._createParamMiddleware(I,l),Z=c.map(W=>W.name),d=Z.indexOf(I);return d!==-1&&this._insertParamMiddleware(G,b,Z,d),this}_createParamMiddleware(I,l){let G=((c,b)=>(c._matchedParams||(c._matchedParams=new WeakMap),c._matchedParams.has(l)?b():(c._matchedParams.set(l,!0),l(c.params[I],c,b))));return G.param=I,G._originalFn=l,G}_insertParamMiddleware(I,l,G,c){let b=!1;for(let Z=0;Z<I.length;Z++){let d=I[Z];if(!d.param){I.splice(Z,0,l),b=!0;break}if(G.indexOf(d.param)>c){I.splice(Z,0,l),b=!0;break}}b||I.push(l)}setPrefix(I){return this.path?this.path instanceof RegExp?this:(this.path=this._applyPrefix(I),this._reconfigurePathMatching(I),this):this}_applyPrefix(I){let l=this.path==="/",G=this.opts.strict===!0,c=I.includes(":"),b=this.opts.pathAsRegExp===!0&&typeof this.path=="string";if(c&&b){let Z=this.path;(Z===String.raw`(?:\/|$)`||Z===String.raw`(?:\\\/|$)`)&&(this.path="{/*rest}",this.opts.pathAsRegExp=!1)}return l&&!G?I:`${I}${this.path}`}_reconfigurePathMatching(I){let l=this.opts.pathAsRegExp===!0;if(I&&I.includes(":")&&l){let c=x2(this.opts),{regexp:b,keys:Z}=yY(this.path,c);this.regexp=b,this.paramNames=Z,this.opts.pathAsRegExp=!1}else if(l){let c=this.path,b=c.startsWith("^")?c:`^${c}`;this.regexp=this.path instanceof RegExp?this.path:new RegExp(b)}else{let c=x2(this.opts),{regexp:b,keys:Z}=yY(this.path,c);this.regexp=b,this.paramNames=Z}}};function TaI(){return rA.default.METHODS.map(I=>I.toLowerCase())}var DaI=["get","post","put","patch","delete","del","head","options"];function qaI(I){return I?Array.isArray(I)?I:[I]:[]}function wA(I,l,G){let c=qaI(G);for(let b of c)I.param(l,b)}function PaI(I,l){let G=Object.keys(l);for(let c of G){let b=l[c];wA(I,c,b)}}function QA(I,l={}){if(!I)return!1;let{keys:G}=yY(I,l);return G.length>0}function _aI(I,l){return I!==void 0?typeof I=="string"?I===""?{path:"{/*rest}",pathAsRegExp:!1}:I==="/"?{path:"/",pathAsRegExp:!1}:{path:I,pathAsRegExp:!1}:{path:I,pathAsRegExp:!0}:l?{path:"{/*rest}",pathAsRegExp:!1}:{path:String.raw`(?:\/|$)`,pathAsRegExp:!0}}var U2=(0,vA.default)("koa-router"),yA=TaI(),O2=class{opts;methods;exclusive;params;stack;host;_events=new MaI;constructor(I={}){this.opts=I,this.methods=this.opts.methods||["HEAD","OPTIONS","GET","PUT","PATCH","POST","DELETE"],this.exclusive=!!this.opts.exclusive,this.params={},this.stack=[],this.host=this.opts.host}static url(I,...l){return new XA(I,[],()=>{}).url(...l)}use(...I){let l;if(this._isPathArray(I[0]))return this._useWithPathArray(I);let G=this._hasExplicitPath(I[0]);if(G&&(l=I.shift()),I.length===0)throw new Error("You must provide at least one middleware function to router.use()");for(let c of I)this._isNestedRouter(c)?this._mountNestedRouter(c,l):this._registerMiddleware(c,l,G);return this}_isPathArray(I){return Array.isArray(I)&&I.length>0&&I.every(l=>typeof l=="string")}_hasExplicitPath(I){return typeof I=="string"||I instanceof RegExp}_isNestedRouter(I){return typeof I=="function"&&"router"in I&&I.router!==void 0}_useWithPathArray(I){let l=I[0],G=I.slice(1);for(let c of l)Reflect.apply(this.use,this,[c,...G]);return this}_mountNestedRouter(I,l){let G=I.router,c=this._cloneRouter(G),b=l&&typeof l=="string"&&QA(l,this.opts);for(let Z=0;Z<c.stack.length;Z++){let d=c.stack[Z],W=this._cloneLayer(d);l&&typeof l=="string"&&W.setPrefix(l),this.opts.prefix&&W.setPrefix(this.opts.prefix),W.methods.length===0&&b&&(W.opts.ignoreCaptures=!1),this.stack.push(W),c.stack[Z]=W}this.params&&this._applyParamMiddlewareToRouter(c)}_cloneRouter(I){return Object.assign(Object.create(Object.getPrototypeOf(I)),I,{stack:[...I.stack]})}_cloneLayer(I){return Object.assign(Object.create(Object.getPrototypeOf(I)),I,{stack:[...I.stack],methods:[...I.methods],paramNames:[...I.paramNames],opts:{...I.opts}})}_applyParamMiddlewareToRouter(I){let l=Object.keys(this.params);for(let G of l){let c=this.params[G];wA(I,G,c)}}_registerMiddleware(I,l,G){let c=QA(this.opts.prefix||"",this.opts),b=(()=>{if(l!==void 0)return l;if(c)return""})(),Z=G||l===void 0&&c,{path:d,pathAsRegExp:W}=_aI(b,c),a=d,m=W,e=Z&&d==="/";Z&&typeof d=="string"&&(a=d,m=!1),this.register(a,[],I,{end:e,ignoreCaptures:!Z&&!c,pathAsRegExp:m})}prefix(I){let l=I.replace(/\/$/,""),G=this.opts.prefix||"";this.opts.prefix=l;for(let c of this.stack){if(typeof c.path=="string"&&G){let b=G+"/";(c.path===G||c.path.startsWith(b))&&(c.path=c.path.slice(G.length)||"/")}c.setPrefix(l)}return this}middleware(){let I=function(l,G){if(U2("%s %s",l.method,l.path),!this.matchHost(l.host))return G();let c=this._getRequestPath(l),b=this.match(c,l.method);if(this._storeMatchedRoutes(l,b),l.router=this,l.routeMatched=b.route,!b.route)return this._events.emit(oA.NotFound,l,G);let Z=b.pathAndMethod;this._setMatchedRouteInfo(l,Z);let d=this._buildMiddlewareChain(Z,c);return(0,iA.default)(d)(l,G)}.bind(this);return I.router=this,I}_getRequestPath(I){let l=I;return this.opts.routerPath||l.newRouterPath||l.path||l.routerPath||""}_storeMatchedRoutes(I,l){let G=I;G.matched?G.matched.push(...l.path):G.matched=l.path}_setMatchedRouteInfo(I,l){let G=I,c=l.toReversed().find(b=>b.methods.length>0);c&&(G._matchedRoute=c.path,c.name&&(G._matchedRouteName=c.name))}_buildMiddlewareChain(I,l){let G;if(this.exclusive){let b;if(this.opts.exclusive==="specificity")for(let Z of I)(!b||Z.paramNames.length<b.paramNames.length)&&(b=Z);else b=I.at(-1);G=b?[b]:[]}else G=I;let c=[];for(let b of G)c.push((Z,d)=>{let W=Z;return W.captures=b.captures(l),W.request.params=b.params(l,W.captures||[],W.params),W.params=W.request.params,W.routerPath=b.path,W.routerName=b.name||void 0,W._matchedRoute=b.path,b.name&&(W._matchedRouteName=b.name),d()},...b.stack);return c}routes(){return this.middleware()}on(I,l){return this._events.register(OaI(I),l),this}allowedMethods(I={}){let l=this.methods;return(G,c)=>{let b=G;return c().then(()=>{if(!this._shouldProcessAllowedMethods(b))return;let Z=b.matched||[],d=this._collectAllowedMethods(Z),W=Object.keys(d),a=G.method.toUpperCase();if(!l.includes(a)){this._handleNotImplemented(b,W,I);return}if(a==="OPTIONS"&&W.length>0){this._handleOptionsRequest(b,W);return}W.length>0&&!d[a]&&this._handleMethodNotAllowed(b,W,I)})}}_shouldProcessAllowedMethods(I){return!!(I.matched&&(!I.status||I.status===404))}_collectAllowedMethods(I){let l={};for(let G of I)for(let c of G.methods)l[c]=c;return l}_handleNotImplemented(I,l,G){if(G.throw)throw typeof G.notImplemented=="function"?G.notImplemented():new B2.default.NotImplemented;I.status=501,I.set("Allow",l.join(", "))}_handleOptionsRequest(I,l){I.status=200,I.body="",I.set("Allow",l.join(", "))}_handleMethodNotAllowed(I,l,G){if(G.throw)throw typeof G.methodNotAllowed=="function"?G.methodNotAllowed():new B2.default.MethodNotAllowed;I.status=405,I.set("Allow",l.join(", "))}all(...I){let l,G,c;if(I.length>=2&&(typeof I[1]=="string"||I[1]instanceof RegExp)?(l=I[0],G=I[1],c=I.slice(2)):(l=void 0,G=I[0],c=I.slice(1)),typeof G!="string"&&!(G instanceof RegExp)&&(!Array.isArray(G)||G.length===0))throw new Error("You have to provide a path when adding an all handler");let b={name:l,pathAsRegExp:G instanceof RegExp};return this.register(G,yA,c,{...this.opts,...b}),this}redirect(I,l,G){let c=I,b=l;if(typeof I=="symbol"||typeof I=="string"&&I[0]!=="/"){let d=this.url(I);if(d instanceof Error)throw d;c=d}if(typeof l=="symbol"||typeof l=="string"&&l[0]!=="/"&&!l.includes("://")){let d=this.url(l);if(d instanceof Error)throw d;b=d}return this.all(c,d=>{d.redirect(b),d.status=G||301})}register(I,l,G,c={}){let b={...this.opts,...c};if(Array.isArray(I))return this._registerMultiplePaths(I,l,G,b);let Z=this._createRouteLayer(I,l,G,b);return this.opts.prefix&&Z.setPrefix(this.opts.prefix),PaI(Z,this.params),this.stack.push(Z),U2("defined route %s %s",Z.methods,Z.path),Z}_registerMultiplePaths(I,l,G,c){for(let b of I)this.register.call(this,b,l,G,c);return this}_createRouteLayer(I,l,G,c){return new XA(I,l,G,{end:c.end===!1?c.end:!0,name:c.name,sensitive:c.sensitive||!1,strict:c.strict||!1,prefix:c.prefix||"",ignoreCaptures:c.ignoreCaptures,pathAsRegExp:c.pathAsRegExp})}route(I){return this.stack.find(G=>G.name===I)||!1}url(I,...l){let G=this.route(I);return G?G.url(...l):new Error(`No route found for name: ${String(I)}`)}match(I,l){let G={path:[],pathAndMethod:[],route:!1},c=l.toUpperCase();for(let b of this.stack)if(U2("test %s %s",b.path,b.regexp),b.match(I)){G.path.push(b);let Z=b.methods.length===0,d=b.methods.includes(c);(Z||d)&&(G.pathAndMethod.push(b),b.methods.length>0&&(G.route=!0))}return G}matchHost(I){let{host:l}=this;return l?I?typeof l=="string"?I===l:Array.isArray(l)?l.includes(I):l instanceof RegExp?l.test(I):!1:!1:!0}param(I,l){this.params[I]||(this.params[I]=[]),Array.isArray(this.params[I])||(this.params[I]=[this.params[I]]),this.params[I].push(l);for(let G of this.stack)G.param(I,l);return this}_registerMethod(I,...l){let G,c,b;if(l.length>=2&&(typeof l[1]=="string"||l[1]instanceof RegExp)?(G=l[0],c=l[1],b=l.slice(2)):(G=void 0,c=l[0],b=l.slice(1)),typeof c!="string"&&!(c instanceof RegExp)&&(!Array.isArray(c)||c.length===0))throw new Error(`You have to provide a path when adding a ${I} handler`);let Z={name:G,pathAsRegExp:c instanceof RegExp};return this.register(c,[I],b,{...this.opts,...Z}),this}get(...I){return this._registerMethod("get",...I)}post(...I){return this._registerMethod("post",...I)}put(...I){return this._registerMethod("put",...I)}patch(...I){return this._registerMethod("patch",...I)}delete(...I){return this._registerMethod("delete",...I)}del(...I){return this.delete.apply(this,I)}head(...I){return this._registerMethod("head",...I)}options(...I){return this._registerMethod("options",...I)}},$aI=O2,U=$aI;for(let I of yA)DaI.includes(I)||I in O2.prototype||Object.defineProperty(O2.prototype,I,{value:function(...G){return this._registerMethod(I,...G)},writable:!0,configurable:!0,enumerable:!1});var SY=require("fs"),fY=require("path");rW();function umI(){let I=[(0,fY.resolve)(__dirname,"../../../../package.json"),(0,fY.resolve)(__dirname,"../../package.json"),(0,fY.resolve)(process.cwd(),"package.json")];for(let l of I)if((0,SY.existsSync)(l))try{let G=JSON.parse((0,SY.readFileSync)(l,"utf-8"));if(G?.name&&G?.version)return{name:String(G.name),version:String(G.version)}}catch{}return null}var RmI=umI(),wW="0.6.0-beta.2",vW="";async function n4(){try{let I=RmI?.name||"hermes-web-ui",l=encodeURIComponent(I),G=await fetch(`https://registry.npmjs.org/${l}/latest`,{signal:AbortSignal.timeout(1e4)});G.ok&&(vW=(await G.json()).version,wW&&vW!==wW&&console.log(`Update available: ${wW} \u2192 ${vW}`))}catch{}}function GR(){setTimeout(n4,5e3),setInterval(n4,1800*1e3)}async function N4(I){let G=(await G4()).split(`
240
+ `),Z.destroy();return}l.handleUpgrade(b,Z,d,a=>{l.emit("connection",a,b)})}})}),l.on("connection",(c,b)=>{let Z=b.kanbanBoard||"default",d=_C({board:Z,interval:.5}),W=!1;Em(c,{type:"connected",board:Z});let a=()=>{W||(W=!0,d.killed||d.kill())};d.stdout?.on("data",tA(m=>{m.toLowerCase().startsWith("watching kanban events")||Em(c,{type:"event",board:Z})})),d.stderr?.on("data",tA(m=>{Em(c,{type:"error",board:Z,message:m})})),d.on("error",m=>{R.error(m,"Hermes CLI: kanban watch failed"),Em(c,{type:"error",board:Z,message:m.message}),c.readyState===c.OPEN&&c.close()}),d.on("exit",(m,e)=>{Em(c,{type:"stopped",board:Z,code:m,signal:e}),c.readyState===c.OPEN&&c.close()}),c.on("close",a),c.on("error",a)}),R.info("WebSocket ready at /api/hermes/kanban/events (kanban watch bridge)")}var HA=z(ya(),1),jaI=z(An(),1),iA=z(ya(),1),B2=z(An(),1),EY=require("url"),oW=z(FA(),1),rA=z(require("http"),1),vA=z(dl(),1),oA={NotFound:"not-found"};function OaI(I){return typeof I=="function"?I(oA):I}var MaI=class{_handlers=new Map;register(I,l){let G=this._handlers.get(I)??[];G.push(l),this._handlers.set(I,G)}emit(I,l,G){let c=this._handlers.get(I);return c&&c.length>0?(0,HA.default)(c)(l,G):G()}};function yY(I,l={}){let G={...l};"strict"in G&&!("trailing"in G)&&(G.trailing=G.strict!==!0,delete G.strict),delete G.pathAsRegExp,delete G.ignoreCaptures,delete G.prefix;let{regexp:c,keys:b}=(0,oW.pathToRegexp)(I,G);return{regexp:c,keys:b}}function KaI(I,l={}){return(0,oW.compile)(I,l)}function faI(I,l){return(0,oW.parse)(I,l)}function x2(I={}){let l={sensitive:I.sensitive,end:I.end,strict:I.strict,trailing:I.trailing};"strict"in l&&!("trailing"in l)&&(l.trailing=l.strict!==!0,delete l.strict);for(let G of Object.keys(l))l[G]===void 0&&delete l[G];return l}function SaI(I){try{return decodeURIComponent(I)}catch{return I}}var XA=class{opts;name;methods;paramNames;stack;path;regexp;constructor(I,l,G,c={}){this.opts=c,this.name=this.opts.name||void 0,this.methods=this._normalizeHttpMethods(l),this.stack=this._normalizeAndValidateMiddleware(G,l,I),this.path=I,this.paramNames=[],this._configurePathMatching()}_normalizeHttpMethods(I){let l=[];for(let G of I){let c=G.toUpperCase();l.push(c),c==="GET"&&l.unshift("HEAD")}return l}_normalizeAndValidateMiddleware(I,l,G){let c=Array.isArray(I)?I:[I];for(let b of c){let Z=typeof b;if(Z!=="function"){let d=this.opts.name||G;throw new Error(`${l.toString()} \`${d}\`: \`middleware\` must be a function, not \`${Z}\``)}}return c}_configurePathMatching(){this.opts.pathAsRegExp===!0?this.regexp=this.path instanceof RegExp?this.path:new RegExp(this.path):this.path&&this._configurePathToRegexp()}_configurePathToRegexp(){let I=x2(this.opts),{regexp:l,keys:G}=yY(this.path,I);this.regexp=l,this.paramNames=G}match(I){return this.regexp.test(I)}params(I,l,G={}){let c={...G};for(let[b,Z]of l.entries()){let d=this.paramNames[b];if(d&&Z&&Z.length>0){let W=d.name;c[W]=SaI(Z)}}return c}captures(I){if(this.opts.ignoreCaptures)return[];let l=I.match(this.regexp);return l?l.slice(1):[]}url(...I){if(this.path instanceof RegExp)throw new TypeError("Cannot generate URL for routes defined with RegExp paths. Use string paths with named parameters instead.");let{params:l,options:G}=this._parseUrlArguments(I),c=this.path.replaceAll("(.*)",""),b=KaI(c,{encode:encodeURIComponent,...G}),Z=this._buildParamReplacements(l,c),d=b(Z);return G&&G.query?this._addQueryString(d,G.query):d}_parseUrlArguments(I){let l=I[0]??{},G=I[1];if(typeof l!="object"||l===null){let c=[...I],b=c.at(-1);typeof b=="object"&&b!==null?(G=b,l=c.slice(0,-1)):l=c}else if(l&&!G){let c=Object.keys(l);if(c.length===1&&c[0]==="query")G=l,l={};else if("query"in l&&l.query){let{query:Z,...d}=l;G={query:Z},l=d}}return{params:l,options:G}}_buildParamReplacements(I,l){let{tokens:G}=faI(l),c=G.some(Z=>"name"in Z&&Z.name),b={};if(Array.isArray(I)){let Z=0;for(let d of G)"name"in d&&d.name&&(b[d.name]=String(I[Z++]))}else if(c&&typeof I=="object"&&!("query"in I))for(let[Z,d]of Object.entries(I))b[Z]=String(d);return b}_addQueryString(I,l){let G=(0,EY.parse)(I),c={...G,query:G.query??void 0};return typeof l=="string"?(c.search=l,c.query=void 0):(c.search=void 0,c.query=l),(0,EY.format)(c)}param(I,l){let G=this.stack,c=this.paramNames,b=this._createParamMiddleware(I,l),Z=c.map(W=>W.name),d=Z.indexOf(I);return d!==-1&&this._insertParamMiddleware(G,b,Z,d),this}_createParamMiddleware(I,l){let G=((c,b)=>(c._matchedParams||(c._matchedParams=new WeakMap),c._matchedParams.has(l)?b():(c._matchedParams.set(l,!0),l(c.params[I],c,b))));return G.param=I,G._originalFn=l,G}_insertParamMiddleware(I,l,G,c){let b=!1;for(let Z=0;Z<I.length;Z++){let d=I[Z];if(!d.param){I.splice(Z,0,l),b=!0;break}if(G.indexOf(d.param)>c){I.splice(Z,0,l),b=!0;break}}b||I.push(l)}setPrefix(I){return this.path?this.path instanceof RegExp?this:(this.path=this._applyPrefix(I),this._reconfigurePathMatching(I),this):this}_applyPrefix(I){let l=this.path==="/",G=this.opts.strict===!0,c=I.includes(":"),b=this.opts.pathAsRegExp===!0&&typeof this.path=="string";if(c&&b){let Z=this.path;(Z===String.raw`(?:\/|$)`||Z===String.raw`(?:\\\/|$)`)&&(this.path="{/*rest}",this.opts.pathAsRegExp=!1)}return l&&!G?I:`${I}${this.path}`}_reconfigurePathMatching(I){let l=this.opts.pathAsRegExp===!0;if(I&&I.includes(":")&&l){let c=x2(this.opts),{regexp:b,keys:Z}=yY(this.path,c);this.regexp=b,this.paramNames=Z,this.opts.pathAsRegExp=!1}else if(l){let c=this.path,b=c.startsWith("^")?c:`^${c}`;this.regexp=this.path instanceof RegExp?this.path:new RegExp(b)}else{let c=x2(this.opts),{regexp:b,keys:Z}=yY(this.path,c);this.regexp=b,this.paramNames=Z}}};function TaI(){return rA.default.METHODS.map(I=>I.toLowerCase())}var DaI=["get","post","put","patch","delete","del","head","options"];function qaI(I){return I?Array.isArray(I)?I:[I]:[]}function wA(I,l,G){let c=qaI(G);for(let b of c)I.param(l,b)}function PaI(I,l){let G=Object.keys(l);for(let c of G){let b=l[c];wA(I,c,b)}}function QA(I,l={}){if(!I)return!1;let{keys:G}=yY(I,l);return G.length>0}function _aI(I,l){return I!==void 0?typeof I=="string"?I===""?{path:"{/*rest}",pathAsRegExp:!1}:I==="/"?{path:"/",pathAsRegExp:!1}:{path:I,pathAsRegExp:!1}:{path:I,pathAsRegExp:!0}:l?{path:"{/*rest}",pathAsRegExp:!1}:{path:String.raw`(?:\/|$)`,pathAsRegExp:!0}}var U2=(0,vA.default)("koa-router"),yA=TaI(),O2=class{opts;methods;exclusive;params;stack;host;_events=new MaI;constructor(I={}){this.opts=I,this.methods=this.opts.methods||["HEAD","OPTIONS","GET","PUT","PATCH","POST","DELETE"],this.exclusive=!!this.opts.exclusive,this.params={},this.stack=[],this.host=this.opts.host}static url(I,...l){return new XA(I,[],()=>{}).url(...l)}use(...I){let l;if(this._isPathArray(I[0]))return this._useWithPathArray(I);let G=this._hasExplicitPath(I[0]);if(G&&(l=I.shift()),I.length===0)throw new Error("You must provide at least one middleware function to router.use()");for(let c of I)this._isNestedRouter(c)?this._mountNestedRouter(c,l):this._registerMiddleware(c,l,G);return this}_isPathArray(I){return Array.isArray(I)&&I.length>0&&I.every(l=>typeof l=="string")}_hasExplicitPath(I){return typeof I=="string"||I instanceof RegExp}_isNestedRouter(I){return typeof I=="function"&&"router"in I&&I.router!==void 0}_useWithPathArray(I){let l=I[0],G=I.slice(1);for(let c of l)Reflect.apply(this.use,this,[c,...G]);return this}_mountNestedRouter(I,l){let G=I.router,c=this._cloneRouter(G),b=l&&typeof l=="string"&&QA(l,this.opts);for(let Z=0;Z<c.stack.length;Z++){let d=c.stack[Z],W=this._cloneLayer(d);l&&typeof l=="string"&&W.setPrefix(l),this.opts.prefix&&W.setPrefix(this.opts.prefix),W.methods.length===0&&b&&(W.opts.ignoreCaptures=!1),this.stack.push(W),c.stack[Z]=W}this.params&&this._applyParamMiddlewareToRouter(c)}_cloneRouter(I){return Object.assign(Object.create(Object.getPrototypeOf(I)),I,{stack:[...I.stack]})}_cloneLayer(I){return Object.assign(Object.create(Object.getPrototypeOf(I)),I,{stack:[...I.stack],methods:[...I.methods],paramNames:[...I.paramNames],opts:{...I.opts}})}_applyParamMiddlewareToRouter(I){let l=Object.keys(this.params);for(let G of l){let c=this.params[G];wA(I,G,c)}}_registerMiddleware(I,l,G){let c=QA(this.opts.prefix||"",this.opts),b=(()=>{if(l!==void 0)return l;if(c)return""})(),Z=G||l===void 0&&c,{path:d,pathAsRegExp:W}=_aI(b,c),a=d,m=W,e=Z&&d==="/";Z&&typeof d=="string"&&(a=d,m=!1),this.register(a,[],I,{end:e,ignoreCaptures:!Z&&!c,pathAsRegExp:m})}prefix(I){let l=I.replace(/\/$/,""),G=this.opts.prefix||"";this.opts.prefix=l;for(let c of this.stack){if(typeof c.path=="string"&&G){let b=G+"/";(c.path===G||c.path.startsWith(b))&&(c.path=c.path.slice(G.length)||"/")}c.setPrefix(l)}return this}middleware(){let I=function(l,G){if(U2("%s %s",l.method,l.path),!this.matchHost(l.host))return G();let c=this._getRequestPath(l),b=this.match(c,l.method);if(this._storeMatchedRoutes(l,b),l.router=this,l.routeMatched=b.route,!b.route)return this._events.emit(oA.NotFound,l,G);let Z=b.pathAndMethod;this._setMatchedRouteInfo(l,Z);let d=this._buildMiddlewareChain(Z,c);return(0,iA.default)(d)(l,G)}.bind(this);return I.router=this,I}_getRequestPath(I){let l=I;return this.opts.routerPath||l.newRouterPath||l.path||l.routerPath||""}_storeMatchedRoutes(I,l){let G=I;G.matched?G.matched.push(...l.path):G.matched=l.path}_setMatchedRouteInfo(I,l){let G=I,c=l.toReversed().find(b=>b.methods.length>0);c&&(G._matchedRoute=c.path,c.name&&(G._matchedRouteName=c.name))}_buildMiddlewareChain(I,l){let G;if(this.exclusive){let b;if(this.opts.exclusive==="specificity")for(let Z of I)(!b||Z.paramNames.length<b.paramNames.length)&&(b=Z);else b=I.at(-1);G=b?[b]:[]}else G=I;let c=[];for(let b of G)c.push((Z,d)=>{let W=Z;return W.captures=b.captures(l),W.request.params=b.params(l,W.captures||[],W.params),W.params=W.request.params,W.routerPath=b.path,W.routerName=b.name||void 0,W._matchedRoute=b.path,b.name&&(W._matchedRouteName=b.name),d()},...b.stack);return c}routes(){return this.middleware()}on(I,l){return this._events.register(OaI(I),l),this}allowedMethods(I={}){let l=this.methods;return(G,c)=>{let b=G;return c().then(()=>{if(!this._shouldProcessAllowedMethods(b))return;let Z=b.matched||[],d=this._collectAllowedMethods(Z),W=Object.keys(d),a=G.method.toUpperCase();if(!l.includes(a)){this._handleNotImplemented(b,W,I);return}if(a==="OPTIONS"&&W.length>0){this._handleOptionsRequest(b,W);return}W.length>0&&!d[a]&&this._handleMethodNotAllowed(b,W,I)})}}_shouldProcessAllowedMethods(I){return!!(I.matched&&(!I.status||I.status===404))}_collectAllowedMethods(I){let l={};for(let G of I)for(let c of G.methods)l[c]=c;return l}_handleNotImplemented(I,l,G){if(G.throw)throw typeof G.notImplemented=="function"?G.notImplemented():new B2.default.NotImplemented;I.status=501,I.set("Allow",l.join(", "))}_handleOptionsRequest(I,l){I.status=200,I.body="",I.set("Allow",l.join(", "))}_handleMethodNotAllowed(I,l,G){if(G.throw)throw typeof G.methodNotAllowed=="function"?G.methodNotAllowed():new B2.default.MethodNotAllowed;I.status=405,I.set("Allow",l.join(", "))}all(...I){let l,G,c;if(I.length>=2&&(typeof I[1]=="string"||I[1]instanceof RegExp)?(l=I[0],G=I[1],c=I.slice(2)):(l=void 0,G=I[0],c=I.slice(1)),typeof G!="string"&&!(G instanceof RegExp)&&(!Array.isArray(G)||G.length===0))throw new Error("You have to provide a path when adding an all handler");let b={name:l,pathAsRegExp:G instanceof RegExp};return this.register(G,yA,c,{...this.opts,...b}),this}redirect(I,l,G){let c=I,b=l;if(typeof I=="symbol"||typeof I=="string"&&I[0]!=="/"){let d=this.url(I);if(d instanceof Error)throw d;c=d}if(typeof l=="symbol"||typeof l=="string"&&l[0]!=="/"&&!l.includes("://")){let d=this.url(l);if(d instanceof Error)throw d;b=d}return this.all(c,d=>{d.redirect(b),d.status=G||301})}register(I,l,G,c={}){let b={...this.opts,...c};if(Array.isArray(I))return this._registerMultiplePaths(I,l,G,b);let Z=this._createRouteLayer(I,l,G,b);return this.opts.prefix&&Z.setPrefix(this.opts.prefix),PaI(Z,this.params),this.stack.push(Z),U2("defined route %s %s",Z.methods,Z.path),Z}_registerMultiplePaths(I,l,G,c){for(let b of I)this.register.call(this,b,l,G,c);return this}_createRouteLayer(I,l,G,c){return new XA(I,l,G,{end:c.end===!1?c.end:!0,name:c.name,sensitive:c.sensitive||!1,strict:c.strict||!1,prefix:c.prefix||"",ignoreCaptures:c.ignoreCaptures,pathAsRegExp:c.pathAsRegExp})}route(I){return this.stack.find(G=>G.name===I)||!1}url(I,...l){let G=this.route(I);return G?G.url(...l):new Error(`No route found for name: ${String(I)}`)}match(I,l){let G={path:[],pathAndMethod:[],route:!1},c=l.toUpperCase();for(let b of this.stack)if(U2("test %s %s",b.path,b.regexp),b.match(I)){G.path.push(b);let Z=b.methods.length===0,d=b.methods.includes(c);(Z||d)&&(G.pathAndMethod.push(b),b.methods.length>0&&(G.route=!0))}return G}matchHost(I){let{host:l}=this;return l?I?typeof l=="string"?I===l:Array.isArray(l)?l.includes(I):l instanceof RegExp?l.test(I):!1:!1:!0}param(I,l){this.params[I]||(this.params[I]=[]),Array.isArray(this.params[I])||(this.params[I]=[this.params[I]]),this.params[I].push(l);for(let G of this.stack)G.param(I,l);return this}_registerMethod(I,...l){let G,c,b;if(l.length>=2&&(typeof l[1]=="string"||l[1]instanceof RegExp)?(G=l[0],c=l[1],b=l.slice(2)):(G=void 0,c=l[0],b=l.slice(1)),typeof c!="string"&&!(c instanceof RegExp)&&(!Array.isArray(c)||c.length===0))throw new Error(`You have to provide a path when adding a ${I} handler`);let Z={name:G,pathAsRegExp:c instanceof RegExp};return this.register(c,[I],b,{...this.opts,...Z}),this}get(...I){return this._registerMethod("get",...I)}post(...I){return this._registerMethod("post",...I)}put(...I){return this._registerMethod("put",...I)}patch(...I){return this._registerMethod("patch",...I)}delete(...I){return this._registerMethod("delete",...I)}del(...I){return this.delete.apply(this,I)}head(...I){return this._registerMethod("head",...I)}options(...I){return this._registerMethod("options",...I)}},$aI=O2,U=$aI;for(let I of yA)DaI.includes(I)||I in O2.prototype||Object.defineProperty(O2.prototype,I,{value:function(...G){return this._registerMethod(I,...G)},writable:!0,configurable:!0,enumerable:!1});var SY=require("fs"),fY=require("path");rW();function umI(){let I=[(0,fY.resolve)(__dirname,"../../../../package.json"),(0,fY.resolve)(__dirname,"../../package.json"),(0,fY.resolve)(process.cwd(),"package.json")];for(let l of I)if((0,SY.existsSync)(l))try{let G=JSON.parse((0,SY.readFileSync)(l,"utf-8"));if(G?.name&&G?.version)return{name:String(G.name),version:String(G.version)}}catch{}return null}var RmI=umI(),wW="0.6.0",vW="";async function n4(){try{let I=RmI?.name||"hermes-web-ui",l=encodeURIComponent(I),G=await fetch(`https://registry.npmjs.org/${l}/latest`,{signal:AbortSignal.timeout(1e4)});G.ok&&(vW=(await G.json()).version,wW&&vW!==wW&&console.log(`Update available: ${wW} \u2192 ${vW}`))}catch{}}function GR(){setTimeout(n4,5e3),setInterval(n4,1800*1e3)}async function N4(I){let G=(await G4()).split(`
241
241
  `)[0].replace("Hermes Agent ","")||"";I.body={status:"ok",platform:"hermes-agent",version:G,gateway:"running",webui_version:wW,webui_latest:vW,webui_update_available:!!(wW&&vW&&vW!==wW),node_version:process.versions.node}}var cR=new U;cR.get("/health",N4);GI();async function Y4(I){let l=I.request.body;if(!l||!l.event){I.status=400,I.body={error:"Missing event field"};return}R.info("Received webhook event: %s",l.event),I.body={ok:!0}}var bR=new U;bR.post("/webhook",Y4);var s4=require("crypto"),DY=require("fs/promises"),h4=require("path");mI();var TY=require("path");XG();ZG();function QmI(I){let l=(I||"default").trim()||"default";if(l.includes("/")||l.includes("\\")||l.includes(".."))throw Object.assign(new Error("Invalid profile name"),{code:"invalid_profile"});return l}function t4(I){return(0,TY.resolve)((0,TY.join)(YI.uploadDir,QmI(I)))}var V4=50*1024*1024;function HmI(I){return I.state?.profile?.name||ZI()||"default"}async function p4(I){let l=I.get("content-type")||"";if(!l.startsWith("multipart/form-data")){I.status=400,I.body={error:"Expected multipart/form-data"};return}let G="--"+l.split("boundary=")[1];if(!G||G==="--undefined"){I.status=400,I.body={error:"Missing boundary"};return}let c=[],b=0;for await(let e of I.req){if(b+=e.length,b>V4){I.status=413,I.body={error:`File too large (max ${V4/1024/1024}MB)`};return}c.push(e)}let Z=Buffer.concat(c),d=Buffer.from(G),W=omI(Z,d),a=[],m=t4(HmI(I));await(0,DY.mkdir)(m,{recursive:!0});for(let e of W){let n=e.indexOf(Buffer.from(`\r
242
242
  \r
243
243
  `));if(n===-1)continue;let Y=e.subarray(0,n).toString("utf-8"),t=e.subarray(n+4,e.length-2),V="",h=Y.match(/filename\*=UTF-8''(.+)/i);if(h)V=decodeURIComponent(h[1]);else{let u=Y.match(/filename="([^"]+)"/);if(!u)continue;V=u[1]}let p=V.includes(".")?"."+V.split(".").pop():"",F=(0,s4.randomBytes)(8).toString("hex")+p,s=(0,h4.join)(m,F);await(0,DY.writeFile)(s,t),a.push({name:V,path:s})}I.body={files:a}}function omI(I,l){let G=[],c=0;for(;;){let b=I.indexOf(l,c);if(b===-1)break;c>0&&G.push(I.subarray(c+2,b)),c=b+l.length}return G}var ZR=new U;ZR.post("/upload",p4);var PY=require("child_process"),WR=require("fs"),Zc=require("path"),yW=!1;function qY(){return(0,Zc.dirname)(process.execPath)}function rmI(){return process.platform==="win32"?qY():(0,Zc.dirname)(qY())}function wmI(){return process.execPath.match(/^(.*)\/Cellar\/[^/]+\/[^/]+\/bin\/node$/)?.[1]||null}function vmI(){let I=rmI(),l=wmI();return process.platform==="win32"?[(0,Zc.join)(I,"node_modules","npm","bin","npm-cli.js"),(0,Zc.join)(qY(),"node_modules","npm","bin","npm-cli.js")]:[(0,Zc.join)(I,"lib","node_modules","npm","bin","npm-cli.js"),...l?[(0,Zc.join)(l,"lib","node_modules","npm","bin","npm-cli.js")]:[]]}function ymI(){return vmI().find(WR.existsSync)||null}function EmI(){return process.platform==="win32"?"npm.cmd":"npm"}function JmI(I){return(0,Zc.join)(I,"hermes-web-ui","bin","hermes-web-ui.mjs")}function u4(){return{...process.env,PATH:[qY(),process.env.PATH].filter(Boolean).join(Zc.delimiter),npm_node_execpath:process.execPath}}function dR(I,l={}){let G=ymI(),c=G?process.execPath:EmI(),b=G?[G,...I]:I;return(0,PY.execFileSync)(c,b,{encoding:"utf-8",timeout:l.timeout,stdio:["pipe","pipe","pipe"],env:u4(),windowsHide:!0}).trim()}function gmI(){return dR(["root","-g"])}function CmI(){let I=JmI(gmI());if(!(0,WR.existsSync)(I))throw new Error(`Updated hermes-web-ui CLI not found: ${I}`);return I}function AmI(){try{dR(["cache","clean","--force"],{timeout:120*1e3})}catch(I){console.warn("[update] failed to clean npm cache, continuing update:",I)}return dR(["install","-g","hermes-web-ui@latest"],{timeout:600*1e3})}function LmI(I){let l=CmI();return(0,PY.spawn)(process.execPath,[l,"restart","--port",I],{detached:!0,stdio:"ignore",windowsHide:!0,env:u4()})}async function R4(I){if(yW){I.status=409,I.body={success:!1,message:"hermes-web-ui update is already in progress"};return}yW=!0;try{let l=AmI();I.body={success:!0,message:l.trim()||"hermes-web-ui updated successfully"},setTimeout(()=>{let G;try{G=LmI(process.env.PORT||"8648")}catch(c){yW=!1,console.error("[update] failed to spawn restart:",c);return}G.on("error",c=>{yW=!1,console.error("[update] restart process failed:",c)}),G.on("exit",(c,b)=>{yW=!1,(typeof c=="number"&&c!==0||b)&&console.error(`[update] restart process exited before replacing server: code=${c} signal=${b}`)}),G.unref()},3e3)}catch(l){yW=!1,I.status=500,I.body={success:!1,message:l.stderr?.toString()||l.message||String(l)}}}var aR=new U;aR.post("/api/hermes/update",R4);mI();async function F4(I){let l=rC();I.body={hasPasswordLogin:!0,username:l?.username||QW,hasUsers:HY()>0}}async function X4(I){let l=I.state.user?.id,G=l?EG(l):null;if(!G){I.status=404,I.body={error:"User not found"};return}I.body={user:{id:G.id,username:G.username,role:G.role,status:G.status,created_at:G.created_at,updated_at:G.updated_at,last_login_at:G.last_login_at,requiresCredentialChange:G.username===QW&&vm(XY,G.password_hash)}}}async function Q4(I){let{username:l,password:G}=I.request.body;if(!l||!G){I.status=400,I.body={error:"Username and password are required"};return}let c=Up(I),b=kE(c);if(!b.allowed){I.status=b.status,I.body={error:"Too many login attempts, please try again later"};return}let Z=HY(),d=Z===0?AC(l,G):_Z(l);if(!d||d.status!=="active"||Z>0&&!vm(G,d.password_hash)){zE(c),I.status=401,I.body={error:"Invalid username or password"};return}let W;try{W=await UC(d)}catch(a){I.status=500,I.body={error:a?.message||"Auth is disabled on this server"};return}xE(c),I.body={token:W}}async function H4(I){I.status=400,I.body={error:"Password login is managed by user accounts"}}async function o4(I){let{currentPassword:l,newPassword:G}=I.request.body;if(!l||!G){I.status=400,I.body={error:"Current password and new password are required"};return}if(G.length<6){I.status=400,I.body={error:"New password must be at least 6 characters"};return}let c=I.state.user?.id,b=c?EG(c):null;if(!b||!vm(l,b.password_hash)){I.status=400,I.body={error:"Current password is incorrect"};return}vC(b.id,G),I.body={success:!0}}async function i4(I){let{currentPassword:l,newUsername:G}=I.request.body;if(!l||!G){I.status=400,I.body={error:"Current password and new username are required"};return}if(G.length<2){I.status=400,I.body={error:"Username must be at least 2 characters"};return}let c=I.state.user?.id,b=c?EG(c):null;if(!b||!vm(l,b.password_hash)){I.status=400,I.body={error:"Current password is incorrect"};return}let Z=_Z(G);if(Z&&Z.id!==b.id){I.status=409,I.body={error:"Username already exists"};return}yC(b.id,G),I.body={success:!0}}async function r4(I){I.status=400,I.body={error:"Password login cannot be removed for user accounts"}}function w4(I){return I==="super_admin"||I==="admin"?I:null}function v4(I){return I==="active"||I==="disabled"?I:null}function y4(I){return Array.isArray(I)?[...new Set(I.map(l=>String(l||"").trim()).filter(Boolean))]:[]}function E4(I){let l=new Set(OI());return I.find(c=>!l.has(c))||null}async function J4(I){I.body={users:ym(),profiles:OI()}}async function g4(I){let l=I.request.body,G=String(l.username||"").trim(),c=String(l.password||""),b=w4(l.role||"admin"),Z=v4(l.status||"active"),d=y4(l.profiles);if(G.length<2){I.status=400,I.body={error:"Username must be at least 2 characters"};return}if(c.length<6){I.status=400,I.body={error:"Password must be at least 6 characters"};return}if(!b||!Z){I.status=400,I.body={error:"Invalid role or status"};return}if(_Z(G)){I.status=409,I.body={error:"Username already exists"};return}let W=E4(d);if(W){I.status=400,I.body={error:`Profile "${W}" does not exist`};return}let a=EC({username:G,password:c,role:b,status:Z,profiles:b==="super_admin"?[]:d,defaultProfile:l.defaultProfile});I.status=201,I.body={user:a,users:ym()}}async function C4(I){let l=Number(I.params.id),G=Number.isInteger(l)?EG(l):null;if(!G){I.status=404,I.body={error:"User not found"};return}let c=I.request.body,b=c.username==null?void 0:String(c.username).trim(),Z=c.password==null?void 0:String(c.password),d=c.role==null?void 0:w4(c.role),W=c.status==null?void 0:v4(c.status),a=c.profiles==null?void 0:y4(c.profiles);if(b!==void 0&&b.length<2){I.status=400,I.body={error:"Username must be at least 2 characters"};return}if(Z!==void 0&&Z.length>0&&Z.length<6){I.status=400,I.body={error:"Password must be at least 6 characters"};return}if(c.role!=null&&!d||c.status!=null&&!W){I.status=400,I.body={error:"Invalid role or status"};return}if(b&&b!==G.username){let N=_Z(b);if(N&&N.id!==G.id){I.status=409,I.body={error:"Username already exists"};return}}let m=d||G.role,e=W||G.status,n=I.state.user?.id;if(G.id===n&&e!=="active"){I.status=400,I.body={error:"You cannot disable your own account"};return}if(G.role==="super_admin"&&G.status==="active"&&(m!=="super_admin"||e!=="active")&&i2(G.id)===0){I.status=400,I.body={error:"At least one active super administrator is required"};return}if(a){let N=E4(a);if(N){I.status=400,I.body={error:`Profile "${N}" does not exist`};return}}JC({userId:G.id,username:b,password:Z||void 0,role:d||void 0,status:W||void 0,profiles:m==="super_admin"?[]:a,defaultProfile:c.defaultProfile}),I.body={user:EG(G.id),users:ym()}}async function A4(I){let l=Number(I.params.id),G=Number.isInteger(l)?EG(l):null;if(!G){I.status=404,I.body={error:"User not found"};return}if(I.state.user?.id===G.id){I.status=400,I.body={error:"You cannot delete your own account"};return}if(G.role==="super_admin"&&G.status==="active"&&i2(G.id)===0){I.status=400,I.body={error:"At least one active super administrator is required"};return}gC(G.id),I.body={success:!0,users:ym()}}async function L4(I){let l=Op();I.body={locks:l}}async function k4(I){let l=I.query.ip;if(l){if(!UE(l)){I.status=404,I.body={error:"IP not locked"};return}I.body={success:!0};return}let G=BE();I.body={success:!0,count:G}}var _Y=new U;_Y.get("/api/auth/status",F4);_Y.post("/api/auth/login",Q4);var WG=new U;WG.post("/api/auth/setup",H4);WG.get("/api/auth/me",X4);WG.post("/api/auth/change-password",o4);WG.post("/api/auth/change-username",i4);WG.delete("/api/auth/password",r4);WG.get("/api/auth/users",eb,J4);WG.post("/api/auth/users",eb,g4);WG.put("/api/auth/users/:id",eb,C4);WG.delete("/api/auth/users/:id",eb,A4);WG.get("/api/auth/locked-ips",L4);WG.delete("/api/auth/locked-ips",k4);rW();mI();var IZ=require("path"),It=(()=>{let[I,l]=process.versions.node.split(".").map(Number);return I>22||I===22&&l>=5})(),xmI=new Set(["compression","compressed"]),UmI=20,BmI=100;function x4(){return(0,IZ.join)(jI(),"state.db")}function sI(I,l=0){if(I==null||I==="")return l;let G=Number(I);return Number.isFinite(G)?G:l}function Cm(I){if(I==null||I==="")return null;let l=Number(I);return Number.isFinite(l)?l:null}function AG(I){return I==null||I===""?null:String(I)}function U4(I){return I?I.length>40?`${I.slice(0,40)}...`:I:null}function OmI(I){let l=sI(I.started_at);return{id:String(I.id||""),source:String(I.source||""),user_id:AG(I.user_id),model:String(I.model||""),title:AG(I.title),started_at:l,ended_at:Cm(I.ended_at),end_reason:AG(I.end_reason),message_count:sI(I.message_count),tool_call_count:sI(I.tool_call_count),input_tokens:sI(I.input_tokens),output_tokens:sI(I.output_tokens),cache_read_tokens:sI(I.cache_read_tokens),cache_write_tokens:sI(I.cache_write_tokens),reasoning_tokens:sI(I.reasoning_tokens),billing_provider:AG(I.billing_provider),estimated_cost_usd:sI(I.estimated_cost_usd),actual_cost_usd:Cm(I.actual_cost_usd),cost_status:String(I.cost_status||""),preview:String(I.preview||""),last_active:sI(I.last_active,l)}}var $b=`
@@ -1073,7 +1073,7 @@ ${[`[Current Hermes profile: ${c}]`,Y?.workspace?`[Current working directory: ${
1073
1073
  ${N}`;let s=`cli_run_${Date.now().toString(36)}_${Math.random().toString(36).slice(2,8)}`,u=Math.floor(Date.now()/1e3),X=b.get(e);X||(X=QI(e)?await W(e,b):{messages:[],isWorking:!1,events:[],queue:[]},b.set(e,X)),X.isWorking=!0,X.isAborting=!1,X.events=[],X.profile=c,X.source="cli",X.activeRunMarker=s,X.runId=void 0,X.abortController=void 0,X.bridgeOutput="",X.bridgePendingAssistantContent="",X.bridgePendingReasoningContent="",X.bridgePendingToolCallMarkup="",X.bridgeToolCounter=0,X.bridgePendingTools=[],X.responseRun=void 0;let o=Eb(m);if(X.messages.push({id:X.messages.length+1,session_id:e,runMarker:s,role:"user",content:o,timestamp:u}),!QI(e)){let C=fe(m).replace(/[\r\n]/g," ").substring(0,100);Nb({id:e,profile:c,source:"cli",model:h,provider:p,title:C})}let i=Tl({session_id:e,role:"user",content:o,timestamp:u});l.join(`session:${e}`),(G.peerExcludeSocketId?I.to(`session:${e}`).except(G.peerExcludeSocketId):l.to(`session:${e}`)).emit("run.peer_user_message",{event:"run.peer_user_message",session_id:e,message:{id:G.queue_id||i,role:"user",content:o,timestamp:u}});let v=(J,C)=>{let L={...C,session_id:e};I.to(`session:${e}`).emit(J,L),!I.adapter.rooms.get(`session:${e}`)?.size&&l.connected&&l.emit(J,L)},y=await _V(e,c,"",void 0,v,b,{model:h,provider:p},async J=>{let C=ha(X);if(C!=null){let j=GG(J);return C+j.inputTokens+j.outputTokens}let L=await Z.contextEstimate(e,J,N,c,{model:h,provider:p});return D0(X,L),Wl.info({sessionId:e,profile:c,model:h,provider:p,messages:L.message_count,toolCount:L.tool_count,systemPromptChars:L.system_prompt_chars,fixedContextTokens:L.fixed_context_tokens,fullContextTokens:L.token_count},"[chat-run-socket] full context estimate"),L.token_count}),k=y;try{let J=Jb(m)?await UV(m):m,C=Jb(m)?o:void 0;R.info("[chat-run-socket] starting CLI bridge run for session %s",e),Wl.info({sessionId:e,profile:c,inputChars:o.length,historyMessages:y.length,hasInstructions:!!N,multimodalInput:Jb(m)},"[chat-run-socket] starting CLI bridge run");let L=await Z.chat(e,J,k,N,c,{...C!==void 0?{storage_message:C}:{},...h?{model:h}:{},...p?{provider:p}:{}});X.runId=L.run_id,Wl.info({sessionId:e,runId:L.run_id,status:L.status},"[chat-run-socket] CLI bridge run started"),od(b,e,"run.started",{event:"run.started",run_id:L.run_id,queue_length:X.queue.length||0}),v("run.started",{event:"run.started",run_id:L.run_id,queue_length:X.queue.length||0});for await(let j of Z.streamOutput(L.run_id))if(await sRI(I,l,X,e,s,j,v,c,b,Z,a,N,{model:h,provider:p}),j.done)break}catch(J){if(X.activeRunMarker!==s||!X.isWorking)return;let C=X.queue?.length??0;X.isWorking=!1,X.isAborting=!1,X.profile=void 0,X.runId=void 0,X.activeRunMarker=void 0,X.events=[],X.bridgePendingToolCallMarkup=void 0,gb(X,e),LG(e);let L=J instanceof Error?J.message:String(J),j=await el(e,X,v),II=await _M({sessionId:e,profile:c,model:h,provider:p,instructions:N,state:X,usage:j,emit:v,bridge:Z});dc(e,{inputTokens:j.inputTokens,outputTokens:j.outputTokens,profile:c}),v("run.failed",{event:"run.failed",error:L,inputTokens:j.inputTokens,outputTokens:j.outputTokens,contextTokens:II,queue_remaining:C}),C>0&&a(l,e)}}async function _M(I){try{let l=await Hd(I.sessionId,{excludeLastUser:!1}),G=await MM(I.sessionId,I.profile,l,{model:I.model,provider:I.provider}),c=GG(G),b=c.inputTokens+c.outputTokens;if(ha(I.state)!=null){let W=sZ(I.sessionId,I.state,I.emit,b,I.usage);return Wl.info({sessionId:I.sessionId,profile:I.profile,model:I.model,provider:I.provider,messages:G.length,fixedContextTokens:I.state.bridgeContext?.fixedContextTokens,messageTokens:b,fullContextTokens:W},"[chat-run-socket] final cached context estimate"),W}let Z=await I.bridge.contextEstimate(I.sessionId,G,I.instructions,I.profile,{model:I.model??void 0,provider:I.provider??void 0});D0(I.state,Z);let d=typeof Z.token_count=="number"&&Number.isFinite(Z.token_count)&&Z.token_count>0?Math.floor(Z.token_count):void 0;return d==null?I.state.contextTokens:(PV(I.sessionId,I.state,I.emit,d,I.usage),Wl.info({sessionId:I.sessionId,profile:I.profile,model:I.model,provider:I.provider,messages:Z.message_count,toolCount:Z.tool_count,systemPromptChars:Z.system_prompt_chars,fullContextTokens:d},"[chat-run-socket] final full context estimate"),d)}catch(l){return Wl.warn({err:l instanceof Error?{message:l.message,name:l.name}:l,sessionId:I.sessionId,profile:I.profile},"[chat-run-socket] final full context estimate failed"),I.state.contextTokens}}async function sRI(I,l,G,c,b,Z,d,W,a,m,e,n,N){if(G.activeRunMarker!==b){Wl.info({sessionId:c,runId:Z.run_id,runMarker:b,activeRunMarker:G.activeRunMarker},"[chat-run-socket] ignoring stale CLI bridge chunk");return}G.runId=Z.run_id;for(let s of Z.events||[]){let u=s.event;if(u==="bridge.context.ready"){D0(G,s);let X=await el(c,G,d);sZ(c,G,d,X.inputTokens+X.outputTokens,X)}else if(u==="tool.started"){gb(G,c,b);let X=s.tool_name||"",o=s.args,i=fM(G,c,b,X,o,s.tool_call_id),r={event:"tool.started",run_id:Z.run_id,tool_call_id:i.id,tool:X,name:X,arguments:i.arguments,preview:s.preview||DV(i.arguments)};od(a,c,"tool.started",r),d("tool.started",r)}else if(u==="tool.completed"){let X=s.tool_name||"",o=SM(G,c,b,X,s),i={event:"tool.completed",run_id:Z.run_id,tool_call_id:o.id,tool:X,name:X,output:o.output,duration:o.duration??s.duration,error:s.is_error||void 0};od(a,c,"tool.completed",i),d("tool.completed",i)}else if(u?.startsWith("subagent.")){let X={event:u,run_id:Z.run_id,subagent_id:s.subagent_id,parent_id:s.parent_id,depth:s.depth,task_index:s.task_index,task_count:s.task_count,goal:s.goal,model:s.model,toolsets:s.toolsets,tool_count:s.tool_count,tool:s.tool_name,name:s.tool_name,preview:s.text||s.summary||s.tool_preview||"",text:s.text||"",status:s.status,summary:s.summary,duration:s.duration_seconds,duration_seconds:s.duration_seconds,input_tokens:s.input_tokens,output_tokens:s.output_tokens,reasoning_tokens:s.reasoning_tokens,api_calls:s.api_calls,cost_usd:s.cost_usd,files_read:s.files_read,files_written:s.files_written,output_tail:s.output_tail};od(a,c,u,X),d(u,X)}else if(u==="turn.boundary")gb(G,c,b);else if(u==="reasoning.delta"||u==="thinking.delta"){let X=String(s.text||"");if(X){G.bridgePendingReasoningContent=(G.bridgePendingReasoningContent||"")+X;let o=KM(G,c,b);o.reasoning=(o.reasoning||"")+X,o.reasoning_content=(o.reasoning_content||"")+X}d(u,{event:u,run_id:Z.run_id,text:X})}else if(u==="reasoning.available")d("reasoning.available",{event:"reasoning.available",run_id:Z.run_id});else if(u==="approval.requested"){let X={event:"approval.requested",run_id:Z.run_id,approval_id:s.approval_id,command:s.command,description:s.description,choices:s.choices,allow_permanent:s.allow_permanent,timeout_ms:s.timeout_ms};sG(a,c,"approval.requested",X),d("approval.requested",X)}else if(u==="approval.resolved"){let X={event:"approval.resolved",run_id:Z.run_id,approval_id:s.approval_id,choice:s.choice};sG(a,c,"approval.resolved",X),d("approval.resolved",X)}else if(u==="bridge.compression.requested"){let X=await Hd(c,{excludeLastUser:!0}),o=GG(X),i=o.inputTokens+o.outputTokens,r=typeof s.approx_tokens=="number"&&Number.isFinite(s.approx_tokens)&&s.approx_tokens>0?s.approx_tokens:i;Wl.info({sessionId:c,profile:W,bridgeMessages:s.message_count,dbMessages:X.length,messageOnlyTokens:i,fullContextTokens:r,source:typeof s.approx_tokens=="number"?"bridge":"message-only-fallback"},"[chat-run-socket] bridge compression token estimate");let v={event:"compression.started",run_id:Z.run_id,request_id:s.request_id,message_count:X.length||s.message_count,token_count:r,source:"bridge"};if(sG(a,c,"compression.started",v),d("compression.started",v),s.request_id&&Array.isArray(s.messages))try{let y=await $V(c,W,s.messages,typeof s.approx_tokens=="number"?s.approx_tokens:void 0);G.bridgeCompressionResults=G.bridgeCompressionResults||{},G.bridgeCompressionResults[String(s.request_id)]=y,await m.compressionRespond(String(s.request_id),{messages:y.messages})}catch(y){await m.compressionRespond(String(s.request_id),{error:y?.message||String(y)}).catch(()=>{})}}else if(u==="bridge.compression.completed"){let X=s.request_id?G.bridgeCompressionResults?.[String(s.request_id)]:void 0,o=id(s.result_approx_tokens),i=id(X?.afterTokens),r=i!=null&&ha(G)!=null?pa(G,i):o??i,v={event:"compression.completed",run_id:Z.run_id,request_id:s.request_id,compressed:X?.compressed??s.compressed!==!1,llmCompressed:X?.llmCompressed,totalMessages:X?.beforeMessages??s.message_count,resultMessages:X?.resultMessages??s.result_messages,beforeTokens:X?.beforeTokens??s.approx_tokens,afterTokens:i??o,contextTokens:r,summaryTokens:X?.summaryTokens,verbatimCount:X?.verbatimCount,compressedStartIndex:X?.compressedStartIndex,source:"bridge"};s.request_id&&G.bridgeCompressionResults&&delete G.bridgeCompressionResults[String(s.request_id)],sG(a,c,"compression.completed",v),d("compression.completed",v);let y=await el(c,G,d);i!=null&&ha(G)!=null?sZ(c,G,d,i,y):PV(c,G,d,r,y)}else if(u==="bridge.compression.failed"){let X={event:"compression.completed",run_id:Z.run_id,request_id:s.request_id,compressed:!1,totalMessages:s.message_count,resultMessages:s.message_count,beforeTokens:s.approx_tokens,error:s.error,source:"bridge"};s.request_id&&G.bridgeCompressionResults&&delete G.bridgeCompressionResults[String(s.request_id)],sG(a,c,"compression.completed",X),d("compression.completed",X)}else u==="status"&&d("agent.event",{event:"agent.event",run_id:Z.run_id,...s})}if(Z.delta){let s=qM(G,Z.delta);if(s){G.bridgeOutput=(G.bridgeOutput||"")+s,G.bridgePendingAssistantContent=(G.bridgePendingAssistantContent||"")+s;let u=[...G.messages].reverse().find(X=>X.runMarker===b);u?.role==="assistant"&&u.finish_reason==null?(u.content+=s,S0(u,G.bridgePendingReasoningContent)):G.messages.push({id:G.messages.length+1,session_id:c,runMarker:b,role:"assistant",content:s,reasoning:G.bridgePendingReasoningContent||null,reasoning_content:G.bridgePendingReasoningContent||null,timestamp:Math.floor(Date.now()/1e3)}),d("message.delta",{event:"message.delta",run_id:Z.run_id,delta:s,output:G.bridgeOutput})}}if(!Z.done||!G.isWorking)return;if(G.isAborting){Wl.info({sessionId:c,runId:Z.run_id,status:Z.status},"[chat-run-socket][abort] suppressing CLI bridge terminal chunk during abort");return}gb(G,c),G.bridgePendingToolCallMarkup=void 0,LG(c),await hRI(YRI);let Y=await el(c,G,d),t=await _M({sessionId:c,profile:W,model:N.model,provider:N.provider,instructions:n,state:G,usage:Y,emit:d,bridge:m});dc(c,{inputTokens:Y.inputTokens,outputTokens:Y.outputTokens,profile:G.profile});let V=G.queue.length>0?G.queue[0]:void 0;G.isWorking=!!V,G.isAborting=!1,V?(G.profile=V.profile||W,G.source=V.source):G.profile=void 0,G.runId=void 0,G.activeRunMarker=void 0,G.events=[];let h=VRI(Z),p=h?"run.failed":"run.completed",F={event:p,run_id:Z.run_id,output:Z.output||G.bridgeOutput||"",result:Z.result,error:h||Z.error,inputTokens:Y.inputTokens,outputTokens:Y.outputTokens,contextTokens:t,queue_remaining:G.queue.length};d(p,F),G.queue.length>0&&e(l,c)}function hRI(I){return new Promise(l=>setTimeout(l,I))}Dl();GI();async function Gs(I,l,G,c,b,Z){let d=c.get(G);if(!d?.isWorking||!d.runId&&!d.abortController){R.info({sessionId:G},"[chat-run-socket][abort] ignored: no active run"),d&&(d.isWorking=!1,d.isAborting=!1,d.abortController=void 0,d.runId=void 0,d.events=[]),_e(I,l,G,"abort.completed",{event:"abort.completed",synced:!1,ignored:!0});return}let W=d.runId;if(d.isAborting=!0,sG(c,G,"abort.started",{event:"abort.started",run_id:W,graceMs:5e3}),_e(I,l,G,"abort.started",{event:"abort.started",run_id:W,graceMs:5e3}),R.info({sessionId:G,runId:W},"[chat-run-socket][abort] started"),d.source==="cli"?gb(d,G):qV(d,G),d.source==="cli")try{await b.interrupt(G,"Aborted by user",d.profile)}catch(a){R.warn(a,"[chat-run-socket][abort] failed to interrupt CLI bridge for session %s",G)}else d.abortController&&d.abortController.abort();await pRI(I,l,G,W||"response_stream",c,Z)}async function pRI(I,l,G,c,b,Z){let d=b.get(G);if(!d)return;let W=d.profile;if(LG(G),await el(G,d,(m,e)=>{I.to(`session:${G}`).emit(m,{...e,session_id:G})}),d.isWorking=!1,d.isAborting=!1,d.profile=void 0,d.abortController=void 0,d.runId=void 0,d.responseRun=void 0,d.activeRunMarker=void 0,d.queue.length>0){let m=d.queue.shift();d.isWorking=!0,d.isAborting=!1,d.profile=m.profile||W,d.source=m.source,R.info("[chat-run-socket][abort] dequeuing queued run for session %s (remaining: %d)",G,d.queue.length),sG(b,G,"abort.completed",{event:"abort.completed",run_id:c,synced:!0,queue_length:d.queue.length+1}),_e(I,l,G,"abort.completed",{event:"abort.completed",run_id:c,synced:!0,queue_length:d.queue.length+1}),_e(I,l,G,"run.queued",{event:"run.queued",queue_length:d.queue.length}),d.events=[],Z(l,G,m,W||"default");return}d.events=[],_e(I,l,G,"abort.completed",{event:"abort.completed",run_id:c,synced:!0}),R.info({sessionId:G,runId:c,synced:!0},"[chat-run-socket][abort] completed")}function _e(I,l,G,c,b){let Z={...b,session_id:G};I.to(`session:${G}`).emit(c,Z),!I.adapter.rooms.get(`session:${G}`)?.size&&l.connected&&l.emit(c,Z)}Dl();GI();var lj={usage:"usage",status:"status",abort:"abort",queue:"queue",clear:"clear",title:"title",compress:"compress",steer:"steer",destroy:"destroy",destory:"destroy"};function q0(I){if(typeof I!="string")return null;let l=I.trim();if(!l.startsWith("/"))return null;let G=l.match(/^\/([a-zA-Z][\w-]*)(?:\s+([\s\S]*))?$/);if(!G)return null;let c=G[1].toLowerCase(),b=lj[c];return b?{name:b,rawName:c,args:G[2]?.trim()||""}:{name:"status",rawName:c,args:G[2]?.trim()||""}}function Gj(I){return q0(I)!==null}async function cj(I,l,G){let c=hZ(G.sessionMap,I);G.socket.join(`session:${I}`),uRI(I,G),Ij(I,c,`/${l.rawName}${l.args?` ${l.args}`:""}`);let b=Z=>{let d=typeof Z.message=="string"?Z.message:"";d&&Ij(I,c,d),rd(G.nsp,G.socket,I,"session.command",{event:"session.command",session_id:I,command:l.rawName,ok:!0,...Z})};if(!lj[l.rawName]){b({ok:!1,action:"error",terminal:!c.isWorking,message:`Unknown bridge command: /${l.rawName}`});return}switch(l.name){case"usage":{let Z=await el(I,c,(d,W)=>{rd(G.nsp,G.socket,I,d,W)});b({action:"usage",terminal:!c.isWorking,message:`Usage: input ${Z.inputTokens}, output ${Z.outputTokens}, total ${Z.inputTokens+Z.outputTokens} tokens.`,inputTokens:Z.inputTokens,outputTokens:Z.outputTokens});return}case"status":{let Z=QI(I);b({action:"status",terminal:!c.isWorking,message:[`Status: ${c.isWorking?"running":"idle"}`,`source: ${c.source||Z?.source||"cli"}`,`profile: ${c.profile||G.profile||Z?.profile||"default"}`,`model: ${G.model||Z?.model||"-"}`,`queue: ${c.queue.length}`,`run: ${c.runId||c.activeRunMarker||"-"}`].join(", "),isWorking:c.isWorking,isAborting:!!c.isAborting,queueLength:c.queue.length,source:c.source||Z?.source||"cli",profile:c.profile||G.profile||Z?.profile||"default",model:G.model||Z?.model||null,runId:c.runId||c.activeRunMarker||null});return}case"abort":await Gs(G.nsp,G.socket,I,G.sessionMap,G.bridge,G.runQueuedItem),b({action:"abort",message:"Abort requested."});return;case"queue":{if(!l.args){b({ok:!1,action:"queue",terminal:!c.isWorking,message:"Usage: /queue <message>"});return}if(!c.isWorking){b({ok:!1,action:"queue",message:"Session is idle. Send the message normally instead."});return}let Z=`queue_${Date.now().toString(36)}_${Math.random().toString(36).slice(2,8)}`;c.queue.push({queue_id:Z,input:l.args,model:G.model,instructions:G.instructions,profile:G.profile,source:"cli",originSocketId:G.socket.id}),rd(G.nsp,G.socket,I,"run.queued",{event:"run.queued",session_id:I,queue_length:c.queue.length,queued_messages:c.queue.map(d=>({id:d.queue_id,role:"user",content:Eb(d.input),timestamp:Math.floor(Date.now()/1e3),queued:!0}))}),b({action:"queue",terminal:!1,message:`Queued message. Queue length: ${c.queue.length}.`,queueLength:c.queue.length});return}case"clear":{if(l.args==="--history"){if(c.isWorking){b({ok:!1,action:"clear",terminal:!1,message:"Cannot clear history while the bridge run is active. Abort or destroy it first."});return}let Z=RR(I);c.messages=[],$M(c),await el(I,c,(d,W)=>{rd(G.nsp,G.socket,I,d,W)}),b({action:"clear",clearHistory:!0,message:`Cleared ${Z} history messages from the database.`});return}b({action:"clear",message:"Cleared the current display. History in the database was not deleted."});return}case"title":{if(!l.args){b({ok:!1,action:"title",terminal:!c.isWorking,message:"Usage: /title <new title>"});return}let Z=l.args.slice(0,120);QI(I)||Nb({id:I,profile:G.profile,source:"cli",model:G.model,title:Z});let d=xm(I,Z);b({ok:d,action:"title",title:Z,message:d?`Title updated: ${Z}`:"Session was not found in the database."});return}case"compress":{if(c.isWorking){b({ok:!1,action:"compress",terminal:!1,message:"Compression can only run while the session is idle."});return}$M(c);let Z=(d,W)=>rd(G.nsp,G.socket,I,d,W);try{let d=await Hd(I,{excludeLastUser:!0}),W=K0(I,d),a=pa(c,W.tokenCount);Z("compression.started",{event:"compression.started",message_count:W.messageCount,token_count:a,source:"command"});let m=await $V(I,G.profile,[]);c.bridgeCompressionResults=c.bridgeCompressionResults||{};let e=await el(I,c,Z),n=pa(c,m.afterTokens);Z("compression.completed",{event:"compression.completed",compressed:m.compressed,llmCompressed:m.llmCompressed,totalMessages:m.beforeMessages,resultMessages:m.resultMessages,beforeTokens:a,afterTokens:m.afterTokens,summaryTokens:m.summaryTokens,verbatimCount:m.verbatimCount,compressedStartIndex:m.compressedStartIndex,contextTokens:n,source:"command"}),sZ(I,c,Z,m.afterTokens,e),b({action:"compress",message:`Compression completed: ${m.beforeMessages} -> ${m.resultMessages} messages, ${a} -> ${n} tokens.`,beforeMessages:m.beforeMessages,resultMessages:m.resultMessages,beforeTokens:a,afterTokens:n,messageBeforeTokens:m.beforeTokens,messageAfterTokens:m.afterTokens,compressed:m.compressed})}catch(d){R.warn(d,"[chat-run-socket] /compress failed for session %s",I),Z("compression.completed",{event:"compression.completed",compressed:!1,totalMessages:0,resultMessages:0,beforeTokens:0,afterTokens:0,error:d instanceof Error?d.message:String(d),source:"command"}),b({ok:!1,action:"compress",message:`Compression failed: ${d instanceof Error?d.message:String(d)}`})}return}case"steer":{if(!l.args){b({ok:!1,action:"steer",terminal:!c.isWorking,message:"Usage: /steer <instruction>"});return}if(!c.isWorking){b({ok:!1,action:"steer",message:"No active bridge run to steer."});return}await G.bridge.steer(I,l.args),b({action:"steer",terminal:!1,message:"Steer instruction sent."});return}case"destroy":{let Z=c.isWorking,d=!0,W=null;try{Z&&(gb(c,I),await G.bridge.interrupt(I,"Destroyed by user",c.profile).catch(a=>{R.warn(a,"[chat-run-socket] /destroy interrupt failed for session %s",I)})),await G.bridge.destroy(I,c.profile).catch(a=>{d=!1,W=a instanceof Error?a.message:String(a),R.warn(a,"[chat-run-socket] /destroy bridge unavailable for session %s",I)})}finally{LG(I),await el(I,c,(a,m)=>{rd(G.nsp,G.socket,I,a,m)}),c.isWorking=!1,c.isAborting=!1,c.profile=void 0,c.abortController=void 0,c.runId=void 0,c.responseRun=void 0,c.activeRunMarker=void 0,c.events=[],c.queue=[],c.bridgePendingAssistantContent=void 0,c.bridgePendingReasoningContent=void 0,c.bridgePendingToolCallMarkup=void 0,c.bridgeOutput=void 0,c.bridgePendingTools=void 0,c.bridgeCompressionResults=void 0,sG(G.sessionMap,I,"session.command",{event:"session.command",action:"destroy"})}rd(G.nsp,G.socket,I,"run.queued",{event:"run.queued",session_id:I,queue_length:0}),b({action:"destroy",message:d?Z?"Destroyed bridge agent and stopped the active run.":"Destroyed bridge agent.":`Bridge agent was not reachable; cleared local session state.${W?` (${W})`:""}`,destroyed:!0,bridgeReachable:d});return}}}function $M(I){I.events=[],I.bridgePendingTools=void 0,I.bridgePendingToolCallMarkup=void 0,I.bridgeCompressionResults=void 0,I.responseRun=void 0,I.activeRunMarker=void 0,I.runId=void 0,I.abortController=void 0,I.isAborting=!1}function uRI(I,l){QI(I)||Nb({id:I,profile:l.profile,source:"cli",model:l.model,title:"Bridge command"})}function Ij(I,l,G){let c=Math.floor(Date.now()/1e3),b=Tl({session_id:I,role:"command",content:G,timestamp:c});l.messages.push({id:b||`command_${c}_${l.messages.length}`,session_id:I,role:"command",content:G,timestamp:c}),LG(I)}function rd(I,l,G,c,b){let Z={...b,session_id:G};I.to(`session:${G}`).emit(c,Z),!I.adapter.rooms.get(`session:${G}`)?.size&&l.connected&&l.emit(c,Z)}var cs=class{nsp;bridge=new TI;sessionMap=new Map;constructor(l){this.nsp=l.of("/chat-run")}init(){this.nsp.use(this.authMiddleware.bind(this)),this.nsp.on("connection",this.onConnection.bind(this)),R.info("[chat-run-socket] Socket.IO ready at /chat-run")}async authMiddleware(l,G){let c=l.handshake.auth?.token;if(!await Db()){G();return}let b=await Tb(c||"");if(!b)return G(new Error("Authentication failed"));let Z=String(l.handshake.query?.profile||"").trim();if(Z&&!this.canAccessProfile(b,Z))return G(new Error("Profile access denied"));l.data.user=b,G()}onConnection(l){let G=l.data.user,c=l.handshake.query?.profile||"default",b=()=>c||ZI()||"default",Z=W=>!W||W==="default"?!0:OI().includes(W),d=(W,a)=>{let m=typeof a=="string"?a.trim():"";if(m){if(!Z(m))throw new Error(`Profile "${m}" does not exist`);if(G&&!this.canAccessProfile(G,m))throw new Error(`Profile "${m}" is not available for this user`);return m}if(!W){let N=b();if(G&&!this.canAccessProfile(G,N))throw new Error(`Profile "${N}" is not available for this user`);return N}let e=QI(W)?.profile||"",n=e&&Z(e)?e:b();if(G&&!this.canAccessProfile(G,n))throw new Error(`Profile "${n}" is not available for this user`);return n};l.on("run",async W=>{let a;try{a=d(W.session_id,W.profile)}catch(m){l.emit("run.failed",{event:"run.failed",session_id:W.session_id,error:m instanceof Error?m.message:String(m)});return}if(W.session_id){let m=hZ(this.sessionMap,W.session_id),e=f0(W.source,W.session_id),n=q0(W.input);if(n&&e==="cli"){try{await cj(W.session_id,n,{nsp:this.nsp,socket:l,sessionMap:this.sessionMap,bridge:this.bridge,profile:a,model:W.model,instructions:W.instructions,runQueuedItem:this.runQueuedItem.bind(this)})}catch(N){this.emitToSession(l,W.session_id,"session.command",{event:"session.command",command:n.rawName,ok:!1,action:"error",message:N instanceof Error?N.message:String(N)})}return}if(m.isWorking){let N=W.queue_id||`queue_${Date.now().toString(36)}_${Math.random().toString(36).slice(2,8)}`;m.queue.push({queue_id:N,input:W.input,model:W.model,provider:W.provider,model_groups:W.model_groups,instructions:W.instructions,profile:a,source:e,originSocketId:l.id}),this.nsp.to(`session:${W.session_id}`).emit("run.queued",{event:"run.queued",session_id:W.session_id,queue_length:m.queue.length,queued_messages:this.serializeQueuedMessages(m.queue)}),R.info("[chat-run-socket] queued run for session %s (queue: %d)",W.session_id,m.queue.length);return}m.events=[],m.isWorking=!0,m.profile=a,m.source=e}try{await this.handleRun(l,W,a)}catch(m){if(W.session_id){let e=this.sessionMap.get(W.session_id);e&&!e.runId&&!e.abortController&&!e.activeRunMarker&&(e.isWorking=!1,e.profile=void 0)}l.emit("run.failed",{event:"run.failed",session_id:W.session_id,error:m instanceof Error?m.message:String(m)})}}),l.on("cancel_queued_run",W=>{if(!W.session_id||!W.queue_id)return;let a=this.sessionMap.get(W.session_id);if(!a?.queue.length)return;let m=a.queue.length;a.queue=a.queue.filter(e=>e.queue_id!==W.queue_id),a.queue.length!==m&&(this.nsp.to(`session:${W.session_id}`).emit("run.queued",{event:"run.queued",session_id:W.session_id,queue_length:a.queue.length,queued_messages:this.serializeQueuedMessages(a.queue)}),R.info("[chat-run-socket] cancelled queued run %s for session %s (queue: %d)",W.queue_id,W.session_id,a.queue.length))}),l.on("resume",async W=>{if(!W.session_id)return;let a=W.session_id;l.join(`session:${a}`),this.resumeSession(l,a)}),l.on("abort",W=>{W.session_id&&Gs(this.nsp,l,W.session_id,this.sessionMap,this.bridge,this.runQueuedItem.bind(this))}),l.on("approval.respond",async W=>{if(!(!W.session_id||!W.approval_id))try{let a=await this.bridge.approvalRespond(W.approval_id,W.choice||"deny");this.emitToSession(l,W.session_id,"approval.resolved",{event:"approval.resolved",approval_id:W.approval_id,choice:W.choice||"deny",resolved:!!a.resolved})}catch(a){this.emitToSession(l,W.session_id,"approval.resolved",{event:"approval.resolved",approval_id:W.approval_id,choice:W.choice||"deny",resolved:!1,error:a instanceof Error?a.message:String(a)})}})}async handleRun(l,G,c,b=!1){let Z=f0(G.source,G.session_id);if(!(G.session_id&&Z==="cli"&&Gj(G.input))){if(Z==="cli"){let d=G.instructions?`${uc()}
1074
1074
  ${G.instructions}`:uc();if(G.session_id){let W=QI(G.session_id);W?.workspace&&(d=`
1075
1075
  ${`[Current working directory: ${W.workspace}]`}
1076
- ${d}`)}await PM(this.nsp,l,{...G,instructions:d},c,this.sessionMap,this.bridge,b,Is,this.dequeueNextQueuedRun.bind(this));return}await jM(this.nsp,l,G,c,this.sessionMap,b,this.dequeueNextQueuedRun.bind(this))}}async resumeSession(l,G){let c=this.sessionMap.get(G);c||(c=await Is(G,this.sessionMap),this.sessionMap.set(G,c)),l.emit("resumed",{session_id:G,messages:c.messages,isWorking:c.isWorking,isAborting:c.isAborting||!1,events:c.isWorking?c.events:[],inputTokens:c.inputTokens,outputTokens:c.outputTokens,contextTokens:c.contextTokens,queueLength:c.queue?.length||0,queueMessages:this.serializeQueuedMessages(c.queue||[])}),R.info("[chat-run-socket] socket %s resumed session %s (working: %s, messages: %d)",l.id,G,c.isWorking,c.messages.length)}dequeueNextQueuedRun(l,G,c="default"){let b=this.sessionMap.get(G);if(!b?.queue.length)return!1;let Z=b.queue.shift();return R.info("[chat-run-socket] dequeuing queued run for session %s (remaining: %d)",G,b.queue.length),this.nsp.to(`session:${G}`).emit("run.queued",{event:"run.queued",session_id:G,queue_length:b.queue.length,dequeued_queue_id:Z.queue_id,queued_messages:this.serializeQueuedMessages(b.queue)}),this.runQueuedItem(l,G,Z,c),!0}runQueuedItem(l,G,c,b="default"){this.handleRun(l,{input:c.input,session_id:G,model:c.model,provider:c.provider,model_groups:c.model_groups,instructions:c.instructions,source:c.source,queue_id:c.queue_id,peerExcludeSocketId:c.originSocketId},c.profile||b,!0)}emitToSession(l,G,c,b){let Z={...b,session_id:G};this.nsp.to(`session:${G}`).emit(c,Z),!this.nsp.adapter.rooms.get(`session:${G}`)?.size&&l.connected&&l.emit(c,Z)}serializeQueuedMessages(l){return l.map(G=>({id:G.queue_id,role:"user",content:Eb(G.input),timestamp:Math.floor(Date.now()/1e3),queued:!0}))}canAccessProfile(l,G){return l.role==="super_admin"||HW(l.id,G)}close(){for(let[l,G]of this.sessionMap.entries())if(G.abortController)try{G.abortController.abort()}catch(c){R.warn(c,"[chat-run-socket] failed to abort controller for session %s",l)}this.sessionMap.clear(),R.info("[chat-run-socket] closed all connections and cleared state")}};iW();GI();var FRI="0.6.0-beta.2";process.on("uncaughtException",I=>{console.error("FATAL: Uncaught exception"),console.error(I),R.fatal(I,"Uncaught exception"),process.exit(1)});process.on("unhandledRejection",I=>{console.error("Unhandled rejection"),console.error(I),R.error(I,"Unhandled rejection")});var XRI=null,wd=[],bs=null,dj=null;function QRI(I,l,G){return new Promise((c,b)=>{let Z=I.listen(l,G);Z.once("listening",()=>c(Z)),Z.once("error",b)})}async function HRI(I,l,G){let c=G||"0.0.0.0";console.log(`[bootstrap] listening on ${c}:${l}`);let b=await QRI(I,l,c);return{primary:b,servers:[b]}}function oRI(){try{return ej.default.networkInterfaces()}catch{return{}}}async function Nj(){console.log(`hermes-web-ui v${FRI} starting...`),await(0,P0.mkdir)(YI.uploadDir,{recursive:!0}),await(0,P0.mkdir)(YI.dataDir,{recursive:!0}),await OE();try{let N=await new Zd().injectMissingSkills();N.injected.length>0&&R.info({injected:[...new Set(N.injected)],targetCount:N.targets.length},"[bootstrap] bundled skills injected"),N.updated.length>0&&R.info({updated:[...new Set(N.updated)],targetCount:N.targets.length},"[bootstrap] bundled skills updated")}catch(n){R.warn(n,"[bootstrap] failed to inject bundled skills"),console.warn("[bootstrap] failed to inject bundled skills:",n instanceof Error?n.message:n)}try{await qA(),console.log("[bootstrap] profile gateways checked")}catch(n){R.warn(n,"[bootstrap] failed to ensure profile gateways"),console.warn("[bootstrap] failed to ensure profile gateways:",n instanceof Error?n.message:n)}let I=new Tr;try{dj=await eL(),console.log("[bootstrap] agent bridge started")}catch(n){R.warn(n,"[bootstrap] agent bridge failed to start"),console.warn("[bootstrap] agent bridge failed to start:",n instanceof Error?n.message:n)}await new Promise(n=>setTimeout(n,1e3));let{initAllStores:l}=await Promise.resolve().then(()=>(Zj(),bj));l(),await new Promise(n=>setTimeout(n,1e3)),console.log("[bootstrap] all stores initialized"),I.use((0,Wj.default)({origin:YI.corsOrigins})),I.use(yy()),console.log("[bootstrap] cors + bodyParser registered");let G=pB(I,[OC,MC]);I.use(G),console.log("[bootstrap] routes registered");let c=(0,nj.resolve)(__dirname,"..","client");I.use((0,aj.default)(c)),I.use(async n=>{!n.path.startsWith("/api")&&n.path!=="/health"&&n.path!=="/upload"&&n.path!=="/webhook"&&await(0,mj.default)(n,"index.html",{root:c})}),console.log("[bootstrap] SPA fallback registered");let b=await HRI(I,YI.port,YI.host);XRI=b.primary,wd=b.servers,console.log("[bootstrap] app.listen called"),fC(wd),VA(wd),console.log("[bootstrap] terminal + kanban websocket setup");let Z=new SV(wd);wL(Z),bs=new cs(Z.getIO()),uB(bs),bs.init();let{SessionDeleter:d}=await Promise.resolve().then(()=>(tt(),$L)),W=d.getInstance(),a=process.env.PROFILE||"default";W.start(a),console.log("[bootstrap] session deleter started, profile=%s",a),wd.forEach(n=>{n.on("upgrade",(N,Y)=>{let t=new URL(N.url||"",`http://${N.headers.host}`);t.pathname!=="/api/hermes/terminal"&&t.pathname!=="/api/hermes/kanban/events"&&!t.pathname.startsWith("/socket.io/")&&Y.destroy()})});let m=oRI(),e=Object.values(m).flat().find(n=>n?.family==="IPv4"&&!n?.internal)?.address||"localhost";console.log(`Server: http://localhost:${YI.port} (LAN: http://${e}:${YI.port})`),console.log(`Log: ${YI.appHome}/logs/server.log`),R.info("Server: http://localhost:%d (LAN: http://%s:%d)",YI.port,e,YI.port),Z.restoreWhenReady(),wd.forEach(n=>{n.on("error",N=>{console.error("[bootstrap] server error:",N.code||N.message),R.error({err:N},"Server error")})}),eg(wd,Z,bs,dj),GR()}Nj().catch(I=>{console.error("FATAL: Failed to start Hermes Web UI"),console.error(I),R.fatal(I,"Fatal error during bootstrap"),process.exit(1)});0&&(module.exports={bootstrap});
1076
+ ${d}`)}await PM(this.nsp,l,{...G,instructions:d},c,this.sessionMap,this.bridge,b,Is,this.dequeueNextQueuedRun.bind(this));return}await jM(this.nsp,l,G,c,this.sessionMap,b,this.dequeueNextQueuedRun.bind(this))}}async resumeSession(l,G){let c=this.sessionMap.get(G);c||(c=await Is(G,this.sessionMap),this.sessionMap.set(G,c)),l.emit("resumed",{session_id:G,messages:c.messages,isWorking:c.isWorking,isAborting:c.isAborting||!1,events:c.isWorking?c.events:[],inputTokens:c.inputTokens,outputTokens:c.outputTokens,contextTokens:c.contextTokens,queueLength:c.queue?.length||0,queueMessages:this.serializeQueuedMessages(c.queue||[])}),R.info("[chat-run-socket] socket %s resumed session %s (working: %s, messages: %d)",l.id,G,c.isWorking,c.messages.length)}dequeueNextQueuedRun(l,G,c="default"){let b=this.sessionMap.get(G);if(!b?.queue.length)return!1;let Z=b.queue.shift();return R.info("[chat-run-socket] dequeuing queued run for session %s (remaining: %d)",G,b.queue.length),this.nsp.to(`session:${G}`).emit("run.queued",{event:"run.queued",session_id:G,queue_length:b.queue.length,dequeued_queue_id:Z.queue_id,queued_messages:this.serializeQueuedMessages(b.queue)}),this.runQueuedItem(l,G,Z,c),!0}runQueuedItem(l,G,c,b="default"){this.handleRun(l,{input:c.input,session_id:G,model:c.model,provider:c.provider,model_groups:c.model_groups,instructions:c.instructions,source:c.source,queue_id:c.queue_id,peerExcludeSocketId:c.originSocketId},c.profile||b,!0)}emitToSession(l,G,c,b){let Z={...b,session_id:G};this.nsp.to(`session:${G}`).emit(c,Z),!this.nsp.adapter.rooms.get(`session:${G}`)?.size&&l.connected&&l.emit(c,Z)}serializeQueuedMessages(l){return l.map(G=>({id:G.queue_id,role:"user",content:Eb(G.input),timestamp:Math.floor(Date.now()/1e3),queued:!0}))}canAccessProfile(l,G){return l.role==="super_admin"||HW(l.id,G)}close(){for(let[l,G]of this.sessionMap.entries())if(G.abortController)try{G.abortController.abort()}catch(c){R.warn(c,"[chat-run-socket] failed to abort controller for session %s",l)}this.sessionMap.clear(),R.info("[chat-run-socket] closed all connections and cleared state")}};iW();GI();var FRI="0.6.0";process.on("uncaughtException",I=>{console.error("FATAL: Uncaught exception"),console.error(I),R.fatal(I,"Uncaught exception"),process.exit(1)});process.on("unhandledRejection",I=>{console.error("Unhandled rejection"),console.error(I),R.error(I,"Unhandled rejection")});var XRI=null,wd=[],bs=null,dj=null;function QRI(I,l,G){return new Promise((c,b)=>{let Z=I.listen(l,G);Z.once("listening",()=>c(Z)),Z.once("error",b)})}async function HRI(I,l,G){let c=G||"0.0.0.0";console.log(`[bootstrap] listening on ${c}:${l}`);let b=await QRI(I,l,c);return{primary:b,servers:[b]}}function oRI(){try{return ej.default.networkInterfaces()}catch{return{}}}async function Nj(){console.log(`hermes-web-ui v${FRI} starting...`),await(0,P0.mkdir)(YI.uploadDir,{recursive:!0}),await(0,P0.mkdir)(YI.dataDir,{recursive:!0}),await OE();try{let N=await new Zd().injectMissingSkills();N.injected.length>0&&R.info({injected:[...new Set(N.injected)],targetCount:N.targets.length},"[bootstrap] bundled skills injected"),N.updated.length>0&&R.info({updated:[...new Set(N.updated)],targetCount:N.targets.length},"[bootstrap] bundled skills updated")}catch(n){R.warn(n,"[bootstrap] failed to inject bundled skills"),console.warn("[bootstrap] failed to inject bundled skills:",n instanceof Error?n.message:n)}try{await qA(),console.log("[bootstrap] profile gateways checked")}catch(n){R.warn(n,"[bootstrap] failed to ensure profile gateways"),console.warn("[bootstrap] failed to ensure profile gateways:",n instanceof Error?n.message:n)}let I=new Tr;try{dj=await eL(),console.log("[bootstrap] agent bridge started")}catch(n){R.warn(n,"[bootstrap] agent bridge failed to start"),console.warn("[bootstrap] agent bridge failed to start:",n instanceof Error?n.message:n)}await new Promise(n=>setTimeout(n,1e3));let{initAllStores:l}=await Promise.resolve().then(()=>(Zj(),bj));l(),await new Promise(n=>setTimeout(n,1e3)),console.log("[bootstrap] all stores initialized"),I.use((0,Wj.default)({origin:YI.corsOrigins})),I.use(yy()),console.log("[bootstrap] cors + bodyParser registered");let G=pB(I,[OC,MC]);I.use(G),console.log("[bootstrap] routes registered");let c=(0,nj.resolve)(__dirname,"..","client");I.use((0,aj.default)(c)),I.use(async n=>{!n.path.startsWith("/api")&&n.path!=="/health"&&n.path!=="/upload"&&n.path!=="/webhook"&&await(0,mj.default)(n,"index.html",{root:c})}),console.log("[bootstrap] SPA fallback registered");let b=await HRI(I,YI.port,YI.host);XRI=b.primary,wd=b.servers,console.log("[bootstrap] app.listen called"),fC(wd),VA(wd),console.log("[bootstrap] terminal + kanban websocket setup");let Z=new SV(wd);wL(Z),bs=new cs(Z.getIO()),uB(bs),bs.init();let{SessionDeleter:d}=await Promise.resolve().then(()=>(tt(),$L)),W=d.getInstance(),a=process.env.PROFILE||"default";W.start(a),console.log("[bootstrap] session deleter started, profile=%s",a),wd.forEach(n=>{n.on("upgrade",(N,Y)=>{let t=new URL(N.url||"",`http://${N.headers.host}`);t.pathname!=="/api/hermes/terminal"&&t.pathname!=="/api/hermes/kanban/events"&&!t.pathname.startsWith("/socket.io/")&&Y.destroy()})});let m=oRI(),e=Object.values(m).flat().find(n=>n?.family==="IPv4"&&!n?.internal)?.address||"localhost";console.log(`Server: http://localhost:${YI.port} (LAN: http://${e}:${YI.port})`),console.log(`Log: ${YI.appHome}/logs/server.log`),R.info("Server: http://localhost:%d (LAN: http://%s:%d)",YI.port,e,YI.port),Z.restoreWhenReady(),wd.forEach(n=>{n.on("error",N=>{console.error("[bootstrap] server error:",N.code||N.message),R.error({err:N},"Server error")})}),eg(wd,Z,bs,dj),GR()}Nj().catch(I=>{console.error("FATAL: Failed to start Hermes Web UI"),console.error(I),R.fatal(I,"Fatal error during bootstrap"),process.exit(1)});0&&(module.exports={bootstrap});
1077
1077
  /*! Bundled license information:
1078
1078
 
1079
1079
  ee-first/index.js: