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,3 +1,3 @@
|
|
|
1
|
-
import{a as Fo,n as L}from"./rolldown-runtime-BKwlnUi0.js";import{Bt as ye,F as E,G as ra,M as la,Nt as v,Q as Me,R as Y,Rt as t,St as zo,Tt as ia,U as ee,V as ua,Vt as u,X as W,Y as Ce,Z as Q,_t as g,ct as Z,d as Te,et as D,f as le,gt as Eo,h as he,ht as Vo,it as f,j as da,k as ca,nt as fe,ot as F,pt as pe,q as ma,rt as U,st as _,t as Ie,tt as e,wt as T,y as va,yt as re,zt as X}from"./ui-vendor-CsTMg6zH.js";import{d as pa,n as ke,r as we,u as ga}from"./vue-vendor-D8zSB7VM.js";import{a as _a,c as ha,d as fa,l as V,n as ie,p as ya,t as ue}from"./_plugin-vue_export-helper-ZIsfSgrY.js";import{O as Ca,k as ka,t as Oo}from"./vendor-D9rSt2qK.js";import{w as wa}from"./index-JI6E-cKo.js";import{n as xa,t as ba}from"./MarkdownRenderer-CvzCPLnZ.js";function Ia(p){if(O?.connected)return O;const o=_a(),l=p?.userId||localStorage.getItem("gc_user_id")||Ko();return localStorage.setItem("gc_user_id",l),O=ka("/group-chat",{auth:{token:o||void 0,userId:l,name:p?.userName||localStorage.getItem("gc_user_name")||void 0,description:p?.description||localStorage.getItem("gc_user_description")||void 0},transports:["websocket","polling"],reconnection:!0,reconnectionAttempts:1/0,reconnectionDelay:1e3,reconnectionDelayMax:3e4,randomizationFactor:.5,timeout:3e4}),O}function Ma(){let p=localStorage.getItem("gc_user_id");return p||(p=Ko(),localStorage.setItem("gc_user_id",p)),p}function Ta(){return localStorage.getItem("gc_user_name")}function Ko(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,p=>{const o=Math.random()*16|0;return(p==="x"?o:o&3|8).toString(16)})}function _e(){return O?.connected?O:null}function Ra(){O&&(O.disconnect(),O=null)}async function $a(p){return V("/api/hermes/group-chat/rooms",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(p)})}async function Sa(p,o){return V(`/api/hermes/group-chat/rooms/${p}/clone`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o||{})})}async function Na(){return V("/api/hermes/group-chat/rooms")}async function Ha(p){return V(`/api/hermes/group-chat/rooms/${p}`)}async function Ga(p){return V(`/api/hermes/group-chat/rooms/join/${p}`)}async function La(p,o){return V(`/api/hermes/group-chat/rooms/${p}/agents`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)})}async function Pa(p){return V(`/api/hermes/group-chat/rooms/${p}/agents`)}async function Aa(p,o){return V(`/api/hermes/group-chat/rooms/${p}/agents/${o}`,{method:"DELETE"})}async function Ua(p){return V(`/api/hermes/group-chat/rooms/${p}`,{method:"DELETE"})}async function Da(p){return V(`/api/hermes/group-chat/rooms/${p}/clear-context`,{method:"POST"})}async function Ba(p,o){return V(`/api/hermes/group-chat/rooms/${p}/config`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)})}async function ja(p){return V(`/api/hermes/group-chat/rooms/${p}/compress`,{method:"POST"})}var O,Yo=L((()=>{Ca(),ha(),O=null})),ge,xe=L((()=>{pa(),ee(),Yo(),ge=ga("groupChat",()=>{const p=v(!1),o=v(null),l=v([]),s=v([]),b=v([]),y=v([]),R=v(""),S=v(!1),C=v(null),h=v(new Map),I=v(new Map),M=D(()=>{for(const[,n]of I.value)return n;return null}),P=v(Ma()),H=v(Ta()||""),k=D(()=>[...s.value].sort((n,r)=>n.timestamp-r.timestamp)),x=D(()=>b.value.map(n=>n.name)),j=D(()=>Array.from(h.value.values()).map(n=>n.name)),B=D(()=>{const n=j.value;return n.length===0?"":n.length===1?`${n[0]} is typing...`:n.length===2?`${n[0]} and ${n[1]} are typing...`:`${n[0]} and ${n.length-1} others are typing...`});function z(){const n=Ia({userId:P.value,userName:H.value||void 0});console.log("[GroupChat] connecting...",{userId:P.value,userName:H.value}),n.on("connect",()=>{console.log("[GroupChat] connected, socket id:",n.id),p.value=!0,C.value=null}),n.on("disconnect",r=>{console.log("[GroupChat] disconnected:",r),p.value=!1}),n.on("connect_error",r=>{console.error("[GroupChat] connect_error:",r.message),C.value=r.message,p.value=!1}),n.on("message",r=>{r.roomId===o.value&&s.value.push(r)}),n.on("member_joined",r=>{r.roomId===o.value&&(b.value=r.members)}),n.on("member_left",r=>{r.roomId===o.value&&(b.value=r.members)}),n.on("typing",r=>{if(r.roomId===o.value&&!h.value.has(r.userId)){const c=setTimeout(()=>h.value.delete(r.userId),5e3);h.value.set(r.userId,{name:r.userName,timer:c})}}),n.on("stop_typing",r=>{if(r.roomId===o.value&&h.value.has(r.userId)){const c=h.value.get(r.userId);clearTimeout(c.timer),h.value.delete(r.userId)}}),n.on("context_status",r=>{r.roomId===o.value&&(r.status==="ready"?I.value.delete(r.agentName):I.value.set(r.agentName,{agentName:r.agentName,status:r.status}),I.value=new Map(I.value))}),n.on("room_updated",r=>{const c=l.value.find($=>$.id===r.roomId);c&&(c.totalTokens=r.totalTokens)}),n.on("room_cleared",r=>{const c=l.value.find($=>$.id===r.roomId);c&&(c.totalTokens=r.totalTokens),r.roomId===o.value&&(s.value=[],h.value.clear(),I.value.clear())})}function A(){Ra(),p.value=!1,o.value=null,s.value=[],b.value=[],y.value=[],R.value="",h.value.clear(),I.value.clear()}function K(n,r){H.value=n,localStorage.setItem("gc_user_name",n),localStorage.setItem("gc_user_description",r)}async function q(n){S.value=!0,C.value=null;try{const c=await Ha(n);o.value=c.room.id,R.value=c.room.name,s.value=c.messages,y.value=c.agents,b.value=c.members||[]}catch(c){throw C.value=c.message,c}finally{S.value=!1}const r=_e();r&&await new Promise(c=>{r.emit("join",{roomId:n,name:H.value||void 0},$=>{if(!$?.error){if(b.value=$.members||[],$.agents&&(y.value=$.agents),$.typingUsers){for(const i of $.typingUsers)if(!h.value.has(i.userId)){const a=setTimeout(()=>h.value.delete(i.userId),5e3);h.value.set(i.userId,{name:i.userName,timer:a})}}$.contextStatuses&&(I.value=new Map($.contextStatuses.map(i=>[i.agentName,i])))}c()})})}async function te(n){const r=_e();if(!(!r||!o.value))return G(),new Promise((c,$)=>{r.emit("message",{roomId:o.value,content:n},i=>{if(i.error){$(new Error(i.error));return}c()})})}async function oe(){try{l.value=(await Na()).rooms}catch(n){C.value=n.message}}async function ae(n,r,c,$){try{const i=await $a({name:n,inviteCode:r,agents:c,compression:$||{triggerTokens:1e5,maxHistoryTokens:32e3,tailMessageCount:10}});return l.value.push(i.room),i}catch(i){throw C.value=i.message,i}}async function ne(n){try{const r=await Ga(n);return await q(r.room.id),r.room}catch(r){throw C.value=r.message,r}}async function de(n){try{await Ua(n),l.value=l.value.filter(r=>r.id!==n),o.value===n&&(o.value=null,s.value=[],b.value=[],y.value=[],R.value="")}catch(r){throw C.value=r.message,r}}async function ce(n,r){try{const c=await Sa(n,r);return l.value.push(c.room),c}catch(c){throw C.value=c.message,c}}async function J(){if(o.value)try{const n=await Da(o.value);s.value=[],h.value.clear(),I.value.clear();const r=l.value.findIndex(c=>c.id===o.value);return r>=0&&n.room&&(l.value[r]=n.room),n}catch(n){throw C.value=n.message,n}}async function se(n){try{y.value=(await Pa(n)).agents}catch{}}async function me(n,r){try{const c=await La(n,r);return y.value.push(c.agent),c.agent}catch(c){throw C.value=c.message,c}}async function ve(n,r){try{await Aa(n,r),y.value=y.value.filter(c=>c.id!==r)}catch(c){throw C.value=c.message,c}}let m=null;function w(){const n=_e();!n||!o.value||(n.emit("typing",{roomId:o.value}),m&&clearTimeout(m),m=setTimeout(()=>G(),4e3))}function G(){const n=_e();!n||!o.value||(n.emit("stop_typing",{roomId:o.value}),m&&(clearTimeout(m),m=null))}return{connected:p,currentRoomId:o,rooms:l,messages:s,members:b,agents:y,roomName:R,isJoining:S,error:C,contextStatus:M,contextStatuses:I,userId:P,userName:H,sortedMessages:k,memberNames:x,typingNames:j,typingText:B,connect:z,disconnect:A,setUserInfo:K,joinRoom:q,sendMessage:te,loadRooms:oe,emitTyping:w,emitStopTyping:G,createNewRoom:ae,joinByCode:ne,deleteRoom:de,cloneRoom:ce,clearCurrentRoomContext:J,loadAgents:se,addAgentToRoom:me,removeAgentFromRoom:ve}})})),Re,$e,Se,Ne,He,Ge,Le,Pe,qo,Ae=L((()=>{ee(),Re=Fo(Oo()),xa(),$e={class:"avatar"},Se=["innerHTML"],Ne={class:"msg-body"},He={class:"msg-header"},Ge={class:"sender-name"},Le={key:0,class:"agent-desc"},Pe={class:"msg-time"},qo=Z({__name:"GroupMessageItem",props:{message:{},agents:{},currentUserId:{}},setup(p){const o=p,l=D(()=>o.agents.some(C=>C.agentId===o.message.senderId)),s=D(()=>!!o.currentUserId&&o.message.senderId===o.currentUserId),b=D(()=>o.agents.find(C=>C.agentId===o.message.senderId)),y=D(()=>new Date(o.message.timestamp).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})),R=D(()=>(0,Re.default)(o.message.senderName||o.message.senderId)),S=D(()=>o.agents.map(C=>C.name).filter(Boolean));return(C,h)=>(g(),f("div",{class:X(["group-message",{agent:l.value,self:s.value}])},[e("div",$e,[e("span",{innerHTML:R.value},null,8,Se)]),e("div",Ne,[e("div",He,[e("span",Ge,u(p.message.senderName),1),l.value&&b.value?.description?(g(),f("span",Le,u(b.value.description),1)):U("",!0)]),e("div",{class:X(["msg-content",{"agent-content":l.value}])},[_(ba,{content:p.message.content,"mention-names":S.value},null,8,["content","mention-names"])],2),e("span",Pe,u(y.value),1)])],2))}})})),Fa=L((()=>{})),Jo,za=L((()=>{Ae(),Ae(),Fa(),ie(),Jo=ue(qo,[["__scopeId","data-v-0a07afd6"]])})),Ue,Wo,De=L((()=>{ee(),wa(),ke(),xe(),za(),Ue={key:0,class:"empty-state"},Wo=Z({__name:"GroupMessageList",setup(p,{expose:o}){const l=ge(),{t:s}=we(),b=v(),y=v(!0);function R(){if(!b.value)return;const{scrollTop:h,scrollHeight:I,clientHeight:M}=b.value;y.value=I-h-M<200}function S(){b.value&&(b.value.scrollTop=b.value.scrollHeight)}function C(){R()}return zo(()=>l.messages.length,async()=>{await pe(),y.value&&S()}),o({scrollToBottom:S}),(h,I)=>(g(),f("div",{ref_key:"listRef",ref:b,class:"message-list",onScroll:C},[t(l).sortedMessages.length===0?(g(),f("div",Ue,[I[0]||(I[0]=e("img",{src:"/logo.png",alt:"Hermes",class:"empty-logo"},null,-1)),e("p",null,u(t(s)("chat.emptyState")),1)])):U("",!0),(g(!0),f(Q,null,re(t(l).sortedMessages,M=>(g(),fe(Jo,{key:M.id,message:M,agents:t(l).agents,"current-user-id":t(l).userId},null,8,["message","agents","current-user-id"]))),128))],544))}})})),Ea=L((()=>{})),Qo,Va=L((()=>{De(),De(),Ea(),ie(),Qo=ue(Wo,[["__scopeId","data-v-69b53850"]])})),Be,je,Fe,ze,Ee,Ve,Oe,Xo,Ke=L((()=>{ee(),ke(),Ie(),xe(),Be={class:"chat-input-area"},je={class:"input-wrapper"},Fe=["placeholder"],ze={class:"input-actions"},Ee=["onMousedown","onMouseenter"],Ve={class:"mention-name"},Oe={class:"mention-profile"},Xo=Z({__name:"GroupChatInput",emits:["send"],setup(p,{emit:o}){const{t:l}=we(),s=o,b=ge(),y=v(""),R=v(),S=v(),C=v(!1),h=v(null);function I(m){m.preventDefault();const w=R.value;if(!w)return;const G=w.clientHeight,n=m.clientY;function r($){const i=G-($.clientY-n);h.value=Math.max(20,Math.min(400,Math.round(i)))}function c(){document.removeEventListener("mousemove",r),document.removeEventListener("mouseup",c),document.body.style.cursor="",document.body.style.userSelect=""}document.body.style.cursor="row-resize",document.body.style.userSelect="none",document.addEventListener("mousemove",r),document.addEventListener("mouseup",c)}const M=v(!1),P=v(""),H=v(-1),k=v(0),x=v(0),j=v(0),B=v("bottom"),z=v(0),A=D(()=>{const m=P.value.toLowerCase();return b.agents.filter(w=>w.name.toLowerCase().includes(m))}),K=D(()=>!!y.value.trim());function q(){pe(()=>{if(!S.value)return;const m=S.value.querySelector(".active");m&&m.scrollIntoView({block:"nearest",behavior:"instant"})})}function te(){const m=R.value;if(!m){M.value=!1;return}const w=y.value,G=m.selectionStart;let n=-1;for(let N=G-1;N>=0;N--){if(w[N]==="@"){n=N;break}if(w[N]===" "||w[N]===`
|
|
1
|
+
import{a as Fo,n as L}from"./rolldown-runtime-BKwlnUi0.js";import{Bt as ye,F as E,G as ra,M as la,Nt as v,Q as Me,R as Y,Rt as t,St as zo,Tt as ia,U as ee,V as ua,Vt as u,X as W,Y as Ce,Z as Q,_t as g,ct as Z,d as Te,et as D,f as le,gt as Eo,h as he,ht as Vo,it as f,j as da,k as ca,nt as fe,ot as F,pt as pe,q as ma,rt as U,st as _,t as Ie,tt as e,wt as T,y as va,yt as re,zt as X}from"./ui-vendor-CsTMg6zH.js";import{d as pa,n as ke,r as we,u as ga}from"./vue-vendor-D8zSB7VM.js";import{a as _a,c as ha,d as fa,l as V,n as ie,p as ya,t as ue}from"./_plugin-vue_export-helper-CrLlP_D3.js";import{O as Ca,k as ka,t as Oo}from"./vendor-D9rSt2qK.js";import{w as wa}from"./index-Bzb-xLYu.js";import{n as xa,t as ba}from"./MarkdownRenderer-BCFoS7DH.js";function Ia(p){if(O?.connected)return O;const o=_a(),l=p?.userId||localStorage.getItem("gc_user_id")||Ko();return localStorage.setItem("gc_user_id",l),O=ka("/group-chat",{auth:{token:o||void 0,userId:l,name:p?.userName||localStorage.getItem("gc_user_name")||void 0,description:p?.description||localStorage.getItem("gc_user_description")||void 0},transports:["websocket","polling"],reconnection:!0,reconnectionAttempts:1/0,reconnectionDelay:1e3,reconnectionDelayMax:3e4,randomizationFactor:.5,timeout:3e4}),O}function Ma(){let p=localStorage.getItem("gc_user_id");return p||(p=Ko(),localStorage.setItem("gc_user_id",p)),p}function Ta(){return localStorage.getItem("gc_user_name")}function Ko(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,p=>{const o=Math.random()*16|0;return(p==="x"?o:o&3|8).toString(16)})}function _e(){return O?.connected?O:null}function Ra(){O&&(O.disconnect(),O=null)}async function $a(p){return V("/api/hermes/group-chat/rooms",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(p)})}async function Sa(p,o){return V(`/api/hermes/group-chat/rooms/${p}/clone`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o||{})})}async function Na(){return V("/api/hermes/group-chat/rooms")}async function Ha(p){return V(`/api/hermes/group-chat/rooms/${p}`)}async function Ga(p){return V(`/api/hermes/group-chat/rooms/join/${p}`)}async function La(p,o){return V(`/api/hermes/group-chat/rooms/${p}/agents`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)})}async function Pa(p){return V(`/api/hermes/group-chat/rooms/${p}/agents`)}async function Aa(p,o){return V(`/api/hermes/group-chat/rooms/${p}/agents/${o}`,{method:"DELETE"})}async function Ua(p){return V(`/api/hermes/group-chat/rooms/${p}`,{method:"DELETE"})}async function Da(p){return V(`/api/hermes/group-chat/rooms/${p}/clear-context`,{method:"POST"})}async function Ba(p,o){return V(`/api/hermes/group-chat/rooms/${p}/config`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)})}async function ja(p){return V(`/api/hermes/group-chat/rooms/${p}/compress`,{method:"POST"})}var O,Yo=L((()=>{Ca(),ha(),O=null})),ge,xe=L((()=>{pa(),ee(),Yo(),ge=ga("groupChat",()=>{const p=v(!1),o=v(null),l=v([]),s=v([]),b=v([]),y=v([]),R=v(""),S=v(!1),C=v(null),h=v(new Map),I=v(new Map),M=D(()=>{for(const[,n]of I.value)return n;return null}),P=v(Ma()),H=v(Ta()||""),k=D(()=>[...s.value].sort((n,r)=>n.timestamp-r.timestamp)),x=D(()=>b.value.map(n=>n.name)),j=D(()=>Array.from(h.value.values()).map(n=>n.name)),B=D(()=>{const n=j.value;return n.length===0?"":n.length===1?`${n[0]} is typing...`:n.length===2?`${n[0]} and ${n[1]} are typing...`:`${n[0]} and ${n.length-1} others are typing...`});function z(){const n=Ia({userId:P.value,userName:H.value||void 0});console.log("[GroupChat] connecting...",{userId:P.value,userName:H.value}),n.on("connect",()=>{console.log("[GroupChat] connected, socket id:",n.id),p.value=!0,C.value=null}),n.on("disconnect",r=>{console.log("[GroupChat] disconnected:",r),p.value=!1}),n.on("connect_error",r=>{console.error("[GroupChat] connect_error:",r.message),C.value=r.message,p.value=!1}),n.on("message",r=>{r.roomId===o.value&&s.value.push(r)}),n.on("member_joined",r=>{r.roomId===o.value&&(b.value=r.members)}),n.on("member_left",r=>{r.roomId===o.value&&(b.value=r.members)}),n.on("typing",r=>{if(r.roomId===o.value&&!h.value.has(r.userId)){const c=setTimeout(()=>h.value.delete(r.userId),5e3);h.value.set(r.userId,{name:r.userName,timer:c})}}),n.on("stop_typing",r=>{if(r.roomId===o.value&&h.value.has(r.userId)){const c=h.value.get(r.userId);clearTimeout(c.timer),h.value.delete(r.userId)}}),n.on("context_status",r=>{r.roomId===o.value&&(r.status==="ready"?I.value.delete(r.agentName):I.value.set(r.agentName,{agentName:r.agentName,status:r.status}),I.value=new Map(I.value))}),n.on("room_updated",r=>{const c=l.value.find($=>$.id===r.roomId);c&&(c.totalTokens=r.totalTokens)}),n.on("room_cleared",r=>{const c=l.value.find($=>$.id===r.roomId);c&&(c.totalTokens=r.totalTokens),r.roomId===o.value&&(s.value=[],h.value.clear(),I.value.clear())})}function A(){Ra(),p.value=!1,o.value=null,s.value=[],b.value=[],y.value=[],R.value="",h.value.clear(),I.value.clear()}function K(n,r){H.value=n,localStorage.setItem("gc_user_name",n),localStorage.setItem("gc_user_description",r)}async function q(n){S.value=!0,C.value=null;try{const c=await Ha(n);o.value=c.room.id,R.value=c.room.name,s.value=c.messages,y.value=c.agents,b.value=c.members||[]}catch(c){throw C.value=c.message,c}finally{S.value=!1}const r=_e();r&&await new Promise(c=>{r.emit("join",{roomId:n,name:H.value||void 0},$=>{if(!$?.error){if(b.value=$.members||[],$.agents&&(y.value=$.agents),$.typingUsers){for(const i of $.typingUsers)if(!h.value.has(i.userId)){const a=setTimeout(()=>h.value.delete(i.userId),5e3);h.value.set(i.userId,{name:i.userName,timer:a})}}$.contextStatuses&&(I.value=new Map($.contextStatuses.map(i=>[i.agentName,i])))}c()})})}async function te(n){const r=_e();if(!(!r||!o.value))return G(),new Promise((c,$)=>{r.emit("message",{roomId:o.value,content:n},i=>{if(i.error){$(new Error(i.error));return}c()})})}async function oe(){try{l.value=(await Na()).rooms}catch(n){C.value=n.message}}async function ae(n,r,c,$){try{const i=await $a({name:n,inviteCode:r,agents:c,compression:$||{triggerTokens:1e5,maxHistoryTokens:32e3,tailMessageCount:10}});return l.value.push(i.room),i}catch(i){throw C.value=i.message,i}}async function ne(n){try{const r=await Ga(n);return await q(r.room.id),r.room}catch(r){throw C.value=r.message,r}}async function de(n){try{await Ua(n),l.value=l.value.filter(r=>r.id!==n),o.value===n&&(o.value=null,s.value=[],b.value=[],y.value=[],R.value="")}catch(r){throw C.value=r.message,r}}async function ce(n,r){try{const c=await Sa(n,r);return l.value.push(c.room),c}catch(c){throw C.value=c.message,c}}async function J(){if(o.value)try{const n=await Da(o.value);s.value=[],h.value.clear(),I.value.clear();const r=l.value.findIndex(c=>c.id===o.value);return r>=0&&n.room&&(l.value[r]=n.room),n}catch(n){throw C.value=n.message,n}}async function se(n){try{y.value=(await Pa(n)).agents}catch{}}async function me(n,r){try{const c=await La(n,r);return y.value.push(c.agent),c.agent}catch(c){throw C.value=c.message,c}}async function ve(n,r){try{await Aa(n,r),y.value=y.value.filter(c=>c.id!==r)}catch(c){throw C.value=c.message,c}}let m=null;function w(){const n=_e();!n||!o.value||(n.emit("typing",{roomId:o.value}),m&&clearTimeout(m),m=setTimeout(()=>G(),4e3))}function G(){const n=_e();!n||!o.value||(n.emit("stop_typing",{roomId:o.value}),m&&(clearTimeout(m),m=null))}return{connected:p,currentRoomId:o,rooms:l,messages:s,members:b,agents:y,roomName:R,isJoining:S,error:C,contextStatus:M,contextStatuses:I,userId:P,userName:H,sortedMessages:k,memberNames:x,typingNames:j,typingText:B,connect:z,disconnect:A,setUserInfo:K,joinRoom:q,sendMessage:te,loadRooms:oe,emitTyping:w,emitStopTyping:G,createNewRoom:ae,joinByCode:ne,deleteRoom:de,cloneRoom:ce,clearCurrentRoomContext:J,loadAgents:se,addAgentToRoom:me,removeAgentFromRoom:ve}})})),Re,$e,Se,Ne,He,Ge,Le,Pe,qo,Ae=L((()=>{ee(),Re=Fo(Oo()),xa(),$e={class:"avatar"},Se=["innerHTML"],Ne={class:"msg-body"},He={class:"msg-header"},Ge={class:"sender-name"},Le={key:0,class:"agent-desc"},Pe={class:"msg-time"},qo=Z({__name:"GroupMessageItem",props:{message:{},agents:{},currentUserId:{}},setup(p){const o=p,l=D(()=>o.agents.some(C=>C.agentId===o.message.senderId)),s=D(()=>!!o.currentUserId&&o.message.senderId===o.currentUserId),b=D(()=>o.agents.find(C=>C.agentId===o.message.senderId)),y=D(()=>new Date(o.message.timestamp).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})),R=D(()=>(0,Re.default)(o.message.senderName||o.message.senderId)),S=D(()=>o.agents.map(C=>C.name).filter(Boolean));return(C,h)=>(g(),f("div",{class:X(["group-message",{agent:l.value,self:s.value}])},[e("div",$e,[e("span",{innerHTML:R.value},null,8,Se)]),e("div",Ne,[e("div",He,[e("span",Ge,u(p.message.senderName),1),l.value&&b.value?.description?(g(),f("span",Le,u(b.value.description),1)):U("",!0)]),e("div",{class:X(["msg-content",{"agent-content":l.value}])},[_(ba,{content:p.message.content,"mention-names":S.value},null,8,["content","mention-names"])],2),e("span",Pe,u(y.value),1)])],2))}})})),Fa=L((()=>{})),Jo,za=L((()=>{Ae(),Ae(),Fa(),ie(),Jo=ue(qo,[["__scopeId","data-v-0a07afd6"]])})),Ue,Wo,De=L((()=>{ee(),wa(),ke(),xe(),za(),Ue={key:0,class:"empty-state"},Wo=Z({__name:"GroupMessageList",setup(p,{expose:o}){const l=ge(),{t:s}=we(),b=v(),y=v(!0);function R(){if(!b.value)return;const{scrollTop:h,scrollHeight:I,clientHeight:M}=b.value;y.value=I-h-M<200}function S(){b.value&&(b.value.scrollTop=b.value.scrollHeight)}function C(){R()}return zo(()=>l.messages.length,async()=>{await pe(),y.value&&S()}),o({scrollToBottom:S}),(h,I)=>(g(),f("div",{ref_key:"listRef",ref:b,class:"message-list",onScroll:C},[t(l).sortedMessages.length===0?(g(),f("div",Ue,[I[0]||(I[0]=e("img",{src:"/logo.png",alt:"Hermes",class:"empty-logo"},null,-1)),e("p",null,u(t(s)("chat.emptyState")),1)])):U("",!0),(g(!0),f(Q,null,re(t(l).sortedMessages,M=>(g(),fe(Jo,{key:M.id,message:M,agents:t(l).agents,"current-user-id":t(l).userId},null,8,["message","agents","current-user-id"]))),128))],544))}})})),Ea=L((()=>{})),Qo,Va=L((()=>{De(),De(),Ea(),ie(),Qo=ue(Wo,[["__scopeId","data-v-69b53850"]])})),Be,je,Fe,ze,Ee,Ve,Oe,Xo,Ke=L((()=>{ee(),ke(),Ie(),xe(),Be={class:"chat-input-area"},je={class:"input-wrapper"},Fe=["placeholder"],ze={class:"input-actions"},Ee=["onMousedown","onMouseenter"],Ve={class:"mention-name"},Oe={class:"mention-profile"},Xo=Z({__name:"GroupChatInput",emits:["send"],setup(p,{emit:o}){const{t:l}=we(),s=o,b=ge(),y=v(""),R=v(),S=v(),C=v(!1),h=v(null);function I(m){m.preventDefault();const w=R.value;if(!w)return;const G=w.clientHeight,n=m.clientY;function r($){const i=G-($.clientY-n);h.value=Math.max(20,Math.min(400,Math.round(i)))}function c(){document.removeEventListener("mousemove",r),document.removeEventListener("mouseup",c),document.body.style.cursor="",document.body.style.userSelect=""}document.body.style.cursor="row-resize",document.body.style.userSelect="none",document.addEventListener("mousemove",r),document.addEventListener("mouseup",c)}const M=v(!1),P=v(""),H=v(-1),k=v(0),x=v(0),j=v(0),B=v("bottom"),z=v(0),A=D(()=>{const m=P.value.toLowerCase();return b.agents.filter(w=>w.name.toLowerCase().includes(m))}),K=D(()=>!!y.value.trim());function q(){pe(()=>{if(!S.value)return;const m=S.value.querySelector(".active");m&&m.scrollIntoView({block:"nearest",behavior:"instant"})})}function te(){const m=R.value;if(!m){M.value=!1;return}const w=y.value,G=m.selectionStart;let n=-1;for(let N=G-1;N>=0;N--){if(w[N]==="@"){n=N;break}if(w[N]===" "||w[N]===`
|
|
2
2
|
`)break}if(n===-1){M.value=!1;return}if(n>0&&w[n-1]!==" "&&w[n-1]!==`
|
|
3
3
|
`){M.value=!1;return}const r=w.slice(n+1,G);if(r.includes(" ")){M.value=!1;return}P.value=r,H.value=n,z.value=0;const c=document.createElement("span"),$=getComputedStyle(m);["fontFamily","fontSize","fontWeight","letterSpacing","textTransform","wordSpacing","textIndent","border","padding","boxSizing","lineHeight"].forEach(N=>{c.style[N]=$[N]}),c.style.position="absolute",c.style.visibility="hidden",c.style.whiteSpace="nowrap",c.textContent=w.slice(0,n+1);const i=m.getBoundingClientRect();document.body.appendChild(c);const a=c.getBoundingClientRect();document.body.removeChild(c),k.value=i.left+a.width-m.scrollLeft;const d=Math.min(A.value.length*36+8,240);window.innerHeight-i.top+m.scrollTop-8<d&&i.top-m.scrollTop-8>d?(B.value="top",x.value=i.top-m.scrollTop-8):(B.value="bottom",x.value=i.top-m.scrollTop-8),j.value=window.innerHeight-x.value,M.value=A.value.length>0}function oe(m){const w=R.value;if(!w||H.value===-1)return;const G=y.value.slice(0,H.value);y.value=`${G}@${m} ${y.value.slice(w.selectionStart)}`,M.value=!1,pe(()=>{if(w){const n=G.length+m.length+2;w.setSelectionRange(n,n),w.focus(),h.value===null&&(w.style.height="auto",w.style.height=Math.min(w.scrollHeight,100)+"px")}})}function ae(m){if(M.value&&A.value.length>0){if(m.key==="ArrowDown"){m.preventDefault(),z.value=(z.value+1)%A.value.length,q();return}if(m.key==="ArrowUp"){m.preventDefault(),z.value=(z.value-1+A.value.length)%A.value.length,q();return}if(m.key==="Enter"||m.key==="Tab"){m.preventDefault(),oe(A.value[z.value].name);return}if(m.key==="Escape"){m.preventDefault(),M.value=!1;return}}m.key!=="Enter"||m.shiftKey||C.value||m.isComposing||m.keyCode===229||(m.preventDefault(),ne())}function ne(){const m=y.value.trim();m&&(s("send",m),y.value="",M.value=!1)}function de(m){if(h.value!==null)return;b.emitTyping();const w=m.target;w.style.height="auto",w.style.height=Math.min(w.scrollHeight,100)+"px",C.value||te()}function ce(m){oe(m)}function J(m){z.value=m}function se(m){M.value&&(m.target.closest(".mention-dropdown")||(M.value=!1))}Vo(()=>{document.addEventListener("mousedown",se)}),Eo(()=>{document.removeEventListener("mousedown",se)});function me(){C.value=!0}function ve(){requestAnimationFrame(()=>{C.value=!1,te()})}return(m,w)=>(g(),f("div",Be,[e("div",je,[e("div",{class:"resize-handle",onMousedown:I},null,32),ia(e("textarea",{ref_key:"textareaRef",ref:R,"onUpdate:modelValue":w[0]||(w[0]=G=>y.value=G),class:"input-textarea",style:ye(h.value?{height:h.value+"px"}:{}),placeholder:t(l)("groupChat.inputPlaceholder"),rows:"1",onKeydown:ae,onCompositionstart:me,onCompositionend:ve,onInput:de},null,44,Fe),[[ma,y.value]]),e("div",ze,[_(t(E),{size:"small",type:"primary",disabled:!K.value,onClick:ne},{icon:T(()=>[...w[1]||(w[1]=[e("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("line",{x1:"22",y1:"2",x2:"11",y2:"13"}),e("polygon",{points:"22 2 15 22 11 13 2 9 22 2"})],-1)])]),default:T(()=>[F(" "+u(t(l)("chat.send")),1)]),_:1},8,["disabled"])])]),_(ra,{name:"dropdown-fade"},{default:T(()=>[M.value&&A.value.length>0?(g(),f("div",{key:0,ref_key:"dropdownRef",ref:S,class:X(["mention-dropdown",{"placement-top":B.value==="top"}]),style:ye({left:k.value+"px",top:B.value==="bottom"?x.value+"px":"auto",bottom:B.value==="top"?j.value+"px":"auto"})},[(g(!0),f(Q,null,re(A.value,(G,n)=>(g(),f("div",{key:G.name,class:X(["mention-dropdown-item",{active:n===z.value}]),onMousedown:W(r=>ce(G.name),["prevent"]),onMouseenter:r=>J(n)},[e("span",Ve,"@"+u(G.name),1),e("span",Oe,u(G.profile),1)],42,Ee))),128))],6)):U("",!0)]),_:1})]))}})})),Oa=L((()=>{})),Zo,Ka=L((()=>{Ke(),Ke(),Oa(),ie(),Zo=ue(Xo,[["__scopeId","data-v-7971619d"]])})),Ye,qe,Je,We,Qe,Xe,Ze,et,tt,ot,at,nt,st,rt,lt,it,ut,dt,ct,mt,vt,ea,pt=L((()=>{ee(),ke(),Ie(),Ye={class:"create-form"},qe={class:"form-group"},Je={class:"form-label"},We={class:"form-group"},Qe={class:"form-label"},Xe={class:"form-group"},Ze={class:"form-label"},et={class:"form-group"},tt={class:"form-label"},ot={class:"code-row"},at={class:"compression-fields"},nt={class:"form-group"},st={class:"form-label"},rt={class:"form-hint"},lt={class:"form-group"},it={class:"form-label"},ut={class:"form-hint"},dt={class:"form-group"},ct={class:"form-label"},mt={class:"form-hint"},vt={class:"modal-actions"},ea=Z({__name:"CreateRoomForm",emits:["submit","cancel"],setup(p,{emit:o}){const{t:l}=we(),s=o,b=v(""),y=v(""),R=v(""),S=v(""),C=v(null),h=v({triggerTokens:1e5,maxHistoryTokens:32e3,tailMessageCount:10});function I(){const H="ABCDEFGHJKLMNPQRSTUVWXYZ23456789";let k="";for(let x=0;x<6;x++)k+=H[Math.floor(Math.random()*32)];return k}function M(){const H=b.value.trim(),k=y.value.trim()||I(),x=R.value.trim();!H||!x||s("submit",H,k,x,S.value.trim(),{...h.value})}function P(){pe(()=>C.value?.focus())}return(H,k)=>(g(),f("div",Ye,[e("div",qe,[e("label",Je,u(t(l)("groupChat.yourName")),1),_(t(Y),{value:R.value,"onUpdate:value":k[0]||(k[0]=x=>R.value=x),placeholder:t(l)("groupChat.yourNamePlaceholder"),onKeyup:Ce(P,["enter"])},null,8,["value","placeholder"])]),e("div",We,[e("label",Qe,u(t(l)("groupChat.yourDescription")),1),_(t(Y),{value:S.value,"onUpdate:value":k[1]||(k[1]=x=>S.value=x),type:"textarea",rows:2,placeholder:t(l)("groupChat.yourDescriptionPlaceholder")},null,8,["value","placeholder"])]),e("div",Xe,[e("label",Ze,u(t(l)("groupChat.roomName")),1),_(t(Y),{ref_key:"roomInput",ref:C,value:b.value,"onUpdate:value":k[2]||(k[2]=x=>b.value=x),placeholder:t(l)("groupChat.roomNamePlaceholder"),onKeyup:Ce(M,["enter"])},null,8,["value","placeholder"])]),e("div",et,[e("label",tt,u(t(l)("groupChat.inviteCode")),1),e("div",ot,[_(t(Y),{value:y.value,"onUpdate:value":k[3]||(k[3]=x=>y.value=x),placeholder:t(l)("groupChat.autoGenerate")},null,8,["value","placeholder"]),_(t(E),{size:"small",onClick:k[4]||(k[4]=x=>y.value=I())},{default:T(()=>[...k[9]||(k[9]=[e("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[e("polyline",{points:"23 4 23 10 17 10"}),e("path",{d:"M20.49 15a9 9 0 1 1-2.12-9.36L23 10"})],-1)])]),_:1})])]),_(t(la),{class:"compression-collapse"},{default:T(()=>[_(t(da),{title:t(l)("groupChat.compressionSettings"),name:"compression"},{default:T(()=>[e("div",at,[e("div",nt,[e("label",st,u(t(l)("groupChat.triggerTokens")),1),_(t(le),{value:h.value.triggerTokens,"onUpdate:value":k[5]||(k[5]=x=>h.value.triggerTokens=x),min:1e3,step:1e3,style:{width:"100%"}},null,8,["value"]),e("p",rt,u(t(l)("groupChat.triggerTokensDesc")),1)]),e("div",lt,[e("label",it,u(t(l)("groupChat.maxHistoryTokens")),1),_(t(le),{value:h.value.maxHistoryTokens,"onUpdate:value":k[6]||(k[6]=x=>h.value.maxHistoryTokens=x),min:1e3,step:1e3,style:{width:"100%"}},null,8,["value"]),e("p",ut,u(t(l)("groupChat.maxHistoryTokensDesc")),1)]),e("div",dt,[e("label",ct,u(t(l)("groupChat.tailMessageCount")),1),_(t(le),{value:h.value.tailMessageCount,"onUpdate:value":k[7]||(k[7]=x=>h.value.tailMessageCount=x),min:1,step:5,style:{width:"100%"}},null,8,["value"]),e("p",mt,u(t(l)("groupChat.tailMessageCountDesc")),1)])])]),_:1},8,["title"])]),_:1}),e("div",vt,[_(t(he),{justify:"end"},{default:T(()=>[_(t(E),{onClick:k[8]||(k[8]=x=>s("cancel"))},{default:T(()=>[F(u(t(l)("common.cancel")),1)]),_:1}),_(t(E),{type:"primary",disabled:!b.value.trim()||!R.value.trim(),onClick:M},{default:T(()=>[F(u(t(l)("common.create")),1)]),_:1},8,["disabled"])]),_:1})])]))}})})),Ya=L((()=>{})),be,qa=L((()=>{pt(),pt(),Ya(),ie(),be=ue(ea,[["__scopeId","data-v-57f3c58c"]])})),gt,_t,ht,ft,yt,Ct,kt,wt,xt,bt,It,Mt,Tt,Rt,$t,St,Nt,Ht,Gt,Lt,Pt,At,Ut,Dt,Bt,jt,Ft,zt,Et,Vt,Ot,Kt,Yt,qt,Jt,Wt,Qt,Xt,Zt,eo,to,oo,ao,no,so,ro,lo,io,uo,co,mo,vo,po,go,_o,ho,fo,yo,Co,ko,wo,xo,bo,Io,Mo,To,Ro,$o,So,No,Ho,Go,Lo,Po,Ao,Uo,ta,Do=L((()=>{ee(),ke(),Ie(),gt=Fo(Oo()),xe(),fa(),Yo(),Va(),Ka(),qa(),_t={class:"group-chat-panel"},ht={key:0,class:"room-sidebar"},ft={class:"sidebar-header"},yt={class:"sidebar-title"},Ct={class:"sidebar-actions"},kt=["title"],wt={class:"room-list"},xt=["onClick"],bt={class:"room-info"},It={class:"room-name"},Mt={key:0,class:"room-code"},Tt={class:"room-tokens"},Rt=["title","onClick"],$t={key:0,class:"empty-rooms"},St={class:"chat-main"},Nt={class:"chat-header"},Ht={class:"room-title-text"},Gt={class:"header-info"},Lt={class:"avatar-stack-inner"},Pt=["innerHTML"],At=["innerHTML"],Ut={key:0,class:"avatar-stack-more"},Dt={class:"agent-popover"},Bt={class:"agent-popover-item",style:{"margin-bottom":"8px","padding-bottom":"8px","border-bottom":"1px solid var(--n-border-color, #efeff5)"}},jt=["innerHTML"],Ft={class:"agent-popover-info"},zt={class:"agent-popover-name"},Et={class:"agent-popover-profile"},Vt={class:"agent-popover-title"},Ot=["innerHTML"],Kt={class:"agent-popover-info"},Yt={class:"agent-popover-name"},qt={class:"agent-popover-profile"},Jt=["onClick"],Wt={key:1,class:"avatar-stack-inner"},Qt={class:"avatar-stack-item"},Xt=["innerHTML"],Zt=["title"],eo=["title"],to=["title"],oo={key:2,class:"member-count"},ao={key:0,class:"status-bar"},no={key:0,class:"context-status-list"},so={key:0},ro={key:1},lo={key:1,class:"typing-indicator"},io={key:1,class:"no-room"},uo={class:"modal"},co={class:"modal"},mo={class:"form-group"},vo={class:"form-group"},po={class:"form-label"},go={class:"form-group"},_o={class:"form-label"},ho={class:"modal-actions"},fo={class:"modal"},yo={class:"form-group"},Co={class:"form-label"},ko={class:"form-group"},wo={class:"form-label"},xo={class:"code-row"},bo={class:"modal-actions"},Io={class:"modal"},Mo={class:"form-group"},To={class:"form-label"},Ro={class:"form-hint"},$o={class:"form-group"},So={class:"form-label"},No={class:"form-hint"},Ho={class:"form-group"},Go={class:"form-label"},Lo={class:"form-hint"},Po={style:{"margin-top":"8px"}},Ao={class:"modal-actions"},Uo=Z({components:{CreateRoomForm:be}}),ta=Z({...Uo,__name:"GroupChatPanel",setup(p){const{t:o}=we(),l=va(),s=ge(),b=ya(),y=v(window.innerWidth>768),R=v(!1),S=v(!1),C=v(!1),h=v(!1),I=v({triggerTokens:1e5,maxHistoryTokens:32e3,tailMessageCount:10}),M=v(!1),P=v(null),H=v(""),k=v(""),x=v(null),j=v(""),B=v(""),z=D(()=>b.profiles.map(i=>({label:i.name,value:i.name}))),A=new Map;function K(i){if(A.has(i))return A.get(i);const a=(0,gt.default)(i);return A.set(i,a),a}const q=D(()=>!!s.currentRoomId);function te(i){return i>=1e3?`${(i/1e3).toFixed(1)}k tokens`:`${i} tokens`}function oe(){y.value=!y.value}function ae(){const i="ABCDEFGHJKLMNPQRSTUVWXYZ23456789";let a="";for(let d=0;d<6;d++)a+=i[Math.floor(Math.random()*32)];return a}async function ne(i,a,d,N,na){try{s.setUserInfo(d,N);const sa=await s.createNewRoom(i,a,void 0,na);R.value=!1,l.success(o("groupChat.roomCreated")),await s.joinRoom(sa.room.id)}catch{l.error(o("common.saveFailed"))}}async function de(i){try{await s.deleteRoom(i),l.success(o("groupChat.roomDeleted"))}catch{l.error(o("common.saveFailed"))}}function ce(i){const a=s.rooms.find(d=>d.id===i);x.value=i,j.value=a?.name?`${a.name} Copy`:"",B.value=ae(),S.value=!0}async function J(){if(!(!x.value||!j.value.trim()))try{const i=await s.cloneRoom(x.value,{name:j.value.trim(),inviteCode:B.value.trim()||void 0});S.value=!1,x.value=null,j.value="",B.value="",await s.joinRoom(i.room.id),l.success(o("groupChat.roomCloned"))}catch{l.error(o("common.saveFailed"))}}async function se(){if(s.currentRoomId){if(s.contextStatuses.size>0){l.warning(o("groupChat.compressingInProgress"));return}try{await s.clearCurrentRoomContext(),l.success(o("groupChat.contextCleared"))}catch{l.error(o("common.deleteFailed"))}}}async function me(i){try{await s.joinRoom(i),window.innerWidth<=768&&(y.value=!1)}catch{l.error(o("groupChat.joinFailed"))}}async function ve(i){try{await s.sendMessage(i)}catch(a){l.error(a.message)}}async function m(){await b.fetchProfiles(),C.value=!0}async function w(){if(!(!P.value||!s.currentRoomId))try{await s.addAgentToRoom(s.currentRoomId,{profile:P.value,name:H.value.trim()||void 0,description:k.value.trim()||void 0}),C.value=!1,P.value=null,H.value="",k.value="",l.success(o("groupChat.agentAdded"))}catch(i){i.message?.includes("already")?l.warning(o("groupChat.agentAlreadyInRoom")):l.error(o("common.saveFailed"))}}function G(){const i=s.rooms.find(a=>a.id===s.currentRoomId);i&&(I.value={triggerTokens:i.triggerTokens??1e5,maxHistoryTokens:i.maxHistoryTokens??32e3,tailMessageCount:i.tailMessageCount??10}),h.value=!0}async function n(){if(s.currentRoomId)try{const i=await Ba(s.currentRoomId,{...I.value}),a=s.rooms.findIndex(d=>d.id===s.currentRoomId);a>=0&&i.room&&(s.rooms[a]=i.room),h.value=!1,l.success(o("groupChat.compressionSaved"))}catch{l.error(o("common.saveFailed"))}}async function r(){if(!(!s.currentRoomId||M.value)){if(s.contextStatuses.size>0){l.warning(o("groupChat.compressingInProgress"));return}M.value=!0;try{await ja(s.currentRoomId),l.success(o("groupChat.compressionSaved"))}catch{l.error(o("common.saveFailed"))}finally{M.value=!1}}}async function c(i){if(s.currentRoomId)try{await s.removeAgentFromRoom(s.currentRoomId,i)}catch{l.error(o("common.deleteFailed"))}}const $=v();return zo(()=>s.sortedMessages.length,async()=>{await pe(),$.value?.scrollToBottom()}),(i,a)=>(g(),f("div",_t,[e("div",{class:X(["sidebar-backdrop",{active:y.value}]),onClick:a[0]||(a[0]=d=>y.value=!1)},null,2),y.value?(g(),f("div",ht,[e("div",ft,[e("span",yt,u(t(o)("groupChat.title")),1),e("div",Ct,[e("button",{class:"icon-btn",title:t(o)("groupChat.createRoom"),onClick:a[1]||(a[1]=d=>R.value=!0)},[...a[20]||(a[20]=[e("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[e("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),e("line",{x1:"5",y1:"12",x2:"19",y2:"12"})],-1)])],8,kt)])]),e("div",wt,[(g(!0),f(Q,null,re(t(s).rooms,d=>(g(),f("div",{key:d.id,class:X(["room-item",{active:t(s).currentRoomId===d.id}]),onClick:N=>me(d.id)},[a[23]||(a[23]=e("svg",{class:"room-icon",width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[e("path",{d:"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"})],-1)),e("div",bt,[e("span",It,u(d.name||d.id),1),d.inviteCode?(g(),f("span",Mt,u(d.inviteCode),1)):U("",!0),e("span",Tt,u(te(d.totalTokens||0)),1)]),e("button",{class:"room-action-btn",title:t(o)("groupChat.cloneRoom"),onClick:W(N=>ce(d.id),["stop"])},[...a[21]||(a[21]=[e("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("rect",{x:"8",y:"8",width:"12",height:"12",rx:"2"}),e("path",{d:"M4 16V6a2 2 0 0 1 2-2h10"})],-1)])],8,Rt),_(t(Te),{onPositiveClick:N=>de(d.id)},{trigger:T(()=>[e("button",{class:"room-action-btn danger",onClick:a[2]||(a[2]=W(()=>{},["stop"]))},[...a[22]||(a[22]=[e("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e("line",{x1:"6",y1:"6",x2:"18",y2:"18"})],-1)])])]),default:T(()=>[F(" "+u(t(o)("groupChat.deleteRoomConfirm")),1)]),_:1},8,["onPositiveClick"])],10,xt))),128)),t(s).rooms.length===0?(g(),f("div",$t,u(t(o)("groupChat.noRooms")),1)):U("",!0)])])):U("",!0),e("div",St,[e("div",Nt,[e("button",{class:"icon-btn",onClick:oe},[...a[24]||(a[24]=[e("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[e("rect",{x:"3",y:"3",width:"18",height:"18",rx:"2",ry:"2"}),e("line",{x1:"9",y1:"3",x2:"9",y2:"21"})],-1)])]),e("span",Ht,u(t(s).roomName||t(s).currentRoomId||t(o)("groupChat.title")),1),e("div",Gt,[t(s).agents.length?(g(),fe(t(ua),{key:0,trigger:"click",placement:"bottom-end",width:220},{trigger:T(()=>[e("div",Lt,[e("span",{class:"avatar-stack-item",style:ye({zIndex:t(s).agents.length+1})},[e("span",{class:"agent-avatar",innerHTML:K(t(s).userName||t(s).userId)},null,8,Pt)],4),(g(!0),f(Q,null,re(t(s).agents.slice(-4),(d,N)=>(g(),f("span",{key:d.id,class:"avatar-stack-item",style:ye({zIndex:t(s).agents.length-N})},[e("span",{class:"agent-avatar",innerHTML:K(d.name)},null,8,At)],4))),128)),t(s).agents.length>4?(g(),f("span",Ut,"+"+u(t(s).agents.length-4),1)):U("",!0)])]),default:T(()=>[e("div",Dt,[e("div",Bt,[e("span",{class:"agent-avatar",innerHTML:K(t(s).userName||t(s).userId)},null,8,jt),e("div",Ft,[e("span",zt,u(t(s).userName||"You"),1),e("span",Et,u(t(o)("groupChat.you")),1)])]),e("div",Vt,u(t(o)("groupChat.agents"))+" ("+u(t(s).agents.length)+")",1),(g(!0),f(Q,null,re(t(s).agents,d=>(g(),f("div",{key:d.id,class:"agent-popover-item"},[e("span",{class:"agent-avatar",innerHTML:K(d.name)},null,8,Ot),e("div",Kt,[e("span",Yt,u(d.name),1),e("span",qt,u(d.profile),1)]),e("button",{class:"agent-popover-remove",onClick:N=>c(d.id)},[...a[25]||(a[25]=[e("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e("line",{x1:"6",y1:"6",x2:"18",y2:"18"})],-1)])],8,Jt)]))),128))])]),_:1})):t(s).userName?(g(),f("div",Wt,[e("span",Qt,[e("span",{class:"agent-avatar",innerHTML:K(t(s).userName||t(s).userId)},null,8,Xt)])])):U("",!0),e("button",{class:"icon-btn",title:t(o)("groupChat.addAgent"),onClick:m},[...a[26]||(a[26]=[e("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5"},[e("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),e("line",{x1:"5",y1:"12",x2:"19",y2:"12"})],-1)])],8,Zt),e("button",{class:"icon-btn",title:t(o)("groupChat.compressionConfig"),onClick:G},[...a[27]||(a[27]=[e("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5"},[e("circle",{cx:"12",cy:"12",r:"3"}),e("path",{d:"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06A1.65 1.65 0 0 0 4.68 15a1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06A1.65 1.65 0 0 0 9 4.68a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06A1.65 1.65 0 0 0 19.4 4.6a1.65 1.65 0 0 0 1.51 1V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1.51 1z"})],-1)])],8,eo),_(t(Te),{onPositiveClick:se},{trigger:T(()=>[e("button",{class:"icon-btn",title:t(o)("groupChat.clearContext")},[...a[28]||(a[28]=[e("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5"},[e("path",{d:"M3 6h18"}),e("path",{d:"M8 6V4h8v2"}),e("path",{d:"M19 6l-1 14H6L5 6"}),e("path",{d:"M10 11v5"}),e("path",{d:"M14 11v5"})],-1)])],8,to)]),default:T(()=>[F(" "+u(t(o)("groupChat.clearContextConfirm")),1)]),_:1}),t(s).members.length?(g(),f("span",oo,u(t(s).members.length)+" "+u(t(o)("groupChat.members")),1)):U("",!0),e("span",{class:X(["connection-dot",{connected:t(s).connected,disconnected:!t(s).connected}])},null,2)])]),q.value?(g(),f(Q,{key:0},[_(Qo,{ref_key:"messageListRef",ref:$},null,512),t(s).contextStatuses.size>0||t(s).typingText&&t(s).contextStatuses.size===0?(g(),f("div",ao,[t(s).contextStatuses.size>0?(g(),f("div",no,[(g(!0),f(Q,null,re(t(s).contextStatuses,([d,N])=>(g(),f("div",{key:d,class:"context-status"},[a[29]||(a[29]=e("span",{class:"typing-dots"},[e("span"),e("span"),e("span")],-1)),N.status==="compressing"?(g(),f("span",so," @"+u(N.agentName)+" "+u(t(o)("groupChat.agentCompressing")),1)):(g(),f("span",ro," @"+u(N.agentName)+" "+u(t(o)("groupChat.agentReplying")),1))]))),128))])):t(s).typingText?(g(),f("div",lo,[a[30]||(a[30]=e("span",{class:"typing-dots"},[e("span"),e("span"),e("span")],-1)),F(" "+u(t(s).typingText),1)])):U("",!0)])):U("",!0),_(Zo,{onSend:ve})],64)):(g(),f("div",io,[a[31]||(a[31]=e("div",{class:"no-room-icon"},[e("svg",{width:"48",height:"48",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1","stroke-linecap":"round","stroke-linejoin":"round"},[e("path",{d:"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"})])],-1)),e("p",null,u(t(o)("groupChat.selectOrCreate")),1)]))]),(g(),fe(Me,{to:"body"},[R.value?(g(),f("div",{key:0,class:"modal-backdrop",onClick:a[4]||(a[4]=W(d=>R.value=!1,["self"]))},[e("div",uo,[e("h3",null,u(t(o)("groupChat.createRoom")),1),_(be,{onSubmit:ne,onCancel:a[3]||(a[3]=d=>R.value=!1)})])])):U("",!0)])),(g(),fe(Me,{to:"body"},[C.value?(g(),f("div",{key:0,class:"modal-backdrop",onClick:a[9]||(a[9]=W(d=>C.value=!1,["self"]))},[e("div",co,[e("h3",null,u(t(o)("groupChat.addAgent")),1),e("div",mo,[_(t(ca),{value:P.value,"onUpdate:value":a[5]||(a[5]=d=>P.value=d),options:z.value,placeholder:t(o)("groupChat.selectProfile"),filterable:""},null,8,["value","options","placeholder"])]),e("div",vo,[e("label",po,u(t(o)("groupChat.agentName")),1),_(t(Y),{value:H.value,"onUpdate:value":a[6]||(a[6]=d=>H.value=d),placeholder:t(o)("groupChat.agentNamePlaceholder")},null,8,["value","placeholder"])]),e("div",go,[e("label",_o,u(t(o)("groupChat.agentDesc")),1),_(t(Y),{value:k.value,"onUpdate:value":a[7]||(a[7]=d=>k.value=d),type:"textarea",rows:2,placeholder:t(o)("groupChat.agentDescPlaceholder")},null,8,["value","placeholder"])]),e("div",ho,[_(t(he),{justify:"end"},{default:T(()=>[_(t(E),{onClick:a[8]||(a[8]=d=>C.value=!1)},{default:T(()=>[F(u(t(o)("common.cancel")),1)]),_:1}),_(t(E),{type:"primary",disabled:!P.value,onClick:w},{default:T(()=>[F(u(t(o)("common.add")),1)]),_:1},8,["disabled"])]),_:1})])])])):U("",!0),S.value?(g(),f("div",{key:1,class:"modal-backdrop",onClick:a[14]||(a[14]=W(d=>S.value=!1,["self"]))},[e("div",fo,[e("h3",null,u(t(o)("groupChat.cloneRoom")),1),e("div",yo,[e("label",Co,u(t(o)("groupChat.roomName")),1),_(t(Y),{value:j.value,"onUpdate:value":a[10]||(a[10]=d=>j.value=d),placeholder:t(o)("groupChat.roomNamePlaceholder"),onKeyup:Ce(J,["enter"])},null,8,["value","placeholder"])]),e("div",ko,[e("label",wo,u(t(o)("groupChat.inviteCode")),1),e("div",xo,[_(t(Y),{value:B.value,"onUpdate:value":a[11]||(a[11]=d=>B.value=d),placeholder:t(o)("groupChat.autoGenerate"),onKeyup:Ce(J,["enter"])},null,8,["value","placeholder"]),_(t(E),{size:"small",onClick:a[12]||(a[12]=d=>B.value=ae())},{default:T(()=>[...a[32]||(a[32]=[e("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[e("polyline",{points:"23 4 23 10 17 10"}),e("path",{d:"M20.49 15a9 9 0 1 1-2.12-9.36L23 10"})],-1)])]),_:1})])]),e("div",bo,[_(t(he),{justify:"end"},{default:T(()=>[_(t(E),{onClick:a[13]||(a[13]=d=>S.value=!1)},{default:T(()=>[F(u(t(o)("common.cancel")),1)]),_:1}),_(t(E),{type:"primary",disabled:!j.value.trim(),onClick:J},{default:T(()=>[F(u(t(o)("groupChat.cloneRoom")),1)]),_:1},8,["disabled"])]),_:1})])])])):U("",!0),h.value?(g(),f("div",{key:2,class:"modal-backdrop",onClick:a[19]||(a[19]=W(d=>h.value=!1,["self"]))},[e("div",Io,[e("h3",null,u(t(o)("groupChat.compressionConfig")),1),e("div",Mo,[e("label",To,u(t(o)("groupChat.triggerTokens")),1),_(t(le),{value:I.value.triggerTokens,"onUpdate:value":a[15]||(a[15]=d=>I.value.triggerTokens=d),min:1e3,step:1e4,style:{width:"100%"}},null,8,["value"]),e("p",Ro,u(t(o)("groupChat.triggerTokensDesc")),1)]),e("div",$o,[e("label",So,u(t(o)("groupChat.maxHistoryTokens")),1),_(t(le),{value:I.value.maxHistoryTokens,"onUpdate:value":a[16]||(a[16]=d=>I.value.maxHistoryTokens=d),min:1e3,step:1e3,style:{width:"100%"}},null,8,["value"]),e("p",No,u(t(o)("groupChat.maxHistoryTokensDesc")),1)]),e("div",Ho,[e("label",Go,u(t(o)("groupChat.tailMessageCount")),1),_(t(le),{value:I.value.tailMessageCount,"onUpdate:value":a[17]||(a[17]=d=>I.value.tailMessageCount=d),min:1,step:5,style:{width:"100%"}},null,8,["value"]),e("p",Lo,u(t(o)("groupChat.tailMessageCountDesc")),1)]),e("div",Po,[_(t(E),{block:"",disabled:M.value||t(s).contextStatuses.size>0,loading:M.value,onClick:r},{default:T(()=>[F(u(M.value?t(o)("groupChat.compressingInProgress"):t(o)("groupChat.compressNow")),1)]),_:1},8,["disabled","loading"])]),e("div",Ao,[_(t(he),{justify:"end"},{default:T(()=>[_(t(E),{onClick:a[18]||(a[18]=d=>h.value=!1)},{default:T(()=>[F(u(t(o)("common.cancel")),1)]),_:1}),_(t(E),{type:"primary",onClick:n},{default:T(()=>[F(u(t(o)("common.save")),1)]),_:1})]),_:1})])])])):U("",!0)]))]))}})})),Ja=L((()=>{})),oa,Wa=L((()=>{Do(),Do(),Ja(),ie(),oa=ue(ta,[["__scopeId","data-v-872540ef"]])})),Bo,aa,jo=L((()=>{ee(),Wa(),xe(),Bo={class:"group-chat-view"},aa=Z({__name:"GroupChatView",setup(p){const o=ge();return Vo(()=>{o.connect(),o.loadRooms()}),Eo(()=>{o.disconnect()}),(l,s)=>(g(),f("div",Bo,[_(oa)]))}})})),Qa=L((()=>{})),Xa,Za=L((()=>{jo(),jo(),Qa(),ie(),Xa=ue(aa,[["__scopeId","data-v-6a221d32"]])}));Za();export{Xa as default};
|
package/dist/client/assets/js/{HistoryMessageList-Dppp5myU.js → HistoryMessageList-DVoUuNfX.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as c}from"./rolldown-runtime-BKwlnUi0.js";import{Nt as S,Rt as m,St as r,U as B,Vt as L,Z as V,_t as o,ct as x,et as p,it as _,nt as b,pt as n,rt as N,tt as v,yt as w}from"./ui-vendor-CsTMg6zH.js";import{n as C,r as R}from"./vue-vendor-D8zSB7VM.js";import{n as E,t as D}from"./_plugin-vue_export-helper-
|
|
1
|
+
import{n as c}from"./rolldown-runtime-BKwlnUi0.js";import{Nt as S,Rt as m,St as r,U as B,Vt as L,Z as V,_t as o,ct as x,et as p,it as _,nt as b,pt as n,rt as N,tt as v,yt as w}from"./ui-vendor-CsTMg6zH.js";import{n as C,r as R}from"./vue-vendor-D8zSB7VM.js";import{n as E,t as D}from"./_plugin-vue_export-helper-CrLlP_D3.js";import{n as F,t as U,w as Z}from"./index-Bzb-xLYu.js";import{i as $,n as j,r as q,t as z}from"./MessageItem-BhSU5oee.js";var d,h,y=c((()=>{B(),Z(),C(),j(),U(),q(),d={key:0,class:"empty-state"},h=x({__name:"HistoryMessageList",props:{session:{}},setup(M){const T=M,s=F(),{toolTraceVisible:H}=$(),{t:I}=R(),i=S(),a=p(()=>T.session||s.activeSession),k=p(()=>(a.value?.messages||[]).filter(e=>e.role==="tool"?H.value&&!!e.toolName:!!e.content?.trim()));function g(e=200){const t=i.value;return t?t.scrollHeight-t.scrollTop-t.clientHeight<e:!0}function l(){n(()=>{i.value&&(i.value.scrollTop=i.value.scrollHeight)})}function f(e){n(()=>{const t=document.getElementById(`message-${e}`);t&&t.scrollIntoView({block:"center"})})}return r(()=>s.activeSessionId,e=>{if(e){if(s.focusMessageId){n(()=>f(s.focusMessageId));return}n(()=>l())}},{immediate:!0}),r(()=>s.focusMessageId,e=>{e&&f(e)}),r(()=>(a.value?.messages||[])[(a.value?.messages||[]).length-1]?.content,e=>{e&&g()&&l()}),r(()=>(a.value?.messages||[]).length,e=>{e!==0&&g()&&l()}),(e,t)=>(o(),_("div",{ref_key:"listRef",ref:i,class:"message-list"},[!a.value||a.value.messages.length===0?(o(),_("div",d,[t[0]||(t[0]=v("img",{src:"/logo.png",alt:"Hermes",class:"empty-logo"},null,-1)),v("p",null,L(m(I)("chat.emptyState")),1)])):N("",!0),(o(!0),_(V,null,w(k.value,u=>(o(),b(z,{key:u.id,message:u,highlight:m(s).focusMessageId===u.id},null,8,["message","highlight"]))),128))],512))}})})),A=c((()=>{})),G,Y=c((()=>{y(),y(),A(),E(),G=D(h,[["__scopeId","data-v-54a1de4f"]])}));export{Y as n,G as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as V}from"./rolldown-runtime-BKwlnUi0.js";import{E as ye,F as J,Nt as p,Rt as d,St as O,U as ke,Vt as u,Z as S,_t as n,ct as xe,et as w,gt as Ce,ht as be,it as l,nt as z,ot as Ae,rt as h,st as C,t as He,tt as o,wt as b,y as Ie,yt as M,zt as N}from"./ui-vendor-CsTMg6zH.js";import{n as Me,r as Ne}from"./vue-vendor-D8zSB7VM.js";import{d as Ve,n as Be,p as Le,t as Te}from"./_plugin-vue_export-helper-
|
|
1
|
+
import{n as V}from"./rolldown-runtime-BKwlnUi0.js";import{E as ye,F as J,Nt as p,Rt as d,St as O,U as ke,Vt as u,Z as S,_t as n,ct as xe,et as w,gt as Ce,ht as be,it as l,nt as z,ot as Ae,rt as h,st as C,t as He,tt as o,wt as b,y as Ie,yt as M,zt as N}from"./ui-vendor-CsTMg6zH.js";import{n as Me,r as Ne}from"./vue-vendor-D8zSB7VM.js";import{d as Ve,n as Be,p as Le,t as Te}from"./_plugin-vue_export-helper-CrLlP_D3.js";import{n as $e,t as Pe}from"./app-CYaCGxZ_.js";import{_ as Fe,g as Je,n as Oe,t as ze,y as Ee}from"./index-Bzb-xLYu.js";import{n as De,t as qe}from"./session-browser-prefs-HIgWQY8T.js";import{a as Ge,i as E,n as Ue,t as D}from"./SessionListItem-BKe7QBCc.js";import{n as Ke,t as Qe}from"./clipboard-BqPv71We.js";import{n as Re,t as We}from"./HistoryMessageList-DVoUuNfX.js";var q,G,U,K,Q,R,W,Z,j,X,Y,ee,se,te,oe,ie,ae,ne,le,re,ue,de,ce=V((()=>{ke(),ze(),Pe(),Ve(),qe(),He(),Me(),Ge(),Ke(),Re(),Ue(),Ee(),q={class:"history-panel"},G={class:"session-list-header"},U={key:0,class:"session-list-title"},K={class:"session-list-actions"},Q={key:0,class:"session-scope-note"},R={key:1,class:"session-items"},W={key:0,class:"session-loading"},Z={key:1,class:"session-empty"},j={class:"session-group-header session-group-header--static"},X={class:"session-group-label"},Y={class:"session-group-count"},ee=["onClick"],se={class:"session-group-label"},te={class:"session-group-count"},oe={class:"chat-main"},ie={class:"chat-header"},ae={class:"header-left"},ne={class:"header-session-title"},le={key:0,class:"source-badge"},re=["title"],ue={class:"header-actions"},de=xe({__name:"HistoryView",setup(Ye){const ve=Oe(),_e=$e(),pe=Le(),B=De(),A=Ie(),{t:c}=Ne(),f=p([]),y=p(!1),L=p(!1),g=p(null),_=p(null);async function he(){if(!y.value){y.value=!0;try{f.value=await Fe(),L.value=!0}catch(s){console.error("Failed to load Hermes sessions:",s)}finally{y.value=!1}}}const r=p(typeof window>"u"||!window.matchMedia("(max-width: 768px)").matches);let m=null;const fe=p(!1);async function k(s){const e=await Je(s);if(!e){A.error(c("chat.sessionNotFound"));return}const t={id:e.id,title:e.title||"",source:e.source,createdAt:e.started_at*1e3,updatedAt:(e.last_active||e.started_at)*1e3,model:e.model,messageCount:e.message_count,inputTokens:e.input_tokens,outputTokens:e.output_tokens,endedAt:e.ended_at?e.ended_at*1e3:void 0,lastActiveAt:e.last_active?e.last_active*1e3:void 0,workspace:e.workspace||void 0,messages:e.messages.map(i=>{const v={id:String(i.id),sessionId:i.session_id,role:i.role,content:i.content||"",timestamp:i.timestamp*1e3};return i.role==="tool"&&(v.toolName=i.tool_name,v.toolArgs=i.tool_calls?.[0]?.function?.arguments?JSON.stringify(i.tool_calls[0].function.arguments):void 0,v.toolStatus="done"),i.reasoning&&(v.reasoning=i.reasoning),v})};g.value=t.id,_.value=t,m?.matches&&(r.value=!1)}function H(s){fe.value=s.matches,s.matches&&r.value&&(r.value=!1)}be(async()=>{_e.loadModels(),await pe.fetchProfiles(),await he(),m=window.matchMedia("(max-width: 768px)"),H(m),m.addEventListener("change",H)}),Ce(()=>{m?.removeEventListener("change",H)});const a=p(new Set(JSON.parse(localStorage.getItem("hermes_collapsed_groups")||"[]")));function ge(s){return{id:s.id,title:s.title||"",source:s.source,createdAt:s.started_at*1e3,updatedAt:(s.last_active||s.started_at)*1e3,model:s.model,messageCount:s.message_count,inputTokens:s.input_tokens,outputTokens:s.output_tokens,endedAt:s.ended_at?s.ended_at*1e3:void 0,lastActiveAt:s.last_active?s.last_active*1e3:void 0,workspace:s.workspace||void 0,messages:[]}}const T=w(()=>f.value.map(ge));function $(s){return s==="api_server"?-1:s==="cron"?999:0}function P(s){return[...s].sort((e,t)=>(t.updatedAt||0)-(e.updatedAt||0))}const I=w(()=>P(T.value.filter(s=>B.isPinned(s.id)))),x=w(()=>{const s=new Map;for(const e of T.value){if(B.isPinned(e.id))continue;const t=e.source||"";s.has(t)||s.set(t,[]),s.get(t).push(e)}return[...s.keys()].sort((e,t)=>{const i=$(e),v=$(t);return i!==v?i-v:e.localeCompare(t)}).map(e=>({source:e,label:e?E(e):c("chat.other"),sessions:P(s.get(e))}))});function me(s){if(!a.value.has(s))a.value=new Set([...a.value,s]);else{a.value=new Set(x.value.map(t=>t.source).filter(t=>t!==s));const e=x.value.find(t=>t.source===s);e?.sessions.length&&k(e.sessions[0].id)}localStorage.setItem("hermes_collapsed_groups",JSON.stringify([...a.value]))}O(x,s=>{if(localStorage.getItem("hermes_collapsed_groups")!==null){const e=ve.activeSession?.source;e&&a.value.has(e)&&(a.value=new Set([...a.value].filter(t=>t!==e)),localStorage.setItem("hermes_collapsed_groups",JSON.stringify([...a.value])));return}s.length>0&&(a.value=new Set(s.slice(1).map(e=>e.source)),localStorage.setItem("hermes_collapsed_groups",JSON.stringify([...a.value])))},{once:!0}),O(L,s=>{if(s&&f.value.length>0&&(!g.value||!f.value.find(e=>e.id===g.value))){const e=f.value.find(t=>t.source==="cli");e&&(a.value.has(e.source)&&(a.value=new Set([...a.value].filter(t=>t!==e.source))),k(e.id))}},{once:!0});const Se=w(()=>_.value?.title||c("chat.newChat")),F=w(()=>_.value?.source||"");async function we(s){const e=s||g.value;e&&(await Qe(e)?A.success(c("common.copied")):A.error(c("common.copied")+" ✗"))}return(s,e)=>(n(),l("div",q,[o("div",{class:N(["session-backdrop",{active:r.value}]),onClick:e[0]||(e[0]=t=>r.value=!1)},null,2),o("aside",{class:N(["session-list",{collapsed:!r.value}])},[o("div",G,[r.value?(n(),l("span",U,u(d(c)("chat.hermesHistory")),1)):h("",!0),o("div",K,[o("button",{class:"session-close-btn",onClick:e[1]||(e[1]=t=>r.value=!1)},[...e[4]||(e[4]=[o("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[o("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),o("line",{x1:"6",y1:"6",x2:"18",y2:"18"})],-1)])])])]),r.value?(n(),l("div",Q,u(d(c)("chat.historyScopeHint")),1)):h("",!0),r.value?(n(),l("div",R,[y.value&&f.value.length===0?(n(),l("div",W,u(d(c)("common.loading")),1)):f.value.length===0?(n(),l("div",Z,u(d(c)("chat.noSessions")),1)):h("",!0),I.value.length>0?(n(),l(S,{key:2},[o("div",j,[o("span",X,u(d(c)("chat.pinned")),1),o("span",Y,u(I.value.length),1)]),(n(!0),l(S,null,M(I.value,t=>(n(),z(D,{key:`pinned-${t.id}`,session:t,active:t.id===g.value,pinned:!0,"can-delete":!1,streaming:!1,onSelect:i=>k(t.id)},null,8,["session","active","onSelect"]))),128))],64)):h("",!0),(n(!0),l(S,null,M(x.value,t=>(n(),l(S,{key:t.source},[o("div",{class:"session-group-header",onClick:i=>me(t.source)},[(n(),l("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2",class:N(["group-chevron",{collapsed:a.value.has(t.source)}])},[...e[5]||(e[5]=[o("polyline",{points:"9 18 15 12 9 6"},null,-1)])],2)),o("span",se,u(t.label),1),o("span",te,u(t.sessions.length),1)],8,ee),a.value.has(t.source)?h("",!0):(n(!0),l(S,{key:0},M(t.sessions,i=>(n(),z(D,{key:i.id,session:i,active:i.id===g.value,pinned:!1,"can-delete":!1,streaming:!1,onSelect:v=>k(i.id)},null,8,["session","active","onSelect"]))),128))],64))),128))])):h("",!0)],2),o("div",oe,[o("header",ie,[o("div",ae,[C(d(J),{quaternary:"",size:"small",onClick:e[2]||(e[2]=t=>r.value=!r.value),circle:""},{icon:b(()=>[...e[6]||(e[6]=[o("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5"},[o("rect",{x:"3",y:"3",width:"7",height:"7"}),o("rect",{x:"14",y:"3",width:"7",height:"7"}),o("rect",{x:"3",y:"14",width:"7",height:"7"}),o("rect",{x:"14",y:"14",width:"7",height:"7"})],-1)])]),_:1}),o("span",ne,u(Se.value),1),F.value?(n(),l("span",le,u(d(E)(F.value)),1)):h("",!0),_.value?.workspace?(n(),l("span",{key:1,class:"workspace-badge",title:_.value.workspace},"📁 "+u(_.value.workspace.split("/").pop()||_.value.workspace),9,re)):h("",!0)]),o("div",ue,[C(d(ye),{trigger:"hover"},{trigger:b(()=>[C(d(J),{quaternary:"",size:"small",onClick:e[3]||(e[3]=t=>we()),circle:""},{icon:b(()=>[...e[7]||(e[7]=[o("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5"},[o("rect",{x:"9",y:"9",width:"13",height:"13",rx:"2",ry:"2"}),o("path",{d:"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"})],-1)])]),_:1})]),default:b(()=>[Ae(" "+u(d(c)("chat.copySessionId")),1)]),_:1})])]),C(We,{session:_.value},null,8,["session"])])]))}})})),Ze=V((()=>{})),je,Xe=V((()=>{ce(),ce(),Ze(),Be(),je=Te(de,[["__scopeId","data-v-ba15e3dd"]])}));Xe();export{je as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as w}from"./rolldown-runtime-BKwlnUi0.js";import{E as G,F as N,H as lt,M as it,Nt as S,R as Q,Rt as a,S as rt,St as ut,U as q,Vt as r,X as D,Z as U,_t as p,at as dt,ct as z,et as E,f as ct,ht as Le,it as C,j as bt,k as ae,l as ee,m as vt,nt as M,ot as x,p as F,rt as T,st as v,t as X,tt as i,wt as d,y as Ae,yt as We,zt as Y}from"./ui-vendor-CsTMg6zH.js";import{d as _t,n as B,r as O,u as pt}from"./vue-vendor-D8zSB7VM.js";import{c as Ke,l as R,n as L,t as A}from"./_plugin-vue_export-helper-ZIsfSgrY.js";import{o as ft,s as mt}from"./index-JI6E-cKo.js";import{n as yt,t as jt}from"./MarkdownRenderer-CvzCPLnZ.js";function V(e){return e.job}function Xe(e){return typeof e=="object"&&e!==null}function K(e,o=""){if(typeof e=="string")return e;if(!Xe(e))return o;if(e.kind==="cron")return e.expr||e.display||o;if(e.kind==="once")return e.run_at||e.display||o;if(e.kind==="interval")return e.display||(typeof e.minutes=="number"?`every ${e.minutes}m`:o);const t=e;return t.expr||t.run_at||t.display||o}function ht(e,o="—"){if(typeof e=="string")return e;if(!Xe(e))return o;if(e.kind==="cron")return e.expr||e.display||o;if(e.kind==="interval"||e.kind==="once")return e.display||K(e,o);const t=e;return t.display||t.expr||t.run_at||o}function Ze(e){return e&&typeof e=="object"?e.times??null:null}function gt(e,o){const t={},_=K(e.schedule,e.schedule_display||""),n=Ze(e.repeat),c=e.deliver||"origin";return o.name!==e.name&&(t.name=o.name),o.schedule!==_&&(t.schedule=o.schedule),o.prompt!==(e.prompt||"")&&(t.prompt=o.prompt),o.deliver!==c&&(t.deliver=o.deliver),o.repeat_times!==n&&(t.repeat=o.repeat_times),t}async function Jt(){return(await R("/api/hermes/jobs?include_disabled=true")).jobs}async function wt(e){return V(await R(`/api/hermes/jobs/${e}`))}async function kt(e){return V(await R("/api/hermes/jobs",{method:"POST",body:JSON.stringify(e)}))}async function xt(e,o){return V(await R(`/api/hermes/jobs/${e}`,{method:"PATCH",body:JSON.stringify(o)}))}async function $t(e){return R(`/api/hermes/jobs/${e}`,{method:"DELETE"})}async function Ct(e){return V(await R(`/api/hermes/jobs/${e}/pause`,{method:"POST"}))}async function St(e){return V(await R(`/api/hermes/jobs/${e}/resume`,{method:"POST"}))}async function It(e){return V(await R(`/api/hermes/jobs/${e}/run`,{method:"POST"}))}var te=w((()=>{Ke()}));function H(e,o){return e.job_id===o||e.id===o}var W,Z=w((()=>{_t(),q(),te(),W=pt("jobs",()=>{const e=S([]),o=S(!1);async function t(){o.value=!0;try{e.value=await Jt()}catch(u){console.error("Failed to fetch jobs:",u)}finally{o.value=!1}}async function _(u){const s=await kt(u);return e.value.unshift(s),s}async function n(u,s){const y=await xt(u,s),l=e.value.findIndex(k=>H(k,u));return l!==-1&&(e.value[l]=y),y}async function c(u){await $t(u),e.value=e.value.filter(s=>!H(s,u))}async function j(u){const s=await Ct(u),y=e.value.findIndex(l=>H(l,u));y!==-1&&(e.value[y]=s)}async function b(u){const s=await St(u),y=e.value.findIndex(l=>H(l,u));y!==-1&&(e.value[y]=s)}async function $(u){const s=await It(u),y=e.value.findIndex(l=>H(l,u));y!==-1&&(e.value[y]=s)}return{jobs:e,loading:o,fetchJobs:t,createJob:_,updateJob:n,deleteJob:c,pauseJob:j,resumeJob:b,runJob:$}})})),oe,se,ne,le,ie,re,ue,de,ce,be,ve,_e,pe,fe,me,ye,je,he,ge,Je,we,ke,Ge,xe=w((()=>{q(),X(),te(),Z(),B(),oe={class:"card-header"},se={class:"job-name"},ne={class:"card-body"},le={class:"info-row"},ie={class:"info-label"},re={class:"info-value mono"},ue={class:"info-row"},de={class:"info-label"},ce={class:"info-value mono"},be={class:"info-row"},ve={class:"info-label"},_e={class:"info-value"},pe={class:"info-row"},fe={class:"info-label"},me={class:"info-value"},ye={class:"info-row"},je={class:"info-label"},he={class:"info-value"},ge={key:0,class:"info-row"},Je={class:"info-label"},we={class:"info-value"},ke={class:"card-actions"},Ge=z({__name:"JobCard",props:{job:{},selected:{type:Boolean}},emits:["edit","select"],setup(e,{emit:o}){const t=e,_=o,{t:n}=O(),c=W(),j=Ae(),b=E(()=>t.job.job_id||t.job.id),$=E(()=>t.job.state==="running"?n("jobs.status.running"):t.job.state==="paused"?n("jobs.status.paused"):t.job.enabled?n("jobs.status.scheduled"):n("jobs.status.disabled")),u=E(()=>t.job.state==="running"?"info":t.job.state==="paused"?"warning":t.job.enabled?"success":"error"),s=E(()=>ht(t.job.schedule,t.job.schedule_display||"—")),y=g=>g?new Date(g).toLocaleString():"—";async function l(){try{await c.pauseJob(b.value),j.success(n("jobs.jobPaused"))}catch(g){j.error(g.message)}}async function k(){try{await c.resumeJob(b.value),j.success(n("jobs.jobResumed"))}catch(g){j.error(g.message)}}async function h(){try{await c.runJob(b.value),j.info(n("jobs.jobTriggered"))}catch(g){j.error(g.message)}}async function I(){try{await c.deleteJob(b.value),j.success(n("jobs.jobDeleted"))}catch(g){j.error(g.message)}}function P(g){g.target.closest(".card-actions")||_("select",b.value)}return(g,f)=>(p(),C("div",{class:Y(["job-card",{selected:e.selected}]),onClick:P},[i("div",oe,[i("h3",se,r(e.job.name),1),i("span",{class:Y(["status-badge",u.value])},r($.value),3)]),i("div",ne,[i("div",le,[i("span",ie,r(a(n)("jobs.info.schedule")),1),i("code",re,r(s.value),1)]),i("div",ue,[i("span",de,r(a(n)("jobs.info.model")),1),i("span",ce,r(e.job.model||"—"),1)]),i("div",be,[i("span",ve,r(a(n)("jobs.info.lastRun")),1),i("span",_e,[x(r(y(e.job.last_run_at))+" ",1),e.job.last_status?(p(),C("span",{key:0,class:Y(["run-status",{ok:e.job.last_status==="ok",err:e.job.last_status!=="ok"}])},r(e.job.last_status==="ok"?a(n)("common.ok"):e.job.last_status),3)):T("",!0)])]),i("div",pe,[i("span",fe,r(a(n)("jobs.info.nextRun")),1),i("span",me,r(y(e.job.next_run_at)),1)]),i("div",ye,[i("span",je,r(a(n)("jobs.info.deliver")),1),i("span",he,[x(r(e.job.deliver),1),e.job.origin?(p(),C(U,{key:0},[x(" ("+r(e.job.origin.platform)+")",1)],64)):T("",!0)])]),e.job.repeat?(p(),C("div",ge,[i("span",Je,r(a(n)("jobs.info.repeat")),1),i("span",we,[typeof e.job.repeat=="string"?(p(),C(U,{key:0},[x(r(e.job.repeat),1)],64)):(p(),C(U,{key:1},[x(r(e.job.repeat.completed)+" / "+r(e.job.repeat.times??"∞"),1)],64))])])):T("",!0)]),i("div",ke,[e.job.state!=="paused"&&e.job.enabled?(p(),M(a(G),{key:0},{trigger:d(()=>[v(a(N),{size:"tiny",quaternary:"",onClick:D(l,["stop"])},{default:d(()=>[x(r(a(n)("jobs.action.pause")),1)]),_:1})]),default:d(()=>[x(" "+r(a(n)("jobs.action.pauseJob")),1)]),_:1})):e.job.state==="paused"?(p(),M(a(G),{key:1},{trigger:d(()=>[v(a(N),{size:"tiny",quaternary:"",onClick:D(k,["stop"])},{default:d(()=>[x(r(a(n)("jobs.action.resume")),1)]),_:1})]),default:d(()=>[x(" "+r(a(n)("jobs.action.resumeJob")),1)]),_:1})):T("",!0),v(a(G),null,{trigger:d(()=>[v(a(N),{size:"tiny",quaternary:"",onClick:D(h,["stop"])},{default:d(()=>[x(r(a(n)("jobs.action.runNow")),1)]),_:1})]),default:d(()=>[x(" "+r(a(n)("jobs.action.triggerImmediately")),1)]),_:1}),v(a(N),{size:"tiny",quaternary:"",onClick:f[0]||(f[0]=D(m=>_("edit",b.value),["stop"]))},{default:d(()=>[x(r(a(n)("common.edit")),1)]),_:1}),v(a(N),{size:"tiny",quaternary:"",type:"error",onClick:D(I,["stop"])},{default:d(()=>[x(r(a(n)("common.delete")),1)]),_:1})])],2))}})})),Mt=w((()=>{})),Qe,Rt=w((()=>{xe(),xe(),Mt(),L(),Qe=A(Ge,[["__scopeId","data-v-54aca7fb"]])})),$e,Ce,Ye,Se=w((()=>{q(),Rt(),Z(),B(),$e={key:0,class:"empty-state"},Ce={key:1,class:"jobs-grid"},Ye=z({__name:"JobsPanel",props:{selectedJobId:{}},emits:["edit","select"],setup(e,{emit:o}){const t=e,_=o,{t:n}=O(),c=W();function j($){_("select",t.selectedJobId===$?null:$)}function b(){t.selectedJobId&&_("select",null)}return($,u)=>(p(),C(U,null,[a(c).jobs.length===0?(p(),C("div",$e,[u[0]||(u[0]=dt('<svg width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" class="empty-icon" data-v-bfc747c9><rect x="3" y="4" width="18" height="18" rx="2" ry="2" data-v-bfc747c9></rect><line x1="16" y1="2" x2="16" y2="6" data-v-bfc747c9></line><line x1="8" y1="2" x2="8" y2="6" data-v-bfc747c9></line><line x1="3" y1="10" x2="21" y2="10" data-v-bfc747c9></line></svg>',1)),i("p",null,r(a(n)("jobs.noJobs")),1)])):(p(),C("div",Ce,[(p(!0),C(U,null,We(a(c).jobs,s=>(p(),M(Qe,{key:s.id,job:s,selected:e.selectedJobId===(s.job_id||s.id),onEdit:y=>_("edit",s.id),onSelect:j},null,8,["job","selected","onEdit"]))),128))])),e.selectedJobId?(p(),C("div",{key:2,class:"deselect-overlay",onClick:b})):T("",!0)],64))}})})),Et=w((()=>{})),et,Nt=w((()=>{Se(),Se(),Et(),L(),et=A(Ye,[["__scopeId","data-v-bfc747c9"]])}));async function Pt(e){const o=new URLSearchParams;e&&o.set("jobId",e);const t=o.toString();return(await R(`/api/cron-history${t?`?${t}`:""}`)).runs}async function Tt(e,o){return R(`/api/cron-history/${encodeURIComponent(e)}/${encodeURIComponent(o)}`)}var Ft=w((()=>{Ke()})),Ie,Me,Re,Ee,Ne,Pe,tt,Te=w((()=>{q(),X(),B(),Ft(),yt(),Ie={class:"run-history"},Me={class:"history-header"},Re={class:"history-title"},Ee={class:"history-count"},Ne={class:"history-body"},Pe={class:"run-meta"},tt=z({__name:"JobRunHistory",props:{selectedJobId:{},jobNameMap:{}},setup(e){const o=e,{t}=O(),_=S(!1),n=S([]),c=S({}),j=S({}),b=E(()=>o.selectedJobId?n.value.filter(l=>l.jobId===o.selectedJobId):n.value);async function $(){_.value=!0;try{n.value=await Pt(o.selectedJobId??void 0)}catch(l){console.error("Failed to fetch cron runs:",l),n.value=[]}finally{_.value=!1}}async function u(l){const k=Array.isArray(l)?l:l!=null?[l]:[];for(const h of k){const I=String(h);if(c.value[I]||j.value[I])continue;const P=b.value.find(g=>`${g.jobId}/${g.fileName}`===I);if(P){j.value[I]=!0;try{const g=await Tt(P.jobId,P.fileName);c.value[I]=g.content}catch{c.value[I]="[Error loading content]"}finally{j.value[I]=!1}}}}function s(l){return l<1024?`${l}B`:l<1024*1024?`${(l/1024).toFixed(1)}KB`:`${(l/1024/1024).toFixed(1)}MB`}function y(l){return o.jobNameMap[l]||l}return ut(()=>o.selectedJobId,()=>{c.value={},$()},{immediate:!0}),(l,k)=>(p(),C("div",Ie,[i("div",Me,[i("span",Re,r(a(t)("jobs.runHistory.title")),1),i("span",Ee,r(b.value.length)+" "+r(a(t)("jobs.runHistory.runs")),1)]),i("div",Ne,[v(a(ee),{show:_.value},{default:d(()=>[!_.value&&b.value.length===0?(p(),M(a(lt),{key:0,description:a(t)("jobs.runHistory.noRuns")},null,8,["description"])):(p(),M(a(it),{key:1,accordion:"","onUpdate:expandedNames":u},{default:d(()=>[(p(!0),C(U,null,We(b.value,h=>(p(),M(a(bt),{key:`${h.jobId}/${h.fileName}`,title:`${y(h.jobId)} — ${h.runTime}`,name:`${h.jobId}/${h.fileName}`},{"header-extra":d(()=>[i("span",Pe,r(s(h.size)),1)]),default:d(()=>[j.value[`${h.jobId}/${h.fileName}`]?(p(),M(a(ee),{key:0,size:"small"})):c.value[`${h.jobId}/${h.fileName}`]?(p(),M(jt,{key:1,content:c.value[`${h.jobId}/${h.fileName}`]},null,8,["content"])):T("",!0)]),_:2},1032,["title","name"]))),128))]),_:1}))]),_:1},8,["show"])])]))}})})),Ut=w((()=>{})),at,qt=w((()=>{Te(),Te(),Ut(),L(),at=A(tt,[["__scopeId","data-v-c6178305"]])})),Fe,ot,Ue=w((()=>{q(),X(),Z(),ft(),te(),B(),Fe={class:"modal-footer"},ot=z({__name:"JobFormModal",props:{jobId:{}},emits:["close","saved"],setup(e,{emit:o}){const{t}=O(),_=e,n=o,c=W(),j=mt(),b=Ae(),$=S(!0),u=S(!1),s=S({name:"",schedule:"",prompt:"",deliver:"origin",repeat_times:null}),y=S(null),l=E(()=>!!_.jobId),k=E(()=>[{label:t("jobs.presetEveryMinute"),value:"* * * * *"},{label:t("jobs.presetEvery5Min"),value:"*/5 * * * *"},{label:t("jobs.presetEveryHour"),value:"0 * * * *"},{label:t("jobs.presetEveryDay"),value:"0 0 * * *"},{label:t("jobs.presetEveryDay9"),value:"0 9 * * *"},{label:t("jobs.presetEveryMonday"),value:"0 9 * * 1"},{label:t("jobs.presetEveryMonth"),value:"0 9 1 * *"}]),h=E(()=>{const f=[{label:t("jobs.origin"),value:"origin"},{label:t("jobs.local"),value:"local"}];for(const m of[{key:"telegram",label:"Telegram"},{key:"discord",label:"Discord"},{key:"slack",label:"Slack"},{key:"whatsapp",label:"WhatsApp"},{key:"matrix",label:"Matrix"},{key:"weixin",label:"WeChat"},{key:"wecom",label:"WeCom"},{key:"feishu",label:"Feishu"},{key:"dingtalk",label:"DingTalk"}]){const J=j.platforms[m.key]||{};Object.keys(J).length>0&&f.push({label:m.label,value:m.key})}return f}),I=S(null);Le(async()=>{if(_.jobId)try{const f=await wt(_.jobId);I.value=f,s.value={name:f.name,schedule:K(f.schedule,f.schedule_display||""),prompt:f.prompt,deliver:f.deliver||"origin",repeat_times:Ze(f.repeat)}}catch(f){b.error(t("jobs.loadFailed")+": "+f.message)}});async function P(){if(!s.value.name.trim()){b.warning(t("jobs.nameRequired"));return}if(!s.value.schedule.trim()){b.warning(t("jobs.scheduleRequired"));return}u.value=!0;try{if(l.value){if(!I.value){b.error(t("jobs.loadFailed"));return}const f=gt(I.value,s.value);if(Object.keys(f).length===0){b.success(t("jobs.jobUpdated")),n("saved");return}await c.updateJob(_.jobId,f),b.success(t("jobs.jobUpdated"))}else{const f={name:s.value.name,schedule:s.value.schedule,prompt:s.value.prompt,deliver:s.value.deliver,repeat:s.value.repeat_times??void 0};await c.createJob(f),b.success(t("jobs.jobCreated"))}n("saved")}catch(f){b.error(f.message)}finally{u.value=!1}}function g(){$.value=!1,setTimeout(()=>n("close"),200)}return(f,m)=>(p(),M(a(rt),{show:$.value,"onUpdate:show":m[7]||(m[7]=J=>$.value=J),preset:"card",title:l.value?a(t)("jobs.editJob"):a(t)("jobs.createJob"),style:{width:"min(520px, calc(100vw - 32px))"},"mask-closable":!u.value,onAfterLeave:m[8]||(m[8]=J=>n("close"))},{footer:d(()=>[i("div",Fe,[v(a(N),{onClick:g},{default:d(()=>[x(r(a(t)("common.cancel")),1)]),_:1}),v(a(N),{type:"primary",loading:u.value,onClick:P},{default:d(()=>[x(r(l.value?a(t)("common.update"):a(t)("common.create")),1)]),_:1},8,["loading"])])]),default:d(()=>[v(a(vt),{"label-placement":"top"},{default:d(()=>[v(a(F),{label:a(t)("jobs.name"),required:""},{default:d(()=>[v(a(Q),{value:s.value.name,"onUpdate:value":m[0]||(m[0]=J=>s.value.name=J),placeholder:a(t)("jobs.namePlaceholder"),maxlength:"200","show-count":""},null,8,["value","placeholder"])]),_:1},8,["label"]),v(a(F),{label:a(t)("jobs.schedule"),required:""},{default:d(()=>[v(a(Q),{value:s.value.schedule,"onUpdate:value":m[1]||(m[1]=J=>s.value.schedule=J),placeholder:a(t)("jobs.schedulePlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),v(a(F),{label:a(t)("jobs.quickPresets")},{default:d(()=>[v(a(ae),{value:y.value,"onUpdate:value":[m[2]||(m[2]=J=>y.value=J),m[3]||(m[3]=J=>s.value.schedule=J)],options:k.value,placeholder:a(t)("jobs.selectPreset")},null,8,["value","options","placeholder"])]),_:1},8,["label"]),v(a(F),{label:a(t)("jobs.prompt"),required:""},{default:d(()=>[v(a(Q),{value:s.value.prompt,"onUpdate:value":m[4]||(m[4]=J=>s.value.prompt=J),type:"textarea",placeholder:a(t)("jobs.promptPlaceholder"),rows:4,maxlength:"5000","show-count":""},null,8,["value","placeholder"])]),_:1},8,["label"]),v(a(F),{label:a(t)("jobs.deliverTarget")},{default:d(()=>[v(a(ae),{value:s.value.deliver,"onUpdate:value":m[5]||(m[5]=J=>s.value.deliver=J),options:h.value},null,8,["value","options"])]),_:1},8,["label"]),v(a(F),{label:a(t)("jobs.repeatCount")},{default:d(()=>[v(a(ct),{value:s.value.repeat_times,"onUpdate:value":m[6]||(m[6]=J=>s.value.repeat_times=J),min:1,placeholder:a(t)("jobs.repeatPlaceholder"),clearable:"",style:{width:"100%"}},null,8,["value","placeholder"])]),_:1},8,["label"])]),_:1})]),_:1},8,["show","title","mask-closable"]))}})})),Vt=w((()=>{})),st,Dt=w((()=>{Ue(),Ue(),Vt(),L(),st=A(ot,[["__scopeId","data-v-03ec4c1d"]])})),qe,Ve,De,He,ze,Be,nt,Oe=w((()=>{q(),X(),B(),Nt(),qt(),Dt(),Z(),qe={class:"jobs-view"},Ve={class:"page-header"},De={class:"header-title"},He={class:"jobs-split"},ze={class:"jobs-top"},Be={class:"jobs-bottom"},nt=z({__name:"JobsView",setup(e){const{t:o}=O(),t=W(),_=S(!1),n=S(null),c=S(null),j=E(()=>{const l={};for(const k of t.jobs){const h=k.job_id||k.id;l[h]=k.name}return l});Le(()=>{t.fetchJobs()});function b(){n.value=null,_.value=!0}function $(l){n.value=l,_.value=!0}function u(){_.value=!1,n.value=null}async function s(){await t.fetchJobs(),u()}function y(l){c.value=c.value===l?null:l}return(l,k)=>(p(),C("div",qe,[i("header",Ve,[i("h2",De,r(a(o)("jobs.title")),1),v(a(N),{type:"primary",size:"small",onClick:b},{icon:d(()=>[...k[0]||(k[0]=[i("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[i("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),i("line",{x1:"5",y1:"12",x2:"19",y2:"12"})],-1)])]),default:d(()=>[x(" "+r(a(o)("jobs.createJob")),1)]),_:1})]),i("div",He,[i("div",ze,[v(a(ee),{show:a(t).loading&&a(t).jobs.length===0},{default:d(()=>[v(et,{"selected-job-id":c.value,onEdit:$,onSelect:y},null,8,["selected-job-id"])]),_:1},8,["show"])]),k[1]||(k[1]=i("div",{class:"splitter"},null,-1)),i("div",Be,[v(at,{"selected-job-id":c.value,"job-name-map":j.value},null,8,["selected-job-id","job-name-map"])])]),_.value?(p(),M(st,{key:0,"job-id":n.value,onClose:u,onSaved:s},null,8,["job-id"])):T("",!0)]))}})})),Ht=w((()=>{})),zt,Bt=w((()=>{Oe(),Oe(),Ht(),L(),zt=A(nt,[["__scopeId","data-v-db769f38"]])}));Bt();export{zt as default};
|
|
1
|
+
import{n as w}from"./rolldown-runtime-BKwlnUi0.js";import{E as G,F as N,H as lt,M as it,Nt as S,R as Q,Rt as a,S as rt,St as ut,U as q,Vt as r,X as D,Z as U,_t as p,at as dt,ct as z,et as E,f as ct,ht as Le,it as C,j as bt,k as ae,l as ee,m as vt,nt as M,ot as x,p as F,rt as T,st as v,t as X,tt as i,wt as d,y as Ae,yt as We,zt as Y}from"./ui-vendor-CsTMg6zH.js";import{d as _t,n as B,r as O,u as pt}from"./vue-vendor-D8zSB7VM.js";import{c as Ke,l as R,n as L,t as A}from"./_plugin-vue_export-helper-CrLlP_D3.js";import{o as ft,s as mt}from"./index-Bzb-xLYu.js";import{n as yt,t as jt}from"./MarkdownRenderer-BCFoS7DH.js";function V(e){return e.job}function Xe(e){return typeof e=="object"&&e!==null}function K(e,o=""){if(typeof e=="string")return e;if(!Xe(e))return o;if(e.kind==="cron")return e.expr||e.display||o;if(e.kind==="once")return e.run_at||e.display||o;if(e.kind==="interval")return e.display||(typeof e.minutes=="number"?`every ${e.minutes}m`:o);const t=e;return t.expr||t.run_at||t.display||o}function ht(e,o="—"){if(typeof e=="string")return e;if(!Xe(e))return o;if(e.kind==="cron")return e.expr||e.display||o;if(e.kind==="interval"||e.kind==="once")return e.display||K(e,o);const t=e;return t.display||t.expr||t.run_at||o}function Ze(e){return e&&typeof e=="object"?e.times??null:null}function gt(e,o){const t={},_=K(e.schedule,e.schedule_display||""),n=Ze(e.repeat),c=e.deliver||"origin";return o.name!==e.name&&(t.name=o.name),o.schedule!==_&&(t.schedule=o.schedule),o.prompt!==(e.prompt||"")&&(t.prompt=o.prompt),o.deliver!==c&&(t.deliver=o.deliver),o.repeat_times!==n&&(t.repeat=o.repeat_times),t}async function Jt(){return(await R("/api/hermes/jobs?include_disabled=true")).jobs}async function wt(e){return V(await R(`/api/hermes/jobs/${e}`))}async function kt(e){return V(await R("/api/hermes/jobs",{method:"POST",body:JSON.stringify(e)}))}async function xt(e,o){return V(await R(`/api/hermes/jobs/${e}`,{method:"PATCH",body:JSON.stringify(o)}))}async function $t(e){return R(`/api/hermes/jobs/${e}`,{method:"DELETE"})}async function Ct(e){return V(await R(`/api/hermes/jobs/${e}/pause`,{method:"POST"}))}async function St(e){return V(await R(`/api/hermes/jobs/${e}/resume`,{method:"POST"}))}async function It(e){return V(await R(`/api/hermes/jobs/${e}/run`,{method:"POST"}))}var te=w((()=>{Ke()}));function H(e,o){return e.job_id===o||e.id===o}var W,Z=w((()=>{_t(),q(),te(),W=pt("jobs",()=>{const e=S([]),o=S(!1);async function t(){o.value=!0;try{e.value=await Jt()}catch(u){console.error("Failed to fetch jobs:",u)}finally{o.value=!1}}async function _(u){const s=await kt(u);return e.value.unshift(s),s}async function n(u,s){const y=await xt(u,s),l=e.value.findIndex(k=>H(k,u));return l!==-1&&(e.value[l]=y),y}async function c(u){await $t(u),e.value=e.value.filter(s=>!H(s,u))}async function j(u){const s=await Ct(u),y=e.value.findIndex(l=>H(l,u));y!==-1&&(e.value[y]=s)}async function b(u){const s=await St(u),y=e.value.findIndex(l=>H(l,u));y!==-1&&(e.value[y]=s)}async function $(u){const s=await It(u),y=e.value.findIndex(l=>H(l,u));y!==-1&&(e.value[y]=s)}return{jobs:e,loading:o,fetchJobs:t,createJob:_,updateJob:n,deleteJob:c,pauseJob:j,resumeJob:b,runJob:$}})})),oe,se,ne,le,ie,re,ue,de,ce,be,ve,_e,pe,fe,me,ye,je,he,ge,Je,we,ke,Ge,xe=w((()=>{q(),X(),te(),Z(),B(),oe={class:"card-header"},se={class:"job-name"},ne={class:"card-body"},le={class:"info-row"},ie={class:"info-label"},re={class:"info-value mono"},ue={class:"info-row"},de={class:"info-label"},ce={class:"info-value mono"},be={class:"info-row"},ve={class:"info-label"},_e={class:"info-value"},pe={class:"info-row"},fe={class:"info-label"},me={class:"info-value"},ye={class:"info-row"},je={class:"info-label"},he={class:"info-value"},ge={key:0,class:"info-row"},Je={class:"info-label"},we={class:"info-value"},ke={class:"card-actions"},Ge=z({__name:"JobCard",props:{job:{},selected:{type:Boolean}},emits:["edit","select"],setup(e,{emit:o}){const t=e,_=o,{t:n}=O(),c=W(),j=Ae(),b=E(()=>t.job.job_id||t.job.id),$=E(()=>t.job.state==="running"?n("jobs.status.running"):t.job.state==="paused"?n("jobs.status.paused"):t.job.enabled?n("jobs.status.scheduled"):n("jobs.status.disabled")),u=E(()=>t.job.state==="running"?"info":t.job.state==="paused"?"warning":t.job.enabled?"success":"error"),s=E(()=>ht(t.job.schedule,t.job.schedule_display||"—")),y=g=>g?new Date(g).toLocaleString():"—";async function l(){try{await c.pauseJob(b.value),j.success(n("jobs.jobPaused"))}catch(g){j.error(g.message)}}async function k(){try{await c.resumeJob(b.value),j.success(n("jobs.jobResumed"))}catch(g){j.error(g.message)}}async function h(){try{await c.runJob(b.value),j.info(n("jobs.jobTriggered"))}catch(g){j.error(g.message)}}async function I(){try{await c.deleteJob(b.value),j.success(n("jobs.jobDeleted"))}catch(g){j.error(g.message)}}function P(g){g.target.closest(".card-actions")||_("select",b.value)}return(g,f)=>(p(),C("div",{class:Y(["job-card",{selected:e.selected}]),onClick:P},[i("div",oe,[i("h3",se,r(e.job.name),1),i("span",{class:Y(["status-badge",u.value])},r($.value),3)]),i("div",ne,[i("div",le,[i("span",ie,r(a(n)("jobs.info.schedule")),1),i("code",re,r(s.value),1)]),i("div",ue,[i("span",de,r(a(n)("jobs.info.model")),1),i("span",ce,r(e.job.model||"—"),1)]),i("div",be,[i("span",ve,r(a(n)("jobs.info.lastRun")),1),i("span",_e,[x(r(y(e.job.last_run_at))+" ",1),e.job.last_status?(p(),C("span",{key:0,class:Y(["run-status",{ok:e.job.last_status==="ok",err:e.job.last_status!=="ok"}])},r(e.job.last_status==="ok"?a(n)("common.ok"):e.job.last_status),3)):T("",!0)])]),i("div",pe,[i("span",fe,r(a(n)("jobs.info.nextRun")),1),i("span",me,r(y(e.job.next_run_at)),1)]),i("div",ye,[i("span",je,r(a(n)("jobs.info.deliver")),1),i("span",he,[x(r(e.job.deliver),1),e.job.origin?(p(),C(U,{key:0},[x(" ("+r(e.job.origin.platform)+")",1)],64)):T("",!0)])]),e.job.repeat?(p(),C("div",ge,[i("span",Je,r(a(n)("jobs.info.repeat")),1),i("span",we,[typeof e.job.repeat=="string"?(p(),C(U,{key:0},[x(r(e.job.repeat),1)],64)):(p(),C(U,{key:1},[x(r(e.job.repeat.completed)+" / "+r(e.job.repeat.times??"∞"),1)],64))])])):T("",!0)]),i("div",ke,[e.job.state!=="paused"&&e.job.enabled?(p(),M(a(G),{key:0},{trigger:d(()=>[v(a(N),{size:"tiny",quaternary:"",onClick:D(l,["stop"])},{default:d(()=>[x(r(a(n)("jobs.action.pause")),1)]),_:1})]),default:d(()=>[x(" "+r(a(n)("jobs.action.pauseJob")),1)]),_:1})):e.job.state==="paused"?(p(),M(a(G),{key:1},{trigger:d(()=>[v(a(N),{size:"tiny",quaternary:"",onClick:D(k,["stop"])},{default:d(()=>[x(r(a(n)("jobs.action.resume")),1)]),_:1})]),default:d(()=>[x(" "+r(a(n)("jobs.action.resumeJob")),1)]),_:1})):T("",!0),v(a(G),null,{trigger:d(()=>[v(a(N),{size:"tiny",quaternary:"",onClick:D(h,["stop"])},{default:d(()=>[x(r(a(n)("jobs.action.runNow")),1)]),_:1})]),default:d(()=>[x(" "+r(a(n)("jobs.action.triggerImmediately")),1)]),_:1}),v(a(N),{size:"tiny",quaternary:"",onClick:f[0]||(f[0]=D(m=>_("edit",b.value),["stop"]))},{default:d(()=>[x(r(a(n)("common.edit")),1)]),_:1}),v(a(N),{size:"tiny",quaternary:"",type:"error",onClick:D(I,["stop"])},{default:d(()=>[x(r(a(n)("common.delete")),1)]),_:1})])],2))}})})),Mt=w((()=>{})),Qe,Rt=w((()=>{xe(),xe(),Mt(),L(),Qe=A(Ge,[["__scopeId","data-v-54aca7fb"]])})),$e,Ce,Ye,Se=w((()=>{q(),Rt(),Z(),B(),$e={key:0,class:"empty-state"},Ce={key:1,class:"jobs-grid"},Ye=z({__name:"JobsPanel",props:{selectedJobId:{}},emits:["edit","select"],setup(e,{emit:o}){const t=e,_=o,{t:n}=O(),c=W();function j($){_("select",t.selectedJobId===$?null:$)}function b(){t.selectedJobId&&_("select",null)}return($,u)=>(p(),C(U,null,[a(c).jobs.length===0?(p(),C("div",$e,[u[0]||(u[0]=dt('<svg width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" class="empty-icon" data-v-bfc747c9><rect x="3" y="4" width="18" height="18" rx="2" ry="2" data-v-bfc747c9></rect><line x1="16" y1="2" x2="16" y2="6" data-v-bfc747c9></line><line x1="8" y1="2" x2="8" y2="6" data-v-bfc747c9></line><line x1="3" y1="10" x2="21" y2="10" data-v-bfc747c9></line></svg>',1)),i("p",null,r(a(n)("jobs.noJobs")),1)])):(p(),C("div",Ce,[(p(!0),C(U,null,We(a(c).jobs,s=>(p(),M(Qe,{key:s.id,job:s,selected:e.selectedJobId===(s.job_id||s.id),onEdit:y=>_("edit",s.id),onSelect:j},null,8,["job","selected","onEdit"]))),128))])),e.selectedJobId?(p(),C("div",{key:2,class:"deselect-overlay",onClick:b})):T("",!0)],64))}})})),Et=w((()=>{})),et,Nt=w((()=>{Se(),Se(),Et(),L(),et=A(Ye,[["__scopeId","data-v-bfc747c9"]])}));async function Pt(e){const o=new URLSearchParams;e&&o.set("jobId",e);const t=o.toString();return(await R(`/api/cron-history${t?`?${t}`:""}`)).runs}async function Tt(e,o){return R(`/api/cron-history/${encodeURIComponent(e)}/${encodeURIComponent(o)}`)}var Ft=w((()=>{Ke()})),Ie,Me,Re,Ee,Ne,Pe,tt,Te=w((()=>{q(),X(),B(),Ft(),yt(),Ie={class:"run-history"},Me={class:"history-header"},Re={class:"history-title"},Ee={class:"history-count"},Ne={class:"history-body"},Pe={class:"run-meta"},tt=z({__name:"JobRunHistory",props:{selectedJobId:{},jobNameMap:{}},setup(e){const o=e,{t}=O(),_=S(!1),n=S([]),c=S({}),j=S({}),b=E(()=>o.selectedJobId?n.value.filter(l=>l.jobId===o.selectedJobId):n.value);async function $(){_.value=!0;try{n.value=await Pt(o.selectedJobId??void 0)}catch(l){console.error("Failed to fetch cron runs:",l),n.value=[]}finally{_.value=!1}}async function u(l){const k=Array.isArray(l)?l:l!=null?[l]:[];for(const h of k){const I=String(h);if(c.value[I]||j.value[I])continue;const P=b.value.find(g=>`${g.jobId}/${g.fileName}`===I);if(P){j.value[I]=!0;try{const g=await Tt(P.jobId,P.fileName);c.value[I]=g.content}catch{c.value[I]="[Error loading content]"}finally{j.value[I]=!1}}}}function s(l){return l<1024?`${l}B`:l<1024*1024?`${(l/1024).toFixed(1)}KB`:`${(l/1024/1024).toFixed(1)}MB`}function y(l){return o.jobNameMap[l]||l}return ut(()=>o.selectedJobId,()=>{c.value={},$()},{immediate:!0}),(l,k)=>(p(),C("div",Ie,[i("div",Me,[i("span",Re,r(a(t)("jobs.runHistory.title")),1),i("span",Ee,r(b.value.length)+" "+r(a(t)("jobs.runHistory.runs")),1)]),i("div",Ne,[v(a(ee),{show:_.value},{default:d(()=>[!_.value&&b.value.length===0?(p(),M(a(lt),{key:0,description:a(t)("jobs.runHistory.noRuns")},null,8,["description"])):(p(),M(a(it),{key:1,accordion:"","onUpdate:expandedNames":u},{default:d(()=>[(p(!0),C(U,null,We(b.value,h=>(p(),M(a(bt),{key:`${h.jobId}/${h.fileName}`,title:`${y(h.jobId)} — ${h.runTime}`,name:`${h.jobId}/${h.fileName}`},{"header-extra":d(()=>[i("span",Pe,r(s(h.size)),1)]),default:d(()=>[j.value[`${h.jobId}/${h.fileName}`]?(p(),M(a(ee),{key:0,size:"small"})):c.value[`${h.jobId}/${h.fileName}`]?(p(),M(jt,{key:1,content:c.value[`${h.jobId}/${h.fileName}`]},null,8,["content"])):T("",!0)]),_:2},1032,["title","name"]))),128))]),_:1}))]),_:1},8,["show"])])]))}})})),Ut=w((()=>{})),at,qt=w((()=>{Te(),Te(),Ut(),L(),at=A(tt,[["__scopeId","data-v-c6178305"]])})),Fe,ot,Ue=w((()=>{q(),X(),Z(),ft(),te(),B(),Fe={class:"modal-footer"},ot=z({__name:"JobFormModal",props:{jobId:{}},emits:["close","saved"],setup(e,{emit:o}){const{t}=O(),_=e,n=o,c=W(),j=mt(),b=Ae(),$=S(!0),u=S(!1),s=S({name:"",schedule:"",prompt:"",deliver:"origin",repeat_times:null}),y=S(null),l=E(()=>!!_.jobId),k=E(()=>[{label:t("jobs.presetEveryMinute"),value:"* * * * *"},{label:t("jobs.presetEvery5Min"),value:"*/5 * * * *"},{label:t("jobs.presetEveryHour"),value:"0 * * * *"},{label:t("jobs.presetEveryDay"),value:"0 0 * * *"},{label:t("jobs.presetEveryDay9"),value:"0 9 * * *"},{label:t("jobs.presetEveryMonday"),value:"0 9 * * 1"},{label:t("jobs.presetEveryMonth"),value:"0 9 1 * *"}]),h=E(()=>{const f=[{label:t("jobs.origin"),value:"origin"},{label:t("jobs.local"),value:"local"}];for(const m of[{key:"telegram",label:"Telegram"},{key:"discord",label:"Discord"},{key:"slack",label:"Slack"},{key:"whatsapp",label:"WhatsApp"},{key:"matrix",label:"Matrix"},{key:"weixin",label:"WeChat"},{key:"wecom",label:"WeCom"},{key:"feishu",label:"Feishu"},{key:"dingtalk",label:"DingTalk"}]){const J=j.platforms[m.key]||{};Object.keys(J).length>0&&f.push({label:m.label,value:m.key})}return f}),I=S(null);Le(async()=>{if(_.jobId)try{const f=await wt(_.jobId);I.value=f,s.value={name:f.name,schedule:K(f.schedule,f.schedule_display||""),prompt:f.prompt,deliver:f.deliver||"origin",repeat_times:Ze(f.repeat)}}catch(f){b.error(t("jobs.loadFailed")+": "+f.message)}});async function P(){if(!s.value.name.trim()){b.warning(t("jobs.nameRequired"));return}if(!s.value.schedule.trim()){b.warning(t("jobs.scheduleRequired"));return}u.value=!0;try{if(l.value){if(!I.value){b.error(t("jobs.loadFailed"));return}const f=gt(I.value,s.value);if(Object.keys(f).length===0){b.success(t("jobs.jobUpdated")),n("saved");return}await c.updateJob(_.jobId,f),b.success(t("jobs.jobUpdated"))}else{const f={name:s.value.name,schedule:s.value.schedule,prompt:s.value.prompt,deliver:s.value.deliver,repeat:s.value.repeat_times??void 0};await c.createJob(f),b.success(t("jobs.jobCreated"))}n("saved")}catch(f){b.error(f.message)}finally{u.value=!1}}function g(){$.value=!1,setTimeout(()=>n("close"),200)}return(f,m)=>(p(),M(a(rt),{show:$.value,"onUpdate:show":m[7]||(m[7]=J=>$.value=J),preset:"card",title:l.value?a(t)("jobs.editJob"):a(t)("jobs.createJob"),style:{width:"min(520px, calc(100vw - 32px))"},"mask-closable":!u.value,onAfterLeave:m[8]||(m[8]=J=>n("close"))},{footer:d(()=>[i("div",Fe,[v(a(N),{onClick:g},{default:d(()=>[x(r(a(t)("common.cancel")),1)]),_:1}),v(a(N),{type:"primary",loading:u.value,onClick:P},{default:d(()=>[x(r(l.value?a(t)("common.update"):a(t)("common.create")),1)]),_:1},8,["loading"])])]),default:d(()=>[v(a(vt),{"label-placement":"top"},{default:d(()=>[v(a(F),{label:a(t)("jobs.name"),required:""},{default:d(()=>[v(a(Q),{value:s.value.name,"onUpdate:value":m[0]||(m[0]=J=>s.value.name=J),placeholder:a(t)("jobs.namePlaceholder"),maxlength:"200","show-count":""},null,8,["value","placeholder"])]),_:1},8,["label"]),v(a(F),{label:a(t)("jobs.schedule"),required:""},{default:d(()=>[v(a(Q),{value:s.value.schedule,"onUpdate:value":m[1]||(m[1]=J=>s.value.schedule=J),placeholder:a(t)("jobs.schedulePlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),v(a(F),{label:a(t)("jobs.quickPresets")},{default:d(()=>[v(a(ae),{value:y.value,"onUpdate:value":[m[2]||(m[2]=J=>y.value=J),m[3]||(m[3]=J=>s.value.schedule=J)],options:k.value,placeholder:a(t)("jobs.selectPreset")},null,8,["value","options","placeholder"])]),_:1},8,["label"]),v(a(F),{label:a(t)("jobs.prompt"),required:""},{default:d(()=>[v(a(Q),{value:s.value.prompt,"onUpdate:value":m[4]||(m[4]=J=>s.value.prompt=J),type:"textarea",placeholder:a(t)("jobs.promptPlaceholder"),rows:4,maxlength:"5000","show-count":""},null,8,["value","placeholder"])]),_:1},8,["label"]),v(a(F),{label:a(t)("jobs.deliverTarget")},{default:d(()=>[v(a(ae),{value:s.value.deliver,"onUpdate:value":m[5]||(m[5]=J=>s.value.deliver=J),options:h.value},null,8,["value","options"])]),_:1},8,["label"]),v(a(F),{label:a(t)("jobs.repeatCount")},{default:d(()=>[v(a(ct),{value:s.value.repeat_times,"onUpdate:value":m[6]||(m[6]=J=>s.value.repeat_times=J),min:1,placeholder:a(t)("jobs.repeatPlaceholder"),clearable:"",style:{width:"100%"}},null,8,["value","placeholder"])]),_:1},8,["label"])]),_:1})]),_:1},8,["show","title","mask-closable"]))}})})),Vt=w((()=>{})),st,Dt=w((()=>{Ue(),Ue(),Vt(),L(),st=A(ot,[["__scopeId","data-v-03ec4c1d"]])})),qe,Ve,De,He,ze,Be,nt,Oe=w((()=>{q(),X(),B(),Nt(),qt(),Dt(),Z(),qe={class:"jobs-view"},Ve={class:"page-header"},De={class:"header-title"},He={class:"jobs-split"},ze={class:"jobs-top"},Be={class:"jobs-bottom"},nt=z({__name:"JobsView",setup(e){const{t:o}=O(),t=W(),_=S(!1),n=S(null),c=S(null),j=E(()=>{const l={};for(const k of t.jobs){const h=k.job_id||k.id;l[h]=k.name}return l});Le(()=>{t.fetchJobs()});function b(){n.value=null,_.value=!0}function $(l){n.value=l,_.value=!0}function u(){_.value=!1,n.value=null}async function s(){await t.fetchJobs(),u()}function y(l){c.value=c.value===l?null:l}return(l,k)=>(p(),C("div",qe,[i("header",Ve,[i("h2",De,r(a(o)("jobs.title")),1),v(a(N),{type:"primary",size:"small",onClick:b},{icon:d(()=>[...k[0]||(k[0]=[i("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[i("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),i("line",{x1:"5",y1:"12",x2:"19",y2:"12"})],-1)])]),default:d(()=>[x(" "+r(a(o)("jobs.createJob")),1)]),_:1})]),i("div",He,[i("div",ze,[v(a(ee),{show:a(t).loading&&a(t).jobs.length===0},{default:d(()=>[v(et,{"selected-job-id":c.value,onEdit:$,onSelect:y},null,8,["selected-job-id"])]),_:1},8,["show"])]),k[1]||(k[1]=i("div",{class:"splitter"},null,-1)),i("div",Be,[v(at,{"selected-job-id":c.value,"job-name-map":j.value},null,8,["selected-job-id","job-name-map"])])]),_.value?(p(),M(st,{key:0,"job-id":n.value,onClose:u,onSaved:s},null,8,["job-id"])):T("",!0)]))}})})),Ht=w((()=>{})),zt,Bt=w((()=>{Oe(),Oe(),Ht(),L(),zt=A(nt,[["__scopeId","data-v-db769f38"]])}));Bt();export{zt as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as Q}from"./rolldown-runtime-BKwlnUi0.js";import{E as Jt,F as M,M as Mt,Nt as w,R as pe,Rt as t,S as Oe,St as dt,U as ye,Vt as u,Z as X,_ as Wt,_t as m,ct as we,et as K,g as jt,gt as Gt,ht as Ht,it as g,j as Qt,k as be,l as Ue,m as Yt,nt as ae,ot as D,p as he,rt as A,st as y,t as Se,tt as o,wt as S,y as xe,yt as ue,zt as ge}from"./ui-vendor-CsTMg6zH.js";import{c as vt,d as Zt,n as Te,o as ft,r as $e,s as Xt,u as es}from"./vue-vendor-D8zSB7VM.js";import{a as as,c as kt,l as B,n as Ie,o as ts,t as Ee}from"./_plugin-vue_export-helper-ZIsfSgrY.js";import{n as ss,t as ns}from"./HistoryMessageList-Dppp5myU.js";var De,qe,Fe,Le,Ne,mt,Ve=Q((()=>{ye(),Se(),Te(),De={class:"card-title"},qe={class:"card-meta"},Fe={class:"meta-tag assignee-tag"},Le={class:"meta-time"},Ne={key:0,class:"card-body-preview"},mt=we({__name:"KanbanTaskCard",props:{task:{}},emits:["click"],setup(a,{emit:l}){const d=a,_=l,{t:c}=$e(),v=K(()=>{const s=Date.now()/1e3-d.task.created_at;return s<60?c("kanban.card.timeAgo.justNow"):s<3600?c("kanban.card.timeAgo.minutes",{count:Math.floor(s/60)}):s<86400?c("kanban.card.timeAgo.hours",{count:Math.floor(s/3600)}):c("kanban.card.timeAgo.days",{count:Math.floor(s/86400)})}),$=K(()=>d.task.priority>=3?"high":d.task.priority===2?"medium":"low"),T=K(()=>c(`kanban.card.priority.${$.value}`));return(s,E)=>(m(),g("div",{class:"kanban-task-card",onClick:E[0]||(E[0]=O=>_("click",a.task.id))},[o("div",De,u(a.task.title),1),o("div",qe,[a.task.assignee?(m(),ae(t(Jt),{key:0,trigger:"hover"},{trigger:S(()=>[o("span",Fe,u(a.task.assignee),1)]),default:S(()=>[D(" "+u(t(c)("kanban.card.assigneeTooltip")),1)]),_:1})):A("",!0),a.task.priority>=2?(m(),g("span",{key:1,class:ge(["meta-tag priority-tag",$.value])},u(T.value),3)):A("",!0),o("span",Le,u(v.value),1)]),a.task.body?(m(),g("div",Ne,u(a.task.body.slice(0,80))+u(a.task.body.length>80?"...":""),1)):A("",!0)]))}})})),ls=Q((()=>{})),bt,is=Q((()=>{Ve(),Ve(),ls(),Ie(),bt=Ee(mt,[["__scopeId","data-v-432eb498"]])}));function rs(a){return a?.trim()||"default"}function x(a,l){const d=l.toString();return d?`${a}?${d}`:a}function I(a){const l=new URLSearchParams;return l.set("board",rs(a)),l}function Je(a){return a?a.startsWith("https")?"wss:":"ws:":location.protocol==="https:"?"wss:":"ws:"}function os(a){const l=ts(),d=I(a?.board),_=as();_&&d.set("token",_);const c=`/api/hermes/kanban/events?${d.toString()}`;if(l)return`${Je(l)}//${new URL(l).host}${c}`;const v=location.host;return`${Je()}//${v}${c}`}function us(a){return new WebSocket(os(a))}async function cs(a){const l=new URLSearchParams;return a?.includeArchived&&l.set("includeArchived","true"),(await B(x("/api/hermes/kanban/boards",l))).boards}async function ds(a){return(await B("/api/hermes/kanban/boards",{method:"POST",body:JSON.stringify(a)})).board}async function vs(a){return B(`/api/hermes/kanban/boards/${encodeURIComponent(a)}`,{method:"DELETE"})}async function fs(){return(await B("/api/hermes/kanban/capabilities")).capabilities}async function ks(a){const l=I(a?.board);return a?.status&&l.set("status",a.status),a?.assignee&&l.set("assignee",a.assignee),a?.tenant&&l.set("tenant",a.tenant),a?.includeArchived&&l.set("includeArchived","true"),(await B(x("/api/hermes/kanban",l))).tasks}async function Me(a,l){return B(x(`/api/hermes/kanban/${encodeURIComponent(a)}`,I(l?.board)))}async function ms(a,l){return(await B(x("/api/hermes/kanban",I(l?.board)),{method:"POST",body:JSON.stringify(a)})).task}async function bs(a,l,d){return B(x("/api/hermes/kanban/complete",I(d?.board)),{method:"POST",body:JSON.stringify({task_ids:a,summary:l})})}async function ps(a,l,d){return B(x(`/api/hermes/kanban/${encodeURIComponent(a)}/block`,I(d?.board)),{method:"POST",body:JSON.stringify({reason:l})})}async function _s(a,l){return B(x("/api/hermes/kanban/unblock",I(l?.board)),{method:"POST",body:JSON.stringify({task_ids:a})})}async function ys(a,l,d){return B(x(`/api/hermes/kanban/${encodeURIComponent(a)}/assign`,I(d?.board)),{method:"POST",body:JSON.stringify({profile:l})})}async function hs(a,l,d){return B(x(`/api/hermes/kanban/${encodeURIComponent(a)}/comments`,I(d?.board)),{method:"POST",body:JSON.stringify(l)})}async function gs(a,l){return B(x("/api/hermes/kanban/links",I(l?.board)),{method:"POST",body:JSON.stringify(a)})}async function ws(a,l){const d=I(l?.board);return d.set("parent_id",a.parent_id),d.set("child_id",a.child_id),B(x("/api/hermes/kanban/links",d),{method:"DELETE"})}async function Ss(a,l){return B(x("/api/hermes/kanban/tasks/bulk",I(l?.board)),{method:"POST",body:JSON.stringify(a)})}async function Ts(a,l){const d=I(l?.board);return l?.tail!==void 0&&d.set("tail",String(l.tail)),B(x(`/api/hermes/kanban/${encodeURIComponent(a)}/log`,d))}async function $s(a){const l=I(a?.board);return a?.task&&l.set("task",a.task),a?.severity&&l.set("severity",a.severity),(await B(x("/api/hermes/kanban/diagnostics",l))).diagnostics}async function Cs(a,l){return B(x(`/api/hermes/kanban/${encodeURIComponent(a)}/reclaim`,I(l?.board)),{method:"POST",body:JSON.stringify({reason:l?.reason})})}async function Bs(a,l,d){return B(x(`/api/hermes/kanban/${encodeURIComponent(a)}/reassign`,I(d?.board)),{method:"POST",body:JSON.stringify({profile:l,reclaim:d?.reclaim,reason:d?.reason})})}async function Rs(a,l){return(await B(x(`/api/hermes/kanban/${encodeURIComponent(a)}/specify`,I(l?.board)),{method:"POST",body:JSON.stringify({author:l?.author})})).results}async function As(a){return(await B(x("/api/hermes/kanban/dispatch",I(a?.board)),{method:"POST",body:JSON.stringify({dryRun:a?.dryRun,max:a?.max,failureLimit:a?.failureLimit})})).result}async function Ps(a){return(await B(x("/api/hermes/kanban/stats",I(a?.board)))).stats}async function Us(a){return(await B(x("/api/hermes/kanban/assignees",I(a?.board)))).assignees}var pt=Q((()=>{kt()}));function Os(a){if(typeof window>"u")return null;try{return window.localStorage.getItem(a)}catch{return null}}function xs(a,l){if(!(typeof window>"u"))try{window.localStorage.setItem(a,l)}catch{}}function Ae(a){const l=a?.trim().toLowerCase();return l&&_t.test(l)?l:ie}var Pe,ie,_t,Ce,Ke=Q((()=>{Zt(),ye(),pt(),Pe="hermes.kanban.selectedBoard",ie="default",_t=/^[a-z0-9][a-z0-9_-]{0,63}$/,Ce=es("kanban",()=>{const a=w([]),l=w(null),d=w([]),_=w([]),c=w(null),v=w(!1),$=w(!1),T=w(null),s=w(Ae(Os(Pe))),E=w(null),O=w(null);let R=0,V=0,J=0,P=0,C=0,U=0,W=0,j=null,q=null,G=null,F=!1;const te=K(()=>{const e=_.value.filter(n=>!n.archived);return e.some(n=>n.slug==="default")?e:[{slug:ie,name:"Default",description:"",icon:"",color:"",created_at:null,archived:!1,counts:{},total:0},...e]});function se(e){if(!c.value)return!1;const n=c.value.capabilities?.find(r=>r.key===e);return n?n.status==="supported":c.value.missing?.includes(e)?!1:c.value.supports?.[e]===!0}function H(e){if(!se(e))throw new Error(`Kanban capability "${e}" is not supported by the current Hermes backend`)}function re(e,n){const r=c.value?.capabilities?.find(f=>f.key===e);return r?n.includes(r.status):n.includes("supported")?se(e):!1}function ce(e,n){if(!re(e,n))throw new Error(`Kanban capability "${e}" is not available with the required status`)}function Z(e){return te.value.some(n=>n.slug===e)}function ne(e){const n=Ae(e);return _.value.length>0&&!Z(n)?ie:n}function de(){a.value=[],l.value=null,d.value=[]}function oe(){q&&clearTimeout(q),G&&clearTimeout(G),q=null,G=null}function ve(){if(!j)return;const e=j;j=null,e.onclose=null,e.onerror=null,e.onmessage=null;try{e.close()}catch{}}function k(){F=!1,W++,oe(),ve()}function h(e,n,r){G&&clearTimeout(G),G=setTimeout(()=>{!F||r!==W||n!==R||e!==s.value||Promise.all([L(),ee(!0),N(),me()])},100)}function i(e,n,r){q&&clearTimeout(q),q=setTimeout(()=>{!F||r!==W||n!==R||e!==s.value||b(e,n,r)},3e3)}function b(e,n,r){ve();let f;try{f=us({board:e})}catch(z){console.error("Failed to open kanban event stream:",z),i(e,n,r);return}j=f,f.onmessage=z=>{if(!(!F||r!==W||n!==R||e!==s.value))try{JSON.parse(String(z.data))?.type==="event"&&h(e,n,r)}catch{h(e,n,r)}},f.onerror=()=>{j===f&&console.error("Kanban event stream error")},f.onclose=()=>{j===f&&(j=null,i(e,n,r))}}function p(){const e=c.value?.capabilities?.find(n=>n.key==="events")?.status;return e==="supported"||e==="partial"||se("events")}function Y(){if(!p())return!1;F=!0;const e=++W,n=R,r=s.value;return oe(),b(r,n,e),!0}function _e(){F&&Y()}function fe(e){const n=ne(e),r=s.value!==n;return s.value=n,xs(Pe,n),T.value=null,r&&(de(),R++,_e()),n}function ze(e){const n=Ae(e),r=ne(n),f=r!==n;return fe(r),f&&(T.value=`Board "${n}" is unavailable; fell back to "${r}".`),{board:r,recovered:f}}function Be(e){return{seq:e(),generation:R,board:s.value}}function ke(e,n,r,f){return e===f&&n===R&&r===s.value}async function L(e=!1){const n=++V;$.value=!0;try{const r=await cs({includeArchived:e});if(n!==V)return;_.value=r,ne(s.value)!==s.value&&ze(s.value)}catch(r){n===V&&console.error("Failed to fetch kanban boards:",r)}finally{n===V&&($.value=!1)}}async function Tt(){try{c.value=await fs()}catch(e){console.error("Failed to fetch kanban capabilities:",e)}}async function $t(e){const n=await ds(e);return await L(),fe(n.slug),await Re(),n}async function Ct(){const e=s.value;if(e==="default")throw new Error("Cannot archive the default kanban board");await vs(e),await L(),fe(ie),await Re()}async function ee(e=!1){const{seq:n,generation:r,board:f}=Be(()=>++J),z=e?0:++U;e||(v.value=!0);try{const le=await ks({board:f,status:E.value||void 0,assignee:O.value||void 0,includeArchived:!0});ke(n,r,f,J)&&(a.value=le)}catch(le){ke(n,r,f,J)&&console.error("Failed to fetch kanban tasks:",le)}finally{!e&&z===U&&(v.value=!1)}}async function N(){const{seq:e,generation:n,board:r}=Be(()=>++P);try{const f=await Ps({board:r});ke(e,n,r,P)&&(l.value=f)}catch(f){ke(e,n,r,P)&&console.error("Failed to fetch kanban stats:",f)}}async function me(){const{seq:e,generation:n,board:r}=Be(()=>++C);try{const f=await Us({board:r});ke(e,n,r,C)&&(d.value=f)}catch(f){ke(e,n,r,C)&&console.error("Failed to fetch kanban assignees:",f)}}async function Bt(e){const n=s.value,r=await ms(e,{board:n});return n===s.value&&(a.value.unshift(r),await Promise.all([N(),L()])),r}async function Rt(e,n){const r=s.value;if(await bs(e,n,{board:r}),r===s.value){for(const f of e){const z=a.value.find(le=>le.id===f);z&&(z.status="done")}await Promise.all([N(),L()])}}async function At(e,n){const r=s.value;if(await ps(e,n,{board:r}),r===s.value){const f=a.value.find(z=>z.id===e);f&&(f.status="blocked"),await Promise.all([N(),L()])}}async function Pt(e){const n=s.value;if(await _s(e,{board:n}),n===s.value){for(const r of e){const f=a.value.find(z=>z.id===r);f&&(f.status="ready")}await Promise.all([N(),L()])}}async function Ut(e,n){const r=s.value;if(await ys(e,n,{board:r}),r===s.value){const f=a.value.find(z=>z.id===e);f&&(f.assignee=n),await Promise.all([N(),me()])}}async function Ot(e,n,r){return H("commentsWrite"),hs(e,{body:n,author:r},{board:s.value})}async function xt(e,n){H("links");const r=s.value,f=await gs({parent_id:e,child_id:n},{board:r});return r===s.value&&await Promise.all([ee(!0),N(),L()]),f}async function It(e,n){H("links");const r=s.value,f=await ws({parent_id:e,child_id:n},{board:r});return r===s.value&&await Promise.all([ee(!0),N(),L()]),f}async function Et(e){ce("bulk",["supported","partial"]);const n=s.value,r=await Ss(e,{board:n});return n===s.value&&await Promise.all([ee(!0),N(),L(),me()]),r}async function Kt(e,n){return H("taskLog"),Ts(e,{board:s.value,tail:n})}async function zt(e={}){return H("diagnostics"),$s({...e,board:s.value})}async function Dt(e,n){H("reclaim");const r=s.value,f=await Cs(e,{board:r,reason:n});return r===s.value&&await Promise.all([ee(!0),N(),L()]),f}async function qt(e,n,r={}){H("reassign");const f=s.value,z=await Bs(e,n,{board:f,...r});if(f===s.value){const le=a.value.find(Vt=>Vt.id===e);le&&(le.assignee=n==="none"?null:n),await Promise.all([N(),me()])}return z}async function Ft(e,n){H("specify");const r=s.value,f=await Rs(e,{board:r,author:n});return r===s.value&&await Promise.all([ee(!0),N(),L()]),f}async function Lt(e={}){H("dispatch");const n=s.value,r=await As({...e,board:n});return n===s.value&&await Promise.all([ee(!0),N(),L()]),r}function Nt(e,n){e==="status"?E.value=n:O.value=n}async function Re(){await Promise.all([L(),ee(),N(),me()])}return{tasks:a,stats:l,assignees:d,boards:_,capabilities:c,activeBoards:te,isCapabilitySupported:se,loading:v,boardsLoading:$,boardWarning:T,selectedBoard:s,filterStatus:E,filterAssignee:O,fetchBoards:L,fetchCapabilities:Tt,fetchTasks:ee,fetchStats:N,fetchAssignees:me,createTask:Bt,createBoard:$t,archiveSelectedBoard:Ct,completeTasks:Rt,blockTask:At,unblockTasks:Pt,assignTask:Ut,addComment:Ot,linkTasks:xt,unlinkTasks:It,bulkUpdateTasks:Et,getTaskLog:Kt,getDiagnostics:zt,reclaimTask:Dt,reassignTask:qt,specifyTask:Ft,dispatch:Lt,setFilter:Nt,setSelectedBoard:fe,startEventStream:Y,stopEventStream:k,recoverSelectedBoard:ze,resolveAvailableBoard:ne,clearBoardScopedState:de,refreshAll:Re}})})),We,je,Ge,He,Qe,Ye,Ze,Xe,ea,aa,ta,sa,na,la,ia,ra,oa,ua,ca,da,va,fa,ka,ma,ba,pa,_a,ya,ha,ga,wa,Sa,Ta,$a,Ca,Ba,Ra,Aa,Pa,Ua,Oa,xa,Ia,Ea,Ka,za,Da,qa,Fa,La,Na,Va,Ja,Ma,Wa,ja,yt,Ga=Q((()=>{ye(),Se(),Te(),ft(),kt(),pt(),Ke(),ss(),We={class:"detail-section"},je={class:"detail-row"},Ge={class:"detail-label"},He={class:"detail-row"},Qe={class:"detail-label"},Ye={class:"detail-value"},Ze={class:"detail-row"},Xe={class:"detail-label"},ea={class:"detail-value"},aa={class:"detail-row"},ta={class:"detail-label"},sa={class:"detail-value"},na={class:"detail-row"},la={class:"detail-label"},ia={class:"detail-value"},ra={key:0,class:"detail-row"},oa={class:"detail-label"},ua={class:"detail-value"},ca={key:1,class:"detail-row"},da={class:"detail-label"},va={class:"detail-value"},fa={key:0,class:"detail-section"},ka={class:"section-title"},ma={class:"detail-body"},ba={key:1,class:"detail-section"},pa={class:"section-title"},_a={key:2,class:"detail-section"},ya={class:"section-title"},ha={class:"action-group"},ga={key:1,class:"complete-input"},wa={key:1,class:"block-input"},Sa={key:0,class:"assign-group"},Ta={key:3,class:"detail-section"},$a={key:0,class:"session-list"},Ca=["onClick"],Ba={class:"session-title"},Ra={class:"session-meta"},Aa={key:1,class:"column-empty"},Pa={key:4,class:"detail-section"},Ua={class:"section-title"},Oa={class:"run-header"},xa={class:"run-profile"},Ia={class:"run-time"},Ea={key:0,class:"run-summary"},Ka={key:1,class:"run-error"},za={key:5,class:"detail-section"},Da={class:"section-title"},qa={class:"comment-header"},Fa={class:"comment-author"},La={class:"comment-time"},Na={class:"comment-body"},Va={key:6,class:"detail-section"},Ja={class:"section-title"},Ma={class:"event-kind"},Wa={class:"event-time"},ja={class:"messages-modal-body"},yt=we({__name:"KanbanTaskDrawer",props:{taskId:{}},emits:["close","updated"],setup(a,{emit:l}){const d=a,_=l,{t:c}=$e(),v=vt(),$=xe(),T=Ce(),s=w(null),E=w(!1),O=w(null),R=w(""),V=w(!1),J=w(""),P=w(!1),C=w(!1),U=K(()=>s.value&&(s.value.task.result||s.value.latest_summary)||""),W=K(()=>s.value?c(`kanban.columns.${s.value.task.status}`,s.value.task.status):""),j=K(()=>{const k=s.value?.task.status;return k!=="done"&&k!=="archived"}),q=w([]),G=w(!1),F=w(!1),te=K(()=>s.value&&[...s.value.runs].reverse().find(k=>k.profile)?.profile||null);async function se(){if(!s.value)return;const k=te.value;if(k&&(F.value=!F.value,!!F.value)){G.value=!0;try{q.value=(await B(`/api/hermes/kanban/search-sessions?task_id=${encodeURIComponent(s.value.task.id)}&profile=${encodeURIComponent(k)}&board=${encodeURIComponent(T.selectedBoard)}`)).results}catch{q.value=[]}finally{G.value=!1}}}function H(){s.value?.session&&(C.value=!0)}const re=K(()=>{const k=s.value?.session;return k?{id:k.id,title:k.title||"",source:k.source,messages:k.messages.filter(h=>h.role==="user"||h.role==="assistant").map(h=>({id:String(h.id),role:h.role,content:h.content,timestamp:h.timestamp})),createdAt:k.started_at,updatedAt:k.ended_at||k.started_at,model:k.model,messageCount:k.messages.length,endedAt:k.ended_at}:null}),ce=K(()=>T.assignees.map(k=>{const h=Object.values(k.counts||{}).reduce((i,b)=>i+b,0);return{label:`${k.name} · ${c("kanban.stats.tasks")}: ${h}`,value:k.name}}));dt(()=>[d.taskId,T.selectedBoard],async([k,h])=>{if(!k){s.value=null;return}E.value=!0;try{const i=await Me(k,{board:h});d.taskId===k&&T.selectedBoard===h&&(s.value=i)}catch{d.taskId===k&&T.selectedBoard===h&&$.error(c("kanban.message.loadFailed"))}finally{d.taskId===k&&T.selectedBoard===h&&(E.value=!1)}},{immediate:!0});function Z(k){return k?new Date(k*1e3).toLocaleString():"—"}async function ne(){if(d.taskId){if(!P.value){P.value=!0;return}try{await T.completeTasks([d.taskId],J.value.trim()||void 0),$.success(c("kanban.message.taskCompleted")),P.value=!1,J.value="",_("updated"),_("close")}catch(k){$.error(k.message)}}}async function de(){if(!(!d.taskId||!R.value.trim()))try{await T.blockTask(d.taskId,R.value.trim()),$.success(c("kanban.message.taskBlocked")),V.value=!1,R.value="",_("updated"),_("close")}catch(k){$.error(k.message)}}async function oe(){if(d.taskId)try{await T.unblockTasks([d.taskId]),$.success(c("kanban.message.taskUnblocked")),_("updated"),_("close")}catch(k){$.error(k.message)}}async function ve(){if(!(!d.taskId||!O.value))try{await T.assignTask(d.taskId,O.value),$.success(c("kanban.message.taskAssigned")),O.value=null,s.value&&(s.value=await Me(d.taskId,{board:T.selectedBoard})),_("updated")}catch(k){$.error(k.message)}}return(k,h)=>(m(),g(X,null,[y(t(Wt),{show:!!a.taskId,width:420,placement:"right","onUpdate:show":h[6]||(h[6]=i=>{i||_("close")})},{default:S(()=>[y(t(jt),{title:s.value?.task.title||"",closable:""},{default:S(()=>[y(t(Ue),{show:E.value},{default:S(()=>[s.value?(m(),g(X,{key:0},[o("div",We,[o("div",je,[o("span",Ge,u(t(c)("kanban.detail.status")),1),o("span",{class:ge(["detail-value status-badge",s.value.task.status])},u(W.value),3)]),o("div",He,[o("span",Qe,u(t(c)("kanban.detail.assignee")),1),o("span",Ye,u(s.value.task.assignee||"—"),1)]),o("div",Ze,[o("span",Xe,u(t(c)("kanban.detail.priority")),1),o("span",ea,u(s.value.task.priority),1)]),o("div",aa,[o("span",ta,u(t(c)("kanban.detail.tenant")),1),o("span",sa,u(s.value.task.tenant||"—"),1)]),o("div",na,[o("span",la,u(t(c)("kanban.detail.createdAt")),1),o("span",ia,u(Z(s.value.task.created_at)),1)]),s.value.task.started_at?(m(),g("div",ra,[o("span",oa,u(t(c)("kanban.detail.startedAt")),1),o("span",ua,u(Z(s.value.task.started_at)),1)])):A("",!0),s.value.task.completed_at?(m(),g("div",ca,[o("span",da,u(t(c)("kanban.detail.completedAt")),1),o("span",va,u(Z(s.value.task.completed_at)),1)])):A("",!0)]),s.value.task.body?(m(),g("div",fa,[o("div",ka,u(t(c)("kanban.form.body")),1),o("div",ma,u(s.value.task.body),1)])):A("",!0),U.value?(m(),g("div",ba,[o("div",pa,u(t(c)("kanban.detail.result")),1),o("div",{class:"result-summary",onClick:H},u(U.value),1)])):A("",!0),j.value?(m(),g("div",_a,[o("div",ya,u(t(c)("kanban.action.title")),1),o("div",ha,[P.value?(m(),g("div",ga,[y(t(pe),{value:J.value,"onUpdate:value":h[1]||(h[1]=i=>J.value=i),size:"small",placeholder:t(c)("kanban.action.completeSummary")},null,8,["value","placeholder"]),y(t(M),{size:"small",type:"primary",onClick:ne},{default:S(()=>[D(u(t(c)("common.ok")),1)]),_:1}),y(t(M),{size:"small",onClick:h[2]||(h[2]=i=>{P.value=!1,J.value=""})},{default:S(()=>[D(u(t(c)("common.cancel")),1)]),_:1})])):(m(),ae(t(M),{key:0,size:"small",onClick:h[0]||(h[0]=i=>P.value=!0)},{default:S(()=>[D(u(t(c)("kanban.action.complete")),1)]),_:1})),s.value.task.status==="blocked"?(m(),ae(t(M),{key:2,size:"small",onClick:oe},{default:S(()=>[D(u(t(c)("kanban.action.unblock")),1)]),_:1})):(m(),g(X,{key:3},[V.value?(m(),g("div",wa,[y(t(pe),{value:R.value,"onUpdate:value":h[4]||(h[4]=i=>R.value=i),size:"small",placeholder:t(c)("kanban.action.blockReason")},null,8,["value","placeholder"]),y(t(M),{size:"small",type:"primary",onClick:de},{default:S(()=>[D(u(t(c)("common.ok")),1)]),_:1})])):(m(),ae(t(M),{key:0,size:"small",onClick:h[3]||(h[3]=i=>V.value=!0)},{default:S(()=>[D(u(t(c)("kanban.action.block")),1)]),_:1}))],64))]),s.value.task.status!=="running"?(m(),g("div",Sa,[y(t(be),{value:O.value,"onUpdate:value":h[5]||(h[5]=i=>O.value=i),options:ce.value,size:"small",placeholder:t(c)("kanban.action.assignTo"),style:{flex:"1"}},null,8,["value","options","placeholder"]),y(t(M),{size:"small",disabled:!O.value,onClick:ve},{default:S(()=>[D(u(t(c)("kanban.action.assign")),1)]),_:1},8,["disabled"])])):A("",!0)])):A("",!0),s.value.runs.length>0?(m(),g("div",Ta,[o("div",{class:"section-title",style:{cursor:"pointer"},onClick:se},[D(u(t(c)("kanban.detail.sessions"))+" ",1),G.value?(m(),ae(t(Ue),{key:0,size:12,style:{"margin-left":"6px"}})):A("",!0)]),F.value&&q.value.length>0?(m(),g("div",$a,[(m(!0),g(X,null,ue(q.value,i=>(m(),g("div",{key:i.id,class:"session-item",onClick:b=>t(v).push({name:"hermes.chat",query:{session:i.id}})},[o("div",Ba,u(i.title||i.id),1),o("div",Ra,[o("span",null,u(i.source),1),o("span",null,u(i.model),1),o("span",null,u(Z(i.started_at)),1)])],8,Ca))),128))])):A("",!0),F.value&&!G.value&&q.value.length===0?(m(),g("div",Aa,u(t(c)("kanban.detail.noSessions")),1)):A("",!0)])):A("",!0),s.value.runs.length>0?(m(),g("div",Pa,[o("div",Ua,u(t(c)("kanban.detail.runs")),1),(m(!0),g(X,null,ue(s.value.runs,i=>(m(),g("div",{key:i.id,class:"run-item"},[o("div",Oa,[o("span",{class:ge(["run-status",i.status])},u(i.status),3),o("span",xa,u(i.profile||"—"),1),o("span",Ia,u(Z(i.started_at)),1)]),i.summary?(m(),g("div",Ea,u(i.summary),1)):A("",!0),i.error?(m(),g("div",Ka,u(i.error),1)):A("",!0)]))),128))])):A("",!0),s.value.comments.length>0?(m(),g("div",za,[o("div",Da,u(t(c)("kanban.detail.comments")),1),(m(!0),g(X,null,ue(s.value.comments,i=>(m(),g("div",{key:i.id,class:"comment-item"},[o("div",qa,[o("span",Fa,u(i.author),1),o("span",La,u(Z(i.created_at)),1)]),o("div",Na,u(i.body),1)]))),128))])):A("",!0),s.value.events.length>0?(m(),g("div",Va,[o("div",Ja,u(t(c)("kanban.detail.events")),1),(m(!0),g(X,null,ue(s.value.events.slice(-10),i=>(m(),g("div",{key:i.id,class:"event-item"},[o("span",Ma,u(i.kind),1),o("span",Wa,u(Z(i.created_at)),1)]))),128))])):A("",!0)],64)):A("",!0)]),_:1},8,["show"])]),_:1},8,["title"])]),_:1},8,["show"]),re.value?(m(),ae(t(Oe),{key:0,show:C.value,preset:"card",title:s.value?.task.title||"",style:{width:"900px",maxWidth:"calc(100vw - 48px)"},onClose:h[7]||(h[7]=i=>C.value=!1)},{default:S(()=>[o("div",ja,[y(ns,{session:re.value},null,8,["session"])])]),_:1},8,["show","title"])):A("",!0)],64))}})})),Is=Q((()=>{})),ht,Es=Q((()=>{Ga(),Ga(),Is(),Ie(),ht=Ee(yt,[["__scopeId","data-v-85605bae"]])})),gt,Ha=Q((()=>{ye(),Se(),Te(),Ke(),gt=we({__name:"KanbanCreateForm",emits:["close","created"],setup(a,{emit:l}){const d=l,{t:_}=$e(),c=xe(),v=Ce(),$=w(""),T=w(""),s=w(null),E=w(null),O=w(!1),R=K(()=>[{label:_("kanban.card.priority.low"),value:1},{label:_("kanban.card.priority.medium"),value:2},{label:_("kanban.card.priority.high"),value:3}]),V=K(()=>v.assignees.map(P=>{const C=Object.values(P.counts||{}).reduce((U,W)=>U+W,0);return{label:`${P.name} · ${_("kanban.stats.tasks")}: ${C}`,value:P.name}}));async function J(){if(!$.value.trim()){c.warning(_("kanban.form.titleRequired"));return}O.value=!0;try{await v.createTask({title:$.value.trim(),body:T.value.trim()||void 0,assignee:s.value||void 0,priority:E.value??void 0}),c.success(_("kanban.message.taskCreated")),d("created"),d("close")}catch(P){c.error(P.message)}finally{O.value=!1}}return(P,C)=>(m(),ae(t(Oe),{show:!0,preset:"dialog",title:t(_)("kanban.createTask"),style:{width:"480px"},onClose:C[5]||(C[5]=U=>d("close"))},{action:S(()=>[y(t(M),{onClick:C[4]||(C[4]=U=>d("close"))},{default:S(()=>[D(u(t(_)("common.cancel")),1)]),_:1}),y(t(M),{type:"primary",loading:O.value,onClick:J},{default:S(()=>[D(u(t(_)("common.create")),1)]),_:1},8,["loading"])]),default:S(()=>[y(t(Yt),{"label-placement":"top"},{default:S(()=>[y(t(he),{label:t(_)("kanban.form.title")},{default:S(()=>[y(t(pe),{value:$.value,"onUpdate:value":C[0]||(C[0]=U=>$.value=U),placeholder:t(_)("kanban.form.titlePlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),y(t(he),{label:t(_)("kanban.form.body")},{default:S(()=>[y(t(pe),{value:T.value,"onUpdate:value":C[1]||(C[1]=U=>T.value=U),type:"textarea",rows:3,placeholder:t(_)("kanban.form.bodyPlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),y(t(he),{label:t(_)("kanban.form.assignee")},{default:S(()=>[y(t(be),{value:s.value,"onUpdate:value":C[2]||(C[2]=U=>s.value=U),options:V.value,placeholder:t(_)("kanban.form.selectAssignee"),clearable:""},null,8,["value","options","placeholder"])]),_:1},8,["label"]),y(t(he),{label:t(_)("kanban.form.priority")},{default:S(()=>[y(t(be),{value:E.value,"onUpdate:value":C[3]||(C[3]=U=>E.value=U),options:R.value,placeholder:t(_)("kanban.form.selectPriority"),clearable:""},null,8,["value","options","placeholder"])]),_:1},8,["label"])]),_:1})]),_:1},8,["title"]))}})})),wt,Ks=Q((()=>{Ha(),Ha(),wt=gt})),Qa,Ya,Za,Xa,et,at,tt,st,nt,lt,it,rt,ot,ut,St,ct=Q((()=>{ye(),Se(),Te(),ft(),is(),Es(),Ks(),Ke(),Qa={class:"kanban-view"},Ya={class:"page-header"},Za={class:"header-title"},Xa={class:"header-actions"},et={key:0,class:"stats-bar"},at={class:"stat-count"},tt={class:"stat-label"},st={class:"stat-chip total"},nt={class:"stat-count"},lt={class:"stat-label"},it={class:"kanban-board"},rt={class:"task-list"},ot={key:0,class:"column-empty"},ut={class:"board-form"},St=we({__name:"KanbanView",setup(a){const{t:l}=$e(),d=Xt(),_=vt(),c=xe(),v=Ce(),$=w(!1),T=w(!1),s=w(null),E=w(""),O=w(""),R=w(!1),V=w(null),J=w(!1),P=["triage","todo","ready","running","blocked","done","archived"];function C(i){return Array.isArray(i)?typeof i[0]=="string"?i[0]:null:typeof i=="string"?i:null}function U(){return C(d.query.board)}async function W(i){U()!==i&&await _.replace({query:{...d.query,board:i}})}async function j(i,b=!0,p=!1){const Y=v.selectedBoard,{board:_e,recovered:fe}=v.recoverSelectedBoard(i||v.selectedBoard||"default");s.value=null,$.value=!1,T.value=!1,b&&fe&&v.boardWarning&&c.warning(v.boardWarning),await W(_e),(p||_e!==Y)&&await v.refreshAll()}function q(i){return`${l("kanban.stats.tasks")}: ${i}`}const G=K(()=>v.activeBoards.map(i=>{const b=typeof i.total=="number"?i.total:0;return{label:`${l("kanban.title")}: ${i.icon?`${i.icon} `:""}${i.name||i.slug} · ${q(b)}`,value:i.slug}})),F=K({get:()=>v.selectedBoard,set:i=>{j(i||"default")}}),te=K(()=>{const i={};for(const b of P)i[b]=v.tasks.filter(p=>p.status===b).sort((p,Y)=>Y.created_at-p.created_at);return i}),se=K(()=>[{label:l("kanban.allStatuses"),value:""},...P.map(i=>({label:l(`kanban.columns.${i}`,i),value:i}))]),H=K(()=>[{label:l("kanban.allAssignees"),value:""},...v.assignees.map(i=>{const b=Object.values(i.counts||{}).reduce((p,Y)=>p+Y,0);return{label:`${l("kanban.detail.assignee")}: ${i.name} · ${q(b)}`,value:i.name}})]),re=K({get:()=>v.filterStatus||"",set:i=>v.setFilter("status",i||null)}),ce=K({get:()=>v.filterAssignee||"",set:i=>v.setFilter("assignee",i||null)});dt(()=>d.query.board,async()=>{J.value&&await j(U(),!1)}),Ht(async()=>{await Promise.all([v.fetchBoards(),v.fetchCapabilities()]),await j(U(),!0,!0),v.startEventStream(),J.value=!0,V.value=setInterval(()=>{document.visibilityState==="visible"&&Promise.all([v.fetchBoards(),v.fetchTasks(!0),v.fetchStats()])},15e3)}),Gt(()=>{v.stopEventStream(),V.value&&clearInterval(V.value)});function Z(i){s.value=i}function ne(){s.value=null}async function de(){await Promise.all([v.fetchTasks(),v.fetchStats()])}async function oe(){await v.fetchTasks()}async function ve(){await Promise.all([v.fetchTasks(),v.fetchStats(),v.fetchBoards()])}async function k(){const i=E.value.trim();if(!i){c.warning(l("kanban.board.slugRequired"));return}R.value=!0;try{const b=await v.createBoard({slug:i,name:O.value.trim()||void 0});E.value="",O.value="",T.value=!1,await W(b.slug),c.success(l("kanban.board.created"))}catch(b){c.error(b.message)}finally{R.value=!1}}async function h(){if(v.selectedBoard!=="default"&&window.confirm(l("kanban.board.archiveConfirm"))){R.value=!0;try{await v.archiveSelectedBoard(),await W(ie),c.success(l("kanban.board.archived"))}catch(i){c.error(i.message)}finally{R.value=!1}}}return(i,b)=>(m(),g("div",Qa,[o("header",Ya,[o("h2",Za,u(t(l)("kanban.title")),1),o("div",Xa,[y(t(be),{value:F.value,"onUpdate:value":b[0]||(b[0]=p=>F.value=p),options:G.value,loading:t(v).boardsLoading,size:"small",style:{width:"260px"}},null,8,["value","options","loading"]),y(t(M),{size:"small",loading:R.value,onClick:b[1]||(b[1]=p=>T.value=!0)},{default:S(()=>[D(u(t(l)("common.add")),1)]),_:1},8,["loading"]),y(t(M),{size:"small",secondary:"",disabled:t(v).selectedBoard===t(ie),loading:R.value,onClick:h},{default:S(()=>[D(u(t(l)("kanban.board.archive")),1)]),_:1},8,["disabled","loading"]),y(t(be),{value:re.value,"onUpdate:value":[b[2]||(b[2]=p=>re.value=p),oe],options:se.value,size:"small",style:{width:"150px"}},null,8,["value","options"]),y(t(be),{value:ce.value,"onUpdate:value":[b[3]||(b[3]=p=>ce.value=p),oe],options:H.value,size:"small",style:{width:"170px"}},null,8,["value","options"]),y(t(M),{type:"primary",size:"small",onClick:b[4]||(b[4]=p=>$.value=!0)},{icon:S(()=>[...b[10]||(b[10]=[o("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[o("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),o("line",{x1:"5",y1:"12",x2:"19",y2:"12"})],-1)])]),default:S(()=>[D(" "+u(t(l)("kanban.createTask")),1)]),_:1})])]),t(v).stats?(m(),g("div",et,[(m(),g(X,null,ue(P,p=>o("div",{key:p,class:ge(["stat-chip",p])},[o("span",at,u(t(v).stats.by_status[p]||0),1),o("span",tt,u(t(l)(`kanban.columns.${p}`,p)),1)],2)),64)),o("div",st,[o("span",nt,u(t(v).stats.total),1),o("span",lt,u(t(l)("kanban.stats.total")),1)])])):A("",!0),y(t(Ue),{show:t(v).loading&&t(v).tasks.length===0},{default:S(()=>[o("div",it,[y(t(Mt),null,{default:S(()=>[(m(),g(X,null,ue(P,p=>y(t(Qt),{key:p,title:`${t(l)(`kanban.columns.${p}`,p)} (${te.value[p].length})`,name:p},{default:S(()=>[o("div",rt,[(m(!0),g(X,null,ue(te.value[p],Y=>(m(),ae(bt,{key:Y.id,task:Y,onClick:_e=>Z(Y.id)},null,8,["task","onClick"]))),128)),te.value[p].length===0?(m(),g("div",ot,u(t(l)("kanban.noTasks")),1)):A("",!0)])]),_:2},1032,["title","name"])),64))]),_:1})])]),_:1},8,["show"]),y(ht,{"task-id":s.value,onClose:ne,onUpdated:de},null,8,["task-id"]),y(t(Oe),{show:T.value,"onUpdate:show":b[8]||(b[8]=p=>T.value=p),preset:"dialog",title:t(l)("kanban.board.create"),style:{width:"420px"}},{action:S(()=>[y(t(M),{onClick:b[7]||(b[7]=p=>T.value=!1)},{default:S(()=>[D(u(t(l)("common.cancel")),1)]),_:1}),y(t(M),{type:"primary",loading:R.value,onClick:k},{default:S(()=>[D(u(t(l)("common.create")),1)]),_:1},8,["loading"])]),default:S(()=>[o("div",ut,[y(t(pe),{value:E.value,"onUpdate:value":b[5]||(b[5]=p=>E.value=p),placeholder:t(l)("kanban.board.slugPlaceholder")},null,8,["value","placeholder"]),y(t(pe),{value:O.value,"onUpdate:value":b[6]||(b[6]=p=>O.value=p),placeholder:t(l)("kanban.board.namePlaceholder")},null,8,["value","placeholder"])])]),_:1},8,["show","title"]),$.value?(m(),ae(wt,{key:1,onClose:b[9]||(b[9]=p=>$.value=!1),onCreated:ve})):A("",!0)]))}})})),zs=Q((()=>{})),Ds,qs=Q((()=>{ct(),ct(),zs(),Ie(),Ds=Ee(St,[["__scopeId","data-v-dabc03ef"]])}));qs();export{Ds as default};
|
|
1
|
+
import{n as Q}from"./rolldown-runtime-BKwlnUi0.js";import{E as Jt,F as M,M as Mt,Nt as w,R as pe,Rt as t,S as Oe,St as dt,U as ye,Vt as u,Z as X,_ as Wt,_t as m,ct as we,et as K,g as jt,gt as Gt,ht as Ht,it as g,j as Qt,k as be,l as Ue,m as Yt,nt as ae,ot as D,p as he,rt as A,st as y,t as Se,tt as o,wt as S,y as xe,yt as ue,zt as ge}from"./ui-vendor-CsTMg6zH.js";import{c as vt,d as Zt,n as Te,o as ft,r as $e,s as Xt,u as es}from"./vue-vendor-D8zSB7VM.js";import{a as as,c as kt,l as B,n as Ie,o as ts,t as Ee}from"./_plugin-vue_export-helper-CrLlP_D3.js";import{n as ss,t as ns}from"./HistoryMessageList-DVoUuNfX.js";var De,qe,Fe,Le,Ne,mt,Ve=Q((()=>{ye(),Se(),Te(),De={class:"card-title"},qe={class:"card-meta"},Fe={class:"meta-tag assignee-tag"},Le={class:"meta-time"},Ne={key:0,class:"card-body-preview"},mt=we({__name:"KanbanTaskCard",props:{task:{}},emits:["click"],setup(a,{emit:l}){const d=a,_=l,{t:c}=$e(),v=K(()=>{const s=Date.now()/1e3-d.task.created_at;return s<60?c("kanban.card.timeAgo.justNow"):s<3600?c("kanban.card.timeAgo.minutes",{count:Math.floor(s/60)}):s<86400?c("kanban.card.timeAgo.hours",{count:Math.floor(s/3600)}):c("kanban.card.timeAgo.days",{count:Math.floor(s/86400)})}),$=K(()=>d.task.priority>=3?"high":d.task.priority===2?"medium":"low"),T=K(()=>c(`kanban.card.priority.${$.value}`));return(s,E)=>(m(),g("div",{class:"kanban-task-card",onClick:E[0]||(E[0]=O=>_("click",a.task.id))},[o("div",De,u(a.task.title),1),o("div",qe,[a.task.assignee?(m(),ae(t(Jt),{key:0,trigger:"hover"},{trigger:S(()=>[o("span",Fe,u(a.task.assignee),1)]),default:S(()=>[D(" "+u(t(c)("kanban.card.assigneeTooltip")),1)]),_:1})):A("",!0),a.task.priority>=2?(m(),g("span",{key:1,class:ge(["meta-tag priority-tag",$.value])},u(T.value),3)):A("",!0),o("span",Le,u(v.value),1)]),a.task.body?(m(),g("div",Ne,u(a.task.body.slice(0,80))+u(a.task.body.length>80?"...":""),1)):A("",!0)]))}})})),ls=Q((()=>{})),bt,is=Q((()=>{Ve(),Ve(),ls(),Ie(),bt=Ee(mt,[["__scopeId","data-v-432eb498"]])}));function rs(a){return a?.trim()||"default"}function x(a,l){const d=l.toString();return d?`${a}?${d}`:a}function I(a){const l=new URLSearchParams;return l.set("board",rs(a)),l}function Je(a){return a?a.startsWith("https")?"wss:":"ws:":location.protocol==="https:"?"wss:":"ws:"}function os(a){const l=ts(),d=I(a?.board),_=as();_&&d.set("token",_);const c=`/api/hermes/kanban/events?${d.toString()}`;if(l)return`${Je(l)}//${new URL(l).host}${c}`;const v=location.host;return`${Je()}//${v}${c}`}function us(a){return new WebSocket(os(a))}async function cs(a){const l=new URLSearchParams;return a?.includeArchived&&l.set("includeArchived","true"),(await B(x("/api/hermes/kanban/boards",l))).boards}async function ds(a){return(await B("/api/hermes/kanban/boards",{method:"POST",body:JSON.stringify(a)})).board}async function vs(a){return B(`/api/hermes/kanban/boards/${encodeURIComponent(a)}`,{method:"DELETE"})}async function fs(){return(await B("/api/hermes/kanban/capabilities")).capabilities}async function ks(a){const l=I(a?.board);return a?.status&&l.set("status",a.status),a?.assignee&&l.set("assignee",a.assignee),a?.tenant&&l.set("tenant",a.tenant),a?.includeArchived&&l.set("includeArchived","true"),(await B(x("/api/hermes/kanban",l))).tasks}async function Me(a,l){return B(x(`/api/hermes/kanban/${encodeURIComponent(a)}`,I(l?.board)))}async function ms(a,l){return(await B(x("/api/hermes/kanban",I(l?.board)),{method:"POST",body:JSON.stringify(a)})).task}async function bs(a,l,d){return B(x("/api/hermes/kanban/complete",I(d?.board)),{method:"POST",body:JSON.stringify({task_ids:a,summary:l})})}async function ps(a,l,d){return B(x(`/api/hermes/kanban/${encodeURIComponent(a)}/block`,I(d?.board)),{method:"POST",body:JSON.stringify({reason:l})})}async function _s(a,l){return B(x("/api/hermes/kanban/unblock",I(l?.board)),{method:"POST",body:JSON.stringify({task_ids:a})})}async function ys(a,l,d){return B(x(`/api/hermes/kanban/${encodeURIComponent(a)}/assign`,I(d?.board)),{method:"POST",body:JSON.stringify({profile:l})})}async function hs(a,l,d){return B(x(`/api/hermes/kanban/${encodeURIComponent(a)}/comments`,I(d?.board)),{method:"POST",body:JSON.stringify(l)})}async function gs(a,l){return B(x("/api/hermes/kanban/links",I(l?.board)),{method:"POST",body:JSON.stringify(a)})}async function ws(a,l){const d=I(l?.board);return d.set("parent_id",a.parent_id),d.set("child_id",a.child_id),B(x("/api/hermes/kanban/links",d),{method:"DELETE"})}async function Ss(a,l){return B(x("/api/hermes/kanban/tasks/bulk",I(l?.board)),{method:"POST",body:JSON.stringify(a)})}async function Ts(a,l){const d=I(l?.board);return l?.tail!==void 0&&d.set("tail",String(l.tail)),B(x(`/api/hermes/kanban/${encodeURIComponent(a)}/log`,d))}async function $s(a){const l=I(a?.board);return a?.task&&l.set("task",a.task),a?.severity&&l.set("severity",a.severity),(await B(x("/api/hermes/kanban/diagnostics",l))).diagnostics}async function Cs(a,l){return B(x(`/api/hermes/kanban/${encodeURIComponent(a)}/reclaim`,I(l?.board)),{method:"POST",body:JSON.stringify({reason:l?.reason})})}async function Bs(a,l,d){return B(x(`/api/hermes/kanban/${encodeURIComponent(a)}/reassign`,I(d?.board)),{method:"POST",body:JSON.stringify({profile:l,reclaim:d?.reclaim,reason:d?.reason})})}async function Rs(a,l){return(await B(x(`/api/hermes/kanban/${encodeURIComponent(a)}/specify`,I(l?.board)),{method:"POST",body:JSON.stringify({author:l?.author})})).results}async function As(a){return(await B(x("/api/hermes/kanban/dispatch",I(a?.board)),{method:"POST",body:JSON.stringify({dryRun:a?.dryRun,max:a?.max,failureLimit:a?.failureLimit})})).result}async function Ps(a){return(await B(x("/api/hermes/kanban/stats",I(a?.board)))).stats}async function Us(a){return(await B(x("/api/hermes/kanban/assignees",I(a?.board)))).assignees}var pt=Q((()=>{kt()}));function Os(a){if(typeof window>"u")return null;try{return window.localStorage.getItem(a)}catch{return null}}function xs(a,l){if(!(typeof window>"u"))try{window.localStorage.setItem(a,l)}catch{}}function Ae(a){const l=a?.trim().toLowerCase();return l&&_t.test(l)?l:ie}var Pe,ie,_t,Ce,Ke=Q((()=>{Zt(),ye(),pt(),Pe="hermes.kanban.selectedBoard",ie="default",_t=/^[a-z0-9][a-z0-9_-]{0,63}$/,Ce=es("kanban",()=>{const a=w([]),l=w(null),d=w([]),_=w([]),c=w(null),v=w(!1),$=w(!1),T=w(null),s=w(Ae(Os(Pe))),E=w(null),O=w(null);let R=0,V=0,J=0,P=0,C=0,U=0,W=0,j=null,q=null,G=null,F=!1;const te=K(()=>{const e=_.value.filter(n=>!n.archived);return e.some(n=>n.slug==="default")?e:[{slug:ie,name:"Default",description:"",icon:"",color:"",created_at:null,archived:!1,counts:{},total:0},...e]});function se(e){if(!c.value)return!1;const n=c.value.capabilities?.find(r=>r.key===e);return n?n.status==="supported":c.value.missing?.includes(e)?!1:c.value.supports?.[e]===!0}function H(e){if(!se(e))throw new Error(`Kanban capability "${e}" is not supported by the current Hermes backend`)}function re(e,n){const r=c.value?.capabilities?.find(f=>f.key===e);return r?n.includes(r.status):n.includes("supported")?se(e):!1}function ce(e,n){if(!re(e,n))throw new Error(`Kanban capability "${e}" is not available with the required status`)}function Z(e){return te.value.some(n=>n.slug===e)}function ne(e){const n=Ae(e);return _.value.length>0&&!Z(n)?ie:n}function de(){a.value=[],l.value=null,d.value=[]}function oe(){q&&clearTimeout(q),G&&clearTimeout(G),q=null,G=null}function ve(){if(!j)return;const e=j;j=null,e.onclose=null,e.onerror=null,e.onmessage=null;try{e.close()}catch{}}function k(){F=!1,W++,oe(),ve()}function h(e,n,r){G&&clearTimeout(G),G=setTimeout(()=>{!F||r!==W||n!==R||e!==s.value||Promise.all([L(),ee(!0),N(),me()])},100)}function i(e,n,r){q&&clearTimeout(q),q=setTimeout(()=>{!F||r!==W||n!==R||e!==s.value||b(e,n,r)},3e3)}function b(e,n,r){ve();let f;try{f=us({board:e})}catch(z){console.error("Failed to open kanban event stream:",z),i(e,n,r);return}j=f,f.onmessage=z=>{if(!(!F||r!==W||n!==R||e!==s.value))try{JSON.parse(String(z.data))?.type==="event"&&h(e,n,r)}catch{h(e,n,r)}},f.onerror=()=>{j===f&&console.error("Kanban event stream error")},f.onclose=()=>{j===f&&(j=null,i(e,n,r))}}function p(){const e=c.value?.capabilities?.find(n=>n.key==="events")?.status;return e==="supported"||e==="partial"||se("events")}function Y(){if(!p())return!1;F=!0;const e=++W,n=R,r=s.value;return oe(),b(r,n,e),!0}function _e(){F&&Y()}function fe(e){const n=ne(e),r=s.value!==n;return s.value=n,xs(Pe,n),T.value=null,r&&(de(),R++,_e()),n}function ze(e){const n=Ae(e),r=ne(n),f=r!==n;return fe(r),f&&(T.value=`Board "${n}" is unavailable; fell back to "${r}".`),{board:r,recovered:f}}function Be(e){return{seq:e(),generation:R,board:s.value}}function ke(e,n,r,f){return e===f&&n===R&&r===s.value}async function L(e=!1){const n=++V;$.value=!0;try{const r=await cs({includeArchived:e});if(n!==V)return;_.value=r,ne(s.value)!==s.value&&ze(s.value)}catch(r){n===V&&console.error("Failed to fetch kanban boards:",r)}finally{n===V&&($.value=!1)}}async function Tt(){try{c.value=await fs()}catch(e){console.error("Failed to fetch kanban capabilities:",e)}}async function $t(e){const n=await ds(e);return await L(),fe(n.slug),await Re(),n}async function Ct(){const e=s.value;if(e==="default")throw new Error("Cannot archive the default kanban board");await vs(e),await L(),fe(ie),await Re()}async function ee(e=!1){const{seq:n,generation:r,board:f}=Be(()=>++J),z=e?0:++U;e||(v.value=!0);try{const le=await ks({board:f,status:E.value||void 0,assignee:O.value||void 0,includeArchived:!0});ke(n,r,f,J)&&(a.value=le)}catch(le){ke(n,r,f,J)&&console.error("Failed to fetch kanban tasks:",le)}finally{!e&&z===U&&(v.value=!1)}}async function N(){const{seq:e,generation:n,board:r}=Be(()=>++P);try{const f=await Ps({board:r});ke(e,n,r,P)&&(l.value=f)}catch(f){ke(e,n,r,P)&&console.error("Failed to fetch kanban stats:",f)}}async function me(){const{seq:e,generation:n,board:r}=Be(()=>++C);try{const f=await Us({board:r});ke(e,n,r,C)&&(d.value=f)}catch(f){ke(e,n,r,C)&&console.error("Failed to fetch kanban assignees:",f)}}async function Bt(e){const n=s.value,r=await ms(e,{board:n});return n===s.value&&(a.value.unshift(r),await Promise.all([N(),L()])),r}async function Rt(e,n){const r=s.value;if(await bs(e,n,{board:r}),r===s.value){for(const f of e){const z=a.value.find(le=>le.id===f);z&&(z.status="done")}await Promise.all([N(),L()])}}async function At(e,n){const r=s.value;if(await ps(e,n,{board:r}),r===s.value){const f=a.value.find(z=>z.id===e);f&&(f.status="blocked"),await Promise.all([N(),L()])}}async function Pt(e){const n=s.value;if(await _s(e,{board:n}),n===s.value){for(const r of e){const f=a.value.find(z=>z.id===r);f&&(f.status="ready")}await Promise.all([N(),L()])}}async function Ut(e,n){const r=s.value;if(await ys(e,n,{board:r}),r===s.value){const f=a.value.find(z=>z.id===e);f&&(f.assignee=n),await Promise.all([N(),me()])}}async function Ot(e,n,r){return H("commentsWrite"),hs(e,{body:n,author:r},{board:s.value})}async function xt(e,n){H("links");const r=s.value,f=await gs({parent_id:e,child_id:n},{board:r});return r===s.value&&await Promise.all([ee(!0),N(),L()]),f}async function It(e,n){H("links");const r=s.value,f=await ws({parent_id:e,child_id:n},{board:r});return r===s.value&&await Promise.all([ee(!0),N(),L()]),f}async function Et(e){ce("bulk",["supported","partial"]);const n=s.value,r=await Ss(e,{board:n});return n===s.value&&await Promise.all([ee(!0),N(),L(),me()]),r}async function Kt(e,n){return H("taskLog"),Ts(e,{board:s.value,tail:n})}async function zt(e={}){return H("diagnostics"),$s({...e,board:s.value})}async function Dt(e,n){H("reclaim");const r=s.value,f=await Cs(e,{board:r,reason:n});return r===s.value&&await Promise.all([ee(!0),N(),L()]),f}async function qt(e,n,r={}){H("reassign");const f=s.value,z=await Bs(e,n,{board:f,...r});if(f===s.value){const le=a.value.find(Vt=>Vt.id===e);le&&(le.assignee=n==="none"?null:n),await Promise.all([N(),me()])}return z}async function Ft(e,n){H("specify");const r=s.value,f=await Rs(e,{board:r,author:n});return r===s.value&&await Promise.all([ee(!0),N(),L()]),f}async function Lt(e={}){H("dispatch");const n=s.value,r=await As({...e,board:n});return n===s.value&&await Promise.all([ee(!0),N(),L()]),r}function Nt(e,n){e==="status"?E.value=n:O.value=n}async function Re(){await Promise.all([L(),ee(),N(),me()])}return{tasks:a,stats:l,assignees:d,boards:_,capabilities:c,activeBoards:te,isCapabilitySupported:se,loading:v,boardsLoading:$,boardWarning:T,selectedBoard:s,filterStatus:E,filterAssignee:O,fetchBoards:L,fetchCapabilities:Tt,fetchTasks:ee,fetchStats:N,fetchAssignees:me,createTask:Bt,createBoard:$t,archiveSelectedBoard:Ct,completeTasks:Rt,blockTask:At,unblockTasks:Pt,assignTask:Ut,addComment:Ot,linkTasks:xt,unlinkTasks:It,bulkUpdateTasks:Et,getTaskLog:Kt,getDiagnostics:zt,reclaimTask:Dt,reassignTask:qt,specifyTask:Ft,dispatch:Lt,setFilter:Nt,setSelectedBoard:fe,startEventStream:Y,stopEventStream:k,recoverSelectedBoard:ze,resolveAvailableBoard:ne,clearBoardScopedState:de,refreshAll:Re}})})),We,je,Ge,He,Qe,Ye,Ze,Xe,ea,aa,ta,sa,na,la,ia,ra,oa,ua,ca,da,va,fa,ka,ma,ba,pa,_a,ya,ha,ga,wa,Sa,Ta,$a,Ca,Ba,Ra,Aa,Pa,Ua,Oa,xa,Ia,Ea,Ka,za,Da,qa,Fa,La,Na,Va,Ja,Ma,Wa,ja,yt,Ga=Q((()=>{ye(),Se(),Te(),ft(),kt(),pt(),Ke(),ss(),We={class:"detail-section"},je={class:"detail-row"},Ge={class:"detail-label"},He={class:"detail-row"},Qe={class:"detail-label"},Ye={class:"detail-value"},Ze={class:"detail-row"},Xe={class:"detail-label"},ea={class:"detail-value"},aa={class:"detail-row"},ta={class:"detail-label"},sa={class:"detail-value"},na={class:"detail-row"},la={class:"detail-label"},ia={class:"detail-value"},ra={key:0,class:"detail-row"},oa={class:"detail-label"},ua={class:"detail-value"},ca={key:1,class:"detail-row"},da={class:"detail-label"},va={class:"detail-value"},fa={key:0,class:"detail-section"},ka={class:"section-title"},ma={class:"detail-body"},ba={key:1,class:"detail-section"},pa={class:"section-title"},_a={key:2,class:"detail-section"},ya={class:"section-title"},ha={class:"action-group"},ga={key:1,class:"complete-input"},wa={key:1,class:"block-input"},Sa={key:0,class:"assign-group"},Ta={key:3,class:"detail-section"},$a={key:0,class:"session-list"},Ca=["onClick"],Ba={class:"session-title"},Ra={class:"session-meta"},Aa={key:1,class:"column-empty"},Pa={key:4,class:"detail-section"},Ua={class:"section-title"},Oa={class:"run-header"},xa={class:"run-profile"},Ia={class:"run-time"},Ea={key:0,class:"run-summary"},Ka={key:1,class:"run-error"},za={key:5,class:"detail-section"},Da={class:"section-title"},qa={class:"comment-header"},Fa={class:"comment-author"},La={class:"comment-time"},Na={class:"comment-body"},Va={key:6,class:"detail-section"},Ja={class:"section-title"},Ma={class:"event-kind"},Wa={class:"event-time"},ja={class:"messages-modal-body"},yt=we({__name:"KanbanTaskDrawer",props:{taskId:{}},emits:["close","updated"],setup(a,{emit:l}){const d=a,_=l,{t:c}=$e(),v=vt(),$=xe(),T=Ce(),s=w(null),E=w(!1),O=w(null),R=w(""),V=w(!1),J=w(""),P=w(!1),C=w(!1),U=K(()=>s.value&&(s.value.task.result||s.value.latest_summary)||""),W=K(()=>s.value?c(`kanban.columns.${s.value.task.status}`,s.value.task.status):""),j=K(()=>{const k=s.value?.task.status;return k!=="done"&&k!=="archived"}),q=w([]),G=w(!1),F=w(!1),te=K(()=>s.value&&[...s.value.runs].reverse().find(k=>k.profile)?.profile||null);async function se(){if(!s.value)return;const k=te.value;if(k&&(F.value=!F.value,!!F.value)){G.value=!0;try{q.value=(await B(`/api/hermes/kanban/search-sessions?task_id=${encodeURIComponent(s.value.task.id)}&profile=${encodeURIComponent(k)}&board=${encodeURIComponent(T.selectedBoard)}`)).results}catch{q.value=[]}finally{G.value=!1}}}function H(){s.value?.session&&(C.value=!0)}const re=K(()=>{const k=s.value?.session;return k?{id:k.id,title:k.title||"",source:k.source,messages:k.messages.filter(h=>h.role==="user"||h.role==="assistant").map(h=>({id:String(h.id),role:h.role,content:h.content,timestamp:h.timestamp})),createdAt:k.started_at,updatedAt:k.ended_at||k.started_at,model:k.model,messageCount:k.messages.length,endedAt:k.ended_at}:null}),ce=K(()=>T.assignees.map(k=>{const h=Object.values(k.counts||{}).reduce((i,b)=>i+b,0);return{label:`${k.name} · ${c("kanban.stats.tasks")}: ${h}`,value:k.name}}));dt(()=>[d.taskId,T.selectedBoard],async([k,h])=>{if(!k){s.value=null;return}E.value=!0;try{const i=await Me(k,{board:h});d.taskId===k&&T.selectedBoard===h&&(s.value=i)}catch{d.taskId===k&&T.selectedBoard===h&&$.error(c("kanban.message.loadFailed"))}finally{d.taskId===k&&T.selectedBoard===h&&(E.value=!1)}},{immediate:!0});function Z(k){return k?new Date(k*1e3).toLocaleString():"—"}async function ne(){if(d.taskId){if(!P.value){P.value=!0;return}try{await T.completeTasks([d.taskId],J.value.trim()||void 0),$.success(c("kanban.message.taskCompleted")),P.value=!1,J.value="",_("updated"),_("close")}catch(k){$.error(k.message)}}}async function de(){if(!(!d.taskId||!R.value.trim()))try{await T.blockTask(d.taskId,R.value.trim()),$.success(c("kanban.message.taskBlocked")),V.value=!1,R.value="",_("updated"),_("close")}catch(k){$.error(k.message)}}async function oe(){if(d.taskId)try{await T.unblockTasks([d.taskId]),$.success(c("kanban.message.taskUnblocked")),_("updated"),_("close")}catch(k){$.error(k.message)}}async function ve(){if(!(!d.taskId||!O.value))try{await T.assignTask(d.taskId,O.value),$.success(c("kanban.message.taskAssigned")),O.value=null,s.value&&(s.value=await Me(d.taskId,{board:T.selectedBoard})),_("updated")}catch(k){$.error(k.message)}}return(k,h)=>(m(),g(X,null,[y(t(Wt),{show:!!a.taskId,width:420,placement:"right","onUpdate:show":h[6]||(h[6]=i=>{i||_("close")})},{default:S(()=>[y(t(jt),{title:s.value?.task.title||"",closable:""},{default:S(()=>[y(t(Ue),{show:E.value},{default:S(()=>[s.value?(m(),g(X,{key:0},[o("div",We,[o("div",je,[o("span",Ge,u(t(c)("kanban.detail.status")),1),o("span",{class:ge(["detail-value status-badge",s.value.task.status])},u(W.value),3)]),o("div",He,[o("span",Qe,u(t(c)("kanban.detail.assignee")),1),o("span",Ye,u(s.value.task.assignee||"—"),1)]),o("div",Ze,[o("span",Xe,u(t(c)("kanban.detail.priority")),1),o("span",ea,u(s.value.task.priority),1)]),o("div",aa,[o("span",ta,u(t(c)("kanban.detail.tenant")),1),o("span",sa,u(s.value.task.tenant||"—"),1)]),o("div",na,[o("span",la,u(t(c)("kanban.detail.createdAt")),1),o("span",ia,u(Z(s.value.task.created_at)),1)]),s.value.task.started_at?(m(),g("div",ra,[o("span",oa,u(t(c)("kanban.detail.startedAt")),1),o("span",ua,u(Z(s.value.task.started_at)),1)])):A("",!0),s.value.task.completed_at?(m(),g("div",ca,[o("span",da,u(t(c)("kanban.detail.completedAt")),1),o("span",va,u(Z(s.value.task.completed_at)),1)])):A("",!0)]),s.value.task.body?(m(),g("div",fa,[o("div",ka,u(t(c)("kanban.form.body")),1),o("div",ma,u(s.value.task.body),1)])):A("",!0),U.value?(m(),g("div",ba,[o("div",pa,u(t(c)("kanban.detail.result")),1),o("div",{class:"result-summary",onClick:H},u(U.value),1)])):A("",!0),j.value?(m(),g("div",_a,[o("div",ya,u(t(c)("kanban.action.title")),1),o("div",ha,[P.value?(m(),g("div",ga,[y(t(pe),{value:J.value,"onUpdate:value":h[1]||(h[1]=i=>J.value=i),size:"small",placeholder:t(c)("kanban.action.completeSummary")},null,8,["value","placeholder"]),y(t(M),{size:"small",type:"primary",onClick:ne},{default:S(()=>[D(u(t(c)("common.ok")),1)]),_:1}),y(t(M),{size:"small",onClick:h[2]||(h[2]=i=>{P.value=!1,J.value=""})},{default:S(()=>[D(u(t(c)("common.cancel")),1)]),_:1})])):(m(),ae(t(M),{key:0,size:"small",onClick:h[0]||(h[0]=i=>P.value=!0)},{default:S(()=>[D(u(t(c)("kanban.action.complete")),1)]),_:1})),s.value.task.status==="blocked"?(m(),ae(t(M),{key:2,size:"small",onClick:oe},{default:S(()=>[D(u(t(c)("kanban.action.unblock")),1)]),_:1})):(m(),g(X,{key:3},[V.value?(m(),g("div",wa,[y(t(pe),{value:R.value,"onUpdate:value":h[4]||(h[4]=i=>R.value=i),size:"small",placeholder:t(c)("kanban.action.blockReason")},null,8,["value","placeholder"]),y(t(M),{size:"small",type:"primary",onClick:de},{default:S(()=>[D(u(t(c)("common.ok")),1)]),_:1})])):(m(),ae(t(M),{key:0,size:"small",onClick:h[3]||(h[3]=i=>V.value=!0)},{default:S(()=>[D(u(t(c)("kanban.action.block")),1)]),_:1}))],64))]),s.value.task.status!=="running"?(m(),g("div",Sa,[y(t(be),{value:O.value,"onUpdate:value":h[5]||(h[5]=i=>O.value=i),options:ce.value,size:"small",placeholder:t(c)("kanban.action.assignTo"),style:{flex:"1"}},null,8,["value","options","placeholder"]),y(t(M),{size:"small",disabled:!O.value,onClick:ve},{default:S(()=>[D(u(t(c)("kanban.action.assign")),1)]),_:1},8,["disabled"])])):A("",!0)])):A("",!0),s.value.runs.length>0?(m(),g("div",Ta,[o("div",{class:"section-title",style:{cursor:"pointer"},onClick:se},[D(u(t(c)("kanban.detail.sessions"))+" ",1),G.value?(m(),ae(t(Ue),{key:0,size:12,style:{"margin-left":"6px"}})):A("",!0)]),F.value&&q.value.length>0?(m(),g("div",$a,[(m(!0),g(X,null,ue(q.value,i=>(m(),g("div",{key:i.id,class:"session-item",onClick:b=>t(v).push({name:"hermes.chat",query:{session:i.id}})},[o("div",Ba,u(i.title||i.id),1),o("div",Ra,[o("span",null,u(i.source),1),o("span",null,u(i.model),1),o("span",null,u(Z(i.started_at)),1)])],8,Ca))),128))])):A("",!0),F.value&&!G.value&&q.value.length===0?(m(),g("div",Aa,u(t(c)("kanban.detail.noSessions")),1)):A("",!0)])):A("",!0),s.value.runs.length>0?(m(),g("div",Pa,[o("div",Ua,u(t(c)("kanban.detail.runs")),1),(m(!0),g(X,null,ue(s.value.runs,i=>(m(),g("div",{key:i.id,class:"run-item"},[o("div",Oa,[o("span",{class:ge(["run-status",i.status])},u(i.status),3),o("span",xa,u(i.profile||"—"),1),o("span",Ia,u(Z(i.started_at)),1)]),i.summary?(m(),g("div",Ea,u(i.summary),1)):A("",!0),i.error?(m(),g("div",Ka,u(i.error),1)):A("",!0)]))),128))])):A("",!0),s.value.comments.length>0?(m(),g("div",za,[o("div",Da,u(t(c)("kanban.detail.comments")),1),(m(!0),g(X,null,ue(s.value.comments,i=>(m(),g("div",{key:i.id,class:"comment-item"},[o("div",qa,[o("span",Fa,u(i.author),1),o("span",La,u(Z(i.created_at)),1)]),o("div",Na,u(i.body),1)]))),128))])):A("",!0),s.value.events.length>0?(m(),g("div",Va,[o("div",Ja,u(t(c)("kanban.detail.events")),1),(m(!0),g(X,null,ue(s.value.events.slice(-10),i=>(m(),g("div",{key:i.id,class:"event-item"},[o("span",Ma,u(i.kind),1),o("span",Wa,u(Z(i.created_at)),1)]))),128))])):A("",!0)],64)):A("",!0)]),_:1},8,["show"])]),_:1},8,["title"])]),_:1},8,["show"]),re.value?(m(),ae(t(Oe),{key:0,show:C.value,preset:"card",title:s.value?.task.title||"",style:{width:"900px",maxWidth:"calc(100vw - 48px)"},onClose:h[7]||(h[7]=i=>C.value=!1)},{default:S(()=>[o("div",ja,[y(ns,{session:re.value},null,8,["session"])])]),_:1},8,["show","title"])):A("",!0)],64))}})})),Is=Q((()=>{})),ht,Es=Q((()=>{Ga(),Ga(),Is(),Ie(),ht=Ee(yt,[["__scopeId","data-v-85605bae"]])})),gt,Ha=Q((()=>{ye(),Se(),Te(),Ke(),gt=we({__name:"KanbanCreateForm",emits:["close","created"],setup(a,{emit:l}){const d=l,{t:_}=$e(),c=xe(),v=Ce(),$=w(""),T=w(""),s=w(null),E=w(null),O=w(!1),R=K(()=>[{label:_("kanban.card.priority.low"),value:1},{label:_("kanban.card.priority.medium"),value:2},{label:_("kanban.card.priority.high"),value:3}]),V=K(()=>v.assignees.map(P=>{const C=Object.values(P.counts||{}).reduce((U,W)=>U+W,0);return{label:`${P.name} · ${_("kanban.stats.tasks")}: ${C}`,value:P.name}}));async function J(){if(!$.value.trim()){c.warning(_("kanban.form.titleRequired"));return}O.value=!0;try{await v.createTask({title:$.value.trim(),body:T.value.trim()||void 0,assignee:s.value||void 0,priority:E.value??void 0}),c.success(_("kanban.message.taskCreated")),d("created"),d("close")}catch(P){c.error(P.message)}finally{O.value=!1}}return(P,C)=>(m(),ae(t(Oe),{show:!0,preset:"dialog",title:t(_)("kanban.createTask"),style:{width:"480px"},onClose:C[5]||(C[5]=U=>d("close"))},{action:S(()=>[y(t(M),{onClick:C[4]||(C[4]=U=>d("close"))},{default:S(()=>[D(u(t(_)("common.cancel")),1)]),_:1}),y(t(M),{type:"primary",loading:O.value,onClick:J},{default:S(()=>[D(u(t(_)("common.create")),1)]),_:1},8,["loading"])]),default:S(()=>[y(t(Yt),{"label-placement":"top"},{default:S(()=>[y(t(he),{label:t(_)("kanban.form.title")},{default:S(()=>[y(t(pe),{value:$.value,"onUpdate:value":C[0]||(C[0]=U=>$.value=U),placeholder:t(_)("kanban.form.titlePlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),y(t(he),{label:t(_)("kanban.form.body")},{default:S(()=>[y(t(pe),{value:T.value,"onUpdate:value":C[1]||(C[1]=U=>T.value=U),type:"textarea",rows:3,placeholder:t(_)("kanban.form.bodyPlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),y(t(he),{label:t(_)("kanban.form.assignee")},{default:S(()=>[y(t(be),{value:s.value,"onUpdate:value":C[2]||(C[2]=U=>s.value=U),options:V.value,placeholder:t(_)("kanban.form.selectAssignee"),clearable:""},null,8,["value","options","placeholder"])]),_:1},8,["label"]),y(t(he),{label:t(_)("kanban.form.priority")},{default:S(()=>[y(t(be),{value:E.value,"onUpdate:value":C[3]||(C[3]=U=>E.value=U),options:R.value,placeholder:t(_)("kanban.form.selectPriority"),clearable:""},null,8,["value","options","placeholder"])]),_:1},8,["label"])]),_:1})]),_:1},8,["title"]))}})})),wt,Ks=Q((()=>{Ha(),Ha(),wt=gt})),Qa,Ya,Za,Xa,et,at,tt,st,nt,lt,it,rt,ot,ut,St,ct=Q((()=>{ye(),Se(),Te(),ft(),is(),Es(),Ks(),Ke(),Qa={class:"kanban-view"},Ya={class:"page-header"},Za={class:"header-title"},Xa={class:"header-actions"},et={key:0,class:"stats-bar"},at={class:"stat-count"},tt={class:"stat-label"},st={class:"stat-chip total"},nt={class:"stat-count"},lt={class:"stat-label"},it={class:"kanban-board"},rt={class:"task-list"},ot={key:0,class:"column-empty"},ut={class:"board-form"},St=we({__name:"KanbanView",setup(a){const{t:l}=$e(),d=Xt(),_=vt(),c=xe(),v=Ce(),$=w(!1),T=w(!1),s=w(null),E=w(""),O=w(""),R=w(!1),V=w(null),J=w(!1),P=["triage","todo","ready","running","blocked","done","archived"];function C(i){return Array.isArray(i)?typeof i[0]=="string"?i[0]:null:typeof i=="string"?i:null}function U(){return C(d.query.board)}async function W(i){U()!==i&&await _.replace({query:{...d.query,board:i}})}async function j(i,b=!0,p=!1){const Y=v.selectedBoard,{board:_e,recovered:fe}=v.recoverSelectedBoard(i||v.selectedBoard||"default");s.value=null,$.value=!1,T.value=!1,b&&fe&&v.boardWarning&&c.warning(v.boardWarning),await W(_e),(p||_e!==Y)&&await v.refreshAll()}function q(i){return`${l("kanban.stats.tasks")}: ${i}`}const G=K(()=>v.activeBoards.map(i=>{const b=typeof i.total=="number"?i.total:0;return{label:`${l("kanban.title")}: ${i.icon?`${i.icon} `:""}${i.name||i.slug} · ${q(b)}`,value:i.slug}})),F=K({get:()=>v.selectedBoard,set:i=>{j(i||"default")}}),te=K(()=>{const i={};for(const b of P)i[b]=v.tasks.filter(p=>p.status===b).sort((p,Y)=>Y.created_at-p.created_at);return i}),se=K(()=>[{label:l("kanban.allStatuses"),value:""},...P.map(i=>({label:l(`kanban.columns.${i}`,i),value:i}))]),H=K(()=>[{label:l("kanban.allAssignees"),value:""},...v.assignees.map(i=>{const b=Object.values(i.counts||{}).reduce((p,Y)=>p+Y,0);return{label:`${l("kanban.detail.assignee")}: ${i.name} · ${q(b)}`,value:i.name}})]),re=K({get:()=>v.filterStatus||"",set:i=>v.setFilter("status",i||null)}),ce=K({get:()=>v.filterAssignee||"",set:i=>v.setFilter("assignee",i||null)});dt(()=>d.query.board,async()=>{J.value&&await j(U(),!1)}),Ht(async()=>{await Promise.all([v.fetchBoards(),v.fetchCapabilities()]),await j(U(),!0,!0),v.startEventStream(),J.value=!0,V.value=setInterval(()=>{document.visibilityState==="visible"&&Promise.all([v.fetchBoards(),v.fetchTasks(!0),v.fetchStats()])},15e3)}),Gt(()=>{v.stopEventStream(),V.value&&clearInterval(V.value)});function Z(i){s.value=i}function ne(){s.value=null}async function de(){await Promise.all([v.fetchTasks(),v.fetchStats()])}async function oe(){await v.fetchTasks()}async function ve(){await Promise.all([v.fetchTasks(),v.fetchStats(),v.fetchBoards()])}async function k(){const i=E.value.trim();if(!i){c.warning(l("kanban.board.slugRequired"));return}R.value=!0;try{const b=await v.createBoard({slug:i,name:O.value.trim()||void 0});E.value="",O.value="",T.value=!1,await W(b.slug),c.success(l("kanban.board.created"))}catch(b){c.error(b.message)}finally{R.value=!1}}async function h(){if(v.selectedBoard!=="default"&&window.confirm(l("kanban.board.archiveConfirm"))){R.value=!0;try{await v.archiveSelectedBoard(),await W(ie),c.success(l("kanban.board.archived"))}catch(i){c.error(i.message)}finally{R.value=!1}}}return(i,b)=>(m(),g("div",Qa,[o("header",Ya,[o("h2",Za,u(t(l)("kanban.title")),1),o("div",Xa,[y(t(be),{value:F.value,"onUpdate:value":b[0]||(b[0]=p=>F.value=p),options:G.value,loading:t(v).boardsLoading,size:"small",style:{width:"260px"}},null,8,["value","options","loading"]),y(t(M),{size:"small",loading:R.value,onClick:b[1]||(b[1]=p=>T.value=!0)},{default:S(()=>[D(u(t(l)("common.add")),1)]),_:1},8,["loading"]),y(t(M),{size:"small",secondary:"",disabled:t(v).selectedBoard===t(ie),loading:R.value,onClick:h},{default:S(()=>[D(u(t(l)("kanban.board.archive")),1)]),_:1},8,["disabled","loading"]),y(t(be),{value:re.value,"onUpdate:value":[b[2]||(b[2]=p=>re.value=p),oe],options:se.value,size:"small",style:{width:"150px"}},null,8,["value","options"]),y(t(be),{value:ce.value,"onUpdate:value":[b[3]||(b[3]=p=>ce.value=p),oe],options:H.value,size:"small",style:{width:"170px"}},null,8,["value","options"]),y(t(M),{type:"primary",size:"small",onClick:b[4]||(b[4]=p=>$.value=!0)},{icon:S(()=>[...b[10]||(b[10]=[o("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[o("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),o("line",{x1:"5",y1:"12",x2:"19",y2:"12"})],-1)])]),default:S(()=>[D(" "+u(t(l)("kanban.createTask")),1)]),_:1})])]),t(v).stats?(m(),g("div",et,[(m(),g(X,null,ue(P,p=>o("div",{key:p,class:ge(["stat-chip",p])},[o("span",at,u(t(v).stats.by_status[p]||0),1),o("span",tt,u(t(l)(`kanban.columns.${p}`,p)),1)],2)),64)),o("div",st,[o("span",nt,u(t(v).stats.total),1),o("span",lt,u(t(l)("kanban.stats.total")),1)])])):A("",!0),y(t(Ue),{show:t(v).loading&&t(v).tasks.length===0},{default:S(()=>[o("div",it,[y(t(Mt),null,{default:S(()=>[(m(),g(X,null,ue(P,p=>y(t(Qt),{key:p,title:`${t(l)(`kanban.columns.${p}`,p)} (${te.value[p].length})`,name:p},{default:S(()=>[o("div",rt,[(m(!0),g(X,null,ue(te.value[p],Y=>(m(),ae(bt,{key:Y.id,task:Y,onClick:_e=>Z(Y.id)},null,8,["task","onClick"]))),128)),te.value[p].length===0?(m(),g("div",ot,u(t(l)("kanban.noTasks")),1)):A("",!0)])]),_:2},1032,["title","name"])),64))]),_:1})])]),_:1},8,["show"]),y(ht,{"task-id":s.value,onClose:ne,onUpdated:de},null,8,["task-id"]),y(t(Oe),{show:T.value,"onUpdate:show":b[8]||(b[8]=p=>T.value=p),preset:"dialog",title:t(l)("kanban.board.create"),style:{width:"420px"}},{action:S(()=>[y(t(M),{onClick:b[7]||(b[7]=p=>T.value=!1)},{default:S(()=>[D(u(t(l)("common.cancel")),1)]),_:1}),y(t(M),{type:"primary",loading:R.value,onClick:k},{default:S(()=>[D(u(t(l)("common.create")),1)]),_:1},8,["loading"])]),default:S(()=>[o("div",ut,[y(t(pe),{value:E.value,"onUpdate:value":b[5]||(b[5]=p=>E.value=p),placeholder:t(l)("kanban.board.slugPlaceholder")},null,8,["value","placeholder"]),y(t(pe),{value:O.value,"onUpdate:value":b[6]||(b[6]=p=>O.value=p),placeholder:t(l)("kanban.board.namePlaceholder")},null,8,["value","placeholder"])])]),_:1},8,["show","title"]),$.value?(m(),ae(wt,{key:1,onClose:b[9]||(b[9]=p=>$.value=!1),onCreated:ve})):A("",!0)]))}})})),zs=Q((()=>{})),Ds,qs=Q((()=>{ct(),ct(),zs(),Ie(),Ds=Ee(St,[["__scopeId","data-v-dabc03ef"]])}));qs();export{Ds as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as y}from"./rolldown-runtime-BKwlnUi0.js";import{Nt as u,Rt as n,Tt as h,U as $,Vt as d,X as D,Y as E,Z as F,_t as _,ct as O,ht as G,it as v,q as w,rt as c,tt as o,zt as V}from"./ui-vendor-CsTMg6zH.js";import{c as H,n as W,o as X,r as Y}from"./vue-vendor-D8zSB7VM.js";import{c as Z,n as j,s as J,t as Q,u as M}from"./_plugin-vue_export-helper-
|
|
1
|
+
import{n as y}from"./rolldown-runtime-BKwlnUi0.js";import{Nt as u,Rt as n,Tt as h,U as $,Vt as d,X as D,Y as E,Z as F,_t as _,ct as O,ht as G,it as v,q as w,rt as c,tt as o,zt as V}from"./ui-vendor-CsTMg6zH.js";import{c as H,n as W,o as X,r as Y}from"./vue-vendor-D8zSB7VM.js";import{c as Z,n as j,s as J,t as Q,u as M}from"./_plugin-vue_export-helper-CrLlP_D3.js";import{w as ee}from"./index-Bzb-xLYu.js";import{a as te,o as ae,r as se}from"./auth-hbDI2OUF.js";var x,P,T,A,C,K,N,B,R,U,z,q=y((()=>{$(),ee(),X(),W(),Z(),te(),x={class:"login-view"},P={class:"login-card"},T={class:"login-title"},A={class:"login-desc"},C={key:0,class:"login-method-toggle"},K=["placeholder"],N=["placeholder"],B=["placeholder"],R={key:2,class:"login-error"},U=["disabled"],z=O({__name:"LoginView",setup(ne){const{t}=Y(),m=H(),k=window.__LOGIN_TOKEN__||"",f=u(k),p=u(""),g=u(""),i=u(!1),a=u(""),l=u("token"),L=u(!1);J()&&m.replace("/hermes/chat"),G(async()=>{try{const s=await se();L.value=s.hasPasswordLogin,s.hasPasswordLogin&&!k&&(l.value="password")}catch{}});async function b(){l.value==="token"?await I():await S()}async function I(){const s=f.value.trim();if(!s){a.value=t("login.tokenRequired");return}i.value=!0,a.value="";try{const e=await fetch("/api/hermes/sessions",{headers:{Authorization:`Bearer ${s}`}});if(e.status===401){a.value=t("login.invalidToken"),i.value=!1;return}if(e.status===429||e.status===503){a.value=t("login.tooManyAttempts"),i.value=!1;return}M(s),m.replace("/hermes/chat")}catch{a.value=t("login.connectionFailed")}finally{i.value=!1}}async function S(){if(!p.value.trim()||!g.value){a.value=t("login.credentialsRequired");return}i.value=!0,a.value="";try{M(await ae(p.value.trim(),g.value)),m.replace("/hermes/chat")}catch(s){s.status===429||s.status===503?a.value=t("login.tooManyAttempts"):a.value=s.message||t("login.invalidCredentials")}finally{i.value=!1}}return(s,e)=>(_(),v("div",x,[o("div",P,[e[5]||(e[5]=o("div",{class:"login-logo"},[o("img",{src:"/logo.png",alt:"Hermes",width:"80",height:"80"})],-1)),o("h1",T,d(n(t)("login.title")),1),o("p",A,d(n(t)("login.description")),1),L.value?(_(),v("div",C,[o("button",{class:V(["toggle-btn",{active:l.value==="password"}]),onClick:e[0]||(e[0]=r=>l.value="password")},d(n(t)("login.passwordLogin")),3),o("button",{class:V(["toggle-btn",{active:l.value==="token"}]),onClick:e[1]||(e[1]=r=>l.value="token")},d(n(t)("login.tokenLogin")),3)])):c("",!0),o("form",{class:"login-form",onSubmit:D(b,["prevent"])},[l.value==="token"?h((_(),v("input",{key:0,"onUpdate:modelValue":e[2]||(e[2]=r=>f.value=r),type:"password",class:"login-input",placeholder:n(t)("login.placeholder"),autofocus:""},null,8,K)),[[w,f.value]]):c("",!0),l.value==="password"?(_(),v(F,{key:1},[h(o("input",{"onUpdate:modelValue":e[3]||(e[3]=r=>p.value=r),type:"text",class:"login-input",placeholder:n(t)("login.usernamePlaceholder"),autofocus:""},null,8,N),[[w,p.value]]),h(o("input",{"onUpdate:modelValue":e[4]||(e[4]=r=>g.value=r),type:"password",class:"login-input",placeholder:n(t)("login.passwordPlaceholder"),onKeyup:E(b,["enter"])},null,40,B),[[w,g.value]])],64)):c("",!0),a.value?(_(),v("div",R,d(a.value),1)):c("",!0),o("button",{type:"submit",class:"login-btn",disabled:i.value},d(i.value?"...":n(t)("login.submit")),9,U)],32)])]))}})})),oe=y((()=>{})),ie,le=y((()=>{q(),q(),oe(),j(),ie=Q(z,[["__scopeId","data-v-d2e24f5f"]])}));le();export{ie as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as f}from"./rolldown-runtime-BKwlnUi0.js";import{F as K,Nt as u,Rt as i,Tt as X,U as Y,Vt as o,Z as E,_t as r,ct as ee,et as b,ht as se,it as c,k as N,l as le,ot as ae,q as te,rt as oe,st as m,t as ie,tt as t,wt as U,y as ne,yt as ue,zt as y}from"./ui-vendor-CsTMg6zH.js";import{n as re,r as ce}from"./vue-vendor-D8zSB7VM.js";import{c as ve,l as P,n as _e,t as de}from"./_plugin-vue_export-helper-
|
|
1
|
+
import{n as f}from"./rolldown-runtime-BKwlnUi0.js";import{F as K,Nt as u,Rt as i,Tt as X,U as Y,Vt as o,Z as E,_t as r,ct as ee,et as b,ht as se,it as c,k as N,l as le,ot as ae,q as te,rt as oe,st as m,t as ie,tt as t,wt as U,y as ne,yt as ue,zt as y}from"./ui-vendor-CsTMg6zH.js";import{n as re,r as ce}from"./vue-vendor-D8zSB7VM.js";import{c as ve,l as P,n as _e,t as de}from"./_plugin-vue_export-helper-CrLlP_D3.js";async function ge(){return(await P("/api/hermes/logs")).files}async function pe(V,a){const n=new URLSearchParams;a?.lines&&n.set("lines",String(a.lines)),a?.level&&n.set("level",a.level),a?.session&&n.set("session",a.session),a?.since&&n.set("since",a.since);const v=n.toString();return(await P(`/api/hermes/logs/${V}${v?`?${v}`:""}`)).entries.filter(_=>_!==null)}var me=f((()=>{ve()})),k,O,z,B,F,I,S,G,T,q,D,$,A,W,M=f((()=>{Y(),ie(),re(),me(),k={class:"logs-view"},O={class:"page-header"},z={class:"header-title"},B={class:"header-actions"},F=["placeholder"],I={class:"logs-body"},S={key:0,class:"logs-empty"},G={class:"log-list"},T={class:"log-time"},q={class:"log-logger"},D={class:"access-method"},$={class:"access-path"},A={key:1,class:"log-message"},W=ee({__name:"LogsView",setup(V){const{t:a}=ce(),n=ne(),v=u([]),_=u("agent"),w=u([]),d=u(!1),L=u(100),R=u(""),h=u(""),H=b(()=>v.value.map(s=>({label:`${s.name} (${s.size})`,value:s.name}))),Q=b(()=>[{label:a("logs.all"),value:""},{label:"ERROR",value:"ERROR"},{label:"WARNING",value:"WARNING"},{label:"INFO",value:"INFO"},{label:"DEBUG",value:"DEBUG"}]),Z=[{label:"50",value:50},{label:"100",value:100},{label:"200",value:200},{label:"500",value:500}],C=b(()=>{if(!h.value)return w.value;const s=h.value.toLowerCase();return w.value.filter(e=>e.message.toLowerCase().includes(s)||e.logger.toLowerCase().includes(s)||e.raw.toLowerCase().includes(s))});function x(s){switch(s){case"ERROR":return"level-error";case"WARNING":return"level-warning";case"DEBUG":return"level-debug";default:return"level-info"}}function j(s){const e=s.match(/\d{2}:\d{2}:\d{2}/);return e?e[0]:s}function g(s){const e=s.match(/"(\w+)\s+(\S+)\s+HTTP\/[^"]+"\s+(\d+)/);return e?{method:e[1],path:e[2],status:e[3]}:null}async function p(){d.value=!0;try{w.value=(await pe(_.value,{lines:L.value,level:R.value||void 0})).filter(s=>s!==null)}catch(s){n.error(s.message)}finally{d.value=!1}}return se(async()=>{v.value=await ge(),await p()}),(s,e)=>(r(),c("div",k,[t("header",O,[t("h2",z,o(i(a)("logs.title")),1),t("div",B,[m(i(N),{value:_.value,"onUpdate:value":[e[0]||(e[0]=l=>_.value=l),p],options:H.value,size:"small",class:"input-md"},null,8,["value","options"]),m(i(N),{value:R.value,options:Q.value,size:"small",class:"input-sm","onUpdate:value":e[1]||(e[1]=l=>{R.value=l,p()})},null,8,["value","options"]),m(i(N),{value:L.value,options:Z,size:"small",class:"input-sm","onUpdate:value":e[2]||(e[2]=l=>{L.value=l,p()})},null,8,["value"]),X(t("input",{"onUpdate:modelValue":e[3]||(e[3]=l=>h.value=l),class:"search-input",placeholder:i(a)("logs.searchPlaceholder")},null,8,F),[[te,h.value]]),m(i(K),{size:"small",loading:d.value,onClick:p},{default:U(()=>[ae(o(i(a)("logs.refresh")),1)]),_:1},8,["loading"])])]),t("div",I,[m(i(le),{show:d.value,class:"logs-spin"},{default:U(()=>[C.value.length===0&&!d.value?(r(),c("div",S,o(i(a)("logs.noEntries")),1)):oe("",!0),t("div",G,[(r(!0),c(E,null,ue(C.value,(l,J)=>(r(),c("div",{key:J,class:y(["log-entry",x(l.level)])},[t("span",T,o(j(l.timestamp)),1),t("span",{class:y(["log-level",x(l.level)])},o(l.level),3),t("span",q,o(l.logger),1),g(l.message)?(r(),c(E,{key:0},[t("span",D,o(g(l.message).method),1),t("span",$,o(g(l.message).path),1),t("span",{class:y(["access-status","status-"+(g(l.message).status?.[0]||"x")])},o(g(l.message).status),3)],64)):(r(),c("span",A,o(l.message),1))],2))),128))])]),_:1},8,["show"])])]))}})})),he=f((()=>{})),fe,we=f((()=>{M(),M(),he(),_e(),fe=de(W,[["__scopeId","data-v-a840928e"]])}));we();export{fe as default};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/js/mermaid-Dc9pVNd5.js","assets/js/rolldown-runtime-BKwlnUi0.js"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{n as y}from"./rolldown-runtime-BKwlnUi0.js";import{Nt as S,Q as oe,St as ae,U as ie,X as se,Z as le,_t as R,ct as ce,et as de,ht as ue,it as H,mt as me,nt as fe,pt as P,rt as pe,t as ge,tt as z,y as he}from"./ui-vendor-CsTMg6zH.js";import{n as we,r as ve}from"./vue-vendor-D8zSB7VM.js";import{a as _e,c as ke,o as ye}from"./_plugin-vue_export-helper-
|
|
2
|
+
import{n as y}from"./rolldown-runtime-BKwlnUi0.js";import{Nt as S,Q as oe,St as ae,U as ie,X as se,Z as le,_t as R,ct as ce,et as de,ht as ue,it as H,mt as me,nt as fe,pt as P,rt as pe,t as ge,tt as z,y as he}from"./ui-vendor-CsTMg6zH.js";import{n as we,r as ve}from"./vue-vendor-D8zSB7VM.js";import{a as _e,c as ke,o as ye}from"./_plugin-vue_export-helper-CrLlP_D3.js";import{Ut as be,Wt as Me}from"./mermaid-Dc9pVNd5.js";import{a as Le,i as $e,n as j,r as Ce}from"./vendor-D9rSt2qK.js";import{n as Ae,t as Re}from"./clipboard-BqPv71We.js";function E(e,n){const t=ye();if(e.startsWith("/api/hermes/download?"))try{const i=new URL(e,"http://localhost").searchParams.get("path");i&&(e=i)}catch{}const r=new URLSearchParams({path:decodeURIComponent(e)});if(n){const i=decodeURIComponent(n);r.set("name",i)}const a=_e();return a&&r.set("token",a),`${t}/api/hermes/download?${r.toString()}`}async function F(e,n){const t=E(e,n),r=await fetch(t);if(!r.ok){const v=await r.json().catch(()=>({error:`HTTP ${r.status}`}));throw new Error(v.error||`Download failed: ${r.status}`)}const a=await r.blob(),i=URL.createObjectURL(a),c=document.createElement("a");c.href=i,c.download=n||e.split("/").pop()||"download",document.body.appendChild(c),c.click(),document.body.removeChild(c),URL.revokeObjectURL(i)}var Fe=y((()=>{ke()}));function L(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function Ee(e){return e.replace(/[^a-z0-9_-]/gi,"-")||"plain"}function xe(e){const n=e?.trim().toLowerCase()||"";return K[n]||n}function W(e,n,t,r={}){const a=n?.trim().toLowerCase()||"",i=xe(a),c=r.maxHighlightLength??Number.POSITIVE_INFINITY;let v="",_=i||a||"plain",f=a;try{i&&j.getLanguage(i)&&e.length<=c?(v=j.highlight(e,{language:i,ignoreIllegals:!0}).value,_=i):(v=L(e),f||(f="text"))}catch{v=L(e),f||(f="text")}return`<pre class="hljs-code-block"><div class="code-header">${f?`<span class="code-lang">${L(f)}</span>`:""}<button type="button" class="copy-btn" data-copy-code="true">${L(t)}</button></div><code class="hljs language-${Ee(_)}">${v}</code></pre>`}async function Te(e){return Re(e)}async function Ie(e){const n=e.target;if(!(n instanceof HTMLElement))return null;const t=n.closest('[data-copy-code="true"]');if(!t)return null;e.preventDefault();const r=t.closest(".hljs-code-block")?.querySelector("code")?.textContent??"";return r?Te(r):!1}var K,Ne=y((()=>{Ce(),Ae(),K={shellscript:"bash",sh:"bash",zsh:"bash",yml:"yaml",vue:"xml"}}));function b(e){const n=e.match(/^( {0,3})(`{3,}|~{3,})(.*)$/);if(!n)return null;const[,t,r,a=""]=n,i=r[0],c=a.trim();return i==="`"&&c.includes("`")?null:{indent:t,marker:i,fence:r,length:r.length,info:c}}function G(e,n=e.length,t=e.info){return`${e.indent}${e.marker.repeat(n)}${t?` ${t}`:""}`}function X(e){const n=e.info.split(/\s+/)[0]?.toLowerCase();return Q.has(n)}function Ue(e,n){const t=b(e);return!!(t&&t.marker===n.marker&&t.length>=n.length&&t.info==="")}function Y(e,n=e.length-1){let t=n;for(;t>=0&&e[t].trim()==="";)t-=1;return t}function Be(e,n,t){for(let r=Y(e);r>t;r-=1)if(Ue(e[r],n))return r;return-1}function De(e,n){const t=[];let r=!1;for(const a of e){const i=b(a);if(!i||i.marker!==n)continue;r=!0;const c=t[t.length-1];if(i.info===""&&c&&i.length>=c.length){t.pop();continue}t.push({marker:i.marker,length:i.length})}return r&&t.length===0}function Se(e,n,t){const r=[];for(let a=t;a<e.length;a+=1){const i=b(e[a]);i&&i.marker===n.marker&&i.info===""&&i.length>=n.length&&r.push(a)}for(let a=r.length-1;a>=0;a-=1){const i=r[a];if(De(e.slice(t,i),n.marker))return i}return r[0]??-1}function He(e,n){let t=0;for(const r of e){const a=b(r);a?.marker===n&&(t=Math.max(t,a.length))}return t}function Pe(e){const n=[];for(let t=0;t<e.length;t+=1){const r=b(e[t]);if(!r||!X(r)){n.push(e[t]);continue}const a=Se(e,r,t+1);if(a===-1){n.push(e[t]);continue}const i=e.slice(t+1,a),c=He(i,r.marker);if(c>=r.length){const v=c+1;n.push(G(r,v)),n.push(...i),n.push(G(r,v,""))}else n.push(e[t]),n.push(...i),n.push(e[a]);t=a}return n}function ze(e){if(!e.includes("```")&&!e.includes("~~~"))return e;const n=e.split(`
|
|
3
3
|
`),t=[];let r=!1;for(let a=0;a<n.length;a+=1){const i=b(n[a]);if(!i||!X(i)){t.push(n[a]);continue}const c=Be(n,i,a+1);if(c===-1){t.push(n[a]);continue}if(c!==Y(n)){t.push(n[a]);continue}t.push(...Pe(n.slice(a+1,c))),t.push(...n.slice(c+1)),r=!0;break}return r?t.join(`
|
|
4
4
|
`):e}var Q,je=y((()=>{Q=new Set(["md","markdown","mdown","mkd"])}));function We(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function Ge(e){return e?.trim().split(/\s+/)[0]?.toLowerCase()||""}function Oe(e){return Ge(e)===J}function Ve(e){return encodeURIComponent(e)}function O(e){if(!e)return"";try{return decodeURIComponent(e)}catch{return""}}function qe(e){return['<div class="mermaid-diagram" data-mermaid-pending="true"',` data-mermaid-source="${We(Ve(e))}">`,'<div class="mermaid-loading">Rendering Mermaid diagram…</div>',"</div>"].join("")}var J,Ze,x,Ke=y((()=>{J="mermaid",Ze=2e4,x=5e3})),V,q,ee,Z=y((()=>{ie(),we(),ge(),$e(),Ne(),je(),Ke(),Fe(),Me(),V=["innerHTML"],q=["src"],ee=ce({__name:"MarkdownRenderer",props:{content:{},mentionNames:{default:()=>[]}},setup(e){const n=e,{t}=ve(),r=he(),a=new Le({html:!1,breaks:!0,linkify:!0,typographer:!0,highlight(o,s){return W(o,s,t("common.copy"))}}),i=a.renderer.rules.fence?.bind(a.renderer.rules);a.renderer.rules.fence=(o,s,d,u,g)=>{const h=o[s];return Oe(h.info)?qe(h.content):i?i(o,s,d,u,g):g.renderToken(o,s,d)};const c=S(null),v=`hermes-mermaid-${Math.random().toString(36).slice(2)}`,_=S(null);let f=0,k=!1;function $(o){return o.startsWith("/")||/^[a-zA-Z]:[\\/]/.test(o)}function C(o){return/^[a-zA-Z]:\\/.test(o)?o.replace(/\\/g,"/"):o}const T=de(()=>{let o=a.render(ze(n.content));if(o=o.replace(/\bsrc=(["'])([^"']+)\1/g,(s,d,u)=>$(u)?`src=${d}${E(C(u))}${d}`:s),o=o.replace(/<a href="([^"]+)">([^<]+)<\/a>/g,(s,d,u)=>{if(!$(d))return s;const g=C(d),h=u.trim(),m=g.split(".").pop()?.toLowerCase();return m==="mp4"||m==="webm"||m==="mov"?`<div class="markdown-video-container">
|
|
5
5
|
<video class="markdown-video" controls preload="metadata" src="${E(g)}"></video>
|