hermes-web-ui 0.6.24 → 0.6.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/assets/js/{ChannelsView-DV-LtXVi.js → ChannelsView-p3dSvD02.js} +1 -1
- package/dist/client/assets/js/{ChatPanel-DyZWRnQs.js → ChatPanel-DRCE0v4g.js} +1 -1
- package/dist/client/assets/js/{ChatView-CuWpMwOd.js → ChatView-CAoJp8-Q.js} +1 -1
- package/dist/client/assets/js/{CodingAgentsView-D_Ngirz0.js → CodingAgentsView-X0I-H0Yu.js} +1 -1
- package/dist/client/assets/js/{DesktopPetView-BGY-7Dcd.js → DesktopPetView-BH9a1zur.js} +1 -1
- package/dist/client/assets/js/{DevicesView-BNZqDe2U.js → DevicesView-CMcwuGZ6.js} +1 -1
- package/dist/client/assets/js/{FileEditor-BPFC-M3W.js → FileEditor-CzWdryd5.js} +1 -1
- package/dist/client/assets/js/{FileRenameModal-5mJtyNBP.js → FileRenameModal-C2YmHkSN.js} +1 -1
- package/dist/client/assets/js/{FilesView-CRbkvC6l.js → FilesView-CKxvh6yi.js} +1 -1
- package/dist/client/assets/js/{GlobalAgentView-my3AKdll.js → GlobalAgentView-77p8MKvy.js} +1 -1
- package/dist/client/assets/js/{GroupChatView-btwSVoC0.js → GroupChatView-D1WFEfIs.js} +1 -1
- package/dist/client/assets/js/{HistoryMessageList-IubX9-tb.js → HistoryMessageList-BcG-gj6N.js} +1 -1
- package/dist/client/assets/js/{HistoryView-N3v7MNfo.js → HistoryView-CzybyBXj.js} +1 -1
- package/dist/client/assets/js/{JobsView-CHq_TJQ6.js → JobsView-BviznpSY.js} +1 -1
- package/dist/client/assets/js/{KanbanView-BMh8IgQo.js → KanbanView-B0c6OMrf.js} +1 -1
- package/dist/client/assets/js/{LoginView-sE4g4Zua.js → LoginView-B9nES8-3.js} +1 -1
- package/dist/client/assets/js/{LogsView-awh5ZCp8.js → LogsView-kLI6-05w.js} +1 -1
- package/dist/client/assets/js/{MarkdownRenderer-BbGvq6C-.js → MarkdownRenderer-DQvs79tf.js} +1 -1
- package/dist/client/assets/js/{McpManagerView-CnSCITtQ.js → McpManagerView-BZU1Puf0.js} +1 -1
- package/dist/client/assets/js/{MemoryView-CbQOeUKI.js → MemoryView-BH4LZtYd.js} +1 -1
- package/dist/client/assets/js/{MessageItem-DSHiAgFE.js → MessageItem-Cu3_aQT8.js} +2 -2
- package/dist/client/assets/js/{MessageList-oRCKlivC.js → MessageList-Ds_mjMbf.js} +1 -1
- package/dist/client/assets/js/{ModelsView-B0esXyBm.js → ModelsView-CZK6wwtt.js} +1 -1
- package/dist/client/assets/js/{OutlinePanel-BofcYepl.js → OutlinePanel-CYuSrNX9.js} +1 -1
- package/dist/client/assets/js/{PageSidebarFooter-BPeWlPvZ.js → PageSidebarFooter-Dk-OfmNy.js} +1 -1
- package/dist/client/assets/js/{PerformanceView-gc12dWCZ.js → PerformanceView-DkXk4HB_.js} +1 -1
- package/dist/client/assets/js/{PetdexView-CZjbg41u.js → PetdexView-DGkSZYVi.js} +1 -1
- package/dist/client/assets/js/{PluginsView-DRwyXTJC.js → PluginsView-D197obRC.js} +1 -1
- package/dist/client/assets/js/{ProfilesView-zVd3TfNW.js → ProfilesView-BhGBaYDE.js} +1 -1
- package/dist/client/assets/js/{SettingRow-G7ZusJw_.js → SettingRow-DfRI-z7L.js} +1 -1
- package/dist/client/assets/js/{SettingsCircuitBadge-CFo2KqP-.js → SettingsCircuitBadge-Eiv8LQz0.js} +1 -1
- package/dist/client/assets/js/{SettingsView-DDjt6UpN.js → SettingsView-B4ipIIOj.js} +1 -1
- package/dist/client/assets/js/{SkillsUsageView-DnVnAYHG.js → SkillsUsageView-DT4o1LA9.js} +1 -1
- package/dist/client/assets/js/{SkillsView-CHi4L7Oi.js → SkillsView-CUK-9OLz.js} +1 -1
- package/dist/client/assets/js/{TerminalPanel-Dx7huJY2.js → TerminalPanel-gyT2AS7Z.js} +1 -1
- package/dist/client/assets/js/{TerminalView-PQIIFHwX.js → TerminalView-C3a6BwEG.js} +1 -1
- package/dist/client/assets/js/{UsageView-Dzr2wBc7.js → UsageView-DrUS9OIk.js} +1 -1
- package/dist/client/assets/js/{VersionPreviewView-JQrieRPU.js → VersionPreviewView-qbXwqYd3.js} +1 -1
- package/dist/client/assets/js/{WorkflowView-DRanDY9s.js → WorkflowView-D-6z--9A.js} +1 -1
- package/dist/client/assets/js/{_plugin-vue_export-helper-fFMkIM4P.js → _plugin-vue_export-helper-CvnFozKy.js} +2 -2
- package/dist/client/assets/js/{chat-timestamp-CZtP79YD.js → chat-timestamp-CkDNtK9Y.js} +1 -1
- package/dist/client/assets/js/{files-DOpu4Qfg.js → files-CBYc0MSs.js} +1 -1
- package/dist/client/assets/js/index-B2IKGvbR.js +3 -0
- package/dist/client/assets/js/{models-y7NaVj-e.js → models-DetB4_Ug.js} +1 -1
- package/dist/client/assets/js/{session-browser-prefs-BOqwOeHi.js → session-browser-prefs-BYjSnxJq.js} +1 -1
- package/dist/client/assets/js/{skills-D7ZMzzzG.js → skills-5qxphanX.js} +1 -1
- package/dist/client/assets/js/{system-CRmVbE8Z.js → system-Onp4yS9N.js} +1 -1
- package/dist/client/assets/js/{ttsHelpers-vHLmbeY4.js → ttsHelpers-DNcZ5khq.js} +1 -1
- package/dist/client/assets/js/{useSttSettings-s4LBWl55.js → useSttSettings-C-jexrW7.js} +1 -1
- package/dist/client/index.html +3 -3
- package/dist/server/agent-bridge/python/bridge_runtime.py +2 -2
- package/dist/server/index.js +3 -3
- package/dist/server/openapi.json +1 -1
- package/package.json +1 -1
- package/dist/client/assets/js/index-Brl4qW5V.js +0 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as C}from"./rolldown-runtime-M0oDzQ_3.js";import{A as mt,Bn as yt,E as jt,Hn as d,It as se,K as ht,Kt as H,Nn as et,O as D,Ot as E,St as gt,V as tt,Wt as kt,an as i,bt as wt,cn as N,cr as t,dn as Jt,en as A,er as $,fn as x,g as ne,hn as W,in as R,jn as h,kn as at,mt as oe,on as T,ot as K,pn as v,pr as r,sn as O,t as te,tn as U,ur as le}from"./ui-vendor-DDMfmCj2.js";import{I as xt,L as $t,O as Q,k as G}from"./vue-vendor-BsMpqyaC.js";import{f as B,n as X,t as Y,u as st}from"./_plugin-vue_export-helper-fFMkIM4P.js";import{Dt as Ct,Et as St,L as It,R as Mt}from"./index-Brl4qW5V.js";import{l as Nt,s as Pt}from"./skills-D7ZMzzzG.js";import{n as Rt,t as Et}from"./MarkdownRenderer-BbGvq6C-.js";function V(e){return e.job}function ot(e){return typeof e=="object"&&e!==null}function ee(e,s=""){if(typeof e=="string")return e;if(!ot(e))return s;if(e.kind==="cron")return e.expr||e.display||s;if(e.kind==="once")return e.run_at||e.display||s;if(e.kind==="interval")return e.display||(typeof e.minutes=="number"?`every ${e.minutes}m`:s);const a=e;return a.expr||a.run_at||a.display||s}function Tt(e,s="—"){if(typeof e=="string")return e;if(!ot(e))return s;if(e.kind==="cron")return e.expr||e.display||s;if(e.kind==="interval"||e.kind==="once")return e.display||ee(e,s);const a=e;return a.display||a.expr||a.run_at||s}function lt(e){return e&&typeof e=="object"?e.times??null:null}function Bt(e,s){const a={},j=ee(e.schedule,e.schedule_display||""),n=lt(e.repeat),y=e.deliver||"origin",p=e.skills||(e.skill?[e.skill]:[]);return s.name!==e.name&&(a.name=s.name),s.schedule!==j&&(a.schedule=s.schedule),s.prompt!==(e.prompt||"")&&(a.prompt=s.prompt),s.deliver!==y&&(a.deliver=s.deliver),(s.skills.length!==p.length||s.skills.some((c,J)=>c!==p[J]))&&(a.skills=s.skills),s.repeat_times!==n&&(a.repeat=s.repeat_times),a}async function qt(){return(await B("/api/hermes/jobs?include_disabled=true")).jobs}async function Ft(e){return V(await B(`/api/hermes/jobs/${e}`))}async function Dt(e){return V(await B("/api/hermes/jobs",{method:"POST",body:JSON.stringify(e)}))}async function Ot(e,s){return V(await B(`/api/hermes/jobs/${e}`,{method:"PATCH",body:JSON.stringify(s)}))}async function Ut(e){return B(`/api/hermes/jobs/${e}`,{method:"DELETE"})}async function Ht(e){return V(await B(`/api/hermes/jobs/${e}/pause`,{method:"POST"}))}async function Vt(e){return V(await B(`/api/hermes/jobs/${e}/resume`,{method:"POST"}))}async function zt(e){return V(await B(`/api/hermes/jobs/${e}/run`,{method:"POST"}))}var ie=C((()=>{st()}));function L(e,s){return e.job_id===s||e.id===s}var Z,ae=C((()=>{$t(),H(),ie(),Z=xt("jobs",()=>{const e=$([]),s=$(!1);async function a(){s.value=!0;try{e.value=await qt()}catch(u){console.error("Failed to fetch jobs:",u)}finally{s.value=!1}}async function j(u){const m=await Dt(u);return e.value.unshift(m),m}async function n(u,m){const _=await Ot(u,m),o=e.value.findIndex(P=>L(P,u));return o!==-1&&(e.value[o]=_),_}async function y(u){await Ut(u),e.value=e.value.filter(m=>!L(m,u))}async function p(u){const m=await Ht(u),_=e.value.findIndex(o=>L(o,u));_!==-1&&(e.value[_]=m)}async function c(u){const m=await Vt(u),_=e.value.findIndex(o=>L(o,u));_!==-1&&(e.value[_]=m)}async function J(u){const m=await zt(u),_=e.value.findIndex(o=>L(o,u));_!==-1&&(e.value[_]=m)}return{jobs:e,loading:s,fetchJobs:a,createJob:j,updateJob:n,deleteJob:y,pauseJob:p,resumeJob:c,runJob:J}})})),re,ue,de,ce,be,ve,_e,pe,fe,me,ye,je,he,ge,ke,we,Je,xe,$e,Ce,Se,Ie,nt,Me=C((()=>{H(),te(),ie(),ae(),Q(),re={class:"card-header"},ue={class:"job-name"},de={class:"card-body"},ce={class:"info-row"},be={class:"info-label"},ve={class:"info-value mono"},_e={class:"info-row"},pe={class:"info-label"},fe={class:"info-value mono"},me={class:"info-row"},ye={class:"info-label"},je={class:"info-value"},he={class:"info-row"},ge={class:"info-label"},ke={class:"info-value"},we={class:"info-row"},Je={class:"info-label"},xe={class:"info-value"},$e={key:0,class:"info-row"},Ce={class:"info-label"},Se={class:"info-value"},Ie={class:"card-actions"},nt=W({__name:"JobCard",props:{job:{},selected:{type:Boolean}},emits:["edit","select"],setup(e,{emit:s}){const a=e,j=s,{t:n}=G(),y=Z(),p=tt(),c=R(()=>a.job.job_id||a.job.id),J=R(()=>a.job.state==="running"?n("jobs.status.running"):a.job.state==="paused"?n("jobs.status.paused"):a.job.enabled?n("jobs.status.scheduled"):n("jobs.status.disabled")),u=R(()=>a.job.state==="running"?"info":a.job.state==="paused"?"warning":a.job.enabled?"success":"error"),m=R(()=>Tt(a.job.schedule,a.job.schedule_display||"—")),_=w=>w?new Date(w).toLocaleString():"—";async function o(){try{await y.pauseJob(c.value),p.success(n("jobs.jobPaused"))}catch(w){p.error(w.message)}}async function P(){try{await y.resumeJob(c.value),p.success(n("jobs.jobResumed"))}catch(w){p.error(w.message)}}async function g(){try{await y.runJob(c.value),p.info(n("jobs.jobTriggered"))}catch(w){p.error(w.message)}}async function M(){try{await y.deleteJob(c.value),p.success(n("jobs.jobDeleted"))}catch(w){p.error(w.message)}}function k(w){w.target.closest(".card-actions")||j("select",c.value)}return(w,q)=>(h(),N("div",{class:le(["job-card",{selected:e.selected}]),onClick:k},[i("div",re,[i("h3",ue,r(e.job.name),1),i("span",{class:le(["status-badge",u.value])},r(J.value),3)]),i("div",de,[i("div",ce,[i("span",be,r(t(n)("jobs.info.schedule")),1),i("code",ve,r(m.value),1)]),i("div",_e,[i("span",pe,r(t(n)("jobs.info.model")),1),i("span",fe,r(e.job.model||"—"),1)]),i("div",me,[i("span",ye,r(t(n)("jobs.info.lastRun")),1),i("span",je,[x(r(_(e.job.last_run_at))+" ",1),e.job.last_status?(h(),N("span",{key:0,class:le(["run-status",{ok:e.job.last_status==="ok",err:e.job.last_status!=="ok"}])},r(e.job.last_status==="ok"?t(n)("common.ok"):e.job.last_status),3)):O("",!0)])]),i("div",he,[i("span",ge,r(t(n)("jobs.info.nextRun")),1),i("span",ke,r(_(e.job.next_run_at)),1)]),i("div",we,[i("span",Je,r(t(n)("jobs.info.deliver")),1),i("span",xe,[x(r(e.job.deliver),1),e.job.origin?(h(),N(U,{key:0},[x(" ("+r(e.job.origin.platform)+")",1)],64)):O("",!0)])]),e.job.repeat?(h(),N("div",$e,[i("span",Ce,r(t(n)("jobs.info.repeat")),1),i("span",Se,[typeof e.job.repeat=="string"?(h(),N(U,{key:0},[x(r(e.job.repeat),1)],64)):(h(),N(U,{key:1},[x(r(e.job.repeat.completed)+" / "+r(e.job.repeat.times??"∞"),1)],64))])])):O("",!0)]),i("div",Ie,[e.job.state!=="paused"&&e.job.enabled?(h(),T(t(K),{key:0},{trigger:d(()=>[v(t(E),{size:"tiny",quaternary:"",onClick:A(o,["stop"])},{default:d(()=>[x(r(t(n)("jobs.action.pause")),1)]),_:1})]),default:d(()=>[x(" "+r(t(n)("jobs.action.pauseJob")),1)]),_:1})):e.job.state==="paused"?(h(),T(t(K),{key:1},{trigger:d(()=>[v(t(E),{size:"tiny",quaternary:"",onClick:A(P,["stop"])},{default:d(()=>[x(r(t(n)("jobs.action.resume")),1)]),_:1})]),default:d(()=>[x(" "+r(t(n)("jobs.action.resumeJob")),1)]),_:1})):O("",!0),v(t(K),null,{trigger:d(()=>[v(t(E),{size:"tiny",quaternary:"",onClick:A(g,["stop"])},{default:d(()=>[x(r(t(n)("jobs.action.runNow")),1)]),_:1})]),default:d(()=>[x(" "+r(t(n)("jobs.action.triggerImmediately")),1)]),_:1}),v(t(E),{size:"tiny",quaternary:"",onClick:q[0]||(q[0]=A(F=>j("edit",c.value),["stop"]))},{default:d(()=>[x(r(t(n)("common.edit")),1)]),_:1}),v(t(E),{size:"tiny",quaternary:"",type:"error",onClick:A(M,["stop"])},{default:d(()=>[x(r(t(n)("common.delete")),1)]),_:1})])],2))}})})),At=C((()=>{})),it,Lt=C((()=>{Me(),Me(),At(),X(),it=Y(nt,[["__scopeId","data-v-54aca7fb"]])})),Ne,Pe,rt,Re=C((()=>{H(),Lt(),ae(),Q(),Ne={key:0,class:"empty-state"},Pe={key:1,class:"jobs-grid"},rt=W({__name:"JobsPanel",props:{selectedJobId:{},sortBy:{},sortAsc:{type:Boolean}},emits:["edit","select"],setup(e,{emit:s}){const a=e,j=s,{t:n}=G(),y=Z(),p=R(()=>{const u=[...y.jobs],m=a.sortBy,_=a.sortAsc;return m==="name"?u.sort((o,P)=>o.name.localeCompare(P.name,"zh-CN")*(_?1:-1)):_||u.reverse(),u});function c(u){j("select",a.selectedJobId===u?null:u)}function J(){a.selectedJobId&&j("select",null)}return(u,m)=>(h(),N(U,null,[t(y).jobs.length===0?(h(),N("div",Ne,[m[0]||(m[0]=Jt('<svg width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" class="empty-icon" data-v-6bf5dbff><rect x="3" y="4" width="18" height="18" rx="2" ry="2" data-v-6bf5dbff></rect><line x1="16" y1="2" x2="16" y2="6" data-v-6bf5dbff></line><line x1="8" y1="2" x2="8" y2="6" data-v-6bf5dbff></line><line x1="3" y1="10" x2="21" y2="10" data-v-6bf5dbff></line></svg>',1)),i("p",null,r(t(n)("jobs.noJobs")),1)])):(h(),N("div",Pe,[(h(!0),N(U,null,et(p.value,_=>(h(),T(it,{key:_.id,job:_,selected:e.selectedJobId===(_.job_id||_.id),onEdit:o=>j("edit",_.id),onSelect:c},null,8,["job","selected","onEdit"]))),128))])),e.selectedJobId?(h(),N("div",{key:2,class:"deselect-overlay",onClick:J})):O("",!0)],64))}})})),Kt=C((()=>{})),ut,Wt=C((()=>{Re(),Re(),Kt(),X(),ut=Y(rt,[["__scopeId","data-v-6bf5dbff"]])}));async function Qt(e){const s=new URLSearchParams;e&&s.set("jobId",e);const a=s.toString();return(await B(`/api/cron-history${a?`?${a}`:""}`)).runs}async function Gt(e,s){return B(`/api/cron-history/${encodeURIComponent(e)}/${encodeURIComponent(s)}`)}var Xt=C((()=>{st()})),Ee,Te,Be,qe,Fe,De,dt,Oe=C((()=>{H(),te(),Q(),Xt(),Rt(),Ee={class:"run-history"},Te={class:"history-header"},Be={class:"history-title"},qe={class:"history-count"},Fe={class:"history-body"},De={class:"run-meta"},dt=W({__name:"JobRunHistory",props:{selectedJobId:{},jobNameMap:{},profileKey:{}},setup(e){const s=e,{t:a}=G(),j=$(!1),n=$([]),y=$({}),p=$({}),c=R(()=>s.selectedJobId?n.value.filter(o=>o.jobId===s.selectedJobId):n.value);async function J(){j.value=!0;try{n.value=await Qt(s.selectedJobId??void 0)}catch(o){console.error("Failed to fetch cron runs:",o),n.value=[]}finally{j.value=!1}}async function u(o){const P=Array.isArray(o)?o:o!=null?[o]:[];for(const g of P){const M=String(g);if(y.value[M]||p.value[M])continue;const k=c.value.find(w=>`${w.jobId}/${w.fileName}`===M);if(k){p.value[M]=!0;try{const w=await Gt(k.jobId,k.fileName);y.value[M]=w.content}catch{y.value[M]="[Error loading content]"}finally{p.value[M]=!1}}}}function m(o){return o<1024?`${o}B`:o<1024*1024?`${(o/1024).toFixed(1)}KB`:`${(o/1024/1024).toFixed(1)}MB`}function _(o){return s.jobNameMap[o]||o}return yt(()=>[s.selectedJobId,s.profileKey],()=>{y.value={},J()},{immediate:!0}),(o,P)=>(h(),N("div",Ee,[i("div",Te,[i("span",Be,r(t(a)("jobs.runHistory.title")),1),i("span",qe,r(c.value.length)+" "+r(t(a)("jobs.runHistory.runs")),1)]),i("div",Fe,[v(t(ne),{show:j.value},{default:d(()=>[!j.value&&c.value.length===0?(h(),T(t(kt),{key:0,description:t(a)("jobs.runHistory.noRuns")},null,8,["description"])):(h(),T(t(gt),{key:1,accordion:"","onUpdate:expandedNames":u},{default:d(()=>[(h(!0),N(U,null,et(c.value,g=>(h(),T(t(wt),{key:`${g.jobId}/${g.fileName}`,title:`${_(g.jobId)} — ${g.runTime}`,name:`${g.jobId}/${g.fileName}`},{"header-extra":d(()=>[i("span",De,r(m(g.size)),1)]),default:d(()=>[p.value[`${g.jobId}/${g.fileName}`]?(h(),T(t(ne),{key:0,size:"small"})):y.value[`${g.jobId}/${g.fileName}`]?(h(),T(Et,{key:1,content:y.value[`${g.jobId}/${g.fileName}`]},null,8,["content"])):O("",!0)]),_:2},1032,["title","name"]))),128))]),_:1}))]),_:1},8,["show"])])]))}})})),Yt=C((()=>{})),ct,Zt=C((()=>{Oe(),Oe(),Yt(),X(),ct=Y(dt,[["__scopeId","data-v-bed5e9a2"]])})),Ue,bt,He=C((()=>{H(),te(),ae(),It(),ie(),Nt(),Q(),Ue={class:"modal-footer"},bt=W({__name:"JobFormModal",props:{jobId:{}},emits:["close","saved"],setup(e,{emit:s}){const{t:a}=G(),j=e,n=s,y=Z(),p=Mt(),c=tt(),J=$(!0),u=$(!1),m=$(!1),_=$([]),o=$({name:"",schedule:"",prompt:"",deliver:"origin",skills:[],repeat_times:null}),P=$(null),g=R(()=>!!j.jobId),M=R(()=>[{label:a("jobs.presetEveryMinute"),value:"* * * * *"},{label:a("jobs.presetEvery5Min"),value:"*/5 * * * *"},{label:a("jobs.presetEveryHour"),value:"0 * * * *"},{label:a("jobs.presetEveryDay"),value:"0 0 * * *"},{label:a("jobs.presetEveryDay9"),value:"0 9 * * *"},{label:a("jobs.presetEveryMonday"),value:"0 9 * * 1"},{label:a("jobs.presetEveryMonth"),value:"0 9 1 * *"}]);function k(b){return typeof b=="string"&&b.trim().length>0}function w(b){const l=p.platforms[b]||{};switch(b){case"telegram":case"discord":case"slack":return k(l.token);case"whatsapp":return l.enabled===!0||l.enabled==="true";case"matrix":return k(l.token)&&k(l.extra?.homeserver);case"weixin":return k(l.token)&&k(l.extra?.account_id);case"wecom":return k(l.extra?.bot_id)&&k(l.extra?.secret);case"feishu":return k(l.extra?.app_id)&&k(l.extra?.app_secret);case"dingtalk":return k(l.extra?.client_id)&&k(l.extra?.client_secret)||k(l.extra?.app_key)&&k(l.extra?.client_secret);case"qqbot":return k(l.extra?.app_id)&&k(l.extra?.client_secret);default:return!1}}const q=R(()=>{const b=[{label:a("jobs.origin"),value:"origin"},{label:a("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"}])b.push({label:l.label,value:l.key,disabled:!w(l.key)});return b}),F=$(null);function I(b){const l=new Map;for(const f of b)f.enabled!==!1&&(l.has(f.name)||l.set(f.name,f));return[...l.values()].map(f=>({label:f.name,value:f.name})).sort((f,ft)=>f.label.localeCompare(ft.label))}async function S(){m.value=!0;try{_.value=I((await Pt()).categories.flatMap(b=>b.skills||[]))}catch{_.value=[]}finally{m.value=!1}}at(async()=>{if(Object.keys(p.platforms||{}).length===0&&await p.fetchSettings(),await S(),j.jobId)try{const b=await Ft(j.jobId);F.value=b,o.value={name:b.name,schedule:ee(b.schedule,b.schedule_display||""),prompt:b.prompt,deliver:b.deliver||"origin",skills:b.skills||(b.skill?[b.skill]:[]),repeat_times:lt(b.repeat)}}catch(b){c.error(a("jobs.loadFailed")+": "+b.message)}});async function z(){if(!o.value.name.trim()){c.warning(a("jobs.nameRequired"));return}if(!o.value.schedule.trim()){c.warning(a("jobs.scheduleRequired"));return}u.value=!0;try{if(g.value){if(!F.value){c.error(a("jobs.loadFailed"));return}const b=Bt(F.value,o.value);if(Object.keys(b).length===0){c.success(a("jobs.jobUpdated")),n("saved");return}await y.updateJob(j.jobId,b),c.success(a("jobs.jobUpdated"))}else{const b={name:o.value.name,schedule:o.value.schedule,prompt:o.value.prompt,deliver:o.value.deliver,skills:o.value.skills,repeat:o.value.repeat_times??void 0};await y.createJob(b),c.success(a("jobs.jobCreated"))}n("saved")}catch(b){c.error(b.message)}finally{u.value=!1}}function pt(){J.value=!1,setTimeout(()=>n("close"),200)}return(b,l)=>(h(),T(t(ht),{show:J.value,"onUpdate:show":l[8]||(l[8]=f=>J.value=f),preset:"card",title:g.value?t(a)("jobs.editJob"):t(a)("jobs.createJob"),style:{width:"min(520px, calc(100vw - 32px))"},"mask-closable":!u.value,onAfterLeave:l[9]||(l[9]=f=>n("close"))},{footer:d(()=>[i("div",Ue,[v(t(E),{onClick:pt},{default:d(()=>[x(r(t(a)("common.cancel")),1)]),_:1}),v(t(E),{type:"primary",loading:u.value,onClick:z},{default:d(()=>[x(r(g.value?t(a)("common.update"):t(a)("common.create")),1)]),_:1},8,["loading"])])]),default:d(()=>[v(t(mt),{"label-placement":"top"},{default:d(()=>[v(t(D),{label:t(a)("jobs.name"),required:""},{default:d(()=>[v(t(se),{value:o.value.name,"onUpdate:value":l[0]||(l[0]=f=>o.value.name=f),placeholder:t(a)("jobs.namePlaceholder"),maxlength:"200","show-count":""},null,8,["value","placeholder"])]),_:1},8,["label"]),v(t(D),{label:t(a)("jobs.schedule"),required:""},{default:d(()=>[v(t(se),{value:o.value.schedule,"onUpdate:value":l[1]||(l[1]=f=>o.value.schedule=f),placeholder:t(a)("jobs.schedulePlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),v(t(D),{label:t(a)("jobs.quickPresets")},{default:d(()=>[v(t(oe),{value:P.value,"onUpdate:value":[l[2]||(l[2]=f=>P.value=f),l[3]||(l[3]=f=>o.value.schedule=f)],options:M.value,placeholder:t(a)("jobs.selectPreset")},null,8,["value","options","placeholder"])]),_:1},8,["label"]),v(t(D),{label:t(a)("jobs.prompt"),required:""},{default:d(()=>[v(t(se),{value:o.value.prompt,"onUpdate:value":l[4]||(l[4]=f=>o.value.prompt=f),type:"textarea",placeholder:t(a)("jobs.promptPlaceholder"),rows:4,maxlength:"5000","show-count":""},null,8,["value","placeholder"])]),_:1},8,["label"]),v(t(D),{label:t(a)("jobs.skills")},{default:d(()=>[v(t(oe),{value:o.value.skills,"onUpdate:value":l[5]||(l[5]=f=>o.value.skills=f),multiple:"",filterable:"",clearable:"",loading:m.value,options:_.value,placeholder:t(a)("jobs.skillsPlaceholder")},null,8,["value","loading","options","placeholder"])]),_:1},8,["label"]),v(t(D),{label:t(a)("jobs.deliverTarget")},{default:d(()=>[v(t(oe),{value:o.value.deliver,"onUpdate:value":l[6]||(l[6]=f=>o.value.deliver=f),options:q.value},null,8,["value","options"])]),_:1},8,["label"]),v(t(D),{label:t(a)("jobs.repeatCount")},{default:d(()=>[v(t(jt),{value:o.value.repeat_times,"onUpdate:value":l[7]||(l[7]=f=>o.value.repeat_times=f),min:1,placeholder:t(a)("jobs.repeatPlaceholder"),clearable:"",style:{width:"100%"}},null,8,["value","placeholder"])]),_:1},8,["label"])]),_:1})]),_:1},8,["show","title","mask-closable"]))}})})),ea=C((()=>{})),vt,ta=C((()=>{He(),He(),ea(),X(),vt=Y(bt,[["__scopeId","data-v-2b8b66a5"]])})),Ve,ze,Ae,Le,Ke,We,Qe,Ge,Xe,Ye,_t,Ze=C((()=>{H(),te(),Q(),Wt(),Zt(),ta(),ae(),St(),Ve={class:"jobs-view"},ze={class:"page-header"},Ae={class:"header-title"},Le={class:"header-actions"},Ke={class:"sort-toggle"},We={class:"sort-arrow"},Qe={class:"sort-arrow"},Ge={class:"jobs-split"},Xe={class:"jobs-top"},Ye={class:"jobs-bottom"},_t=W({__name:"JobsView",setup(e){const{t:s}=G(),a=Z(),j=Ct(),n=$(!1),y=$(null),p=$(null),c=$("name"),J=$(!0),u=R(()=>j.activeProfileName||"default"),m=R(()=>{const I={};for(const S of a.jobs){const z=S.job_id||S.id;I[z]=S.name}return I});async function _(){(!j.activeProfileName||j.profiles.length===0)&&await j.fetchProfiles()}async function o(){p.value=null,a.jobs=[],await _(),await a.fetchJobs()}at(()=>{o()});function P(){y.value=null,n.value=!0}function g(I){y.value=I,n.value=!0}function M(){n.value=!1,y.value=null}async function k(){await a.fetchJobs(),M()}function w(I){p.value=p.value===I?null:I}function q(I){c.value===I?J.value=!J.value:(c.value=I,J.value=!0)}function F(I){return c.value!==I?"↕":J.value?"↑":"↓"}return(I,S)=>(h(),N("div",Ve,[i("header",ze,[i("h2",Ae,r(t(s)("jobs.title")),1),i("div",Le,[i("div",Ke,[v(t(K),null,{trigger:d(()=>[v(t(E),{size:"tiny",type:c.value==="name"?"primary":"default",onClick:S[0]||(S[0]=z=>q("name"))},{default:d(()=>[x(r(t(s)("jobs.sortByName"))+" ",1),i("span",We,r(F("name")),1)]),_:1},8,["type"])]),default:d(()=>[x(" "+r(c.value==="name"?J.value?t(s)("jobs.sortAsc"):t(s)("jobs.sortDesc"):t(s)("jobs.sortByNameHint")),1)]),_:1}),v(t(K),null,{trigger:d(()=>[v(t(E),{size:"tiny",type:c.value==="time"?"primary":"default",onClick:S[1]||(S[1]=z=>q("time"))},{default:d(()=>[x(r(t(s)("jobs.sortByTime"))+" ",1),i("span",Qe,r(F("time")),1)]),_:1},8,["type"])]),default:d(()=>[x(" "+r(c.value==="time"?J.value?t(s)("jobs.sortAsc"):t(s)("jobs.sortDesc"):t(s)("jobs.sortByTimeHint")),1)]),_:1})]),S[3]||(S[3]=i("span",{class:"sort-divider"},null,-1)),v(t(E),{type:"primary",size:"small",onClick:P},{icon:d(()=>[...S[2]||(S[2]=[i("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[i("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),i("line",{x1:"5",y1:"12",x2:"19",y2:"12"})],-1)])]),default:d(()=>[x(" "+r(t(s)("jobs.createJob")),1)]),_:1})])]),i("div",Ge,[i("div",Xe,[v(t(ne),{show:t(a).loading&&t(a).jobs.length===0},{default:d(()=>[v(ut,{"selected-job-id":p.value,"sort-by":c.value,"sort-asc":J.value,onEdit:g,onSelect:w},null,8,["selected-job-id","sort-by","sort-asc"])]),_:1},8,["show"])]),S[4]||(S[4]=i("div",{class:"splitter"},null,-1)),i("div",Ye,[v(ct,{"selected-job-id":p.value,"job-name-map":m.value,"profile-key":u.value},null,8,["selected-job-id","job-name-map","profile-key"])])]),n.value?(h(),T(vt,{key:0,"job-id":y.value,onClose:M,onSaved:k},null,8,["job-id"])):O("",!0)]))}})})),aa=C((()=>{})),sa,oa=C((()=>{Ze(),Ze(),aa(),X(),sa=Y(_t,[["__scopeId","data-v-45581f25"]])}));oa();export{sa as default};
|
|
1
|
+
import{n as C}from"./rolldown-runtime-M0oDzQ_3.js";import{A as mt,Bn as yt,E as jt,Hn as d,It as se,K as ht,Kt as H,Nn as et,O as D,Ot as E,St as gt,V as tt,Wt as kt,an as i,bt as wt,cn as N,cr as t,dn as Jt,en as A,er as $,fn as x,g as ne,hn as W,in as R,jn as h,kn as at,mt as oe,on as T,ot as K,pn as v,pr as r,sn as O,t as te,tn as U,ur as le}from"./ui-vendor-DDMfmCj2.js";import{I as xt,L as $t,O as Q,k as G}from"./vue-vendor-BsMpqyaC.js";import{f as B,n as X,t as Y,u as st}from"./_plugin-vue_export-helper-CvnFozKy.js";import{Dt as Ct,Et as St,L as It,R as Mt}from"./index-B2IKGvbR.js";import{l as Nt,s as Pt}from"./skills-5qxphanX.js";import{n as Rt,t as Et}from"./MarkdownRenderer-DQvs79tf.js";function V(e){return e.job}function ot(e){return typeof e=="object"&&e!==null}function ee(e,s=""){if(typeof e=="string")return e;if(!ot(e))return s;if(e.kind==="cron")return e.expr||e.display||s;if(e.kind==="once")return e.run_at||e.display||s;if(e.kind==="interval")return e.display||(typeof e.minutes=="number"?`every ${e.minutes}m`:s);const a=e;return a.expr||a.run_at||a.display||s}function Tt(e,s="—"){if(typeof e=="string")return e;if(!ot(e))return s;if(e.kind==="cron")return e.expr||e.display||s;if(e.kind==="interval"||e.kind==="once")return e.display||ee(e,s);const a=e;return a.display||a.expr||a.run_at||s}function lt(e){return e&&typeof e=="object"?e.times??null:null}function Bt(e,s){const a={},j=ee(e.schedule,e.schedule_display||""),n=lt(e.repeat),y=e.deliver||"origin",p=e.skills||(e.skill?[e.skill]:[]);return s.name!==e.name&&(a.name=s.name),s.schedule!==j&&(a.schedule=s.schedule),s.prompt!==(e.prompt||"")&&(a.prompt=s.prompt),s.deliver!==y&&(a.deliver=s.deliver),(s.skills.length!==p.length||s.skills.some((c,J)=>c!==p[J]))&&(a.skills=s.skills),s.repeat_times!==n&&(a.repeat=s.repeat_times),a}async function qt(){return(await B("/api/hermes/jobs?include_disabled=true")).jobs}async function Ft(e){return V(await B(`/api/hermes/jobs/${e}`))}async function Dt(e){return V(await B("/api/hermes/jobs",{method:"POST",body:JSON.stringify(e)}))}async function Ot(e,s){return V(await B(`/api/hermes/jobs/${e}`,{method:"PATCH",body:JSON.stringify(s)}))}async function Ut(e){return B(`/api/hermes/jobs/${e}`,{method:"DELETE"})}async function Ht(e){return V(await B(`/api/hermes/jobs/${e}/pause`,{method:"POST"}))}async function Vt(e){return V(await B(`/api/hermes/jobs/${e}/resume`,{method:"POST"}))}async function zt(e){return V(await B(`/api/hermes/jobs/${e}/run`,{method:"POST"}))}var ie=C((()=>{st()}));function L(e,s){return e.job_id===s||e.id===s}var Z,ae=C((()=>{$t(),H(),ie(),Z=xt("jobs",()=>{const e=$([]),s=$(!1);async function a(){s.value=!0;try{e.value=await qt()}catch(u){console.error("Failed to fetch jobs:",u)}finally{s.value=!1}}async function j(u){const m=await Dt(u);return e.value.unshift(m),m}async function n(u,m){const _=await Ot(u,m),o=e.value.findIndex(P=>L(P,u));return o!==-1&&(e.value[o]=_),_}async function y(u){await Ut(u),e.value=e.value.filter(m=>!L(m,u))}async function p(u){const m=await Ht(u),_=e.value.findIndex(o=>L(o,u));_!==-1&&(e.value[_]=m)}async function c(u){const m=await Vt(u),_=e.value.findIndex(o=>L(o,u));_!==-1&&(e.value[_]=m)}async function J(u){const m=await zt(u),_=e.value.findIndex(o=>L(o,u));_!==-1&&(e.value[_]=m)}return{jobs:e,loading:s,fetchJobs:a,createJob:j,updateJob:n,deleteJob:y,pauseJob:p,resumeJob:c,runJob:J}})})),re,ue,de,ce,be,ve,_e,pe,fe,me,ye,je,he,ge,ke,we,Je,xe,$e,Ce,Se,Ie,nt,Me=C((()=>{H(),te(),ie(),ae(),Q(),re={class:"card-header"},ue={class:"job-name"},de={class:"card-body"},ce={class:"info-row"},be={class:"info-label"},ve={class:"info-value mono"},_e={class:"info-row"},pe={class:"info-label"},fe={class:"info-value mono"},me={class:"info-row"},ye={class:"info-label"},je={class:"info-value"},he={class:"info-row"},ge={class:"info-label"},ke={class:"info-value"},we={class:"info-row"},Je={class:"info-label"},xe={class:"info-value"},$e={key:0,class:"info-row"},Ce={class:"info-label"},Se={class:"info-value"},Ie={class:"card-actions"},nt=W({__name:"JobCard",props:{job:{},selected:{type:Boolean}},emits:["edit","select"],setup(e,{emit:s}){const a=e,j=s,{t:n}=G(),y=Z(),p=tt(),c=R(()=>a.job.job_id||a.job.id),J=R(()=>a.job.state==="running"?n("jobs.status.running"):a.job.state==="paused"?n("jobs.status.paused"):a.job.enabled?n("jobs.status.scheduled"):n("jobs.status.disabled")),u=R(()=>a.job.state==="running"?"info":a.job.state==="paused"?"warning":a.job.enabled?"success":"error"),m=R(()=>Tt(a.job.schedule,a.job.schedule_display||"—")),_=w=>w?new Date(w).toLocaleString():"—";async function o(){try{await y.pauseJob(c.value),p.success(n("jobs.jobPaused"))}catch(w){p.error(w.message)}}async function P(){try{await y.resumeJob(c.value),p.success(n("jobs.jobResumed"))}catch(w){p.error(w.message)}}async function g(){try{await y.runJob(c.value),p.info(n("jobs.jobTriggered"))}catch(w){p.error(w.message)}}async function M(){try{await y.deleteJob(c.value),p.success(n("jobs.jobDeleted"))}catch(w){p.error(w.message)}}function k(w){w.target.closest(".card-actions")||j("select",c.value)}return(w,q)=>(h(),N("div",{class:le(["job-card",{selected:e.selected}]),onClick:k},[i("div",re,[i("h3",ue,r(e.job.name),1),i("span",{class:le(["status-badge",u.value])},r(J.value),3)]),i("div",de,[i("div",ce,[i("span",be,r(t(n)("jobs.info.schedule")),1),i("code",ve,r(m.value),1)]),i("div",_e,[i("span",pe,r(t(n)("jobs.info.model")),1),i("span",fe,r(e.job.model||"—"),1)]),i("div",me,[i("span",ye,r(t(n)("jobs.info.lastRun")),1),i("span",je,[x(r(_(e.job.last_run_at))+" ",1),e.job.last_status?(h(),N("span",{key:0,class:le(["run-status",{ok:e.job.last_status==="ok",err:e.job.last_status!=="ok"}])},r(e.job.last_status==="ok"?t(n)("common.ok"):e.job.last_status),3)):O("",!0)])]),i("div",he,[i("span",ge,r(t(n)("jobs.info.nextRun")),1),i("span",ke,r(_(e.job.next_run_at)),1)]),i("div",we,[i("span",Je,r(t(n)("jobs.info.deliver")),1),i("span",xe,[x(r(e.job.deliver),1),e.job.origin?(h(),N(U,{key:0},[x(" ("+r(e.job.origin.platform)+")",1)],64)):O("",!0)])]),e.job.repeat?(h(),N("div",$e,[i("span",Ce,r(t(n)("jobs.info.repeat")),1),i("span",Se,[typeof e.job.repeat=="string"?(h(),N(U,{key:0},[x(r(e.job.repeat),1)],64)):(h(),N(U,{key:1},[x(r(e.job.repeat.completed)+" / "+r(e.job.repeat.times??"∞"),1)],64))])])):O("",!0)]),i("div",Ie,[e.job.state!=="paused"&&e.job.enabled?(h(),T(t(K),{key:0},{trigger:d(()=>[v(t(E),{size:"tiny",quaternary:"",onClick:A(o,["stop"])},{default:d(()=>[x(r(t(n)("jobs.action.pause")),1)]),_:1})]),default:d(()=>[x(" "+r(t(n)("jobs.action.pauseJob")),1)]),_:1})):e.job.state==="paused"?(h(),T(t(K),{key:1},{trigger:d(()=>[v(t(E),{size:"tiny",quaternary:"",onClick:A(P,["stop"])},{default:d(()=>[x(r(t(n)("jobs.action.resume")),1)]),_:1})]),default:d(()=>[x(" "+r(t(n)("jobs.action.resumeJob")),1)]),_:1})):O("",!0),v(t(K),null,{trigger:d(()=>[v(t(E),{size:"tiny",quaternary:"",onClick:A(g,["stop"])},{default:d(()=>[x(r(t(n)("jobs.action.runNow")),1)]),_:1})]),default:d(()=>[x(" "+r(t(n)("jobs.action.triggerImmediately")),1)]),_:1}),v(t(E),{size:"tiny",quaternary:"",onClick:q[0]||(q[0]=A(F=>j("edit",c.value),["stop"]))},{default:d(()=>[x(r(t(n)("common.edit")),1)]),_:1}),v(t(E),{size:"tiny",quaternary:"",type:"error",onClick:A(M,["stop"])},{default:d(()=>[x(r(t(n)("common.delete")),1)]),_:1})])],2))}})})),At=C((()=>{})),it,Lt=C((()=>{Me(),Me(),At(),X(),it=Y(nt,[["__scopeId","data-v-54aca7fb"]])})),Ne,Pe,rt,Re=C((()=>{H(),Lt(),ae(),Q(),Ne={key:0,class:"empty-state"},Pe={key:1,class:"jobs-grid"},rt=W({__name:"JobsPanel",props:{selectedJobId:{},sortBy:{},sortAsc:{type:Boolean}},emits:["edit","select"],setup(e,{emit:s}){const a=e,j=s,{t:n}=G(),y=Z(),p=R(()=>{const u=[...y.jobs],m=a.sortBy,_=a.sortAsc;return m==="name"?u.sort((o,P)=>o.name.localeCompare(P.name,"zh-CN")*(_?1:-1)):_||u.reverse(),u});function c(u){j("select",a.selectedJobId===u?null:u)}function J(){a.selectedJobId&&j("select",null)}return(u,m)=>(h(),N(U,null,[t(y).jobs.length===0?(h(),N("div",Ne,[m[0]||(m[0]=Jt('<svg width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" class="empty-icon" data-v-6bf5dbff><rect x="3" y="4" width="18" height="18" rx="2" ry="2" data-v-6bf5dbff></rect><line x1="16" y1="2" x2="16" y2="6" data-v-6bf5dbff></line><line x1="8" y1="2" x2="8" y2="6" data-v-6bf5dbff></line><line x1="3" y1="10" x2="21" y2="10" data-v-6bf5dbff></line></svg>',1)),i("p",null,r(t(n)("jobs.noJobs")),1)])):(h(),N("div",Pe,[(h(!0),N(U,null,et(p.value,_=>(h(),T(it,{key:_.id,job:_,selected:e.selectedJobId===(_.job_id||_.id),onEdit:o=>j("edit",_.id),onSelect:c},null,8,["job","selected","onEdit"]))),128))])),e.selectedJobId?(h(),N("div",{key:2,class:"deselect-overlay",onClick:J})):O("",!0)],64))}})})),Kt=C((()=>{})),ut,Wt=C((()=>{Re(),Re(),Kt(),X(),ut=Y(rt,[["__scopeId","data-v-6bf5dbff"]])}));async function Qt(e){const s=new URLSearchParams;e&&s.set("jobId",e);const a=s.toString();return(await B(`/api/cron-history${a?`?${a}`:""}`)).runs}async function Gt(e,s){return B(`/api/cron-history/${encodeURIComponent(e)}/${encodeURIComponent(s)}`)}var Xt=C((()=>{st()})),Ee,Te,Be,qe,Fe,De,dt,Oe=C((()=>{H(),te(),Q(),Xt(),Rt(),Ee={class:"run-history"},Te={class:"history-header"},Be={class:"history-title"},qe={class:"history-count"},Fe={class:"history-body"},De={class:"run-meta"},dt=W({__name:"JobRunHistory",props:{selectedJobId:{},jobNameMap:{},profileKey:{}},setup(e){const s=e,{t:a}=G(),j=$(!1),n=$([]),y=$({}),p=$({}),c=R(()=>s.selectedJobId?n.value.filter(o=>o.jobId===s.selectedJobId):n.value);async function J(){j.value=!0;try{n.value=await Qt(s.selectedJobId??void 0)}catch(o){console.error("Failed to fetch cron runs:",o),n.value=[]}finally{j.value=!1}}async function u(o){const P=Array.isArray(o)?o:o!=null?[o]:[];for(const g of P){const M=String(g);if(y.value[M]||p.value[M])continue;const k=c.value.find(w=>`${w.jobId}/${w.fileName}`===M);if(k){p.value[M]=!0;try{const w=await Gt(k.jobId,k.fileName);y.value[M]=w.content}catch{y.value[M]="[Error loading content]"}finally{p.value[M]=!1}}}}function m(o){return o<1024?`${o}B`:o<1024*1024?`${(o/1024).toFixed(1)}KB`:`${(o/1024/1024).toFixed(1)}MB`}function _(o){return s.jobNameMap[o]||o}return yt(()=>[s.selectedJobId,s.profileKey],()=>{y.value={},J()},{immediate:!0}),(o,P)=>(h(),N("div",Ee,[i("div",Te,[i("span",Be,r(t(a)("jobs.runHistory.title")),1),i("span",qe,r(c.value.length)+" "+r(t(a)("jobs.runHistory.runs")),1)]),i("div",Fe,[v(t(ne),{show:j.value},{default:d(()=>[!j.value&&c.value.length===0?(h(),T(t(kt),{key:0,description:t(a)("jobs.runHistory.noRuns")},null,8,["description"])):(h(),T(t(gt),{key:1,accordion:"","onUpdate:expandedNames":u},{default:d(()=>[(h(!0),N(U,null,et(c.value,g=>(h(),T(t(wt),{key:`${g.jobId}/${g.fileName}`,title:`${_(g.jobId)} — ${g.runTime}`,name:`${g.jobId}/${g.fileName}`},{"header-extra":d(()=>[i("span",De,r(m(g.size)),1)]),default:d(()=>[p.value[`${g.jobId}/${g.fileName}`]?(h(),T(t(ne),{key:0,size:"small"})):y.value[`${g.jobId}/${g.fileName}`]?(h(),T(Et,{key:1,content:y.value[`${g.jobId}/${g.fileName}`]},null,8,["content"])):O("",!0)]),_:2},1032,["title","name"]))),128))]),_:1}))]),_:1},8,["show"])])]))}})})),Yt=C((()=>{})),ct,Zt=C((()=>{Oe(),Oe(),Yt(),X(),ct=Y(dt,[["__scopeId","data-v-bed5e9a2"]])})),Ue,bt,He=C((()=>{H(),te(),ae(),It(),ie(),Nt(),Q(),Ue={class:"modal-footer"},bt=W({__name:"JobFormModal",props:{jobId:{}},emits:["close","saved"],setup(e,{emit:s}){const{t:a}=G(),j=e,n=s,y=Z(),p=Mt(),c=tt(),J=$(!0),u=$(!1),m=$(!1),_=$([]),o=$({name:"",schedule:"",prompt:"",deliver:"origin",skills:[],repeat_times:null}),P=$(null),g=R(()=>!!j.jobId),M=R(()=>[{label:a("jobs.presetEveryMinute"),value:"* * * * *"},{label:a("jobs.presetEvery5Min"),value:"*/5 * * * *"},{label:a("jobs.presetEveryHour"),value:"0 * * * *"},{label:a("jobs.presetEveryDay"),value:"0 0 * * *"},{label:a("jobs.presetEveryDay9"),value:"0 9 * * *"},{label:a("jobs.presetEveryMonday"),value:"0 9 * * 1"},{label:a("jobs.presetEveryMonth"),value:"0 9 1 * *"}]);function k(b){return typeof b=="string"&&b.trim().length>0}function w(b){const l=p.platforms[b]||{};switch(b){case"telegram":case"discord":case"slack":return k(l.token);case"whatsapp":return l.enabled===!0||l.enabled==="true";case"matrix":return k(l.token)&&k(l.extra?.homeserver);case"weixin":return k(l.token)&&k(l.extra?.account_id);case"wecom":return k(l.extra?.bot_id)&&k(l.extra?.secret);case"feishu":return k(l.extra?.app_id)&&k(l.extra?.app_secret);case"dingtalk":return k(l.extra?.client_id)&&k(l.extra?.client_secret)||k(l.extra?.app_key)&&k(l.extra?.client_secret);case"qqbot":return k(l.extra?.app_id)&&k(l.extra?.client_secret);default:return!1}}const q=R(()=>{const b=[{label:a("jobs.origin"),value:"origin"},{label:a("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"}])b.push({label:l.label,value:l.key,disabled:!w(l.key)});return b}),F=$(null);function I(b){const l=new Map;for(const f of b)f.enabled!==!1&&(l.has(f.name)||l.set(f.name,f));return[...l.values()].map(f=>({label:f.name,value:f.name})).sort((f,ft)=>f.label.localeCompare(ft.label))}async function S(){m.value=!0;try{_.value=I((await Pt()).categories.flatMap(b=>b.skills||[]))}catch{_.value=[]}finally{m.value=!1}}at(async()=>{if(Object.keys(p.platforms||{}).length===0&&await p.fetchSettings(),await S(),j.jobId)try{const b=await Ft(j.jobId);F.value=b,o.value={name:b.name,schedule:ee(b.schedule,b.schedule_display||""),prompt:b.prompt,deliver:b.deliver||"origin",skills:b.skills||(b.skill?[b.skill]:[]),repeat_times:lt(b.repeat)}}catch(b){c.error(a("jobs.loadFailed")+": "+b.message)}});async function z(){if(!o.value.name.trim()){c.warning(a("jobs.nameRequired"));return}if(!o.value.schedule.trim()){c.warning(a("jobs.scheduleRequired"));return}u.value=!0;try{if(g.value){if(!F.value){c.error(a("jobs.loadFailed"));return}const b=Bt(F.value,o.value);if(Object.keys(b).length===0){c.success(a("jobs.jobUpdated")),n("saved");return}await y.updateJob(j.jobId,b),c.success(a("jobs.jobUpdated"))}else{const b={name:o.value.name,schedule:o.value.schedule,prompt:o.value.prompt,deliver:o.value.deliver,skills:o.value.skills,repeat:o.value.repeat_times??void 0};await y.createJob(b),c.success(a("jobs.jobCreated"))}n("saved")}catch(b){c.error(b.message)}finally{u.value=!1}}function pt(){J.value=!1,setTimeout(()=>n("close"),200)}return(b,l)=>(h(),T(t(ht),{show:J.value,"onUpdate:show":l[8]||(l[8]=f=>J.value=f),preset:"card",title:g.value?t(a)("jobs.editJob"):t(a)("jobs.createJob"),style:{width:"min(520px, calc(100vw - 32px))"},"mask-closable":!u.value,onAfterLeave:l[9]||(l[9]=f=>n("close"))},{footer:d(()=>[i("div",Ue,[v(t(E),{onClick:pt},{default:d(()=>[x(r(t(a)("common.cancel")),1)]),_:1}),v(t(E),{type:"primary",loading:u.value,onClick:z},{default:d(()=>[x(r(g.value?t(a)("common.update"):t(a)("common.create")),1)]),_:1},8,["loading"])])]),default:d(()=>[v(t(mt),{"label-placement":"top"},{default:d(()=>[v(t(D),{label:t(a)("jobs.name"),required:""},{default:d(()=>[v(t(se),{value:o.value.name,"onUpdate:value":l[0]||(l[0]=f=>o.value.name=f),placeholder:t(a)("jobs.namePlaceholder"),maxlength:"200","show-count":""},null,8,["value","placeholder"])]),_:1},8,["label"]),v(t(D),{label:t(a)("jobs.schedule"),required:""},{default:d(()=>[v(t(se),{value:o.value.schedule,"onUpdate:value":l[1]||(l[1]=f=>o.value.schedule=f),placeholder:t(a)("jobs.schedulePlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),v(t(D),{label:t(a)("jobs.quickPresets")},{default:d(()=>[v(t(oe),{value:P.value,"onUpdate:value":[l[2]||(l[2]=f=>P.value=f),l[3]||(l[3]=f=>o.value.schedule=f)],options:M.value,placeholder:t(a)("jobs.selectPreset")},null,8,["value","options","placeholder"])]),_:1},8,["label"]),v(t(D),{label:t(a)("jobs.prompt"),required:""},{default:d(()=>[v(t(se),{value:o.value.prompt,"onUpdate:value":l[4]||(l[4]=f=>o.value.prompt=f),type:"textarea",placeholder:t(a)("jobs.promptPlaceholder"),rows:4,maxlength:"5000","show-count":""},null,8,["value","placeholder"])]),_:1},8,["label"]),v(t(D),{label:t(a)("jobs.skills")},{default:d(()=>[v(t(oe),{value:o.value.skills,"onUpdate:value":l[5]||(l[5]=f=>o.value.skills=f),multiple:"",filterable:"",clearable:"",loading:m.value,options:_.value,placeholder:t(a)("jobs.skillsPlaceholder")},null,8,["value","loading","options","placeholder"])]),_:1},8,["label"]),v(t(D),{label:t(a)("jobs.deliverTarget")},{default:d(()=>[v(t(oe),{value:o.value.deliver,"onUpdate:value":l[6]||(l[6]=f=>o.value.deliver=f),options:q.value},null,8,["value","options"])]),_:1},8,["label"]),v(t(D),{label:t(a)("jobs.repeatCount")},{default:d(()=>[v(t(jt),{value:o.value.repeat_times,"onUpdate:value":l[7]||(l[7]=f=>o.value.repeat_times=f),min:1,placeholder:t(a)("jobs.repeatPlaceholder"),clearable:"",style:{width:"100%"}},null,8,["value","placeholder"])]),_:1},8,["label"])]),_:1})]),_:1},8,["show","title","mask-closable"]))}})})),ea=C((()=>{})),vt,ta=C((()=>{He(),He(),ea(),X(),vt=Y(bt,[["__scopeId","data-v-2b8b66a5"]])})),Ve,ze,Ae,Le,Ke,We,Qe,Ge,Xe,Ye,_t,Ze=C((()=>{H(),te(),Q(),Wt(),Zt(),ta(),ae(),St(),Ve={class:"jobs-view"},ze={class:"page-header"},Ae={class:"header-title"},Le={class:"header-actions"},Ke={class:"sort-toggle"},We={class:"sort-arrow"},Qe={class:"sort-arrow"},Ge={class:"jobs-split"},Xe={class:"jobs-top"},Ye={class:"jobs-bottom"},_t=W({__name:"JobsView",setup(e){const{t:s}=G(),a=Z(),j=Ct(),n=$(!1),y=$(null),p=$(null),c=$("name"),J=$(!0),u=R(()=>j.activeProfileName||"default"),m=R(()=>{const I={};for(const S of a.jobs){const z=S.job_id||S.id;I[z]=S.name}return I});async function _(){(!j.activeProfileName||j.profiles.length===0)&&await j.fetchProfiles()}async function o(){p.value=null,a.jobs=[],await _(),await a.fetchJobs()}at(()=>{o()});function P(){y.value=null,n.value=!0}function g(I){y.value=I,n.value=!0}function M(){n.value=!1,y.value=null}async function k(){await a.fetchJobs(),M()}function w(I){p.value=p.value===I?null:I}function q(I){c.value===I?J.value=!J.value:(c.value=I,J.value=!0)}function F(I){return c.value!==I?"↕":J.value?"↑":"↓"}return(I,S)=>(h(),N("div",Ve,[i("header",ze,[i("h2",Ae,r(t(s)("jobs.title")),1),i("div",Le,[i("div",Ke,[v(t(K),null,{trigger:d(()=>[v(t(E),{size:"tiny",type:c.value==="name"?"primary":"default",onClick:S[0]||(S[0]=z=>q("name"))},{default:d(()=>[x(r(t(s)("jobs.sortByName"))+" ",1),i("span",We,r(F("name")),1)]),_:1},8,["type"])]),default:d(()=>[x(" "+r(c.value==="name"?J.value?t(s)("jobs.sortAsc"):t(s)("jobs.sortDesc"):t(s)("jobs.sortByNameHint")),1)]),_:1}),v(t(K),null,{trigger:d(()=>[v(t(E),{size:"tiny",type:c.value==="time"?"primary":"default",onClick:S[1]||(S[1]=z=>q("time"))},{default:d(()=>[x(r(t(s)("jobs.sortByTime"))+" ",1),i("span",Qe,r(F("time")),1)]),_:1},8,["type"])]),default:d(()=>[x(" "+r(c.value==="time"?J.value?t(s)("jobs.sortAsc"):t(s)("jobs.sortDesc"):t(s)("jobs.sortByTimeHint")),1)]),_:1})]),S[3]||(S[3]=i("span",{class:"sort-divider"},null,-1)),v(t(E),{type:"primary",size:"small",onClick:P},{icon:d(()=>[...S[2]||(S[2]=[i("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[i("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),i("line",{x1:"5",y1:"12",x2:"19",y2:"12"})],-1)])]),default:d(()=>[x(" "+r(t(s)("jobs.createJob")),1)]),_:1})])]),i("div",Ge,[i("div",Xe,[v(t(ne),{show:t(a).loading&&t(a).jobs.length===0},{default:d(()=>[v(ut,{"selected-job-id":p.value,"sort-by":c.value,"sort-asc":J.value,onEdit:g,onSelect:w},null,8,["selected-job-id","sort-by","sort-asc"])]),_:1},8,["show"])]),S[4]||(S[4]=i("div",{class:"splitter"},null,-1)),i("div",Ye,[v(ct,{"selected-job-id":p.value,"job-name-map":m.value,"profile-key":u.value},null,8,["selected-job-id","job-name-map","profile-key"])])]),n.value?(h(),T(vt,{key:0,"job-id":y.value,onClose:M,onSaved:k},null,8,["job-id"])):O("",!0)]))}})})),aa=C((()=>{})),sa,oa=C((()=>{Ze(),Ze(),aa(),X(),sa=Y(_t,[["__scopeId","data-v-45581f25"]])}));oa();export{sa as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as ae}from"./rolldown-runtime-M0oDzQ_3.js";import{A as bs,An as _s,Bn as Oe,E as Ye,Hn as g,I as hs,It as de,K as We,Kt as Ae,Nn as be,O as oe,Ot as L,P as ys,St as gs,V as He,an as i,bt as ws,cn as B,cr as e,er as y,fn as R,g as Je,hn as De,in as U,jn as _,kn as Wt,mt as we,on as ne,ot as Ss,pn as b,pr as r,sn as P,t as Ne,tn as ue,ur as _e,wt as Ze}from"./ui-vendor-DDMfmCj2.js";import{I as Ts,L as Cs,M as Ht,N as $s,O as Le,P as Gt,k as Ee}from"./vue-vendor-BsMpqyaC.js";import{f as D,n as Ke,o as Bs,s as xs,t as ze,u as jt}from"./_plugin-vue_export-helper-fFMkIM4P.js";import{Dt as Is,Et as Ps,Tt as As,wt as Rs}from"./index-Brl4qW5V.js";import{l as Us,s as Os}from"./skills-D7ZMzzzG.js";import{n as Ds,t as Ns}from"./HistoryMessageList-IubX9-tb.js";var Xe,ea,aa,ta,sa,Qt,na=ae((()=>{Ae(),Ne(),Le(),As(),Xe={class:"card-title"},ea={class:"card-meta"},aa={class:"meta-tag assignee-tag"},ta={class:"meta-time"},sa={key:0,class:"card-body-preview"},Qt=De({__name:"KanbanTaskCard",props:{task:{},assigneeAvatar:{}},emits:["click"],setup(t,{emit:n}){const m=t,f=n,{t:c}=Ee(),p=U(()=>{const a=Date.now()/1e3-m.task.created_at;return a<60?c("kanban.card.timeAgo.justNow"):a<3600?c("kanban.card.timeAgo.minutes",{count:Math.floor(a/60)}):a<86400?c("kanban.card.timeAgo.hours",{count:Math.floor(a/3600)}):c("kanban.card.timeAgo.days",{count:Math.floor(a/86400)})}),x=U(()=>m.task.priority>=3?"high":m.task.priority===2?"medium":"low"),I=U(()=>c(`kanban.card.priority.${x.value}`));return(a,z)=>(_(),B("div",{class:_e(["kanban-task-card",`status-${t.task.status}`]),onClick:z[0]||(z[0]=O=>f("click",t.task.id))},[i("div",Xe,r(t.task.title),1),i("div",ea,[t.task.assignee?(_(),ne(e(Ss),{key:0,trigger:"hover"},{trigger:g(()=>[i("span",aa,[b(Rs,{class:"assignee-profile-avatar",name:t.task.assignee,avatar:t.assigneeAvatar,size:18,"aria-hidden":"true"},null,8,["name","avatar"]),i("span",null,r(t.task.assignee),1)])]),default:g(()=>[R(" "+r(e(c)("kanban.card.assigneeTooltip")),1)]),_:1})):P("",!0),t.task.priority>=2?(_(),B("span",{key:1,class:_e(["meta-tag priority-tag",x.value])},r(I.value),3)):P("",!0),i("span",ta,r(p.value),1)]),t.task.body?(_(),B("div",sa,r(t.task.body.slice(0,80))+r(t.task.body.length>80?"...":""),1)):P("",!0)],2))}})})),Ls=ae((()=>{})),Yt,Es=ae((()=>{na(),na(),Ls(),Ke(),Yt=ze(Qt,[["__scopeId","data-v-11436d7e"]])}));function Ks(t){return t?.trim()||"default"}function zs(){try{return localStorage.getItem("hermes_active_profile_name")}catch{return null}}function q(t,n){const m=n.toString();return m?`${t}?${m}`:t}function M(t){const n=new URLSearchParams;return n.set("board",Ks(t)),n}function la(t){return t?t.startsWith("https")?"wss:":"ws:":location.protocol==="https:"?"wss:":"ws:"}function Fs(t){const n=xs(),m=M(t?.board),f=Bs();f&&m.set("token",f);const c=zs();c&&m.set("profile",c);const p=`/api/hermes/kanban/events?${m.toString()}`;if(n)return`${la(n)}//${new URL(n).host}${p}`;const x=location.host;return`${la()}//${x}${p}`}function qs(t){return new WebSocket(Fs(t))}async function Ms(t){const n=new URLSearchParams;return t?.includeArchived&&n.set("includeArchived","true"),(await D(q("/api/hermes/kanban/boards",n))).boards}async function Vs(t){return(await D("/api/hermes/kanban/boards",{method:"POST",body:JSON.stringify(t)})).board}async function Js(t){return D(`/api/hermes/kanban/boards/${encodeURIComponent(t)}`,{method:"DELETE"})}async function Ws(){return(await D("/api/hermes/kanban/capabilities")).capabilities}async function Hs(t){const n=M(t?.board);return t?.status&&n.set("status",t.status),t?.assignee&&n.set("assignee",t.assignee),t?.tenant&&n.set("tenant",t.tenant),t?.includeArchived&&n.set("includeArchived","true"),(await D(q("/api/hermes/kanban",n))).tasks}async function Ue(t,n){return D(q(`/api/hermes/kanban/${encodeURIComponent(t)}`,M(n?.board)))}async function Gs(t,n){return(await D(q("/api/hermes/kanban",M(n?.board)),{method:"POST",body:JSON.stringify(t)})).task}async function js(t,n,m){return D(q("/api/hermes/kanban/complete",M(m?.board)),{method:"POST",body:JSON.stringify({task_ids:t,summary:n})})}async function Qs(t,n,m){return D(q(`/api/hermes/kanban/${encodeURIComponent(t)}/block`,M(m?.board)),{method:"POST",body:JSON.stringify({reason:n})})}async function Ys(t,n){return D(q("/api/hermes/kanban/unblock",M(n?.board)),{method:"POST",body:JSON.stringify({task_ids:t})})}async function Zs(t,n,m){return D(q(`/api/hermes/kanban/${encodeURIComponent(t)}/assign`,M(m?.board)),{method:"POST",body:JSON.stringify({profile:n})})}async function Xs(t,n,m){return D(q(`/api/hermes/kanban/${encodeURIComponent(t)}/comments`,M(m?.board)),{method:"POST",body:JSON.stringify(n)})}async function en(t,n){return D(q("/api/hermes/kanban/links",M(n?.board)),{method:"POST",body:JSON.stringify(t)})}async function an(t,n){const m=M(n?.board);return m.set("parent_id",t.parent_id),m.set("child_id",t.child_id),D(q("/api/hermes/kanban/links",m),{method:"DELETE"})}async function tn(t,n){return D(q("/api/hermes/kanban/tasks/bulk",M(n?.board)),{method:"POST",body:JSON.stringify(t)})}async function sn(t,n){const m=M(n?.board);return n?.tail!==void 0&&m.set("tail",String(n.tail)),D(q(`/api/hermes/kanban/${encodeURIComponent(t)}/log`,m))}async function nn(t){const n=M(t?.board);return t?.task&&n.set("task",t.task),t?.severity&&n.set("severity",t.severity),(await D(q("/api/hermes/kanban/diagnostics",n))).diagnostics}async function ln(t,n){return D(q(`/api/hermes/kanban/${encodeURIComponent(t)}/reclaim`,M(n?.board)),{method:"POST",body:JSON.stringify({reason:n?.reason})})}async function rn(t,n,m){return D(q(`/api/hermes/kanban/${encodeURIComponent(t)}/reassign`,M(m?.board)),{method:"POST",body:JSON.stringify({profile:n,reclaim:m?.reclaim,reason:m?.reason})})}async function on(t,n){return(await D(q(`/api/hermes/kanban/${encodeURIComponent(t)}/specify`,M(n?.board)),{method:"POST",body:JSON.stringify({author:n?.author})})).results}async function un(t){return(await D(q("/api/hermes/kanban/dispatch",M(t?.board)),{method:"POST",body:JSON.stringify({dryRun:t?.dryRun,max:t?.max,failureLimit:t?.failureLimit})})).result}async function dn(t){return(await D(q("/api/hermes/kanban/stats",M(t?.board)))).stats}async function cn(t){return(await D(q("/api/hermes/kanban/assignees",M(t?.board)))).assignees}var Zt=ae((()=>{jt()}));function vn(t){if(typeof window>"u")return null;try{return window.localStorage.getItem(t)}catch{return null}}function fn(t,n){if(!(typeof window>"u"))try{window.localStorage.setItem(t,n)}catch{}}function Me(t){const n=t?.trim().toLowerCase();return n&&Xt.test(n)?n:Se}var Ve,Se,Xt,Fe,Ge=ae((()=>{Cs(),Ae(),Zt(),Ve="hermes.kanban.selectedBoard",Se="default",Xt=/^[a-z0-9][a-z0-9_-]{0,63}$/,Fe=Ts("kanban",()=>{const t=y([]),n=y(null),m=y([]),f=y([]),c=y(null),p=y(!1),x=y(!1),I=y(null),a=y(Me(vn(Ve))),z=y(null),O=y(null);let N=0,A=0,W=0,H=0,E=0,V=0,Y=0,K=null,F=null,J=null,G=!1;const j=U(()=>{const s=f.value.filter(l=>!l.archived);return s.some(l=>l.slug==="default")?s:[{slug:Se,name:"Default",description:"",icon:"",color:"",created_at:null,archived:!1,counts:{},total:0},...s]});function ie(s){if(!c.value)return!1;const l=c.value.capabilities?.find(v=>v.key===s);return l?l.status==="supported":c.value.missing?.includes(s)?!1:c.value.supports?.[s]===!0}function Q(s){if(!ie(s))throw new Error(`Kanban capability "${s}" is not supported by the current Hermes backend`)}function ke(s,l){const v=c.value?.capabilities?.find(C=>C.key===s);return v?l.includes(v.status):l.includes("supported")?ie(s):!1}function re(s,l){if(!ke(s,l))throw new Error(`Kanban capability "${s}" is not available with the required status`)}function ce(s){return j.value.some(l=>l.slug===s)}function ee(s){const l=Me(s);return f.value.length>0&&!ce(l)?Se:l}function he(){t.value=[],n.value=null,m.value=[]}function S(){F&&clearTimeout(F),J&&clearTimeout(J),F=null,J=null}function $(){if(!K)return;const s=K;K=null,s.onclose=null,s.onerror=null,s.onmessage=null;try{s.close()}catch{}}function T(){G=!1,Y++,S(),$()}function ve(s,l,v){J&&clearTimeout(J),J=setTimeout(()=>{!G||v!==Y||l!==N||s!==a.value||Promise.all([h(),le(!0),Z(),ye()])},100)}function fe(s,l,v){F&&clearTimeout(F),F=setTimeout(()=>{!G||v!==Y||l!==N||s!==a.value||me(s,l,v)},3e3)}function me(s,l,v){$();let C;try{C=qs({board:s})}catch(X){console.error("Failed to open kanban event stream:",X),fe(s,l,v);return}K=C,C.onmessage=X=>{if(!(!G||v!==Y||l!==N||s!==a.value))try{JSON.parse(String(X.data))?.type==="event"&&ve(s,l,v)}catch{ve(s,l,v)}},C.onerror=()=>{K===C&&console.error("Kanban event stream error")},C.onclose=()=>{K===C&&(K=null,fe(s,l,v))}}function pe(){const s=c.value?.capabilities?.find(l=>l.key==="events")?.status;return s==="supported"||s==="partial"||ie("events")}function Te(){if(!pe())return!1;G=!0;const s=++Y,l=N,v=a.value;return S(),me(v,l,s),!0}function Pe(){G&&Te()}function te(s){const l=ee(s),v=a.value!==l;return a.value=l,fn(Ve,l),I.value=null,v&&(he(),N++,Pe()),l}function Be(s){const l=Me(s),v=ee(l),C=v!==l;return te(v),C&&(I.value=`Board "${l}" is unavailable; fell back to "${v}".`),{board:v,recovered:C}}function Ce(s){return{seq:s(),generation:N,board:a.value}}function k(s,l,v,C){return s===C&&l===N&&v===a.value}async function h(s=!1){const l=++A;x.value=!0;try{const v=await Ms({includeArchived:s});if(l!==A)return;f.value=v,ee(a.value)!==a.value&&Be(a.value)}catch(v){l===A&&console.error("Failed to fetch kanban boards:",v)}finally{l===A&&(x.value=!1)}}async function w(){try{c.value=await Ws()}catch(s){console.error("Failed to fetch kanban capabilities:",s)}}async function se(s){const l=await Vs(s);return await h(),te(l.slug),await qe(),l}async function $e(){const s=a.value;if(s==="default")throw new Error("Cannot archive the default kanban board");await Js(s),await h(),te(Se),await qe()}async function le(s=!1){const{seq:l,generation:v,board:C}=Ce(()=>++W),X=s?0:++V;s||(p.value=!0);try{const ge=await Hs({board:C,status:z.value||void 0,assignee:O.value||void 0,includeArchived:!0});k(l,v,C,W)&&(t.value=ge)}catch(ge){k(l,v,C,W)&&console.error("Failed to fetch kanban tasks:",ge)}finally{!s&&X===V&&(p.value=!1)}}async function Z(){const{seq:s,generation:l,board:v}=Ce(()=>++H);try{const C=await dn({board:v});k(s,l,v,H)&&(n.value=C)}catch(C){k(s,l,v,H)&&console.error("Failed to fetch kanban stats:",C)}}async function ye(){const{seq:s,generation:l,board:v}=Ce(()=>++E);try{const C=await cn({board:v});k(s,l,v,E)&&(m.value=C)}catch(C){k(s,l,v,E)&&console.error("Failed to fetch kanban assignees:",C)}}async function Re(s){const l=a.value,v=await Gs(s,{board:l});return l===a.value&&(t.value.unshift(v),await Promise.all([Z(),h()])),v}async function o(s,l){const v=a.value;if(await js(s,l,{board:v}),v===a.value){for(const C of s){const X=t.value.find(ge=>ge.id===C);X&&(X.status="done")}await Promise.all([Z(),h()])}}async function u(s,l){const v=a.value;if(await Qs(s,l,{board:v}),v===a.value){const C=t.value.find(X=>X.id===s);C&&(C.status="blocked"),await Promise.all([Z(),h()])}}async function d(s){const l=a.value;if(await Ys(s,{board:l}),l===a.value){for(const v of s){const C=t.value.find(X=>X.id===v);C&&(C.status="ready")}await Promise.all([Z(),h()])}}async function xe(s,l){const v=a.value;if(await Zs(s,l,{board:v}),v===a.value){const C=t.value.find(X=>X.id===s);C&&(C.assignee=l),await Promise.all([Z(),ye()])}}async function ls(s,l,v){return Q("commentsWrite"),Xs(s,{body:l,author:v},{board:a.value})}async function is(s,l){Q("links");const v=a.value,C=await en({parent_id:s,child_id:l},{board:v});return v===a.value&&await Promise.all([le(!0),Z(),h()]),C}async function rs(s,l){Q("links");const v=a.value,C=await an({parent_id:s,child_id:l},{board:v});return v===a.value&&await Promise.all([le(!0),Z(),h()]),C}async function os(s){re("bulk",["supported","partial"]);const l=a.value,v=await tn(s,{board:l});return l===a.value&&await Promise.all([le(!0),Z(),h(),ye()]),v}async function us(s,l){return Q("taskLog"),sn(s,{board:a.value,tail:l})}async function ds(s={}){return Q("diagnostics"),nn({...s,board:a.value})}async function cs(s,l){Q("reclaim");const v=a.value,C=await ln(s,{board:v,reason:l});return v===a.value&&await Promise.all([le(!0),Z(),h()]),C}async function vs(s,l,v={}){Q("reassign");const C=a.value,X=await rn(s,l,{board:C,...v});if(C===a.value){const ge=t.value.find(ps=>ps.id===s);ge&&(ge.assignee=l==="none"?null:l),await Promise.all([Z(),ye()])}return X}async function fs(s,l){Q("specify");const v=a.value,C=await on(s,{board:v,author:l});return v===a.value&&await Promise.all([le(!0),Z(),h()]),C}async function ks(s={}){Q("dispatch");const l=a.value,v=await un({...s,board:l});return l===a.value&&await Promise.all([le(!0),Z(),h()]),v}function ms(s,l){s==="status"?z.value=l:O.value=l}async function qe(){await Promise.all([h(),le(),Z(),ye()])}return{tasks:t,stats:n,assignees:m,boards:f,capabilities:c,activeBoards:j,isCapabilitySupported:ie,loading:p,boardsLoading:x,boardWarning:I,selectedBoard:a,filterStatus:z,filterAssignee:O,fetchBoards:h,fetchCapabilities:w,fetchTasks:le,fetchStats:Z,fetchAssignees:ye,createTask:Re,createBoard:se,archiveSelectedBoard:$e,completeTasks:o,blockTask:u,unblockTasks:d,assignTask:xe,addComment:ls,linkTasks:is,unlinkTasks:rs,bulkUpdateTasks:os,getTaskLog:us,getDiagnostics:ds,reclaimTask:cs,reassignTask:vs,specifyTask:fs,dispatch:ks,setFilter:ms,setSelectedBoard:te,startEventStream:Te,stopEventStream:T,recoverSelectedBoard:Be,resolveAvailableBoard:ee,clearBoardScopedState:he,refreshAll:qe}})}));function je(t,n={}){const m=n.default||0;return t.map(f=>f.name!=="default"||f.counts?f:{...f,counts:{total:m}})}var kn,Qe=ae((()=>{kn="default"})),ia,ra,oa,ua,da,ca,va,fa,ka,ma,pa,ba,_a,ha,ya,ga,wa,Sa,Ta,Ca,$a,Ba,xa,Ia,Pa,Aa,Ra,Ua,Oa,Da,Na,La,Ea,Ka,za,Fa,qa,Ma,Va,Ja,Wa,Ha,Ga,ja,Qa,Ya,Za,Xa,et,at,tt,st,nt,lt,it,rt,ot,ut,dt,ct,vt,ft,kt,mt,pt,bt,_t,ht,yt,gt,wt,St,Tt,Ct,$t,Ie,es,Bt=ae((()=>{Ae(),Ne(),Le(),Ht(),jt(),Zt(),Ge(),Qe(),Ds(),ia={class:"detail-section"},ra={class:"detail-row"},oa={class:"detail-label"},ua={class:"detail-row"},da={class:"detail-value task-id-value"},ca={key:0,class:"detail-row"},va={class:"detail-value"},fa=["onClick"],ka={key:1,class:"detail-row"},ma={class:"detail-value"},pa=["onClick"],ba={class:"detail-row"},_a={class:"detail-label"},ha={class:"detail-value"},ya={class:"detail-row"},ga={class:"detail-label"},wa={class:"detail-value"},Sa={class:"detail-row"},Ta={class:"detail-label"},Ca={class:"detail-value"},$a={class:"detail-row"},Ba={class:"detail-label"},xa={class:"detail-value"},Ia={key:2,class:"detail-row"},Pa={class:"detail-label"},Aa={class:"detail-value"},Ra={key:3,class:"detail-row"},Ua={class:"detail-label"},Oa={class:"detail-value"},Da={key:0,class:"detail-section"},Na={class:"section-title"},La={class:"detail-body"},Ea={key:1,class:"detail-section"},Ka={class:"section-title"},za={key:2,class:"detail-section"},Fa={class:"section-title"},qa={class:"action-group"},Ma={key:1,class:"complete-input"},Va={key:1,class:"block-input"},Ja={key:0,class:"assign-group"},Wa={class:"recovery-group"},Ha={key:3,class:"detail-section"},Ga={key:0,class:"session-list"},ja=["onClick"],Qa={class:"session-title"},Ya={class:"session-meta"},Za={key:1,class:"column-empty"},Xa={key:4,class:"detail-section"},et={class:"section-title run-history-title"},at={class:"run-history-range"},tt={key:0,class:"run-history-controls"},st={class:"run-header"},nt={class:"run-profile"},lt={class:"run-time"},it={key:0,class:"run-summary"},rt={key:1,class:"run-error"},ot={key:5,class:"detail-section"},ut={class:"section-title"},dt={class:"comment-header"},ct={class:"comment-author"},vt={class:"comment-time"},ft={class:"comment-body"},kt={key:6,class:"detail-section"},mt={class:"section-title"},pt={class:"comment-input"},bt={class:"detail-section"},_t={class:"section-title"},ht={class:"action-group"},yt={key:0,class:"log-output"},gt={key:1,class:"log-output"},wt={key:7,class:"detail-section"},St={class:"section-title"},Tt={class:"event-kind"},Ct={class:"event-time"},$t={class:"messages-modal-body"},Ie=10,es=De({__name:"KanbanTaskDrawer",props:{taskId:{}},emits:["close","updated","navigate"],setup(t,{emit:n}){const m=t,f=n,{t:c}=Ee(),p=Gt(),x=He(),I=Fe(),a=y(null),z=y(!1),O=y(null),N=y(""),A=y(!1),W=y(""),H=y(!1),E=y(!1),V=y(""),Y=y(null),K=y(!1),F=y(null),J=y(!1),G=y(""),j=y(1),ie=U(()=>a.value&&(a.value.task.result||a.value.latest_summary)||""),Q=U(()=>a.value?c(`kanban.columns.${a.value.task.status}`,a.value.task.status):""),ke=U(()=>{const o=a.value?.task.status;return o!=="done"&&o!=="archived"}),re=y([]),ce=y(!1),ee=y(!1),he=U(()=>a.value&&[...a.value.runs].reverse().find(o=>o.profile)?.profile||null);function S(o,u){return m.taskId===o&&I.selectedBoard===u}function $(){O.value=null,N.value="",A.value=!1,W.value="",H.value=!1,E.value=!1,V.value="",Y.value=null,K.value=!1,F.value=null,J.value=!1,G.value="",j.value=1,re.value=[],ce.value=!1,ee.value=!1}async function T(){if(!a.value)return;const o=a.value.task.id,u=I.selectedBoard,d=he.value;if(d&&(ee.value=!ee.value,!!ee.value)){ce.value=!0;try{const xe=await D(`/api/hermes/kanban/search-sessions?task_id=${encodeURIComponent(o)}&profile=${encodeURIComponent(d)}&board=${encodeURIComponent(u)}`);S(o,u)&&(re.value=xe.results)}catch{S(o,u)&&(re.value=[])}finally{S(o,u)&&(ce.value=!1)}}}function ve(){a.value?.session&&(E.value=!0)}const fe=U(()=>{const o=a.value?.session;return o?{id:o.id,title:o.title||"",source:o.source,messages:o.messages.filter(u=>u.role==="user"||u.role==="assistant").map(u=>({id:String(u.id),role:u.role,content:u.content,timestamp:u.timestamp})),createdAt:o.started_at,updatedAt:o.ended_at||o.started_at,model:o.model,messageCount:o.messages.length,endedAt:o.ended_at}:null}),me=U(()=>je(I.assignees,I.stats?.by_assignee||{}).map(o=>({label:o.name,value:o.name}))),pe=U(()=>{const o=a.value?.runs.length||0;return Math.max(1,Math.ceil(o/Ie))}),Te=U(()=>{const o=a.value?.runs||[],u=(j.value-1)*Ie;return o.slice(u,u+Ie)}),Pe=U(()=>{const o=a.value?.runs.length||0;if(!o)return"";const u=(j.value-1)*Ie+1;return`${u}-${Math.min(u+Ie-1,o)} / ${o}`});Oe(()=>[m.taskId,I.selectedBoard],async([o,u])=>{if($(),!o){a.value=null;return}z.value=!0;try{const d=await Ue(o,{board:u});S(o,u)&&(a.value=d)}catch{S(o,u)&&x.error(c("kanban.message.loadFailed"))}finally{S(o,u)&&(z.value=!1)}},{immediate:!0}),Oe(()=>a.value?.runs.length||0,()=>{j.value>pe.value&&(j.value=pe.value)});function te(o){return o?new Date(o*1e3).toLocaleString():"—"}async function Be(){if(m.taskId){if(!H.value){H.value=!0;return}try{await I.completeTasks([m.taskId],W.value.trim()||void 0),x.success(c("kanban.message.taskCompleted")),H.value=!1,W.value="",f("updated"),f("close")}catch(o){x.error(o.message)}}}async function Ce(){if(!(!m.taskId||!N.value.trim()))try{await I.blockTask(m.taskId,N.value.trim()),x.success(c("kanban.message.taskBlocked")),A.value=!1,N.value="",f("updated"),f("close")}catch(o){x.error(o.message)}}async function k(){if(m.taskId)try{await I.unblockTasks([m.taskId]),x.success(c("kanban.message.taskUnblocked")),f("updated"),f("close")}catch(o){x.error(o.message)}}async function h(){if(!m.taskId||!O.value)return;const o=m.taskId,u=I.selectedBoard;try{if(await I.assignTask(o,O.value),S(o,u)&&(x.success(c("kanban.message.taskAssigned")),O.value=null),a.value){const d=await Ue(o,{board:u});S(o,u)&&(a.value=d)}f("updated")}catch(d){S(o,u)&&x.error(d.message)}}async function w(){if(!m.taskId||!V.value.trim())return;const o=m.taskId,u=I.selectedBoard;try{await I.addComment(o,V.value.trim());const d=await Ue(o,{board:u});S(o,u)&&(V.value="",a.value=d,x.success(c("kanban.message.commentAdded"))),f("updated")}catch(d){S(o,u)&&x.error(d.message)}}async function se(){if(!m.taskId)return;const o=m.taskId,u=I.selectedBoard;K.value=!0;try{const d=await I.getTaskLog(o,2e4);S(o,u)&&(Y.value=d.exists?d.content:c("kanban.detail.noLog"))}catch(d){S(o,u)&&x.error(d.message)}finally{S(o,u)&&(K.value=!1)}}async function $e(){if(!m.taskId)return;const o=m.taskId,u=I.selectedBoard;J.value=!0;try{const d=await I.getDiagnostics({task:o,severity:"warning"});S(o,u)&&(F.value=d)}catch(d){S(o,u)&&x.error(d.message)}finally{S(o,u)&&(J.value=!1)}}async function le(){if(m.taskId)try{await I.reclaimTask(m.taskId,G.value.trim()||void 0),x.success(c("kanban.message.taskReclaimed")),f("updated"),f("close")}catch(o){x.error(o.message)}}async function Z(){if(!(!m.taskId||!O.value))try{await I.reassignTask(m.taskId,O.value,{reclaim:a.value?.task.status==="running",reason:G.value.trim()||void 0}),x.success(c("kanban.message.taskReassigned")),f("updated"),f("close")}catch(o){x.error(o.message)}}async function ye(){if(!m.taskId)return;const o=m.taskId,u=I.selectedBoard;try{await I.specifyTask(o);const d=await Ue(o,{board:u});S(o,u)&&(x.success(c("kanban.message.taskSpecified")),a.value=d),f("updated")}catch(d){x.error(d.message)}}function Re(o){f("updated"),f("navigate",o)}return(o,u)=>(_(),B(ue,null,[b(e(hs),{show:!!t.taskId,width:420,placement:"right","onUpdate:show":u[10]||(u[10]=d=>{d||f("close")})},{default:g(()=>[b(e(ys),{title:a.value?.task.title||"",closable:""},{default:g(()=>[b(e(Je),{show:z.value},{default:g(()=>[a.value?(_(),B(ue,{key:0},[i("div",ia,[i("div",ra,[i("span",oa,r(e(c)("kanban.detail.status")),1),i("span",{class:_e(["detail-value status-badge",a.value.task.status])},r(Q.value),3)]),i("div",ua,[u[12]||(u[12]=i("span",{class:"detail-label"},"Task ID",-1)),i("span",da,r(a.value.task.id),1)]),a.value.parents?.length?(_(),B("div",ca,[u[13]||(u[13]=i("span",{class:"detail-label"},"Parent",-1)),i("span",va,[(_(!0),B(ue,null,be(a.value.parents,d=>(_(),B("a",{key:d,class:"task-link",onClick:xe=>Re(d)},r(d),9,fa))),128))])])):P("",!0),a.value.children?.length?(_(),B("div",ka,[u[14]||(u[14]=i("span",{class:"detail-label"},"Children",-1)),i("span",ma,[(_(!0),B(ue,null,be(a.value.children,d=>(_(),B("a",{key:d,class:"task-link",onClick:xe=>Re(d)},r(d),9,pa))),128))])])):P("",!0),i("div",ba,[i("span",_a,r(e(c)("kanban.detail.assignee")),1),i("span",ha,r(a.value.task.assignee||"—"),1)]),i("div",ya,[i("span",ga,r(e(c)("kanban.detail.priority")),1),i("span",wa,r(a.value.task.priority),1)]),i("div",Sa,[i("span",Ta,r(e(c)("kanban.detail.tenant")),1),i("span",Ca,r(a.value.task.tenant||"—"),1)]),i("div",$a,[i("span",Ba,r(e(c)("kanban.detail.createdAt")),1),i("span",xa,r(te(a.value.task.created_at)),1)]),a.value.task.started_at?(_(),B("div",Ia,[i("span",Pa,r(e(c)("kanban.detail.startedAt")),1),i("span",Aa,r(te(a.value.task.started_at)),1)])):P("",!0),a.value.task.completed_at?(_(),B("div",Ra,[i("span",Ua,r(e(c)("kanban.detail.completedAt")),1),i("span",Oa,r(te(a.value.task.completed_at)),1)])):P("",!0)]),a.value.task.body?(_(),B("div",Da,[i("div",Na,r(e(c)("kanban.form.body")),1),i("div",La,r(a.value.task.body),1)])):P("",!0),ie.value?(_(),B("div",Ea,[i("div",Ka,r(e(c)("kanban.detail.result")),1),i("div",{class:"result-summary",onClick:ve},r(ie.value),1)])):P("",!0),ke.value?(_(),B("div",za,[i("div",Fa,r(e(c)("kanban.action.title")),1),i("div",qa,[H.value?(_(),B("div",Ma,[b(e(de),{value:W.value,"onUpdate:value":u[1]||(u[1]=d=>W.value=d),size:"small",placeholder:e(c)("kanban.action.completeSummary")},null,8,["value","placeholder"]),b(e(L),{size:"small",type:"primary",onClick:Be},{default:g(()=>[R(r(e(c)("common.ok")),1)]),_:1}),b(e(L),{size:"small",onClick:u[2]||(u[2]=d=>{H.value=!1,W.value=""})},{default:g(()=>[R(r(e(c)("common.cancel")),1)]),_:1})])):(_(),ne(e(L),{key:0,size:"small",onClick:u[0]||(u[0]=d=>H.value=!0)},{default:g(()=>[R(r(e(c)("kanban.action.complete")),1)]),_:1})),a.value.task.status==="blocked"?(_(),ne(e(L),{key:2,size:"small",onClick:k},{default:g(()=>[R(r(e(c)("kanban.action.unblock")),1)]),_:1})):(_(),B(ue,{key:3},[A.value?(_(),B("div",Va,[b(e(de),{value:N.value,"onUpdate:value":u[4]||(u[4]=d=>N.value=d),size:"small",placeholder:e(c)("kanban.action.blockReason")},null,8,["value","placeholder"]),b(e(L),{size:"small",type:"primary",onClick:Ce},{default:g(()=>[R(r(e(c)("common.ok")),1)]),_:1})])):(_(),ne(e(L),{key:0,size:"small",onClick:u[3]||(u[3]=d=>A.value=!0)},{default:g(()=>[R(r(e(c)("kanban.action.block")),1)]),_:1}))],64))]),a.value.task.status!=="running"?(_(),B("div",Ja,[b(e(we),{value:O.value,"onUpdate:value":u[5]||(u[5]=d=>O.value=d),options:me.value,size:"small",placeholder:e(c)("kanban.action.assignTo"),style:{flex:"1"}},null,8,["value","options","placeholder"]),b(e(L),{size:"small",disabled:!O.value,onClick:h},{default:g(()=>[R(r(e(c)("kanban.action.assign")),1)]),_:1},8,["disabled"])])):P("",!0),i("div",Wa,[b(e(de),{value:G.value,"onUpdate:value":u[6]||(u[6]=d=>G.value=d),size:"small",placeholder:e(c)("kanban.action.recoveryReason")},null,8,["value","placeholder"]),b(e(L),{size:"small",secondary:"",onClick:le},{default:g(()=>[R(r(e(c)("kanban.action.reclaim")),1)]),_:1}),b(e(L),{size:"small",secondary:"",disabled:!O.value,onClick:Z},{default:g(()=>[R(r(e(c)("kanban.action.reassign")),1)]),_:1},8,["disabled"]),a.value.task.status==="triage"?(_(),ne(e(L),{key:0,size:"small",secondary:"",onClick:ye},{default:g(()=>[R(r(e(c)("kanban.action.specify")),1)]),_:1})):P("",!0)])])):P("",!0),a.value.runs.length>0?(_(),B("div",Ha,[i("div",{class:"section-title",style:{cursor:"pointer"},onClick:T},[R(r(e(c)("kanban.detail.sessions"))+" ",1),ce.value?(_(),ne(e(Je),{key:0,size:12,style:{"margin-left":"6px"}})):P("",!0)]),ee.value&&re.value.length>0?(_(),B("div",Ga,[(_(!0),B(ue,null,be(re.value,d=>(_(),B("div",{key:d.id,class:"session-item",onClick:xe=>e(p).push({name:"hermes.chat",query:{session:d.id}})},[i("div",Qa,r(d.title||d.id),1),i("div",Ya,[i("span",null,r(d.source),1),i("span",null,r(d.model),1),i("span",null,r(te(d.started_at)),1)])],8,ja))),128))])):P("",!0),ee.value&&!ce.value&&re.value.length===0?(_(),B("div",Za,r(e(c)("kanban.detail.noSessions")),1)):P("",!0)])):P("",!0),a.value.runs.length>0?(_(),B("div",Xa,[i("div",et,[i("span",null,r(e(c)("kanban.detail.runs")),1),i("span",at,r(Pe.value),1),pe.value>1?(_(),B("div",tt,[b(e(L),{size:"tiny",secondary:"",disabled:j.value<=1,onClick:u[7]||(u[7]=d=>j.value-=1)},{default:g(()=>[...u[15]||(u[15]=[R("‹",-1)])]),_:1},8,["disabled"]),b(e(L),{size:"tiny",secondary:"",disabled:j.value>=pe.value,onClick:u[8]||(u[8]=d=>j.value+=1)},{default:g(()=>[...u[16]||(u[16]=[R("›",-1)])]),_:1},8,["disabled"])])):P("",!0)]),(_(!0),B(ue,null,be(Te.value,d=>(_(),B("div",{key:d.id,class:"run-item"},[i("div",st,[i("span",{class:_e(["run-status",d.status])},r(d.status),3),i("span",nt,r(d.profile||"—"),1),i("span",lt,r(te(d.started_at)),1)]),d.summary?(_(),B("div",it,r(d.summary),1)):P("",!0),d.error?(_(),B("div",rt,r(d.error),1)):P("",!0)]))),128))])):P("",!0),a.value.comments.length>0?(_(),B("div",ot,[i("div",ut,r(e(c)("kanban.detail.comments")),1),(_(!0),B(ue,null,be(a.value.comments,d=>(_(),B("div",{key:d.id,class:"comment-item"},[i("div",dt,[i("span",ct,r(d.author),1),i("span",vt,r(te(d.created_at)),1)]),i("div",ft,r(d.body),1)]))),128))])):P("",!0),ke.value?(_(),B("div",kt,[i("div",mt,r(e(c)("kanban.detail.addComment")),1),i("div",pt,[b(e(de),{value:V.value,"onUpdate:value":u[9]||(u[9]=d=>V.value=d),type:"textarea",rows:3,placeholder:e(c)("kanban.detail.commentPlaceholder")},null,8,["value","placeholder"]),b(e(L),{size:"small",type:"primary",disabled:!V.value.trim(),onClick:w},{default:g(()=>[R(r(e(c)("common.add")),1)]),_:1},8,["disabled"])])])):P("",!0),i("div",bt,[i("div",_t,r(e(c)("kanban.detail.operations")),1),i("div",ht,[b(e(L),{size:"small",secondary:"",loading:K.value,onClick:se},{default:g(()=>[R(r(e(c)("kanban.action.loadLog")),1)]),_:1},8,["loading"]),b(e(L),{size:"small",secondary:"",loading:J.value,onClick:$e},{default:g(()=>[R(r(e(c)("kanban.action.loadDiagnostics")),1)]),_:1},8,["loading"])]),Y.value!==null?(_(),B("pre",yt,r(Y.value),1)):P("",!0),F.value!==null?(_(),B("pre",gt,r(JSON.stringify(F.value,null,2)),1)):P("",!0)]),a.value.events.length>0?(_(),B("div",wt,[i("div",St,r(e(c)("kanban.detail.events")),1),(_(!0),B(ue,null,be(a.value.events.slice(-10),d=>(_(),B("div",{key:d.id,class:"event-item"},[i("span",Tt,r(d.kind),1),i("span",Ct,r(te(d.created_at)),1)]))),128))])):P("",!0)],64)):P("",!0)]),_:1},8,["show"])]),_:1},8,["title"])]),_:1},8,["show"]),fe.value?(_(),ne(e(We),{key:0,show:E.value,preset:"card",title:a.value?.task.title||"",style:{width:"900px",maxWidth:"calc(100vw - 48px)"},onClose:u[11]||(u[11]=d=>E.value=!1)},{default:g(()=>[i("div",$t,[b(Ns,{session:fe.value},null,8,["session"])])]),_:1},8,["show","title"])):P("",!0)],64))}})})),mn=ae((()=>{})),as,pn=ae((()=>{Bt(),Bt(),mn(),Ke(),as=ze(es,[["__scopeId","data-v-289879fe"]])})),xt,It,ts,Pt=ae((()=>{Ae(),Ne(),Le(),Ge(),Qe(),Us(),xt={class:"advanced-row"},It={class:"advanced-grid"},ts=De({__name:"KanbanCreateForm",emits:["close","created"],setup(t,{emit:n}){const m=n,{t:f}=Ee(),c=He(),p=Fe(),x=y(""),I=y(""),a=y(null),z=y(null),O=y(""),N=y(!1),A=y("scratch"),W=y(""),H=y(""),E=y([]),V=y(""),Y=y(null),K=y(!1),F=y(null),J=y(!1),G=y(!1),j=y([]),ie=U(()=>[{label:f("kanban.card.priority.low"),value:1},{label:f("kanban.card.priority.medium"),value:2},{label:f("kanban.card.priority.high"),value:3}]),Q=U(()=>je(p.assignees,p.stats?.by_assignee||{}).map(S=>({label:S.name,value:S.name}))),ke=U(()=>[{label:f("kanban.form.workspaceScratch"),value:"scratch"},{label:f("kanban.form.workspaceDir"),value:"dir"},{label:f("kanban.form.workspaceWorktree"),value:"worktree"}]);function re(){if(A.value==="scratch")return;const S=W.value.trim();return S?`${A.value}:${S}`:A.value}function ce(){return E.value.length?E.value:void 0}function ee(S){const $=new Map;for(const T of S)T.enabled!==!1&&($.has(T.name)||$.set(T.name,T));return[...$.values()].map(T=>({label:T.name,value:T.name})).sort((T,ve)=>T.label.localeCompare(ve.label))}Wt(async()=>{G.value=!0;try{j.value=ee((await Os()).categories.flatMap(S=>S.skills||[]))}catch{j.value=[]}finally{G.value=!1}});async function he(){if(!x.value.trim()){c.warning(f("kanban.form.titleRequired"));return}J.value=!0;try{const S={title:x.value.trim(),body:I.value.trim()||void 0,assignee:a.value||void 0,priority:z.value??void 0},$=O.value.trim(),T=re(),ve=H.value.trim(),fe=ce(),me=V.value.trim();$&&(S.tenant=$),N.value&&(S.triage=!0),T&&(S.workspace=T),A.value==="worktree"&&ve&&(S.branch=ve),fe&&(S.skills=fe),me&&(S.maxRuntime=me),Y.value!==null&&(S.maxRetries=Y.value),K.value&&(S.goalMode=!0,F.value!==null&&(S.goalMaxTurns=F.value)),await p.createTask(S),c.success(f("kanban.message.taskCreated")),m("created"),m("close")}catch(S){c.error(S.message)}finally{J.value=!1}}return(S,$)=>(_(),ne(e(We),{show:!0,preset:"dialog",title:e(f)("kanban.createTask"),style:{width:"480px"},onClose:$[15]||($[15]=T=>m("close"))},{action:g(()=>[b(e(L),{onClick:$[14]||($[14]=T=>m("close"))},{default:g(()=>[R(r(e(f)("common.cancel")),1)]),_:1}),b(e(L),{type:"primary",loading:J.value,onClick:he},{default:g(()=>[R(r(e(f)("common.create")),1)]),_:1},8,["loading"])]),default:g(()=>[b(e(bs),{"label-placement":"top"},{default:g(()=>[b(e(oe),{label:e(f)("kanban.form.title")},{default:g(()=>[b(e(de),{value:x.value,"onUpdate:value":$[0]||($[0]=T=>x.value=T),placeholder:e(f)("kanban.form.titlePlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),b(e(oe),{label:e(f)("kanban.form.body")},{default:g(()=>[b(e(de),{value:I.value,"onUpdate:value":$[1]||($[1]=T=>I.value=T),type:"textarea",rows:3,placeholder:e(f)("kanban.form.bodyPlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),b(e(oe),{label:e(f)("kanban.form.assignee")},{default:g(()=>[b(e(we),{value:a.value,"onUpdate:value":$[2]||($[2]=T=>a.value=T),options:Q.value,placeholder:e(f)("kanban.form.selectAssignee"),clearable:""},null,8,["value","options","placeholder"])]),_:1},8,["label"]),b(e(oe),{label:e(f)("kanban.form.priority")},{default:g(()=>[b(e(we),{value:z.value,"onUpdate:value":$[3]||($[3]=T=>z.value=T),options:ie.value,placeholder:e(f)("kanban.form.selectPriority"),clearable:""},null,8,["value","options","placeholder"])]),_:1},8,["label"]),b(e(oe),{label:e(f)("kanban.form.tenant")},{default:g(()=>[b(e(de),{value:O.value,"onUpdate:value":$[4]||($[4]=T=>O.value=T),placeholder:e(f)("kanban.form.tenantPlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),b(e(oe),{label:e(f)("kanban.form.workspace")},{default:g(()=>[b(e(we),{value:A.value,"onUpdate:value":$[5]||($[5]=T=>A.value=T),options:ke.value},null,8,["value","options"])]),_:1},8,["label"]),A.value!=="scratch"?(_(),ne(e(oe),{key:0,label:e(f)("kanban.form.workspacePath")},{default:g(()=>[b(e(de),{value:W.value,"onUpdate:value":$[6]||($[6]=T=>W.value=T),placeholder:e(f)("kanban.form.workspacePathPlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"])):P("",!0),A.value==="worktree"?(_(),ne(e(oe),{key:1,label:e(f)("kanban.form.branch")},{default:g(()=>[b(e(de),{value:H.value,"onUpdate:value":$[7]||($[7]=T=>H.value=T),placeholder:e(f)("kanban.form.branchPlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"])):P("",!0),b(e(oe),{label:e(f)("kanban.form.skills")},{default:g(()=>[b(e(we),{value:E.value,"onUpdate:value":$[8]||($[8]=T=>E.value=T),multiple:"",filterable:"",clearable:"",loading:G.value,options:j.value,placeholder:e(f)("kanban.form.skillsPlaceholder")},null,8,["value","loading","options","placeholder"])]),_:1},8,["label"]),i("div",xt,[b(e(Ze),{checked:N.value,"onUpdate:checked":$[9]||($[9]=T=>N.value=T)},{default:g(()=>[R(r(e(f)("kanban.form.triage")),1)]),_:1},8,["checked"]),b(e(Ze),{checked:K.value,"onUpdate:checked":$[10]||($[10]=T=>K.value=T)},{default:g(()=>[R(r(e(f)("kanban.form.goalMode")),1)]),_:1},8,["checked"])]),i("div",It,[b(e(oe),{label:e(f)("kanban.form.maxRuntime")},{default:g(()=>[b(e(de),{value:V.value,"onUpdate:value":$[11]||($[11]=T=>V.value=T),placeholder:e(f)("kanban.form.maxRuntimePlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),b(e(oe),{label:e(f)("kanban.form.maxRetries")},{default:g(()=>[b(e(Ye),{value:Y.value,"onUpdate:value":$[12]||($[12]=T=>Y.value=T),min:1,max:100,precision:0,placeholder:e(f)("kanban.form.maxRetriesPlaceholder"),clearable:""},null,8,["value","placeholder"])]),_:1},8,["label"]),K.value?(_(),ne(e(oe),{key:0,label:e(f)("kanban.form.goalMaxTurns")},{default:g(()=>[b(e(Ye),{value:F.value,"onUpdate:value":$[13]||($[13]=T=>F.value=T),min:1,max:100,precision:0,placeholder:e(f)("kanban.form.goalMaxTurnsPlaceholder"),clearable:""},null,8,["value","placeholder"])]),_:1},8,["label"])):P("",!0)])]),_:1})]),_:1},8,["title"]))}})})),bn=ae((()=>{})),ss,_n=ae((()=>{Pt(),Pt(),bn(),Ke(),ss=ze(ts,[["__scopeId","data-v-721fc143"]])})),At,Rt,Ut,Ot,Dt,Nt,Lt,Et,Kt,zt,Ft,qt,Mt,Vt,ns,Jt=ae((()=>{Ae(),Ne(),Le(),Ht(),Es(),pn(),_n(),Ge(),Ps(),Qe(),At={class:"kanban-view"},Rt={class:"page-header"},Ut={class:"header-title"},Ot={class:"header-actions"},Dt={key:0,class:"stats-bar"},Nt=["aria-pressed","onClick"],Lt={class:"stat-count"},Et={class:"stat-label"},Kt=["aria-pressed"],zt={class:"stat-count"},Ft={class:"stat-label"},qt={class:"kanban-board"},Mt={key:0,class:"column-empty"},Vt={class:"board-form"},ns=De({__name:"KanbanView",setup(t){const{t:n}=Ee(),m=$s(),f=Gt(),c=He(),p=Fe(),x=Is(),I=y(!1),a=y(!1),z=y(null),O=y(""),N=y(""),A=y(!1),W=y(null),H=y(!1),E=["triage","todo","scheduled","ready","running","blocked","review","done","archived"],V=y([...E]);function Y(k){return Array.isArray(k)?typeof k[0]=="string"?k[0]:null:typeof k=="string"?k:null}function K(){return Y(m.query.board)}async function F(k){K()!==k&&await f.replace({query:{...m.query,board:k}})}async function J(k,h=!0,w=!1){const se=p.selectedBoard,{board:$e,recovered:le}=p.recoverSelectedBoard(k||p.selectedBoard||"default");z.value=null,I.value=!1,a.value=!1,h&&le&&p.boardWarning&&c.warning(p.boardWarning),await F($e),(w||$e!==se)&&await p.refreshAll()}function G(k){return`${n("kanban.stats.tasks")}: ${k}`}const j=U(()=>p.activeBoards.map(k=>{const h=typeof k.total=="number"?k.total:0;return{label:`${n("kanban.title")}: ${k.icon?`${k.icon} `:""}${k.name||k.slug} · ${G(h)}`,value:k.slug}})),ie=U({get:()=>p.selectedBoard,set:k=>{J(k||"default")}}),Q=U(()=>{const k={};for(const h of E)k[h]=p.tasks.filter(w=>w.status===h).sort((w,se)=>se.created_at-w.created_at);return k}),ke=U(()=>{const k=p.filterStatus;return k&&E.includes(k)?[k]:E}),re=U(()=>je(p.assignees,p.stats?.by_assignee||{})),ce=U(()=>Object.fromEntries(x.profiles.map(k=>[k.name,k.avatar||null]))),ee=U(()=>[{label:n("kanban.allStatuses"),value:""},...E.map(k=>({label:n(`kanban.columns.${k}`,k),value:k}))]),he=U(()=>[{label:n("kanban.allAssignees"),value:""},...re.value.map(k=>({label:k.name,value:k.name}))]),S=U({get:()=>p.filterStatus||"",set:k=>p.setFilter("status",k||null)}),$=U({get:()=>p.filterAssignee||"",set:k=>p.setFilter("assignee",k||null)});Oe(()=>m.query.board,async()=>{H.value&&await J(K(),!1)}),Oe(ke,k=>{V.value=[...k]},{immediate:!0}),Wt(async()=>{await Promise.all([p.fetchBoards(),p.fetchCapabilities(),x.profiles.length===0?x.fetchProfiles():Promise.resolve()]),await J(K(),!0,!0),p.startEventStream(),H.value=!0,W.value=setInterval(()=>{document.visibilityState==="visible"&&Promise.all([p.fetchBoards(),p.fetchTasks(!0),p.fetchStats()])},15e3)}),_s(()=>{p.stopEventStream(),W.value&&clearInterval(W.value)});function T(k){z.value=k}function ve(){z.value=null}async function fe(){await Promise.all([p.fetchTasks(),p.fetchStats()])}function me(k){z.value=k}async function pe(){await p.fetchTasks()}async function Te(k){p.setFilter("status",k),V.value=k?[k]:[...E],await p.fetchTasks()}async function Pe(){await Promise.all([p.fetchTasks(),p.fetchStats(),p.fetchBoards()])}async function te(){const k=O.value.trim();if(!k){c.warning(n("kanban.board.slugRequired"));return}A.value=!0;try{const h=await p.createBoard({slug:k,name:N.value.trim()||void 0});O.value="",N.value="",a.value=!1,await F(h.slug),c.success(n("kanban.board.created"))}catch(h){c.error(h.message)}finally{A.value=!1}}async function Be(){if(p.selectedBoard!=="default"&&window.confirm(n("kanban.board.archiveConfirm"))){A.value=!0;try{await p.archiveSelectedBoard(),await F(Se),c.success(n("kanban.board.archived"))}catch(k){c.error(k.message)}finally{A.value=!1}}}async function Ce(){A.value=!0;try{await p.dispatch(),await p.refreshAll(),c.success(n("kanban.message.dispatchNudged"))}catch(k){c.error(k.message)}finally{A.value=!1}}return(k,h)=>(_(),B("div",At,[i("header",Rt,[i("h2",Ut,r(e(n)("kanban.title")),1),i("div",Ot,[b(e(we),{value:ie.value,"onUpdate:value":h[0]||(h[0]=w=>ie.value=w),options:j.value,loading:e(p).boardsLoading,size:"small",style:{width:"260px"}},null,8,["value","options","loading"]),b(e(L),{size:"small",loading:A.value,onClick:h[1]||(h[1]=w=>a.value=!0)},{default:g(()=>[R(r(e(n)("common.add")),1)]),_:1},8,["loading"]),b(e(L),{size:"small",secondary:"",disabled:e(p).selectedBoard===e(Se),loading:A.value,onClick:Be},{default:g(()=>[R(r(e(n)("kanban.board.archive")),1)]),_:1},8,["disabled","loading"]),b(e(L),{size:"small",secondary:"",loading:A.value,onClick:Ce},{default:g(()=>[R(r(e(n)("kanban.action.dispatch")),1)]),_:1},8,["loading"]),b(e(we),{value:S.value,"onUpdate:value":[h[2]||(h[2]=w=>S.value=w),pe],options:ee.value,size:"small",style:{width:"150px"}},null,8,["value","options"]),b(e(we),{value:$.value,"onUpdate:value":[h[3]||(h[3]=w=>$.value=w),pe],options:he.value,size:"small",style:{width:"170px"}},null,8,["value","options"]),b(e(L),{type:"primary",size:"small",onClick:h[4]||(h[4]=w=>I.value=!0)},{icon:g(()=>[...h[12]||(h[12]=[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:g(()=>[R(" "+r(e(n)("kanban.createTask")),1)]),_:1})])]),e(p).stats?(_(),B("div",Dt,[(_(),B(ue,null,be(E,w=>i("button",{key:w,type:"button",class:_e(["stat-chip",[w,{active:e(p).filterStatus===w}]]),"aria-pressed":e(p).filterStatus===w,onClick:se=>Te(w)},[i("span",Lt,r(e(p).stats.by_status[w]||0),1),i("span",Et,r(e(n)(`kanban.columns.${w}`,w)),1)],10,Nt)),64)),i("button",{type:"button",class:_e(["stat-chip total",{active:!e(p).filterStatus}]),"aria-pressed":!e(p).filterStatus,onClick:h[5]||(h[5]=w=>Te(null))},[i("span",zt,r(e(p).stats.total),1),i("span",Ft,r(e(n)("kanban.stats.total")),1)],10,Kt)])):P("",!0),b(e(Je),{show:e(p).loading&&e(p).tasks.length===0},{default:g(()=>[i("div",qt,[b(e(gs),{"expanded-names":V.value,"onUpdate:expandedNames":h[6]||(h[6]=w=>V.value=w)},{default:g(()=>[(_(!0),B(ue,null,be(ke.value,w=>(_(),ne(e(ws),{key:w,title:`${e(n)(`kanban.columns.${w}`,w)} (${Q.value[w].length})`,name:w,class:_e(["kanban-column",`status-${w}`])},{header:g(()=>[i("span",{class:_e(["column-header",`status-${w}`])},[h[13]||(h[13]=i("span",{class:"status-dot","aria-hidden":"true"},null,-1)),i("span",null,r(e(n)(`kanban.columns.${w}`,w))+" ("+r(Q.value[w].length)+")",1)],2)]),default:g(()=>[i("div",{class:_e(["task-list",`status-${w}`])},[(_(!0),B(ue,null,be(Q.value[w],se=>(_(),ne(Yt,{key:se.id,task:se,"assignee-avatar":se.assignee&&ce.value[se.assignee]||null,onClick:$e=>T(se.id)},null,8,["task","assignee-avatar","onClick"]))),128)),Q.value[w].length===0?(_(),B("div",Mt,r(e(n)("kanban.noTasks")),1)):P("",!0)],2)]),_:2},1032,["title","name","class"]))),128))]),_:1},8,["expanded-names"])])]),_:1},8,["show"]),b(as,{"task-id":z.value,onClose:ve,onUpdated:fe,onNavigate:me},null,8,["task-id"]),b(e(We),{show:a.value,"onUpdate:show":h[10]||(h[10]=w=>a.value=w),preset:"dialog",title:e(n)("kanban.board.create"),style:{width:"420px"}},{action:g(()=>[b(e(L),{onClick:h[9]||(h[9]=w=>a.value=!1)},{default:g(()=>[R(r(e(n)("common.cancel")),1)]),_:1}),b(e(L),{type:"primary",loading:A.value,onClick:te},{default:g(()=>[R(r(e(n)("common.create")),1)]),_:1},8,["loading"])]),default:g(()=>[i("div",Vt,[b(e(de),{value:O.value,"onUpdate:value":h[7]||(h[7]=w=>O.value=w),placeholder:e(n)("kanban.board.slugPlaceholder")},null,8,["value","placeholder"]),b(e(de),{value:N.value,"onUpdate:value":h[8]||(h[8]=w=>N.value=w),placeholder:e(n)("kanban.board.namePlaceholder")},null,8,["value","placeholder"])])]),_:1},8,["show","title"]),I.value?(_(),ne(ss,{key:1,onClose:h[11]||(h[11]=w=>I.value=!1),onCreated:Pe})):P("",!0)]))}})})),hn=ae((()=>{})),yn,gn=ae((()=>{Jt(),Jt(),hn(),Ke(),yn=ze(ns,[["__scopeId","data-v-7a17a5f4"]])}));gn();export{yn as default};
|
|
1
|
+
import{n as ae}from"./rolldown-runtime-M0oDzQ_3.js";import{A as bs,An as _s,Bn as Oe,E as Ye,Hn as g,I as hs,It as de,K as We,Kt as Ae,Nn as be,O as oe,Ot as L,P as ys,St as gs,V as He,an as i,bt as ws,cn as B,cr as e,er as y,fn as R,g as Je,hn as De,in as U,jn as _,kn as Wt,mt as we,on as ne,ot as Ss,pn as b,pr as r,sn as P,t as Ne,tn as ue,ur as _e,wt as Ze}from"./ui-vendor-DDMfmCj2.js";import{I as Ts,L as Cs,M as Ht,N as $s,O as Le,P as Gt,k as Ee}from"./vue-vendor-BsMpqyaC.js";import{f as D,n as Ke,o as Bs,s as xs,t as ze,u as jt}from"./_plugin-vue_export-helper-CvnFozKy.js";import{Dt as Is,Et as Ps,Tt as As,wt as Rs}from"./index-B2IKGvbR.js";import{l as Us,s as Os}from"./skills-5qxphanX.js";import{n as Ds,t as Ns}from"./HistoryMessageList-BcG-gj6N.js";var Xe,ea,aa,ta,sa,Qt,na=ae((()=>{Ae(),Ne(),Le(),As(),Xe={class:"card-title"},ea={class:"card-meta"},aa={class:"meta-tag assignee-tag"},ta={class:"meta-time"},sa={key:0,class:"card-body-preview"},Qt=De({__name:"KanbanTaskCard",props:{task:{},assigneeAvatar:{}},emits:["click"],setup(t,{emit:n}){const m=t,f=n,{t:c}=Ee(),p=U(()=>{const a=Date.now()/1e3-m.task.created_at;return a<60?c("kanban.card.timeAgo.justNow"):a<3600?c("kanban.card.timeAgo.minutes",{count:Math.floor(a/60)}):a<86400?c("kanban.card.timeAgo.hours",{count:Math.floor(a/3600)}):c("kanban.card.timeAgo.days",{count:Math.floor(a/86400)})}),x=U(()=>m.task.priority>=3?"high":m.task.priority===2?"medium":"low"),I=U(()=>c(`kanban.card.priority.${x.value}`));return(a,z)=>(_(),B("div",{class:_e(["kanban-task-card",`status-${t.task.status}`]),onClick:z[0]||(z[0]=O=>f("click",t.task.id))},[i("div",Xe,r(t.task.title),1),i("div",ea,[t.task.assignee?(_(),ne(e(Ss),{key:0,trigger:"hover"},{trigger:g(()=>[i("span",aa,[b(Rs,{class:"assignee-profile-avatar",name:t.task.assignee,avatar:t.assigneeAvatar,size:18,"aria-hidden":"true"},null,8,["name","avatar"]),i("span",null,r(t.task.assignee),1)])]),default:g(()=>[R(" "+r(e(c)("kanban.card.assigneeTooltip")),1)]),_:1})):P("",!0),t.task.priority>=2?(_(),B("span",{key:1,class:_e(["meta-tag priority-tag",x.value])},r(I.value),3)):P("",!0),i("span",ta,r(p.value),1)]),t.task.body?(_(),B("div",sa,r(t.task.body.slice(0,80))+r(t.task.body.length>80?"...":""),1)):P("",!0)],2))}})})),Ls=ae((()=>{})),Yt,Es=ae((()=>{na(),na(),Ls(),Ke(),Yt=ze(Qt,[["__scopeId","data-v-11436d7e"]])}));function Ks(t){return t?.trim()||"default"}function zs(){try{return localStorage.getItem("hermes_active_profile_name")}catch{return null}}function q(t,n){const m=n.toString();return m?`${t}?${m}`:t}function M(t){const n=new URLSearchParams;return n.set("board",Ks(t)),n}function la(t){return t?t.startsWith("https")?"wss:":"ws:":location.protocol==="https:"?"wss:":"ws:"}function Fs(t){const n=xs(),m=M(t?.board),f=Bs();f&&m.set("token",f);const c=zs();c&&m.set("profile",c);const p=`/api/hermes/kanban/events?${m.toString()}`;if(n)return`${la(n)}//${new URL(n).host}${p}`;const x=location.host;return`${la()}//${x}${p}`}function qs(t){return new WebSocket(Fs(t))}async function Ms(t){const n=new URLSearchParams;return t?.includeArchived&&n.set("includeArchived","true"),(await D(q("/api/hermes/kanban/boards",n))).boards}async function Vs(t){return(await D("/api/hermes/kanban/boards",{method:"POST",body:JSON.stringify(t)})).board}async function Js(t){return D(`/api/hermes/kanban/boards/${encodeURIComponent(t)}`,{method:"DELETE"})}async function Ws(){return(await D("/api/hermes/kanban/capabilities")).capabilities}async function Hs(t){const n=M(t?.board);return t?.status&&n.set("status",t.status),t?.assignee&&n.set("assignee",t.assignee),t?.tenant&&n.set("tenant",t.tenant),t?.includeArchived&&n.set("includeArchived","true"),(await D(q("/api/hermes/kanban",n))).tasks}async function Ue(t,n){return D(q(`/api/hermes/kanban/${encodeURIComponent(t)}`,M(n?.board)))}async function Gs(t,n){return(await D(q("/api/hermes/kanban",M(n?.board)),{method:"POST",body:JSON.stringify(t)})).task}async function js(t,n,m){return D(q("/api/hermes/kanban/complete",M(m?.board)),{method:"POST",body:JSON.stringify({task_ids:t,summary:n})})}async function Qs(t,n,m){return D(q(`/api/hermes/kanban/${encodeURIComponent(t)}/block`,M(m?.board)),{method:"POST",body:JSON.stringify({reason:n})})}async function Ys(t,n){return D(q("/api/hermes/kanban/unblock",M(n?.board)),{method:"POST",body:JSON.stringify({task_ids:t})})}async function Zs(t,n,m){return D(q(`/api/hermes/kanban/${encodeURIComponent(t)}/assign`,M(m?.board)),{method:"POST",body:JSON.stringify({profile:n})})}async function Xs(t,n,m){return D(q(`/api/hermes/kanban/${encodeURIComponent(t)}/comments`,M(m?.board)),{method:"POST",body:JSON.stringify(n)})}async function en(t,n){return D(q("/api/hermes/kanban/links",M(n?.board)),{method:"POST",body:JSON.stringify(t)})}async function an(t,n){const m=M(n?.board);return m.set("parent_id",t.parent_id),m.set("child_id",t.child_id),D(q("/api/hermes/kanban/links",m),{method:"DELETE"})}async function tn(t,n){return D(q("/api/hermes/kanban/tasks/bulk",M(n?.board)),{method:"POST",body:JSON.stringify(t)})}async function sn(t,n){const m=M(n?.board);return n?.tail!==void 0&&m.set("tail",String(n.tail)),D(q(`/api/hermes/kanban/${encodeURIComponent(t)}/log`,m))}async function nn(t){const n=M(t?.board);return t?.task&&n.set("task",t.task),t?.severity&&n.set("severity",t.severity),(await D(q("/api/hermes/kanban/diagnostics",n))).diagnostics}async function ln(t,n){return D(q(`/api/hermes/kanban/${encodeURIComponent(t)}/reclaim`,M(n?.board)),{method:"POST",body:JSON.stringify({reason:n?.reason})})}async function rn(t,n,m){return D(q(`/api/hermes/kanban/${encodeURIComponent(t)}/reassign`,M(m?.board)),{method:"POST",body:JSON.stringify({profile:n,reclaim:m?.reclaim,reason:m?.reason})})}async function on(t,n){return(await D(q(`/api/hermes/kanban/${encodeURIComponent(t)}/specify`,M(n?.board)),{method:"POST",body:JSON.stringify({author:n?.author})})).results}async function un(t){return(await D(q("/api/hermes/kanban/dispatch",M(t?.board)),{method:"POST",body:JSON.stringify({dryRun:t?.dryRun,max:t?.max,failureLimit:t?.failureLimit})})).result}async function dn(t){return(await D(q("/api/hermes/kanban/stats",M(t?.board)))).stats}async function cn(t){return(await D(q("/api/hermes/kanban/assignees",M(t?.board)))).assignees}var Zt=ae((()=>{jt()}));function vn(t){if(typeof window>"u")return null;try{return window.localStorage.getItem(t)}catch{return null}}function fn(t,n){if(!(typeof window>"u"))try{window.localStorage.setItem(t,n)}catch{}}function Me(t){const n=t?.trim().toLowerCase();return n&&Xt.test(n)?n:Se}var Ve,Se,Xt,Fe,Ge=ae((()=>{Cs(),Ae(),Zt(),Ve="hermes.kanban.selectedBoard",Se="default",Xt=/^[a-z0-9][a-z0-9_-]{0,63}$/,Fe=Ts("kanban",()=>{const t=y([]),n=y(null),m=y([]),f=y([]),c=y(null),p=y(!1),x=y(!1),I=y(null),a=y(Me(vn(Ve))),z=y(null),O=y(null);let N=0,A=0,W=0,H=0,E=0,V=0,Y=0,K=null,F=null,J=null,G=!1;const j=U(()=>{const s=f.value.filter(l=>!l.archived);return s.some(l=>l.slug==="default")?s:[{slug:Se,name:"Default",description:"",icon:"",color:"",created_at:null,archived:!1,counts:{},total:0},...s]});function ie(s){if(!c.value)return!1;const l=c.value.capabilities?.find(v=>v.key===s);return l?l.status==="supported":c.value.missing?.includes(s)?!1:c.value.supports?.[s]===!0}function Q(s){if(!ie(s))throw new Error(`Kanban capability "${s}" is not supported by the current Hermes backend`)}function ke(s,l){const v=c.value?.capabilities?.find(C=>C.key===s);return v?l.includes(v.status):l.includes("supported")?ie(s):!1}function re(s,l){if(!ke(s,l))throw new Error(`Kanban capability "${s}" is not available with the required status`)}function ce(s){return j.value.some(l=>l.slug===s)}function ee(s){const l=Me(s);return f.value.length>0&&!ce(l)?Se:l}function he(){t.value=[],n.value=null,m.value=[]}function S(){F&&clearTimeout(F),J&&clearTimeout(J),F=null,J=null}function $(){if(!K)return;const s=K;K=null,s.onclose=null,s.onerror=null,s.onmessage=null;try{s.close()}catch{}}function T(){G=!1,Y++,S(),$()}function ve(s,l,v){J&&clearTimeout(J),J=setTimeout(()=>{!G||v!==Y||l!==N||s!==a.value||Promise.all([h(),le(!0),Z(),ye()])},100)}function fe(s,l,v){F&&clearTimeout(F),F=setTimeout(()=>{!G||v!==Y||l!==N||s!==a.value||me(s,l,v)},3e3)}function me(s,l,v){$();let C;try{C=qs({board:s})}catch(X){console.error("Failed to open kanban event stream:",X),fe(s,l,v);return}K=C,C.onmessage=X=>{if(!(!G||v!==Y||l!==N||s!==a.value))try{JSON.parse(String(X.data))?.type==="event"&&ve(s,l,v)}catch{ve(s,l,v)}},C.onerror=()=>{K===C&&console.error("Kanban event stream error")},C.onclose=()=>{K===C&&(K=null,fe(s,l,v))}}function pe(){const s=c.value?.capabilities?.find(l=>l.key==="events")?.status;return s==="supported"||s==="partial"||ie("events")}function Te(){if(!pe())return!1;G=!0;const s=++Y,l=N,v=a.value;return S(),me(v,l,s),!0}function Pe(){G&&Te()}function te(s){const l=ee(s),v=a.value!==l;return a.value=l,fn(Ve,l),I.value=null,v&&(he(),N++,Pe()),l}function Be(s){const l=Me(s),v=ee(l),C=v!==l;return te(v),C&&(I.value=`Board "${l}" is unavailable; fell back to "${v}".`),{board:v,recovered:C}}function Ce(s){return{seq:s(),generation:N,board:a.value}}function k(s,l,v,C){return s===C&&l===N&&v===a.value}async function h(s=!1){const l=++A;x.value=!0;try{const v=await Ms({includeArchived:s});if(l!==A)return;f.value=v,ee(a.value)!==a.value&&Be(a.value)}catch(v){l===A&&console.error("Failed to fetch kanban boards:",v)}finally{l===A&&(x.value=!1)}}async function w(){try{c.value=await Ws()}catch(s){console.error("Failed to fetch kanban capabilities:",s)}}async function se(s){const l=await Vs(s);return await h(),te(l.slug),await qe(),l}async function $e(){const s=a.value;if(s==="default")throw new Error("Cannot archive the default kanban board");await Js(s),await h(),te(Se),await qe()}async function le(s=!1){const{seq:l,generation:v,board:C}=Ce(()=>++W),X=s?0:++V;s||(p.value=!0);try{const ge=await Hs({board:C,status:z.value||void 0,assignee:O.value||void 0,includeArchived:!0});k(l,v,C,W)&&(t.value=ge)}catch(ge){k(l,v,C,W)&&console.error("Failed to fetch kanban tasks:",ge)}finally{!s&&X===V&&(p.value=!1)}}async function Z(){const{seq:s,generation:l,board:v}=Ce(()=>++H);try{const C=await dn({board:v});k(s,l,v,H)&&(n.value=C)}catch(C){k(s,l,v,H)&&console.error("Failed to fetch kanban stats:",C)}}async function ye(){const{seq:s,generation:l,board:v}=Ce(()=>++E);try{const C=await cn({board:v});k(s,l,v,E)&&(m.value=C)}catch(C){k(s,l,v,E)&&console.error("Failed to fetch kanban assignees:",C)}}async function Re(s){const l=a.value,v=await Gs(s,{board:l});return l===a.value&&(t.value.unshift(v),await Promise.all([Z(),h()])),v}async function o(s,l){const v=a.value;if(await js(s,l,{board:v}),v===a.value){for(const C of s){const X=t.value.find(ge=>ge.id===C);X&&(X.status="done")}await Promise.all([Z(),h()])}}async function u(s,l){const v=a.value;if(await Qs(s,l,{board:v}),v===a.value){const C=t.value.find(X=>X.id===s);C&&(C.status="blocked"),await Promise.all([Z(),h()])}}async function d(s){const l=a.value;if(await Ys(s,{board:l}),l===a.value){for(const v of s){const C=t.value.find(X=>X.id===v);C&&(C.status="ready")}await Promise.all([Z(),h()])}}async function xe(s,l){const v=a.value;if(await Zs(s,l,{board:v}),v===a.value){const C=t.value.find(X=>X.id===s);C&&(C.assignee=l),await Promise.all([Z(),ye()])}}async function ls(s,l,v){return Q("commentsWrite"),Xs(s,{body:l,author:v},{board:a.value})}async function is(s,l){Q("links");const v=a.value,C=await en({parent_id:s,child_id:l},{board:v});return v===a.value&&await Promise.all([le(!0),Z(),h()]),C}async function rs(s,l){Q("links");const v=a.value,C=await an({parent_id:s,child_id:l},{board:v});return v===a.value&&await Promise.all([le(!0),Z(),h()]),C}async function os(s){re("bulk",["supported","partial"]);const l=a.value,v=await tn(s,{board:l});return l===a.value&&await Promise.all([le(!0),Z(),h(),ye()]),v}async function us(s,l){return Q("taskLog"),sn(s,{board:a.value,tail:l})}async function ds(s={}){return Q("diagnostics"),nn({...s,board:a.value})}async function cs(s,l){Q("reclaim");const v=a.value,C=await ln(s,{board:v,reason:l});return v===a.value&&await Promise.all([le(!0),Z(),h()]),C}async function vs(s,l,v={}){Q("reassign");const C=a.value,X=await rn(s,l,{board:C,...v});if(C===a.value){const ge=t.value.find(ps=>ps.id===s);ge&&(ge.assignee=l==="none"?null:l),await Promise.all([Z(),ye()])}return X}async function fs(s,l){Q("specify");const v=a.value,C=await on(s,{board:v,author:l});return v===a.value&&await Promise.all([le(!0),Z(),h()]),C}async function ks(s={}){Q("dispatch");const l=a.value,v=await un({...s,board:l});return l===a.value&&await Promise.all([le(!0),Z(),h()]),v}function ms(s,l){s==="status"?z.value=l:O.value=l}async function qe(){await Promise.all([h(),le(),Z(),ye()])}return{tasks:t,stats:n,assignees:m,boards:f,capabilities:c,activeBoards:j,isCapabilitySupported:ie,loading:p,boardsLoading:x,boardWarning:I,selectedBoard:a,filterStatus:z,filterAssignee:O,fetchBoards:h,fetchCapabilities:w,fetchTasks:le,fetchStats:Z,fetchAssignees:ye,createTask:Re,createBoard:se,archiveSelectedBoard:$e,completeTasks:o,blockTask:u,unblockTasks:d,assignTask:xe,addComment:ls,linkTasks:is,unlinkTasks:rs,bulkUpdateTasks:os,getTaskLog:us,getDiagnostics:ds,reclaimTask:cs,reassignTask:vs,specifyTask:fs,dispatch:ks,setFilter:ms,setSelectedBoard:te,startEventStream:Te,stopEventStream:T,recoverSelectedBoard:Be,resolveAvailableBoard:ee,clearBoardScopedState:he,refreshAll:qe}})}));function je(t,n={}){const m=n.default||0;return t.map(f=>f.name!=="default"||f.counts?f:{...f,counts:{total:m}})}var kn,Qe=ae((()=>{kn="default"})),ia,ra,oa,ua,da,ca,va,fa,ka,ma,pa,ba,_a,ha,ya,ga,wa,Sa,Ta,Ca,$a,Ba,xa,Ia,Pa,Aa,Ra,Ua,Oa,Da,Na,La,Ea,Ka,za,Fa,qa,Ma,Va,Ja,Wa,Ha,Ga,ja,Qa,Ya,Za,Xa,et,at,tt,st,nt,lt,it,rt,ot,ut,dt,ct,vt,ft,kt,mt,pt,bt,_t,ht,yt,gt,wt,St,Tt,Ct,$t,Ie,es,Bt=ae((()=>{Ae(),Ne(),Le(),Ht(),jt(),Zt(),Ge(),Qe(),Ds(),ia={class:"detail-section"},ra={class:"detail-row"},oa={class:"detail-label"},ua={class:"detail-row"},da={class:"detail-value task-id-value"},ca={key:0,class:"detail-row"},va={class:"detail-value"},fa=["onClick"],ka={key:1,class:"detail-row"},ma={class:"detail-value"},pa=["onClick"],ba={class:"detail-row"},_a={class:"detail-label"},ha={class:"detail-value"},ya={class:"detail-row"},ga={class:"detail-label"},wa={class:"detail-value"},Sa={class:"detail-row"},Ta={class:"detail-label"},Ca={class:"detail-value"},$a={class:"detail-row"},Ba={class:"detail-label"},xa={class:"detail-value"},Ia={key:2,class:"detail-row"},Pa={class:"detail-label"},Aa={class:"detail-value"},Ra={key:3,class:"detail-row"},Ua={class:"detail-label"},Oa={class:"detail-value"},Da={key:0,class:"detail-section"},Na={class:"section-title"},La={class:"detail-body"},Ea={key:1,class:"detail-section"},Ka={class:"section-title"},za={key:2,class:"detail-section"},Fa={class:"section-title"},qa={class:"action-group"},Ma={key:1,class:"complete-input"},Va={key:1,class:"block-input"},Ja={key:0,class:"assign-group"},Wa={class:"recovery-group"},Ha={key:3,class:"detail-section"},Ga={key:0,class:"session-list"},ja=["onClick"],Qa={class:"session-title"},Ya={class:"session-meta"},Za={key:1,class:"column-empty"},Xa={key:4,class:"detail-section"},et={class:"section-title run-history-title"},at={class:"run-history-range"},tt={key:0,class:"run-history-controls"},st={class:"run-header"},nt={class:"run-profile"},lt={class:"run-time"},it={key:0,class:"run-summary"},rt={key:1,class:"run-error"},ot={key:5,class:"detail-section"},ut={class:"section-title"},dt={class:"comment-header"},ct={class:"comment-author"},vt={class:"comment-time"},ft={class:"comment-body"},kt={key:6,class:"detail-section"},mt={class:"section-title"},pt={class:"comment-input"},bt={class:"detail-section"},_t={class:"section-title"},ht={class:"action-group"},yt={key:0,class:"log-output"},gt={key:1,class:"log-output"},wt={key:7,class:"detail-section"},St={class:"section-title"},Tt={class:"event-kind"},Ct={class:"event-time"},$t={class:"messages-modal-body"},Ie=10,es=De({__name:"KanbanTaskDrawer",props:{taskId:{}},emits:["close","updated","navigate"],setup(t,{emit:n}){const m=t,f=n,{t:c}=Ee(),p=Gt(),x=He(),I=Fe(),a=y(null),z=y(!1),O=y(null),N=y(""),A=y(!1),W=y(""),H=y(!1),E=y(!1),V=y(""),Y=y(null),K=y(!1),F=y(null),J=y(!1),G=y(""),j=y(1),ie=U(()=>a.value&&(a.value.task.result||a.value.latest_summary)||""),Q=U(()=>a.value?c(`kanban.columns.${a.value.task.status}`,a.value.task.status):""),ke=U(()=>{const o=a.value?.task.status;return o!=="done"&&o!=="archived"}),re=y([]),ce=y(!1),ee=y(!1),he=U(()=>a.value&&[...a.value.runs].reverse().find(o=>o.profile)?.profile||null);function S(o,u){return m.taskId===o&&I.selectedBoard===u}function $(){O.value=null,N.value="",A.value=!1,W.value="",H.value=!1,E.value=!1,V.value="",Y.value=null,K.value=!1,F.value=null,J.value=!1,G.value="",j.value=1,re.value=[],ce.value=!1,ee.value=!1}async function T(){if(!a.value)return;const o=a.value.task.id,u=I.selectedBoard,d=he.value;if(d&&(ee.value=!ee.value,!!ee.value)){ce.value=!0;try{const xe=await D(`/api/hermes/kanban/search-sessions?task_id=${encodeURIComponent(o)}&profile=${encodeURIComponent(d)}&board=${encodeURIComponent(u)}`);S(o,u)&&(re.value=xe.results)}catch{S(o,u)&&(re.value=[])}finally{S(o,u)&&(ce.value=!1)}}}function ve(){a.value?.session&&(E.value=!0)}const fe=U(()=>{const o=a.value?.session;return o?{id:o.id,title:o.title||"",source:o.source,messages:o.messages.filter(u=>u.role==="user"||u.role==="assistant").map(u=>({id:String(u.id),role:u.role,content:u.content,timestamp:u.timestamp})),createdAt:o.started_at,updatedAt:o.ended_at||o.started_at,model:o.model,messageCount:o.messages.length,endedAt:o.ended_at}:null}),me=U(()=>je(I.assignees,I.stats?.by_assignee||{}).map(o=>({label:o.name,value:o.name}))),pe=U(()=>{const o=a.value?.runs.length||0;return Math.max(1,Math.ceil(o/Ie))}),Te=U(()=>{const o=a.value?.runs||[],u=(j.value-1)*Ie;return o.slice(u,u+Ie)}),Pe=U(()=>{const o=a.value?.runs.length||0;if(!o)return"";const u=(j.value-1)*Ie+1;return`${u}-${Math.min(u+Ie-1,o)} / ${o}`});Oe(()=>[m.taskId,I.selectedBoard],async([o,u])=>{if($(),!o){a.value=null;return}z.value=!0;try{const d=await Ue(o,{board:u});S(o,u)&&(a.value=d)}catch{S(o,u)&&x.error(c("kanban.message.loadFailed"))}finally{S(o,u)&&(z.value=!1)}},{immediate:!0}),Oe(()=>a.value?.runs.length||0,()=>{j.value>pe.value&&(j.value=pe.value)});function te(o){return o?new Date(o*1e3).toLocaleString():"—"}async function Be(){if(m.taskId){if(!H.value){H.value=!0;return}try{await I.completeTasks([m.taskId],W.value.trim()||void 0),x.success(c("kanban.message.taskCompleted")),H.value=!1,W.value="",f("updated"),f("close")}catch(o){x.error(o.message)}}}async function Ce(){if(!(!m.taskId||!N.value.trim()))try{await I.blockTask(m.taskId,N.value.trim()),x.success(c("kanban.message.taskBlocked")),A.value=!1,N.value="",f("updated"),f("close")}catch(o){x.error(o.message)}}async function k(){if(m.taskId)try{await I.unblockTasks([m.taskId]),x.success(c("kanban.message.taskUnblocked")),f("updated"),f("close")}catch(o){x.error(o.message)}}async function h(){if(!m.taskId||!O.value)return;const o=m.taskId,u=I.selectedBoard;try{if(await I.assignTask(o,O.value),S(o,u)&&(x.success(c("kanban.message.taskAssigned")),O.value=null),a.value){const d=await Ue(o,{board:u});S(o,u)&&(a.value=d)}f("updated")}catch(d){S(o,u)&&x.error(d.message)}}async function w(){if(!m.taskId||!V.value.trim())return;const o=m.taskId,u=I.selectedBoard;try{await I.addComment(o,V.value.trim());const d=await Ue(o,{board:u});S(o,u)&&(V.value="",a.value=d,x.success(c("kanban.message.commentAdded"))),f("updated")}catch(d){S(o,u)&&x.error(d.message)}}async function se(){if(!m.taskId)return;const o=m.taskId,u=I.selectedBoard;K.value=!0;try{const d=await I.getTaskLog(o,2e4);S(o,u)&&(Y.value=d.exists?d.content:c("kanban.detail.noLog"))}catch(d){S(o,u)&&x.error(d.message)}finally{S(o,u)&&(K.value=!1)}}async function $e(){if(!m.taskId)return;const o=m.taskId,u=I.selectedBoard;J.value=!0;try{const d=await I.getDiagnostics({task:o,severity:"warning"});S(o,u)&&(F.value=d)}catch(d){S(o,u)&&x.error(d.message)}finally{S(o,u)&&(J.value=!1)}}async function le(){if(m.taskId)try{await I.reclaimTask(m.taskId,G.value.trim()||void 0),x.success(c("kanban.message.taskReclaimed")),f("updated"),f("close")}catch(o){x.error(o.message)}}async function Z(){if(!(!m.taskId||!O.value))try{await I.reassignTask(m.taskId,O.value,{reclaim:a.value?.task.status==="running",reason:G.value.trim()||void 0}),x.success(c("kanban.message.taskReassigned")),f("updated"),f("close")}catch(o){x.error(o.message)}}async function ye(){if(!m.taskId)return;const o=m.taskId,u=I.selectedBoard;try{await I.specifyTask(o);const d=await Ue(o,{board:u});S(o,u)&&(x.success(c("kanban.message.taskSpecified")),a.value=d),f("updated")}catch(d){x.error(d.message)}}function Re(o){f("updated"),f("navigate",o)}return(o,u)=>(_(),B(ue,null,[b(e(hs),{show:!!t.taskId,width:420,placement:"right","onUpdate:show":u[10]||(u[10]=d=>{d||f("close")})},{default:g(()=>[b(e(ys),{title:a.value?.task.title||"",closable:""},{default:g(()=>[b(e(Je),{show:z.value},{default:g(()=>[a.value?(_(),B(ue,{key:0},[i("div",ia,[i("div",ra,[i("span",oa,r(e(c)("kanban.detail.status")),1),i("span",{class:_e(["detail-value status-badge",a.value.task.status])},r(Q.value),3)]),i("div",ua,[u[12]||(u[12]=i("span",{class:"detail-label"},"Task ID",-1)),i("span",da,r(a.value.task.id),1)]),a.value.parents?.length?(_(),B("div",ca,[u[13]||(u[13]=i("span",{class:"detail-label"},"Parent",-1)),i("span",va,[(_(!0),B(ue,null,be(a.value.parents,d=>(_(),B("a",{key:d,class:"task-link",onClick:xe=>Re(d)},r(d),9,fa))),128))])])):P("",!0),a.value.children?.length?(_(),B("div",ka,[u[14]||(u[14]=i("span",{class:"detail-label"},"Children",-1)),i("span",ma,[(_(!0),B(ue,null,be(a.value.children,d=>(_(),B("a",{key:d,class:"task-link",onClick:xe=>Re(d)},r(d),9,pa))),128))])])):P("",!0),i("div",ba,[i("span",_a,r(e(c)("kanban.detail.assignee")),1),i("span",ha,r(a.value.task.assignee||"—"),1)]),i("div",ya,[i("span",ga,r(e(c)("kanban.detail.priority")),1),i("span",wa,r(a.value.task.priority),1)]),i("div",Sa,[i("span",Ta,r(e(c)("kanban.detail.tenant")),1),i("span",Ca,r(a.value.task.tenant||"—"),1)]),i("div",$a,[i("span",Ba,r(e(c)("kanban.detail.createdAt")),1),i("span",xa,r(te(a.value.task.created_at)),1)]),a.value.task.started_at?(_(),B("div",Ia,[i("span",Pa,r(e(c)("kanban.detail.startedAt")),1),i("span",Aa,r(te(a.value.task.started_at)),1)])):P("",!0),a.value.task.completed_at?(_(),B("div",Ra,[i("span",Ua,r(e(c)("kanban.detail.completedAt")),1),i("span",Oa,r(te(a.value.task.completed_at)),1)])):P("",!0)]),a.value.task.body?(_(),B("div",Da,[i("div",Na,r(e(c)("kanban.form.body")),1),i("div",La,r(a.value.task.body),1)])):P("",!0),ie.value?(_(),B("div",Ea,[i("div",Ka,r(e(c)("kanban.detail.result")),1),i("div",{class:"result-summary",onClick:ve},r(ie.value),1)])):P("",!0),ke.value?(_(),B("div",za,[i("div",Fa,r(e(c)("kanban.action.title")),1),i("div",qa,[H.value?(_(),B("div",Ma,[b(e(de),{value:W.value,"onUpdate:value":u[1]||(u[1]=d=>W.value=d),size:"small",placeholder:e(c)("kanban.action.completeSummary")},null,8,["value","placeholder"]),b(e(L),{size:"small",type:"primary",onClick:Be},{default:g(()=>[R(r(e(c)("common.ok")),1)]),_:1}),b(e(L),{size:"small",onClick:u[2]||(u[2]=d=>{H.value=!1,W.value=""})},{default:g(()=>[R(r(e(c)("common.cancel")),1)]),_:1})])):(_(),ne(e(L),{key:0,size:"small",onClick:u[0]||(u[0]=d=>H.value=!0)},{default:g(()=>[R(r(e(c)("kanban.action.complete")),1)]),_:1})),a.value.task.status==="blocked"?(_(),ne(e(L),{key:2,size:"small",onClick:k},{default:g(()=>[R(r(e(c)("kanban.action.unblock")),1)]),_:1})):(_(),B(ue,{key:3},[A.value?(_(),B("div",Va,[b(e(de),{value:N.value,"onUpdate:value":u[4]||(u[4]=d=>N.value=d),size:"small",placeholder:e(c)("kanban.action.blockReason")},null,8,["value","placeholder"]),b(e(L),{size:"small",type:"primary",onClick:Ce},{default:g(()=>[R(r(e(c)("common.ok")),1)]),_:1})])):(_(),ne(e(L),{key:0,size:"small",onClick:u[3]||(u[3]=d=>A.value=!0)},{default:g(()=>[R(r(e(c)("kanban.action.block")),1)]),_:1}))],64))]),a.value.task.status!=="running"?(_(),B("div",Ja,[b(e(we),{value:O.value,"onUpdate:value":u[5]||(u[5]=d=>O.value=d),options:me.value,size:"small",placeholder:e(c)("kanban.action.assignTo"),style:{flex:"1"}},null,8,["value","options","placeholder"]),b(e(L),{size:"small",disabled:!O.value,onClick:h},{default:g(()=>[R(r(e(c)("kanban.action.assign")),1)]),_:1},8,["disabled"])])):P("",!0),i("div",Wa,[b(e(de),{value:G.value,"onUpdate:value":u[6]||(u[6]=d=>G.value=d),size:"small",placeholder:e(c)("kanban.action.recoveryReason")},null,8,["value","placeholder"]),b(e(L),{size:"small",secondary:"",onClick:le},{default:g(()=>[R(r(e(c)("kanban.action.reclaim")),1)]),_:1}),b(e(L),{size:"small",secondary:"",disabled:!O.value,onClick:Z},{default:g(()=>[R(r(e(c)("kanban.action.reassign")),1)]),_:1},8,["disabled"]),a.value.task.status==="triage"?(_(),ne(e(L),{key:0,size:"small",secondary:"",onClick:ye},{default:g(()=>[R(r(e(c)("kanban.action.specify")),1)]),_:1})):P("",!0)])])):P("",!0),a.value.runs.length>0?(_(),B("div",Ha,[i("div",{class:"section-title",style:{cursor:"pointer"},onClick:T},[R(r(e(c)("kanban.detail.sessions"))+" ",1),ce.value?(_(),ne(e(Je),{key:0,size:12,style:{"margin-left":"6px"}})):P("",!0)]),ee.value&&re.value.length>0?(_(),B("div",Ga,[(_(!0),B(ue,null,be(re.value,d=>(_(),B("div",{key:d.id,class:"session-item",onClick:xe=>e(p).push({name:"hermes.chat",query:{session:d.id}})},[i("div",Qa,r(d.title||d.id),1),i("div",Ya,[i("span",null,r(d.source),1),i("span",null,r(d.model),1),i("span",null,r(te(d.started_at)),1)])],8,ja))),128))])):P("",!0),ee.value&&!ce.value&&re.value.length===0?(_(),B("div",Za,r(e(c)("kanban.detail.noSessions")),1)):P("",!0)])):P("",!0),a.value.runs.length>0?(_(),B("div",Xa,[i("div",et,[i("span",null,r(e(c)("kanban.detail.runs")),1),i("span",at,r(Pe.value),1),pe.value>1?(_(),B("div",tt,[b(e(L),{size:"tiny",secondary:"",disabled:j.value<=1,onClick:u[7]||(u[7]=d=>j.value-=1)},{default:g(()=>[...u[15]||(u[15]=[R("‹",-1)])]),_:1},8,["disabled"]),b(e(L),{size:"tiny",secondary:"",disabled:j.value>=pe.value,onClick:u[8]||(u[8]=d=>j.value+=1)},{default:g(()=>[...u[16]||(u[16]=[R("›",-1)])]),_:1},8,["disabled"])])):P("",!0)]),(_(!0),B(ue,null,be(Te.value,d=>(_(),B("div",{key:d.id,class:"run-item"},[i("div",st,[i("span",{class:_e(["run-status",d.status])},r(d.status),3),i("span",nt,r(d.profile||"—"),1),i("span",lt,r(te(d.started_at)),1)]),d.summary?(_(),B("div",it,r(d.summary),1)):P("",!0),d.error?(_(),B("div",rt,r(d.error),1)):P("",!0)]))),128))])):P("",!0),a.value.comments.length>0?(_(),B("div",ot,[i("div",ut,r(e(c)("kanban.detail.comments")),1),(_(!0),B(ue,null,be(a.value.comments,d=>(_(),B("div",{key:d.id,class:"comment-item"},[i("div",dt,[i("span",ct,r(d.author),1),i("span",vt,r(te(d.created_at)),1)]),i("div",ft,r(d.body),1)]))),128))])):P("",!0),ke.value?(_(),B("div",kt,[i("div",mt,r(e(c)("kanban.detail.addComment")),1),i("div",pt,[b(e(de),{value:V.value,"onUpdate:value":u[9]||(u[9]=d=>V.value=d),type:"textarea",rows:3,placeholder:e(c)("kanban.detail.commentPlaceholder")},null,8,["value","placeholder"]),b(e(L),{size:"small",type:"primary",disabled:!V.value.trim(),onClick:w},{default:g(()=>[R(r(e(c)("common.add")),1)]),_:1},8,["disabled"])])])):P("",!0),i("div",bt,[i("div",_t,r(e(c)("kanban.detail.operations")),1),i("div",ht,[b(e(L),{size:"small",secondary:"",loading:K.value,onClick:se},{default:g(()=>[R(r(e(c)("kanban.action.loadLog")),1)]),_:1},8,["loading"]),b(e(L),{size:"small",secondary:"",loading:J.value,onClick:$e},{default:g(()=>[R(r(e(c)("kanban.action.loadDiagnostics")),1)]),_:1},8,["loading"])]),Y.value!==null?(_(),B("pre",yt,r(Y.value),1)):P("",!0),F.value!==null?(_(),B("pre",gt,r(JSON.stringify(F.value,null,2)),1)):P("",!0)]),a.value.events.length>0?(_(),B("div",wt,[i("div",St,r(e(c)("kanban.detail.events")),1),(_(!0),B(ue,null,be(a.value.events.slice(-10),d=>(_(),B("div",{key:d.id,class:"event-item"},[i("span",Tt,r(d.kind),1),i("span",Ct,r(te(d.created_at)),1)]))),128))])):P("",!0)],64)):P("",!0)]),_:1},8,["show"])]),_:1},8,["title"])]),_:1},8,["show"]),fe.value?(_(),ne(e(We),{key:0,show:E.value,preset:"card",title:a.value?.task.title||"",style:{width:"900px",maxWidth:"calc(100vw - 48px)"},onClose:u[11]||(u[11]=d=>E.value=!1)},{default:g(()=>[i("div",$t,[b(Ns,{session:fe.value},null,8,["session"])])]),_:1},8,["show","title"])):P("",!0)],64))}})})),mn=ae((()=>{})),as,pn=ae((()=>{Bt(),Bt(),mn(),Ke(),as=ze(es,[["__scopeId","data-v-289879fe"]])})),xt,It,ts,Pt=ae((()=>{Ae(),Ne(),Le(),Ge(),Qe(),Us(),xt={class:"advanced-row"},It={class:"advanced-grid"},ts=De({__name:"KanbanCreateForm",emits:["close","created"],setup(t,{emit:n}){const m=n,{t:f}=Ee(),c=He(),p=Fe(),x=y(""),I=y(""),a=y(null),z=y(null),O=y(""),N=y(!1),A=y("scratch"),W=y(""),H=y(""),E=y([]),V=y(""),Y=y(null),K=y(!1),F=y(null),J=y(!1),G=y(!1),j=y([]),ie=U(()=>[{label:f("kanban.card.priority.low"),value:1},{label:f("kanban.card.priority.medium"),value:2},{label:f("kanban.card.priority.high"),value:3}]),Q=U(()=>je(p.assignees,p.stats?.by_assignee||{}).map(S=>({label:S.name,value:S.name}))),ke=U(()=>[{label:f("kanban.form.workspaceScratch"),value:"scratch"},{label:f("kanban.form.workspaceDir"),value:"dir"},{label:f("kanban.form.workspaceWorktree"),value:"worktree"}]);function re(){if(A.value==="scratch")return;const S=W.value.trim();return S?`${A.value}:${S}`:A.value}function ce(){return E.value.length?E.value:void 0}function ee(S){const $=new Map;for(const T of S)T.enabled!==!1&&($.has(T.name)||$.set(T.name,T));return[...$.values()].map(T=>({label:T.name,value:T.name})).sort((T,ve)=>T.label.localeCompare(ve.label))}Wt(async()=>{G.value=!0;try{j.value=ee((await Os()).categories.flatMap(S=>S.skills||[]))}catch{j.value=[]}finally{G.value=!1}});async function he(){if(!x.value.trim()){c.warning(f("kanban.form.titleRequired"));return}J.value=!0;try{const S={title:x.value.trim(),body:I.value.trim()||void 0,assignee:a.value||void 0,priority:z.value??void 0},$=O.value.trim(),T=re(),ve=H.value.trim(),fe=ce(),me=V.value.trim();$&&(S.tenant=$),N.value&&(S.triage=!0),T&&(S.workspace=T),A.value==="worktree"&&ve&&(S.branch=ve),fe&&(S.skills=fe),me&&(S.maxRuntime=me),Y.value!==null&&(S.maxRetries=Y.value),K.value&&(S.goalMode=!0,F.value!==null&&(S.goalMaxTurns=F.value)),await p.createTask(S),c.success(f("kanban.message.taskCreated")),m("created"),m("close")}catch(S){c.error(S.message)}finally{J.value=!1}}return(S,$)=>(_(),ne(e(We),{show:!0,preset:"dialog",title:e(f)("kanban.createTask"),style:{width:"480px"},onClose:$[15]||($[15]=T=>m("close"))},{action:g(()=>[b(e(L),{onClick:$[14]||($[14]=T=>m("close"))},{default:g(()=>[R(r(e(f)("common.cancel")),1)]),_:1}),b(e(L),{type:"primary",loading:J.value,onClick:he},{default:g(()=>[R(r(e(f)("common.create")),1)]),_:1},8,["loading"])]),default:g(()=>[b(e(bs),{"label-placement":"top"},{default:g(()=>[b(e(oe),{label:e(f)("kanban.form.title")},{default:g(()=>[b(e(de),{value:x.value,"onUpdate:value":$[0]||($[0]=T=>x.value=T),placeholder:e(f)("kanban.form.titlePlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),b(e(oe),{label:e(f)("kanban.form.body")},{default:g(()=>[b(e(de),{value:I.value,"onUpdate:value":$[1]||($[1]=T=>I.value=T),type:"textarea",rows:3,placeholder:e(f)("kanban.form.bodyPlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),b(e(oe),{label:e(f)("kanban.form.assignee")},{default:g(()=>[b(e(we),{value:a.value,"onUpdate:value":$[2]||($[2]=T=>a.value=T),options:Q.value,placeholder:e(f)("kanban.form.selectAssignee"),clearable:""},null,8,["value","options","placeholder"])]),_:1},8,["label"]),b(e(oe),{label:e(f)("kanban.form.priority")},{default:g(()=>[b(e(we),{value:z.value,"onUpdate:value":$[3]||($[3]=T=>z.value=T),options:ie.value,placeholder:e(f)("kanban.form.selectPriority"),clearable:""},null,8,["value","options","placeholder"])]),_:1},8,["label"]),b(e(oe),{label:e(f)("kanban.form.tenant")},{default:g(()=>[b(e(de),{value:O.value,"onUpdate:value":$[4]||($[4]=T=>O.value=T),placeholder:e(f)("kanban.form.tenantPlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),b(e(oe),{label:e(f)("kanban.form.workspace")},{default:g(()=>[b(e(we),{value:A.value,"onUpdate:value":$[5]||($[5]=T=>A.value=T),options:ke.value},null,8,["value","options"])]),_:1},8,["label"]),A.value!=="scratch"?(_(),ne(e(oe),{key:0,label:e(f)("kanban.form.workspacePath")},{default:g(()=>[b(e(de),{value:W.value,"onUpdate:value":$[6]||($[6]=T=>W.value=T),placeholder:e(f)("kanban.form.workspacePathPlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"])):P("",!0),A.value==="worktree"?(_(),ne(e(oe),{key:1,label:e(f)("kanban.form.branch")},{default:g(()=>[b(e(de),{value:H.value,"onUpdate:value":$[7]||($[7]=T=>H.value=T),placeholder:e(f)("kanban.form.branchPlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"])):P("",!0),b(e(oe),{label:e(f)("kanban.form.skills")},{default:g(()=>[b(e(we),{value:E.value,"onUpdate:value":$[8]||($[8]=T=>E.value=T),multiple:"",filterable:"",clearable:"",loading:G.value,options:j.value,placeholder:e(f)("kanban.form.skillsPlaceholder")},null,8,["value","loading","options","placeholder"])]),_:1},8,["label"]),i("div",xt,[b(e(Ze),{checked:N.value,"onUpdate:checked":$[9]||($[9]=T=>N.value=T)},{default:g(()=>[R(r(e(f)("kanban.form.triage")),1)]),_:1},8,["checked"]),b(e(Ze),{checked:K.value,"onUpdate:checked":$[10]||($[10]=T=>K.value=T)},{default:g(()=>[R(r(e(f)("kanban.form.goalMode")),1)]),_:1},8,["checked"])]),i("div",It,[b(e(oe),{label:e(f)("kanban.form.maxRuntime")},{default:g(()=>[b(e(de),{value:V.value,"onUpdate:value":$[11]||($[11]=T=>V.value=T),placeholder:e(f)("kanban.form.maxRuntimePlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),b(e(oe),{label:e(f)("kanban.form.maxRetries")},{default:g(()=>[b(e(Ye),{value:Y.value,"onUpdate:value":$[12]||($[12]=T=>Y.value=T),min:1,max:100,precision:0,placeholder:e(f)("kanban.form.maxRetriesPlaceholder"),clearable:""},null,8,["value","placeholder"])]),_:1},8,["label"]),K.value?(_(),ne(e(oe),{key:0,label:e(f)("kanban.form.goalMaxTurns")},{default:g(()=>[b(e(Ye),{value:F.value,"onUpdate:value":$[13]||($[13]=T=>F.value=T),min:1,max:100,precision:0,placeholder:e(f)("kanban.form.goalMaxTurnsPlaceholder"),clearable:""},null,8,["value","placeholder"])]),_:1},8,["label"])):P("",!0)])]),_:1})]),_:1},8,["title"]))}})})),bn=ae((()=>{})),ss,_n=ae((()=>{Pt(),Pt(),bn(),Ke(),ss=ze(ts,[["__scopeId","data-v-721fc143"]])})),At,Rt,Ut,Ot,Dt,Nt,Lt,Et,Kt,zt,Ft,qt,Mt,Vt,ns,Jt=ae((()=>{Ae(),Ne(),Le(),Ht(),Es(),pn(),_n(),Ge(),Ps(),Qe(),At={class:"kanban-view"},Rt={class:"page-header"},Ut={class:"header-title"},Ot={class:"header-actions"},Dt={key:0,class:"stats-bar"},Nt=["aria-pressed","onClick"],Lt={class:"stat-count"},Et={class:"stat-label"},Kt=["aria-pressed"],zt={class:"stat-count"},Ft={class:"stat-label"},qt={class:"kanban-board"},Mt={key:0,class:"column-empty"},Vt={class:"board-form"},ns=De({__name:"KanbanView",setup(t){const{t:n}=Ee(),m=$s(),f=Gt(),c=He(),p=Fe(),x=Is(),I=y(!1),a=y(!1),z=y(null),O=y(""),N=y(""),A=y(!1),W=y(null),H=y(!1),E=["triage","todo","scheduled","ready","running","blocked","review","done","archived"],V=y([...E]);function Y(k){return Array.isArray(k)?typeof k[0]=="string"?k[0]:null:typeof k=="string"?k:null}function K(){return Y(m.query.board)}async function F(k){K()!==k&&await f.replace({query:{...m.query,board:k}})}async function J(k,h=!0,w=!1){const se=p.selectedBoard,{board:$e,recovered:le}=p.recoverSelectedBoard(k||p.selectedBoard||"default");z.value=null,I.value=!1,a.value=!1,h&&le&&p.boardWarning&&c.warning(p.boardWarning),await F($e),(w||$e!==se)&&await p.refreshAll()}function G(k){return`${n("kanban.stats.tasks")}: ${k}`}const j=U(()=>p.activeBoards.map(k=>{const h=typeof k.total=="number"?k.total:0;return{label:`${n("kanban.title")}: ${k.icon?`${k.icon} `:""}${k.name||k.slug} · ${G(h)}`,value:k.slug}})),ie=U({get:()=>p.selectedBoard,set:k=>{J(k||"default")}}),Q=U(()=>{const k={};for(const h of E)k[h]=p.tasks.filter(w=>w.status===h).sort((w,se)=>se.created_at-w.created_at);return k}),ke=U(()=>{const k=p.filterStatus;return k&&E.includes(k)?[k]:E}),re=U(()=>je(p.assignees,p.stats?.by_assignee||{})),ce=U(()=>Object.fromEntries(x.profiles.map(k=>[k.name,k.avatar||null]))),ee=U(()=>[{label:n("kanban.allStatuses"),value:""},...E.map(k=>({label:n(`kanban.columns.${k}`,k),value:k}))]),he=U(()=>[{label:n("kanban.allAssignees"),value:""},...re.value.map(k=>({label:k.name,value:k.name}))]),S=U({get:()=>p.filterStatus||"",set:k=>p.setFilter("status",k||null)}),$=U({get:()=>p.filterAssignee||"",set:k=>p.setFilter("assignee",k||null)});Oe(()=>m.query.board,async()=>{H.value&&await J(K(),!1)}),Oe(ke,k=>{V.value=[...k]},{immediate:!0}),Wt(async()=>{await Promise.all([p.fetchBoards(),p.fetchCapabilities(),x.profiles.length===0?x.fetchProfiles():Promise.resolve()]),await J(K(),!0,!0),p.startEventStream(),H.value=!0,W.value=setInterval(()=>{document.visibilityState==="visible"&&Promise.all([p.fetchBoards(),p.fetchTasks(!0),p.fetchStats()])},15e3)}),_s(()=>{p.stopEventStream(),W.value&&clearInterval(W.value)});function T(k){z.value=k}function ve(){z.value=null}async function fe(){await Promise.all([p.fetchTasks(),p.fetchStats()])}function me(k){z.value=k}async function pe(){await p.fetchTasks()}async function Te(k){p.setFilter("status",k),V.value=k?[k]:[...E],await p.fetchTasks()}async function Pe(){await Promise.all([p.fetchTasks(),p.fetchStats(),p.fetchBoards()])}async function te(){const k=O.value.trim();if(!k){c.warning(n("kanban.board.slugRequired"));return}A.value=!0;try{const h=await p.createBoard({slug:k,name:N.value.trim()||void 0});O.value="",N.value="",a.value=!1,await F(h.slug),c.success(n("kanban.board.created"))}catch(h){c.error(h.message)}finally{A.value=!1}}async function Be(){if(p.selectedBoard!=="default"&&window.confirm(n("kanban.board.archiveConfirm"))){A.value=!0;try{await p.archiveSelectedBoard(),await F(Se),c.success(n("kanban.board.archived"))}catch(k){c.error(k.message)}finally{A.value=!1}}}async function Ce(){A.value=!0;try{await p.dispatch(),await p.refreshAll(),c.success(n("kanban.message.dispatchNudged"))}catch(k){c.error(k.message)}finally{A.value=!1}}return(k,h)=>(_(),B("div",At,[i("header",Rt,[i("h2",Ut,r(e(n)("kanban.title")),1),i("div",Ot,[b(e(we),{value:ie.value,"onUpdate:value":h[0]||(h[0]=w=>ie.value=w),options:j.value,loading:e(p).boardsLoading,size:"small",style:{width:"260px"}},null,8,["value","options","loading"]),b(e(L),{size:"small",loading:A.value,onClick:h[1]||(h[1]=w=>a.value=!0)},{default:g(()=>[R(r(e(n)("common.add")),1)]),_:1},8,["loading"]),b(e(L),{size:"small",secondary:"",disabled:e(p).selectedBoard===e(Se),loading:A.value,onClick:Be},{default:g(()=>[R(r(e(n)("kanban.board.archive")),1)]),_:1},8,["disabled","loading"]),b(e(L),{size:"small",secondary:"",loading:A.value,onClick:Ce},{default:g(()=>[R(r(e(n)("kanban.action.dispatch")),1)]),_:1},8,["loading"]),b(e(we),{value:S.value,"onUpdate:value":[h[2]||(h[2]=w=>S.value=w),pe],options:ee.value,size:"small",style:{width:"150px"}},null,8,["value","options"]),b(e(we),{value:$.value,"onUpdate:value":[h[3]||(h[3]=w=>$.value=w),pe],options:he.value,size:"small",style:{width:"170px"}},null,8,["value","options"]),b(e(L),{type:"primary",size:"small",onClick:h[4]||(h[4]=w=>I.value=!0)},{icon:g(()=>[...h[12]||(h[12]=[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:g(()=>[R(" "+r(e(n)("kanban.createTask")),1)]),_:1})])]),e(p).stats?(_(),B("div",Dt,[(_(),B(ue,null,be(E,w=>i("button",{key:w,type:"button",class:_e(["stat-chip",[w,{active:e(p).filterStatus===w}]]),"aria-pressed":e(p).filterStatus===w,onClick:se=>Te(w)},[i("span",Lt,r(e(p).stats.by_status[w]||0),1),i("span",Et,r(e(n)(`kanban.columns.${w}`,w)),1)],10,Nt)),64)),i("button",{type:"button",class:_e(["stat-chip total",{active:!e(p).filterStatus}]),"aria-pressed":!e(p).filterStatus,onClick:h[5]||(h[5]=w=>Te(null))},[i("span",zt,r(e(p).stats.total),1),i("span",Ft,r(e(n)("kanban.stats.total")),1)],10,Kt)])):P("",!0),b(e(Je),{show:e(p).loading&&e(p).tasks.length===0},{default:g(()=>[i("div",qt,[b(e(gs),{"expanded-names":V.value,"onUpdate:expandedNames":h[6]||(h[6]=w=>V.value=w)},{default:g(()=>[(_(!0),B(ue,null,be(ke.value,w=>(_(),ne(e(ws),{key:w,title:`${e(n)(`kanban.columns.${w}`,w)} (${Q.value[w].length})`,name:w,class:_e(["kanban-column",`status-${w}`])},{header:g(()=>[i("span",{class:_e(["column-header",`status-${w}`])},[h[13]||(h[13]=i("span",{class:"status-dot","aria-hidden":"true"},null,-1)),i("span",null,r(e(n)(`kanban.columns.${w}`,w))+" ("+r(Q.value[w].length)+")",1)],2)]),default:g(()=>[i("div",{class:_e(["task-list",`status-${w}`])},[(_(!0),B(ue,null,be(Q.value[w],se=>(_(),ne(Yt,{key:se.id,task:se,"assignee-avatar":se.assignee&&ce.value[se.assignee]||null,onClick:$e=>T(se.id)},null,8,["task","assignee-avatar","onClick"]))),128)),Q.value[w].length===0?(_(),B("div",Mt,r(e(n)("kanban.noTasks")),1)):P("",!0)],2)]),_:2},1032,["title","name","class"]))),128))]),_:1},8,["expanded-names"])])]),_:1},8,["show"]),b(as,{"task-id":z.value,onClose:ve,onUpdated:fe,onNavigate:me},null,8,["task-id"]),b(e(We),{show:a.value,"onUpdate:show":h[10]||(h[10]=w=>a.value=w),preset:"dialog",title:e(n)("kanban.board.create"),style:{width:"420px"}},{action:g(()=>[b(e(L),{onClick:h[9]||(h[9]=w=>a.value=!1)},{default:g(()=>[R(r(e(n)("common.cancel")),1)]),_:1}),b(e(L),{type:"primary",loading:A.value,onClick:te},{default:g(()=>[R(r(e(n)("common.create")),1)]),_:1},8,["loading"])]),default:g(()=>[i("div",Vt,[b(e(de),{value:O.value,"onUpdate:value":h[7]||(h[7]=w=>O.value=w),placeholder:e(n)("kanban.board.slugPlaceholder")},null,8,["value","placeholder"]),b(e(de),{value:N.value,"onUpdate:value":h[8]||(h[8]=w=>N.value=w),placeholder:e(n)("kanban.board.namePlaceholder")},null,8,["value","placeholder"])])]),_:1},8,["show","title"]),I.value?(_(),ne(ss,{key:1,onClose:h[11]||(h[11]=w=>I.value=!1),onCreated:Pe})):P("",!0)]))}})})),hn=ae((()=>{})),yn,gn=ae((()=>{Jt(),Jt(),hn(),Ke(),yn=ze(ns,[["__scopeId","data-v-7a17a5f4"]])}));gn();export{yn as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as v}from"./rolldown-runtime-M0oDzQ_3.js";import{$t as N,Kt as S,Un as f,Zt as w,an as e,cn as c,cr as s,en as U,er as n,hn as q,jn as g,kn as D,pr as a,sn as y}from"./ui-vendor-DDMfmCj2.js";import{M as I,O as j,P as E,k as O}from"./vue-vendor-BsMpqyaC.js";import{l as T,n as W,p as X,t as Z,u as $}from"./_plugin-vue_export-helper-
|
|
1
|
+
import{n as v}from"./rolldown-runtime-M0oDzQ_3.js";import{$t as N,Kt as S,Un as f,Zt as w,an as e,cn as c,cr as s,en as U,er as n,hn as q,jn as g,kn as D,pr as a,sn as y}from"./ui-vendor-DDMfmCj2.js";import{M as I,O as j,P as E,k as O}from"./vue-vendor-BsMpqyaC.js";import{l as T,n as W,p as X,t as Z,u as $}from"./_plugin-vue_export-helper-CvnFozKy.js";import{Mt as z,_ as F,d as G,g as J}from"./index-B2IKGvbR.js";var b,k,L,V,M,x,H,K,P,R,C,A=v((()=>{S(),z(),I(),j(),$(),J(),b={class:"login-view"},k={class:"login-card"},L={class:"login-title"},V={class:"login-desc"},M={class:"login-default-hint"},x=["placeholder"],H=["placeholder"],K={key:0,class:"login-error"},P={key:1,class:"login-lock-hint"},R=["disabled"],C=q({__name:"LoginView",setup(te){const{t}=O(),m=E(),o=n(""),r=n(""),u=n(!1),l=n(""),d=n(!1);T()&&m.replace("/hermes/chat"),D(async()=>{try{await G()}catch{}});async function h(){await B()}async function B(){if(!o.value.trim()||!r.value){l.value=t("login.credentialsRequired");return}u.value=!0,l.value="",d.value=!1;try{X(await F(o.value.trim(),r.value)),m.replace("/hermes/chat")}catch(_){_.status===429||_.status===503?(l.value=t("login.tooManyAttempts"),d.value=!0):l.value=_.message||t("login.invalidCredentials")}finally{u.value=!1}}return(_,i)=>(g(),c("div",b,[e("div",k,[i[4]||(i[4]=e("div",{class:"login-logo"},[e("img",{src:"/logo.png",alt:"Hermes",width:"80",height:"80"})],-1)),e("h1",L,a(s(t)("login.title")),1),e("p",V,a(s(t)("login.description")),1),e("p",M,a(s(t)("login.defaultCredentialsHint")),1),e("form",{class:"login-form",onSubmit:U(h,["prevent"])},[f(e("input",{"onUpdate:modelValue":i[0]||(i[0]=p=>o.value=p),type:"text",class:"login-input",placeholder:s(t)("login.usernamePlaceholder"),autofocus:""},null,8,x),[[w,o.value]]),f(e("input",{"onUpdate:modelValue":i[1]||(i[1]=p=>r.value=p),type:"password",class:"login-input",placeholder:s(t)("login.passwordPlaceholder"),onKeyup:N(h,["enter"])},null,40,H),[[w,r.value]]),l.value?(g(),c("div",K,a(l.value),1)):y("",!0),d.value?(g(),c("div",P,[e("span",null,a(s(t)("login.lockResetHint")),1),i[2]||(i[2]=e("code",null,"hermes-web-ui clear-login-locks --restart",-1)),e("span",null,a(s(t)("login.defaultLoginResetHint")),1),i[3]||(i[3]=e("code",null,"hermes-web-ui reset-default-login",-1))])):y("",!0),e("button",{type:"submit",class:"login-btn",disabled:u.value},a(u.value?"...":s(t)("login.submit")),9,R)],32)])]))}})})),Q=v((()=>{})),Y,ee=v((()=>{A(),A(),Q(),W(),Y=Z(C,[["__scopeId","data-v-fc7ec87c"]])}));ee();export{Y as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as f}from"./rolldown-runtime-M0oDzQ_3.js";import{Hn as O,Kt as Z,Nn as J,Ot as Y,Un as ee,V as se,Zt as le,an as t,cn as r,cr as i,er as u,fn as ae,g as te,hn as ne,in as N,jn as _,kn as ie,mt as R,pn as m,pr as n,sn as oe,t as ue,tn as x,ur as V}from"./ui-vendor-DDMfmCj2.js";import{O as re,k as _e}from"./vue-vendor-BsMpqyaC.js";import{f as P,n as ce,t as ve,u as de}from"./_plugin-vue_export-helper-
|
|
1
|
+
import{n as f}from"./rolldown-runtime-M0oDzQ_3.js";import{Hn as O,Kt as Z,Nn as J,Ot as Y,Un as ee,V as se,Zt as le,an as t,cn as r,cr as i,er as u,fn as ae,g as te,hn as ne,in as N,jn as _,kn as ie,mt as R,pn as m,pr as n,sn as oe,t as ue,tn as x,ur as V}from"./ui-vendor-DDMfmCj2.js";import{O as re,k as _e}from"./vue-vendor-BsMpqyaC.js";import{f as P,n as ce,t as ve,u as de}from"./_plugin-vue_export-helper-CvnFozKy.js";async function ge(){return(await P("/api/hermes/logs")).files}async function pe(y,a){const o=new URLSearchParams;a?.lines&&o.set("lines",String(a.lines)),a?.level&&o.set("level",a.level),a?.session&&o.set("session",a.session),a?.since&&o.set("since",a.since);const c=o.toString();return(await P(`/api/hermes/logs/${y}${c?`?${c}`:""}`)).entries.filter(v=>v!==null)}var me=f((()=>{de()})),B,E,S,U,I,z,F,G,q,D,T,$,A,W,M=f((()=>{Z(),ue(),re(),me(),B={class:"logs-view"},E={class:"page-header"},S={class:"header-title"},U={class:"header-actions"},I=["placeholder"],z={class:"logs-body"},F={key:0,class:"logs-empty"},G={class:"log-list"},q={class:"log-time"},D={class:"log-logger"},T={class:"access-method"},$={class:"access-path"},A={key:1,class:"log-message"},W=ne({__name:"LogsView",setup(y){const{t:a}=_e(),o=se(),c=u([]),v=u("agent"),w=u([]),d=u(!1),b=u(100),L=u(""),h=u(""),H=N(()=>c.value.map(s=>({label:`${s.name} (${s.size})`,value:s.name}))),j=N(()=>[{label:a("logs.all"),value:""},{label:"ERROR",value:"ERROR"},{label:"WARNING",value:"WARNING"},{label:"INFO",value:"INFO"},{label:"DEBUG",value:"DEBUG"}]),K=[{label:"50",value:50},{label:"100",value:100},{label:"200",value:200},{label:"500",value:500}],C=N(()=>{if(!h.value)return w.value;const s=h.value.toLowerCase();return w.value.filter(e=>e.message.toLowerCase().includes(s)||e.logger.toLowerCase().includes(s)||e.raw.toLowerCase().includes(s))});function k(s){switch(s){case"ERROR":return"level-error";case"WARNING":return"level-warning";case"DEBUG":return"level-debug";default:return"level-info"}}function Q(s){const e=s.match(/\d{2}:\d{2}:\d{2}/);return e?e[0]:s}function g(s){const e=s.match(/"(\w+)\s+(\S+)\s+HTTP\/[^"]+"\s+(\d+)/);return e?{method:e[1],path:e[2],status:e[3]}:null}async function p(){d.value=!0;try{w.value=(await pe(v.value,{lines:b.value,level:L.value||void 0})).filter(s=>s!==null)}catch(s){o.error(s.message)}finally{d.value=!1}}return ie(async()=>{c.value=await ge(),await p()}),(s,e)=>(_(),r("div",B,[t("header",E,[t("h2",S,n(i(a)("logs.title")),1),t("div",U,[m(i(R),{value:v.value,"onUpdate:value":[e[0]||(e[0]=l=>v.value=l),p],options:H.value,size:"small",class:"input-md"},null,8,["value","options"]),m(i(R),{value:L.value,options:j.value,size:"small",class:"input-sm","onUpdate:value":e[1]||(e[1]=l=>{L.value=l,p()})},null,8,["value","options"]),m(i(R),{value:b.value,options:K,size:"small",class:"input-sm","onUpdate:value":e[2]||(e[2]=l=>{b.value=l,p()})},null,8,["value"]),ee(t("input",{"onUpdate:modelValue":e[3]||(e[3]=l=>h.value=l),class:"search-input",placeholder:i(a)("logs.searchPlaceholder")},null,8,I),[[le,h.value]]),m(i(Y),{size:"small",loading:d.value,onClick:p},{default:O(()=>[ae(n(i(a)("logs.refresh")),1)]),_:1},8,["loading"])])]),t("div",z,[m(i(te),{show:d.value,class:"logs-spin"},{default:O(()=>[C.value.length===0&&!d.value?(_(),r("div",F,n(i(a)("logs.noEntries")),1)):oe("",!0),t("div",G,[(_(!0),r(x,null,J(C.value,(l,X)=>(_(),r("div",{key:X,class:V(["log-entry",k(l.level)])},[t("span",q,n(Q(l.timestamp)),1),t("span",{class:V(["log-level",k(l.level)])},n(l.level),3),t("span",D,n(l.logger),1),g(l.message)?(_(),r(x,{key:0},[t("span",T,n(g(l.message).method),1),t("span",$,n(g(l.message).path),1),t("span",{class:V(["access-status","status-"+(g(l.message).status?.[0]||"x")])},n(g(l.message).status),3)],64)):(_(),r("span",A,n(l.message),1))],2))),128))])]),_:1},8,["show"])])]))}})})),he=f((()=>{})),fe,we=f((()=>{M(),M(),he(),ce(),fe=ve(W,[["__scopeId","data-v-a840928e"]])}));we();export{fe as default};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/js/mermaid-CWQI515T.js","assets/js/rolldown-runtime-M0oDzQ_3.js"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{a as ze,n as C}from"./rolldown-runtime-M0oDzQ_3.js";import{Bn as Ge,Dn as Ve,Fn as Xe,Hn as X,I as qe,Kt as Ye,P as Ke,V as Ze,an as ie,cn as H,cr as P,en as Je,er as F,g as Qe,hn as et,in as oe,jn as A,kn as tt,nn as nt,on as rt,pn as B,pr as it,sn as ae,t as ot,tn as at,wn as se}from"./ui-vendor-DDMfmCj2.js";import{O as st,k as lt}from"./vue-vendor-BsMpqyaC.js";import{B as ct,z as dt}from"./mermaid-CWQI515T.js";import{a as ut,c as ft,i as mt,l as pt,o as ht,r as le,s as ce}from"./vendor-B1Lfatlz.js";import{J as O,X as q,Y as gt,Z as wt}from"./index-
|
|
2
|
+
import{a as ze,n as C}from"./rolldown-runtime-M0oDzQ_3.js";import{Bn as Ge,Dn as Ve,Fn as Xe,Hn as X,I as qe,Kt as Ye,P as Ke,V as Ze,an as ie,cn as H,cr as P,en as Je,er as F,g as Qe,hn as et,in as oe,jn as A,kn as tt,nn as nt,on as rt,pn as B,pr as it,sn as ae,t as ot,tn as at,wn as se}from"./ui-vendor-DDMfmCj2.js";import{O as st,k as lt}from"./vue-vendor-BsMpqyaC.js";import{B as ct,z as dt}from"./mermaid-CWQI515T.js";import{a as ut,c as ft,i as mt,l as pt,o as ht,r as le,s as ce}from"./vendor-B1Lfatlz.js";import{J as O,X as q,Y as gt,Z as wt}from"./index-B2IKGvbR.js";import{n as _t,t as vt}from"./clipboard-1NPxC3YL.js";function $(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function kt(e){return e.replace(/[^a-z0-9_-]/gi,"-")||"plain"}function be(e,t,n,i,o=[],a,c=!0){const l=n?`<span class="code-lang">${$(n)}</span>`:"",f=c?`<button type="button" class="copy-btn" data-copy-code="true">${$(i)}</button>`:"";return`<pre class="${["hljs-code-block",...o].join(" ")}"${a==null?"":` data-copy-text="${$(a)}"`}><div class="code-header">${l}${f}</div><code class="hljs language-${kt(t)}">${e}</code></pre>`}function bt(e){return xe.has(e?.trim().toLowerCase()||"")}function U(e){return/^(diff --git |index |---(?:\s|$)|\+\+\+(?:\s|$))/.test(e)}function S(e){return/^@@(?:\s|$)/.test(e)}function j(e){return/^\+(?!\+\+(?:\s|$))/.test(e)}function W(e){return/^-(?!---(?:\s|$))/.test(e)}function yt(e){const t=e.match(/^@@ -(\d+)(?:,\d+)? \+(\d+)(?:,\d+)? @@/);return t?{oldNumber:Number(t[1]),newNumber:Number(t[2])}:null}function $t(e,t){return U(e)||S(e)?{value:"",className:"diff-line-number-empty"}:W(e)?{value:t.oldNumber!=null?String(t.oldNumber):"",className:"diff-line-number-old"}:j(e)?{value:t.newNumber!=null?String(t.newNumber):"",className:"diff-line-number-new"}:!U(e)&&!S(e)&&t.newNumber!=null?{value:String(t.newNumber),className:"diff-line-number-context"}:{value:"",className:"diff-line-number-empty"}}function xt(e,t){if(!(U(e)||S(e))){if(W(e)){t.oldNumber!=null&&(t.oldNumber+=1);return}if(j(e)){t.newNumber!=null&&(t.newNumber+=1);return}t.oldNumber!=null&&(t.oldNumber+=1),t.newNumber!=null&&(t.newNumber+=1)}}function Lt(e){return`<span class="diff-line diff-line-context-fold"><span class="diff-line-number diff-line-number-empty" aria-hidden="true"></span><span class="diff-line-content">⋮ ${$(e)}</span></span>`}function Nt(e,t){const n=[];let i=0;for(;i<e.length;){if(!e[i].foldableContext){n.push(e[i]),i+=1;continue}const o=i;for(;i<e.length&&e[i].foldableContext;)i+=1;const a=e.slice(o,i);if(a.length<=Le){n.push(...a);continue}const c=Math.min(Ne,Math.floor(a.length/2)),l=a.length-c*2;n.push(...a.slice(0,c)),n.push({html:Lt(t(l)),foldableContext:!1}),n.push(...a.slice(a.length-c))}return n}function Ft(e,t,n,i,o=!0){const a={},c=e.split(/\r?\n/);return c.at(-1)===""&&c.pop(),be(Nt(c.map(l=>{const f=["diff-line"];let v=!1;if(U(l))f.push("diff-line-file-header");else if(S(l)){f.push("diff-line-hunk-header");const x=yt(l);x&&(a.oldNumber=x.oldNumber,a.newNumber=x.newNumber)}else j(l)?f.push("diff-line-added"):W(l)?f.push("diff-line-removed"):v=!0;const k=$t(l,a),L=`<span class="${f.join(" ")}"><span class="diff-line-number ${k.className}" aria-hidden="true">${$(k.value)}</span><span class="diff-line-content">${$(l||" ")}</span></span>`;return xt(l,a),{html:L,foldableContext:v}}),i).map(l=>l.html).join(""),"diff",t,n,["hljs-unified-diff"],e,o)}function Ct(e){const t=e?.trim().toLowerCase()||"";return $e[t]||t}function Et(e){const t=e.trimStart();return!!(/^\*\*\* Begin Patch/m.test(t)||/^\*\*\* (Update|Add|Delete) File:/m.test(t)||/^---\s+[^\n]+\n\+\+\+\s+[^\n]+\n@@/m.test(t))}function mn(e){const t=e.trimStart();if(/^[\[{]/.test(t))try{return JSON.parse(e),"json"}catch{}return Et(e)?"diff":void 0}function ye(e,t){const n=e.split(/\r?\n/);if(n.length<3)return!1;let i=0,o=0,a=0,c=0,l=0;for(const f of n){if(/^(diff --git |index )/.test(f)){l+=1;continue}if(/^---(?:\s|$)|^\+\+\+(?:\s|$)/.test(f)){i+=1;continue}if(S(f)){o+=1;continue}if(j(f)){a+=1;continue}W(f)&&(c+=1)}return a>0||c>0?bt(t)?o>0||i>=2||l>0:i>=2&&o>0:!1}function de(e,t=0){if(t>4||e===null||typeof e!="object")return null;if(Array.isArray(e)){for(const i of e){const o=de(i,t+1);if(o)return o}return null}const n=Object.entries(e);for(const[i,o]of n)if(Fe.has(i.toLowerCase())&&typeof o=="string"&&ye(o))return o;for(const[,i]of n)if(i&&typeof i=="object"){const o=de(i,t+1);if(o)return o}return null}function ue(e,t,n,i={}){const o=t?.trim().toLowerCase()||"",a=Ct(o),c=i.maxHighlightLength??Number.POSITIVE_INFINITY;if(ye(e,o||a)){const k=i.formatDiffFoldLabel??(L=>String(L));return Ft(e,o||"diff",n,k,i.showCopyButton??!0)}let l="",f=a||o||"plain",v=o;try{a&&le.getLanguage(a)&&e.length<=c?(l=le.highlight(e,{language:a,ignoreIllegals:!0}).value,f=a):(l=$(e),v||(v="text"))}catch{l=$(e),v||(v="text")}return be(l,f,v,n,[],void 0,i.showCopyButton??!0)}async function Dt(e){return vt(e)}async function Mt(e){const t=e.target;if(!(t instanceof HTMLElement))return null;const n=t.closest('[data-copy-code="true"]');if(!n)return null;e.preventDefault();const i=n.closest(".hljs-code-block"),o=i?.querySelector("code"),a=i?.getAttribute("data-copy-text")??o?.textContent??"";return a?Dt(a):!1}var $e,xe,Le,Ne,Fe,At=C((()=>{mt(),_t(),$e={shellscript:"bash",sh:"bash",zsh:"bash",yml:"yaml",vue:"xml"},xe=new Set(["diff","patch"]),Le=8,Ne=3,Fe=new Set(["difference","diff","patch","stdout","output","content"])}));function E(e){const t=e.match(/^( {0,3})(`{3,}|~{3,})(.*)$/);if(!t)return null;const[,n,i,o=""]=t,a=i[0],c=o.trim();return a==="`"&&c.includes("`")?null:{indent:n,marker:a,fence:i,length:i.length,info:c}}function fe(e,t=e.length,n=e.info){return`${e.indent}${e.marker.repeat(t)}${n?` ${n}`:""}`}function Ce(e){const t=e.info.split(/\s+/)[0]?.toLowerCase();return De.has(t)}function St(e,t){const n=E(e);return!!(n&&n.marker===t.marker&&n.length>=t.length&&n.info==="")}function Ee(e,t=e.length-1){let n=t;for(;n>=0&&e[n].trim()==="";)n-=1;return n}function It(e,t,n){for(let i=Ee(e);i>n;i-=1)if(St(e[i],t))return i;return-1}function Tt(e,t){const n=[];let i=!1;for(const o of e){const a=E(o);if(!a||a.marker!==t)continue;i=!0;const c=n[n.length-1];if(a.info===""&&c&&a.length>=c.length){n.pop();continue}n.push({marker:a.marker,length:a.length})}return i&&n.length===0}function Rt(e,t,n){const i=[];for(let o=n;o<e.length;o+=1){const a=E(e[o]);a&&a.marker===t.marker&&a.info===""&&a.length>=t.length&&i.push(o)}for(let o=i.length-1;o>=0;o-=1){const a=i[o];if(Tt(e.slice(n,a),t.marker))return a}return i[0]??-1}function Ht(e,t){let n=0;for(const i of e){const o=E(i);o?.marker===t&&(n=Math.max(n,o.length))}return n}function Pt(e){const t=[];for(let n=0;n<e.length;n+=1){const i=E(e[n]);if(!i||!Ce(i)){t.push(e[n]);continue}const o=Rt(e,i,n+1);if(o===-1){t.push(e[n]);continue}const a=e.slice(n+1,o),c=Ht(a,i.marker);if(c>=i.length){const l=c+1;t.push(fe(i,l)),t.push(...a),t.push(fe(i,l,""))}else t.push(e[n]),t.push(...a),t.push(e[o]);n=o}return t}function Bt(e){if(!e.includes("```")&&!e.includes("~~~"))return e;const t=e.split(`
|
|
3
3
|
`),n=[];let i=!1;for(let o=0;o<t.length;o+=1){const a=E(t[o]);if(!a||!Ce(a)){n.push(t[o]);continue}const c=It(t,a,o+1);if(c===-1){n.push(t[o]);continue}if(c!==Ee(t)){n.push(t[o]);continue}n.push(...Pt(t.slice(o+1,c))),n.push(...t.slice(c+1)),i=!0;break}return i?n.join(`
|
|
4
4
|
`):e}var De,Ot=C((()=>{De=new Set(["md","markdown","mdown","mkd"])}));function Ut(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function jt(e){return e?.trim().split(/\s+/)[0]?.toLowerCase()||""}function Wt(e){return jt(e)===Me}function zt(e){return encodeURIComponent(e)}function me(e){if(!e)return"";try{return decodeURIComponent(e)}catch{return""}}function Gt(e){return['<div class="mermaid-diagram" data-mermaid-pending="true"',` data-mermaid-source="${Ut(zt(e))}">`,'<div class="mermaid-loading">Rendering Mermaid diagram…</div>',"</div>"].join("")}var Me,Vt,Y,Ae,Xt=C((()=>{Me="mermaid",Vt=2e4,Y=5e3,Ae=["txt","md","json","csv","log","py","yaml","yml","toml","sh","xml","html","css","js","ts","rs","go","java","c","cpp","h"]})),pe,he,ge,we,_e,ve,Se,ke=C((()=>{Ye(),st(),ot(),ft(),ht(),pe=ze(ut()),At(),Ot(),Xt(),wt(),ct(),he=["innerHTML"],ge={key:0,class:"text-preview-markdown"},we={key:1,class:"text-preview-body"},_e=["src"],ve="min(800px, 100vw)",Se=et({__name:"MarkdownRenderer",props:{content:{},mentionNames:{default:()=>[]},headingIdPrefix:{default:""}},setup(e){const t=new Set(["latex","tex","math","katex"]);function n(r){return r.trim().split(/\s+/)[0]?.toLowerCase()??""}function i(r){return t.has(n(r))}function o(r){const s=r.trim();return s.startsWith("\\[")&&s.endsWith("\\]")||s.startsWith("$$")&&s.endsWith("$$")||s.startsWith("\\(")&&s.endsWith("\\)")?s.slice(2,-2).trim():s}function a(r){const s=o(r);return`<div class="latex-block">${ce.renderToString(s,{displayMode:!0,output:"htmlAndMathml",throwOnError:!1,strict:"ignore"})}</div>`}const c=e,{t:l}=lt(),f=Ze();function v(r){return l("chat.unchangedLines",{count:r})}const k=new pt({html:!1,breaks:!0,linkify:!0,typographer:!0,highlight(r,s){return ue(r,s,l("common.copy"),{formatDiffFoldLabel:v})}});k.use(pe.default,{katex:ce,throwOnError:!1,strict:"ignore"});const L=k.renderer.rules.fence?.bind(k.renderer.rules);k.renderer.rules.fence=(r,s,m,p,w)=>{const h=r[s];return i(h.info)?a(h.content):Wt(h.info)?Gt(h.content):L?L(r,s,m,p,w):w.renderToken(r,s,m)};const x=F(null),K=`hermes-mermaid-${Math.random().toString(36).slice(2)}`,D=F(null),N=F(null),Z=F(""),z=F(!1),I=F(!1),Ie=oe(()=>/\.(md|markdown)$/i.test(Z.value));let b=0,y=!1;function G(r){return r.startsWith("/")||/^[a-zA-Z]:[\\/]/.test(r)}function V(r){return/^[a-zA-Z]:\\/.test(r)?r.replace(/\\/g,"/"):r}const Te=new Set(["mp4","webm","mov"]),Re=new Set(["mp3","wav","ogg","m4a","aac","flac"]);function J(r,s){const m=r.split("?")[0].split("#")[0].split(".").pop()?.toLowerCase();return!!m&&s.has(m)}const Q=oe(()=>{let r=k.render(Bt(c.content));const s=c.headingIdPrefix?`${c.headingIdPrefix}-`:"";let m=0;if(r=r.replace(/<(h[1-6])([^>]*)>/g,(p,w,h)=>{m++;const u=`${s}heading-${m}`;return h.includes("id=")?p.replace(/id="[^"]*"/,`id="${u}"`).replace(/id='[^']*'/,`id="${u}"`):h.trim()===""?`<${w} id="${u}">`:`<${w} ${h.trim()} id="${u}">`}),r=r.replace(/\bsrc=(["'])([^"']+)\1/g,(p,w,h)=>G(h)?`src=${w}${q(V(h))}${w}`:p),r=r.replace(/<a href="([^"]+)">([^<]+)<\/a>/g,(p,w,h)=>{if(!G(w))return p;const u=V(w),g=h.trim();return J(u,Te)?`<div class="markdown-video-container">
|
|
5
5
|
<video class="markdown-video" controls preload="metadata" src="${q(u)}"></video>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as I}from"./rolldown-runtime-M0oDzQ_3.js";import{An as Ya,Hn as c,It as oe,K as ie,Kt as ya,Nn as ae,Ot as w,Rt as Ha,V as Wa,Wt as Da,Yn as Ga,an as n,b as Ka,cn as p,cr as l,ct as ue,er as h,fn as m,g as Xa,hn as ha,in as G,jn as d,m as Qa,on as Z,pn as i,pr as r,sn as L,t as ga,tn as K,ur as X,ut as P,w as Za,wt as et}from"./ui-vendor-DDMfmCj2.js";import{O as Sa,k as ba}from"./vue-vendor-BsMpqyaC.js";import{f as V,n as wa,t as ka,u as at}from"./_plugin-vue_export-helper-
|
|
1
|
+
import{n as I}from"./rolldown-runtime-M0oDzQ_3.js";import{An as Ya,Hn as c,It as oe,K as ie,Kt as ya,Nn as ae,Ot as w,Rt as Ha,V as Wa,Wt as Da,Yn as Ga,an as n,b as Ka,cn as p,cr as l,ct as ue,er as h,fn as m,g as Xa,hn as ha,in as G,jn as d,m as Qa,on as Z,pn as i,pr as r,sn as L,t as ga,tn as K,ur as X,ut as P,w as Za,wt as et}from"./ui-vendor-DDMfmCj2.js";import{O as Sa,k as ba}from"./vue-vendor-BsMpqyaC.js";import{f as V,n as wa,t as ka,u as at}from"./_plugin-vue_export-helper-CvnFozKy.js";import{n as A,t as tt}from"./vendor-B1Lfatlz.js";var ce,de,ve,me,pe,fe,_e,ye,he,ge,Se,be,we,ke,Ce,Te,Me,D,Ca,xe=I((()=>{ya(),ga(),Sa(),ce={class:"card-header"},de={class:"server-name"},ve={class:"server-badges"},me={class:"type-badge transport"},pe={class:"card-body"},fe={key:0,class:"error-row"},_e={class:"error-text"},ye={class:"info-row"},he={class:"info-label"},ge={class:"info-value"},Se={key:1,class:"tools-list"},be=["title"],we={key:0,class:"tool-tag tool-tag-more"},ke={key:2,class:"tools-empty"},Ce={class:"muted"},Te={class:"card-footer"},Me={class:"card-actions"},D=20,Ca=ha({__name:"McpServerCard",props:{server:{},toolsByServer:{}},emits:["edit","test","reload","remove","toggleEnabled","manageTools"],setup(o,{emit:s}){const u=o,g=s,{t:_}=ba();function B(C){return C.raw_config.enabled===!1?"disabled":C.connected?"connected":"disconnected"}function J(C){return C.raw_config.enabled===!1?_("mcp.disabledStatus"):C.connected?_("mcp.connectedStatus"):_("mcp.disconnectedStatus")}const T=G(()=>u.toolsByServer[u.server.name]||[]);return(C,S)=>(d(),p("div",{class:X(["mcp-card",{disconnected:!o.server.connected,disabled:o.server.raw_config.enabled===!1}])},[n("div",ce,[n("h3",de,r(o.server.name),1),n("div",ve,[n("span",me,r(o.server.transport),1),n("span",{class:X(["type-badge",B(o.server)])},r(J(o.server)),3)])]),n("div",pe,[o.server.error?(d(),p("div",fe,[n("span",_e,r(o.server.error),1)])):L("",!0),n("div",ye,[n("span",he,r(l(_)("mcp.toolList")),1),n("span",ge,r(o.server.tools_registered)+"/"+r(o.server.tools)+r(l(_)("mcp.count"))+r(l(_)("mcp.tools")),1)]),o.server.tools>0?(d(),p("div",Se,[(d(!0),p(K,null,ae(T.value.slice(0,D),v=>(d(),p("span",{key:v.name,class:"tool-tag",title:v.description},r(v.name),9,be))),128)),T.value.length>D?(d(),p("span",we," +"+r(T.value.length-D)+" "+r(l(_)("mcp.more")),1)):L("",!0)])):(d(),p("div",ke,[n("span",Ce,r(l(_)("mcp.zeroTools")),1)]))]),n("div",Te,[n("div",Me,[i(l(w),{size:"tiny",quaternary:"",onClick:S[0]||(S[0]=v=>g("edit",o.server))},{default:c(()=>[m(r(l(_)("mcp.edit")),1)]),_:1}),i(l(w),{size:"tiny",quaternary:"",disabled:!o.server.connected,onClick:S[1]||(S[1]=v=>g("manageTools",o.server))},{default:c(()=>[m(r(l(_)("mcp.manageTools")),1)]),_:1},8,["disabled"]),i(l(w),{size:"tiny",quaternary:"",onClick:S[2]||(S[2]=v=>g("test",o.server))},{default:c(()=>[m(r(l(_)("mcp.test")),1)]),_:1}),i(l(w),{size:"tiny",quaternary:"",onClick:S[3]||(S[3]=v=>g("reload",o.server.name))},{default:c(()=>[m(r(l(_)("mcp.reload")),1)]),_:1}),i(l(Za),{onPositiveClick:S[4]||(S[4]=v=>g("remove",o.server))},{trigger:c(()=>[i(l(w),{size:"tiny",quaternary:"",type:"error"},{default:c(()=>[m(r(l(_)("mcp.remove")),1)]),_:1})]),default:c(()=>[m(" "+r(l(_)("mcp.confirmRemove",{name:o.server.name})),1)]),_:1})]),i(l(Qa),{value:o.server.raw_config.enabled!==!1,size:"small","onUpdate:value":S[5]||(S[5]=()=>g("toggleEnabled",o.server))},null,8,["value"])])],2))}})})),lt=I((()=>{})),Ta,st=I((()=>{xe(),xe(),lt(),wa(),Ta=ka(Ca,[["__scopeId","data-v-4a527181"]])}));async function rt(){return V("/api/hermes/mcp/servers")}async function nt(o,s){const u=new URLSearchParams;return o&&u.set("server",o),s&&u.set("raw","1"),V(`/api/hermes/mcp/tools${u.toString()?`?${u.toString()}`:""}`)}async function ot(o,s){return V("/api/hermes/mcp/servers",{method:"POST",body:JSON.stringify({name:o,config:s})})}async function it(o){return V(`/api/hermes/mcp/servers/${encodeURIComponent(o)}`,{method:"DELETE"})}async function ee(o,s){return V(`/api/hermes/mcp/servers/${encodeURIComponent(o)}`,{method:"PATCH",body:JSON.stringify({config:s})})}async function $e(o){return V(`/api/hermes/mcp/reload${o?`?server=${encodeURIComponent(o)}`:""}`,{method:"POST"})}async function ut(o){return V(`/api/hermes/mcp/servers/${encodeURIComponent(o)}/test`,{method:"POST"})}var ct=I((()=>{at()})),Ee,je,Ae,Re,Oe,Ue,ze,Ne,Ie,Ve,Be,Fe,Le,Je,qe,Pe,Ye,He,We,De,Ge,Ke,Xe,Qe,Ze,ea,aa,ta,la,sa,ra,na,oa,ia,ua,ca,da,va,ma,pa,fa,Ma,_a=I((()=>{ya(),tt(),ga(),Sa(),st(),ct(),Ee={class:"mcp-view"},je={class:"page-header"},Ae={class:"header-title"},Re={class:"header-actions"},Oe={key:0,class:"mcp-loading-state"},Ue={class:"summary-grid"},ze={class:"summary-card"},Ne={class:"summary-label"},Ie={class:"summary-card success"},Ve={class:"summary-label"},Be={class:"summary-card warning"},Fe={class:"summary-label"},Le={class:"summary-card info"},Je={class:"summary-label"},qe={class:"toolbar-row"},Pe={class:"btn-group"},Ye={key:1,class:"servers-grid"},He={class:"mode-switch-row"},We={key:0,class:"config-error"},De={class:"modal-actions"},Ge={key:0,class:"tools-modal-content"},Ke={class:"tools-modal-header"},Xe={class:"server-name-label"},Qe={class:"tools-mode-selector"},Ze={class:"mode-label"},ea={class:"tools-list-container"},aa={class:"tools-list-header"},ta={key:0,class:"tools-list-actions"},la={key:0,class:"tools-checkbox-list"},sa=["title"],ra={key:1,class:"tools-empty"},na={class:"muted"},oa={class:"tools-summary"},ia={key:0},ua={key:1},ca={key:2},da={class:"modal-actions"},va=`{
|
|
2
2
|
"my-server": {
|
|
3
3
|
"command": "npx",
|
|
4
4
|
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/path"]
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as E}from"./rolldown-runtime-M0oDzQ_3.js";import{Hn as r,Kt as Ce,Ot as c,Un as b,V as Ve,Zt as N,an as e,cn as n,cr as t,dn as H,er as g,fn as v,hn as ze,in as p,jn as o,kn as Be,on as h,pn as y,pr as i,sn as f,t as Se}from"./ui-vendor-DDMfmCj2.js";import{O as be,k as Ne}from"./vue-vendor-BsMpqyaC.js";import{n as Pe,t as Ee}from"./_plugin-vue_export-helper-
|
|
1
|
+
import{n as E}from"./rolldown-runtime-M0oDzQ_3.js";import{Hn as r,Kt as Ce,Ot as c,Un as b,V as Ve,Zt as N,an as e,cn as n,cr as t,dn as H,er as g,fn as v,hn as ze,in as p,jn as o,kn as Be,on as h,pn as y,pr as i,sn as f,t as Se}from"./ui-vendor-DDMfmCj2.js";import{O as be,k as Ne}from"./vue-vendor-BsMpqyaC.js";import{n as Pe,t as Ee}from"./_plugin-vue_export-helper-CvnFozKy.js";import{Dt as He,Et as qe}from"./index-B2IKGvbR.js";import{f as Le,l as Ue,r as $e}from"./skills-5qxphanX.js";import{n as De,t as P}from"./MarkdownRenderer-DQvs79tf.js";var q,L,U,$,D,F,T,I,O,R,j,K,X,Z,A,G,J,Q,W,Y,ee,te,se,ae,oe,ie,le,ne,re,de,me,ue,ce,ve,_e,ye,he,pe=E((()=>{Ce(),Se(),be(),De(),Ue(),qe(),q={class:"memory-view"},L={class:"page-header"},U={class:"header-title"},$={class:"memory-content"},D={key:0,class:"memory-loading"},F={key:1,class:"memory-sections"},T={class:"memory-section"},I={class:"section-header"},O={class:"section-title-row"},R={class:"section-title"},j={key:0,class:"section-mtime"},K={key:0,class:"section-body"},X={key:1,class:"empty-text"},Z={key:1,class:"section-edit"},A=["placeholder"],G={class:"edit-actions"},J={class:"memory-section"},Q={class:"section-header"},W={class:"section-title-row"},Y={class:"section-title"},ee={key:0,class:"section-mtime"},te={key:0,class:"section-body"},se={key:1,class:"empty-text"},ae={key:1,class:"section-edit"},oe=["placeholder"],ie={class:"edit-actions"},le={class:"memory-section"},ne={class:"section-header"},re={class:"section-title-row"},de={class:"section-title"},me={key:0,class:"section-mtime"},ue={key:0,class:"section-body"},ce={key:1,class:"empty-text"},ve={key:1,class:"section-edit"},_e=["placeholder"],ye={class:"edit-actions"},he=ze({__name:"MemoryView",setup(Oe){const{t:a}=Ne(),w=Ve(),x=He(),M=g(!1),l=g(null),d=g(null),m=g(""),k=g(!1);Be(C);async function C(){M.value=!0;try{(!x.activeProfileName||x.profiles.length===0)&&await x.fetchProfiles(),l.value=await $e()}catch(u){console.error("Failed to load memory:",u),w.error(a("memory.loadFailed"))}finally{M.value=!1}}function V(u){d.value=u,m.value=l.value?.[u]||""}function z(){d.value=null,m.value=""}async function B(){if(d.value){k.value=!0;try{await Le(d.value,m.value),await C(),d.value=null,m.value="",w.success(a("common.saved"))}catch(u){w.error(`${a("common.saveFailed")}: ${u.message}`)}finally{k.value=!1}}}function S(u){return u?new Date(u).toLocaleString([],{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}):""}const fe=p(()=>!l.value?.memory?.trim()),ke=p(()=>!l.value?.user?.trim()),ge=p(()=>!l.value?.soul?.trim()),we=p(()=>(l.value?.memory||"").replace(/§/g,`
|
|
2
2
|
|
|
3
3
|
`)),xe=p(()=>(l.value?.user||"").replace(/§/g,`
|
|
4
4
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/js/FileEditor-
|
|
2
|
-
import{n as ke}from"./rolldown-runtime-M0oDzQ_3.js";import{Dn as Ve,Hn as ye,I as Ua,Kt as Ea,Nn as te,Ot as Va,P as $a,V as Na,Vn as La,an as o,cn as l,cr as g,dn as Oa,en as $e,er as C,fn as Ra,g as Ha,hn as ja,in as u,jn as i,kn as Ka,mn as za,nn as Ja,on as T,pn as K,pr as h,sn as v,t as Wa,tn as P,ur as w}from"./ui-vendor-DDMfmCj2.js";import{O as Xa,k as Ya}from"./vue-vendor-BsMpqyaC.js";import{n as qa,t as Ga}from"./_plugin-vue_export-helper-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/js/FileEditor-CzWdryd5.js","assets/js/_plugin-vue_export-helper-CvnFozKy.js","assets/js/mermaid-CWQI515T.js","assets/js/rolldown-runtime-M0oDzQ_3.js","assets/js/vue-vendor-BsMpqyaC.js","assets/js/ui-vendor-DDMfmCj2.js","assets/js/vendor-B1Lfatlz.js","assets/css/vendor-DX3NCGtF.css","assets/css/vue-vendor-BY9mLa3u.css","assets/js/monaco-editor-YM0cdSGX.js","assets/css/monaco-editor-DPqmyJk4.css","assets/js/files-CBYc0MSs.js","assets/js/index-B2IKGvbR.js","assets/js/system-Onp4yS9N.js","assets/css/index-_wfHOCMC.css","assets/css/FileEditor-Cn0ACbJE.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{n as ke}from"./rolldown-runtime-M0oDzQ_3.js";import{Dn as Ve,Hn as ye,I as Ua,Kt as Ea,Nn as te,Ot as Va,P as $a,V as Na,Vn as La,an as o,cn as l,cr as g,dn as Oa,en as $e,er as C,fn as Ra,g as Ha,hn as ja,in as u,jn as i,kn as Ka,mn as za,nn as Ja,on as T,pn as K,pr as h,sn as v,t as Wa,tn as P,ur as w}from"./ui-vendor-DDMfmCj2.js";import{O as Xa,k as Ya}from"./vue-vendor-BsMpqyaC.js";import{n as qa,t as Ga}from"./_plugin-vue_export-helper-CvnFozKy.js";import{B as Za,z as Qa}from"./mermaid-CWQI515T.js";import{Dt as es,E as ts,Et as as,J as Ne,L as ss,M as ns,N as os,R as is,T as ls,Tt as rs,X as us,Z as ds,j as cs,wt as ms}from"./index-B2IKGvbR.js";import{i as vs,t as gs}from"./files-CBYc0MSs.js";import{n as hs,t as ps}from"./clipboard-1NPxC3YL.js";import{n as fs,t as ys}from"./chat-timestamp-CkDNtK9Y.js";import{a as _s,d as ks,f as ws,i as Cs,n as bs,r as Le,t as Oe}from"./ttsHelpers-DNcZ5khq.js";import{a as Ts,c as Ss,i as Ms,n as xs,o as Ps,r as Re,s as As,t as U}from"./MarkdownRenderer-DQvs79tf.js";var He,je,Ke,ze,Je,We,Xe,Ye,qe,Ge,Ze,Qe,et,tt,at,st,nt,ot,it,lt,rt,ut,dt,ct,mt,vt,gt,ht,pt,ft,yt,_t,kt,wt,Ct,bt,Tt,St,Mt,xt,Pt,At,Bt,Dt,Ft,It,Ut,Et,Vt,$t,Nt,Lt,Ot,Rt,Ht,jt,A,_e,Kt,zt,Jt,Wt,ae,Yt,Xt=ke((()=>{Ea(),Xa(),Wa(),ds(),hs(),xs(),ns(),ls(),gs(),as(),ss(),rs(),As(),ks(),Cs(),bs(),fs(),Za(),He=["id"],je={key:1,width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5",class:"tool-icon"},Ke={class:"tool-name"},ze={key:2,class:"tool-preview"},Je={key:3,class:"tool-spinner"},We={key:4,class:"tool-error-badge"},Xe={class:"tool-change-card"},Ye={class:"tool-change-card-header"},qe={class:"tool-change-card-title"},Ge={class:"tool-change-card-stats"},Ze={class:"additions"},Qe={class:"deletions"},et=["onClick"],tt={class:"tool-change-file-main"},at=["title"],st={class:"tool-change-file-stats"},nt={class:"additions"},ot={class:"deletions"},it={key:0,class:"tool-detail-section","data-copy-source":"tool-args"},lt={class:"tool-detail-label"},rt=["innerHTML"],ut={key:1,class:"tool-detail-section","data-copy-source":"tool-result"},dt={class:"tool-detail-label"},ct=["innerHTML"],mt={key:1,class:"msg-body"},vt={key:0,class:"msg-attachments"},gt=["src","alt","onClick"],ht=["onClick","title"],pt={class:"att-name"},ft={class:"att-size"},yt={class:"thinking-label"},_t={key:0,class:"thinking-meta"},kt={class:"thinking-meta"},wt={key:0,class:"thinking-body"},Ct={key:0,class:"msg-attachments"},bt=["src","alt","onClick"],Tt=["onClick","title"],St={class:"att-name"},Mt={key:6,class:"command-result command-status"},xt={class:"command-status-grid"},Pt={class:"command-status-key"},At={class:"command-status-value"},Bt={key:7,class:"command-result"},Dt={key:8,class:"streaming-dots"},Ft={class:"message-meta"},It=["title"],Ut={key:0,width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},Et={key:1,width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},Vt=["title"],$t=["title"],Nt={class:"message-time"},Lt={class:"tool-change-drawer"},Ot={class:"tool-change-drawer-actions"},Rt={key:0,class:"tool-change-drawer-path"},Ht=["innerHTML"],jt=["src"],A=1e3,_e=200,Kt=6,zt=1e3,Jt=50,Wt=50,ae="__truncated__",Yt=ja({__name:"MessageItem",props:{message:{},highlight:{type:Boolean},headingIdPrefix:{},showForkAction:{type:Boolean}},setup(c){const qt=za(()=>Qa(()=>import("./FileEditor-CzWdryd5.js").then(t=>(t.r(),t.n)),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]))),n=c,{t:d}=Ya(),y=Na(),Gt=u(()=>n.message.role==="system"),Zt=u(()=>n.message.role==="assistant"&&n.message.systemType==="error"),we=u(()=>n.headingIdPrefix||`msg-${n.message.id}`),z=u(()=>n.message.role==="command"||n.message.systemType==="command"),Qt=u(()=>n.message.role==="command"&&n.message.systemType==="error"),ea=u(()=>z.value&&n.message.commandAction==="status"&&n.message.commandData?.type!=="goal"),ta=u(()=>{const t=n.message.commandData||{};return[{key:"status",value:t.isWorking?"running":"idle"},{key:"source",value:t.source},{key:"profile",value:t.profile},{key:"model",value:t.model||"-"},{key:"queue",value:t.queueLength??0},{key:"run",value:t.runId||"-"}]});function aa(t){return!t||typeof t!="object"?"":(t.type==="text"||t.type==="input_text")&&typeof t.text=="string"?t.text:""}function sa(t){if(!t||typeof t!="object"||t.type!=="input_image"&&t.type!=="image_url")return null;const e=t.image_url;return typeof e=="string"?e:e&&typeof e=="object"&&typeof e.url=="string"?e.url:null}function na(t,e){const a=t.match(/^data:image\/([^;,]+)/i),r=a?.[1]==="jpeg"?"jpg":a?.[1]||"png";return`image-${e+1}.${r}`}function oa(t){const e=t.trim();if(!e)return null;const a=r=>{const p=JSON.parse(r);return Array.isArray(p)&&p.length>0&&"type"in p[0]?p:null};try{return a(e)}catch{if(!e.startsWith("[{'")&&!e.startsWith('[{"'))return null;try{return a(e.replace(/\bNone\b/g,"null").replace(/\bTrue\b/g,"true").replace(/\bFalse\b/g,"false").replace(/'/g,'"'))}catch{return null}}}const se=u(()=>oa(n.message.content||"")),ne=u(()=>se.value!==null),Ce=u(()=>ne.value?se.value.map(t=>aa(t)).filter(Boolean).join(`
|
|
3
3
|
`):n.message.content||""),oe=u(()=>ne.value?se.value.flatMap((t,e)=>{if(t.type==="image")return[{type:"image",name:String(t.name||`image-${e+1}`),path:String(t.path||"")}].filter(r=>r.path);if(t.type==="file")return[{type:"file",name:String(t.name||`file-${e+1}`),path:String(t.path||"")}].filter(r=>r.path);const a=sa(t);return a?.startsWith("data:image/")?[{type:"image",name:na(a,e),url:a}]:[]}):null);function be(t){return t.url?t.url:t.path?us(t.path,t.name):""}const R=C(!1),E=C(null),Te=C(null),V=C(""),$=C(!1),J=C(!1),S=C("diff"),N=C(null),B=ts(),M=vs(),Se=es(),ia=is(),m=ws(),s=_s(),Me=u(()=>B.activeSession?.profile||Se.activeProfileName||"default"),la=u(()=>Se.profiles.find(t=>t.name===Me.value)?.avatar),ie=u(()=>{if(n.message.role==="tool")return null;const t=n.message.content||"";return t.trim()?t:null});function ra(){!n.showForkAction||B.isStreaming||B.isForkPending||B.sendMessage("/fork")}async function ua(){const t=ie.value;if(t){if(await ps(t)){y.success(d("chat.copiedBubble"));return}y.error(d("chat.copyFailed"))}}const b=u(()=>os(n.message.content||"",{streaming:!!n.message.isStreaming})),xe=u(()=>!!(n.message.reasoning&&n.message.reasoning.length>0)),da=u(()=>xe.value||b.value.hasThinking),ca=u(()=>{const t=[];return n.message.reasoning&&t.push(n.message.reasoning),t.push(...b.value.segments),b.value.pending&&t.push(b.value.pending),t.join(`
|
|
4
4
|
|
|
5
5
|
`)}),ma=u(()=>{let t=cs(b.value);return n.message.reasoning&&(t+=n.message.reasoning.length),t}),Pe=u(()=>n.message.isStreaming?!!(b.value.pending!==null||xe.value&&!n.message.content):!1),le=C(null),W=u(()=>Pe.value?!0:le.value!==null?le.value:!!ia.display.show_reasoning);function va(){le.value=!W.value}const Ae=C(Date.now());let D=null;function ga(){const t=B.getThinkingObservation(n.message.id),e=!!(n.message.isStreaming&&t?.startedAt!==void 0&&t.endedAt===void 0);e&&D===null?D=window.setInterval(()=>{Ae.value=Date.now()},1e3):!e&&D!==null&&(window.clearInterval(D),D=null)}La(ga),Ve(()=>{D!==null&&window.clearInterval(D)});const re=u(()=>{const t=B.getThinkingObservation(n.message.id);if(!t?.startedAt)return null;const e=t.startedAt,a=t?.endedAt??(n.message.isStreaming?Ae.value:e);return Math.max(0,a-e)});function ha(t){const e=Math.floor(t/1e3);if(e<60)return`${e}s`;const a=Math.floor(e/60),r=e%60;return r===0?`${a}m`:`${a}m ${r}s`}const pa=u(()=>ys(n.message.timestamp));function Be(t){return t.startsWith("image/")}function fa(t){return t<1024?t+" B":t<1024*1024?(t/1024).toFixed(1)+" KB":(t/(1024*1024)).toFixed(1)+" MB"}function ya(t){const e=n.message.content||"";try{const p=JSON.parse(e);if(Array.isArray(p)&&p.length>0&&"type"in p[0]){const _=p.find(x=>x.type==="file"&&x.name===t);if(_&&_.path)return _.path}}catch{}const a=/\[File:\s*([^\]]+)\]\(([^)]+)\)/g;let r;for(;(r=a.exec(e))!==null;)if(r[1].trim()===t.trim())return r[2];return null}function _a(t){const e=ya(t.name);if(e){y.info(d("download.downloading")),Ne(e,t.name).catch(a=>{y.error(a.message||d("download.downloadFailed"))});return}if(t.url&&t.url.startsWith("blob:")){const a=document.createElement("a");a.href=t.url,a.download=t.name,document.body.appendChild(a),a.click(),document.body.removeChild(a)}}function ka(t,e){return t.length>_e?t.slice(0,_e)+`
|