@quanthermes/hermes-web-ui 0.6.16 → 0.6.17

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 (41) hide show
  1. package/dist/client/assets/js/{ChannelsView-C3g3StjL.js → ChannelsView-BwP8wsUV.js} +1 -1
  2. package/dist/client/assets/js/{ChatView-tIA9-kE6.js → ChatView-Mf_KaepB.js} +1 -1
  3. package/dist/client/assets/js/{CodingAgentsView-BjVUaZEX.js → CodingAgentsView-C0OyfzpB.js} +1 -1
  4. package/dist/client/assets/js/{DevicesView-CrHv1Mcc.js → DevicesView-Cfk24oSi.js} +1 -1
  5. package/dist/client/assets/js/{FileRenameModal-BmQIUMYK.js → FileRenameModal-DhB_Oy1Y.js} +1 -1
  6. package/dist/client/assets/js/{FilesView-BSJjUAhT.js → FilesView-CL3bT4UM.js} +1 -1
  7. package/dist/client/assets/js/{GroupChatView-DtWcdFAL.js → GroupChatView-DhNycaZ-.js} +1 -1
  8. package/dist/client/assets/js/{HistoryMessageList-L-9SSk3K.js → HistoryMessageList-C9ywhLVB.js} +1 -1
  9. package/dist/client/assets/js/{HistoryView-DWEeHcuC.js → HistoryView-CB4oqwnG.js} +1 -1
  10. package/dist/client/assets/js/{JobsView-BgofNKg-.js → JobsView-DrZUX1TJ.js} +1 -1
  11. package/dist/client/assets/js/{KanbanView-QPxTlH-J.js → KanbanView-B-rpBbt3.js} +1 -1
  12. package/dist/client/assets/js/{LoginView-McUee9pQ.js → LoginView-Ca6fECMY.js} +1 -1
  13. package/dist/client/assets/js/{LogsView-BT-4Df4G.js → LogsView-IjXDeQ1e.js} +1 -1
  14. package/dist/client/assets/js/{MarkdownRenderer-Jwbx4dOP.js → MarkdownRenderer-BlxKlSHX.js} +1 -1
  15. package/dist/client/assets/js/{McpManagerView-DLDPI-_O.js → McpManagerView-D-oJeFHz.js} +1 -1
  16. package/dist/client/assets/js/{MemoryView-Dq3pEc1S.js → MemoryView-BSlKBKzI.js} +1 -1
  17. package/dist/client/assets/js/{MessageItem-Dr5idUZb.js → MessageItem-Di7V6T5S.js} +1 -1
  18. package/dist/client/assets/js/{ModelsView-sfHqVERI.js → ModelsView-qxOq5hFg.js} +1 -1
  19. package/dist/client/assets/js/{OutlinePanel-BddtVbQw.js → OutlinePanel-D62oj0V9.js} +1 -1
  20. package/dist/client/assets/js/{PerformanceView-BYMIVkGl.js → PerformanceView-Coa_4sVf.js} +1 -1
  21. package/dist/client/assets/js/{PluginsView-Be878n_l.js → PluginsView-BHOXiJZv.js} +1 -1
  22. package/dist/client/assets/js/{ProfilesView-B6TQX72B.js → ProfilesView-DjODeu2z.js} +1 -1
  23. package/dist/client/assets/js/{SettingRow-vaeYDW5h.js → SettingRow-DWprXoV4.js} +1 -1
  24. package/dist/client/assets/js/{SettingsView-ClBbruK3.js → SettingsView-D5QX2BHT.js} +1 -1
  25. package/dist/client/assets/js/{SkillsUsageView-cAHh5inD.js → SkillsUsageView-CgpixSYd.js} +1 -1
  26. package/dist/client/assets/js/{SkillsView-DFxNT1UO.js → SkillsView-DVA_LzFa.js} +1 -1
  27. package/dist/client/assets/js/{TerminalPanel-Bwa-6ai-.js → TerminalPanel-DhnPxJTG.js} +1 -1
  28. package/dist/client/assets/js/{TerminalView-KMAVVfPx.js → TerminalView-tgOY8x6C.js} +1 -1
  29. package/dist/client/assets/js/{UsageView-DQUEWEZR.js → UsageView-DDvy4JWs.js} +1 -1
  30. package/dist/client/assets/js/{VersionPreviewView-BD_8pfy6.js → VersionPreviewView-DoYv9yy6.js} +1 -1
  31. package/dist/client/assets/js/{VirtualMessageList-BNu9wFPU.js → VirtualMessageList-CfXQfWcE.js} +1 -1
  32. package/dist/client/assets/js/{_plugin-vue_export-helper-uEMLHKI8.js → _plugin-vue_export-helper-CwNymSRn.js} +2 -2
  33. package/dist/client/assets/js/{index-1yNqMnGv.js → index-DW8M4rjb.js} +1 -1
  34. package/dist/client/assets/js/{models-B67JDoKt.js → models-BDUkz58x.js} +1 -1
  35. package/dist/client/assets/js/{session-browser-prefs-BMKJzhU0.js → session-browser-prefs-DjzuPSf7.js} +1 -1
  36. package/dist/client/assets/js/{skills-oOSUGydJ.js → skills-kS4Wy1_s.js} +1 -1
  37. package/dist/client/assets/js/{system-ClONwY0c.js → system-DaAaRr9k.js} +1 -1
  38. package/dist/client/assets/js/{useSttSettings-BAlyngwO.js → useSttSettings-DnVfL8DF.js} +1 -1
  39. package/dist/client/index.html +3 -3
  40. package/dist/server/index.js +3 -3
  41. package/package.json +1 -1
@@ -1 +1 @@
1
- import{n as z}from"./rolldown-runtime-M0oDzQ_3.js";import{$t as N,Cn as Pe,Dn as j,I as qe,Ot as p,P as Te,Pn as u,Pt as Se,Qn as t,Rt as w,Tn as o,V as ze,Wn as b,Wt as $e,Zt as Re,an as C,dn as Ve,g as Be,in as k,ln as l,nn as Le,on as m,rn as i,rr as a,t as Oe,un as d,w as Ue}from"./ui-vendor-dYn1tJGA.js";import{c as Ie,l as Ne}from"./vue-vendor-DZ4A_GHn.js";import{f as y,n as je,t as xe,u as De}from"./_plugin-vue_export-helper-uEMLHKI8.js";async function Fe(){return y("/api/devices")}async function He(){return y("/api/devices/scan",{method:"POST"})}async function Me(c){return y(`/api/devices/${encodeURIComponent(c)}/request`,{method:"POST"})}async function Ee(c){return y("/api/devices/manual-request",{method:"POST",body:JSON.stringify({url:c})})}async function We(c){return y(`/api/devices/${encodeURIComponent(c)}/approve`,{method:"POST"})}async function Je(c){return y(`/api/devices/${encodeURIComponent(c)}/reject`,{method:"POST"})}async function Ke(c){return y(`/api/devices/${encodeURIComponent(c)}/block`,{method:"POST"})}async function Qe(c){return y(`/api/devices/${encodeURIComponent(c)}/unblock`,{method:"POST"})}async function Ze(c){return y(`/api/devices/${encodeURIComponent(c)}/request-history`,{method:"DELETE"})}var Ae=z((()=>{De()})),x,D,F,H,M,E,W,J,K,Q,Z,A,G,X,Y,ee,ne,te,se,ae,ie,re,le,ue=z((()=>{$e(),Oe(),Ie(),Ae(),x={class:"devices-view"},D={class:"page-header"},F={class:"header-title"},H={class:"header-actions"},M={class:"header-meta"},E={class:"devices-content"},W={key:0,class:"empty-state"},J={class:"empty-title"},K={key:1,class:"device-grid"},Q={class:"device-card-header"},Z={class:"device-title-block"},A={class:"device-name"},G=["href"],X={class:"device-status-row"},Y={class:"device-meta-list"},ee={class:"device-actions"},ne={key:0,class:"request-empty"},te={key:1,class:"request-list"},se={class:"request-name"},ae={class:"request-meta"},ie={class:"request-status-row"},re={class:"request-actions"},le=Ve({__name:"DevicesView",setup(c){const{t:s}=Ne(),g=ze(),P=b(!1),q=b(!1),T=b(!1),S=b(""),v=b(""),$=b(!1),_=b({scanning:!1,last_scanned_at:null,devices:[],requests:[]}),R=Le(()=>[..._.value.devices].sort((e,r)=>{const n=+!!r.online-+!!e.online;if(n!==0)return n;const f=V(e.endpoint_kind)-V(r.endpoint_kind);return f!==0?f:e.id.localeCompare(r.id)}));function V(e){return e==="web"?0:e==="desktop"?1:2}function oe(e){return s(`devices.endpoint.${e}`)}function de(e){return e==="desktop"?"success":e==="web"?"info":"default"}function B(e){return s(`devices.inboundStatus.${e}`)}function ce(e){return s(`devices.outboundStatus.${e}`)}function _e(e){return e.outbound_status==="approved"?s("devices.paired"):ce(e.outbound_status)}function pe(e){return e.outbound_status==="approved"?"success":e.outbound_status==="pending"?"info":e.outbound_status==="blocked"?"error":e.outbound_status==="rejected"?"warning":"default"}function ve(e){return e.online?s("devices.online"):s("devices.offline")}function fe(e){return e.online?"success":"default"}function me(e){return!!e.online&&(e.outbound_status==="none"||e.outbound_status==="rejected")}function ye(e){return e.inbound_status!=="blocked"}function ge(){return _.value.requests.length>0?s("devices.requestsWithCount",{count:_.value.requests.length}):s("devices.requests")}function L(e){return e.inbound_status!=="pending"}function he(e){return L(e)?s("devices.processed"):s("devices.unprocessed")}function be(e){return L(e)?"success":"warning"}function ke(e){return[e.os.type||e.os.platform,e.os.release,e.os.arch].filter(Boolean).join(" ")}function we(e){if(!e)return s("devices.never");const r=new Date(e);return Number.isNaN(r.getTime())?String(e):r.toLocaleString()}function O(e){return e||s("devices.unknown")}async function Ce(){P.value=!0;try{_.value=await Fe()}catch(e){g.error(e?.message||s("devices.loadFailed"))}finally{P.value=!1}}async function U(){q.value=!0;try{_.value=await He()}catch(e){g.error(e?.message||s("devices.scanFailed"))}finally{q.value=!1}}async function h(e,r){v.value=e.id;try{_.value=r==="request"?await Me(e.id):r==="approve"?await We(e.id):r==="reject"?await Je(e.id):r==="block"?await Ke(e.id):r==="deleteHistory"?await Ze(e.id):await Qe(e.id)}catch(n){if(r==="request"&&String(n?.message||"").includes("Duplicate pairing request")){g.warning(s("devices.duplicateRequest"));return}g.error(n?.message||s("devices.updateFailed"))}finally{v.value=""}}async function I(){const e=S.value.trim();if(!e){g.warning(s("devices.manualUrlRequired"));return}T.value=!0;try{_.value=await Ee(e),S.value="",g.success(s("devices.manualRequestSent"))}catch(r){g.error(r?.message||s("devices.manualRequestFailed"))}finally{T.value=!1}}return Pe(()=>{Ce()}),(e,r)=>(o(),m("div",x,[i("header",D,[i("h2",F,a(t(s)("devices.title")),1),i("div",H,[d(t(Se),{value:S.value,"onUpdate:value":r[0]||(r[0]=n=>S.value=n),class:"manual-pairing-input",size:"small",clearable:"",placeholder:t(s)("devices.manualUrlPlaceholder"),disabled:T.value,onKeyup:Re(I,["enter"])},null,8,["value","placeholder","disabled"]),d(t(p),{size:"small",loading:T.value,onClick:I},{default:u(()=>[l(a(t(s)("devices.manualPairing")),1)]),_:1},8,["loading"]),i("div",M,[i("span",null,a(t(s)("devices.count",{count:R.value.length})),1),i("span",null,a(t(s)("devices.lastScanned",{time:we(_.value.last_scanned_at)})),1)]),d(t(p),{size:"small",onClick:r[1]||(r[1]=n=>$.value=!0)},{default:u(()=>[l(a(ge()),1)]),_:1}),d(t(p),{size:"small",type:"primary",loading:q.value||_.value.scanning,onClick:U},{default:u(()=>[l(a(t(s)("devices.refresh")),1)]),_:1},8,["loading"])])]),d(t(Be),{show:P.value,class:"devices-spin"},{default:u(()=>[i("div",E,[R.value.length===0&&!P.value?(o(),m("div",W,[i("div",J,a(t(s)("devices.empty")),1),d(t(p),{size:"small",loading:q.value||_.value.scanning,onClick:U},{default:u(()=>[l(a(t(s)("devices.refresh")),1)]),_:1},8,["loading"])])):(o(),m("div",K,[(o(!0),m(N,null,j(R.value,n=>(o(),m("article",{key:n.id,class:"device-card"},[i("div",Q,[i("div",Z,[i("div",A,a(n.computer_name||n.ip),1),i("a",{class:"device-link",href:n.url,target:"_blank",rel:"noopener noreferrer"},a(n.ip)+":"+a(n.http_port),9,G)]),d(t(w),{size:"small",type:de(n.endpoint_kind),round:""},{default:u(()=>[l(a(oe(n.endpoint_kind)),1)]),_:2},1032,["type"])]),i("div",X,[d(t(w),{size:"small",type:fe(n),round:""},{default:u(()=>[l(a(ve(n)),1)]),_:2},1032,["type"]),d(t(w),{size:"small",type:pe(n),round:""},{default:u(()=>[l(a(_e(n)),1)]),_:2},1032,["type"]),n.inbound_status==="blocked"?(o(),k(t(w),{key:0,size:"small",type:"error",round:""},{default:u(()=>[l(a(B(n.inbound_status)),1)]),_:2},1024)):C("",!0)]),i("dl",Y,[i("div",null,[i("dt",null,a(t(s)("devices.os")),1),i("dd",null,a(ke(n)||t(s)("devices.unknown")),1)]),i("div",null,[i("dt",null,a(t(s)("devices.agentVersion")),1),i("dd",null,a(O(n.hermes_agent_version)),1)]),i("div",null,[i("dt",null,a(t(s)("devices.webUiVersion")),1),i("dd",null,a(O(n.hermes_web_ui_version)),1)]),i("div",null,[i("dt",null,a(t(s)("devices.responseMs")),1),i("dd",null,a(n.response_ms)+"ms",1)])]),i("div",ee,[me(n)?(o(),k(t(p),{key:0,size:"tiny",type:"primary",loading:v.value===n.id,onClick:f=>h(n,"request")},{default:u(()=>[l(a(t(s)("devices.requestPairing")),1)]),_:1},8,["loading","onClick"])):C("",!0),ye(n)?(o(),k(t(p),{key:1,size:"tiny",quaternary:"",type:"error",loading:v.value===n.id,onClick:f=>h(n,"block")},{default:u(()=>[l(a(t(s)("devices.block")),1)]),_:1},8,["loading","onClick"])):(o(),k(t(p),{key:2,size:"tiny",quaternary:"",loading:v.value===n.id,onClick:f=>h(n,"unblock")},{default:u(()=>[l(a(t(s)("devices.unblock")),1)]),_:1},8,["loading","onClick"]))])]))),128))]))])]),_:1},8,["show"]),d(t(qe),{show:$.value,"onUpdate:show":r[2]||(r[2]=n=>$.value=n),width:"min(420px, 100vw)",placement:"right"},{default:u(()=>[d(t(Te),{title:t(s)("devices.requests"),closable:""},{default:u(()=>[_.value.requests.length===0?(o(),m("div",ne,a(t(s)("devices.noRequests")),1)):(o(),m("div",te,[(o(!0),m(N,null,j(_.value.requests,n=>(o(),m("article",{key:n.id,class:"request-item"},[i("div",null,[i("div",se,a(n.computer_name||n.ip),1),i("div",ae,a(n.ip)+":"+a(n.http_port),1),i("div",ie,[d(t(w),{size:"small",type:be(n),round:""},{default:u(()=>[l(a(he(n)),1)]),_:2},1032,["type"]),d(t(w),{size:"small",type:n.inbound_status==="blocked"?"error":n.inbound_status==="rejected"?"warning":n.inbound_status==="approved"?"success":"info",round:""},{default:u(()=>[l(a(B(n.inbound_status)),1)]),_:2},1032,["type"])])]),i("div",re,[n.inbound_status==="pending"?(o(),k(t(p),{key:0,size:"tiny",type:"success",loading:v.value===n.id,onClick:f=>h(n,"approve")},{default:u(()=>[l(a(t(s)("devices.approve")),1)]),_:1},8,["loading","onClick"])):C("",!0),n.inbound_status==="pending"?(o(),k(t(p),{key:1,size:"tiny",quaternary:"",type:"warning",loading:v.value===n.id,onClick:f=>h(n,"reject")},{default:u(()=>[l(a(t(s)("devices.reject")),1)]),_:1},8,["loading","onClick"])):C("",!0),n.inbound_status==="pending"?(o(),k(t(p),{key:2,size:"tiny",quaternary:"",type:"error",loading:v.value===n.id,onClick:f=>h(n,"block")},{default:u(()=>[l(a(t(s)("devices.block")),1)]),_:1},8,["loading","onClick"])):C("",!0),d(t(Ue),{onPositiveClick:f=>h(n,"deleteHistory")},{trigger:u(()=>[d(t(p),{size:"tiny",quaternary:"",type:"error",loading:v.value===n.id},{default:u(()=>[l(a(t(s)("devices.deleteHistory")),1)]),_:1},8,["loading"])]),default:u(()=>[l(" "+a(t(s)("devices.deleteHistoryConfirm")),1)]),_:2},1032,["onPositiveClick"])])]))),128))]))]),_:1},8,["title"])]),_:1},8,["show"])]))}})})),Ge=z((()=>{})),Xe,Ye=z((()=>{ue(),ue(),Ge(),je(),Xe=xe(le,[["__scopeId","data-v-167079d2"]])}));Ye();export{Xe as default};
1
+ import{n as z}from"./rolldown-runtime-M0oDzQ_3.js";import{$t as N,Cn as Pe,Dn as j,I as qe,Ot as p,P as Te,Pn as u,Pt as Se,Qn as t,Rt as w,Tn as o,V as ze,Wn as b,Wt as $e,Zt as Re,an as C,dn as Ve,g as Be,in as k,ln as l,nn as Le,on as m,rn as i,rr as a,t as Oe,un as d,w as Ue}from"./ui-vendor-dYn1tJGA.js";import{c as Ie,l as Ne}from"./vue-vendor-DZ4A_GHn.js";import{f as y,n as je,t as xe,u as De}from"./_plugin-vue_export-helper-CwNymSRn.js";async function Fe(){return y("/api/devices")}async function He(){return y("/api/devices/scan",{method:"POST"})}async function Me(c){return y(`/api/devices/${encodeURIComponent(c)}/request`,{method:"POST"})}async function Ee(c){return y("/api/devices/manual-request",{method:"POST",body:JSON.stringify({url:c})})}async function We(c){return y(`/api/devices/${encodeURIComponent(c)}/approve`,{method:"POST"})}async function Je(c){return y(`/api/devices/${encodeURIComponent(c)}/reject`,{method:"POST"})}async function Ke(c){return y(`/api/devices/${encodeURIComponent(c)}/block`,{method:"POST"})}async function Qe(c){return y(`/api/devices/${encodeURIComponent(c)}/unblock`,{method:"POST"})}async function Ze(c){return y(`/api/devices/${encodeURIComponent(c)}/request-history`,{method:"DELETE"})}var Ae=z((()=>{De()})),x,D,F,H,M,E,W,J,K,Q,Z,A,G,X,Y,ee,ne,te,se,ae,ie,re,le,ue=z((()=>{$e(),Oe(),Ie(),Ae(),x={class:"devices-view"},D={class:"page-header"},F={class:"header-title"},H={class:"header-actions"},M={class:"header-meta"},E={class:"devices-content"},W={key:0,class:"empty-state"},J={class:"empty-title"},K={key:1,class:"device-grid"},Q={class:"device-card-header"},Z={class:"device-title-block"},A={class:"device-name"},G=["href"],X={class:"device-status-row"},Y={class:"device-meta-list"},ee={class:"device-actions"},ne={key:0,class:"request-empty"},te={key:1,class:"request-list"},se={class:"request-name"},ae={class:"request-meta"},ie={class:"request-status-row"},re={class:"request-actions"},le=Ve({__name:"DevicesView",setup(c){const{t:s}=Ne(),g=ze(),P=b(!1),q=b(!1),T=b(!1),S=b(""),v=b(""),$=b(!1),_=b({scanning:!1,last_scanned_at:null,devices:[],requests:[]}),R=Le(()=>[..._.value.devices].sort((e,r)=>{const n=+!!r.online-+!!e.online;if(n!==0)return n;const f=V(e.endpoint_kind)-V(r.endpoint_kind);return f!==0?f:e.id.localeCompare(r.id)}));function V(e){return e==="web"?0:e==="desktop"?1:2}function oe(e){return s(`devices.endpoint.${e}`)}function de(e){return e==="desktop"?"success":e==="web"?"info":"default"}function B(e){return s(`devices.inboundStatus.${e}`)}function ce(e){return s(`devices.outboundStatus.${e}`)}function _e(e){return e.outbound_status==="approved"?s("devices.paired"):ce(e.outbound_status)}function pe(e){return e.outbound_status==="approved"?"success":e.outbound_status==="pending"?"info":e.outbound_status==="blocked"?"error":e.outbound_status==="rejected"?"warning":"default"}function ve(e){return e.online?s("devices.online"):s("devices.offline")}function fe(e){return e.online?"success":"default"}function me(e){return!!e.online&&(e.outbound_status==="none"||e.outbound_status==="rejected")}function ye(e){return e.inbound_status!=="blocked"}function ge(){return _.value.requests.length>0?s("devices.requestsWithCount",{count:_.value.requests.length}):s("devices.requests")}function L(e){return e.inbound_status!=="pending"}function he(e){return L(e)?s("devices.processed"):s("devices.unprocessed")}function be(e){return L(e)?"success":"warning"}function ke(e){return[e.os.type||e.os.platform,e.os.release,e.os.arch].filter(Boolean).join(" ")}function we(e){if(!e)return s("devices.never");const r=new Date(e);return Number.isNaN(r.getTime())?String(e):r.toLocaleString()}function O(e){return e||s("devices.unknown")}async function Ce(){P.value=!0;try{_.value=await Fe()}catch(e){g.error(e?.message||s("devices.loadFailed"))}finally{P.value=!1}}async function U(){q.value=!0;try{_.value=await He()}catch(e){g.error(e?.message||s("devices.scanFailed"))}finally{q.value=!1}}async function h(e,r){v.value=e.id;try{_.value=r==="request"?await Me(e.id):r==="approve"?await We(e.id):r==="reject"?await Je(e.id):r==="block"?await Ke(e.id):r==="deleteHistory"?await Ze(e.id):await Qe(e.id)}catch(n){if(r==="request"&&String(n?.message||"").includes("Duplicate pairing request")){g.warning(s("devices.duplicateRequest"));return}g.error(n?.message||s("devices.updateFailed"))}finally{v.value=""}}async function I(){const e=S.value.trim();if(!e){g.warning(s("devices.manualUrlRequired"));return}T.value=!0;try{_.value=await Ee(e),S.value="",g.success(s("devices.manualRequestSent"))}catch(r){g.error(r?.message||s("devices.manualRequestFailed"))}finally{T.value=!1}}return Pe(()=>{Ce()}),(e,r)=>(o(),m("div",x,[i("header",D,[i("h2",F,a(t(s)("devices.title")),1),i("div",H,[d(t(Se),{value:S.value,"onUpdate:value":r[0]||(r[0]=n=>S.value=n),class:"manual-pairing-input",size:"small",clearable:"",placeholder:t(s)("devices.manualUrlPlaceholder"),disabled:T.value,onKeyup:Re(I,["enter"])},null,8,["value","placeholder","disabled"]),d(t(p),{size:"small",loading:T.value,onClick:I},{default:u(()=>[l(a(t(s)("devices.manualPairing")),1)]),_:1},8,["loading"]),i("div",M,[i("span",null,a(t(s)("devices.count",{count:R.value.length})),1),i("span",null,a(t(s)("devices.lastScanned",{time:we(_.value.last_scanned_at)})),1)]),d(t(p),{size:"small",onClick:r[1]||(r[1]=n=>$.value=!0)},{default:u(()=>[l(a(ge()),1)]),_:1}),d(t(p),{size:"small",type:"primary",loading:q.value||_.value.scanning,onClick:U},{default:u(()=>[l(a(t(s)("devices.refresh")),1)]),_:1},8,["loading"])])]),d(t(Be),{show:P.value,class:"devices-spin"},{default:u(()=>[i("div",E,[R.value.length===0&&!P.value?(o(),m("div",W,[i("div",J,a(t(s)("devices.empty")),1),d(t(p),{size:"small",loading:q.value||_.value.scanning,onClick:U},{default:u(()=>[l(a(t(s)("devices.refresh")),1)]),_:1},8,["loading"])])):(o(),m("div",K,[(o(!0),m(N,null,j(R.value,n=>(o(),m("article",{key:n.id,class:"device-card"},[i("div",Q,[i("div",Z,[i("div",A,a(n.computer_name||n.ip),1),i("a",{class:"device-link",href:n.url,target:"_blank",rel:"noopener noreferrer"},a(n.ip)+":"+a(n.http_port),9,G)]),d(t(w),{size:"small",type:de(n.endpoint_kind),round:""},{default:u(()=>[l(a(oe(n.endpoint_kind)),1)]),_:2},1032,["type"])]),i("div",X,[d(t(w),{size:"small",type:fe(n),round:""},{default:u(()=>[l(a(ve(n)),1)]),_:2},1032,["type"]),d(t(w),{size:"small",type:pe(n),round:""},{default:u(()=>[l(a(_e(n)),1)]),_:2},1032,["type"]),n.inbound_status==="blocked"?(o(),k(t(w),{key:0,size:"small",type:"error",round:""},{default:u(()=>[l(a(B(n.inbound_status)),1)]),_:2},1024)):C("",!0)]),i("dl",Y,[i("div",null,[i("dt",null,a(t(s)("devices.os")),1),i("dd",null,a(ke(n)||t(s)("devices.unknown")),1)]),i("div",null,[i("dt",null,a(t(s)("devices.agentVersion")),1),i("dd",null,a(O(n.hermes_agent_version)),1)]),i("div",null,[i("dt",null,a(t(s)("devices.webUiVersion")),1),i("dd",null,a(O(n.hermes_web_ui_version)),1)]),i("div",null,[i("dt",null,a(t(s)("devices.responseMs")),1),i("dd",null,a(n.response_ms)+"ms",1)])]),i("div",ee,[me(n)?(o(),k(t(p),{key:0,size:"tiny",type:"primary",loading:v.value===n.id,onClick:f=>h(n,"request")},{default:u(()=>[l(a(t(s)("devices.requestPairing")),1)]),_:1},8,["loading","onClick"])):C("",!0),ye(n)?(o(),k(t(p),{key:1,size:"tiny",quaternary:"",type:"error",loading:v.value===n.id,onClick:f=>h(n,"block")},{default:u(()=>[l(a(t(s)("devices.block")),1)]),_:1},8,["loading","onClick"])):(o(),k(t(p),{key:2,size:"tiny",quaternary:"",loading:v.value===n.id,onClick:f=>h(n,"unblock")},{default:u(()=>[l(a(t(s)("devices.unblock")),1)]),_:1},8,["loading","onClick"]))])]))),128))]))])]),_:1},8,["show"]),d(t(qe),{show:$.value,"onUpdate:show":r[2]||(r[2]=n=>$.value=n),width:"min(420px, 100vw)",placement:"right"},{default:u(()=>[d(t(Te),{title:t(s)("devices.requests"),closable:""},{default:u(()=>[_.value.requests.length===0?(o(),m("div",ne,a(t(s)("devices.noRequests")),1)):(o(),m("div",te,[(o(!0),m(N,null,j(_.value.requests,n=>(o(),m("article",{key:n.id,class:"request-item"},[i("div",null,[i("div",se,a(n.computer_name||n.ip),1),i("div",ae,a(n.ip)+":"+a(n.http_port),1),i("div",ie,[d(t(w),{size:"small",type:be(n),round:""},{default:u(()=>[l(a(he(n)),1)]),_:2},1032,["type"]),d(t(w),{size:"small",type:n.inbound_status==="blocked"?"error":n.inbound_status==="rejected"?"warning":n.inbound_status==="approved"?"success":"info",round:""},{default:u(()=>[l(a(B(n.inbound_status)),1)]),_:2},1032,["type"])])]),i("div",re,[n.inbound_status==="pending"?(o(),k(t(p),{key:0,size:"tiny",type:"success",loading:v.value===n.id,onClick:f=>h(n,"approve")},{default:u(()=>[l(a(t(s)("devices.approve")),1)]),_:1},8,["loading","onClick"])):C("",!0),n.inbound_status==="pending"?(o(),k(t(p),{key:1,size:"tiny",quaternary:"",type:"warning",loading:v.value===n.id,onClick:f=>h(n,"reject")},{default:u(()=>[l(a(t(s)("devices.reject")),1)]),_:1},8,["loading","onClick"])):C("",!0),n.inbound_status==="pending"?(o(),k(t(p),{key:2,size:"tiny",quaternary:"",type:"error",loading:v.value===n.id,onClick:f=>h(n,"block")},{default:u(()=>[l(a(t(s)("devices.block")),1)]),_:1},8,["loading","onClick"])):C("",!0),d(t(Ue),{onPositiveClick:f=>h(n,"deleteHistory")},{trigger:u(()=>[d(t(p),{size:"tiny",quaternary:"",type:"error",loading:v.value===n.id},{default:u(()=>[l(a(t(s)("devices.deleteHistory")),1)]),_:1},8,["loading"])]),default:u(()=>[l(" "+a(t(s)("devices.deleteHistoryConfirm")),1)]),_:2},1032,["onPositiveClick"])])]))),128))]))]),_:1},8,["title"])]),_:1},8,["show"])]))}})})),Ge=z((()=>{})),Xe,Ye=z((()=>{ue(),ue(),Ge(),je(),Xe=xe(le,[["__scopeId","data-v-167079d2"]])}));Ye();export{Xe as default};
@@ -1 +1 @@
1
- import{n as F}from"./rolldown-runtime-M0oDzQ_3.js";import{$t as re,At as de,Cn as it,Dn as ue,Ht as Et,K as st,M as Y,Mn as St,Mt as Tt,Ot as M,Pn as k,Pt as Dt,Qn as e,Qt as W,Tn as b,V as q,Wn as $,Wt as P,Y as nt,Zt as Mt,an as z,c as Bt,dn as j,er as Pt,g as Lt,in as R,it as zt,ln as S,mn as pe,nn as A,nt as jt,on as T,rn as f,rr as g,t as I,un as x,xn as It,yn as Ut}from"./ui-vendor-dYn1tJGA.js";import{_ as Nt,c as U,g as Ot,l as N}from"./vue-vendor-DZ4A_GHn.js";import{a as lt,f as K,n as H,o as ot,s as rt,t as V,u as Rt}from"./_plugin-vue_export-helper-uEMLHKI8.js";import{P as ut,j as ct}from"./index-1yNqMnGv.js";import{i as At,n as qt,r as Kt,t as Ht}from"./monaco-editor-YM0cdSGX.js";import{n as Vt,t as Xt}from"./clipboard-1NPxC3YL.js";import{a as Gt,c as Jt,n as Wt,s as Yt,t as Qt}from"./MarkdownRenderer-Jwbx4dOP.js";async function dt(i=""){const n=new URLSearchParams;i&&n.set("path",i);const t=n.toString();return K(`/api/hermes/files/list${t?`?${t}`:""}`)}async function ne(i){return K(`/api/hermes/files/read?path=${encodeURIComponent(i)}`)}async function _e(i,n){await K("/api/hermes/files/write",{method:"PUT",body:JSON.stringify({path:i,content:n})})}async function Zt(i,n=!1){await K("/api/hermes/files/delete",{method:"DELETE",body:JSON.stringify({path:i,recursive:n})})}async function ea(i,n){await K("/api/hermes/files/rename",{method:"POST",body:JSON.stringify({oldPath:i,newPath:n})})}async function ta(i){await K("/api/hermes/files/mkdir",{method:"POST",body:JSON.stringify({path:i})})}async function aa(i,n){await K("/api/hermes/files/copy",{method:"POST",body:JSON.stringify({srcPath:i,destPath:n})})}async function ia(i,n){const t=rt(),s=new FormData;for(const w of n)s.append("file",w);const a=new URLSearchParams;i&&a.set("path",i);const l=a.toString(),c=`${t}/api/hermes/files/upload${l?`?${l}`:""}`,_={},p=ot();p&&(_.Authorization=`Bearer ${p}`);const u=lt();u&&(_["X-Hermes-Profile"]=u);const m=await fetch(c,{method:"POST",headers:_,body:s});if(!m.ok){const w=await m.json().catch(()=>({error:`HTTP ${m.status}`}));throw new Error(w.error||`Upload failed: ${m.status}`)}return(await m.json()).files}function sa(i,n){const t=rt(),s=new URLSearchParams({path:i});n&&s.set("name",n);const a=lt();a&&s.set("profile",a);const l=ot();return l&&s.set("token",l),`${t}/api/hermes/download?${s.toString()}`}var ce=F((()=>{Rt()}));function fe(i){const n=i.split("/").pop()||"",t=oe[n];return t||ft[Q(n)]||"plaintext"}function Q(i){const n=i.lastIndexOf(".");return n>=0?i.slice(n).toLowerCase():""}function pt(i){return ht.has(Q(i))}function _t(i){const n=Q(i);return n===".md"||n===".markdown"}function G(i){const n=i.split("/").pop()||"";return vt.has(n)||n.startsWith(".env.")?!0:mt.has(Q(n))}function le(i){return pt(i)||_t(i)||G(i)}function J(i,n,t){return!!(i===n||t&&i.startsWith(n+"/"))}var ft,oe,vt,mt,ht,L,O=F((()=>{Nt(),P(),ce(),ft={".js":"javascript",".jsx":"javascript",".ts":"typescript",".tsx":"typescript",".json":"json",".jsonc":"json",".html":"html",".htm":"html",".css":"css",".scss":"scss",".less":"less",".md":"markdown",".markdown":"markdown",".py":"python",".yaml":"yaml",".yml":"yaml",".xml":"xml",".sh":"shell",".bash":"shell",".zsh":"shell",".sql":"sql",".go":"go",".rs":"rust",".java":"java",".c":"c",".h":"c",".cpp":"cpp",".hpp":"cpp",".toml":"ini",".ini":"ini",".env":"ini",".vue":"html",".dockerfile":"dockerfile",".graphql":"graphql",".lua":"lua",".r":"r",".rb":"ruby",".php":"php",".swift":"swift",".kt":"kotlin"},oe={Dockerfile:"dockerfile",Makefile:"makefile","CMakeLists.txt":"cmake",".gitignore":"gitignore",".dockerignore":"gitignore"},vt=new Set([...Object.keys(oe),"README","LICENSE","NOTICE","CHANGELOG","CONTRIBUTING"]),mt=new Set([".txt",".text",".log",".csv",".tsv",".js",".jsx",".mjs",".cjs",".ts",".tsx",".mts",".cts",".json",".jsonc",".html",".htm",".css",".scss",".less",".md",".markdown",".py",".pyw",".yaml",".yml",".xml",".sh",".bash",".zsh",".fish",".sql",".go",".rs",".java",".c",".h",".cpp",".hpp",".cc",".cxx",".hh",".hxx",".toml",".ini",".env",".conf",".cfg",".properties",".vue",".svelte",".astro",".dockerfile",".graphql",".gql",".lua",".r",".rb",".php",".swift",".kt",".kts",".diff",".patch",".lock"]),ht=new Set([".png",".jpg",".jpeg",".gif",".svg",".webp",".bmp",".ico"]),L=Ot("files",()=>{const i=$(""),n=$([]),t=$(!1),s=$("name"),a=$("asc"),l=$(null),c=$(null),_=A(()=>i.value?i.value.split("/").filter(Boolean):[]),p=A(()=>{const o=[...n.value];return o.sort((r,E)=>{if(r.isDir!==E.isDir)return r.isDir?-1:1;let D=0;switch(s.value){case"name":D=r.name.localeCompare(E.name);break;case"size":D=r.size-E.size;break;case"modTime":D=r.modTime.localeCompare(E.modTime);break}return a.value==="asc"?D:-D}),o});async function u(o){o!==void 0&&o!==i.value&&(c.value=null),o!==void 0&&(i.value=o),t.value=!0;try{n.value=(await dt(i.value)).entries}catch(r){throw console.error("Failed to fetch files:",r),r}finally{t.value=!1}}function m(o){return u(o)}function w(){const o=i.value.split("/").filter(Boolean);return o.pop(),u(o.join("/"))}async function B(o){const r=await ne(o);l.value={path:o,content:r.content,originalContent:r.content,language:fe(o)}}async function d(){l.value&&(await _e(l.value.path,l.value.content),l.value.originalContent=l.value.content)}function v(){l.value=null}async function h(o){if(pt(o.name))c.value={path:o.path,type:"image"};else if(_t(o.name)){const r=await ne(o.path);c.value={path:o.path,type:"markdown",content:r.content}}else if(G(o.name)){const r=await ne(o.path);c.value={path:o.path,type:"text",content:r.content,language:fe(o.path)}}}function C(){c.value=null}async function y(o){const r=i.value?`${i.value}/${o}`:o;await ta(r),await u()}async function X(o){const r=i.value?`${i.value}/${o}`:o;await _e(r,""),await u()}async function Z(o){await Zt(o.path,o.isDir),c.value&&J(c.value.path,o.path,o.isDir)&&(c.value=null),l.value&&J(l.value.path,o.path,o.isDir)&&(l.value=null),await u()}async function ee(o,r){const E=o.path.includes("/")?o.path.slice(0,o.path.lastIndexOf("/")):"",D=E?`${E}/${r}`:r;await ea(o.path,D),c.value&&J(c.value.path,o.path,o.isDir)&&(c.value=null),l.value&&J(l.value.path,o.path,o.isDir)&&(l.value=null),await u()}async function te(o,r){await aa(o.path,r),await u()}async function ae(o){await ia(i.value,o),await u()}function ie(o){s.value===o?a.value=a.value==="asc"?"desc":"asc":(s.value=o,a.value="asc")}return{currentPath:i,entries:n,loading:t,sortBy:s,sortOrder:a,editingFile:l,previewFile:c,pathSegments:_,sortedEntries:p,hasUnsavedChanges:A(()=>l.value?l.value.content!==l.value.originalContent:!1),fetchEntries:u,navigateTo:m,navigateUp:w,openEditor:B,saveEditor:d,closeEditor:v,openPreview:h,closePreview:C,createDir:y,createFile:X,deleteEntry:Z,renameEntry:ee,copyEntry:te,uploadFiles:ae,setSort:ie}})})),ve,gt,me=F((()=>{P(),I(),U(),O(),ce(),ve={class:"file-tree"},gt=j({__name:"FileTree",setup(i){const{t:n}=N(),t=L(),s=$([]),a=$([]);async function l(u){try{return(await dt(u)).entries.filter(m=>m.isDir).sort((m,w)=>m.name.localeCompare(w.name)).map(m=>({key:m.path,label:m.name,isLeaf:!1}))}catch{return[]}}async function c(u){u.children=await l(u.key)}function _(u){u.length>0&&(a.value=u,t.navigateTo(u[0]))}function p(){a.value=[],t.navigateTo("")}return it(async()=>{s.value=await l("")}),(u,m)=>(b(),T("div",ve,[f("div",{class:"tree-header",onClick:p},[m[0]||(m[0]=f("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[f("path",{d:"M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"}),f("polyline",{points:"9 22 9 12 15 12 15 22"})],-1)),f("span",null,g(e(n)("files.breadcrumbRoot")),1)]),x(e(Bt),{data:s.value,"selected-keys":a.value,"on-load":c,"expand-on-click":"","block-line":"","onUpdate:selectedKeys":_},null,8,["data","selected-keys"])]))}})})),na=F((()=>{})),la,Wa=F((()=>{me(),me(),na(),H(),la=V(gt,[["__scopeId","data-v-7f00b3bc"]])})),he,wt,ge=F((()=>{P(),U(),I(),O(),he={class:"file-breadcrumb"},wt=j({__name:"FileBreadcrumb",setup(i){const{t:n}=N(),t=L();function s(a){if(a<0)t.navigateTo("");else{const l=t.pathSegments.slice(0,a+1).join("/");t.navigateTo(l)}}return(a,l)=>(b(),T("div",he,[x(e(Tt),null,{default:k(()=>[x(e(de),{onClick:l[0]||(l[0]=c=>s(-1))},{default:k(()=>[S(g(e(n)("files.breadcrumbRoot")),1)]),_:1}),(b(!0),T(re,null,ue(e(t).pathSegments,(c,_)=>(b(),R(e(de),{key:_,onClick:p=>s(_)},{default:k(()=>[S(g(c),1)]),_:2},1032,["onClick"]))),128))]),_:1})]))}})})),oa=F((()=>{})),ra,Ya=F((()=>{ge(),ge(),oa(),H(),ra=V(wt,[["__scopeId","data-v-061302de"]])})),we,yt,ye=F((()=>{P(),I(),U(),O(),we={class:"file-toolbar"},yt=j({__name:"FileToolbar",emits:["showNewFile","showNewFolder","showUpload"],setup(i,{emit:n}){const{t}=N(),s=q(),a=L(),l=n;async function c(){try{await a.fetchEntries()}catch{s.error(t("files.backendError"))}}return(_,p)=>(b(),T("div",we,[x(e(Y),{size:8,wrap:!0,class:"toolbar-space"},{default:k(()=>[x(e(M),{size:"small",onClick:p[0]||(p[0]=u=>l("showNewFile")),class:"toolbar-btn"},{default:k(()=>[S(g(e(t)("files.newFile")),1)]),_:1}),x(e(M),{size:"small",onClick:p[1]||(p[1]=u=>l("showNewFolder")),class:"toolbar-btn"},{default:k(()=>[S(g(e(t)("files.newFolder")),1)]),_:1}),x(e(M),{size:"small",onClick:p[2]||(p[2]=u=>l("showUpload")),class:"toolbar-btn"},{default:k(()=>[S(g(e(t)("files.upload")),1)]),_:1}),x(e(M),{size:"small",onClick:c,class:"toolbar-btn"},{default:k(()=>[S(g(e(t)("files.refresh")),1)]),_:1})]),_:1})]))}})})),ua=F((()=>{})),ca,Qa=F((()=>{ye(),ye(),ua(),H(),ca=V(yt,[["__scopeId","data-v-64269d74"]])})),ke,Fe,be,Ce,xe,$e,Ee,Se,Te,De,Me,Be,Pe,kt,Le=F((()=>{P(),I(),U(),O(),ut(),ke={class:"file-list"},Fe={key:1,class:"file-list-items"},be={class:"file-list-header file-list-grid"},Ce={key:0,class:"sort-indicator"},xe={key:0,class:"sort-indicator"},$e={key:0,class:"sort-indicator"},Ee=["onDblclick","onContextmenu"],Se={class:"file-name"},Te={class:"file-icon"},De={class:"file-label"},Me={class:"file-size"},Be={class:"file-date"},Pe={class:"file-actions"},kt=j({__name:"FileList",emits:["contextmenu-entry"],setup(i,{emit:n}){const{t}=N(),s=q(),a=L(),l=n;function c(d){if(d===0)return"—";const v=["B","KB","MB","GB"];let h=0,C=d;for(;C>=1024&&h<v.length-1;)C/=1024,h++;return`${C.toFixed(h===0?0:1)} ${v[h]}`}function _(d){return d?new Date(d).toLocaleString():"—"}function p(d){return d.isDir?"📁":{yaml:"⚙️",yml:"⚙️",json:"📋",toml:"⚙️",md:"📝",txt:"📄",log:"📄",py:"🐍",js:"📜",ts:"📜",vue:"💚",png:"🖼️",jpg:"🖼️",jpeg:"🖼️",gif:"🖼️",svg:"🖼️",webp:"🖼️",zip:"📦",gz:"📦",tar:"📦",sh:"⚡",bash:"⚡"}[d.name.split(".").pop()?.toLowerCase()||""]||"📄"}async function u(d){try{await a.openPreview(d)}catch{s.error(t("files.backendError"))}}async function m(d){d.isDir?a.navigateTo(d.path):G(d.name)?await a.openEditor(d.path):le(d.name)&&await u(d)}function w(d,v){d.preventDefault(),l("contextmenu-entry",d,v)}async function B(d){try{await ct(d.path,d.name)}catch(v){s.error(v.message||t("files.backendError"))}}return(d,v)=>(b(),T("div",ke,[x(e(Lt),{show:e(a).loading},{default:k(()=>[!e(a).loading&&e(a).sortedEntries.length===0?(b(),R(e(Et),{key:0,description:e(t)("files.emptyDir")},null,8,["description"])):(b(),T("div",Fe,[f("div",be,[f("div",{class:"file-name sort-header",onClick:v[0]||(v[0]=h=>e(a).setSort("name"))},[S(g(e(t)("files.name"))+" ",1),e(a).sortBy==="name"?(b(),T("span",Ce,g(e(a).sortOrder==="asc"?"↑":"↓"),1)):z("",!0)]),f("div",{class:"file-size sort-header",onClick:v[1]||(v[1]=h=>e(a).setSort("size"))},[S(g(e(t)("files.size"))+" ",1),e(a).sortBy==="size"?(b(),T("span",xe,g(e(a).sortOrder==="asc"?"↑":"↓"),1)):z("",!0)]),f("div",{class:"file-date sort-header",onClick:v[2]||(v[2]=h=>e(a).setSort("modTime"))},[S(g(e(t)("files.modified"))+" ",1),e(a).sortBy==="modTime"?(b(),T("span",$e,g(e(a).sortOrder==="asc"?"↑":"↓"),1)):z("",!0)]),v[3]||(v[3]=f("div",{class:"file-actions-placeholder"},null,-1))]),(b(!0),T(re,null,ue(e(a).sortedEntries,h=>(b(),T("div",{key:h.path,class:"file-list-row file-list-grid",onDblclick:C=>m(h),onContextmenu:C=>w(C,h)},[f("div",Se,[f("span",Te,g(p(h)),1),f("span",De,g(h.name),1)]),f("div",Me,g(h.isDir?"—":c(h.size)),1),f("div",Be,g(_(h.modTime)),1),f("div",Pe,[e(le)(h.name)&&!h.isDir?(b(),R(e(M),{key:0,size:"tiny",quaternary:"",onClick:W(C=>u(h),["stop"]),title:e(t)("files.preview")},{default:k(()=>[...v[4]||(v[4]=[S("👁️",-1)])]),_:1},8,["onClick","title"])):z("",!0),e(G)(h.name)&&!h.isDir?(b(),R(e(M),{key:1,size:"tiny",quaternary:"",onClick:W(C=>e(a).openEditor(h.path),["stop"]),title:e(t)("files.edit")},{default:k(()=>[...v[5]||(v[5]=[S("✏️",-1)])]),_:1},8,["onClick","title"])):z("",!0),h.isDir?z("",!0):(b(),R(e(M),{key:2,size:"tiny",quaternary:"",onClick:W(C=>B(h),["stop"]),title:e(t)("files.download")},{default:k(()=>[...v[6]||(v[6]=[S("⬇️",-1)])]),_:1},8,["onClick","title"]))])],40,Ee))),128))]))]),_:1},8,["show"])]))}})})),da=F((()=>{})),pa,Za=F((()=>{Le(),Le(),da(),H(),pa=V(kt,[["__scopeId","data-v-3fb1b38b"]])}));function _a(i){return i.absolutePath||i.path}var fa=F((()=>{})),Ft,ze=F((()=>{P(),I(),U(),O(),ut(),Vt(),fa(),Ft=j({__name:"FileContextMenu",emits:["rename"],setup(i,{expose:n,emit:t}){const{t:s}=N(),a=q(),l=nt(),c=L(),_=$(!1),p=$(0),u=$(0),m=$(null),w=t;function B(C,y){m.value=y,p.value=C.clientX,u.value=C.clientY,_.value=!1,Ut(()=>{_.value=!0})}function d(){const C=m.value;if(!C)return[];const y=[];return C.isDir?y.push({label:s("files.open"),key:"open"}):(G(C.name)&&y.push({label:s("files.edit"),key:"edit"}),le(C.name)&&y.push({label:s("files.preview"),key:"preview"}),y.push({label:s("files.download"),key:"download"})),y.push({type:"divider",key:"d1"}),y.push({label:s("files.copyPath"),key:"copyPath"}),y.push({label:s("files.rename"),key:"rename"}),y.push({type:"divider",key:"d2"}),y.push({label:s("files.delete"),key:"delete"}),y}async function v(C){_.value=!1;const y=m.value;if(y)switch(C){case"open":c.navigateTo(y.path);break;case"edit":try{await c.openEditor(y.path)}catch{a.error(s("files.backendError"))}break;case"preview":try{await c.openPreview(y)}catch{a.error(s("files.backendError"))}break;case"download":try{await ct(y.path,y.name)}catch(X){a.error(X.message)}break;case"copyPath":await Xt(_a(y))?a.success(s("files.pathCopied")):a.error(s("files.pathCopied")+" ✗");break;case"rename":w("rename",y);break;case"delete":l.warning({title:s("files.delete"),content:y.isDir?s("files.confirmDeleteDir",{name:y.name}):s("files.confirmDelete",{name:y.name}),positiveText:s("common.delete"),negativeText:s("common.cancel"),onPositiveClick:async()=>{try{await c.deleteEntry(y),a.success(s("files.deleted"))}catch{a.error(s("files.deleteFailed"))}}});break}}function h(){_.value=!1}return n({show:B}),(C,y)=>(b(),R(e(jt),{show:_.value,x:p.value,y:u.value,options:d(),placement:"bottom-start",trigger:"manual",onSelect:v,onClickoutside:h},null,8,["show","x","y","options"]))}})})),va,ei=F((()=>{ze(),ze(),va=Ft})),je,Ie,Ue,bt,Ne=F((()=>{P(),I(),U(),O(),Ht(),je={class:"file-editor"},Ie={class:"editor-header"},Ue={class:"editor-filename"},bt=j({__name:"FileEditor",setup(i){self.MonacoEnvironment={getWorker(m,w){return new Worker(new URL("/assets/editor.worker-D9luhcDD.js",""+import.meta.url),{type:"module"})}};const{t:n}=N(),t=q(),s=nt(),a=L(),l=$(null);let c=null;const _=$(!1);it(()=>{!l.value||!a.editingFile||(c=At.create(l.value,{value:a.editingFile.content,language:a.editingFile.language,theme:document.documentElement.classList.contains("dark")?"vs-dark":"vs",minimap:{enabled:!1},fontSize:13,lineNumbers:"on",scrollBeyondLastLine:!1,automaticLayout:!0,tabSize:2,wordWrap:"on"}),c.onDidChangeModelContent(()=>{a.editingFile&&(a.editingFile.content=c.getValue())}),c.addCommand(Kt.CtrlCmd|qt.KeyS,()=>{p()}))}),It(()=>{c?.dispose(),c=null});async function p(){_.value=!0;try{await a.saveEditor(),t.success(n("files.saved"))}catch{t.error(n("files.saveFailed"))}finally{_.value=!1}}function u(){a.hasUnsavedChanges?s.warning({title:n("files.unsavedChanges"),positiveText:n("common.ok"),negativeText:n("common.cancel"),onPositiveClick:()=>{a.closeEditor()}}):a.closeEditor()}return(m,w)=>(b(),T("div",je,[f("div",Ie,[f("span",Ue,g(e(a).editingFile?.path),1),x(e(Y),null,{default:k(()=>[x(e(M),{size:"small",type:"primary",loading:_.value,onClick:p},{default:k(()=>[S(g(e(n)("files.saveFile")),1)]),_:1},8,["loading"]),x(e(M),{size:"small",onClick:u},{default:k(()=>[S(g(e(n)("files.closeEditor")),1)]),_:1})]),_:1})]),f("div",{ref_key:"editorContainer",ref:l,class:"editor-container"},null,512)]))}})})),ma=F((()=>{})),ha,ti=F((()=>{Ne(),Ne(),ma(),H(),ha=V(bt,[["__scopeId","data-v-1ae26b53"]])})),Oe,Re,Ae,qe,Ke,He,Ve,Ct,Xe=F((()=>{P(),I(),U(),O(),ce(),Wt(),Yt(),Oe={key:0,class:"file-preview"},Re={class:"preview-header"},Ae={class:"preview-filename"},qe={class:"preview-content"},Ke=["src","alt"],He={key:1,class:"preview-markdown"},Ve=["innerHTML"],Ct=j({__name:"FilePreview",setup(i){const{t:n}=N(),t=q(),s=L();function a(){return s.previewFile?sa(s.previewFile.path):""}const l=A(()=>{const p=s.previewFile;return!p||p.type!=="text"?"":Jt(p.content||"",p.language,n("common.copy"),{maxHighlightLength:2e5})});async function c(p){const u=await Gt(p);u?t.success(n("common.copied")):u===!1&&t.error(n("chat.copyFailed"))}const _=()=>pe("svg",{viewBox:"0 0 24 24",width:"14",height:"14",fill:"currentColor"},[pe("path",{d:"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"})]);return(p,u)=>e(s).previewFile?(b(),T("div",Oe,[f("div",Re,[f("span",Ae,g(e(s).previewFile.path),1),x(e(M),{size:"small",quaternary:"",onClick:u[0]||(u[0]=m=>e(s).closePreview())},{icon:k(()=>[x(e(zt),null,{default:k(()=>[x(_)]),_:1})]),default:k(()=>[S(" "+g(e(n)("files.closePreview")),1)]),_:1})]),f("div",qe,[e(s).previewFile.type==="image"?(b(),T("img",{key:0,src:a(),class:"preview-image",alt:e(s).previewFile.path},null,8,Ke)):e(s).previewFile.type==="markdown"?(b(),T("div",He,[x(Qt,{content:e(s).previewFile.content||""},null,8,["content"])])):e(s).previewFile.type==="text"?(b(),T("div",{key:2,class:"preview-code",innerHTML:l.value,onClick:c},null,8,Ve)):z("",!0)])])):z("",!0)}})})),ga=F((()=>{})),wa,ai=F((()=>{Xe(),Xe(),ga(),H(),wa=V(Ct,[["__scopeId","data-v-91416733"]])})),Ge,Je,We,Ye,Qe,Ze,et,xt,tt=F((()=>{P(),I(),U(),O(),Ge={class:"upload-panel"},Je={class:"upload-title"},We={key:0,class:"selected-files"},Ye={class:"selected-file__meta"},Qe={class:"selected-file__name"},Ze={class:"selected-file__size"},et=["onClick"],xt=j({__name:"FileUploadModal",props:{show:{type:Boolean}},emits:["update:show"],setup(i,{emit:n}){const{t}=N(),s=q(),a=L(),l=i,c=n,_=$(!1),p=$(!1),u=$(0),m=$(null),w=$([]),B=A(()=>w.value.length>0);function d(r){return`${r.name}:${r.size}:${r.lastModified}`}function v(r){const E=new Set(w.value.map(d)),D=r.filter(se=>!E.has(d(se)));D.length!==0&&(w.value=[...w.value,...D])}function h(){m.value?.click()}function C(r){const E=r.target;E.files&&(v(Array.from(E.files)),E.value="")}function y(r){r.preventDefault(),r.dataTransfer&&(r.dataTransfer.dropEffect="copy")}function X(r){r.preventDefault(),r.dataTransfer?.types.includes("Files")&&(u.value+=1,p.value=!0)}function Z(r){r.preventDefault(),u.value=Math.max(0,u.value-1),u.value===0&&(p.value=!1)}function ee(r){r.preventDefault(),u.value=0,p.value=!1;const E=Array.from(r.dataTransfer?.files||[]);E.length!==0&&v(E)}function te(r){w.value=w.value.filter((E,D)=>D!==r)}function ae(r){return r<1024?`${r} B`:r<1024*1024?`${(r/1024).toFixed(1)} KB`:`${(r/(1024*1024)).toFixed(1)} MB`}async function ie(){if(w.value.length!==0){_.value=!0;try{await a.uploadFiles(w.value),s.success(t("files.uploadSuccess",{count:w.value.length})),w.value=[],c("update:show",!1)}catch(r){s.error(r.message||t("files.uploadFailed"))}finally{_.value=!1}}}function o(){u.value=0,p.value=!1,w.value=[],c("update:show",!1)}return(r,E)=>(b(),R(e(st),{show:l.show,preset:"dialog",title:e(t)("files.upload"),"onUpdate:show":o,style:{width:"560px"}},{action:k(()=>[x(e(Y),null,{default:k(()=>[x(e(M),{onClick:o},{default:k(()=>[S(g(e(t)("common.cancel")),1)]),_:1}),x(e(M),{type:"primary",loading:_.value,disabled:!B.value,onClick:ie},{default:k(()=>[S(g(e(t)("files.upload"))+" ("+g(w.value.length)+") ",1)]),_:1},8,["loading","disabled"])]),_:1})]),default:k(()=>[f("div",Ge,[f("input",{ref_key:"fileInputRef",ref:m,type:"file",multiple:"",class:"file-input-hidden",onChange:C},null,544),f("div",{class:Pt(["upload-dropzone",{"drag-over":p.value}]),onClick:h,onDragover:y,onDragenter:X,onDragleave:Z,onDrop:ee},[E[0]||(E[0]=f("div",{class:"upload-icon","aria-hidden":"true"},[f("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.8"},[f("path",{d:"M12 16V5"}),f("path",{d:"M8 9l4-4 4 4"}),f("path",{d:"M20 16.5v1.5A2 2 0 0 1 18 20H6a2 2 0 0 1-2-2v-1.5"})])],-1)),f("p",Je,g(e(t)("files.dragDropHint")),1),x(e(M),{type:"primary",secondary:"",onClick:W(h,["stop"])},{default:k(()=>[S(g(e(t)("files.upload")),1)]),_:1})],34),B.value?(b(),T("div",We,[(b(!0),T(re,null,ue(w.value,(D,se)=>(b(),T("div",{key:d(D),class:"selected-file"},[f("div",Ye,[f("span",Qe,g(D.name),1),f("span",Ze,g(ae(D.size)),1)]),f("button",{type:"button",class:"selected-file__remove",onClick:ba=>te(se)}," × ",8,et)]))),128))])):z("",!0)])]),_:1},8,["show","title"]))}})})),ya=F((()=>{})),ka,ii=F((()=>{tt(),tt(),ya(),H(),ka=V(xt,[["__scopeId","data-v-4de50ce7"]])})),$t,at=F((()=>{P(),I(),U(),O(),$t=j({__name:"FileRenameModal",props:{show:{type:Boolean},mode:{},entry:{}},emits:["update:show"],setup(i,{emit:n}){const{t}=N(),s=q(),a=L(),l=i,c=n,_=$(""),p=$(!1);St(()=>l.show,B=>{B&&(l.mode==="rename"&&l.entry?_.value=l.entry.name:_.value="")});const u=A(()=>{switch(l.mode){case"newFile":return t("files.newFile");case"newFolder":return t("files.newFolder");case"rename":return t("files.rename")}}),m=A(()=>{switch(l.mode){case"newFile":return t("files.newFileName");case"newFolder":return t("files.newFolderName");case"rename":return t("files.renameTo")}});async function w(){if(_.value.trim()){p.value=!0;try{switch(l.mode){case"newFile":await a.createFile(_.value.trim()),s.success(t("files.created"));break;case"newFolder":await a.createDir(_.value.trim()),s.success(t("files.created"));break;case"rename":l.entry&&(await a.renameEntry(l.entry,_.value.trim()),s.success(t("files.renamed")));break}c("update:show",!1)}catch(B){const d=l.mode==="rename"?t("files.renameFailed"):t("files.createFailed");s.error(B.message||d)}finally{p.value=!1}}}return(B,d)=>(b(),R(e(st),{show:l.show,preset:"dialog",title:u.value,"onUpdate:show":d[2]||(d[2]=v=>c("update:show",!1)),style:{width:"400px"}},{action:k(()=>[x(e(Y),null,{default:k(()=>[x(e(M),{onClick:d[1]||(d[1]=v=>c("update:show",!1))},{default:k(()=>[S(g(e(t)("common.cancel")),1)]),_:1}),x(e(M),{type:"primary",loading:p.value,disabled:!_.value.trim(),onClick:w},{default:k(()=>[S(g(e(t)("common.ok")),1)]),_:1},8,["loading","disabled"])]),_:1})]),default:k(()=>[x(e(Dt),{value:_.value,"onUpdate:value":d[0]||(d[0]=v=>_.value=v),placeholder:m.value,onKeydown:Mt(w,["enter"]),autofocus:""},null,8,["value","placeholder"])]),_:1},8,["show","title"]))}})})),Fa,si=F((()=>{at(),at(),Fa=$t}));export{la as _,wa as a,L as b,ti as c,pa as d,Za as f,Ya as g,ra as h,ii as i,va as l,Qa as m,si as n,ai as o,ca as p,ka as r,ha as s,Fa as t,ei as u,Wa as v,O as y};
1
+ import{n as F}from"./rolldown-runtime-M0oDzQ_3.js";import{$t as re,At as de,Cn as it,Dn as ue,Ht as Et,K as st,M as Y,Mn as St,Mt as Tt,Ot as M,Pn as k,Pt as Dt,Qn as e,Qt as W,Tn as b,V as q,Wn as $,Wt as P,Y as nt,Zt as Mt,an as z,c as Bt,dn as j,er as Pt,g as Lt,in as R,it as zt,ln as S,mn as pe,nn as A,nt as jt,on as T,rn as f,rr as g,t as I,un as x,xn as It,yn as Ut}from"./ui-vendor-dYn1tJGA.js";import{_ as Nt,c as U,g as Ot,l as N}from"./vue-vendor-DZ4A_GHn.js";import{a as lt,f as K,n as H,o as ot,s as rt,t as V,u as Rt}from"./_plugin-vue_export-helper-CwNymSRn.js";import{P as ut,j as ct}from"./index-DW8M4rjb.js";import{i as At,n as qt,r as Kt,t as Ht}from"./monaco-editor-YM0cdSGX.js";import{n as Vt,t as Xt}from"./clipboard-1NPxC3YL.js";import{a as Gt,c as Jt,n as Wt,s as Yt,t as Qt}from"./MarkdownRenderer-BlxKlSHX.js";async function dt(i=""){const n=new URLSearchParams;i&&n.set("path",i);const t=n.toString();return K(`/api/hermes/files/list${t?`?${t}`:""}`)}async function ne(i){return K(`/api/hermes/files/read?path=${encodeURIComponent(i)}`)}async function _e(i,n){await K("/api/hermes/files/write",{method:"PUT",body:JSON.stringify({path:i,content:n})})}async function Zt(i,n=!1){await K("/api/hermes/files/delete",{method:"DELETE",body:JSON.stringify({path:i,recursive:n})})}async function ea(i,n){await K("/api/hermes/files/rename",{method:"POST",body:JSON.stringify({oldPath:i,newPath:n})})}async function ta(i){await K("/api/hermes/files/mkdir",{method:"POST",body:JSON.stringify({path:i})})}async function aa(i,n){await K("/api/hermes/files/copy",{method:"POST",body:JSON.stringify({srcPath:i,destPath:n})})}async function ia(i,n){const t=rt(),s=new FormData;for(const w of n)s.append("file",w);const a=new URLSearchParams;i&&a.set("path",i);const l=a.toString(),c=`${t}/api/hermes/files/upload${l?`?${l}`:""}`,_={},p=ot();p&&(_.Authorization=`Bearer ${p}`);const u=lt();u&&(_["X-Hermes-Profile"]=u);const m=await fetch(c,{method:"POST",headers:_,body:s});if(!m.ok){const w=await m.json().catch(()=>({error:`HTTP ${m.status}`}));throw new Error(w.error||`Upload failed: ${m.status}`)}return(await m.json()).files}function sa(i,n){const t=rt(),s=new URLSearchParams({path:i});n&&s.set("name",n);const a=lt();a&&s.set("profile",a);const l=ot();return l&&s.set("token",l),`${t}/api/hermes/download?${s.toString()}`}var ce=F((()=>{Rt()}));function fe(i){const n=i.split("/").pop()||"",t=oe[n];return t||ft[Q(n)]||"plaintext"}function Q(i){const n=i.lastIndexOf(".");return n>=0?i.slice(n).toLowerCase():""}function pt(i){return ht.has(Q(i))}function _t(i){const n=Q(i);return n===".md"||n===".markdown"}function G(i){const n=i.split("/").pop()||"";return vt.has(n)||n.startsWith(".env.")?!0:mt.has(Q(n))}function le(i){return pt(i)||_t(i)||G(i)}function J(i,n,t){return!!(i===n||t&&i.startsWith(n+"/"))}var ft,oe,vt,mt,ht,L,O=F((()=>{Nt(),P(),ce(),ft={".js":"javascript",".jsx":"javascript",".ts":"typescript",".tsx":"typescript",".json":"json",".jsonc":"json",".html":"html",".htm":"html",".css":"css",".scss":"scss",".less":"less",".md":"markdown",".markdown":"markdown",".py":"python",".yaml":"yaml",".yml":"yaml",".xml":"xml",".sh":"shell",".bash":"shell",".zsh":"shell",".sql":"sql",".go":"go",".rs":"rust",".java":"java",".c":"c",".h":"c",".cpp":"cpp",".hpp":"cpp",".toml":"ini",".ini":"ini",".env":"ini",".vue":"html",".dockerfile":"dockerfile",".graphql":"graphql",".lua":"lua",".r":"r",".rb":"ruby",".php":"php",".swift":"swift",".kt":"kotlin"},oe={Dockerfile:"dockerfile",Makefile:"makefile","CMakeLists.txt":"cmake",".gitignore":"gitignore",".dockerignore":"gitignore"},vt=new Set([...Object.keys(oe),"README","LICENSE","NOTICE","CHANGELOG","CONTRIBUTING"]),mt=new Set([".txt",".text",".log",".csv",".tsv",".js",".jsx",".mjs",".cjs",".ts",".tsx",".mts",".cts",".json",".jsonc",".html",".htm",".css",".scss",".less",".md",".markdown",".py",".pyw",".yaml",".yml",".xml",".sh",".bash",".zsh",".fish",".sql",".go",".rs",".java",".c",".h",".cpp",".hpp",".cc",".cxx",".hh",".hxx",".toml",".ini",".env",".conf",".cfg",".properties",".vue",".svelte",".astro",".dockerfile",".graphql",".gql",".lua",".r",".rb",".php",".swift",".kt",".kts",".diff",".patch",".lock"]),ht=new Set([".png",".jpg",".jpeg",".gif",".svg",".webp",".bmp",".ico"]),L=Ot("files",()=>{const i=$(""),n=$([]),t=$(!1),s=$("name"),a=$("asc"),l=$(null),c=$(null),_=A(()=>i.value?i.value.split("/").filter(Boolean):[]),p=A(()=>{const o=[...n.value];return o.sort((r,E)=>{if(r.isDir!==E.isDir)return r.isDir?-1:1;let D=0;switch(s.value){case"name":D=r.name.localeCompare(E.name);break;case"size":D=r.size-E.size;break;case"modTime":D=r.modTime.localeCompare(E.modTime);break}return a.value==="asc"?D:-D}),o});async function u(o){o!==void 0&&o!==i.value&&(c.value=null),o!==void 0&&(i.value=o),t.value=!0;try{n.value=(await dt(i.value)).entries}catch(r){throw console.error("Failed to fetch files:",r),r}finally{t.value=!1}}function m(o){return u(o)}function w(){const o=i.value.split("/").filter(Boolean);return o.pop(),u(o.join("/"))}async function B(o){const r=await ne(o);l.value={path:o,content:r.content,originalContent:r.content,language:fe(o)}}async function d(){l.value&&(await _e(l.value.path,l.value.content),l.value.originalContent=l.value.content)}function v(){l.value=null}async function h(o){if(pt(o.name))c.value={path:o.path,type:"image"};else if(_t(o.name)){const r=await ne(o.path);c.value={path:o.path,type:"markdown",content:r.content}}else if(G(o.name)){const r=await ne(o.path);c.value={path:o.path,type:"text",content:r.content,language:fe(o.path)}}}function C(){c.value=null}async function y(o){const r=i.value?`${i.value}/${o}`:o;await ta(r),await u()}async function X(o){const r=i.value?`${i.value}/${o}`:o;await _e(r,""),await u()}async function Z(o){await Zt(o.path,o.isDir),c.value&&J(c.value.path,o.path,o.isDir)&&(c.value=null),l.value&&J(l.value.path,o.path,o.isDir)&&(l.value=null),await u()}async function ee(o,r){const E=o.path.includes("/")?o.path.slice(0,o.path.lastIndexOf("/")):"",D=E?`${E}/${r}`:r;await ea(o.path,D),c.value&&J(c.value.path,o.path,o.isDir)&&(c.value=null),l.value&&J(l.value.path,o.path,o.isDir)&&(l.value=null),await u()}async function te(o,r){await aa(o.path,r),await u()}async function ae(o){await ia(i.value,o),await u()}function ie(o){s.value===o?a.value=a.value==="asc"?"desc":"asc":(s.value=o,a.value="asc")}return{currentPath:i,entries:n,loading:t,sortBy:s,sortOrder:a,editingFile:l,previewFile:c,pathSegments:_,sortedEntries:p,hasUnsavedChanges:A(()=>l.value?l.value.content!==l.value.originalContent:!1),fetchEntries:u,navigateTo:m,navigateUp:w,openEditor:B,saveEditor:d,closeEditor:v,openPreview:h,closePreview:C,createDir:y,createFile:X,deleteEntry:Z,renameEntry:ee,copyEntry:te,uploadFiles:ae,setSort:ie}})})),ve,gt,me=F((()=>{P(),I(),U(),O(),ce(),ve={class:"file-tree"},gt=j({__name:"FileTree",setup(i){const{t:n}=N(),t=L(),s=$([]),a=$([]);async function l(u){try{return(await dt(u)).entries.filter(m=>m.isDir).sort((m,w)=>m.name.localeCompare(w.name)).map(m=>({key:m.path,label:m.name,isLeaf:!1}))}catch{return[]}}async function c(u){u.children=await l(u.key)}function _(u){u.length>0&&(a.value=u,t.navigateTo(u[0]))}function p(){a.value=[],t.navigateTo("")}return it(async()=>{s.value=await l("")}),(u,m)=>(b(),T("div",ve,[f("div",{class:"tree-header",onClick:p},[m[0]||(m[0]=f("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[f("path",{d:"M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"}),f("polyline",{points:"9 22 9 12 15 12 15 22"})],-1)),f("span",null,g(e(n)("files.breadcrumbRoot")),1)]),x(e(Bt),{data:s.value,"selected-keys":a.value,"on-load":c,"expand-on-click":"","block-line":"","onUpdate:selectedKeys":_},null,8,["data","selected-keys"])]))}})})),na=F((()=>{})),la,Wa=F((()=>{me(),me(),na(),H(),la=V(gt,[["__scopeId","data-v-7f00b3bc"]])})),he,wt,ge=F((()=>{P(),U(),I(),O(),he={class:"file-breadcrumb"},wt=j({__name:"FileBreadcrumb",setup(i){const{t:n}=N(),t=L();function s(a){if(a<0)t.navigateTo("");else{const l=t.pathSegments.slice(0,a+1).join("/");t.navigateTo(l)}}return(a,l)=>(b(),T("div",he,[x(e(Tt),null,{default:k(()=>[x(e(de),{onClick:l[0]||(l[0]=c=>s(-1))},{default:k(()=>[S(g(e(n)("files.breadcrumbRoot")),1)]),_:1}),(b(!0),T(re,null,ue(e(t).pathSegments,(c,_)=>(b(),R(e(de),{key:_,onClick:p=>s(_)},{default:k(()=>[S(g(c),1)]),_:2},1032,["onClick"]))),128))]),_:1})]))}})})),oa=F((()=>{})),ra,Ya=F((()=>{ge(),ge(),oa(),H(),ra=V(wt,[["__scopeId","data-v-061302de"]])})),we,yt,ye=F((()=>{P(),I(),U(),O(),we={class:"file-toolbar"},yt=j({__name:"FileToolbar",emits:["showNewFile","showNewFolder","showUpload"],setup(i,{emit:n}){const{t}=N(),s=q(),a=L(),l=n;async function c(){try{await a.fetchEntries()}catch{s.error(t("files.backendError"))}}return(_,p)=>(b(),T("div",we,[x(e(Y),{size:8,wrap:!0,class:"toolbar-space"},{default:k(()=>[x(e(M),{size:"small",onClick:p[0]||(p[0]=u=>l("showNewFile")),class:"toolbar-btn"},{default:k(()=>[S(g(e(t)("files.newFile")),1)]),_:1}),x(e(M),{size:"small",onClick:p[1]||(p[1]=u=>l("showNewFolder")),class:"toolbar-btn"},{default:k(()=>[S(g(e(t)("files.newFolder")),1)]),_:1}),x(e(M),{size:"small",onClick:p[2]||(p[2]=u=>l("showUpload")),class:"toolbar-btn"},{default:k(()=>[S(g(e(t)("files.upload")),1)]),_:1}),x(e(M),{size:"small",onClick:c,class:"toolbar-btn"},{default:k(()=>[S(g(e(t)("files.refresh")),1)]),_:1})]),_:1})]))}})})),ua=F((()=>{})),ca,Qa=F((()=>{ye(),ye(),ua(),H(),ca=V(yt,[["__scopeId","data-v-64269d74"]])})),ke,Fe,be,Ce,xe,$e,Ee,Se,Te,De,Me,Be,Pe,kt,Le=F((()=>{P(),I(),U(),O(),ut(),ke={class:"file-list"},Fe={key:1,class:"file-list-items"},be={class:"file-list-header file-list-grid"},Ce={key:0,class:"sort-indicator"},xe={key:0,class:"sort-indicator"},$e={key:0,class:"sort-indicator"},Ee=["onDblclick","onContextmenu"],Se={class:"file-name"},Te={class:"file-icon"},De={class:"file-label"},Me={class:"file-size"},Be={class:"file-date"},Pe={class:"file-actions"},kt=j({__name:"FileList",emits:["contextmenu-entry"],setup(i,{emit:n}){const{t}=N(),s=q(),a=L(),l=n;function c(d){if(d===0)return"—";const v=["B","KB","MB","GB"];let h=0,C=d;for(;C>=1024&&h<v.length-1;)C/=1024,h++;return`${C.toFixed(h===0?0:1)} ${v[h]}`}function _(d){return d?new Date(d).toLocaleString():"—"}function p(d){return d.isDir?"📁":{yaml:"⚙️",yml:"⚙️",json:"📋",toml:"⚙️",md:"📝",txt:"📄",log:"📄",py:"🐍",js:"📜",ts:"📜",vue:"💚",png:"🖼️",jpg:"🖼️",jpeg:"🖼️",gif:"🖼️",svg:"🖼️",webp:"🖼️",zip:"📦",gz:"📦",tar:"📦",sh:"⚡",bash:"⚡"}[d.name.split(".").pop()?.toLowerCase()||""]||"📄"}async function u(d){try{await a.openPreview(d)}catch{s.error(t("files.backendError"))}}async function m(d){d.isDir?a.navigateTo(d.path):G(d.name)?await a.openEditor(d.path):le(d.name)&&await u(d)}function w(d,v){d.preventDefault(),l("contextmenu-entry",d,v)}async function B(d){try{await ct(d.path,d.name)}catch(v){s.error(v.message||t("files.backendError"))}}return(d,v)=>(b(),T("div",ke,[x(e(Lt),{show:e(a).loading},{default:k(()=>[!e(a).loading&&e(a).sortedEntries.length===0?(b(),R(e(Et),{key:0,description:e(t)("files.emptyDir")},null,8,["description"])):(b(),T("div",Fe,[f("div",be,[f("div",{class:"file-name sort-header",onClick:v[0]||(v[0]=h=>e(a).setSort("name"))},[S(g(e(t)("files.name"))+" ",1),e(a).sortBy==="name"?(b(),T("span",Ce,g(e(a).sortOrder==="asc"?"↑":"↓"),1)):z("",!0)]),f("div",{class:"file-size sort-header",onClick:v[1]||(v[1]=h=>e(a).setSort("size"))},[S(g(e(t)("files.size"))+" ",1),e(a).sortBy==="size"?(b(),T("span",xe,g(e(a).sortOrder==="asc"?"↑":"↓"),1)):z("",!0)]),f("div",{class:"file-date sort-header",onClick:v[2]||(v[2]=h=>e(a).setSort("modTime"))},[S(g(e(t)("files.modified"))+" ",1),e(a).sortBy==="modTime"?(b(),T("span",$e,g(e(a).sortOrder==="asc"?"↑":"↓"),1)):z("",!0)]),v[3]||(v[3]=f("div",{class:"file-actions-placeholder"},null,-1))]),(b(!0),T(re,null,ue(e(a).sortedEntries,h=>(b(),T("div",{key:h.path,class:"file-list-row file-list-grid",onDblclick:C=>m(h),onContextmenu:C=>w(C,h)},[f("div",Se,[f("span",Te,g(p(h)),1),f("span",De,g(h.name),1)]),f("div",Me,g(h.isDir?"—":c(h.size)),1),f("div",Be,g(_(h.modTime)),1),f("div",Pe,[e(le)(h.name)&&!h.isDir?(b(),R(e(M),{key:0,size:"tiny",quaternary:"",onClick:W(C=>u(h),["stop"]),title:e(t)("files.preview")},{default:k(()=>[...v[4]||(v[4]=[S("👁️",-1)])]),_:1},8,["onClick","title"])):z("",!0),e(G)(h.name)&&!h.isDir?(b(),R(e(M),{key:1,size:"tiny",quaternary:"",onClick:W(C=>e(a).openEditor(h.path),["stop"]),title:e(t)("files.edit")},{default:k(()=>[...v[5]||(v[5]=[S("✏️",-1)])]),_:1},8,["onClick","title"])):z("",!0),h.isDir?z("",!0):(b(),R(e(M),{key:2,size:"tiny",quaternary:"",onClick:W(C=>B(h),["stop"]),title:e(t)("files.download")},{default:k(()=>[...v[6]||(v[6]=[S("⬇️",-1)])]),_:1},8,["onClick","title"]))])],40,Ee))),128))]))]),_:1},8,["show"])]))}})})),da=F((()=>{})),pa,Za=F((()=>{Le(),Le(),da(),H(),pa=V(kt,[["__scopeId","data-v-3fb1b38b"]])}));function _a(i){return i.absolutePath||i.path}var fa=F((()=>{})),Ft,ze=F((()=>{P(),I(),U(),O(),ut(),Vt(),fa(),Ft=j({__name:"FileContextMenu",emits:["rename"],setup(i,{expose:n,emit:t}){const{t:s}=N(),a=q(),l=nt(),c=L(),_=$(!1),p=$(0),u=$(0),m=$(null),w=t;function B(C,y){m.value=y,p.value=C.clientX,u.value=C.clientY,_.value=!1,Ut(()=>{_.value=!0})}function d(){const C=m.value;if(!C)return[];const y=[];return C.isDir?y.push({label:s("files.open"),key:"open"}):(G(C.name)&&y.push({label:s("files.edit"),key:"edit"}),le(C.name)&&y.push({label:s("files.preview"),key:"preview"}),y.push({label:s("files.download"),key:"download"})),y.push({type:"divider",key:"d1"}),y.push({label:s("files.copyPath"),key:"copyPath"}),y.push({label:s("files.rename"),key:"rename"}),y.push({type:"divider",key:"d2"}),y.push({label:s("files.delete"),key:"delete"}),y}async function v(C){_.value=!1;const y=m.value;if(y)switch(C){case"open":c.navigateTo(y.path);break;case"edit":try{await c.openEditor(y.path)}catch{a.error(s("files.backendError"))}break;case"preview":try{await c.openPreview(y)}catch{a.error(s("files.backendError"))}break;case"download":try{await ct(y.path,y.name)}catch(X){a.error(X.message)}break;case"copyPath":await Xt(_a(y))?a.success(s("files.pathCopied")):a.error(s("files.pathCopied")+" ✗");break;case"rename":w("rename",y);break;case"delete":l.warning({title:s("files.delete"),content:y.isDir?s("files.confirmDeleteDir",{name:y.name}):s("files.confirmDelete",{name:y.name}),positiveText:s("common.delete"),negativeText:s("common.cancel"),onPositiveClick:async()=>{try{await c.deleteEntry(y),a.success(s("files.deleted"))}catch{a.error(s("files.deleteFailed"))}}});break}}function h(){_.value=!1}return n({show:B}),(C,y)=>(b(),R(e(jt),{show:_.value,x:p.value,y:u.value,options:d(),placement:"bottom-start",trigger:"manual",onSelect:v,onClickoutside:h},null,8,["show","x","y","options"]))}})})),va,ei=F((()=>{ze(),ze(),va=Ft})),je,Ie,Ue,bt,Ne=F((()=>{P(),I(),U(),O(),Ht(),je={class:"file-editor"},Ie={class:"editor-header"},Ue={class:"editor-filename"},bt=j({__name:"FileEditor",setup(i){self.MonacoEnvironment={getWorker(m,w){return new Worker(new URL("/assets/editor.worker-D9luhcDD.js",""+import.meta.url),{type:"module"})}};const{t:n}=N(),t=q(),s=nt(),a=L(),l=$(null);let c=null;const _=$(!1);it(()=>{!l.value||!a.editingFile||(c=At.create(l.value,{value:a.editingFile.content,language:a.editingFile.language,theme:document.documentElement.classList.contains("dark")?"vs-dark":"vs",minimap:{enabled:!1},fontSize:13,lineNumbers:"on",scrollBeyondLastLine:!1,automaticLayout:!0,tabSize:2,wordWrap:"on"}),c.onDidChangeModelContent(()=>{a.editingFile&&(a.editingFile.content=c.getValue())}),c.addCommand(Kt.CtrlCmd|qt.KeyS,()=>{p()}))}),It(()=>{c?.dispose(),c=null});async function p(){_.value=!0;try{await a.saveEditor(),t.success(n("files.saved"))}catch{t.error(n("files.saveFailed"))}finally{_.value=!1}}function u(){a.hasUnsavedChanges?s.warning({title:n("files.unsavedChanges"),positiveText:n("common.ok"),negativeText:n("common.cancel"),onPositiveClick:()=>{a.closeEditor()}}):a.closeEditor()}return(m,w)=>(b(),T("div",je,[f("div",Ie,[f("span",Ue,g(e(a).editingFile?.path),1),x(e(Y),null,{default:k(()=>[x(e(M),{size:"small",type:"primary",loading:_.value,onClick:p},{default:k(()=>[S(g(e(n)("files.saveFile")),1)]),_:1},8,["loading"]),x(e(M),{size:"small",onClick:u},{default:k(()=>[S(g(e(n)("files.closeEditor")),1)]),_:1})]),_:1})]),f("div",{ref_key:"editorContainer",ref:l,class:"editor-container"},null,512)]))}})})),ma=F((()=>{})),ha,ti=F((()=>{Ne(),Ne(),ma(),H(),ha=V(bt,[["__scopeId","data-v-1ae26b53"]])})),Oe,Re,Ae,qe,Ke,He,Ve,Ct,Xe=F((()=>{P(),I(),U(),O(),ce(),Wt(),Yt(),Oe={key:0,class:"file-preview"},Re={class:"preview-header"},Ae={class:"preview-filename"},qe={class:"preview-content"},Ke=["src","alt"],He={key:1,class:"preview-markdown"},Ve=["innerHTML"],Ct=j({__name:"FilePreview",setup(i){const{t:n}=N(),t=q(),s=L();function a(){return s.previewFile?sa(s.previewFile.path):""}const l=A(()=>{const p=s.previewFile;return!p||p.type!=="text"?"":Jt(p.content||"",p.language,n("common.copy"),{maxHighlightLength:2e5})});async function c(p){const u=await Gt(p);u?t.success(n("common.copied")):u===!1&&t.error(n("chat.copyFailed"))}const _=()=>pe("svg",{viewBox:"0 0 24 24",width:"14",height:"14",fill:"currentColor"},[pe("path",{d:"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"})]);return(p,u)=>e(s).previewFile?(b(),T("div",Oe,[f("div",Re,[f("span",Ae,g(e(s).previewFile.path),1),x(e(M),{size:"small",quaternary:"",onClick:u[0]||(u[0]=m=>e(s).closePreview())},{icon:k(()=>[x(e(zt),null,{default:k(()=>[x(_)]),_:1})]),default:k(()=>[S(" "+g(e(n)("files.closePreview")),1)]),_:1})]),f("div",qe,[e(s).previewFile.type==="image"?(b(),T("img",{key:0,src:a(),class:"preview-image",alt:e(s).previewFile.path},null,8,Ke)):e(s).previewFile.type==="markdown"?(b(),T("div",He,[x(Qt,{content:e(s).previewFile.content||""},null,8,["content"])])):e(s).previewFile.type==="text"?(b(),T("div",{key:2,class:"preview-code",innerHTML:l.value,onClick:c},null,8,Ve)):z("",!0)])])):z("",!0)}})})),ga=F((()=>{})),wa,ai=F((()=>{Xe(),Xe(),ga(),H(),wa=V(Ct,[["__scopeId","data-v-91416733"]])})),Ge,Je,We,Ye,Qe,Ze,et,xt,tt=F((()=>{P(),I(),U(),O(),Ge={class:"upload-panel"},Je={class:"upload-title"},We={key:0,class:"selected-files"},Ye={class:"selected-file__meta"},Qe={class:"selected-file__name"},Ze={class:"selected-file__size"},et=["onClick"],xt=j({__name:"FileUploadModal",props:{show:{type:Boolean}},emits:["update:show"],setup(i,{emit:n}){const{t}=N(),s=q(),a=L(),l=i,c=n,_=$(!1),p=$(!1),u=$(0),m=$(null),w=$([]),B=A(()=>w.value.length>0);function d(r){return`${r.name}:${r.size}:${r.lastModified}`}function v(r){const E=new Set(w.value.map(d)),D=r.filter(se=>!E.has(d(se)));D.length!==0&&(w.value=[...w.value,...D])}function h(){m.value?.click()}function C(r){const E=r.target;E.files&&(v(Array.from(E.files)),E.value="")}function y(r){r.preventDefault(),r.dataTransfer&&(r.dataTransfer.dropEffect="copy")}function X(r){r.preventDefault(),r.dataTransfer?.types.includes("Files")&&(u.value+=1,p.value=!0)}function Z(r){r.preventDefault(),u.value=Math.max(0,u.value-1),u.value===0&&(p.value=!1)}function ee(r){r.preventDefault(),u.value=0,p.value=!1;const E=Array.from(r.dataTransfer?.files||[]);E.length!==0&&v(E)}function te(r){w.value=w.value.filter((E,D)=>D!==r)}function ae(r){return r<1024?`${r} B`:r<1024*1024?`${(r/1024).toFixed(1)} KB`:`${(r/(1024*1024)).toFixed(1)} MB`}async function ie(){if(w.value.length!==0){_.value=!0;try{await a.uploadFiles(w.value),s.success(t("files.uploadSuccess",{count:w.value.length})),w.value=[],c("update:show",!1)}catch(r){s.error(r.message||t("files.uploadFailed"))}finally{_.value=!1}}}function o(){u.value=0,p.value=!1,w.value=[],c("update:show",!1)}return(r,E)=>(b(),R(e(st),{show:l.show,preset:"dialog",title:e(t)("files.upload"),"onUpdate:show":o,style:{width:"560px"}},{action:k(()=>[x(e(Y),null,{default:k(()=>[x(e(M),{onClick:o},{default:k(()=>[S(g(e(t)("common.cancel")),1)]),_:1}),x(e(M),{type:"primary",loading:_.value,disabled:!B.value,onClick:ie},{default:k(()=>[S(g(e(t)("files.upload"))+" ("+g(w.value.length)+") ",1)]),_:1},8,["loading","disabled"])]),_:1})]),default:k(()=>[f("div",Ge,[f("input",{ref_key:"fileInputRef",ref:m,type:"file",multiple:"",class:"file-input-hidden",onChange:C},null,544),f("div",{class:Pt(["upload-dropzone",{"drag-over":p.value}]),onClick:h,onDragover:y,onDragenter:X,onDragleave:Z,onDrop:ee},[E[0]||(E[0]=f("div",{class:"upload-icon","aria-hidden":"true"},[f("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.8"},[f("path",{d:"M12 16V5"}),f("path",{d:"M8 9l4-4 4 4"}),f("path",{d:"M20 16.5v1.5A2 2 0 0 1 18 20H6a2 2 0 0 1-2-2v-1.5"})])],-1)),f("p",Je,g(e(t)("files.dragDropHint")),1),x(e(M),{type:"primary",secondary:"",onClick:W(h,["stop"])},{default:k(()=>[S(g(e(t)("files.upload")),1)]),_:1})],34),B.value?(b(),T("div",We,[(b(!0),T(re,null,ue(w.value,(D,se)=>(b(),T("div",{key:d(D),class:"selected-file"},[f("div",Ye,[f("span",Qe,g(D.name),1),f("span",Ze,g(ae(D.size)),1)]),f("button",{type:"button",class:"selected-file__remove",onClick:ba=>te(se)}," × ",8,et)]))),128))])):z("",!0)])]),_:1},8,["show","title"]))}})})),ya=F((()=>{})),ka,ii=F((()=>{tt(),tt(),ya(),H(),ka=V(xt,[["__scopeId","data-v-4de50ce7"]])})),$t,at=F((()=>{P(),I(),U(),O(),$t=j({__name:"FileRenameModal",props:{show:{type:Boolean},mode:{},entry:{}},emits:["update:show"],setup(i,{emit:n}){const{t}=N(),s=q(),a=L(),l=i,c=n,_=$(""),p=$(!1);St(()=>l.show,B=>{B&&(l.mode==="rename"&&l.entry?_.value=l.entry.name:_.value="")});const u=A(()=>{switch(l.mode){case"newFile":return t("files.newFile");case"newFolder":return t("files.newFolder");case"rename":return t("files.rename")}}),m=A(()=>{switch(l.mode){case"newFile":return t("files.newFileName");case"newFolder":return t("files.newFolderName");case"rename":return t("files.renameTo")}});async function w(){if(_.value.trim()){p.value=!0;try{switch(l.mode){case"newFile":await a.createFile(_.value.trim()),s.success(t("files.created"));break;case"newFolder":await a.createDir(_.value.trim()),s.success(t("files.created"));break;case"rename":l.entry&&(await a.renameEntry(l.entry,_.value.trim()),s.success(t("files.renamed")));break}c("update:show",!1)}catch(B){const d=l.mode==="rename"?t("files.renameFailed"):t("files.createFailed");s.error(B.message||d)}finally{p.value=!1}}}return(B,d)=>(b(),R(e(st),{show:l.show,preset:"dialog",title:u.value,"onUpdate:show":d[2]||(d[2]=v=>c("update:show",!1)),style:{width:"400px"}},{action:k(()=>[x(e(Y),null,{default:k(()=>[x(e(M),{onClick:d[1]||(d[1]=v=>c("update:show",!1))},{default:k(()=>[S(g(e(t)("common.cancel")),1)]),_:1}),x(e(M),{type:"primary",loading:p.value,disabled:!_.value.trim(),onClick:w},{default:k(()=>[S(g(e(t)("common.ok")),1)]),_:1},8,["loading","disabled"])]),_:1})]),default:k(()=>[x(e(Dt),{value:_.value,"onUpdate:value":d[0]||(d[0]=v=>_.value=v),placeholder:m.value,onKeydown:Mt(w,["enter"]),autofocus:""},null,8,["value","placeholder"])]),_:1},8,["show","title"]))}})})),Fa,si=F((()=>{at(),at(),Fa=$t}));export{la as _,wa as a,L as b,ti as c,pa as d,Za as f,Ya as g,ra as h,ii as i,va as l,Qa as m,si as n,ai as o,ca as p,ka as r,ha as s,Fa as t,ei as u,Wa as v,O as y};
@@ -1 +1 @@
1
- import{n as p}from"./rolldown-runtime-M0oDzQ_3.js";import{Cn as k,Qn as F,Tn as r,Wn as n,Wt as N,dn as B,in as f,on as C,rn as v,un as i}from"./ui-vendor-dYn1tJGA.js";import{n as E,t as U}from"./_plugin-vue_export-helper-uEMLHKI8.js";import{X as P,Y as T}from"./index-1yNqMnGv.js";import{_ as L,a as W,b as I,c as Q,d as X,f as Y,g as $,h as j,i as q,l as z,m as A,n as D,o as G,p as H,r as J,s as K,t as O,u as Z,v as ee,y as ie}from"./FileRenameModal-BmQIUMYK.js";var w,c,h,y,x,M=p((()=>{N(),ie(),T(),ee(),$(),A(),Y(),Z(),Q(),G(),q(),D(),w={class:"files-view"},c={class:"files-tree-panel"},h={class:"files-main-panel"},y={class:"files-content"},x=B({__name:"FilesView",setup(ae){const u=I(),_=P(),m=n(null),d=n(!1),l=n(!1),t=n("newFile"),a=n(null);function g(o,e){m.value?.show(o,e)}function R(){t.value="newFile",a.value=null,l.value=!0}function S(){t.value="newFolder",a.value=null,l.value=!0}function b(o){t.value="rename",a.value=o,l.value=!0}async function V(){(!_.activeProfileName||_.profiles.length===0)&&await _.fetchProfiles(),await u.fetchEntries("")}return k(()=>{V()}),(o,e)=>(r(),C("div",w,[v("div",c,[i(L)]),v("div",h,[i(H,{onShowNewFile:R,onShowNewFolder:S,onShowUpload:e[0]||(e[0]=s=>d.value=!0)}),i(j),v("div",y,[F(u).editingFile?(r(),f(K,{key:0})):F(u).previewFile?(r(),f(W,{key:1})):(r(),f(X,{key:2,onContextmenuEntry:g}))])]),i(z,{ref_key:"contextMenuRef",ref:m,onRename:b},null,512),i(J,{show:d.value,"onUpdate:show":e[1]||(e[1]=s=>d.value=s)},null,8,["show"]),i(O,{show:l.value,"onUpdate:show":e[2]||(e[2]=s=>l.value=s),mode:t.value,entry:a.value},null,8,["show","mode","entry"])]))}})})),le=p((()=>{})),ne,te=p((()=>{M(),M(),le(),E(),ne=U(x,[["__scopeId","data-v-89d440cf"]])}));te();export{ne as default};
1
+ import{n as p}from"./rolldown-runtime-M0oDzQ_3.js";import{Cn as k,Qn as F,Tn as r,Wn as n,Wt as N,dn as B,in as f,on as C,rn as v,un as i}from"./ui-vendor-dYn1tJGA.js";import{n as E,t as U}from"./_plugin-vue_export-helper-CwNymSRn.js";import{X as P,Y as T}from"./index-DW8M4rjb.js";import{_ as L,a as W,b as I,c as Q,d as X,f as Y,g as $,h as j,i as q,l as z,m as A,n as D,o as G,p as H,r as J,s as K,t as O,u as Z,v as ee,y as ie}from"./FileRenameModal-DhB_Oy1Y.js";var w,c,h,y,x,M=p((()=>{N(),ie(),T(),ee(),$(),A(),Y(),Z(),Q(),G(),q(),D(),w={class:"files-view"},c={class:"files-tree-panel"},h={class:"files-main-panel"},y={class:"files-content"},x=B({__name:"FilesView",setup(ae){const u=I(),_=P(),m=n(null),d=n(!1),l=n(!1),t=n("newFile"),a=n(null);function g(o,e){m.value?.show(o,e)}function R(){t.value="newFile",a.value=null,l.value=!0}function S(){t.value="newFolder",a.value=null,l.value=!0}function b(o){t.value="rename",a.value=o,l.value=!0}async function V(){(!_.activeProfileName||_.profiles.length===0)&&await _.fetchProfiles(),await u.fetchEntries("")}return k(()=>{V()}),(o,e)=>(r(),C("div",w,[v("div",c,[i(L)]),v("div",h,[i(H,{onShowNewFile:R,onShowNewFolder:S,onShowUpload:e[0]||(e[0]=s=>d.value=!0)}),i(j),v("div",y,[F(u).editingFile?(r(),f(K,{key:0})):F(u).previewFile?(r(),f(W,{key:1})):(r(),f(X,{key:2,onContextmenuEntry:g}))])]),i(z,{ref_key:"contextMenuRef",ref:m,onRename:b},null,512),i(J,{show:d.value,"onUpdate:show":e[1]||(e[1]=s=>d.value=s)},null,8,["show"]),i(O,{show:l.value,"onUpdate:show":e[2]||(e[2]=s=>l.value=s),mode:t.value,entry:a.value},null,8,["show","mode","entry"])]))}})})),le=p((()=>{})),ne,te=p((()=>{M(),M(),le(),E(),ne=U(x,[["__scopeId","data-v-89d440cf"]])}));te();export{ne as default};
@@ -1,4 +1,4 @@
1
- import{n as K}from"./rolldown-runtime-M0oDzQ_3.js";import{$t as $e,Bt as ms,Cn as qe,Dn as ze,E as Ye,Fn as ps,Kt as gs,M as et,Mn as lt,Ot as J,Pn as P,Pt as Be,Qn as o,Qt as De,St as fs,Tn as C,V as Gn,Wn as x,Wt as Ge,Yt as hs,Zt as rt,an as U,bt as _s,dn as je,en as wt,er as ee,in as Me,ln as H,m as ys,mt as Cs,nn as R,nr as it,nt as ks,on as w,ot as mt,rn as t,rr as g,t as ut,un as S,w as xt,wn as Hn,xn as ws,yn as We}from"./ui-vendor-dYn1tJGA.js";import{_ as xs,c as tt,f as Vn,g as bs,l as ot,m as Jn,p as Is}from"./vue-vendor-DZ4A_GHn.js";import{f as de,n as Xe,o as at,s as Ct,t as Qe,u as Kn}from"./_plugin-vue_export-helper-uEMLHKI8.js";import{M as Ss,j as Ms}from"./vendor-B1Lfatlz.js";import{J as Yn,N as Wn,P as qn,X as Xn,Y as Qn,b as $s,o as Rs,q as Oe,tt as Ts,u as As,x as Ns,y as Ps}from"./index-1yNqMnGv.js";import{n as Ds,t as Bs}from"./clipboard-1NPxC3YL.js";import{i as Zn,n as Us,r as es,t as Fs}from"./VirtualMessageList-BNu9wFPU.js";import{a as Ls,i as Es,n as Os,o as zs,r as js,s as Gs,t as Hs}from"./ttsHelpers-CzQCvABU.js";import{a as Vs,c as Js,i as Ks,n as Ys,o as Ws,r as pt,s as qs,t as bt}from"./MarkdownRenderer-Jwbx4dOP.js";function Xs(c){if(ye?.connected)return ye;const e=at(),u=c?.userId||localStorage.getItem("gc_user_id")||ts();return localStorage.setItem("gc_user_id",u),ye=Ss("/group-chat",{auth:{token:e||void 0,userId:u,name:c?.userName||localStorage.getItem("gc_user_name")||void 0,description:c?.description||localStorage.getItem("gc_user_description")||void 0,authUserId:c?.authUserId},transports:["websocket","polling"],reconnection:!0,reconnectionAttempts:1/0,reconnectionDelay:1e3,reconnectionDelayMax:3e4,randomizationFactor:.5,timeout:3e4}),ye}function Qs(){let c=localStorage.getItem("gc_user_id");return c||(c=ts(),localStorage.setItem("gc_user_id",c)),c}function Zs(){return localStorage.getItem("gc_user_name")}function ts(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,c=>{const e=Math.random()*16|0;return(c==="x"?e:e&3|8).toString(16)})}function Ke(){return ye?.connected?ye:null}function el(){ye&&(ye.disconnect(),ye=null)}async function tl(c){return de("/api/hermes/group-chat/rooms",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(c)})}async function ol(c,e){return de(`/api/hermes/group-chat/rooms/${c}/clone`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e||{})})}async function al(){return de("/api/hermes/group-chat/rooms")}async function gt(c,e={}){const u=new URLSearchParams;e.offset!=null&&u.set("offset",String(e.offset)),e.limit!=null&&u.set("limit",String(e.limit));const n=u.toString();return de(`/api/hermes/group-chat/rooms/${c}${n?`?${n}`:""}`)}async function nl(c){return de(`/api/hermes/group-chat/rooms/join/${c}`)}async function sl(c,e){return de(`/api/hermes/group-chat/rooms/${c}/agents`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)})}async function ll(c){return de(`/api/hermes/group-chat/rooms/${c}/agents`)}async function rl(c,e){return de(`/api/hermes/group-chat/rooms/${c}/agents/${e}`,{method:"DELETE"})}async function il(c){return de(`/api/hermes/group-chat/rooms/${c}`,{method:"DELETE"})}async function ul(c){return de(`/api/hermes/group-chat/rooms/${c}/clear-context`,{method:"POST"})}async function cl(c,e){return de(`/api/hermes/group-chat/rooms/${c}/config`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)})}async function dl(c){return de(`/api/hermes/group-chat/rooms/${c}/compress`,{method:"POST"})}async function It(c,e="json"){const u=`${Ct()}/api/hermes/group-chat/rooms/${c}/export?ext=${e}`,n=at(),l={};n&&(l.Authorization=`Bearer ${n}`);const m=await fetch(u,{headers:l});if(!m.ok)throw new Error(`Export failed: ${m.status}`);const f=await m.blob(),T=(m.headers.get("Content-Disposition")||"").match(/filename="?([^"]+)"?/)?.[1]||`room_${c.slice(0,8)}.${e}`,M=URL.createObjectURL(f),N=document.createElement("a");N.href=M,N.download=T,document.body.appendChild(N),N.click(),document.body.removeChild(N),URL.revokeObjectURL(M)}async function vl(c="json"){const e=`${Ct()}/api/hermes/group-chat/rooms/export?ext=${c}`,u=at(),n={};u&&(n.Authorization=`Bearer ${u}`);const l=await fetch(e,{headers:n});if(!l.ok)throw new Error(`Export failed: ${l.status}`);const m=await l.blob(),f=(l.headers.get("Content-Disposition")||"").match(/filename="?([^"]+)"?/)?.[1]||`all_group_chats.${c}`,T=URL.createObjectURL(m),M=document.createElement("a");M.href=T,M.download=f,document.body.appendChild(M),M.click(),document.body.removeChild(M),URL.revokeObjectURL(T)}async function ml(c){const e=`${Ct()}/api/hermes/group-chat/rooms/import`,u=at(),n={"Content-Type":"application/json"};u&&(n.Authorization=`Bearer ${u}`);const l=await c.text(),m=await fetch(e,{method:"POST",headers:n,body:l});if(!m.ok){const f=await m.text().catch(()=>"");try{const T=JSON.parse(f);throw new Error(T?.error||`Import failed: ${m.status}`)}catch{throw new Error(f||`Import failed: ${m.status}`)}}return m.json()}var ye,os=K((()=>{Ms(),Kn(),ye=null}));async function pl(c){const e=new FormData;for(const l of c)l.file&&e.append("file",l.file,l.name);const u=at(),n=await fetch("/upload",{method:"POST",body:e,headers:u?{Authorization:`Bearer ${u}`}:{}});if(!n.ok)throw new Error(`Upload failed: ${n.status}`);return(await n.json()).files}function gl(c,e,u){const n=[];c.trim()&&n.push({type:"text",text:c.trim()});for(let l=0;l<u.length;l+=1){const m=u[l],f=e[l];f?.type.startsWith("image/")?n.push({type:"image",name:m.name,path:m.path,media_type:f.type}):n.push({type:"file",name:m.name,path:m.path,media_type:f?.type})}return n}function fl(){return Date.now().toString(36)+Math.random().toString(36).slice(2,8)}function hl(c){return/^[a-zA-Z]:\\/.test(c)?c.replace(/\\/g,"/"):c}function Re(c){return!!c?.trim()}function _l(c){return!!c.tool_calls?.length}function ft(c){return c.role==="assistant"&&!Re(c.content)&&Re(c.reasoning)&&!_l(c)}function St(c,e){return{...e,content:Re(e.content)?e.content:c?.content||e.content||"",reasoning:Re(e.reasoning)?e.reasoning:c?.reasoning??e.reasoning??null,reasoning_content:Re(e.reasoning_content)?e.reasoning_content:c?.reasoning_content??e.reasoning_content??null,isStreaming:!1,attachments:c?.attachments||e.attachments}}function kt(c){return c!=null&&c!==""}function Mt(c){return kt(c)?c:void 0}function ht(c){if(!kt(c))return"";if(typeof c=="string")return c;try{const e=JSON.stringify(c);if(e!==void 0)return e}catch{}return String(c)}function yl(c){const e=new Map,u=new Map;for(const l of c)if(l.role==="assistant"&&l.tool_calls?.length)for(const m of l.tool_calls)m?.id&&(m.function?.name&&e.set(m.id,m.function.name),kt(m.function?.arguments)&&u.set(m.id,m.function.arguments));const n=[];for(const l of c)if(!(l.role!=="tool"&&!l.tool_calls?.length&&!ht(l.content).trim()&&!l.reasoning?.trim()&&(!l.isStreaming||l.finish_reason==="streaming"))){if(l.role==="assistant"&&l.tool_calls?.length&&!ht(l.content).trim()){for(const m of l.tool_calls)n.push({...l,id:`${l.id}_${m.id}`,role:"tool",content:"",toolName:m.function?.name||void 0,toolCallId:m.id,toolArgs:Mt(m.function?.arguments),toolStatus:"running"});continue}if(l.role==="tool"){const m=l.tool_call_id||"",f=l.tool_name||e.get(m)||void 0,T=u.has(m)?u.get(m):void 0;let M="";const N=ht(l.content);if(N)try{const B=typeof l.content=="string"?JSON.parse(N):l.content;M=B?.url||B?.title||B?.preview||B?.summary||""}catch{M=N.slice(0,80)}const b=n.findIndex(B=>B.role==="tool"&&B.toolCallId===m&&!B.toolResult),F={...l,id:b!==-1?n[b].id:l.id,senderId:b!==-1?n[b].senderId:l.senderId,senderName:b!==-1?n[b].senderName:l.senderName,timestamp:b!==-1?n[b].timestamp:l.timestamp,role:"tool",content:"",toolName:f||(b!==-1?n[b].toolName:void 0),toolCallId:m||void 0,toolArgs:T!==void 0?T:b!==-1?n[b].toolArgs:void 0,toolPreview:typeof M=="string"&&M.slice(0,100)||void 0,toolResult:Mt(l.content),toolStatus:"done"};b!==-1?n[b]=F:n.push(F);continue}n.push(l)}return n}var $t,nt,ct=K((()=>{xs(),Ge(),Kn(),As(),qn(),os(),$t=300,nt=bs("groupChat",()=>{const c=x(!1),e=x(null),u=x([]),n=x([]),l=x([]),m=x([]),f=x(""),T=x(!1),M=x(null),N=x(new Map),b=x(new Map),F=x(!1),B=x(new Map),E=x(0),$=x(0),D=x(!1),Y=x(!1),ne=x("");function z(){E.value=0,$.value=0,D.value=!1,Y.value=!1}function ie(i){$.value=i.messages.length,E.value=i.total??i.messages.length,D.value=i.hasMore??$.value<E.value}function q(i){F.value=i}function te(i,p){window.dispatchEvent(new CustomEvent("auto-play-speech",{detail:{messageId:i,content:p}}))}async function oe(i,p){if(e.value!==i)return;const s=n.value.findIndex(d=>d.id===p);if(!(s<0||!ft(n.value[s])))try{const d=(await gt(i)).messages.find(j=>j.id===p);if(!d||!Re(d.content))return;const k=n.value.findIndex(j=>j.id===p);if(k<0||!ft(n.value[k]))return;n.value[k]=St(n.value[k],d),n.value=[...n.value]}catch{}}function Ce(i,p){setTimeout(()=>{oe(i,p)},$t)}const se=R(()=>{for(const[,i]of b.value)return i;return null}),X=R(()=>{if(!e.value)return null;for(const i of B.value.values())if(i.roomId===e.value)return i;return null}),V=x(Qs()),ae=x(Zs()||"");function le(i,p={}){if(l.value=i.members||[],i.agents&&(m.value=i.agents),i.roomName&&(f.value=i.roomName),p.syncMessages&&Array.isArray(i.messages)){const s=new Map(n.value.map(d=>[d.id,d]));for(const d of i.messages){const k=s.get(d.id);s.set(d.id,k?{...k,...d}:d)}n.value=Array.from(s.values()).sort((d,k)=>d.timestamp-k.timestamp),typeof i.total=="number"||typeof i.hasMore=="boolean"?ie(i):($.value=Math.max($.value,n.value.length),E.value=Math.max(E.value,$.value))}for(const s of N.value.values())clearTimeout(s.timer);if(N.value.clear(),i.typingUsers)for(const s of i.typingUsers){const d=setTimeout(()=>N.value.delete(s.userId),5e3);N.value.set(s.userId,{name:s.userName,timer:d})}i.contextStatuses?b.value=new Map(i.contextStatuses.map(s=>[s.agentName,s])):b.value.clear()}async function ve(i,p={}){const s=Ke();s&&await new Promise(d=>{s.emit("join",{roomId:i,name:ae.value||void 0,description:localStorage.getItem("gc_user_description")||void 0},k=>{if(e.value!==i){d();return}k?.error?M.value=k.error:le(k,p),d()})})}const ke=R(()=>yl([...n.value].sort((i,p)=>i.timestamp-p.timestamp))),we=R(()=>l.value.map(i=>i.name)),W=R(()=>Array.from(N.value.values()).map(i=>i.name)),Te=R(()=>{const i=W.value;return i.length===0?"":i.length===1?`${i[0]} is typing...`:i.length===2?`${i[0]} and ${i[1]} are typing...`:`${i[0]} and ${i.length-1} others are typing...`});async function me(){let i;try{const s=await Rs();i=s.id,ne.value=s.avatar||""}catch{}const p=Xs({userId:V.value,userName:ae.value||void 0,authUserId:i});console.log("[GroupChat] connecting...",{userId:V.value,userName:ae.value}),p.on("connect",()=>{console.log("[GroupChat] connected, socket id:",p.id),c.value=!0,M.value=null;const s=e.value;s&&ve(s,{syncMessages:!0}).catch(d=>{M.value=d.message})}),p.on("disconnect",s=>{console.log("[GroupChat] disconnected:",s),c.value=!1}),p.on("connect_error",s=>{console.error("[GroupChat] connect_error:",s.message),M.value=s.message,c.value=!1}),p.on("message",s=>{if(s.roomId===e.value){const d=n.value.findIndex(j=>j.id===s.id),k=St(d>=0?n.value[d]:null,s);d>=0?(n.value[d]=k,n.value=[...n.value]):(n.value.push(k),$.value+=1,E.value=Math.max(E.value+1,$.value)),F.value&&k.role==="assistant"&&k.content?.trim()&&setTimeout(()=>te(k.id,k.content),300)}}),p.on("message_stream_start",s=>{if(s.roomId!==e.value)return;n.value=n.value.filter(k=>!(k.roomId===s.roomId&&k.senderId===s.senderId&&k.id!==s.id&&k.isStreaming&&!k.content?.trim()&&!k.reasoning?.trim()&&!k.tool_calls?.length)),s.isStreaming=!0;const d=n.value.findIndex(k=>k.id===s.id);if(d>=0){const k=n.value[d];if(!k.isStreaming)return;n.value[d]={...k,...s,content:Re(s.content)?s.content:k.content||"",reasoning:Re(s.reasoning)?s.reasoning:k.reasoning,reasoning_content:Re(s.reasoning_content)?s.reasoning_content:k.reasoning_content,isStreaming:!0},n.value=[...n.value]}else n.value.push(s),$.value+=1,E.value=Math.max(E.value+1,$.value)}),p.on("message_stream_delta",s=>{if(s.roomId!==e.value)return;const d=n.value.findIndex(k=>k.id===s.id);d<0||!n.value[d].isStreaming||(n.value[d]={...n.value[d],content:n.value[d].content+s.delta},n.value=[...n.value])}),p.on("message_reasoning_delta",s=>{if(s.roomId!==e.value)return;const d=n.value.findIndex(k=>k.id===s.id);d<0||!n.value[d].isStreaming||(n.value[d]={...n.value[d],reasoning:(n.value[d].reasoning||"")+s.delta,reasoning_content:(n.value[d].reasoning_content||"")+s.delta,isStreaming:!0},n.value=[...n.value])}),p.on("message_stream_end",s=>{if(s.roomId!==e.value)return;const d=n.value.findIndex(k=>k.id===s.id);d>=0&&!n.value[d].content?.trim()&&!n.value[d].reasoning?.trim()&&!n.value[d].tool_calls?.length?n.value.splice(d,1):d>=0&&(n.value[d]={...n.value[d],isStreaming:!1},n.value=[...n.value],ft(n.value[d])&&Ce(s.roomId,s.id))}),p.on("member_joined",s=>{s.roomId===e.value&&(l.value=s.members)}),p.on("member_left",s=>{s.roomId===e.value&&(l.value=s.members)}),p.on("typing",s=>{if(s.roomId===e.value&&!N.value.has(s.userId)){const d=setTimeout(()=>N.value.delete(s.userId),5e3);N.value.set(s.userId,{name:s.userName,timer:d})}}),p.on("stop_typing",s=>{if(s.roomId===e.value&&N.value.has(s.userId)){const d=N.value.get(s.userId);clearTimeout(d.timer),N.value.delete(s.userId)}}),p.on("context_status",s=>{s.roomId===e.value&&(s.status==="ready"?(b.value.delete(s.agentName),n.value=n.value.map(d=>d.senderName===s.agentName&&d.isStreaming?{...d,isStreaming:!1}:d).filter(d=>!(d.senderName===s.agentName&&!d.content?.trim()&&!d.reasoning?.trim()&&!d.tool_calls?.length))):b.value.set(s.agentName,{agentName:s.agentName,status:s.status}),b.value=new Map(b.value))}),p.on("approval.requested",s=>{if(!s.approval_id)return;const d=(Array.isArray(s.choices)?s.choices:["once","session","deny"]).filter(k=>k==="once"||k==="session"||k==="always"||k==="deny");B.value.set(s.approval_id,{roomId:s.roomId,agentName:s.agentName||"",approvalId:s.approval_id,command:s.command||"",description:s.description||"",choices:d.length?d:["once","session","deny"],allowPermanent:!!s.allow_permanent,requestedAt:Date.now()}),B.value=new Map(B.value)}),p.on("approval.resolved",s=>{s.approval_id&&(B.value.delete(s.approval_id),B.value=new Map(B.value))}),p.on("room_updated",s=>{const d=u.value.find(k=>k.id===s.roomId);d&&(d.totalTokens=s.totalTokens)}),p.on("room_cleared",s=>{const d=u.value.find(k=>k.id===s.roomId);d&&(d.totalTokens=s.totalTokens),s.roomId===e.value&&(n.value=[],z(),N.value.clear(),b.value.clear(),B.value.clear())})}function xe(){el(),c.value=!1,e.value=null,n.value=[],z(),l.value=[],m.value=[],f.value="",N.value.clear(),b.value.clear(),B.value.clear()}function ue(i,p){ae.value=i,localStorage.setItem("gc_user_name",i),localStorage.setItem("gc_user_description",p)}async function pe(i){T.value=!0,M.value=null;try{const p=await gt(i);e.value=p.room.id,f.value=p.room.name,n.value=p.messages,ie(p),m.value=p.agents,l.value=p.members||[]}catch(p){throw M.value=p.message,p}finally{T.value=!1}await ve(i)}async function ge(){const i=e.value;if(!i||Y.value||!D.value)return!1;const p=$.value;Y.value=!0;try{const s=await gt(i,{offset:p,limit:300}),d=new Set(n.value.map(j=>j.id)),k=s.messages.filter(j=>!d.has(j.id));return n.value=[...k,...n.value],$.value=p+s.messages.length,E.value=s.total??E.value,D.value=s.hasMore??$.value<E.value,k.length>0}catch(s){return M.value=s.message,!1}finally{Y.value=!1}}async function fe(i,p){const s=Ke();if(!s||!e.value)return;I();const d=fl();let k=i.trim();if(p?.length){const j=await pl(p);k=gl(i,p,j);const Q=new Map(j.map(Z=>[Z.name,Wn(hl(Z.path),Z.name)]));n.value.push({id:d,roomId:e.value,senderId:V.value,senderName:ae.value||"You",content:JSON.stringify(k),timestamp:Date.now(),role:"user",attachments:p.map(Z=>({...Z,url:Q.get(Z.name)||Z.url,file:void 0}))}),$.value+=1,E.value=Math.max(E.value+1,$.value)}return new Promise((j,Q)=>{s.emit("message",{roomId:e.value,id:d,content:k},Z=>{if(Z.error){n.value=n.value.filter(v=>v.id!==d),Q(new Error(Z.error));return}j()})})}async function be(){try{u.value=(await al()).rooms}catch(i){M.value=i.message}}async function Ae(i,p,s,d){try{const k=await tl({name:i,inviteCode:p,agents:s,compression:d||{triggerTokens:1e5,maxHistoryTokens:32e3,tailMessageCount:10}});return u.value.push(k.room),k}catch(k){throw M.value=k.message,k}}async function Ie(i){try{const p=await nl(i);return await pe(p.room.id),p.room}catch(p){throw M.value=p.message,p}}async function Ue(i){try{await il(i),u.value=u.value.filter(p=>p.id!==i),e.value===i&&(e.value=null,n.value=[],z(),l.value=[],m.value=[],f.value="")}catch(p){throw M.value=p.message,p}}async function Fe(i,p){try{const s=await ol(i,p);return u.value.push(s.room),s}catch(s){throw M.value=s.message,s}}async function Se(){if(e.value)try{const i=await ul(e.value);n.value=[],z(),N.value.clear(),b.value.clear();const p=u.value.findIndex(s=>s.id===e.value);return p>=0&&i.room&&(u.value[p]=i.room),i}catch(i){throw M.value=i.message,i}}async function he(i){try{m.value=(await ll(i)).agents}catch{}}async function _e(i,p){try{const s=await sl(i,p);return m.value.push(s.agent),s.agent}catch(s){throw M.value=s.message,s}}async function Le(i,p){try{const s=await rl(i,p);m.value=s.agents??m.value.filter(d=>d.id!==p&&d.agentId!==p),s.members&&(l.value=s.members)}catch(s){throw M.value=s.message,s}}let re=null;function _(){const i=Ke();!i||!e.value||(i.emit("typing",{roomId:e.value}),re&&clearTimeout(re),re=setTimeout(()=>I(),4e3))}function I(){const i=Ke();!i||!e.value||(i.emit("stop_typing",{roomId:e.value}),re&&(clearTimeout(re),re=null))}async function A(i){const p=Ke();!p||!e.value||await new Promise((s,d)=>{p.emit("interrupt_agent",{roomId:e.value,agentName:i},k=>{k?.error?d(new Error(k.error)):s()})})}async function O(i){const p=Ke(),s=X.value;!p||!s||(await new Promise((d,k)=>{p.emit("approval.respond",{roomId:s.roomId,approval_id:s.approvalId,choice:i},j=>{j?.error?k(new Error(j.error)):d()})}),B.value.delete(s.approvalId),B.value=new Map(B.value))}return{connected:c,currentRoomId:e,rooms:u,messages:n,members:l,agents:m,roomName:f,isJoining:T,error:M,contextStatus:se,contextStatuses:b,pendingApprovals:B,activePendingApproval:X,autoPlaySpeechEnabled:F,totalMessages:E,loadedMessageCount:$,hasMoreBefore:D,isLoadingOlderMessages:Y,userId:V,userName:ae,currentUserAvatar:ne,sortedMessages:ke,memberNames:we,typingNames:W,typingText:Te,connect:me,disconnect:xe,setUserInfo:ue,setAutoPlaySpeech:q,joinRoom:pe,loadOlderMessages:ge,sendMessage:fe,loadRooms:be,emitTyping:_,emitStopTyping:I,interruptAgent:A,respondApproval:O,createNewRoom:Ae,joinByCode:Ie,deleteRoom:Ue,cloneRoom:Fe,clearCurrentRoomContext:Se,loadAgents:he,addAgentToRoom:_e,removeAgentFromRoom:Le}})})),Rt,Tt,At,Nt,Pt,Dt,Bt,Ut,Ft,Lt,Et,Ot,zt,jt,Gt,Ht,Vt,Jt,Kt,Yt,Wt,qt,Xt,Qt,Zt,eo,to,oo,ao,no,so,lo,ro,io,uo,co,vo,mo,po,Pe,_t,go,fo,ho,_o,st,as,yo=K((()=>{Ge(),tt(),ut(),Ys(),Yn(),Qn(),qs(),$s(),zs(),Es(),Os(),qn(),Rt={key:0,class:"group-message tool-message"},Tt={class:"avatar"},At={class:"msg-body"},Nt={class:"msg-header"},Pt={class:"sender-name"},Dt={key:0,class:"agent-desc"},Bt={key:1,width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5",class:"tool-icon"},Ut={class:"tool-name"},Ft={key:2,class:"tool-preview"},Lt={key:3,class:"tool-spinner"},Et={key:4,class:"tool-error-badge"},Ot={key:0,class:"tool-detail-section","data-copy-source":"tool-args"},zt={class:"tool-detail-label"},jt=["innerHTML"],Gt={key:1,class:"tool-detail-section","data-copy-source":"tool-result"},Ht={class:"tool-detail-label"},Vt=["innerHTML"],Jt={class:"msg-time"},Kt={class:"avatar"},Yt={class:"msg-body"},Wt={class:"msg-header"},qt={class:"sender-name"},Xt={key:0,class:"agent-desc"},Qt={key:0,class:"msg-attachments"},Zt=["src","alt","onClick"],eo=["href","title"],to={class:"att-name"},oo={class:"att-size"},ao={class:"thinking-label"},no={class:"thinking-meta"},so={key:0,class:"thinking-body"},lo={key:3,class:"streaming-dots"},ro={class:"message-meta"},io=["title"],uo={key:0,width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},co={key:1,width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},vo=["title"],mo={class:"message-time"},po=["src"],Pe=1e3,_t=200,go=6,fo=1e3,ho=50,_o=50,st="__truncated__",as=je({__name:"GroupMessageItem",props:{message:{},agents:{},members:{},currentUserId:{}},setup(c){const e=c,{t:u}=ot(),n=Gn(),l=Xn(),m=Gs(),f=Ls(),T=x(null),M=R(()=>e.agents.some(v=>v.agentId===e.message.senderId||v.name===e.message.senderName)),N=R(()=>e.message.role!=="assistant"?!1:e.message.finish_reason==="error"?!0:/^Error:\s*/i.test(e.message.content||"")),b=R(()=>!!e.currentUserId&&e.message.senderId===e.currentUserId),F=R(()=>e.agents.find(v=>v.agentId===e.message.senderId||v.name===e.message.senderName)),B=R(()=>new Date(e.message.timestamp).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})),E=R(()=>F.value?.profile||e.message.senderName||e.message.senderId),$=R(()=>l.profiles.find(v=>v.name===F.value?.profile)),D=R(()=>M.value?null:e.members?.find(v=>v.userId===e.message.senderId||v.name===e.message.senderName)||null),Y=R(()=>{const v=D.value?.avatar;if(!v)return null;try{const y=typeof v=="string"?JSON.parse(v):v;if(y&&y.type==="image"&&y.dataUrl)return y}catch{}return null}),ne=R(()=>M.value?$.value?.avatar??null:Y.value),z=R(()=>M.value?E.value:e.message.senderName||e.message.senderId||"user"),ie=R(()=>["all",...e.agents.map(v=>v.name).filter(Boolean)]),q=R(()=>Ns(e.message.content||"",{streaming:!!e.message.isStreaming})),te=R(()=>!!(e.message.reasoning&&e.message.reasoning.length>0)),oe=R(()=>te.value||q.value.hasThinking),Ce=R(()=>{const v=[];return e.message.reasoning&&v.push(e.message.reasoning),v.push(...q.value.segments),q.value.pending&&v.push(q.value.pending),v.join(`
1
+ import{n as K}from"./rolldown-runtime-M0oDzQ_3.js";import{$t as $e,Bt as ms,Cn as qe,Dn as ze,E as Ye,Fn as ps,Kt as gs,M as et,Mn as lt,Ot as J,Pn as P,Pt as Be,Qn as o,Qt as De,St as fs,Tn as C,V as Gn,Wn as x,Wt as Ge,Yt as hs,Zt as rt,an as U,bt as _s,dn as je,en as wt,er as ee,in as Me,ln as H,m as ys,mt as Cs,nn as R,nr as it,nt as ks,on as w,ot as mt,rn as t,rr as g,t as ut,un as S,w as xt,wn as Hn,xn as ws,yn as We}from"./ui-vendor-dYn1tJGA.js";import{_ as xs,c as tt,f as Vn,g as bs,l as ot,m as Jn,p as Is}from"./vue-vendor-DZ4A_GHn.js";import{f as de,n as Xe,o as at,s as Ct,t as Qe,u as Kn}from"./_plugin-vue_export-helper-CwNymSRn.js";import{M as Ss,j as Ms}from"./vendor-B1Lfatlz.js";import{J as Yn,N as Wn,P as qn,X as Xn,Y as Qn,b as $s,o as Rs,q as Oe,tt as Ts,u as As,x as Ns,y as Ps}from"./index-DW8M4rjb.js";import{n as Ds,t as Bs}from"./clipboard-1NPxC3YL.js";import{i as Zn,n as Us,r as es,t as Fs}from"./VirtualMessageList-CfXQfWcE.js";import{a as Ls,i as Es,n as Os,o as zs,r as js,s as Gs,t as Hs}from"./ttsHelpers-CzQCvABU.js";import{a as Vs,c as Js,i as Ks,n as Ys,o as Ws,r as pt,s as qs,t as bt}from"./MarkdownRenderer-BlxKlSHX.js";function Xs(c){if(ye?.connected)return ye;const e=at(),u=c?.userId||localStorage.getItem("gc_user_id")||ts();return localStorage.setItem("gc_user_id",u),ye=Ss("/group-chat",{auth:{token:e||void 0,userId:u,name:c?.userName||localStorage.getItem("gc_user_name")||void 0,description:c?.description||localStorage.getItem("gc_user_description")||void 0,authUserId:c?.authUserId},transports:["websocket","polling"],reconnection:!0,reconnectionAttempts:1/0,reconnectionDelay:1e3,reconnectionDelayMax:3e4,randomizationFactor:.5,timeout:3e4}),ye}function Qs(){let c=localStorage.getItem("gc_user_id");return c||(c=ts(),localStorage.setItem("gc_user_id",c)),c}function Zs(){return localStorage.getItem("gc_user_name")}function ts(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,c=>{const e=Math.random()*16|0;return(c==="x"?e:e&3|8).toString(16)})}function Ke(){return ye?.connected?ye:null}function el(){ye&&(ye.disconnect(),ye=null)}async function tl(c){return de("/api/hermes/group-chat/rooms",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(c)})}async function ol(c,e){return de(`/api/hermes/group-chat/rooms/${c}/clone`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e||{})})}async function al(){return de("/api/hermes/group-chat/rooms")}async function gt(c,e={}){const u=new URLSearchParams;e.offset!=null&&u.set("offset",String(e.offset)),e.limit!=null&&u.set("limit",String(e.limit));const n=u.toString();return de(`/api/hermes/group-chat/rooms/${c}${n?`?${n}`:""}`)}async function nl(c){return de(`/api/hermes/group-chat/rooms/join/${c}`)}async function sl(c,e){return de(`/api/hermes/group-chat/rooms/${c}/agents`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)})}async function ll(c){return de(`/api/hermes/group-chat/rooms/${c}/agents`)}async function rl(c,e){return de(`/api/hermes/group-chat/rooms/${c}/agents/${e}`,{method:"DELETE"})}async function il(c){return de(`/api/hermes/group-chat/rooms/${c}`,{method:"DELETE"})}async function ul(c){return de(`/api/hermes/group-chat/rooms/${c}/clear-context`,{method:"POST"})}async function cl(c,e){return de(`/api/hermes/group-chat/rooms/${c}/config`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)})}async function dl(c){return de(`/api/hermes/group-chat/rooms/${c}/compress`,{method:"POST"})}async function It(c,e="json"){const u=`${Ct()}/api/hermes/group-chat/rooms/${c}/export?ext=${e}`,n=at(),l={};n&&(l.Authorization=`Bearer ${n}`);const m=await fetch(u,{headers:l});if(!m.ok)throw new Error(`Export failed: ${m.status}`);const f=await m.blob(),T=(m.headers.get("Content-Disposition")||"").match(/filename="?([^"]+)"?/)?.[1]||`room_${c.slice(0,8)}.${e}`,M=URL.createObjectURL(f),N=document.createElement("a");N.href=M,N.download=T,document.body.appendChild(N),N.click(),document.body.removeChild(N),URL.revokeObjectURL(M)}async function vl(c="json"){const e=`${Ct()}/api/hermes/group-chat/rooms/export?ext=${c}`,u=at(),n={};u&&(n.Authorization=`Bearer ${u}`);const l=await fetch(e,{headers:n});if(!l.ok)throw new Error(`Export failed: ${l.status}`);const m=await l.blob(),f=(l.headers.get("Content-Disposition")||"").match(/filename="?([^"]+)"?/)?.[1]||`all_group_chats.${c}`,T=URL.createObjectURL(m),M=document.createElement("a");M.href=T,M.download=f,document.body.appendChild(M),M.click(),document.body.removeChild(M),URL.revokeObjectURL(T)}async function ml(c){const e=`${Ct()}/api/hermes/group-chat/rooms/import`,u=at(),n={"Content-Type":"application/json"};u&&(n.Authorization=`Bearer ${u}`);const l=await c.text(),m=await fetch(e,{method:"POST",headers:n,body:l});if(!m.ok){const f=await m.text().catch(()=>"");try{const T=JSON.parse(f);throw new Error(T?.error||`Import failed: ${m.status}`)}catch{throw new Error(f||`Import failed: ${m.status}`)}}return m.json()}var ye,os=K((()=>{Ms(),Kn(),ye=null}));async function pl(c){const e=new FormData;for(const l of c)l.file&&e.append("file",l.file,l.name);const u=at(),n=await fetch("/upload",{method:"POST",body:e,headers:u?{Authorization:`Bearer ${u}`}:{}});if(!n.ok)throw new Error(`Upload failed: ${n.status}`);return(await n.json()).files}function gl(c,e,u){const n=[];c.trim()&&n.push({type:"text",text:c.trim()});for(let l=0;l<u.length;l+=1){const m=u[l],f=e[l];f?.type.startsWith("image/")?n.push({type:"image",name:m.name,path:m.path,media_type:f.type}):n.push({type:"file",name:m.name,path:m.path,media_type:f?.type})}return n}function fl(){return Date.now().toString(36)+Math.random().toString(36).slice(2,8)}function hl(c){return/^[a-zA-Z]:\\/.test(c)?c.replace(/\\/g,"/"):c}function Re(c){return!!c?.trim()}function _l(c){return!!c.tool_calls?.length}function ft(c){return c.role==="assistant"&&!Re(c.content)&&Re(c.reasoning)&&!_l(c)}function St(c,e){return{...e,content:Re(e.content)?e.content:c?.content||e.content||"",reasoning:Re(e.reasoning)?e.reasoning:c?.reasoning??e.reasoning??null,reasoning_content:Re(e.reasoning_content)?e.reasoning_content:c?.reasoning_content??e.reasoning_content??null,isStreaming:!1,attachments:c?.attachments||e.attachments}}function kt(c){return c!=null&&c!==""}function Mt(c){return kt(c)?c:void 0}function ht(c){if(!kt(c))return"";if(typeof c=="string")return c;try{const e=JSON.stringify(c);if(e!==void 0)return e}catch{}return String(c)}function yl(c){const e=new Map,u=new Map;for(const l of c)if(l.role==="assistant"&&l.tool_calls?.length)for(const m of l.tool_calls)m?.id&&(m.function?.name&&e.set(m.id,m.function.name),kt(m.function?.arguments)&&u.set(m.id,m.function.arguments));const n=[];for(const l of c)if(!(l.role!=="tool"&&!l.tool_calls?.length&&!ht(l.content).trim()&&!l.reasoning?.trim()&&(!l.isStreaming||l.finish_reason==="streaming"))){if(l.role==="assistant"&&l.tool_calls?.length&&!ht(l.content).trim()){for(const m of l.tool_calls)n.push({...l,id:`${l.id}_${m.id}`,role:"tool",content:"",toolName:m.function?.name||void 0,toolCallId:m.id,toolArgs:Mt(m.function?.arguments),toolStatus:"running"});continue}if(l.role==="tool"){const m=l.tool_call_id||"",f=l.tool_name||e.get(m)||void 0,T=u.has(m)?u.get(m):void 0;let M="";const N=ht(l.content);if(N)try{const B=typeof l.content=="string"?JSON.parse(N):l.content;M=B?.url||B?.title||B?.preview||B?.summary||""}catch{M=N.slice(0,80)}const b=n.findIndex(B=>B.role==="tool"&&B.toolCallId===m&&!B.toolResult),F={...l,id:b!==-1?n[b].id:l.id,senderId:b!==-1?n[b].senderId:l.senderId,senderName:b!==-1?n[b].senderName:l.senderName,timestamp:b!==-1?n[b].timestamp:l.timestamp,role:"tool",content:"",toolName:f||(b!==-1?n[b].toolName:void 0),toolCallId:m||void 0,toolArgs:T!==void 0?T:b!==-1?n[b].toolArgs:void 0,toolPreview:typeof M=="string"&&M.slice(0,100)||void 0,toolResult:Mt(l.content),toolStatus:"done"};b!==-1?n[b]=F:n.push(F);continue}n.push(l)}return n}var $t,nt,ct=K((()=>{xs(),Ge(),Kn(),As(),qn(),os(),$t=300,nt=bs("groupChat",()=>{const c=x(!1),e=x(null),u=x([]),n=x([]),l=x([]),m=x([]),f=x(""),T=x(!1),M=x(null),N=x(new Map),b=x(new Map),F=x(!1),B=x(new Map),E=x(0),$=x(0),D=x(!1),Y=x(!1),ne=x("");function z(){E.value=0,$.value=0,D.value=!1,Y.value=!1}function ie(i){$.value=i.messages.length,E.value=i.total??i.messages.length,D.value=i.hasMore??$.value<E.value}function q(i){F.value=i}function te(i,p){window.dispatchEvent(new CustomEvent("auto-play-speech",{detail:{messageId:i,content:p}}))}async function oe(i,p){if(e.value!==i)return;const s=n.value.findIndex(d=>d.id===p);if(!(s<0||!ft(n.value[s])))try{const d=(await gt(i)).messages.find(j=>j.id===p);if(!d||!Re(d.content))return;const k=n.value.findIndex(j=>j.id===p);if(k<0||!ft(n.value[k]))return;n.value[k]=St(n.value[k],d),n.value=[...n.value]}catch{}}function Ce(i,p){setTimeout(()=>{oe(i,p)},$t)}const se=R(()=>{for(const[,i]of b.value)return i;return null}),X=R(()=>{if(!e.value)return null;for(const i of B.value.values())if(i.roomId===e.value)return i;return null}),V=x(Qs()),ae=x(Zs()||"");function le(i,p={}){if(l.value=i.members||[],i.agents&&(m.value=i.agents),i.roomName&&(f.value=i.roomName),p.syncMessages&&Array.isArray(i.messages)){const s=new Map(n.value.map(d=>[d.id,d]));for(const d of i.messages){const k=s.get(d.id);s.set(d.id,k?{...k,...d}:d)}n.value=Array.from(s.values()).sort((d,k)=>d.timestamp-k.timestamp),typeof i.total=="number"||typeof i.hasMore=="boolean"?ie(i):($.value=Math.max($.value,n.value.length),E.value=Math.max(E.value,$.value))}for(const s of N.value.values())clearTimeout(s.timer);if(N.value.clear(),i.typingUsers)for(const s of i.typingUsers){const d=setTimeout(()=>N.value.delete(s.userId),5e3);N.value.set(s.userId,{name:s.userName,timer:d})}i.contextStatuses?b.value=new Map(i.contextStatuses.map(s=>[s.agentName,s])):b.value.clear()}async function ve(i,p={}){const s=Ke();s&&await new Promise(d=>{s.emit("join",{roomId:i,name:ae.value||void 0,description:localStorage.getItem("gc_user_description")||void 0},k=>{if(e.value!==i){d();return}k?.error?M.value=k.error:le(k,p),d()})})}const ke=R(()=>yl([...n.value].sort((i,p)=>i.timestamp-p.timestamp))),we=R(()=>l.value.map(i=>i.name)),W=R(()=>Array.from(N.value.values()).map(i=>i.name)),Te=R(()=>{const i=W.value;return i.length===0?"":i.length===1?`${i[0]} is typing...`:i.length===2?`${i[0]} and ${i[1]} are typing...`:`${i[0]} and ${i.length-1} others are typing...`});async function me(){let i;try{const s=await Rs();i=s.id,ne.value=s.avatar||""}catch{}const p=Xs({userId:V.value,userName:ae.value||void 0,authUserId:i});console.log("[GroupChat] connecting...",{userId:V.value,userName:ae.value}),p.on("connect",()=>{console.log("[GroupChat] connected, socket id:",p.id),c.value=!0,M.value=null;const s=e.value;s&&ve(s,{syncMessages:!0}).catch(d=>{M.value=d.message})}),p.on("disconnect",s=>{console.log("[GroupChat] disconnected:",s),c.value=!1}),p.on("connect_error",s=>{console.error("[GroupChat] connect_error:",s.message),M.value=s.message,c.value=!1}),p.on("message",s=>{if(s.roomId===e.value){const d=n.value.findIndex(j=>j.id===s.id),k=St(d>=0?n.value[d]:null,s);d>=0?(n.value[d]=k,n.value=[...n.value]):(n.value.push(k),$.value+=1,E.value=Math.max(E.value+1,$.value)),F.value&&k.role==="assistant"&&k.content?.trim()&&setTimeout(()=>te(k.id,k.content),300)}}),p.on("message_stream_start",s=>{if(s.roomId!==e.value)return;n.value=n.value.filter(k=>!(k.roomId===s.roomId&&k.senderId===s.senderId&&k.id!==s.id&&k.isStreaming&&!k.content?.trim()&&!k.reasoning?.trim()&&!k.tool_calls?.length)),s.isStreaming=!0;const d=n.value.findIndex(k=>k.id===s.id);if(d>=0){const k=n.value[d];if(!k.isStreaming)return;n.value[d]={...k,...s,content:Re(s.content)?s.content:k.content||"",reasoning:Re(s.reasoning)?s.reasoning:k.reasoning,reasoning_content:Re(s.reasoning_content)?s.reasoning_content:k.reasoning_content,isStreaming:!0},n.value=[...n.value]}else n.value.push(s),$.value+=1,E.value=Math.max(E.value+1,$.value)}),p.on("message_stream_delta",s=>{if(s.roomId!==e.value)return;const d=n.value.findIndex(k=>k.id===s.id);d<0||!n.value[d].isStreaming||(n.value[d]={...n.value[d],content:n.value[d].content+s.delta},n.value=[...n.value])}),p.on("message_reasoning_delta",s=>{if(s.roomId!==e.value)return;const d=n.value.findIndex(k=>k.id===s.id);d<0||!n.value[d].isStreaming||(n.value[d]={...n.value[d],reasoning:(n.value[d].reasoning||"")+s.delta,reasoning_content:(n.value[d].reasoning_content||"")+s.delta,isStreaming:!0},n.value=[...n.value])}),p.on("message_stream_end",s=>{if(s.roomId!==e.value)return;const d=n.value.findIndex(k=>k.id===s.id);d>=0&&!n.value[d].content?.trim()&&!n.value[d].reasoning?.trim()&&!n.value[d].tool_calls?.length?n.value.splice(d,1):d>=0&&(n.value[d]={...n.value[d],isStreaming:!1},n.value=[...n.value],ft(n.value[d])&&Ce(s.roomId,s.id))}),p.on("member_joined",s=>{s.roomId===e.value&&(l.value=s.members)}),p.on("member_left",s=>{s.roomId===e.value&&(l.value=s.members)}),p.on("typing",s=>{if(s.roomId===e.value&&!N.value.has(s.userId)){const d=setTimeout(()=>N.value.delete(s.userId),5e3);N.value.set(s.userId,{name:s.userName,timer:d})}}),p.on("stop_typing",s=>{if(s.roomId===e.value&&N.value.has(s.userId)){const d=N.value.get(s.userId);clearTimeout(d.timer),N.value.delete(s.userId)}}),p.on("context_status",s=>{s.roomId===e.value&&(s.status==="ready"?(b.value.delete(s.agentName),n.value=n.value.map(d=>d.senderName===s.agentName&&d.isStreaming?{...d,isStreaming:!1}:d).filter(d=>!(d.senderName===s.agentName&&!d.content?.trim()&&!d.reasoning?.trim()&&!d.tool_calls?.length))):b.value.set(s.agentName,{agentName:s.agentName,status:s.status}),b.value=new Map(b.value))}),p.on("approval.requested",s=>{if(!s.approval_id)return;const d=(Array.isArray(s.choices)?s.choices:["once","session","deny"]).filter(k=>k==="once"||k==="session"||k==="always"||k==="deny");B.value.set(s.approval_id,{roomId:s.roomId,agentName:s.agentName||"",approvalId:s.approval_id,command:s.command||"",description:s.description||"",choices:d.length?d:["once","session","deny"],allowPermanent:!!s.allow_permanent,requestedAt:Date.now()}),B.value=new Map(B.value)}),p.on("approval.resolved",s=>{s.approval_id&&(B.value.delete(s.approval_id),B.value=new Map(B.value))}),p.on("room_updated",s=>{const d=u.value.find(k=>k.id===s.roomId);d&&(d.totalTokens=s.totalTokens)}),p.on("room_cleared",s=>{const d=u.value.find(k=>k.id===s.roomId);d&&(d.totalTokens=s.totalTokens),s.roomId===e.value&&(n.value=[],z(),N.value.clear(),b.value.clear(),B.value.clear())})}function xe(){el(),c.value=!1,e.value=null,n.value=[],z(),l.value=[],m.value=[],f.value="",N.value.clear(),b.value.clear(),B.value.clear()}function ue(i,p){ae.value=i,localStorage.setItem("gc_user_name",i),localStorage.setItem("gc_user_description",p)}async function pe(i){T.value=!0,M.value=null;try{const p=await gt(i);e.value=p.room.id,f.value=p.room.name,n.value=p.messages,ie(p),m.value=p.agents,l.value=p.members||[]}catch(p){throw M.value=p.message,p}finally{T.value=!1}await ve(i)}async function ge(){const i=e.value;if(!i||Y.value||!D.value)return!1;const p=$.value;Y.value=!0;try{const s=await gt(i,{offset:p,limit:300}),d=new Set(n.value.map(j=>j.id)),k=s.messages.filter(j=>!d.has(j.id));return n.value=[...k,...n.value],$.value=p+s.messages.length,E.value=s.total??E.value,D.value=s.hasMore??$.value<E.value,k.length>0}catch(s){return M.value=s.message,!1}finally{Y.value=!1}}async function fe(i,p){const s=Ke();if(!s||!e.value)return;I();const d=fl();let k=i.trim();if(p?.length){const j=await pl(p);k=gl(i,p,j);const Q=new Map(j.map(Z=>[Z.name,Wn(hl(Z.path),Z.name)]));n.value.push({id:d,roomId:e.value,senderId:V.value,senderName:ae.value||"You",content:JSON.stringify(k),timestamp:Date.now(),role:"user",attachments:p.map(Z=>({...Z,url:Q.get(Z.name)||Z.url,file:void 0}))}),$.value+=1,E.value=Math.max(E.value+1,$.value)}return new Promise((j,Q)=>{s.emit("message",{roomId:e.value,id:d,content:k},Z=>{if(Z.error){n.value=n.value.filter(v=>v.id!==d),Q(new Error(Z.error));return}j()})})}async function be(){try{u.value=(await al()).rooms}catch(i){M.value=i.message}}async function Ae(i,p,s,d){try{const k=await tl({name:i,inviteCode:p,agents:s,compression:d||{triggerTokens:1e5,maxHistoryTokens:32e3,tailMessageCount:10}});return u.value.push(k.room),k}catch(k){throw M.value=k.message,k}}async function Ie(i){try{const p=await nl(i);return await pe(p.room.id),p.room}catch(p){throw M.value=p.message,p}}async function Ue(i){try{await il(i),u.value=u.value.filter(p=>p.id!==i),e.value===i&&(e.value=null,n.value=[],z(),l.value=[],m.value=[],f.value="")}catch(p){throw M.value=p.message,p}}async function Fe(i,p){try{const s=await ol(i,p);return u.value.push(s.room),s}catch(s){throw M.value=s.message,s}}async function Se(){if(e.value)try{const i=await ul(e.value);n.value=[],z(),N.value.clear(),b.value.clear();const p=u.value.findIndex(s=>s.id===e.value);return p>=0&&i.room&&(u.value[p]=i.room),i}catch(i){throw M.value=i.message,i}}async function he(i){try{m.value=(await ll(i)).agents}catch{}}async function _e(i,p){try{const s=await sl(i,p);return m.value.push(s.agent),s.agent}catch(s){throw M.value=s.message,s}}async function Le(i,p){try{const s=await rl(i,p);m.value=s.agents??m.value.filter(d=>d.id!==p&&d.agentId!==p),s.members&&(l.value=s.members)}catch(s){throw M.value=s.message,s}}let re=null;function _(){const i=Ke();!i||!e.value||(i.emit("typing",{roomId:e.value}),re&&clearTimeout(re),re=setTimeout(()=>I(),4e3))}function I(){const i=Ke();!i||!e.value||(i.emit("stop_typing",{roomId:e.value}),re&&(clearTimeout(re),re=null))}async function A(i){const p=Ke();!p||!e.value||await new Promise((s,d)=>{p.emit("interrupt_agent",{roomId:e.value,agentName:i},k=>{k?.error?d(new Error(k.error)):s()})})}async function O(i){const p=Ke(),s=X.value;!p||!s||(await new Promise((d,k)=>{p.emit("approval.respond",{roomId:s.roomId,approval_id:s.approvalId,choice:i},j=>{j?.error?k(new Error(j.error)):d()})}),B.value.delete(s.approvalId),B.value=new Map(B.value))}return{connected:c,currentRoomId:e,rooms:u,messages:n,members:l,agents:m,roomName:f,isJoining:T,error:M,contextStatus:se,contextStatuses:b,pendingApprovals:B,activePendingApproval:X,autoPlaySpeechEnabled:F,totalMessages:E,loadedMessageCount:$,hasMoreBefore:D,isLoadingOlderMessages:Y,userId:V,userName:ae,currentUserAvatar:ne,sortedMessages:ke,memberNames:we,typingNames:W,typingText:Te,connect:me,disconnect:xe,setUserInfo:ue,setAutoPlaySpeech:q,joinRoom:pe,loadOlderMessages:ge,sendMessage:fe,loadRooms:be,emitTyping:_,emitStopTyping:I,interruptAgent:A,respondApproval:O,createNewRoom:Ae,joinByCode:Ie,deleteRoom:Ue,cloneRoom:Fe,clearCurrentRoomContext:Se,loadAgents:he,addAgentToRoom:_e,removeAgentFromRoom:Le}})})),Rt,Tt,At,Nt,Pt,Dt,Bt,Ut,Ft,Lt,Et,Ot,zt,jt,Gt,Ht,Vt,Jt,Kt,Yt,Wt,qt,Xt,Qt,Zt,eo,to,oo,ao,no,so,lo,ro,io,uo,co,vo,mo,po,Pe,_t,go,fo,ho,_o,st,as,yo=K((()=>{Ge(),tt(),ut(),Ys(),Yn(),Qn(),qs(),$s(),zs(),Es(),Os(),qn(),Rt={key:0,class:"group-message tool-message"},Tt={class:"avatar"},At={class:"msg-body"},Nt={class:"msg-header"},Pt={class:"sender-name"},Dt={key:0,class:"agent-desc"},Bt={key:1,width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5",class:"tool-icon"},Ut={class:"tool-name"},Ft={key:2,class:"tool-preview"},Lt={key:3,class:"tool-spinner"},Et={key:4,class:"tool-error-badge"},Ot={key:0,class:"tool-detail-section","data-copy-source":"tool-args"},zt={class:"tool-detail-label"},jt=["innerHTML"],Gt={key:1,class:"tool-detail-section","data-copy-source":"tool-result"},Ht={class:"tool-detail-label"},Vt=["innerHTML"],Jt={class:"msg-time"},Kt={class:"avatar"},Yt={class:"msg-body"},Wt={class:"msg-header"},qt={class:"sender-name"},Xt={key:0,class:"agent-desc"},Qt={key:0,class:"msg-attachments"},Zt=["src","alt","onClick"],eo=["href","title"],to={class:"att-name"},oo={class:"att-size"},ao={class:"thinking-label"},no={class:"thinking-meta"},so={key:0,class:"thinking-body"},lo={key:3,class:"streaming-dots"},ro={class:"message-meta"},io=["title"],uo={key:0,width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},co={key:1,width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},vo=["title"],mo={class:"message-time"},po=["src"],Pe=1e3,_t=200,go=6,fo=1e3,ho=50,_o=50,st="__truncated__",as=je({__name:"GroupMessageItem",props:{message:{},agents:{},members:{},currentUserId:{}},setup(c){const e=c,{t:u}=ot(),n=Gn(),l=Xn(),m=Gs(),f=Ls(),T=x(null),M=R(()=>e.agents.some(v=>v.agentId===e.message.senderId||v.name===e.message.senderName)),N=R(()=>e.message.role!=="assistant"?!1:e.message.finish_reason==="error"?!0:/^Error:\s*/i.test(e.message.content||"")),b=R(()=>!!e.currentUserId&&e.message.senderId===e.currentUserId),F=R(()=>e.agents.find(v=>v.agentId===e.message.senderId||v.name===e.message.senderName)),B=R(()=>new Date(e.message.timestamp).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})),E=R(()=>F.value?.profile||e.message.senderName||e.message.senderId),$=R(()=>l.profiles.find(v=>v.name===F.value?.profile)),D=R(()=>M.value?null:e.members?.find(v=>v.userId===e.message.senderId||v.name===e.message.senderName)||null),Y=R(()=>{const v=D.value?.avatar;if(!v)return null;try{const y=typeof v=="string"?JSON.parse(v):v;if(y&&y.type==="image"&&y.dataUrl)return y}catch{}return null}),ne=R(()=>M.value?$.value?.avatar??null:Y.value),z=R(()=>M.value?E.value:e.message.senderName||e.message.senderId||"user"),ie=R(()=>["all",...e.agents.map(v=>v.name).filter(Boolean)]),q=R(()=>Ns(e.message.content||"",{streaming:!!e.message.isStreaming})),te=R(()=>!!(e.message.reasoning&&e.message.reasoning.length>0)),oe=R(()=>te.value||q.value.hasThinking),Ce=R(()=>{const v=[];return e.message.reasoning&&v.push(e.message.reasoning),v.push(...q.value.segments),q.value.pending&&v.push(q.value.pending),v.join(`
2
2
 
3
3
  `)}),se=R(()=>{let v=Ps(q.value);return e.message.reasoning&&(v+=e.message.reasoning.length),v}),X=R(()=>e.message.isStreaming?!!(q.value.pending!==null||te.value&&!e.message.content):!1),V=x(null),ae=R(()=>X.value?!0:V.value!==null?V.value:!1),le=R(()=>q.value.body||e.message.content||""),ve=R(()=>{const v=(e.message.content||"").trim();if(!v.startsWith("[")||!v.endsWith("]"))return null;try{const y=JSON.parse(v);return Array.isArray(y)?y:null}catch{return null}}),ke=R(()=>{if(e.message.attachments?.length)return e.message.attachments;const v=ve.value;return v?v.flatMap((y,r)=>{if(y?.type!=="image"&&y?.type!=="file")return[];const a=String(y.path||"");if(!a)return[];const h=String(y.name||`${y.type}-${r+1}`);return[{id:`${e.message.id}_attachment_${r}`,name:h,type:y.type==="image"?String(y.media_type||"image/*"):String(y.media_type||"application/octet-stream"),size:0,url:Wn(j(a),h)}]}):[]}),we=R(()=>ke.value.length>0),W=R(()=>{if(e.message.role!=="user")return le.value;const v=ve.value;return v?v.filter(y=>y?.type==="text"&&typeof y.text=="string").map(y=>y.text).join(`
4
4
  `):le.value}),Te=R(()=>{if(xe.value)return null;const v=W.value||"";return v.trim()?v:null}),me=x(!1),xe=R(()=>e.message.role==="tool"),ue=R(()=>I(e.message.toolArgs)),pe=R(()=>I(e.message.toolResult,!0)),ge=R(()=>!!(ue.value.full||pe.value.full)),fe=R(()=>ue.value.full),be=R(()=>ue.value.display),Ae=R(()=>pe.value.full),Ie=R(()=>pe.value.display),Ue=R(()=>be.value?A(be.value,ue.value.language):""),Fe=R(()=>Ie.value?A(Ie.value,pe.value.language):""),Se=R(()=>e.message.role!=="assistant"||!le.value.trim()?!1:f.provider.value==="openai"||f.provider.value==="custom"||f.provider.value==="edge"||f.provider.value==="mimo"?!0:m.isSupported),he=R(()=>f.provider.value==="openai"||f.provider.value==="custom"||f.provider.value==="edge"||f.provider.value==="mimo"?m.currentCustomMessageId.value===e.message.id&&m.isCustomPlaying.value:m.currentMessageId.value===e.message.id&&m.isPlaying.value),_e=R(()=>f.provider.value==="openai"||f.provider.value==="custom"||f.provider.value==="edge"||f.provider.value==="mimo"?m.currentCustomMessageId.value===e.message.id&&m.isCustomPaused.value:m.currentMessageId.value===e.message.id&&m.isPaused.value);function Le(v,y){return v.length>_t?v.slice(0,_t)+`
@@ -1 +1 @@
1
- import{n as d}from"./rolldown-runtime-M0oDzQ_3.js";import{Mn as r,Pn as c,Qn as M,Tn as _,Wn as S,Wt as Q,an as T,dn as W,in as $,nn as f,on as B,rn as p,rr as D,un as E,xn as F,yn as L}from"./ui-vendor-dYn1tJGA.js";import{c as K,l as U}from"./vue-vendor-DZ4A_GHn.js";import{n as j,t as q}from"./_plugin-vue_export-helper-uEMLHKI8.js";import{_ as z,tt as G,v as J}from"./index-1yNqMnGv.js";import{i as X,n as Y,r as Z,t as ee}from"./VirtualMessageList-BNu9wFPU.js";import{n as se,t as te}from"./MessageItem-Dr5idUZb.js";var b,V,w,v,I,x=d((()=>{Q(),G(),K(),Y(),se(),z(),Z(),b={class:"empty-state"},V={key:0,class:"history-loader"},w={key:0,class:"history-loader-spinner"},v=new Map,I=W({__name:"HistoryMessageList",props:{session:{},loadOlder:{type:Function}},setup(k,{expose:H}){const l=k,n=J(),{toolTraceVisible:N}=X(),{t:P}=U(),a=S(null),i=S(null),t=f(()=>l.session||null),O=f(()=>t.value?.id?`history-${t.value.id}`:"history-empty"),R=f(()=>(t.value?.messages||[]).filter(e=>e.role==="tool"?N.value&&!!e.toolName:!!e.content?.trim()));function g(e=200){return a.value?.isNearBottom(e)??!0}function o(){a.value?.scrollToBottom()}function u(e){a.value?.scrollToMessage(e)}function C(e,s){a.value?.scrollToAnchor(e,s)}function m(e){if(!e)return;const s=a.value?.captureViewportPosition()??null;s&&v.set(e,s)}function h(e){if(t.value?.id!==e)return;if(n.focusMessageId){i.value=null,u(n.focusMessageId);return}const s=v.get(e);if(s){i.value=null,s.wasNearBottom?o():a.value?.restoreViewportPosition(s);return}o(),(t.value?.messages.length||0)>0&&(i.value=null)}async function A(){const e=t.value;if(!e?.hasMoreBefore||e.isLoadingOlderMessages||!l.loadOlder)return;const s=a.value?.captureScrollPosition()??null;await l.loadOlder(e.id)&&(await L(),a.value?.restoreScrollPosition(s))}return r(()=>t.value?.id,async(e,s)=>{m(s),e&&(i.value=e,await L(),h(e))},{immediate:!0}),r(()=>n.focusMessageId,e=>{e&&u(e)}),r(()=>(t.value?.messages||[])[(t.value?.messages||[]).length-1]?.content,e=>{i.value!==t.value?.id&&e&&g()&&o()}),r(()=>(t.value?.messages||[]).length,e=>{if(e===0)return;const s=t.value?.id;if(s&&i.value===s){h(s);return}g()&&o()},{flush:"post"}),F(()=>{m(t.value?.id)}),H({scrollToBottom:o,scrollToMessage:u,scrollToAnchor:C}),(e,s)=>(_(),$(ee,{key:O.value,ref_key:"listRef",ref:a,messages:R.value,onTopReach:A},{empty:c(()=>[p("div",b,[s[0]||(s[0]=p("img",{src:"/logo.png",alt:"QuantHermes",class:"empty-logo"},null,-1)),p("p",null,D(M(P)("chat.emptyState")),1)])]),before:c(()=>[t.value?.hasMoreBefore||t.value?.isLoadingOlderMessages?(_(),B("div",V,[t.value?.isLoadingOlderMessages?(_(),B("span",w)):T("",!0)])):T("",!0)]),item:c(({message:y})=>[E(te,{message:y,highlight:M(n).focusMessageId===y.id},null,8,["message","highlight"])]),_:1},8,["messages"]))}})})),ae=d((()=>{})),ie,ge=d((()=>{x(),x(),ae(),j(),ie=q(I,[["__scopeId","data-v-6ff6e9bf"]])}));export{ge as n,ie as t};
1
+ import{n as d}from"./rolldown-runtime-M0oDzQ_3.js";import{Mn as r,Pn as c,Qn as M,Tn as _,Wn as S,Wt as Q,an as T,dn as W,in as $,nn as f,on as B,rn as p,rr as D,un as E,xn as F,yn as L}from"./ui-vendor-dYn1tJGA.js";import{c as K,l as U}from"./vue-vendor-DZ4A_GHn.js";import{n as j,t as q}from"./_plugin-vue_export-helper-CwNymSRn.js";import{_ as z,tt as G,v as J}from"./index-DW8M4rjb.js";import{i as X,n as Y,r as Z,t as ee}from"./VirtualMessageList-CfXQfWcE.js";import{n as se,t as te}from"./MessageItem-Di7V6T5S.js";var b,V,w,v,I,x=d((()=>{Q(),G(),K(),Y(),se(),z(),Z(),b={class:"empty-state"},V={key:0,class:"history-loader"},w={key:0,class:"history-loader-spinner"},v=new Map,I=W({__name:"HistoryMessageList",props:{session:{},loadOlder:{type:Function}},setup(k,{expose:H}){const l=k,n=J(),{toolTraceVisible:N}=X(),{t:P}=U(),a=S(null),i=S(null),t=f(()=>l.session||null),O=f(()=>t.value?.id?`history-${t.value.id}`:"history-empty"),R=f(()=>(t.value?.messages||[]).filter(e=>e.role==="tool"?N.value&&!!e.toolName:!!e.content?.trim()));function g(e=200){return a.value?.isNearBottom(e)??!0}function o(){a.value?.scrollToBottom()}function u(e){a.value?.scrollToMessage(e)}function C(e,s){a.value?.scrollToAnchor(e,s)}function m(e){if(!e)return;const s=a.value?.captureViewportPosition()??null;s&&v.set(e,s)}function h(e){if(t.value?.id!==e)return;if(n.focusMessageId){i.value=null,u(n.focusMessageId);return}const s=v.get(e);if(s){i.value=null,s.wasNearBottom?o():a.value?.restoreViewportPosition(s);return}o(),(t.value?.messages.length||0)>0&&(i.value=null)}async function A(){const e=t.value;if(!e?.hasMoreBefore||e.isLoadingOlderMessages||!l.loadOlder)return;const s=a.value?.captureScrollPosition()??null;await l.loadOlder(e.id)&&(await L(),a.value?.restoreScrollPosition(s))}return r(()=>t.value?.id,async(e,s)=>{m(s),e&&(i.value=e,await L(),h(e))},{immediate:!0}),r(()=>n.focusMessageId,e=>{e&&u(e)}),r(()=>(t.value?.messages||[])[(t.value?.messages||[]).length-1]?.content,e=>{i.value!==t.value?.id&&e&&g()&&o()}),r(()=>(t.value?.messages||[]).length,e=>{if(e===0)return;const s=t.value?.id;if(s&&i.value===s){h(s);return}g()&&o()},{flush:"post"}),F(()=>{m(t.value?.id)}),H({scrollToBottom:o,scrollToMessage:u,scrollToAnchor:C}),(e,s)=>(_(),$(ee,{key:O.value,ref_key:"listRef",ref:a,messages:R.value,onTopReach:A},{empty:c(()=>[p("div",b,[s[0]||(s[0]=p("img",{src:"/logo.png",alt:"QuantHermes",class:"empty-logo"},null,-1)),p("p",null,D(M(P)("chat.emptyState")),1)])]),before:c(()=>[t.value?.hasMoreBefore||t.value?.isLoadingOlderMessages?(_(),B("div",V,[t.value?.isLoadingOlderMessages?(_(),B("span",w)):T("",!0)])):T("",!0)]),item:c(({message:y})=>[E(te,{message:y,highlight:M(n).focusMessageId===y.id},null,8,["message","highlight"])]),_:1},8,["messages"]))}})})),ae=d((()=>{})),ie,ge=d((()=>{x(),x(),ae(),j(),ie=q(I,[["__scopeId","data-v-6ff6e9bf"]])}));export{ge as n,ie as t};
@@ -1 +1 @@
1
- import{n as ie}from"./rolldown-runtime-M0oDzQ_3.js";import{$t as q,Cn as yt,Dn as te,Mn as K,Ot as H,Pn as S,Qn as r,Tn as c,V as St,Wn as v,Wt as kt,an as k,dn as bt,er as se,in as I,ln as oe,nn as h,nt as Ct,on as g,ot as Se,rn as a,rr as _,t as Mt,un as P,w as xt,wn as Bt}from"./ui-vendor-dYn1tJGA.js";import{c as Pt,f as Tt,l as At,m as Ht,p as It}from"./vue-vendor-DZ4A_GHn.js";import{n as Dt,t as $t}from"./_plugin-vue_export-helper-uEMLHKI8.js";import{B as Lt,F as Ot,I as Vt,Q as Nt,U as qt,V as ke,W as zt,X as Ft,Y as Rt,Z as Wt,_ as Et,z as Ut}from"./index-1yNqMnGv.js";import{n as Jt,t as Kt}from"./session-browser-prefs-BMKJzhU0.js";import{n as Yt,t as be}from"./clipboard-1NPxC3YL.js";import{i as Gt,n as Qt,o as Ce,r as Me,s as Xt,t as Zt}from"./OutlinePanel-BddtVbQw.js";import{n as jt,t as es}from"./HistoryMessageList-L-9SSk3K.js";var xe,Be,Pe,Te,Ae,He,Ie,De,$e,Le,Oe,Ve,Ne,qe,ze,Fe,Re,We,Ee,Ue,Je,Ke,Ye,ae,Qe,Ge=ie((()=>{kt(),Tt(),Et(),Wt(),Rt(),Kt(),Mt(),Pt(),Xt(),Yt(),jt(),Gt(),Qt(),zt(),xe={class:"history-panel"},Be={class:"session-list-header"},Pe={key:0,class:"session-list-title"},Te={class:"session-list-actions"},Ae={key:0,class:"session-scope-note"},He={key:1,class:"session-items"},Ie={key:0,class:"session-loading"},De={key:1,class:"session-empty"},$e={class:"session-group-header session-group-header--static"},Le={class:"session-group-label"},Oe={class:"session-group-count"},Ve=["onClick"],Ne={class:"session-group-label"},qe={class:"session-group-count"},ze={class:"chat-main"},Fe={class:"chat-header"},Re={class:"header-left"},We={class:"header-session-title"},Ee={key:0,class:"source-badge"},Ue=["title"],Je={class:"header-actions"},Ke={class:"history-content-wrapper"},Ye={class:"history-main-content"},ae=300,Qe=bt({__name:"HistoryView",setup(as){const Xe=Nt(),z=Ft(),D=Jt(),m=St(),{t:i}=At(),ne=It(),T=Ht(),F=h(()=>{const e=ne.params.sessionId;return typeof e=="string"&&e.trim()?e:null}),L=h(()=>{const e=ne.query.profile;return typeof e=="string"&&e.trim()?e:null}),Ze=h(()=>z.activeProfileName||L.value||null),w=v([]),Y=v(!1),R=v(!1),f=v(null),l=v(null),G=v(!1),le=v(null),b=v(!1),y=v(!1),$=v(!1),u=v(new Set),x=v(null),W=v(!1),re=v(0),ue=v(0);let Q=0;function je(e){le.value?.scrollToAnchor(e.messageId,e.anchorId)}async function O(){const e=++Q;Y.value=!0;try{const t=await Lt(void 0,void 0,Ze.value);if(e!==Q)return;w.value=t,R.value=!0}catch(t){console.error("Failed to load Hermes sessions:",t)}finally{e===Q&&(Y.value=!1)}}const C=v(typeof window>"u"||!window.matchMedia("(max-width: 768px)").matches);let V=null;const et=v(!1);function A(e){return w.value.find(t=>t.id===e)}const tt=h(()=>x.value&&A(x.value)||null),st=h(()=>x.value?D.isPinned(x.value):!1),ot=h(()=>[{label:i("chat.importToWebUi"),key:"import-webui",disabled:!!tt.value?.webui_imported},{label:i(st.value?"chat.unpin":"chat.pin"),key:"pin"},{label:i("chat.copySessionLink"),key:"copy-link"},{label:i("chat.copySessionId"),key:"copy-id"}]);function X(e){return e.map(t=>{const s={id:String(t.id),role:t.role,content:t.content||"",timestamp:t.timestamp*1e3,reasoning:t.reasoning||void 0,systemType:t.role==="command"?"command":void 0};return t.role==="tool"&&(s.toolName=t.tool_name||void 0,s.toolCallId=t.tool_call_id||void 0,s.toolArgs=t.tool_calls?.[0]?.function?.arguments?JSON.stringify(t.tool_calls[0].function.arguments):void 0,s.toolStatus="done",s.toolResult=t.content||void 0,s.content=""),s})}function at(e,t=[]){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.ended_at||e.started_at)*1e3,model:e.model,provider:e.provider,messageCount:e.message_count,messageTotal:e.message_count,loadedMessageCount:t.length,hasMoreBefore:!1,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:t}}async function it(e,t){const s=A(e),o=t||s?.profile||null,d=await ke(e,0,ae,o);let M=null;if(d)M=at(s||d.session,X(d.messages)),M.profile=s?.profile||o||void 0,M.messageCount=d.total,M.messageTotal=d.total,M.loadedMessageCount=d.messages.length,M.hasMoreBefore=d.hasMore;else{const n=await Ut(e,o);if(!n){m.error(i("chat.sessionNotFound"));return}M={id:n.id,profile:n.profile||o||void 0,title:n.title||"",source:n.source,createdAt:n.started_at*1e3,updatedAt:(n.last_active||n.started_at)*1e3,model:n.model,provider:n.provider,messageCount:n.message_count,messageTotal:n.message_count,loadedMessageCount:n.messages.length,hasMoreBefore:!1,inputTokens:n.input_tokens,outputTokens:n.output_tokens,endedAt:n.ended_at?n.ended_at*1e3:void 0,lastActiveAt:n.last_active?n.last_active*1e3:void 0,workspace:n.workspace||void 0,messages:X(n.messages)}}f.value=M.id,l.value=M,V?.matches&&(C.value=!1)}async function nt(e){const t=l.value;if(!t||t.id!==e||t.isLoadingOlderMessages||!t.hasMoreBefore)return!1;const s=t.loadedMessageCount||0;t.isLoadingOlderMessages=!0;try{const o=await ke(e,s,ae,t.profile);if(!o||o.messages.length===0)return t.hasMoreBefore=!1,!1;const d=new Set(t.messages.map(n=>n.id)),M=X(o.messages).filter(n=>!d.has(n.id));return t.messages=[...M,...t.messages],t.loadedMessageCount=s+o.messages.length,t.messageTotal=o.total,t.messageCount=o.total,t.hasMoreBefore=o.hasMore,M.length>0}catch(o){return console.error("Failed to load older history messages:",o),!1}finally{t.isLoadingOlderMessages=!1}}async function E(e,t){await T.push({name:"hermes.historySession",params:{sessionId:e},query:t?{profile:t}:void 0})}async function Z(e=!1){const t=w.value.find(o=>o.source==="cli")||w.value[0];if(!t){f.value=null,l.value=null,F.value&&await T.replace({name:"hermes.history"});return}p.value.has(t.source)&&(p.value=new Set([...p.value].filter(o=>o!==t.source)));const s={name:"hermes.historySession",params:{sessionId:t.id},query:t.profile?{profile:t.profile}:void 0};e?await T.replace(s):await T.push(s)}async function ce(){const e=F.value;if(!e)return;if(!w.value.some(o=>o.id===e)){f.value=null,l.value=null,await T.replace({name:"hermes.history"});return}const t=L.value||A(e)?.profile||null,s=l.value?.profile||null;(f.value!==e||s!==t)&&(f.value=e,l.value=null,await it(e,t))}function j(e){et.value=e.matches,e.matches&&C.value&&(C.value=!1)}yt(async()=>{Xe.loadModels(),await z.fetchProfiles(),await O(),await ce(),V=window.matchMedia("(max-width: 768px)"),j(V),V.addEventListener("change",j)}),Bt(()=>{V?.removeEventListener("change",j)}),K([F,L],async([e])=>{if(!e){f.value=null,l.value=null;return}R.value&&(L.value&&!w.value.some(t=>t.profile===L.value)&&await O(),await ce())}),K(()=>z.activeProfileName,async()=>{R.value&&(z.switching||(f.value=null,l.value=null,await O(),await Z(!0)))});const p=v(new Set(JSON.parse(localStorage.getItem("hermes_collapsed_groups")||"[]")));function lt(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 B=h(()=>w.value.map(lt));function N(e){return`${e.profile||"default"}\0${e.id}`}function de(){y.value||(b.value=!b.value,b.value||(u.value.clear(),$.value=!1))}function U(e){if(y.value)return;const t=N(e);u.value.has(t)?u.value.delete(t):u.value.add(t),u.value=new Set(u.value),u.value.size===0&&($.value=!1)}function ve(e){return u.value.has(N(e))}function rt(){if(!y.value){if(pe.value){u.value.clear(),u.value=new Set(u.value),$.value=!1;return}u.value.clear();for(const e of B.value)u.value.add(N(e));u.value=new Set(u.value)}}const fe=h(()=>u.value.size),ut=h(()=>B.value.length>0),pe=h(()=>B.value.length>0&&u.value.size===B.value.length);function he(e){return e==="api_server"?-1:e==="cron"?999:0}function ge(e){return[...e].sort((t,s)=>(s.updatedAt||0)-(t.updatedAt||0))}const ee=h(()=>ge(B.value.filter(e=>D.isPinned(e.id)))),J=h(()=>{const e=new Map;for(const t of B.value){if(D.isPinned(t.id))continue;const s=t.source||"";e.has(s)||e.set(s,[]),e.get(s).push(t)}return[...e.keys()].sort((t,s)=>{const o=he(t),d=he(s);return o!==d?o-d:t.localeCompare(s)}).map(t=>({source:t,label:t?Ce(t):i("chat.other"),sessions:ge(e.get(t))}))});function ct(e){if(!p.value.has(e))p.value=new Set([...p.value,e]);else{p.value=new Set(J.value.map(s=>s.source).filter(s=>s!==e));const t=J.value.find(s=>s.source===e);t?.sessions.length&&E(t.sessions[0].id,t.sessions[0].profile)}localStorage.setItem("hermes_collapsed_groups",JSON.stringify([...p.value]))}K(J,e=>{if(localStorage.getItem("hermes_collapsed_groups")!==null){const t=l.value?.source;t&&p.value.has(t)&&(p.value=new Set([...p.value].filter(s=>s!==t)),localStorage.setItem("hermes_collapsed_groups",JSON.stringify([...p.value])));return}e.length>0&&(p.value=new Set(e.slice(1).map(t=>t.source)),localStorage.setItem("hermes_collapsed_groups",JSON.stringify([...p.value])))},{once:!0}),K(R,e=>{e&&w.value.length>0&&!F.value&&Z(!1)},{once:!0});const dt=h(()=>l.value?.title||i("chat.newChat")),_e=h(()=>l.value?.source||"");async function me(e){const t=e||f.value;t&&(await be(t)?m.success(i("common.copied")):m.error(i("common.copied")+" ✗"))}function vt(e){return l.value?.id===e?l.value.profile||null:A(e)?.profile||null}function ft(e,t){const s=T.resolve({name:"hermes.historySession",params:{sessionId:e},query:t?{profile:t}:void 0}).href;return`${window.location.origin}${window.location.pathname}${s}`}async function pt(e){const t=e||f.value;t&&(await be(ft(t,vt(t)))?m.success(i("common.copied")):m.error(i("common.copied")+" ✗"))}function we(e,t){e.preventDefault(),x.value=t,W.value=!0,re.value=e.clientX,ue.value=e.clientY}function ht(){W.value=!1}async function gt(e){const t=A(e);try{const s=await qt(e,t?.profile||null);if(s.ok){m.success(i(s.imported?"chat.importSessionSuccess":"chat.importSessionAlreadyExists")),await O();return}}catch{}m.error(i("chat.importSessionFailed"))}async function _t(e){W.value=!1,x.value&&(e==="pin"?D.togglePinned(x.value):e==="copy-link"?await pt(x.value):e==="copy-id"?await me(x.value):e==="import-webui"&&await gt(x.value))}async function ye(e,t){const s=A(e);if(!await Vt(e,t||s?.profile||null)){m.error(i("common.deleteFailed"));return}if(D.removePinned(e),w.value=w.value.filter(o=>o.id!==e),f.value===e){f.value=null,l.value=null;const o=B.value[0];o?await E(o.id,o.profile):await T.replace({name:"hermes.history"})}m.success(i("chat.sessionDeleted"))}async function mt(){if(u.value.size===0||y.value)return;const e=new Map(B.value.map(o=>[N(o),o])),t=Array.from(u.value).map(o=>e.get(o)).filter(o=>!!o).map(o=>({id:o.id,profile:o.profile||null}));if(t.length===0)return;const s=l.value?u.value.has(N(l.value)):!1;y.value=!0;try{const o=await Ot(t);if(o.deleted>0){for(const d of t)D.removePinned(d.id);await O(),(s||f.value&&!A(f.value))&&(f.value=null,l.value=null,await Z(!0)),m.success(i("chat.batchDeleteSuccess",{count:o.deleted})),o.failed>0&&m.warning(i("chat.batchDeletePartial",{failed:o.failed}))}else m.error(i("chat.batchDeleteFailed"))}catch{m.error(i("chat.batchDeleteFailed"))}finally{y.value=!1,$.value=!1,b.value=!1,u.value.clear()}}function wt(){return mt(),!1}return(e,t)=>(c(),g("div",xe,[a("div",{class:se(["session-backdrop",{active:C.value}]),onClick:t[0]||(t[0]=s=>C.value=!1)},null,2),a("aside",{class:se(["session-list",{collapsed:!C.value}])},[a("div",Be,[C.value?(c(),g("span",Pe,_(r(i)("chat.hermesHistory")),1)):k("",!0),a("div",Te,[a("button",{class:"session-close-btn",onClick:t[1]||(t[1]=s=>C.value=!1)},[...t[6]||(t[6]=[a("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[a("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),a("line",{x1:"6",y1:"6",x2:"18",y2:"18"})],-1)])]),b.value?k("",!0):(c(),I(r(H),{key:0,quaternary:"",size:"tiny",disabled:w.value.length===0,title:r(i)("chat.toggleBatchMode"),onClick:de},{icon:S(()=>[...t[7]||(t[7]=[a("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[a("path",{d:"M9 11l3 3L22 4"}),a("path",{d:"M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11"})],-1)])]),_:1},8,["disabled","title"])),b.value?(c(),I(r(H),{key:1,quaternary:"",size:"tiny",disabled:!ut.value||y.value,title:pe.value?r(i)("common.cancel"):r(i)("chat.selectAll"),onClick:rt},{icon:S(()=>[...t[8]||(t[8]=[a("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[a("path",{d:"M9 11l3 3L22 4"}),a("path",{d:"M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11"})],-1)])]),_:1},8,["disabled","title"])):k("",!0),b.value&&fe.value>0?(c(),I(r(xt),{key:2,show:$.value,"onUpdate:show":t[2]||(t[2]=s=>$.value=s),"positive-button-props":{loading:y.value,disabled:y.value},"negative-button-props":{disabled:y.value},onPositiveClick:wt},{trigger:S(()=>[P(r(H),{quaternary:"",size:"tiny",type:"error",loading:y.value,disabled:y.value},{icon:S(()=>[...t[9]||(t[9]=[a("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[a("polyline",{points:"3 6 5 6 21 6"}),a("path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"})],-1)])]),_:1},8,["loading","disabled"])]),default:S(()=>[oe(" "+_(r(i)("chat.confirmBatchDelete",{count:fe.value})),1)]),_:1},8,["show","positive-button-props","negative-button-props"])):k("",!0),b.value?(c(),I(r(H),{key:3,quaternary:"",size:"tiny",disabled:y.value,onClick:de},{icon:S(()=>[...t[10]||(t[10]=[a("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[a("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),a("line",{x1:"6",y1:"6",x2:"18",y2:"18"})],-1)])]),_:1},8,["disabled"])):k("",!0)])]),C.value?(c(),g("div",Ae,_(r(i)("chat.historyScopeHint")),1)):k("",!0),C.value?(c(),g("div",He,[Y.value&&w.value.length===0?(c(),g("div",Ie,_(r(i)("common.loading")),1)):w.value.length===0?(c(),g("div",De,_(r(i)("chat.noSessions")),1)):k("",!0),ee.value.length>0?(c(),g(q,{key:2},[a("div",$e,[a("span",Le,_(r(i)("chat.pinned")),1),a("span",Oe,_(ee.value.length),1)]),(c(!0),g(q,null,te(ee.value,s=>(c(),I(Me,{key:`pinned-${s.id}`,session:s,active:s.id===f.value,pinned:!0,"can-delete":!0,streaming:!1,selectable:b.value,selected:ve(s),"show-profile":!1,onSelect:o=>b.value?U(s):E(s.id,s.profile),onContextmenu:o=>we(o,s.id),onDelete:o=>ye(s.id,s.profile),onToggleSelect:o=>U(s)},null,8,["session","active","selectable","selected","onSelect","onContextmenu","onDelete","onToggleSelect"]))),128))],64)):k("",!0),(c(!0),g(q,null,te(J.value,s=>(c(),g(q,{key:s.source},[a("div",{class:"session-group-header",onClick:o=>ct(s.source)},[(c(),g("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2",class:se(["group-chevron",{collapsed:p.value.has(s.source)}])},[...t[11]||(t[11]=[a("polyline",{points:"9 18 15 12 9 6"},null,-1)])],2)),a("span",Ne,_(s.label),1),a("span",qe,_(s.sessions.length),1)],8,Ve),p.value.has(s.source)?k("",!0):(c(!0),g(q,{key:0},te(s.sessions,o=>(c(),I(Me,{key:o.id,session:o,active:o.id===f.value,pinned:!1,"can-delete":!0,streaming:!1,selectable:b.value,selected:ve(o),"show-profile":!1,onSelect:d=>b.value?U(o):E(o.id,o.profile),onContextmenu:d=>we(d,o.id),onDelete:d=>ye(o.id,o.profile),onToggleSelect:d=>U(o)},null,8,["session","active","selectable","selected","onSelect","onContextmenu","onDelete","onToggleSelect"]))),128))],64))),128))])):k("",!0)],2),P(r(Ct),{placement:"bottom-start",trigger:"manual",x:re.value,y:ue.value,options:ot.value,show:W.value,onSelect:_t,onClickoutside:ht},null,8,["x","y","options","show"]),a("div",ze,[a("header",Fe,[a("div",Re,[P(r(H),{quaternary:"",size:"small",onClick:t[3]||(t[3]=s=>C.value=!C.value),circle:""},{icon:S(()=>[...t[12]||(t[12]=[a("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5"},[a("rect",{x:"3",y:"3",width:"7",height:"7"}),a("rect",{x:"14",y:"3",width:"7",height:"7"}),a("rect",{x:"3",y:"14",width:"7",height:"7"}),a("rect",{x:"14",y:"14",width:"7",height:"7"})],-1)])]),_:1}),a("span",We,_(dt.value),1),_e.value?(c(),g("span",Ee,_(r(Ce)(_e.value)),1)):k("",!0),l.value?.workspace?(c(),g("span",{key:1,class:"workspace-badge",title:l.value.workspace},"📁 "+_(l.value.workspace.split("/").pop()||l.value.workspace),9,Ue)):k("",!0)]),a("div",Je,[P(r(Se),{trigger:"hover"},{trigger:S(()=>[P(r(H),{quaternary:"",size:"small",onClick:t[4]||(t[4]=s=>G.value=!G.value),circle:""},{icon:S(()=>[...t[13]||(t[13]=[a("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5"},[a("path",{d:"M3 12h18M3 6h18M3 18h18"})],-1)])]),_:1})]),default:S(()=>[oe(" "+_(r(i)("chat.outlineTitle")),1)]),_:1}),P(r(Se),{trigger:"hover"},{trigger:S(()=>[P(r(H),{quaternary:"",size:"small",onClick:t[5]||(t[5]=s=>me()),circle:""},{icon:S(()=>[...t[14]||(t[14]=[a("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5"},[a("rect",{x:"9",y:"9",width:"13",height:"13",rx:"2",ry:"2"}),a("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:S(()=>[oe(" "+_(r(i)("chat.copySessionId")),1)]),_:1})])]),a("div",Ke,[a("div",Ye,[P(es,{ref_key:"historyMessageListRef",ref:le,session:l.value,"load-older":nt},null,8,["session"])]),G.value&&l.value?(c(),I(Zt,{key:0,messages:l.value.messages||[],onNavigate:je},null,8,["messages"])):k("",!0)])])]))}})})),ts=ie((()=>{})),ss,os=ie((()=>{Ge(),Ge(),ts(),Dt(),ss=$t(Qe,[["__scopeId","data-v-eecab1cf"]])}));os();export{ss as default};
1
+ import{n as ie}from"./rolldown-runtime-M0oDzQ_3.js";import{$t as q,Cn as yt,Dn as te,Mn as K,Ot as H,Pn as S,Qn as r,Tn as c,V as St,Wn as v,Wt as kt,an as k,dn as bt,er as se,in as I,ln as oe,nn as h,nt as Ct,on as g,ot as Se,rn as a,rr as _,t as Mt,un as P,w as xt,wn as Bt}from"./ui-vendor-dYn1tJGA.js";import{c as Pt,f as Tt,l as At,m as Ht,p as It}from"./vue-vendor-DZ4A_GHn.js";import{n as Dt,t as $t}from"./_plugin-vue_export-helper-CwNymSRn.js";import{B as Lt,F as Ot,I as Vt,Q as Nt,U as qt,V as ke,W as zt,X as Ft,Y as Rt,Z as Wt,_ as Et,z as Ut}from"./index-DW8M4rjb.js";import{n as Jt,t as Kt}from"./session-browser-prefs-DjzuPSf7.js";import{n as Yt,t as be}from"./clipboard-1NPxC3YL.js";import{i as Gt,n as Qt,o as Ce,r as Me,s as Xt,t as Zt}from"./OutlinePanel-D62oj0V9.js";import{n as jt,t as es}from"./HistoryMessageList-C9ywhLVB.js";var xe,Be,Pe,Te,Ae,He,Ie,De,$e,Le,Oe,Ve,Ne,qe,ze,Fe,Re,We,Ee,Ue,Je,Ke,Ye,ae,Qe,Ge=ie((()=>{kt(),Tt(),Et(),Wt(),Rt(),Kt(),Mt(),Pt(),Xt(),Yt(),jt(),Gt(),Qt(),zt(),xe={class:"history-panel"},Be={class:"session-list-header"},Pe={key:0,class:"session-list-title"},Te={class:"session-list-actions"},Ae={key:0,class:"session-scope-note"},He={key:1,class:"session-items"},Ie={key:0,class:"session-loading"},De={key:1,class:"session-empty"},$e={class:"session-group-header session-group-header--static"},Le={class:"session-group-label"},Oe={class:"session-group-count"},Ve=["onClick"],Ne={class:"session-group-label"},qe={class:"session-group-count"},ze={class:"chat-main"},Fe={class:"chat-header"},Re={class:"header-left"},We={class:"header-session-title"},Ee={key:0,class:"source-badge"},Ue=["title"],Je={class:"header-actions"},Ke={class:"history-content-wrapper"},Ye={class:"history-main-content"},ae=300,Qe=bt({__name:"HistoryView",setup(as){const Xe=Nt(),z=Ft(),D=Jt(),m=St(),{t:i}=At(),ne=It(),T=Ht(),F=h(()=>{const e=ne.params.sessionId;return typeof e=="string"&&e.trim()?e:null}),L=h(()=>{const e=ne.query.profile;return typeof e=="string"&&e.trim()?e:null}),Ze=h(()=>z.activeProfileName||L.value||null),w=v([]),Y=v(!1),R=v(!1),f=v(null),l=v(null),G=v(!1),le=v(null),b=v(!1),y=v(!1),$=v(!1),u=v(new Set),x=v(null),W=v(!1),re=v(0),ue=v(0);let Q=0;function je(e){le.value?.scrollToAnchor(e.messageId,e.anchorId)}async function O(){const e=++Q;Y.value=!0;try{const t=await Lt(void 0,void 0,Ze.value);if(e!==Q)return;w.value=t,R.value=!0}catch(t){console.error("Failed to load Hermes sessions:",t)}finally{e===Q&&(Y.value=!1)}}const C=v(typeof window>"u"||!window.matchMedia("(max-width: 768px)").matches);let V=null;const et=v(!1);function A(e){return w.value.find(t=>t.id===e)}const tt=h(()=>x.value&&A(x.value)||null),st=h(()=>x.value?D.isPinned(x.value):!1),ot=h(()=>[{label:i("chat.importToWebUi"),key:"import-webui",disabled:!!tt.value?.webui_imported},{label:i(st.value?"chat.unpin":"chat.pin"),key:"pin"},{label:i("chat.copySessionLink"),key:"copy-link"},{label:i("chat.copySessionId"),key:"copy-id"}]);function X(e){return e.map(t=>{const s={id:String(t.id),role:t.role,content:t.content||"",timestamp:t.timestamp*1e3,reasoning:t.reasoning||void 0,systemType:t.role==="command"?"command":void 0};return t.role==="tool"&&(s.toolName=t.tool_name||void 0,s.toolCallId=t.tool_call_id||void 0,s.toolArgs=t.tool_calls?.[0]?.function?.arguments?JSON.stringify(t.tool_calls[0].function.arguments):void 0,s.toolStatus="done",s.toolResult=t.content||void 0,s.content=""),s})}function at(e,t=[]){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.ended_at||e.started_at)*1e3,model:e.model,provider:e.provider,messageCount:e.message_count,messageTotal:e.message_count,loadedMessageCount:t.length,hasMoreBefore:!1,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:t}}async function it(e,t){const s=A(e),o=t||s?.profile||null,d=await ke(e,0,ae,o);let M=null;if(d)M=at(s||d.session,X(d.messages)),M.profile=s?.profile||o||void 0,M.messageCount=d.total,M.messageTotal=d.total,M.loadedMessageCount=d.messages.length,M.hasMoreBefore=d.hasMore;else{const n=await Ut(e,o);if(!n){m.error(i("chat.sessionNotFound"));return}M={id:n.id,profile:n.profile||o||void 0,title:n.title||"",source:n.source,createdAt:n.started_at*1e3,updatedAt:(n.last_active||n.started_at)*1e3,model:n.model,provider:n.provider,messageCount:n.message_count,messageTotal:n.message_count,loadedMessageCount:n.messages.length,hasMoreBefore:!1,inputTokens:n.input_tokens,outputTokens:n.output_tokens,endedAt:n.ended_at?n.ended_at*1e3:void 0,lastActiveAt:n.last_active?n.last_active*1e3:void 0,workspace:n.workspace||void 0,messages:X(n.messages)}}f.value=M.id,l.value=M,V?.matches&&(C.value=!1)}async function nt(e){const t=l.value;if(!t||t.id!==e||t.isLoadingOlderMessages||!t.hasMoreBefore)return!1;const s=t.loadedMessageCount||0;t.isLoadingOlderMessages=!0;try{const o=await ke(e,s,ae,t.profile);if(!o||o.messages.length===0)return t.hasMoreBefore=!1,!1;const d=new Set(t.messages.map(n=>n.id)),M=X(o.messages).filter(n=>!d.has(n.id));return t.messages=[...M,...t.messages],t.loadedMessageCount=s+o.messages.length,t.messageTotal=o.total,t.messageCount=o.total,t.hasMoreBefore=o.hasMore,M.length>0}catch(o){return console.error("Failed to load older history messages:",o),!1}finally{t.isLoadingOlderMessages=!1}}async function E(e,t){await T.push({name:"hermes.historySession",params:{sessionId:e},query:t?{profile:t}:void 0})}async function Z(e=!1){const t=w.value.find(o=>o.source==="cli")||w.value[0];if(!t){f.value=null,l.value=null,F.value&&await T.replace({name:"hermes.history"});return}p.value.has(t.source)&&(p.value=new Set([...p.value].filter(o=>o!==t.source)));const s={name:"hermes.historySession",params:{sessionId:t.id},query:t.profile?{profile:t.profile}:void 0};e?await T.replace(s):await T.push(s)}async function ce(){const e=F.value;if(!e)return;if(!w.value.some(o=>o.id===e)){f.value=null,l.value=null,await T.replace({name:"hermes.history"});return}const t=L.value||A(e)?.profile||null,s=l.value?.profile||null;(f.value!==e||s!==t)&&(f.value=e,l.value=null,await it(e,t))}function j(e){et.value=e.matches,e.matches&&C.value&&(C.value=!1)}yt(async()=>{Xe.loadModels(),await z.fetchProfiles(),await O(),await ce(),V=window.matchMedia("(max-width: 768px)"),j(V),V.addEventListener("change",j)}),Bt(()=>{V?.removeEventListener("change",j)}),K([F,L],async([e])=>{if(!e){f.value=null,l.value=null;return}R.value&&(L.value&&!w.value.some(t=>t.profile===L.value)&&await O(),await ce())}),K(()=>z.activeProfileName,async()=>{R.value&&(z.switching||(f.value=null,l.value=null,await O(),await Z(!0)))});const p=v(new Set(JSON.parse(localStorage.getItem("hermes_collapsed_groups")||"[]")));function lt(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 B=h(()=>w.value.map(lt));function N(e){return`${e.profile||"default"}\0${e.id}`}function de(){y.value||(b.value=!b.value,b.value||(u.value.clear(),$.value=!1))}function U(e){if(y.value)return;const t=N(e);u.value.has(t)?u.value.delete(t):u.value.add(t),u.value=new Set(u.value),u.value.size===0&&($.value=!1)}function ve(e){return u.value.has(N(e))}function rt(){if(!y.value){if(pe.value){u.value.clear(),u.value=new Set(u.value),$.value=!1;return}u.value.clear();for(const e of B.value)u.value.add(N(e));u.value=new Set(u.value)}}const fe=h(()=>u.value.size),ut=h(()=>B.value.length>0),pe=h(()=>B.value.length>0&&u.value.size===B.value.length);function he(e){return e==="api_server"?-1:e==="cron"?999:0}function ge(e){return[...e].sort((t,s)=>(s.updatedAt||0)-(t.updatedAt||0))}const ee=h(()=>ge(B.value.filter(e=>D.isPinned(e.id)))),J=h(()=>{const e=new Map;for(const t of B.value){if(D.isPinned(t.id))continue;const s=t.source||"";e.has(s)||e.set(s,[]),e.get(s).push(t)}return[...e.keys()].sort((t,s)=>{const o=he(t),d=he(s);return o!==d?o-d:t.localeCompare(s)}).map(t=>({source:t,label:t?Ce(t):i("chat.other"),sessions:ge(e.get(t))}))});function ct(e){if(!p.value.has(e))p.value=new Set([...p.value,e]);else{p.value=new Set(J.value.map(s=>s.source).filter(s=>s!==e));const t=J.value.find(s=>s.source===e);t?.sessions.length&&E(t.sessions[0].id,t.sessions[0].profile)}localStorage.setItem("hermes_collapsed_groups",JSON.stringify([...p.value]))}K(J,e=>{if(localStorage.getItem("hermes_collapsed_groups")!==null){const t=l.value?.source;t&&p.value.has(t)&&(p.value=new Set([...p.value].filter(s=>s!==t)),localStorage.setItem("hermes_collapsed_groups",JSON.stringify([...p.value])));return}e.length>0&&(p.value=new Set(e.slice(1).map(t=>t.source)),localStorage.setItem("hermes_collapsed_groups",JSON.stringify([...p.value])))},{once:!0}),K(R,e=>{e&&w.value.length>0&&!F.value&&Z(!1)},{once:!0});const dt=h(()=>l.value?.title||i("chat.newChat")),_e=h(()=>l.value?.source||"");async function me(e){const t=e||f.value;t&&(await be(t)?m.success(i("common.copied")):m.error(i("common.copied")+" ✗"))}function vt(e){return l.value?.id===e?l.value.profile||null:A(e)?.profile||null}function ft(e,t){const s=T.resolve({name:"hermes.historySession",params:{sessionId:e},query:t?{profile:t}:void 0}).href;return`${window.location.origin}${window.location.pathname}${s}`}async function pt(e){const t=e||f.value;t&&(await be(ft(t,vt(t)))?m.success(i("common.copied")):m.error(i("common.copied")+" ✗"))}function we(e,t){e.preventDefault(),x.value=t,W.value=!0,re.value=e.clientX,ue.value=e.clientY}function ht(){W.value=!1}async function gt(e){const t=A(e);try{const s=await qt(e,t?.profile||null);if(s.ok){m.success(i(s.imported?"chat.importSessionSuccess":"chat.importSessionAlreadyExists")),await O();return}}catch{}m.error(i("chat.importSessionFailed"))}async function _t(e){W.value=!1,x.value&&(e==="pin"?D.togglePinned(x.value):e==="copy-link"?await pt(x.value):e==="copy-id"?await me(x.value):e==="import-webui"&&await gt(x.value))}async function ye(e,t){const s=A(e);if(!await Vt(e,t||s?.profile||null)){m.error(i("common.deleteFailed"));return}if(D.removePinned(e),w.value=w.value.filter(o=>o.id!==e),f.value===e){f.value=null,l.value=null;const o=B.value[0];o?await E(o.id,o.profile):await T.replace({name:"hermes.history"})}m.success(i("chat.sessionDeleted"))}async function mt(){if(u.value.size===0||y.value)return;const e=new Map(B.value.map(o=>[N(o),o])),t=Array.from(u.value).map(o=>e.get(o)).filter(o=>!!o).map(o=>({id:o.id,profile:o.profile||null}));if(t.length===0)return;const s=l.value?u.value.has(N(l.value)):!1;y.value=!0;try{const o=await Ot(t);if(o.deleted>0){for(const d of t)D.removePinned(d.id);await O(),(s||f.value&&!A(f.value))&&(f.value=null,l.value=null,await Z(!0)),m.success(i("chat.batchDeleteSuccess",{count:o.deleted})),o.failed>0&&m.warning(i("chat.batchDeletePartial",{failed:o.failed}))}else m.error(i("chat.batchDeleteFailed"))}catch{m.error(i("chat.batchDeleteFailed"))}finally{y.value=!1,$.value=!1,b.value=!1,u.value.clear()}}function wt(){return mt(),!1}return(e,t)=>(c(),g("div",xe,[a("div",{class:se(["session-backdrop",{active:C.value}]),onClick:t[0]||(t[0]=s=>C.value=!1)},null,2),a("aside",{class:se(["session-list",{collapsed:!C.value}])},[a("div",Be,[C.value?(c(),g("span",Pe,_(r(i)("chat.hermesHistory")),1)):k("",!0),a("div",Te,[a("button",{class:"session-close-btn",onClick:t[1]||(t[1]=s=>C.value=!1)},[...t[6]||(t[6]=[a("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[a("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),a("line",{x1:"6",y1:"6",x2:"18",y2:"18"})],-1)])]),b.value?k("",!0):(c(),I(r(H),{key:0,quaternary:"",size:"tiny",disabled:w.value.length===0,title:r(i)("chat.toggleBatchMode"),onClick:de},{icon:S(()=>[...t[7]||(t[7]=[a("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[a("path",{d:"M9 11l3 3L22 4"}),a("path",{d:"M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11"})],-1)])]),_:1},8,["disabled","title"])),b.value?(c(),I(r(H),{key:1,quaternary:"",size:"tiny",disabled:!ut.value||y.value,title:pe.value?r(i)("common.cancel"):r(i)("chat.selectAll"),onClick:rt},{icon:S(()=>[...t[8]||(t[8]=[a("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[a("path",{d:"M9 11l3 3L22 4"}),a("path",{d:"M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11"})],-1)])]),_:1},8,["disabled","title"])):k("",!0),b.value&&fe.value>0?(c(),I(r(xt),{key:2,show:$.value,"onUpdate:show":t[2]||(t[2]=s=>$.value=s),"positive-button-props":{loading:y.value,disabled:y.value},"negative-button-props":{disabled:y.value},onPositiveClick:wt},{trigger:S(()=>[P(r(H),{quaternary:"",size:"tiny",type:"error",loading:y.value,disabled:y.value},{icon:S(()=>[...t[9]||(t[9]=[a("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[a("polyline",{points:"3 6 5 6 21 6"}),a("path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"})],-1)])]),_:1},8,["loading","disabled"])]),default:S(()=>[oe(" "+_(r(i)("chat.confirmBatchDelete",{count:fe.value})),1)]),_:1},8,["show","positive-button-props","negative-button-props"])):k("",!0),b.value?(c(),I(r(H),{key:3,quaternary:"",size:"tiny",disabled:y.value,onClick:de},{icon:S(()=>[...t[10]||(t[10]=[a("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[a("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),a("line",{x1:"6",y1:"6",x2:"18",y2:"18"})],-1)])]),_:1},8,["disabled"])):k("",!0)])]),C.value?(c(),g("div",Ae,_(r(i)("chat.historyScopeHint")),1)):k("",!0),C.value?(c(),g("div",He,[Y.value&&w.value.length===0?(c(),g("div",Ie,_(r(i)("common.loading")),1)):w.value.length===0?(c(),g("div",De,_(r(i)("chat.noSessions")),1)):k("",!0),ee.value.length>0?(c(),g(q,{key:2},[a("div",$e,[a("span",Le,_(r(i)("chat.pinned")),1),a("span",Oe,_(ee.value.length),1)]),(c(!0),g(q,null,te(ee.value,s=>(c(),I(Me,{key:`pinned-${s.id}`,session:s,active:s.id===f.value,pinned:!0,"can-delete":!0,streaming:!1,selectable:b.value,selected:ve(s),"show-profile":!1,onSelect:o=>b.value?U(s):E(s.id,s.profile),onContextmenu:o=>we(o,s.id),onDelete:o=>ye(s.id,s.profile),onToggleSelect:o=>U(s)},null,8,["session","active","selectable","selected","onSelect","onContextmenu","onDelete","onToggleSelect"]))),128))],64)):k("",!0),(c(!0),g(q,null,te(J.value,s=>(c(),g(q,{key:s.source},[a("div",{class:"session-group-header",onClick:o=>ct(s.source)},[(c(),g("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2",class:se(["group-chevron",{collapsed:p.value.has(s.source)}])},[...t[11]||(t[11]=[a("polyline",{points:"9 18 15 12 9 6"},null,-1)])],2)),a("span",Ne,_(s.label),1),a("span",qe,_(s.sessions.length),1)],8,Ve),p.value.has(s.source)?k("",!0):(c(!0),g(q,{key:0},te(s.sessions,o=>(c(),I(Me,{key:o.id,session:o,active:o.id===f.value,pinned:!1,"can-delete":!0,streaming:!1,selectable:b.value,selected:ve(o),"show-profile":!1,onSelect:d=>b.value?U(o):E(o.id,o.profile),onContextmenu:d=>we(d,o.id),onDelete:d=>ye(o.id,o.profile),onToggleSelect:d=>U(o)},null,8,["session","active","selectable","selected","onSelect","onContextmenu","onDelete","onToggleSelect"]))),128))],64))),128))])):k("",!0)],2),P(r(Ct),{placement:"bottom-start",trigger:"manual",x:re.value,y:ue.value,options:ot.value,show:W.value,onSelect:_t,onClickoutside:ht},null,8,["x","y","options","show"]),a("div",ze,[a("header",Fe,[a("div",Re,[P(r(H),{quaternary:"",size:"small",onClick:t[3]||(t[3]=s=>C.value=!C.value),circle:""},{icon:S(()=>[...t[12]||(t[12]=[a("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5"},[a("rect",{x:"3",y:"3",width:"7",height:"7"}),a("rect",{x:"14",y:"3",width:"7",height:"7"}),a("rect",{x:"3",y:"14",width:"7",height:"7"}),a("rect",{x:"14",y:"14",width:"7",height:"7"})],-1)])]),_:1}),a("span",We,_(dt.value),1),_e.value?(c(),g("span",Ee,_(r(Ce)(_e.value)),1)):k("",!0),l.value?.workspace?(c(),g("span",{key:1,class:"workspace-badge",title:l.value.workspace},"📁 "+_(l.value.workspace.split("/").pop()||l.value.workspace),9,Ue)):k("",!0)]),a("div",Je,[P(r(Se),{trigger:"hover"},{trigger:S(()=>[P(r(H),{quaternary:"",size:"small",onClick:t[4]||(t[4]=s=>G.value=!G.value),circle:""},{icon:S(()=>[...t[13]||(t[13]=[a("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5"},[a("path",{d:"M3 12h18M3 6h18M3 18h18"})],-1)])]),_:1})]),default:S(()=>[oe(" "+_(r(i)("chat.outlineTitle")),1)]),_:1}),P(r(Se),{trigger:"hover"},{trigger:S(()=>[P(r(H),{quaternary:"",size:"small",onClick:t[5]||(t[5]=s=>me()),circle:""},{icon:S(()=>[...t[14]||(t[14]=[a("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5"},[a("rect",{x:"9",y:"9",width:"13",height:"13",rx:"2",ry:"2"}),a("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:S(()=>[oe(" "+_(r(i)("chat.copySessionId")),1)]),_:1})])]),a("div",Ke,[a("div",Ye,[P(es,{ref_key:"historyMessageListRef",ref:le,session:l.value,"load-older":nt},null,8,["session"])]),G.value&&l.value?(c(),I(Zt,{key:0,messages:l.value.messages||[],onNavigate:je},null,8,["messages"])):k("",!0)])])]))}})})),ts=ie((()=>{})),ss,os=ie((()=>{Ge(),Ge(),ts(),Dt(),ss=$t(Qe,[["__scopeId","data-v-eecab1cf"]])}));os();export{ss as default};
@@ -1 +1 @@
1
- import{n as w}from"./rolldown-runtime-M0oDzQ_3.js";import{$t as D,A as rt,Cn as We,Dn as Ke,E as ut,Ht as dt,K as ct,Mn as bt,O as q,Ot as E,Pn as _,Pt as G,Qn as a,Qt as V,St as _t,Tn as h,V as Qe,Wn as S,Wt as U,an as T,bt as vt,cn as pt,dn as O,er as Z,g as te,in as M,ln as k,mt as se,nn as R,on as C,ot as ee,rn as i,rr as d,t as X,un as y}from"./ui-vendor-dYn1tJGA.js";import{_ as ft,c as z,g as mt,l as A}from"./vue-vendor-DZ4A_GHn.js";import{f as N,n as L,t as W,u as Xe}from"./_plugin-vue_export-helper-uEMLHKI8.js";import{C as yt,S as jt,X as ht,Y as gt}from"./index-1yNqMnGv.js";import{n as wt,t as Jt}from"./MarkdownRenderer-Jwbx4dOP.js";function B(e){return e.job}function Ye(e){return typeof e=="object"&&e!==null}function Q(e,o=""){if(typeof e=="string")return e;if(!Ye(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 xt(e,o="—"){if(typeof e=="string")return e;if(!Ye(e))return o;if(e.kind==="cron")return e.expr||e.display||o;if(e.kind==="interval"||e.kind==="once")return e.display||Q(e,o);const t=e;return t.display||t.expr||t.run_at||o}function Ge(e){return e&&typeof e=="object"?e.times??null:null}function kt(e,o){const t={},j=Q(e.schedule,e.schedule_display||""),n=Ge(e.repeat),p=e.deliver||"origin";return o.name!==e.name&&(t.name=o.name),o.schedule!==j&&(t.schedule=o.schedule),o.prompt!==(e.prompt||"")&&(t.prompt=o.prompt),o.deliver!==p&&(t.deliver=o.deliver),o.repeat_times!==n&&(t.repeat=o.repeat_times),t}async function $t(){return(await N("/api/hermes/jobs?include_disabled=true")).jobs}async function Ct(e){return B(await N(`/api/hermes/jobs/${e}`))}async function St(e){return B(await N("/api/hermes/jobs",{method:"POST",body:JSON.stringify(e)}))}async function It(e,o){return B(await N(`/api/hermes/jobs/${e}`,{method:"PATCH",body:JSON.stringify(o)}))}async function Pt(e){return N(`/api/hermes/jobs/${e}`,{method:"DELETE"})}async function Mt(e){return B(await N(`/api/hermes/jobs/${e}/pause`,{method:"POST"}))}async function Rt(e){return B(await N(`/api/hermes/jobs/${e}/resume`,{method:"POST"}))}async function Nt(e){return B(await N(`/api/hermes/jobs/${e}/run`,{method:"POST"}))}var ae=w((()=>{Xe()}));function H(e,o){return e.job_id===o||e.id===o}var K,Y=w((()=>{ft(),U(),ae(),K=mt("jobs",()=>{const e=S([]),o=S(!1);async function t(){o.value=!0;try{e.value=await $t()}catch(c){console.error("Failed to fetch jobs:",c)}finally{o.value=!1}}async function j(c){const s=await St(c);return e.value.unshift(s),s}async function n(c,s){const g=await It(c,s),r=e.value.findIndex(P=>H(P,c));return r!==-1&&(e.value[r]=g),g}async function p(c){await Pt(c),e.value=e.value.filter(s=>!H(s,c))}async function v(c){const s=await Mt(c),g=e.value.findIndex(r=>H(r,c));g!==-1&&(e.value[g]=s)}async function f(c){const s=await Rt(c),g=e.value.findIndex(r=>H(r,c));g!==-1&&(e.value[g]=s)}async function $(c){const s=await Nt(c),g=e.value.findIndex(r=>H(r,c));g!==-1&&(e.value[g]=s)}return{jobs:e,loading:o,fetchJobs:t,createJob:j,updateJob:n,deleteJob:p,pauseJob:v,resumeJob:f,runJob:$}})})),ne,le,ie,re,ue,de,ce,be,_e,ve,pe,fe,me,ye,je,he,ge,we,Je,xe,ke,$e,Ze,Ce=w((()=>{U(),X(),ae(),Y(),z(),ne={class:"card-header"},le={class:"job-name"},ie={class:"card-body"},re={class:"info-row"},ue={class:"info-label"},de={class:"info-value mono"},ce={class:"info-row"},be={class:"info-label"},_e={class:"info-value mono"},ve={class:"info-row"},pe={class:"info-label"},fe={class:"info-value"},me={class:"info-row"},ye={class:"info-label"},je={class:"info-value"},he={class:"info-row"},ge={class:"info-label"},we={class:"info-value"},Je={key:0,class:"info-row"},xe={class:"info-label"},ke={class:"info-value"},$e={class:"card-actions"},Ze=O({__name:"JobCard",props:{job:{},selected:{type:Boolean}},emits:["edit","select"],setup(e,{emit:o}){const t=e,j=o,{t:n}=A(),p=K(),v=Qe(),f=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")),c=R(()=>t.job.state==="running"?"info":t.job.state==="paused"?"warning":t.job.enabled?"success":"error"),s=R(()=>xt(t.job.schedule,t.job.schedule_display||"—")),g=b=>b?new Date(b).toLocaleString():"—";async function r(){try{await p.pauseJob(f.value),v.success(n("jobs.jobPaused"))}catch(b){v.error(b.message)}}async function P(){try{await p.resumeJob(f.value),v.success(n("jobs.jobResumed"))}catch(b){v.error(b.message)}}async function u(){try{await p.runJob(f.value),v.info(n("jobs.jobTriggered"))}catch(b){v.error(b.message)}}async function I(){try{await p.deleteJob(f.value),v.success(n("jobs.jobDeleted"))}catch(b){v.error(b.message)}}function J(b){b.target.closest(".card-actions")||j("select",f.value)}return(b,F)=>(h(),C("div",{class:Z(["job-card",{selected:e.selected}]),onClick:J},[i("div",ne,[i("h3",le,d(e.job.name),1),i("span",{class:Z(["status-badge",c.value])},d($.value),3)]),i("div",ie,[i("div",re,[i("span",ue,d(a(n)("jobs.info.schedule")),1),i("code",de,d(s.value),1)]),i("div",ce,[i("span",be,d(a(n)("jobs.info.model")),1),i("span",_e,d(e.job.model||"—"),1)]),i("div",ve,[i("span",pe,d(a(n)("jobs.info.lastRun")),1),i("span",fe,[k(d(g(e.job.last_run_at))+" ",1),e.job.last_status?(h(),C("span",{key:0,class:Z(["run-status",{ok:e.job.last_status==="ok",err:e.job.last_status!=="ok"}])},d(e.job.last_status==="ok"?a(n)("common.ok"):e.job.last_status),3)):T("",!0)])]),i("div",me,[i("span",ye,d(a(n)("jobs.info.nextRun")),1),i("span",je,d(g(e.job.next_run_at)),1)]),i("div",he,[i("span",ge,d(a(n)("jobs.info.deliver")),1),i("span",we,[k(d(e.job.deliver),1),e.job.origin?(h(),C(D,{key:0},[k(" ("+d(e.job.origin.platform)+")",1)],64)):T("",!0)])]),e.job.repeat?(h(),C("div",Je,[i("span",xe,d(a(n)("jobs.info.repeat")),1),i("span",ke,[typeof e.job.repeat=="string"?(h(),C(D,{key:0},[k(d(e.job.repeat),1)],64)):(h(),C(D,{key:1},[k(d(e.job.repeat.completed)+" / "+d(e.job.repeat.times??"∞"),1)],64))])])):T("",!0)]),i("div",$e,[e.job.state!=="paused"&&e.job.enabled?(h(),M(a(ee),{key:0},{trigger:_(()=>[y(a(E),{size:"tiny",quaternary:"",onClick:V(r,["stop"])},{default:_(()=>[k(d(a(n)("jobs.action.pause")),1)]),_:1})]),default:_(()=>[k(" "+d(a(n)("jobs.action.pauseJob")),1)]),_:1})):e.job.state==="paused"?(h(),M(a(ee),{key:1},{trigger:_(()=>[y(a(E),{size:"tiny",quaternary:"",onClick:V(P,["stop"])},{default:_(()=>[k(d(a(n)("jobs.action.resume")),1)]),_:1})]),default:_(()=>[k(" "+d(a(n)("jobs.action.resumeJob")),1)]),_:1})):T("",!0),y(a(ee),null,{trigger:_(()=>[y(a(E),{size:"tiny",quaternary:"",onClick:V(u,["stop"])},{default:_(()=>[k(d(a(n)("jobs.action.runNow")),1)]),_:1})]),default:_(()=>[k(" "+d(a(n)("jobs.action.triggerImmediately")),1)]),_:1}),y(a(E),{size:"tiny",quaternary:"",onClick:F[0]||(F[0]=V(oe=>j("edit",f.value),["stop"]))},{default:_(()=>[k(d(a(n)("common.edit")),1)]),_:1}),y(a(E),{size:"tiny",quaternary:"",type:"error",onClick:V(I,["stop"])},{default:_(()=>[k(d(a(n)("common.delete")),1)]),_:1})])],2))}})})),Et=w((()=>{})),et,Tt=w((()=>{Ce(),Ce(),Et(),L(),et=W(Ze,[["__scopeId","data-v-54aca7fb"]])})),Se,Ie,tt,Pe=w((()=>{U(),Tt(),Y(),z(),Se={key:0,class:"empty-state"},Ie={key:1,class:"jobs-grid"},tt=O({__name:"JobsPanel",props:{selectedJobId:{}},emits:["edit","select"],setup(e,{emit:o}){const t=e,j=o,{t:n}=A(),p=K();function v($){j("select",t.selectedJobId===$?null:$)}function f(){t.selectedJobId&&j("select",null)}return($,c)=>(h(),C(D,null,[a(p).jobs.length===0?(h(),C("div",Se,[c[0]||(c[0]=pt('<svg width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" class="empty-icon" data-v-bfc747c9><rect x="3" y="4" width="18" height="18" rx="2" ry="2" data-v-bfc747c9></rect><line x1="16" y1="2" x2="16" y2="6" data-v-bfc747c9></line><line x1="8" y1="2" x2="8" y2="6" data-v-bfc747c9></line><line x1="3" y1="10" x2="21" y2="10" data-v-bfc747c9></line></svg>',1)),i("p",null,d(a(n)("jobs.noJobs")),1)])):(h(),C("div",Ie,[(h(!0),C(D,null,Ke(a(p).jobs,s=>(h(),M(et,{key:s.id,job:s,selected:e.selectedJobId===(s.job_id||s.id),onEdit:g=>j("edit",s.id),onSelect:v},null,8,["job","selected","onEdit"]))),128))])),e.selectedJobId?(h(),C("div",{key:2,class:"deselect-overlay",onClick:f})):T("",!0)],64))}})})),Ft=w((()=>{})),at,qt=w((()=>{Pe(),Pe(),Ft(),L(),at=W(tt,[["__scopeId","data-v-bfc747c9"]])}));async function Dt(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 Bt=w((()=>{Xe()})),Me,Re,Ne,Ee,Te,Fe,ot,qe=w((()=>{U(),X(),z(),Bt(),wt(),Me={class:"run-history"},Re={class:"history-header"},Ne={class:"history-title"},Ee={class:"history-count"},Te={class:"history-body"},Fe={class:"run-meta"},ot=O({__name:"JobRunHistory",props:{selectedJobId:{},jobNameMap:{},profileKey:{}},setup(e){const o=e,{t}=A(),j=S(!1),n=S([]),p=S({}),v=S({}),f=R(()=>o.selectedJobId?n.value.filter(r=>r.jobId===o.selectedJobId):n.value);async function $(){j.value=!0;try{n.value=await Dt(o.selectedJobId??void 0)}catch(r){console.error("Failed to fetch cron runs:",r),n.value=[]}finally{j.value=!1}}async function c(r){const P=Array.isArray(r)?r:r!=null?[r]:[];for(const u of P){const I=String(u);if(p.value[I]||v.value[I])continue;const J=f.value.find(b=>`${b.jobId}/${b.fileName}`===I);if(J){v.value[I]=!0;try{const b=await Ut(J.jobId,J.fileName);p.value[I]=b.content}catch{p.value[I]="[Error loading content]"}finally{v.value[I]=!1}}}}function s(r){return r<1024?`${r}B`:r<1024*1024?`${(r/1024).toFixed(1)}KB`:`${(r/1024/1024).toFixed(1)}MB`}function g(r){return o.jobNameMap[r]||r}return bt(()=>[o.selectedJobId,o.profileKey],()=>{p.value={},$()},{immediate:!0}),(r,P)=>(h(),C("div",Me,[i("div",Re,[i("span",Ne,d(a(t)("jobs.runHistory.title")),1),i("span",Ee,d(f.value.length)+" "+d(a(t)("jobs.runHistory.runs")),1)]),i("div",Te,[y(a(te),{show:j.value},{default:_(()=>[!j.value&&f.value.length===0?(h(),M(a(dt),{key:0,description:a(t)("jobs.runHistory.noRuns")},null,8,["description"])):(h(),M(a(_t),{key:1,accordion:"","onUpdate:expandedNames":c},{default:_(()=>[(h(!0),C(D,null,Ke(f.value,u=>(h(),M(a(vt),{key:`${u.jobId}/${u.fileName}`,title:`${g(u.jobId)} — ${u.runTime}`,name:`${u.jobId}/${u.fileName}`},{"header-extra":_(()=>[i("span",Fe,d(s(u.size)),1)]),default:_(()=>[v.value[`${u.jobId}/${u.fileName}`]?(h(),M(a(te),{key:0,size:"small"})):p.value[`${u.jobId}/${u.fileName}`]?(h(),M(Jt,{key:1,content:p.value[`${u.jobId}/${u.fileName}`]},null,8,["content"])):T("",!0)]),_:2},1032,["title","name"]))),128))]),_:1}))]),_:1},8,["show"])])]))}})})),Vt=w((()=>{})),st,Ht=w((()=>{qe(),qe(),Vt(),L(),st=W(ot,[["__scopeId","data-v-bed5e9a2"]])})),De,nt,Ue=w((()=>{U(),X(),Y(),jt(),ae(),z(),De={class:"modal-footer"},nt=O({__name:"JobFormModal",props:{jobId:{}},emits:["close","saved"],setup(e,{emit:o}){const{t}=A(),j=e,n=o,p=K(),v=yt(),f=Qe(),$=S(!0),c=S(!1),s=S({name:"",schedule:"",prompt:"",deliver:"origin",repeat_times:null}),g=S(null),r=R(()=>!!j.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 * *"}]);function u(m){return typeof m=="string"&&m.trim().length>0}function I(m){const l=v.platforms[m]||{};switch(m){case"telegram":case"discord":case"slack":return u(l.token);case"whatsapp":return l.enabled===!0||l.enabled==="true";case"matrix":return u(l.token)&&u(l.extra?.homeserver);case"weixin":return u(l.token)&&u(l.extra?.account_id);case"wecom":return u(l.extra?.bot_id)&&u(l.extra?.secret);case"feishu":return u(l.extra?.app_id)&&u(l.extra?.app_secret);case"dingtalk":return u(l.extra?.client_id)&&u(l.extra?.client_secret)||u(l.extra?.app_key)&&u(l.extra?.client_secret);case"qqbot":return u(l.extra?.app_id)&&u(l.extra?.client_secret);default:return!1}}const J=R(()=>{const m=[{label:t("jobs.origin"),value:"origin"},{label:t("jobs.local"),value:"local"}];for(const l 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"},{key:"qqbot",label:"QQBot"}])m.push({label:l.label,value:l.key,disabled:!I(l.key)});return m}),b=S(null);We(async()=>{if(Object.keys(v.platforms||{}).length===0&&await v.fetchSettings(),j.jobId)try{const m=await Ct(j.jobId);b.value=m,s.value={name:m.name,schedule:Q(m.schedule,m.schedule_display||""),prompt:m.prompt,deliver:m.deliver||"origin",repeat_times:Ge(m.repeat)}}catch(m){f.error(t("jobs.loadFailed")+": "+m.message)}});async function F(){if(!s.value.name.trim()){f.warning(t("jobs.nameRequired"));return}if(!s.value.schedule.trim()){f.warning(t("jobs.scheduleRequired"));return}c.value=!0;try{if(r.value){if(!b.value){f.error(t("jobs.loadFailed"));return}const m=kt(b.value,s.value);if(Object.keys(m).length===0){f.success(t("jobs.jobUpdated")),n("saved");return}await p.updateJob(j.jobId,m),f.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 p.createJob(m),f.success(t("jobs.jobCreated"))}n("saved")}catch(m){f.error(m.message)}finally{c.value=!1}}function oe(){$.value=!1,setTimeout(()=>n("close"),200)}return(m,l)=>(h(),M(a(ct),{show:$.value,"onUpdate:show":l[7]||(l[7]=x=>$.value=x),preset:"card",title:r.value?a(t)("jobs.editJob"):a(t)("jobs.createJob"),style:{width:"min(520px, calc(100vw - 32px))"},"mask-closable":!c.value,onAfterLeave:l[8]||(l[8]=x=>n("close"))},{footer:_(()=>[i("div",De,[y(a(E),{onClick:oe},{default:_(()=>[k(d(a(t)("common.cancel")),1)]),_:1}),y(a(E),{type:"primary",loading:c.value,onClick:F},{default:_(()=>[k(d(r.value?a(t)("common.update"):a(t)("common.create")),1)]),_:1},8,["loading"])])]),default:_(()=>[y(a(rt),{"label-placement":"top"},{default:_(()=>[y(a(q),{label:a(t)("jobs.name"),required:""},{default:_(()=>[y(a(G),{value:s.value.name,"onUpdate:value":l[0]||(l[0]=x=>s.value.name=x),placeholder:a(t)("jobs.namePlaceholder"),maxlength:"200","show-count":""},null,8,["value","placeholder"])]),_:1},8,["label"]),y(a(q),{label:a(t)("jobs.schedule"),required:""},{default:_(()=>[y(a(G),{value:s.value.schedule,"onUpdate:value":l[1]||(l[1]=x=>s.value.schedule=x),placeholder:a(t)("jobs.schedulePlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),y(a(q),{label:a(t)("jobs.quickPresets")},{default:_(()=>[y(a(se),{value:g.value,"onUpdate:value":[l[2]||(l[2]=x=>g.value=x),l[3]||(l[3]=x=>s.value.schedule=x)],options:P.value,placeholder:a(t)("jobs.selectPreset")},null,8,["value","options","placeholder"])]),_:1},8,["label"]),y(a(q),{label:a(t)("jobs.prompt"),required:""},{default:_(()=>[y(a(G),{value:s.value.prompt,"onUpdate:value":l[4]||(l[4]=x=>s.value.prompt=x),type:"textarea",placeholder:a(t)("jobs.promptPlaceholder"),rows:4,maxlength:"5000","show-count":""},null,8,["value","placeholder"])]),_:1},8,["label"]),y(a(q),{label:a(t)("jobs.deliverTarget")},{default:_(()=>[y(a(se),{value:s.value.deliver,"onUpdate:value":l[5]||(l[5]=x=>s.value.deliver=x),options:J.value},null,8,["value","options"])]),_:1},8,["label"]),y(a(q),{label:a(t)("jobs.repeatCount")},{default:_(()=>[y(a(ut),{value:s.value.repeat_times,"onUpdate:value":l[6]||(l[6]=x=>s.value.repeat_times=x),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"]))}})})),Ot=w((()=>{})),lt,zt=w((()=>{Ue(),Ue(),Ot(),L(),lt=W(nt,[["__scopeId","data-v-5c6a9f43"]])})),Be,Ve,He,Oe,ze,Ae,it,Le=w((()=>{U(),X(),z(),qt(),Ht(),zt(),Y(),gt(),Be={class:"jobs-view"},Ve={class:"page-header"},He={class:"header-title"},Oe={class:"jobs-split"},ze={class:"jobs-top"},Ae={class:"jobs-bottom"},it=O({__name:"JobsView",setup(e){const{t:o}=A(),t=K(),j=ht(),n=S(!1),p=S(null),v=S(null),f=R(()=>j.activeProfileName||"default"),$=R(()=>{const J={};for(const b of t.jobs){const F=b.job_id||b.id;J[F]=b.name}return J});async function c(){(!j.activeProfileName||j.profiles.length===0)&&await j.fetchProfiles()}async function s(){v.value=null,t.jobs=[],await c(),await t.fetchJobs()}We(()=>{s()});function g(){p.value=null,n.value=!0}function r(J){p.value=J,n.value=!0}function P(){n.value=!1,p.value=null}async function u(){await t.fetchJobs(),P()}function I(J){v.value=v.value===J?null:J}return(J,b)=>(h(),C("div",Be,[i("header",Ve,[i("h2",He,d(a(o)("jobs.title")),1),y(a(E),{type:"primary",size:"small",onClick:g},{icon:_(()=>[...b[0]||(b[0]=[i("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[i("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),i("line",{x1:"5",y1:"12",x2:"19",y2:"12"})],-1)])]),default:_(()=>[k(" "+d(a(o)("jobs.createJob")),1)]),_:1})]),i("div",Oe,[i("div",ze,[y(a(te),{show:a(t).loading&&a(t).jobs.length===0},{default:_(()=>[y(at,{"selected-job-id":v.value,onEdit:r,onSelect:I},null,8,["selected-job-id"])]),_:1},8,["show"])]),b[1]||(b[1]=i("div",{class:"splitter"},null,-1)),i("div",Ae,[y(st,{"selected-job-id":v.value,"job-name-map":$.value,"profile-key":f.value},null,8,["selected-job-id","job-name-map","profile-key"])])]),n.value?(h(),M(lt,{key:0,"job-id":p.value,onClose:P,onSaved:u},null,8,["job-id"])):T("",!0)]))}})})),At=w((()=>{})),Lt,Wt=w((()=>{Le(),Le(),At(),L(),Lt=W(it,[["__scopeId","data-v-409c1932"]])}));Wt();export{Lt as default};
1
+ import{n as w}from"./rolldown-runtime-M0oDzQ_3.js";import{$t as D,A as rt,Cn as We,Dn as Ke,E as ut,Ht as dt,K as ct,Mn as bt,O as q,Ot as E,Pn as _,Pt as G,Qn as a,Qt as V,St as _t,Tn as h,V as Qe,Wn as S,Wt as U,an as T,bt as vt,cn as pt,dn as O,er as Z,g as te,in as M,ln as k,mt as se,nn as R,on as C,ot as ee,rn as i,rr as d,t as X,un as y}from"./ui-vendor-dYn1tJGA.js";import{_ as ft,c as z,g as mt,l as A}from"./vue-vendor-DZ4A_GHn.js";import{f as N,n as L,t as W,u as Xe}from"./_plugin-vue_export-helper-CwNymSRn.js";import{C as yt,S as jt,X as ht,Y as gt}from"./index-DW8M4rjb.js";import{n as wt,t as Jt}from"./MarkdownRenderer-BlxKlSHX.js";function B(e){return e.job}function Ye(e){return typeof e=="object"&&e!==null}function Q(e,o=""){if(typeof e=="string")return e;if(!Ye(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 xt(e,o="—"){if(typeof e=="string")return e;if(!Ye(e))return o;if(e.kind==="cron")return e.expr||e.display||o;if(e.kind==="interval"||e.kind==="once")return e.display||Q(e,o);const t=e;return t.display||t.expr||t.run_at||o}function Ge(e){return e&&typeof e=="object"?e.times??null:null}function kt(e,o){const t={},j=Q(e.schedule,e.schedule_display||""),n=Ge(e.repeat),p=e.deliver||"origin";return o.name!==e.name&&(t.name=o.name),o.schedule!==j&&(t.schedule=o.schedule),o.prompt!==(e.prompt||"")&&(t.prompt=o.prompt),o.deliver!==p&&(t.deliver=o.deliver),o.repeat_times!==n&&(t.repeat=o.repeat_times),t}async function $t(){return(await N("/api/hermes/jobs?include_disabled=true")).jobs}async function Ct(e){return B(await N(`/api/hermes/jobs/${e}`))}async function St(e){return B(await N("/api/hermes/jobs",{method:"POST",body:JSON.stringify(e)}))}async function It(e,o){return B(await N(`/api/hermes/jobs/${e}`,{method:"PATCH",body:JSON.stringify(o)}))}async function Pt(e){return N(`/api/hermes/jobs/${e}`,{method:"DELETE"})}async function Mt(e){return B(await N(`/api/hermes/jobs/${e}/pause`,{method:"POST"}))}async function Rt(e){return B(await N(`/api/hermes/jobs/${e}/resume`,{method:"POST"}))}async function Nt(e){return B(await N(`/api/hermes/jobs/${e}/run`,{method:"POST"}))}var ae=w((()=>{Xe()}));function H(e,o){return e.job_id===o||e.id===o}var K,Y=w((()=>{ft(),U(),ae(),K=mt("jobs",()=>{const e=S([]),o=S(!1);async function t(){o.value=!0;try{e.value=await $t()}catch(c){console.error("Failed to fetch jobs:",c)}finally{o.value=!1}}async function j(c){const s=await St(c);return e.value.unshift(s),s}async function n(c,s){const g=await It(c,s),r=e.value.findIndex(P=>H(P,c));return r!==-1&&(e.value[r]=g),g}async function p(c){await Pt(c),e.value=e.value.filter(s=>!H(s,c))}async function v(c){const s=await Mt(c),g=e.value.findIndex(r=>H(r,c));g!==-1&&(e.value[g]=s)}async function f(c){const s=await Rt(c),g=e.value.findIndex(r=>H(r,c));g!==-1&&(e.value[g]=s)}async function $(c){const s=await Nt(c),g=e.value.findIndex(r=>H(r,c));g!==-1&&(e.value[g]=s)}return{jobs:e,loading:o,fetchJobs:t,createJob:j,updateJob:n,deleteJob:p,pauseJob:v,resumeJob:f,runJob:$}})})),ne,le,ie,re,ue,de,ce,be,_e,ve,pe,fe,me,ye,je,he,ge,we,Je,xe,ke,$e,Ze,Ce=w((()=>{U(),X(),ae(),Y(),z(),ne={class:"card-header"},le={class:"job-name"},ie={class:"card-body"},re={class:"info-row"},ue={class:"info-label"},de={class:"info-value mono"},ce={class:"info-row"},be={class:"info-label"},_e={class:"info-value mono"},ve={class:"info-row"},pe={class:"info-label"},fe={class:"info-value"},me={class:"info-row"},ye={class:"info-label"},je={class:"info-value"},he={class:"info-row"},ge={class:"info-label"},we={class:"info-value"},Je={key:0,class:"info-row"},xe={class:"info-label"},ke={class:"info-value"},$e={class:"card-actions"},Ze=O({__name:"JobCard",props:{job:{},selected:{type:Boolean}},emits:["edit","select"],setup(e,{emit:o}){const t=e,j=o,{t:n}=A(),p=K(),v=Qe(),f=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")),c=R(()=>t.job.state==="running"?"info":t.job.state==="paused"?"warning":t.job.enabled?"success":"error"),s=R(()=>xt(t.job.schedule,t.job.schedule_display||"—")),g=b=>b?new Date(b).toLocaleString():"—";async function r(){try{await p.pauseJob(f.value),v.success(n("jobs.jobPaused"))}catch(b){v.error(b.message)}}async function P(){try{await p.resumeJob(f.value),v.success(n("jobs.jobResumed"))}catch(b){v.error(b.message)}}async function u(){try{await p.runJob(f.value),v.info(n("jobs.jobTriggered"))}catch(b){v.error(b.message)}}async function I(){try{await p.deleteJob(f.value),v.success(n("jobs.jobDeleted"))}catch(b){v.error(b.message)}}function J(b){b.target.closest(".card-actions")||j("select",f.value)}return(b,F)=>(h(),C("div",{class:Z(["job-card",{selected:e.selected}]),onClick:J},[i("div",ne,[i("h3",le,d(e.job.name),1),i("span",{class:Z(["status-badge",c.value])},d($.value),3)]),i("div",ie,[i("div",re,[i("span",ue,d(a(n)("jobs.info.schedule")),1),i("code",de,d(s.value),1)]),i("div",ce,[i("span",be,d(a(n)("jobs.info.model")),1),i("span",_e,d(e.job.model||"—"),1)]),i("div",ve,[i("span",pe,d(a(n)("jobs.info.lastRun")),1),i("span",fe,[k(d(g(e.job.last_run_at))+" ",1),e.job.last_status?(h(),C("span",{key:0,class:Z(["run-status",{ok:e.job.last_status==="ok",err:e.job.last_status!=="ok"}])},d(e.job.last_status==="ok"?a(n)("common.ok"):e.job.last_status),3)):T("",!0)])]),i("div",me,[i("span",ye,d(a(n)("jobs.info.nextRun")),1),i("span",je,d(g(e.job.next_run_at)),1)]),i("div",he,[i("span",ge,d(a(n)("jobs.info.deliver")),1),i("span",we,[k(d(e.job.deliver),1),e.job.origin?(h(),C(D,{key:0},[k(" ("+d(e.job.origin.platform)+")",1)],64)):T("",!0)])]),e.job.repeat?(h(),C("div",Je,[i("span",xe,d(a(n)("jobs.info.repeat")),1),i("span",ke,[typeof e.job.repeat=="string"?(h(),C(D,{key:0},[k(d(e.job.repeat),1)],64)):(h(),C(D,{key:1},[k(d(e.job.repeat.completed)+" / "+d(e.job.repeat.times??"∞"),1)],64))])])):T("",!0)]),i("div",$e,[e.job.state!=="paused"&&e.job.enabled?(h(),M(a(ee),{key:0},{trigger:_(()=>[y(a(E),{size:"tiny",quaternary:"",onClick:V(r,["stop"])},{default:_(()=>[k(d(a(n)("jobs.action.pause")),1)]),_:1})]),default:_(()=>[k(" "+d(a(n)("jobs.action.pauseJob")),1)]),_:1})):e.job.state==="paused"?(h(),M(a(ee),{key:1},{trigger:_(()=>[y(a(E),{size:"tiny",quaternary:"",onClick:V(P,["stop"])},{default:_(()=>[k(d(a(n)("jobs.action.resume")),1)]),_:1})]),default:_(()=>[k(" "+d(a(n)("jobs.action.resumeJob")),1)]),_:1})):T("",!0),y(a(ee),null,{trigger:_(()=>[y(a(E),{size:"tiny",quaternary:"",onClick:V(u,["stop"])},{default:_(()=>[k(d(a(n)("jobs.action.runNow")),1)]),_:1})]),default:_(()=>[k(" "+d(a(n)("jobs.action.triggerImmediately")),1)]),_:1}),y(a(E),{size:"tiny",quaternary:"",onClick:F[0]||(F[0]=V(oe=>j("edit",f.value),["stop"]))},{default:_(()=>[k(d(a(n)("common.edit")),1)]),_:1}),y(a(E),{size:"tiny",quaternary:"",type:"error",onClick:V(I,["stop"])},{default:_(()=>[k(d(a(n)("common.delete")),1)]),_:1})])],2))}})})),Et=w((()=>{})),et,Tt=w((()=>{Ce(),Ce(),Et(),L(),et=W(Ze,[["__scopeId","data-v-54aca7fb"]])})),Se,Ie,tt,Pe=w((()=>{U(),Tt(),Y(),z(),Se={key:0,class:"empty-state"},Ie={key:1,class:"jobs-grid"},tt=O({__name:"JobsPanel",props:{selectedJobId:{}},emits:["edit","select"],setup(e,{emit:o}){const t=e,j=o,{t:n}=A(),p=K();function v($){j("select",t.selectedJobId===$?null:$)}function f(){t.selectedJobId&&j("select",null)}return($,c)=>(h(),C(D,null,[a(p).jobs.length===0?(h(),C("div",Se,[c[0]||(c[0]=pt('<svg width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" class="empty-icon" data-v-bfc747c9><rect x="3" y="4" width="18" height="18" rx="2" ry="2" data-v-bfc747c9></rect><line x1="16" y1="2" x2="16" y2="6" data-v-bfc747c9></line><line x1="8" y1="2" x2="8" y2="6" data-v-bfc747c9></line><line x1="3" y1="10" x2="21" y2="10" data-v-bfc747c9></line></svg>',1)),i("p",null,d(a(n)("jobs.noJobs")),1)])):(h(),C("div",Ie,[(h(!0),C(D,null,Ke(a(p).jobs,s=>(h(),M(et,{key:s.id,job:s,selected:e.selectedJobId===(s.job_id||s.id),onEdit:g=>j("edit",s.id),onSelect:v},null,8,["job","selected","onEdit"]))),128))])),e.selectedJobId?(h(),C("div",{key:2,class:"deselect-overlay",onClick:f})):T("",!0)],64))}})})),Ft=w((()=>{})),at,qt=w((()=>{Pe(),Pe(),Ft(),L(),at=W(tt,[["__scopeId","data-v-bfc747c9"]])}));async function Dt(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 Bt=w((()=>{Xe()})),Me,Re,Ne,Ee,Te,Fe,ot,qe=w((()=>{U(),X(),z(),Bt(),wt(),Me={class:"run-history"},Re={class:"history-header"},Ne={class:"history-title"},Ee={class:"history-count"},Te={class:"history-body"},Fe={class:"run-meta"},ot=O({__name:"JobRunHistory",props:{selectedJobId:{},jobNameMap:{},profileKey:{}},setup(e){const o=e,{t}=A(),j=S(!1),n=S([]),p=S({}),v=S({}),f=R(()=>o.selectedJobId?n.value.filter(r=>r.jobId===o.selectedJobId):n.value);async function $(){j.value=!0;try{n.value=await Dt(o.selectedJobId??void 0)}catch(r){console.error("Failed to fetch cron runs:",r),n.value=[]}finally{j.value=!1}}async function c(r){const P=Array.isArray(r)?r:r!=null?[r]:[];for(const u of P){const I=String(u);if(p.value[I]||v.value[I])continue;const J=f.value.find(b=>`${b.jobId}/${b.fileName}`===I);if(J){v.value[I]=!0;try{const b=await Ut(J.jobId,J.fileName);p.value[I]=b.content}catch{p.value[I]="[Error loading content]"}finally{v.value[I]=!1}}}}function s(r){return r<1024?`${r}B`:r<1024*1024?`${(r/1024).toFixed(1)}KB`:`${(r/1024/1024).toFixed(1)}MB`}function g(r){return o.jobNameMap[r]||r}return bt(()=>[o.selectedJobId,o.profileKey],()=>{p.value={},$()},{immediate:!0}),(r,P)=>(h(),C("div",Me,[i("div",Re,[i("span",Ne,d(a(t)("jobs.runHistory.title")),1),i("span",Ee,d(f.value.length)+" "+d(a(t)("jobs.runHistory.runs")),1)]),i("div",Te,[y(a(te),{show:j.value},{default:_(()=>[!j.value&&f.value.length===0?(h(),M(a(dt),{key:0,description:a(t)("jobs.runHistory.noRuns")},null,8,["description"])):(h(),M(a(_t),{key:1,accordion:"","onUpdate:expandedNames":c},{default:_(()=>[(h(!0),C(D,null,Ke(f.value,u=>(h(),M(a(vt),{key:`${u.jobId}/${u.fileName}`,title:`${g(u.jobId)} — ${u.runTime}`,name:`${u.jobId}/${u.fileName}`},{"header-extra":_(()=>[i("span",Fe,d(s(u.size)),1)]),default:_(()=>[v.value[`${u.jobId}/${u.fileName}`]?(h(),M(a(te),{key:0,size:"small"})):p.value[`${u.jobId}/${u.fileName}`]?(h(),M(Jt,{key:1,content:p.value[`${u.jobId}/${u.fileName}`]},null,8,["content"])):T("",!0)]),_:2},1032,["title","name"]))),128))]),_:1}))]),_:1},8,["show"])])]))}})})),Vt=w((()=>{})),st,Ht=w((()=>{qe(),qe(),Vt(),L(),st=W(ot,[["__scopeId","data-v-bed5e9a2"]])})),De,nt,Ue=w((()=>{U(),X(),Y(),jt(),ae(),z(),De={class:"modal-footer"},nt=O({__name:"JobFormModal",props:{jobId:{}},emits:["close","saved"],setup(e,{emit:o}){const{t}=A(),j=e,n=o,p=K(),v=yt(),f=Qe(),$=S(!0),c=S(!1),s=S({name:"",schedule:"",prompt:"",deliver:"origin",repeat_times:null}),g=S(null),r=R(()=>!!j.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 * *"}]);function u(m){return typeof m=="string"&&m.trim().length>0}function I(m){const l=v.platforms[m]||{};switch(m){case"telegram":case"discord":case"slack":return u(l.token);case"whatsapp":return l.enabled===!0||l.enabled==="true";case"matrix":return u(l.token)&&u(l.extra?.homeserver);case"weixin":return u(l.token)&&u(l.extra?.account_id);case"wecom":return u(l.extra?.bot_id)&&u(l.extra?.secret);case"feishu":return u(l.extra?.app_id)&&u(l.extra?.app_secret);case"dingtalk":return u(l.extra?.client_id)&&u(l.extra?.client_secret)||u(l.extra?.app_key)&&u(l.extra?.client_secret);case"qqbot":return u(l.extra?.app_id)&&u(l.extra?.client_secret);default:return!1}}const J=R(()=>{const m=[{label:t("jobs.origin"),value:"origin"},{label:t("jobs.local"),value:"local"}];for(const l 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"},{key:"qqbot",label:"QQBot"}])m.push({label:l.label,value:l.key,disabled:!I(l.key)});return m}),b=S(null);We(async()=>{if(Object.keys(v.platforms||{}).length===0&&await v.fetchSettings(),j.jobId)try{const m=await Ct(j.jobId);b.value=m,s.value={name:m.name,schedule:Q(m.schedule,m.schedule_display||""),prompt:m.prompt,deliver:m.deliver||"origin",repeat_times:Ge(m.repeat)}}catch(m){f.error(t("jobs.loadFailed")+": "+m.message)}});async function F(){if(!s.value.name.trim()){f.warning(t("jobs.nameRequired"));return}if(!s.value.schedule.trim()){f.warning(t("jobs.scheduleRequired"));return}c.value=!0;try{if(r.value){if(!b.value){f.error(t("jobs.loadFailed"));return}const m=kt(b.value,s.value);if(Object.keys(m).length===0){f.success(t("jobs.jobUpdated")),n("saved");return}await p.updateJob(j.jobId,m),f.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 p.createJob(m),f.success(t("jobs.jobCreated"))}n("saved")}catch(m){f.error(m.message)}finally{c.value=!1}}function oe(){$.value=!1,setTimeout(()=>n("close"),200)}return(m,l)=>(h(),M(a(ct),{show:$.value,"onUpdate:show":l[7]||(l[7]=x=>$.value=x),preset:"card",title:r.value?a(t)("jobs.editJob"):a(t)("jobs.createJob"),style:{width:"min(520px, calc(100vw - 32px))"},"mask-closable":!c.value,onAfterLeave:l[8]||(l[8]=x=>n("close"))},{footer:_(()=>[i("div",De,[y(a(E),{onClick:oe},{default:_(()=>[k(d(a(t)("common.cancel")),1)]),_:1}),y(a(E),{type:"primary",loading:c.value,onClick:F},{default:_(()=>[k(d(r.value?a(t)("common.update"):a(t)("common.create")),1)]),_:1},8,["loading"])])]),default:_(()=>[y(a(rt),{"label-placement":"top"},{default:_(()=>[y(a(q),{label:a(t)("jobs.name"),required:""},{default:_(()=>[y(a(G),{value:s.value.name,"onUpdate:value":l[0]||(l[0]=x=>s.value.name=x),placeholder:a(t)("jobs.namePlaceholder"),maxlength:"200","show-count":""},null,8,["value","placeholder"])]),_:1},8,["label"]),y(a(q),{label:a(t)("jobs.schedule"),required:""},{default:_(()=>[y(a(G),{value:s.value.schedule,"onUpdate:value":l[1]||(l[1]=x=>s.value.schedule=x),placeholder:a(t)("jobs.schedulePlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),y(a(q),{label:a(t)("jobs.quickPresets")},{default:_(()=>[y(a(se),{value:g.value,"onUpdate:value":[l[2]||(l[2]=x=>g.value=x),l[3]||(l[3]=x=>s.value.schedule=x)],options:P.value,placeholder:a(t)("jobs.selectPreset")},null,8,["value","options","placeholder"])]),_:1},8,["label"]),y(a(q),{label:a(t)("jobs.prompt"),required:""},{default:_(()=>[y(a(G),{value:s.value.prompt,"onUpdate:value":l[4]||(l[4]=x=>s.value.prompt=x),type:"textarea",placeholder:a(t)("jobs.promptPlaceholder"),rows:4,maxlength:"5000","show-count":""},null,8,["value","placeholder"])]),_:1},8,["label"]),y(a(q),{label:a(t)("jobs.deliverTarget")},{default:_(()=>[y(a(se),{value:s.value.deliver,"onUpdate:value":l[5]||(l[5]=x=>s.value.deliver=x),options:J.value},null,8,["value","options"])]),_:1},8,["label"]),y(a(q),{label:a(t)("jobs.repeatCount")},{default:_(()=>[y(a(ut),{value:s.value.repeat_times,"onUpdate:value":l[6]||(l[6]=x=>s.value.repeat_times=x),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"]))}})})),Ot=w((()=>{})),lt,zt=w((()=>{Ue(),Ue(),Ot(),L(),lt=W(nt,[["__scopeId","data-v-5c6a9f43"]])})),Be,Ve,He,Oe,ze,Ae,it,Le=w((()=>{U(),X(),z(),qt(),Ht(),zt(),Y(),gt(),Be={class:"jobs-view"},Ve={class:"page-header"},He={class:"header-title"},Oe={class:"jobs-split"},ze={class:"jobs-top"},Ae={class:"jobs-bottom"},it=O({__name:"JobsView",setup(e){const{t:o}=A(),t=K(),j=ht(),n=S(!1),p=S(null),v=S(null),f=R(()=>j.activeProfileName||"default"),$=R(()=>{const J={};for(const b of t.jobs){const F=b.job_id||b.id;J[F]=b.name}return J});async function c(){(!j.activeProfileName||j.profiles.length===0)&&await j.fetchProfiles()}async function s(){v.value=null,t.jobs=[],await c(),await t.fetchJobs()}We(()=>{s()});function g(){p.value=null,n.value=!0}function r(J){p.value=J,n.value=!0}function P(){n.value=!1,p.value=null}async function u(){await t.fetchJobs(),P()}function I(J){v.value=v.value===J?null:J}return(J,b)=>(h(),C("div",Be,[i("header",Ve,[i("h2",He,d(a(o)("jobs.title")),1),y(a(E),{type:"primary",size:"small",onClick:g},{icon:_(()=>[...b[0]||(b[0]=[i("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[i("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),i("line",{x1:"5",y1:"12",x2:"19",y2:"12"})],-1)])]),default:_(()=>[k(" "+d(a(o)("jobs.createJob")),1)]),_:1})]),i("div",Oe,[i("div",ze,[y(a(te),{show:a(t).loading&&a(t).jobs.length===0},{default:_(()=>[y(at,{"selected-job-id":v.value,onEdit:r,onSelect:I},null,8,["selected-job-id"])]),_:1},8,["show"])]),b[1]||(b[1]=i("div",{class:"splitter"},null,-1)),i("div",Ae,[y(st,{"selected-job-id":v.value,"job-name-map":$.value,"profile-key":f.value},null,8,["selected-job-id","job-name-map","profile-key"])])]),n.value?(h(),M(lt,{key:0,"job-id":p.value,onClose:P,onSaved:u},null,8,["job-id"])):T("",!0)]))}})})),At=w((()=>{})),Lt,Wt=w((()=>{Le(),Le(),At(),L(),Lt=W(it,[["__scopeId","data-v-409c1932"]])}));Wt();export{Lt as default};