@bigduu/lotus 2026.5.7 → 2026.5.8
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/assets/{App-DaOPoP5b.js → App-DGwyzb_R.js} +7 -7
- package/dist/assets/{SubAgentsPanel-CpKXYYmB.js → SubAgentsPanel-Ce7ItSp3.js} +1 -1
- package/dist/assets/{index-D_SsVUqJ.js → index-1qndjA46.js} +2 -2
- package/dist/assets/{index-CSqXTBwc.js → index-BKFQW183.js} +1 -1
- package/dist/assets/{index-Cj9EZ-Bm.js → index-Bu8IZAis.js} +1 -1
- package/dist/assets/{index-DLBYvmHv.js → index-BuyiC320.js} +1 -1
- package/dist/assets/{index-BJC7afG8.js → index-CdD1wiDg.js} +1 -1
- package/dist/assets/{index-B1KXzc0W.js → index-Cdp4tZFy.js} +1 -1
- package/dist/assets/{index-D1aobBlB.js → index-CrZ1MaQQ.js} +1 -1
- package/dist/assets/{index-DPYLJuvQ.js → index-DTb24Vj4.js} +1 -1
- package/dist/assets/{index-BylZylqP.js → index-Do7hetub.js} +1 -1
- package/dist/assets/{index-Dkb_XCk_.js → index-_eqEk7O3.js} +1 -1
- package/dist/assets/{index-RkUQwJrg.js → index-vXtKBseF.js} +1 -1
- package/dist/assets/{main-CuvqMgTQ.js → main-BRsrko9k.js} +2 -2
- package/dist/index.html +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
var ne=Object.defineProperty;var se=(n,t,s)=>t in n?ne(n,t,{enumerable:!0,configurable:!0,writable:!0,value:s}):n[t]=s;var N=(n,t,s)=>se(n,typeof t!="symbol"?t+"":t,s);import{j as i}from"./vendor-markdown-DzaXAW9Q.js";import{a as u,u as re}from"./vendor-i18n-BNURlJ23.js";import{n as E,v as W,w as oe,u as f,x as ae,o as le}from"./App-DaOPoP5b.js";import{l as I,C as ie,a7 as k,j as ue,E as _,ak as ce,v as de,ad as ge,t as me}from"./vendor-antd-DODjfilb.js";import"./vendor-mermaid-De-Yacw-.js";import"./main-CuvqMgTQ.js";const v=class v{static getInstance(){return v.instance||(v.instance=new v),v.instance}parseUserCommand(t){E("[ToolService]",`[ToolService] parseUserCommand: Parsing content: "${t}"`);const s=t.trim();if(!s.startsWith("/"))return E("[ToolService]",'[ToolService] parseUserCommand: Content does not start with "/", not a tool command.'),null;const o=s.indexOf(" ");let c,p;if(o===-1?(c=s.substring(1),p=""):(c=s.substring(1,o),p=s.substring(o+1).trim()),c){const d={tool_name:c,user_description:p};return E("[ToolService]","[ToolService] parseUserCommand: Successfully parsed command:",d),d}return E("[ToolService]","[ToolService] parseUserCommand: Failed to parse tool name from content."),null}parseAIResponseToToolCall(t){return this.parseUserCommand(t)}async executeTool(t){E("[ToolService]","[ToolService] executeTool: Attempting to execute tool via HTTP with request:",t);try{const s=await W.post("tools/execute",t),o=JSON.parse(s.result);return E("[ToolService]","[ToolService] executeTool: Parsed structured result:",o),o}catch(s){throw console.error("[ToolService] executeTool: HTTP tool execution failed:",s),s instanceof oe?new Error(`Workflow execution failed: ${s.message}`):s}}};N(v,"instance");let F=v;const H=new F;class pe{async listProfiles(){return W.get("subagent_profiles")}}const fe=new pe,he=[];function ye(n={}){const{enabled:t=!0,refreshKey:s}=n,[o,c]=u.useState(null),[p,d]=u.useState(!1),[A,S]=u.useState(null),b=u.useCallback(async()=>{d(!0);try{const m=await fe.listProfiles();c(m),S(null)}catch(m){S(m instanceof Error?m:new Error(String(m)))}finally{d(!1)}},[]);u.useEffect(()=>{t&&b()},[t,b,s]);const x=u.useMemo(()=>{const m=new Map;if(o!=null&&o.profiles)for(const j of o.profiles)m.set(j.id,j);return m},[o]);return{profiles:(o==null?void 0:o.profiles)??he,fallbackId:(o==null?void 0:o.fallback_id)??null,loading:p,error:A,refresh:b,byId:x}}const Se=(n,t)=>{var A,S,b,x,m;const s=n==null?void 0:n.trim();if(!s)return null;const o=t.get(s),c=((A=o==null?void 0:o.display_name)==null?void 0:A.trim())||s,p=(b=(S=o==null?void 0:o.ui)==null?void 0:S.icon)==null?void 0:b.trim(),d=((m=(x=o==null?void 0:o.ui)==null?void 0:x.color)==null?void 0:m.trim())||void 0;return i.jsx(I,{color:d,style:{marginInlineEnd:0,flex:"0 0 auto"},"data-testid":`sub-agent-role-tag-${s}`,children:p?`${p} ${c}`:c})},{Text:C}=ue,{useToken:G}=me,be="chat-session-sub-agents-collapsed:",we=3,Ce=600,P=n=>{const t=(n||"").trim().toLowerCase();return t?t==="started"||t==="already_running"?"running":t==="success"||t==="done"?"completed":t==="canceled"?"cancelled":t==="queued"||t==="created"?"pending":t:"pending"},xe=(n,t)=>{if(t&&t.trim())return t;if(n.isRunning)return"running";if(n.lastRunStatus&&n.lastRunStatus.trim())return n.lastRunStatus;const s=n.messageCount??0;return s>2?"completed":(s>0,"pending")},K=n=>`${be}${n}`,D=n=>{if(typeof window>"u")return!1;try{const t=window.localStorage.getItem(K(n));return t==="1"?!0:t==="0"?!1:null}catch{return null}},ve=(n,t)=>{if(!(typeof window>"u"))try{window.localStorage.setItem(K(n),t?"1":"0")}catch{}},Oe=({parentSessionId:n})=>{const{t}=re(),{token:s}=G(),[o,c]=u.useState(()=>D(n)??!1),[p,d]=u.useState(null),[A,S]=u.useState(null),[b,x]=u.useState(null),m=f(e=>ae(n)(e)),j=f(e=>e.chats),O=f(e=>e.loadChatHistory),T=f(e=>e.refreshChats),M=f(e=>e.markOptimisticStart),z=f(e=>e.markRetryStart),R=f(e=>e.markSettleTimeout),Y=f(e=>e.pinSession),J=f(e=>e.unpinSession),h=f(e=>e.applyChildProgress),L=f(e=>e.clearChildProgress),{byId:q}=ye(),U=u.useMemo(()=>Object.entries(m).map(([e,l])=>({childSessionId:e,...l})),[m]),B=u.useMemo(()=>j.filter(e=>e.kind==="child"&&e.parentSessionId===n).sort((e,l)=>{const r=Date.parse(e.updatedAt||"")||0;return(Date.parse(l.updatedAt||"")||0)-r}),[j,n]),w=u.useMemo(()=>{const e=new Map(U.map(r=>[r.childSessionId,r])),l=[];for(const r of B){const a=e.get(r.id);l.push({childSessionId:r.id,title:r.title||(a==null?void 0:a.title),status:P(xe(r,a==null?void 0:a.status)),error:(a==null?void 0:a.error)||r.lastRunError,lastHeartbeatAt:a==null?void 0:a.lastHeartbeatAt,lastEventAt:a==null?void 0:a.lastEventAt,outputPreview:a==null?void 0:a.outputPreview,roundCount:a==null?void 0:a.roundCount,pinned:r.pinned,updatedAt:r.updatedAt,isRunning:r.isRunning,messageCount:r.messageCount,lastRunStatus:r.lastRunStatus,lastRunError:r.lastRunError,subagentType:r.subagentType??null}),e.delete(r.id)}for(const r of e.values())l.push({childSessionId:r.childSessionId,title:r.title,status:P(r.status),error:r.error,lastHeartbeatAt:r.lastHeartbeatAt,lastEventAt:r.lastEventAt,outputPreview:r.outputPreview,roundCount:r.roundCount});return l},[B,U]);u.useEffect(()=>{c(D(n)??!1)},[n]),u.useEffect(()=>{D(n)===null&&c(w.length>we)},[n,w.length]);const Q=u.useCallback(()=>{c(e=>{const l=!e;return ve(n,l),l})},[n]),X=u.useCallback(e=>e instanceof Error&&e.message.trim()?e.message:"Failed to run child session",[]),V=u.useCallback(async(e,l="regenerate")=>{d(e),h(n,e,{status:"running",error:void 0,lastEventAt:new Date().toISOString()}),z(e);try{const r=await H.executeTool({tool_name:"SubAgent",session_id:n,parameters:[{name:"action",value:"run"},{name:"child_session_id",value:e},{name:"reset_to_last_user",value:l==="error_retry"?"false":"true"}]});if(!r.success)throw new Error(r.result||"Failed to run sub-agent");h(n,e,{status:"running",error:void 0,lastEventAt:new Date().toISOString()}),await O(e,{mode:"replace"}),await T()}catch(r){R(e),h(n,e,{status:"error",error:X(r),lastEventAt:new Date().toISOString()})}finally{d(r=>r===e?null:r)}},[O,n,T,z,R,X,h]),Z=u.useCallback(async e=>{const l=typeof window<"u"?window.prompt.bind(window):null;if(!l)return;const r=l("Send a follow-up message to this sub-agent:","Continue from where you left off.");if(r===null)return;const a=r.trim();if(!a){h(n,e,{status:"error",error:"Follow-up message cannot be empty.",lastEventAt:new Date().toISOString()});return}S(e),h(n,e,{status:"running",error:void 0,lastEventAt:new Date().toISOString()}),M(e);try{const g=await H.executeTool({tool_name:"SubAgent",session_id:n,parameters:[{name:"action",value:"send_message"},{name:"child_session_id",value:e},{name:"message",value:a},{name:"auto_run",value:"true"}]});if(!g.success)throw new Error(g.result||"Follow-up failed");let y="running";try{JSON.parse(g.result).status==="pending"&&(y="pending")}catch{y="running"}h(n,e,{status:y,error:void 0,lastEventAt:new Date().toISOString()}),await T()}catch(g){R(e),h(n,e,{status:"error",error:g instanceof Error&&g.message.trim()?g.message:"Failed to continue child session",lastEventAt:new Date().toISOString()})}finally{S(g=>g===e?null:g)}},[n,T,M,R,h]),ee=u.useCallback(async e=>{x(e);try{const l=await H.executeTool({tool_name:"SubAgent",session_id:n,parameters:[{name:"action",value:"delete"},{name:"child_session_id",value:e}]});if(!l.success)throw new Error(l.result||"Failed to delete sub-agent");L(n,e),await T()}finally{x(l=>l===e?null:l)}},[L,n,T]);return w.length===0?null:i.jsxs(ie,{size:"small",className:"lotus-settings-card",style:{marginBottom:s.marginMD},"data-testid":"sub-agents-panel",title:i.jsxs(C,{strong:!0,children:[t("chat.subAgents.title")," ",i.jsxs(C,{type:"secondary",children:["(",w.length,")"]})]}),extra:i.jsx(_,{type:"text",size:"small",icon:o?i.jsx(de,{}):i.jsx(ge,{}),onClick:Q,"data-testid":"sub-agents-toggle",children:t(o?"chat.subAgents.expand":"chat.subAgents.collapse")}),children:[o?i.jsx(C,{type:"secondary","data-testid":"sub-agents-collapsed-hint",children:t("chat.subAgents.hiddenHint",{count:w.length})}):i.jsx(k,{vertical:!0,gap:s.marginSM,"data-testid":"sub-agents-list",style:{maxHeight:`${Ce}px`,overflowY:"auto",paddingRight:s.paddingXS},children:w.map(e=>{const l=P(e.status),r=l==="running",a=p===e.childSessionId,g=A===e.childSessionId,y=b===e.childSessionId,$=a||g||y;return i.jsxs(k,{align:"flex-start",justify:"space-between",gap:s.marginSM,className:"lotus-settings-list-item",style:{padding:s.paddingSM,borderRadius:s.borderRadiusSM},children:[i.jsxs(k,{vertical:!0,style:{flex:1,minWidth:0},children:[i.jsxs(k,{align:"center",gap:s.marginXS,style:{minWidth:0},children:[i.jsx(C,{strong:!0,ellipsis:!0,style:{minWidth:0},children:e.title||"Sub-agent"}),i.jsx(I,{color:l==="running"?"processing":l==="completed"?"success":l==="error"||l==="failed"?"error":l==="cancelled"?"warning":"default",style:{marginInlineEnd:0,flex:"0 0 auto"},children:l}),e.pinned?i.jsx(I,{color:"warning",style:{marginInlineEnd:0,flex:"0 0 auto"},children:"Pinned"}):null,Se(e.subagentType,q)]}),i.jsxs(C,{type:"secondary",style:{fontSize:12,marginTop:2},children:[e.childSessionId.slice(0,8),e.updatedAt?` • ${e.updatedAt}`:"",e.lastHeartbeatAt?` • heartbeat: ${e.lastHeartbeatAt}`:"",typeof e.roundCount=="number"?` • round ${e.roundCount+1}`:""]}),e.outputPreview?i.jsx(C,{type:"secondary",style:{marginTop:s.marginXS,fontSize:13},ellipsis:!0,children:e.outputPreview}):null,e.error?i.jsx(C,{type:"danger",style:{marginTop:s.marginXS},children:e.error}):null]}),i.jsxs(k,{gap:8,children:[i.jsx(_,{size:"small",disabled:$,onClick:()=>{le(e.childSessionId),O(e.childSessionId)},children:t("chat.subAgents.open")}),i.jsx(_,{size:"small",loading:g,disabled:y||a||r,"data-testid":`sub-agent-continue-${e.childSessionId}`,onClick:()=>{Z(e.childSessionId)},children:t("chat.subAgents.continue")}),i.jsx(ce,{trigger:["click"],menu:{items:[{key:"regenerate",label:t("chat.actions.regenerate")},{key:"error_retry",label:t("chat.actions.retryFailed")}],onClick:({key:te})=>{V(e.childSessionId,te)}},disabled:y||r||g,children:i.jsx(_,{size:"small",loading:a,disabled:y||r||g,"data-testid":`sub-agent-retry-${e.childSessionId}`,children:t("chat.subAgents.retry")})}),typeof e.pinned=="boolean"?i.jsx(_,{size:"small",disabled:$,onClick:()=>{e.pinned?J(e.childSessionId):Y(e.childSessionId)},children:e.pinned?t("chat.actions.unpin"):t("chat.actions.pin")}):null,i.jsx(_,{danger:!0,size:"small",loading:y,disabled:a,"data-testid":`sub-agent-delete-${e.childSessionId}`,onClick:()=>{ee(e.childSessionId)},children:t("common.delete")})]})]},e.childSessionId)})}),!o&&w.length>1&&i.jsx(Ae,{items:w})]})},Ae=({items:n})=>{const{token:t}=G(),s=n.reduce((c,p)=>{const d=P(p.status);return d==="completed"?c.completed++:d==="running"?c.running++:d==="error"||d==="failed"?c.error++:c.pending++,c},{completed:0,running:0,error:0,pending:0}),o=[];return s.completed>0&&o.push(`${s.completed} completed`),s.running>0&&o.push(`${s.running} running`),s.pending>0&&o.push(`${s.pending} pending`),s.error>0&&o.push(`${s.error} failed`),o.length===0?null:i.jsx(C,{type:"secondary",style:{fontSize:11,marginTop:t.marginXS,display:"block"},children:o.join(" · ")})};export{Oe as SubAgentsPanel};
|
|
1
|
+
var ne=Object.defineProperty;var se=(n,t,s)=>t in n?ne(n,t,{enumerable:!0,configurable:!0,writable:!0,value:s}):n[t]=s;var N=(n,t,s)=>se(n,typeof t!="symbol"?t+"":t,s);import{j as i}from"./vendor-markdown-DzaXAW9Q.js";import{a as u,u as re}from"./vendor-i18n-BNURlJ23.js";import{n as E,v as W,w as oe,u as f,x as ae,o as le}from"./App-DGwyzb_R.js";import{l as I,C as ie,a7 as k,j as ue,E as _,ak as ce,v as de,ad as ge,t as me}from"./vendor-antd-DODjfilb.js";import"./vendor-mermaid-De-Yacw-.js";import"./main-BRsrko9k.js";const v=class v{static getInstance(){return v.instance||(v.instance=new v),v.instance}parseUserCommand(t){E("[ToolService]",`[ToolService] parseUserCommand: Parsing content: "${t}"`);const s=t.trim();if(!s.startsWith("/"))return E("[ToolService]",'[ToolService] parseUserCommand: Content does not start with "/", not a tool command.'),null;const o=s.indexOf(" ");let c,p;if(o===-1?(c=s.substring(1),p=""):(c=s.substring(1,o),p=s.substring(o+1).trim()),c){const d={tool_name:c,user_description:p};return E("[ToolService]","[ToolService] parseUserCommand: Successfully parsed command:",d),d}return E("[ToolService]","[ToolService] parseUserCommand: Failed to parse tool name from content."),null}parseAIResponseToToolCall(t){return this.parseUserCommand(t)}async executeTool(t){E("[ToolService]","[ToolService] executeTool: Attempting to execute tool via HTTP with request:",t);try{const s=await W.post("tools/execute",t),o=JSON.parse(s.result);return E("[ToolService]","[ToolService] executeTool: Parsed structured result:",o),o}catch(s){throw console.error("[ToolService] executeTool: HTTP tool execution failed:",s),s instanceof oe?new Error(`Workflow execution failed: ${s.message}`):s}}};N(v,"instance");let F=v;const H=new F;class pe{async listProfiles(){return W.get("subagent_profiles")}}const fe=new pe,he=[];function ye(n={}){const{enabled:t=!0,refreshKey:s}=n,[o,c]=u.useState(null),[p,d]=u.useState(!1),[A,S]=u.useState(null),b=u.useCallback(async()=>{d(!0);try{const m=await fe.listProfiles();c(m),S(null)}catch(m){S(m instanceof Error?m:new Error(String(m)))}finally{d(!1)}},[]);u.useEffect(()=>{t&&b()},[t,b,s]);const x=u.useMemo(()=>{const m=new Map;if(o!=null&&o.profiles)for(const j of o.profiles)m.set(j.id,j);return m},[o]);return{profiles:(o==null?void 0:o.profiles)??he,fallbackId:(o==null?void 0:o.fallback_id)??null,loading:p,error:A,refresh:b,byId:x}}const Se=(n,t)=>{var A,S,b,x,m;const s=n==null?void 0:n.trim();if(!s)return null;const o=t.get(s),c=((A=o==null?void 0:o.display_name)==null?void 0:A.trim())||s,p=(b=(S=o==null?void 0:o.ui)==null?void 0:S.icon)==null?void 0:b.trim(),d=((m=(x=o==null?void 0:o.ui)==null?void 0:x.color)==null?void 0:m.trim())||void 0;return i.jsx(I,{color:d,style:{marginInlineEnd:0,flex:"0 0 auto"},"data-testid":`sub-agent-role-tag-${s}`,children:p?`${p} ${c}`:c})},{Text:C}=ue,{useToken:G}=me,be="chat-session-sub-agents-collapsed:",we=3,Ce=600,P=n=>{const t=(n||"").trim().toLowerCase();return t?t==="started"||t==="already_running"?"running":t==="success"||t==="done"?"completed":t==="canceled"?"cancelled":t==="queued"||t==="created"?"pending":t:"pending"},xe=(n,t)=>{if(t&&t.trim())return t;if(n.isRunning)return"running";if(n.lastRunStatus&&n.lastRunStatus.trim())return n.lastRunStatus;const s=n.messageCount??0;return s>2?"completed":(s>0,"pending")},K=n=>`${be}${n}`,D=n=>{if(typeof window>"u")return!1;try{const t=window.localStorage.getItem(K(n));return t==="1"?!0:t==="0"?!1:null}catch{return null}},ve=(n,t)=>{if(!(typeof window>"u"))try{window.localStorage.setItem(K(n),t?"1":"0")}catch{}},Oe=({parentSessionId:n})=>{const{t}=re(),{token:s}=G(),[o,c]=u.useState(()=>D(n)??!1),[p,d]=u.useState(null),[A,S]=u.useState(null),[b,x]=u.useState(null),m=f(e=>ae(n)(e)),j=f(e=>e.chats),O=f(e=>e.loadChatHistory),T=f(e=>e.refreshChats),M=f(e=>e.markOptimisticStart),z=f(e=>e.markRetryStart),R=f(e=>e.markSettleTimeout),Y=f(e=>e.pinSession),J=f(e=>e.unpinSession),h=f(e=>e.applyChildProgress),L=f(e=>e.clearChildProgress),{byId:q}=ye(),U=u.useMemo(()=>Object.entries(m).map(([e,l])=>({childSessionId:e,...l})),[m]),B=u.useMemo(()=>j.filter(e=>e.kind==="child"&&e.parentSessionId===n).sort((e,l)=>{const r=Date.parse(e.updatedAt||"")||0;return(Date.parse(l.updatedAt||"")||0)-r}),[j,n]),w=u.useMemo(()=>{const e=new Map(U.map(r=>[r.childSessionId,r])),l=[];for(const r of B){const a=e.get(r.id);l.push({childSessionId:r.id,title:r.title||(a==null?void 0:a.title),status:P(xe(r,a==null?void 0:a.status)),error:(a==null?void 0:a.error)||r.lastRunError,lastHeartbeatAt:a==null?void 0:a.lastHeartbeatAt,lastEventAt:a==null?void 0:a.lastEventAt,outputPreview:a==null?void 0:a.outputPreview,roundCount:a==null?void 0:a.roundCount,pinned:r.pinned,updatedAt:r.updatedAt,isRunning:r.isRunning,messageCount:r.messageCount,lastRunStatus:r.lastRunStatus,lastRunError:r.lastRunError,subagentType:r.subagentType??null}),e.delete(r.id)}for(const r of e.values())l.push({childSessionId:r.childSessionId,title:r.title,status:P(r.status),error:r.error,lastHeartbeatAt:r.lastHeartbeatAt,lastEventAt:r.lastEventAt,outputPreview:r.outputPreview,roundCount:r.roundCount});return l},[B,U]);u.useEffect(()=>{c(D(n)??!1)},[n]),u.useEffect(()=>{D(n)===null&&c(w.length>we)},[n,w.length]);const Q=u.useCallback(()=>{c(e=>{const l=!e;return ve(n,l),l})},[n]),X=u.useCallback(e=>e instanceof Error&&e.message.trim()?e.message:"Failed to run child session",[]),V=u.useCallback(async(e,l="regenerate")=>{d(e),h(n,e,{status:"running",error:void 0,lastEventAt:new Date().toISOString()}),z(e);try{const r=await H.executeTool({tool_name:"SubAgent",session_id:n,parameters:[{name:"action",value:"run"},{name:"child_session_id",value:e},{name:"reset_to_last_user",value:l==="error_retry"?"false":"true"}]});if(!r.success)throw new Error(r.result||"Failed to run sub-agent");h(n,e,{status:"running",error:void 0,lastEventAt:new Date().toISOString()}),await O(e,{mode:"replace"}),await T()}catch(r){R(e),h(n,e,{status:"error",error:X(r),lastEventAt:new Date().toISOString()})}finally{d(r=>r===e?null:r)}},[O,n,T,z,R,X,h]),Z=u.useCallback(async e=>{const l=typeof window<"u"?window.prompt.bind(window):null;if(!l)return;const r=l("Send a follow-up message to this sub-agent:","Continue from where you left off.");if(r===null)return;const a=r.trim();if(!a){h(n,e,{status:"error",error:"Follow-up message cannot be empty.",lastEventAt:new Date().toISOString()});return}S(e),h(n,e,{status:"running",error:void 0,lastEventAt:new Date().toISOString()}),M(e);try{const g=await H.executeTool({tool_name:"SubAgent",session_id:n,parameters:[{name:"action",value:"send_message"},{name:"child_session_id",value:e},{name:"message",value:a},{name:"auto_run",value:"true"}]});if(!g.success)throw new Error(g.result||"Follow-up failed");let y="running";try{JSON.parse(g.result).status==="pending"&&(y="pending")}catch{y="running"}h(n,e,{status:y,error:void 0,lastEventAt:new Date().toISOString()}),await T()}catch(g){R(e),h(n,e,{status:"error",error:g instanceof Error&&g.message.trim()?g.message:"Failed to continue child session",lastEventAt:new Date().toISOString()})}finally{S(g=>g===e?null:g)}},[n,T,M,R,h]),ee=u.useCallback(async e=>{x(e);try{const l=await H.executeTool({tool_name:"SubAgent",session_id:n,parameters:[{name:"action",value:"delete"},{name:"child_session_id",value:e}]});if(!l.success)throw new Error(l.result||"Failed to delete sub-agent");L(n,e),await T()}finally{x(l=>l===e?null:l)}},[L,n,T]);return w.length===0?null:i.jsxs(ie,{size:"small",className:"lotus-settings-card",style:{marginBottom:s.marginMD},"data-testid":"sub-agents-panel",title:i.jsxs(C,{strong:!0,children:[t("chat.subAgents.title")," ",i.jsxs(C,{type:"secondary",children:["(",w.length,")"]})]}),extra:i.jsx(_,{type:"text",size:"small",icon:o?i.jsx(de,{}):i.jsx(ge,{}),onClick:Q,"data-testid":"sub-agents-toggle",children:t(o?"chat.subAgents.expand":"chat.subAgents.collapse")}),children:[o?i.jsx(C,{type:"secondary","data-testid":"sub-agents-collapsed-hint",children:t("chat.subAgents.hiddenHint",{count:w.length})}):i.jsx(k,{vertical:!0,gap:s.marginSM,"data-testid":"sub-agents-list",style:{maxHeight:`${Ce}px`,overflowY:"auto",paddingRight:s.paddingXS},children:w.map(e=>{const l=P(e.status),r=l==="running",a=p===e.childSessionId,g=A===e.childSessionId,y=b===e.childSessionId,$=a||g||y;return i.jsxs(k,{align:"flex-start",justify:"space-between",gap:s.marginSM,className:"lotus-settings-list-item",style:{padding:s.paddingSM,borderRadius:s.borderRadiusSM},children:[i.jsxs(k,{vertical:!0,style:{flex:1,minWidth:0},children:[i.jsxs(k,{align:"center",gap:s.marginXS,style:{minWidth:0},children:[i.jsx(C,{strong:!0,ellipsis:!0,style:{minWidth:0},children:e.title||"Sub-agent"}),i.jsx(I,{color:l==="running"?"processing":l==="completed"?"success":l==="error"||l==="failed"?"error":l==="cancelled"?"warning":"default",style:{marginInlineEnd:0,flex:"0 0 auto"},children:l}),e.pinned?i.jsx(I,{color:"warning",style:{marginInlineEnd:0,flex:"0 0 auto"},children:"Pinned"}):null,Se(e.subagentType,q)]}),i.jsxs(C,{type:"secondary",style:{fontSize:12,marginTop:2},children:[e.childSessionId.slice(0,8),e.updatedAt?` • ${e.updatedAt}`:"",e.lastHeartbeatAt?` • heartbeat: ${e.lastHeartbeatAt}`:"",typeof e.roundCount=="number"?` • round ${e.roundCount+1}`:""]}),e.outputPreview?i.jsx(C,{type:"secondary",style:{marginTop:s.marginXS,fontSize:13},ellipsis:!0,children:e.outputPreview}):null,e.error?i.jsx(C,{type:"danger",style:{marginTop:s.marginXS},children:e.error}):null]}),i.jsxs(k,{gap:8,children:[i.jsx(_,{size:"small",disabled:$,onClick:()=>{le(e.childSessionId),O(e.childSessionId)},children:t("chat.subAgents.open")}),i.jsx(_,{size:"small",loading:g,disabled:y||a||r,"data-testid":`sub-agent-continue-${e.childSessionId}`,onClick:()=>{Z(e.childSessionId)},children:t("chat.subAgents.continue")}),i.jsx(ce,{trigger:["click"],menu:{items:[{key:"regenerate",label:t("chat.actions.regenerate")},{key:"error_retry",label:t("chat.actions.retryFailed")}],onClick:({key:te})=>{V(e.childSessionId,te)}},disabled:y||r||g,children:i.jsx(_,{size:"small",loading:a,disabled:y||r||g,"data-testid":`sub-agent-retry-${e.childSessionId}`,children:t("chat.subAgents.retry")})}),typeof e.pinned=="boolean"?i.jsx(_,{size:"small",disabled:$,onClick:()=>{e.pinned?J(e.childSessionId):Y(e.childSessionId)},children:e.pinned?t("chat.actions.unpin"):t("chat.actions.pin")}):null,i.jsx(_,{danger:!0,size:"small",loading:y,disabled:a,"data-testid":`sub-agent-delete-${e.childSessionId}`,onClick:()=>{ee(e.childSessionId)},children:t("common.delete")})]})]},e.childSessionId)})}),!o&&w.length>1&&i.jsx(Ae,{items:w})]})},Ae=({items:n})=>{const{token:t}=G(),s=n.reduce((c,p)=>{const d=P(p.status);return d==="completed"?c.completed++:d==="running"?c.running++:d==="error"||d==="failed"?c.error++:c.pending++,c},{completed:0,running:0,error:0,pending:0}),o=[];return s.completed>0&&o.push(`${s.completed} completed`),s.running>0&&o.push(`${s.running} running`),s.pending>0&&o.push(`${s.pending} pending`),s.error>0&&o.push(`${s.error} failed`),o.length===0?null:i.jsx(C,{type:"secondary",style:{fontSize:11,marginTop:t.marginXS,display:"block"},children:o.join(" · ")})};export{Oe as SubAgentsPanel};
|