hermes-web-ui 0.5.27 → 0.5.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/assets/js/{ChannelsView-D_Hpf1W2.js → ChannelsView-CuofDTcs.js} +1 -1
- package/dist/client/assets/js/{ChatView-DOr-OoTw.js → ChatView-Cpj8e0uj.js} +1 -1
- package/dist/client/assets/js/{FileRenameModal-DCzKrCtb.js → FileRenameModal-DS3tMLmA.js} +1 -1
- package/dist/client/assets/js/{FilesView-UJ8COV83.js → FilesView-DitPDLfP.js} +1 -1
- package/dist/client/assets/js/{GatewaysView-DoaDCbK0.js → GatewaysView-DEwU6CSA.js} +1 -1
- package/dist/client/assets/js/{GroupChatView-DnI3I50w.js → GroupChatView-B1KWnK4w.js} +1 -1
- package/dist/client/assets/js/{HistoryMessageList-Dppp5myU.js → HistoryMessageList-DVoUuNfX.js} +1 -1
- package/dist/client/assets/js/{HistoryView-Bx31cTqX.js → HistoryView-By-yzPZa.js} +1 -1
- package/dist/client/assets/js/{JobsView-Dwo25w0R.js → JobsView-CCwgRxCj.js} +1 -1
- package/dist/client/assets/js/{KanbanView-B0OXZzdS.js → KanbanView-CHz90gv2.js} +1 -1
- package/dist/client/assets/js/{LoginView-BP1Dbycl.js → LoginView-nCg7jCjW.js} +1 -1
- package/dist/client/assets/js/{LogsView-Bjv7V7F0.js → LogsView-BXG5oQpY.js} +1 -1
- package/dist/client/assets/js/{MarkdownRenderer-CvzCPLnZ.js → MarkdownRenderer-BCFoS7DH.js} +1 -1
- package/dist/client/assets/js/{MemoryView-BZqGsRGv.js → MemoryView-DoVkLerx.js} +1 -1
- package/dist/client/assets/js/{MessageItem-BzZuEzVW.js → MessageItem-BhSU5oee.js} +1 -1
- package/dist/client/assets/js/{ModelsView-Bu2mJnSO.js → ModelsView-BeDBR3tp.js} +1 -1
- package/dist/client/assets/js/{PluginsView-Do42kP51.js → PluginsView-D3w2eLIX.js} +1 -1
- package/dist/client/assets/js/{ProfilesView-rgzlgeY7.js → ProfilesView-DgEhQ263.js} +1 -1
- package/dist/client/assets/js/{SessionListItem-Y4rY8ixs.js → SessionListItem-BKe7QBCc.js} +1 -1
- package/dist/client/assets/js/{SettingRow-5JNu2zcB.js → SettingRow-Cj9O4m9X.js} +1 -1
- package/dist/client/assets/js/{SettingsView-BsJJZ2sv.js → SettingsView-VtbkRWEM.js} +1 -1
- package/dist/client/assets/js/{SkillsUsageView-DmKMulrJ.js → SkillsUsageView-BGvo9h2N.js} +1 -1
- package/dist/client/assets/js/{SkillsView-DrUkFlBB.js → SkillsView-DwsnhtnV.js} +1 -1
- package/dist/client/assets/js/{TerminalView-HQvnFA42.js → TerminalView-BAlxAV-W.js} +1 -1
- package/dist/client/assets/js/{UsageView-DUlZFcoj.js → UsageView-ByfmOWKv.js} +1 -1
- package/dist/client/assets/js/{_plugin-vue_export-helper-ZIsfSgrY.js → _plugin-vue_export-helper-CrLlP_D3.js} +2 -2
- package/dist/client/assets/js/app-CYaCGxZ_.js +1 -0
- package/dist/client/assets/js/{auth-CrqiXkJC.js → auth-hbDI2OUF.js} +1 -1
- package/dist/client/assets/js/{index-JI6E-cKo.js → index-Bzb-xLYu.js} +1 -1
- package/dist/client/assets/js/{models-BR4rntqB.js → models-CDvVG-uE.js} +1 -1
- package/dist/client/assets/js/{session-browser-prefs-DPQy70mA.js → session-browser-prefs-HIgWQY8T.js} +1 -1
- package/dist/client/assets/js/{skills-BZYoszrI.js → skills-BCJOb_4y.js} +1 -1
- package/dist/client/index.html +3 -3
- package/dist/server/index.js +2 -2
- package/package.json +2 -2
- package/dist/client/assets/js/app-BP-u-rQP.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as _}from"./rolldown-runtime-BKwlnUi0.js";import{Nt as r,U as M,et as l}from"./ui-vendor-CsTMg6zH.js";import{d as y,u as P}from"./vue-vendor-D8zSB7VM.js";import{c as b,s as h}from"./_plugin-vue_export-helper-
|
|
1
|
+
import{n as _}from"./rolldown-runtime-BKwlnUi0.js";import{Nt as r,U as M,et as l}from"./ui-vendor-CsTMg6zH.js";import{d as y,u as P}from"./vue-vendor-D8zSB7VM.js";import{c as b,s as h}from"./_plugin-vue_export-helper-CrLlP_D3.js";import{c as w,i as A,n as d,o as D,r as S,s as C,t as W}from"./app-CYaCGxZ_.js";var x,j=_((()=>{y(),M(),D(),b(),W(),x=P("models",()=>{const a=r([]),n=r([]),s=r(""),o=r(!1),u=l(()=>a.value.filter(e=>e.provider.startsWith("custom:"))),v=l(()=>a.value.filter(e=>!e.provider.startsWith("custom:"))),c=l(()=>a.value.flatMap(e=>e.models.map(t=>({id:t,provider:e.provider,label:e.label,base_url:e.base_url,isDefault:t===s.value}))));async function i(){if(h()){o.value=!0;try{const e=await A();a.value=e.groups,n.value=e.allProviders,s.value=e.default,d().applyAvailableModelsResponse(e)}catch(e){console.error("Failed to fetch providers:",e)}finally{o.value=!1}}}async function f(e,t){await w({default:e,provider:t}),s.value=e,d().reloadModels()}async function p(e){await S(e),await i()}async function m(e){await C(e),await i()}return{providers:a,allProviders:n,defaultModel:s,loading:o,customProviders:u,builtinProviders:v,allModels:c,fetchProviders:i,setDefaultModel:f,addProvider:p,removeProvider:m}})}));export{x as n,j as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as w}from"./rolldown-runtime-BKwlnUi0.js";import{Nt as l,St as I,U as E}from"./ui-vendor-CsTMg6zH.js";import{d as J,u as K}from"./vue-vendor-D8zSB7VM.js";import{d as $,p}from"./_plugin-vue_export-helper-
|
|
1
|
+
import{n as w}from"./rolldown-runtime-BKwlnUi0.js";import{Nt as l,St as I,U as E}from"./ui-vendor-CsTMg6zH.js";import{d as J,u as K}from"./vue-vendor-D8zSB7VM.js";import{d as $,p}from"./_plugin-vue_export-helper-CrLlP_D3.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`${d}${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,d,M,U=w((()=>{J(),E(),$(),h="hermes_session_pins_v1_",d="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 P(){_(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,P())}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,U as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as a}from"./rolldown-runtime-BKwlnUi0.js";import{c as t,l as i}from"./_plugin-vue_export-helper-
|
|
1
|
+
import{n as a}from"./rolldown-runtime-BKwlnUi0.js";import{c as t,l as i}from"./_plugin-vue_export-helper-CrLlP_D3.js";async function l(){const s=await i("/api/hermes/skills");return{categories:s.categories,archived:s.archived??[]}}async function c(s=7){return i(`/api/hermes/skills/usage/stats?${new URLSearchParams({days:String(s)})}`)}async function o(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,c as i,y as l,o as n,p as o,m as r,u as s,f as t};
|
package/dist/client/index.html
CHANGED
|
@@ -33,14 +33,14 @@
|
|
|
33
33
|
}
|
|
34
34
|
})();
|
|
35
35
|
</script>
|
|
36
|
-
<script type="module" crossorigin src="/assets/js/index-
|
|
36
|
+
<script type="module" crossorigin src="/assets/js/index-Bzb-xLYu.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-Dc9pVNd5.js">
|
|
39
39
|
<link rel="modulepreload" crossorigin href="/assets/js/ui-vendor-CsTMg6zH.js">
|
|
40
40
|
<link rel="modulepreload" crossorigin href="/assets/js/vendor-D9rSt2qK.js">
|
|
41
41
|
<link rel="modulepreload" crossorigin href="/assets/js/vue-vendor-D8zSB7VM.js">
|
|
42
|
-
<link rel="modulepreload" crossorigin href="/assets/js/_plugin-vue_export-helper-
|
|
43
|
-
<link rel="modulepreload" crossorigin href="/assets/js/app-
|
|
42
|
+
<link rel="modulepreload" crossorigin href="/assets/js/_plugin-vue_export-helper-CrLlP_D3.js">
|
|
43
|
+
<link rel="modulepreload" crossorigin href="/assets/js/app-CYaCGxZ_.js">
|
|
44
44
|
<link rel="stylesheet" crossorigin href="/assets/css/index-6cXv6v9U.css">
|
|
45
45
|
</head>
|
|
46
46
|
|
package/dist/server/index.js
CHANGED
|
@@ -220,7 +220,7 @@ Path:ssml\r
|
|
|
220
220
|
\r
|
|
221
221
|
`),Z.destroy();return}try{b.kanbanBoard=RZ(W.searchParams.get("board"))}catch{Z.write(`HTTP/1.1 400 Bad Request\r
|
|
222
222
|
\r
|
|
223
|
-
`),Z.destroy();return}G.handleUpgrade(b,Z,d,a=>{G.emit("connection",a,b)})})}),G.on("connection",(c,b)=>{let Z=b.kanbanBoard||"default",d=U5({board:Z,interval:.5}),W=!1;zm(c,{type:"connected",board:Z});let m=()=>{W||(W=!0,d.killed||d.kill())};d.stdout?.on("data",lg(a=>{a.toLowerCase().startsWith("watching kanban events")||zm(c,{type:"event",board:Z,line:a})})),d.stderr?.on("data",lg(a=>{zm(c,{type:"error",board:Z,message:a})})),d.on("error",a=>{p.error(a,"Hermes CLI: kanban watch failed"),zm(c,{type:"error",board:Z,message:a.message}),c.readyState===c.OPEN&&c.close()}),d.on("exit",(a,N)=>{zm(c,{type:"stopped",board:Z,code:a,signal:N}),c.readyState===c.OPEN&&c.close()}),c.on("close",m),c.on("error",m)}),p.info("WebSocket ready at /api/hermes/kanban/events (kanban watch bridge)")}var ng=A(BW(),1),YbI=A(UN(),1),Vg=A(BW(),1),F2=A(UN(),1),gn=require("url"),jd=A(ag(),1),tg=A(require("http"),1),sg=A(qI(),1),eg={NotFound:"not-found"};function abI(I){return typeof I=="function"?I(eg):I}var NbI=class{_handlers=new Map;register(I,G){let l=this._handlers.get(I)??[];l.push(G),this._handlers.set(I,l)}emit(I,G,l){let c=this._handlers.get(I);return c&&c.length>0?(0,ng.default)(c)(G,l):l()}};function Jn(I,G={}){let l={...G};"strict"in l&&!("trailing"in l)&&(l.trailing=l.strict!==!0,delete l.strict),delete l.pathAsRegExp,delete l.ignoreCaptures,delete l.prefix;let{regexp:c,keys:b}=(0,jd.pathToRegexp)(I,l);return{regexp:c,keys:b}}function nbI(I,G={}){return(0,jd.compile)(I,G)}function ebI(I,G){return(0,jd.parse)(I,G)}function R2(I={}){let G={sensitive:I.sensitive,end:I.end,strict:I.strict,trailing:I.trailing};"strict"in G&&!("trailing"in G)&&(G.trailing=G.strict!==!0,delete G.strict);for(let l of Object.keys(G))G[l]===void 0&&delete G[l];return G}function VbI(I){try{return decodeURIComponent(I)}catch{return I}}var Ng=class{opts;name;methods;paramNames;stack;path;regexp;constructor(I,G,l,c={}){this.opts=c,this.name=this.opts.name||void 0,this.methods=this._normalizeHttpMethods(G),this.stack=this._normalizeAndValidateMiddleware(l,G,I),this.path=I,this.paramNames=[],this._configurePathMatching()}_normalizeHttpMethods(I){let G=[];for(let l of I){let c=l.toUpperCase();G.push(c),c==="GET"&&G.unshift("HEAD")}return G}_normalizeAndValidateMiddleware(I,G,l){let c=Array.isArray(I)?I:[I];for(let b of c){let Z=typeof b;if(Z!=="function"){let d=this.opts.name||l;throw new Error(`${G.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=R2(this.opts),{regexp:G,keys:l}=Jn(this.path,I);this.regexp=G,this.paramNames=l}match(I){return this.regexp.test(I)}params(I,G,l={}){let c={...l};for(let[b,Z]of G.entries()){let d=this.paramNames[b];if(d&&Z&&Z.length>0){let W=d.name;c[W]=VbI(Z)}}return c}captures(I){if(this.opts.ignoreCaptures)return[];let G=I.match(this.regexp);return G?G.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:G,options:l}=this._parseUrlArguments(I),c=this.path.replaceAll("(.*)",""),b=nbI(c,{encode:encodeURIComponent,...l}),Z=this._buildParamReplacements(G,c),d=b(Z);return l&&l.query?this._addQueryString(d,l.query):d}_parseUrlArguments(I){let G=I[0]??{},l=I[1];if(typeof G!="object"||G===null){let c=[...I],b=c.at(-1);typeof b=="object"&&b!==null?(l=b,G=c.slice(0,-1)):G=c}else if(G&&!l){let c=Object.keys(G);if(c.length===1&&c[0]==="query")l=G,G={};else if("query"in G&&G.query){let{query:Z,...d}=G;l={query:Z},G=d}}return{params:G,options:l}}_buildParamReplacements(I,G){let{tokens:l}=ebI(G),c=l.some(Z=>"name"in Z&&Z.name),b={};if(Array.isArray(I)){let Z=0;for(let d of l)"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,G){let l=(0,gn.parse)(I),c={...l,query:l.query??void 0};return typeof G=="string"?(c.search=G,c.query=void 0):(c.search=void 0,c.query=G),(0,gn.format)(c)}param(I,G){let l=this.stack,c=this.paramNames,b=this._createParamMiddleware(I,G),Z=c.map(W=>W.name),d=Z.indexOf(I);return d!==-1&&this._insertParamMiddleware(l,b,Z,d),this}_createParamMiddleware(I,G){let l=((c,b)=>(c._matchedParams||(c._matchedParams=new WeakMap),c._matchedParams.has(G)?b():(c._matchedParams.set(G,!0),G(c.params[I],c,b))));return l.param=I,l._originalFn=G,l}_insertParamMiddleware(I,G,l,c){let b=!1;for(let Z=0;Z<I.length;Z++){let d=I[Z];if(!d.param){I.splice(Z,0,G),b=!0;break}if(l.indexOf(d.param)>c){I.splice(Z,0,G),b=!0;break}}b||I.push(G)}setPrefix(I){return this.path?this.path instanceof RegExp?this:(this.path=this._applyPrefix(I),this._reconfigurePathMatching(I),this):this}_applyPrefix(I){let G=this.path==="/",l=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 G&&!l?I:`${I}${this.path}`}_reconfigurePathMatching(I){let G=this.opts.pathAsRegExp===!0;if(I&&I.includes(":")&&G){let c=R2(this.opts),{regexp:b,keys:Z}=Jn(this.path,c);this.regexp=b,this.paramNames=Z,this.opts.pathAsRegExp=!1}else if(G){let c=this.path,b=c.startsWith("^")?c:`^${c}`;this.regexp=this.path instanceof RegExp?this.path:new RegExp(b)}else{let c=R2(this.opts),{regexp:b,keys:Z}=Jn(this.path,c);this.regexp=b,this.paramNames=Z}}};function tbI(){return tg.default.METHODS.map(I=>I.toLowerCase())}var hbI=["get","post","put","patch","delete","del","head","options"];function sbI(I){return I?Array.isArray(I)?I:[I]:[]}function hg(I,G,l){let c=sbI(l);for(let b of c)I.param(G,b)}function pbI(I,G){let l=Object.keys(G);for(let c of l){let b=G[c];hg(I,c,b)}}function Yg(I,G={}){if(!I)return!1;let{keys:l}=Jn(I,G);return l.length>0}function RbI(I,G){return I!==void 0?typeof I=="string"?I===""?{path:"{/*rest}",pathAsRegExp:!1}:I==="/"?{path:"/",pathAsRegExp:!1}:{path:I,pathAsRegExp:!1}:{path:I,pathAsRegExp:!0}:G?{path:"{/*rest}",pathAsRegExp:!1}:{path:String.raw`(?:\/|$)`,pathAsRegExp:!0}}var u2=(0,sg.default)("koa-router"),pg=tbI(),X2=class{opts;methods;exclusive;params;stack;host;_events=new NbI;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,...G){return new Ng(I,[],()=>{}).url(...G)}use(...I){let G;if(this._isPathArray(I[0]))return this._useWithPathArray(I);let l=this._hasExplicitPath(I[0]);if(l&&(G=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,G):this._registerMiddleware(c,G,l);return this}_isPathArray(I){return Array.isArray(I)&&I.length>0&&I.every(G=>typeof G=="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 G=I[0],l=I.slice(1);for(let c of G)Reflect.apply(this.use,this,[c,...l]);return this}_mountNestedRouter(I,G){let l=I.router,c=this._cloneRouter(l),b=G&&typeof G=="string"&&Yg(G,this.opts);for(let Z=0;Z<c.stack.length;Z++){let d=c.stack[Z],W=this._cloneLayer(d);G&&typeof G=="string"&&W.setPrefix(G),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 G=Object.keys(this.params);for(let l of G){let c=this.params[l];hg(I,l,c)}}_registerMiddleware(I,G,l){let c=Yg(this.opts.prefix||"",this.opts),b=(()=>{if(G!==void 0)return G;if(c)return""})(),Z=l||G===void 0&&c,{path:d,pathAsRegExp:W}=RbI(b,c),m=d,a=W,N=Z&&d==="/";Z&&typeof d=="string"&&(m=d,a=!1),this.register(m,[],I,{end:N,ignoreCaptures:!Z&&!c,pathAsRegExp:a})}prefix(I){let G=I.replace(/\/$/,""),l=this.opts.prefix||"";this.opts.prefix=G;for(let c of this.stack){if(typeof c.path=="string"&&l){let b=l+"/";(c.path===l||c.path.startsWith(b))&&(c.path=c.path.slice(l.length)||"/")}c.setPrefix(G)}return this}middleware(){let I=function(G,l){if(u2("%s %s",G.method,G.path),!this.matchHost(G.host))return l();let c=this._getRequestPath(G),b=this.match(c,G.method);if(this._storeMatchedRoutes(G,b),G.router=this,G.routeMatched=b.route,!b.route)return this._events.emit(eg.NotFound,G,l);let Z=b.pathAndMethod;this._setMatchedRouteInfo(G,Z);let d=this._buildMiddlewareChain(Z,c);return(0,Vg.default)(d)(G,l)}.bind(this);return I.router=this,I}_getRequestPath(I){let G=I;return this.opts.routerPath||G.newRouterPath||G.path||G.routerPath||""}_storeMatchedRoutes(I,G){let l=I;l.matched?l.matched.push(...G.path):l.matched=G.path}_setMatchedRouteInfo(I,G){let l=I,c=G.toReversed().find(b=>b.methods.length>0);c&&(l._matchedRoute=c.path,c.name&&(l._matchedRouteName=c.name))}_buildMiddlewareChain(I,G){let l;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);l=b?[b]:[]}else l=I;let c=[];for(let b of l)c.push((Z,d)=>{let W=Z;return W.captures=b.captures(G),W.request.params=b.params(G,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,G){return this._events.register(abI(I),G),this}allowedMethods(I={}){let G=this.methods;return(l,c)=>{let b=l;return c().then(()=>{if(!this._shouldProcessAllowedMethods(b))return;let Z=b.matched||[],d=this._collectAllowedMethods(Z),W=Object.keys(d),m=l.method.toUpperCase();if(!G.includes(m)){this._handleNotImplemented(b,W,I);return}if(m==="OPTIONS"&&W.length>0){this._handleOptionsRequest(b,W);return}W.length>0&&!d[m]&&this._handleMethodNotAllowed(b,W,I)})}}_shouldProcessAllowedMethods(I){return!!(I.matched&&(!I.status||I.status===404))}_collectAllowedMethods(I){let G={};for(let l of I)for(let c of l.methods)G[c]=c;return G}_handleNotImplemented(I,G,l){if(l.throw)throw typeof l.notImplemented=="function"?l.notImplemented():new F2.default.NotImplemented;I.status=501,I.set("Allow",G.join(", "))}_handleOptionsRequest(I,G){I.status=200,I.body="",I.set("Allow",G.join(", "))}_handleMethodNotAllowed(I,G,l){if(l.throw)throw typeof l.methodNotAllowed=="function"?l.methodNotAllowed():new F2.default.MethodNotAllowed;I.status=405,I.set("Allow",G.join(", "))}all(...I){let G,l,c;if(I.length>=2&&(typeof I[1]=="string"||I[1]instanceof RegExp)?(G=I[0],l=I[1],c=I.slice(2)):(G=void 0,l=I[0],c=I.slice(1)),typeof l!="string"&&!(l instanceof RegExp)&&(!Array.isArray(l)||l.length===0))throw new Error("You have to provide a path when adding an all handler");let b={name:G,pathAsRegExp:l instanceof RegExp};return this.register(l,pg,c,{...this.opts,...b}),this}redirect(I,G,l){let c=I,b=G;if(typeof I=="symbol"||typeof I=="string"&&I[0]!=="/"){let d=this.url(I);if(d instanceof Error)throw d;c=d}if(typeof G=="symbol"||typeof G=="string"&&G[0]!=="/"&&!G.includes("://")){let d=this.url(G);if(d instanceof Error)throw d;b=d}return this.all(c,d=>{d.redirect(b),d.status=l||301})}register(I,G,l,c={}){let b={...this.opts,...c};if(Array.isArray(I))return this._registerMultiplePaths(I,G,l,b);let Z=this._createRouteLayer(I,G,l,b);return this.opts.prefix&&Z.setPrefix(this.opts.prefix),pbI(Z,this.params),this.stack.push(Z),u2("defined route %s %s",Z.methods,Z.path),Z}_registerMultiplePaths(I,G,l,c){for(let b of I)this.register.call(this,b,G,l,c);return this}_createRouteLayer(I,G,l,c){return new Ng(I,G,l,{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(l=>l.name===I)||!1}url(I,...G){let l=this.route(I);return l?l.url(...G):new Error(`No route found for name: ${String(I)}`)}match(I,G){let l={path:[],pathAndMethod:[],route:!1},c=G.toUpperCase();for(let b of this.stack)if(u2("test %s %s",b.path,b.regexp),b.match(I)){l.path.push(b);let Z=b.methods.length===0,d=b.methods.includes(c);(Z||d)&&(l.pathAndMethod.push(b),b.methods.length>0&&(l.route=!0))}return l}matchHost(I){let{host:G}=this;return G?I?typeof G=="string"?I===G:Array.isArray(G)?G.includes(I):G instanceof RegExp?G.test(I):!1:!1:!0}param(I,G){this.params[I]||(this.params[I]=[]),Array.isArray(this.params[I])||(this.params[I]=[this.params[I]]),this.params[I].push(G);for(let l of this.stack)l.param(I,G);return this}_registerMethod(I,...G){let l,c,b;if(G.length>=2&&(typeof G[1]=="string"||G[1]instanceof RegExp)?(l=G[0],c=G[1],b=G.slice(2)):(l=void 0,c=G[0],b=G.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:l,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)}},ubI=X2,U=ubI;for(let I of pg)hbI.includes(I)||I in X2.prototype||Object.defineProperty(X2.prototype,I,{value:function(...l){return this._registerMethod(I,...l)},writable:!0,configurable:!0,enumerable:!1});var kn=require("fs"),Ln=require("path");Hb();function vbI(){let I=[(0,Ln.resolve)(__dirname,"../../../../package.json"),(0,Ln.resolve)(__dirname,"../../package.json"),(0,Ln.resolve)(process.cwd(),"package.json")];for(let G of I)if((0,kn.existsSync)(G))try{let l=JSON.parse((0,kn.readFileSync)(G,"utf-8"));if(l?.name&&l?.version)return{name:String(l.name),version:String(l.version)}}catch{}return null}var ibI=vbI(),Kd="0.5.27",Sd="";async function Ag(){try{let I=ibI?.name||"hermes-web-ui",G=encodeURIComponent(I),l=await fetch(`https://registry.npmjs.org/${G}/latest`,{signal:AbortSignal.timeout(1e4)});l.ok&&(Sd=(await l.json()).version,Kd&&Sd!==Kd&&console.log(`Update available: ${Kd} \u2192 ${Sd}`))}catch{}}function H2(){setTimeout(Ag,5e3),setInterval(Ag,1800*1e3)}async function Lg(I){let l=(await Qg()).split(`
|
|
223
|
+
`),Z.destroy();return}G.handleUpgrade(b,Z,d,a=>{G.emit("connection",a,b)})})}),G.on("connection",(c,b)=>{let Z=b.kanbanBoard||"default",d=U5({board:Z,interval:.5}),W=!1;zm(c,{type:"connected",board:Z});let m=()=>{W||(W=!0,d.killed||d.kill())};d.stdout?.on("data",lg(a=>{a.toLowerCase().startsWith("watching kanban events")||zm(c,{type:"event",board:Z,line:a})})),d.stderr?.on("data",lg(a=>{zm(c,{type:"error",board:Z,message:a})})),d.on("error",a=>{p.error(a,"Hermes CLI: kanban watch failed"),zm(c,{type:"error",board:Z,message:a.message}),c.readyState===c.OPEN&&c.close()}),d.on("exit",(a,N)=>{zm(c,{type:"stopped",board:Z,code:a,signal:N}),c.readyState===c.OPEN&&c.close()}),c.on("close",m),c.on("error",m)}),p.info("WebSocket ready at /api/hermes/kanban/events (kanban watch bridge)")}var ng=A(BW(),1),YbI=A(UN(),1),Vg=A(BW(),1),F2=A(UN(),1),gn=require("url"),jd=A(ag(),1),tg=A(require("http"),1),sg=A(qI(),1),eg={NotFound:"not-found"};function abI(I){return typeof I=="function"?I(eg):I}var NbI=class{_handlers=new Map;register(I,G){let l=this._handlers.get(I)??[];l.push(G),this._handlers.set(I,l)}emit(I,G,l){let c=this._handlers.get(I);return c&&c.length>0?(0,ng.default)(c)(G,l):l()}};function Jn(I,G={}){let l={...G};"strict"in l&&!("trailing"in l)&&(l.trailing=l.strict!==!0,delete l.strict),delete l.pathAsRegExp,delete l.ignoreCaptures,delete l.prefix;let{regexp:c,keys:b}=(0,jd.pathToRegexp)(I,l);return{regexp:c,keys:b}}function nbI(I,G={}){return(0,jd.compile)(I,G)}function ebI(I,G){return(0,jd.parse)(I,G)}function R2(I={}){let G={sensitive:I.sensitive,end:I.end,strict:I.strict,trailing:I.trailing};"strict"in G&&!("trailing"in G)&&(G.trailing=G.strict!==!0,delete G.strict);for(let l of Object.keys(G))G[l]===void 0&&delete G[l];return G}function VbI(I){try{return decodeURIComponent(I)}catch{return I}}var Ng=class{opts;name;methods;paramNames;stack;path;regexp;constructor(I,G,l,c={}){this.opts=c,this.name=this.opts.name||void 0,this.methods=this._normalizeHttpMethods(G),this.stack=this._normalizeAndValidateMiddleware(l,G,I),this.path=I,this.paramNames=[],this._configurePathMatching()}_normalizeHttpMethods(I){let G=[];for(let l of I){let c=l.toUpperCase();G.push(c),c==="GET"&&G.unshift("HEAD")}return G}_normalizeAndValidateMiddleware(I,G,l){let c=Array.isArray(I)?I:[I];for(let b of c){let Z=typeof b;if(Z!=="function"){let d=this.opts.name||l;throw new Error(`${G.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=R2(this.opts),{regexp:G,keys:l}=Jn(this.path,I);this.regexp=G,this.paramNames=l}match(I){return this.regexp.test(I)}params(I,G,l={}){let c={...l};for(let[b,Z]of G.entries()){let d=this.paramNames[b];if(d&&Z&&Z.length>0){let W=d.name;c[W]=VbI(Z)}}return c}captures(I){if(this.opts.ignoreCaptures)return[];let G=I.match(this.regexp);return G?G.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:G,options:l}=this._parseUrlArguments(I),c=this.path.replaceAll("(.*)",""),b=nbI(c,{encode:encodeURIComponent,...l}),Z=this._buildParamReplacements(G,c),d=b(Z);return l&&l.query?this._addQueryString(d,l.query):d}_parseUrlArguments(I){let G=I[0]??{},l=I[1];if(typeof G!="object"||G===null){let c=[...I],b=c.at(-1);typeof b=="object"&&b!==null?(l=b,G=c.slice(0,-1)):G=c}else if(G&&!l){let c=Object.keys(G);if(c.length===1&&c[0]==="query")l=G,G={};else if("query"in G&&G.query){let{query:Z,...d}=G;l={query:Z},G=d}}return{params:G,options:l}}_buildParamReplacements(I,G){let{tokens:l}=ebI(G),c=l.some(Z=>"name"in Z&&Z.name),b={};if(Array.isArray(I)){let Z=0;for(let d of l)"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,G){let l=(0,gn.parse)(I),c={...l,query:l.query??void 0};return typeof G=="string"?(c.search=G,c.query=void 0):(c.search=void 0,c.query=G),(0,gn.format)(c)}param(I,G){let l=this.stack,c=this.paramNames,b=this._createParamMiddleware(I,G),Z=c.map(W=>W.name),d=Z.indexOf(I);return d!==-1&&this._insertParamMiddleware(l,b,Z,d),this}_createParamMiddleware(I,G){let l=((c,b)=>(c._matchedParams||(c._matchedParams=new WeakMap),c._matchedParams.has(G)?b():(c._matchedParams.set(G,!0),G(c.params[I],c,b))));return l.param=I,l._originalFn=G,l}_insertParamMiddleware(I,G,l,c){let b=!1;for(let Z=0;Z<I.length;Z++){let d=I[Z];if(!d.param){I.splice(Z,0,G),b=!0;break}if(l.indexOf(d.param)>c){I.splice(Z,0,G),b=!0;break}}b||I.push(G)}setPrefix(I){return this.path?this.path instanceof RegExp?this:(this.path=this._applyPrefix(I),this._reconfigurePathMatching(I),this):this}_applyPrefix(I){let G=this.path==="/",l=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 G&&!l?I:`${I}${this.path}`}_reconfigurePathMatching(I){let G=this.opts.pathAsRegExp===!0;if(I&&I.includes(":")&&G){let c=R2(this.opts),{regexp:b,keys:Z}=Jn(this.path,c);this.regexp=b,this.paramNames=Z,this.opts.pathAsRegExp=!1}else if(G){let c=this.path,b=c.startsWith("^")?c:`^${c}`;this.regexp=this.path instanceof RegExp?this.path:new RegExp(b)}else{let c=R2(this.opts),{regexp:b,keys:Z}=Jn(this.path,c);this.regexp=b,this.paramNames=Z}}};function tbI(){return tg.default.METHODS.map(I=>I.toLowerCase())}var hbI=["get","post","put","patch","delete","del","head","options"];function sbI(I){return I?Array.isArray(I)?I:[I]:[]}function hg(I,G,l){let c=sbI(l);for(let b of c)I.param(G,b)}function pbI(I,G){let l=Object.keys(G);for(let c of l){let b=G[c];hg(I,c,b)}}function Yg(I,G={}){if(!I)return!1;let{keys:l}=Jn(I,G);return l.length>0}function RbI(I,G){return I!==void 0?typeof I=="string"?I===""?{path:"{/*rest}",pathAsRegExp:!1}:I==="/"?{path:"/",pathAsRegExp:!1}:{path:I,pathAsRegExp:!1}:{path:I,pathAsRegExp:!0}:G?{path:"{/*rest}",pathAsRegExp:!1}:{path:String.raw`(?:\/|$)`,pathAsRegExp:!0}}var u2=(0,sg.default)("koa-router"),pg=tbI(),X2=class{opts;methods;exclusive;params;stack;host;_events=new NbI;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,...G){return new Ng(I,[],()=>{}).url(...G)}use(...I){let G;if(this._isPathArray(I[0]))return this._useWithPathArray(I);let l=this._hasExplicitPath(I[0]);if(l&&(G=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,G):this._registerMiddleware(c,G,l);return this}_isPathArray(I){return Array.isArray(I)&&I.length>0&&I.every(G=>typeof G=="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 G=I[0],l=I.slice(1);for(let c of G)Reflect.apply(this.use,this,[c,...l]);return this}_mountNestedRouter(I,G){let l=I.router,c=this._cloneRouter(l),b=G&&typeof G=="string"&&Yg(G,this.opts);for(let Z=0;Z<c.stack.length;Z++){let d=c.stack[Z],W=this._cloneLayer(d);G&&typeof G=="string"&&W.setPrefix(G),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 G=Object.keys(this.params);for(let l of G){let c=this.params[l];hg(I,l,c)}}_registerMiddleware(I,G,l){let c=Yg(this.opts.prefix||"",this.opts),b=(()=>{if(G!==void 0)return G;if(c)return""})(),Z=l||G===void 0&&c,{path:d,pathAsRegExp:W}=RbI(b,c),m=d,a=W,N=Z&&d==="/";Z&&typeof d=="string"&&(m=d,a=!1),this.register(m,[],I,{end:N,ignoreCaptures:!Z&&!c,pathAsRegExp:a})}prefix(I){let G=I.replace(/\/$/,""),l=this.opts.prefix||"";this.opts.prefix=G;for(let c of this.stack){if(typeof c.path=="string"&&l){let b=l+"/";(c.path===l||c.path.startsWith(b))&&(c.path=c.path.slice(l.length)||"/")}c.setPrefix(G)}return this}middleware(){let I=function(G,l){if(u2("%s %s",G.method,G.path),!this.matchHost(G.host))return l();let c=this._getRequestPath(G),b=this.match(c,G.method);if(this._storeMatchedRoutes(G,b),G.router=this,G.routeMatched=b.route,!b.route)return this._events.emit(eg.NotFound,G,l);let Z=b.pathAndMethod;this._setMatchedRouteInfo(G,Z);let d=this._buildMiddlewareChain(Z,c);return(0,Vg.default)(d)(G,l)}.bind(this);return I.router=this,I}_getRequestPath(I){let G=I;return this.opts.routerPath||G.newRouterPath||G.path||G.routerPath||""}_storeMatchedRoutes(I,G){let l=I;l.matched?l.matched.push(...G.path):l.matched=G.path}_setMatchedRouteInfo(I,G){let l=I,c=G.toReversed().find(b=>b.methods.length>0);c&&(l._matchedRoute=c.path,c.name&&(l._matchedRouteName=c.name))}_buildMiddlewareChain(I,G){let l;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);l=b?[b]:[]}else l=I;let c=[];for(let b of l)c.push((Z,d)=>{let W=Z;return W.captures=b.captures(G),W.request.params=b.params(G,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,G){return this._events.register(abI(I),G),this}allowedMethods(I={}){let G=this.methods;return(l,c)=>{let b=l;return c().then(()=>{if(!this._shouldProcessAllowedMethods(b))return;let Z=b.matched||[],d=this._collectAllowedMethods(Z),W=Object.keys(d),m=l.method.toUpperCase();if(!G.includes(m)){this._handleNotImplemented(b,W,I);return}if(m==="OPTIONS"&&W.length>0){this._handleOptionsRequest(b,W);return}W.length>0&&!d[m]&&this._handleMethodNotAllowed(b,W,I)})}}_shouldProcessAllowedMethods(I){return!!(I.matched&&(!I.status||I.status===404))}_collectAllowedMethods(I){let G={};for(let l of I)for(let c of l.methods)G[c]=c;return G}_handleNotImplemented(I,G,l){if(l.throw)throw typeof l.notImplemented=="function"?l.notImplemented():new F2.default.NotImplemented;I.status=501,I.set("Allow",G.join(", "))}_handleOptionsRequest(I,G){I.status=200,I.body="",I.set("Allow",G.join(", "))}_handleMethodNotAllowed(I,G,l){if(l.throw)throw typeof l.methodNotAllowed=="function"?l.methodNotAllowed():new F2.default.MethodNotAllowed;I.status=405,I.set("Allow",G.join(", "))}all(...I){let G,l,c;if(I.length>=2&&(typeof I[1]=="string"||I[1]instanceof RegExp)?(G=I[0],l=I[1],c=I.slice(2)):(G=void 0,l=I[0],c=I.slice(1)),typeof l!="string"&&!(l instanceof RegExp)&&(!Array.isArray(l)||l.length===0))throw new Error("You have to provide a path when adding an all handler");let b={name:G,pathAsRegExp:l instanceof RegExp};return this.register(l,pg,c,{...this.opts,...b}),this}redirect(I,G,l){let c=I,b=G;if(typeof I=="symbol"||typeof I=="string"&&I[0]!=="/"){let d=this.url(I);if(d instanceof Error)throw d;c=d}if(typeof G=="symbol"||typeof G=="string"&&G[0]!=="/"&&!G.includes("://")){let d=this.url(G);if(d instanceof Error)throw d;b=d}return this.all(c,d=>{d.redirect(b),d.status=l||301})}register(I,G,l,c={}){let b={...this.opts,...c};if(Array.isArray(I))return this._registerMultiplePaths(I,G,l,b);let Z=this._createRouteLayer(I,G,l,b);return this.opts.prefix&&Z.setPrefix(this.opts.prefix),pbI(Z,this.params),this.stack.push(Z),u2("defined route %s %s",Z.methods,Z.path),Z}_registerMultiplePaths(I,G,l,c){for(let b of I)this.register.call(this,b,G,l,c);return this}_createRouteLayer(I,G,l,c){return new Ng(I,G,l,{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(l=>l.name===I)||!1}url(I,...G){let l=this.route(I);return l?l.url(...G):new Error(`No route found for name: ${String(I)}`)}match(I,G){let l={path:[],pathAndMethod:[],route:!1},c=G.toUpperCase();for(let b of this.stack)if(u2("test %s %s",b.path,b.regexp),b.match(I)){l.path.push(b);let Z=b.methods.length===0,d=b.methods.includes(c);(Z||d)&&(l.pathAndMethod.push(b),b.methods.length>0&&(l.route=!0))}return l}matchHost(I){let{host:G}=this;return G?I?typeof G=="string"?I===G:Array.isArray(G)?G.includes(I):G instanceof RegExp?G.test(I):!1:!1:!0}param(I,G){this.params[I]||(this.params[I]=[]),Array.isArray(this.params[I])||(this.params[I]=[this.params[I]]),this.params[I].push(G);for(let l of this.stack)l.param(I,G);return this}_registerMethod(I,...G){let l,c,b;if(G.length>=2&&(typeof G[1]=="string"||G[1]instanceof RegExp)?(l=G[0],c=G[1],b=G.slice(2)):(l=void 0,c=G[0],b=G.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:l,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)}},ubI=X2,U=ubI;for(let I of pg)hbI.includes(I)||I in X2.prototype||Object.defineProperty(X2.prototype,I,{value:function(...l){return this._registerMethod(I,...l)},writable:!0,configurable:!0,enumerable:!1});var kn=require("fs"),Ln=require("path");Hb();function vbI(){let I=[(0,Ln.resolve)(__dirname,"../../../../package.json"),(0,Ln.resolve)(__dirname,"../../package.json"),(0,Ln.resolve)(process.cwd(),"package.json")];for(let G of I)if((0,kn.existsSync)(G))try{let l=JSON.parse((0,kn.readFileSync)(G,"utf-8"));if(l?.name&&l?.version)return{name:String(l.name),version:String(l.version)}}catch{}return null}var ibI=vbI(),Kd="0.5.28",Sd="";async function Ag(){try{let I=ibI?.name||"hermes-web-ui",G=encodeURIComponent(I),l=await fetch(`https://registry.npmjs.org/${G}/latest`,{signal:AbortSignal.timeout(1e4)});l.ok&&(Sd=(await l.json()).version,Kd&&Sd!==Kd&&console.log(`Update available: ${Kd} \u2192 ${Sd}`))}catch{}}function H2(){setTimeout(Ag,5e3),setInterval(Ag,1800*1e3)}async function Lg(I){let l=(await Qg()).split(`
|
|
224
224
|
`)[0].replace("Hermes Agent ","")||"",c=!1;try{let Z=sI()?.getUpstream();if(!Z)throw new Error("GatewayManager not initialized");c=(await fetch(`${Z.replace(/\/$/,"")}/health`,{signal:AbortSignal.timeout(5e3)})).ok}catch{}I.body={status:c?"ok":"error",platform:"hermes-agent",version:l,gateway:c?"running":"stopped",webui_version:Kd,webui_latest:Sd,webui_update_available:!!(Kd&&Sd&&Sd!==Kd),node_version:process.versions.node}}var o2=new U;o2.get("/health",Lg);T();async function kg(I){let G=I.request.body;if(!G||!G.event){I.status=400,I.body={error:"Missing event field"};return}p.info("Received webhook event: %s",G.event),I.body={ok:!0}}var w2=new U;w2.post("/webhook",kg);var xg=require("crypto"),Ug=require("fs/promises"),Bg=require("path");El();var zg=50*1024*1024;async function Og(I){let G=I.get("content-type")||"";if(!G.startsWith("multipart/form-data")){I.status=400,I.body={error:"Expected multipart/form-data"};return}let l="--"+G.split("boundary=")[1];if(!l||l==="--undefined"){I.status=400,I.body={error:"Missing boundary"};return}let c=[],b=0;for await(let a of I.req){if(b+=a.length,b>zg){I.status=413,I.body={error:`File too large (max ${zg/1024/1024}MB)`};return}c.push(a)}let Z=Buffer.concat(c),d=Buffer.from(l),W=EbI(Z,d),m=[];for(let a of W){let N=a.indexOf(Buffer.from(`\r
|
|
225
225
|
\r
|
|
226
226
|
`));if(N===-1)continue;let n=a.subarray(0,N).toString("utf-8"),e=a.subarray(N+4,a.length-2),V="",t=n.match(/filename\*=UTF-8''(.+)/i);if(t)V=decodeURIComponent(t[1]);else{let R=n.match(/filename="([^"]+)"/);if(!R)continue;V=R[1]}let h=V.includes(".")?"."+V.split(".").pop():"",s=(0,xg.randomBytes)(8).toString("hex")+h,u=(0,Bg.join)(WI.uploadDir,s);await(0,Ug.writeFile)(u,e),m.push({name:V,path:u})}I.body={files:m}}function EbI(I,G){let l=[],c=0;for(;;){let b=I.indexOf(G,c);if(b===-1)break;c>0&&l.push(I.subarray(c+2,b)),c=b+G.length}return l}var v2=new U;v2.post("/upload",Og);var xn=require("child_process"),r2=require("fs"),kl=require("path"),fd=!1;function zn(){return(0,kl.dirname)(process.execPath)}function gbI(){return process.platform==="win32"?zn():(0,kl.dirname)(zn())}function CbI(){return process.execPath.match(/^(.*)\/Cellar\/[^/]+\/[^/]+\/bin\/node$/)?.[1]||null}function AbI(){let I=gbI(),G=CbI();return process.platform==="win32"?[(0,kl.join)(I,"node_modules","npm","bin","npm-cli.js"),(0,kl.join)(zn(),"node_modules","npm","bin","npm-cli.js")]:[(0,kl.join)(I,"lib","node_modules","npm","bin","npm-cli.js"),...G?[(0,kl.join)(G,"lib","node_modules","npm","bin","npm-cli.js")]:[]]}function LbI(){return AbI().find(r2.existsSync)||null}function kbI(){return process.platform==="win32"?"npm.cmd":"npm"}function zbI(I){return(0,kl.join)(I,"hermes-web-ui","bin","hermes-web-ui.mjs")}function Mg(){return{...process.env,PATH:[zn(),process.env.PATH].filter(Boolean).join(kl.delimiter),npm_node_execpath:process.execPath}}function i2(I,G={}){let l=LbI(),c=l?process.execPath:kbI(),b=l?[l,...I]:I;return(0,xn.execFileSync)(c,b,{encoding:"utf-8",timeout:G.timeout,stdio:["pipe","pipe","pipe"],env:Mg()}).trim()}function xbI(){return i2(["root","-g"])}function UbI(){let I=zbI(xbI());if(!(0,r2.existsSync)(I))throw new Error(`Updated hermes-web-ui CLI not found: ${I}`);return I}function BbI(){try{i2(["cache","clean","--force"],{timeout:120*1e3})}catch(I){console.warn("[update] failed to clean npm cache, continuing update:",I)}return i2(["install","-g","hermes-web-ui@latest"],{timeout:600*1e3})}function ObI(I){let G=UbI();return(0,xn.spawn)(process.execPath,[G,"restart","--port",I],{detached:!0,stdio:"ignore",windowsHide:!0,env:Mg()})}async function jg(I){if(fd){I.status=409,I.body={success:!1,message:"hermes-web-ui update is already in progress"};return}fd=!0;try{let G=BbI();I.body={success:!0,message:G.trim()||"hermes-web-ui updated successfully"},setTimeout(()=>{let l;try{l=ObI(process.env.PORT||"8648")}catch(c){fd=!1,console.error("[update] failed to spawn restart:",c);return}l.on("error",c=>{fd=!1,console.error("[update] restart process failed:",c)}),l.on("exit",(c,b)=>{fd=!1,(typeof c=="number"&&c!==0||b)&&console.error(`[update] restart process exited before replacing server: code=${c} signal=${b}`)}),l.unref()},3e3)}catch(G){fd=!1,I.status=500,I.body={success:!1,message:G.stderr?.toString()||G.message||String(G)}}}var y2=new U;y2.post("/api/hermes/update",jg);var ob=require("fs/promises");var Kg=require("path"),Un=require("node:crypto");El();var Sg=WI.appHome,E2=(0,Kg.join)(Sg,".credentials"),jbI={N:16384,r:8,p:1,maxmem:64*1024*1024};function fg(I,G){return(0,Un.scryptSync)(I,G,64,jbI).toString("hex")}async function xm(){try{let I=await(0,ob.readFile)(E2,"utf-8");return JSON.parse(I)}catch{return null}}async function Bn(I,G){let l=(0,Un.randomBytes)(16).toString("hex"),c=fg(G,l),b={username:I,password_hash:c,salt:l,created_at:Date.now()};return await(0,ob.mkdir)(Sg,{recursive:!0}),await(0,ob.writeFile)(E2,JSON.stringify(b,null,2),{mode:384}),b}async function Tg(){try{await(0,ob.unlink)(E2)}catch{}}async function On(I,G){let l=await xm();return!l||l.username!==I?!1:fg(G,l.salt)===l.password_hash}tb();gY();async function Dg(I){let G=await xm();I.body={hasPasswordLogin:!!G,username:G?.username||null}}async function qg(I){let{username:G,password:l}=I.request.body;if(!G||!l){I.status=400,I.body={error:"Username and password are required"};return}let c=JY(I),b=Lr(c);if(!b.allowed){I.status=b.status,I.body={error:"Too many login attempts, please try again later"};return}if(!await On(G,l)){zr(c),I.status=401,I.body={error:"Invalid username or password"};return}let d=await KG();if(!d){I.status=500,I.body={error:"Auth is disabled on this server"};return}Ur(c),I.body={token:d}}async function Pg(I){let{username:G,password:l}=I.request.body;if(!G||!l){I.status=400,I.body={error:"Username and password are required"};return}if(G.length<2){I.status=400,I.body={error:"Username must be at least 2 characters"};return}if(l.length<6){I.status=400,I.body={error:"Password must be at least 6 characters"};return}await Bn(G,l),I.body={success:!0}}async function _g(I){let{currentPassword:G,newPassword:l}=I.request.body;if(!G||!l){I.status=400,I.body={error:"Current password and new password are required"};return}if(l.length<6){I.status=400,I.body={error:"New password must be at least 6 characters"};return}let c=await xm();if(!c){I.status=400,I.body={error:"Password login not configured"};return}if(!await On(c.username,G)){I.status=400,I.body={error:"Current password is incorrect"};return}await Bn(c.username,l),I.body={success:!0}}async function $g(I){let{currentPassword:G,newUsername:l}=I.request.body;if(!G||!l){I.status=400,I.body={error:"Current password and new username are required"};return}if(l.length<2){I.status=400,I.body={error:"Username must be at least 2 characters"};return}let c=await xm();if(!c){I.status=400,I.body={error:"Password login not configured"};return}if(!await On(c.username,G)){I.status=400,I.body={error:"Current password is incorrect"};return}await Bn(l,G),I.body={success:!0}}async function IC(I){await Tg(),I.body={success:!0}}async function GC(I){let G=vs();I.body={locks:G}}async function lC(I){let G=I.query.ip;if(G){if(!Br(G)){I.status=404,I.body={error:"IP not locked"};return}I.body={success:!0};return}let l=Or();I.body={success:!0,count:l}}var Mn=new U;Mn.get("/api/auth/status",Dg);Mn.post("/api/auth/login",qg);var wb=new U;wb.post("/api/auth/setup",Pg);wb.post("/api/auth/change-password",_g);wb.post("/api/auth/change-username",$g);wb.delete("/api/auth/password",IC);wb.get("/api/auth/locked-ips",GC);wb.delete("/api/auth/locked-ips",lC);Hb();hI();var Kn=(()=>{let[I,G]=process.versions.node.split(".").map(Number);return I>22||I===22&&G>=5})(),SbI=new Set(["compression","compressed"]),fbI=20,TbI=100;function bC(){return`${HI()}/state.db`}function cI(I,G=0){if(I==null||I==="")return G;let l=Number(I);return Number.isFinite(l)?l:G}function Um(I){if(I==null||I==="")return null;let G=Number(I);return Number.isFinite(G)?G:null}function tl(I){return I==null||I===""?null:String(I)}function ZC(I){return I?I.length>40?`${I.slice(0,40)}...`:I:null}function DbI(I){let G=cI(I.started_at);return{id:String(I.id||""),source:String(I.source||""),user_id:tl(I.user_id),model:String(I.model||""),title:tl(I.title),started_at:G,ended_at:Um(I.ended_at),end_reason:tl(I.end_reason),message_count:cI(I.message_count),tool_call_count:cI(I.tool_call_count),input_tokens:cI(I.input_tokens),output_tokens:cI(I.output_tokens),cache_read_tokens:cI(I.cache_read_tokens),cache_write_tokens:cI(I.cache_write_tokens),reasoning_tokens:cI(I.reasoning_tokens),billing_provider:tl(I.billing_provider),estimated_cost_usd:cI(I.estimated_cost_usd),actual_cost_usd:Um(I.actual_cost_usd),cost_status:String(I.cost_status||""),preview:String(I.preview||""),last_active:cI(I.last_active,G)}}var vb=`
|
|
@@ -1017,7 +1017,7 @@ ${`[Current working directory: ${V.workspace}]`}
|
|
|
1017
1017
|
${e}`);let w=`cli_run_${Date.now().toString(36)}_${Math.random().toString(36).slice(2,8)}`,z=Math.floor(Date.now()/1e3),i=b.get(Y);i||(i=_I(Y)?await m(Y,b):{messages:[],isWorking:!1,events:[],queue:[]},b.set(Y,i)),i.isWorking=!0,i.isAborting=!1,i.profile=c,i.source="cli",i.activeRunMarker=w,i.runId=void 0,i.abortController=void 0,i.bridgeOutput="",i.bridgePendingAssistantContent="",i.bridgePendingReasoningContent="",i.bridgeToolCounter=0,i.bridgePendingTools=[],i.responseRun=void 0;let g=IN(N);if(i.messages.push({id:i.messages.length+1,session_id:Y,runMarker:w,role:"user",content:g,timestamp:z}),!_I(Y)){let x=GN(N).replace(/[\r\n]/g," ").substring(0,100);Kc({id:Y,profile:c,source:"cli",model:H,provider:o,title:x})}gG({session_id:Y,role:"user",content:g,timestamp:z}),G.join(`session:${Y}`);let r=(C,x)=>{let O={...x,session_id:Y};I.to(`session:${Y}`).emit(C,O),!I.adapter.rooms.get(`session:${Y}`)?.size&&G.connected&&G.emit(C,O)},J=await xV(Y,c,Z.getUpstream(c).replace(/\/$/,""),Z.getApiKey(c)||void 0,r,b),L=J.length>0?LV(J):J;try{let C=vW(N)?await Tx(N):N,x=vW(N)?g:void 0;p.info("[chat-run-socket] starting CLI bridge run for session %s",Y),SG.info({sessionId:Y,profile:c,inputChars:g.length,historyMessages:J.length,hasInstructions:!!e,multimodalInput:vW(N)},"[chat-run-socket] starting CLI bridge run");let O=await d.chat(Y,C,L,e,c,{...x!==void 0?{storage_message:x}:{},...H?{model:H}:{},...o?{provider:o}:{}});i.runId=O.run_id,SG.info({sessionId:Y,runId:O.run_id,status:O.status},"[chat-run-socket] CLI bridge run started"),rW(b,Y,"run.started",{event:"run.started",run_id:O.run_id,queue_length:i.queue.length||0}),r("run.started",{event:"run.started",run_id:O.run_id,queue_length:i.queue.length||0});for await(let K of d.streamOutput(O.run_id))if(await VtI(I,G,i,Y,w,K,r,c,b,Z,d,a),K.done)break}catch(C){if(i.activeRunMarker!==w||!i.isWorking)return;let x=i.queue?.length??0;i.isWorking=!1,i.isAborting=!1,i.profile=void 0,i.runId=void 0,i.activeRunMarker=void 0,i.events=[],ab(i,Y),pl(Y);let O=C instanceof Error?C.message:String(C);r("run.failed",{event:"run.failed",error:O,queue_remaining:x});let K=await mG(Y,i,r);Ul(Y,{inputTokens:K.inputTokens,outputTokens:K.outputTokens,profile:i.profile}),x>0&&a(G,Y)}}async function VtI(I,G,l,c,b,Z,d,W,m,a,N,Y){if(l.activeRunMarker!==b){SG.info({sessionId:c,runId:Z.run_id,runMarker:b,activeRunMarker:l.activeRunMarker},"[chat-run-socket] ignoring stale CLI bridge chunk");return}l.runId=Z.run_id;for(let h of Z.events||[]){let s=h.event;if(s==="tool.started"){ab(l,c,b);let u=h.tool_name||"",R=h.args,Q=dU(l,c,b,u,R,h.tool_call_id),H={event:"tool.started",run_id:Z.run_id,tool_call_id:Q.id,tool:u,name:u,arguments:Q.arguments,preview:h.preview||kV(Q.arguments)};rW(m,c,"tool.started",H),d("tool.started",H)}else if(s==="tool.completed"){let u=h.tool_name||"",R=WU(l,c,b,u,h),Q={event:"tool.completed",run_id:Z.run_id,tool_call_id:R.id,tool:u,name:u,output:R.output,duration:R.duration??h.duration,error:h.is_error||void 0};rW(m,c,"tool.completed",Q),d("tool.completed",Q)}else if(s==="turn.boundary")ab(l,c,b);else if(s==="reasoning.delta"||s==="thinking.delta"){let u=String(h.text||"");if(u){l.bridgePendingReasoningContent=(l.bridgePendingReasoningContent||"")+u;let R=ZU(l,c,b);R.reasoning=(R.reasoning||"")+u,R.reasoning_content=(R.reasoning_content||"")+u}d(s,{event:s,run_id:Z.run_id,text:u})}else if(s==="reasoning.available")d("reasoning.available",{event:"reasoning.available",run_id:Z.run_id});else if(s==="approval.requested"){let u={event:"approval.requested",run_id:Z.run_id,approval_id:h.approval_id,command:h.command,description:h.description,choices:h.choices,allow_permanent:h.allow_permanent,timeout_ms:h.timeout_ms};BG(m,c,"approval.requested",u),d("approval.requested",u)}else if(s==="approval.resolved"){let u={event:"approval.resolved",run_id:Z.run_id,approval_id:h.approval_id,choice:h.choice};BG(m,c,"approval.resolved",u),d("approval.resolved",u)}else if(s==="bridge.compression.requested"){let u=await iW(c,{excludeLastUser:!0}),R=ic(u),Q=u.length>0?R.inputTokens+R.outputTokens:h.approx_tokens,H={event:"compression.started",run_id:Z.run_id,request_id:h.request_id,message_count:u.length||h.message_count,token_count:Q,source:"bridge"};if(BG(m,c,"compression.started",H),d("compression.started",H),h.request_id&&Array.isArray(h.messages))try{let o=await UV(c,W,h.messages,w=>a.getUpstream(w),w=>a.getApiKey(w));l.bridgeCompressionResults=l.bridgeCompressionResults||{},l.bridgeCompressionResults[String(h.request_id)]=o,await N.compressionRespond(String(h.request_id),{messages:o.messages})}catch(o){await N.compressionRespond(String(h.request_id),{error:o?.message||String(o)}).catch(()=>{})}}else if(s==="bridge.compression.completed"){let u=h.request_id?l.bridgeCompressionResults?.[String(h.request_id)]:void 0,R={event:"compression.completed",run_id:Z.run_id,request_id:h.request_id,compressed:u?.compressed??h.compressed!==!1,llmCompressed:u?.llmCompressed,totalMessages:u?.beforeMessages??h.message_count,resultMessages:u?.resultMessages??h.result_messages,beforeTokens:u?.beforeTokens??h.approx_tokens,afterTokens:u?.afterTokens,summaryTokens:u?.summaryTokens,verbatimCount:u?.verbatimCount,compressedStartIndex:u?.compressedStartIndex,source:"bridge"};h.request_id&&l.bridgeCompressionResults&&delete l.bridgeCompressionResults[String(h.request_id)],BG(m,c,"compression.completed",R),d("compression.completed",R),await mG(c,l,d)}else if(s==="bridge.compression.failed"){let u={event:"compression.completed",run_id:Z.run_id,request_id:h.request_id,compressed:!1,totalMessages:h.message_count,resultMessages:h.message_count,beforeTokens:h.approx_tokens,error:h.error,source:"bridge"};h.request_id&&l.bridgeCompressionResults&&delete l.bridgeCompressionResults[String(h.request_id)],BG(m,c,"compression.completed",u),d("compression.completed",u)}else s==="status"&&d("agent.event",{event:"agent.event",run_id:Z.run_id,...h})}if(Z.delta){l.bridgeOutput=(l.bridgeOutput||"")+Z.delta,l.bridgePendingAssistantContent=(l.bridgePendingAssistantContent||"")+Z.delta;let h=[...l.messages].reverse().find(s=>s.runMarker===b);h?.role==="assistant"&&h.finish_reason==null?(h.content+=Z.delta,MF(h,l.bridgePendingReasoningContent)):l.messages.push({id:l.messages.length+1,session_id:c,runMarker:b,role:"assistant",content:Z.delta,reasoning:l.bridgePendingReasoningContent||null,reasoning_content:l.bridgePendingReasoningContent||null,timestamp:Math.floor(Date.now()/1e3)}),d("message.delta",{event:"message.delta",run_id:Z.run_id,delta:Z.delta,output:l.bridgeOutput})}if(!Z.done||!l.isWorking)return;if(l.isAborting){SG.info({sessionId:c,runId:Z.run_id,status:Z.status},"[chat-run-socket][abort] suppressing CLI bridge terminal chunk during abort");return}ab(l,c),pl(c),await ttI(YtI);let n=await mG(c,l,d);Ul(c,{inputTokens:n.inputTokens,outputTokens:n.outputTokens,profile:l.profile});let e=l.queue.length>0?l.queue[0]:void 0;l.isWorking=!!e,l.isAborting=!1,e?(l.profile=e.profile||W,l.source=e.source):l.profile=void 0,l.runId=void 0,l.activeRunMarker=void 0,l.events=[];let V=Z.status==="error"?"run.failed":"run.completed",t={event:V,run_id:Z.run_id,output:Z.output||l.bridgeOutput||"",result:Z.result,error:Z.error,inputTokens:n.inputTokens,outputTokens:n.outputTokens,queue_remaining:l.queue.length};d(V,t),l.queue.length>0&&Y(G,c)}function ttI(I){return new Promise(G=>setTimeout(G,I))}CG();T();async function MV(I,G,l,c,b,Z){let d=c.get(l);if(!d?.isWorking||!d.runId&&!d.abortController){p.info({sessionId:l},"[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=[]),bN(I,G,l,"abort.completed",{event:"abort.completed",synced:!1,ignored:!0});return}let W=d.runId;if(d.isAborting=!0,BG(c,l,"abort.started",{event:"abort.started",run_id:W,graceMs:5e3}),bN(I,G,l,"abort.started",{event:"abort.started",run_id:W,graceMs:5e3}),p.info({sessionId:l,runId:W},"[chat-run-socket][abort] started"),d.source==="cli"?ab(d,l):zV(d,l),d.source==="cli")try{await b.interrupt(l,"Aborted by user")}catch(m){p.warn(m,"[chat-run-socket][abort] failed to interrupt CLI bridge for session %s",l)}else d.abortController&&d.abortController.abort();await htI(I,G,l,W||"response_stream",c,Z)}async function htI(I,G,l,c,b,Z){let d=b.get(l);if(!d)return;let W=d.profile;if(pl(l),await mG(l,d,(a,N)=>{I.to(`session:${l}`).emit(a,{...N,session_id:l})}),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 a=d.queue.shift();d.isWorking=!0,d.isAborting=!1,d.profile=a.profile||W,d.source=a.source,p.info("[chat-run-socket][abort] dequeuing queued run for session %s (remaining: %d)",l,d.queue.length),BG(b,l,"abort.completed",{event:"abort.completed",run_id:c,synced:!0,queue_length:d.queue.length+1}),bN(I,G,l,"abort.completed",{event:"abort.completed",run_id:c,synced:!0,queue_length:d.queue.length+1}),bN(I,G,l,"run.queued",{event:"run.queued",queue_length:d.queue.length}),d.events=[],Z(G,l,a,W||"default");return}d.events=[],BG(b,l,"abort.completed",{event:"abort.completed",run_id:c,synced:!0}),bN(I,G,l,"abort.completed",{event:"abort.completed",run_id:c,synced:!0}),p.info({sessionId:l,runId:c,synced:!0},"[chat-run-socket][abort] completed")}function bN(I,G,l,c,b){let Z={...b,session_id:l};I.to(`session:${l}`).emit(c,Z),!I.adapter.rooms.get(`session:${l}`)?.size&&G.connected&&G.emit(c,Z)}CG();T();var nU={usage:"usage",status:"status",abort:"abort",queue:"queue",clear:"clear",title:"title",compress:"compress",steer:"steer",destroy:"destroy",destory:"destroy"};function jF(I){if(typeof I!="string")return null;let G=I.trim();if(!G.startsWith("/"))return null;let l=G.match(/^\/([a-zA-Z][\w-]*)(?:\s+([\s\S]*))?$/);if(!l)return null;let c=l[1].toLowerCase(),b=nU[c];return b?{name:b,rawName:c,args:l[2]?.trim()||""}:{name:"status",rawName:c,args:l[2]?.trim()||""}}function eU(I){return jF(I)!==null}async function VU(I,G,l){let c=Bb(l.sessionMap,I);l.socket.join(`session:${I}`),stI(I,l),YU(I,c,`/${G.rawName}${G.args?` ${G.args}`:""}`);let b=Z=>{let d=typeof Z.message=="string"?Z.message:"";d&&YU(I,c,d),MZ(l.nsp,l.socket,I,"session.command",{event:"session.command",session_id:I,command:G.rawName,ok:!0,...Z})};if(!nU[G.rawName]){b({ok:!1,action:"error",terminal:!c.isWorking,message:`Unknown bridge command: /${G.rawName}`});return}switch(G.name){case"usage":{let Z=await mG(I,c,(d,W)=>{MZ(l.nsp,l.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=_I(I);b({action:"status",terminal:!c.isWorking,message:[`Status: ${c.isWorking?"running":"idle"}`,`source: ${c.source||Z?.source||"cli"}`,`profile: ${c.profile||l.profile||Z?.profile||"default"}`,`model: ${l.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||l.profile||Z?.profile||"default",model:l.model||Z?.model||null,runId:c.runId||c.activeRunMarker||null});return}case"abort":await MV(l.nsp,l.socket,I,l.sessionMap,l.bridge,l.runQueuedItem),b({action:"abort",message:"Abort requested."});return;case"queue":{if(!G.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}c.queue.push({queue_id:`queue_${Date.now().toString(36)}_${Math.random().toString(36).slice(2,8)}`,input:G.args,model:l.model,instructions:l.instructions,profile:l.profile,source:"cli"}),MZ(l.nsp,l.socket,I,"run.queued",{event:"run.queued",session_id:I,queue_length:c.queue.length}),b({action:"queue",terminal:!1,message:`Queued message. Queue length: ${c.queue.length}.`,queueLength:c.queue.length});return}case"clear":{if(G.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=O2(I);c.messages=[],NU(c),await mG(I,c,(d,W)=>{MZ(l.nsp,l.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(!G.args){b({ok:!1,action:"title",terminal:!c.isWorking,message:"Usage: /title <new title>"});return}let Z=G.args.slice(0,120);_I(I)||Kc({id:I,profile:l.profile,source:"cli",model:l.model,title:Z});let d=Km(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}NU(c);let Z=(d,W)=>MZ(l.nsp,l.socket,I,d,W);try{let d=await iW(I,{excludeLastUser:!0}),W=BF(I,d);Z("compression.started",{event:"compression.started",message_count:W.messageCount,token_count:W.tokenCount,source:"command"});let m=await UV(I,l.profile,[],a=>l.gatewayManager.getUpstream(a),a=>l.gatewayManager.getApiKey(a));c.bridgeCompressionResults=c.bridgeCompressionResults||{},await mG(I,c,Z),Z("compression.completed",{event:"compression.completed",compressed:m.compressed,llmCompressed:m.llmCompressed,totalMessages:m.beforeMessages,resultMessages:m.resultMessages,beforeTokens:m.beforeTokens,afterTokens:m.afterTokens,summaryTokens:m.summaryTokens,verbatimCount:m.verbatimCount,compressedStartIndex:m.compressedStartIndex,source:"command"}),b({action:"compress",message:`Compression completed: ${m.beforeMessages} -> ${m.resultMessages} messages, ${m.beforeTokens} -> ${m.afterTokens} tokens.`,beforeMessages:m.beforeMessages,resultMessages:m.resultMessages,beforeTokens:m.beforeTokens,afterTokens:m.afterTokens,compressed:m.compressed})}catch(d){p.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(!G.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 l.bridge.steer(I,G.args),b({action:"steer",terminal:!1,message:"Steer instruction sent."});return}case"destroy":{let Z=c.isWorking,d=!0,W=null;try{Z&&(ab(c,I),await l.bridge.interrupt(I,"Destroyed by user").catch(m=>{p.warn(m,"[chat-run-socket] /destroy interrupt failed for session %s",I)})),await l.bridge.destroy(I).catch(m=>{d=!1,W=m instanceof Error?m.message:String(m),p.warn(m,"[chat-run-socket] /destroy bridge unavailable for session %s",I)})}finally{pl(I),await mG(I,c,(m,a)=>{MZ(l.nsp,l.socket,I,m,a)}),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.bridgeOutput=void 0,c.bridgePendingTools=void 0,c.bridgeCompressionResults=void 0,BG(l.sessionMap,I,"session.command",{event:"session.command",action:"destroy"})}MZ(l.nsp,l.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 NU(I){I.events=[],I.bridgePendingTools=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 stI(I,G){_I(I)||Kc({id:I,profile:G.profile,source:"cli",model:G.model,title:"Bridge command"})}function YU(I,G,l){let c=Math.floor(Date.now()/1e3),b=gG({session_id:I,role:"command",content:l,timestamp:c});G.messages.push({id:b||`command_${c}_${G.messages.length}`,session_id:I,role:"command",content:l,timestamp:c}),pl(I)}function MZ(I,G,l,c,b){let Z={...b,session_id:l};I.to(`session:${l}`).emit(c,Z),!I.adapter.rooms.get(`session:${l}`)?.size&&G.connected&&G.emit(c,Z)}var jV=class{nsp;gatewayManager;bridge=new Ga;sessionMap=new Map;constructor(G,l){this.nsp=G.of("/chat-run"),this.gatewayManager=l}init(){this.nsp.use(this.authMiddleware.bind(this)),this.nsp.on("connection",this.onConnection.bind(this)),p.info("[chat-run-socket] Socket.IO ready at /chat-run")}async authMiddleware(G,l){let c=G.handshake.auth?.token;if(!process.env.AUTH_DISABLED&&process.env.AUTH_DISABLED!=="1"){let{getToken:b}=await Promise.resolve().then(()=>(tb(),Tr)),Z=await b();if(Z&&c!==Z)return l(new Error("Authentication failed"))}l()}onConnection(G){let l=G.handshake.query?.profile||"default",c=()=>TG()||l||"default";G.on("run",async b=>{if(b.session_id){let Z=Bb(this.sessionMap,b.session_id),d=OF(b.source,b.session_id),W=jF(b.input);if(W&&d==="cli"){try{await VU(b.session_id,W,{nsp:this.nsp,socket:G,sessionMap:this.sessionMap,bridge:this.bridge,gatewayManager:this.gatewayManager,profile:c(),model:b.model,instructions:b.instructions,runQueuedItem:this.runQueuedItem.bind(this)})}catch(m){this.emitToSession(G,b.session_id,"session.command",{event:"session.command",command:W.rawName,ok:!1,action:"error",message:m instanceof Error?m.message:String(m)})}return}if(Z.isWorking){Z.queue.push({queue_id:b.queue_id||`queue_${Date.now().toString(36)}_${Math.random().toString(36).slice(2,8)}`,input:b.input,model:b.model,provider:b.provider,model_groups:b.model_groups,instructions:b.instructions,profile:c(),source:d}),this.nsp.to(`session:${b.session_id}`).emit("run.queued",{event:"run.queued",session_id:b.session_id,queue_length:Z.queue.length}),p.info("[chat-run-socket] queued run for session %s (queue: %d)",b.session_id,Z.queue.length);return}Z.isWorking=!0,Z.profile=c(),Z.source=d}try{await this.handleRun(G,b,c())}catch(Z){if(b.session_id){let d=this.sessionMap.get(b.session_id);d&&!d.runId&&!d.abortController&&!d.activeRunMarker&&(d.isWorking=!1,d.profile=void 0)}G.emit("run.failed",{event:"run.failed",session_id:b.session_id,error:Z instanceof Error?Z.message:String(Z)})}}),G.on("cancel_queued_run",b=>{if(!b.session_id||!b.queue_id)return;let Z=this.sessionMap.get(b.session_id);if(!Z?.queue.length)return;let d=Z.queue.length;Z.queue=Z.queue.filter(W=>W.queue_id!==b.queue_id),Z.queue.length!==d&&(this.nsp.to(`session:${b.session_id}`).emit("run.queued",{event:"run.queued",session_id:b.session_id,queue_length:Z.queue.length}),p.info("[chat-run-socket] cancelled queued run %s for session %s (queue: %d)",b.queue_id,b.session_id,Z.queue.length))}),G.on("resume",async b=>{if(!b.session_id)return;let Z=b.session_id;G.join(`session:${Z}`),this.resumeSession(G,Z)}),G.on("abort",b=>{b.session_id&&MV(this.nsp,G,b.session_id,this.sessionMap,this.bridge,this.runQueuedItem.bind(this))}),G.on("approval.respond",async b=>{if(!(!b.session_id||!b.approval_id))try{let Z=await this.bridge.approvalRespond(b.approval_id,b.choice||"deny");this.emitToSession(G,b.session_id,"approval.resolved",{event:"approval.resolved",approval_id:b.approval_id,choice:b.choice||"deny",resolved:!!Z.resolved})}catch(Z){this.emitToSession(G,b.session_id,"approval.resolved",{event:"approval.resolved",approval_id:b.approval_id,choice:b.choice||"deny",resolved:!1,error:Z instanceof Error?Z.message:String(Z)})}})}async handleRun(G,l,c,b=!1){let Z=OF(l.source,l.session_id);if(!(l.session_id&&Z==="cli"&&eU(l.input))){if(Z==="cli"){let d=l.instructions?`${$l()}
|
|
1018
1018
|
${l.instructions}`:$l();if(l.session_id){let W=_I(l.session_id);W?.workspace&&(d=`
|
|
1019
1019
|
${`[Current working directory: ${W.workspace}]`}
|
|
1020
|
-
${d}`)}await aU(this.nsp,G,{...l,instructions:d},c,this.sessionMap,this.gatewayManager,this.bridge,b,BV,this.dequeueNextQueuedRun.bind(this));return}await bU(this.nsp,G,l,c,this.sessionMap,this.gatewayManager,b,this.dequeueNextQueuedRun.bind(this))}}async resumeSession(G,l){let c=this.sessionMap.get(l);c||(c=await BV(l,this.sessionMap),this.sessionMap.set(l,c)),G.emit("resumed",{session_id:l,messages:c.messages,isWorking:c.isWorking,isAborting:c.isAborting||!1,events:c.isWorking?c.events:[],inputTokens:c.inputTokens,outputTokens:c.outputTokens,queueLength:c.queue?.length||0}),p.info("[chat-run-socket] socket %s resumed session %s (working: %s, messages: %d)",G.id,l,c.isWorking,c.messages.length)}dequeueNextQueuedRun(G,l,c="default"){let b=this.sessionMap.get(l);if(!b?.queue.length)return!1;let Z=b.queue.shift();return p.info("[chat-run-socket] dequeuing queued run for session %s (remaining: %d)",l,b.queue.length),this.nsp.to(`session:${l}`).emit("run.queued",{event:"run.queued",session_id:l,queue_length:b.queue.length}),this.runQueuedItem(G,l,Z,c),!0}runQueuedItem(G,l,c,b="default"){this.handleRun(G,{input:c.input,session_id:l,model:c.model,provider:c.provider,model_groups:c.model_groups,instructions:c.instructions,source:c.source},c.profile||b,!0)}emitToSession(G,l,c,b){let Z={...b,session_id:l};this.nsp.to(`session:${l}`).emit(c,Z),!this.nsp.adapter.rooms.get(`session:${l}`)?.size&&G.connected&&G.emit(c,Z)}close(){for(let[G,l]of this.sessionMap.entries())if(l.abortController)try{l.abortController.abort()}catch(c){p.warn(c,"[chat-run-socket] failed to abort controller for session %s",G)}this.sessionMap.clear(),p.info("[chat-run-socket] closed all connections and cleared state")}};We();T();var RtI="0.5.
|
|
1020
|
+
${d}`)}await aU(this.nsp,G,{...l,instructions:d},c,this.sessionMap,this.gatewayManager,this.bridge,b,BV,this.dequeueNextQueuedRun.bind(this));return}await bU(this.nsp,G,l,c,this.sessionMap,this.gatewayManager,b,this.dequeueNextQueuedRun.bind(this))}}async resumeSession(G,l){let c=this.sessionMap.get(l);c||(c=await BV(l,this.sessionMap),this.sessionMap.set(l,c)),G.emit("resumed",{session_id:l,messages:c.messages,isWorking:c.isWorking,isAborting:c.isAborting||!1,events:c.isWorking?c.events:[],inputTokens:c.inputTokens,outputTokens:c.outputTokens,queueLength:c.queue?.length||0}),p.info("[chat-run-socket] socket %s resumed session %s (working: %s, messages: %d)",G.id,l,c.isWorking,c.messages.length)}dequeueNextQueuedRun(G,l,c="default"){let b=this.sessionMap.get(l);if(!b?.queue.length)return!1;let Z=b.queue.shift();return p.info("[chat-run-socket] dequeuing queued run for session %s (remaining: %d)",l,b.queue.length),this.nsp.to(`session:${l}`).emit("run.queued",{event:"run.queued",session_id:l,queue_length:b.queue.length}),this.runQueuedItem(G,l,Z,c),!0}runQueuedItem(G,l,c,b="default"){this.handleRun(G,{input:c.input,session_id:l,model:c.model,provider:c.provider,model_groups:c.model_groups,instructions:c.instructions,source:c.source},c.profile||b,!0)}emitToSession(G,l,c,b){let Z={...b,session_id:l};this.nsp.to(`session:${l}`).emit(c,Z),!this.nsp.adapter.rooms.get(`session:${l}`)?.size&&G.connected&&G.emit(c,Z)}close(){for(let[G,l]of this.sessionMap.entries())if(l.abortController)try{l.abortController.abort()}catch(c){p.warn(c,"[chat-run-socket] failed to abort controller for session %s",G)}this.sessionMap.clear(),p.info("[chat-run-socket] closed all connections and cleared state")}};We();T();var RtI="0.5.28";process.on("uncaughtException",I=>{console.error("FATAL: Uncaught exception"),console.error(I),p.fatal(I,"Uncaught exception"),process.exit(1)});process.on("unhandledRejection",I=>{console.error("FATAL: Unhandled rejection"),console.error(I),p.error(I,"Unhandled rejection"),process.exit(1)});var utI=null,jZ=[],KV=null,sU=null;function FtI(I,G,l){return new Promise((c,b)=>{let Z=I.listen(G,l);Z.once("listening",()=>c(Z)),Z.once("error",b)})}async function XtI(I,G,l){let c=l||"0.0.0.0";console.log(`[bootstrap] listening on ${c}:${G}`);let b=await FtI(I,G,c);return{primary:b,servers:[b]}}function QtI(){try{return FU.default.networkInterfaces()}catch{return{}}}async function QU(){console.log(`hermes-web-ui v${RtI} starting...`),await(0,KF.mkdir)(WI.uploadDir,{recursive:!0}),await(0,KF.mkdir)(WI.dataDir,{recursive:!0});let I=await KG();await Mr(),console.log("[bootstrap] HERMES_WEB_UI_STOP_GATEWAYS_ON_SHUTDOWN =",process.env.HERMES_WEB_UI_STOP_GATEWAYS_ON_SHUTDOWN);let G=new Bo;await pJ(),console.log("[bootstrap] gateway manager initialized");try{sU=await WR(),console.log("[bootstrap] agent bridge started")}catch(n){p.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(()=>(hU(),tU));l(),await new Promise(n=>setTimeout(n,1e3)),console.log("[bootstrap] all stores initialized"),G.use((0,pU.default)({origin:WI.corsOrigins})),G.use(Qi()),console.log("[bootstrap] cors + bodyParser registered");let c=O9(G,is(I));G.use(c),console.log("[bootstrap] routes registered"),I&&(console.log(`Auth enabled \u2014 token: ${I}`),p.info("Auth enabled \u2014 token: %s",I));let b=(0,XU.resolve)(__dirname,"..","client");G.use((0,RU.default)(b)),G.use(async n=>{!n.path.startsWith("/api")&&n.path!=="/health"&&n.path!=="/upload"&&n.path!=="/webhook"&&await(0,uU.default)(n,"index.html",{root:b})}),console.log("[bootstrap] SPA fallback registered");let Z=await XtI(G,WI.port,WI.host);utI=Z.primary,jZ=Z.servers,console.log("[bootstrap] app.listen called"),C5(jZ),cg(jZ),console.log("[bootstrap] terminal + kanban websocket setup");let d=new CV(jZ);zC(d),d.setGatewayManager(sI()),KV=new jV(d.getIO(),sI()),M9(KV),KV.init();let{SessionDeleter:W}=await Promise.resolve().then(()=>(le(),d4)),m=W.getInstance(),a=process.env.PROFILE||"default";m.start(a),console.log("[bootstrap] session deleter started, profile=%s",a),jZ.forEach(n=>{n.on("upgrade",(e,V)=>{let t=new URL(e.url||"",`http://${e.headers.host}`);t.pathname!=="/api/hermes/terminal"&&t.pathname!=="/api/hermes/kanban/events"&&!t.pathname.startsWith("/socket.io/")&&V.destroy()})});let N=QtI(),Y=Object.values(N).flat().find(n=>n?.family==="IPv4"&&!n?.internal)?.address||"localhost";console.log(`Server: http://localhost:${WI.port} (LAN: http://${Y}:${WI.port})`),console.log(`Log: ${WI.appHome}/logs/server.log`),p.info("Server: http://localhost:%d (LAN: http://%s:%d)",WI.port,Y,WI.port),d.restoreWhenReady(),jZ.forEach(n=>{n.on("error",e=>{console.error("[bootstrap] server error:",e.code||e.message),p.error({err:e},"Server error")})}),yJ(jZ,d,KV,sU),H2()}QU().catch(I=>{console.error("FATAL: Failed to start Hermes Web UI"),console.error(I),p.fatal(I,"Fatal error during bootstrap"),process.exit(1)});0&&(module.exports={bootstrap});
|
|
1021
1021
|
/*! Bundled license information:
|
|
1022
1022
|
|
|
1023
1023
|
ee-first/index.js:
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "hermes-web-ui",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.28",
|
|
4
4
|
"description": "Self-hosted AI chat dashboard for Hermes Agent — multi-model web UI with multi-platform integration",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -120,4 +120,4 @@
|
|
|
120
120
|
"vue-tsc": "^3.2.8",
|
|
121
121
|
"ws": "^8.20.0"
|
|
122
122
|
}
|
|
123
|
-
}
|
|
123
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{n as j}from"./rolldown-runtime-BKwlnUi0.js";import{Nt as i,U as se}from"./ui-vendor-CsTMg6zH.js";import{d as ne,u as re}from"./vue-vendor-D8zSB7VM.js";import{c as F,l as c,s as ue}from"./_plugin-vue_export-helper-ZIsfSgrY.js";async function ce(){return c("/health")}async function de(){return c("/api/hermes/update",{method:"POST"})}async function ve(){return c("/api/hermes/available-models")}async function Me(o){return c("/api/hermes/provider-models",{method:"POST",body:JSON.stringify(o)})}async function fe(o){await c("/api/hermes/config/model",{method:"PUT",body:JSON.stringify(o)})}async function me(o){await c("/api/hermes/model-alias",{method:"PUT",body:JSON.stringify(o)})}async function Pe(o){await c("/api/hermes/config/providers",{method:"POST",body:JSON.stringify(o)})}async function Se(o){await c(`/api/hermes/config/providers/${encodeURIComponent(o)}`,{method:"DELETE"})}async function Oe(o,p){await c(`/api/hermes/config/providers/${encodeURIComponent(o)}`,{method:"PUT",body:JSON.stringify(p)})}async function pe(o){return c("/api/hermes/model-visibility",{method:"PUT",body:JSON.stringify(o)})}var ye=j((()=>{F()})),A,C,B,he,Ae=j((()=>{ne(),se(),ye(),F(),A="0.5.27",C="hermes_sidebar_collapsed",B=3e4,he=re("app",()=>{const o=i(!1),p=i(localStorage.getItem(C)==="1"),w=i(!1),T=i(A),U=i(""),M=i(!1),P=i(!1),S=i(!1),m=i([]),v=i(""),f=i(""),r=i({}),y=i({}),h=i({}),g=i(),E=i(""),K=i(!0),W=i(!0),$=i(4096);let b=null,V=0;async function q(){S.value=!0;try{const e=await de();return e.success&&(M.value=!1,await _()),e.success}catch(e){return console.error("Failed to update Hermes Web UI:",e),!1}finally{S.value=!1}}async function _(){try{const e=await ce();w.value=e.status==="ok",e.webui_version&&(T.value=e.webui_version),P.value=!!e.webui_version&&e.webui_version!==A,e.webui_latest&&(U.value=e.webui_latest),M.value=!!e.webui_update_available,e.node_version&&(E.value=e.node_version)}catch{w.value=!1,P.value=!1}}function D(e){m.value=e.groups,y.value=e.model_aliases||{},h.value=e.model_visibility||{};const a=e.default||"",l=e.default_provider||"",t=e.groups.find(u=>u.provider===l&&u.models.includes(a)),s=e.groups.find(u=>u.models.includes(a)),n=e.groups.find(u=>u.models.length>0),d=l?e.groups.find(u=>u.provider===l):void 0,O=l?e.allProviders.find(u=>u.provider===l):void 0,x=d?.available_models?.length?d.available_models:O?.available_models?.length?O.available_models:O?.models||[],H=l?h.value[l]:void 0,ie=!!(a&&H?.mode==="include"&&!H.models.includes(a)&&(x.length===0||x.includes(a))),oe=!!(a&&l&&d&&!d.models.includes(a)&&!ie);if(t||s){const u=t||s;v.value=a,f.value=u.provider,r.value={}}else oe?(v.value=a,f.value=l,r.value={[l]:[a]}):n?(v.value=n.models[0],f.value=n.provider,r.value={}):(v.value="",f.value="",r.value={})}async function N(e=!1){if(ue()){if(!e&&b)return b;if(!(!e&&m.value.length>0&&Date.now()-V<B))return b=(async()=>{try{D(await ve()),V=Date.now()}catch{}finally{b=null}})(),b}}async function L(){return N(!0)}function k(e,a){if(a)return y.value[a]?.[e]||"";for(const l of Object.values(y.value))if(l[e])return l[e];return""}function Y(e,a){return k(e,a)||e}async function z(e,a,l){const t=l.trim();await me({provider:a,model:e,alias:t});const s={...y.value},n={...s[a]||{}};t?(n[e]=t,s[a]=n):(delete n[e],Object.keys(n).length>0?s[a]=n:delete s[a]),y.value=s}async function G(e,a){try{const l=m.value.find(s=>s.models.includes(e)),t=a||l?.provider||"";await fe({default:e,provider:t}),v.value=e,f.value=t||"",t&&!m.value.find(s=>s.provider===t)?.models.includes(e)&&(r.value[t]||(r.value[t]=[]),r.value[t].includes(e)||(r.value[t]=[...r.value[t],e]))}catch(l){console.error("Failed to switch model:",l)}}async function Q(e,a){const l=r.value[a]||[];if(!l.includes(e))return;const t={...r.value},s=l.filter(n=>n!==e);if(s.length>0?t[a]=s:delete t[a],r.value=t,v.value===e&&f.value===a){const n=m.value.find(d=>d.provider===a&&d.models.length>0)||m.value.find(d=>d.models.length>0);n?await G(n.models[0],n.provider):(v.value="",f.value="")}}function R(e){return h.value[e]||{mode:"all",models:[]}}function X(e,a){const l=R(e);return l.mode!=="include"||l.models.includes(a)}async function Z(e,a){h.value=(await pe({provider:e,mode:a.mode,models:a.models})).model_visibility||{},await L()}function I(e=3e4){J(),_(),g.value=setInterval(_,e)}function J(){g.value&&(clearInterval(g.value),g.value=void 0)}function ee(){const e=new URL(window.location.href);e.searchParams.set("__hwui_reload",Date.now().toString()),window.location.replace(e.toString())}function ae(){o.value=!o.value}function le(){o.value=!1}function te(){p.value=!p.value;try{localStorage.setItem(C,p.value?"1":"0")}catch{}}return{sidebarOpen:o,sidebarCollapsed:p,toggleSidebar:ae,closeSidebar:le,toggleSidebarCollapsed:te,connected:w,serverVersion:T,latestVersion:U,nodeVersion:E,updateAvailable:M,clientOutdated:P,updating:S,doUpdate:q,reloadClient:ee,modelGroups:m,customModels:r,modelAliases:y,modelVisibility:h,selectedModel:v,selectedProvider:f,streamEnabled:K,sessionPersistence:W,maxTokens:$,checkConnection:_,loadModels:N,reloadModels:L,applyAvailableModelsResponse:D,switchModel:G,removeCustomModel:Q,getModelAlias:k,displayModelName:Y,setModelAlias:z,getProviderVisibility:R,isModelVisible:X,setModelVisibility:Z,startHealthPolling:I,stopHealthPolling:J}})}));export{Me as a,fe as c,ve as i,Oe as l,he as n,ye as o,Pe as r,Se as s,Ae as t};
|