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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/dist/client/assets/js/{ChannelsView-9bNGmPOL.js → ChannelsView-CvORJMzg.js} +1 -1
  2. package/dist/client/assets/js/{ChatView-CrMN1j5u.js → ChatView-DihfBNUf.js} +1 -1
  3. package/dist/client/assets/js/{FileRenameModal-C4oWOgjw.js → FileRenameModal-DN-U6DZT.js} +1 -1
  4. package/dist/client/assets/js/{FilesView-pDP8mSTZ.js → FilesView-BxW5kOlO.js} +1 -1
  5. package/dist/client/assets/js/{GroupChatView-BV3Dxn4i.js → GroupChatView-Cdyg0EOz.js} +1 -1
  6. package/dist/client/assets/js/{HistoryMessageList-CHk-rOIr.js → HistoryMessageList-S77rD1zj.js} +1 -1
  7. package/dist/client/assets/js/{HistoryView-RE-m9Yx6.js → HistoryView-DM7qDtZb.js} +1 -1
  8. package/dist/client/assets/js/{JobsView-BkXCTE4b.js → JobsView-BqylpVBm.js} +1 -1
  9. package/dist/client/assets/js/{KanbanView-Bwlm-lFI.js → KanbanView-C8uXrTRt.js} +1 -1
  10. package/dist/client/assets/js/{LoginView-Cil7q9fA.js → LoginView-ISxozFfh.js} +1 -1
  11. package/dist/client/assets/js/{LogsView-BRXZpNpB.js → LogsView-CtCOjFb5.js} +1 -1
  12. package/dist/client/assets/js/{MarkdownRenderer-BbsOzYq-.js → MarkdownRenderer-BJbqsrMI.js} +1 -1
  13. package/dist/client/assets/js/{MemoryView-BeY8xybk.js → MemoryView-Bc-a9i1U.js} +1 -1
  14. package/dist/client/assets/js/{MessageItem-DWHvbLzg.js → MessageItem-DOA2nFJg.js} +1 -1
  15. package/dist/client/assets/js/{ModelsView-C33B9WXE.js → ModelsView-CmcXLgHA.js} +1 -1
  16. package/dist/client/assets/js/{OutlinePanel-CxJshR71.js → OutlinePanel-D2LVzKPs.js} +1 -1
  17. package/dist/client/assets/js/{PerformanceView-Bcs2X6p5.js → PerformanceView-BIMfq0BU.js} +1 -1
  18. package/dist/client/assets/js/{PluginsView-ClPgLZw1.js → PluginsView-DfSS_RTl.js} +1 -1
  19. package/dist/client/assets/js/{ProfilesView-C4kzKN1z.js → ProfilesView-CVh7LT-n.js} +1 -1
  20. package/dist/client/assets/js/{SettingRow-BAmGrtcn.js → SettingRow-Dt5XWkpQ.js} +1 -1
  21. package/dist/client/assets/js/{SettingsView-BuKFsiAz.js → SettingsView-hA4C1YcG.js} +1 -1
  22. package/dist/client/assets/js/{SkillsUsageView-CRcgWp1p.js → SkillsUsageView-_ToBXkb1.js} +1 -1
  23. package/dist/client/assets/js/{SkillsView-B2j4jJMz.js → SkillsView-DMUkyn3M.js} +1 -1
  24. package/dist/client/assets/js/{TerminalView-0vvlfSha.js → TerminalView-CS_MwrJD.js} +1 -1
  25. package/dist/client/assets/js/{UsageView-3v8bYw4Z.js → UsageView-D6o-9cR-.js} +1 -1
  26. package/dist/client/assets/js/{_plugin-vue_export-helper-B8gz9Iqn.js → _plugin-vue_export-helper-CHoatqkO.js} +2 -2
  27. package/dist/client/assets/js/{index-Cuk9R8hy.js → index-DpU5R9KV.js} +1 -1
  28. package/dist/client/assets/js/{models-Of46_lGf.js → models-CDdUhb_e.js} +1 -1
  29. package/dist/client/assets/js/profiles-CyjgPK1f.js +1 -0
  30. package/dist/client/assets/js/{session-browser-prefs-IGK7Xpdn.js → session-browser-prefs-C6G-jnbR.js} +1 -1
  31. package/dist/client/assets/js/{skills-BQ2jtPxK.js → skills-vuknhTFJ.js} +1 -1
  32. package/dist/client/index.html +3 -3
  33. package/dist/server/index.js +2 -2
  34. package/dist/server/index.js.map +1 -1
  35. package/package.json +1 -1
  36. package/dist/client/assets/js/profiles-DiEn61KW.js +0 -1
@@ -1,4 +1,4 @@
1
- import{n as V}from"./rolldown-runtime-BKwlnUi0.js";import{$ as dt,A as Ja,Bt as Q,Ct as Ze,D as st,Et as Ya,H as Wa,Ht as d,I as J,J as Xa,K as qa,M as Qa,N as Za,Pt as k,Q as fe,T as es,Tt as R,Vt as qe,W as Be,X as Qe,Z as Ne,_t as wa,at as y,bt as Te,c as ts,ct as x,d as vt,f as Ue,gt as Ve,h as Xe,ht as os,it as N,lt as De,mt as je,nt as e,rt as xe,st as G,t as et,tt as S,vt as f,y as xa,z as Me,zt as n}from"./ui-vendor-BMwF7QXa.js";import{c as ba,d as ns,n as Ke,o as Ia,r as Je,s as as,u as ss}from"./vue-vendor-kBYBtqCg.js";import{d as ce,l as Sa,n as Oe,o as $a,t as He}from"./_plugin-vue_export-helper-B8gz9Iqn.js";import{O as ls,k as rs}from"./vendor-CGQjY-CL.js";import{r as Ta,t as Ma}from"./profiles-DiEn61KW.js";import{B as Pe,O as Ra,V as Aa,W as is,_ as us,g as cs,k as Na,v as ds}from"./index-Cuk9R8hy.js";import{n as vs,t as ms}from"./clipboard-4x9B6X3a.js";import{n as Pa,t as Da}from"./useToolTraceVisibility-Cw5ZcA7e.js";import{a as ps,i as gs,n as fs,o as hs,r as lt,t as mt}from"./MarkdownRenderer-BbsOzYq-.js";import{a as _s,i as ys,n as Cs,o as ks,r as ws,s as xs,t as bs}from"./ttsHelpers-CEvJOgh2.js";function Is(p){if(he?.connected)return he;const t=$a(),v=p?.userId||localStorage.getItem("gc_user_id")||Ba();return localStorage.setItem("gc_user_id",v),he=rs("/group-chat",{auth:{token:t||void 0,userId:v,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}),he}function Ss(){let p=localStorage.getItem("gc_user_id");return p||(p=Ba(),localStorage.setItem("gc_user_id",p)),p}function $s(){return localStorage.getItem("gc_user_name")}function Ba(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,p=>{const t=Math.random()*16|0;return(p==="x"?t:t&3|8).toString(16)})}function Le(){return he?.connected?he:null}function Ts(){he&&(he.disconnect(),he=null)}async function Ms(p){return ce("/api/hermes/group-chat/rooms",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(p)})}async function Rs(p,t){return ce(`/api/hermes/group-chat/rooms/${p}/clone`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t||{})})}async function As(){return ce("/api/hermes/group-chat/rooms")}async function pt(p){return ce(`/api/hermes/group-chat/rooms/${p}`)}async function Ns(p){return ce(`/api/hermes/group-chat/rooms/join/${p}`)}async function Ps(p,t){return ce(`/api/hermes/group-chat/rooms/${p}/agents`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)})}async function Ds(p){return ce(`/api/hermes/group-chat/rooms/${p}/agents`)}async function Bs(p,t){return ce(`/api/hermes/group-chat/rooms/${p}/agents/${t}`,{method:"DELETE"})}async function Fs(p){return ce(`/api/hermes/group-chat/rooms/${p}`,{method:"DELETE"})}async function zs(p){return ce(`/api/hermes/group-chat/rooms/${p}/clear-context`,{method:"POST"})}async function Es(p,t){return ce(`/api/hermes/group-chat/rooms/${p}/config`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)})}async function Ls(p){return ce(`/api/hermes/group-chat/rooms/${p}/compress`,{method:"POST"})}var he,Fa=V((()=>{ls(),Sa(),he=null}));async function Us(p){const t=new FormData;for(const l of p)l.file&&t.append("file",l.file,l.name);const v=$a(),r=await fetch("/upload",{method:"POST",body:t,headers:v?{Authorization:`Bearer ${v}`}:{}});if(!r.ok)throw new Error(`Upload failed: ${r.status}`);return(await r.json()).files}function Os(p,t,v){const r=[];p.trim()&&r.push({type:"text",text:p.trim()});for(let l=0;l<v.length;l+=1){const m=v[l],h=t[l];h?.type.startsWith("image/")?r.push({type:"image",name:m.name,path:m.path,media_type:h.type}):r.push({type:"file",name:m.name,path:m.path,media_type:h?.type})}return r}function Hs(){return Date.now().toString(36)+Math.random().toString(36).slice(2,8)}function Gs(p){return/^[a-zA-Z]:\\/.test(p)?p.replace(/\\/g,"/"):p}function be(p){return!!p?.trim()}function Vs(p){return!!p.tool_calls?.length}function rt(p){return p.role==="assistant"&&!be(p.content)&&be(p.reasoning)&&!Vs(p)}function gt(p,t){return{...t,content:be(t.content)?t.content:p?.content||t.content||"",reasoning:be(t.reasoning)?t.reasoning:p?.reasoning??t.reasoning??null,reasoning_content:be(t.reasoning_content)?t.reasoning_content:p?.reasoning_content??t.reasoning_content??null,isStreaming:!1,attachments:p?.attachments||t.attachments}}function js(p){const t=new Map,v=new Map;for(const l of p)if(l.role==="assistant"&&l.tool_calls?.length)for(const m of l.tool_calls)m?.id&&(m.function?.name&&t.set(m.id,m.function.name),m.function?.arguments&&v.set(m.id,m.function.arguments));const r=[];for(const l of p)if(!(l.role!=="tool"&&!l.tool_calls?.length&&!l.content?.trim()&&!l.reasoning?.trim()&&(!l.isStreaming||l.finish_reason==="streaming"))){if(l.role==="assistant"&&l.tool_calls?.length&&!l.content?.trim()){for(const m of l.tool_calls)r.push({...l,id:`${l.id}_${m.id}`,role:"tool",content:"",toolName:m.function?.name||void 0,toolCallId:m.id,toolArgs:m.function?.arguments||void 0,toolStatus:"running"});continue}if(l.role==="tool"){const m=l.tool_call_id||"",h=l.tool_name||t.get(m)||void 0,A=v.get(m)||void 0;let T="";if(l.content)try{const I=JSON.parse(l.content);T=I.url||I.title||I.preview||I.summary||""}catch{T=l.content.slice(0,80)}const b=r.findIndex(I=>I.role==="tool"&&I.toolCallId===m&&!I.toolResult),F={...l,id:b!==-1?r[b].id:l.id,senderId:b!==-1?r[b].senderId:l.senderId,senderName:b!==-1?r[b].senderName:l.senderName,timestamp:b!==-1?r[b].timestamp:l.timestamp,role:"tool",content:"",toolName:h||(b!==-1?r[b].toolName:void 0),toolCallId:m||void 0,toolArgs:A||(b!==-1?r[b].toolArgs:void 0),toolPreview:typeof T=="string"&&T.slice(0,100)||void 0,toolResult:l.content||void 0,toolStatus:"done"};b!==-1?r[b]=F:r.push(F);continue}r.push(l)}return r}var ft,Ye,tt=V((()=>{ns(),Be(),Sa(),Na(),Fa(),ft=300,Ye=ss("groupChat",()=>{const p=k(!1),t=k(null),v=k([]),r=k([]),l=k([]),m=k([]),h=k(""),A=k(!1),T=k(null),b=k(new Map),F=k(new Map),I=k(!1),D=k(new Map);function z(u){I.value=u}function M(u,s){window.dispatchEvent(new CustomEvent("auto-play-speech",{detail:{messageId:u,content:s}}))}async function P(u,s){if(t.value!==u)return;const i=r.value.findIndex(_=>_.id===s);if(!(i<0||!rt(r.value[i])))try{const _=(await pt(u)).messages.find(O=>O.id===s);if(!_||!be(_.content))return;const B=r.value.findIndex(O=>O.id===s);if(B<0||!rt(r.value[B]))return;r.value[B]=gt(r.value[B],_),r.value=[...r.value]}catch{}}function j(u,s){setTimeout(()=>{P(u,s)},ft)}const ee=S(()=>{for(const[,u]of F.value)return u;return null}),L=S(()=>{if(!t.value)return null;for(const u of D.value.values())if(u.roomId===t.value)return u;return null}),se=k(Ss()),Y=k($s()||""),me=S(()=>js([...r.value].sort((u,s)=>u.timestamp-s.timestamp))),ne=S(()=>l.value.map(u=>u.name)),le=S(()=>Array.from(b.value.values()).map(u=>u.name)),W=S(()=>{const u=le.value;return u.length===0?"":u.length===1?`${u[0]} is typing...`:u.length===2?`${u[0]} and ${u[1]} are typing...`:`${u[0]} and ${u.length-1} others are typing...`});function X(){const u=Is({userId:se.value,userName:Y.value||void 0});console.log("[GroupChat] connecting...",{userId:se.value,userName:Y.value}),u.on("connect",()=>{console.log("[GroupChat] connected, socket id:",u.id),p.value=!0,T.value=null}),u.on("disconnect",s=>{console.log("[GroupChat] disconnected:",s),p.value=!1}),u.on("connect_error",s=>{console.error("[GroupChat] connect_error:",s.message),T.value=s.message,p.value=!1}),u.on("message",s=>{if(s.roomId===t.value){const i=r.value.findIndex(B=>B.id===s.id),_=gt(i>=0?r.value[i]:null,s);i>=0?(r.value[i]=_,r.value=[...r.value]):r.value.push(_),I.value&&_.role==="assistant"&&_.content?.trim()&&setTimeout(()=>M(_.id,_.content),300)}}),u.on("message_stream_start",s=>{if(s.roomId!==t.value)return;r.value=r.value.filter(_=>!(_.roomId===s.roomId&&_.senderId===s.senderId&&_.id!==s.id&&_.isStreaming&&!_.content?.trim()&&!_.reasoning?.trim()&&!_.tool_calls?.length)),s.isStreaming=!0;const i=r.value.findIndex(_=>_.id===s.id);if(i>=0){const _=r.value[i];if(!_.isStreaming)return;r.value[i]={..._,...s,content:be(s.content)?s.content:_.content||"",reasoning:be(s.reasoning)?s.reasoning:_.reasoning,reasoning_content:be(s.reasoning_content)?s.reasoning_content:_.reasoning_content,isStreaming:!0},r.value=[...r.value]}else r.value.push(s)}),u.on("message_stream_delta",s=>{if(s.roomId!==t.value)return;const i=r.value.findIndex(_=>_.id===s.id);i<0||!r.value[i].isStreaming||(r.value[i]={...r.value[i],content:r.value[i].content+s.delta},r.value=[...r.value])}),u.on("message_reasoning_delta",s=>{if(s.roomId!==t.value)return;const i=r.value.findIndex(_=>_.id===s.id);i<0||!r.value[i].isStreaming||(r.value[i]={...r.value[i],reasoning:(r.value[i].reasoning||"")+s.delta,reasoning_content:(r.value[i].reasoning_content||"")+s.delta,isStreaming:!0},r.value=[...r.value])}),u.on("message_stream_end",s=>{if(s.roomId!==t.value)return;const i=r.value.findIndex(_=>_.id===s.id);i>=0&&!r.value[i].content?.trim()&&!r.value[i].reasoning?.trim()&&!r.value[i].tool_calls?.length?r.value.splice(i,1):i>=0&&(r.value[i]={...r.value[i],isStreaming:!1},r.value=[...r.value],rt(r.value[i])&&j(s.roomId,s.id))}),u.on("member_joined",s=>{s.roomId===t.value&&(l.value=s.members)}),u.on("member_left",s=>{s.roomId===t.value&&(l.value=s.members)}),u.on("typing",s=>{if(s.roomId===t.value&&!b.value.has(s.userId)){const i=setTimeout(()=>b.value.delete(s.userId),5e3);b.value.set(s.userId,{name:s.userName,timer:i})}}),u.on("stop_typing",s=>{if(s.roomId===t.value&&b.value.has(s.userId)){const i=b.value.get(s.userId);clearTimeout(i.timer),b.value.delete(s.userId)}}),u.on("context_status",s=>{s.roomId===t.value&&(s.status==="ready"?(F.value.delete(s.agentName),r.value=r.value.map(i=>i.senderName===s.agentName&&i.isStreaming?{...i,isStreaming:!1}:i).filter(i=>!(i.senderName===s.agentName&&!i.content?.trim()&&!i.reasoning?.trim()&&!i.tool_calls?.length))):F.value.set(s.agentName,{agentName:s.agentName,status:s.status}),F.value=new Map(F.value))}),u.on("approval.requested",s=>{if(!s.approval_id)return;const i=(Array.isArray(s.choices)?s.choices:["once","session","deny"]).filter(_=>_==="once"||_==="session"||_==="always"||_==="deny");D.value.set(s.approval_id,{roomId:s.roomId,agentName:s.agentName||"",approvalId:s.approval_id,command:s.command||"",description:s.description||"",choices:i.length?i:["once","session","deny"],allowPermanent:!!s.allow_permanent,requestedAt:Date.now()}),D.value=new Map(D.value)}),u.on("approval.resolved",s=>{s.approval_id&&(D.value.delete(s.approval_id),D.value=new Map(D.value))}),u.on("room_updated",s=>{const i=v.value.find(_=>_.id===s.roomId);i&&(i.totalTokens=s.totalTokens)}),u.on("room_cleared",s=>{const i=v.value.find(_=>_.id===s.roomId);i&&(i.totalTokens=s.totalTokens),s.roomId===t.value&&(r.value=[],b.value.clear(),F.value.clear(),D.value.clear())})}function q(){Ts(),p.value=!1,t.value=null,r.value=[],l.value=[],m.value=[],h.value="",b.value.clear(),F.value.clear(),D.value.clear()}function Z(u,s){Y.value=u,localStorage.setItem("gc_user_name",u),localStorage.setItem("gc_user_description",s)}async function re(u){A.value=!0,T.value=null;try{const i=await pt(u);t.value=i.room.id,h.value=i.room.name,r.value=i.messages,m.value=i.agents,l.value=i.members||[]}catch(i){throw T.value=i.message,i}finally{A.value=!1}const s=Le();s&&await new Promise(i=>{s.emit("join",{roomId:u,name:Y.value||void 0,description:localStorage.getItem("gc_user_description")||void 0},_=>{if(!_?.error){if(l.value=_.members||[],_.agents&&(m.value=_.agents),_.typingUsers){for(const B of _.typingUsers)if(!b.value.has(B.userId)){const O=setTimeout(()=>b.value.delete(B.userId),5e3);b.value.set(B.userId,{name:B.userName,timer:O})}}_.contextStatuses&&(F.value=new Map(_.contextStatuses.map(B=>[B.agentName,B])))}i()})})}async function _e(u,s){const i=Le();if(!i||!t.value)return;ve();const _=Hs();let B=u.trim();if(s?.length){const O=await Us(s);B=Os(u,s,O);const c=new Map(O.map(C=>[C.name,Ra(Gs(C.path),C.name)]));r.value.push({id:_,roomId:t.value,senderId:se.value,senderName:Y.value||"You",content:JSON.stringify(B),timestamp:Date.now(),role:"user",attachments:s.map(C=>({...C,url:c.get(C.name)||C.url,file:void 0}))})}return new Promise((O,c)=>{i.emit("message",{roomId:t.value,id:_,content:B},C=>{if(C.error){r.value=r.value.filter($=>$.id!==_),c(new Error(C.error));return}O()})})}async function ae(){try{v.value=(await As()).rooms}catch(u){T.value=u.message}}async function ye(u,s,i,_){try{const B=await Ms({name:u,inviteCode:s,agents:i,compression:_||{triggerTokens:1e5,maxHistoryTokens:32e3,tailMessageCount:10}});return v.value.push(B.room),B}catch(B){throw T.value=B.message,B}}async function de(u){try{const s=await Ns(u);return await re(s.room.id),s.room}catch(s){throw T.value=s.message,s}}async function Ce(u){try{await Fs(u),v.value=v.value.filter(s=>s.id!==u),t.value===u&&(t.value=null,r.value=[],l.value=[],m.value=[],h.value="")}catch(s){throw T.value=s.message,s}}async function ke(u,s){try{const i=await Rs(u,s);return v.value.push(i.room),i}catch(i){throw T.value=i.message,i}}async function Ie(){if(t.value)try{const u=await zs(t.value);r.value=[],b.value.clear(),F.value.clear();const s=v.value.findIndex(i=>i.id===t.value);return s>=0&&u.room&&(v.value[s]=u.room),u}catch(u){throw T.value=u.message,u}}async function pe(u){try{m.value=(await Ds(u)).agents}catch{}}async function Se(u,s){try{const i=await Ps(u,s);return m.value.push(i.agent),i.agent}catch(i){throw T.value=i.message,i}}async function we(u,s){try{const i=await Bs(u,s);m.value=i.agents??m.value.filter(_=>_.id!==s&&_.agentId!==s),i.members&&(l.value=i.members)}catch(i){throw T.value=i.message,i}}let te=null;function Re(){const u=Le();!u||!t.value||(u.emit("typing",{roomId:t.value}),te&&clearTimeout(te),te=setTimeout(()=>ve(),4e3))}function ve(){const u=Le();!u||!t.value||(u.emit("stop_typing",{roomId:t.value}),te&&(clearTimeout(te),te=null))}async function ie(u){const s=Le();!s||!t.value||await new Promise((i,_)=>{s.emit("interrupt_agent",{roomId:t.value,agentName:u},B=>{B?.error?_(new Error(B.error)):i()})})}async function ge(u){const s=Le(),i=L.value;!s||!i||(await new Promise((_,B)=>{s.emit("approval.respond",{roomId:i.roomId,approval_id:i.approvalId,choice:u},O=>{O?.error?B(new Error(O.error)):_()})}),D.value.delete(i.approvalId),D.value=new Map(D.value))}return{connected:p,currentRoomId:t,rooms:v,messages:r,members:l,agents:m,roomName:h,isJoining:A,error:T,contextStatus:ee,contextStatuses:F,pendingApprovals:D,activePendingApproval:L,autoPlaySpeechEnabled:I,userId:se,userName:Y,sortedMessages:me,memberNames:ne,typingNames:le,typingText:W,connect:X,disconnect:q,setUserInfo:Z,setAutoPlaySpeech:z,joinRoom:re,sendMessage:_e,loadRooms:ae,emitTyping:Re,emitStopTyping:ve,interruptAgent:ie,respondApproval:ge,createNewRoom:ye,joinByCode:de,deleteRoom:Ce,cloneRoom:ke,clearCurrentRoomContext:Ie,loadAgents:pe,addAgentToRoom:Se,removeAgentFromRoom:we}})})),ht,_t,yt,Ct,kt,wt,xt,bt,It,St,$t,Tt,Mt,Rt,At,Nt,Pt,Dt,Bt,Ft,zt,Et,Lt,Ut,Ot,Ht,Gt,Vt,jt,Kt,Jt,Yt,Wt,Xt,qt,Qt,Zt,eo,to,$e,it,oo,no,ao,so,We,za,lo=V((()=>{Be(),Ke(),et(),fs(),Aa(),Ma(),ps(),us(),ks(),ys(),Cs(),Na(),ht={key:0,class:"group-message tool-message"},_t={class:"avatar"},yt={class:"msg-body"},Ct={class:"msg-header"},kt={class:"sender-name"},wt={key:0,class:"agent-desc"},xt={key:1,width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5",class:"tool-icon"},bt={class:"tool-name"},It={key:2,class:"tool-preview"},St={key:3,class:"tool-spinner"},$t={key:4,class:"tool-error-badge"},Tt={key:0,class:"tool-detail-section","data-copy-source":"tool-args"},Mt={class:"tool-detail-label"},Rt=["innerHTML"],At={key:1,class:"tool-detail-section","data-copy-source":"tool-result"},Nt={class:"tool-detail-label"},Pt=["innerHTML"],Dt={class:"msg-time"},Bt={class:"avatar"},Ft={class:"msg-body"},zt={class:"msg-header"},Et={class:"sender-name"},Lt={key:0,class:"agent-desc"},Ut={key:0,class:"msg-attachments"},Ot=["src","alt","onClick"],Ht=["href","title"],Gt={class:"att-name"},Vt={class:"att-size"},jt={class:"thinking-label"},Kt={class:"thinking-meta"},Jt={key:0,class:"thinking-body"},Yt={key:3,class:"streaming-dots"},Wt={class:"message-meta"},Xt=["title"],qt={key:0,width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},Qt={key:1,width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},Zt=["title"],eo={class:"message-time"},to=["src"],$e=1e3,it=200,oo=6,no=1e3,ao=50,so=50,We="__truncated__",za=De({__name:"GroupMessageItem",props:{message:{},agents:{},currentUserId:{}},setup(p){const t=p,{t:v}=Je(),r=xa(),l=Ta(),m=xs(),h=_s(),A=k(null),T=S(()=>t.agents.some(o=>o.agentId===t.message.senderId||o.name===t.message.senderName)),b=S(()=>t.message.role!=="assistant"?!1:t.message.finish_reason==="error"?!0:/^Error:\s*/i.test(t.message.content||"")),F=S(()=>!!t.currentUserId&&t.message.senderId===t.currentUserId),I=S(()=>t.agents.find(o=>o.agentId===t.message.senderId||o.name===t.message.senderName)),D=S(()=>new Date(t.message.timestamp).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})),z=S(()=>I.value?.profile||t.message.senderName||t.message.senderId),M=S(()=>l.profiles.find(o=>o.name===I.value?.profile)),P=S(()=>["all",...t.agents.map(o=>o.name).filter(Boolean)]),j=S(()=>ds(t.message.content||"",{streaming:!!t.message.isStreaming})),ee=S(()=>!!(t.message.reasoning&&t.message.reasoning.length>0)),L=S(()=>ee.value||j.value.hasThinking),se=S(()=>{const o=[];return t.message.reasoning&&o.push(t.message.reasoning),o.push(...j.value.segments),j.value.pending&&o.push(j.value.pending),o.join(`
1
+ import{n as V}from"./rolldown-runtime-BKwlnUi0.js";import{$ as dt,A as Ja,Bt as Q,Ct as Ze,D as st,Et as Ya,H as Wa,Ht as d,I as J,J as Xa,K as qa,M as Qa,N as Za,Pt as k,Q as fe,T as es,Tt as R,Vt as qe,W as Be,X as Qe,Z as Ne,_t as wa,at as y,bt as Te,c as ts,ct as x,d as vt,f as Ue,gt as Ve,h as Xe,ht as os,it as N,lt as De,mt as je,nt as e,rt as xe,st as G,t as et,tt as S,vt as f,y as xa,z as Me,zt as n}from"./ui-vendor-BMwF7QXa.js";import{c as ba,d as ns,n as Ke,o as Ia,r as Je,s as as,u as ss}from"./vue-vendor-kBYBtqCg.js";import{d as ce,l as Sa,n as Oe,o as $a,t as He}from"./_plugin-vue_export-helper-CHoatqkO.js";import{O as ls,k as rs}from"./vendor-CGQjY-CL.js";import{r as Ta,t as Ma}from"./profiles-CyjgPK1f.js";import{B as Pe,O as Ra,V as Aa,W as is,_ as us,g as cs,k as Na,v as ds}from"./index-DpU5R9KV.js";import{n as vs,t as ms}from"./clipboard-4x9B6X3a.js";import{n as Pa,t as Da}from"./useToolTraceVisibility-Cw5ZcA7e.js";import{a as ps,i as gs,n as fs,o as hs,r as lt,t as mt}from"./MarkdownRenderer-BJbqsrMI.js";import{a as _s,i as ys,n as Cs,o as ks,r as ws,s as xs,t as bs}from"./ttsHelpers-CEvJOgh2.js";function Is(p){if(he?.connected)return he;const t=$a(),v=p?.userId||localStorage.getItem("gc_user_id")||Ba();return localStorage.setItem("gc_user_id",v),he=rs("/group-chat",{auth:{token:t||void 0,userId:v,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}),he}function Ss(){let p=localStorage.getItem("gc_user_id");return p||(p=Ba(),localStorage.setItem("gc_user_id",p)),p}function $s(){return localStorage.getItem("gc_user_name")}function Ba(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,p=>{const t=Math.random()*16|0;return(p==="x"?t:t&3|8).toString(16)})}function Le(){return he?.connected?he:null}function Ts(){he&&(he.disconnect(),he=null)}async function Ms(p){return ce("/api/hermes/group-chat/rooms",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(p)})}async function Rs(p,t){return ce(`/api/hermes/group-chat/rooms/${p}/clone`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t||{})})}async function As(){return ce("/api/hermes/group-chat/rooms")}async function pt(p){return ce(`/api/hermes/group-chat/rooms/${p}`)}async function Ns(p){return ce(`/api/hermes/group-chat/rooms/join/${p}`)}async function Ps(p,t){return ce(`/api/hermes/group-chat/rooms/${p}/agents`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)})}async function Ds(p){return ce(`/api/hermes/group-chat/rooms/${p}/agents`)}async function Bs(p,t){return ce(`/api/hermes/group-chat/rooms/${p}/agents/${t}`,{method:"DELETE"})}async function Fs(p){return ce(`/api/hermes/group-chat/rooms/${p}`,{method:"DELETE"})}async function zs(p){return ce(`/api/hermes/group-chat/rooms/${p}/clear-context`,{method:"POST"})}async function Es(p,t){return ce(`/api/hermes/group-chat/rooms/${p}/config`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)})}async function Ls(p){return ce(`/api/hermes/group-chat/rooms/${p}/compress`,{method:"POST"})}var he,Fa=V((()=>{ls(),Sa(),he=null}));async function Us(p){const t=new FormData;for(const l of p)l.file&&t.append("file",l.file,l.name);const v=$a(),r=await fetch("/upload",{method:"POST",body:t,headers:v?{Authorization:`Bearer ${v}`}:{}});if(!r.ok)throw new Error(`Upload failed: ${r.status}`);return(await r.json()).files}function Os(p,t,v){const r=[];p.trim()&&r.push({type:"text",text:p.trim()});for(let l=0;l<v.length;l+=1){const m=v[l],h=t[l];h?.type.startsWith("image/")?r.push({type:"image",name:m.name,path:m.path,media_type:h.type}):r.push({type:"file",name:m.name,path:m.path,media_type:h?.type})}return r}function Hs(){return Date.now().toString(36)+Math.random().toString(36).slice(2,8)}function Gs(p){return/^[a-zA-Z]:\\/.test(p)?p.replace(/\\/g,"/"):p}function be(p){return!!p?.trim()}function Vs(p){return!!p.tool_calls?.length}function rt(p){return p.role==="assistant"&&!be(p.content)&&be(p.reasoning)&&!Vs(p)}function gt(p,t){return{...t,content:be(t.content)?t.content:p?.content||t.content||"",reasoning:be(t.reasoning)?t.reasoning:p?.reasoning??t.reasoning??null,reasoning_content:be(t.reasoning_content)?t.reasoning_content:p?.reasoning_content??t.reasoning_content??null,isStreaming:!1,attachments:p?.attachments||t.attachments}}function js(p){const t=new Map,v=new Map;for(const l of p)if(l.role==="assistant"&&l.tool_calls?.length)for(const m of l.tool_calls)m?.id&&(m.function?.name&&t.set(m.id,m.function.name),m.function?.arguments&&v.set(m.id,m.function.arguments));const r=[];for(const l of p)if(!(l.role!=="tool"&&!l.tool_calls?.length&&!l.content?.trim()&&!l.reasoning?.trim()&&(!l.isStreaming||l.finish_reason==="streaming"))){if(l.role==="assistant"&&l.tool_calls?.length&&!l.content?.trim()){for(const m of l.tool_calls)r.push({...l,id:`${l.id}_${m.id}`,role:"tool",content:"",toolName:m.function?.name||void 0,toolCallId:m.id,toolArgs:m.function?.arguments||void 0,toolStatus:"running"});continue}if(l.role==="tool"){const m=l.tool_call_id||"",h=l.tool_name||t.get(m)||void 0,A=v.get(m)||void 0;let T="";if(l.content)try{const I=JSON.parse(l.content);T=I.url||I.title||I.preview||I.summary||""}catch{T=l.content.slice(0,80)}const b=r.findIndex(I=>I.role==="tool"&&I.toolCallId===m&&!I.toolResult),F={...l,id:b!==-1?r[b].id:l.id,senderId:b!==-1?r[b].senderId:l.senderId,senderName:b!==-1?r[b].senderName:l.senderName,timestamp:b!==-1?r[b].timestamp:l.timestamp,role:"tool",content:"",toolName:h||(b!==-1?r[b].toolName:void 0),toolCallId:m||void 0,toolArgs:A||(b!==-1?r[b].toolArgs:void 0),toolPreview:typeof T=="string"&&T.slice(0,100)||void 0,toolResult:l.content||void 0,toolStatus:"done"};b!==-1?r[b]=F:r.push(F);continue}r.push(l)}return r}var ft,Ye,tt=V((()=>{ns(),Be(),Sa(),Na(),Fa(),ft=300,Ye=ss("groupChat",()=>{const p=k(!1),t=k(null),v=k([]),r=k([]),l=k([]),m=k([]),h=k(""),A=k(!1),T=k(null),b=k(new Map),F=k(new Map),I=k(!1),D=k(new Map);function z(u){I.value=u}function M(u,s){window.dispatchEvent(new CustomEvent("auto-play-speech",{detail:{messageId:u,content:s}}))}async function P(u,s){if(t.value!==u)return;const i=r.value.findIndex(_=>_.id===s);if(!(i<0||!rt(r.value[i])))try{const _=(await pt(u)).messages.find(O=>O.id===s);if(!_||!be(_.content))return;const B=r.value.findIndex(O=>O.id===s);if(B<0||!rt(r.value[B]))return;r.value[B]=gt(r.value[B],_),r.value=[...r.value]}catch{}}function j(u,s){setTimeout(()=>{P(u,s)},ft)}const ee=S(()=>{for(const[,u]of F.value)return u;return null}),L=S(()=>{if(!t.value)return null;for(const u of D.value.values())if(u.roomId===t.value)return u;return null}),se=k(Ss()),Y=k($s()||""),me=S(()=>js([...r.value].sort((u,s)=>u.timestamp-s.timestamp))),ne=S(()=>l.value.map(u=>u.name)),le=S(()=>Array.from(b.value.values()).map(u=>u.name)),W=S(()=>{const u=le.value;return u.length===0?"":u.length===1?`${u[0]} is typing...`:u.length===2?`${u[0]} and ${u[1]} are typing...`:`${u[0]} and ${u.length-1} others are typing...`});function X(){const u=Is({userId:se.value,userName:Y.value||void 0});console.log("[GroupChat] connecting...",{userId:se.value,userName:Y.value}),u.on("connect",()=>{console.log("[GroupChat] connected, socket id:",u.id),p.value=!0,T.value=null}),u.on("disconnect",s=>{console.log("[GroupChat] disconnected:",s),p.value=!1}),u.on("connect_error",s=>{console.error("[GroupChat] connect_error:",s.message),T.value=s.message,p.value=!1}),u.on("message",s=>{if(s.roomId===t.value){const i=r.value.findIndex(B=>B.id===s.id),_=gt(i>=0?r.value[i]:null,s);i>=0?(r.value[i]=_,r.value=[...r.value]):r.value.push(_),I.value&&_.role==="assistant"&&_.content?.trim()&&setTimeout(()=>M(_.id,_.content),300)}}),u.on("message_stream_start",s=>{if(s.roomId!==t.value)return;r.value=r.value.filter(_=>!(_.roomId===s.roomId&&_.senderId===s.senderId&&_.id!==s.id&&_.isStreaming&&!_.content?.trim()&&!_.reasoning?.trim()&&!_.tool_calls?.length)),s.isStreaming=!0;const i=r.value.findIndex(_=>_.id===s.id);if(i>=0){const _=r.value[i];if(!_.isStreaming)return;r.value[i]={..._,...s,content:be(s.content)?s.content:_.content||"",reasoning:be(s.reasoning)?s.reasoning:_.reasoning,reasoning_content:be(s.reasoning_content)?s.reasoning_content:_.reasoning_content,isStreaming:!0},r.value=[...r.value]}else r.value.push(s)}),u.on("message_stream_delta",s=>{if(s.roomId!==t.value)return;const i=r.value.findIndex(_=>_.id===s.id);i<0||!r.value[i].isStreaming||(r.value[i]={...r.value[i],content:r.value[i].content+s.delta},r.value=[...r.value])}),u.on("message_reasoning_delta",s=>{if(s.roomId!==t.value)return;const i=r.value.findIndex(_=>_.id===s.id);i<0||!r.value[i].isStreaming||(r.value[i]={...r.value[i],reasoning:(r.value[i].reasoning||"")+s.delta,reasoning_content:(r.value[i].reasoning_content||"")+s.delta,isStreaming:!0},r.value=[...r.value])}),u.on("message_stream_end",s=>{if(s.roomId!==t.value)return;const i=r.value.findIndex(_=>_.id===s.id);i>=0&&!r.value[i].content?.trim()&&!r.value[i].reasoning?.trim()&&!r.value[i].tool_calls?.length?r.value.splice(i,1):i>=0&&(r.value[i]={...r.value[i],isStreaming:!1},r.value=[...r.value],rt(r.value[i])&&j(s.roomId,s.id))}),u.on("member_joined",s=>{s.roomId===t.value&&(l.value=s.members)}),u.on("member_left",s=>{s.roomId===t.value&&(l.value=s.members)}),u.on("typing",s=>{if(s.roomId===t.value&&!b.value.has(s.userId)){const i=setTimeout(()=>b.value.delete(s.userId),5e3);b.value.set(s.userId,{name:s.userName,timer:i})}}),u.on("stop_typing",s=>{if(s.roomId===t.value&&b.value.has(s.userId)){const i=b.value.get(s.userId);clearTimeout(i.timer),b.value.delete(s.userId)}}),u.on("context_status",s=>{s.roomId===t.value&&(s.status==="ready"?(F.value.delete(s.agentName),r.value=r.value.map(i=>i.senderName===s.agentName&&i.isStreaming?{...i,isStreaming:!1}:i).filter(i=>!(i.senderName===s.agentName&&!i.content?.trim()&&!i.reasoning?.trim()&&!i.tool_calls?.length))):F.value.set(s.agentName,{agentName:s.agentName,status:s.status}),F.value=new Map(F.value))}),u.on("approval.requested",s=>{if(!s.approval_id)return;const i=(Array.isArray(s.choices)?s.choices:["once","session","deny"]).filter(_=>_==="once"||_==="session"||_==="always"||_==="deny");D.value.set(s.approval_id,{roomId:s.roomId,agentName:s.agentName||"",approvalId:s.approval_id,command:s.command||"",description:s.description||"",choices:i.length?i:["once","session","deny"],allowPermanent:!!s.allow_permanent,requestedAt:Date.now()}),D.value=new Map(D.value)}),u.on("approval.resolved",s=>{s.approval_id&&(D.value.delete(s.approval_id),D.value=new Map(D.value))}),u.on("room_updated",s=>{const i=v.value.find(_=>_.id===s.roomId);i&&(i.totalTokens=s.totalTokens)}),u.on("room_cleared",s=>{const i=v.value.find(_=>_.id===s.roomId);i&&(i.totalTokens=s.totalTokens),s.roomId===t.value&&(r.value=[],b.value.clear(),F.value.clear(),D.value.clear())})}function q(){Ts(),p.value=!1,t.value=null,r.value=[],l.value=[],m.value=[],h.value="",b.value.clear(),F.value.clear(),D.value.clear()}function Z(u,s){Y.value=u,localStorage.setItem("gc_user_name",u),localStorage.setItem("gc_user_description",s)}async function re(u){A.value=!0,T.value=null;try{const i=await pt(u);t.value=i.room.id,h.value=i.room.name,r.value=i.messages,m.value=i.agents,l.value=i.members||[]}catch(i){throw T.value=i.message,i}finally{A.value=!1}const s=Le();s&&await new Promise(i=>{s.emit("join",{roomId:u,name:Y.value||void 0,description:localStorage.getItem("gc_user_description")||void 0},_=>{if(!_?.error){if(l.value=_.members||[],_.agents&&(m.value=_.agents),_.typingUsers){for(const B of _.typingUsers)if(!b.value.has(B.userId)){const O=setTimeout(()=>b.value.delete(B.userId),5e3);b.value.set(B.userId,{name:B.userName,timer:O})}}_.contextStatuses&&(F.value=new Map(_.contextStatuses.map(B=>[B.agentName,B])))}i()})})}async function _e(u,s){const i=Le();if(!i||!t.value)return;ve();const _=Hs();let B=u.trim();if(s?.length){const O=await Us(s);B=Os(u,s,O);const c=new Map(O.map(C=>[C.name,Ra(Gs(C.path),C.name)]));r.value.push({id:_,roomId:t.value,senderId:se.value,senderName:Y.value||"You",content:JSON.stringify(B),timestamp:Date.now(),role:"user",attachments:s.map(C=>({...C,url:c.get(C.name)||C.url,file:void 0}))})}return new Promise((O,c)=>{i.emit("message",{roomId:t.value,id:_,content:B},C=>{if(C.error){r.value=r.value.filter($=>$.id!==_),c(new Error(C.error));return}O()})})}async function ae(){try{v.value=(await As()).rooms}catch(u){T.value=u.message}}async function ye(u,s,i,_){try{const B=await Ms({name:u,inviteCode:s,agents:i,compression:_||{triggerTokens:1e5,maxHistoryTokens:32e3,tailMessageCount:10}});return v.value.push(B.room),B}catch(B){throw T.value=B.message,B}}async function de(u){try{const s=await Ns(u);return await re(s.room.id),s.room}catch(s){throw T.value=s.message,s}}async function Ce(u){try{await Fs(u),v.value=v.value.filter(s=>s.id!==u),t.value===u&&(t.value=null,r.value=[],l.value=[],m.value=[],h.value="")}catch(s){throw T.value=s.message,s}}async function ke(u,s){try{const i=await Rs(u,s);return v.value.push(i.room),i}catch(i){throw T.value=i.message,i}}async function Ie(){if(t.value)try{const u=await zs(t.value);r.value=[],b.value.clear(),F.value.clear();const s=v.value.findIndex(i=>i.id===t.value);return s>=0&&u.room&&(v.value[s]=u.room),u}catch(u){throw T.value=u.message,u}}async function pe(u){try{m.value=(await Ds(u)).agents}catch{}}async function Se(u,s){try{const i=await Ps(u,s);return m.value.push(i.agent),i.agent}catch(i){throw T.value=i.message,i}}async function we(u,s){try{const i=await Bs(u,s);m.value=i.agents??m.value.filter(_=>_.id!==s&&_.agentId!==s),i.members&&(l.value=i.members)}catch(i){throw T.value=i.message,i}}let te=null;function Re(){const u=Le();!u||!t.value||(u.emit("typing",{roomId:t.value}),te&&clearTimeout(te),te=setTimeout(()=>ve(),4e3))}function ve(){const u=Le();!u||!t.value||(u.emit("stop_typing",{roomId:t.value}),te&&(clearTimeout(te),te=null))}async function ie(u){const s=Le();!s||!t.value||await new Promise((i,_)=>{s.emit("interrupt_agent",{roomId:t.value,agentName:u},B=>{B?.error?_(new Error(B.error)):i()})})}async function ge(u){const s=Le(),i=L.value;!s||!i||(await new Promise((_,B)=>{s.emit("approval.respond",{roomId:i.roomId,approval_id:i.approvalId,choice:u},O=>{O?.error?B(new Error(O.error)):_()})}),D.value.delete(i.approvalId),D.value=new Map(D.value))}return{connected:p,currentRoomId:t,rooms:v,messages:r,members:l,agents:m,roomName:h,isJoining:A,error:T,contextStatus:ee,contextStatuses:F,pendingApprovals:D,activePendingApproval:L,autoPlaySpeechEnabled:I,userId:se,userName:Y,sortedMessages:me,memberNames:ne,typingNames:le,typingText:W,connect:X,disconnect:q,setUserInfo:Z,setAutoPlaySpeech:z,joinRoom:re,sendMessage:_e,loadRooms:ae,emitTyping:Re,emitStopTyping:ve,interruptAgent:ie,respondApproval:ge,createNewRoom:ye,joinByCode:de,deleteRoom:Ce,cloneRoom:ke,clearCurrentRoomContext:Ie,loadAgents:pe,addAgentToRoom:Se,removeAgentFromRoom:we}})})),ht,_t,yt,Ct,kt,wt,xt,bt,It,St,$t,Tt,Mt,Rt,At,Nt,Pt,Dt,Bt,Ft,zt,Et,Lt,Ut,Ot,Ht,Gt,Vt,jt,Kt,Jt,Yt,Wt,Xt,qt,Qt,Zt,eo,to,$e,it,oo,no,ao,so,We,za,lo=V((()=>{Be(),Ke(),et(),fs(),Aa(),Ma(),ps(),us(),ks(),ys(),Cs(),Na(),ht={key:0,class:"group-message tool-message"},_t={class:"avatar"},yt={class:"msg-body"},Ct={class:"msg-header"},kt={class:"sender-name"},wt={key:0,class:"agent-desc"},xt={key:1,width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5",class:"tool-icon"},bt={class:"tool-name"},It={key:2,class:"tool-preview"},St={key:3,class:"tool-spinner"},$t={key:4,class:"tool-error-badge"},Tt={key:0,class:"tool-detail-section","data-copy-source":"tool-args"},Mt={class:"tool-detail-label"},Rt=["innerHTML"],At={key:1,class:"tool-detail-section","data-copy-source":"tool-result"},Nt={class:"tool-detail-label"},Pt=["innerHTML"],Dt={class:"msg-time"},Bt={class:"avatar"},Ft={class:"msg-body"},zt={class:"msg-header"},Et={class:"sender-name"},Lt={key:0,class:"agent-desc"},Ut={key:0,class:"msg-attachments"},Ot=["src","alt","onClick"],Ht=["href","title"],Gt={class:"att-name"},Vt={class:"att-size"},jt={class:"thinking-label"},Kt={class:"thinking-meta"},Jt={key:0,class:"thinking-body"},Yt={key:3,class:"streaming-dots"},Wt={class:"message-meta"},Xt=["title"],qt={key:0,width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},Qt={key:1,width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},Zt=["title"],eo={class:"message-time"},to=["src"],$e=1e3,it=200,oo=6,no=1e3,ao=50,so=50,We="__truncated__",za=De({__name:"GroupMessageItem",props:{message:{},agents:{},currentUserId:{}},setup(p){const t=p,{t:v}=Je(),r=xa(),l=Ta(),m=xs(),h=_s(),A=k(null),T=S(()=>t.agents.some(o=>o.agentId===t.message.senderId||o.name===t.message.senderName)),b=S(()=>t.message.role!=="assistant"?!1:t.message.finish_reason==="error"?!0:/^Error:\s*/i.test(t.message.content||"")),F=S(()=>!!t.currentUserId&&t.message.senderId===t.currentUserId),I=S(()=>t.agents.find(o=>o.agentId===t.message.senderId||o.name===t.message.senderName)),D=S(()=>new Date(t.message.timestamp).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})),z=S(()=>I.value?.profile||t.message.senderName||t.message.senderId),M=S(()=>l.profiles.find(o=>o.name===I.value?.profile)),P=S(()=>["all",...t.agents.map(o=>o.name).filter(Boolean)]),j=S(()=>ds(t.message.content||"",{streaming:!!t.message.isStreaming})),ee=S(()=>!!(t.message.reasoning&&t.message.reasoning.length>0)),L=S(()=>ee.value||j.value.hasThinking),se=S(()=>{const o=[];return t.message.reasoning&&o.push(t.message.reasoning),o.push(...j.value.segments),j.value.pending&&o.push(j.value.pending),o.join(`
2
2
 
3
3
  `)}),Y=S(()=>{let o=cs(j.value);return t.message.reasoning&&(o+=t.message.reasoning.length),o}),me=S(()=>t.message.isStreaming?!!(j.value.pending!==null||ee.value&&!t.message.content):!1),ne=k(null),le=S(()=>me.value?!0:ne.value!==null?ne.value:!1),W=S(()=>j.value.body||t.message.content||""),X=S(()=>{const o=(t.message.content||"").trim();if(!o.startsWith("[")||!o.endsWith("]"))return null;try{const a=JSON.parse(o);return Array.isArray(a)?a:null}catch{return null}}),q=S(()=>{if(t.message.attachments?.length)return t.message.attachments;const o=X.value;return o?o.flatMap((a,w)=>{if(a?.type!=="image"&&a?.type!=="file")return[];const K=String(a.path||"");if(!K)return[];const U=String(a.name||`${a.type}-${w+1}`);return[{id:`${t.message.id}_attachment_${w}`,name:U,type:a.type==="image"?String(a.media_type||"image/*"):String(a.media_type||"application/octet-stream"),size:0,url:Ra(E(K),U)}]}):[]}),Z=S(()=>q.value.length>0),re=S(()=>{if(t.message.role!=="user")return W.value;const o=X.value;return o?o.filter(a=>a?.type==="text"&&typeof a.text=="string").map(a=>a.text).join(`
4
4
  `):W.value}),_e=S(()=>{if(ye.value)return null;const o=re.value||"";return o.trim()?o:null}),ae=k(!1),ye=S(()=>t.message.role==="tool"),de=S(()=>!!(t.message.toolArgs||t.message.toolResult)),Ce=S(()=>i(t.message.toolArgs)),ke=S(()=>i(t.message.toolResult)),Ie=S(()=>Ce.value.full),pe=S(()=>Ce.value.display),Se=S(()=>ke.value.full),we=S(()=>ke.value.display),te=S(()=>pe.value?_(pe.value,Ce.value.language):""),Re=S(()=>we.value?_(we.value,ke.value.language):""),ve=S(()=>t.message.role!=="assistant"||!W.value.trim()?!1:h.provider.value==="openai"||h.provider.value==="custom"||h.provider.value==="edge"||h.provider.value==="mimo"?!0:m.isSupported),ie=S(()=>h.provider.value==="openai"||h.provider.value==="custom"||h.provider.value==="edge"||h.provider.value==="mimo"?m.currentCustomMessageId.value===t.message.id&&m.isCustomPlaying.value:m.currentMessageId.value===t.message.id&&m.isPlaying.value),ge=S(()=>h.provider.value==="openai"||h.provider.value==="custom"||h.provider.value==="edge"||h.provider.value==="mimo"?m.currentCustomMessageId.value===t.message.id&&m.isCustomPaused.value:m.currentMessageId.value===t.message.id&&m.isPaused.value);function u(o,a){return o.length>it?o.slice(0,it)+`
@@ -1 +1 @@
1
- import{n as c}from"./rolldown-runtime-BKwlnUi0.js";import{Ct as r,Ht as B,Pt as L,Q as S,W as b,at as _,bt as x,it as V,lt as C,mt as o,nt as f,rt as N,tt as p,vt as n,zt as v}from"./ui-vendor-BMwF7QXa.js";import{n as w,r as E}from"./vue-vendor-kBYBtqCg.js";import{n as R,t as W}from"./_plugin-vue_export-helper-B8gz9Iqn.js";import{W as z,h as D,m as F}from"./index-Cuk9R8hy.js";import{n as G,t as P}from"./useToolTraceVisibility-Cw5ZcA7e.js";import{n as Q,t as $}from"./MessageItem-DWHvbLzg.js";var d,h,y=c((()=>{b(),z(),w(),Q(),F(),P(),d={key:0,class:"empty-state"},h=C({__name:"HistoryMessageList",props:{session:{}},setup(M){const H=M,s=D(),{toolTraceVisible:I}=G(),{t:T}=E(),i=L(),a=p(()=>H.session||s.activeSession),k=p(()=>(a.value?.messages||[]).filter(e=>e.role==="tool"?I.value&&!!e.toolName:!!e.content?.trim()));function m(e=200){const t=i.value;return t?t.scrollHeight-t.scrollTop-t.clientHeight<e:!0}function l(){o(()=>{i.value&&(i.value.scrollTop=i.value.scrollHeight)})}function g(e){o(()=>{const t=document.getElementById(`message-${e}`);t&&t.scrollIntoView({block:"center"})})}return r(()=>s.activeSessionId,e=>{if(e){if(s.focusMessageId){o(()=>g(s.focusMessageId));return}o(()=>l())}},{immediate:!0}),r(()=>s.focusMessageId,e=>{e&&g(e)}),r(()=>(a.value?.messages||[])[(a.value?.messages||[]).length-1]?.content,e=>{e&&m()&&l()}),r(()=>(a.value?.messages||[]).length,e=>{e!==0&&m()&&l()}),(e,t)=>(n(),_("div",{ref_key:"listRef",ref:i,class:"message-list"},[!a.value||a.value.messages.length===0?(n(),_("div",d,[t[0]||(t[0]=f("img",{src:"/logo.png",alt:"Hermes",class:"empty-logo"},null,-1)),f("p",null,B(v(T)("chat.emptyState")),1)])):V("",!0),(n(!0),_(S,null,x(k.value,u=>(n(),N($,{key:u.id,message:u,highlight:v(s).focusMessageId===u.id},null,8,["message","highlight"]))),128))],512))}})})),j=c((()=>{})),q,ee=c((()=>{y(),y(),j(),R(),q=W(h,[["__scopeId","data-v-54a1de4f"]])}));export{ee as n,q as t};
1
+ import{n as c}from"./rolldown-runtime-BKwlnUi0.js";import{Ct as r,Ht as B,Pt as L,Q as S,W as b,at as _,bt as x,it as V,lt as C,mt as o,nt as f,rt as N,tt as p,vt as n,zt as v}from"./ui-vendor-BMwF7QXa.js";import{n as w,r as E}from"./vue-vendor-kBYBtqCg.js";import{n as R,t as W}from"./_plugin-vue_export-helper-CHoatqkO.js";import{W as z,h as D,m as F}from"./index-DpU5R9KV.js";import{n as G,t as P}from"./useToolTraceVisibility-Cw5ZcA7e.js";import{n as Q,t as $}from"./MessageItem-DOA2nFJg.js";var d,h,y=c((()=>{b(),z(),w(),Q(),F(),P(),d={key:0,class:"empty-state"},h=C({__name:"HistoryMessageList",props:{session:{}},setup(M){const H=M,s=D(),{toolTraceVisible:I}=G(),{t:T}=E(),i=L(),a=p(()=>H.session||s.activeSession),k=p(()=>(a.value?.messages||[]).filter(e=>e.role==="tool"?I.value&&!!e.toolName:!!e.content?.trim()));function m(e=200){const t=i.value;return t?t.scrollHeight-t.scrollTop-t.clientHeight<e:!0}function l(){o(()=>{i.value&&(i.value.scrollTop=i.value.scrollHeight)})}function g(e){o(()=>{const t=document.getElementById(`message-${e}`);t&&t.scrollIntoView({block:"center"})})}return r(()=>s.activeSessionId,e=>{if(e){if(s.focusMessageId){o(()=>g(s.focusMessageId));return}o(()=>l())}},{immediate:!0}),r(()=>s.focusMessageId,e=>{e&&g(e)}),r(()=>(a.value?.messages||[])[(a.value?.messages||[]).length-1]?.content,e=>{e&&m()&&l()}),r(()=>(a.value?.messages||[]).length,e=>{e!==0&&m()&&l()}),(e,t)=>(n(),_("div",{ref_key:"listRef",ref:i,class:"message-list"},[!a.value||a.value.messages.length===0?(n(),_("div",d,[t[0]||(t[0]=f("img",{src:"/logo.png",alt:"Hermes",class:"empty-logo"},null,-1)),f("p",null,B(v(T)("chat.emptyState")),1)])):V("",!0),(n(!0),_(S,null,x(k.value,u=>(n(),N($,{key:u.id,message:u,highlight:v(s).focusMessageId===u.id},null,8,["message","highlight"]))),128))],512))}})})),j=c((()=>{})),q,ee=c((()=>{y(),y(),j(),R(),q=W(h,[["__scopeId","data-v-54a1de4f"]])}));export{ee as n,q as t};
@@ -1 +1 @@
1
- import{n as U}from"./rolldown-runtime-BKwlnUi0.js";import{Bt as F,Ct as J,D as E,Ht as d,I as P,Pt as m,Q as I,Tt as g,W as ze,_t as Fe,at as v,bt as R,ct as y,gt as Je,it as w,lt as Ee,nt as o,rt as G,st as Q,t as Re,tt as k,vt as l,y as Ge,zt as c}from"./ui-vendor-BMwF7QXa.js";import{c as Qe,n as Ue,o as We,r as je,s as Ke}from"./vue-vendor-kBYBtqCg.js";import{n as Xe,t as Ye}from"./_plugin-vue_export-helper-B8gz9Iqn.js";import{c as Ze,l as es,r as ss,t as ts}from"./profiles-DiEn61KW.js";import{F as os,L as is,P as ns,j as as,m as ls}from"./index-Cuk9R8hy.js";import{n as rs,t as us}from"./session-browser-prefs-IGK7Xpdn.js";import{n as cs,t as se}from"./clipboard-4x9B6X3a.js";import{i as ds,n as vs,o as te,r as oe,s as ps,t as fs}from"./OutlinePanel-CxJshR71.js";import{n as hs,t as _s}from"./HistoryMessageList-CHk-rOIr.js";var ie,ne,ae,le,re,ue,ce,de,ve,pe,fe,he,_e,ge,me,we,ye,Se,ke,xe,Ce,be,He,Me,Ie=U((()=>{ze(),We(),ls(),Ze(),ts(),us(),Re(),Ue(),ps(),cs(),hs(),ds(),vs(),is(),ie={class:"history-panel"},ne={class:"session-list-header"},ae={key:0,class:"session-list-title"},le={class:"session-list-actions"},re={key:0,class:"session-scope-note"},ue={key:1,class:"session-items"},ce={key:0,class:"session-loading"},de={key:1,class:"session-empty"},ve={class:"session-group-header session-group-header--static"},pe={class:"session-group-label"},fe={class:"session-group-count"},he=["onClick"],_e={class:"session-group-label"},ge={class:"session-group-count"},me={class:"chat-main"},we={class:"chat-header"},ye={class:"header-left"},Se={class:"header-session-title"},ke={key:0,class:"source-badge"},xe=["title"],Ce={class:"header-actions"},be={class:"history-content-wrapper"},He={class:"history-main-content"},Me=Ee({__name:"HistoryView",setup(ys){const Ae=es(),$e=ss(),L=rs(),S=Ge(),{t:a}=je(),W=Ke(),M=Qe(),N=k(()=>{const e=W.params.sessionId;return typeof e=="string"&&e.trim()?e:null}),x=k(()=>{const e=W.query.profile;return typeof e=="string"&&e.trim()?e:null}),p=m([]),A=m(!1),$=m(!1),f=m(null),r=m(null),T=m(!1);async function V(){if(!A.value){A.value=!0;try{p.value=await os(void 0,void 0,x.value),$.value=!0}catch(e){console.error("Failed to load Hermes sessions:",e)}finally{A.value=!1}}}const h=m(typeof window>"u"||!window.matchMedia("(max-width: 768px)").matches);let C=null;const Be=m(!1);function D(e){return p.value.find(s=>s.id===e)}async function Pe(e,s){const t=D(e),n=s||t?.profile||null,i=await ns(e,n);if(!i){S.error(a("chat.sessionNotFound"));return}const ee={id:i.id,profile:i.profile||n||void 0,title:i.title||"",source:i.source,createdAt:i.started_at*1e3,updatedAt:(i.last_active||i.started_at)*1e3,model:i.model,messageCount:i.message_count,inputTokens:i.input_tokens,outputTokens:i.output_tokens,endedAt:i.ended_at?i.ended_at*1e3:void 0,lastActiveAt:i.last_active?i.last_active*1e3:void 0,workspace:i.workspace||void 0,messages:i.messages.map(_=>{const H={id:String(_.id),sessionId:_.session_id,role:_.role,content:_.content||"",timestamp:_.timestamp*1e3};return _.role==="tool"&&(H.toolName=_.tool_name,H.toolArgs=_.tool_calls?.[0]?.function?.arguments?JSON.stringify(_.tool_calls[0].function.arguments):void 0,H.toolStatus="done"),_.reasoning&&(H.reasoning=_.reasoning),H})};f.value=ee.id,r.value=ee,C?.matches&&(h.value=!1)}async function b(e,s){await M.push({name:"hermes.historySession",params:{sessionId:e},query:s?{profile:s}:void 0})}async function j(){const e=N.value;if(e){if(!p.value.some(s=>s.id===e)){f.value=null,r.value=null,await M.replace({name:"hermes.history"});return}f.value!==e&&await Pe(e,x.value)}}function O(e){Be.value=e.matches,e.matches&&h.value&&(h.value=!1)}Je(async()=>{Ae.loadModels(),await $e.fetchProfiles(),await V(),await j(),C=window.matchMedia("(max-width: 768px)"),O(C),C.addEventListener("change",O)}),Fe(()=>{C?.removeEventListener("change",O)}),J([N,x],async([e])=>{if(!e){f.value=null,r.value=null,$.value&&await V();return}$.value&&(x.value&&!p.value.some(s=>s.profile===x.value)&&await V(),await j())});const u=m(new Set(JSON.parse(localStorage.getItem("hermes_collapsed_groups")||"[]")));function Le(e){return{id:e.id,profile:e.profile||void 0,title:e.title||"",source:e.source,createdAt:e.started_at*1e3,updatedAt:(e.last_active||e.started_at)*1e3,model:e.model,provider:e.provider,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:[]}}const q=k(()=>p.value.map(Le));function K(e){return e==="api_server"?-1:e==="cron"?999:0}function X(e){return[...e].sort((s,t)=>(t.updatedAt||0)-(s.updatedAt||0))}const z=k(()=>X(q.value.filter(e=>L.isPinned(e.id)))),B=k(()=>{const e=new Map;for(const s of q.value){if(L.isPinned(s.id))continue;const t=s.source||"";e.has(t)||e.set(t,[]),e.get(t).push(s)}return[...e.keys()].sort((s,t)=>{const n=K(s),i=K(t);return n!==i?n-i:s.localeCompare(t)}).map(s=>({source:s,label:s?te(s):a("chat.other"),sessions:X(e.get(s))}))});function Ne(e){if(!u.value.has(e))u.value=new Set([...u.value,e]);else{u.value=new Set(B.value.map(t=>t.source).filter(t=>t!==e));const s=B.value.find(t=>t.source===e);s?.sessions.length&&b(s.sessions[0].id,s.sessions[0].profile)}localStorage.setItem("hermes_collapsed_groups",JSON.stringify([...u.value]))}J(B,e=>{if(localStorage.getItem("hermes_collapsed_groups")!==null){const s=r.value?.source;s&&u.value.has(s)&&(u.value=new Set([...u.value].filter(t=>t!==s)),localStorage.setItem("hermes_collapsed_groups",JSON.stringify([...u.value])));return}e.length>0&&(u.value=new Set(e.slice(1).map(s=>s.source)),localStorage.setItem("hermes_collapsed_groups",JSON.stringify([...u.value])))},{once:!0}),J($,e=>{if(e&&p.value.length>0&&!N.value&&(!f.value||!p.value.find(s=>s.id===f.value))){const s=p.value.find(t=>t.source==="cli");s&&(u.value.has(s.source)&&(u.value=new Set([...u.value].filter(t=>t!==s.source))),b(s.id,s.profile))}},{once:!0});const Te=k(()=>r.value?.title||a("chat.newChat")),Y=k(()=>r.value?.source||"");async function Ve(e){const s=e||f.value;s&&(await se(s)?S.success(a("common.copied")):S.error(a("common.copied")+" ✗"))}function De(e){return r.value?.id===e?r.value.profile||null:D(e)?.profile||null}function Oe(e,s){const t=M.resolve({name:"hermes.historySession",params:{sessionId:e},query:s?{profile:s}:void 0}).href;return`${window.location.origin}${window.location.pathname}${t}`}async function qe(e){const s=e||f.value;s&&(await se(Oe(s,De(s)))?S.success(a("common.copied")):S.error(a("common.copied")+" ✗"))}async function Z(e,s){const t=D(e);if(!await as(e,s||t?.profile||null)){S.error(a("common.deleteFailed"));return}if(L.removePinned(e),p.value=p.value.filter(n=>n.id!==e),f.value===e){f.value=null,r.value=null;const n=q.value[0];n?await b(n.id,n.profile):await M.replace({name:"hermes.history"})}S.success(a("chat.sessionDeleted"))}return(e,s)=>(l(),v("div",ie,[o("div",{class:F(["session-backdrop",{active:h.value}]),onClick:s[0]||(s[0]=t=>h.value=!1)},null,2),o("aside",{class:F(["session-list",{collapsed:!h.value}])},[o("div",ne,[h.value?(l(),v("span",ae,d(c(a)("chat.hermesHistory")),1)):w("",!0),o("div",le,[o("button",{class:"session-close-btn",onClick:s[1]||(s[1]=t=>h.value=!1)},[...s[6]||(s[6]=[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)])])])]),h.value?(l(),v("div",re,d(c(a)("chat.historyScopeHint")),1)):w("",!0),h.value?(l(),v("div",ue,[A.value&&p.value.length===0?(l(),v("div",ce,d(c(a)("common.loading")),1)):p.value.length===0?(l(),v("div",de,d(c(a)("chat.noSessions")),1)):w("",!0),z.value.length>0?(l(),v(I,{key:2},[o("div",ve,[o("span",pe,d(c(a)("chat.pinned")),1),o("span",fe,d(z.value.length),1)]),(l(!0),v(I,null,R(z.value,t=>(l(),G(oe,{key:`pinned-${t.id}`,session:t,active:t.id===f.value,pinned:!0,"can-delete":!0,streaming:!1,"show-profile":!1,onSelect:n=>b(t.id,t.profile),onDelete:n=>Z(t.id,t.profile)},null,8,["session","active","onSelect","onDelete"]))),128))],64)):w("",!0),(l(!0),v(I,null,R(B.value,t=>(l(),v(I,{key:t.source},[o("div",{class:"session-group-header",onClick:n=>Ne(t.source)},[(l(),v("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2",class:F(["group-chevron",{collapsed:u.value.has(t.source)}])},[...s[7]||(s[7]=[o("polyline",{points:"9 18 15 12 9 6"},null,-1)])],2)),o("span",_e,d(t.label),1),o("span",ge,d(t.sessions.length),1)],8,he),u.value.has(t.source)?w("",!0):(l(!0),v(I,{key:0},R(t.sessions,n=>(l(),G(oe,{key:n.id,session:n,active:n.id===f.value,pinned:!1,"can-delete":!0,streaming:!1,"show-profile":!1,onSelect:i=>b(n.id,n.profile),onDelete:i=>Z(n.id,n.profile)},null,8,["session","active","onSelect","onDelete"]))),128))],64))),128))])):w("",!0)],2),o("div",me,[o("header",we,[o("div",ye,[y(c(P),{quaternary:"",size:"small",onClick:s[2]||(s[2]=t=>h.value=!h.value),circle:""},{icon:g(()=>[...s[8]||(s[8]=[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",Se,d(Te.value),1),Y.value?(l(),v("span",ke,d(c(te)(Y.value)),1)):w("",!0),r.value?.workspace?(l(),v("span",{key:1,class:"workspace-badge",title:r.value.workspace},"📁 "+d(r.value.workspace.split("/").pop()||r.value.workspace),9,xe)):w("",!0)]),o("div",Ce,[y(c(E),{trigger:"hover"},{trigger:g(()=>[y(c(P),{quaternary:"",size:"small",onClick:s[3]||(s[3]=t=>T.value=!T.value),circle:""},{icon:g(()=>[...s[9]||(s[9]=[o("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5"},[o("path",{d:"M3 12h18M3 6h18M3 18h18"})],-1)])]),_:1})]),default:g(()=>[Q(" "+d(c(a)("chat.outlineTitle")),1)]),_:1}),y(c(E),{trigger:"hover"},{trigger:g(()=>[y(c(P),{quaternary:"",size:"small",onClick:s[4]||(s[4]=t=>qe()),circle:""},{icon:g(()=>[...s[10]||(s[10]=[o("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5"},[o("path",{d:"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"}),o("path",{d:"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"})],-1)])]),_:1})]),default:g(()=>[Q(" "+d(c(a)("chat.copySessionLink")),1)]),_:1}),y(c(E),{trigger:"hover"},{trigger:g(()=>[y(c(P),{quaternary:"",size:"small",onClick:s[5]||(s[5]=t=>Ve()),circle:""},{icon:g(()=>[...s[11]||(s[11]=[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:g(()=>[Q(" "+d(c(a)("chat.copySessionId")),1)]),_:1})])]),o("div",be,[o("div",He,[y(_s,{session:r.value},null,8,["session"])]),T.value&&r.value?(l(),G(fs,{key:0,messages:r.value.messages||[]},null,8,["messages"])):w("",!0)])])]))}})})),gs=U((()=>{})),ms,ws=U((()=>{Ie(),Ie(),gs(),Xe(),ms=Ye(Me,[["__scopeId","data-v-91c4ee86"]])}));ws();export{ms as default};
1
+ import{n as U}from"./rolldown-runtime-BKwlnUi0.js";import{Bt as F,Ct as J,D as E,Ht as d,I as P,Pt as m,Q as I,Tt as g,W as ze,_t as Fe,at as v,bt as R,ct as y,gt as Je,it as w,lt as Ee,nt as o,rt as G,st as Q,t as Re,tt as k,vt as l,y as Ge,zt as c}from"./ui-vendor-BMwF7QXa.js";import{c as Qe,n as Ue,o as We,r as je,s as Ke}from"./vue-vendor-kBYBtqCg.js";import{n as Xe,t as Ye}from"./_plugin-vue_export-helper-CHoatqkO.js";import{c as Ze,l as es,r as ss,t as ts}from"./profiles-CyjgPK1f.js";import{F as os,L as is,P as ns,j as as,m as ls}from"./index-DpU5R9KV.js";import{n as rs,t as us}from"./session-browser-prefs-C6G-jnbR.js";import{n as cs,t as se}from"./clipboard-4x9B6X3a.js";import{i as ds,n as vs,o as te,r as oe,s as ps,t as fs}from"./OutlinePanel-D2LVzKPs.js";import{n as hs,t as _s}from"./HistoryMessageList-S77rD1zj.js";var ie,ne,ae,le,re,ue,ce,de,ve,pe,fe,he,_e,ge,me,we,ye,Se,ke,xe,Ce,be,He,Me,Ie=U((()=>{ze(),We(),ls(),Ze(),ts(),us(),Re(),Ue(),ps(),cs(),hs(),ds(),vs(),is(),ie={class:"history-panel"},ne={class:"session-list-header"},ae={key:0,class:"session-list-title"},le={class:"session-list-actions"},re={key:0,class:"session-scope-note"},ue={key:1,class:"session-items"},ce={key:0,class:"session-loading"},de={key:1,class:"session-empty"},ve={class:"session-group-header session-group-header--static"},pe={class:"session-group-label"},fe={class:"session-group-count"},he=["onClick"],_e={class:"session-group-label"},ge={class:"session-group-count"},me={class:"chat-main"},we={class:"chat-header"},ye={class:"header-left"},Se={class:"header-session-title"},ke={key:0,class:"source-badge"},xe=["title"],Ce={class:"header-actions"},be={class:"history-content-wrapper"},He={class:"history-main-content"},Me=Ee({__name:"HistoryView",setup(ys){const Ae=es(),$e=ss(),L=rs(),S=Ge(),{t:a}=je(),W=Ke(),M=Qe(),N=k(()=>{const e=W.params.sessionId;return typeof e=="string"&&e.trim()?e:null}),x=k(()=>{const e=W.query.profile;return typeof e=="string"&&e.trim()?e:null}),p=m([]),A=m(!1),$=m(!1),f=m(null),r=m(null),T=m(!1);async function V(){if(!A.value){A.value=!0;try{p.value=await os(void 0,void 0,x.value),$.value=!0}catch(e){console.error("Failed to load Hermes sessions:",e)}finally{A.value=!1}}}const h=m(typeof window>"u"||!window.matchMedia("(max-width: 768px)").matches);let C=null;const Be=m(!1);function D(e){return p.value.find(s=>s.id===e)}async function Pe(e,s){const t=D(e),n=s||t?.profile||null,i=await ns(e,n);if(!i){S.error(a("chat.sessionNotFound"));return}const ee={id:i.id,profile:i.profile||n||void 0,title:i.title||"",source:i.source,createdAt:i.started_at*1e3,updatedAt:(i.last_active||i.started_at)*1e3,model:i.model,messageCount:i.message_count,inputTokens:i.input_tokens,outputTokens:i.output_tokens,endedAt:i.ended_at?i.ended_at*1e3:void 0,lastActiveAt:i.last_active?i.last_active*1e3:void 0,workspace:i.workspace||void 0,messages:i.messages.map(_=>{const H={id:String(_.id),sessionId:_.session_id,role:_.role,content:_.content||"",timestamp:_.timestamp*1e3};return _.role==="tool"&&(H.toolName=_.tool_name,H.toolArgs=_.tool_calls?.[0]?.function?.arguments?JSON.stringify(_.tool_calls[0].function.arguments):void 0,H.toolStatus="done"),_.reasoning&&(H.reasoning=_.reasoning),H})};f.value=ee.id,r.value=ee,C?.matches&&(h.value=!1)}async function b(e,s){await M.push({name:"hermes.historySession",params:{sessionId:e},query:s?{profile:s}:void 0})}async function j(){const e=N.value;if(e){if(!p.value.some(s=>s.id===e)){f.value=null,r.value=null,await M.replace({name:"hermes.history"});return}f.value!==e&&await Pe(e,x.value)}}function O(e){Be.value=e.matches,e.matches&&h.value&&(h.value=!1)}Je(async()=>{Ae.loadModels(),await $e.fetchProfiles(),await V(),await j(),C=window.matchMedia("(max-width: 768px)"),O(C),C.addEventListener("change",O)}),Fe(()=>{C?.removeEventListener("change",O)}),J([N,x],async([e])=>{if(!e){f.value=null,r.value=null,$.value&&await V();return}$.value&&(x.value&&!p.value.some(s=>s.profile===x.value)&&await V(),await j())});const u=m(new Set(JSON.parse(localStorage.getItem("hermes_collapsed_groups")||"[]")));function Le(e){return{id:e.id,profile:e.profile||void 0,title:e.title||"",source:e.source,createdAt:e.started_at*1e3,updatedAt:(e.last_active||e.started_at)*1e3,model:e.model,provider:e.provider,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:[]}}const q=k(()=>p.value.map(Le));function K(e){return e==="api_server"?-1:e==="cron"?999:0}function X(e){return[...e].sort((s,t)=>(t.updatedAt||0)-(s.updatedAt||0))}const z=k(()=>X(q.value.filter(e=>L.isPinned(e.id)))),B=k(()=>{const e=new Map;for(const s of q.value){if(L.isPinned(s.id))continue;const t=s.source||"";e.has(t)||e.set(t,[]),e.get(t).push(s)}return[...e.keys()].sort((s,t)=>{const n=K(s),i=K(t);return n!==i?n-i:s.localeCompare(t)}).map(s=>({source:s,label:s?te(s):a("chat.other"),sessions:X(e.get(s))}))});function Ne(e){if(!u.value.has(e))u.value=new Set([...u.value,e]);else{u.value=new Set(B.value.map(t=>t.source).filter(t=>t!==e));const s=B.value.find(t=>t.source===e);s?.sessions.length&&b(s.sessions[0].id,s.sessions[0].profile)}localStorage.setItem("hermes_collapsed_groups",JSON.stringify([...u.value]))}J(B,e=>{if(localStorage.getItem("hermes_collapsed_groups")!==null){const s=r.value?.source;s&&u.value.has(s)&&(u.value=new Set([...u.value].filter(t=>t!==s)),localStorage.setItem("hermes_collapsed_groups",JSON.stringify([...u.value])));return}e.length>0&&(u.value=new Set(e.slice(1).map(s=>s.source)),localStorage.setItem("hermes_collapsed_groups",JSON.stringify([...u.value])))},{once:!0}),J($,e=>{if(e&&p.value.length>0&&!N.value&&(!f.value||!p.value.find(s=>s.id===f.value))){const s=p.value.find(t=>t.source==="cli");s&&(u.value.has(s.source)&&(u.value=new Set([...u.value].filter(t=>t!==s.source))),b(s.id,s.profile))}},{once:!0});const Te=k(()=>r.value?.title||a("chat.newChat")),Y=k(()=>r.value?.source||"");async function Ve(e){const s=e||f.value;s&&(await se(s)?S.success(a("common.copied")):S.error(a("common.copied")+" ✗"))}function De(e){return r.value?.id===e?r.value.profile||null:D(e)?.profile||null}function Oe(e,s){const t=M.resolve({name:"hermes.historySession",params:{sessionId:e},query:s?{profile:s}:void 0}).href;return`${window.location.origin}${window.location.pathname}${t}`}async function qe(e){const s=e||f.value;s&&(await se(Oe(s,De(s)))?S.success(a("common.copied")):S.error(a("common.copied")+" ✗"))}async function Z(e,s){const t=D(e);if(!await as(e,s||t?.profile||null)){S.error(a("common.deleteFailed"));return}if(L.removePinned(e),p.value=p.value.filter(n=>n.id!==e),f.value===e){f.value=null,r.value=null;const n=q.value[0];n?await b(n.id,n.profile):await M.replace({name:"hermes.history"})}S.success(a("chat.sessionDeleted"))}return(e,s)=>(l(),v("div",ie,[o("div",{class:F(["session-backdrop",{active:h.value}]),onClick:s[0]||(s[0]=t=>h.value=!1)},null,2),o("aside",{class:F(["session-list",{collapsed:!h.value}])},[o("div",ne,[h.value?(l(),v("span",ae,d(c(a)("chat.hermesHistory")),1)):w("",!0),o("div",le,[o("button",{class:"session-close-btn",onClick:s[1]||(s[1]=t=>h.value=!1)},[...s[6]||(s[6]=[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)])])])]),h.value?(l(),v("div",re,d(c(a)("chat.historyScopeHint")),1)):w("",!0),h.value?(l(),v("div",ue,[A.value&&p.value.length===0?(l(),v("div",ce,d(c(a)("common.loading")),1)):p.value.length===0?(l(),v("div",de,d(c(a)("chat.noSessions")),1)):w("",!0),z.value.length>0?(l(),v(I,{key:2},[o("div",ve,[o("span",pe,d(c(a)("chat.pinned")),1),o("span",fe,d(z.value.length),1)]),(l(!0),v(I,null,R(z.value,t=>(l(),G(oe,{key:`pinned-${t.id}`,session:t,active:t.id===f.value,pinned:!0,"can-delete":!0,streaming:!1,"show-profile":!1,onSelect:n=>b(t.id,t.profile),onDelete:n=>Z(t.id,t.profile)},null,8,["session","active","onSelect","onDelete"]))),128))],64)):w("",!0),(l(!0),v(I,null,R(B.value,t=>(l(),v(I,{key:t.source},[o("div",{class:"session-group-header",onClick:n=>Ne(t.source)},[(l(),v("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2",class:F(["group-chevron",{collapsed:u.value.has(t.source)}])},[...s[7]||(s[7]=[o("polyline",{points:"9 18 15 12 9 6"},null,-1)])],2)),o("span",_e,d(t.label),1),o("span",ge,d(t.sessions.length),1)],8,he),u.value.has(t.source)?w("",!0):(l(!0),v(I,{key:0},R(t.sessions,n=>(l(),G(oe,{key:n.id,session:n,active:n.id===f.value,pinned:!1,"can-delete":!0,streaming:!1,"show-profile":!1,onSelect:i=>b(n.id,n.profile),onDelete:i=>Z(n.id,n.profile)},null,8,["session","active","onSelect","onDelete"]))),128))],64))),128))])):w("",!0)],2),o("div",me,[o("header",we,[o("div",ye,[y(c(P),{quaternary:"",size:"small",onClick:s[2]||(s[2]=t=>h.value=!h.value),circle:""},{icon:g(()=>[...s[8]||(s[8]=[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",Se,d(Te.value),1),Y.value?(l(),v("span",ke,d(c(te)(Y.value)),1)):w("",!0),r.value?.workspace?(l(),v("span",{key:1,class:"workspace-badge",title:r.value.workspace},"📁 "+d(r.value.workspace.split("/").pop()||r.value.workspace),9,xe)):w("",!0)]),o("div",Ce,[y(c(E),{trigger:"hover"},{trigger:g(()=>[y(c(P),{quaternary:"",size:"small",onClick:s[3]||(s[3]=t=>T.value=!T.value),circle:""},{icon:g(()=>[...s[9]||(s[9]=[o("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5"},[o("path",{d:"M3 12h18M3 6h18M3 18h18"})],-1)])]),_:1})]),default:g(()=>[Q(" "+d(c(a)("chat.outlineTitle")),1)]),_:1}),y(c(E),{trigger:"hover"},{trigger:g(()=>[y(c(P),{quaternary:"",size:"small",onClick:s[4]||(s[4]=t=>qe()),circle:""},{icon:g(()=>[...s[10]||(s[10]=[o("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5"},[o("path",{d:"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"}),o("path",{d:"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"})],-1)])]),_:1})]),default:g(()=>[Q(" "+d(c(a)("chat.copySessionLink")),1)]),_:1}),y(c(E),{trigger:"hover"},{trigger:g(()=>[y(c(P),{quaternary:"",size:"small",onClick:s[5]||(s[5]=t=>Ve()),circle:""},{icon:g(()=>[...s[11]||(s[11]=[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:g(()=>[Q(" "+d(c(a)("chat.copySessionId")),1)]),_:1})])]),o("div",be,[o("div",He,[y(_s,{session:r.value},null,8,["session"])]),T.value&&r.value?(l(),G(fs,{key:0,messages:r.value.messages||[]},null,8,["messages"])):w("",!0)])])]))}})})),gs=U((()=>{})),ms,ws=U((()=>{Ie(),Ie(),gs(),Xe(),ms=Ye(Me,[["__scopeId","data-v-91c4ee86"]])}));ws();export{ms as default};
@@ -1 +1 @@
1
- import{n as w}from"./rolldown-runtime-BKwlnUi0.js";import{A as ae,Bt as G,Ct as lt,D as X,Ht as r,I as E,M as it,N as rt,Pt as I,Q as U,S as ut,Tt as c,U as dt,W as q,Z as V,at as S,bt as Ae,ct as _,f as ct,gt as Le,it as T,l as ee,lt as B,m as bt,nt as l,ot as vt,p as F,rt as M,st as x,t as Q,tt as R,vt as y,y as We,z as Y,zt as a}from"./ui-vendor-BMwF7QXa.js";import{d as _t,n as H,r as O,u as pt}from"./vue-vendor-kBYBtqCg.js";import{d as N,l as Ke,n as A,t as L}from"./_plugin-vue_export-helper-B8gz9Iqn.js";import{r as ft,t as mt}from"./profiles-DiEn61KW.js";import{b as yt,y as jt}from"./index-Cuk9R8hy.js";import{n as ht,t as gt}from"./MarkdownRenderer-BbsOzYq-.js";function D(e){return e.job}function Qe(e){return typeof e=="object"&&e!==null}function K(e,o=""){if(typeof e=="string")return e;if(!Qe(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 Jt(e,o="—"){if(typeof e=="string")return e;if(!Qe(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 wt(e,o){const t={},p=K(e.schedule,e.schedule_display||""),n=Ze(e.repeat),b=e.deliver||"origin";return o.name!==e.name&&(t.name=o.name),o.schedule!==p&&(t.schedule=o.schedule),o.prompt!==(e.prompt||"")&&(t.prompt=o.prompt),o.deliver!==b&&(t.deliver=o.deliver),o.repeat_times!==n&&(t.repeat=o.repeat_times),t}async function kt(){return(await N("/api/hermes/jobs?include_disabled=true")).jobs}async function xt(e){return D(await N(`/api/hermes/jobs/${e}`))}async function $t(e){return D(await N("/api/hermes/jobs",{method:"POST",body:JSON.stringify(e)}))}async function Ct(e,o){return D(await N(`/api/hermes/jobs/${e}`,{method:"PATCH",body:JSON.stringify(o)}))}async function St(e){return N(`/api/hermes/jobs/${e}`,{method:"DELETE"})}async function It(e){return D(await N(`/api/hermes/jobs/${e}/pause`,{method:"POST"}))}async function Pt(e){return D(await N(`/api/hermes/jobs/${e}/resume`,{method:"POST"}))}async function Mt(e){return D(await N(`/api/hermes/jobs/${e}/run`,{method:"POST"}))}var te=w((()=>{Ke()}));function z(e,o){return e.job_id===o||e.id===o}var W,Z=w((()=>{_t(),q(),te(),W=pt("jobs",()=>{const e=I([]),o=I(!1);async function t(){o.value=!0;try{e.value=await kt()}catch(u){console.error("Failed to fetch jobs:",u)}finally{o.value=!1}}async function p(u){const s=await $t(u);return e.value.unshift(s),s}async function n(u,s){const h=await Ct(u,s),i=e.value.findIndex(P=>z(P,u));return i!==-1&&(e.value[i]=h),h}async function b(u){await St(u),e.value=e.value.filter(s=>!z(s,u))}async function f(u){const s=await It(u),h=e.value.findIndex(i=>z(i,u));h!==-1&&(e.value[h]=s)}async function v(u){const s=await Pt(u),h=e.value.findIndex(i=>z(i,u));h!==-1&&(e.value[h]=s)}async function $(u){const s=await Mt(u),h=e.value.findIndex(i=>z(i,u));h!==-1&&(e.value[h]=s)}return{jobs:e,loading:o,fetchJobs:t,createJob:p,updateJob:n,deleteJob:b,pauseJob:f,resumeJob:v,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(),Q(),te(),Z(),H(),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=B({__name:"JobCard",props:{job:{},selected:{type:Boolean}},emits:["edit","select"],setup(e,{emit:o}){const t=e,p=o,{t:n}=O(),b=W(),f=We(),v=R(()=>t.job.job_id||t.job.id),$=R(()=>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=R(()=>t.job.state==="running"?"info":t.job.state==="paused"?"warning":t.job.enabled?"success":"error"),s=R(()=>Jt(t.job.schedule,t.job.schedule_display||"—")),h=d=>d?new Date(d).toLocaleString():"—";async function i(){try{await b.pauseJob(v.value),f.success(n("jobs.jobPaused"))}catch(d){f.error(d.message)}}async function P(){try{await b.resumeJob(v.value),f.success(n("jobs.jobResumed"))}catch(d){f.error(d.message)}}async function g(){try{await b.runJob(v.value),f.info(n("jobs.jobTriggered"))}catch(d){f.error(d.message)}}async function C(){try{await b.deleteJob(v.value),f.success(n("jobs.jobDeleted"))}catch(d){f.error(d.message)}}function k(d){d.target.closest(".card-actions")||p("select",v.value)}return(d,m)=>(y(),S("div",{class:G(["job-card",{selected:e.selected}]),onClick:k},[l("div",oe,[l("h3",se,r(e.job.name),1),l("span",{class:G(["status-badge",u.value])},r($.value),3)]),l("div",ne,[l("div",le,[l("span",ie,r(a(n)("jobs.info.schedule")),1),l("code",re,r(s.value),1)]),l("div",ue,[l("span",de,r(a(n)("jobs.info.model")),1),l("span",ce,r(e.job.model||"—"),1)]),l("div",be,[l("span",ve,r(a(n)("jobs.info.lastRun")),1),l("span",_e,[x(r(h(e.job.last_run_at))+" ",1),e.job.last_status?(y(),S("span",{key:0,class:G(["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)])]),l("div",pe,[l("span",fe,r(a(n)("jobs.info.nextRun")),1),l("span",me,r(h(e.job.next_run_at)),1)]),l("div",ye,[l("span",je,r(a(n)("jobs.info.deliver")),1),l("span",he,[x(r(e.job.deliver),1),e.job.origin?(y(),S(U,{key:0},[x(" ("+r(e.job.origin.platform)+")",1)],64)):T("",!0)])]),e.job.repeat?(y(),S("div",ge,[l("span",Je,r(a(n)("jobs.info.repeat")),1),l("span",we,[typeof e.job.repeat=="string"?(y(),S(U,{key:0},[x(r(e.job.repeat),1)],64)):(y(),S(U,{key:1},[x(r(e.job.repeat.completed)+" / "+r(e.job.repeat.times??"∞"),1)],64))])])):T("",!0)]),l("div",ke,[e.job.state!=="paused"&&e.job.enabled?(y(),M(a(X),{key:0},{trigger:c(()=>[_(a(E),{size:"tiny",quaternary:"",onClick:V(i,["stop"])},{default:c(()=>[x(r(a(n)("jobs.action.pause")),1)]),_:1})]),default:c(()=>[x(" "+r(a(n)("jobs.action.pauseJob")),1)]),_:1})):e.job.state==="paused"?(y(),M(a(X),{key:1},{trigger:c(()=>[_(a(E),{size:"tiny",quaternary:"",onClick:V(P,["stop"])},{default:c(()=>[x(r(a(n)("jobs.action.resume")),1)]),_:1})]),default:c(()=>[x(" "+r(a(n)("jobs.action.resumeJob")),1)]),_:1})):T("",!0),_(a(X),null,{trigger:c(()=>[_(a(E),{size:"tiny",quaternary:"",onClick:V(g,["stop"])},{default:c(()=>[x(r(a(n)("jobs.action.runNow")),1)]),_:1})]),default:c(()=>[x(" "+r(a(n)("jobs.action.triggerImmediately")),1)]),_:1}),_(a(E),{size:"tiny",quaternary:"",onClick:m[0]||(m[0]=V(j=>p("edit",v.value),["stop"]))},{default:c(()=>[x(r(a(n)("common.edit")),1)]),_:1}),_(a(E),{size:"tiny",quaternary:"",type:"error",onClick:V(C,["stop"])},{default:c(()=>[x(r(a(n)("common.delete")),1)]),_:1})])],2))}})})),Rt=w((()=>{})),Xe,Nt=w((()=>{xe(),xe(),Rt(),A(),Xe=L(Ge,[["__scopeId","data-v-54aca7fb"]])})),$e,Ce,Ye,Se=w((()=>{q(),Nt(),Z(),H(),$e={key:0,class:"empty-state"},Ce={key:1,class:"jobs-grid"},Ye=B({__name:"JobsPanel",props:{selectedJobId:{}},emits:["edit","select"],setup(e,{emit:o}){const t=e,p=o,{t:n}=O(),b=W();function f($){p("select",t.selectedJobId===$?null:$)}function v(){t.selectedJobId&&p("select",null)}return($,u)=>(y(),S(U,null,[a(b).jobs.length===0?(y(),S("div",$e,[u[0]||(u[0]=vt('<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)),l("p",null,r(a(n)("jobs.noJobs")),1)])):(y(),S("div",Ce,[(y(!0),S(U,null,Ae(a(b).jobs,s=>(y(),M(Xe,{key:s.id,job:s,selected:e.selectedJobId===(s.job_id||s.id),onEdit:h=>p("edit",s.id),onSelect:f},null,8,["job","selected","onEdit"]))),128))])),e.selectedJobId?(y(),S("div",{key:2,class:"deselect-overlay",onClick:v})):T("",!0)],64))}})})),Et=w((()=>{})),et,Tt=w((()=>{Se(),Se(),Et(),A(),et=L(Ye,[["__scopeId","data-v-bfc747c9"]])}));async function Ft(e){const o=new URLSearchParams;e&&o.set("jobId",e);const t=o.toString();return(await N(`/api/cron-history${t?`?${t}`:""}`)).runs}async function Ut(e,o){return N(`/api/cron-history/${encodeURIComponent(e)}/${encodeURIComponent(o)}`)}var qt=w((()=>{Ke()})),Ie,Pe,Me,Re,Ne,Ee,tt,Te=w((()=>{q(),Q(),H(),qt(),ht(),Ie={class:"run-history"},Pe={class:"history-header"},Me={class:"history-title"},Re={class:"history-count"},Ne={class:"history-body"},Ee={class:"run-meta"},tt=B({__name:"JobRunHistory",props:{selectedJobId:{},jobNameMap:{},profileKey:{}},setup(e){const o=e,{t}=O(),p=I(!1),n=I([]),b=I({}),f=I({}),v=R(()=>o.selectedJobId?n.value.filter(i=>i.jobId===o.selectedJobId):n.value);async function $(){p.value=!0;try{n.value=await Ft(o.selectedJobId??void 0)}catch(i){console.error("Failed to fetch cron runs:",i),n.value=[]}finally{p.value=!1}}async function u(i){const P=Array.isArray(i)?i:i!=null?[i]:[];for(const g of P){const C=String(g);if(b.value[C]||f.value[C])continue;const k=v.value.find(d=>`${d.jobId}/${d.fileName}`===C);if(k){f.value[C]=!0;try{const d=await Ut(k.jobId,k.fileName);b.value[C]=d.content}catch{b.value[C]="[Error loading content]"}finally{f.value[C]=!1}}}}function s(i){return i<1024?`${i}B`:i<1024*1024?`${(i/1024).toFixed(1)}KB`:`${(i/1024/1024).toFixed(1)}MB`}function h(i){return o.jobNameMap[i]||i}return lt(()=>[o.selectedJobId,o.profileKey],()=>{b.value={},$()},{immediate:!0}),(i,P)=>(y(),S("div",Ie,[l("div",Pe,[l("span",Me,r(a(t)("jobs.runHistory.title")),1),l("span",Re,r(v.value.length)+" "+r(a(t)("jobs.runHistory.runs")),1)]),l("div",Ne,[_(a(ee),{show:p.value},{default:c(()=>[!p.value&&v.value.length===0?(y(),M(a(dt),{key:0,description:a(t)("jobs.runHistory.noRuns")},null,8,["description"])):(y(),M(a(rt),{key:1,accordion:"","onUpdate:expandedNames":u},{default:c(()=>[(y(!0),S(U,null,Ae(v.value,g=>(y(),M(a(it),{key:`${g.jobId}/${g.fileName}`,title:`${h(g.jobId)} — ${g.runTime}`,name:`${g.jobId}/${g.fileName}`},{"header-extra":c(()=>[l("span",Ee,r(s(g.size)),1)]),default:c(()=>[f.value[`${g.jobId}/${g.fileName}`]?(y(),M(a(ee),{key:0,size:"small"})):b.value[`${g.jobId}/${g.fileName}`]?(y(),M(gt,{key:1,content:b.value[`${g.jobId}/${g.fileName}`]},null,8,["content"])):T("",!0)]),_:2},1032,["title","name"]))),128))]),_:1}))]),_:1},8,["show"])])]))}})})),Dt=w((()=>{})),at,Vt=w((()=>{Te(),Te(),Dt(),A(),at=L(tt,[["__scopeId","data-v-bed5e9a2"]])})),Fe,ot,Ue=w((()=>{q(),Q(),Z(),jt(),te(),H(),Fe={class:"modal-footer"},ot=B({__name:"JobFormModal",props:{jobId:{}},emits:["close","saved"],setup(e,{emit:o}){const{t}=O(),p=e,n=o,b=W(),f=yt(),v=We(),$=I(!0),u=I(!1),s=I({name:"",schedule:"",prompt:"",deliver:"origin",repeat_times:null}),h=I(null),i=R(()=>!!p.jobId),P=R(()=>[{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 * *"}]),g=R(()=>{const m=[{label:t("jobs.origin"),value:"origin"},{label:t("jobs.local"),value:"local"}];for(const j 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=f.platforms[j.key]||{};Object.keys(J).length>0&&m.push({label:j.label,value:j.key})}return m}),C=I(null);Le(async()=>{if(p.jobId)try{const m=await xt(p.jobId);C.value=m,s.value={name:m.name,schedule:K(m.schedule,m.schedule_display||""),prompt:m.prompt,deliver:m.deliver||"origin",repeat_times:Ze(m.repeat)}}catch(m){v.error(t("jobs.loadFailed")+": "+m.message)}});async function k(){if(!s.value.name.trim()){v.warning(t("jobs.nameRequired"));return}if(!s.value.schedule.trim()){v.warning(t("jobs.scheduleRequired"));return}u.value=!0;try{if(i.value){if(!C.value){v.error(t("jobs.loadFailed"));return}const m=wt(C.value,s.value);if(Object.keys(m).length===0){v.success(t("jobs.jobUpdated")),n("saved");return}await b.updateJob(p.jobId,m),v.success(t("jobs.jobUpdated"))}else{const m={name:s.value.name,schedule:s.value.schedule,prompt:s.value.prompt,deliver:s.value.deliver,repeat:s.value.repeat_times??void 0};await b.createJob(m),v.success(t("jobs.jobCreated"))}n("saved")}catch(m){v.error(m.message)}finally{u.value=!1}}function d(){$.value=!1,setTimeout(()=>n("close"),200)}return(m,j)=>(y(),M(a(ut),{show:$.value,"onUpdate:show":j[7]||(j[7]=J=>$.value=J),preset:"card",title:i.value?a(t)("jobs.editJob"):a(t)("jobs.createJob"),style:{width:"min(520px, calc(100vw - 32px))"},"mask-closable":!u.value,onAfterLeave:j[8]||(j[8]=J=>n("close"))},{footer:c(()=>[l("div",Fe,[_(a(E),{onClick:d},{default:c(()=>[x(r(a(t)("common.cancel")),1)]),_:1}),_(a(E),{type:"primary",loading:u.value,onClick:k},{default:c(()=>[x(r(i.value?a(t)("common.update"):a(t)("common.create")),1)]),_:1},8,["loading"])])]),default:c(()=>[_(a(bt),{"label-placement":"top"},{default:c(()=>[_(a(F),{label:a(t)("jobs.name"),required:""},{default:c(()=>[_(a(Y),{value:s.value.name,"onUpdate:value":j[0]||(j[0]=J=>s.value.name=J),placeholder:a(t)("jobs.namePlaceholder"),maxlength:"200","show-count":""},null,8,["value","placeholder"])]),_:1},8,["label"]),_(a(F),{label:a(t)("jobs.schedule"),required:""},{default:c(()=>[_(a(Y),{value:s.value.schedule,"onUpdate:value":j[1]||(j[1]=J=>s.value.schedule=J),placeholder:a(t)("jobs.schedulePlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),_(a(F),{label:a(t)("jobs.quickPresets")},{default:c(()=>[_(a(ae),{value:h.value,"onUpdate:value":[j[2]||(j[2]=J=>h.value=J),j[3]||(j[3]=J=>s.value.schedule=J)],options:P.value,placeholder:a(t)("jobs.selectPreset")},null,8,["value","options","placeholder"])]),_:1},8,["label"]),_(a(F),{label:a(t)("jobs.prompt"),required:""},{default:c(()=>[_(a(Y),{value:s.value.prompt,"onUpdate:value":j[4]||(j[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"]),_(a(F),{label:a(t)("jobs.deliverTarget")},{default:c(()=>[_(a(ae),{value:s.value.deliver,"onUpdate:value":j[5]||(j[5]=J=>s.value.deliver=J),options:g.value},null,8,["value","options"])]),_:1},8,["label"]),_(a(F),{label:a(t)("jobs.repeatCount")},{default:c(()=>[_(a(ct),{value:s.value.repeat_times,"onUpdate:value":j[6]||(j[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"]))}})})),zt=w((()=>{})),st,Bt=w((()=>{Ue(),Ue(),zt(),A(),st=L(ot,[["__scopeId","data-v-03ec4c1d"]])})),qe,De,Ve,ze,Be,He,nt,Oe=w((()=>{q(),Q(),H(),Tt(),Vt(),Bt(),Z(),mt(),qe={class:"jobs-view"},De={class:"page-header"},Ve={class:"header-title"},ze={class:"jobs-split"},Be={class:"jobs-top"},He={class:"jobs-bottom"},nt=B({__name:"JobsView",setup(e){const{t:o}=O(),t=W(),p=ft(),n=I(!1),b=I(null),f=I(null),v=R(()=>p.activeProfileName||"default"),$=R(()=>{const k={};for(const d of t.jobs){const m=d.job_id||d.id;k[m]=d.name}return k});async function u(){(!p.activeProfileName||p.profiles.length===0)&&await p.fetchProfiles()}async function s(){f.value=null,t.jobs=[],await u(),await t.fetchJobs()}Le(()=>{s()});function h(){b.value=null,n.value=!0}function i(k){b.value=k,n.value=!0}function P(){n.value=!1,b.value=null}async function g(){await t.fetchJobs(),P()}function C(k){f.value=f.value===k?null:k}return(k,d)=>(y(),S("div",qe,[l("header",De,[l("h2",Ve,r(a(o)("jobs.title")),1),_(a(E),{type:"primary",size:"small",onClick:h},{icon:c(()=>[...d[0]||(d[0]=[l("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[l("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),l("line",{x1:"5",y1:"12",x2:"19",y2:"12"})],-1)])]),default:c(()=>[x(" "+r(a(o)("jobs.createJob")),1)]),_:1})]),l("div",ze,[l("div",Be,[_(a(ee),{show:a(t).loading&&a(t).jobs.length===0},{default:c(()=>[_(et,{"selected-job-id":f.value,onEdit:i,onSelect:C},null,8,["selected-job-id"])]),_:1},8,["show"])]),d[1]||(d[1]=l("div",{class:"splitter"},null,-1)),l("div",He,[_(at,{"selected-job-id":f.value,"job-name-map":$.value,"profile-key":v.value},null,8,["selected-job-id","job-name-map","profile-key"])])]),n.value?(y(),M(st,{key:0,"job-id":b.value,onClose:P,onSaved:g},null,8,["job-id"])):T("",!0)]))}})})),Ht=w((()=>{})),Ot,At=w((()=>{Oe(),Oe(),Ht(),A(),Ot=L(nt,[["__scopeId","data-v-409c1932"]])}));At();export{Ot as default};
1
+ import{n as w}from"./rolldown-runtime-BKwlnUi0.js";import{A as ae,Bt as G,Ct as lt,D as X,Ht as r,I as E,M as it,N as rt,Pt as I,Q as U,S as ut,Tt as c,U as dt,W as q,Z as V,at as S,bt as Ae,ct as _,f as ct,gt as Le,it as T,l as ee,lt as B,m as bt,nt as l,ot as vt,p as F,rt as M,st as x,t as Q,tt as R,vt as y,y as We,z as Y,zt as a}from"./ui-vendor-BMwF7QXa.js";import{d as _t,n as H,r as O,u as pt}from"./vue-vendor-kBYBtqCg.js";import{d as N,l as Ke,n as A,t as L}from"./_plugin-vue_export-helper-CHoatqkO.js";import{r as ft,t as mt}from"./profiles-CyjgPK1f.js";import{b as yt,y as jt}from"./index-DpU5R9KV.js";import{n as ht,t as gt}from"./MarkdownRenderer-BJbqsrMI.js";function D(e){return e.job}function Qe(e){return typeof e=="object"&&e!==null}function K(e,o=""){if(typeof e=="string")return e;if(!Qe(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 Jt(e,o="—"){if(typeof e=="string")return e;if(!Qe(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 wt(e,o){const t={},p=K(e.schedule,e.schedule_display||""),n=Ze(e.repeat),b=e.deliver||"origin";return o.name!==e.name&&(t.name=o.name),o.schedule!==p&&(t.schedule=o.schedule),o.prompt!==(e.prompt||"")&&(t.prompt=o.prompt),o.deliver!==b&&(t.deliver=o.deliver),o.repeat_times!==n&&(t.repeat=o.repeat_times),t}async function kt(){return(await N("/api/hermes/jobs?include_disabled=true")).jobs}async function xt(e){return D(await N(`/api/hermes/jobs/${e}`))}async function $t(e){return D(await N("/api/hermes/jobs",{method:"POST",body:JSON.stringify(e)}))}async function Ct(e,o){return D(await N(`/api/hermes/jobs/${e}`,{method:"PATCH",body:JSON.stringify(o)}))}async function St(e){return N(`/api/hermes/jobs/${e}`,{method:"DELETE"})}async function It(e){return D(await N(`/api/hermes/jobs/${e}/pause`,{method:"POST"}))}async function Pt(e){return D(await N(`/api/hermes/jobs/${e}/resume`,{method:"POST"}))}async function Mt(e){return D(await N(`/api/hermes/jobs/${e}/run`,{method:"POST"}))}var te=w((()=>{Ke()}));function z(e,o){return e.job_id===o||e.id===o}var W,Z=w((()=>{_t(),q(),te(),W=pt("jobs",()=>{const e=I([]),o=I(!1);async function t(){o.value=!0;try{e.value=await kt()}catch(u){console.error("Failed to fetch jobs:",u)}finally{o.value=!1}}async function p(u){const s=await $t(u);return e.value.unshift(s),s}async function n(u,s){const h=await Ct(u,s),i=e.value.findIndex(P=>z(P,u));return i!==-1&&(e.value[i]=h),h}async function b(u){await St(u),e.value=e.value.filter(s=>!z(s,u))}async function f(u){const s=await It(u),h=e.value.findIndex(i=>z(i,u));h!==-1&&(e.value[h]=s)}async function v(u){const s=await Pt(u),h=e.value.findIndex(i=>z(i,u));h!==-1&&(e.value[h]=s)}async function $(u){const s=await Mt(u),h=e.value.findIndex(i=>z(i,u));h!==-1&&(e.value[h]=s)}return{jobs:e,loading:o,fetchJobs:t,createJob:p,updateJob:n,deleteJob:b,pauseJob:f,resumeJob:v,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(),Q(),te(),Z(),H(),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=B({__name:"JobCard",props:{job:{},selected:{type:Boolean}},emits:["edit","select"],setup(e,{emit:o}){const t=e,p=o,{t:n}=O(),b=W(),f=We(),v=R(()=>t.job.job_id||t.job.id),$=R(()=>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=R(()=>t.job.state==="running"?"info":t.job.state==="paused"?"warning":t.job.enabled?"success":"error"),s=R(()=>Jt(t.job.schedule,t.job.schedule_display||"—")),h=d=>d?new Date(d).toLocaleString():"—";async function i(){try{await b.pauseJob(v.value),f.success(n("jobs.jobPaused"))}catch(d){f.error(d.message)}}async function P(){try{await b.resumeJob(v.value),f.success(n("jobs.jobResumed"))}catch(d){f.error(d.message)}}async function g(){try{await b.runJob(v.value),f.info(n("jobs.jobTriggered"))}catch(d){f.error(d.message)}}async function C(){try{await b.deleteJob(v.value),f.success(n("jobs.jobDeleted"))}catch(d){f.error(d.message)}}function k(d){d.target.closest(".card-actions")||p("select",v.value)}return(d,m)=>(y(),S("div",{class:G(["job-card",{selected:e.selected}]),onClick:k},[l("div",oe,[l("h3",se,r(e.job.name),1),l("span",{class:G(["status-badge",u.value])},r($.value),3)]),l("div",ne,[l("div",le,[l("span",ie,r(a(n)("jobs.info.schedule")),1),l("code",re,r(s.value),1)]),l("div",ue,[l("span",de,r(a(n)("jobs.info.model")),1),l("span",ce,r(e.job.model||"—"),1)]),l("div",be,[l("span",ve,r(a(n)("jobs.info.lastRun")),1),l("span",_e,[x(r(h(e.job.last_run_at))+" ",1),e.job.last_status?(y(),S("span",{key:0,class:G(["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)])]),l("div",pe,[l("span",fe,r(a(n)("jobs.info.nextRun")),1),l("span",me,r(h(e.job.next_run_at)),1)]),l("div",ye,[l("span",je,r(a(n)("jobs.info.deliver")),1),l("span",he,[x(r(e.job.deliver),1),e.job.origin?(y(),S(U,{key:0},[x(" ("+r(e.job.origin.platform)+")",1)],64)):T("",!0)])]),e.job.repeat?(y(),S("div",ge,[l("span",Je,r(a(n)("jobs.info.repeat")),1),l("span",we,[typeof e.job.repeat=="string"?(y(),S(U,{key:0},[x(r(e.job.repeat),1)],64)):(y(),S(U,{key:1},[x(r(e.job.repeat.completed)+" / "+r(e.job.repeat.times??"∞"),1)],64))])])):T("",!0)]),l("div",ke,[e.job.state!=="paused"&&e.job.enabled?(y(),M(a(X),{key:0},{trigger:c(()=>[_(a(E),{size:"tiny",quaternary:"",onClick:V(i,["stop"])},{default:c(()=>[x(r(a(n)("jobs.action.pause")),1)]),_:1})]),default:c(()=>[x(" "+r(a(n)("jobs.action.pauseJob")),1)]),_:1})):e.job.state==="paused"?(y(),M(a(X),{key:1},{trigger:c(()=>[_(a(E),{size:"tiny",quaternary:"",onClick:V(P,["stop"])},{default:c(()=>[x(r(a(n)("jobs.action.resume")),1)]),_:1})]),default:c(()=>[x(" "+r(a(n)("jobs.action.resumeJob")),1)]),_:1})):T("",!0),_(a(X),null,{trigger:c(()=>[_(a(E),{size:"tiny",quaternary:"",onClick:V(g,["stop"])},{default:c(()=>[x(r(a(n)("jobs.action.runNow")),1)]),_:1})]),default:c(()=>[x(" "+r(a(n)("jobs.action.triggerImmediately")),1)]),_:1}),_(a(E),{size:"tiny",quaternary:"",onClick:m[0]||(m[0]=V(j=>p("edit",v.value),["stop"]))},{default:c(()=>[x(r(a(n)("common.edit")),1)]),_:1}),_(a(E),{size:"tiny",quaternary:"",type:"error",onClick:V(C,["stop"])},{default:c(()=>[x(r(a(n)("common.delete")),1)]),_:1})])],2))}})})),Rt=w((()=>{})),Xe,Nt=w((()=>{xe(),xe(),Rt(),A(),Xe=L(Ge,[["__scopeId","data-v-54aca7fb"]])})),$e,Ce,Ye,Se=w((()=>{q(),Nt(),Z(),H(),$e={key:0,class:"empty-state"},Ce={key:1,class:"jobs-grid"},Ye=B({__name:"JobsPanel",props:{selectedJobId:{}},emits:["edit","select"],setup(e,{emit:o}){const t=e,p=o,{t:n}=O(),b=W();function f($){p("select",t.selectedJobId===$?null:$)}function v(){t.selectedJobId&&p("select",null)}return($,u)=>(y(),S(U,null,[a(b).jobs.length===0?(y(),S("div",$e,[u[0]||(u[0]=vt('<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)),l("p",null,r(a(n)("jobs.noJobs")),1)])):(y(),S("div",Ce,[(y(!0),S(U,null,Ae(a(b).jobs,s=>(y(),M(Xe,{key:s.id,job:s,selected:e.selectedJobId===(s.job_id||s.id),onEdit:h=>p("edit",s.id),onSelect:f},null,8,["job","selected","onEdit"]))),128))])),e.selectedJobId?(y(),S("div",{key:2,class:"deselect-overlay",onClick:v})):T("",!0)],64))}})})),Et=w((()=>{})),et,Tt=w((()=>{Se(),Se(),Et(),A(),et=L(Ye,[["__scopeId","data-v-bfc747c9"]])}));async function Ft(e){const o=new URLSearchParams;e&&o.set("jobId",e);const t=o.toString();return(await N(`/api/cron-history${t?`?${t}`:""}`)).runs}async function Ut(e,o){return N(`/api/cron-history/${encodeURIComponent(e)}/${encodeURIComponent(o)}`)}var qt=w((()=>{Ke()})),Ie,Pe,Me,Re,Ne,Ee,tt,Te=w((()=>{q(),Q(),H(),qt(),ht(),Ie={class:"run-history"},Pe={class:"history-header"},Me={class:"history-title"},Re={class:"history-count"},Ne={class:"history-body"},Ee={class:"run-meta"},tt=B({__name:"JobRunHistory",props:{selectedJobId:{},jobNameMap:{},profileKey:{}},setup(e){const o=e,{t}=O(),p=I(!1),n=I([]),b=I({}),f=I({}),v=R(()=>o.selectedJobId?n.value.filter(i=>i.jobId===o.selectedJobId):n.value);async function $(){p.value=!0;try{n.value=await Ft(o.selectedJobId??void 0)}catch(i){console.error("Failed to fetch cron runs:",i),n.value=[]}finally{p.value=!1}}async function u(i){const P=Array.isArray(i)?i:i!=null?[i]:[];for(const g of P){const C=String(g);if(b.value[C]||f.value[C])continue;const k=v.value.find(d=>`${d.jobId}/${d.fileName}`===C);if(k){f.value[C]=!0;try{const d=await Ut(k.jobId,k.fileName);b.value[C]=d.content}catch{b.value[C]="[Error loading content]"}finally{f.value[C]=!1}}}}function s(i){return i<1024?`${i}B`:i<1024*1024?`${(i/1024).toFixed(1)}KB`:`${(i/1024/1024).toFixed(1)}MB`}function h(i){return o.jobNameMap[i]||i}return lt(()=>[o.selectedJobId,o.profileKey],()=>{b.value={},$()},{immediate:!0}),(i,P)=>(y(),S("div",Ie,[l("div",Pe,[l("span",Me,r(a(t)("jobs.runHistory.title")),1),l("span",Re,r(v.value.length)+" "+r(a(t)("jobs.runHistory.runs")),1)]),l("div",Ne,[_(a(ee),{show:p.value},{default:c(()=>[!p.value&&v.value.length===0?(y(),M(a(dt),{key:0,description:a(t)("jobs.runHistory.noRuns")},null,8,["description"])):(y(),M(a(rt),{key:1,accordion:"","onUpdate:expandedNames":u},{default:c(()=>[(y(!0),S(U,null,Ae(v.value,g=>(y(),M(a(it),{key:`${g.jobId}/${g.fileName}`,title:`${h(g.jobId)} — ${g.runTime}`,name:`${g.jobId}/${g.fileName}`},{"header-extra":c(()=>[l("span",Ee,r(s(g.size)),1)]),default:c(()=>[f.value[`${g.jobId}/${g.fileName}`]?(y(),M(a(ee),{key:0,size:"small"})):b.value[`${g.jobId}/${g.fileName}`]?(y(),M(gt,{key:1,content:b.value[`${g.jobId}/${g.fileName}`]},null,8,["content"])):T("",!0)]),_:2},1032,["title","name"]))),128))]),_:1}))]),_:1},8,["show"])])]))}})})),Dt=w((()=>{})),at,Vt=w((()=>{Te(),Te(),Dt(),A(),at=L(tt,[["__scopeId","data-v-bed5e9a2"]])})),Fe,ot,Ue=w((()=>{q(),Q(),Z(),jt(),te(),H(),Fe={class:"modal-footer"},ot=B({__name:"JobFormModal",props:{jobId:{}},emits:["close","saved"],setup(e,{emit:o}){const{t}=O(),p=e,n=o,b=W(),f=yt(),v=We(),$=I(!0),u=I(!1),s=I({name:"",schedule:"",prompt:"",deliver:"origin",repeat_times:null}),h=I(null),i=R(()=>!!p.jobId),P=R(()=>[{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 * *"}]),g=R(()=>{const m=[{label:t("jobs.origin"),value:"origin"},{label:t("jobs.local"),value:"local"}];for(const j 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=f.platforms[j.key]||{};Object.keys(J).length>0&&m.push({label:j.label,value:j.key})}return m}),C=I(null);Le(async()=>{if(p.jobId)try{const m=await xt(p.jobId);C.value=m,s.value={name:m.name,schedule:K(m.schedule,m.schedule_display||""),prompt:m.prompt,deliver:m.deliver||"origin",repeat_times:Ze(m.repeat)}}catch(m){v.error(t("jobs.loadFailed")+": "+m.message)}});async function k(){if(!s.value.name.trim()){v.warning(t("jobs.nameRequired"));return}if(!s.value.schedule.trim()){v.warning(t("jobs.scheduleRequired"));return}u.value=!0;try{if(i.value){if(!C.value){v.error(t("jobs.loadFailed"));return}const m=wt(C.value,s.value);if(Object.keys(m).length===0){v.success(t("jobs.jobUpdated")),n("saved");return}await b.updateJob(p.jobId,m),v.success(t("jobs.jobUpdated"))}else{const m={name:s.value.name,schedule:s.value.schedule,prompt:s.value.prompt,deliver:s.value.deliver,repeat:s.value.repeat_times??void 0};await b.createJob(m),v.success(t("jobs.jobCreated"))}n("saved")}catch(m){v.error(m.message)}finally{u.value=!1}}function d(){$.value=!1,setTimeout(()=>n("close"),200)}return(m,j)=>(y(),M(a(ut),{show:$.value,"onUpdate:show":j[7]||(j[7]=J=>$.value=J),preset:"card",title:i.value?a(t)("jobs.editJob"):a(t)("jobs.createJob"),style:{width:"min(520px, calc(100vw - 32px))"},"mask-closable":!u.value,onAfterLeave:j[8]||(j[8]=J=>n("close"))},{footer:c(()=>[l("div",Fe,[_(a(E),{onClick:d},{default:c(()=>[x(r(a(t)("common.cancel")),1)]),_:1}),_(a(E),{type:"primary",loading:u.value,onClick:k},{default:c(()=>[x(r(i.value?a(t)("common.update"):a(t)("common.create")),1)]),_:1},8,["loading"])])]),default:c(()=>[_(a(bt),{"label-placement":"top"},{default:c(()=>[_(a(F),{label:a(t)("jobs.name"),required:""},{default:c(()=>[_(a(Y),{value:s.value.name,"onUpdate:value":j[0]||(j[0]=J=>s.value.name=J),placeholder:a(t)("jobs.namePlaceholder"),maxlength:"200","show-count":""},null,8,["value","placeholder"])]),_:1},8,["label"]),_(a(F),{label:a(t)("jobs.schedule"),required:""},{default:c(()=>[_(a(Y),{value:s.value.schedule,"onUpdate:value":j[1]||(j[1]=J=>s.value.schedule=J),placeholder:a(t)("jobs.schedulePlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),_(a(F),{label:a(t)("jobs.quickPresets")},{default:c(()=>[_(a(ae),{value:h.value,"onUpdate:value":[j[2]||(j[2]=J=>h.value=J),j[3]||(j[3]=J=>s.value.schedule=J)],options:P.value,placeholder:a(t)("jobs.selectPreset")},null,8,["value","options","placeholder"])]),_:1},8,["label"]),_(a(F),{label:a(t)("jobs.prompt"),required:""},{default:c(()=>[_(a(Y),{value:s.value.prompt,"onUpdate:value":j[4]||(j[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"]),_(a(F),{label:a(t)("jobs.deliverTarget")},{default:c(()=>[_(a(ae),{value:s.value.deliver,"onUpdate:value":j[5]||(j[5]=J=>s.value.deliver=J),options:g.value},null,8,["value","options"])]),_:1},8,["label"]),_(a(F),{label:a(t)("jobs.repeatCount")},{default:c(()=>[_(a(ct),{value:s.value.repeat_times,"onUpdate:value":j[6]||(j[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"]))}})})),zt=w((()=>{})),st,Bt=w((()=>{Ue(),Ue(),zt(),A(),st=L(ot,[["__scopeId","data-v-03ec4c1d"]])})),qe,De,Ve,ze,Be,He,nt,Oe=w((()=>{q(),Q(),H(),Tt(),Vt(),Bt(),Z(),mt(),qe={class:"jobs-view"},De={class:"page-header"},Ve={class:"header-title"},ze={class:"jobs-split"},Be={class:"jobs-top"},He={class:"jobs-bottom"},nt=B({__name:"JobsView",setup(e){const{t:o}=O(),t=W(),p=ft(),n=I(!1),b=I(null),f=I(null),v=R(()=>p.activeProfileName||"default"),$=R(()=>{const k={};for(const d of t.jobs){const m=d.job_id||d.id;k[m]=d.name}return k});async function u(){(!p.activeProfileName||p.profiles.length===0)&&await p.fetchProfiles()}async function s(){f.value=null,t.jobs=[],await u(),await t.fetchJobs()}Le(()=>{s()});function h(){b.value=null,n.value=!0}function i(k){b.value=k,n.value=!0}function P(){n.value=!1,b.value=null}async function g(){await t.fetchJobs(),P()}function C(k){f.value=f.value===k?null:k}return(k,d)=>(y(),S("div",qe,[l("header",De,[l("h2",Ve,r(a(o)("jobs.title")),1),_(a(E),{type:"primary",size:"small",onClick:h},{icon:c(()=>[...d[0]||(d[0]=[l("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[l("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),l("line",{x1:"5",y1:"12",x2:"19",y2:"12"})],-1)])]),default:c(()=>[x(" "+r(a(o)("jobs.createJob")),1)]),_:1})]),l("div",ze,[l("div",Be,[_(a(ee),{show:a(t).loading&&a(t).jobs.length===0},{default:c(()=>[_(et,{"selected-job-id":f.value,onEdit:i,onSelect:C},null,8,["selected-job-id"])]),_:1},8,["show"])]),d[1]||(d[1]=l("div",{class:"splitter"},null,-1)),l("div",He,[_(at,{"selected-job-id":f.value,"job-name-map":$.value,"profile-key":v.value},null,8,["selected-job-id","job-name-map","profile-key"])])]),n.value?(y(),M(st,{key:0,"job-id":b.value,onClose:P,onSaved:g},null,8,["job-id"])):T("",!0)]))}})})),Ht=w((()=>{})),Ot,At=w((()=>{Oe(),Oe(),Ht(),A(),Ot=L(nt,[["__scopeId","data-v-409c1932"]])}));At();export{Ot as default};
@@ -1 +1 @@
1
- import{n as Q}from"./rolldown-runtime-BKwlnUi0.js";import{A as pe,Bt as se,Ct as Oe,D as Wt,Ht as o,I as H,M as Gt,N as Ht,Pt as w,Q as X,S as Ke,Tt as T,W as he,_ as Qt,_t as jt,at as g,bt as ce,ct as h,g as Yt,gt as Xt,it as R,l as Ee,lt as Te,m as Zt,nt as r,p as Se,rt as Z,st as V,t as $e,tt as x,vt as p,y as Ne,z as be,zt as t}from"./ui-vendor-BMwF7QXa.js";import{c as pt,d as es,n as Ce,o as bt,r as Be,s as as,u as ts}from"./vue-vendor-kBYBtqCg.js";import{d as P,l as _t,n as De,o as ss,s as ns,t as ze}from"./_plugin-vue_export-helper-B8gz9Iqn.js";import{r as ls,t as is}from"./profiles-DiEn61KW.js";import{B as rs,V as os}from"./index-Cuk9R8hy.js";import{n as us,t as cs}from"./HistoryMessageList-CHk-rOIr.js";var Ve,Je,Me,We,Ge,yt,He=Q((()=>{he(),$e(),Ce(),os(),Ve={class:"card-title"},Je={class:"card-meta"},Me={class:"meta-tag assignee-tag"},We={class:"meta-time"},Ge={key:0,class:"card-body-preview"},yt=Te({__name:"KanbanTaskCard",props:{task:{},assigneeAvatar:{}},emits:["click"],setup(e,{emit:l}){const v=e,y=l,{t:u}=Be(),c=x(()=>{const s=Date.now()/1e3-v.task.created_at;return s<60?u("kanban.card.timeAgo.justNow"):s<3600?u("kanban.card.timeAgo.minutes",{count:Math.floor(s/60)}):s<86400?u("kanban.card.timeAgo.hours",{count:Math.floor(s/3600)}):u("kanban.card.timeAgo.days",{count:Math.floor(s/86400)})}),C=x(()=>v.task.priority>=3?"high":v.task.priority===2?"medium":"low"),B=x(()=>u(`kanban.card.priority.${C.value}`));return(s,N)=>(p(),g("div",{class:se(["kanban-task-card",`status-${e.task.status}`]),onClick:N[0]||(N[0]=U=>y("click",e.task.id))},[r("div",Ve,o(e.task.title),1),r("div",Je,[e.task.assignee?(p(),Z(t(Wt),{key:0,trigger:"hover"},{trigger:T(()=>[r("span",Me,[h(rs,{class:"assignee-profile-avatar",name:e.task.assignee,avatar:e.assigneeAvatar,size:18,"aria-hidden":"true"},null,8,["name","avatar"]),r("span",null,o(e.task.assignee),1)])]),default:T(()=>[V(" "+o(t(u)("kanban.card.assigneeTooltip")),1)]),_:1})):R("",!0),e.task.priority>=2?(p(),g("span",{key:1,class:se(["meta-tag priority-tag",C.value])},o(B.value),3)):R("",!0),r("span",We,o(c.value),1)]),e.task.body?(p(),g("div",Ge,o(e.task.body.slice(0,80))+o(e.task.body.length>80?"...":""),1)):R("",!0)],2))}})})),ds=Q((()=>{})),ht,vs=Q((()=>{He(),He(),ds(),De(),ht=ze(yt,[["__scopeId","data-v-ec73b201"]])}));function fs(e){return e?.trim()||"default"}function ms(){try{return localStorage.getItem("hermes_active_profile_name")}catch{return null}}function E(e,l){const v=l.toString();return v?`${e}?${v}`:e}function K(e){const l=new URLSearchParams;return l.set("board",fs(e)),l}function Qe(e){return e?e.startsWith("https")?"wss:":"ws:":location.protocol==="https:"?"wss:":"ws:"}function ks(e){const l=ns(),v=K(e?.board),y=ss();y&&v.set("token",y);const u=ms();u&&v.set("profile",u);const c=`/api/hermes/kanban/events?${v.toString()}`;if(l)return`${Qe(l)}//${new URL(l).host}${c}`;const C=location.host;return`${Qe()}//${C}${c}`}function ps(e){return new WebSocket(ks(e))}async function bs(e){const l=new URLSearchParams;return e?.includeArchived&&l.set("includeArchived","true"),(await P(E("/api/hermes/kanban/boards",l))).boards}async function _s(e){return(await P("/api/hermes/kanban/boards",{method:"POST",body:JSON.stringify(e)})).board}async function ys(e){return P(`/api/hermes/kanban/boards/${encodeURIComponent(e)}`,{method:"DELETE"})}async function hs(){return(await P("/api/hermes/kanban/capabilities")).capabilities}async function gs(e){const l=K(e?.board);return e?.status&&l.set("status",e.status),e?.assignee&&l.set("assignee",e.assignee),e?.tenant&&l.set("tenant",e.tenant),e?.includeArchived&&l.set("includeArchived","true"),(await P(E("/api/hermes/kanban",l))).tasks}async function je(e,l){return P(E(`/api/hermes/kanban/${encodeURIComponent(e)}`,K(l?.board)))}async function ws(e,l){return(await P(E("/api/hermes/kanban",K(l?.board)),{method:"POST",body:JSON.stringify(e)})).task}async function Ss(e,l,v){return P(E("/api/hermes/kanban/complete",K(v?.board)),{method:"POST",body:JSON.stringify({task_ids:e,summary:l})})}async function Ts(e,l,v){return P(E(`/api/hermes/kanban/${encodeURIComponent(e)}/block`,K(v?.board)),{method:"POST",body:JSON.stringify({reason:l})})}async function $s(e,l){return P(E("/api/hermes/kanban/unblock",K(l?.board)),{method:"POST",body:JSON.stringify({task_ids:e})})}async function Cs(e,l,v){return P(E(`/api/hermes/kanban/${encodeURIComponent(e)}/assign`,K(v?.board)),{method:"POST",body:JSON.stringify({profile:l})})}async function Bs(e,l,v){return P(E(`/api/hermes/kanban/${encodeURIComponent(e)}/comments`,K(v?.board)),{method:"POST",body:JSON.stringify(l)})}async function As(e,l){return P(E("/api/hermes/kanban/links",K(l?.board)),{method:"POST",body:JSON.stringify(e)})}async function Ps(e,l){const v=K(l?.board);return v.set("parent_id",e.parent_id),v.set("child_id",e.child_id),P(E("/api/hermes/kanban/links",v),{method:"DELETE"})}async function Rs(e,l){return P(E("/api/hermes/kanban/tasks/bulk",K(l?.board)),{method:"POST",body:JSON.stringify(e)})}async function xs(e,l){const v=K(l?.board);return l?.tail!==void 0&&v.set("tail",String(l.tail)),P(E(`/api/hermes/kanban/${encodeURIComponent(e)}/log`,v))}async function Us(e){const l=K(e?.board);return e?.task&&l.set("task",e.task),e?.severity&&l.set("severity",e.severity),(await P(E("/api/hermes/kanban/diagnostics",l))).diagnostics}async function Is(e,l){return P(E(`/api/hermes/kanban/${encodeURIComponent(e)}/reclaim`,K(l?.board)),{method:"POST",body:JSON.stringify({reason:l?.reason})})}async function Os(e,l,v){return P(E(`/api/hermes/kanban/${encodeURIComponent(e)}/reassign`,K(v?.board)),{method:"POST",body:JSON.stringify({profile:l,reclaim:v?.reclaim,reason:v?.reason})})}async function Es(e,l){return(await P(E(`/api/hermes/kanban/${encodeURIComponent(e)}/specify`,K(l?.board)),{method:"POST",body:JSON.stringify({author:l?.author})})).results}async function Ks(e){return(await P(E("/api/hermes/kanban/dispatch",K(e?.board)),{method:"POST",body:JSON.stringify({dryRun:e?.dryRun,max:e?.max,failureLimit:e?.failureLimit})})).result}async function Ns(e){return(await P(E("/api/hermes/kanban/stats",K(e?.board)))).stats}async function Ds(e){return(await P(E("/api/hermes/kanban/assignees",K(e?.board)))).assignees}var gt=Q((()=>{_t()}));function zs(e){if(typeof window>"u")return null;try{return window.localStorage.getItem(e)}catch{return null}}function Fs(e,l){if(!(typeof window>"u"))try{window.localStorage.setItem(e,l)}catch{}}function Ue(e){const l=e?.trim().toLowerCase();return l&&wt.test(l)?l:ie}var Ie,ie,wt,Ae,Fe=Q((()=>{es(),he(),gt(),Ie="hermes.kanban.selectedBoard",ie="default",wt=/^[a-z0-9][a-z0-9_-]{0,63}$/,Ae=ts("kanban",()=>{const e=w([]),l=w(null),v=w([]),y=w([]),u=w(null),c=w(!1),C=w(!1),B=w(null),s=w(Ue(zs(Ie))),N=w(null),U=w(null);let I=0,z=0,J=0,D=0,$=0,O=0,ee=0,j=null,F=null,M=null,G=!1;const de=x(()=>{const a=y.value.filter(n=>!n.archived);return a.some(n=>n.slug==="default")?a:[{slug:ie,name:"Default",description:"",icon:"",color:"",created_at:null,archived:!1,counts:{},total:0},...a]});function ae(a){if(!u.value)return!1;const n=u.value.capabilities?.find(i=>i.key===a);return n?n.status==="supported":u.value.missing?.includes(a)?!1:u.value.supports?.[a]===!0}function L(a){if(!ae(a))throw new Error(`Kanban capability "${a}" is not supported by the current Hermes backend`)}function re(a,n){const i=u.value?.capabilities?.find(m=>m.key===a);return i?n.includes(i.status):n.includes("supported")?ae(a):!1}function _e(a,n){if(!re(a,n))throw new Error(`Kanban capability "${a}" is not available with the required status`)}function Y(a){return de.value.some(n=>n.slug===a)}function ne(a){const n=Ue(a);return y.value.length>0&&!Y(n)?ie:n}function ve(){e.value=[],l.value=null,v.value=[]}function oe(){F&&clearTimeout(F),M&&clearTimeout(M),F=null,M=null}function ue(){if(!j)return;const a=j;j=null,a.onclose=null,a.onerror=null,a.onmessage=null;try{a.close()}catch{}}function b(){G=!1,ee++,oe(),ue()}function S(a,n,i){M&&clearTimeout(M),M=setTimeout(()=>{!G||i!==ee||n!==I||a!==s.value||Promise.all([A(),te(!0),W(),ke()])},100)}function k(a,n,i){F&&clearTimeout(F),F=setTimeout(()=>{!G||i!==ee||n!==I||a!==s.value||fe(a,n,i)},3e3)}function fe(a,n,i){ue();let m;try{m=ps({board:a})}catch(q){console.error("Failed to open kanban event stream:",q),k(a,n,i);return}j=m,m.onmessage=q=>{if(!(!G||i!==ee||n!==I||a!==s.value))try{JSON.parse(String(q.data))?.type==="event"&&S(a,n,i)}catch{S(a,n,i)}},m.onerror=()=>{j===m&&console.error("Kanban event stream error")},m.onclose=()=>{j===m&&(j=null,k(a,n,i))}}function ge(){const a=u.value?.capabilities?.find(n=>n.key==="events")?.status;return a==="supported"||a==="partial"||ae("events")}function we(){if(!ge())return!1;G=!0;const a=++ee,n=I,i=s.value;return oe(),fe(i,n,a),!0}function Pe(){G&&we()}function me(a){const n=ne(a),i=s.value!==n;return s.value=n,Fs(Ie,n),B.value=null,i&&(ve(),I++,Pe()),n}function d(a){const n=Ue(a),i=ne(n),m=i!==n;return me(i),m&&(B.value=`Board "${n}" is unavailable; fell back to "${i}".`),{board:i,recovered:m}}function _(a){return{seq:a(),generation:I,board:s.value}}function f(a,n,i,m){return a===m&&n===I&&i===s.value}async function A(a=!1){const n=++z;C.value=!0;try{const i=await bs({includeArchived:a});if(n!==z)return;y.value=i,ne(s.value)!==s.value&&d(s.value)}catch(i){n===z&&console.error("Failed to fetch kanban boards:",i)}finally{n===z&&(C.value=!1)}}async function ye(){try{u.value=await hs()}catch(a){console.error("Failed to fetch kanban capabilities:",a)}}async function Re(a){const n=await _s(a);return await A(),me(n.slug),await xe(),n}async function At(){const a=s.value;if(a==="default")throw new Error("Cannot archive the default kanban board");await ys(a),await A(),me(ie),await xe()}async function te(a=!1){const{seq:n,generation:i,board:m}=_(()=>++J),q=a?0:++O;a||(c.value=!0);try{const le=await gs({board:m,status:N.value||void 0,assignee:U.value||void 0,includeArchived:!0});f(n,i,m,J)&&(e.value=le)}catch(le){f(n,i,m,J)&&console.error("Failed to fetch kanban tasks:",le)}finally{!a&&q===O&&(c.value=!1)}}async function W(){const{seq:a,generation:n,board:i}=_(()=>++D);try{const m=await Ns({board:i});f(a,n,i,D)&&(l.value=m)}catch(m){f(a,n,i,D)&&console.error("Failed to fetch kanban stats:",m)}}async function ke(){const{seq:a,generation:n,board:i}=_(()=>++$);try{const m=await Ds({board:i});f(a,n,i,$)&&(v.value=m)}catch(m){f(a,n,i,$)&&console.error("Failed to fetch kanban assignees:",m)}}async function Pt(a){const n=s.value,i=await ws(a,{board:n});return n===s.value&&(e.value.unshift(i),await Promise.all([W(),A()])),i}async function Rt(a,n){const i=s.value;if(await Ss(a,n,{board:i}),i===s.value){for(const m of a){const q=e.value.find(le=>le.id===m);q&&(q.status="done")}await Promise.all([W(),A()])}}async function xt(a,n){const i=s.value;if(await Ts(a,n,{board:i}),i===s.value){const m=e.value.find(q=>q.id===a);m&&(m.status="blocked"),await Promise.all([W(),A()])}}async function Ut(a){const n=s.value;if(await $s(a,{board:n}),n===s.value){for(const i of a){const m=e.value.find(q=>q.id===i);m&&(m.status="ready")}await Promise.all([W(),A()])}}async function It(a,n){const i=s.value;if(await Cs(a,n,{board:i}),i===s.value){const m=e.value.find(q=>q.id===a);m&&(m.assignee=n),await Promise.all([W(),ke()])}}async function Ot(a,n,i){return L("commentsWrite"),Bs(a,{body:n,author:i},{board:s.value})}async function Et(a,n){L("links");const i=s.value,m=await As({parent_id:a,child_id:n},{board:i});return i===s.value&&await Promise.all([te(!0),W(),A()]),m}async function Kt(a,n){L("links");const i=s.value,m=await Ps({parent_id:a,child_id:n},{board:i});return i===s.value&&await Promise.all([te(!0),W(),A()]),m}async function Nt(a){_e("bulk",["supported","partial"]);const n=s.value,i=await Rs(a,{board:n});return n===s.value&&await Promise.all([te(!0),W(),A(),ke()]),i}async function Dt(a,n){return L("taskLog"),xs(a,{board:s.value,tail:n})}async function zt(a={}){return L("diagnostics"),Us({...a,board:s.value})}async function Ft(a,n){L("reclaim");const i=s.value,m=await Is(a,{board:i,reason:n});return i===s.value&&await Promise.all([te(!0),W(),A()]),m}async function Lt(a,n,i={}){L("reassign");const m=s.value,q=await Os(a,n,{board:m,...i});if(m===s.value){const le=e.value.find(Mt=>Mt.id===a);le&&(le.assignee=n==="none"?null:n),await Promise.all([W(),ke()])}return q}async function qt(a,n){L("specify");const i=s.value,m=await Es(a,{board:i,author:n});return i===s.value&&await Promise.all([te(!0),W(),A()]),m}async function Vt(a={}){L("dispatch");const n=s.value,i=await Ks({...a,board:n});return n===s.value&&await Promise.all([te(!0),W(),A()]),i}function Jt(a,n){a==="status"?N.value=n:U.value=n}async function xe(){await Promise.all([A(),te(),W(),ke()])}return{tasks:e,stats:l,assignees:v,boards:y,capabilities:u,activeBoards:de,isCapabilitySupported:ae,loading:c,boardsLoading:C,boardWarning:B,selectedBoard:s,filterStatus:N,filterAssignee:U,fetchBoards:A,fetchCapabilities:ye,fetchTasks:te,fetchStats:W,fetchAssignees:ke,createTask:Pt,createBoard:Re,archiveSelectedBoard:At,completeTasks:Rt,blockTask:xt,unblockTasks:Ut,assignTask:It,addComment:Ot,linkTasks:Et,unlinkTasks:Kt,bulkUpdateTasks:Nt,getTaskLog:Dt,getDiagnostics:zt,reclaimTask:Ft,reassignTask:Lt,specifyTask:qt,dispatch:Vt,setFilter:Jt,setSelectedBoard:me,startEventStream:we,stopEventStream:b,recoverSelectedBoard:d,resolveAvailableBoard:ne,clearBoardScopedState:ve,refreshAll:xe}})}));function Le(e,l={}){const v=l.default||0;return e.map(y=>y.name!=="default"||y.counts?y:{...y,counts:{total:v}})}var Ls,qe=Q((()=>{Ls="default"})),Ye,Xe,Ze,ea,aa,ta,sa,na,la,ia,ra,oa,ua,ca,da,va,fa,ma,ka,pa,ba,_a,ya,ha,ga,wa,Sa,Ta,$a,Ca,Ba,Aa,Pa,Ra,xa,Ua,Ia,Oa,Ea,Ka,Na,Da,za,Fa,La,qa,Va,Ja,Ma,Wa,Ga,Ha,Qa,ja,Ya,Xa,St,Za=Q((()=>{he(),$e(),Ce(),bt(),_t(),gt(),Fe(),qe(),us(),Ye={class:"detail-section"},Xe={class:"detail-row"},Ze={class:"detail-label"},ea={class:"detail-row"},aa={class:"detail-label"},ta={class:"detail-value"},sa={class:"detail-row"},na={class:"detail-label"},la={class:"detail-value"},ia={class:"detail-row"},ra={class:"detail-label"},oa={class:"detail-value"},ua={class:"detail-row"},ca={class:"detail-label"},da={class:"detail-value"},va={key:0,class:"detail-row"},fa={class:"detail-label"},ma={class:"detail-value"},ka={key:1,class:"detail-row"},pa={class:"detail-label"},ba={class:"detail-value"},_a={key:0,class:"detail-section"},ya={class:"section-title"},ha={class:"detail-body"},ga={key:1,class:"detail-section"},wa={class:"section-title"},Sa={key:2,class:"detail-section"},Ta={class:"section-title"},$a={class:"action-group"},Ca={key:1,class:"complete-input"},Ba={key:1,class:"block-input"},Aa={key:0,class:"assign-group"},Pa={key:3,class:"detail-section"},Ra={key:0,class:"session-list"},xa=["onClick"],Ua={class:"session-title"},Ia={class:"session-meta"},Oa={key:1,class:"column-empty"},Ea={key:4,class:"detail-section"},Ka={class:"section-title"},Na={class:"run-header"},Da={class:"run-profile"},za={class:"run-time"},Fa={key:0,class:"run-summary"},La={key:1,class:"run-error"},qa={key:5,class:"detail-section"},Va={class:"section-title"},Ja={class:"comment-header"},Ma={class:"comment-author"},Wa={class:"comment-time"},Ga={class:"comment-body"},Ha={key:6,class:"detail-section"},Qa={class:"section-title"},ja={class:"event-kind"},Ya={class:"event-time"},Xa={class:"messages-modal-body"},St=Te({__name:"KanbanTaskDrawer",props:{taskId:{}},emits:["close","updated"],setup(e,{emit:l}){const v=e,y=l,{t:u}=Be(),c=pt(),C=Ne(),B=Ae(),s=w(null),N=w(!1),U=w(null),I=w(""),z=w(!1),J=w(""),D=w(!1),$=w(!1),O=x(()=>s.value&&(s.value.task.result||s.value.latest_summary)||""),ee=x(()=>s.value?u(`kanban.columns.${s.value.task.status}`,s.value.task.status):""),j=x(()=>{const b=s.value?.task.status;return b!=="done"&&b!=="archived"}),F=w([]),M=w(!1),G=w(!1),de=x(()=>s.value&&[...s.value.runs].reverse().find(b=>b.profile)?.profile||null);async function ae(){if(!s.value)return;const b=de.value;if(b&&(G.value=!G.value,!!G.value)){M.value=!0;try{F.value=(await P(`/api/hermes/kanban/search-sessions?task_id=${encodeURIComponent(s.value.task.id)}&profile=${encodeURIComponent(b)}&board=${encodeURIComponent(B.selectedBoard)}`)).results}catch{F.value=[]}finally{M.value=!1}}}function L(){s.value?.session&&($.value=!0)}const re=x(()=>{const b=s.value?.session;return b?{id:b.id,title:b.title||"",source:b.source,messages:b.messages.filter(S=>S.role==="user"||S.role==="assistant").map(S=>({id:String(S.id),role:S.role,content:S.content,timestamp:S.timestamp})),createdAt:b.started_at,updatedAt:b.ended_at||b.started_at,model:b.model,messageCount:b.messages.length,endedAt:b.ended_at}:null}),_e=x(()=>Le(B.assignees,B.stats?.by_assignee||{}).map(b=>({label:b.name,value:b.name})));Oe(()=>[v.taskId,B.selectedBoard],async([b,S])=>{if(!b){s.value=null;return}N.value=!0;try{const k=await je(b,{board:S});v.taskId===b&&B.selectedBoard===S&&(s.value=k)}catch{v.taskId===b&&B.selectedBoard===S&&C.error(u("kanban.message.loadFailed"))}finally{v.taskId===b&&B.selectedBoard===S&&(N.value=!1)}},{immediate:!0});function Y(b){return b?new Date(b*1e3).toLocaleString():"—"}async function ne(){if(v.taskId){if(!D.value){D.value=!0;return}try{await B.completeTasks([v.taskId],J.value.trim()||void 0),C.success(u("kanban.message.taskCompleted")),D.value=!1,J.value="",y("updated"),y("close")}catch(b){C.error(b.message)}}}async function ve(){if(!(!v.taskId||!I.value.trim()))try{await B.blockTask(v.taskId,I.value.trim()),C.success(u("kanban.message.taskBlocked")),z.value=!1,I.value="",y("updated"),y("close")}catch(b){C.error(b.message)}}async function oe(){if(v.taskId)try{await B.unblockTasks([v.taskId]),C.success(u("kanban.message.taskUnblocked")),y("updated"),y("close")}catch(b){C.error(b.message)}}async function ue(){if(!(!v.taskId||!U.value))try{await B.assignTask(v.taskId,U.value),C.success(u("kanban.message.taskAssigned")),U.value=null,s.value&&(s.value=await je(v.taskId,{board:B.selectedBoard})),y("updated")}catch(b){C.error(b.message)}}return(b,S)=>(p(),g(X,null,[h(t(Qt),{show:!!e.taskId,width:420,placement:"right","onUpdate:show":S[6]||(S[6]=k=>{k||y("close")})},{default:T(()=>[h(t(Yt),{title:s.value?.task.title||"",closable:""},{default:T(()=>[h(t(Ee),{show:N.value},{default:T(()=>[s.value?(p(),g(X,{key:0},[r("div",Ye,[r("div",Xe,[r("span",Ze,o(t(u)("kanban.detail.status")),1),r("span",{class:se(["detail-value status-badge",s.value.task.status])},o(ee.value),3)]),r("div",ea,[r("span",aa,o(t(u)("kanban.detail.assignee")),1),r("span",ta,o(s.value.task.assignee||"—"),1)]),r("div",sa,[r("span",na,o(t(u)("kanban.detail.priority")),1),r("span",la,o(s.value.task.priority),1)]),r("div",ia,[r("span",ra,o(t(u)("kanban.detail.tenant")),1),r("span",oa,o(s.value.task.tenant||"—"),1)]),r("div",ua,[r("span",ca,o(t(u)("kanban.detail.createdAt")),1),r("span",da,o(Y(s.value.task.created_at)),1)]),s.value.task.started_at?(p(),g("div",va,[r("span",fa,o(t(u)("kanban.detail.startedAt")),1),r("span",ma,o(Y(s.value.task.started_at)),1)])):R("",!0),s.value.task.completed_at?(p(),g("div",ka,[r("span",pa,o(t(u)("kanban.detail.completedAt")),1),r("span",ba,o(Y(s.value.task.completed_at)),1)])):R("",!0)]),s.value.task.body?(p(),g("div",_a,[r("div",ya,o(t(u)("kanban.form.body")),1),r("div",ha,o(s.value.task.body),1)])):R("",!0),O.value?(p(),g("div",ga,[r("div",wa,o(t(u)("kanban.detail.result")),1),r("div",{class:"result-summary",onClick:L},o(O.value),1)])):R("",!0),j.value?(p(),g("div",Sa,[r("div",Ta,o(t(u)("kanban.action.title")),1),r("div",$a,[D.value?(p(),g("div",Ca,[h(t(be),{value:J.value,"onUpdate:value":S[1]||(S[1]=k=>J.value=k),size:"small",placeholder:t(u)("kanban.action.completeSummary")},null,8,["value","placeholder"]),h(t(H),{size:"small",type:"primary",onClick:ne},{default:T(()=>[V(o(t(u)("common.ok")),1)]),_:1}),h(t(H),{size:"small",onClick:S[2]||(S[2]=k=>{D.value=!1,J.value=""})},{default:T(()=>[V(o(t(u)("common.cancel")),1)]),_:1})])):(p(),Z(t(H),{key:0,size:"small",onClick:S[0]||(S[0]=k=>D.value=!0)},{default:T(()=>[V(o(t(u)("kanban.action.complete")),1)]),_:1})),s.value.task.status==="blocked"?(p(),Z(t(H),{key:2,size:"small",onClick:oe},{default:T(()=>[V(o(t(u)("kanban.action.unblock")),1)]),_:1})):(p(),g(X,{key:3},[z.value?(p(),g("div",Ba,[h(t(be),{value:I.value,"onUpdate:value":S[4]||(S[4]=k=>I.value=k),size:"small",placeholder:t(u)("kanban.action.blockReason")},null,8,["value","placeholder"]),h(t(H),{size:"small",type:"primary",onClick:ve},{default:T(()=>[V(o(t(u)("common.ok")),1)]),_:1})])):(p(),Z(t(H),{key:0,size:"small",onClick:S[3]||(S[3]=k=>z.value=!0)},{default:T(()=>[V(o(t(u)("kanban.action.block")),1)]),_:1}))],64))]),s.value.task.status!=="running"?(p(),g("div",Aa,[h(t(pe),{value:U.value,"onUpdate:value":S[5]||(S[5]=k=>U.value=k),options:_e.value,size:"small",placeholder:t(u)("kanban.action.assignTo"),style:{flex:"1"}},null,8,["value","options","placeholder"]),h(t(H),{size:"small",disabled:!U.value,onClick:ue},{default:T(()=>[V(o(t(u)("kanban.action.assign")),1)]),_:1},8,["disabled"])])):R("",!0)])):R("",!0),s.value.runs.length>0?(p(),g("div",Pa,[r("div",{class:"section-title",style:{cursor:"pointer"},onClick:ae},[V(o(t(u)("kanban.detail.sessions"))+" ",1),M.value?(p(),Z(t(Ee),{key:0,size:12,style:{"margin-left":"6px"}})):R("",!0)]),G.value&&F.value.length>0?(p(),g("div",Ra,[(p(!0),g(X,null,ce(F.value,k=>(p(),g("div",{key:k.id,class:"session-item",onClick:fe=>t(c).push({name:"hermes.chat",query:{session:k.id}})},[r("div",Ua,o(k.title||k.id),1),r("div",Ia,[r("span",null,o(k.source),1),r("span",null,o(k.model),1),r("span",null,o(Y(k.started_at)),1)])],8,xa))),128))])):R("",!0),G.value&&!M.value&&F.value.length===0?(p(),g("div",Oa,o(t(u)("kanban.detail.noSessions")),1)):R("",!0)])):R("",!0),s.value.runs.length>0?(p(),g("div",Ea,[r("div",Ka,o(t(u)("kanban.detail.runs")),1),(p(!0),g(X,null,ce(s.value.runs,k=>(p(),g("div",{key:k.id,class:"run-item"},[r("div",Na,[r("span",{class:se(["run-status",k.status])},o(k.status),3),r("span",Da,o(k.profile||"—"),1),r("span",za,o(Y(k.started_at)),1)]),k.summary?(p(),g("div",Fa,o(k.summary),1)):R("",!0),k.error?(p(),g("div",La,o(k.error),1)):R("",!0)]))),128))])):R("",!0),s.value.comments.length>0?(p(),g("div",qa,[r("div",Va,o(t(u)("kanban.detail.comments")),1),(p(!0),g(X,null,ce(s.value.comments,k=>(p(),g("div",{key:k.id,class:"comment-item"},[r("div",Ja,[r("span",Ma,o(k.author),1),r("span",Wa,o(Y(k.created_at)),1)]),r("div",Ga,o(k.body),1)]))),128))])):R("",!0),s.value.events.length>0?(p(),g("div",Ha,[r("div",Qa,o(t(u)("kanban.detail.events")),1),(p(!0),g(X,null,ce(s.value.events.slice(-10),k=>(p(),g("div",{key:k.id,class:"event-item"},[r("span",ja,o(k.kind),1),r("span",Ya,o(Y(k.created_at)),1)]))),128))])):R("",!0)],64)):R("",!0)]),_:1},8,["show"])]),_:1},8,["title"])]),_:1},8,["show"]),re.value?(p(),Z(t(Ke),{key:0,show:$.value,preset:"card",title:s.value?.task.title||"",style:{width:"900px",maxWidth:"calc(100vw - 48px)"},onClose:S[7]||(S[7]=k=>$.value=!1)},{default:T(()=>[r("div",Xa,[h(cs,{session:re.value},null,8,["session"])])]),_:1},8,["show","title"])):R("",!0)],64))}})})),qs=Q((()=>{})),Tt,Vs=Q((()=>{Za(),Za(),qs(),De(),Tt=ze(St,[["__scopeId","data-v-55115eb7"]])})),$t,et=Q((()=>{he(),$e(),Ce(),Fe(),qe(),$t=Te({__name:"KanbanCreateForm",emits:["close","created"],setup(e,{emit:l}){const v=l,{t:y}=Be(),u=Ne(),c=Ae(),C=w(""),B=w(""),s=w(null),N=w(null),U=w(!1),I=x(()=>[{label:y("kanban.card.priority.low"),value:1},{label:y("kanban.card.priority.medium"),value:2},{label:y("kanban.card.priority.high"),value:3}]),z=x(()=>Le(c.assignees,c.stats?.by_assignee||{}).map(D=>({label:D.name,value:D.name})));async function J(){if(!C.value.trim()){u.warning(y("kanban.form.titleRequired"));return}U.value=!0;try{await c.createTask({title:C.value.trim(),body:B.value.trim()||void 0,assignee:s.value||void 0,priority:N.value??void 0}),u.success(y("kanban.message.taskCreated")),v("created"),v("close")}catch(D){u.error(D.message)}finally{U.value=!1}}return(D,$)=>(p(),Z(t(Ke),{show:!0,preset:"dialog",title:t(y)("kanban.createTask"),style:{width:"480px"},onClose:$[5]||($[5]=O=>v("close"))},{action:T(()=>[h(t(H),{onClick:$[4]||($[4]=O=>v("close"))},{default:T(()=>[V(o(t(y)("common.cancel")),1)]),_:1}),h(t(H),{type:"primary",loading:U.value,onClick:J},{default:T(()=>[V(o(t(y)("common.create")),1)]),_:1},8,["loading"])]),default:T(()=>[h(t(Zt),{"label-placement":"top"},{default:T(()=>[h(t(Se),{label:t(y)("kanban.form.title")},{default:T(()=>[h(t(be),{value:C.value,"onUpdate:value":$[0]||($[0]=O=>C.value=O),placeholder:t(y)("kanban.form.titlePlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),h(t(Se),{label:t(y)("kanban.form.body")},{default:T(()=>[h(t(be),{value:B.value,"onUpdate:value":$[1]||($[1]=O=>B.value=O),type:"textarea",rows:3,placeholder:t(y)("kanban.form.bodyPlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),h(t(Se),{label:t(y)("kanban.form.assignee")},{default:T(()=>[h(t(pe),{value:s.value,"onUpdate:value":$[2]||($[2]=O=>s.value=O),options:z.value,placeholder:t(y)("kanban.form.selectAssignee"),clearable:""},null,8,["value","options","placeholder"])]),_:1},8,["label"]),h(t(Se),{label:t(y)("kanban.form.priority")},{default:T(()=>[h(t(pe),{value:N.value,"onUpdate:value":$[3]||($[3]=O=>N.value=O),options:I.value,placeholder:t(y)("kanban.form.selectPriority"),clearable:""},null,8,["value","options","placeholder"])]),_:1},8,["label"])]),_:1})]),_:1},8,["title"]))}})})),Ct,Js=Q((()=>{et(),et(),Ct=$t})),at,tt,st,nt,lt,it,rt,ot,ut,ct,dt,vt,ft,mt,Bt,kt=Q((()=>{he(),$e(),Ce(),bt(),vs(),Vs(),Js(),Fe(),is(),qe(),at={class:"kanban-view"},tt={class:"page-header"},st={class:"header-title"},nt={class:"header-actions"},lt={key:0,class:"stats-bar"},it=["aria-pressed","onClick"],rt={class:"stat-count"},ot={class:"stat-label"},ut=["aria-pressed"],ct={class:"stat-count"},dt={class:"stat-label"},vt={class:"kanban-board"},ft={key:0,class:"column-empty"},mt={class:"board-form"},Bt=Te({__name:"KanbanView",setup(e){const{t:l}=Be(),v=as(),y=pt(),u=Ne(),c=Ae(),C=ls(),B=w(!1),s=w(!1),N=w(null),U=w(""),I=w(""),z=w(!1),J=w(null),D=w(!1),$=["triage","todo","ready","running","blocked","done","archived"],O=w([...$]);function ee(d){return Array.isArray(d)?typeof d[0]=="string"?d[0]:null:typeof d=="string"?d:null}function j(){return ee(v.query.board)}async function F(d){j()!==d&&await y.replace({query:{...v.query,board:d}})}async function M(d,_=!0,f=!1){const A=c.selectedBoard,{board:ye,recovered:Re}=c.recoverSelectedBoard(d||c.selectedBoard||"default");N.value=null,B.value=!1,s.value=!1,_&&Re&&c.boardWarning&&u.warning(c.boardWarning),await F(ye),(f||ye!==A)&&await c.refreshAll()}function G(d){return`${l("kanban.stats.tasks")}: ${d}`}const de=x(()=>c.activeBoards.map(d=>{const _=typeof d.total=="number"?d.total:0;return{label:`${l("kanban.title")}: ${d.icon?`${d.icon} `:""}${d.name||d.slug} · ${G(_)}`,value:d.slug}})),ae=x({get:()=>c.selectedBoard,set:d=>{M(d||"default")}}),L=x(()=>{const d={};for(const _ of $)d[_]=c.tasks.filter(f=>f.status===_).sort((f,A)=>A.created_at-f.created_at);return d}),re=x(()=>{const d=c.filterStatus;return d&&$.includes(d)?[d]:$}),_e=x(()=>Le(c.assignees,c.stats?.by_assignee||{})),Y=x(()=>Object.fromEntries(C.profiles.map(d=>[d.name,d.avatar||null]))),ne=x(()=>[{label:l("kanban.allStatuses"),value:""},...$.map(d=>({label:l(`kanban.columns.${d}`,d),value:d}))]),ve=x(()=>[{label:l("kanban.allAssignees"),value:""},..._e.value.map(d=>({label:d.name,value:d.name}))]),oe=x({get:()=>c.filterStatus||"",set:d=>c.setFilter("status",d||null)}),ue=x({get:()=>c.filterAssignee||"",set:d=>c.setFilter("assignee",d||null)});Oe(()=>v.query.board,async()=>{D.value&&await M(j(),!1)}),Oe(re,d=>{O.value=[...d]},{immediate:!0}),Xt(async()=>{await Promise.all([c.fetchBoards(),c.fetchCapabilities(),C.profiles.length===0?C.fetchProfiles():Promise.resolve()]),await M(j(),!0,!0),c.startEventStream(),D.value=!0,J.value=setInterval(()=>{document.visibilityState==="visible"&&Promise.all([c.fetchBoards(),c.fetchTasks(!0),c.fetchStats()])},15e3)}),jt(()=>{c.stopEventStream(),J.value&&clearInterval(J.value)});function b(d){N.value=d}function S(){N.value=null}async function k(){await Promise.all([c.fetchTasks(),c.fetchStats()])}async function fe(){await c.fetchTasks()}async function ge(d){c.setFilter("status",d),O.value=d?[d]:[...$],await c.fetchTasks()}async function we(){await Promise.all([c.fetchTasks(),c.fetchStats(),c.fetchBoards()])}async function Pe(){const d=U.value.trim();if(!d){u.warning(l("kanban.board.slugRequired"));return}z.value=!0;try{const _=await c.createBoard({slug:d,name:I.value.trim()||void 0});U.value="",I.value="",s.value=!1,await F(_.slug),u.success(l("kanban.board.created"))}catch(_){u.error(_.message)}finally{z.value=!1}}async function me(){if(c.selectedBoard!=="default"&&window.confirm(l("kanban.board.archiveConfirm"))){z.value=!0;try{await c.archiveSelectedBoard(),await F(ie),u.success(l("kanban.board.archived"))}catch(d){u.error(d.message)}finally{z.value=!1}}}return(d,_)=>(p(),g("div",at,[r("header",tt,[r("h2",st,o(t(l)("kanban.title")),1),r("div",nt,[h(t(pe),{value:ae.value,"onUpdate:value":_[0]||(_[0]=f=>ae.value=f),options:de.value,loading:t(c).boardsLoading,size:"small",style:{width:"260px"}},null,8,["value","options","loading"]),h(t(H),{size:"small",loading:z.value,onClick:_[1]||(_[1]=f=>s.value=!0)},{default:T(()=>[V(o(t(l)("common.add")),1)]),_:1},8,["loading"]),h(t(H),{size:"small",secondary:"",disabled:t(c).selectedBoard===t(ie),loading:z.value,onClick:me},{default:T(()=>[V(o(t(l)("kanban.board.archive")),1)]),_:1},8,["disabled","loading"]),h(t(pe),{value:oe.value,"onUpdate:value":[_[2]||(_[2]=f=>oe.value=f),fe],options:ne.value,size:"small",style:{width:"150px"}},null,8,["value","options"]),h(t(pe),{value:ue.value,"onUpdate:value":[_[3]||(_[3]=f=>ue.value=f),fe],options:ve.value,size:"small",style:{width:"170px"}},null,8,["value","options"]),h(t(H),{type:"primary",size:"small",onClick:_[4]||(_[4]=f=>B.value=!0)},{icon:T(()=>[..._[12]||(_[12]=[r("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[r("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),r("line",{x1:"5",y1:"12",x2:"19",y2:"12"})],-1)])]),default:T(()=>[V(" "+o(t(l)("kanban.createTask")),1)]),_:1})])]),t(c).stats?(p(),g("div",lt,[(p(),g(X,null,ce($,f=>r("button",{key:f,type:"button",class:se(["stat-chip",[f,{active:t(c).filterStatus===f}]]),"aria-pressed":t(c).filterStatus===f,onClick:A=>ge(f)},[r("span",rt,o(t(c).stats.by_status[f]||0),1),r("span",ot,o(t(l)(`kanban.columns.${f}`,f)),1)],10,it)),64)),r("button",{type:"button",class:se(["stat-chip total",{active:!t(c).filterStatus}]),"aria-pressed":!t(c).filterStatus,onClick:_[5]||(_[5]=f=>ge(null))},[r("span",ct,o(t(c).stats.total),1),r("span",dt,o(t(l)("kanban.stats.total")),1)],10,ut)])):R("",!0),h(t(Ee),{show:t(c).loading&&t(c).tasks.length===0},{default:T(()=>[r("div",vt,[h(t(Ht),{"expanded-names":O.value,"onUpdate:expandedNames":_[6]||(_[6]=f=>O.value=f)},{default:T(()=>[(p(!0),g(X,null,ce(re.value,f=>(p(),Z(t(Gt),{key:f,title:`${t(l)(`kanban.columns.${f}`,f)} (${L.value[f].length})`,name:f,class:se(["kanban-column",`status-${f}`])},{header:T(()=>[r("span",{class:se(["column-header",`status-${f}`])},[_[13]||(_[13]=r("span",{class:"status-dot","aria-hidden":"true"},null,-1)),r("span",null,o(t(l)(`kanban.columns.${f}`,f))+" ("+o(L.value[f].length)+")",1)],2)]),default:T(()=>[r("div",{class:se(["task-list",`status-${f}`])},[(p(!0),g(X,null,ce(L.value[f],A=>(p(),Z(ht,{key:A.id,task:A,"assignee-avatar":A.assignee&&Y.value[A.assignee]||null,onClick:ye=>b(A.id)},null,8,["task","assignee-avatar","onClick"]))),128)),L.value[f].length===0?(p(),g("div",ft,o(t(l)("kanban.noTasks")),1)):R("",!0)],2)]),_:2},1032,["title","name","class"]))),128))]),_:1},8,["expanded-names"])])]),_:1},8,["show"]),h(Tt,{"task-id":N.value,onClose:S,onUpdated:k},null,8,["task-id"]),h(t(Ke),{show:s.value,"onUpdate:show":_[10]||(_[10]=f=>s.value=f),preset:"dialog",title:t(l)("kanban.board.create"),style:{width:"420px"}},{action:T(()=>[h(t(H),{onClick:_[9]||(_[9]=f=>s.value=!1)},{default:T(()=>[V(o(t(l)("common.cancel")),1)]),_:1}),h(t(H),{type:"primary",loading:z.value,onClick:Pe},{default:T(()=>[V(o(t(l)("common.create")),1)]),_:1},8,["loading"])]),default:T(()=>[r("div",mt,[h(t(be),{value:U.value,"onUpdate:value":_[7]||(_[7]=f=>U.value=f),placeholder:t(l)("kanban.board.slugPlaceholder")},null,8,["value","placeholder"]),h(t(be),{value:I.value,"onUpdate:value":_[8]||(_[8]=f=>I.value=f),placeholder:t(l)("kanban.board.namePlaceholder")},null,8,["value","placeholder"])])]),_:1},8,["show","title"]),B.value?(p(),Z(Ct,{key:1,onClose:_[11]||(_[11]=f=>B.value=!1),onCreated:we})):R("",!0)]))}})})),Ms=Q((()=>{})),Ws,Gs=Q((()=>{kt(),kt(),Ms(),De(),Ws=ze(Bt,[["__scopeId","data-v-5c93b592"]])}));Gs();export{Ws as default};
1
+ import{n as Q}from"./rolldown-runtime-BKwlnUi0.js";import{A as pe,Bt as se,Ct as Oe,D as Wt,Ht as o,I as H,M as Gt,N as Ht,Pt as w,Q as X,S as Ke,Tt as T,W as he,_ as Qt,_t as jt,at as g,bt as ce,ct as h,g as Yt,gt as Xt,it as R,l as Ee,lt as Te,m as Zt,nt as r,p as Se,rt as Z,st as V,t as $e,tt as x,vt as p,y as Ne,z as be,zt as t}from"./ui-vendor-BMwF7QXa.js";import{c as pt,d as es,n as Ce,o as bt,r as Be,s as as,u as ts}from"./vue-vendor-kBYBtqCg.js";import{d as P,l as _t,n as De,o as ss,s as ns,t as ze}from"./_plugin-vue_export-helper-CHoatqkO.js";import{r as ls,t as is}from"./profiles-CyjgPK1f.js";import{B as rs,V as os}from"./index-DpU5R9KV.js";import{n as us,t as cs}from"./HistoryMessageList-S77rD1zj.js";var Ve,Je,Me,We,Ge,yt,He=Q((()=>{he(),$e(),Ce(),os(),Ve={class:"card-title"},Je={class:"card-meta"},Me={class:"meta-tag assignee-tag"},We={class:"meta-time"},Ge={key:0,class:"card-body-preview"},yt=Te({__name:"KanbanTaskCard",props:{task:{},assigneeAvatar:{}},emits:["click"],setup(e,{emit:l}){const v=e,y=l,{t:u}=Be(),c=x(()=>{const s=Date.now()/1e3-v.task.created_at;return s<60?u("kanban.card.timeAgo.justNow"):s<3600?u("kanban.card.timeAgo.minutes",{count:Math.floor(s/60)}):s<86400?u("kanban.card.timeAgo.hours",{count:Math.floor(s/3600)}):u("kanban.card.timeAgo.days",{count:Math.floor(s/86400)})}),C=x(()=>v.task.priority>=3?"high":v.task.priority===2?"medium":"low"),B=x(()=>u(`kanban.card.priority.${C.value}`));return(s,N)=>(p(),g("div",{class:se(["kanban-task-card",`status-${e.task.status}`]),onClick:N[0]||(N[0]=U=>y("click",e.task.id))},[r("div",Ve,o(e.task.title),1),r("div",Je,[e.task.assignee?(p(),Z(t(Wt),{key:0,trigger:"hover"},{trigger:T(()=>[r("span",Me,[h(rs,{class:"assignee-profile-avatar",name:e.task.assignee,avatar:e.assigneeAvatar,size:18,"aria-hidden":"true"},null,8,["name","avatar"]),r("span",null,o(e.task.assignee),1)])]),default:T(()=>[V(" "+o(t(u)("kanban.card.assigneeTooltip")),1)]),_:1})):R("",!0),e.task.priority>=2?(p(),g("span",{key:1,class:se(["meta-tag priority-tag",C.value])},o(B.value),3)):R("",!0),r("span",We,o(c.value),1)]),e.task.body?(p(),g("div",Ge,o(e.task.body.slice(0,80))+o(e.task.body.length>80?"...":""),1)):R("",!0)],2))}})})),ds=Q((()=>{})),ht,vs=Q((()=>{He(),He(),ds(),De(),ht=ze(yt,[["__scopeId","data-v-ec73b201"]])}));function fs(e){return e?.trim()||"default"}function ms(){try{return localStorage.getItem("hermes_active_profile_name")}catch{return null}}function E(e,l){const v=l.toString();return v?`${e}?${v}`:e}function K(e){const l=new URLSearchParams;return l.set("board",fs(e)),l}function Qe(e){return e?e.startsWith("https")?"wss:":"ws:":location.protocol==="https:"?"wss:":"ws:"}function ks(e){const l=ns(),v=K(e?.board),y=ss();y&&v.set("token",y);const u=ms();u&&v.set("profile",u);const c=`/api/hermes/kanban/events?${v.toString()}`;if(l)return`${Qe(l)}//${new URL(l).host}${c}`;const C=location.host;return`${Qe()}//${C}${c}`}function ps(e){return new WebSocket(ks(e))}async function bs(e){const l=new URLSearchParams;return e?.includeArchived&&l.set("includeArchived","true"),(await P(E("/api/hermes/kanban/boards",l))).boards}async function _s(e){return(await P("/api/hermes/kanban/boards",{method:"POST",body:JSON.stringify(e)})).board}async function ys(e){return P(`/api/hermes/kanban/boards/${encodeURIComponent(e)}`,{method:"DELETE"})}async function hs(){return(await P("/api/hermes/kanban/capabilities")).capabilities}async function gs(e){const l=K(e?.board);return e?.status&&l.set("status",e.status),e?.assignee&&l.set("assignee",e.assignee),e?.tenant&&l.set("tenant",e.tenant),e?.includeArchived&&l.set("includeArchived","true"),(await P(E("/api/hermes/kanban",l))).tasks}async function je(e,l){return P(E(`/api/hermes/kanban/${encodeURIComponent(e)}`,K(l?.board)))}async function ws(e,l){return(await P(E("/api/hermes/kanban",K(l?.board)),{method:"POST",body:JSON.stringify(e)})).task}async function Ss(e,l,v){return P(E("/api/hermes/kanban/complete",K(v?.board)),{method:"POST",body:JSON.stringify({task_ids:e,summary:l})})}async function Ts(e,l,v){return P(E(`/api/hermes/kanban/${encodeURIComponent(e)}/block`,K(v?.board)),{method:"POST",body:JSON.stringify({reason:l})})}async function $s(e,l){return P(E("/api/hermes/kanban/unblock",K(l?.board)),{method:"POST",body:JSON.stringify({task_ids:e})})}async function Cs(e,l,v){return P(E(`/api/hermes/kanban/${encodeURIComponent(e)}/assign`,K(v?.board)),{method:"POST",body:JSON.stringify({profile:l})})}async function Bs(e,l,v){return P(E(`/api/hermes/kanban/${encodeURIComponent(e)}/comments`,K(v?.board)),{method:"POST",body:JSON.stringify(l)})}async function As(e,l){return P(E("/api/hermes/kanban/links",K(l?.board)),{method:"POST",body:JSON.stringify(e)})}async function Ps(e,l){const v=K(l?.board);return v.set("parent_id",e.parent_id),v.set("child_id",e.child_id),P(E("/api/hermes/kanban/links",v),{method:"DELETE"})}async function Rs(e,l){return P(E("/api/hermes/kanban/tasks/bulk",K(l?.board)),{method:"POST",body:JSON.stringify(e)})}async function xs(e,l){const v=K(l?.board);return l?.tail!==void 0&&v.set("tail",String(l.tail)),P(E(`/api/hermes/kanban/${encodeURIComponent(e)}/log`,v))}async function Us(e){const l=K(e?.board);return e?.task&&l.set("task",e.task),e?.severity&&l.set("severity",e.severity),(await P(E("/api/hermes/kanban/diagnostics",l))).diagnostics}async function Is(e,l){return P(E(`/api/hermes/kanban/${encodeURIComponent(e)}/reclaim`,K(l?.board)),{method:"POST",body:JSON.stringify({reason:l?.reason})})}async function Os(e,l,v){return P(E(`/api/hermes/kanban/${encodeURIComponent(e)}/reassign`,K(v?.board)),{method:"POST",body:JSON.stringify({profile:l,reclaim:v?.reclaim,reason:v?.reason})})}async function Es(e,l){return(await P(E(`/api/hermes/kanban/${encodeURIComponent(e)}/specify`,K(l?.board)),{method:"POST",body:JSON.stringify({author:l?.author})})).results}async function Ks(e){return(await P(E("/api/hermes/kanban/dispatch",K(e?.board)),{method:"POST",body:JSON.stringify({dryRun:e?.dryRun,max:e?.max,failureLimit:e?.failureLimit})})).result}async function Ns(e){return(await P(E("/api/hermes/kanban/stats",K(e?.board)))).stats}async function Ds(e){return(await P(E("/api/hermes/kanban/assignees",K(e?.board)))).assignees}var gt=Q((()=>{_t()}));function zs(e){if(typeof window>"u")return null;try{return window.localStorage.getItem(e)}catch{return null}}function Fs(e,l){if(!(typeof window>"u"))try{window.localStorage.setItem(e,l)}catch{}}function Ue(e){const l=e?.trim().toLowerCase();return l&&wt.test(l)?l:ie}var Ie,ie,wt,Ae,Fe=Q((()=>{es(),he(),gt(),Ie="hermes.kanban.selectedBoard",ie="default",wt=/^[a-z0-9][a-z0-9_-]{0,63}$/,Ae=ts("kanban",()=>{const e=w([]),l=w(null),v=w([]),y=w([]),u=w(null),c=w(!1),C=w(!1),B=w(null),s=w(Ue(zs(Ie))),N=w(null),U=w(null);let I=0,z=0,J=0,D=0,$=0,O=0,ee=0,j=null,F=null,M=null,G=!1;const de=x(()=>{const a=y.value.filter(n=>!n.archived);return a.some(n=>n.slug==="default")?a:[{slug:ie,name:"Default",description:"",icon:"",color:"",created_at:null,archived:!1,counts:{},total:0},...a]});function ae(a){if(!u.value)return!1;const n=u.value.capabilities?.find(i=>i.key===a);return n?n.status==="supported":u.value.missing?.includes(a)?!1:u.value.supports?.[a]===!0}function L(a){if(!ae(a))throw new Error(`Kanban capability "${a}" is not supported by the current Hermes backend`)}function re(a,n){const i=u.value?.capabilities?.find(m=>m.key===a);return i?n.includes(i.status):n.includes("supported")?ae(a):!1}function _e(a,n){if(!re(a,n))throw new Error(`Kanban capability "${a}" is not available with the required status`)}function Y(a){return de.value.some(n=>n.slug===a)}function ne(a){const n=Ue(a);return y.value.length>0&&!Y(n)?ie:n}function ve(){e.value=[],l.value=null,v.value=[]}function oe(){F&&clearTimeout(F),M&&clearTimeout(M),F=null,M=null}function ue(){if(!j)return;const a=j;j=null,a.onclose=null,a.onerror=null,a.onmessage=null;try{a.close()}catch{}}function b(){G=!1,ee++,oe(),ue()}function S(a,n,i){M&&clearTimeout(M),M=setTimeout(()=>{!G||i!==ee||n!==I||a!==s.value||Promise.all([A(),te(!0),W(),ke()])},100)}function k(a,n,i){F&&clearTimeout(F),F=setTimeout(()=>{!G||i!==ee||n!==I||a!==s.value||fe(a,n,i)},3e3)}function fe(a,n,i){ue();let m;try{m=ps({board:a})}catch(q){console.error("Failed to open kanban event stream:",q),k(a,n,i);return}j=m,m.onmessage=q=>{if(!(!G||i!==ee||n!==I||a!==s.value))try{JSON.parse(String(q.data))?.type==="event"&&S(a,n,i)}catch{S(a,n,i)}},m.onerror=()=>{j===m&&console.error("Kanban event stream error")},m.onclose=()=>{j===m&&(j=null,k(a,n,i))}}function ge(){const a=u.value?.capabilities?.find(n=>n.key==="events")?.status;return a==="supported"||a==="partial"||ae("events")}function we(){if(!ge())return!1;G=!0;const a=++ee,n=I,i=s.value;return oe(),fe(i,n,a),!0}function Pe(){G&&we()}function me(a){const n=ne(a),i=s.value!==n;return s.value=n,Fs(Ie,n),B.value=null,i&&(ve(),I++,Pe()),n}function d(a){const n=Ue(a),i=ne(n),m=i!==n;return me(i),m&&(B.value=`Board "${n}" is unavailable; fell back to "${i}".`),{board:i,recovered:m}}function _(a){return{seq:a(),generation:I,board:s.value}}function f(a,n,i,m){return a===m&&n===I&&i===s.value}async function A(a=!1){const n=++z;C.value=!0;try{const i=await bs({includeArchived:a});if(n!==z)return;y.value=i,ne(s.value)!==s.value&&d(s.value)}catch(i){n===z&&console.error("Failed to fetch kanban boards:",i)}finally{n===z&&(C.value=!1)}}async function ye(){try{u.value=await hs()}catch(a){console.error("Failed to fetch kanban capabilities:",a)}}async function Re(a){const n=await _s(a);return await A(),me(n.slug),await xe(),n}async function At(){const a=s.value;if(a==="default")throw new Error("Cannot archive the default kanban board");await ys(a),await A(),me(ie),await xe()}async function te(a=!1){const{seq:n,generation:i,board:m}=_(()=>++J),q=a?0:++O;a||(c.value=!0);try{const le=await gs({board:m,status:N.value||void 0,assignee:U.value||void 0,includeArchived:!0});f(n,i,m,J)&&(e.value=le)}catch(le){f(n,i,m,J)&&console.error("Failed to fetch kanban tasks:",le)}finally{!a&&q===O&&(c.value=!1)}}async function W(){const{seq:a,generation:n,board:i}=_(()=>++D);try{const m=await Ns({board:i});f(a,n,i,D)&&(l.value=m)}catch(m){f(a,n,i,D)&&console.error("Failed to fetch kanban stats:",m)}}async function ke(){const{seq:a,generation:n,board:i}=_(()=>++$);try{const m=await Ds({board:i});f(a,n,i,$)&&(v.value=m)}catch(m){f(a,n,i,$)&&console.error("Failed to fetch kanban assignees:",m)}}async function Pt(a){const n=s.value,i=await ws(a,{board:n});return n===s.value&&(e.value.unshift(i),await Promise.all([W(),A()])),i}async function Rt(a,n){const i=s.value;if(await Ss(a,n,{board:i}),i===s.value){for(const m of a){const q=e.value.find(le=>le.id===m);q&&(q.status="done")}await Promise.all([W(),A()])}}async function xt(a,n){const i=s.value;if(await Ts(a,n,{board:i}),i===s.value){const m=e.value.find(q=>q.id===a);m&&(m.status="blocked"),await Promise.all([W(),A()])}}async function Ut(a){const n=s.value;if(await $s(a,{board:n}),n===s.value){for(const i of a){const m=e.value.find(q=>q.id===i);m&&(m.status="ready")}await Promise.all([W(),A()])}}async function It(a,n){const i=s.value;if(await Cs(a,n,{board:i}),i===s.value){const m=e.value.find(q=>q.id===a);m&&(m.assignee=n),await Promise.all([W(),ke()])}}async function Ot(a,n,i){return L("commentsWrite"),Bs(a,{body:n,author:i},{board:s.value})}async function Et(a,n){L("links");const i=s.value,m=await As({parent_id:a,child_id:n},{board:i});return i===s.value&&await Promise.all([te(!0),W(),A()]),m}async function Kt(a,n){L("links");const i=s.value,m=await Ps({parent_id:a,child_id:n},{board:i});return i===s.value&&await Promise.all([te(!0),W(),A()]),m}async function Nt(a){_e("bulk",["supported","partial"]);const n=s.value,i=await Rs(a,{board:n});return n===s.value&&await Promise.all([te(!0),W(),A(),ke()]),i}async function Dt(a,n){return L("taskLog"),xs(a,{board:s.value,tail:n})}async function zt(a={}){return L("diagnostics"),Us({...a,board:s.value})}async function Ft(a,n){L("reclaim");const i=s.value,m=await Is(a,{board:i,reason:n});return i===s.value&&await Promise.all([te(!0),W(),A()]),m}async function Lt(a,n,i={}){L("reassign");const m=s.value,q=await Os(a,n,{board:m,...i});if(m===s.value){const le=e.value.find(Mt=>Mt.id===a);le&&(le.assignee=n==="none"?null:n),await Promise.all([W(),ke()])}return q}async function qt(a,n){L("specify");const i=s.value,m=await Es(a,{board:i,author:n});return i===s.value&&await Promise.all([te(!0),W(),A()]),m}async function Vt(a={}){L("dispatch");const n=s.value,i=await Ks({...a,board:n});return n===s.value&&await Promise.all([te(!0),W(),A()]),i}function Jt(a,n){a==="status"?N.value=n:U.value=n}async function xe(){await Promise.all([A(),te(),W(),ke()])}return{tasks:e,stats:l,assignees:v,boards:y,capabilities:u,activeBoards:de,isCapabilitySupported:ae,loading:c,boardsLoading:C,boardWarning:B,selectedBoard:s,filterStatus:N,filterAssignee:U,fetchBoards:A,fetchCapabilities:ye,fetchTasks:te,fetchStats:W,fetchAssignees:ke,createTask:Pt,createBoard:Re,archiveSelectedBoard:At,completeTasks:Rt,blockTask:xt,unblockTasks:Ut,assignTask:It,addComment:Ot,linkTasks:Et,unlinkTasks:Kt,bulkUpdateTasks:Nt,getTaskLog:Dt,getDiagnostics:zt,reclaimTask:Ft,reassignTask:Lt,specifyTask:qt,dispatch:Vt,setFilter:Jt,setSelectedBoard:me,startEventStream:we,stopEventStream:b,recoverSelectedBoard:d,resolveAvailableBoard:ne,clearBoardScopedState:ve,refreshAll:xe}})}));function Le(e,l={}){const v=l.default||0;return e.map(y=>y.name!=="default"||y.counts?y:{...y,counts:{total:v}})}var Ls,qe=Q((()=>{Ls="default"})),Ye,Xe,Ze,ea,aa,ta,sa,na,la,ia,ra,oa,ua,ca,da,va,fa,ma,ka,pa,ba,_a,ya,ha,ga,wa,Sa,Ta,$a,Ca,Ba,Aa,Pa,Ra,xa,Ua,Ia,Oa,Ea,Ka,Na,Da,za,Fa,La,qa,Va,Ja,Ma,Wa,Ga,Ha,Qa,ja,Ya,Xa,St,Za=Q((()=>{he(),$e(),Ce(),bt(),_t(),gt(),Fe(),qe(),us(),Ye={class:"detail-section"},Xe={class:"detail-row"},Ze={class:"detail-label"},ea={class:"detail-row"},aa={class:"detail-label"},ta={class:"detail-value"},sa={class:"detail-row"},na={class:"detail-label"},la={class:"detail-value"},ia={class:"detail-row"},ra={class:"detail-label"},oa={class:"detail-value"},ua={class:"detail-row"},ca={class:"detail-label"},da={class:"detail-value"},va={key:0,class:"detail-row"},fa={class:"detail-label"},ma={class:"detail-value"},ka={key:1,class:"detail-row"},pa={class:"detail-label"},ba={class:"detail-value"},_a={key:0,class:"detail-section"},ya={class:"section-title"},ha={class:"detail-body"},ga={key:1,class:"detail-section"},wa={class:"section-title"},Sa={key:2,class:"detail-section"},Ta={class:"section-title"},$a={class:"action-group"},Ca={key:1,class:"complete-input"},Ba={key:1,class:"block-input"},Aa={key:0,class:"assign-group"},Pa={key:3,class:"detail-section"},Ra={key:0,class:"session-list"},xa=["onClick"],Ua={class:"session-title"},Ia={class:"session-meta"},Oa={key:1,class:"column-empty"},Ea={key:4,class:"detail-section"},Ka={class:"section-title"},Na={class:"run-header"},Da={class:"run-profile"},za={class:"run-time"},Fa={key:0,class:"run-summary"},La={key:1,class:"run-error"},qa={key:5,class:"detail-section"},Va={class:"section-title"},Ja={class:"comment-header"},Ma={class:"comment-author"},Wa={class:"comment-time"},Ga={class:"comment-body"},Ha={key:6,class:"detail-section"},Qa={class:"section-title"},ja={class:"event-kind"},Ya={class:"event-time"},Xa={class:"messages-modal-body"},St=Te({__name:"KanbanTaskDrawer",props:{taskId:{}},emits:["close","updated"],setup(e,{emit:l}){const v=e,y=l,{t:u}=Be(),c=pt(),C=Ne(),B=Ae(),s=w(null),N=w(!1),U=w(null),I=w(""),z=w(!1),J=w(""),D=w(!1),$=w(!1),O=x(()=>s.value&&(s.value.task.result||s.value.latest_summary)||""),ee=x(()=>s.value?u(`kanban.columns.${s.value.task.status}`,s.value.task.status):""),j=x(()=>{const b=s.value?.task.status;return b!=="done"&&b!=="archived"}),F=w([]),M=w(!1),G=w(!1),de=x(()=>s.value&&[...s.value.runs].reverse().find(b=>b.profile)?.profile||null);async function ae(){if(!s.value)return;const b=de.value;if(b&&(G.value=!G.value,!!G.value)){M.value=!0;try{F.value=(await P(`/api/hermes/kanban/search-sessions?task_id=${encodeURIComponent(s.value.task.id)}&profile=${encodeURIComponent(b)}&board=${encodeURIComponent(B.selectedBoard)}`)).results}catch{F.value=[]}finally{M.value=!1}}}function L(){s.value?.session&&($.value=!0)}const re=x(()=>{const b=s.value?.session;return b?{id:b.id,title:b.title||"",source:b.source,messages:b.messages.filter(S=>S.role==="user"||S.role==="assistant").map(S=>({id:String(S.id),role:S.role,content:S.content,timestamp:S.timestamp})),createdAt:b.started_at,updatedAt:b.ended_at||b.started_at,model:b.model,messageCount:b.messages.length,endedAt:b.ended_at}:null}),_e=x(()=>Le(B.assignees,B.stats?.by_assignee||{}).map(b=>({label:b.name,value:b.name})));Oe(()=>[v.taskId,B.selectedBoard],async([b,S])=>{if(!b){s.value=null;return}N.value=!0;try{const k=await je(b,{board:S});v.taskId===b&&B.selectedBoard===S&&(s.value=k)}catch{v.taskId===b&&B.selectedBoard===S&&C.error(u("kanban.message.loadFailed"))}finally{v.taskId===b&&B.selectedBoard===S&&(N.value=!1)}},{immediate:!0});function Y(b){return b?new Date(b*1e3).toLocaleString():"—"}async function ne(){if(v.taskId){if(!D.value){D.value=!0;return}try{await B.completeTasks([v.taskId],J.value.trim()||void 0),C.success(u("kanban.message.taskCompleted")),D.value=!1,J.value="",y("updated"),y("close")}catch(b){C.error(b.message)}}}async function ve(){if(!(!v.taskId||!I.value.trim()))try{await B.blockTask(v.taskId,I.value.trim()),C.success(u("kanban.message.taskBlocked")),z.value=!1,I.value="",y("updated"),y("close")}catch(b){C.error(b.message)}}async function oe(){if(v.taskId)try{await B.unblockTasks([v.taskId]),C.success(u("kanban.message.taskUnblocked")),y("updated"),y("close")}catch(b){C.error(b.message)}}async function ue(){if(!(!v.taskId||!U.value))try{await B.assignTask(v.taskId,U.value),C.success(u("kanban.message.taskAssigned")),U.value=null,s.value&&(s.value=await je(v.taskId,{board:B.selectedBoard})),y("updated")}catch(b){C.error(b.message)}}return(b,S)=>(p(),g(X,null,[h(t(Qt),{show:!!e.taskId,width:420,placement:"right","onUpdate:show":S[6]||(S[6]=k=>{k||y("close")})},{default:T(()=>[h(t(Yt),{title:s.value?.task.title||"",closable:""},{default:T(()=>[h(t(Ee),{show:N.value},{default:T(()=>[s.value?(p(),g(X,{key:0},[r("div",Ye,[r("div",Xe,[r("span",Ze,o(t(u)("kanban.detail.status")),1),r("span",{class:se(["detail-value status-badge",s.value.task.status])},o(ee.value),3)]),r("div",ea,[r("span",aa,o(t(u)("kanban.detail.assignee")),1),r("span",ta,o(s.value.task.assignee||"—"),1)]),r("div",sa,[r("span",na,o(t(u)("kanban.detail.priority")),1),r("span",la,o(s.value.task.priority),1)]),r("div",ia,[r("span",ra,o(t(u)("kanban.detail.tenant")),1),r("span",oa,o(s.value.task.tenant||"—"),1)]),r("div",ua,[r("span",ca,o(t(u)("kanban.detail.createdAt")),1),r("span",da,o(Y(s.value.task.created_at)),1)]),s.value.task.started_at?(p(),g("div",va,[r("span",fa,o(t(u)("kanban.detail.startedAt")),1),r("span",ma,o(Y(s.value.task.started_at)),1)])):R("",!0),s.value.task.completed_at?(p(),g("div",ka,[r("span",pa,o(t(u)("kanban.detail.completedAt")),1),r("span",ba,o(Y(s.value.task.completed_at)),1)])):R("",!0)]),s.value.task.body?(p(),g("div",_a,[r("div",ya,o(t(u)("kanban.form.body")),1),r("div",ha,o(s.value.task.body),1)])):R("",!0),O.value?(p(),g("div",ga,[r("div",wa,o(t(u)("kanban.detail.result")),1),r("div",{class:"result-summary",onClick:L},o(O.value),1)])):R("",!0),j.value?(p(),g("div",Sa,[r("div",Ta,o(t(u)("kanban.action.title")),1),r("div",$a,[D.value?(p(),g("div",Ca,[h(t(be),{value:J.value,"onUpdate:value":S[1]||(S[1]=k=>J.value=k),size:"small",placeholder:t(u)("kanban.action.completeSummary")},null,8,["value","placeholder"]),h(t(H),{size:"small",type:"primary",onClick:ne},{default:T(()=>[V(o(t(u)("common.ok")),1)]),_:1}),h(t(H),{size:"small",onClick:S[2]||(S[2]=k=>{D.value=!1,J.value=""})},{default:T(()=>[V(o(t(u)("common.cancel")),1)]),_:1})])):(p(),Z(t(H),{key:0,size:"small",onClick:S[0]||(S[0]=k=>D.value=!0)},{default:T(()=>[V(o(t(u)("kanban.action.complete")),1)]),_:1})),s.value.task.status==="blocked"?(p(),Z(t(H),{key:2,size:"small",onClick:oe},{default:T(()=>[V(o(t(u)("kanban.action.unblock")),1)]),_:1})):(p(),g(X,{key:3},[z.value?(p(),g("div",Ba,[h(t(be),{value:I.value,"onUpdate:value":S[4]||(S[4]=k=>I.value=k),size:"small",placeholder:t(u)("kanban.action.blockReason")},null,8,["value","placeholder"]),h(t(H),{size:"small",type:"primary",onClick:ve},{default:T(()=>[V(o(t(u)("common.ok")),1)]),_:1})])):(p(),Z(t(H),{key:0,size:"small",onClick:S[3]||(S[3]=k=>z.value=!0)},{default:T(()=>[V(o(t(u)("kanban.action.block")),1)]),_:1}))],64))]),s.value.task.status!=="running"?(p(),g("div",Aa,[h(t(pe),{value:U.value,"onUpdate:value":S[5]||(S[5]=k=>U.value=k),options:_e.value,size:"small",placeholder:t(u)("kanban.action.assignTo"),style:{flex:"1"}},null,8,["value","options","placeholder"]),h(t(H),{size:"small",disabled:!U.value,onClick:ue},{default:T(()=>[V(o(t(u)("kanban.action.assign")),1)]),_:1},8,["disabled"])])):R("",!0)])):R("",!0),s.value.runs.length>0?(p(),g("div",Pa,[r("div",{class:"section-title",style:{cursor:"pointer"},onClick:ae},[V(o(t(u)("kanban.detail.sessions"))+" ",1),M.value?(p(),Z(t(Ee),{key:0,size:12,style:{"margin-left":"6px"}})):R("",!0)]),G.value&&F.value.length>0?(p(),g("div",Ra,[(p(!0),g(X,null,ce(F.value,k=>(p(),g("div",{key:k.id,class:"session-item",onClick:fe=>t(c).push({name:"hermes.chat",query:{session:k.id}})},[r("div",Ua,o(k.title||k.id),1),r("div",Ia,[r("span",null,o(k.source),1),r("span",null,o(k.model),1),r("span",null,o(Y(k.started_at)),1)])],8,xa))),128))])):R("",!0),G.value&&!M.value&&F.value.length===0?(p(),g("div",Oa,o(t(u)("kanban.detail.noSessions")),1)):R("",!0)])):R("",!0),s.value.runs.length>0?(p(),g("div",Ea,[r("div",Ka,o(t(u)("kanban.detail.runs")),1),(p(!0),g(X,null,ce(s.value.runs,k=>(p(),g("div",{key:k.id,class:"run-item"},[r("div",Na,[r("span",{class:se(["run-status",k.status])},o(k.status),3),r("span",Da,o(k.profile||"—"),1),r("span",za,o(Y(k.started_at)),1)]),k.summary?(p(),g("div",Fa,o(k.summary),1)):R("",!0),k.error?(p(),g("div",La,o(k.error),1)):R("",!0)]))),128))])):R("",!0),s.value.comments.length>0?(p(),g("div",qa,[r("div",Va,o(t(u)("kanban.detail.comments")),1),(p(!0),g(X,null,ce(s.value.comments,k=>(p(),g("div",{key:k.id,class:"comment-item"},[r("div",Ja,[r("span",Ma,o(k.author),1),r("span",Wa,o(Y(k.created_at)),1)]),r("div",Ga,o(k.body),1)]))),128))])):R("",!0),s.value.events.length>0?(p(),g("div",Ha,[r("div",Qa,o(t(u)("kanban.detail.events")),1),(p(!0),g(X,null,ce(s.value.events.slice(-10),k=>(p(),g("div",{key:k.id,class:"event-item"},[r("span",ja,o(k.kind),1),r("span",Ya,o(Y(k.created_at)),1)]))),128))])):R("",!0)],64)):R("",!0)]),_:1},8,["show"])]),_:1},8,["title"])]),_:1},8,["show"]),re.value?(p(),Z(t(Ke),{key:0,show:$.value,preset:"card",title:s.value?.task.title||"",style:{width:"900px",maxWidth:"calc(100vw - 48px)"},onClose:S[7]||(S[7]=k=>$.value=!1)},{default:T(()=>[r("div",Xa,[h(cs,{session:re.value},null,8,["session"])])]),_:1},8,["show","title"])):R("",!0)],64))}})})),qs=Q((()=>{})),Tt,Vs=Q((()=>{Za(),Za(),qs(),De(),Tt=ze(St,[["__scopeId","data-v-55115eb7"]])})),$t,et=Q((()=>{he(),$e(),Ce(),Fe(),qe(),$t=Te({__name:"KanbanCreateForm",emits:["close","created"],setup(e,{emit:l}){const v=l,{t:y}=Be(),u=Ne(),c=Ae(),C=w(""),B=w(""),s=w(null),N=w(null),U=w(!1),I=x(()=>[{label:y("kanban.card.priority.low"),value:1},{label:y("kanban.card.priority.medium"),value:2},{label:y("kanban.card.priority.high"),value:3}]),z=x(()=>Le(c.assignees,c.stats?.by_assignee||{}).map(D=>({label:D.name,value:D.name})));async function J(){if(!C.value.trim()){u.warning(y("kanban.form.titleRequired"));return}U.value=!0;try{await c.createTask({title:C.value.trim(),body:B.value.trim()||void 0,assignee:s.value||void 0,priority:N.value??void 0}),u.success(y("kanban.message.taskCreated")),v("created"),v("close")}catch(D){u.error(D.message)}finally{U.value=!1}}return(D,$)=>(p(),Z(t(Ke),{show:!0,preset:"dialog",title:t(y)("kanban.createTask"),style:{width:"480px"},onClose:$[5]||($[5]=O=>v("close"))},{action:T(()=>[h(t(H),{onClick:$[4]||($[4]=O=>v("close"))},{default:T(()=>[V(o(t(y)("common.cancel")),1)]),_:1}),h(t(H),{type:"primary",loading:U.value,onClick:J},{default:T(()=>[V(o(t(y)("common.create")),1)]),_:1},8,["loading"])]),default:T(()=>[h(t(Zt),{"label-placement":"top"},{default:T(()=>[h(t(Se),{label:t(y)("kanban.form.title")},{default:T(()=>[h(t(be),{value:C.value,"onUpdate:value":$[0]||($[0]=O=>C.value=O),placeholder:t(y)("kanban.form.titlePlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),h(t(Se),{label:t(y)("kanban.form.body")},{default:T(()=>[h(t(be),{value:B.value,"onUpdate:value":$[1]||($[1]=O=>B.value=O),type:"textarea",rows:3,placeholder:t(y)("kanban.form.bodyPlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),h(t(Se),{label:t(y)("kanban.form.assignee")},{default:T(()=>[h(t(pe),{value:s.value,"onUpdate:value":$[2]||($[2]=O=>s.value=O),options:z.value,placeholder:t(y)("kanban.form.selectAssignee"),clearable:""},null,8,["value","options","placeholder"])]),_:1},8,["label"]),h(t(Se),{label:t(y)("kanban.form.priority")},{default:T(()=>[h(t(pe),{value:N.value,"onUpdate:value":$[3]||($[3]=O=>N.value=O),options:I.value,placeholder:t(y)("kanban.form.selectPriority"),clearable:""},null,8,["value","options","placeholder"])]),_:1},8,["label"])]),_:1})]),_:1},8,["title"]))}})})),Ct,Js=Q((()=>{et(),et(),Ct=$t})),at,tt,st,nt,lt,it,rt,ot,ut,ct,dt,vt,ft,mt,Bt,kt=Q((()=>{he(),$e(),Ce(),bt(),vs(),Vs(),Js(),Fe(),is(),qe(),at={class:"kanban-view"},tt={class:"page-header"},st={class:"header-title"},nt={class:"header-actions"},lt={key:0,class:"stats-bar"},it=["aria-pressed","onClick"],rt={class:"stat-count"},ot={class:"stat-label"},ut=["aria-pressed"],ct={class:"stat-count"},dt={class:"stat-label"},vt={class:"kanban-board"},ft={key:0,class:"column-empty"},mt={class:"board-form"},Bt=Te({__name:"KanbanView",setup(e){const{t:l}=Be(),v=as(),y=pt(),u=Ne(),c=Ae(),C=ls(),B=w(!1),s=w(!1),N=w(null),U=w(""),I=w(""),z=w(!1),J=w(null),D=w(!1),$=["triage","todo","ready","running","blocked","done","archived"],O=w([...$]);function ee(d){return Array.isArray(d)?typeof d[0]=="string"?d[0]:null:typeof d=="string"?d:null}function j(){return ee(v.query.board)}async function F(d){j()!==d&&await y.replace({query:{...v.query,board:d}})}async function M(d,_=!0,f=!1){const A=c.selectedBoard,{board:ye,recovered:Re}=c.recoverSelectedBoard(d||c.selectedBoard||"default");N.value=null,B.value=!1,s.value=!1,_&&Re&&c.boardWarning&&u.warning(c.boardWarning),await F(ye),(f||ye!==A)&&await c.refreshAll()}function G(d){return`${l("kanban.stats.tasks")}: ${d}`}const de=x(()=>c.activeBoards.map(d=>{const _=typeof d.total=="number"?d.total:0;return{label:`${l("kanban.title")}: ${d.icon?`${d.icon} `:""}${d.name||d.slug} · ${G(_)}`,value:d.slug}})),ae=x({get:()=>c.selectedBoard,set:d=>{M(d||"default")}}),L=x(()=>{const d={};for(const _ of $)d[_]=c.tasks.filter(f=>f.status===_).sort((f,A)=>A.created_at-f.created_at);return d}),re=x(()=>{const d=c.filterStatus;return d&&$.includes(d)?[d]:$}),_e=x(()=>Le(c.assignees,c.stats?.by_assignee||{})),Y=x(()=>Object.fromEntries(C.profiles.map(d=>[d.name,d.avatar||null]))),ne=x(()=>[{label:l("kanban.allStatuses"),value:""},...$.map(d=>({label:l(`kanban.columns.${d}`,d),value:d}))]),ve=x(()=>[{label:l("kanban.allAssignees"),value:""},..._e.value.map(d=>({label:d.name,value:d.name}))]),oe=x({get:()=>c.filterStatus||"",set:d=>c.setFilter("status",d||null)}),ue=x({get:()=>c.filterAssignee||"",set:d=>c.setFilter("assignee",d||null)});Oe(()=>v.query.board,async()=>{D.value&&await M(j(),!1)}),Oe(re,d=>{O.value=[...d]},{immediate:!0}),Xt(async()=>{await Promise.all([c.fetchBoards(),c.fetchCapabilities(),C.profiles.length===0?C.fetchProfiles():Promise.resolve()]),await M(j(),!0,!0),c.startEventStream(),D.value=!0,J.value=setInterval(()=>{document.visibilityState==="visible"&&Promise.all([c.fetchBoards(),c.fetchTasks(!0),c.fetchStats()])},15e3)}),jt(()=>{c.stopEventStream(),J.value&&clearInterval(J.value)});function b(d){N.value=d}function S(){N.value=null}async function k(){await Promise.all([c.fetchTasks(),c.fetchStats()])}async function fe(){await c.fetchTasks()}async function ge(d){c.setFilter("status",d),O.value=d?[d]:[...$],await c.fetchTasks()}async function we(){await Promise.all([c.fetchTasks(),c.fetchStats(),c.fetchBoards()])}async function Pe(){const d=U.value.trim();if(!d){u.warning(l("kanban.board.slugRequired"));return}z.value=!0;try{const _=await c.createBoard({slug:d,name:I.value.trim()||void 0});U.value="",I.value="",s.value=!1,await F(_.slug),u.success(l("kanban.board.created"))}catch(_){u.error(_.message)}finally{z.value=!1}}async function me(){if(c.selectedBoard!=="default"&&window.confirm(l("kanban.board.archiveConfirm"))){z.value=!0;try{await c.archiveSelectedBoard(),await F(ie),u.success(l("kanban.board.archived"))}catch(d){u.error(d.message)}finally{z.value=!1}}}return(d,_)=>(p(),g("div",at,[r("header",tt,[r("h2",st,o(t(l)("kanban.title")),1),r("div",nt,[h(t(pe),{value:ae.value,"onUpdate:value":_[0]||(_[0]=f=>ae.value=f),options:de.value,loading:t(c).boardsLoading,size:"small",style:{width:"260px"}},null,8,["value","options","loading"]),h(t(H),{size:"small",loading:z.value,onClick:_[1]||(_[1]=f=>s.value=!0)},{default:T(()=>[V(o(t(l)("common.add")),1)]),_:1},8,["loading"]),h(t(H),{size:"small",secondary:"",disabled:t(c).selectedBoard===t(ie),loading:z.value,onClick:me},{default:T(()=>[V(o(t(l)("kanban.board.archive")),1)]),_:1},8,["disabled","loading"]),h(t(pe),{value:oe.value,"onUpdate:value":[_[2]||(_[2]=f=>oe.value=f),fe],options:ne.value,size:"small",style:{width:"150px"}},null,8,["value","options"]),h(t(pe),{value:ue.value,"onUpdate:value":[_[3]||(_[3]=f=>ue.value=f),fe],options:ve.value,size:"small",style:{width:"170px"}},null,8,["value","options"]),h(t(H),{type:"primary",size:"small",onClick:_[4]||(_[4]=f=>B.value=!0)},{icon:T(()=>[..._[12]||(_[12]=[r("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[r("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),r("line",{x1:"5",y1:"12",x2:"19",y2:"12"})],-1)])]),default:T(()=>[V(" "+o(t(l)("kanban.createTask")),1)]),_:1})])]),t(c).stats?(p(),g("div",lt,[(p(),g(X,null,ce($,f=>r("button",{key:f,type:"button",class:se(["stat-chip",[f,{active:t(c).filterStatus===f}]]),"aria-pressed":t(c).filterStatus===f,onClick:A=>ge(f)},[r("span",rt,o(t(c).stats.by_status[f]||0),1),r("span",ot,o(t(l)(`kanban.columns.${f}`,f)),1)],10,it)),64)),r("button",{type:"button",class:se(["stat-chip total",{active:!t(c).filterStatus}]),"aria-pressed":!t(c).filterStatus,onClick:_[5]||(_[5]=f=>ge(null))},[r("span",ct,o(t(c).stats.total),1),r("span",dt,o(t(l)("kanban.stats.total")),1)],10,ut)])):R("",!0),h(t(Ee),{show:t(c).loading&&t(c).tasks.length===0},{default:T(()=>[r("div",vt,[h(t(Ht),{"expanded-names":O.value,"onUpdate:expandedNames":_[6]||(_[6]=f=>O.value=f)},{default:T(()=>[(p(!0),g(X,null,ce(re.value,f=>(p(),Z(t(Gt),{key:f,title:`${t(l)(`kanban.columns.${f}`,f)} (${L.value[f].length})`,name:f,class:se(["kanban-column",`status-${f}`])},{header:T(()=>[r("span",{class:se(["column-header",`status-${f}`])},[_[13]||(_[13]=r("span",{class:"status-dot","aria-hidden":"true"},null,-1)),r("span",null,o(t(l)(`kanban.columns.${f}`,f))+" ("+o(L.value[f].length)+")",1)],2)]),default:T(()=>[r("div",{class:se(["task-list",`status-${f}`])},[(p(!0),g(X,null,ce(L.value[f],A=>(p(),Z(ht,{key:A.id,task:A,"assignee-avatar":A.assignee&&Y.value[A.assignee]||null,onClick:ye=>b(A.id)},null,8,["task","assignee-avatar","onClick"]))),128)),L.value[f].length===0?(p(),g("div",ft,o(t(l)("kanban.noTasks")),1)):R("",!0)],2)]),_:2},1032,["title","name","class"]))),128))]),_:1},8,["expanded-names"])])]),_:1},8,["show"]),h(Tt,{"task-id":N.value,onClose:S,onUpdated:k},null,8,["task-id"]),h(t(Ke),{show:s.value,"onUpdate:show":_[10]||(_[10]=f=>s.value=f),preset:"dialog",title:t(l)("kanban.board.create"),style:{width:"420px"}},{action:T(()=>[h(t(H),{onClick:_[9]||(_[9]=f=>s.value=!1)},{default:T(()=>[V(o(t(l)("common.cancel")),1)]),_:1}),h(t(H),{type:"primary",loading:z.value,onClick:Pe},{default:T(()=>[V(o(t(l)("common.create")),1)]),_:1},8,["loading"])]),default:T(()=>[r("div",mt,[h(t(be),{value:U.value,"onUpdate:value":_[7]||(_[7]=f=>U.value=f),placeholder:t(l)("kanban.board.slugPlaceholder")},null,8,["value","placeholder"]),h(t(be),{value:I.value,"onUpdate:value":_[8]||(_[8]=f=>I.value=f),placeholder:t(l)("kanban.board.namePlaceholder")},null,8,["value","placeholder"])])]),_:1},8,["show","title"]),B.value?(p(),Z(Ct,{key:1,onClose:_[11]||(_[11]=f=>B.value=!1),onCreated:we})):R("",!0)]))}})})),Ms=Q((()=>{})),Ws,Gs=Q((()=>{kt(),kt(),Ms(),De(),Ws=ze(Bt,[["__scopeId","data-v-5c93b592"]])}));Gs();export{Ws as default};
@@ -1 +1 @@
1
- import{n as p}from"./rolldown-runtime-BKwlnUi0.js";import{Et as v,Ht as l,J as m,Pt as _,W as B,X as H,Z as S,at as h,gt as W,it as D,lt as E,nt as e,vt as f,zt as s}from"./ui-vendor-BMwF7QXa.js";import{c as I,n as N,o as R,r as U}from"./vue-vendor-kBYBtqCg.js";import{c as q,f as z,l as G,n as J,t as T}from"./_plugin-vue_export-helper-B8gz9Iqn.js";import{W as X,a as Z,l as j,u as F}from"./index-Cuk9R8hy.js";var y,w,b,V,L,x,M,P,A,K,C=p((()=>{B(),X(),R(),N(),G(),j(),y={class:"login-view"},w={class:"login-card"},b={class:"login-title"},V={class:"login-desc"},L={class:"login-default-hint"},x=["placeholder"],M=["placeholder"],P={key:0,class:"login-error"},A=["disabled"],K=E({__name:"LoginView",setup($){const{t}=U(),c=I(),o=_(""),n=_(""),r=_(!1),a=_("");q()&&c.replace("/hermes/chat"),W(async()=>{try{await Z()}catch{}});async function g(){await k()}async function k(){if(!o.value.trim()||!n.value){a.value=t("login.credentialsRequired");return}r.value=!0,a.value="";try{z(await F(o.value.trim(),n.value)),c.replace("/hermes/chat")}catch(u){u.status===429||u.status===503?a.value=t("login.tooManyAttempts"):a.value=u.message||t("login.invalidCredentials")}finally{r.value=!1}}return(u,i)=>(f(),h("div",y,[e("div",w,[i[2]||(i[2]=e("div",{class:"login-logo"},[e("img",{src:"/logo.png",alt:"Hermes",width:"80",height:"80"})],-1)),e("h1",b,l(s(t)("login.title")),1),e("p",V,l(s(t)("login.description")),1),e("p",L,l(s(t)("login.defaultCredentialsHint")),1),e("form",{class:"login-form",onSubmit:S(g,["prevent"])},[v(e("input",{"onUpdate:modelValue":i[0]||(i[0]=d=>o.value=d),type:"text",class:"login-input",placeholder:s(t)("login.usernamePlaceholder"),autofocus:""},null,8,x),[[m,o.value]]),v(e("input",{"onUpdate:modelValue":i[1]||(i[1]=d=>n.value=d),type:"password",class:"login-input",placeholder:s(t)("login.passwordPlaceholder"),onKeyup:H(g,["enter"])},null,40,M),[[m,n.value]]),a.value?(f(),h("div",P,l(a.value),1)):D("",!0),e("button",{type:"submit",class:"login-btn",disabled:r.value},l(r.value?"...":s(t)("login.submit")),9,A)],32)])]))}})})),O=p((()=>{})),Q,Y=p((()=>{C(),C(),O(),J(),Q=T(K,[["__scopeId","data-v-697d3bfb"]])}));Y();export{Q as default};
1
+ import{n as p}from"./rolldown-runtime-BKwlnUi0.js";import{Et as v,Ht as l,J as m,Pt as _,W as B,X as H,Z as S,at as h,gt as W,it as D,lt as E,nt as e,vt as f,zt as s}from"./ui-vendor-BMwF7QXa.js";import{c as I,n as N,o as R,r as U}from"./vue-vendor-kBYBtqCg.js";import{c as q,f as z,l as G,n as J,t as T}from"./_plugin-vue_export-helper-CHoatqkO.js";import{W as X,a as Z,l as j,u as F}from"./index-DpU5R9KV.js";var y,w,b,V,L,x,M,P,A,K,C=p((()=>{B(),X(),R(),N(),G(),j(),y={class:"login-view"},w={class:"login-card"},b={class:"login-title"},V={class:"login-desc"},L={class:"login-default-hint"},x=["placeholder"],M=["placeholder"],P={key:0,class:"login-error"},A=["disabled"],K=E({__name:"LoginView",setup($){const{t}=U(),c=I(),o=_(""),n=_(""),r=_(!1),a=_("");q()&&c.replace("/hermes/chat"),W(async()=>{try{await Z()}catch{}});async function g(){await k()}async function k(){if(!o.value.trim()||!n.value){a.value=t("login.credentialsRequired");return}r.value=!0,a.value="";try{z(await F(o.value.trim(),n.value)),c.replace("/hermes/chat")}catch(u){u.status===429||u.status===503?a.value=t("login.tooManyAttempts"):a.value=u.message||t("login.invalidCredentials")}finally{r.value=!1}}return(u,i)=>(f(),h("div",y,[e("div",w,[i[2]||(i[2]=e("div",{class:"login-logo"},[e("img",{src:"/logo.png",alt:"Hermes",width:"80",height:"80"})],-1)),e("h1",b,l(s(t)("login.title")),1),e("p",V,l(s(t)("login.description")),1),e("p",L,l(s(t)("login.defaultCredentialsHint")),1),e("form",{class:"login-form",onSubmit:S(g,["prevent"])},[v(e("input",{"onUpdate:modelValue":i[0]||(i[0]=d=>o.value=d),type:"text",class:"login-input",placeholder:s(t)("login.usernamePlaceholder"),autofocus:""},null,8,x),[[m,o.value]]),v(e("input",{"onUpdate:modelValue":i[1]||(i[1]=d=>n.value=d),type:"password",class:"login-input",placeholder:s(t)("login.passwordPlaceholder"),onKeyup:H(g,["enter"])},null,40,M),[[m,n.value]]),a.value?(f(),h("div",P,l(a.value),1)):D("",!0),e("button",{type:"submit",class:"login-btn",disabled:r.value},l(r.value?"...":s(t)("login.submit")),9,A)],32)])]))}})})),O=p((()=>{})),Q,Y=p((()=>{C(),C(),O(),J(),Q=T(K,[["__scopeId","data-v-697d3bfb"]])}));Y();export{Q as default};
@@ -1 +1 @@
1
- import{n as f}from"./rolldown-runtime-BKwlnUi0.js";import{A as R,Bt as N,Et as X,Ht as o,I as Y,J as Z,Pt as u,Q as x,Tt as B,W as ee,at as r,bt as se,ct as m,gt as le,it as ae,l as te,lt as oe,nt as t,st as ie,t as ne,tt as y,vt as v,y as ue,zt as i}from"./ui-vendor-BMwF7QXa.js";import{n as re,r as ve}from"./vue-vendor-kBYBtqCg.js";import{d as P,l as ce,n as _e,t as de}from"./_plugin-vue_export-helper-B8gz9Iqn.js";async function ge(){return(await P("/api/hermes/logs")).files}async function pe(C,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 c=n.toString();return(await P(`/api/hermes/logs/${C}${c?`?${c}`:""}`)).entries.filter(_=>_!==null)}var me=f((()=>{ce()})),I,O,U,k,z,S,F,G,T,A,D,$,q,W,M=f((()=>{ee(),ne(),re(),me(),I={class:"logs-view"},O={class:"page-header"},U={class:"header-title"},k={class:"header-actions"},z=["placeholder"],S={class:"logs-body"},F={key:0,class:"logs-empty"},G={class:"log-list"},T={class:"log-time"},A={class:"log-logger"},D={class:"access-method"},$={class:"access-path"},q={key:1,class:"log-message"},W=oe({__name:"LogsView",setup(C){const{t:a}=ve(),n=ue(),c=u([]),_=u("agent"),w=u([]),d=u(!1),L=u(100),b=u(""),h=u(""),H=y(()=>c.value.map(s=>({label:`${s.name} (${s.size})`,value:s.name}))),Q=y(()=>[{label:a("logs.all"),value:""},{label:"ERROR",value:"ERROR"},{label:"WARNING",value:"WARNING"},{label:"INFO",value:"INFO"},{label:"DEBUG",value:"DEBUG"}]),J=[{label:"50",value:50},{label:"100",value:100},{label:"200",value:200},{label:"500",value:500}],V=y(()=>{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 E(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:b.value||void 0})).filter(s=>s!==null)}catch(s){n.error(s.message)}finally{d.value=!1}}return le(async()=>{c.value=await ge(),await p()}),(s,e)=>(v(),r("div",I,[t("header",O,[t("h2",U,o(i(a)("logs.title")),1),t("div",k,[m(i(R),{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(R),{value:b.value,options:Q.value,size:"small",class:"input-sm","onUpdate:value":e[1]||(e[1]=l=>{b.value=l,p()})},null,8,["value","options"]),m(i(R),{value:L.value,options:J,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,z),[[Z,h.value]]),m(i(Y),{size:"small",loading:d.value,onClick:p},{default:B(()=>[ie(o(i(a)("logs.refresh")),1)]),_:1},8,["loading"])])]),t("div",S,[m(i(te),{show:d.value,class:"logs-spin"},{default:B(()=>[V.value.length===0&&!d.value?(v(),r("div",F,o(i(a)("logs.noEntries")),1)):ae("",!0),t("div",G,[(v(!0),r(x,null,se(V.value,(l,K)=>(v(),r("div",{key:K,class:N(["log-entry",E(l.level)])},[t("span",T,o(j(l.timestamp)),1),t("span",{class:N(["log-level",E(l.level)])},o(l.level),3),t("span",A,o(l.logger),1),g(l.message)?(v(),r(x,{key:0},[t("span",D,o(g(l.message).method),1),t("span",$,o(g(l.message).path),1),t("span",{class:N(["access-status","status-"+(g(l.message).status?.[0]||"x")])},o(g(l.message).status),3)],64)):(v(),r("span",q,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
+ import{n as f}from"./rolldown-runtime-BKwlnUi0.js";import{A as R,Bt as N,Et as X,Ht as o,I as Y,J as Z,Pt as u,Q as x,Tt as B,W as ee,at as r,bt as se,ct as m,gt as le,it as ae,l as te,lt as oe,nt as t,st as ie,t as ne,tt as y,vt as v,y as ue,zt as i}from"./ui-vendor-BMwF7QXa.js";import{n as re,r as ve}from"./vue-vendor-kBYBtqCg.js";import{d as P,l as ce,n as _e,t as de}from"./_plugin-vue_export-helper-CHoatqkO.js";async function ge(){return(await P("/api/hermes/logs")).files}async function pe(C,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 c=n.toString();return(await P(`/api/hermes/logs/${C}${c?`?${c}`:""}`)).entries.filter(_=>_!==null)}var me=f((()=>{ce()})),I,O,U,k,z,S,F,G,T,A,D,$,q,W,M=f((()=>{ee(),ne(),re(),me(),I={class:"logs-view"},O={class:"page-header"},U={class:"header-title"},k={class:"header-actions"},z=["placeholder"],S={class:"logs-body"},F={key:0,class:"logs-empty"},G={class:"log-list"},T={class:"log-time"},A={class:"log-logger"},D={class:"access-method"},$={class:"access-path"},q={key:1,class:"log-message"},W=oe({__name:"LogsView",setup(C){const{t:a}=ve(),n=ue(),c=u([]),_=u("agent"),w=u([]),d=u(!1),L=u(100),b=u(""),h=u(""),H=y(()=>c.value.map(s=>({label:`${s.name} (${s.size})`,value:s.name}))),Q=y(()=>[{label:a("logs.all"),value:""},{label:"ERROR",value:"ERROR"},{label:"WARNING",value:"WARNING"},{label:"INFO",value:"INFO"},{label:"DEBUG",value:"DEBUG"}]),J=[{label:"50",value:50},{label:"100",value:100},{label:"200",value:200},{label:"500",value:500}],V=y(()=>{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 E(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:b.value||void 0})).filter(s=>s!==null)}catch(s){n.error(s.message)}finally{d.value=!1}}return le(async()=>{c.value=await ge(),await p()}),(s,e)=>(v(),r("div",I,[t("header",O,[t("h2",U,o(i(a)("logs.title")),1),t("div",k,[m(i(R),{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(R),{value:b.value,options:Q.value,size:"small",class:"input-sm","onUpdate:value":e[1]||(e[1]=l=>{b.value=l,p()})},null,8,["value","options"]),m(i(R),{value:L.value,options:J,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,z),[[Z,h.value]]),m(i(Y),{size:"small",loading:d.value,onClick:p},{default:B(()=>[ie(o(i(a)("logs.refresh")),1)]),_:1},8,["loading"])])]),t("div",S,[m(i(te),{show:d.value,class:"logs-spin"},{default:B(()=>[V.value.length===0&&!d.value?(v(),r("div",F,o(i(a)("logs.noEntries")),1)):ae("",!0),t("div",G,[(v(!0),r(x,null,se(V.value,(l,K)=>(v(),r("div",{key:K,class:N(["log-entry",E(l.level)])},[t("span",T,o(j(l.timestamp)),1),t("span",{class:N(["log-level",E(l.level)])},o(l.level),3),t("span",A,o(l.logger),1),g(l.message)?(v(),r(x,{key:0},[t("span",D,o(g(l.message).method),1),t("span",$,o(g(l.message).path),1),t("span",{class:N(["access-status","status-"+(g(l.message).status?.[0]||"x")])},o(g(l.message).status),3)],64)):(v(),r("span",q,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-BShvZgMM.js","assets/js/rolldown-runtime-BKwlnUi0.js"])))=>i.map(i=>d[i]);
2
- import{a as be,n as M}from"./rolldown-runtime-BKwlnUi0.js";import{$ as Fe,Ct as Ae,Ht as Ee,Pt as x,Q as Te,St as Re,Tt as z,W as Ie,Z as Pe,_ as Ne,at as T,ct as R,g as Se,gt as De,ht as Be,it as X,l as He,lt as We,mt as Q,nt as J,rt as ze,t as Ue,tt as ee,vt as b,y as Ge,zt as I}from"./ui-vendor-BMwF7QXa.js";import{n as Oe,r as je}from"./vue-vendor-kBYBtqCg.js";import{Gt as Ve,Kt as qe}from"./mermaid-BShvZgMM.js";import{a as te,i as Ye,n as Ze,o as Ke,r as Xe,s as Qe,t as ne}from"./vendor-CGQjY-CL.js";import{D as Je,E as P,O as re,k as et}from"./index-Cuk9R8hy.js";import{n as tt,t as nt}from"./clipboard-4x9B6X3a.js";function N(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&#39;")}function rt(e){return e.replace(/[^a-z0-9_-]/gi,"-")||"plain"}function at(e){const a=e?.trim().toLowerCase()||"";return pe[a]||a}function ae(e,a,n,o={}){const i=a?.trim().toLowerCase()||"",l=at(i),p=o.maxHighlightLength??Number.POSITIVE_INFINITY;let m="",v=l||i||"plain",_=i;try{l&&ne.getLanguage(l)&&e.length<=p?(m=ne.highlight(e,{language:l,ignoreIllegals:!0}).value,v=l):(m=N(e),_||(_="text"))}catch{m=N(e),_||(_="text")}return`<pre class="hljs-code-block"><div class="code-header">${_?`<span class="code-lang">${N(_)}</span>`:""}<button type="button" class="copy-btn" data-copy-code="true">${N(n)}</button></div><code class="hljs language-${rt(v)}">${m}</code></pre>`}async function ot(e){return nt(e)}async function it(e){const a=e.target;if(!(a instanceof HTMLElement))return null;const n=a.closest('[data-copy-code="true"]');if(!n)return null;e.preventDefault();const o=n.closest(".hljs-code-block")?.querySelector("code")?.textContent??"";return o?ot(o):!1}var pe,st=M((()=>{Ze(),tt(),pe={shellscript:"bash",sh:"bash",zsh:"bash",yml:"yaml",vue:"xml"}}));function C(e){const a=e.match(/^( {0,3})(`{3,}|~{3,})(.*)$/);if(!a)return null;const[,n,o,i=""]=a,l=o[0],p=i.trim();return l==="`"&&p.includes("`")?null:{indent:n,marker:l,fence:o,length:o.length,info:p}}function oe(e,a=e.length,n=e.info){return`${e.indent}${e.marker.repeat(a)}${n?` ${n}`:""}`}function ge(e){const a=e.info.split(/\s+/)[0]?.toLowerCase();return we.has(a)}function lt(e,a){const n=C(e);return!!(n&&n.marker===a.marker&&n.length>=a.length&&n.info==="")}function he(e,a=e.length-1){let n=a;for(;n>=0&&e[n].trim()==="";)n-=1;return n}function ct(e,a,n){for(let o=he(e);o>n;o-=1)if(lt(e[o],a))return o;return-1}function dt(e,a){const n=[];let o=!1;for(const i of e){const l=C(i);if(!l||l.marker!==a)continue;o=!0;const p=n[n.length-1];if(l.info===""&&p&&l.length>=p.length){n.pop();continue}n.push({marker:l.marker,length:l.length})}return o&&n.length===0}function ut(e,a,n){const o=[];for(let i=n;i<e.length;i+=1){const l=C(e[i]);l&&l.marker===a.marker&&l.info===""&&l.length>=a.length&&o.push(i)}for(let i=o.length-1;i>=0;i-=1){const l=o[i];if(dt(e.slice(n,l),a.marker))return l}return o[0]??-1}function mt(e,a){let n=0;for(const o of e){const i=C(o);i?.marker===a&&(n=Math.max(n,i.length))}return n}function ft(e){const a=[];for(let n=0;n<e.length;n+=1){const o=C(e[n]);if(!o||!ge(o)){a.push(e[n]);continue}const i=ut(e,o,n+1);if(i===-1){a.push(e[n]);continue}const l=e.slice(n+1,i),p=mt(l,o.marker);if(p>=o.length){const m=p+1;a.push(oe(o,m)),a.push(...l),a.push(oe(o,m,""))}else a.push(e[n]),a.push(...l),a.push(e[i]);n=i}return a}function pt(e){if(!e.includes("```")&&!e.includes("~~~"))return e;const a=e.split(`
2
+ import{a as be,n as M}from"./rolldown-runtime-BKwlnUi0.js";import{$ as Fe,Ct as Ae,Ht as Ee,Pt as x,Q as Te,St as Re,Tt as z,W as Ie,Z as Pe,_ as Ne,at as T,ct as R,g as Se,gt as De,ht as Be,it as X,l as He,lt as We,mt as Q,nt as J,rt as ze,t as Ue,tt as ee,vt as b,y as Ge,zt as I}from"./ui-vendor-BMwF7QXa.js";import{n as Oe,r as je}from"./vue-vendor-kBYBtqCg.js";import{Gt as Ve,Kt as qe}from"./mermaid-BShvZgMM.js";import{a as te,i as Ye,n as Ze,o as Ke,r as Xe,s as Qe,t as ne}from"./vendor-CGQjY-CL.js";import{D as Je,E as P,O as re,k as et}from"./index-DpU5R9KV.js";import{n as tt,t as nt}from"./clipboard-4x9B6X3a.js";function N(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&#39;")}function rt(e){return e.replace(/[^a-z0-9_-]/gi,"-")||"plain"}function at(e){const a=e?.trim().toLowerCase()||"";return pe[a]||a}function ae(e,a,n,o={}){const i=a?.trim().toLowerCase()||"",l=at(i),p=o.maxHighlightLength??Number.POSITIVE_INFINITY;let m="",v=l||i||"plain",_=i;try{l&&ne.getLanguage(l)&&e.length<=p?(m=ne.highlight(e,{language:l,ignoreIllegals:!0}).value,v=l):(m=N(e),_||(_="text"))}catch{m=N(e),_||(_="text")}return`<pre class="hljs-code-block"><div class="code-header">${_?`<span class="code-lang">${N(_)}</span>`:""}<button type="button" class="copy-btn" data-copy-code="true">${N(n)}</button></div><code class="hljs language-${rt(v)}">${m}</code></pre>`}async function ot(e){return nt(e)}async function it(e){const a=e.target;if(!(a instanceof HTMLElement))return null;const n=a.closest('[data-copy-code="true"]');if(!n)return null;e.preventDefault();const o=n.closest(".hljs-code-block")?.querySelector("code")?.textContent??"";return o?ot(o):!1}var pe,st=M((()=>{Ze(),tt(),pe={shellscript:"bash",sh:"bash",zsh:"bash",yml:"yaml",vue:"xml"}}));function C(e){const a=e.match(/^( {0,3})(`{3,}|~{3,})(.*)$/);if(!a)return null;const[,n,o,i=""]=a,l=o[0],p=i.trim();return l==="`"&&p.includes("`")?null:{indent:n,marker:l,fence:o,length:o.length,info:p}}function oe(e,a=e.length,n=e.info){return`${e.indent}${e.marker.repeat(a)}${n?` ${n}`:""}`}function ge(e){const a=e.info.split(/\s+/)[0]?.toLowerCase();return we.has(a)}function lt(e,a){const n=C(e);return!!(n&&n.marker===a.marker&&n.length>=a.length&&n.info==="")}function he(e,a=e.length-1){let n=a;for(;n>=0&&e[n].trim()==="";)n-=1;return n}function ct(e,a,n){for(let o=he(e);o>n;o-=1)if(lt(e[o],a))return o;return-1}function dt(e,a){const n=[];let o=!1;for(const i of e){const l=C(i);if(!l||l.marker!==a)continue;o=!0;const p=n[n.length-1];if(l.info===""&&p&&l.length>=p.length){n.pop();continue}n.push({marker:l.marker,length:l.length})}return o&&n.length===0}function ut(e,a,n){const o=[];for(let i=n;i<e.length;i+=1){const l=C(e[i]);l&&l.marker===a.marker&&l.info===""&&l.length>=a.length&&o.push(i)}for(let i=o.length-1;i>=0;i-=1){const l=o[i];if(dt(e.slice(n,l),a.marker))return l}return o[0]??-1}function mt(e,a){let n=0;for(const o of e){const i=C(o);i?.marker===a&&(n=Math.max(n,i.length))}return n}function ft(e){const a=[];for(let n=0;n<e.length;n+=1){const o=C(e[n]);if(!o||!ge(o)){a.push(e[n]);continue}const i=ut(e,o,n+1);if(i===-1){a.push(e[n]);continue}const l=e.slice(n+1,i),p=mt(l,o.marker);if(p>=o.length){const m=p+1;a.push(oe(o,m)),a.push(...l),a.push(oe(o,m,""))}else a.push(e[n]),a.push(...l),a.push(e[i]);n=i}return a}function pt(e){if(!e.includes("```")&&!e.includes("~~~"))return e;const a=e.split(`
3
3
  `),n=[];let o=!1;for(let i=0;i<a.length;i+=1){const l=C(a[i]);if(!l||!ge(l)){n.push(a[i]);continue}const p=ct(a,l,i+1);if(p===-1){n.push(a[i]);continue}if(p!==he(a)){n.push(a[i]);continue}n.push(...ft(a.slice(i+1,p))),n.push(...a.slice(p+1)),o=!0;break}return o?n.join(`
4
4
  `):e}var we,gt=M((()=>{we=new Set(["md","markdown","mdown","mkd"])}));function ht(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&#39;")}function wt(e){return e?.trim().split(/\s+/)[0]?.toLowerCase()||""}function vt(e){return wt(e)===ve}function _t(e){return encodeURIComponent(e)}function ie(e){if(!e)return"";try{return decodeURIComponent(e)}catch{return""}}function kt(e){return['<div class="mermaid-diagram" data-mermaid-pending="true"',` data-mermaid-source="${ht(_t(e))}">`,'<div class="mermaid-loading">Rendering Mermaid diagram…</div>',"</div>"].join("")}var ve,yt,U,_e,$t=M((()=>{ve="mermaid",yt=2e4,U=5e3,_e=["txt","md","json","csv","log","py","yaml","yml","toml","sh","xml","html","css","js","ts","rs","go","java","c","cpp","h"]})),se,le,ce,de,ue,me,ke,fe=M((()=>{Ie(),Oe(),Ue(),Ke(),Ye(),se=be(Xe()),st(),gt(),$t(),et(),qe(),le=["innerHTML"],ce={key:0,class:"text-preview-markdown"},de={key:1,class:"text-preview-body"},ue=["src"],me="min(800px, 100vw)",ke=We({__name:"MarkdownRenderer",props:{content:{},mentionNames:{default:()=>[]},headingIdPrefix:{default:""}},setup(e){const a=new Set(["latex","tex","math","katex"]);function n(t){return t.trim().split(/\s+/)[0]?.toLowerCase()??""}function o(t){return a.has(n(t))}function i(t){const r=t.trim();return r.startsWith("\\[")&&r.endsWith("\\]")||r.startsWith("$$")&&r.endsWith("$$")||r.startsWith("\\(")&&r.endsWith("\\)")?r.slice(2,-2).trim():r}function l(t){const r=i(t);return`<div class="latex-block">${te.renderToString(r,{displayMode:!0,output:"htmlAndMathml",throwOnError:!1,strict:"ignore"})}</div>`}const p=e,{t:m}=je(),v=Ge(),_=new Qe({html:!1,breaks:!0,linkify:!0,typographer:!0,highlight(t,r){return ae(t,r,m("common.copy"))}});_.use(se.default,{katex:te,throwOnError:!1,strict:"ignore"});const G=_.renderer.rules.fence?.bind(_.renderer.rules);_.renderer.rules.fence=(t,r,f,d,g)=>{const u=t[r];return o(u.info)?l(u.content):vt(u.info)?kt(u.content):G?G(t,r,f,d,g):g.renderToken(t,r,f)};const S=x(null),O=`hermes-mermaid-${Math.random().toString(36).slice(2)}`,L=x(null),$=x(null),j=x(""),D=x(!1),F=x(!1),ye=ee(()=>/\.(md|markdown)$/i.test(j.value));let k=0,y=!1;function B(t){return t.startsWith("/")||/^[a-zA-Z]:[\\/]/.test(t)}function H(t){return/^[a-zA-Z]:\\/.test(t)?t.replace(/\\/g,"/"):t}const V=ee(()=>{let t=_.render(pt(p.content));const r=p.headingIdPrefix?`${p.headingIdPrefix}-`:"";let f=0;if(t=t.replace(/<(h[1-6])([^>]*)>/g,(d,g,u)=>{f++;const c=`${r}heading-${f}`;return u.includes("id=")?d.replace(/id="[^"]*"/,`id="${c}"`).replace(/id='[^']*'/,`id="${c}"`):u.trim()===""?`<${g} id="${c}">`:`<${g} ${u.trim()} id="${c}">`}),t=t.replace(/\bsrc=(["'])([^"']+)\1/g,(d,g,u)=>B(u)?`src=${g}${re(H(u))}${g}`:d),t=t.replace(/<a href="([^"]+)">([^<]+)<\/a>/g,(d,g,u)=>{if(!B(g))return d;const c=H(g),h=u.trim(),s=c.split(".").pop()?.toLowerCase();return s==="mp4"||s==="webm"||s==="mov"?`<div class="markdown-video-container">
5
5
  <video class="markdown-video" controls preload="metadata" src="${re(c)}"></video>
@@ -1,4 +1,4 @@
1
- import{n as H}from"./rolldown-runtime-BKwlnUi0.js";import{Et as P,Ht as a,I as c,J as N,Pt as g,Tt as r,W as Ce,at as n,ct as y,gt as ze,it as p,lt as Ve,nt as e,ot as L,rt as h,st as v,t as Be,tt as f,vt as i,y as Se,zt as t}from"./ui-vendor-BMwF7QXa.js";import{n as Pe,r as Ne}from"./vue-vendor-kBYBtqCg.js";import{n as Ee,t as He}from"./_plugin-vue_export-helper-B8gz9Iqn.js";import{r as Le,t as $e}from"./profiles-DiEn61KW.js";import{n as be,t as E}from"./MarkdownRenderer-BbsOzYq-.js";import{c as qe,o as Te,t as Ue}from"./skills-BQ2jtPxK.js";var $,b,q,T,U,D,F,I,R,J,W,j,A,G,K,O,Q,X,Y,Z,ee,te,oe,se,ae,ie,le,ne,re,de,me,ue,ce,ve,_e,ye,he,pe=H((()=>{Ce(),Be(),Pe(),be(),Te(),$e(),$={class:"memory-view"},b={class:"page-header"},q={class:"header-title"},T={class:"memory-content"},U={key:0,class:"memory-loading"},D={key:1,class:"memory-sections"},F={class:"memory-section"},I={class:"section-header"},R={class:"section-title-row"},J={class:"section-title"},W={key:0,class:"section-mtime"},j={key:0,class:"section-body"},A={key:1,class:"empty-text"},G={key:1,class:"section-edit"},K=["placeholder"],O={class:"edit-actions"},Q={class:"memory-section"},X={class:"section-header"},Y={class:"section-title-row"},Z={class:"section-title"},ee={key:0,class:"section-mtime"},te={key:0,class:"section-body"},oe={key:1,class:"empty-text"},se={key:1,class:"section-edit"},ae=["placeholder"],ie={class:"edit-actions"},le={class:"memory-section"},ne={class:"section-header"},re={class:"section-title-row"},de={class:"section-title"},me={key:0,class:"section-mtime"},ue={key:0,class:"section-body"},ce={key:1,class:"empty-text"},ve={key:1,class:"section-edit"},_e=["placeholder"],ye={class:"edit-actions"},he=Ve({__name:"MemoryView",setup(Re){const{t:s}=Ne(),w=Se(),x=Le(),M=g(!1),l=g(null),d=g(null),m=g(""),k=g(!1);ze(C);async function C(){M.value=!0;try{(!x.activeProfileName||x.profiles.length===0)&&await x.fetchProfiles(),l.value=await Ue()}catch(u){console.error("Failed to load memory:",u),w.error(s("memory.loadFailed"))}finally{M.value=!1}}function z(u){d.value=u,m.value=l.value?.[u]||""}function V(){d.value=null,m.value=""}async function B(){if(d.value){k.value=!0;try{await qe(d.value,m.value),await C(),d.value=null,m.value="",w.success(s("common.saved"))}catch(u){w.error(`${s("common.saveFailed")}: ${u.message}`)}finally{k.value=!1}}}function S(u){return u?new Date(u).toLocaleString([],{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}):""}const fe=f(()=>!l.value?.memory?.trim()),ke=f(()=>!l.value?.user?.trim()),ge=f(()=>!l.value?.soul?.trim()),we=f(()=>(l.value?.memory||"").replace(/§/g,`
1
+ import{n as H}from"./rolldown-runtime-BKwlnUi0.js";import{Et as P,Ht as a,I as c,J as N,Pt as g,Tt as r,W as Ce,at as n,ct as y,gt as ze,it as p,lt as Ve,nt as e,ot as L,rt as h,st as v,t as Be,tt as f,vt as i,y as Se,zt as t}from"./ui-vendor-BMwF7QXa.js";import{n as Pe,r as Ne}from"./vue-vendor-kBYBtqCg.js";import{n as Ee,t as He}from"./_plugin-vue_export-helper-CHoatqkO.js";import{r as Le,t as $e}from"./profiles-CyjgPK1f.js";import{n as be,t as E}from"./MarkdownRenderer-BJbqsrMI.js";import{c as qe,o as Te,t as Ue}from"./skills-vuknhTFJ.js";var $,b,q,T,U,D,F,I,R,J,W,j,A,G,K,O,Q,X,Y,Z,ee,te,oe,se,ae,ie,le,ne,re,de,me,ue,ce,ve,_e,ye,he,pe=H((()=>{Ce(),Be(),Pe(),be(),Te(),$e(),$={class:"memory-view"},b={class:"page-header"},q={class:"header-title"},T={class:"memory-content"},U={key:0,class:"memory-loading"},D={key:1,class:"memory-sections"},F={class:"memory-section"},I={class:"section-header"},R={class:"section-title-row"},J={class:"section-title"},W={key:0,class:"section-mtime"},j={key:0,class:"section-body"},A={key:1,class:"empty-text"},G={key:1,class:"section-edit"},K=["placeholder"],O={class:"edit-actions"},Q={class:"memory-section"},X={class:"section-header"},Y={class:"section-title-row"},Z={class:"section-title"},ee={key:0,class:"section-mtime"},te={key:0,class:"section-body"},oe={key:1,class:"empty-text"},se={key:1,class:"section-edit"},ae=["placeholder"],ie={class:"edit-actions"},le={class:"memory-section"},ne={class:"section-header"},re={class:"section-title-row"},de={class:"section-title"},me={key:0,class:"section-mtime"},ue={key:0,class:"section-body"},ce={key:1,class:"empty-text"},ve={key:1,class:"section-edit"},_e=["placeholder"],ye={class:"edit-actions"},he=Ve({__name:"MemoryView",setup(Re){const{t:s}=Ne(),w=Se(),x=Le(),M=g(!1),l=g(null),d=g(null),m=g(""),k=g(!1);ze(C);async function C(){M.value=!0;try{(!x.activeProfileName||x.profiles.length===0)&&await x.fetchProfiles(),l.value=await Ue()}catch(u){console.error("Failed to load memory:",u),w.error(s("memory.loadFailed"))}finally{M.value=!1}}function z(u){d.value=u,m.value=l.value?.[u]||""}function V(){d.value=null,m.value=""}async function B(){if(d.value){k.value=!0;try{await qe(d.value,m.value),await C(),d.value=null,m.value="",w.success(s("common.saved"))}catch(u){w.error(`${s("common.saveFailed")}: ${u.message}`)}finally{k.value=!1}}}function S(u){return u?new Date(u).toLocaleString([],{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}):""}const fe=f(()=>!l.value?.memory?.trim()),ke=f(()=>!l.value?.user?.trim()),ge=f(()=>!l.value?.soul?.trim()),we=f(()=>(l.value?.memory||"").replace(/§/g,`
2
2
 
3
3
  `)),xe=f(()=>(l.value?.user||"").replace(/§/g,`
4
4