@quanthermes/hermes-web-ui 0.6.18 → 0.6.19
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-DNfeMm-1.js → ChannelsView-BhvSQz3q.js} +1 -1
- package/dist/client/assets/js/{ChatView-CJ5xzaMG.js → ChatView-BBWSbOTc.js} +1 -1
- package/dist/client/assets/js/{CodingAgentsView-Dvtip0gX.js → CodingAgentsView-TsPWnQ-e.js} +1 -1
- package/dist/client/assets/js/{DevicesView-_WSWarB0.js → DevicesView-gWT295OX.js} +1 -1
- package/dist/client/assets/js/{FileRenameModal-yIh1kICM.js → FileRenameModal-CEFCYODC.js} +1 -1
- package/dist/client/assets/js/{FilesView-COieCqv9.js → FilesView-ClheDLjZ.js} +1 -1
- package/dist/client/assets/js/{GroupChatView-CMMdH9qi.js → GroupChatView-DN8mpn70.js} +1 -1
- package/dist/client/assets/js/{HistoryMessageList-63JhmxYI.js → HistoryMessageList-B2QMRyzN.js} +1 -1
- package/dist/client/assets/js/{HistoryView-CIZhEOTj.js → HistoryView-DYCFFpGg.js} +1 -1
- package/dist/client/assets/js/{JobsView-lL7xjV0S.js → JobsView-B-iy-ie4.js} +1 -1
- package/dist/client/assets/js/{KanbanView-qn0UtlHi.js → KanbanView-C0rUTSNF.js} +1 -1
- package/dist/client/assets/js/{LoginView-63v15BI4.js → LoginView-Dc3El_qw.js} +1 -1
- package/dist/client/assets/js/{LogsView-BSvpf5U4.js → LogsView-DwyBT7qp.js} +1 -1
- package/dist/client/assets/js/{MarkdownRenderer-THTJMUql.js → MarkdownRenderer-DZb1wMbL.js} +1 -1
- package/dist/client/assets/js/{McpManagerView-CA1rzPZs.js → McpManagerView-Dr_hv62e.js} +1 -1
- package/dist/client/assets/js/{MemoryView-CnEwNN35.js → MemoryView-CI2_Cy3L.js} +1 -1
- package/dist/client/assets/js/{MessageItem-C09jnu6X.js → MessageItem-CVPb7Btj.js} +1 -1
- package/dist/client/assets/js/{ModelsView-D9xMGX4E.js → ModelsView-CVsIIan4.js} +1 -1
- package/dist/client/assets/js/{OutlinePanel-HsWM7mLO.js → OutlinePanel-C_mZy_cq.js} +1 -1
- package/dist/client/assets/js/{PerformanceView-BTqaCcZT.js → PerformanceView-CVfmqAtJ.js} +1 -1
- package/dist/client/assets/js/{PluginsView-CRYHgkbM.js → PluginsView-DyuTCtts.js} +1 -1
- package/dist/client/assets/js/{ProfilesView-DEI5M20S.js → ProfilesView-B_g8Q3Cy.js} +1 -1
- package/dist/client/assets/js/{SettingRow-BlmnHYa0.js → SettingRow-BMYsP5uq.js} +1 -1
- package/dist/client/assets/js/{SettingsView-CE9zvzef.js → SettingsView-w0qkQi4m.js} +1 -1
- package/dist/client/assets/js/{SkillsUsageView-DurYN8k5.js → SkillsUsageView-KLg_9UJX.js} +1 -1
- package/dist/client/assets/js/{SkillsView-CMkth-Fm.js → SkillsView-O7EXzlgA.js} +1 -1
- package/dist/client/assets/js/{TerminalPanel-CeRILXkF.js → TerminalPanel-DVuhjZrt.js} +1 -1
- package/dist/client/assets/js/{TerminalView-BOCX7lvf.js → TerminalView-DVRlT_-o.js} +1 -1
- package/dist/client/assets/js/{UsageView-BuPt2L6B.js → UsageView-C6M2Id1b.js} +1 -1
- package/dist/client/assets/js/{VersionPreviewView-DQyROuWd.js → VersionPreviewView-wn0OxFjS.js} +1 -1
- package/dist/client/assets/js/{VirtualMessageList-Dty9wvSA.js → VirtualMessageList-ftkWv6i1.js} +1 -1
- package/dist/client/assets/js/{_plugin-vue_export-helper-BYiIU0Pd.js → _plugin-vue_export-helper-BIeGRfrQ.js} +2 -2
- package/dist/client/assets/js/{index-j9YvpyYe.js → index-Bkiif2Pf.js} +1 -1
- package/dist/client/assets/js/{models-ChbKk2Oo.js → models-BxWy-mRj.js} +1 -1
- package/dist/client/assets/js/{session-browser-prefs-BHcPARE8.js → session-browser-prefs-Byq_ViZP.js} +1 -1
- package/dist/client/assets/js/{skills-Fvhr-K4b.js → skills-aFq9azFz.js} +1 -1
- package/dist/client/assets/js/{system-BHEG2KFs.js → system-Bm5rA-WZ.js} +1 -1
- package/dist/client/assets/js/{useSttSettings-Cqov9Pdt.js → useSttSettings-DEm4lbwe.js} +1 -1
- package/dist/client/index.html +3 -3
- package/dist/server/index.js +3 -3
- package/package.json +7 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as ae}from"./rolldown-runtime-M0oDzQ_3.js";import{$t as de,A as ps,Cn as bs,Dn as ke,E as Ye,I as _s,K as We,Mn as Oe,O as ue,Ot as L,P as hs,Pn as y,Pt as ie,Qn as e,St as ys,Tn as _,V as He,Wn as g,Wt as Re,an as P,bt as gs,dn as De,er as me,g as Je,in as ne,ln as U,mt as Te,nn as O,on as C,ot as ws,rn as i,rr as r,t as Ee,un as b,wn as Ss,wt as Xe}from"./ui-vendor-dYn1tJGA.js";import{_ as Ts,c as Ne,f as Wt,g as Cs,l as Le,m as Ht,p as $s}from"./vue-vendor-DZ4A_GHn.js";import{f as E,n as Ke,o as Bs,s as xs,t as ze,u as Gt}from"./_plugin-vue_export-helper-BYiIU0Pd.js";import{J as Ps,X as Is,Y as Rs,q as As}from"./index-j9YvpyYe.js";import{n as Us,t as Os}from"./HistoryMessageList-63JhmxYI.js";var Ze,ea,aa,ta,sa,jt,na=ae((()=>{Re(),Ee(),Ne(),Ps(),Ze={class:"card-title"},ea={class:"card-meta"},aa={class:"meta-tag assignee-tag"},ta={class:"meta-time"},sa={key:0,class:"card-body-preview"},jt=De({__name:"KanbanTaskCard",props:{task:{},assigneeAvatar:{}},emits:["click"],setup(t,{emit:n}){const m=t,f=n,{t:c}=Le(),p=O(()=>{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)})}),B=O(()=>m.task.priority>=3?"high":m.task.priority===2?"medium":"low"),x=O(()=>c(`kanban.card.priority.${B.value}`));return(a,z)=>(_(),C("div",{class:me(["kanban-task-card",`status-${t.task.status}`]),onClick:z[0]||(z[0]=D=>f("click",t.task.id))},[i("div",Ze,r(t.task.title),1),i("div",ea,[t.task.assignee?(_(),ne(e(ws),{key:0,trigger:"hover"},{trigger:y(()=>[i("span",aa,[b(As,{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:y(()=>[U(" "+r(e(c)("kanban.card.assigneeTooltip")),1)]),_:1})):P("",!0),t.task.priority>=2?(_(),C("span",{key:1,class:me(["meta-tag priority-tag",B.value])},r(x.value),3)):P("",!0),i("span",ta,r(p.value),1)]),t.task.body?(_(),C("div",sa,r(t.task.body.slice(0,80))+r(t.task.body.length>80?"...":""),1)):P("",!0)],2))}})})),Ds=ae((()=>{})),Qt,Es=ae((()=>{na(),na(),Ds(),Ke(),Qt=ze(jt,[["__scopeId","data-v-11436d7e"]])}));function Ns(t){return t?.trim()||"default"}function Ls(){try{return localStorage.getItem("hermes_active_profile_name")}catch{return null}}function M(t,n){const m=n.toString();return m?`${t}?${m}`:t}function V(t){const n=new URLSearchParams;return n.set("board",Ns(t)),n}function la(t){return t?t.startsWith("https")?"wss:":"ws:":location.protocol==="https:"?"wss:":"ws:"}function Ks(t){const n=xs(),m=V(t?.board),f=Bs();f&&m.set("token",f);const c=Ls();c&&m.set("profile",c);const p=`/api/hermes/kanban/events?${m.toString()}`;if(n)return`${la(n)}//${new URL(n).host}${p}`;const B=location.host;return`${la()}//${B}${p}`}function zs(t){return new WebSocket(Ks(t))}async function Fs(t){const n=new URLSearchParams;return t?.includeArchived&&n.set("includeArchived","true"),(await E(M("/api/hermes/kanban/boards",n))).boards}async function qs(t){return(await E("/api/hermes/kanban/boards",{method:"POST",body:JSON.stringify(t)})).board}async function Ms(t){return E(`/api/hermes/kanban/boards/${encodeURIComponent(t)}`,{method:"DELETE"})}async function Vs(){return(await E("/api/hermes/kanban/capabilities")).capabilities}async function Js(t){const n=V(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 E(M("/api/hermes/kanban",n))).tasks}async function Ue(t,n){return E(M(`/api/hermes/kanban/${encodeURIComponent(t)}`,V(n?.board)))}async function Ws(t,n){return(await E(M("/api/hermes/kanban",V(n?.board)),{method:"POST",body:JSON.stringify(t)})).task}async function Hs(t,n,m){return E(M("/api/hermes/kanban/complete",V(m?.board)),{method:"POST",body:JSON.stringify({task_ids:t,summary:n})})}async function Gs(t,n,m){return E(M(`/api/hermes/kanban/${encodeURIComponent(t)}/block`,V(m?.board)),{method:"POST",body:JSON.stringify({reason:n})})}async function js(t,n){return E(M("/api/hermes/kanban/unblock",V(n?.board)),{method:"POST",body:JSON.stringify({task_ids:t})})}async function Qs(t,n,m){return E(M(`/api/hermes/kanban/${encodeURIComponent(t)}/assign`,V(m?.board)),{method:"POST",body:JSON.stringify({profile:n})})}async function Ys(t,n,m){return E(M(`/api/hermes/kanban/${encodeURIComponent(t)}/comments`,V(m?.board)),{method:"POST",body:JSON.stringify(n)})}async function Xs(t,n){return E(M("/api/hermes/kanban/links",V(n?.board)),{method:"POST",body:JSON.stringify(t)})}async function Zs(t,n){const m=V(n?.board);return m.set("parent_id",t.parent_id),m.set("child_id",t.child_id),E(M("/api/hermes/kanban/links",m),{method:"DELETE"})}async function en(t,n){return E(M("/api/hermes/kanban/tasks/bulk",V(n?.board)),{method:"POST",body:JSON.stringify(t)})}async function an(t,n){const m=V(n?.board);return n?.tail!==void 0&&m.set("tail",String(n.tail)),E(M(`/api/hermes/kanban/${encodeURIComponent(t)}/log`,m))}async function tn(t){const n=V(t?.board);return t?.task&&n.set("task",t.task),t?.severity&&n.set("severity",t.severity),(await E(M("/api/hermes/kanban/diagnostics",n))).diagnostics}async function sn(t,n){return E(M(`/api/hermes/kanban/${encodeURIComponent(t)}/reclaim`,V(n?.board)),{method:"POST",body:JSON.stringify({reason:n?.reason})})}async function nn(t,n,m){return E(M(`/api/hermes/kanban/${encodeURIComponent(t)}/reassign`,V(m?.board)),{method:"POST",body:JSON.stringify({profile:n,reclaim:m?.reclaim,reason:m?.reason})})}async function ln(t,n){return(await E(M(`/api/hermes/kanban/${encodeURIComponent(t)}/specify`,V(n?.board)),{method:"POST",body:JSON.stringify({author:n?.author})})).results}async function rn(t){return(await E(M("/api/hermes/kanban/dispatch",V(t?.board)),{method:"POST",body:JSON.stringify({dryRun:t?.dryRun,max:t?.max,failureLimit:t?.failureLimit})})).result}async function on(t){return(await E(M("/api/hermes/kanban/stats",V(t?.board)))).stats}async function un(t){return(await E(M("/api/hermes/kanban/assignees",V(t?.board)))).assignees}var Yt=ae((()=>{Gt()}));function dn(t){if(typeof window>"u")return null;try{return window.localStorage.getItem(t)}catch{return null}}function cn(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:he}var Ve,he,Xt,Fe,Ge=ae((()=>{Ts(),Re(),Yt(),Ve="hermes.kanban.selectedBoard",he="default",Xt=/^[a-z0-9][a-z0-9_-]{0,63}$/,Fe=Cs("kanban",()=>{const t=g([]),n=g(null),m=g([]),f=g([]),c=g(null),p=g(!1),B=g(!1),x=g(null),a=g(Me(dn(Ve))),z=g(null),D=g(null);let N=0,R=0,H=0,G=0,F=0,J=0,Q=0,K=null,q=null,W=null,X=!1;const Z=O(()=>{const s=f.value.filter(l=>!l.archived);return s.some(l=>l.slug==="default")?s:[{slug:he,name:"Default",description:"",icon:"",color:"",created_at:null,archived:!1,counts:{},total:0},...s]});function re(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 j(s){if(!re(s))throw new Error(`Kanban capability "${s}" is not supported by the current Hermes backend`)}function ve(s,l){const v=c.value?.capabilities?.find(T=>T.key===s);return v?l.includes(v.status):l.includes("supported")?re(s):!1}function oe(s,l){if(!ve(s,l))throw new Error(`Kanban capability "${s}" is not available with the required status`)}function I(s){return Z.value.some(l=>l.slug===s)}function w(s){const l=Me(s);return f.value.length>0&&!I(l)?he:l}function $(){t.value=[],n.value=null,m.value=[]}function A(){q&&clearTimeout(q),W&&clearTimeout(W),q=null,W=null}function ce(){if(!K)return;const s=K;K=null,s.onclose=null,s.onerror=null,s.onmessage=null;try{s.close()}catch{}}function pe(){X=!1,Q++,A(),ce()}function Ce(s,l,v){W&&clearTimeout(W),W=setTimeout(()=>{!X||v!==Q||l!==N||s!==a.value||Promise.all([h(),le(!0),Y(),be()])},100)}function ye(s,l,v){q&&clearTimeout(q),q=setTimeout(()=>{!X||v!==Q||l!==N||s!==a.value||$e(s,l,v)},3e3)}function $e(s,l,v){ce();let T;try{T=zs({board:s})}catch(ee){console.error("Failed to open kanban event stream:",ee),ye(s,l,v);return}K=T,T.onmessage=ee=>{if(!(!X||v!==Q||l!==N||s!==a.value))try{JSON.parse(String(ee.data))?.type==="event"&&Ce(s,l,v)}catch{Ce(s,l,v)}},T.onerror=()=>{K===T&&console.error("Kanban event stream error")},T.onclose=()=>{K===T&&(K=null,ye(s,l,v))}}function fe(){const s=c.value?.capabilities?.find(l=>l.key==="events")?.status;return s==="supported"||s==="partial"||re("events")}function ge(){if(!fe())return!1;X=!0;const s=++Q,l=N,v=a.value;return A(),$e(v,l,s),!0}function Ie(){X&&ge()}function te(s){const l=w(s),v=a.value!==l;return a.value=l,cn(Ve,l),x.value=null,v&&($(),N++,Ie()),l}function Be(s){const l=Me(s),v=w(l),T=v!==l;return te(v),T&&(x.value=`Board "${l}" is unavailable; fell back to "${v}".`),{board:v,recovered:T}}function we(s){return{seq:s(),generation:N,board:a.value}}function k(s,l,v,T){return s===T&&l===N&&v===a.value}async function h(s=!1){const l=++R;B.value=!0;try{const v=await Fs({includeArchived:s});if(l!==R)return;f.value=v,w(a.value)!==a.value&&Be(a.value)}catch(v){l===R&&console.error("Failed to fetch kanban boards:",v)}finally{l===R&&(B.value=!1)}}async function S(){try{c.value=await Vs()}catch(s){console.error("Failed to fetch kanban capabilities:",s)}}async function se(s){const l=await qs(s);return await h(),te(l.slug),await qe(),l}async function Se(){const s=a.value;if(s==="default")throw new Error("Cannot archive the default kanban board");await Ms(s),await h(),te(he),await qe()}async function le(s=!1){const{seq:l,generation:v,board:T}=we(()=>++H),ee=s?0:++J;s||(p.value=!0);try{const _e=await Js({board:T,status:z.value||void 0,assignee:D.value||void 0,includeArchived:!0});k(l,v,T,H)&&(t.value=_e)}catch(_e){k(l,v,T,H)&&console.error("Failed to fetch kanban tasks:",_e)}finally{!s&&ee===J&&(p.value=!1)}}async function Y(){const{seq:s,generation:l,board:v}=we(()=>++G);try{const T=await on({board:v});k(s,l,v,G)&&(n.value=T)}catch(T){k(s,l,v,G)&&console.error("Failed to fetch kanban stats:",T)}}async function be(){const{seq:s,generation:l,board:v}=we(()=>++F);try{const T=await un({board:v});k(s,l,v,F)&&(m.value=T)}catch(T){k(s,l,v,F)&&console.error("Failed to fetch kanban assignees:",T)}}async function Ae(s){const l=a.value,v=await Ws(s,{board:l});return l===a.value&&(t.value.unshift(v),await Promise.all([Y(),h()])),v}async function o(s,l){const v=a.value;if(await Hs(s,l,{board:v}),v===a.value){for(const T of s){const ee=t.value.find(_e=>_e.id===T);ee&&(ee.status="done")}await Promise.all([Y(),h()])}}async function u(s,l){const v=a.value;if(await Gs(s,l,{board:v}),v===a.value){const T=t.value.find(ee=>ee.id===s);T&&(T.status="blocked"),await Promise.all([Y(),h()])}}async function d(s){const l=a.value;if(await js(s,{board:l}),l===a.value){for(const v of s){const T=t.value.find(ee=>ee.id===v);T&&(T.status="ready")}await Promise.all([Y(),h()])}}async function xe(s,l){const v=a.value;if(await Qs(s,l,{board:v}),v===a.value){const T=t.value.find(ee=>ee.id===s);T&&(T.assignee=l),await Promise.all([Y(),be()])}}async function ns(s,l,v){return j("commentsWrite"),Ys(s,{body:l,author:v},{board:a.value})}async function ls(s,l){j("links");const v=a.value,T=await Xs({parent_id:s,child_id:l},{board:v});return v===a.value&&await Promise.all([le(!0),Y(),h()]),T}async function is(s,l){j("links");const v=a.value,T=await Zs({parent_id:s,child_id:l},{board:v});return v===a.value&&await Promise.all([le(!0),Y(),h()]),T}async function rs(s){oe("bulk",["supported","partial"]);const l=a.value,v=await en(s,{board:l});return l===a.value&&await Promise.all([le(!0),Y(),h(),be()]),v}async function os(s,l){return j("taskLog"),an(s,{board:a.value,tail:l})}async function us(s={}){return j("diagnostics"),tn({...s,board:a.value})}async function ds(s,l){j("reclaim");const v=a.value,T=await sn(s,{board:v,reason:l});return v===a.value&&await Promise.all([le(!0),Y(),h()]),T}async function cs(s,l,v={}){j("reassign");const T=a.value,ee=await nn(s,l,{board:T,...v});if(T===a.value){const _e=t.value.find(ms=>ms.id===s);_e&&(_e.assignee=l==="none"?null:l),await Promise.all([Y(),be()])}return ee}async function vs(s,l){j("specify");const v=a.value,T=await ln(s,{board:v,author:l});return v===a.value&&await Promise.all([le(!0),Y(),h()]),T}async function fs(s={}){j("dispatch");const l=a.value,v=await rn({...s,board:l});return l===a.value&&await Promise.all([le(!0),Y(),h()]),v}function ks(s,l){s==="status"?z.value=l:D.value=l}async function qe(){await Promise.all([h(),le(),Y(),be()])}return{tasks:t,stats:n,assignees:m,boards:f,capabilities:c,activeBoards:Z,isCapabilitySupported:re,loading:p,boardsLoading:B,boardWarning:x,selectedBoard:a,filterStatus:z,filterAssignee:D,fetchBoards:h,fetchCapabilities:S,fetchTasks:le,fetchStats:Y,fetchAssignees:be,createTask:Ae,createBoard:se,archiveSelectedBoard:Se,completeTasks:o,blockTask:u,unblockTasks:d,assignTask:xe,addComment:ns,linkTasks:ls,unlinkTasks:is,bulkUpdateTasks:rs,getTaskLog:os,getDiagnostics:us,reclaimTask:ds,reassignTask:cs,specifyTask:vs,dispatch:fs,setFilter:ks,setSelectedBoard:te,startEventStream:ge,stopEventStream:pe,recoverSelectedBoard:Be,resolveAvailableBoard:w,clearBoardScopedState:$,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 vn,Qe=ae((()=>{vn="default"})),ia,ra,oa,ua,da,ca,va,fa,ka,ma,pa,ba,_a,ha,ya,ga,wa,Sa,Ta,Ca,$a,Ba,xa,Pa,Ia,Ra,Aa,Ua,Oa,Da,Ea,Na,La,Ka,za,Fa,qa,Ma,Va,Ja,Wa,Ha,Ga,ja,Qa,Ya,Xa,Za,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,Pe,Zt,Bt=ae((()=>{Re(),Ee(),Ne(),Wt(),Gt(),Yt(),Ge(),Qe(),Us(),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"},Pa={key:2,class:"detail-row"},Ia={class:"detail-label"},Ra={class:"detail-value"},Aa={key:3,class:"detail-row"},Ua={class:"detail-label"},Oa={class:"detail-value"},Da={key:0,class:"detail-section"},Ea={class:"section-title"},Na={class:"detail-body"},La={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"},Xa={key:1,class:"column-empty"},Za={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"},Pe=10,Zt=De({__name:"KanbanTaskDrawer",props:{taskId:{}},emits:["close","updated","navigate"],setup(t,{emit:n}){const m=t,f=n,{t:c}=Le(),p=Ht(),B=He(),x=Fe(),a=g(null),z=g(!1),D=g(null),N=g(""),R=g(!1),H=g(""),G=g(!1),F=g(!1),J=g(""),Q=g(null),K=g(!1),q=g(null),W=g(!1),X=g(""),Z=g(1),re=O(()=>a.value&&(a.value.task.result||a.value.latest_summary)||""),j=O(()=>a.value?c(`kanban.columns.${a.value.task.status}`,a.value.task.status):""),ve=O(()=>{const o=a.value?.task.status;return o!=="done"&&o!=="archived"}),oe=g([]),I=g(!1),w=g(!1),$=O(()=>a.value&&[...a.value.runs].reverse().find(o=>o.profile)?.profile||null);function A(o,u){return m.taskId===o&&x.selectedBoard===u}function ce(){D.value=null,N.value="",R.value=!1,H.value="",G.value=!1,F.value=!1,J.value="",Q.value=null,K.value=!1,q.value=null,W.value=!1,X.value="",Z.value=1,oe.value=[],I.value=!1,w.value=!1}async function pe(){if(!a.value)return;const o=a.value.task.id,u=x.selectedBoard,d=$.value;if(d&&(w.value=!w.value,!!w.value)){I.value=!0;try{const xe=await E(`/api/hermes/kanban/search-sessions?task_id=${encodeURIComponent(o)}&profile=${encodeURIComponent(d)}&board=${encodeURIComponent(u)}`);A(o,u)&&(oe.value=xe.results)}catch{A(o,u)&&(oe.value=[])}finally{A(o,u)&&(I.value=!1)}}}function Ce(){a.value?.session&&(F.value=!0)}const ye=O(()=>{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}),$e=O(()=>je(x.assignees,x.stats?.by_assignee||{}).map(o=>({label:o.name,value:o.name}))),fe=O(()=>{const o=a.value?.runs.length||0;return Math.max(1,Math.ceil(o/Pe))}),ge=O(()=>{const o=a.value?.runs||[],u=(Z.value-1)*Pe;return o.slice(u,u+Pe)}),Ie=O(()=>{const o=a.value?.runs.length||0;if(!o)return"";const u=(Z.value-1)*Pe+1;return`${u}-${Math.min(u+Pe-1,o)} / ${o}`});Oe(()=>[m.taskId,x.selectedBoard],async([o,u])=>{if(ce(),!o){a.value=null;return}z.value=!0;try{const d=await Ue(o,{board:u});A(o,u)&&(a.value=d)}catch{A(o,u)&&B.error(c("kanban.message.loadFailed"))}finally{A(o,u)&&(z.value=!1)}},{immediate:!0}),Oe(()=>a.value?.runs.length||0,()=>{Z.value>fe.value&&(Z.value=fe.value)});function te(o){return o?new Date(o*1e3).toLocaleString():"—"}async function Be(){if(m.taskId){if(!G.value){G.value=!0;return}try{await x.completeTasks([m.taskId],H.value.trim()||void 0),B.success(c("kanban.message.taskCompleted")),G.value=!1,H.value="",f("updated"),f("close")}catch(o){B.error(o.message)}}}async function we(){if(!(!m.taskId||!N.value.trim()))try{await x.blockTask(m.taskId,N.value.trim()),B.success(c("kanban.message.taskBlocked")),R.value=!1,N.value="",f("updated"),f("close")}catch(o){B.error(o.message)}}async function k(){if(m.taskId)try{await x.unblockTasks([m.taskId]),B.success(c("kanban.message.taskUnblocked")),f("updated"),f("close")}catch(o){B.error(o.message)}}async function h(){if(!m.taskId||!D.value)return;const o=m.taskId,u=x.selectedBoard;try{if(await x.assignTask(o,D.value),A(o,u)&&(B.success(c("kanban.message.taskAssigned")),D.value=null),a.value){const d=await Ue(o,{board:u});A(o,u)&&(a.value=d)}f("updated")}catch(d){A(o,u)&&B.error(d.message)}}async function S(){if(!m.taskId||!J.value.trim())return;const o=m.taskId,u=x.selectedBoard;try{await x.addComment(o,J.value.trim());const d=await Ue(o,{board:u});A(o,u)&&(J.value="",a.value=d,B.success(c("kanban.message.commentAdded"))),f("updated")}catch(d){A(o,u)&&B.error(d.message)}}async function se(){if(!m.taskId)return;const o=m.taskId,u=x.selectedBoard;K.value=!0;try{const d=await x.getTaskLog(o,2e4);A(o,u)&&(Q.value=d.exists?d.content:c("kanban.detail.noLog"))}catch(d){A(o,u)&&B.error(d.message)}finally{A(o,u)&&(K.value=!1)}}async function Se(){if(!m.taskId)return;const o=m.taskId,u=x.selectedBoard;W.value=!0;try{const d=await x.getDiagnostics({task:o,severity:"warning"});A(o,u)&&(q.value=d)}catch(d){A(o,u)&&B.error(d.message)}finally{A(o,u)&&(W.value=!1)}}async function le(){if(m.taskId)try{await x.reclaimTask(m.taskId,X.value.trim()||void 0),B.success(c("kanban.message.taskReclaimed")),f("updated"),f("close")}catch(o){B.error(o.message)}}async function Y(){if(!(!m.taskId||!D.value))try{await x.reassignTask(m.taskId,D.value,{reclaim:a.value?.task.status==="running",reason:X.value.trim()||void 0}),B.success(c("kanban.message.taskReassigned")),f("updated"),f("close")}catch(o){B.error(o.message)}}async function be(){if(!m.taskId)return;const o=m.taskId,u=x.selectedBoard;try{await x.specifyTask(o);const d=await Ue(o,{board:u});A(o,u)&&(B.success(c("kanban.message.taskSpecified")),a.value=d),f("updated")}catch(d){B.error(d.message)}}function Ae(o){f("updated"),f("navigate",o)}return(o,u)=>(_(),C(de,null,[b(e(_s),{show:!!t.taskId,width:420,placement:"right","onUpdate:show":u[10]||(u[10]=d=>{d||f("close")})},{default:y(()=>[b(e(hs),{title:a.value?.task.title||"",closable:""},{default:y(()=>[b(e(Je),{show:z.value},{default:y(()=>[a.value?(_(),C(de,{key:0},[i("div",ia,[i("div",ra,[i("span",oa,r(e(c)("kanban.detail.status")),1),i("span",{class:me(["detail-value status-badge",a.value.task.status])},r(j.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?(_(),C("div",ca,[u[13]||(u[13]=i("span",{class:"detail-label"},"Parent",-1)),i("span",va,[(_(!0),C(de,null,ke(a.value.parents,d=>(_(),C("a",{key:d,class:"task-link",onClick:xe=>Ae(d)},r(d),9,fa))),128))])])):P("",!0),a.value.children?.length?(_(),C("div",ka,[u[14]||(u[14]=i("span",{class:"detail-label"},"Children",-1)),i("span",ma,[(_(!0),C(de,null,ke(a.value.children,d=>(_(),C("a",{key:d,class:"task-link",onClick:xe=>Ae(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?(_(),C("div",Pa,[i("span",Ia,r(e(c)("kanban.detail.startedAt")),1),i("span",Ra,r(te(a.value.task.started_at)),1)])):P("",!0),a.value.task.completed_at?(_(),C("div",Aa,[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?(_(),C("div",Da,[i("div",Ea,r(e(c)("kanban.form.body")),1),i("div",Na,r(a.value.task.body),1)])):P("",!0),re.value?(_(),C("div",La,[i("div",Ka,r(e(c)("kanban.detail.result")),1),i("div",{class:"result-summary",onClick:Ce},r(re.value),1)])):P("",!0),ve.value?(_(),C("div",za,[i("div",Fa,r(e(c)("kanban.action.title")),1),i("div",qa,[G.value?(_(),C("div",Ma,[b(e(ie),{value:H.value,"onUpdate:value":u[1]||(u[1]=d=>H.value=d),size:"small",placeholder:e(c)("kanban.action.completeSummary")},null,8,["value","placeholder"]),b(e(L),{size:"small",type:"primary",onClick:Be},{default:y(()=>[U(r(e(c)("common.ok")),1)]),_:1}),b(e(L),{size:"small",onClick:u[2]||(u[2]=d=>{G.value=!1,H.value=""})},{default:y(()=>[U(r(e(c)("common.cancel")),1)]),_:1})])):(_(),ne(e(L),{key:0,size:"small",onClick:u[0]||(u[0]=d=>G.value=!0)},{default:y(()=>[U(r(e(c)("kanban.action.complete")),1)]),_:1})),a.value.task.status==="blocked"?(_(),ne(e(L),{key:2,size:"small",onClick:k},{default:y(()=>[U(r(e(c)("kanban.action.unblock")),1)]),_:1})):(_(),C(de,{key:3},[R.value?(_(),C("div",Va,[b(e(ie),{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:we},{default:y(()=>[U(r(e(c)("common.ok")),1)]),_:1})])):(_(),ne(e(L),{key:0,size:"small",onClick:u[3]||(u[3]=d=>R.value=!0)},{default:y(()=>[U(r(e(c)("kanban.action.block")),1)]),_:1}))],64))]),a.value.task.status!=="running"?(_(),C("div",Ja,[b(e(Te),{value:D.value,"onUpdate:value":u[5]||(u[5]=d=>D.value=d),options:$e.value,size:"small",placeholder:e(c)("kanban.action.assignTo"),style:{flex:"1"}},null,8,["value","options","placeholder"]),b(e(L),{size:"small",disabled:!D.value,onClick:h},{default:y(()=>[U(r(e(c)("kanban.action.assign")),1)]),_:1},8,["disabled"])])):P("",!0),i("div",Wa,[b(e(ie),{value:X.value,"onUpdate:value":u[6]||(u[6]=d=>X.value=d),size:"small",placeholder:e(c)("kanban.action.recoveryReason")},null,8,["value","placeholder"]),b(e(L),{size:"small",secondary:"",onClick:le},{default:y(()=>[U(r(e(c)("kanban.action.reclaim")),1)]),_:1}),b(e(L),{size:"small",secondary:"",disabled:!D.value,onClick:Y},{default:y(()=>[U(r(e(c)("kanban.action.reassign")),1)]),_:1},8,["disabled"]),a.value.task.status==="triage"?(_(),ne(e(L),{key:0,size:"small",secondary:"",onClick:be},{default:y(()=>[U(r(e(c)("kanban.action.specify")),1)]),_:1})):P("",!0)])])):P("",!0),a.value.runs.length>0?(_(),C("div",Ha,[i("div",{class:"section-title",style:{cursor:"pointer"},onClick:pe},[U(r(e(c)("kanban.detail.sessions"))+" ",1),I.value?(_(),ne(e(Je),{key:0,size:12,style:{"margin-left":"6px"}})):P("",!0)]),w.value&&oe.value.length>0?(_(),C("div",Ga,[(_(!0),C(de,null,ke(oe.value,d=>(_(),C("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),w.value&&!I.value&&oe.value.length===0?(_(),C("div",Xa,r(e(c)("kanban.detail.noSessions")),1)):P("",!0)])):P("",!0),a.value.runs.length>0?(_(),C("div",Za,[i("div",et,[i("span",null,r(e(c)("kanban.detail.runs")),1),i("span",at,r(Ie.value),1),fe.value>1?(_(),C("div",tt,[b(e(L),{size:"tiny",secondary:"",disabled:Z.value<=1,onClick:u[7]||(u[7]=d=>Z.value-=1)},{default:y(()=>[...u[15]||(u[15]=[U("‹",-1)])]),_:1},8,["disabled"]),b(e(L),{size:"tiny",secondary:"",disabled:Z.value>=fe.value,onClick:u[8]||(u[8]=d=>Z.value+=1)},{default:y(()=>[...u[16]||(u[16]=[U("›",-1)])]),_:1},8,["disabled"])])):P("",!0)]),(_(!0),C(de,null,ke(ge.value,d=>(_(),C("div",{key:d.id,class:"run-item"},[i("div",st,[i("span",{class:me(["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?(_(),C("div",it,r(d.summary),1)):P("",!0),d.error?(_(),C("div",rt,r(d.error),1)):P("",!0)]))),128))])):P("",!0),a.value.comments.length>0?(_(),C("div",ot,[i("div",ut,r(e(c)("kanban.detail.comments")),1),(_(!0),C(de,null,ke(a.value.comments,d=>(_(),C("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),ve.value?(_(),C("div",kt,[i("div",mt,r(e(c)("kanban.detail.addComment")),1),i("div",pt,[b(e(ie),{value:J.value,"onUpdate:value":u[9]||(u[9]=d=>J.value=d),type:"textarea",rows:3,placeholder:e(c)("kanban.detail.commentPlaceholder")},null,8,["value","placeholder"]),b(e(L),{size:"small",type:"primary",disabled:!J.value.trim(),onClick:S},{default:y(()=>[U(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:y(()=>[U(r(e(c)("kanban.action.loadLog")),1)]),_:1},8,["loading"]),b(e(L),{size:"small",secondary:"",loading:W.value,onClick:Se},{default:y(()=>[U(r(e(c)("kanban.action.loadDiagnostics")),1)]),_:1},8,["loading"])]),Q.value!==null?(_(),C("pre",yt,r(Q.value),1)):P("",!0),q.value!==null?(_(),C("pre",gt,r(JSON.stringify(q.value,null,2)),1)):P("",!0)]),a.value.events.length>0?(_(),C("div",wt,[i("div",St,r(e(c)("kanban.detail.events")),1),(_(!0),C(de,null,ke(a.value.events.slice(-10),d=>(_(),C("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"]),ye.value?(_(),ne(e(We),{key:0,show:F.value,preset:"card",title:a.value?.task.title||"",style:{width:"900px",maxWidth:"calc(100vw - 48px)"},onClose:u[11]||(u[11]=d=>F.value=!1)},{default:y(()=>[i("div",$t,[b(Os,{session:ye.value},null,8,["session"])])]),_:1},8,["show","title"])):P("",!0)],64))}})})),fn=ae((()=>{})),es,kn=ae((()=>{Bt(),Bt(),fn(),Ke(),es=ze(Zt,[["__scopeId","data-v-289879fe"]])})),xt,Pt,as,It=ae((()=>{Re(),Ee(),Ne(),Ge(),Qe(),xt={class:"advanced-row"},Pt={class:"advanced-grid"},as=De({__name:"KanbanCreateForm",emits:["close","created"],setup(t,{emit:n}){const m=n,{t:f}=Le(),c=He(),p=Fe(),B=g(""),x=g(""),a=g(null),z=g(null),D=g(""),N=g(!1),R=g("scratch"),H=g(""),G=g(""),F=g(""),J=g(""),Q=g(null),K=g(!1),q=g(null),W=g(!1),X=O(()=>[{label:f("kanban.card.priority.low"),value:1},{label:f("kanban.card.priority.medium"),value:2},{label:f("kanban.card.priority.high"),value:3}]),Z=O(()=>je(p.assignees,p.stats?.by_assignee||{}).map(I=>({label:I.name,value:I.name}))),re=O(()=>[{label:f("kanban.form.workspaceScratch"),value:"scratch"},{label:f("kanban.form.workspaceDir"),value:"dir"},{label:f("kanban.form.workspaceWorktree"),value:"worktree"}]);function j(){if(R.value==="scratch")return;const I=H.value.trim();return I?`${R.value}:${I}`:R.value}function ve(){const I=F.value.split(",").map(w=>w.trim()).filter(Boolean);return I.length?I:void 0}async function oe(){if(!B.value.trim()){c.warning(f("kanban.form.titleRequired"));return}W.value=!0;try{const I={title:B.value.trim(),body:x.value.trim()||void 0,assignee:a.value||void 0,priority:z.value??void 0},w=D.value.trim(),$=j(),A=G.value.trim(),ce=ve(),pe=J.value.trim();w&&(I.tenant=w),N.value&&(I.triage=!0),$&&(I.workspace=$),R.value==="worktree"&&A&&(I.branch=A),ce&&(I.skills=ce),pe&&(I.maxRuntime=pe),Q.value!==null&&(I.maxRetries=Q.value),K.value&&(I.goalMode=!0,q.value!==null&&(I.goalMaxTurns=q.value)),await p.createTask(I),c.success(f("kanban.message.taskCreated")),m("created"),m("close")}catch(I){c.error(I.message)}finally{W.value=!1}}return(I,w)=>(_(),ne(e(We),{show:!0,preset:"dialog",title:e(f)("kanban.createTask"),style:{width:"480px"},onClose:w[15]||(w[15]=$=>m("close"))},{action:y(()=>[b(e(L),{onClick:w[14]||(w[14]=$=>m("close"))},{default:y(()=>[U(r(e(f)("common.cancel")),1)]),_:1}),b(e(L),{type:"primary",loading:W.value,onClick:oe},{default:y(()=>[U(r(e(f)("common.create")),1)]),_:1},8,["loading"])]),default:y(()=>[b(e(ps),{"label-placement":"top"},{default:y(()=>[b(e(ue),{label:e(f)("kanban.form.title")},{default:y(()=>[b(e(ie),{value:B.value,"onUpdate:value":w[0]||(w[0]=$=>B.value=$),placeholder:e(f)("kanban.form.titlePlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),b(e(ue),{label:e(f)("kanban.form.body")},{default:y(()=>[b(e(ie),{value:x.value,"onUpdate:value":w[1]||(w[1]=$=>x.value=$),type:"textarea",rows:3,placeholder:e(f)("kanban.form.bodyPlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),b(e(ue),{label:e(f)("kanban.form.assignee")},{default:y(()=>[b(e(Te),{value:a.value,"onUpdate:value":w[2]||(w[2]=$=>a.value=$),options:Z.value,placeholder:e(f)("kanban.form.selectAssignee"),clearable:""},null,8,["value","options","placeholder"])]),_:1},8,["label"]),b(e(ue),{label:e(f)("kanban.form.priority")},{default:y(()=>[b(e(Te),{value:z.value,"onUpdate:value":w[3]||(w[3]=$=>z.value=$),options:X.value,placeholder:e(f)("kanban.form.selectPriority"),clearable:""},null,8,["value","options","placeholder"])]),_:1},8,["label"]),b(e(ue),{label:e(f)("kanban.form.tenant")},{default:y(()=>[b(e(ie),{value:D.value,"onUpdate:value":w[4]||(w[4]=$=>D.value=$),placeholder:e(f)("kanban.form.tenantPlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),b(e(ue),{label:e(f)("kanban.form.workspace")},{default:y(()=>[b(e(Te),{value:R.value,"onUpdate:value":w[5]||(w[5]=$=>R.value=$),options:re.value},null,8,["value","options"])]),_:1},8,["label"]),R.value!=="scratch"?(_(),ne(e(ue),{key:0,label:e(f)("kanban.form.workspacePath")},{default:y(()=>[b(e(ie),{value:H.value,"onUpdate:value":w[6]||(w[6]=$=>H.value=$),placeholder:e(f)("kanban.form.workspacePathPlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"])):P("",!0),R.value==="worktree"?(_(),ne(e(ue),{key:1,label:e(f)("kanban.form.branch")},{default:y(()=>[b(e(ie),{value:G.value,"onUpdate:value":w[7]||(w[7]=$=>G.value=$),placeholder:e(f)("kanban.form.branchPlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"])):P("",!0),b(e(ue),{label:e(f)("kanban.form.skills")},{default:y(()=>[b(e(ie),{value:F.value,"onUpdate:value":w[8]||(w[8]=$=>F.value=$),placeholder:e(f)("kanban.form.skillsPlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),i("div",xt,[b(e(Xe),{checked:N.value,"onUpdate:checked":w[9]||(w[9]=$=>N.value=$)},{default:y(()=>[U(r(e(f)("kanban.form.triage")),1)]),_:1},8,["checked"]),b(e(Xe),{checked:K.value,"onUpdate:checked":w[10]||(w[10]=$=>K.value=$)},{default:y(()=>[U(r(e(f)("kanban.form.goalMode")),1)]),_:1},8,["checked"])]),i("div",Pt,[b(e(ue),{label:e(f)("kanban.form.maxRuntime")},{default:y(()=>[b(e(ie),{value:J.value,"onUpdate:value":w[11]||(w[11]=$=>J.value=$),placeholder:e(f)("kanban.form.maxRuntimePlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),b(e(ue),{label:e(f)("kanban.form.maxRetries")},{default:y(()=>[b(e(Ye),{value:Q.value,"onUpdate:value":w[12]||(w[12]=$=>Q.value=$),min:1,max:100,precision:0,placeholder:e(f)("kanban.form.maxRetriesPlaceholder"),clearable:""},null,8,["value","placeholder"])]),_:1},8,["label"]),K.value?(_(),ne(e(ue),{key:0,label:e(f)("kanban.form.goalMaxTurns")},{default:y(()=>[b(e(Ye),{value:q.value,"onUpdate:value":w[13]||(w[13]=$=>q.value=$),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"]))}})})),mn=ae((()=>{})),ts,pn=ae((()=>{It(),It(),mn(),Ke(),ts=ze(as,[["__scopeId","data-v-2e2f2c77"]])})),Rt,At,Ut,Ot,Dt,Et,Nt,Lt,Kt,zt,Ft,qt,Mt,Vt,ss,Jt=ae((()=>{Re(),Ee(),Ne(),Wt(),Es(),kn(),pn(),Ge(),Rs(),Qe(),Rt={class:"kanban-view"},At={class:"page-header"},Ut={class:"header-title"},Ot={class:"header-actions"},Dt={key:0,class:"stats-bar"},Et=["aria-pressed","onClick"],Nt={class:"stat-count"},Lt={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"},ss=De({__name:"KanbanView",setup(t){const{t:n}=Le(),m=$s(),f=Ht(),c=He(),p=Fe(),B=Is(),x=g(!1),a=g(!1),z=g(null),D=g(""),N=g(""),R=g(!1),H=g(null),G=g(!1),F=["triage","todo","scheduled","ready","running","blocked","review","done","archived"],J=g([...F]);function Q(k){return Array.isArray(k)?typeof k[0]=="string"?k[0]:null:typeof k=="string"?k:null}function K(){return Q(m.query.board)}async function q(k){K()!==k&&await f.replace({query:{...m.query,board:k}})}async function W(k,h=!0,S=!1){const se=p.selectedBoard,{board:Se,recovered:le}=p.recoverSelectedBoard(k||p.selectedBoard||"default");z.value=null,x.value=!1,a.value=!1,h&&le&&p.boardWarning&&c.warning(p.boardWarning),await q(Se),(S||Se!==se)&&await p.refreshAll()}function X(k){return`${n("kanban.stats.tasks")}: ${k}`}const Z=O(()=>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} · ${X(h)}`,value:k.slug}})),re=O({get:()=>p.selectedBoard,set:k=>{W(k||"default")}}),j=O(()=>{const k={};for(const h of F)k[h]=p.tasks.filter(S=>S.status===h).sort((S,se)=>se.created_at-S.created_at);return k}),ve=O(()=>{const k=p.filterStatus;return k&&F.includes(k)?[k]:F}),oe=O(()=>je(p.assignees,p.stats?.by_assignee||{})),I=O(()=>Object.fromEntries(B.profiles.map(k=>[k.name,k.avatar||null]))),w=O(()=>[{label:n("kanban.allStatuses"),value:""},...F.map(k=>({label:n(`kanban.columns.${k}`,k),value:k}))]),$=O(()=>[{label:n("kanban.allAssignees"),value:""},...oe.value.map(k=>({label:k.name,value:k.name}))]),A=O({get:()=>p.filterStatus||"",set:k=>p.setFilter("status",k||null)}),ce=O({get:()=>p.filterAssignee||"",set:k=>p.setFilter("assignee",k||null)});Oe(()=>m.query.board,async()=>{G.value&&await W(K(),!1)}),Oe(ve,k=>{J.value=[...k]},{immediate:!0}),bs(async()=>{await Promise.all([p.fetchBoards(),p.fetchCapabilities(),B.profiles.length===0?B.fetchProfiles():Promise.resolve()]),await W(K(),!0,!0),p.startEventStream(),G.value=!0,H.value=setInterval(()=>{document.visibilityState==="visible"&&Promise.all([p.fetchBoards(),p.fetchTasks(!0),p.fetchStats()])},15e3)}),Ss(()=>{p.stopEventStream(),H.value&&clearInterval(H.value)});function pe(k){z.value=k}function Ce(){z.value=null}async function ye(){await Promise.all([p.fetchTasks(),p.fetchStats()])}function $e(k){z.value=k}async function fe(){await p.fetchTasks()}async function ge(k){p.setFilter("status",k),J.value=k?[k]:[...F],await p.fetchTasks()}async function Ie(){await Promise.all([p.fetchTasks(),p.fetchStats(),p.fetchBoards()])}async function te(){const k=D.value.trim();if(!k){c.warning(n("kanban.board.slugRequired"));return}R.value=!0;try{const h=await p.createBoard({slug:k,name:N.value.trim()||void 0});D.value="",N.value="",a.value=!1,await q(h.slug),c.success(n("kanban.board.created"))}catch(h){c.error(h.message)}finally{R.value=!1}}async function Be(){if(p.selectedBoard!=="default"&&window.confirm(n("kanban.board.archiveConfirm"))){R.value=!0;try{await p.archiveSelectedBoard(),await q(he),c.success(n("kanban.board.archived"))}catch(k){c.error(k.message)}finally{R.value=!1}}}async function we(){R.value=!0;try{await p.dispatch(),await p.refreshAll(),c.success(n("kanban.message.dispatchNudged"))}catch(k){c.error(k.message)}finally{R.value=!1}}return(k,h)=>(_(),C("div",Rt,[i("header",At,[i("h2",Ut,r(e(n)("kanban.title")),1),i("div",Ot,[b(e(Te),{value:re.value,"onUpdate:value":h[0]||(h[0]=S=>re.value=S),options:Z.value,loading:e(p).boardsLoading,size:"small",style:{width:"260px"}},null,8,["value","options","loading"]),b(e(L),{size:"small",loading:R.value,onClick:h[1]||(h[1]=S=>a.value=!0)},{default:y(()=>[U(r(e(n)("common.add")),1)]),_:1},8,["loading"]),b(e(L),{size:"small",secondary:"",disabled:e(p).selectedBoard===e(he),loading:R.value,onClick:Be},{default:y(()=>[U(r(e(n)("kanban.board.archive")),1)]),_:1},8,["disabled","loading"]),b(e(L),{size:"small",secondary:"",loading:R.value,onClick:we},{default:y(()=>[U(r(e(n)("kanban.action.dispatch")),1)]),_:1},8,["loading"]),b(e(Te),{value:A.value,"onUpdate:value":[h[2]||(h[2]=S=>A.value=S),fe],options:w.value,size:"small",style:{width:"150px"}},null,8,["value","options"]),b(e(Te),{value:ce.value,"onUpdate:value":[h[3]||(h[3]=S=>ce.value=S),fe],options:$.value,size:"small",style:{width:"170px"}},null,8,["value","options"]),b(e(L),{type:"primary",size:"small",onClick:h[4]||(h[4]=S=>x.value=!0)},{icon:y(()=>[...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:y(()=>[U(" "+r(e(n)("kanban.createTask")),1)]),_:1})])]),e(p).stats?(_(),C("div",Dt,[(_(),C(de,null,ke(F,S=>i("button",{key:S,type:"button",class:me(["stat-chip",[S,{active:e(p).filterStatus===S}]]),"aria-pressed":e(p).filterStatus===S,onClick:se=>ge(S)},[i("span",Nt,r(e(p).stats.by_status[S]||0),1),i("span",Lt,r(e(n)(`kanban.columns.${S}`,S)),1)],10,Et)),64)),i("button",{type:"button",class:me(["stat-chip total",{active:!e(p).filterStatus}]),"aria-pressed":!e(p).filterStatus,onClick:h[5]||(h[5]=S=>ge(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:y(()=>[i("div",qt,[b(e(ys),{"expanded-names":J.value,"onUpdate:expandedNames":h[6]||(h[6]=S=>J.value=S)},{default:y(()=>[(_(!0),C(de,null,ke(ve.value,S=>(_(),ne(e(gs),{key:S,title:`${e(n)(`kanban.columns.${S}`,S)} (${j.value[S].length})`,name:S,class:me(["kanban-column",`status-${S}`])},{header:y(()=>[i("span",{class:me(["column-header",`status-${S}`])},[h[13]||(h[13]=i("span",{class:"status-dot","aria-hidden":"true"},null,-1)),i("span",null,r(e(n)(`kanban.columns.${S}`,S))+" ("+r(j.value[S].length)+")",1)],2)]),default:y(()=>[i("div",{class:me(["task-list",`status-${S}`])},[(_(!0),C(de,null,ke(j.value[S],se=>(_(),ne(Qt,{key:se.id,task:se,"assignee-avatar":se.assignee&&I.value[se.assignee]||null,onClick:Se=>pe(se.id)},null,8,["task","assignee-avatar","onClick"]))),128)),j.value[S].length===0?(_(),C("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(es,{"task-id":z.value,onClose:Ce,onUpdated:ye,onNavigate:$e},null,8,["task-id"]),b(e(We),{show:a.value,"onUpdate:show":h[10]||(h[10]=S=>a.value=S),preset:"dialog",title:e(n)("kanban.board.create"),style:{width:"420px"}},{action:y(()=>[b(e(L),{onClick:h[9]||(h[9]=S=>a.value=!1)},{default:y(()=>[U(r(e(n)("common.cancel")),1)]),_:1}),b(e(L),{type:"primary",loading:R.value,onClick:te},{default:y(()=>[U(r(e(n)("common.create")),1)]),_:1},8,["loading"])]),default:y(()=>[i("div",Vt,[b(e(ie),{value:D.value,"onUpdate:value":h[7]||(h[7]=S=>D.value=S),placeholder:e(n)("kanban.board.slugPlaceholder")},null,8,["value","placeholder"]),b(e(ie),{value:N.value,"onUpdate:value":h[8]||(h[8]=S=>N.value=S),placeholder:e(n)("kanban.board.namePlaceholder")},null,8,["value","placeholder"])])]),_:1},8,["show","title"]),x.value?(_(),ne(ts,{key:1,onClose:h[11]||(h[11]=S=>x.value=!1),onCreated:Ie})):P("",!0)]))}})})),bn=ae((()=>{})),_n,hn=ae((()=>{Jt(),Jt(),bn(),Ke(),_n=ze(ss,[["__scopeId","data-v-7a17a5f4"]])}));hn();export{_n as default};
|
|
1
|
+
import{n as ae}from"./rolldown-runtime-M0oDzQ_3.js";import{$t as de,A as ps,Cn as bs,Dn as ke,E as Ye,I as _s,K as We,Mn as Oe,O as ue,Ot as L,P as hs,Pn as y,Pt as ie,Qn as e,St as ys,Tn as _,V as He,Wn as g,Wt as Re,an as P,bt as gs,dn as De,er as me,g as Je,in as ne,ln as U,mt as Te,nn as O,on as C,ot as ws,rn as i,rr as r,t as Ee,un as b,wn as Ss,wt as Xe}from"./ui-vendor-dYn1tJGA.js";import{_ as Ts,c as Ne,f as Wt,g as Cs,l as Le,m as Ht,p as $s}from"./vue-vendor-DZ4A_GHn.js";import{f as E,n as Ke,o as Bs,s as xs,t as ze,u as Gt}from"./_plugin-vue_export-helper-BIeGRfrQ.js";import{J as Ps,X as Is,Y as Rs,q as As}from"./index-Bkiif2Pf.js";import{n as Us,t as Os}from"./HistoryMessageList-B2QMRyzN.js";var Ze,ea,aa,ta,sa,jt,na=ae((()=>{Re(),Ee(),Ne(),Ps(),Ze={class:"card-title"},ea={class:"card-meta"},aa={class:"meta-tag assignee-tag"},ta={class:"meta-time"},sa={key:0,class:"card-body-preview"},jt=De({__name:"KanbanTaskCard",props:{task:{},assigneeAvatar:{}},emits:["click"],setup(t,{emit:n}){const m=t,f=n,{t:c}=Le(),p=O(()=>{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)})}),B=O(()=>m.task.priority>=3?"high":m.task.priority===2?"medium":"low"),x=O(()=>c(`kanban.card.priority.${B.value}`));return(a,z)=>(_(),C("div",{class:me(["kanban-task-card",`status-${t.task.status}`]),onClick:z[0]||(z[0]=D=>f("click",t.task.id))},[i("div",Ze,r(t.task.title),1),i("div",ea,[t.task.assignee?(_(),ne(e(ws),{key:0,trigger:"hover"},{trigger:y(()=>[i("span",aa,[b(As,{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:y(()=>[U(" "+r(e(c)("kanban.card.assigneeTooltip")),1)]),_:1})):P("",!0),t.task.priority>=2?(_(),C("span",{key:1,class:me(["meta-tag priority-tag",B.value])},r(x.value),3)):P("",!0),i("span",ta,r(p.value),1)]),t.task.body?(_(),C("div",sa,r(t.task.body.slice(0,80))+r(t.task.body.length>80?"...":""),1)):P("",!0)],2))}})})),Ds=ae((()=>{})),Qt,Es=ae((()=>{na(),na(),Ds(),Ke(),Qt=ze(jt,[["__scopeId","data-v-11436d7e"]])}));function Ns(t){return t?.trim()||"default"}function Ls(){try{return localStorage.getItem("hermes_active_profile_name")}catch{return null}}function M(t,n){const m=n.toString();return m?`${t}?${m}`:t}function V(t){const n=new URLSearchParams;return n.set("board",Ns(t)),n}function la(t){return t?t.startsWith("https")?"wss:":"ws:":location.protocol==="https:"?"wss:":"ws:"}function Ks(t){const n=xs(),m=V(t?.board),f=Bs();f&&m.set("token",f);const c=Ls();c&&m.set("profile",c);const p=`/api/hermes/kanban/events?${m.toString()}`;if(n)return`${la(n)}//${new URL(n).host}${p}`;const B=location.host;return`${la()}//${B}${p}`}function zs(t){return new WebSocket(Ks(t))}async function Fs(t){const n=new URLSearchParams;return t?.includeArchived&&n.set("includeArchived","true"),(await E(M("/api/hermes/kanban/boards",n))).boards}async function qs(t){return(await E("/api/hermes/kanban/boards",{method:"POST",body:JSON.stringify(t)})).board}async function Ms(t){return E(`/api/hermes/kanban/boards/${encodeURIComponent(t)}`,{method:"DELETE"})}async function Vs(){return(await E("/api/hermes/kanban/capabilities")).capabilities}async function Js(t){const n=V(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 E(M("/api/hermes/kanban",n))).tasks}async function Ue(t,n){return E(M(`/api/hermes/kanban/${encodeURIComponent(t)}`,V(n?.board)))}async function Ws(t,n){return(await E(M("/api/hermes/kanban",V(n?.board)),{method:"POST",body:JSON.stringify(t)})).task}async function Hs(t,n,m){return E(M("/api/hermes/kanban/complete",V(m?.board)),{method:"POST",body:JSON.stringify({task_ids:t,summary:n})})}async function Gs(t,n,m){return E(M(`/api/hermes/kanban/${encodeURIComponent(t)}/block`,V(m?.board)),{method:"POST",body:JSON.stringify({reason:n})})}async function js(t,n){return E(M("/api/hermes/kanban/unblock",V(n?.board)),{method:"POST",body:JSON.stringify({task_ids:t})})}async function Qs(t,n,m){return E(M(`/api/hermes/kanban/${encodeURIComponent(t)}/assign`,V(m?.board)),{method:"POST",body:JSON.stringify({profile:n})})}async function Ys(t,n,m){return E(M(`/api/hermes/kanban/${encodeURIComponent(t)}/comments`,V(m?.board)),{method:"POST",body:JSON.stringify(n)})}async function Xs(t,n){return E(M("/api/hermes/kanban/links",V(n?.board)),{method:"POST",body:JSON.stringify(t)})}async function Zs(t,n){const m=V(n?.board);return m.set("parent_id",t.parent_id),m.set("child_id",t.child_id),E(M("/api/hermes/kanban/links",m),{method:"DELETE"})}async function en(t,n){return E(M("/api/hermes/kanban/tasks/bulk",V(n?.board)),{method:"POST",body:JSON.stringify(t)})}async function an(t,n){const m=V(n?.board);return n?.tail!==void 0&&m.set("tail",String(n.tail)),E(M(`/api/hermes/kanban/${encodeURIComponent(t)}/log`,m))}async function tn(t){const n=V(t?.board);return t?.task&&n.set("task",t.task),t?.severity&&n.set("severity",t.severity),(await E(M("/api/hermes/kanban/diagnostics",n))).diagnostics}async function sn(t,n){return E(M(`/api/hermes/kanban/${encodeURIComponent(t)}/reclaim`,V(n?.board)),{method:"POST",body:JSON.stringify({reason:n?.reason})})}async function nn(t,n,m){return E(M(`/api/hermes/kanban/${encodeURIComponent(t)}/reassign`,V(m?.board)),{method:"POST",body:JSON.stringify({profile:n,reclaim:m?.reclaim,reason:m?.reason})})}async function ln(t,n){return(await E(M(`/api/hermes/kanban/${encodeURIComponent(t)}/specify`,V(n?.board)),{method:"POST",body:JSON.stringify({author:n?.author})})).results}async function rn(t){return(await E(M("/api/hermes/kanban/dispatch",V(t?.board)),{method:"POST",body:JSON.stringify({dryRun:t?.dryRun,max:t?.max,failureLimit:t?.failureLimit})})).result}async function on(t){return(await E(M("/api/hermes/kanban/stats",V(t?.board)))).stats}async function un(t){return(await E(M("/api/hermes/kanban/assignees",V(t?.board)))).assignees}var Yt=ae((()=>{Gt()}));function dn(t){if(typeof window>"u")return null;try{return window.localStorage.getItem(t)}catch{return null}}function cn(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:he}var Ve,he,Xt,Fe,Ge=ae((()=>{Ts(),Re(),Yt(),Ve="hermes.kanban.selectedBoard",he="default",Xt=/^[a-z0-9][a-z0-9_-]{0,63}$/,Fe=Cs("kanban",()=>{const t=g([]),n=g(null),m=g([]),f=g([]),c=g(null),p=g(!1),B=g(!1),x=g(null),a=g(Me(dn(Ve))),z=g(null),D=g(null);let N=0,R=0,H=0,G=0,F=0,J=0,Q=0,K=null,q=null,W=null,X=!1;const Z=O(()=>{const s=f.value.filter(l=>!l.archived);return s.some(l=>l.slug==="default")?s:[{slug:he,name:"Default",description:"",icon:"",color:"",created_at:null,archived:!1,counts:{},total:0},...s]});function re(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 j(s){if(!re(s))throw new Error(`Kanban capability "${s}" is not supported by the current Hermes backend`)}function ve(s,l){const v=c.value?.capabilities?.find(T=>T.key===s);return v?l.includes(v.status):l.includes("supported")?re(s):!1}function oe(s,l){if(!ve(s,l))throw new Error(`Kanban capability "${s}" is not available with the required status`)}function I(s){return Z.value.some(l=>l.slug===s)}function w(s){const l=Me(s);return f.value.length>0&&!I(l)?he:l}function $(){t.value=[],n.value=null,m.value=[]}function A(){q&&clearTimeout(q),W&&clearTimeout(W),q=null,W=null}function ce(){if(!K)return;const s=K;K=null,s.onclose=null,s.onerror=null,s.onmessage=null;try{s.close()}catch{}}function pe(){X=!1,Q++,A(),ce()}function Ce(s,l,v){W&&clearTimeout(W),W=setTimeout(()=>{!X||v!==Q||l!==N||s!==a.value||Promise.all([h(),le(!0),Y(),be()])},100)}function ye(s,l,v){q&&clearTimeout(q),q=setTimeout(()=>{!X||v!==Q||l!==N||s!==a.value||$e(s,l,v)},3e3)}function $e(s,l,v){ce();let T;try{T=zs({board:s})}catch(ee){console.error("Failed to open kanban event stream:",ee),ye(s,l,v);return}K=T,T.onmessage=ee=>{if(!(!X||v!==Q||l!==N||s!==a.value))try{JSON.parse(String(ee.data))?.type==="event"&&Ce(s,l,v)}catch{Ce(s,l,v)}},T.onerror=()=>{K===T&&console.error("Kanban event stream error")},T.onclose=()=>{K===T&&(K=null,ye(s,l,v))}}function fe(){const s=c.value?.capabilities?.find(l=>l.key==="events")?.status;return s==="supported"||s==="partial"||re("events")}function ge(){if(!fe())return!1;X=!0;const s=++Q,l=N,v=a.value;return A(),$e(v,l,s),!0}function Ie(){X&&ge()}function te(s){const l=w(s),v=a.value!==l;return a.value=l,cn(Ve,l),x.value=null,v&&($(),N++,Ie()),l}function Be(s){const l=Me(s),v=w(l),T=v!==l;return te(v),T&&(x.value=`Board "${l}" is unavailable; fell back to "${v}".`),{board:v,recovered:T}}function we(s){return{seq:s(),generation:N,board:a.value}}function k(s,l,v,T){return s===T&&l===N&&v===a.value}async function h(s=!1){const l=++R;B.value=!0;try{const v=await Fs({includeArchived:s});if(l!==R)return;f.value=v,w(a.value)!==a.value&&Be(a.value)}catch(v){l===R&&console.error("Failed to fetch kanban boards:",v)}finally{l===R&&(B.value=!1)}}async function S(){try{c.value=await Vs()}catch(s){console.error("Failed to fetch kanban capabilities:",s)}}async function se(s){const l=await qs(s);return await h(),te(l.slug),await qe(),l}async function Se(){const s=a.value;if(s==="default")throw new Error("Cannot archive the default kanban board");await Ms(s),await h(),te(he),await qe()}async function le(s=!1){const{seq:l,generation:v,board:T}=we(()=>++H),ee=s?0:++J;s||(p.value=!0);try{const _e=await Js({board:T,status:z.value||void 0,assignee:D.value||void 0,includeArchived:!0});k(l,v,T,H)&&(t.value=_e)}catch(_e){k(l,v,T,H)&&console.error("Failed to fetch kanban tasks:",_e)}finally{!s&&ee===J&&(p.value=!1)}}async function Y(){const{seq:s,generation:l,board:v}=we(()=>++G);try{const T=await on({board:v});k(s,l,v,G)&&(n.value=T)}catch(T){k(s,l,v,G)&&console.error("Failed to fetch kanban stats:",T)}}async function be(){const{seq:s,generation:l,board:v}=we(()=>++F);try{const T=await un({board:v});k(s,l,v,F)&&(m.value=T)}catch(T){k(s,l,v,F)&&console.error("Failed to fetch kanban assignees:",T)}}async function Ae(s){const l=a.value,v=await Ws(s,{board:l});return l===a.value&&(t.value.unshift(v),await Promise.all([Y(),h()])),v}async function o(s,l){const v=a.value;if(await Hs(s,l,{board:v}),v===a.value){for(const T of s){const ee=t.value.find(_e=>_e.id===T);ee&&(ee.status="done")}await Promise.all([Y(),h()])}}async function u(s,l){const v=a.value;if(await Gs(s,l,{board:v}),v===a.value){const T=t.value.find(ee=>ee.id===s);T&&(T.status="blocked"),await Promise.all([Y(),h()])}}async function d(s){const l=a.value;if(await js(s,{board:l}),l===a.value){for(const v of s){const T=t.value.find(ee=>ee.id===v);T&&(T.status="ready")}await Promise.all([Y(),h()])}}async function xe(s,l){const v=a.value;if(await Qs(s,l,{board:v}),v===a.value){const T=t.value.find(ee=>ee.id===s);T&&(T.assignee=l),await Promise.all([Y(),be()])}}async function ns(s,l,v){return j("commentsWrite"),Ys(s,{body:l,author:v},{board:a.value})}async function ls(s,l){j("links");const v=a.value,T=await Xs({parent_id:s,child_id:l},{board:v});return v===a.value&&await Promise.all([le(!0),Y(),h()]),T}async function is(s,l){j("links");const v=a.value,T=await Zs({parent_id:s,child_id:l},{board:v});return v===a.value&&await Promise.all([le(!0),Y(),h()]),T}async function rs(s){oe("bulk",["supported","partial"]);const l=a.value,v=await en(s,{board:l});return l===a.value&&await Promise.all([le(!0),Y(),h(),be()]),v}async function os(s,l){return j("taskLog"),an(s,{board:a.value,tail:l})}async function us(s={}){return j("diagnostics"),tn({...s,board:a.value})}async function ds(s,l){j("reclaim");const v=a.value,T=await sn(s,{board:v,reason:l});return v===a.value&&await Promise.all([le(!0),Y(),h()]),T}async function cs(s,l,v={}){j("reassign");const T=a.value,ee=await nn(s,l,{board:T,...v});if(T===a.value){const _e=t.value.find(ms=>ms.id===s);_e&&(_e.assignee=l==="none"?null:l),await Promise.all([Y(),be()])}return ee}async function vs(s,l){j("specify");const v=a.value,T=await ln(s,{board:v,author:l});return v===a.value&&await Promise.all([le(!0),Y(),h()]),T}async function fs(s={}){j("dispatch");const l=a.value,v=await rn({...s,board:l});return l===a.value&&await Promise.all([le(!0),Y(),h()]),v}function ks(s,l){s==="status"?z.value=l:D.value=l}async function qe(){await Promise.all([h(),le(),Y(),be()])}return{tasks:t,stats:n,assignees:m,boards:f,capabilities:c,activeBoards:Z,isCapabilitySupported:re,loading:p,boardsLoading:B,boardWarning:x,selectedBoard:a,filterStatus:z,filterAssignee:D,fetchBoards:h,fetchCapabilities:S,fetchTasks:le,fetchStats:Y,fetchAssignees:be,createTask:Ae,createBoard:se,archiveSelectedBoard:Se,completeTasks:o,blockTask:u,unblockTasks:d,assignTask:xe,addComment:ns,linkTasks:ls,unlinkTasks:is,bulkUpdateTasks:rs,getTaskLog:os,getDiagnostics:us,reclaimTask:ds,reassignTask:cs,specifyTask:vs,dispatch:fs,setFilter:ks,setSelectedBoard:te,startEventStream:ge,stopEventStream:pe,recoverSelectedBoard:Be,resolveAvailableBoard:w,clearBoardScopedState:$,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 vn,Qe=ae((()=>{vn="default"})),ia,ra,oa,ua,da,ca,va,fa,ka,ma,pa,ba,_a,ha,ya,ga,wa,Sa,Ta,Ca,$a,Ba,xa,Pa,Ia,Ra,Aa,Ua,Oa,Da,Ea,Na,La,Ka,za,Fa,qa,Ma,Va,Ja,Wa,Ha,Ga,ja,Qa,Ya,Xa,Za,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,Pe,Zt,Bt=ae((()=>{Re(),Ee(),Ne(),Wt(),Gt(),Yt(),Ge(),Qe(),Us(),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"},Pa={key:2,class:"detail-row"},Ia={class:"detail-label"},Ra={class:"detail-value"},Aa={key:3,class:"detail-row"},Ua={class:"detail-label"},Oa={class:"detail-value"},Da={key:0,class:"detail-section"},Ea={class:"section-title"},Na={class:"detail-body"},La={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"},Xa={key:1,class:"column-empty"},Za={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"},Pe=10,Zt=De({__name:"KanbanTaskDrawer",props:{taskId:{}},emits:["close","updated","navigate"],setup(t,{emit:n}){const m=t,f=n,{t:c}=Le(),p=Ht(),B=He(),x=Fe(),a=g(null),z=g(!1),D=g(null),N=g(""),R=g(!1),H=g(""),G=g(!1),F=g(!1),J=g(""),Q=g(null),K=g(!1),q=g(null),W=g(!1),X=g(""),Z=g(1),re=O(()=>a.value&&(a.value.task.result||a.value.latest_summary)||""),j=O(()=>a.value?c(`kanban.columns.${a.value.task.status}`,a.value.task.status):""),ve=O(()=>{const o=a.value?.task.status;return o!=="done"&&o!=="archived"}),oe=g([]),I=g(!1),w=g(!1),$=O(()=>a.value&&[...a.value.runs].reverse().find(o=>o.profile)?.profile||null);function A(o,u){return m.taskId===o&&x.selectedBoard===u}function ce(){D.value=null,N.value="",R.value=!1,H.value="",G.value=!1,F.value=!1,J.value="",Q.value=null,K.value=!1,q.value=null,W.value=!1,X.value="",Z.value=1,oe.value=[],I.value=!1,w.value=!1}async function pe(){if(!a.value)return;const o=a.value.task.id,u=x.selectedBoard,d=$.value;if(d&&(w.value=!w.value,!!w.value)){I.value=!0;try{const xe=await E(`/api/hermes/kanban/search-sessions?task_id=${encodeURIComponent(o)}&profile=${encodeURIComponent(d)}&board=${encodeURIComponent(u)}`);A(o,u)&&(oe.value=xe.results)}catch{A(o,u)&&(oe.value=[])}finally{A(o,u)&&(I.value=!1)}}}function Ce(){a.value?.session&&(F.value=!0)}const ye=O(()=>{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}),$e=O(()=>je(x.assignees,x.stats?.by_assignee||{}).map(o=>({label:o.name,value:o.name}))),fe=O(()=>{const o=a.value?.runs.length||0;return Math.max(1,Math.ceil(o/Pe))}),ge=O(()=>{const o=a.value?.runs||[],u=(Z.value-1)*Pe;return o.slice(u,u+Pe)}),Ie=O(()=>{const o=a.value?.runs.length||0;if(!o)return"";const u=(Z.value-1)*Pe+1;return`${u}-${Math.min(u+Pe-1,o)} / ${o}`});Oe(()=>[m.taskId,x.selectedBoard],async([o,u])=>{if(ce(),!o){a.value=null;return}z.value=!0;try{const d=await Ue(o,{board:u});A(o,u)&&(a.value=d)}catch{A(o,u)&&B.error(c("kanban.message.loadFailed"))}finally{A(o,u)&&(z.value=!1)}},{immediate:!0}),Oe(()=>a.value?.runs.length||0,()=>{Z.value>fe.value&&(Z.value=fe.value)});function te(o){return o?new Date(o*1e3).toLocaleString():"—"}async function Be(){if(m.taskId){if(!G.value){G.value=!0;return}try{await x.completeTasks([m.taskId],H.value.trim()||void 0),B.success(c("kanban.message.taskCompleted")),G.value=!1,H.value="",f("updated"),f("close")}catch(o){B.error(o.message)}}}async function we(){if(!(!m.taskId||!N.value.trim()))try{await x.blockTask(m.taskId,N.value.trim()),B.success(c("kanban.message.taskBlocked")),R.value=!1,N.value="",f("updated"),f("close")}catch(o){B.error(o.message)}}async function k(){if(m.taskId)try{await x.unblockTasks([m.taskId]),B.success(c("kanban.message.taskUnblocked")),f("updated"),f("close")}catch(o){B.error(o.message)}}async function h(){if(!m.taskId||!D.value)return;const o=m.taskId,u=x.selectedBoard;try{if(await x.assignTask(o,D.value),A(o,u)&&(B.success(c("kanban.message.taskAssigned")),D.value=null),a.value){const d=await Ue(o,{board:u});A(o,u)&&(a.value=d)}f("updated")}catch(d){A(o,u)&&B.error(d.message)}}async function S(){if(!m.taskId||!J.value.trim())return;const o=m.taskId,u=x.selectedBoard;try{await x.addComment(o,J.value.trim());const d=await Ue(o,{board:u});A(o,u)&&(J.value="",a.value=d,B.success(c("kanban.message.commentAdded"))),f("updated")}catch(d){A(o,u)&&B.error(d.message)}}async function se(){if(!m.taskId)return;const o=m.taskId,u=x.selectedBoard;K.value=!0;try{const d=await x.getTaskLog(o,2e4);A(o,u)&&(Q.value=d.exists?d.content:c("kanban.detail.noLog"))}catch(d){A(o,u)&&B.error(d.message)}finally{A(o,u)&&(K.value=!1)}}async function Se(){if(!m.taskId)return;const o=m.taskId,u=x.selectedBoard;W.value=!0;try{const d=await x.getDiagnostics({task:o,severity:"warning"});A(o,u)&&(q.value=d)}catch(d){A(o,u)&&B.error(d.message)}finally{A(o,u)&&(W.value=!1)}}async function le(){if(m.taskId)try{await x.reclaimTask(m.taskId,X.value.trim()||void 0),B.success(c("kanban.message.taskReclaimed")),f("updated"),f("close")}catch(o){B.error(o.message)}}async function Y(){if(!(!m.taskId||!D.value))try{await x.reassignTask(m.taskId,D.value,{reclaim:a.value?.task.status==="running",reason:X.value.trim()||void 0}),B.success(c("kanban.message.taskReassigned")),f("updated"),f("close")}catch(o){B.error(o.message)}}async function be(){if(!m.taskId)return;const o=m.taskId,u=x.selectedBoard;try{await x.specifyTask(o);const d=await Ue(o,{board:u});A(o,u)&&(B.success(c("kanban.message.taskSpecified")),a.value=d),f("updated")}catch(d){B.error(d.message)}}function Ae(o){f("updated"),f("navigate",o)}return(o,u)=>(_(),C(de,null,[b(e(_s),{show:!!t.taskId,width:420,placement:"right","onUpdate:show":u[10]||(u[10]=d=>{d||f("close")})},{default:y(()=>[b(e(hs),{title:a.value?.task.title||"",closable:""},{default:y(()=>[b(e(Je),{show:z.value},{default:y(()=>[a.value?(_(),C(de,{key:0},[i("div",ia,[i("div",ra,[i("span",oa,r(e(c)("kanban.detail.status")),1),i("span",{class:me(["detail-value status-badge",a.value.task.status])},r(j.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?(_(),C("div",ca,[u[13]||(u[13]=i("span",{class:"detail-label"},"Parent",-1)),i("span",va,[(_(!0),C(de,null,ke(a.value.parents,d=>(_(),C("a",{key:d,class:"task-link",onClick:xe=>Ae(d)},r(d),9,fa))),128))])])):P("",!0),a.value.children?.length?(_(),C("div",ka,[u[14]||(u[14]=i("span",{class:"detail-label"},"Children",-1)),i("span",ma,[(_(!0),C(de,null,ke(a.value.children,d=>(_(),C("a",{key:d,class:"task-link",onClick:xe=>Ae(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?(_(),C("div",Pa,[i("span",Ia,r(e(c)("kanban.detail.startedAt")),1),i("span",Ra,r(te(a.value.task.started_at)),1)])):P("",!0),a.value.task.completed_at?(_(),C("div",Aa,[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?(_(),C("div",Da,[i("div",Ea,r(e(c)("kanban.form.body")),1),i("div",Na,r(a.value.task.body),1)])):P("",!0),re.value?(_(),C("div",La,[i("div",Ka,r(e(c)("kanban.detail.result")),1),i("div",{class:"result-summary",onClick:Ce},r(re.value),1)])):P("",!0),ve.value?(_(),C("div",za,[i("div",Fa,r(e(c)("kanban.action.title")),1),i("div",qa,[G.value?(_(),C("div",Ma,[b(e(ie),{value:H.value,"onUpdate:value":u[1]||(u[1]=d=>H.value=d),size:"small",placeholder:e(c)("kanban.action.completeSummary")},null,8,["value","placeholder"]),b(e(L),{size:"small",type:"primary",onClick:Be},{default:y(()=>[U(r(e(c)("common.ok")),1)]),_:1}),b(e(L),{size:"small",onClick:u[2]||(u[2]=d=>{G.value=!1,H.value=""})},{default:y(()=>[U(r(e(c)("common.cancel")),1)]),_:1})])):(_(),ne(e(L),{key:0,size:"small",onClick:u[0]||(u[0]=d=>G.value=!0)},{default:y(()=>[U(r(e(c)("kanban.action.complete")),1)]),_:1})),a.value.task.status==="blocked"?(_(),ne(e(L),{key:2,size:"small",onClick:k},{default:y(()=>[U(r(e(c)("kanban.action.unblock")),1)]),_:1})):(_(),C(de,{key:3},[R.value?(_(),C("div",Va,[b(e(ie),{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:we},{default:y(()=>[U(r(e(c)("common.ok")),1)]),_:1})])):(_(),ne(e(L),{key:0,size:"small",onClick:u[3]||(u[3]=d=>R.value=!0)},{default:y(()=>[U(r(e(c)("kanban.action.block")),1)]),_:1}))],64))]),a.value.task.status!=="running"?(_(),C("div",Ja,[b(e(Te),{value:D.value,"onUpdate:value":u[5]||(u[5]=d=>D.value=d),options:$e.value,size:"small",placeholder:e(c)("kanban.action.assignTo"),style:{flex:"1"}},null,8,["value","options","placeholder"]),b(e(L),{size:"small",disabled:!D.value,onClick:h},{default:y(()=>[U(r(e(c)("kanban.action.assign")),1)]),_:1},8,["disabled"])])):P("",!0),i("div",Wa,[b(e(ie),{value:X.value,"onUpdate:value":u[6]||(u[6]=d=>X.value=d),size:"small",placeholder:e(c)("kanban.action.recoveryReason")},null,8,["value","placeholder"]),b(e(L),{size:"small",secondary:"",onClick:le},{default:y(()=>[U(r(e(c)("kanban.action.reclaim")),1)]),_:1}),b(e(L),{size:"small",secondary:"",disabled:!D.value,onClick:Y},{default:y(()=>[U(r(e(c)("kanban.action.reassign")),1)]),_:1},8,["disabled"]),a.value.task.status==="triage"?(_(),ne(e(L),{key:0,size:"small",secondary:"",onClick:be},{default:y(()=>[U(r(e(c)("kanban.action.specify")),1)]),_:1})):P("",!0)])])):P("",!0),a.value.runs.length>0?(_(),C("div",Ha,[i("div",{class:"section-title",style:{cursor:"pointer"},onClick:pe},[U(r(e(c)("kanban.detail.sessions"))+" ",1),I.value?(_(),ne(e(Je),{key:0,size:12,style:{"margin-left":"6px"}})):P("",!0)]),w.value&&oe.value.length>0?(_(),C("div",Ga,[(_(!0),C(de,null,ke(oe.value,d=>(_(),C("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),w.value&&!I.value&&oe.value.length===0?(_(),C("div",Xa,r(e(c)("kanban.detail.noSessions")),1)):P("",!0)])):P("",!0),a.value.runs.length>0?(_(),C("div",Za,[i("div",et,[i("span",null,r(e(c)("kanban.detail.runs")),1),i("span",at,r(Ie.value),1),fe.value>1?(_(),C("div",tt,[b(e(L),{size:"tiny",secondary:"",disabled:Z.value<=1,onClick:u[7]||(u[7]=d=>Z.value-=1)},{default:y(()=>[...u[15]||(u[15]=[U("‹",-1)])]),_:1},8,["disabled"]),b(e(L),{size:"tiny",secondary:"",disabled:Z.value>=fe.value,onClick:u[8]||(u[8]=d=>Z.value+=1)},{default:y(()=>[...u[16]||(u[16]=[U("›",-1)])]),_:1},8,["disabled"])])):P("",!0)]),(_(!0),C(de,null,ke(ge.value,d=>(_(),C("div",{key:d.id,class:"run-item"},[i("div",st,[i("span",{class:me(["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?(_(),C("div",it,r(d.summary),1)):P("",!0),d.error?(_(),C("div",rt,r(d.error),1)):P("",!0)]))),128))])):P("",!0),a.value.comments.length>0?(_(),C("div",ot,[i("div",ut,r(e(c)("kanban.detail.comments")),1),(_(!0),C(de,null,ke(a.value.comments,d=>(_(),C("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),ve.value?(_(),C("div",kt,[i("div",mt,r(e(c)("kanban.detail.addComment")),1),i("div",pt,[b(e(ie),{value:J.value,"onUpdate:value":u[9]||(u[9]=d=>J.value=d),type:"textarea",rows:3,placeholder:e(c)("kanban.detail.commentPlaceholder")},null,8,["value","placeholder"]),b(e(L),{size:"small",type:"primary",disabled:!J.value.trim(),onClick:S},{default:y(()=>[U(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:y(()=>[U(r(e(c)("kanban.action.loadLog")),1)]),_:1},8,["loading"]),b(e(L),{size:"small",secondary:"",loading:W.value,onClick:Se},{default:y(()=>[U(r(e(c)("kanban.action.loadDiagnostics")),1)]),_:1},8,["loading"])]),Q.value!==null?(_(),C("pre",yt,r(Q.value),1)):P("",!0),q.value!==null?(_(),C("pre",gt,r(JSON.stringify(q.value,null,2)),1)):P("",!0)]),a.value.events.length>0?(_(),C("div",wt,[i("div",St,r(e(c)("kanban.detail.events")),1),(_(!0),C(de,null,ke(a.value.events.slice(-10),d=>(_(),C("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"]),ye.value?(_(),ne(e(We),{key:0,show:F.value,preset:"card",title:a.value?.task.title||"",style:{width:"900px",maxWidth:"calc(100vw - 48px)"},onClose:u[11]||(u[11]=d=>F.value=!1)},{default:y(()=>[i("div",$t,[b(Os,{session:ye.value},null,8,["session"])])]),_:1},8,["show","title"])):P("",!0)],64))}})})),fn=ae((()=>{})),es,kn=ae((()=>{Bt(),Bt(),fn(),Ke(),es=ze(Zt,[["__scopeId","data-v-289879fe"]])})),xt,Pt,as,It=ae((()=>{Re(),Ee(),Ne(),Ge(),Qe(),xt={class:"advanced-row"},Pt={class:"advanced-grid"},as=De({__name:"KanbanCreateForm",emits:["close","created"],setup(t,{emit:n}){const m=n,{t:f}=Le(),c=He(),p=Fe(),B=g(""),x=g(""),a=g(null),z=g(null),D=g(""),N=g(!1),R=g("scratch"),H=g(""),G=g(""),F=g(""),J=g(""),Q=g(null),K=g(!1),q=g(null),W=g(!1),X=O(()=>[{label:f("kanban.card.priority.low"),value:1},{label:f("kanban.card.priority.medium"),value:2},{label:f("kanban.card.priority.high"),value:3}]),Z=O(()=>je(p.assignees,p.stats?.by_assignee||{}).map(I=>({label:I.name,value:I.name}))),re=O(()=>[{label:f("kanban.form.workspaceScratch"),value:"scratch"},{label:f("kanban.form.workspaceDir"),value:"dir"},{label:f("kanban.form.workspaceWorktree"),value:"worktree"}]);function j(){if(R.value==="scratch")return;const I=H.value.trim();return I?`${R.value}:${I}`:R.value}function ve(){const I=F.value.split(",").map(w=>w.trim()).filter(Boolean);return I.length?I:void 0}async function oe(){if(!B.value.trim()){c.warning(f("kanban.form.titleRequired"));return}W.value=!0;try{const I={title:B.value.trim(),body:x.value.trim()||void 0,assignee:a.value||void 0,priority:z.value??void 0},w=D.value.trim(),$=j(),A=G.value.trim(),ce=ve(),pe=J.value.trim();w&&(I.tenant=w),N.value&&(I.triage=!0),$&&(I.workspace=$),R.value==="worktree"&&A&&(I.branch=A),ce&&(I.skills=ce),pe&&(I.maxRuntime=pe),Q.value!==null&&(I.maxRetries=Q.value),K.value&&(I.goalMode=!0,q.value!==null&&(I.goalMaxTurns=q.value)),await p.createTask(I),c.success(f("kanban.message.taskCreated")),m("created"),m("close")}catch(I){c.error(I.message)}finally{W.value=!1}}return(I,w)=>(_(),ne(e(We),{show:!0,preset:"dialog",title:e(f)("kanban.createTask"),style:{width:"480px"},onClose:w[15]||(w[15]=$=>m("close"))},{action:y(()=>[b(e(L),{onClick:w[14]||(w[14]=$=>m("close"))},{default:y(()=>[U(r(e(f)("common.cancel")),1)]),_:1}),b(e(L),{type:"primary",loading:W.value,onClick:oe},{default:y(()=>[U(r(e(f)("common.create")),1)]),_:1},8,["loading"])]),default:y(()=>[b(e(ps),{"label-placement":"top"},{default:y(()=>[b(e(ue),{label:e(f)("kanban.form.title")},{default:y(()=>[b(e(ie),{value:B.value,"onUpdate:value":w[0]||(w[0]=$=>B.value=$),placeholder:e(f)("kanban.form.titlePlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),b(e(ue),{label:e(f)("kanban.form.body")},{default:y(()=>[b(e(ie),{value:x.value,"onUpdate:value":w[1]||(w[1]=$=>x.value=$),type:"textarea",rows:3,placeholder:e(f)("kanban.form.bodyPlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),b(e(ue),{label:e(f)("kanban.form.assignee")},{default:y(()=>[b(e(Te),{value:a.value,"onUpdate:value":w[2]||(w[2]=$=>a.value=$),options:Z.value,placeholder:e(f)("kanban.form.selectAssignee"),clearable:""},null,8,["value","options","placeholder"])]),_:1},8,["label"]),b(e(ue),{label:e(f)("kanban.form.priority")},{default:y(()=>[b(e(Te),{value:z.value,"onUpdate:value":w[3]||(w[3]=$=>z.value=$),options:X.value,placeholder:e(f)("kanban.form.selectPriority"),clearable:""},null,8,["value","options","placeholder"])]),_:1},8,["label"]),b(e(ue),{label:e(f)("kanban.form.tenant")},{default:y(()=>[b(e(ie),{value:D.value,"onUpdate:value":w[4]||(w[4]=$=>D.value=$),placeholder:e(f)("kanban.form.tenantPlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),b(e(ue),{label:e(f)("kanban.form.workspace")},{default:y(()=>[b(e(Te),{value:R.value,"onUpdate:value":w[5]||(w[5]=$=>R.value=$),options:re.value},null,8,["value","options"])]),_:1},8,["label"]),R.value!=="scratch"?(_(),ne(e(ue),{key:0,label:e(f)("kanban.form.workspacePath")},{default:y(()=>[b(e(ie),{value:H.value,"onUpdate:value":w[6]||(w[6]=$=>H.value=$),placeholder:e(f)("kanban.form.workspacePathPlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"])):P("",!0),R.value==="worktree"?(_(),ne(e(ue),{key:1,label:e(f)("kanban.form.branch")},{default:y(()=>[b(e(ie),{value:G.value,"onUpdate:value":w[7]||(w[7]=$=>G.value=$),placeholder:e(f)("kanban.form.branchPlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"])):P("",!0),b(e(ue),{label:e(f)("kanban.form.skills")},{default:y(()=>[b(e(ie),{value:F.value,"onUpdate:value":w[8]||(w[8]=$=>F.value=$),placeholder:e(f)("kanban.form.skillsPlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),i("div",xt,[b(e(Xe),{checked:N.value,"onUpdate:checked":w[9]||(w[9]=$=>N.value=$)},{default:y(()=>[U(r(e(f)("kanban.form.triage")),1)]),_:1},8,["checked"]),b(e(Xe),{checked:K.value,"onUpdate:checked":w[10]||(w[10]=$=>K.value=$)},{default:y(()=>[U(r(e(f)("kanban.form.goalMode")),1)]),_:1},8,["checked"])]),i("div",Pt,[b(e(ue),{label:e(f)("kanban.form.maxRuntime")},{default:y(()=>[b(e(ie),{value:J.value,"onUpdate:value":w[11]||(w[11]=$=>J.value=$),placeholder:e(f)("kanban.form.maxRuntimePlaceholder")},null,8,["value","placeholder"])]),_:1},8,["label"]),b(e(ue),{label:e(f)("kanban.form.maxRetries")},{default:y(()=>[b(e(Ye),{value:Q.value,"onUpdate:value":w[12]||(w[12]=$=>Q.value=$),min:1,max:100,precision:0,placeholder:e(f)("kanban.form.maxRetriesPlaceholder"),clearable:""},null,8,["value","placeholder"])]),_:1},8,["label"]),K.value?(_(),ne(e(ue),{key:0,label:e(f)("kanban.form.goalMaxTurns")},{default:y(()=>[b(e(Ye),{value:q.value,"onUpdate:value":w[13]||(w[13]=$=>q.value=$),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"]))}})})),mn=ae((()=>{})),ts,pn=ae((()=>{It(),It(),mn(),Ke(),ts=ze(as,[["__scopeId","data-v-2e2f2c77"]])})),Rt,At,Ut,Ot,Dt,Et,Nt,Lt,Kt,zt,Ft,qt,Mt,Vt,ss,Jt=ae((()=>{Re(),Ee(),Ne(),Wt(),Es(),kn(),pn(),Ge(),Rs(),Qe(),Rt={class:"kanban-view"},At={class:"page-header"},Ut={class:"header-title"},Ot={class:"header-actions"},Dt={key:0,class:"stats-bar"},Et=["aria-pressed","onClick"],Nt={class:"stat-count"},Lt={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"},ss=De({__name:"KanbanView",setup(t){const{t:n}=Le(),m=$s(),f=Ht(),c=He(),p=Fe(),B=Is(),x=g(!1),a=g(!1),z=g(null),D=g(""),N=g(""),R=g(!1),H=g(null),G=g(!1),F=["triage","todo","scheduled","ready","running","blocked","review","done","archived"],J=g([...F]);function Q(k){return Array.isArray(k)?typeof k[0]=="string"?k[0]:null:typeof k=="string"?k:null}function K(){return Q(m.query.board)}async function q(k){K()!==k&&await f.replace({query:{...m.query,board:k}})}async function W(k,h=!0,S=!1){const se=p.selectedBoard,{board:Se,recovered:le}=p.recoverSelectedBoard(k||p.selectedBoard||"default");z.value=null,x.value=!1,a.value=!1,h&&le&&p.boardWarning&&c.warning(p.boardWarning),await q(Se),(S||Se!==se)&&await p.refreshAll()}function X(k){return`${n("kanban.stats.tasks")}: ${k}`}const Z=O(()=>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} · ${X(h)}`,value:k.slug}})),re=O({get:()=>p.selectedBoard,set:k=>{W(k||"default")}}),j=O(()=>{const k={};for(const h of F)k[h]=p.tasks.filter(S=>S.status===h).sort((S,se)=>se.created_at-S.created_at);return k}),ve=O(()=>{const k=p.filterStatus;return k&&F.includes(k)?[k]:F}),oe=O(()=>je(p.assignees,p.stats?.by_assignee||{})),I=O(()=>Object.fromEntries(B.profiles.map(k=>[k.name,k.avatar||null]))),w=O(()=>[{label:n("kanban.allStatuses"),value:""},...F.map(k=>({label:n(`kanban.columns.${k}`,k),value:k}))]),$=O(()=>[{label:n("kanban.allAssignees"),value:""},...oe.value.map(k=>({label:k.name,value:k.name}))]),A=O({get:()=>p.filterStatus||"",set:k=>p.setFilter("status",k||null)}),ce=O({get:()=>p.filterAssignee||"",set:k=>p.setFilter("assignee",k||null)});Oe(()=>m.query.board,async()=>{G.value&&await W(K(),!1)}),Oe(ve,k=>{J.value=[...k]},{immediate:!0}),bs(async()=>{await Promise.all([p.fetchBoards(),p.fetchCapabilities(),B.profiles.length===0?B.fetchProfiles():Promise.resolve()]),await W(K(),!0,!0),p.startEventStream(),G.value=!0,H.value=setInterval(()=>{document.visibilityState==="visible"&&Promise.all([p.fetchBoards(),p.fetchTasks(!0),p.fetchStats()])},15e3)}),Ss(()=>{p.stopEventStream(),H.value&&clearInterval(H.value)});function pe(k){z.value=k}function Ce(){z.value=null}async function ye(){await Promise.all([p.fetchTasks(),p.fetchStats()])}function $e(k){z.value=k}async function fe(){await p.fetchTasks()}async function ge(k){p.setFilter("status",k),J.value=k?[k]:[...F],await p.fetchTasks()}async function Ie(){await Promise.all([p.fetchTasks(),p.fetchStats(),p.fetchBoards()])}async function te(){const k=D.value.trim();if(!k){c.warning(n("kanban.board.slugRequired"));return}R.value=!0;try{const h=await p.createBoard({slug:k,name:N.value.trim()||void 0});D.value="",N.value="",a.value=!1,await q(h.slug),c.success(n("kanban.board.created"))}catch(h){c.error(h.message)}finally{R.value=!1}}async function Be(){if(p.selectedBoard!=="default"&&window.confirm(n("kanban.board.archiveConfirm"))){R.value=!0;try{await p.archiveSelectedBoard(),await q(he),c.success(n("kanban.board.archived"))}catch(k){c.error(k.message)}finally{R.value=!1}}}async function we(){R.value=!0;try{await p.dispatch(),await p.refreshAll(),c.success(n("kanban.message.dispatchNudged"))}catch(k){c.error(k.message)}finally{R.value=!1}}return(k,h)=>(_(),C("div",Rt,[i("header",At,[i("h2",Ut,r(e(n)("kanban.title")),1),i("div",Ot,[b(e(Te),{value:re.value,"onUpdate:value":h[0]||(h[0]=S=>re.value=S),options:Z.value,loading:e(p).boardsLoading,size:"small",style:{width:"260px"}},null,8,["value","options","loading"]),b(e(L),{size:"small",loading:R.value,onClick:h[1]||(h[1]=S=>a.value=!0)},{default:y(()=>[U(r(e(n)("common.add")),1)]),_:1},8,["loading"]),b(e(L),{size:"small",secondary:"",disabled:e(p).selectedBoard===e(he),loading:R.value,onClick:Be},{default:y(()=>[U(r(e(n)("kanban.board.archive")),1)]),_:1},8,["disabled","loading"]),b(e(L),{size:"small",secondary:"",loading:R.value,onClick:we},{default:y(()=>[U(r(e(n)("kanban.action.dispatch")),1)]),_:1},8,["loading"]),b(e(Te),{value:A.value,"onUpdate:value":[h[2]||(h[2]=S=>A.value=S),fe],options:w.value,size:"small",style:{width:"150px"}},null,8,["value","options"]),b(e(Te),{value:ce.value,"onUpdate:value":[h[3]||(h[3]=S=>ce.value=S),fe],options:$.value,size:"small",style:{width:"170px"}},null,8,["value","options"]),b(e(L),{type:"primary",size:"small",onClick:h[4]||(h[4]=S=>x.value=!0)},{icon:y(()=>[...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:y(()=>[U(" "+r(e(n)("kanban.createTask")),1)]),_:1})])]),e(p).stats?(_(),C("div",Dt,[(_(),C(de,null,ke(F,S=>i("button",{key:S,type:"button",class:me(["stat-chip",[S,{active:e(p).filterStatus===S}]]),"aria-pressed":e(p).filterStatus===S,onClick:se=>ge(S)},[i("span",Nt,r(e(p).stats.by_status[S]||0),1),i("span",Lt,r(e(n)(`kanban.columns.${S}`,S)),1)],10,Et)),64)),i("button",{type:"button",class:me(["stat-chip total",{active:!e(p).filterStatus}]),"aria-pressed":!e(p).filterStatus,onClick:h[5]||(h[5]=S=>ge(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:y(()=>[i("div",qt,[b(e(ys),{"expanded-names":J.value,"onUpdate:expandedNames":h[6]||(h[6]=S=>J.value=S)},{default:y(()=>[(_(!0),C(de,null,ke(ve.value,S=>(_(),ne(e(gs),{key:S,title:`${e(n)(`kanban.columns.${S}`,S)} (${j.value[S].length})`,name:S,class:me(["kanban-column",`status-${S}`])},{header:y(()=>[i("span",{class:me(["column-header",`status-${S}`])},[h[13]||(h[13]=i("span",{class:"status-dot","aria-hidden":"true"},null,-1)),i("span",null,r(e(n)(`kanban.columns.${S}`,S))+" ("+r(j.value[S].length)+")",1)],2)]),default:y(()=>[i("div",{class:me(["task-list",`status-${S}`])},[(_(!0),C(de,null,ke(j.value[S],se=>(_(),ne(Qt,{key:se.id,task:se,"assignee-avatar":se.assignee&&I.value[se.assignee]||null,onClick:Se=>pe(se.id)},null,8,["task","assignee-avatar","onClick"]))),128)),j.value[S].length===0?(_(),C("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(es,{"task-id":z.value,onClose:Ce,onUpdated:ye,onNavigate:$e},null,8,["task-id"]),b(e(We),{show:a.value,"onUpdate:show":h[10]||(h[10]=S=>a.value=S),preset:"dialog",title:e(n)("kanban.board.create"),style:{width:"420px"}},{action:y(()=>[b(e(L),{onClick:h[9]||(h[9]=S=>a.value=!1)},{default:y(()=>[U(r(e(n)("common.cancel")),1)]),_:1}),b(e(L),{type:"primary",loading:R.value,onClick:te},{default:y(()=>[U(r(e(n)("common.create")),1)]),_:1},8,["loading"])]),default:y(()=>[i("div",Vt,[b(e(ie),{value:D.value,"onUpdate:value":h[7]||(h[7]=S=>D.value=S),placeholder:e(n)("kanban.board.slugPlaceholder")},null,8,["value","placeholder"]),b(e(ie),{value:N.value,"onUpdate:value":h[8]||(h[8]=S=>N.value=S),placeholder:e(n)("kanban.board.namePlaceholder")},null,8,["value","placeholder"])])]),_:1},8,["show","title"]),x.value?(_(),ne(ts,{key:1,onClose:h[11]||(h[11]=S=>x.value=!1),onCreated:Ie})):P("",!0)]))}})})),bn=ae((()=>{})),_n,hn=ae((()=>{Jt(),Jt(),bn(),Ke(),_n=ze(ss,[["__scopeId","data-v-7a17a5f4"]])}));hn();export{_n as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as v}from"./rolldown-runtime-M0oDzQ_3.js";import{Cn as Q,Fn as f,Qn as s,Qt as S,Tn as g,Wn as l,Wt as W,Yt as w,Zt as D,an as y,dn as I,on as c,rn as e,rr as a}from"./ui-vendor-dYn1tJGA.js";import{c as N,f as T,l as U,m as q}from"./vue-vendor-DZ4A_GHn.js";import{l as E,n as F,p as J,t as Y,u as Z}from"./_plugin-vue_export-helper-
|
|
1
|
+
import{n as v}from"./rolldown-runtime-M0oDzQ_3.js";import{Cn as Q,Fn as f,Qn as s,Qt as S,Tn as g,Wn as l,Wt as W,Yt as w,Zt as D,an as y,dn as I,on as c,rn as e,rr as a}from"./ui-vendor-dYn1tJGA.js";import{c as N,f as T,l as U,m as q}from"./vue-vendor-DZ4A_GHn.js";import{l as E,n as F,p as J,t as Y,u as Z}from"./_plugin-vue_export-helper-BIeGRfrQ.js";import{a as $,d as j,tt as z,u as G}from"./index-Bkiif2Pf.js";var b,L,V,k,x,M,R,C,H,A,P,K=v((()=>{W(),z(),T(),N(),Z(),G(),b={class:"login-view"},L={class:"login-card"},V={class:"login-title"},k={class:"login-desc"},x={class:"login-default-hint"},M=["placeholder"],R=["placeholder"],C={key:0,class:"login-error"},H={key:1,class:"login-lock-hint"},A=["disabled"],P=I({__name:"LoginView",setup(te){const{t}=U(),m=q(),o=l(""),r=l(""),u=l(!1),n=l(""),d=l(!1);E()&&m.replace("/hermes/chat"),Q(async()=>{try{await $()}catch{}});async function h(){await B()}async function B(){if(!o.value.trim()||!r.value){n.value=t("login.credentialsRequired");return}u.value=!0,n.value="",d.value=!1;try{J(await j(o.value.trim(),r.value)),m.replace("/hermes/chat")}catch(_){_.status===429||_.status===503?(n.value=t("login.tooManyAttempts"),d.value=!0):n.value=_.message||t("login.invalidCredentials")}finally{u.value=!1}}return(_,i)=>(g(),c("div",b,[e("div",L,[i[4]||(i[4]=e("div",{class:"login-logo"},[e("img",{src:"/logo.png",alt:"Quanta Hermes",width:"80",height:"80"})],-1)),e("h1",V,a(s(t)("login.title")),1),e("p",k,a(s(t)("login.description")),1),e("p",x,a(s(t)("login.defaultCredentialsHint")),1),e("form",{class:"login-form",onSubmit:S(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,M),[[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:D(h,["enter"])},null,40,R),[[w,r.value]]),n.value?(g(),c("div",C,a(n.value),1)):y("",!0),d.value?(g(),c("div",H,[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,A)],32)])]))}})})),O=v((()=>{})),X,ee=v((()=>{K(),K(),O(),F(),X=Y(P,[["__scopeId","data-v-eb8ea6c6"]])}));ee();export{X as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as f}from"./rolldown-runtime-M0oDzQ_3.js";import{$t as B,Cn as K,Dn as X,Fn as Z,Ot as ee,Pn as E,Qn as i,Tn as r,V as se,Wn as u,Wt as le,Yt as ae,an as te,dn as ne,er as R,g as ie,ln as oe,mt as C,nn as N,on as _,rn as t,rr as n,t as ue,un as m}from"./ui-vendor-dYn1tJGA.js";import{c as re,l as _e}from"./vue-vendor-DZ4A_GHn.js";import{f as M,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{$t as B,Cn as K,Dn as X,Fn as Z,Ot as ee,Pn as E,Qn as i,Tn as r,V as se,Wn as u,Wt as le,Yt as ae,an as te,dn as ne,er as R,g as ie,ln as oe,mt as C,nn as N,on as _,rn as t,rr as n,t as ue,un as m}from"./ui-vendor-dYn1tJGA.js";import{c as re,l as _e}from"./vue-vendor-DZ4A_GHn.js";import{f as M,n as ce,t as ve,u as de}from"./_plugin-vue_export-helper-BIeGRfrQ.js";async function ge(){return(await M("/api/hermes/logs")).files}async function pe(V,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 M(`/api/hermes/logs/${V}${c?`?${c}`:""}`)).entries.filter(v=>v!==null)}var me=f((()=>{de()})),O,S,k,U,F,I,$,z,D,G,T,W,q,P,A=f((()=>{le(),ue(),re(),me(),O={class:"logs-view"},S={class:"page-header"},k={class:"header-title"},U={class:"header-actions"},F=["placeholder"],I={class:"logs-body"},$={key:0,class:"logs-empty"},z={class:"log-list"},D={class:"log-time"},G={class:"log-logger"},T={class:"access-method"},W={class:"access-path"},q={key:1,class:"log-message"},P=ne({__name:"LogsView",setup(V){const{t:a}=_e(),o=se(),c=u([]),v=u("agent"),w=u([]),d=u(!1),b=u(100),L=u(""),h=u(""),Q=N(()=>c.value.map(s=>({label:`${s.name} (${s.size})`,value:s.name}))),H=N(()=>[{label:a("logs.all"),value:""},{label:"ERROR",value:"ERROR"},{label:"WARNING",value:"WARNING"},{label:"INFO",value:"INFO"},{label:"DEBUG",value:"DEBUG"}]),J=[{label:"50",value:50},{label:"100",value:100},{label:"200",value:200},{label:"500",value:500}],y=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 x(s){switch(s){case"ERROR":return"level-error";case"WARNING":return"level-warning";case"DEBUG":return"level-debug";default:return"level-info"}}function Y(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 K(async()=>{c.value=await ge(),await p()}),(s,e)=>(r(),_("div",O,[t("header",S,[t("h2",k,n(i(a)("logs.title")),1),t("div",U,[m(i(C),{value:v.value,"onUpdate:value":[e[0]||(e[0]=l=>v.value=l),p],options:Q.value,size:"small",class:"input-md"},null,8,["value","options"]),m(i(C),{value:L.value,options:H.value,size:"small",class:"input-sm","onUpdate:value":e[1]||(e[1]=l=>{L.value=l,p()})},null,8,["value","options"]),m(i(C),{value:b.value,options:J,size:"small",class:"input-sm","onUpdate:value":e[2]||(e[2]=l=>{b.value=l,p()})},null,8,["value"]),Z(t("input",{"onUpdate:modelValue":e[3]||(e[3]=l=>h.value=l),class:"search-input",placeholder:i(a)("logs.searchPlaceholder")},null,8,F),[[ae,h.value]]),m(i(ee),{size:"small",loading:d.value,onClick:p},{default:E(()=>[oe(n(i(a)("logs.refresh")),1)]),_:1},8,["loading"])])]),t("div",I,[m(i(ie),{show:d.value,class:"logs-spin"},{default:E(()=>[y.value.length===0&&!d.value?(r(),_("div",$,n(i(a)("logs.noEntries")),1)):te("",!0),t("div",z,[(r(!0),_(B,null,X(y.value,(l,j)=>(r(),_("div",{key:j,class:R(["log-entry",x(l.level)])},[t("span",D,n(Y(l.timestamp)),1),t("span",{class:R(["log-level",x(l.level)])},n(l.level),3),t("span",G,n(l.logger),1),g(l.message)?(r(),_(B,{key:0},[t("span",T,n(g(l.message).method),1),t("span",W,n(g(l.message).path),1),t("span",{class:R(["access-status","status-"+(g(l.message).status?.[0]||"x")])},n(g(l.message).status),3)],64)):(r(),_("span",q,n(l.message),1))],2))),128))])]),_:1},8,["show"])])]))}})})),he=f((()=>{})),fe,we=f((()=>{A(),A(),he(),ce(),fe=ve(P,[["__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 F}from"./rolldown-runtime-M0oDzQ_3.js";import{$t as Ge,Cn as Ve,I as Xe,Mn as qe,P as Ye,Pn as X,Qn as R,Qt as Je,Tn as D,V as Ke,Wn as N,Wt as Qe,an as ie,dn as Ze,en as et,g as tt,in as nt,kn as rt,nn as ae,on as P,rn as oe,rr as it,t as at,un as H,xn as ot,yn as se}from"./ui-vendor-dYn1tJGA.js";import{c as st,l as lt}from"./vue-vendor-DZ4A_GHn.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{M as gt,N as q,P as wt,j as B}from"./index-
|
|
2
|
+
import{a as ze,n as F}from"./rolldown-runtime-M0oDzQ_3.js";import{$t as Ge,Cn as Ve,I as Xe,Mn as qe,P as Ye,Pn as X,Qn as R,Qt as Je,Tn as D,V as Ke,Wn as N,Wt as Qe,an as ie,dn as Ze,en as et,g as tt,in as nt,kn as rt,nn as ae,on as P,rn as oe,rr as it,t as at,un as H,xn as ot,yn as se}from"./ui-vendor-dYn1tJGA.js";import{c as st,l as lt}from"./vue-vendor-DZ4A_GHn.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{M as gt,N as q,P as wt,j as B}from"./index-Bkiif2Pf.js";import{n as _t,t as vt}from"./clipboard-1NPxC3YL.js";function x(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,a=[],s){const l=n?`<span class="code-lang">${x(n)}</span>`:"";return`<pre class="${["hljs-code-block",...a].join(" ")}"${s==null?"":` data-copy-text="${x(s)}"`}><div class="code-header">${l}<button type="button" class="copy-btn" data-copy-code="true">${x(i)}</button></div><code class="hljs language-${kt(t)}">${e}</code></pre>`}function bt(e){return xe.has(e?.trim().toLowerCase()||"")}function O(e){return/^(diff --git |index |---(?:\s|$)|\+\+\+(?:\s|$))/.test(e)}function A(e){return/^@@(?:\s|$)/.test(e)}function U(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 O(e)||A(e)?{value:"",className:"diff-line-number-empty"}:W(e)?{value:t.oldNumber!=null?String(t.oldNumber):"",className:"diff-line-number-old"}:U(e)?{value:t.newNumber!=null?String(t.newNumber):"",className:"diff-line-number-new"}:!O(e)&&!A(e)&&t.newNumber!=null?{value:String(t.newNumber),className:"diff-line-number-context"}:{value:"",className:"diff-line-number-empty"}}function xt(e,t){if(!(O(e)||A(e))){if(W(e)){t.oldNumber!=null&&(t.oldNumber+=1);return}if(U(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">⋮ ${x(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 a=i;for(;i<e.length&&e[i].foldableContext;)i+=1;const s=e.slice(a,i);if(s.length<=Le){n.push(...s);continue}const l=Math.min(Ne,Math.floor(s.length/2)),c=s.length-l*2;n.push(...s.slice(0,l)),n.push({html:Lt(t(c)),foldableContext:!1}),n.push(...s.slice(s.length-l))}return n}function Ft(e,t,n,i){const a={},s=e.split(/\r?\n/);return s.at(-1)===""&&s.pop(),be(Nt(s.map(l=>{const c=["diff-line"];let h=!1;if(O(l))c.push("diff-line-file-header");else if(A(l)){c.push("diff-line-hunk-header");const y=yt(l);y&&(a.oldNumber=y.oldNumber,a.newNumber=y.newNumber)}else U(l)?c.push("diff-line-added"):W(l)?c.push("diff-line-removed"):h=!0;const v=$t(l,a),k=`<span class="${c.join(" ")}"><span class="diff-line-number ${v.className}" aria-hidden="true">${x(v.value)}</span><span class="diff-line-content">${x(l||" ")}</span></span>`;return xt(l,a),{html:k,foldableContext:h}}),i).map(l=>l.html).join(""),"diff",t,n,["hljs-unified-diff"],e)}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,a=0,s=0,l=0,c=0;for(const h of n){if(/^(diff --git |index )/.test(h)){c+=1;continue}if(/^---(?:\s|$)|^\+\+\+(?:\s|$)/.test(h)){i+=1;continue}if(A(h)){a+=1;continue}if(U(h)){s+=1;continue}W(h)&&(l+=1)}return s>0||l>0?bt(t)?a>0||i>=2||c>0:i>=2&&a>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 a=de(i,t+1);if(a)return a}return null}const n=Object.entries(e);for(const[i,a]of n)if(Fe.has(i.toLowerCase())&&typeof a=="string"&&ye(a))return a;for(const[,i]of n)if(i&&typeof i=="object"){const a=de(i,t+1);if(a)return a}return null}function ue(e,t,n,i={}){const a=t?.trim().toLowerCase()||"",s=Ct(a),l=i.maxHighlightLength??Number.POSITIVE_INFINITY;if(ye(e,a||s)){const k=i.formatDiffFoldLabel??(y=>String(y));return Ft(e,a||"diff",n,k)}let c="",h=s||a||"plain",v=a;try{s&&le.getLanguage(s)&&e.length<=l?(c=le.highlight(e,{language:s,ignoreIllegals:!0}).value,h=s):(c=x(e),v||(v="text"))}catch{c=x(e),v||(v="text")}return be(c,h,v,n)}async function Mt(e){return vt(e)}async function Dt(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"),a=i?.querySelector("code"),s=i?.getAttribute("data-copy-text")??a?.textContent??"";return s?Mt(s):!1}var $e,xe,Le,Ne,Fe,At=F((()=>{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 C(e){const t=e.match(/^( {0,3})(`{3,}|~{3,})(.*)$/);if(!t)return null;const[,n,i,a=""]=t,s=i[0],l=a.trim();return s==="`"&&l.includes("`")?null:{indent:n,marker:s,fence:i,length:i.length,info:l}}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 Me.has(t)}function St(e,t){const n=C(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 a of e){const s=C(a);if(!s||s.marker!==t)continue;i=!0;const l=n[n.length-1];if(s.info===""&&l&&s.length>=l.length){n.pop();continue}n.push({marker:s.marker,length:s.length})}return i&&n.length===0}function Rt(e,t,n){const i=[];for(let a=n;a<e.length;a+=1){const s=C(e[a]);s&&s.marker===t.marker&&s.info===""&&s.length>=t.length&&i.push(a)}for(let a=i.length-1;a>=0;a-=1){const s=i[a];if(Tt(e.slice(n,s),t.marker))return s}return i[0]??-1}function Pt(e,t){let n=0;for(const i of e){const a=C(i);a?.marker===t&&(n=Math.max(n,a.length))}return n}function Ht(e){const t=[];for(let n=0;n<e.length;n+=1){const i=C(e[n]);if(!i||!Ce(i)){t.push(e[n]);continue}const a=Rt(e,i,n+1);if(a===-1){t.push(e[n]);continue}const s=e.slice(n+1,a),l=Pt(s,i.marker);if(l>=i.length){const c=l+1;t.push(fe(i,c)),t.push(...s),t.push(fe(i,c,""))}else t.push(e[n]),t.push(...s),t.push(e[a]);n=a}return t}function Bt(e){if(!e.includes("```")&&!e.includes("~~~"))return e;const t=e.split(`
|
|
3
3
|
`),n=[];let i=!1;for(let a=0;a<t.length;a+=1){const s=C(t[a]);if(!s||!Ce(s)){n.push(t[a]);continue}const l=It(t,s,a+1);if(l===-1){n.push(t[a]);continue}if(l!==Ee(t)){n.push(t[a]);continue}n.push(...Ht(t.slice(a+1,l))),n.push(...t.slice(l+1)),i=!0;break}return i?n.join(`
|
|
4
4
|
`):e}var Me,Ot=F((()=>{Me=new Set(["md","markdown","mdown","mkd"])}));function Ut(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function Wt(e){return e?.trim().split(/\s+/)[0]?.toLowerCase()||""}function jt(e){return Wt(e)===De}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 De,Vt,Y,Ae,Xt=F((()=>{De="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=F((()=>{Qe(),st(),at(),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=Ze({__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 a(r){const o=r.trim();return o.startsWith("\\[")&&o.endsWith("\\]")||o.startsWith("$$")&&o.endsWith("$$")||o.startsWith("\\(")&&o.endsWith("\\)")?o.slice(2,-2).trim():o}function s(r){const o=a(r);return`<div class="latex-block">${ce.renderToString(o,{displayMode:!0,output:"htmlAndMathml",throwOnError:!1,strict:"ignore"})}</div>`}const l=e,{t:c}=lt(),h=Ke();function v(r){return c("chat.unchangedLines",{count:r})}const k=new pt({html:!1,breaks:!0,linkify:!0,typographer:!0,highlight(r,o){return ue(r,o,c("common.copy"),{formatDiffFoldLabel:v})}});k.use(pe.default,{katex:ce,throwOnError:!1,strict:"ignore"});const y=k.renderer.rules.fence?.bind(k.renderer.rules);k.renderer.rules.fence=(r,o,f,m,w)=>{const p=r[o];return i(p.info)?s(p.content):jt(p.info)?Gt(p.content):y?y(r,o,f,m,w):w.renderToken(r,o,f)};const j=N(null),J=`hermes-mermaid-${Math.random().toString(36).slice(2)}`,E=N(null),L=N(null),K=N(""),z=N(!1),S=N(!1),Ie=ae(()=>/\.(md|markdown)$/i.test(K.value));let b=0,$=!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 Q(r,o){const f=r.split("?")[0].split("#")[0].split(".").pop()?.toLowerCase();return!!f&&o.has(f)}const Z=ae(()=>{let r=k.render(Bt(l.content));const o=l.headingIdPrefix?`${l.headingIdPrefix}-`:"";let f=0;if(r=r.replace(/<(h[1-6])([^>]*)>/g,(m,w,p)=>{f++;const u=`${o}heading-${f}`;return p.includes("id=")?m.replace(/id="[^"]*"/,`id="${u}"`).replace(/id='[^']*'/,`id="${u}"`):p.trim()===""?`<${w} id="${u}">`:`<${w} ${p.trim()} id="${u}">`}),r=r.replace(/\bsrc=(["'])([^"']+)\1/g,(m,w,p)=>G(p)?`src=${w}${q(V(p))}${w}`:m),r=r.replace(/<a href="([^"]+)">([^<]+)<\/a>/g,(m,w,p)=>{if(!G(w))return m;const u=V(w),g=p.trim();return Q(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 V}from"./rolldown-runtime-M0oDzQ_3.js";import{$t as Z,Bn as Ha,Dn as ee,Ht as Ya,It as Wa,K as oe,Ot as b,Pn as c,Pt as ie,Qn as l,Tn as d,V as Da,Wn as h,Wt as ya,an as N,b as Ga,ct as ue,dn as ha,er as ae,g as Qa,in as X,ln as m,m as Xa,nn as G,on as _,rn as n,rr as r,t as ga,un as i,ut as q,w as Ka,wn as Za,wt as et}from"./ui-vendor-dYn1tJGA.js";import{c as Sa,l as wa}from"./vue-vendor-DZ4A_GHn.js";import{f as B,n as ba,t as ka,u as at}from"./_plugin-vue_export-helper-
|
|
1
|
+
import{n as V}from"./rolldown-runtime-M0oDzQ_3.js";import{$t as Z,Bn as Ha,Dn as ee,Ht as Ya,It as Wa,K as oe,Ot as b,Pn as c,Pt as ie,Qn as l,Tn as d,V as Da,Wn as h,Wt as ya,an as N,b as Ga,ct as ue,dn as ha,er as ae,g as Qa,in as X,ln as m,m as Xa,nn as G,on as _,rn as n,rr as r,t as ga,un as i,ut as q,w as Ka,wn as Za,wt as et}from"./ui-vendor-dYn1tJGA.js";import{c as Sa,l as wa}from"./vue-vendor-DZ4A_GHn.js";import{f as B,n as ba,t as ka,u as at}from"./_plugin-vue_export-helper-BIeGRfrQ.js";import{n as A,t as tt}from"./vendor-B1Lfatlz.js";var ce,de,ve,me,pe,fe,_e,ye,he,ge,Se,we,be,ke,Ce,Te,Me,D,Ca,xe=V((()=>{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"},we=["title"],be={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,S=s,{t:f}=wa();function F(C){return C.raw_config.enabled===!1?"disabled":C.connected?"connected":"disconnected"}function J(C){return C.raw_config.enabled===!1?f("mcp.disabledStatus"):C.connected?f("mcp.connectedStatus"):f("mcp.disconnectedStatus")}const T=G(()=>u.toolsByServer[u.server.name]||[]);return(C,g)=>(d(),_("div",{class:ae(["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:ae(["type-badge",F(o.server)])},r(J(o.server)),3)])]),n("div",pe,[o.server.error?(d(),_("div",fe,[n("span",_e,r(o.server.error),1)])):N("",!0),n("div",ye,[n("span",he,r(l(f)("mcp.toolList")),1),n("span",ge,r(o.server.tools_registered)+"/"+r(o.server.tools)+r(l(f)("mcp.count"))+r(l(f)("mcp.tools")),1)]),o.server.tools>0?(d(),_("div",Se,[(d(!0),_(Z,null,ee(T.value.slice(0,D),v=>(d(),_("span",{key:v.name,class:"tool-tag",title:v.description},r(v.name),9,we))),128)),T.value.length>D?(d(),_("span",be," +"+r(T.value.length-D)+" "+r(l(f)("mcp.more")),1)):N("",!0)])):(d(),_("div",ke,[n("span",Ce,r(l(f)("mcp.zeroTools")),1)]))]),n("div",Te,[n("div",Me,[i(l(b),{size:"tiny",quaternary:"",onClick:g[0]||(g[0]=v=>S("edit",o.server))},{default:c(()=>[m(r(l(f)("mcp.edit")),1)]),_:1}),i(l(b),{size:"tiny",quaternary:"",disabled:!o.server.connected,onClick:g[1]||(g[1]=v=>S("manageTools",o.server))},{default:c(()=>[m(r(l(f)("mcp.manageTools")),1)]),_:1},8,["disabled"]),i(l(b),{size:"tiny",quaternary:"",onClick:g[2]||(g[2]=v=>S("test",o.server))},{default:c(()=>[m(r(l(f)("mcp.test")),1)]),_:1}),i(l(b),{size:"tiny",quaternary:"",onClick:g[3]||(g[3]=v=>S("reload",o.server.name))},{default:c(()=>[m(r(l(f)("mcp.reload")),1)]),_:1}),i(l(Ka),{onPositiveClick:g[4]||(g[4]=v=>S("remove",o.server))},{trigger:c(()=>[i(l(b),{size:"tiny",quaternary:"",type:"error"},{default:c(()=>[m(r(l(f)("mcp.remove")),1)]),_:1})]),default:c(()=>[m(" "+r(l(f)("mcp.confirmRemove",{name:o.server.name})),1)]),_:1})]),i(l(Xa),{value:o.server.raw_config.enabled!==!1,size:"small","onUpdate:value":g[5]||(g[5]=()=>S("toggleEnabled",o.server))},null,8,["value"])])],2))}})})),lt=V((()=>{})),Ta,st=V((()=>{xe(),xe(),lt(),ba(),Ta=ka(Ca,[["__scopeId","data-v-4a527181"]])}));async function rt(){return B("/api/hermes/mcp/servers")}async function nt(o,s){const u=new URLSearchParams;return o&&u.set("server",o),s&&u.set("raw","1"),B(`/api/hermes/mcp/tools${u.toString()?`?${u.toString()}`:""}`)}async function ot(o,s){return B("/api/hermes/mcp/servers",{method:"POST",body:JSON.stringify({name:o,config:s})})}async function it(o){return B(`/api/hermes/mcp/servers/${encodeURIComponent(o)}`,{method:"DELETE"})}async function K(o,s){return B(`/api/hermes/mcp/servers/${encodeURIComponent(o)}`,{method:"PATCH",body:JSON.stringify({config:s})})}async function $e(o){return B(`/api/hermes/mcp/reload${o?`?server=${encodeURIComponent(o)}`:""}`,{method:"POST"})}async function ut(o){return B(`/api/hermes/mcp/servers/${encodeURIComponent(o)}/test`,{method:"POST"})}var ct=V((()=>{at()})),Ee,je,Ae,Re,Oe,Ue,ze,Ie,Ne,Ve,Be,Fe,Le,Je,Pe,qe,He,Ye,We,De,Ge,Qe,Xe,Ke,Ze,ea,aa,ta,la,sa,ra,na,oa,ia,ua,ca,da,va,ma,pa,fa,Ma,_a=V((()=>{ya(),tt(),ga(),Sa(),st(),ct(),Ee={class:"mcp-view"},je={class:"page-header"},Ae={class:"header-title"},Re={class:"header-actions"},Oe={class:"mcp-content"},Ue={class:"summary-grid"},ze={class:"summary-card"},Ie={class:"summary-label"},Ne={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"},Pe={class:"toolbar-row"},qe={class:"btn-group"},He={key:0,class:"servers-grid"},Ye={class:"mode-switch-row"},We={key:0,class:"config-error"},De={class:"modal-actions"},Ge={key:0,class:"tools-modal-content"},Qe={class:"tools-modal-header"},Xe={class:"server-name-label"},Ke={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{Cn as Ce,Fn as P,Ot as c,Pn as r,Qn as t,Tn as o,V as Ve,Wn as g,Wt as ze,Yt as b,an as p,cn as $,dn as Be,in as h,ln as v,nn as f,on as n,rn as e,rr as i,t as Se,un as y}from"./ui-vendor-dYn1tJGA.js";import{c as Pe,l as be}from"./vue-vendor-DZ4A_GHn.js";import{n as Ne,t as Ee}from"./_plugin-vue_export-helper-
|
|
1
|
+
import{n as E}from"./rolldown-runtime-M0oDzQ_3.js";import{Cn as Ce,Fn as P,Ot as c,Pn as r,Qn as t,Tn as o,V as Ve,Wn as g,Wt as ze,Yt as b,an as p,cn as $,dn as Be,in as h,ln as v,nn as f,on as n,rn as e,rr as i,t as Se,un as y}from"./ui-vendor-dYn1tJGA.js";import{c as Pe,l as be}from"./vue-vendor-DZ4A_GHn.js";import{n as Ne,t as Ee}from"./_plugin-vue_export-helper-BIeGRfrQ.js";import{X as $e,Y as He}from"./index-Bkiif2Pf.js";import{n as Le,t as N}from"./MarkdownRenderer-DZb1wMbL.js";import{f as qe,l as Fe,r as Te}from"./skills-aFq9azFz.js";var H,L,q,F,T,U,D,R,I,W,Y,J,O,Q,X,j,A,G,K,Z,ee,te,se,ae,oe,ie,le,ne,re,de,me,ue,ce,ve,_e,ye,he,pe=E((()=>{ze(),Se(),Pe(),Le(),Fe(),He(),H={class:"memory-view"},L={class:"page-header"},q={class:"header-title"},F={class:"memory-content"},T={key:0,class:"memory-loading"},U={key:1,class:"memory-sections"},D={class:"memory-section"},R={class:"section-header"},I={class:"section-title-row"},W={class:"section-title"},Y={key:0,class:"section-mtime"},J={key:0,class:"section-body"},O={key:1,class:"empty-text"},Q={key:1,class:"section-edit"},X=["placeholder"],j={class:"edit-actions"},A={class:"memory-section"},G={class:"section-header"},K={class:"section-title-row"},Z={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=Be({__name:"MemoryView",setup(Ie){const{t:a}=be(),w=Ve(),x=$e(),M=g(!1),l=g(null),d=g(null),m=g(""),k=g(!1);Ce(C);async function C(){M.value=!0;try{(!x.activeProfileName||x.profiles.length===0)&&await x.fetchProfiles(),l.value=await Te()}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 qe(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=f(()=>!l.value?.memory?.trim()),ke=f(()=>!l.value?.user?.trim()),ge=f(()=>!l.value?.soul?.trim()),we=f(()=>(l.value?.memory||"").replace(/§/g,`
|
|
2
2
|
|
|
3
3
|
`)),xe=f(()=>(l.value?.user||"").replace(/§/g,`
|
|
4
4
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as le}from"./rolldown-runtime-M0oDzQ_3.js";import{$t as x,Cn as Yt,Dn as ie,Nn as Xt,Qn as p,Qt as qt,Tn as o,V as Gt,Wn as J,Wt as Qt,an as g,dn as Zt,en as ea,er as w,in as A,nn as u,on as l,rn as i,rr as y,t as ta,un as we,xn as Ce}from"./ui-vendor-dYn1tJGA.js";import{c as aa,l as na}from"./vue-vendor-DZ4A_GHn.js";import{n as sa,t as ia}from"./_plugin-vue_export-helper-
|
|
1
|
+
import{n as le}from"./rolldown-runtime-M0oDzQ_3.js";import{$t as x,Cn as Yt,Dn as ie,Nn as Xt,Qn as p,Qt as qt,Tn as o,V as Gt,Wn as J,Wt as Qt,an as g,dn as Zt,en as ea,er as w,in as A,nn as u,on as l,rn as i,rr as y,t as ta,un as we,xn as Ce}from"./ui-vendor-dYn1tJGA.js";import{c as aa,l as na}from"./vue-vendor-DZ4A_GHn.js";import{n as sa,t as ia}from"./_plugin-vue_export-helper-BIeGRfrQ.js";import{C as oa,J as la,N as ra,P as ua,S as ca,X as da,Y as ma,_ as ga,b as va,j as Se,q as ha,v as pa,x as fa,y as ya}from"./index-Bkiif2Pf.js";import{n as ka,t as _a}from"./clipboard-1NPxC3YL.js";import{a as wa,i as Ca,n as Sa,o as Ta,r as Te,s as ba,t as be}from"./ttsHelpers-CzQCvABU.js";import{a as Ma,c as xa,i as Aa,n as Pa,o as Ba,r as Me,s as Da,t as P}from"./MarkdownRenderer-DZb1wMbL.js";var xe,Ae,Pe,Be,De,Ie,Ue,$e,Ne,Fe,Ee,Ve,Oe,Le,Re,Ke,He,Je,ze,je,We,Ye,Xe,qe,Ge,Qe,Ze,et,tt,at,nt,st,it,ot,lt,rt,ut,ct,dt,T,oe,mt,gt,vt,ht,z,ft,pt=le((()=>{Qt(),aa(),ta(),ua(),ka(),Pa(),va(),ga(),ma(),ca(),la(),Da(),Ta(),Ca(),Sa(),xe=["id"],Ae={key:1,width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5",class:"tool-icon"},Pe={class:"tool-name"},Be={key:2,class:"tool-preview"},De={key:3,class:"tool-spinner"},Ie={key:4,class:"tool-error-badge"},Ue={key:0,class:"tool-detail-section","data-copy-source":"tool-args"},$e={class:"tool-detail-label"},Ne=["innerHTML"],Fe={key:1,class:"tool-detail-section","data-copy-source":"tool-result"},Ee={class:"tool-detail-label"},Ve=["innerHTML"],Oe={key:1,class:"msg-body"},Le={key:0,class:"msg-attachments"},Re=["src","alt","onClick"],Ke=["onClick","title"],He={class:"att-name"},Je={class:"att-size"},ze={class:"thinking-label"},je={key:0,class:"thinking-meta"},We={class:"thinking-meta"},Ye={key:0,class:"thinking-body"},Xe={key:0,class:"msg-attachments"},qe=["src","alt","onClick"],Ge=["onClick","title"],Qe={class:"att-name"},Ze={key:6,class:"command-result command-status"},et={class:"command-status-grid"},tt={class:"command-status-key"},at={class:"command-status-value"},nt={key:7,class:"command-result"},st={key:8,class:"streaming-dots"},it={class:"message-meta"},ot=["title"],lt={key:0,width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},rt={key:1,width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},ut=["title"],ct={class:"message-time"},dt=["src"],T=1e3,oe=200,mt=6,gt=1e3,vt=50,ht=50,z="__truncated__",ft=Zt({__name:"MessageItem",props:{message:{},highlight:{type:Boolean},headingIdPrefix:{}},setup(d){const s=d,{t:c}=na(),_=Gt(),yt=u(()=>s.message.role==="system"),kt=u(()=>s.message.role==="assistant"&&s.message.systemType==="error"),re=u(()=>s.headingIdPrefix||`msg-${s.message.id}`),N=u(()=>s.message.role==="command"||s.message.systemType==="command"),_t=u(()=>s.message.role==="command"&&s.message.systemType==="error"),wt=u(()=>N.value&&s.message.commandAction==="status"&&s.message.commandData?.type!=="goal"),Ct=u(()=>{const e=s.message.commandData||{};return[{key:"status",value:e.isWorking?"running":"idle"},{key:"source",value:e.source},{key:"profile",value:e.profile},{key:"model",value:e.model||"-"},{key:"queue",value:e.queueLength??0},{key:"run",value:e.runId||"-"}]});function St(e){return!e||typeof e!="object"?"":(e.type==="text"||e.type==="input_text")&&typeof e.text=="string"?e.text:""}function Tt(e){if(!e||typeof e!="object"||e.type!=="input_image"&&e.type!=="image_url")return null;const t=e.image_url;return typeof t=="string"?t:t&&typeof t=="object"&&typeof t.url=="string"?t.url:null}function bt(e,t){const a=e.match(/^data:image\/([^;,]+)/i),r=a?.[1]==="jpeg"?"jpg":a?.[1]||"png";return`image-${t+1}.${r}`}function Mt(e){const t=e.trim();if(!t)return null;const a=r=>{const v=JSON.parse(r);return Array.isArray(v)&&v.length>0&&"type"in v[0]?v:null};try{return a(t)}catch{if(!t.startsWith("[{'")&&!t.startsWith('[{"'))return null;try{return a(t.replace(/\bNone\b/g,"null").replace(/\bTrue\b/g,"true").replace(/\bFalse\b/g,"false").replace(/'/g,'"'))}catch{return null}}}const j=u(()=>Mt(s.message.content||"")),W=u(()=>j.value!==null),ue=u(()=>W.value?j.value.map(e=>St(e)).filter(Boolean).join(`
|
|
2
2
|
`):s.message.content||""),Y=u(()=>W.value?j.value.flatMap((e,t)=>{if(e.type==="image")return[{type:"image",name:String(e.name||`image-${t+1}`),path:String(e.path||"")}].filter(r=>r.path);if(e.type==="file")return[{type:"file",name:String(e.name||`file-${t+1}`),path:String(e.path||"")}].filter(r=>r.path);const a=Tt(e);return a?.startsWith("data:image/")?[{type:"image",name:bt(a,t),url:a}]:[]}):null);function ce(e){return e.url?e.url:e.path?ra(e.path,e.name):""}const U=J(!1),B=J(null),X=pa(),de=da(),xt=oa(),m=ba(),n=wa(),me=u(()=>X.activeSession?.profile||de.activeProfileName||"default"),At=u(()=>de.profiles.find(e=>e.name===me.value)?.avatar),q=u(()=>{if(s.message.role==="tool")return null;const e=s.message.content||"";return e.trim()?e:null});async function Pt(){const e=q.value;if(e){if(await _a(e)){_.success(c("chat.copiedBubble"));return}_.error(c("chat.copyFailed"))}}const C=u(()=>fa(s.message.content||"",{streaming:!!s.message.isStreaming})),ge=u(()=>!!(s.message.reasoning&&s.message.reasoning.length>0)),Bt=u(()=>ge.value||C.value.hasThinking),Dt=u(()=>{const e=[];return s.message.reasoning&&e.push(s.message.reasoning),e.push(...C.value.segments),C.value.pending&&e.push(C.value.pending),e.join(`
|
|
3
3
|
|
|
4
4
|
`)}),It=u(()=>{let e=ya(C.value);return s.message.reasoning&&(e+=s.message.reasoning.length),e}),ve=u(()=>s.message.isStreaming?!!(C.value.pending!==null||ge.value&&!s.message.content):!1),G=J(null),F=u(()=>ve.value?!0:G.value!==null?G.value:!!xt.display.show_reasoning);function Ut(){G.value=!F.value}const he=J(Date.now());let b=null;function $t(){const e=X.getThinkingObservation(s.message.id),t=!!(s.message.isStreaming&&e?.startedAt!==void 0&&e.endedAt===void 0);t&&b===null?b=window.setInterval(()=>{he.value=Date.now()},1e3):!t&&b!==null&&(window.clearInterval(b),b=null)}Xt($t),Ce(()=>{b!==null&&window.clearInterval(b)});const Q=u(()=>{const e=X.getThinkingObservation(s.message.id);if(!e?.startedAt)return null;const t=e.startedAt,a=e?.endedAt??(s.message.isStreaming?he.value:t);return Math.max(0,a-t)});function Nt(e){const t=Math.floor(e/1e3);if(t<60)return`${t}s`;const a=Math.floor(t/60),r=t%60;return r===0?`${a}m`:`${a}m ${r}s`}const Ft=u(()=>new Date(s.message.timestamp).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"}));function pe(e){return e.startsWith("image/")}function Et(e){return e<1024?e+" B":e<1024*1024?(e/1024).toFixed(1)+" KB":(e/(1024*1024)).toFixed(1)+" MB"}function Vt(e){const t=s.message.content||"";try{const v=JSON.parse(t);if(Array.isArray(v)&&v.length>0&&"type"in v[0]){const f=v.find(S=>S.type==="file"&&S.name===e);if(f&&f.path)return f.path}}catch{}const a=/\[File:\s*([^\]]+)\]\(([^)]+)\)/g;let r;for(;(r=a.exec(t))!==null;)if(r[1].trim()===e.trim())return r[2];return null}function Ot(e){const t=Vt(e.name);if(t){_.info(c("download.downloading")),Se(t,e.name).catch(a=>{_.error(a.message||c("download.downloadFailed"))});return}if(e.url&&e.url.startsWith("blob:")){const a=document.createElement("a");a.href=e.url,a.download=e.name,document.body.appendChild(a),a.click(),document.body.removeChild(a)}}function Lt(e,t){return e.length>oe?e.slice(0,oe)+`
|